build-site
Orchestrate a complete Liferay site experience from a single prompt. Composes objects, business logic, fragments, pages, roles, and theme into a working site
Install / Use
npx skills add kristianp335/liferay-ai-demo-build-md-files --skill liferay-demo-site-initializerInstalls into whichever agent you are using.
Gemini Rules
Gemini CLI config
Quality Score
Category
Development & EngineeringSupported Platforms
Tags
Our assessment of build-site
build-site scores 69/100 on our quality scale, 3814th of 4,588 Development & Engineering skills we index.
Its Gemini Rules is 15 KB long, well organised into 28 sections with 3 code examples: a thorough specification that gives an agent plenty to work with.
It has no GitHub stars yet, so there is no community track record; judge it on its content.
Maintenance, license and trust
- We could not determine when the repository was last updated.
- No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
- Its trust signals score 68/100, with 3 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful.
AI review by kimi-k2.7-code on 2026-10-08. Automated pattern scan on 2026-10-08. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
build-site compared with similar skills
All 4 of these similar skills score higher than build-site; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| build-site (this skill)by kristianp335 | 69 | 0 | — | Gemini Rules |
| ai-job-searchby MadsLorentzen | 100 | 45.2k | 2d ago | CLAUDE.md |
| claude-howtoby luongnv89 | 100 | 41.8k | 7d ago | CLAUDE.md |
| algorithmic-artby anthropics | 100 | 177.9k | 15d ago | SKILL.md |
| interview-meby addyosmani | 100 | 102.0k | 4d ago | SKILL.md |
Frequently asked questions
- How do I install build-site?
- Run
npx skills add kristianp335/liferay-ai-demo-build-md-files. The install tabs above show the steps for each supported agent. - Which AI agents does build-site work with?
- It is written for Gemini CLI, as a Gemini Rules file. Other agents that read the same format can often use it too.
- Is build-site safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful. It declares no license and scores 68/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is build-site still maintained?
- We could not determine when the repository was last updated.
Skill content
View source on GitHubdescription: Orchestrate a complete Liferay site experience from a single prompt. Composes objects, business logic, fragments, pages, roles, and theme into a working site. Use when the user asks to "build a site", "create a site experience", or describes a multiobject, multipage scenario. Calls all other skills in sequence. name: build-site
Build Site
One command orchestrator. The user describes the site; this skill calls the right subskills in the right order.
When to Invoke
- "Build a Bookstore site with an Author object, a Book object, and a home page"
- "Create a site experience for customer onboarding"
- "Scaffold the full job board site"
- Any multiobject, multipage request that spans data and presentation
Standing Requirements
These hold on every site build whether or not the user asks for them. Do not wait to be told.
-
Everything ships in the workspace, reproducible from a clean environment. Do not satisfy a request for data, pages, fragments, or styling by mutating only the running instance — write it into the tree first, then apply it. A site that cannot be rebuilt from what is checked into the workspace is not finished, however correct it looks in the browser.
Keep it to as few projects as the classification rules permit, but a whole site cannot be one project.
siteInitializerisbatch;themeCSSisfrontend; handlers aremicroservice; those three can never share aclient-extension.yaml. The initializer project carries thesiteInitializerplus exactly oneoAuthApplicationHeadlessServerand nothing else — a theme or anobjectActionadded to it fails atcreateClientExtensionConfig, after the assemble tasks have already printed success. Seerules/client-extension-types.md→ "Which Types May Share a Project".So the reproducible unit is the workspace, not a single directory. Prefer to express the site's look through what the initializer tree itself can carry — style book, master page, fragment CSS,
layout-setsettings — because athemeCSSCET cannot be selected from the tree and reverts to unselected on every reprovision (skills/theme-and-design/SKILL.md). Add a sibling theme project only when something genuinely has no other home, and say plainly that it needs a manual selection step. -
Objects are the data layer. Model entities as Liferay Object definitions. Do not reach for web content structures or a Service Builder module for structured application data, even when
modules/exists in the workspace. -
Verify by rendering, not by status code. A page returning 200 with an empty content area is the pack's most common silent failure. Fetch each page and confirm its fragments produced markup before reporting success.
-
Verify as the audience. When a flow is meant for unauthenticated visitors, exercise it without a session cookie. An admin authenticated check hides missing Guest permissions.
-
Report what does not work. Name every placeholder, skipped step, and unverified claim. An overstated success is worse than a reported failure.
Workflow
The sequence below is the canonical order. Skip phases the user has not requested; do not add phases they have not asked for.
Phase 0: Scope Confirmation
Before calling any subskill, confirm the scope with the user:
-
Site name — what to call the site
-
Objects — list of entity names with their key fields and relationships
-
Pages — list of pages and their purpose
-
Roles — named roles and their intended access (viewer, editor, admin)
-
Theme — any color, font, or visual requirement (optional)
-
Audience — who the site is actually for: anonymous visitors, or a signed in user. This decides every verification step later, and getting it wrong wastes a full cycle in either direction. An admin only demo needs no Guest grants and must be checked signed in; a public site needs
resource-permissions.jsonand must be checked signed out. Ask; do not infer it from the fact that a page is public.
Proceed only after the user confirms or corrects the scope list.
Settle the Reprovision Surface Before Provisioning Once
This is the single largest time sink in a site build. The initializer runs only at site creation, so a whole class of change costs a delete and redeploy cycle each time it is discovered. Those cycles are almost never individually avoidable — but the number of them is, and it is decided here, before Phase 4, not later.
| Change | Cost after the first provision |
| --- | --- |
| Object definition, field, relationship, entry data | Live — object-admin API, no reprovision |
| Theme CSS client extension | Live — blade gw deploy |
| Fragment HTML / CSS / JS, or a new fragment | Reprovision |
| New page, or recomposing an existing one | Reprovision |
| Adding or changing a master page | Reprovision, and it rewrites every page definition |
| Style book, navigation menu, layout set settings | Reprovision |
So before writing the first fragment, answer these — each wrong guess is one cycle:
- Is there a master page? Retrofitting one later touches every
page-definition.json(each needssettings.masterPage.keyandversion: 1.1). If the site has a branded header or footer — and almost every real site does — build it in Phase 5, not after the theme prompt. - What is the complete page list, including the ones that are not navigation items: thank you, confirmation, error, "no results" pages. A form almost always implies a landing page.
- Which fragments carry JavaScript, and have they been reasoned through once for timezone, permissions, and number parsing? See the trap table below.
- Does the theme need anything the tree cannot express? Decide now, because
themeCSSis a sibling project and cannot be selected from the tree at all (skills/theme-and-design/SKILL.md).
Batch everything that costs a reprovision into as few passes as possible. A planned build provisions once or twice; a reactive one provisions five times.
Trap Preflight
Five silent failures account for most of the rework in this pack. Each one builds, deploys, and renders — the defect only shows on close reading. Check them while authoring, not after.
| Trap | Rule | Where |
| --- | --- | --- |
| fragment.json "type" | Always "component". "section" breaks the whole headless-admin-fragment listing with 400 Invalid enum value | scaffold-fragment |
| Literal text override | Replaces the editable's inner <h1>/<h2>, so tag only CSS selectors miss it | manage-pages |
| DateTime in fragment JS | Use the UTC getters, or times shift into the visitor's timezone | manage-pages |
| Site wide heading font | Content fragments must not declare font-weight on headings the master rule owns | theme-and-design |
| Reserved object field names | status is taken — use <entity>Status. Inside an initializer this rolls back the entire site | manage-objects |
The canonical model is site initializer first: the siteInitializer CET tree is the single source of truth, and the site is created by triggering the initializer rather than by calling the live page API. After the initial build, iterate by editing the source tree and applying each change by the cheapest reliable path — see "Iterating on the Site" below and the spine in rules/site-initializer-format.md.
Phase 1: Prerequisites
Call feature-flags for the full set of flags the workflow needs:
| Scenario | Required Flags |
| --- | --- |
| Site pages via API | LPD-35443 |
| Fragment composition via API | LPD-39244 |
| Object entry permissions | LPD-17564 |
| MCP transport | LPD-63311 |
Report the gap table. Enable flags only after explicit user confirmation. Bounce Tomcat if any flags are written.
Phase 2: Transport Selection
Probe for the MCP server:
# Release 2026.Q1+ uses /o/mcp (Streamable HTTP transport); 2025.Q4 used /o/mcp/sse (SSE). See skills/mcp-server.
curl \
--head \
--silent \
--url "http://localhost:${PORT}/o/mcp"
- 2xx: MCP is available. Use the
call-http-endpointMCP tool for all subsequent API calls. - Otherwise: Fall back to direct
curlcalls with Basic auth.
Phase 3: Data Model
For each object in the confirmed scope, call manage-objects:
-
Create and publish the object definition.
-
Add all fields.
-
Add picklists (if any field references a picklist).
-
Add relationships between objects (parent → child).
-
Add validations.
For each business logic requirement, call manage-object-logic:
-
Choose the trigger and action type.
-
Create notification templates if needed.
-
Create the object action.
Phase 4: Site Initializer Scaffold
Call scaffold-client-extension with type siteInitializer to create the CET that will provision the site. This tree is the source of truth for the site's fragments, pages, theme metadata, and roles. Populate it in Phases 5–8 per rules/site-initializer-format.md, then trigger it in Phase 9.
Phase 5: Fragments
For each unique layout section needed by the page list, call scaffold-fragment:
-
Create the fragment source files inside the initializer tree at
site-initializer/fragments/group/<collection-key>/fragments/<fragment-name>/(note the requiredfragments/nesting level under the collection). For the initial build, the content may be hardcoded (static text and images); later iterations bind it to objects. -
Record each fragment's
key(its<fragment-name>directory name) for Phase 6 — page definitions reference it asfragment.keywithsiteKey: "[$GROUP_KEY$]".
Phase 6: Pages
For each page in the confirmed scope, call manage-pages to author it in the initializer:
-
Write
site-initializer/layouts/<NN-page-name>/page.jsonwith the correct type (Content Page default). -
Write
page-definition.jsoncomposing the page with fragment elements (using keys from Phase 5). -
Add the navigation menu and SEO metadata via the initializer's
layout-set/and page metadata.
The pages come into being when the initializer is triggered in Phase 9.
Phase 7: Theme and Design (Optional)
When the user provided visual requirements, call theme-and-design:
-
Generate and deploy the
themeCSSCET. -
Create and assign the style book.
-
Create the master page with header and footer fragments.
Phase 8: Roles and Permissions
For each role in the confirmed scope, call manage-roles-permissions:
-
Create the role.
-
Assign permissions on each object definition.
-
Assign permissions on each page (restrict visibility if needed).
Phase 9: Provision the Site
Deploy the CET and trigger the initializer. This creates the site with its fragments, pages, and roles in one pass:
# Deploy the site initializer CET
cd client-extensions/<site-init-name> && blade gw deploy
# Trigger it to create the site
curl \
--data '{
"membershipType": "open",
"name": "<Site Name>",
"templateType": "site-initializer",
"templateKey": "<workspace-id>-site-init"
}' \
--header "Content-Type: application/json" \
--request POST \
--silent \
--url "http://localhost:${PORT}/o/headless-admin-site/v1.0/sites" \
--user "test@liferay.com:test"
Caution: resolving a site-initializer template through
POST /sitesis unreliable (the currentSiteDTO usestemplateKey, nottemplateExternalReferenceCode). The portable path is to let thesiteInitializerCET autoprovision on deploy, and to reprovision by delete then redeploy — seerules/site-initializer-format.md.
Save the site's externalReferenceCode as <site-erc> from the response.
Phase 10: Verification
Confirm the site is functional:
# Site exists
curl \
--silent \
--url "http://localhost:${PORT}/o/headless-admin-site/v1.0/sites/<site-erc>" \
--user "test@liferay.com:test" \
| jq '{externalReferenceCode, name}'
# Pages exist
Truncated for display — read the full file on GitHub.
Related Skills
ai-job-search
45.2kThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.
claude-howto
41.8kA visual, example-driven guide to Claude Code — from basic concepts to advanced agents, with copy-paste templates that bring immediate value.
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
interview-me
102.0kExtracts what the user actually wants instead of what they think they should want. Achieves this through one-question-at-a-time interview until ~95% confidence about the underlying intent
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
