@skyf0xx/hedgehog 3.0.12 → 3.0.14

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 (124) hide show
  1. package/README.md +3 -3
  2. package/bin/cli.mjs +11 -9
  3. package/package.json +3 -3
  4. package/src/agents/backend-eng.md +6 -8
  5. package/src/agents/front-end-eng.md +14 -18
  6. package/src/agents/layer-eng.md +2 -3
  7. package/src/agents/planner.md +119 -76
  8. package/src/agents/tweaker.md +43 -20
  9. package/src/skills/hedgehog-authored-loop/SKILL.md +38 -36
  10. package/src/skills/hedgehog-bootstrap/SKILL.md +2 -5
  11. package/src/skills/hedgehog-bootstrap-full-stack-app-core/SKILL.md +10 -23
  12. package/src/skills/hedgehog-core-design/SKILL.md +23 -6
  13. package/src/skills/hedgehog-landing-loop/SKILL.md +72 -45
  14. package/src/skills/hedgehog-loop/SKILL.md +58 -8
  15. package/src/skills/hedgehog-planning-intake/SKILL.md +119 -18
  16. package/src/skills/landing-copy-cta/SKILL.md +5 -13
  17. package/src/skills/landing-copy-headline/SKILL.md +3 -3
  18. package/src/skills/landing-copy-hero/SKILL.md +1 -5
  19. package/src/skills/landing-copy-mechanism/SKILL.md +1 -6
  20. package/src/skills/landing-copy-objection/SKILL.md +3 -8
  21. package/src/skills/landing-copy-problem/SKILL.md +1 -5
  22. package/src/skills/landing-copy-proof/SKILL.md +1 -8
  23. package/src/skills/landing-shapes/SKILL.md +6 -9
  24. package/src/skills/nx-generate/SKILL.md +1 -4
  25. package/src/skills/nx-run-tasks/SKILL.md +1 -5
  26. package/src/skills/nx-workspace/SKILL.md +3 -28
  27. package/src/templates/CLAUDE.core.authored.md +11 -4
  28. package/src/templates/CLAUDE.core.full-stack-app.md +8 -4
  29. package/src/templates/CLAUDE.core.landing-page.md +10 -1
  30. package/src/templates/CLAUDE.md +41 -11
  31. package/{skills → vendor-skills}/BMAD/ATTRIBUTION.md +1 -1
  32. package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/SKILL.md +1 -1
  33. package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-product-brief/SKILL.md +1 -1
  34. package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/SKILL.md +1 -1
  35. package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/SKILL.md +1 -1
  36. package/{skills → vendor-skills}/BMAD/core-skills/bmad-advanced-elicitation/SKILL.md +1 -1
  37. package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/SKILL.md +1 -1
  38. package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/SKILL.md +1 -1
  39. /package/{skills → vendor-skills}/BMAD/LICENSE +0 -0
  40. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/agents/artifact-analyzer.md +0 -0
  41. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/agents/web-researcher.md +0 -0
  42. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/assets/prfaq-template.md +0 -0
  43. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/bmad-manifest.json +0 -0
  44. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/customize.toml +0 -0
  45. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/references/customer-faq.md +0 -0
  46. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/references/internal-faq.md +0 -0
  47. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/references/press-release.md +0 -0
  48. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-prfaq/references/verdict.md +0 -0
  49. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-product-brief/assets/brief-template.md +0 -0
  50. /package/{skills → vendor-skills}/BMAD/bmm-skills/1-analysis/bmad-product-brief/customize.toml +0 -0
  51. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/assets/headless-schemas.md +0 -0
  52. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/assets/prd-template.md +0 -0
  53. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/assets/prd-validation-checklist.md +0 -0
  54. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/assets/validation-report-template.html +0 -0
  55. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/customize.toml +0 -0
  56. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/references/headless.md +0 -0
  57. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-prd/references/validate.md +0 -0
  58. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/color-themes.md +0 -0
  59. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/design-directions.md +0 -0
  60. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/design-example-editorial.md +0 -0
  61. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/design-example-mobile.md +0 -0
  62. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/design-example-shadcn.md +0 -0
  63. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/excalidraw-wireframe.md +0 -0
  64. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/experience-example-mobile.md +0 -0
  65. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/experience-example-shadcn.md +0 -0
  66. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/headless-schemas.md +0 -0
  67. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/key-screens.md +0 -0
  68. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/assets/validation-report-template.html +0 -0
  69. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/customize.toml +0 -0
  70. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/references/creative-tools.md +0 -0
  71. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/references/design-md-spec.md +0 -0
  72. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/references/headless.md +0 -0
  73. /package/{skills → vendor-skills}/BMAD/bmm-skills/2-plan-workflows/bmad-ux/references/validate.md +0 -0
  74. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-advanced-elicitation/assets/methods.csv +0 -0
  75. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-advanced-elicitation/customize.toml +0 -0
  76. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-advanced-elicitation/scripts/pick_methods.py +0 -0
  77. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-advanced-elicitation/scripts/tests/test_pick_methods.py +0 -0
  78. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/assets/brain-icons.json +0 -0
  79. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/assets/brain-methods.csv +0 -0
  80. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/assets/brain-selector.html +0 -0
  81. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/customize.toml +0 -0
  82. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/converge.md +0 -0
  83. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/finalize.md +0 -0
  84. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/headless.md +0 -0
  85. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/in-chat-techniques.md +0 -0
  86. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/mode-autonomous.md +0 -0
  87. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/mode-facilitator.md +0 -0
  88. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/mode-partner.md +0 -0
  89. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/references/resume.md +0 -0
  90. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/scripts/brain.py +0 -0
  91. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-brainstorming/scripts/tests/test_brain.py +0 -0
  92. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/assets/research.template.md +0 -0
  93. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/customize.toml +0 -0
  94. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/draft.md +0 -0
  95. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/finalize.md +0 -0
  96. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/html-briefing.md +0 -0
  97. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/lifecycle.md +0 -0
  98. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/process.md +0 -0
  99. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/run.md +0 -0
  100. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/selection.md +0 -0
  101. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/synthesis.md +0 -0
  102. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/references/verification.md +0 -0
  103. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/scripts/recon_kit.py +0 -0
  104. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/scripts/tests/test_recon_kit.py +0 -0
  105. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/types/academic-lit.md +0 -0
  106. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/types/competitive.md +0 -0
  107. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/types/domain.md +0 -0
  108. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/types/market.md +0 -0
  109. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/types/technical.md +0 -0
  110. /package/{skills → vendor-skills}/BMAD/core-skills/bmad-deep-recon/types/user-voice.md +0 -0
  111. /package/{skills → vendor-skills}/BMAD/scripts/memlog.py +0 -0
  112. /package/{skills → vendor-skills}/BMAD/scripts/resolve_customization.py +0 -0
  113. /package/{skills → vendor-skills}/BMAD/scripts/tests/test_memlog.py +0 -0
  114. /package/{skills → vendor-skills}/GSAP/ATTRIBUTION.md +0 -0
  115. /package/{skills → vendor-skills}/GSAP/LICENSE +0 -0
  116. /package/{skills → vendor-skills}/GSAP/gsap-core/SKILL.md +0 -0
  117. /package/{skills → vendor-skills}/GSAP/gsap-frameworks/SKILL.md +0 -0
  118. /package/{skills → vendor-skills}/GSAP/gsap-performance/SKILL.md +0 -0
  119. /package/{skills → vendor-skills}/GSAP/gsap-plugins/SKILL.md +0 -0
  120. /package/{skills → vendor-skills}/GSAP/gsap-react/SKILL.md +0 -0
  121. /package/{skills → vendor-skills}/GSAP/gsap-scrolltrigger/SKILL.md +0 -0
  122. /package/{skills → vendor-skills}/GSAP/gsap-timeline/SKILL.md +0 -0
  123. /package/{skills → vendor-skills}/GSAP/gsap-utils/SKILL.md +0 -0
  124. /package/{skills → vendor-skills}/GSAP/llms.txt +0 -0
