@skyf0xx/hedgehog 3.0.2 → 3.0.3

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 CHANGED
@@ -117,11 +117,12 @@ npx @skyf0xx/hedgehog init
117
117
 
118
118
  Then open Claude Code and describe what you want to build.
119
119
 
120
- Plain `init` (no core flag) scaffolds a placeholder planning intake
121
- designs an opinionated build order and stack for what you actually
122
- describe, then bootstrap replaces the placeholder with the real
123
- workspace. Don't pick `--ts-full-stack-app` or `--landing-page` by
124
- elimination when neither actually fits.
120
+ Plain `init` (no core flag) installs the agents, skills, and build graph
121
+ only no workspace, no framework, nothing core-specific. Planning
122
+ intake designs an opinionated build order and stack for what you
123
+ actually describe, then bootstrap lands that workspace for the first
124
+ time. Don't pick `--ts-full-stack-app` or `--landing-page` by elimination
125
+ when neither actually fits.
125
126
 
126
127
  To update:
127
128
 
package/bin/cli.mjs CHANGED
@@ -3,8 +3,9 @@
3
3
  // into the current repo, so the discipline travels with the project.
4
4
  //
5
5
  // Usage:
6
- // npx @skyf0xx/hedgehog init scaffold, ts-full-stack-app core (default)
7
- // npx @skyf0xx/hedgehog init --landing-page scaffold the landing-page core instead
6
+ // npx @skyf0xx/hedgehog init no workspace yet — planner picks the core
7
+ // npx @skyf0xx/hedgehog init --ts-full-stack-app scaffold the full-stack-app core now
8
+ // npx @skyf0xx/hedgehog init --landing-page scaffold the landing-page core now
8
9
  // npx @skyf0xx/hedgehog init --force overwrite files that already exist
9
10
  // npx @skyf0xx/hedgehog update refresh .claude/agents + .claude/skills
10
11
  // npx @skyf0xx/hedgehog --help
