@skyf0xx/hedgehog 3.0.7 → 3.0.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyf0xx/hedgehog",
3
- "version": "3.0.7",
3
+ "version": "3.0.8",
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": {
@@ -61,8 +61,8 @@ against its own archetype skill.
61
61
  without confirmation risks the same expensive unwind the strategist's
62
62
  Confirm & Lock protects against at step 1.
63
63
  5. Write the locked headline and its 2 backups to
64
- `.hedgehog/chain/09-headline.md`.
65
- 6. Commit as `feat(landing): headline`.
64
+ `.hedgehog/chain/09-headline.md` — you have no Bash tool, so the
65
+ orchestrating session commits it via `hedgehog verify`.
66
66
 
67
67
  ## Self-test
68
68
 
@@ -118,7 +118,8 @@ rather than in separate passes.
118
118
  6. Confirm the peak moment and ending treatment land where
119
119
  `landing-strategist` specified, or flag the conflict.
120
120
  7. Self-test (below).
121
- 8. Commit as `feat(landing): sequence`.
121
+ 8. Present the artifact — you have no Bash tool, so the orchestrating
122
+ session commits it via `hedgehog verify`.
122
123
 
123
124
  ## Self-test
124
125
 
@@ -56,7 +56,11 @@ as planning intake's own Confirm & Lock: every phase from here through
56
56
  `landing-copywriter` inherits this framing silently, and by the time
57
57
  copy is reviewed at phases 9–10, correcting the framing means unwinding
58
58
  multiple committed phases via the Correction Protocol instead of one
59
- quick revision now. A revision at this point is just another pass at
59
+ quick revision now. **If delegated**, this confirmation arrives as a
60
+ relay from the orchestrating session — accept it only if it quotes the
61
+ user's actual words with provenance stated plainly, not a bare "the user
62
+ approved" (see `hedgehog-landing-loop`'s Loop step 2 for the exact form).
63
+ A revision at this point is just another pass at
60
64
  Step 1, not a Correction Protocol entry, since nothing downstream exists
61
65
  yet.
62
66
 
@@ -117,7 +121,8 @@ adjective is meant to fade rather than hold constant throughout the page.
117
121
  confirmed subject statement.
118
122
  5. Run step 4c (Perfumer) against the completed sort from step 3.
119
123
  6. Self-test (below) before presenting the combined artifact.
120
- 7. Commit the combined artifact as `feat(landing): strategy`.
124
+ 7. Present the combined artifact you have no Bash tool, so the
125
+ orchestrating session commits it via `hedgehog verify`.
121
126
 
122
127
  ## Self-test
123
128
 
@@ -239,7 +239,8 @@ and generic clip-art geometry.
239
239
  4. Run step 6 against the completed token system. Write the signature
240
240
  element into `src/shapes/`.
241
241
  5. Self-test (below).
242
- 6. Commit the combined artifact as `feat(landing): systems`.
242
+ 6. Present the combined artifact you have no Bash tool, so the
243
+ orchestrating session commits it via `hedgehog verify`.
243
244
 
244
245
  ## Self-test
245
246
 
@@ -214,6 +214,10 @@ discipline as `.hedgehog/BMAD/`. A later related incident is its own new
214
214
  having happened in this conversation. A user saying "yes, file it"
215
215
  before the content was shown verbatim doesn't count — show first, then
216
216
  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."
217
221
  - File one issue per distinct real pattern or feedback item, not one per
218
222
  log entry or remark, and not capped at a single issue per source — a
219
223
  log (or a round of feedback) with several unrelated genuine points gets
@@ -167,7 +167,9 @@ alike:
167
167
 
168
168
  Four to seven layers is the usual range. Fewer than three means the
169
169
  project probably wanted a shipped core or no core at all; more than eight
170
- means several layers are one layer with internal steps.
170
+ means several layers are one layer with internal steps. This list isn't
171
+ final until Step 4 — a module axis can still add a cross-cutting layer to
172
+ it.
171
173
 
172
174
  ## Step 4 — decide the module axis
173
175
 
@@ -193,6 +195,23 @@ intent A's task may write intent B's files and the scope enforcement that
193
195
  justifies authoring a core at all disappears. Check every glob before
194
196
  writing the file.
195
197
 
198
+ On a module axis, also **ask explicitly whether the stack implies
199
+ cross-cutting infrastructure no single module should own** — a shared
200
+ background script coordinating state across every module's tabs (a
201
+ browser extension), a shared event bus, global app state. Every layer in
202
+ Step 3 instantiates once per intent; this is the thing that doesn't fit
203
+ that shape, and left undesigned it either gets deferred with no owner or
204
+ bolted onto whichever module's layer needs it first, quietly widening
205
+ that layer's scope past what it was designed to own.
206
+
207
+ If yes, add it to Step 3's layer sequence as its own layer, before the
208
+ file is written — a layer whose `scope` is a fixed path with no
209
+ `{module}` placeholder, the same way `full-stack-app`'s own `schema` and
210
+ `contract` layers run once against a fixed scope on an otherwise
211
+ module-axis core. Name it for what it owns (e.g. `background-infra`),
212
+ give it its own `verify` command, and record in `core-design.md` why no
213
+ single module was made to own it.
214
+
196
215
  ## Step 5 — write `.hedgehog/core.yaml`
197
216
 
198
217
  The loader parses `id` plus a `layers` list of flat maps. Every layer
