From homepage-plugin
Generate Astro pages and sections from page plans. Run /homepage-plugin:hp-plan first.
How this skill is triggered — by the user, by Claude, or both
Slash command
/homepage-plugin:hp-genThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generates Astro pages, sections, and shared infrastructure from page plans (`page-plan.json`). Each phase runs in a separate agent session for context isolation.
Generates Astro pages, sections, and shared infrastructure from page plans (page-plan.json). Each phase runs in a separate agent session for context isolation.
Tool choice: This skill uses
Agent(notTask) to launch sub-agents. Phases are strictly sequential — each depends on the previous phase's output.
Read .claude/homepage-plugin.json. If not found, exit with instruction to run /homepage-plugin:hp-init.
Read defaultLocale — all user-facing output in this language.
If [page-name] argument provided:
docs/pages/{page-name}/page-plan.json existsIf no argument:
docs/pages/*/page-plan.json for all planned pages/homepage-plugin:hp-planFor each page, check docs/pages/{page-name}/.progress/{page-name}.json:
planned → proceed with generationgenerated or later → warn about demotion and ask to confirm re-generationgen-failed → check generation-state.json for resume opportunityResume support: If generation-state.json exists with incomplete phases, offer to resume from the last incomplete phase instead of starting over:
docs/pages/{page-name}/.implementation/homepage/generation-state.jsonphases.infrastructure.status === "completed" → skip Phase 1completed, resume from first pending or failed pageLock file path: docs/pages/{page-name}/.implementation/homepage/.lock
Lock file format (JSON):
{
"lockedBy": "hp-gen",
"lockedAt": "2026-03-23T14:30:00.000Z",
"pageName": "home"
}
Acquisition protocol:
.lock file existslockedAt field → parse as ISO-8601 → compare with current time
.lock file with lockedBy: "hp-gen", lockedAt: new Date().toISOString(), pageNameRelease: Always delete .lock file on completion or failure (in Step 8 and Error Handling).
Display the generation plan:
Ask user to confirm before proceeding.
Determine if this is the first page being generated (no existing layout/shared components).
Launch page-assembler agent with the following parameters:
pageName — "_infrastructure" (special value for infrastructure phase)planFile — path to the first page's page-plan.jsonlayoutPlanFile — docs/pages/_shared/layout-plan.jsonprojectRoot — project root pathconfig — homepage-plugin configuration objectisFirstPage — trueThe agent generates:
Update generation-state.json:
{
"phases": {
"infrastructure": { "status": "completed", "completedAt": "..." }
}
}
For each page (sequential):
Launch section-generator agent with:
pageName — page identifierplanFile — path to docs/pages/{page-name}/page-plan.jsonprojectRoot — project root pathconfig — homepage-plugin configuration objectThe agent will:
reuse: trueLaunch page-assembler agent with:
pageName — page identifierplanFile — path to docs/pages/{page-name}/page-plan.jsonlayoutPlanFile — docs/pages/_shared/layout-plan.jsonprojectRoot — project root pathconfig — homepage-plugin configuration objectisFirstPage — falseThe agent will:
Update generation-state.json after each page:
{
"phases": {
"infrastructure": { "status": "completed", "completedAt": "2026-03-23T14:30:00Z" },
"pages": {
"home": { "status": "completed", "completedAt": "2026-03-23T14:32:00Z" },
"about": { "status": "completed", "completedAt": "2026-03-23T14:35:00Z" },
"contact": { "status": "failed", "error": "section-generator failed on ContactSection" }
}
}
}
Valid status values per phase: "pending", "completed", "failed".
Run verification checks:
npx tsc --noEmitnpx eslint . (skip if no config and eslintTemplate is false)
eslintTemplate is true and no ESLint config exists (no .eslintrc* or eslint.config.*):
templates/eslint-config.md{projectRoot}/eslint.config.js using the Write toolpnpm ls eslint @eslint/js typescript-eslint eslint-plugin-astro eslint-plugin-react-hooks globals 2>&1pnpm add -D eslint @eslint/js typescript-eslint eslint-plugin-astro eslint-plugin-react-hooks globals and skip ESLint (do not run)npx eslint . 2>&1eslintTemplate is false and no config exists: skip ESLint entirelynpx astro buildFor each page, update docs/pages/{page-name}/.progress/{page-name}.json:
generatedgen-failedRecord verification results and timestamps.
Release the lock file.
Show:
/homepage-plugin:hp-verify for full quality check, or /homepage-plugin:hp-review for code review."/homepage-plugin:hp-gen."Read defaultLocale from .claude/homepage-plugin.json for all user-facing output.
generation-state.json and continue to the next pagenpx claudepluginhub ohmyhotelco/hare-cc-plugins --plugin homepage-pluginGenerates production-ready Astro 5 landing pages with Tailwind CSS v4 from structured copywriting content. Scaffolds project, creates layouts, navbar, footer, and sections per input format.
Guides creation of production-ready Power Pages code sites as SPAs using React, Angular, Vue, or Astro, from requirements discovery to deployment with live dev server previews and git commits.
Builds content-focused websites with Astro's zero-JS islands architecture, multi-framework components (React/Vue/Svelte), and Markdown/MDX support. Triggers on .astro files, Astro.props, content collections.