@skyf0xx/hedgehog 2.0.13 → 3.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.
- package/README.md +9 -3
- package/bin/cli.mjs +463 -19
- package/package.json +3 -2
- package/src/agents/backend-eng.md +56 -45
- package/src/agents/bootstrap.md +67 -73
- package/src/agents/front-end-eng.md +31 -18
- package/src/agents/planner.md +163 -84
- package/src/agents/reviewer.md +4 -4
- package/src/agents/tweaker.md +138 -106
- package/src/db/core.mjs +141 -0
- package/src/db/friction.mjs +25 -0
- package/src/db/init.mjs +35 -0
- package/src/db/intent.mjs +101 -0
- package/src/db/next.mjs +179 -0
- package/src/db/plan.mjs +222 -0
- package/src/db/schema.mjs +95 -0
- package/src/db/status.mjs +113 -0
- package/src/db/verify.mjs +286 -0
- package/src/db/why.mjs +97 -0
- package/src/golden-cores/full-stack-app/core.yaml +41 -0
- package/src/golden-cores/landing-page/core.yaml +41 -0
- package/src/skills/conventional-commits/SKILL.md +1 -1
- package/src/skills/hedgehog-bootstrap/SKILL.md +38 -41
- package/src/skills/hedgehog-bootstrap-full-stack-app-core/SKILL.md +8 -12
- package/src/skills/hedgehog-bootstrap-landing-page-core/SKILL.md +7 -9
- package/src/skills/hedgehog-core-design/SKILL.md +239 -0
- package/src/skills/hedgehog-landing-loop/SKILL.md +91 -57
- package/src/skills/hedgehog-loop/SKILL.md +109 -77
- package/src/skills/hedgehog-planning-intake/SKILL.md +72 -97
- package/src/templates/CLAUDE.core.full-stack-app.md +31 -24
- package/src/templates/CLAUDE.core.landing-page.md +11 -7
- package/src/templates/CLAUDE.md +46 -38
- package/src/templates/TODO.core.full-stack-app.md +0 -51
- package/src/templates/TODO.core.landing-page.md +0 -31
- package/src/templates/TODO.md +0 -12
package/src/agents/planner.md
CHANGED
|
@@ -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
|
|
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.
|
|
4
4
|
model: sonnet
|
|
5
5
|
color: yellow
|
|
6
6
|
tools: Read, Glob, Grep, Edit, Write, Bash
|
|
@@ -34,9 +34,8 @@ artifact gets written.
|
|
|
34
34
|
## Phase 0 — which core applies
|
|
35
35
|
|
|
36
36
|
Before invoking any planning-intake skill, on a project's first run only,
|
|
37
|
-
decide which core the description calls for.
|
|
38
|
-
|
|
39
|
-
core, because "no core fits" is now a narrower case than it used to be:
|
|
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.
|
|
40
39
|
|
|
41
40
|
- **`full-stack-app`** — the description names persistent domain data
|
|
42
41
|
with its own lifecycle: something that gets created, changes state,
|
|
@@ -49,15 +48,34 @@ core, because "no core fits" is now a narrower case than it used to be:
|
|
|
49
48
|
waitlist/portfolio page (or a small handful of such pages) with no
|
|
50
49
|
persistent domain data of its own. A page that only collects an email
|
|
51
50
|
into a third-party form service, or has no state at all, qualifies.
|
|
52
|
-
The bar is "no domain module,"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
The bar is "no domain module," and it routes to a real core rather
|
|
52
|
+
than stopping.
|
|
53
|
+
- **Neither shipped core fits, but something is being built** — the
|
|
54
|
+
description names a real artifact a Builder step would produce, just
|
|
55
|
+
not in either Golden Core's shape. This project gets an **authored
|
|
56
|
+
core**, designed by you and written to `.hedgehog/core.yaml`. Don't ask
|
|
57
|
+
the user what layers to build in — someone who could name the right
|
|
58
|
+
sequence unprompted wouldn't need a discipline to enforce it. Run
|
|
59
|
+
`hedgehog-planning-intake`'s Phase 0 first (an architecture can't be
|
|
60
|
+
designed off a one-line description; the drivers that decide it are
|
|
61
|
+
what BMAD elicits), then open `hedgehog-core-design` against that
|
|
62
|
+
archive: it names the system shape, picks the stack, derives the
|
|
63
|
+
layers, decides the module axis, and writes `.hedgehog/core.yaml` plus
|
|
64
|
+
its rationale at its own Confirm & Lock. An authored core is a weaker
|
|
65
|
+
guarantee than a Golden Core (the sequence was designed for this
|
|
66
|
+
project, not battle-tested across many) but carries the same
|
|
67
|
+
enforcement — ordered layers, scoped file access, verification before
|
|
68
|
+
completion — and the loader has no leniency for it
|
|
69
|
+
(`src/db/core.mjs`). Once the file is
|
|
70
|
+
written, Phase 1 mining proceeds as it would for any core; only the
|
|
71
|
+
layer sequence a compiled task walks differs.
|
|
72
|
+
- **Neither, and nothing is being built** — a one-off script, a slide
|
|
73
|
+
deck, a pure design exercise with no page to ship, anything with no
|
|
74
|
+
artifact any core's Builder step would produce. Say so plainly and
|
|
75
|
+
stop: forcing a core's sequence onto nothing to build has no payoff,
|
|
76
|
+
and eliciting a full intake for it is ceremony on top of ceremony. This
|
|
77
|
+
is a real bail-out, not a formality — don't soften it into forcing a
|
|
78
|
+
core that doesn't fit.
|
|
61
79
|
|
|
62
80
|
This is a distinct question from project *size*. A single-table, single-
|
|
63
81
|
user tool (one person's task list, a personal habit tracker) is still
|
|
@@ -78,17 +96,16 @@ Once Phase 0 picks a core, run that core's own intake procedure:
|
|
|
78
96
|
- **`full-stack-app`** → open `hedgehog-planning-intake` and follow it in
|
|
79
97
|
full: Phase 0 runs the vendored BMAD-METHOD shelf
|
|
80
98
|
(`bmad-code-org/BMAD-METHOD`, MIT-licensed) and archives its output to
|
|
81
|
-
`.hedgehog/BMAD/`; Phase 1 mines
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
fixed `## Add-ons` block format `TODO.md` carries.
|
|
99
|
+
`.hedgehog/BMAD/`; Phase 1 mines `04-prd.md` only into intent records
|
|
100
|
+
(spec: "Mapping BMAD output to intents") and writes them via `hedgehog
|
|
101
|
+
intent add`; the skill's Confirm & Lock stage is the hard stop before
|
|
102
|
+
anything gets written. State the BMAD attribution plainly before that
|
|
103
|
+
Phase 0 begins: *"Planning intake runs on BMAD-METHOD
|
|
104
|
+
(bmad-code-org/BMAD-METHOD, MIT-licensed) — I'll run its brainstorming,
|
|
105
|
+
brief, PRD, and UX spec skills, then take over from there with
|
|
106
|
+
Hedgehog's own build discipline."* BMAD elicits and produces planning
|
|
107
|
+
documents; it has no execution discipline of its own — Hedgehog starts
|
|
108
|
+
where BMAD's output ends.
|
|
92
109
|
- **`landing-page`** → open `hedgehog-landing-loop`'s planning-intake
|
|
93
110
|
section and follow it: it opens with `hedgehog-planning-intake`'s
|
|
94
111
|
Phase 0 (the same vendored BMAD shelf `full-stack-app` runs, in full,
|
|
@@ -109,90 +126,146 @@ actually in scope, where a table becomes a module (full-stack-app) or
|
|
|
109
126
|
what the page's single job actually is (landing-page) — stays yours
|
|
110
127
|
throughout.
|
|
111
128
|
|
|
129
|
+
## The Add-ons decision (full-stack-app only)
|
|
130
|
+
|
|
131
|
+
Auth, Queue, and Mobile are project-wide, one-time Bootstrap infra — not
|
|
132
|
+
a domain module and not a build-graph layer, so they don't become an
|
|
133
|
+
`intents` row or a `core.yaml` layer. Decide each independently while
|
|
134
|
+
mining `04-prd.md`:
|
|
135
|
+
|
|
136
|
+
- **Auth** — on if the PRD describes accounts, logins, or per-user/
|
|
137
|
+
per-account data.
|
|
138
|
+
- **Queue** — on if at least one described operation is genuinely
|
|
139
|
+
long-running, needs retries, or fans out.
|
|
140
|
+
- **Mobile** — on if the PRD explicitly wants a mobile app alongside or
|
|
141
|
+
instead of web.
|
|
142
|
+
|
|
143
|
+
Infer first, gap-fill second — this is not a second full interview. For
|
|
144
|
+
any add-on the PRD leaves genuinely unresolved, ask the user directly:
|
|
145
|
+
"does this need user accounts/login, or is it just for you?", "is
|
|
146
|
+
anything here a background job, or is it all instant reads and writes?",
|
|
147
|
+
"web only, or mobile too?" A "no" is a resolved answer, not a gap. Never
|
|
148
|
+
default an add-on on or off without either a concrete trigger in the PRD
|
|
149
|
+
or a direct answer.
|
|
150
|
+
|
|
151
|
+
Write the decision to `.hedgehog/addons.yaml`, one entry per add-on with
|
|
152
|
+
its on/off state and the one-line reason it landed there:
|
|
153
|
+
|
|
154
|
+
```yaml
|
|
155
|
+
auth:
|
|
156
|
+
on: true
|
|
157
|
+
reason: accounts/login in scope
|
|
158
|
+
queue:
|
|
159
|
+
on: false
|
|
160
|
+
reason: no long-running ops
|
|
161
|
+
mobile:
|
|
162
|
+
on: false
|
|
163
|
+
reason: not requested
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
This is the single stable field `bootstrap`, `hedgehog-bootstrap`,
|
|
167
|
+
`hedgehog-loop`, `backend-eng`, and `reviewer` all read to decide whether
|
|
168
|
+
an add-on's infra belongs in this project — not any other file. Show it
|
|
169
|
+
in full at Confirm & Lock, alongside the intents about to be added. An
|
|
170
|
+
absent `.hedgehog/addons.yaml` reads as "never decided," not "decided
|
|
171
|
+
off" — those two are distinct and downstream checks treat them
|
|
172
|
+
differently. Written once at Phase 1; a later run (new scope entering
|
|
173
|
+
play) only edits it if new scope genuinely changes a trigger (e.g.
|
|
174
|
+
accounts get added where there were none).
|
|
175
|
+
|
|
112
176
|
## Core Responsibilities
|
|
113
177
|
|
|
114
178
|
- Decide which core applies before running any planning-intake skill —
|
|
115
|
-
Phase 0 above.
|
|
116
|
-
|
|
179
|
+
Phase 0 above. Neither shipped core fitting but something being built
|
|
180
|
+
means an authored core: BMAD Phase 0, then `hedgehog-core-design`
|
|
181
|
+
designs the layer sequence and writes `.hedgehog/core.yaml` (Phase 0's
|
|
182
|
+
third outcome). Nothing to build at all means stop and say so, not
|
|
183
|
+
force a discipline onto nothing.
|
|
117
184
|
- **full-stack-app**: run the vendored BMAD shelf in full to turn a
|
|
118
|
-
person's description of a problem into planning documents,
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
185
|
+
person's description of a problem into planning documents, then mine
|
|
186
|
+
`04-prd.md` only into intent records — one `intents` row per §4
|
|
187
|
+
Feature, its FR Consequences and feature-specific rules as
|
|
188
|
+
`requirements`, its §3 Glossary relationships as `intent_dependencies`
|
|
189
|
+
(spec: "Mapping BMAD output to intents") — written via `hedgehog intent
|
|
190
|
+
add`, plus the Add-ons decision (see "The Add-ons decision" above),
|
|
191
|
+
written to `.hedgehog/addons.yaml`. Own `.hedgehog/BMAD/` (archival,
|
|
192
|
+
written once, never edited after) and `.hedgehog/addons.yaml` as
|
|
193
|
+
artifacts; the intent records themselves live in the build graph, not
|
|
194
|
+
a file this agent owns.
|
|
128
195
|
- **landing-page**: run the same vendored BMAD shelf in full, then mine
|
|
129
196
|
its output into a draft subject statement (subject, audience, single
|
|
130
|
-
page job) instead of
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
- Either way: update `TODO.md` to reflect the checklist for what's in
|
|
135
|
-
scope, mirroring the chosen core's own phase/step structure.
|
|
197
|
+
page job) instead of intent records — shown back at this core's own
|
|
198
|
+
Confirm & Lock for the user to accept or correct. Own `.hedgehog/BMAD/`
|
|
199
|
+
(archival, written once, never edited after) and
|
|
200
|
+
`.hedgehog/chain/00-brief.md` as artifacts.
|
|
136
201
|
|
|
137
202
|
## Workflow
|
|
138
203
|
|
|
139
204
|
1. **Read the requirement** fully before doing anything.
|
|
140
|
-
2. **Check `
|
|
141
|
-
full-stack-app: `feat(<module>): api` commits
|
|
142
|
-
closed Phase A. Landing-page:
|
|
143
|
-
that phase's artifact as committed.
|
|
144
|
-
3. **Run Phase 0 — which core applies.**
|
|
145
|
-
|
|
146
|
-
|
|
205
|
+
2. **Check `hedgehog status` and the commit log** for what's already
|
|
206
|
+
built — full-stack-app: `feat(<module>): api` commits and each task's
|
|
207
|
+
status in the graph mark modules with a closed Phase A. Landing-page:
|
|
208
|
+
a `complete` phase task marks that phase's artifact as committed.
|
|
209
|
+
3. **Run Phase 0 — which core applies.** A shipped core fitting, no core
|
|
210
|
+
fitting but something being built (authored core), or nothing to build
|
|
211
|
+
(stop and say so) — the three outcomes above.
|
|
212
|
+
4. **On an authored core only, design it before mining**: run
|
|
213
|
+
`hedgehog-planning-intake`'s Phase 0, then `hedgehog-core-design`
|
|
214
|
+
through its own Confirm & Lock, which writes `.hedgehog/core.yaml` and
|
|
215
|
+
`.hedgehog/core-design.md`. Then continue at step 5 with that core's
|
|
216
|
+
Phase 1 mining — its Phase 0 has already run, so don't run the BMAD
|
|
217
|
+
shelf twice.
|
|
218
|
+
5. **Run Phase 1 — that core's planning intake:**
|
|
147
219
|
- full-stack-app: run the vendored BMAD shelf (or a scoped pass
|
|
148
220
|
against it, if new scope is entering play on an existing project),
|
|
149
|
-
then mine
|
|
150
|
-
|
|
151
|
-
directly only for whatever
|
|
221
|
+
then mine `04-prd.md` only into intent records per the PRD→graph-row
|
|
222
|
+
table (spec: "Mapping BMAD output to intents") and the Add-ons
|
|
223
|
+
decision (see above) — asking the user directly only for whatever
|
|
224
|
+
the PRD leaves unresolved.
|
|
152
225
|
- landing-page: run the same vendored BMAD shelf in full, then mine
|
|
153
226
|
`.hedgehog/BMAD/` into a draft subject statement (subject, audience,
|
|
154
227
|
single page job) — asking the user directly only for whatever
|
|
155
228
|
BMAD's docs leave unresolved.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
7. **File `docs/design/<module>-notes.md` per module** (full-stack-app
|
|
163
|
-
only), sourced from the UX spec.
|
|
229
|
+
6. **Run that core's Confirm & Lock** before writing anything.
|
|
230
|
+
7. **Write the intent records**: full-stack-app writes each intent via
|
|
231
|
+
`hedgehog intent add`, one call per PRD Feature, plus
|
|
232
|
+
`.hedgehog/addons.yaml`; landing-page writes `.hedgehog/chain/00-brief.md`
|
|
233
|
+
per its own Confirm & Lock, in the shape `hedgehog-landing-loop`'s
|
|
234
|
+
planning-intake section defines.
|
|
164
235
|
8. **Commit planning intake's output as one commit**,
|
|
165
|
-
`chore(planning): intake` —
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
236
|
+
`chore(planning): intake` — the committed `.hedgehog/hedgehog.db` (its
|
|
237
|
+
new intent rows on full-stack-app), `.hedgehog/addons.yaml`
|
|
238
|
+
(full-stack-app only), this core's own archival planning output
|
|
239
|
+
(`.hedgehog/BMAD/` or `.hedgehog/chain/`), the authored core's
|
|
240
|
+
`.hedgehog/core.yaml` and `.hedgehog/core-design.md` if step 4 ran, and
|
|
241
|
+
root `CLAUDE.md`'s filled placeholders. This is planning intake's own
|
|
242
|
+
unit of work, landed before `bootstrap` touches anything.
|
|
170
243
|
9. **On first run only, hand off to the `bootstrap` agent** once the
|
|
171
244
|
commit lands — it scaffolds the chosen core's workspace (and, for
|
|
172
245
|
full-stack-app, whichever add-ons are on) before any build step
|
|
173
246
|
starts. Skip this on a later run (new scope entering play,
|
|
174
247
|
full-stack-app only); the workspace already exists.
|
|
175
|
-
10. **Return a summary**: which core,
|
|
176
|
-
|
|
177
|
-
|
|
248
|
+
10. **Return a summary**: which core (naming it as authored, if it is),
|
|
249
|
+
the intents added (or subject statement, for landing-page), any open
|
|
250
|
+
questions.
|
|
178
251
|
|
|
179
252
|
## Constraints
|
|
180
253
|
|
|
181
254
|
- Never write or modify application code. Read-only against the
|
|
182
|
-
codebase; you may write
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
255
|
+
codebase; you may write `.hedgehog/addons.yaml` (full-stack-app only —
|
|
256
|
+
see "The Add-ons decision" below), `.hedgehog/core.yaml` and
|
|
257
|
+
`.hedgehog/core-design.md` (authored cores only, via
|
|
258
|
+
`hedgehog-core-design`), this core's own archival planning
|
|
259
|
+
output (`.hedgehog/BMAD/` or `.hedgehog/chain/` — write-once, never
|
|
260
|
+
edited after it's written), and — first run only — root `CLAUDE.md`'s
|
|
186
261
|
`{{PROJECT_NAME}}`/`{{PROJECT_SUMMARY}}` placeholders and its installer
|
|
187
|
-
comment block.
|
|
262
|
+
comment block. `hedgehog intent add` and `hedgehog plan` are how you
|
|
263
|
+
write the build graph itself — not a file you edit directly.
|
|
188
264
|
- Never touch root `CLAUDE.md` outside those placeholders. Every other
|
|
189
265
|
line is a Hedgehog constant for this project's core (stack, layout,
|
|
190
266
|
rules, agent/skill pointers) shared verbatim across every Hedgehog
|
|
191
267
|
project on that core — not project-specific content to edit, extend,
|
|
192
268
|
or "improve."
|
|
193
|
-
- `docs/design/<module>-notes.md` is not optional on full-stack-app —
|
|
194
|
-
every module in scope gets one, regardless of how much material the UX
|
|
195
|
-
spec produced.
|
|
196
269
|
- Archival planning output is write-once on both cores. Once a file is
|
|
197
270
|
written, it's historical record — don't edit it to reflect a later
|
|
198
271
|
decision. On full-stack-app a later run writes its own dated pass if
|
|
@@ -209,14 +282,20 @@ throughout.
|
|
|
209
282
|
the subject, audience, or job from BMAD's material where it's
|
|
210
283
|
genuinely silent — a gap-fill question, not a guess.
|
|
211
284
|
- Don't replan a step sequence within a core — fixed by that core's own
|
|
212
|
-
loop skill, not a per-project decision.
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
core
|
|
285
|
+
loop skill, not a per-project decision. On an authored core the
|
|
286
|
+
sequence is fixed at `hedgehog-core-design`'s Confirm & Lock and is
|
|
287
|
+
equally fixed after it: a later change to it is a Correction Protocol
|
|
288
|
+
entry, not a quiet edit to `.hedgehog/core.yaml`.
|
|
289
|
+
- Don't replan a shipped core's stack itself — fixed by that core's
|
|
290
|
+
bootstrap skill, not a per-project decision. Your scope decision is
|
|
291
|
+
which core applies (Phase 0) and, within full-stack-app, which add-ons
|
|
292
|
+
turn on — not whether a core applies at all once Phase 0 has picked
|
|
293
|
+
one. Designing a stack and layer sequence is in scope only on Phase 0's
|
|
294
|
+
third outcome, and only through `hedgehog-core-design`.
|
|
295
|
+
- Keep planning intake's written output thin. Intent records live in the
|
|
296
|
+
build graph, not a design doc — rationale lives in the commit log via
|
|
297
|
+
the Correction Protocol, and in this core's own archival planning
|
|
298
|
+
output for the planning material itself.
|
|
220
299
|
- Never route back into BMAD's own chain-forward suggestions or
|
|
221
300
|
`bmad-party-mode` — those are stripped from the vendored skills on
|
|
222
301
|
both cores. Control returns to you after each skill, not to BMAD's own
|
package/src/agents/reviewer.md
CHANGED
|
@@ -49,12 +49,12 @@ gate structurally cannot:
|
|
|
49
49
|
- **Phase leakage**: any hook or screen code, or frontend-shaped
|
|
50
50
|
reasoning, showing up before this module has a `feat(<module>): api`
|
|
51
51
|
commit?
|
|
52
|
-
- **Queue seam**: if the Queue add-on is on and
|
|
52
|
+
- **Queue seam**: if the Queue add-on is on and queue infra was added,
|
|
53
53
|
does the operation genuinely need async (long-running, retries,
|
|
54
54
|
fan-out) — or was the seam reached for out of habit? If the Queue
|
|
55
|
-
add-on is off (check
|
|
56
|
-
no `apps/worker` and no queue
|
|
57
|
-
|
|
55
|
+
add-on is off (check `.hedgehog/addons.yaml`'s `queue.on`), there should
|
|
56
|
+
be no `apps/worker` and no queue infra at all for this module — queue
|
|
57
|
+
infra appearing anyway is itself a finding, not something to review the
|
|
58
58
|
contents of.
|
|
59
59
|
- **Intra-step conventions**: does the module follow the conventions the
|
|
60
60
|
gate can't see — domain errors thrown (not `null` returned), repository
|