@skyf0xx/hedgehog 0.1.21 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +92 -20
  2. package/bin/cli.mjs +107 -45
  3. package/package.json +2 -2
  4. package/src/agents/bootstrap.md +83 -50
  5. package/src/agents/front-end-eng.md +1 -1
  6. package/src/agents/landing-builder.md +96 -0
  7. package/src/agents/landing-critic.md +107 -0
  8. package/src/agents/landing-sequencer.md +112 -0
  9. package/src/agents/landing-strategist.md +217 -0
  10. package/src/agents/landing-systems.md +206 -0
  11. package/src/agents/planner.md +207 -143
  12. package/src/golden-cores/landing-page/.prettierignore +4 -0
  13. package/src/golden-cores/landing-page/.prettierrc.js +11 -0
  14. package/src/golden-cores/landing-page/.vscode/extensions.json +4 -0
  15. package/src/golden-cores/landing-page/.vscode/launch.json +11 -0
  16. package/src/golden-cores/landing-page/astro.config.mjs +11 -0
  17. package/src/golden-cores/landing-page/eslint.config.mjs +23 -0
  18. package/src/golden-cores/landing-page/gitignore.template +9 -0
  19. package/src/golden-cores/landing-page/package.json +40 -0
  20. package/src/golden-cores/landing-page/pnpm-lock.yaml +4587 -0
  21. package/src/golden-cores/landing-page/public/favicon.ico +0 -0
  22. package/src/golden-cores/landing-page/public/favicon.svg +9 -0
  23. package/src/golden-cores/landing-page/src/motifs/.gitkeep +0 -0
  24. package/src/golden-cores/landing-page/src/pages/index.astro +24 -0
  25. package/src/golden-cores/landing-page/src/sections/.gitkeep +0 -0
  26. package/src/golden-cores/landing-page/src/styles/global.css +18 -0
  27. package/src/golden-cores/landing-page/tsconfig.json +5 -0
  28. package/src/skills/hedgehog-bootstrap/SKILL.md +19 -19
  29. package/src/skills/{hedgehog-bootstrap-core → hedgehog-bootstrap-full-stack-app-core}/SKILL.md +19 -18
  30. package/src/skills/hedgehog-bootstrap-landing-page-core/SKILL.md +160 -0
  31. package/src/skills/hedgehog-landing-loop/SKILL.md +188 -0
  32. package/src/skills/hedgehog-planning-intake/SKILL.md +30 -17
  33. package/src/templates/CLAUDE.core.full-stack-app.md +131 -0
  34. package/src/templates/CLAUDE.core.landing-page.md +133 -0
  35. package/src/templates/CLAUDE.md +54 -183
  36. package/src/templates/TODO.core.full-stack-app.md +46 -0
  37. package/src/templates/TODO.core.landing-page.md +24 -0
  38. package/src/templates/TODO.md +6 -50
  39. /package/src/{golden-core → golden-cores/full-stack-app}/.env.example +0 -0
  40. /package/src/{golden-core → golden-cores/full-stack-app}/.github/workflows/phase-gate.yml +0 -0
  41. /package/src/{golden-core → golden-cores/full-stack-app}/.prettierignore +0 -0
  42. /package/src/{golden-core → golden-cores/full-stack-app}/.prettierrc +0 -0
  43. /package/src/{golden-core → golden-cores/full-stack-app}/.vscode/extensions.json +0 -0
  44. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/eslint.config.mjs +0 -0
  45. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/package.json +0 -0
  46. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/src/app/app.module.ts +0 -0
  47. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/src/app/health.controller.ts +0 -0
  48. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/src/assets/.gitkeep +0 -0
  49. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/src/main.ts +0 -0
  50. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/tsconfig.app.json +0 -0
  51. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/tsconfig.json +0 -0
  52. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api/webpack.config.cjs +0 -0
  53. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/eslint.config.mjs +0 -0
  54. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/package.json +0 -0
  55. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/src/api/api.spec.ts +0 -0
  56. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/src/support/global-setup.ts +0 -0
  57. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/src/support/test-setup.ts +0 -0
  58. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/tsconfig.json +0 -0
  59. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/tsconfig.spec.json +0 -0
  60. /package/src/{golden-core → golden-cores/full-stack-app}/apps/api-e2e/vitest.config.mts +0 -0
  61. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/.prettierrc.js +0 -0
  62. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/.swcrc +0 -0
  63. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/components.json +0 -0
  64. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/eslint.config.mjs +0 -0
  65. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/index.d.ts +0 -0
  66. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/next-env.d.ts +0 -0
  67. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/next.config.js +0 -0
  68. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/package.json +0 -0
  69. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/postcss.config.mjs +0 -0
  70. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/public/.gitkeep +0 -0
  71. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/public/favicon.ico +0 -0
  72. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/src/app/global.css +0 -0
  73. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/src/app/layout.tsx +0 -0
  74. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/src/app/page.tsx +0 -0
  75. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/src/app/providers.tsx +0 -0
  76. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/src/components/theme-toggle.tsx +0 -0
  77. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/src/components/ui/button.tsx +0 -0
  78. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/src/lib/utils.ts +0 -0
  79. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web/tsconfig.json +0 -0
  80. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web-e2e/eslint.config.mjs +0 -0
  81. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web-e2e/package.json +0 -0
  82. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web-e2e/playwright.config.mts +0 -0
  83. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web-e2e/src/example.spec.ts +0 -0
  84. /package/src/{golden-core → golden-cores/full-stack-app}/apps/web-e2e/tsconfig.json +0 -0
  85. /package/src/{golden-core → golden-cores/full-stack-app}/commitlint.config.cjs +0 -0
  86. /package/src/{golden-core → golden-cores/full-stack-app}/docker-compose.yml +0 -0
  87. /package/src/{golden-core → golden-cores/full-stack-app}/eslint.config.mjs +0 -0
  88. /package/src/{golden-core → golden-cores/full-stack-app}/gitignore.template +0 -0
  89. /package/src/{golden-core → golden-cores/full-stack-app}/lefthook.yml +0 -0
  90. /package/src/{golden-core → golden-cores/full-stack-app}/nx.json +0 -0
  91. /package/src/{golden-core → golden-cores/full-stack-app}/package.json +0 -0
  92. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/eslint-base.js +0 -0
  93. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/package.json +0 -0
  94. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/prettier.js +0 -0
  95. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/src/env.schema.spec.ts +0 -0
  96. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/src/env.schema.ts +0 -0
  97. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/src/index.ts +0 -0
  98. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/tsconfig.json +0 -0
  99. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/tsconfig.lib.json +0 -0
  100. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/tsconfig.spec.json +0 -0
  101. /package/src/{golden-core → golden-cores/full-stack-app}/packages/config/vitest.config.mts +0 -0
  102. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/package.json +0 -0
  103. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/src/index.ts +0 -0
  104. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/src/lib/db.spec.ts +0 -0
  105. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/src/lib/db.ts +0 -0
  106. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/tsconfig.json +0 -0
  107. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/tsconfig.lib.json +0 -0
  108. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/tsconfig.spec.json +0 -0
  109. /package/src/{golden-core → golden-cores/full-stack-app}/packages/db/vitest.config.mts +0 -0
  110. /package/src/{golden-core → golden-cores/full-stack-app}/pnpm-lock.yaml +0 -0
  111. /package/src/{golden-core → golden-cores/full-stack-app}/pnpm-workspace.yaml +0 -0
  112. /package/src/{golden-core → golden-cores/full-stack-app}/tools/phase-gate.cjs +0 -0
  113. /package/src/{golden-core → golden-cores/full-stack-app}/tsconfig.base.json +0 -0
  114. /package/src/{golden-core → golden-cores/full-stack-app}/tsconfig.json +0 -0
  115. /package/src/{golden-core → golden-cores/full-stack-app}/vitest.workspace.ts +0 -0