@@ -74,8 +75,16 @@ async function availableCores() {
74
75
  // Agents and skills for every core install regardless of which one is
75
76
  // chosen — planner needs the full toolset to run core selection at all,
76
77
  // and a project can only switch cores before it's bootstrapped anyway.
78
+ //
79
+ // `core` is `null` on a deferred install (plain `init`, no explicit
80
+ // flag): which core applies hasn't been decided yet, so nothing
81
+ // core-specific — no golden-core workspace, no filled CLAUDE.md section —
82
+ // gets written speculatively. `bootstrap` lands the real workspace, for
83
+ // whichever core `planner` picks, the first time either way. An explicit
84
+ // flag (`--ts-full-stack-app`, `--landing-page`) is a confirmed choice,
85
+ // not a guess, so it scaffolds immediately as before.
77
86
  function plan(core) {
78
- return [
87
+ const base = [
79
88
  { type: 'dir', from: 'src/agents', to: '.claude/agents' },
80
89
  { type: 'dir', from: 'src/skills', to: '.claude/skills' },
81
90
  // The vendored BMAD-METHOD planning shelf that hedgehog-planning-intake
@@ -85,26 +94,26 @@ function plan(core) {
85
94
  // The vendored GSAP animation skill shelf that front-end-eng loads for
86
95
  // motion work — same repo-root-relative referencing as skills/BMAD.
87
96
  { type: 'dir', from: 'skills/GSAP', to: 'skills/GSAP' },
97
+ ];
98
+
99
+ if (core === null) {
100
+ return [
101
+ ...base,
102
+ // The shell with its {{CORE_SECTION}} placeholder left unfilled —
103
+ // whichever bootstrap-core skill runs first fills it in for the
104
+ // core planner actually picked.
105
+ { type: 'file', from: 'src/templates/CLAUDE.md', to: 'CLAUDE.md' },
106
+ ];
107
+ }
108
+
109
+ return [
110
+ ...base,
88
111
  {
89
112
  type: 'merge',
90
113
  shell: 'src/templates/CLAUDE.md',
91
114
  include: `src/templates/CLAUDE.core.${core}.md`,
92
115
  to: 'CLAUDE.md',
93
116
  },
94
- // The shell plus the authored-core section, landed unmerged so
95
- // `hedgehog-bootstrap-authored-core` can rebuild CLAUDE.md from them
96
- // when planning intake designs a core instead of taking a shipped
97
- // one. Removed by that same step once it has used them.
98
- {
99
- type: 'file',
100
- from: 'src/templates/CLAUDE.md',
101
- to: '.hedgehog/templates/CLAUDE.md',
102
- },
103
- {
104
- type: 'file',
105
- from: 'src/templates/CLAUDE.core.authored.md',
106
- to: '.hedgehog/templates/CLAUDE.core.authored.md',
107
- },
108
117
  // The pre-built, pre-verified workspace for the chosen core —
109
118
  // everything a fresh project of that shape needs at repo root
110
119
  // (lands the root package.json too, so there's no separate
@@ -182,9 +191,9 @@ CLAUDE.md template and an empty build graph (${bold('.hedgehog/hedgehog.db')})
182
191
  into the repo root, so the discipline is committed alongside your code.
183
192
 
184
193
  ${bold('Usage')}
185
- npx @skyf0xx/hedgehog init scaffold, ${DEFAULT_CORE} core (default)
186
- npx @skyf0xx/hedgehog init --ts-full-stack-app scaffold the full-stack-app core explicitly
187
- npx @skyf0xx/hedgehog init --landing-page scaffold the landing-page core instead
194
+ npx @skyf0xx/hedgehog init no workspace yet — planner picks the core
195
+ npx @skyf0xx/hedgehog init --ts-full-stack-app scaffold the full-stack-app core now
196
+ npx @skyf0xx/hedgehog init --landing-page scaffold the landing-page core now
188
197
  npx @skyf0xx/hedgehog init --force overwrite existing files
189
198
  npx @skyf0xx/hedgehog update refresh .claude/agents + .claude/skills
190
199
  npx @skyf0xx/hedgehog db init create .hedgehog/hedgehog.db if absent
@@ -208,10 +217,10 @@ off to bootstrap.
208
217
  Building something else (a CLI, library, browser extension, data
209
218
  pipeline, desktop app, etc.)? Run plain 'init' with no core flag rather
210
219
  than picking --ts-full-stack-app or --landing-page by elimination — it
211
- scaffolds ${DEFAULT_CORE}'s payload as a placeholder, but the planner
212
- agent designs and switches in an authored core at planning intake
213
- (hedgehog-core-design) before any workspace is generated for real.
214
- Describe the actual project and let Phase 0 route it.
220
+ installs the agents, skills, and build graph only, nothing core-specific.
221
+ The planner agent designs a core at planning intake (hedgehog-core-design)
222
+ and bootstrap generates that workspace once it's confirmed. Describe the
223
+ actual project and let Phase 0 route it.
215
224
 
216
225
  ${bold('update')} re-copies only .claude/agents and .claude/skills from the
217
226
  installed Hedgehog version, so an already-bootstrapped project can pick up
@@ -223,19 +232,22 @@ updated deliberately, not by this command.
223
232
  }
224
233
 
225
234
  async function init({ force, core, explicitCore }) {
226
- const cores = await availableCores();
227
- if (!cores.includes(core)) {
228
- console.error(
229
- `${red('Unknown core:')} ${core}\n\nAvailable cores: ${cores.join(', ')}\n`,
230
- );
231
- process.exitCode = 1;
232
- return;
235
+ if (explicitCore) {
236
+ const cores = await availableCores();
237
+ if (!cores.includes(core)) {
238
+ console.error(
239
+ `${red('Unknown core:')} ${core}\n\nAvailable cores: ${cores.join(', ')}\n`,
240
+ );
241
+ process.exitCode = 1;
242
+ return;
243
+ }
233
244
  }
234
245
 
235
246
  // Resolve the full list of writes up front so we can detect conflicts
236
- // before touching anything.
247
+ // before touching anything. A deferred install (no explicit core) plans
248
+ // against `null` — no golden-core workspace, nothing core-specific.
237
249
  const groups = [];
238
- for (const entry of plan(core)) {
250
+ for (const entry of plan(explicitCore ? core : null)) {
239
251
  const files = await plannedFiles(entry);
240
252
  groups.push({ entry, files });
241
253
  }
@@ -282,30 +294,40 @@ async function init({ force, core, explicitCore }) {
282
294
  )}\n`,
283
295
  );
284
296
  console.log('Next steps:');
285
- console.log(` 1. ${bold('git add -A && git commit -m "chore: install Hedgehog"')}`);
286
- console.log(` 2. ${bold('pnpm install')}`);
287
- console.log(` 3. Open Claude Code and describe what you want to build.`);
297
+ if (explicitCore) {
298
+ console.log(` 1. ${bold('git add -A && git commit -m "chore: install Hedgehog"')}`);
299
+ console.log(` 2. ${bold('pnpm install')}`);
300
+ console.log(` 3. Open Claude Code and describe what you want to build.`);
301
+ } else {
302
+ console.log(` 1. ${bold('git add -A && git commit -m "chore: install Hedgehog"')}`);
303
+ console.log(` 2. Open Claude Code and describe what you want to build.`);
304
+ }
288
305
  console.log(
289
306
  dim(
290
307
  ` The ${bold('planner')} agent runs planning intake, then hands off to bootstrap.`,
291
308
  ),
292
309
  );
293
310
  console.log();
294
- console.log(
295
- dim(
296
- explicitCore
297
- ? `Core: ${bold(core)}.`
298
- : `Core: ${bold(core)} (installer default — planner may design an authored core instead).`,
299
- ),
300
- );
301
- console.log(
302
- dim(
303
- core === DEFAULT_CORE
304
- ? '(Nx, packages/config, packages/db, apps/api, apps/web) — bootstrap\n' +
305
- 'runs whichever add-ons (Auth, Queue, Mobile) intake calls for.'
306
- : 'bootstrap runs whichever add-on steps this core defines, if any.',
307
- ),
308
- );
311
+ if (explicitCore) {
312
+ console.log(dim(`Core: ${bold(core)}.`));
313
+ console.log(
314
+ dim(
315
+ core === DEFAULT_CORE
316
+ ? '(Nx, packages/config, packages/db, apps/api, apps/web) — bootstrap\n' +
317
+ 'runs whichever add-ons (Auth, Queue, Mobile) intake calls for.'
318
+ : 'bootstrap runs whichever add-on steps this core defines, if any.',
319
+ ),
320
+ );
321
+ } else {
322
+ console.log(
323
+ dim(
324
+ 'Core: not chosen yet. Nothing core-specific landed — no workspace,\n' +
325
+ 'no framework, no lockfile. planner decides which core applies at\n' +
326
+ 'planning intake, then bootstrap lands that core\'s workspace for\n' +
327
+ 'the first time.',
328
+ ),
329
+ );
330
+ }
309
331
  }
310
332
 
311
333
  async function update() {
@@ -359,8 +381,10 @@ async function dbCommand(args) {
359
381
 
360
382
  // Resolves the project's core definition: an authored .hedgehog/core.yaml
361
383
  // takes precedence (spec: "Authored cores"); otherwise the shipped Golden
362
- // Core landed at repo root by `init` (its core.yaml copies there along
363
- // with the rest of src/golden-cores/<core>).
384
+ // Core landed at repo root by `bootstrap` (its core.yaml copies there
385
+ // along with the rest of src/golden-cores/<core>). Neither exists yet on
386
+ // a deferred install (plain `init`, no explicit core flag) until
387
+ // `bootstrap` runs — this returns null until then.
364
388
  async function resolveCorePath() {
365
389
  if (await exists(join(DEST_ROOT, AUTHORED_CORE_PATH))) {
366
390
  return join(DEST_ROOT, AUTHORED_CORE_PATH);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyf0xx/hedgehog",
3
- "version": "3.0.2",
3
+ "version": "3.0.3",
4
4
  "description": "Install the Hedgehog build discipline (agents + skills) into a repo.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: bootstrap
3
- description: Use once per invocation, at the start of a new Hedgehog project, to land the workspace for whichever core `planner` selected at Phase 0. On full-stack-app, that's core (via hedgehog-bootstrap-full-stack-app-core, one pass) then exactly ONE add-on step of the hedgehog-bootstrap skill (0-3 steps depending on planning intake scope), handing off to a fresh instance of itself for the next add-on step. On landing-page, that's a single pass of hedgehog-bootstrap-landing-page-core with no add-on steps — one invocation, done. On an authored core (`.hedgehog/core.yaml` present), that's a single pass of hedgehog-bootstrap-authored-core, which also removes whatever default golden-core scaffold `init` speculatively landed before generating the real workspace. Not for per-phase/per-module work — that's this core's own loop skill and its agents. Skip entirely if the core's workspace already exists (nx.json for full-stack-app, astro.config.mjs for landing-page, or the matching `feat(<id>): workspace` commit for an authored core).
3
+ description: Use once per invocation, at the start of a new Hedgehog project, to land the workspace for whichever core `planner` selected at Phase 0 — the first real workspace this project gets, since `init` with no explicit core flag lands only agents/skills/the build graph, nothing core-specific. On full-stack-app, that's core (via hedgehog-bootstrap-full-stack-app-core, one pass) then exactly ONE add-on step of the hedgehog-bootstrap skill (0-3 steps depending on planning intake scope), handing off to a fresh instance of itself for the next add-on step. On landing-page, that's a single pass of hedgehog-bootstrap-landing-page-core with no add-on steps — one invocation, done. On an authored core (`.hedgehog/core.yaml` present), that's a single pass of hedgehog-bootstrap-authored-core, generating the workspace live for the stack `hedgehog-core-design` chose. Not for per-phase/per-module work — that's this core's own loop skill and its agents. Skip entirely if the core's workspace already exists (nx.json for full-stack-app, astro.config.mjs for landing-page, or the matching `feat(<id>): workspace` commit for an authored core).
4
4
  model: sonnet
5
5
  color: green
6
6
  tools: Read, Glob, Grep, Edit, Write, Bash
@@ -27,10 +27,7 @@ What "bootstrap" means differs by core:
27
27
  there's no "next step" to hand off to.
28
28
  - **an authored core** (`.hedgehog/core.yaml` present, written by
29
29
  `hedgehog-core-design`) has one part, no add-on layer, like
30
- landing-page: `hedgehog-bootstrap-authored-core` first removes whatever
31
- default golden-core scaffold `init` speculatively landed (`init` always
32
- scaffolds `full-stack-app` by default, since the CLI has to copy
33
- something before `planner` ever runs Phase 0), then generates a fresh
30
+ landing-page: `hedgehog-bootstrap-authored-core` generates a fresh
34
31
  workspace live for the stack `hedgehog-core-design` chose — there's no
35
32
  pre-built template for an authored core's stack the way there is for
36
33
  the two shipped cores — verifies it, one commit. One invocation closes
@@ -145,10 +142,9 @@ Bootstrap is already closed and `hedgehog-authored-loop` owns everything
145
142
  from here (stop, say so).
146
143
 
147
144
  Open `hedgehog-bootstrap-authored-core` and follow it in full: confirm not
148
- already run, clear the default scaffold `init` landed (`nx.json` at repo
149
- root is the tell) and rebuild root `CLAUDE.md` from
150
- `.hedgehog/templates/`, read the stack choice from
151
- `.hedgehog/core-design.md` and `.hedgehog/core.yaml`, generate that
145
+ already run, fill root `CLAUDE.md`'s `{{CORE_SECTION}}` placeholder with
146
+ `CLAUDE.core.authored.md` if it's still unfilled, read the stack choice
147
+ from `.hedgehog/core-design.md` and `.hedgehog/core.yaml`, generate that
152
148
  stack's workspace via its own ecosystem's generator, install, run every
153
149
  layer's `verify` command clean, one commit (`feat(<id>): workspace`),
154
150
  check the Bootstrap box. That's the whole of Bootstrap on this core —
@@ -167,8 +163,8 @@ there's no next Bootstrap step.
167
163
  add-on-style steps for this core; it doesn't have any.
168
164
  - **authored core**: one pass, one commit, no hand-off, no add-on layer.
169
165
  This pass generates the workspace from the stack in
170
- `.hedgehog/core-design.md` and clears the default scaffold `init`
171
- landed; `hedgehog-bootstrap-authored-core` owns both.
166
+ `.hedgehog/core-design.md` and fills root `CLAUDE.md`'s core section;
167
+ `hedgehog-bootstrap-authored-core` owns both.
172
168
  - Never re-run a step whose commit already exists — see the per-core
173
169
  "which step is yours" sections above. A felt need to redo a landed
174
170
  step is a Correction Protocol case (patch it at its source, per that
@@ -1,25 +1,17 @@
1
1
  ---
2
2
  name: hedgehog-bootstrap-authored-core
3
- description: Use once, at the start of a new Hedgehog project on an authored core (`hedgehog-core-design` wrote `.hedgehog/core.yaml`), to clear the default scaffold `init` landed and generate a verified workspace for the stack `hedgehog-core-design` chose. Runs as the `bootstrap` agent's only move on this core, and closes Bootstrap.
3
+ description: Use once, at the start of a new Hedgehog project on an authored core (`hedgehog-core-design` wrote `.hedgehog/core.yaml`), to generate a verified workspace for the stack `hedgehog-core-design` chose. Runs as the `bootstrap` agent's only move on this core, and closes Bootstrap.
4
4
  ---
5
5
 
6
6
  # Hedgehog Bootstrap — authored core
7
7
 
8
8
  Lands the workspace for a project whose core `hedgehog-core-design`
9
- designed. The stack varies per project (that skill's Step 2 stack
10
- table), so this workspace is generated live from the ecosystem's own
11
- tooling and verified before it's committed.
12
-
13
- ## Why this exists
14
-
15
- `hedgehog init` scaffolds a default golden-core payload before `planner`
16
- runs Phase 0 — a CLI has to pick something to copy, and `full-stack-app`
17
- is that default (`bin/cli.mjs`'s `DEFAULT_CORE`). When Phase 0 designs a
18
- core instead, that scaffold (`nx.json`, `packages/`, `apps/api`,
19
- `apps/web`, the root `package.json`, full-stack-app's section of root
20
- `CLAUDE.md`) is speculative output this project never confirmed. Clearing
21
- it is this skill's first job: left in place, it collides with the
22
- generated workspace on `package.json`, lockfiles, and root config.
9
+ designed. `hedgehog init` never scaffolds anything core-specific until a
10
+ core is actually chosen, so nothing needs clearing here this skill is
11
+ the first thing that writes a workspace for this project. The stack
12
+ varies per project (`hedgehog-core-design`'s Step 2 stack table), so it's
13
+ generated live from the ecosystem's own tooling and verified before it's
14
+ committed.
23
15
 
24
16
  ## Steps
25
17
 
@@ -33,43 +25,19 @@ produce (e.g. `wxt.config.ts` for a WXT browser extension,
33
25
  there. A workspace that looks wrong is a Correction Protocol case against
34
26
  the specific file.
35
27
 
36
- ### 2. Remove the speculative default scaffold
37
-
38
- `init` lands `full-stack-app`'s golden-core payload by default, so
39
- `nx.json` at the repo root is the tell. Its presence means the scaffold
40
- is still in place; clear it before generating the real workspace:
41
-
42
- - Delete these root files: `nx.json`, `package.json`,
43
- `pnpm-workspace.yaml`, `pnpm-lock.yaml`, `docker-compose.yml`,
44
- `core.yaml` (full-stack-app's own core definition — the authored one
45
- lives at `.hedgehog/core.yaml`), `tsconfig.json`, `tsconfig.base.json`,
46
- `vitest.workspace.ts`, `eslint.config.mjs`, `commitlint.config.cjs`,
47
- `lefthook.yml`, `.env.example`, `.prettierrc`, `.prettierignore`,
48
- `.gitignore`.
49
- - Delete these root directories in full: `packages/` (`config`, `db`),
50
- `apps/` (`api`, `api-e2e`, `web`, `web-e2e`), `tools/`
51
- (`phase-gate.cjs`), `.github/` (`workflows/phase-gate.yml`),
52
- `.vscode/`. None of it was ever installed — `pnpm install` hasn't run
53
- on a fresh `init` — so this removes scaffolded source files, with no
54
- running infra and no data involved.
55
- - The generator in step 4 lands its own `.gitignore`; if it doesn't,
56
- write one for the chosen stack before committing.
57
- - Rebuild root `CLAUDE.md` from the templates `init` landed in
58
- `.hedgehog/templates/`: take `CLAUDE.md` (the shell) and replace its
59
- `{{CORE_SECTION}}` placeholder with the full contents of
60
- `CLAUDE.core.authored.md`. Carry over the `{{PROJECT_NAME}}` and
61
- `{{PROJECT_SUMMARY}}` values `planner` already filled into the current
62
- root `CLAUDE.md` — those are project content, written at planning
63
- intake, and the rebuild must not blank them. Delete
64
- `.hedgehog/templates/` once the rebuild lands; it exists for this one
65
- step.
66
- - Leave `.claude/agents/`, `.claude/skills/`, `skills/BMAD/`,
67
- `skills/GSAP/`, and the rest of `.hedgehog/` in place — the build
68
- graph, the planning archive, and the design files this step reads from
69
- install the same regardless of which core Phase 0 picks.
70
-
71
- `nx.json` absent means the scaffold was already cleared — skip straight
72
- to the `CLAUDE.md` rebuild, which still applies.
28
+ ### 2. Fill in `CLAUDE.md`'s core section
29
+
30
+ Root `CLAUDE.md` was landed by `init` as a shell with its
31
+ `{{CORE_SECTION}}` placeholder still unfilled (no core was known yet).
32
+ Read `src/templates/CLAUDE.core.authored.md` from the installed Hedgehog
33
+ package and write its contents in place of the placeholder — every other
34
+ line in root `CLAUDE.md`, including the `{{PROJECT_NAME}}`/
35
+ `{{PROJECT_SUMMARY}}` values `planner` already filled at planning intake,
36
+ stays untouched.
37
+
38
+ If the placeholder is already filled (a project that ran `init` with an
39
+ explicit core flag and only reached an authored core through a later
40
+ redesign), this step is a no-op — move on.
73
41
 
74
42
  ### 3. Read the stack choice
75
43
 
@@ -151,9 +119,6 @@ core's bootstrap, which closes Bootstrap. State plainly that
151
119
  - Write no domain content in the generated workspace — no business
152
120
  logic, no first layer's files. That's the first build task, started
153
121
  once this Bootstrap commit lands.
154
- - Step 2's deletions are safe by construction: `init`'s default scaffold
155
- has never been installed or run on a project that reaches this skill,
156
- since Phase 0 completes before any `pnpm install`. It's unused
157
- template output.
158
- - A repo with no default scaffold at all makes step 2 a no-op on the
159
- workspace files; the `CLAUDE.md` rebuild still runs.
122
+ - Never overwrite `{{PROJECT_NAME}}`/`{{PROJECT_SUMMARY}}` in root
123
+ `CLAUDE.md` while filling `{{CORE_SECTION}}` those are `planner`'s
124
+ content, not this skill's.
@@ -86,14 +86,18 @@ natively-installed Postgres. See **Local infra: Docker, always** below.
86
86
 
87
87
  ### 3. Land `src/golden-cores/full-stack-app/`
88
88
 
89
- In the common case this is already done — `hedgehog init`'s installer
90
- copies `src/golden-cores/full-stack-app/` to the repo root at install time, the same way
91
- it copies `src/agents` to `.claude/agents`. Check whether the core files
92
- are already present (same check as step 1). If they're missing
93
- `hedgehog init` ran against an older package version, or the files were
94
- deleted copy `src/golden-cores/full-stack-app/`'s contents to the repo root now as a
95
- fallback. Either way, by the end of this step every file listed in "What
96
- lands" above should be on disk.
89
+ `hedgehog init --ts-full-stack-app` copies `src/golden-cores/full-stack-app/`
90
+ to the repo root at install time, the same way it copies `src/agents` to
91
+ `.claude/agents` check whether the core files are already present
92
+ (same check as step 1) before copying again. On a project that ran
93
+ plain `init` (no core flag) and only reaches `full-stack-app` because
94
+ `planner` picked it at Phase 0, this hasn't happened yet: copy
95
+ `src/golden-cores/full-stack-app/`'s contents to the repo root now. Also
96
+ merge this core's `CLAUDE.md` section into root `CLAUDE.md`
97
+ (`src/templates/CLAUDE.core.full-stack-app.md` fills the shell's
98
+ `{{CORE_SECTION}}` placeholder left unfilled by a deferred install) —
99
+ skip this if the section is already filled. Either way, by the end of
100
+ this step every file listed in "What lands" above should be on disk.
97
101
 
98
102
  ### 4. Install and start local infra
99
103
 
@@ -59,15 +59,18 @@ re-copy: patch the specific file at its source.
59
59
 
60
60
  ### 2. Land `src/golden-cores/landing-page/`
61
61
 
62
- In the common case this is already done — `hedgehog init --landing-page`'s
63
- installer copies `src/golden-cores/landing-page/` to the repo root at
64
- install time, the same way it copies `src/agents` to `.claude/agents`.
65
- Check whether the core files are already present (same check as step 1).
66
- If they're missing `hedgehog init` ran against an older package
67
- version, or the files were deleted copy
68
- `src/golden-cores/landing-page/`'s contents to the repo root now as a
69
- fallback. Either way, by the end of this step every file listed in "What
70
- lands" above should be on disk.
62
+ `hedgehog init --landing-page` copies `src/golden-cores/landing-page/` to
63
+ the repo root at install time, the same way it copies `src/agents` to
64
+ `.claude/agents` check whether the core files are already present
65
+ (same check as step 1) before copying again. On a project that ran plain
66
+ `init` (no core flag) and only reaches `landing-page` because `planner`
67
+ picked it at Phase 0, this hasn't happened yet: copy
68
+ `src/golden-cores/landing-page/`'s contents to the repo root now. Also
69
+ merge this core's `CLAUDE.md` section into root `CLAUDE.md`
70
+ (`src/templates/CLAUDE.core.landing-page.md` fills the shell's
71
+ `{{CORE_SECTION}}` placeholder left unfilled by a deferred install) —
72
+ skip this if the section is already filled. Either way, by the end of
73
+ this step every file listed in "What lands" above should be on disk.
71
74
 
72
75
  ### 3. Install
73
76
 
@@ -239,10 +239,9 @@ runs `hedgehog-planning-intake`'s Phase 1 mining against this core the
239
239
  same way it would against a shipped one, then hands off to `bootstrap`.
240
240
 
241
241
  This skill never touches the workspace itself — no `pnpm init`, no
242
- generator, no install. `init` already scaffolded a default golden-core
243
- payload speculatively before Phase 0 ever ran (the CLI has to copy
244
- something; `full-stack-app` is that default), and this skill's job ends
245
- at the design artifacts. `bootstrap`'s `hedgehog-bootstrap-authored-core`
246
- is what later removes that speculative default and generates the real
242
+ generator, no install. `hedgehog init` lands nothing core-specific until
243
+ a core is chosen, so there's nothing on disk yet for this skill to
244
+ conflict with; its job ends at the design artifacts. `bootstrap`'s
245
+ `hedgehog-bootstrap-authored-core` is what later generates the real
247
246
  workspace for the stack chosen here — a separate step, run only once
248
247
  Phase 1 mining and Confirm & Lock have both landed.