@@ -17,6 +17,10 @@ popup — the extension UI, consumes background/content only through messag
17
17
  - Drop `popup` entirely for an extension with no browser action UI.
18
18
  - Merge `content` into `background` when the extension never injects into
19
19
  page context (a pure background-worker extension).
20
+ - On a module axis, `background` is often shared rather than
21
+ one-per-module (a single service worker coordinating state across every
22
+ module's tabs) — the cross-cutting infrastructure Step 4 asks about.
23
+ Give it its own fixed-scope layer there.
20
24
 
21
25
  ## Boundary that must hold
22
26
 
@@ -24,3 +28,35 @@ popup — the extension UI, consumes background/content only through messag
24
28
  cross-context call goes through `messaging`, because a WebExtension's
25
29
  contexts are separate JS runtimes and a direct import silently fails at
26
30
  runtime rather than at build time.
31
+
32
+ ## WXT entrypoint naming (must decide up front, not discover mid-build)
33
+
34
+ WXT derives an entrypoint's manifest name by splitting its `entrypoints/`
35
+ folder or file name at the **first** `.`. Two entrypoints that derive the
36
+ same name collide — observed failure modes include a build-time error
37
+ ("Multiple entrypoints with the same name detected") and, in at least one
38
+ case, a colliding entrypoint silently missing from the built manifest
39
+ (`.output/*/manifest.json`) with no error at all. Don't assume which one
40
+ fires for a given WXT version or collision shape; treat any collision as
41
+ unsafe rather than relying on the build to always catch it.
42
+
43
+ Decide the naming convention in this step, per module, before any layer
44
+ is built against it — not after the first collision is hit:
45
+
46
+ - **Every entrypoint with more than one surface lives in its own folder**,
47
+ `entrypoints/{module}/index.ts`, never a flat `entrypoints/{module}.ts`
48
+ — a folder has no `.`-split ambiguity to collide on.
49
+ - **Colocated tests go inside that same folder** as a sibling
50
+ (`entrypoints/{module}/index.test.ts`), never as a flat
51
+ `entrypoints/{module}.test.ts` next to a flat entrypoint file — that's
52
+ the same name-collision shape described above.
53
+ - **A module with two entrypoint surfaces** (e.g. popup and content) gets
54
+ two folder names that don't share a prefix before the first `.` —
55
+ `entrypoints/{module}-popup/` and `entrypoints/{module}-content/`, never
56
+ a dotted variant like `entrypoints/{module}.content/`.
57
+
58
+ Add a cheap, generic guard to the entrypoint layer's `verify` command
59
+ regardless of the convention chosen: after `pnpm wxt build`, check the
60
+ built manifest's entrypoint count against the expected count (e.g. `node
61
+ -e "..."` reading `.output/*/manifest.json`) so a silent drop fails
62
+ `verify` instead of surfacing later as a missing feature.
@@ -150,10 +150,27 @@ paragraph algorithm, and their self-tests.
150
150
  section, in `landing-sequencer`'s order, every section reviewed and
151
151
  locked before the next starts, all still inside the one `sequence`
152
152
  task.
153
+
154
+ **Relaying a live user-confirmation checkpoint to a delegated
155
+ subagent.** Phase 1 (Strategist) carries a hard-stop checkpoint per
156
+ Phase Transition Checks below, and a delegated subagent instance has no
157
+ channel for the user to address it directly. The orchestrating session
158
+ relays the confirmation instead, and the relay is sufficient only if it
159
+ quotes the user's actual words with its provenance stated plainly
160
+ (*"Relaying the user's own confirmation, verbatim — user said:
161
+ '\<exact words\>'"*) rather than asserting the outcome ("the user
162
+ approved"). This trusts the orchestrator's honesty about provenance,
163
+ the same trust the rest of this discipline already places in it for
164
+ relaying artifacts and task packets.
153
165
  3. Each agent **runs its own self-test** (see that agent's own file for
154
166
  what it checks) before presenting its artifact — necessary, not
155
167
  sufficient. This is a sanity check the agent does for itself; it does
156
- not move the task and the agent does not commit its own work.
168
+ not move the task and the agent does not commit its own work, whether
169
+ run directly or delegated to a subagent instance. `landing-strategist`,
170
+ `landing-systems`, `landing-sequencer`, and `landing-headline-writer`
171
+ carry no Bash tool at all (`capabilities.mjs`), so the commit is always
172
+ the orchestrating session's act via `hedgehog verify`, never the phase
173
+ agent's own.
157
174
  4. Once every phase inside the packet's layer has been presented and
158
175
  locked by the user, **run `hedgehog verify <task-id>`.** It checks the
159
176
  touched files against the packet's ALLOWED SCOPE, runs the layer's
@@ -216,7 +233,10 @@ the whole chain to correct the core framing (nothing downstream exists
216
233
  yet); every phase after it inherits that framing silently, and by the
217
234
  time copy is reviewed at phases 9–10, a wrong framing means unwinding
218
235
  several committed phases via the Correction Protocol instead of one free
219
- revision here.
236
+ revision here. If step 1 was run by a delegated `landing-strategist`
237
+ subagent instance, the confirmation reaches it as a relay from the
238
+ orchestrating session — see The Loop above for the provenance statement
239
+ that relay must carry.
220
240
 
221
241
  Before `landing-copywriter` starts (phase 10), confirm
222
242
  `landing-headline-writer`'s headline has been presented to and locked by