@@ -0,0 +1,188 @@
1
+ ---
2
+ name: hedgehog-landing-loop
3
+ description: Use for every unit of work on the landing-page core, from planning intake through the final build phase — the Chain Method's brief → feeling → tokens/motif → sequence → artifact pipeline, gated and committed one phase at a time, checked off TODO.md. Triggers on "next step", "next phase", "what's next", or the start of any work session on a bootstrapped landing-page project. Also covers this core's own planning intake and Correction Protocol.
4
+ ---
5
+
6
+ # Hedgehog Landing Loop
7
+
8
+ The operating loop for a bootstrapped `landing-page` project: pick the
9
+ next phase, run it through its owning agent, gate it, commit it, check it
10
+ off. `TODO.md` at repo root is the live list — read it before starting.
11
+ It's thin: a context blurb plus a checklist mirroring the phase structure
12
+ below. Checked/unchecked is its only state.
13
+
14
+ This is the **Chain Method**: a pipeline where every visual choice traces
15
+ back to a reason. No agent may introduce a choice that doesn't originate
16
+ in the previous agent's output — that discipline is what this skill
17
+ enforces mechanically, the same role Nx module boundaries play for
18
+ `full-stack-app`.
19
+
20
+ ## Planning intake (Phase 0, before any build phase)
21
+
22
+ Run once, before `bootstrap` scaffolds the workspace. Opens with
23
+ `hedgehog-planning-intake`'s Phase 0 — the same vendored BMAD-METHOD
24
+ shelf `full-stack-app` runs, in the same full sequence, archived to the
25
+ same `.hedgehog/BMAD/` layout. After that Phase 0 completes, this
26
+ section does its own mining — a one-paragraph subject statement, the
27
+ landing-page counterpart to `hedgehog-planning-intake`'s own Phase 1
28
+ (domain modules and an Add-ons decision on full-stack-app). That mined
29
+ draft becomes the first draft of `.hedgehog/chain/00-brief.md`, shown
30
+ back at Confirm & Lock for the user to accept or correct.
31
+
32
+ 1. **Run `hedgehog-planning-intake`'s Phase 0 in full**: state the BMAD
33
+ attribution it states, then run `bmad-brainstorming`,
34
+ `bmad-product-brief`, `bmad-prfaq`, `bmad-prd`, `bmad-ux`,
35
+ `bmad-deep-recon`, archived to `.hedgehog/BMAD/` with the fixed layout
36
+ and `00-manifest.md` attribution header that skill's Phase 0 defines.
37
+ `.hedgehog/BMAD/` is archival and immutable once written, same as
38
+ `full-stack-app` — nothing in this core's day-to-day loop reads it
39
+ live after this step mines it once.
40
+ 2. **Mine a draft subject statement** from `.hedgehog/BMAD/`: the
41
+ concrete subject (what is this actually selling/announcing/showing),
42
+ the audience, and the page's single job, sourced from the brief and
43
+ PR-FAQ (a landing page's brief and PR-FAQ are the closest BMAD
44
+ artifacts to a subject statement — the PRD's Glossary and deep-recon
45
+ output are read for supporting color, not required to resolve a
46
+ one-page subject/audience/job). Where BMAD's material leaves any of
47
+ the three genuinely unresolved, ask directly — don't proceed on
48
+ vagueness, and don't invent an audience or job that wasn't stated,
49
+ mined, or confirmed.
50
+ 3. **Write `.hedgehog/chain/00-brief.md`** — the mined subject statement,
51
+ one paragraph, plus the audience and single job named explicitly.
52
+ This is the root every downstream phase's traceability audit walks
53
+ back to; it draws from BMAD's archive but is its own file, in this
54
+ core's own `.hedgehog/chain/` layout, not a pointer into
55
+ `.hedgehog/BMAD/`.
56
+ 4. **Confirm & Lock** — show the mined subject statement, audience, and
57
+ job back in plain terms, alongside which BMAD skills ran and where
58
+ their output lives (`.hedgehog/BMAD/`), before writing `TODO.md`.
59
+ State plainly what happens on confirmation: *"This locks in the
60
+ brief, commits it (`chore(planning): intake`), and hands off to
61
+ `bootstrap` to scaffold the Astro workspace. The Strategist phase
62
+ starts once that closes. Anything wrong or missing — say so now."*
63
+ Wait for explicit go-ahead — a revision here is just another mining
64
+ pass against the same BMAD archive, not a Correction Protocol entry,
65
+ since nothing downstream exists yet.
66
+ 5. **Write `TODO.md`** mirroring the phase table below, then commit
67
+ planning intake's output as one commit, `chore(planning): intake` —
68
+ `TODO.md`, `.hedgehog/BMAD/`, `.hedgehog/chain/00-brief.md`, and root
69
+ `CLAUDE.md`'s filled placeholders.
70
+ 6. **Hand off to `bootstrap`** once the commit lands.
71
+
72
+ `planner` owns this section; see that agent for when it runs.
73
+
74
+ ## The Chain Method phases
75
+
76
+ Every phase's input is the prior phase's output, in this exact order — no
77
+ agent works from anything but what was actually handed to it. Steps 4a
78
+ (inside `landing-systems`) and 4c (inside `landing-strategist`) are the
79
+ only parallel-input point in the chain, both reading the same upstream
80
+ artifact; everything else is strictly sequential.
81
+
82
+ | # | Phase | Agent | Produces | Commit |
83
+ |---|---|---|---|---|
84
+ | 1 | Strategist | `landing-strategist` | Subject/audience/job statement (from planning intake — restated here as this phase's formal output) | `feat(landing): strategy` |
85
+ | 1b | Diagnostician | `landing-strategist` | Awareness level, Sophistication level, Sin/desire, Big Idea, Category/Positioning statement | bundled into `feat(landing): strategy` |
86
+ | 1c | Narrative Agent | `landing-strategist` | StoryBrand arc (Character → Problem → Guide → Plan → Action → Success/Failure), subject as Guide | bundled into `feat(landing): strategy` |
87
+ | 1d | Objection Agent | `landing-strategist` | Ranked objection map, each tagged with a Cialdini rebuttal principle | bundled into `feat(landing): strategy` |
88
+ | 2 | Brand Anthropologist | `landing-strategist` | 3–5 adjective pairs (each with a named opposite) | bundled into `feat(landing): strategy` |
89
+ | 3 | Psychologist | `landing-strategist` | Adjectives sorted visceral / behavioral / reflective | bundled into `feat(landing): strategy` |
90
+ | 4 | Perfumer | `landing-strategist` | Top/heart/base note timing per adjective, the page's peak moment, the ending treatment | bundled into `feat(landing): strategy` |
91
+ | 5 | Ingredient Director + Copywriter | `landing-systems` | Dial table (color/type/form/space/motion) + voice spec + gated headline (2 backups) + objection rebuttal prose, run against the same sorted-adjectives/diagnosis input | `feat(landing): systems` |
92
+ | 6 | Systems Designer | `landing-systems` | The token system (hex values, type roles, spacing unit, easing family, copy voice, with note timing attached) | bundled into `feat(landing): systems` |
93
+ | 7 | Motif Artist | `landing-systems` | Signature motif (source, persistence, continuity, scale range, literalness) | bundled into `feat(landing): systems` |
94
+ | 8 | Sequencer | `landing-sequencer` | Per-section transition type, weight, spacing, beat structure | `feat(landing): sequence` |
95
+ | 9 | Critic + Usability Auditor | `landing-critic` | Redlines, or a pass — reconciled traceability/distinctiveness + usability audit | `feat(landing): audit` (no commit if redlined — see Correction Protocol) |
96
+ | 10 | Builder | `landing-builder` | The built page, in Astro | `feat(landing): build` |
97
+
98
+ Phases 1 through 4 (including 1b/1c/1d) are one agent's context
99
+ (`landing-strategist`) because they're one continuous judgment call —
100
+ subject into diagnosis into feeling into timing — not separable artifacts
101
+ with different tool footprints. Same reasoning collapses 5–7 into
102
+ `landing-systems` (everything that becomes a Tailwind token or a line of
103
+ copy) and 8/9's reconciliation into a single `landing-critic` pass. See
104
+ each agent's own file for the internal sub-steps it runs through.
105
+
106
+ ## The Loop (every unit of work)
107
+
108
+ 1. **Pick the next phase** per the table above, from `TODO.md`. One phase
109
+ at a time, in order.
110
+ 2. **Check the gate.** The prior phase is checkpointed and committed
111
+ first.
112
+ 3. **Delegate exactly one phase** to its owning agent, passing it the
113
+ full chain so far (every upstream artifact, not just the immediately
114
+ prior one) — an agent that only sees its direct input can't verify its
115
+ own traceability back to the subject statement.
116
+ 4. The agent **runs its self-test** (see that agent's own file for what
117
+ it checks) before presenting its artifact.
118
+ 5. The agent **commits** using the exact Conventional Commit format
119
+ above.
120
+ 6. **Check off the line in `TODO.md`** once the agent reports the commit
121
+ landed.
122
+ 7. **Repeat**, one delegated phase at a time.
123
+
124
+ Each commit batches exactly one phase's artifact; a wrong phase is fixed
125
+ forward later via the Correction Protocol.
126
+
127
+ ## Correction Protocol
128
+
129
+ When a downstream phase reveals an upstream phase was wrong — most often
130
+ `landing-critic` redlining something that doesn't trace back to the
131
+ subject statement, or matches a known AI-default cluster:
132
+
133
+ 1. Stop.
134
+ 2. Patch the upstream phase directly, in place, via that phase's owning
135
+ agent.
136
+ 3. Fast-forward every dependent phase that breaks. A token system change
137
+ (phase 6) ripples through the motif (7), the sequence (8), and the
138
+ build (10) — each gets its own small commit, in order, not one bundled
139
+ fix.
140
+ 4. Re-run `landing-critic` against the patched chain before resuming.
141
+ 5. The commit messages are the explanation.
142
+ 6. Resume the loop.
143
+
144
+ Use `conventional-commits` when a correction touches several phases in
145
+ one working-tree pass and needs splitting back into per-phase commits.
146
+
147
+ ## Phase Transition Checks
148
+
149
+ Before `landing-builder` starts, confirm:
150
+
151
+ - `landing-critic` returned a pass, not a redline — a redlined spec never
152
+ reaches the Builder; it goes back to the phase the redline names.
153
+ - Every phase 1–9 has its commit landed.
154
+
155
+ Before `landing-strategist` starts, confirm planning intake's Confirm &
156
+ Lock has held and its commit has landed. If not, stop and ask.
157
+
158
+ ## Rules
159
+
160
+ - **No agent introduces a choice that doesn't originate in the previous
161
+ agent's output.** This is the chain's core discipline — enforced by
162
+ `landing-critic`'s traceability audit, not by tooling, so treat a
163
+ critic redline with the same weight a failed typecheck gets elsewhere
164
+ in Hedgehog.
165
+ - **Ingredients move in agreement.** Color, type, space, motion, copy
166
+ rhythm, and pacing are reconciled into one system at phase 6 — a
167
+ mismatch (warm color, cold type) is a defect `landing-systems` owns
168
+ fixing, not a later polish pass.
169
+ - **Sequential except phases 5's two parallel inputs.** The Ingredient
170
+ Director and Copywriter sub-steps inside `landing-systems` read the
171
+ same sorted-adjectives input and can run together; every other phase
172
+ waits on the one before it.
173
+ - **A wrong phase gets fixed at its source** — the Correction Protocol,
174
+ not a downstream workaround (e.g. don't patch the Builder's output to
175
+ fix a token that's wrong at the Systems Designer level).
176
+ - **The Critic's veto is real.** `landing-critic` can send any phase back
177
+ to its owning agent, citing which audit failed; it cannot rewrite the
178
+ artifact itself.
179
+ - **Figma/Stitch MCP output is input only.** Anything handed off from
180
+ those tools is re-derived through the token system (phase 6) before it
181
+ touches Tailwind config — never copied through as final values.
182
+
183
+ ## Stop Condition
184
+
185
+ A build session ends when every phase in `TODO.md` is checked off and
186
+ `landing-builder`'s artifact is committed, or when the subject statement
187
+ or an adjective is ambiguous enough that continuing means guessing — ask
188
+ one question and wait.
@@ -1,19 +1,24 @@
1
1
  ---
2
2
  name: hedgehog-planning-intake
3
- description: Use once per project, at the start, and again on a scoped pass when new domain scope enters play — runs the vendored BMAD-METHOD planning shelf, mines its output into scope boundary/domain modules/the Add-ons decision, and gates on Confirm & Lock before anything is written. Invoked by the `planner` agent; don't run standalone.
3
+ description: Use once per project, at the start, on either core Phase 0 (running the vendored BMAD-METHOD planning shelf) is shared by full-stack-app and landing-page alike; Phase 1 (mining BMAD's output into scope boundary/domain modules/the Add-ons decision) is full-stack-app's own procedure, run again on a scoped pass when new domain scope enters play. Invoked by the `planner` agent after Phase 0 core selection; don't run standalone. landing-page runs this skill's Phase 0, then mines the same archive through `hedgehog-landing-loop`'s own planning-intake section, that core's counterpart to this skill's Phase 1.
4
4
  ---
5
5
 
6
6
  # Hedgehog Planning Intake
7
7
 
8
- Turns a person's description of a problem into `TODO.md` (with its
9
- `## Add-ons` block) and `docs/design/<module>-notes.md` per module, by
10
- running the vendored BMAD-METHOD planning shelf and mining its output.
11
- This is the mechanics `planner` calls once its "does Hedgehog apply at
12
- all" check passes the interpretive judgment (scope boundary, module
13
- split, Add-ons decision, Confirm & Lock) still belongs to `planner`; this
14
- skill is the fixed procedure that judgment runs inside.
15
-
16
- ## Phase 0 BMAD elicitation
8
+ Turns a person's description of a problem into planning material, by
9
+ running the vendored BMAD-METHOD planning shelf (Phase 0, shared by both
10
+ cores) and mining its output. On full-stack-app that mining is this
11
+ skill's own Phase 1, into scope boundary/domain modules/Add-ons; on
12
+ landing-page it's `hedgehog-landing-loop`'s planning-intake section, into
13
+ a subject/audience/job statement. This is the mechanics `planner` calls
14
+ once its Phase 0 core-selection check has picked a core — the
15
+ interpretive judgment (scope boundary, module split, Add-ons decision on
16
+ full-stack-app; subject statement on landing-page; Confirm & Lock either
17
+ way) belongs to `planner`; this skill (Phase 0, and Phase 1 on
18
+ full-stack-app) and `hedgehog-landing-loop` (landing-page's own mining)
19
+ are the fixed procedures that judgment runs inside.
20
+
21
+ ## Phase 0 — BMAD elicitation (both cores)
17
22
 
18
23
  State the BMAD attribution, then run the vendored shelf in full
19
24
  sequence, every time — no per-project skip logic, no reduced default
@@ -55,13 +60,21 @@ Every file/folder carries a one-line attribution header. `00-manifest.md`
55
60
  states the source repo, pinned version (`skills/BMAD/ATTRIBUTION.md` has
56
61
  the pinned commit), date, and which skills ran.
57
62
 
58
- `.hedgehog/BMAD/` is archival and immutable once written. Nothing in
59
- `hedgehog-loop`'s day-to-day operation, `hedgehog-bootstrap`, or
60
- `reviewer` reads this folder live — `planner` reads it exactly once,
61
- right after the shelf completes, to mine it. After that it's historical
62
- record only, the same relationship the commit log has to a merged PR.
63
-
64
- ## Phase 1 Mining
63
+ `.hedgehog/BMAD/` is archival and immutable once written, on both cores.
64
+ Nothing in `hedgehog-loop`'s day-to-day operation, `hedgehog-bootstrap`,
65
+ or `reviewer` reads this folder live — `planner` reads it exactly once,
66
+ right after the shelf completes, to mine it (this skill's Phase 1 below
67
+ on full-stack-app; `hedgehog-landing-loop`'s planning-intake section on
68
+ landing-page). After that it's historical record only, the same
69
+ relationship the commit log has to a merged PR.
70
+
71
+ ## Phase 1 — Mining (full-stack-app only)
72
+
73
+ landing-page's counterpart to this Phase 1 is
74
+ `hedgehog-landing-loop`'s own planning-intake section, run once Phase 0
75
+ above completes: it mines the same `.hedgehog/BMAD/` archive into a
76
+ subject/audience/job statement, in place of the scope boundary/domain
77
+ modules/Add-ons decision this Phase 1 produces.
65
78
 
66
79
  Read `.hedgehog/BMAD/` once and do the interpretive work BMAD's docs
67
80
  don't do for you — none of BMAD's outputs contain a ready-made
@@ -0,0 +1,131 @@
1
+ ## This project's core: full-stack-app
2
+
3
+ Backend-first, schema → contract → repository → service → controller, then
4
+ hook → UX rationale → screen, per domain module. See `.hedgehog/BMAD/` for
5
+ the archival planning intake output — BMAD-METHOD's brainstorming, brief,
6
+ PRD, and UX spec, written once by `planner` and never edited after.
7
+ `TODO.md` also carries this core's `## Add-ons` block (Auth/Queue/Mobile,
8
+ each on or off) — check it before assuming any add-on's infra exists.
9
+
10
+ ### The skills — invoke these, don't improvise
11
+
12
+ The discipline is packaged as skills. Use them; don't reconstruct their
13
+ steps from memory:
14
+
15
+ - **`hedgehog-loop`** — every unit of work once bootstrapped: pick the
16
+ next step from `TODO.md`, build exactly one, gate it, commit it, check
17
+ it off. Also holds the Correction Protocol for fixing a wrong upstream
18
+ step. Invoke it at the start of any build session and for "what's next".
19
+ - **`hedgehog-bootstrap`** — run **once**, at project start, to scaffold
20
+ the core stack, the enforcement config, and whichever add-ons (Auth,
21
+ Queue, Mobile) planning intake turned on. Skip if `nx.json` already
22
+ exists.
23
+ - **`conventional-commits`** — when a change spans several steps in one
24
+ working-tree pass and needs splitting back into per-step commits (mainly
25
+ Correction Protocol cleanups).
26
+
27
+ ### The agents — delegate the judgment calls
28
+
29
+ - **`planner`** — planning intake (which core applies, then
30
+ `hedgehog-planning-intake`'s BMAD-METHOD brainstorming/brief/PRD/UX-spec
31
+ shelf, mined into scope boundary, the Add-ons decision, and domain
32
+ vocabulary) at project start, and module scoping when new scope enters
33
+ play. Writes `TODO.md` (including its `## Add-ons` block),
34
+ `.hedgehog/BMAD/`, and `docs/design/<module>-notes.md`. On first run,
35
+ hands off to the `bootstrap` agent once Confirm & Lock holds.
36
+ - **`bootstrap`** — runs `hedgehog-bootstrap`'s core steps (always) plus
37
+ whichever add-on steps planning intake turned on. Triggered
38
+ automatically by `planner` after its first run; skip if `nx.json`
39
+ already exists.
40
+ - **`backend-eng`** — builds each module's Phase A steps (schema →
41
+ contract → repository → service → controller → queue?), one step at a
42
+ time, gated and committed in its own context.
43
+ - **`ux-planner`** — once per module in Phase B, after the hook exists and
44
+ before the screen: writes `docs/design/<module>.md`.
45
+ - **`front-end-eng`** — builds each module's Phase B steps (hook, screen)
46
+ from the ux-planner rationale, one step at a time, in its own context.
47
+ - **`reviewer`** — phase-transition and Correction Protocol checks the
48
+ mechanical gate can't make (port discipline, FK-by-ID discipline,
49
+ contract shape).
50
+
51
+ ## The constants (do not deviate)
52
+
53
+ ### Stack: core (locked, every project) + add-ons (this project's picks below)
54
+
55
+ **Core** — applies regardless of project size or which add-ons are on:
56
+ Nx monorepo · pnpm · **NestJS** (all domain logic + DB access) · **Drizzle**
57
+ (+ `drizzle-zod`) · **PostgreSQL** · **Docker Compose** (local Postgres,
58
+ every host OS) · Railway · **ts-rest** contracts · **Zod** validation ·
59
+ **TanStack Query** hooks · **Next.js** + ShadCN + Tailwind (web, UI only) ·
60
+ Pino logging · Vitest + Playwright (tests) · Conventional Commits +
61
+ commitlint + lefthook · Sentry.
62
+
63
+ **Add-ons** — each on or off per project, decided at planning intake and
64
+ recorded in `TODO.md`'s `## Add-ons` block; check that block for this
65
+ project's actual picks rather than assuming any of these are present:
66
+
67
+ | Add-on | Adds |
68
+ | --- | --- |
69
+ | Auth | Better Auth, `packages/auth`, a global auth guard on `apps/api` |
70
+ | Queue | BullMQ + Redis, `apps/worker`, a `Queue` port/adapter seam |
71
+ | Mobile | Expo + React Native Reusables + NativeWind, `apps/mobile` |
72
+
73
+ An add-on that's off means the corresponding piece of infra genuinely
74
+ isn't in this codebase — don't write code assuming `packages/auth`,
75
+ `apps/worker`, or `apps/mobile` exist without checking `TODO.md`'s
76
+ `## Add-ons` block first.
77
+
78
+ Don't substitute libraries, in core or in whichever add-ons are on. If a
79
+ package or generator name changed upstream, verify against current docs
80
+ before running — don't swap in a different library.
81
+
82
+ ### Layout
83
+
84
+ ```
85
+ docker-compose.yml local Postgres (+ Redis if Queue add-on is on) — every host OS, no native install
86
+ apps/
87
+ web Next.js — UI only
88
+ mobile Expo — only if Mobile add-on is on
89
+ api NestJS — owns all domain logic + DB access
90
+ worker BullMQ consumers — only if Queue add-on is on
91
+ packages/
92
+ db Drizzle schema + client
93
+ contracts ts-rest + Zod contracts
94
+ hooks TanStack Query — shared web + mobile
95
+ jobs typed job registry / queue definitions — only if Queue add-on is on
96
+ auth Better Auth config — only if Auth add-on is on
97
+ config locked ESLint/Prettier/tsconfig/env schema
98
+ shared cross-cutting types + utils
99
+ libs/
100
+ <module>/port · <module>/repository · <module>/service (one triplet per table)
101
+ .hedgehog/
102
+ BMAD/ archival planning intake output (brief, PRD, UX spec, research) — write-once, from planner
103
+ docs/
104
+ design <module>-notes.md (planner, sourced from BMAD's UX spec) and <module>.md (ux-planner)
105
+ ```
106
+
107
+ Check `TODO.md`'s `## Add-ons` block before assuming any "only if" line
108
+ above is actually present in this codebase.
109
+
110
+ ### Core rules
111
+
112
+ - **One table = one domain module.** Each carries the full step sequence.
113
+ - **Cross-module references are FK-by-ID only.** A service imports only
114
+ its own ports — never another module's adapter. (Enforced by Nx module
115
+ boundaries; building out of order fails `nx lint`.)
116
+ - **Backend before frontend.** Phase A (schema → contract → repository →
117
+ service → controller → queue?) closes for a module before Phase B
118
+ (hooks → screen) opens. Enforced by the CI phase gate.
119
+ - **Sequential within a phase.** A step starts only once the previous one
120
+ compiles and passes tests.
121
+ - **One step = one commit**, in the exact Conventional Commit format from
122
+ `hedgehog-loop`. A commit that fails typecheck/lint/test does not happen
123
+ (lefthook gate).
124
+ - **Fix wrong steps at the source** via the Correction Protocol — never a
125
+ downstream workaround.
126
+ - **Local Postgres always runs through `docker-compose.yml`**, on every
127
+ host OS, regardless of add-ons; Redis joins it only if the Queue add-on
128
+ is on. Never a natively-installed Postgres or Redis, even to match a
129
+ contributor's existing local setup.
130
+ - **`packages/config` is the single source** for shared config. A per-app
131
+ override request means fix the base config, not add an override.
@@ -0,0 +1,133 @@
1
+ ## This project's core: landing-page
2
+
3
+ The Chain Method: brief → feeling → tokens/motif → sequence → artifact,
4
+ where every visual choice traces back to a sentence that caused it. No
5
+ domain data, no backend — a single (or few-page) marketing site, built
6
+ once through a fixed pipeline rather than iterated on freely. See
7
+ `.hedgehog/BMAD/` for the vendored BMAD-METHOD shelf's raw output and
8
+ `.hedgehog/chain/` for this core's own archival planning intake output —
9
+ the Strategist's subject statement, the adjective/note tables, and the
10
+ token system, written once by `planner` and the pipeline agents, never
11
+ edited after a phase closes.
12
+
13
+ ### The skills — invoke these, don't improvise
14
+
15
+ - **`hedgehog-landing-loop`** — every unit of work once bootstrapped:
16
+ pick the next step from `TODO.md`, run exactly one Chain Method phase
17
+ through its owning agent, gate it, commit it, check it off. Also holds
18
+ the Correction Protocol for fixing a wrong upstream phase (e.g. a
19
+ motif that doesn't trace back to the subject statement). Invoke it at
20
+ the start of any build session and for "what's next".
21
+ - **`hedgehog-bootstrap-landing-page-core`** — run **once**, at project
22
+ start, to land the pre-verified Astro + Tailwind workspace. Skip if
23
+ `astro.config.mjs` already exists.
24
+ - **`conventional-commits`** — when a change spans several phases in one
25
+ working-tree pass and needs splitting back into per-phase commits
26
+ (mainly Correction Protocol cleanups).
27
+
28
+ ### The agents — delegate the judgment calls
29
+
30
+ - **`planner`** — planning intake (which core applies, then this core's
31
+ own brief intake: the vendored BMAD-METHOD shelf, run in full and
32
+ mined into subject, audience, single page job) at project start.
33
+ Writes `TODO.md`, `.hedgehog/BMAD/`, and `.hedgehog/chain/00-brief.md`.
34
+ On first run, hands off to the `bootstrap` agent once Confirm & Lock
35
+ holds.
36
+ - **`bootstrap`** — runs `hedgehog-bootstrap-landing-page-core`'s steps.
37
+ Triggered automatically by `planner` after its first run; skip if
38
+ `astro.config.mjs` already exists.
39
+ - **`landing-strategist`** — Chain Method steps 1–3 and 4c, plus the
40
+ Diagnostician/Narrative Agent/Objection Agent sub-steps folded into
41
+ step 1: subject statement → Awareness/Sophistication/Big-Idea
42
+ diagnosis → narrative arc → objection map → adjective pairs
43
+ (visceral/behavioral/reflective) → top/heart/base note timing and the
44
+ page's single peak moment. One context, one artifact: the emotional
45
+ and persuasive target spec.
46
+ - **`landing-systems`** — steps 4a/4b/5/6, run together: the ingredient
47
+ dial table, the copy voice spec (plus the Awareness-gated headline and
48
+ objection rebuttal prose), the token system that reconciles them, and
49
+ the signature motif. Owns everything that becomes a Tailwind token or a
50
+ piece of copy.
51
+ - **`landing-sequencer`** — step 7: per-section transition type, weight,
52
+ spacing, and beat structure — the GSAP/ScrollTrigger/Lenis pacing spec
53
+ the Builder implements against.
54
+ - **`landing-critic`** — steps 8–9 reconciled: traceability/distinctiveness
55
+ audit (does every choice trace to the subject statement, does anything
56
+ match a known AI-default cluster) and the usability pass (Fitts's Law
57
+ on the CTA, affordance/signifier check). Has veto power; cannot rewrite,
58
+ only redline back to the owning agent.
59
+ - **`landing-builder`** — step 10: builds the audited spec exactly in
60
+ Astro. Anything that can't be built as specified is flagged back up the
61
+ chain, never silently improvised around.
62
+
63
+ ## The constants (do not deviate)
64
+
65
+ ### Stack (locked, every project — no add-ons on this core)
66
+
67
+ **Astro** (zero-JS-by-default shell, islands only where interaction is
68
+ genuinely needed) · **Tailwind** (config as token layer only — no
69
+ component library on top) · **GSAP + ScrollTrigger** (primary animation
70
+ engine; owns Sequencer pacing and top/heart/base fade timing) ·
71
+ **Lenis** (smooth-scroll feel) · **SVG-first** (hand-authored graphics
72
+ for the motif — no icon library or generator look) · **SplitType**
73
+ (line/word/char copy-reveal splitting) · **Paper.js** (canvas vector
74
+ work for a motif that evolves across sections) · **MorphSVGPlugin**
75
+ (GSAP — for a motif that physically transforms across sections) ·
76
+ **custom SVG noise/grain filter** (cheap materiality/texture layer) ·
77
+ **React Three Fiber** (rare — only when the subject is genuinely
78
+ spatial; default is to skip it).
79
+
80
+ Figma MCP / Stitch MCP are handoff/input tools only, used at the
81
+ Strategist/Builder boundaries — never allowed to set spacing or style
82
+ defaults directly. Anything they hand off is re-derived through the
83
+ Systems Designer's token system (step 5) before it touches Tailwind
84
+ config.
85
+
86
+ Don't substitute libraries. If a package name changed upstream, verify
87
+ against current docs before running — don't swap in a different one, and
88
+ don't reach for a component library or icon set to fill a gap one of the
89
+ above doesn't cover; that gap is a signal to go back to the Ingredient
90
+ Vocabulary and derive the right choice, not to default to something
91
+ off-the-shelf.
92
+
93
+ ### Layout
94
+
95
+ ```
96
+ astro.config.mjs Astro workspace root
97
+ tailwind.config.ts token layer only — hex values, type roles, spacing unit, easing family from Step 5
98
+ src/
99
+ pages/ one file per page (usually just index.astro)
100
+ sections/ one component per page section, in Sequencer order
101
+ motifs/ the signature SVG/Paper.js motif + its variation rules
102
+ styles/ global.css — Tailwind import + CSS variable theme
103
+ .hedgehog/
104
+ BMAD/ vendored BMAD-METHOD shelf's raw output (brief, PR-FAQ, PRD, UX spec, research) —
105
+ write-once, from planner
106
+ chain/ this core's own archival planning intake output — subject statement, adjective tables,
107
+ token system, motif spec, sequence spec — write-once, from planner + pipeline agents
108
+ docs/
109
+ design/ audited spec (Critic + Usability Auditor reconciled) the Builder builds from
110
+ ```
111
+
112
+ ### Core rules
113
+
114
+ - **One page, one job.** The Strategist's subject statement names it;
115
+ every downstream choice traces back to that sentence or gets cut.
116
+ - **No agent introduces a choice that doesn't originate in the previous
117
+ agent's output.** A motif the Motif Artist didn't source from the
118
+ subject, a color the Ingredient Director didn't derive from an
119
+ adjective — both get redlined by the Critic, not waved through.
120
+ - **Ingredients move in agreement.** Color, type, space, motion, copy
121
+ rhythm, and pacing are one system reconciled at step 5 — a page warm
122
+ in color but cold in type is a defect, not a style choice.
123
+ - **Sequential through the pipeline.** A phase starts only once the
124
+ phase before it is checkpointed and committed — steps 4a/4b/4c run in
125
+ parallel (same input), everything else is strictly sequential.
126
+ - **One phase = one commit**, in the exact Conventional Commit format
127
+ from `hedgehog-landing-loop`.
128
+ - **Fix wrong phases at the source** via the Correction Protocol — never
129
+ a downstream workaround (e.g. don't patch the Builder's output to fix
130
+ a token that's wrong at the Systems Designer's level).
131
+ - **The Critic's veto is real.** A traceability or default-cluster
132
+ failure blocks the Builder from starting, the same way a failing gate
133
+ blocks a commit elsewhere in Hedgehog.