package/README.md CHANGED
@@ -55,7 +55,7 @@ The build order is encoded into the project. The AI does not have to remember wh
55
55
  Unlike stories and epics, **the graph locks build order** into an **signal-dense, context-light** path the agents can use.
56
56
 
57
57
  ```bash
58
- npx @skyf0xx/hedgehog graph
58
+ npx @skyf0xx/hedgehog graph # show graph
59
59
  ```
60
60
 
61
61
  ![The Hedgehog build graph](https://raw.githubusercontent.com/skyf0xx/hedgehog/master/docs/images/graph.png)
@@ -165,7 +165,7 @@ npx @skyf0xx/hedgehog update
165
165
  This refreshes the installed agents and skills — for every coding agent
166
166
  the project was set up for — along with the `AGENTS.md` index derived
167
167
  from them. It never touches the instructions file, the build graph, the
168
- core workspace, or `skills/BMAD`, since those carry project-specific or
168
+ core workspace, or `vendor-skills/BMAD`, since those carry project-specific or
169
169
  write-once content.
170
170
 
171
171
  ## Why Hedgehog
@@ -200,7 +200,7 @@ The `nx-generate`, `nx-run-tasks`, `nx-workspace`, and
200
200
  (`nrwl/nx-ai-agents-config`) MIT-licensed, pinned to commit `9609810`
201
201
  (2026-07-23) and rewritten for Hedgehog's pnpm-only workspace convention.
202
202
 
203
- `front-end-eng`'s animation skills (`skills/GSAP/`) are vendored from
203
+ `front-end-eng`'s animation skills (`vendor-skills/GSAP/`) are vendored from
204
204
  [gsap-skills](https://github.com/greensock/gsap-skills)
205
205
  (`greensock/gsap-skills`) MIT-licensed, pinned to commit `aed9cfd`
206
206
  (2026-07-27).
package/bin/cli.mjs CHANGED
@@ -108,12 +108,12 @@ function plan(core, host = DEFAULT_HOST, { hostOnly = false } = {}) {
108
108
  : [
109
109
  // The vendored BMAD-METHOD planning shelf that
110
110
  // hedgehog-planning-intake runs — referenced by repo-root-relative
111
- // path (skills/BMAD/...), so it lands there rather than under a
112
- // host's own directory.
113
- { type: 'dir', from: 'skills/BMAD', to: 'skills/BMAD' },
111
+ // path (vendor-skills/BMAD/...), so it lands there rather than under
112
+ // a host's own directory.
113
+ { type: 'dir', from: 'vendor-skills/BMAD', to: 'vendor-skills/BMAD' },
114
114
  // The vendored GSAP animation skill shelf that front-end-eng loads
115
115
  // for motion work — same repo-root-relative referencing.
116
- { type: 'dir', from: 'skills/GSAP', to: 'skills/GSAP' },
116
+ { type: 'dir', from: 'vendor-skills/GSAP', to: 'vendor-skills/GSAP' },
117
117
  ];
118
118
 
119
119
  const base = [...perHost, ...shared];
@@ -157,8 +157,9 @@ function plan(core, host = DEFAULT_HOST, { hostOnly = false } = {}) {
157
157
  // this, always overwriting, since a consuming project's installed agents
158
158
  // and skills are supposed to match upstream verbatim. The bootstrap file
159
159
  // carries project-filled content, the build graph and core workspace are
160
- // verified once by their own init/bootstrap-core steps, and skills/BMAD
161
- // and skills/GSAP are re-vendored only deliberately (a manual re-vendor,
160
+ // verified once by their own init/bootstrap-core steps, and
161
+ // vendor-skills/BMAD and vendor-skills/GSAP are re-vendored only
162
+ // deliberately (a manual re-vendor,
162
163
  // per each shelf's ATTRIBUTION.md) — none of those belong in an update.
163
164
  function updatePlan(host = DEFAULT_HOST) {
164
165
  const h = HOSTS[host];
@@ -293,8 +294,9 @@ derived from them) from the installed Hedgehog version, so an
293
294
  already-bootstrapped project can pick up changes from a newer release. It
294
295
  refreshes every host the project was installed for, always overwriting
295
296
  those directories. The instructions file, the build graph, the core
296
- workspace, and skills/BMAD and skills/GSAP stay as they are — those are
297
- project-specific or updated deliberately, not by this command.
297
+ workspace, and vendor-skills/BMAD and vendor-skills/GSAP stay as they
298
+ are — those are project-specific or updated deliberately, not by this
299
+ command.
298
300
  `);
299
301
  }
300
302
 
@@ -452,7 +454,7 @@ async function update({ hosts }) {
452
454
  console.log(
453
455
  dim(
454
456
  `${bootstraps}, the build graph, the core workspace, and\n` +
455
- 'skills/BMAD and skills/GSAP are untouched — those carry\n' +
457
+ 'vendor-skills/BMAD and vendor-skills/GSAP are untouched — those carry\n' +
456
458
  'project-specific or write-once content.',
457
459
  ),
458
460
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyf0xx/hedgehog",
3
- "version": "3.0.12",
3
+ "version": "3.0.14",
4
4
  "description": "Install the Hedgehog build discipline (agents + skills) into a repo, for Claude Code, Cursor, or Gemini CLI.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -25,8 +25,8 @@
25
25
  "src/skills",
26
26
  "src/templates",
27
27
  "src/golden-cores",
28
- "skills/BMAD",
29
- "skills/GSAP"
28
+ "vendor-skills/BMAD",
29
+ "vendor-skills/GSAP"
30
30
  ],
31
31
  "engines": {
32
32
  "node": ">=22.5.0"
@@ -31,11 +31,10 @@ gated by `hedgehog verify` before the next starts.
31
31
  `controller` layer's packet, verified by that layer's own check.
32
32
  - **PostgreSQL** via Docker Compose — never a natively-installed Postgres.
33
33
 
34
- Use the `nx-run-tasks` skill to run build/lint/test/typecheck, `nx-workspace`
35
- to inspect project/target config when a task fails or a boundary is
36
- unclear, `nx-generate` if a step calls for scaffolding a new
37
- library/app rather than hand-writing it, and `link-workspace-packages`
38
- when a new package needs wiring into a consumer's dependencies.
34
+ Use `nx-run-tasks` (build/lint/test/typecheck), `nx-workspace` (inspecting
35
+ project/target config), `nx-generate` (scaffolding a new library/app), and
36
+ `link-workspace-packages` (wiring a new package into a consumer) as
37
+ needed.
39
38
 
40
39
  ## Core Responsibilities
41
40
 
@@ -87,9 +86,8 @@ when a new package needs wiring into a consumer's dependencies.
87
86
 
88
87
  ## Constraints
89
88
 
90
- - Never self-certify a task as done. Report what was built and that
91
- local checks pass; only `hedgehog verify`'s exit code moves the task to
92
- `complete`. Never run `git commit` for the task's own changes.
89
+ - Never self-certify a task as done or run `git commit` for its changes —
90
+ see Workflow step 3.
93
91
  - Never import another module's repository, service, or schema directly
94
92
  — cross-module references are FK-by-ID, resolved at the
95
93
  contract/controller layer (parallel calls) or via a same-repository
@@ -29,17 +29,16 @@ exactly what its ALLOWED SCOPE names, one layer at a time, gated by
29
29
  you talk to the API. Never call `fetch`/`axios` against `apps/api`
30
30
  routes directly.
31
31
 
32
- Use the `nx-run-tasks` skill to run build/lint/test/typecheck,
33
- `nx-workspace` to inspect project/target config when a task fails or a
34
- boundary is unclear, `nx-generate` if a step calls for scaffolding a new
35
- library/app rather than hand-writing it, and `link-workspace-packages`
36
- when a new package needs wiring into a consumer's dependencies.
32
+ Use `nx-run-tasks` (build/lint/test/typecheck), `nx-workspace` (inspecting
33
+ project/target config), `nx-generate` (scaffolding a new library/app), and
34
+ `link-workspace-packages` (wiring a new package into a consumer) as
35
+ needed.
37
36
 
38
37
  If the screen step calls for animation or motion — entrances, sequencing,
39
38
  scroll-driven effects, drag, SVG/morph effects — use GSAP, loading the
40
- relevant skill from `skills/GSAP/` (`gsap-core`, `gsap-timeline`,
39
+ relevant skill from `vendor-skills/GSAP/` (`gsap-core`, `gsap-timeline`,
41
40
  `gsap-scrolltrigger`, `gsap-plugins`, `gsap-utils`, `gsap-react`,
42
- `gsap-performance`, `gsap-frameworks`; see `skills/GSAP/llms.txt` for
41
+ `gsap-performance`, `gsap-frameworks`; see `vendor-skills/GSAP/llms.txt` for
43
42
  which to load). GSAP is the one animation library in the locked stack —
44
43
  don't reach for a second one.
45
44
 
@@ -48,14 +47,12 @@ don't reach for a second one.
48
47
  - **`hook`**: build the TanStack Query hook in `packages/hooks`, wrapping
49
48
  the ts-rest contract client. One hook per contract operation, typed end
50
49
  to end from the Zod contract. The client's base URL comes from a
51
- `NEXT_PUBLIC_`-prefixed env var (added to
52
- `packages/config/env.schema.ts` if it isn't there yet) — never a
53
- hardcoded `http://localhost:<port>` literal, even as a "temporary"
54
- fallback. `apps/api`'s dev port is `3333` (see `hedgehog-bootstrap-full-stack-app-core`
55
- — chosen specifically to not collide with `apps/web`'s `next dev`
56
- default of `3000`); a literal fallback drifts out of sync with that the
57
- moment either port changes and produces a silent 404 that looks like a
58
- routing bug, not a config bug.
50
+ `NEXT_PUBLIC_`-prefixed env var (add to `packages/config/env.schema.ts`
51
+ if missing) — never a hardcoded `http://localhost:<port>` fallback,
52
+ which silently drifts out of sync with `apps/api`'s dev port (`3333`,
53
+ per `hedgehog-bootstrap-full-stack-app-core` — chosen to not collide
54
+ with `apps/web`'s `next dev` default of `3000`) and produces a 404 that
55
+ looks like a routing bug, not a config bug.
59
56
  - **`screen`**: build the screen/component in `apps/web` and/or
60
57
  `apps/mobile`, consuming the hook and `ux-planner`'s rationale for that
61
58
  module (screen inventory, interaction pattern, information hierarchy).
@@ -92,9 +89,8 @@ don't reach for a second one.
92
89
 
93
90
  ## Constraints
94
91
 
95
- - Never self-certify a task as done. Report what was built and that
96
- local checks pass; only `hedgehog verify`'s exit code moves the task to
97
- `complete`. Never run `git commit` for the task's own changes.
92
+ - Never self-certify a task as done or run `git commit` for its changes —
93
+ see Workflow step 3.
98
94
  - Never add a data-fetching call that bypasses the hook/contract layer —
99
95
  the Nx boundary rule (`scope:web` / `scope:mobile` only depend on
100
96
  `scope:contracts`, `scope:hooks`, `scope:shared`) makes a direct
@@ -68,9 +68,8 @@ parsing and typing, and the layer after it consumes the result.
68
68
 
69
69
  ## Constraints
70
70
 
71
- - Never self-certify a task as done. Report what was built and that local
72
- checks pass; only `hedgehog verify`'s exit code moves a task to
73
- `complete`. Never run `git commit` for the task's own changes.
71
+ - Never self-certify a task as done or run `git commit` for its changes —
72
+ see Workflow step 4.
74
73
  - Never write outside the packet's ALLOWED SCOPE. Scope is what stops
75
74
  this layer from quietly rewriting the previous one's work; `hedgehog
76
75
  verify` enforces it, and a change that needs to land elsewhere is a
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: planner
3
- description: Use for planning intake (core selection, then scope boundary + domain vocabulary or Chain Method brief, depending on core), run at the start of a project, and for determining module scope/order when a new set of domain modules enters play. Not a per-step planner — the step sequence within a project and the build graph already handle that.
3
+ description: Use for planning intake (core selection, then scope boundary + domain vocabulary or Chain Method brief, depending on core) at the start of a project, and for re-entry when new scope enters play on a project already built or mid-build — including after a build has reached its Stop Condition, where it is the exit `tweaker` routes new scope to. Runs a first-run or a re-entry path depending on whether the build graph already holds intents. Not a per-step planner — the step sequence within a project and the build graph already handle that.
4
4
  model: sonnet
5
5
  color: yellow
6
6
  tools: Read, Glob, Grep, Edit, Write, Bash
@@ -19,23 +19,35 @@ artifact gets written.
19
19
 
20
20
  ## When you run
21
21
 
22
- - **Phase 0 core selection** (every project, before anything else): the
23
- gate below.
24
- - **Phase 1 planning intake**, in the shape the chosen core defines
25
- (once per project, before step 1 of anything).
26
- - **New scope entering play** (full-stack-app only): modules added to
27
- scope need placing in build order. Run a scoped pass — BMAD's
28
- brief/PRD update flows against what's new, then re-mine before
29
- decomposing. Landing-page has no equivalent: it's a fixed one-page (or
30
- few-page) scope set once at Phase 1, not grown incrementally.
31
- - When the user says "plan", "scope", "break down", or before a large
32
- refactor that might cross module boundaries (full-stack-app).
22
+ You run on two paths, and Workflow step 2 decides which:
23
+
24
+ - **First run** (the graph holds no intents): **Phase 0 core
25
+ selection**, the gate below, then **Phase 1 planning intake** in the
26
+ shape the chosen core defines, then the `bootstrap` handoff.
27
+ - **Re-entry** (the graph already holds intents): new scope entering play
28
+ on a project that's already been built or is mid-build, on a core with
29
+ a module axis to add an intent to (full-stack-app, authored). The core
30
+ is already chosen and its workspace already scaffolded, so Phase 0 and
31
+ the `bootstrap` handoff are both skipped run
32
+ `hedgehog-planning-intake`'s **Re-entry pass** instead, which mines new
33
+ scope into additional intents without re-running the BMAD shelf.
34
+ Landing-page has no module axis, so this path doesn't apply to it — see
35
+ the landing-page constraint below for where its new scope actually
36
+ goes.
37
+
38
+ Either path is entered when the user says "plan", "scope", "break down",
39
+ asks for something that's new scope rather than a tweak (routed here by
40
+ `tweaker`), or before a large refactor that might cross module boundaries
41
+ (full-stack-app).
33
42
 
34
43
  ## Phase 0 — which core applies
35
44
 
36
- Before invoking any planning-intake skill, on a project's first run only,
37
- decide which core the description calls for. The real question is
38
- always *which* core — "no core fits" is a narrow case, handled below.
45
+ Before invoking any planning-intake skill, on a first run only (Workflow
46
+ step 2 establishes which run this is), decide which core the description
47
+ calls for. The real question is always *which* core — "no core fits" is a
48
+ narrow case, handled below. On re-entry this whole phase is skipped: the
49
+ core is a settled fact of the project, readable from `.hedgehog/core.yaml`
50
+ and the scaffolded workspace.
39
51
 
40
52
  - **`full-stack-app`** — the description names persistent domain data
41
53
  with its own lifecycle: something that gets created, changes state,
@@ -93,7 +105,9 @@ rather than guess.
93
105
 
94
106
  ## Phase 1 — planning intake
95
107
 
96
- Once Phase 0 picks a core, run that core's own intake procedure:
108
+ Once Phase 0 picks a core, run that core's own intake procedure. This is
109
+ the first-run shape; on re-entry, run `hedgehog-planning-intake`'s
110
+ **Re-entry pass** instead of anything below.
97
111
 
98
112
  - **`full-stack-app`** → open `hedgehog-planning-intake` and follow it in
99
113
  full: Phase 0 runs the vendored BMAD-METHOD shelf
@@ -178,77 +192,85 @@ accounts get added where there were none).
178
192
  ## Core Responsibilities
179
193
 
180
194
  - Decide which core applies before running any planning-intake skill —
181
- Phase 0 above. Neither shipped core fitting but something being built
182
- means an authored core: BMAD Phase 0, then `hedgehog-core-design`
183
- designs the layer sequence and writes `.hedgehog/core.yaml` (Phase 0's
184
- third outcome). Nothing to build at all means stop and say so, not
185
- force a discipline onto nothing.
186
- - **full-stack-app**: run the vendored BMAD shelf in full to turn a
187
- person's description of a problem into planning documents, then mine
188
- `04-prd.md` only into intent records — one `intents` row per §4
189
- Feature, its FR Consequences and feature-specific rules as
190
- `requirements`, its §3 Glossary relationships as `intent_dependencies`
191
- (spec: "Mapping BMAD output to intents") — written via `hedgehog intent
192
- add`, plus the Add-ons decision (see "The Add-ons decision" above),
193
- written to `.hedgehog/addons.yaml`. Own `.hedgehog/BMAD/` (archival,
194
- written once, never edited after) and `.hedgehog/addons.yaml` as
195
- artifacts; the intent records themselves live in the build graph, not
196
- a file this agent owns.
197
- - **landing-page**: run the same vendored BMAD shelf in full, then mine
198
- its output into a draft subject statement (subject, audience, single
199
- page job) instead of intent records — shown back at this core's own
200
- Confirm & Lock for the user to accept or correct. Own `.hedgehog/BMAD/`
201
- (archival, written once, never edited after) and
195
+ Phase 0 above.
196
+ - **full-stack-app**: owns `.hedgehog/BMAD/` (archival, written once,
197
+ never edited after) and `.hedgehog/addons.yaml` as artifacts; the
198
+ intent records Phase 1 writes via `hedgehog intent add` live in the
199
+ build graph, not a file this agent owns.
200
+ - **landing-page**: owns `.hedgehog/BMAD/` and
202
201
  `.hedgehog/chain/00-brief.md` as artifacts.
203
202
 
204
203
  ## Workflow
205
204
 
206
205
  1. **Read the requirement** fully before doing anything.
207
- 2. **Check `hedgehog status` and the commit log** for what's already
208
- builtfull-stack-app: `feat(<module>): api` commits and each task's
209
- status in the graph mark modules with a closed Phase A. Landing-page:
210
- a `complete` phase task marks that phase's artifact as committed.
206
+ 2. **Run `hedgehog status` and decide which path you're on.** This is a
207
+ branch, not a survey the rest of the workflow depends on its answer:
208
+ - **No intents in the graph first run.** Continue at step 3.
209
+ - **One or more intents re-entry.** Skip steps 3, 4, and 9 entirely
210
+ and go to step 5's re-entry branch. The core is already chosen and
211
+ its workspace already scaffolded; re-deciding either is destructive,
212
+ not a fresh start.
213
+
214
+ Read the commit log alongside it for what's already built —
215
+ full-stack-app: `feat(<module>): api` commits and each task's status in
216
+ the graph mark modules with a closed Phase A. Landing-page: a
217
+ `complete` phase task marks that phase's artifact as committed.
211
218
  Authored core: each `complete` task marks that layer committed, per
212
- `.hedgehog/core.yaml`'s own commit messages.
213
- 3. **Run Phase 0 — which core applies.** A shipped core fitting, no core
214
- fitting but something being built (authored core), or nothing to build
215
- (stop and say so) the three outcomes above.
216
- 4. **On an authored core only, design it before mining**: run
219
+ `.hedgehog/core.yaml`'s own commit messages. On re-entry this is what
220
+ tells you which modules the new scope can depend on.
221
+ 3. **First run only run Phase 0, which core applies.** A shipped core
222
+ fitting, no core fitting but something being built (authored core), or
223
+ nothing to build (stop and say so) the three outcomes above.
224
+ 4. **First run only, on an authored core, design it before mining**: run
217
225
  `hedgehog-planning-intake`'s Phase 0, then `hedgehog-core-design`
218
226
  through its own Confirm & Lock, which writes `.hedgehog/core.yaml` and
219
227
  `.hedgehog/core-design.md`. Then continue at step 5 with that core's
220
228
  Phase 1 mining — its Phase 0 has already run, so don't run the BMAD
221
- shelf twice.
222
- 5. **Run Phase 1 that core's planning intake:**
223
- - full-stack-app: run the vendored BMAD shelf (or a scoped pass
224
- against it, if new scope is entering play on an existing project),
225
- then mine `04-prd.md` only into intent records per the PRD→graph-row
229
+ shelf twice. On re-entry these two files are locked; a layer sequence
230
+ that turns out to be wrong is a Correction Protocol case, not a quiet
231
+ rewrite here.
232
+ 5. **Run planning intake**, in the shape this path calls for:
233
+ - **First run, full-stack-app**: run the vendored BMAD shelf, then
234
+ mine `04-prd.md` only into intent records per the PRD→graph-row
226
235
  table (spec: "Mapping BMAD output to intents") and the Add-ons
227
236
  decision (see above) — asking the user directly only for whatever
228
237
  the PRD leaves unresolved.
229
- - landing-page: run the same vendored BMAD shelf in full, then mine
230
- `.hedgehog/BMAD/` into a draft subject statement (subject, audience,
231
- single page job) — asking the user directly only for whatever
232
- BMAD's docs leave unresolved.
233
- 6. **Run that core's Confirm & Lock** before writing anything.
238
+ - **First run, landing-page**: run the same vendored BMAD shelf in
239
+ full, then mine `.hedgehog/BMAD/` into a draft subject statement
240
+ (subject, audience, single page job) — asking the user directly only
241
+ for whatever BMAD's docs leave unresolved.
242
+ - **Re-entry (any core)**: run `hedgehog-planning-intake`'s **Re-entry
243
+ pass**. It reads the existing `.hedgehog/BMAD/` as context and elicits
244
+ only what's new — the BMAD shelf does not run again.
245
+ 6. **Run the matching Confirm & Lock** before writing anything — the
246
+ first-run stage on a first run, the extension variant on re-entry.
234
247
  7. **Write the intent records**: full-stack-app writes each intent via
235
- `hedgehog intent add`, one call per PRD Feature, plus
236
- `.hedgehog/addons.yaml`; landing-page writes `.hedgehog/chain/00-brief.md`
237
- per its own Confirm & Lock, in the shape `hedgehog-landing-loop`'s
238
- planning-intake section defines.
239
- 8. **Commit planning intake's output as one commit**,
240
- `chore(planning): intake` the committed `.hedgehog/hedgehog.db` (its
241
- new intent rows on full-stack-app), `.hedgehog/addons.yaml`
242
- (full-stack-app only), this core's own archival planning output
243
- (`.hedgehog/BMAD/` or `.hedgehog/chain/`), the authored core's
244
- `.hedgehog/core.yaml` and `.hedgehog/core-design.md` if step 4 ran, and
245
- root `CLAUDE.md`'s filled placeholders. This is planning intake's own
246
- unit of work, landed before `bootstrap` touches anything.
247
- 9. **On first run only, hand off to the `bootstrap` agent** once the
248
- commit lands it scaffolds the chosen core's workspace (and, for
248
+ `hedgehog intent add`, one call per PRD Feature (per new module, on
249
+ re-entry), plus `.hedgehog/addons.yaml`; landing-page writes
250
+ `.hedgehog/chain/00-brief.md` per its own Confirm & Lock, in the shape
251
+ `hedgehog-landing-loop`'s planning-intake section defines — on a first
252
+ run only, since re-entry there requires the existing brief to still
253
+ hold. Then run **`hedgehog plan`** to compile those intents into
254
+ tasks. On re-entry this is append-only: `plan` only reads intents still
255
+ `proposed`/`planned`, so already-compiled work is untouched and its
256
+ `complete` tasks keep their status.
257
+ 8. **Commit planning intake's output as one commit** —
258
+ `chore(planning): intake` on a first run, `chore(planning): extend
259
+ scope` on re-entry, so the two passes are distinguishable in the log.
260
+ It carries the committed `.hedgehog/hedgehog.db` (its new intent and
261
+ task rows on full-stack-app), `.hedgehog/addons.yaml` (full-stack-app
262
+ only, and on re-entry only if a trigger actually changed), this core's
263
+ own archival planning output (`.hedgehog/BMAD/` or `.hedgehog/chain/`,
264
+ first run only), the authored core's `.hedgehog/core.yaml` and
265
+ `.hedgehog/core-design.md` if step 4 ran, and root `CLAUDE.md`'s filled
266
+ placeholders (first run only). This is planning intake's own unit of
267
+ work, landed before `bootstrap` touches anything.
268
+ 9. **First run only — hand off to the `bootstrap` agent** once the
269
+ commit lands. It scaffolds the chosen core's workspace (and, for
249
270
  full-stack-app, whichever add-ons are on) before any build step
250
- starts. Skip this on a later run (new scope entering play,
251
- full-stack-app only); the workspace already exists.
271
+ starts. On re-entry the workspace already exists: hand straight to
272
+ this core's loop skill instead, which picks the new work up from
273
+ `hedgehog next`.
252
274
  10. **Return a summary**: which core (naming it as authored, if it is),
253
275
  the intents added (or subject statement, for landing-page), any open
254
276
  questions.
@@ -272,13 +294,34 @@ accounts get added where there were none).
272
294
  or "improve."
273
295
  - Archival planning output is write-once on every core. Once a file is
274
296
  written, it's historical record — don't edit it to reflect a later
275
- decision. On full-stack-app a later run writes its own dated pass if
276
- intake re-runs; landing-page's scope is fixed at Phase 1, not
277
- re-entered, so its `.hedgehog/BMAD/` and `.hedgehog/chain/00-brief.md`
278
- are written exactly once, ever.
297
+ decision. `.hedgehog/BMAD/` and `.hedgehog/chain/00-brief.md` are
298
+ written exactly once, on the first run, and read as context on every
299
+ re-entry after. A re-entry pass never rewrites them: what's new lives
300
+ in the new intents it adds, and the commit log carries the rest.
279
301
  - Never invent scope. Ambiguous scope means stop and ask — this applies
280
302
  equally to a full-stack-app module boundary and a landing-page subject
281
303
  statement, whether or not BMAD's docs offered a mineable answer.
304
+ - **On landing-page, new scope after the build is complete is governed by
305
+ the subject statement, not by page or section count — and it is not
306
+ routed to you.** This core has no module axis, so there's no intent for
307
+ a later `planner` run to add: the single `landing` intent already
308
+ compiles into the fixed five-phase chain. `.hedgehog/chain/00-brief.md`
309
+ is the root every downstream phase's traceability audit walks back to,
310
+ so the only question is whether it still holds:
311
+ - **It holds** (a pricing section on a page whose subject is
312
+ unchanged — the page still sells the same thing to the same audience
313
+ for the same job): this is additive work inside the existing chain,
314
+ handled by `hedgehog-landing-loop`'s Correction Protocol post-build
315
+ entry, not by you.
316
+ - **It doesn't hold** (a different product, a different audience, a
317
+ different job): that's a new subject, and a new subject is a new
318
+ landing-page project through your first run there — not an edit to
319
+ this one's locked brief.
320
+
321
+ If a request like this reaches you anyway, read `00-brief.md`, say
322
+ which of the two it is, and route it correctly rather than absorbing
323
+ it. Never rewrite the brief to accommodate new scope; that inverts the
324
+ traceability the whole core rests on.
282
325
  - Never default a full-stack-app add-on on or off without either a
283
326
  concrete trigger in BMAD's docs or a direct answer to a gap-fill
284
327
  question — an unresolved add-on left as a guess is the same mistake as
@@ -54,10 +54,27 @@ discipline as the rest of the build (`fix(<scope>): <what>` or
54
54
 
55
55
  A tweak is a small, targeted edit to something that already exists —
56
56
  not a new module, not a new phase, not scope growth. If a request turns
57
- out to be either of those, say so and route it back to `planner`
58
- (full-stack-app: new scope entering play; landing-page: a new page or
59
- section is its own planning pass; authored core: new scope, or a change
60
- to the layer sequence itself) rather than absorbing it here.
57
+ out to be either of those, say so and route it onward a completed
58
+ build is extendable, not sealed, and the user should not hear "no" where
59
+ the answer is "that's a different session." Where it routes depends on
60
+ the core:
61
+
62
+ - **full-stack-app** — a new domain module, or a feature that needs one,
63
+ routes to `planner`, which runs `hedgehog-planning-intake`'s
64
+ **Re-entry pass**: it adds intents for the new work without re-running
65
+ planning from scratch, and without disturbing anything already built.
66
+ - **authored core** — new scope on the module axis routes to `planner`'s
67
+ Re-entry pass the same way. A change to the layer sequence itself is
68
+ the Correction Protocol instead (`.hedgehog/core.yaml` is locked).
69
+ - **landing-page** — the test is whether `.hedgehog/chain/00-brief.md`
70
+ still holds. This core has no module axis, so a new section under a
71
+ brief that still holds does **not** route to `planner` — it routes to
72
+ the Correction Protocol's post-build entry (this core's own loop skill),
73
+ which re-runs the sequencer and copy phases for that section and
74
+ rebuilds the artifact. A different subject, audience, or job is a
75
+ different page and belongs in its own landing-page project — say so
76
+ rather than routing it, and never rewrite `00-brief.md` to fit new
77
+ scope into the old chain.
61
78
 
62
79
  ### Job 2 — Friction review, user feedback, and issue suggestion
63
80
 
@@ -191,18 +208,17 @@ discipline as `.hedgehog/BMAD/`. A later related incident is its own new
191
208
  asking.
192
209
  - Entries (or feedback items) that trace to the same underlying gap were
193
210
  grouped into one issue, not filed as duplicates.
194
- - Each issue shown to the user for approval is the literal, final
195
- content, with the correct label(s) for its source (`bug` +
196
- `help wanted` for friction, `suggestion` for user feedback) — not a
197
- summary of what will be filed, and not silently altered after the user
198
- approved it.
199
- - No issue was created without an explicit final approval on that
200
- specific issue's exact shown content — approval on one pattern was
201
- never treated as approval for another.
211
+ - Shown content is literal/final and correctly labeled never a
212
+ summary, never altered post-approval, and never created without an
213
+ explicit approval on that specific issue's exact shown content.
202
214
  - Every tweak is its own commit, scoped to what the user actually asked
203
215
  for — no drive-by refactor riding along on a color change.
204
- - A request that's actually new scope (a new module, a new page section)
205
- was routed back to `planner`, not built here.
216
+ - A request that's actually new scope (a new module on full-stack-app or
217
+ an authored core, or a new landing-page section whose subject
218
+ statement still holds) was routed onward — to `planner`'s Re-entry
219
+ pass, or on landing-page to the Correction Protocol's post-build entry
220
+ — not built here, and the user was told the build is extendable, not
221
+ that the request was refused.
206
222
 
207
223
  ## Constraints
208
224
 
@@ -214,10 +230,12 @@ discipline as `.hedgehog/BMAD/`. A later related incident is its own new
214
230
  having happened in this conversation. A user saying "yes, file it"
215
231
  before the content was shown verbatim doesn't count — show first, then
216
232
  ask.
217
- - **If delegated**, an approval relayed by the orchestrating session is
218
- sufficient only if it quotes the user's actual words with provenance
219
- stated plainly e.g. "user said: '\<exact words\>'" not a bare "the
220
- user approved" or "approved via UI."
233
+ - **If delegated**, the orchestrating session relays approval on the
234
+ user's behalf. A quoted, attributed relay (`user said: "<exact
235
+ words>"`) **is** sufficient approval treat it as you would the user
236
+ typing it directly. A bare unquoted assertion ("the user approved") is
237
+ not. Don't demand the user type "here" when they have no channel to do
238
+ so.
221
239
  - File one issue per distinct real pattern or feedback item, not one per
222
240
  log entry or remark, and not capped at a single issue per source — a
223
241
  log (or a round of feedback) with several unrelated genuine points gets
@@ -242,8 +260,13 @@ discipline as `.hedgehog/BMAD/`. A later related incident is its own new
242
260
  write-once per row, same as `.hedgehog/BMAD/`.
243
261
  - Don't expand a tweak into a rebuild. If a "tweak" actually requires
244
262
  redoing a phase (e.g. the voice spec itself needs to change, not just
245
- one line of copy), that's the Correction Protocol, run by the owning
246
- agent — say so and route it there rather than patching around it here.
263
+ one line of copy), that's the Correction Protocol say so and route it
264
+ there rather than patching around it here. Use its **post-build entry**
265
+ (in this core's own loop skill): the build is already at its Stop
266
+ Condition, so there's no task in flight to stop and no loop to resume,
267
+ and the correction is fixed forward in new commits rather than by
268
+ reopening a `complete` task. The orchestrating session runs it and owns
269
+ the commits, the same way `hedgehog verify` always is.
247
270
  - Don't run job 2's friction detection against anything other than
248
271
  `hedgehog friction list` — don't re-scan the whole commit log or
249
272
  conversation history looking for friction; if it wasn't logged, it