@friedbotstudio/create-baseline 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +17 -7
  2. package/bin/cli.js +197 -119
  3. package/obj/template/.claude/commands/grant-push.md +19 -0
  4. package/obj/template/.claude/commands/init-project.md +26 -4
  5. package/obj/template/.claude/hooks/consent_gate_grant.mjs +107 -0
  6. package/obj/template/.claude/hooks/git_commit_guard.mjs +224 -0
  7. package/obj/template/.claude/hooks/harness_continuation.sh +101 -34
  8. package/obj/template/.claude/hooks/lib/common.mjs +283 -0
  9. package/obj/template/.claude/hooks/lib/common.sh +1 -1
  10. package/obj/template/.claude/hooks/memory_session_start.sh +20 -6
  11. package/obj/template/.claude/hooks/memory_stop.sh +161 -2
  12. package/obj/template/.claude/hooks/spec_approval_guard.sh +1 -1
  13. package/obj/template/.claude/hooks/swarm_approval_guard.sh +1 -1
  14. package/obj/template/.claude/hooks/tests/fixtures/ac008_byte_equal_reference.txt +7 -7
  15. package/obj/template/.claude/hooks/tests/fixtures/memory_stop_landmark_baseline.txt +21 -0
  16. package/obj/template/.claude/hooks/tests/fixtures/regenerate-ac008.sh +47 -0
  17. package/obj/template/.claude/hooks/tests/memory_session_start_test.sh +7 -3
  18. package/obj/template/.claude/hooks/tests/memory_stop_intent_test.sh +329 -0
  19. package/obj/template/.claude/hooks/tests/regenerate_ac008_test.sh +99 -0
  20. package/obj/template/.claude/memory/README.md +8 -3
  21. package/obj/template/.claude/memory/backlog.md +12 -0
  22. package/obj/template/.claude/project.json +6 -1
  23. package/obj/template/.claude/settings.json +3 -4
  24. package/obj/template/.claude/skills/audit-baseline/audit.sh +28 -16
  25. package/obj/template/.claude/skills/audit-baseline/tests/fixtures/_pending_opener_only.md +3 -0
  26. package/obj/template/.claude/skills/audit-baseline/tests/fixtures/preamble_full_empty_body.md +4 -0
  27. package/obj/template/.claude/skills/audit-baseline/tests/fixtures/preamble_full_with_entries.md +9 -0
  28. package/obj/template/.claude/skills/audit-baseline/tests/fixtures/preamble_no_opener.md +3 -0
  29. package/obj/template/.claude/skills/audit-baseline/tests/fixtures/preamble_opener_only.md +3 -0
  30. package/obj/template/.claude/skills/audit-baseline/tests/preamble_check_test.sh +147 -0
  31. package/obj/template/.claude/skills/changelog/SKILL.md +69 -0
  32. package/obj/template/.claude/skills/changelog/changelog.mjs +163 -0
  33. package/obj/template/.claude/skills/changelog/classifier.mjs +49 -0
  34. package/obj/template/.claude/skills/changelog/state-writer.mjs +19 -0
  35. package/obj/template/.claude/skills/changelog/tests/consent-expired_test.sh +126 -0
  36. package/obj/template/.claude/skills/changelog/tests/golden-path_test.sh +191 -0
  37. package/obj/template/.claude/skills/changelog/tests/idempotent-reentry_test.sh +121 -0
  38. package/obj/template/.claude/skills/changelog/tests/keepachangelog-unreleased-preserved_test.mjs +149 -0
  39. package/obj/template/.claude/skills/changelog/tests/non-git-shortcircuit_test.sh +98 -0
  40. package/obj/template/.claude/skills/changelog/tests/preview-only_test.sh +96 -0
  41. package/obj/template/.claude/skills/changelog/tests/run.sh +28 -0
  42. package/obj/template/.claude/skills/changelog/unreleased-writer.mjs +155 -0
  43. package/obj/template/.claude/skills/changelog/version-preview.mjs +124 -0
  44. package/obj/template/.claude/skills/chore/SKILL.md +5 -3
  45. package/obj/template/.claude/skills/commit/SKILL.md +5 -4
  46. package/obj/template/.claude/skills/copywriting/LICENSE +21 -0
  47. package/obj/template/.claude/skills/copywriting/NOTICE +23 -0
  48. package/obj/template/.claude/skills/copywriting/SKILL.md +1 -1
  49. package/obj/template/.claude/skills/design-ui/SKILL.md +23 -5
  50. package/obj/template/.claude/skills/design-ui/references/design-vs-development.md +26 -5
  51. package/obj/template/.claude/skills/design-ui/references/orchestration.md +1 -0
  52. package/obj/template/.claude/skills/design-ui/references/state-machine.md +5 -3
  53. package/obj/template/.claude/skills/documentation/LICENSE +202 -0
  54. package/obj/template/.claude/skills/documentation/NOTICE +22 -0
  55. package/obj/template/.claude/skills/harness/SKILL.md +5 -1
  56. package/obj/template/.claude/skills/humanizer/LICENSE +21 -0
  57. package/obj/template/.claude/skills/humanizer/NOTICE +21 -0
  58. package/obj/template/.claude/skills/impeccable/LICENSE +202 -0
  59. package/obj/template/.claude/skills/impeccable/NOTICE +24 -0
  60. package/obj/template/.claude/skills/memory-flush/SKILL.md +20 -4
  61. package/obj/template/.claude/skills/memory-flush/sweep.py +74 -6
  62. package/obj/template/.claude/skills/memory-flush/tests/run.sh +300 -1
  63. package/obj/template/.claude/skills/tdd/SKILL.md +2 -1
  64. package/obj/template/.claude/skills/tdd/drift_check.py +180 -0
  65. package/obj/template/.claude/skills/tdd/tests/drift_check_test.sh +190 -0
  66. package/obj/template/.claude/skills/tdd/tests/run.sh +21 -0
  67. package/obj/template/.claude/skills/technical-tutorials/LICENSE +21 -0
  68. package/obj/template/.claude/skills/technical-tutorials/NOTICE +23 -0
  69. package/obj/template/.claude/skills/technical-tutorials/SKILL.md +1 -1
  70. package/obj/template/.claude/skills/triage/SKILL.md +11 -5
  71. package/obj/template/CLAUDE.md +36 -25
  72. package/obj/template/docs/init/seed.md +39 -24
  73. package/obj/template/manifest.json +73 -33
  74. package/package.json +5 -2
  75. package/src/CLAUDE.template.md +36 -25
  76. package/src/cli/merge.js +15 -10
  77. package/src/cli/tui/doctor.js +56 -0
  78. package/src/cli/tui/install.js +79 -0
  79. package/src/cli/tui/meta.js +30 -0
  80. package/src/cli/tui/tokens.js +38 -0
  81. package/src/cli/tui/upgrade.js +100 -0
  82. package/src/memory/backlog.template.md +12 -0
  83. package/src/project.template.json +6 -1
  84. package/src/seed.template.md +39 -24
  85. package/src/settings.template.json +3 -4
  86. package/obj/template/.claude/hooks/consent_gate_grant.sh +0 -89
  87. package/obj/template/.claude/hooks/git_commit_guard.sh +0 -93
@@ -11,7 +11,7 @@
11
11
 
12
12
  **Mandatory binding language.** Each numbered section (§) below specifies a binding requirement for the baseline. Implementations SHALL conform; `CLAUDE.md` Articles SHALL reference the corresponding §; project amendments (per `CLAUDE.md` Art. X) SHALL NOT contradict any § here.
13
13
 
14
- The baseline turns soft engineering rules (no unauthorized commits, no stubs, no mocks of internal code, no self-approved specs) into structural guarantees enforced by write-boundary hooks. Eleven workflow phases plus one stripped-down chore track (skips TDD; runs verify + archive mandatorily, simplify/integrate/document conditionally), seventeen write/run-boundary guards plus four lifecycle hooks plus one input-boundary hook (twenty-two `.sh` scripts total), thirty-six skills, one subagent, and three consent gates. Decisions live in main context; the lone subagent (`swarm-worker`) executes pre-decided recipes in parallel worktrees during `/swarm-dispatch`. Every artifact is archived; every third-party API is looked up against live docs. Project memory accumulates across sessions in `.claude/memory/` — auto-extracted by a Stop hook, curated in main context via `/memory-flush`, self-healing via re-verification.
14
+ The baseline turns soft engineering rules (no unauthorized commits, no stubs, no mocks of internal code, no self-approved specs) into structural guarantees enforced by write-boundary hooks. Eleven workflow phases plus one stripped-down chore track (skips TDD; runs verify + archive mandatorily, simplify/integrate/document conditionally), seventeen write/run-boundary guards plus four lifecycle hooks plus one input-boundary hook (twenty-two hook scripts total — twenty `.sh` + two `.mjs` after the JS-port pilot), thirty-seven skills, one subagent, and four consent gates. Decisions live in main context; the lone subagent (`swarm-worker`) executes pre-decided recipes in parallel worktrees during `/swarm-dispatch`. Every artifact is archived; every third-party API is looked up against live docs. Project memory accumulates across sessions in `.claude/memory/` — auto-extracted by a Stop hook, curated in main context via `/memory-flush`, self-healing via re-verification.
15
15
 
16
16
  ---
17
17
 
@@ -109,9 +109,9 @@ Applies to every language. Mappings for TSX, Node, Python, Go, Rust ship inside
109
109
  │ ├── hooks/ # 22 hook scripts: 17 write/run-boundary guards + 4 lifecycle hooks + 1 input-boundary hook (bash + python3, no jq)
110
110
  │ │ └── lib/common.sh # shared helpers
111
111
  │ ├── agents/ # 1 subagent: swarm-worker (rendered from src/agents/swarm-worker.template.md)
112
- │ ├── commands/ # 4 consent/bootstrap gates (user-only — structurally)
113
- │ ├── skills/ # 36 skills: artifact (4) + phases (10) + workers (5) + spec helpers (4) + orchestration (3) + memory (1) + shared globals (7) + audit (1) + alt tracks (1)
114
- │ ├── memory/ # project memory: 6 canonical files + _pending.md (gitignored body) + README.md
112
+ │ ├── commands/ # 5 consent/bootstrap gates (user-only — structurally)
113
+ │ ├── skills/ # 37 skills: artifact (4) + phases (11) + workers (5) + spec helpers (4) + orchestration (3) + memory (1) + shared globals (7) + audit (1) + alt tracks (1)
114
+ │ ├── memory/ # project memory: 7 canonical files + _pending.md (gitignored body) + README.md
115
115
  │ └── state/ # runtime: workflow.json, approvals, swarm plans, verdicts, logs
116
116
  ├── src/ # pristine ship-time templates (overlay source for `npx @friedbotstudio/create-baseline`)
117
117
  │ ├── CLAUDE.template.md
@@ -120,7 +120,7 @@ Applies to every language. Mappings for TSX, Node, Python, Go, Rust ship inside
120
120
  │ ├── .mcp.template.json
121
121
  │ ├── settings.template.json
122
122
  │ ├── agents/swarm-worker.template.md
123
- │ └── memory/<6 canonical>.template.md
123
+ │ └── memory/<7 canonical>.template.md
124
124
  └── docs/
125
125
  ├── init/seed.md # this file
126
126
  ├── intake/ brd/ scout/ research/ specs/ rca/ security/ site/
@@ -140,13 +140,13 @@ Applies to every language. Mappings for TSX, Node, Python, Go, Rust ship inside
140
140
 
141
141
  Each is an independent bash script that reads a JSON payload on stdin and emits a structured decision. Ordering within a `matcher` block matters only when one hook's decision should take precedence. The four lifecycle hooks (`memory_session_start`, `memory_stop`, `memory_pre_compact`, `harness_continuation`) are best-effort and never block; they maintain project memory, the cross-session resume snapshot, and the harness auto-continuation signal (`harness_continuation` reads `.claude/state/harness_state` on every Stop event and emits a `decision:block` directive when the harness has left `state: "continue"` AND the session-scoped marker `.claude/state/.harness_active` exists, so the next phase fires on the same turn; `memory_session_start` deletes that marker at every session boundary so yesterday's `continue` never ghost-resumes today).
142
142
 
143
- The single input-boundary hook (`consent_gate_grant`, on `UserPromptSubmit`) runs **before** Claude is invoked on every user turn. When the user types one of the three consent-gate slash commands (`/approve-spec <slug|path>`, `/approve-swarm <slug>`, `/grant-commit [note]`), this hook parses the prompt and writes a short-lived consent marker to `.claude/state/.<gate>_grant`. The PreToolUse approval guards (`spec_approval_guard`, `swarm_approval_guard`, `git_commit_guard`) read these markers as the structural source of consent: a Claude write to an approval token is allowed only when a fresh, slug-matched marker is on disk; the marker is single-use (deleted on the allowed write) and expires after `consent.gate_marker_ttl_seconds` (default 120). Slug derivation is centralized in `lib/common.sh → canonical_slug` (strip directory prefix + trailing `.md`) so the marker and the expected slug always agree — `docs/specs/foo.md`, `foo.md`, and `foo` all reduce to the bare slug `foo`. This is what makes Article IV's gates structurally un-invokable by Claude — Claude cannot reach the UserPromptSubmit code path, and the PreToolUse guards block Claude from writing the markers themselves.
143
+ The single input-boundary hook (`consent_gate_grant`, on `UserPromptSubmit`) runs **before** Claude is invoked on every user turn. When the user types one of the four consent-gate slash commands (`/approve-spec <slug|path>`, `/approve-swarm <slug>`, `/grant-commit [note]`, `/grant-push [note]`), this hook parses the prompt and writes a short-lived consent marker to `.claude/state/.<gate>_grant`. The PreToolUse approval guards (`spec_approval_guard`, `swarm_approval_guard`, `git_commit_guard`) read these markers as the structural source of consent: a Claude write to an approval token is allowed only when a fresh, slug-matched marker is on disk; the marker is single-use (deleted on the allowed write) and expires after `consent.gate_marker_ttl_seconds` (default 120). Slug derivation is centralized in `lib/common.sh → canonical_slug` (strip directory prefix + trailing `.md`) so the marker and the expected slug always agree — `docs/specs/foo.md`, `foo.md`, and `foo` all reduce to the bare slug `foo`. This is what makes Article IV's gates structurally un-invokable by Claude — Claude cannot reach the UserPromptSubmit code path, and the PreToolUse guards block Claude from writing the markers themselves.
144
144
 
145
145
  | Hook | Event / matcher | Enforces |
146
146
  |---|---|---|
147
147
  | `setup_guard` | PreToolUse / Write\|Edit\|MultiEdit\|NotebookEdit | Advisory. When `configured: false`, emits a one-shot reminder (rate-limited to 10 minutes) that the baseline is in project-agnostic mode and `/init-project` hasn't run. Does not block writes — bypass is intentional. The user gets baseline-only behaviour (test/lint runners in guide mode, no stack-specific tailoring) until `/init-project` runs. |
148
148
  | `destructive_cmd_guard` | PreToolUse / Bash | Hard-blocks catastrophic commands (`rm -rf /`, fork bombs, `dd of=/dev/sd*`, `mkfs`, `shutdown`). Asks on risky ones (`rm -rf <path>`, `git reset --hard`, `drop table`). Patterns sourced from `project.json → destructive`. |
149
- | `git_commit_guard` | PreToolUse / Bash + Write\|Edit\|MultiEdit | Bash matcher: requires fresh consent (`/grant-commit`, 5-minute TTL) for `git commit`. Hard-blocks `git push`, `git commit --amend`, `--no-verify`, `--no-gpg-sign`, `git reset --hard`, `git clean -f`, `git checkout --`, `git branch -D`, `git config`, `git rebase -i`, `git add -A`, `git add .`. Write matcher: blocks Claude from writing `.claude/state/.commit_consent_grant` (the marker — only `consent_gate_grant` may write it) and gates writes to `.claude/state/commit_consent` on a fresh marker. |
149
+ | `git_commit_guard` | PreToolUse / Bash + Write\|Edit\|MultiEdit | Bash matcher: enforces branch-aware policy. `git commit` on a protected branch (per `project.json → git.protected_branches` glob list; `null` = all branches protected) requires fresh `commit_consent` (`/grant-commit`, 5-min TTL); `git push` on a protected branch requires fresh `push_consent` (`/grant-push`, 5-min TTL); both proceed without consent on non-protected branches. `git.branch_pattern` regex (optional) gates commits on naming. Detached HEAD denies both. Hard-blocks remaining forbidden flags: `git commit --amend`, `--no-verify`, `--no-gpg-sign`, `git reset --hard`, `git clean -f`, `git checkout --`, `git branch -D`, `git config`, `git rebase -i`, `git add -A`, `git add .`. Write matcher: blocks Claude from writing `.claude/state/.commit_consent_grant` / `.push_consent_grant` (markers — only `consent_gate_grant` writes those) and gates writes to `.claude/state/commit_consent` / `push_consent` on a fresh marker. Implemented in `.claude/hooks/git_commit_guard.mjs` (Node ESM; JS-port pilot). |
150
150
  | `env_guard` | PreToolUse / Write\|Edit\|MultiEdit\|NotebookEdit | Blocks writes to `.env*`. Allows obvious templates (`.env.example`, `.env.sample`). |
151
151
  | `spec_approval_guard` | PreToolUse / Write\|Edit\|MultiEdit | Validates a fresh `.claude/state/.spec_approval_grant` marker (slug-matched, ≤ `consent.gate_marker_ttl_seconds`) before allowing Claude to write under `.claude/state/spec_approvals/`. Blocks Claude from writing the marker file itself. Blocks `Status: Approved` / `Approved: true` lines in spec markdown. |
152
152
  | `swarm_approval_guard` | PreToolUse / Write\|Edit\|MultiEdit | Symmetric to `spec_approval_guard` for gate B: validates `.claude/state/.swarm_approval_grant` before allowing writes under `.claude/state/swarm_approvals/`. Blocks Claude from writing the marker. |
@@ -165,7 +165,7 @@ The single input-boundary hook (`consent_gate_grant`, on `UserPromptSubmit`) run
165
165
  | `memory_stop` | Stop | At end of every assistant turn, reads the transcript, extracts memory candidates (touched source paths → landmarks; context7 queries → libraries), appends to `.claude/memory/_pending.md`, and refreshes `.claude/memory/_resume.md` for next session. Passive collector — never writes to canonical memory files. |
166
166
  | `memory_pre_compact` | PreCompact (manual\|auto) | Fires before context compaction. Walks the still-intact transcript and writes `.claude/memory/_resume.md` so the next `SessionStart` (source: `compact`) can re-inject the snapshot. Best-effort; never blocks compaction. |
167
167
  | `harness_continuation` | Stop | Auto-continues multi-phase workflows across non-gated boundaries. Reads `.claude/state/harness_state` (written by the harness skill on every tick) and `.claude/state/.harness_active` (session-scoped marker; created by the harness skill on `state: "continue"`, deleted on `yielded`/`done`, cleaned unconditionally by `memory_session_start.sh` on session boundary). Three-rung gate — all must pass to emit a decision: (1) `stop_hook_active` flag absent on payload; (2) `.harness_active` marker exists; (3) `harness_state.state` equals `"continue"`. When all pass, emits `{"decision":"block","reason":"…invoke Skill(harness)…"}` so the model resumes the harness on the same turn. Sanity rail: if the marker's slug content disagrees with `workflow.json → slug`, log one `WARN` line to `harness_continuation.log`; mismatch does not change the decision. Silent on any rung fail (`yielded`/`done`/missing marker/missing state/malformed). Treats every internal error as silence. Never writes consent markers; never bypasses Article IV gates. |
168
- | `consent_gate_grant` | UserPromptSubmit | Runs **before** Claude is invoked on every user turn. Detects the three consent-gate slash commands (`/approve-spec <slug\|path>`, `/approve-swarm <slug>`, `/grant-commit [note]`) at the start of the user's prompt and writes a short-lived consent marker (`.claude/state/.spec_approval_grant`, `.swarm_approval_grant`, or `.commit_consent_grant`). Slugs are canonicalized through `canonical_slug` (strip directory + trailing `.md`) so the marker matches whatever shape the approval guards derive from the approval filename. The marker is single-use and expires after `consent.gate_marker_ttl_seconds` (default 120). Because this hook fires outside Claude's tool boundary, Claude cannot reach this code path — the marker is structurally unforgeable by the model. |
168
+ | `consent_gate_grant` | UserPromptSubmit | Runs **before** Claude is invoked on every user turn. Detects the four consent-gate slash commands (`/approve-spec <slug\|path>`, `/approve-swarm <slug>`, `/grant-commit [note]`, `/grant-push [note]`) at the start of the user's prompt and writes a short-lived consent marker (`.claude/state/.spec_approval_grant`, `.swarm_approval_grant`, `.commit_consent_grant`, or `.push_consent_grant`). Slugs are canonicalized through `canonicalSlug` (strip directory + trailing `.md`) so the marker matches whatever shape the approval guards derive from the approval filename. The marker is single-use and expires after `consent.gate_marker_ttl_seconds` (default 120). Because this hook fires outside Claude's tool boundary, Claude cannot reach this code path — the marker is structurally unforgeable by the model. Implemented in `.claude/hooks/consent_gate_grant.mjs` (Node ESM; JS-port pilot). |
169
169
 
170
170
  All hooks source `.claude/hooks/lib/common.sh` for payload parsing, project-config reads, and decision emitters (`emit_allow`, `emit_block`, `emit_ask`, `emit_info`).
171
171
 
@@ -181,7 +181,7 @@ The baseline ships exactly one subagent. The architectural reason: subagents los
181
181
 
182
182
  **Automated re-rendering by `/init-project`.** Step 6.4 re-renders `swarm-worker.md` from the template, driven by the recommender's `additions.swarm_worker_skills`. The recommender does **not** propose new subagent types — only stack-skill additions for the existing worker. Specialization happens via skills loaded into the worker's context, not via parallel agent personas; new decision-making roles belong in skills, which run in main context.
183
183
 
184
- ### §4.3 Skills (36)
184
+ ### §4.3 Skills (37)
185
185
 
186
186
  Each at `.claude/skills/<name>/SKILL.md`, frontmatter `name` + `description`, plus optional `template.md` (artifact skills) or helper scripts.
187
187
 
@@ -203,6 +203,7 @@ Each at `.claude/skills/<name>/SKILL.md`, frontmatter `name` + `description`, pl
203
203
  - `integrate` — Phase 9. Full suite + `verify` re-adjudication.
204
204
  - `document` — Phase 10. Orchestrator. Delegates technical reference to `documentation`, tutorials to `technical-tutorials`, and **all prose** to the `prose` skill (which applies `humanizer` mandatorily).
205
205
  - `archive` — Phase 10.5. Moves `<slug>`-matched artifacts to `docs/archive/<YYYY-MM-DD>/<slug>/`. `workflow.json` is held back and archived by `/commit`.
206
+ - `memory-flush` — Phase 10.6. Curates `_pending.md` candidates with full workflow context (or fast-paths on empty pending while still running canonical Step 0 sweeps). Canonical memory writes ship in the same commit as the work that motivated them.
206
207
  - `commit` — Phase 11. First step archives `workflow.json`; then stages named paths and commits.
207
208
 
208
209
  **Phase workers (5)** — execute pre-decided recipes; each mandatorily invokes a sub-skill. Caller (a phase skill) provides explicit inputs; the worker executes without picking architecture, register, or scope:
@@ -228,13 +229,15 @@ Each at `.claude/skills/<name>/SKILL.md`, frontmatter `name` + `description`, pl
228
229
 
229
230
  **Shared globals (7)** — skills the baseline *uses* heavily; vendored into `.claude/skills/` so they travel with the repo and have no external runtime dependency:
230
231
 
231
- - `claude-automation-recommender` Apache-2.0 vendored from upstream `claude-code-setup` plugin (Anthropic). Mandatory first step (§0); analyzes a target project and surfaces stack-specific tweaks for `/init-project`. License + attribution: `.claude/skills/claude-automation-recommender/{LICENSE,NOTICE}`.
232
- - `code-structure` — MANDATORY on every code-generation step. Language-agnostic three-layer model (Orchestration / Domain / Foundation). See §2.6.
233
- - `humanizer` — strips AI-writing tells (em-dash overuse, rule of three, inflated symbolism, AI vocabulary, superficial -ing, filler, hedging). Invoked by `prose` on every draft.
234
- - `documentation` — technical reference writing (API docs, architecture, runbooks). Delegate target from `/document`.
235
- - `technical-tutorials` — step-by-step / quickstart / walkthrough. Delegate target from `/document`. Audience-context shape lives in this skill's `references/audience-context.md` (consolidated from the upstream `developer-audience-context` skill on 2026-04-28).
236
- - `copywriting` — persuasive user-facing copy (landing, pricing, feature, hero, CTA). Invoked by `prose` when register is persuasive.
237
- - `impeccable` — production-grade frontend interface design. Loads `PRODUCT.md` / `DESIGN.md`, picks register (brand vs. product), applies shared design laws (OKLCH color, typography rhythm, layout cadence, motion tied to physics, copy with specificity). Vendored (Apache 2.0); stays untouched per Article IX. Inside workflow phases, `design-ui` orchestrates `impeccable` (per Article X.2) every UI design move is an `impeccable` subcommand invocation chosen and run from main context.
232
+ Each vendored shared global ships with its own `LICENSE` + `NOTICE` alongside the skill, recording the upstream URL and any local changes:
233
+
234
+ - `claude-automation-recommender` — Apache 2.0, vendored from Anthropic's `claude-code-setup` plugin. Mandatory first step (§0); analyzes a target project and surfaces stack-specific tweaks for `/init-project`.
235
+ - `code-structure` — MANDATORY on every code-generation step. Written for this baseline (Friedbot Studio); the repo license applies. Language-agnostic three-layer model (Orchestration / Domain / Foundation). See §2.6.
236
+ - `humanizer` — MIT, vendored from [`blader/humanizer`](https://github.com/blader/humanizer). Strips AI-writing tells (em-dash overuse, rule of three, inflated symbolism, AI vocabulary, superficial -ing, filler, hedging). Invoked by `prose` on every draft.
237
+ - `documentation` — Apache 2.0, vendored from Anthropic's `claude-code-setup` plugin. Technical reference writing (API docs, architecture, runbooks). Delegate target from `/document`.
238
+ - `technical-tutorials` — MIT, vendored from [`jonathimer/devmarketing-skills`](https://github.com/jonathimer/devmarketing-skills). Step-by-step / quickstart / walkthrough. Delegate target from `/document`. Audience-context shape lives in this skill's `references/audience-context.md` (consolidated from the upstream `developer-audience-context` skill on 2026-04-28).
239
+ - `copywriting` — MIT, vendored from [`coreyhaines31/marketingskills`](https://github.com/coreyhaines31/marketingskills). Persuasive user-facing copy (landing, pricing, feature, hero, CTA). Invoked by `prose` when register is persuasive.
240
+ - `impeccable` — Apache 2.0, vendored from [`pbakaus/impeccable`](https://github.com/pbakaus/impeccable). Production-grade frontend interface design. Loads `PRODUCT.md` / `DESIGN.md`, picks register (brand vs. product), applies shared design laws (OKLCH color, typography rhythm, layout cadence, motion tied to physics, copy with specificity). Stays untouched per Article IX. Inside workflow phases, `design-ui` orchestrates `impeccable` (per Article X.2) — every UI design move is an `impeccable` subcommand invocation chosen and run from main context.
238
241
 
239
242
  **Drift defender (1)**:
240
243
 
@@ -252,10 +255,11 @@ Files at `.claude/commands/<name>.md`. Commands differ from skills in exactly on
252
255
  |---|---|
253
256
  | `approve-spec` | Human approval of a spec draft. Accepts a bare slug, a filename, or a full path; canonicalizes via `lib/common.sh → canonical_slug` and writes `.claude/state/spec_approvals/<slug>.approval`. Only sanctioned path — `spec_approval_guard` blocks all other routes. |
254
257
  | `approve-swarm` | Human approval of a swarm plan. Writes `.claude/state/swarm_approvals/<slug>.approval`. Required before `swarm-dispatch` runs. |
255
- | `grant-commit` | Opens a 5-minute consent window for `git commit`. Writes `.claude/state/commit_consent`. Enforced by `git_commit_guard`. |
258
+ | `grant-commit` | Opens a 5-minute consent window for `git commit` on a protected branch. Writes `.claude/state/commit_consent`. Enforced by `git_commit_guard`. |
259
+ | `grant-push` | Opens a 5-minute consent window for `git push` on a protected branch. Writes `.claude/state/push_consent`. Enforced by `git_commit_guard`. Not a workflow-phase gate — a runtime consent for the branch-aware policy (§11). |
256
260
  | `init-project` | One-time bootstrap. Detects stack, proposes `.claude/project.json` (test cmd, lint cmd, TDD globs, destructive patterns, artifact required sections, swarm config). Flips `configured: true`. |
257
261
 
258
- **Adding a fifth command requires answering yes to both:** "does a human need to press this?" and "is 'user-only via frontmatter flag' too weak a guarantee?" Otherwise make it a skill.
262
+ **Adding a sixth command requires answering yes to both:** "does a human need to press this?" and "is 'user-only via frontmatter flag' too weak a guarantee?" Otherwise make it a skill.
259
263
 
260
264
  ### §4.5 MCP servers (3)
261
265
 
@@ -273,6 +277,7 @@ Runtime-only; gitignore or keep out of commits per project policy.
273
277
  |---|---|---|
274
278
  | `workflow.json` | `/triage` | `track_guard`, every phase skill, `/harness` |
275
279
  | `commit_consent` | `/grant-commit` | `git_commit_guard` |
280
+ | `push_consent` | `/grant-push` | `git_commit_guard` |
276
281
  | `spec_approvals/<slug>.approval` | `/approve-spec` | `tdd`, `swarm-plan`, `/harness` |
277
282
  | `swarm_approvals/<slug>.approval` | `/approve-swarm` | `swarm-dispatch`, `/harness` |
278
283
  | `swarm/<slug>.json` | `swarm-plan` | `swarm-dispatch`, `swarm_merge.sh` |
@@ -315,6 +320,7 @@ Phases are fixed ordering; `/triage` picks the entry and may mark phases as exce
315
320
  9 integrate
316
321
  10 document
317
322
  10.5 archive
323
+ 10.6 memory-flush
318
324
  11 /grant-commit — human consent gate C
319
325
  11b commit
320
326
  ```
@@ -332,14 +338,15 @@ Phases are fixed ordering; `/triage` picks the entry and may mark phases as exce
332
338
 
333
339
  ## §6 — Consent model
334
340
 
335
- **Three consent gates + one bootstrap gate.** All are slash commands, not skills. Commands live in `.claude/commands/`; Claude cannot invoke them via the Skill tool. The guarantee is structural (file location), not flag-based.
341
+ **Four consent gates + one bootstrap gate.** All are slash commands, not skills. Commands live in `.claude/commands/`; Claude cannot invoke them via the Skill tool. The guarantee is structural (file location), not flag-based. Three of the four gates are workflow-phase gates (A: `/approve-spec`, B: `/approve-swarm`, C: `/grant-commit`); the fourth (`/grant-push`) is a Bash-time consent for the branch-aware push policy in §11.
336
342
 
337
343
  | Gate | When it fires | Unlocks |
338
344
  |---|---|---|
339
345
  | `/init-project` | Once per repo, before any work | Flips `configured: true`; silences the `setup_guard` advisory and lets `test_runner` / `lint_runner` move out of guide mode |
340
346
  | `/approve-spec <path>` | After `/spec` produces a draft | Writes approval token; downstream phases proceed |
341
347
  | `/approve-swarm <slug>` | After `/swarm-plan` produces a plan | Writes approval token; `swarm-dispatch` may run |
342
- | `/grant-commit` | Before `/commit` | Writes 5-min consent token; `git_commit_guard` allows next commit |
348
+ | `/grant-commit` | Before `/commit` | Writes 5-min consent token; `git_commit_guard` allows next commit on a protected branch |
349
+ | `/grant-push` | Before `git push` on a protected branch | Writes 5-min consent token; `git_commit_guard` allows next push on a protected branch (non-protected branches need no consent) |
343
350
 
344
351
  Harness yields at each gate. User re-invokes `/harness` to resume.
345
352
 
@@ -461,7 +468,7 @@ Claude may run `git add <named paths>` and `git commit` only when the user has a
461
468
 
462
469
  The following are forbidden unless the user names the exact operation in their current request:
463
470
 
464
- - `git push` (any remote, any branch), `git push --force`, `--force-with-lease`.
471
+ - `git push --force`, `--force-with-lease` (the bare `git push` is governed by the branch-aware policy below, not by this list).
465
472
  - `git commit --amend` — always create a new commit.
466
473
  - `--no-verify`, `--no-gpg-sign`, or any flag that skips hooks/signing.
467
474
  - `git reset --hard`, `git clean -f`, `git checkout --`, `git branch -D`.
@@ -469,6 +476,13 @@ The following are forbidden unless the user names the exact operation in their c
469
476
  - `git rebase -i`, `git add -i` (interactive).
470
477
  - `git add -A`, `git add .` — name the paths to avoid sweeping in secrets or unrelated dirty files.
471
478
 
479
+ **Branch-aware consent policy.** `git_commit_guard` reads the current branch via `git rev-parse --abbrev-ref HEAD` on every `git commit` / `git push` invocation and routes per:
480
+
481
+ - `project.json → git.protected_branches` — glob list. `null` (default) means every branch is protected. Set e.g. `["main", "release/*"]` to limit consent enforcement.
482
+ - `project.json → git.branch_pattern` — regex, optional. When set, commits on off-pattern branches are denied with the pattern surfaced in the error.
483
+
484
+ On a **protected branch**, commit requires fresh `commit_consent` (`/grant-commit`), push requires fresh `push_consent` (`/grant-push`). On a non-protected branch, both proceed without consent. **Detached HEAD** (`git rev-parse` returns the literal `HEAD`) denies both — branch-aware policy needs a named branch.
485
+
472
486
  `git_commit_guard` enforces these; bypassing requires editing the hook, which is itself a visible change.
473
487
 
474
488
  ---
@@ -502,7 +516,7 @@ Seed-level requirement: no stale workflow artifacts in the working tree after co
502
516
 
503
517
  **Step 4:** Write `src/agents/swarm-worker.template.md` (canonical-body store, per §4.2) — the only subagent template. Then render `.claude/agents/swarm-worker.md` from it with default tokens. The template carries four tokens — `{{NAME}}`, `{{DESCRIPTION}}`, `{{SKILLS}}`, `{{ROLE_LINE}}`. Default `SKILLS` is the YAML list block ` - scenario\n - implement` (the worker's two mandatory sub-skills). Render-parity holds at this stage. `/init-project` later re-renders the worker with stack-aware tokens when the recommender flags stack-specific skills to preload via `additions.swarm_worker_skills`.
504
518
 
505
- **Step 5:** Write `.claude/skills/` for the 36 skills (§4.3) — 28 workflow/worker/orchestration/memory/alt-track skills you author plus 7 shared globals plus 1 audit skill. The breakdown: artifact drafting (4) + workflow phases (10) + phase workers (5: `scenario`, `implement`, `verify`, `prose`, `design-ui`) + spec helpers (4: `spec-lint`, `spec-render`, `spec-diagram-review`, `spec-traceability-review`) + orchestration (3: `harness`, `swarm-plan`, `swarm-dispatch`) + memory (1: `memory-flush`) + shared globals (7: `claude-automation-recommender`, `code-structure`, `humanizer`, `documentation`, `technical-tutorials`, `copywriting`, `impeccable`) + drift defender (1: `audit-baseline`) + alternate tracks (1: `chore`). The vendored `claude-automation-recommender` (Apache 2.0, from `claude-code-setup`), the writing/quality globals, and the design global ship unchanged with their licenses intact. Artifact skills (intake, brd, spec, rca) each ship a `template.md`. Helper scripts: swarm-plan gets `validate.sh`, swarm-dispatch gets `swarm_merge.sh`, spec-render gets `render.sh`, spec-lint gets `lint.sh`, archive gets `archive.sh`, audit-baseline gets `audit.sh`. All helper scripts `chmod +x`.
519
+ **Step 5:** Write `.claude/skills/` for the 37 skills (§4.3) — 29 workflow/worker/orchestration/memory/alt-track skills you author (the +1 over 28 is the `changelog` Phase 11.5 skill) plus 7 shared globals plus 1 audit skill. The breakdown: artifact drafting (4) + workflow phases (10) + phase workers (5: `scenario`, `implement`, `verify`, `prose`, `design-ui`) + spec helpers (4: `spec-lint`, `spec-render`, `spec-diagram-review`, `spec-traceability-review`) + orchestration (3: `harness`, `swarm-plan`, `swarm-dispatch`) + memory (1: `memory-flush`) + shared globals (7: `claude-automation-recommender`, `code-structure`, `humanizer`, `documentation`, `technical-tutorials`, `copywriting`, `impeccable`) + drift defender (1: `audit-baseline`) + alternate tracks (1: `chore`). The vendored `claude-automation-recommender` (Apache 2.0, from `claude-code-setup`), the writing/quality globals, and the design global ship unchanged with their licenses intact. Artifact skills (intake, brd, spec, rca) each ship a `template.md`. Helper scripts: swarm-plan gets `validate.sh`, swarm-dispatch gets `swarm_merge.sh`, spec-render gets `render.sh`, spec-lint gets `lint.sh`, archive gets `archive.sh`, audit-baseline gets `audit.sh`. All helper scripts `chmod +x`.
506
520
 
507
521
  **Step 6:** Write `.claude/commands/*.md` for the 4 gates (§4.4). All carry `disable-model-invocation: true` as belt-and-braces; structural user-only is enforced by their directory.
508
522
 
@@ -525,8 +539,9 @@ Seed-level requirement: no stale workflow artifacts in the working tree after co
525
539
  1. `/triage "<test request>"` → writes `workflow.json`.
526
540
  2. Write a spec at `docs/specs/test.md` with all 6 diagrams → `spec_diagram_presence_guard` + `plantuml_syntax_guard` allow.
527
541
  3. Write a spec missing a diagram → guard denies with named missing kinds.
528
- 4. Attempt `git commit` without `/grant-commit` → `git_commit_guard` denies.
529
- 5. Attempt `git push` → hard-blocked regardless of consent.
542
+ 4. Attempt `git commit` on a protected branch without `/grant-commit` → `git_commit_guard` denies.
543
+ 5. Attempt `git push` on a protected branch without `/grant-push` denied. Same `git push` on a non-protected branch (when `git.protected_branches` is set to e.g. `["main"]` and current branch is `feat/foo`) → allowed without consent.
544
+ 6. Attempt `git commit` or `git push` while detached (`git checkout <sha>`) → denied with explicit "Detached HEAD" message.
530
545
 
531
546
  ---
532
547
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest_version": 2,
3
- "generated_at": "2026-05-14T22:27:15.062Z",
3
+ "generated_at": "2026-05-18T19:07:49.408Z",
4
4
  "files": {
5
5
  ".claude/agents/swarm-worker.md": "1735a220f268c9765cb22e0567b728803f2edd7776cbde51dd017a9f062ae41f",
6
6
  ".claude/bin/LICENSE": "a8dcf2775ab71a58c7d4cc935e3a8e9974e87bb7d6082ee25ef52f8140be8e07",
@@ -8,51 +8,77 @@
8
8
  ".claude/commands/approve-spec.md": "aef2b6b0d71692bba71ae691ff1a4405557806c8ccd64107bc197238d6ec359f",
9
9
  ".claude/commands/approve-swarm.md": "77467e3962792d8cdc2db7947e4a7c16481d5d27bf378f6dc0e415935a02680d",
10
10
  ".claude/commands/grant-commit.md": "92409e2ff76bb3db4707d6deffab35877f06ecd38af2b12ca103eb7333eb7b92",
11
- ".claude/commands/init-project.md": "46ca7332f6d4d52fefd3edbaea36b03930101775969703b2e9ccc9248eb7ad17",
11
+ ".claude/commands/grant-push.md": "770e8bc3bf1097ecdf92b86dcf6e0cf7ef3a3251b73bf35cc0385f2e2d552319",
12
+ ".claude/commands/init-project.md": "222f02f65ea639c904c43114642f11422a56d8dab8c1c2786b5876e17d3b0155",
12
13
  ".claude/hooks/artifact_template_guard.sh": "1592700602c98c8cb733ae3ce9638bf7c3414c5e5ef4fd566528e47765be3f39",
13
- ".claude/hooks/consent_gate_grant.sh": "fa58ad1d8e2fe8debb23b44b65bd2b08f4270891f1b505d4623d7263bf4dc622",
14
+ ".claude/hooks/consent_gate_grant.mjs": "308704139bf6f090fa11fdb0668810351c70dfb102eb06138a6f4031efed3b5b",
14
15
  ".claude/hooks/destructive_cmd_guard.sh": "ec62ffeef60e07332766ecb93b9121c59e5f8aa695ba3d2def26072d9d18f63c",
15
16
  ".claude/hooks/env_guard.sh": "76ffc98fa9a2709526715132981699e46043183e2b1d043a05744a40384d1361",
16
- ".claude/hooks/git_commit_guard.sh": "1a78799f35cae7b52ee29d8adcddc5cd29427822c223a3be6e0d181f1e8e71c2",
17
- ".claude/hooks/harness_continuation.sh": "81b40138a66b24d93fcd8fde57f2f21804667952f466d84c2af7c9307c75b117",
18
- ".claude/hooks/lib/common.sh": "2c72b867acf08550f62f80c6b57024d35edd74260a9fd7ac6c709e71fd812319",
17
+ ".claude/hooks/git_commit_guard.mjs": "95449912110be43635c8130f06ff87d851fc0ebec89fda17b3290671710dfbf6",
18
+ ".claude/hooks/harness_continuation.sh": "6ceca513b9f63cae021e93c0cb1e444627d94ed0aadf38d4b3da1f5a440b2204",
19
+ ".claude/hooks/lib/common.mjs": "d3ad8d607d161bf11f1814f13aeb764a23de2565fcdc3ef39c85a1cad191a51f",
20
+ ".claude/hooks/lib/common.sh": "c6d4501a1480ea34aafcd7c4b4a53cadcf75bff8def2d5d5370c098574382748",
19
21
  ".claude/hooks/lib/resume_writer.py": "9592fb72de966cb797e51322fbf0160a6784de34934bd6587768689a34bd03b5",
20
22
  ".claude/hooks/lint_runner.sh": "267e08dbd9af246c0af124c32ad4aeac48dfe20ac926244ed89855deb7ff7940",
21
23
  ".claude/hooks/memory_pre_compact.sh": "930a7d1e02a1214037ff8c5ab47b4fc4a76193536f75a1fd6f323ed8dc46292e",
22
- ".claude/hooks/memory_session_start.sh": "3a1c9535d9be4ed91f2297936752b069685835e746198d4ddf7fd9f94306a7f2",
23
- ".claude/hooks/memory_stop.sh": "94599aab45d315ff5c43d1411f3c0170cfc81de4e42a21c10a7575792e14c9a6",
24
+ ".claude/hooks/memory_session_start.sh": "76625781d6cec1dc0d069926adad65c30010b07b1c0e24a2ac441c2981d2ecb5",
25
+ ".claude/hooks/memory_stop.sh": "0e9473706d670830004b180e0cd25a0956149df2960ac0bdb35987c24b995c4a",
24
26
  ".claude/hooks/plantuml_syntax_guard.sh": "92e4e27377cd3d8b7036f4fae76c3be4a486b419bce9bfbcb8fef741e55138b5",
25
27
  ".claude/hooks/process_lifecycle_guard.sh": "1342df1cb0ca0d5ce54f254651092c4054903003070b328e9d2aca62e4d1a9a9",
26
28
  ".claude/hooks/setup_guard.sh": "119675c2b3b00414016958a9eebd6884578822f46695d2e636003e4ba0b7098b",
27
- ".claude/hooks/spec_approval_guard.sh": "514a4db61e98af775566d2b58d5b10438c4e5ee9542a448bade1837809579481",
29
+ ".claude/hooks/spec_approval_guard.sh": "062f80c36deac29217fb5add50aadb807ce9774f3a9703da9095237c2ce74a1c",
28
30
  ".claude/hooks/spec_design_calls_guard.sh": "6fd5d508c40beed47973ee783a8c7a43683f6e34e8a41ca010f0058bf0e37f11",
29
31
  ".claude/hooks/spec_diagram_presence_guard.sh": "786d720412c5ff9e3706961f0ffa1235f8c67f87c90e6917b041b916aabe6a12",
30
- ".claude/hooks/swarm_approval_guard.sh": "8a3fc863e4dcdc0bab434281b8e63a63bde5e7ca58db1dbd26932fe55e3182df",
32
+ ".claude/hooks/swarm_approval_guard.sh": "537869ae8143ccddc90803fd182ed8d4e00d5709710343c86174f2d3f502b98a",
31
33
  ".claude/hooks/swarm_boundary_guard.sh": "b8e4278ada1e187acc4ceefe4af3c4a083510a6dbc44c762f6977fe271f37b9e",
32
34
  ".claude/hooks/tdd_order_guard.sh": "b2325f53a9ecaea9e614f3f4888d02e8540a76dfba359ab86b9f82d297eccfcf",
33
35
  ".claude/hooks/test_runner.sh": "acabe2ec8096f2e54fc321f7561c4d3232c67e06b27a5c8b8f135c0fbf47a3f5",
34
- ".claude/hooks/tests/fixtures/ac008_byte_equal_reference.txt": "4e3c8d0c6856504da1fb7c38d6d82999b3051d54dd9754a3e5039fb8626f8c90",
35
- ".claude/hooks/tests/memory_session_start_test.sh": "9a9585457baf19f128694e5bf85d45a21b92669c49429fe62decd8c15acdb9a6",
36
+ ".claude/hooks/tests/fixtures/ac008_byte_equal_reference.txt": "da3150ef2419899b2ff2df65acb7886f508e9136080bb72addf9ad9de892340f",
37
+ ".claude/hooks/tests/fixtures/memory_stop_landmark_baseline.txt": "bf975e5d50c9ebfdce2f0ed49754213fe82dbac3d2c3335e74f696f34314c5a7",
38
+ ".claude/hooks/tests/fixtures/regenerate-ac008.sh": "80b55fe7bdec492aefb9eaf32868c871d8da34a3cf31225ea51cf2bc12857bc0",
39
+ ".claude/hooks/tests/memory_session_start_test.sh": "858eead3865aab364f2307a5ef2b74d772ca8c35ce2bbcbee96c762559f98f93",
40
+ ".claude/hooks/tests/memory_stop_intent_test.sh": "9b32b906648bbdc2bb8cb51cd8bb609e6093f31bb45f99c9292cfc6105b6faae",
41
+ ".claude/hooks/tests/regenerate_ac008_test.sh": "977ab5e3a0a43419bcd4ec9cbd5fbc54a107667d4acee5ac8c317ee6506e6b9f",
36
42
  ".claude/hooks/track_guard.sh": "cd79823bf4c24a35133ee6fc072e8c39bdfbc49042c698dcbeb2c36986f15c5f",
37
43
  ".claude/hooks/verify_pass_guard.sh": "a3aba3821ff7318499012032b82279ab6d04c1287e935d3a8b1bbf38b905c79f",
38
- ".claude/memory/README.md": "37c77e7dea91e5d5475009728c7d4473fa6238e2bc8e9b19c39d79cc4f4b9265",
44
+ ".claude/memory/README.md": "af088415c3430eab6353433ca9ad8c318324965ac0b9e5550adacebbf6b91503",
39
45
  ".claude/memory/_pending.md": "ae6407956aadd998c17ad5ad7150dbb21ccf49cc3375efe25b2d2ffb61c0a92a",
40
46
  ".claude/memory/_resume.md": "7ef4da663edc2ea35d19167f776e94b3f925072e9d8388841c42c5c6b81fc2f5",
47
+ ".claude/memory/backlog.md": "4e124b7ecee5aa0918fd6d9a3bb232a68c7feff6fcf916b8562ed6513715db71",
41
48
  ".claude/memory/conventions.md": "3f3c6baedde55483acc75da4eb3f6e6b6b59ecba6e9b6334f0181a6dccc33e1e",
42
49
  ".claude/memory/decisions.md": "384984c8b67e2949f19c510b3c4c0d502dde9012063ee4c0e6dfb5fec3fb32af",
43
50
  ".claude/memory/landmarks.md": "e79626511e304654658e44e71c56f9316836481c6a4a0f0a0a2c1277c84143aa",
44
51
  ".claude/memory/landmines.md": "9df9b39bbcb91623f21caa506f69a71be888e2f728f93de29e5ffab5f6e5f923",
45
52
  ".claude/memory/libraries.md": "0ed3f69945c54825908143ca7c504a9b92529eddce63df8c70a9309293d4644a",
46
53
  ".claude/memory/pending-questions.md": "4b1d8be633b5f05eff66550b8fc98d6482bdf89536f21d6b975a1d8570b484b9",
47
- ".claude/project.json": "cd381296286101bc1c7451f22960cc8cc39111a01c5fcfb672e7fb6a36a411e6",
48
- ".claude/settings.json": "8b558bb7f3aa69188de2e01757f5c4c719da136fa1ee7b7099fbe83d98ee5380",
54
+ ".claude/project.json": "a81f9c1341a15831fe8dd558e376dfe38d5fd938aac6291a4c59529637a8d2c7",
55
+ ".claude/settings.json": "feb7d2c004b6c12cef6410d54db8ad0abc818b2aa16b1942cfdb72808c21b30d",
49
56
  ".claude/skills/archive/SKILL.md": "5174e8b72ab1e830912c231052d1e535023d58f0808434fe1d4abce305b80318",
50
57
  ".claude/skills/archive/archive.sh": "29f5b3c8870d0665ce624c6d1b5770f691f1d19f82a201767d5685fc3b0a0b58",
51
58
  ".claude/skills/audit-baseline/SKILL.md": "86e9955a99ade89074571320b2b9b0780bc033d201968f62edcca35d9e25f7cb",
52
- ".claude/skills/audit-baseline/audit.sh": "76eb4e9e58c31fc4d7258427473b1e4cdf7c3a63cbb065b4139fe4a1b4f1eee7",
59
+ ".claude/skills/audit-baseline/audit.sh": "8b8a7db4db2aba0e0dd9948e4472feabe568e06a5f4e752c10dcd3da655bedf3",
60
+ ".claude/skills/audit-baseline/tests/fixtures/_pending_opener_only.md": "9c64d7ef0b3be48b3e87acd89f9ac638db956f2c7cc5adf569d9d97d16f18163",
61
+ ".claude/skills/audit-baseline/tests/fixtures/preamble_full_empty_body.md": "b757223c9b4954882b7f4ac828de7d83a105f74ba0cdf0951fbbe19c07ae892d",
62
+ ".claude/skills/audit-baseline/tests/fixtures/preamble_full_with_entries.md": "9fcd049b006a7474d182a04420df6b3af08e3b6777a2ec5b4031d661ba2f4c82",
63
+ ".claude/skills/audit-baseline/tests/fixtures/preamble_no_opener.md": "ef189e0e9997598874b2e26ca9e626311cc7cb99d9460ac9ca36773fff42522e",
64
+ ".claude/skills/audit-baseline/tests/fixtures/preamble_opener_only.md": "d5042563a9f2ae9aaf4a5a75ed3d8af3d63d2ae0a451fed67ffb7ee6b0463239",
65
+ ".claude/skills/audit-baseline/tests/preamble_check_test.sh": "73239378e51528c37f7843ff540ddfed2cd0ee1b8259589bc7cdaefd71424d95",
53
66
  ".claude/skills/brd/SKILL.md": "260e5d18396de21b6842ad0bc5fe74b0e124f3c2e2a4ac2867eeb543c7c2c0a3",
54
67
  ".claude/skills/brd/template.md": "be4095b4bed70fcebc821ad92b0217db4fee1afb9a341a9e704d2c1869ec6f43",
55
- ".claude/skills/chore/SKILL.md": "66efdcf992a7e56db97c0c1e81abe229263fd4bba976e1f21a23cf4dca705920",
68
+ ".claude/skills/changelog/SKILL.md": "2a305b04be3fb44dd9766fae0344725600c2269276d5fe9496d068cebcc4969c",
69
+ ".claude/skills/changelog/changelog.mjs": "662ae8142ea55c70375e45d874f97b40bcb85b0d6e5378393be56aba1b254eee",
70
+ ".claude/skills/changelog/classifier.mjs": "e17cd4dacb48b5ebf3addd2f651e8e2465c10aa51958c11c9272faff32e379f2",
71
+ ".claude/skills/changelog/state-writer.mjs": "a773f14eb1d7d990f64eb54f70720451db279954ea5cbd025ca15f1a8d39449d",
72
+ ".claude/skills/changelog/tests/consent-expired_test.sh": "60351d32cb544af33a6929f898411e43d20ec258f620ebc08179754a74811cf1",
73
+ ".claude/skills/changelog/tests/golden-path_test.sh": "1ef7cdaae2dbeea25f7165b182e4b2cc80e69f3cc918089552145421fcc35d26",
74
+ ".claude/skills/changelog/tests/idempotent-reentry_test.sh": "af11b08744ab3743989f9ae8017b6f01a32373971f072c233ce28741783f5de0",
75
+ ".claude/skills/changelog/tests/keepachangelog-unreleased-preserved_test.mjs": "981e1831893449667b1460b13b9ef9275cc3bd23b22cd6a3cfa3d56d239ed0ad",
76
+ ".claude/skills/changelog/tests/non-git-shortcircuit_test.sh": "ec5760c8790a3cd5cb21e93bd1742a4f30115f0e4e4829a8f765fecb4ddba5f4",
77
+ ".claude/skills/changelog/tests/preview-only_test.sh": "b30a6c4b94a1cb87596af317f460c57c62ecde257dcd81447932564ce9e542d2",
78
+ ".claude/skills/changelog/tests/run.sh": "55ba1d59d67f3e43b07fae08a7059c4e04cfe963a09a2367528d509e748f3116",
79
+ ".claude/skills/changelog/unreleased-writer.mjs": "a03d9080317e2fc9c4895b7b8c68efc2ab90497a9265091f5981859cda3d6885",
80
+ ".claude/skills/changelog/version-preview.mjs": "3843093b08b5407012e53d601fa6d3d4d3ddc04ae4911d0e5ad015622585c67f",
81
+ ".claude/skills/chore/SKILL.md": "3479c4ef4c7706928b54ed89678c3526c790e2aeb629674bd60e5a9e4b90d80d",
56
82
  ".claude/skills/claude-automation-recommender/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
57
83
  ".claude/skills/claude-automation-recommender/NOTICE": "2076093d5af61a10b585562e3b40fd76ce178c56e5eebde93efdc08b3c6bb81a",
58
84
  ".claude/skills/claude-automation-recommender/SKILL.md": "3e151ae30a9e364175a1d2d9914950cf8e766f1d021d3a4d26996052b3b6e5ab",
@@ -62,18 +88,22 @@
62
88
  ".claude/skills/claude-automation-recommender/references/skills-reference.md": "b4b57d953526a07146d5757ca5332034b9b4b4eeba839e4bb08111398c94556f",
63
89
  ".claude/skills/claude-automation-recommender/references/subagent-templates.md": "7f9a107d8619ff96fea07d5a17da31b269cec0ee343e5a9ff643c0d6cb4ba944",
64
90
  ".claude/skills/code-structure/SKILL.md": "4fa79beb83f9171e973cd2373af12f007aeaf95d156edf3a8e7cf3e9c2c22ace",
65
- ".claude/skills/commit/SKILL.md": "070b78fbbd191439db99f3d779f1c9c9d942d4abcbf456973f610aea0cdfa6a1",
66
- ".claude/skills/copywriting/SKILL.md": "020a995ce2fdce3ff672e923cfe03ba67844a91701272b79727ec73b67668720",
91
+ ".claude/skills/commit/SKILL.md": "7f22653ae6832a5fc5631774f78d3feabe47c5b21c5925ae8a77e656bbac1b9c",
92
+ ".claude/skills/copywriting/LICENSE": "3d015bf779e8f6f4b9366e0862c0d560aa60979bbe8d90426cede05528dc5390",
93
+ ".claude/skills/copywriting/NOTICE": "ffd65b16660e4e9cbf42c5ff9bdf67b482815ebedfb515bedb65c6eb54930a15",
94
+ ".claude/skills/copywriting/SKILL.md": "4631aae3a65204a1dac89fbe7606481b867b30ae3f64482d337c1e6bd5b4c902",
67
95
  ".claude/skills/copywriting/evals/evals.json": "bb2958b15648d180d04b676a42a22b7e2317c8c3314a71a6b56612164f7550c5",
68
96
  ".claude/skills/copywriting/references/ai-writing-detection.md": "4a4bf54c70b8b81d851f6c65ca69f83e3388d8d6970f6eab131cbf4287f0f860",
69
97
  ".claude/skills/copywriting/references/copy-frameworks.md": "f387b6ed4b510efa9f0d3c459f4898971c8b0176e8c34185040cb264eca50186",
70
98
  ".claude/skills/copywriting/references/natural-transitions.md": "4ff23f8943af2f65b072f26f1c53ce55f19cc26d7be211c11cae8e34b43e859f",
71
- ".claude/skills/design-ui/SKILL.md": "df3cfef74766f371e9a27da02259e17909ab08a75e9af76c5030870b9eb6d3bc",
72
- ".claude/skills/design-ui/references/design-vs-development.md": "8e395f9985eaa6f6a6a82f1bb7ca83ecf22155fe675dfa70b2291f215061d08b",
99
+ ".claude/skills/design-ui/SKILL.md": "d7b1b95dc3ea1cac0f6bfd9b001b251fec3ec1ddc3b30ee7e7e3dfad5a669fb8",
100
+ ".claude/skills/design-ui/references/design-vs-development.md": "7506f0f79e5edb0c12fcea327625f1716db0d2229f020e2a2fc74d88392ff54f",
73
101
  ".claude/skills/design-ui/references/intent-table.md": "56237061047a80dd242c3f0753e7d8c416a58272a9d4cb7d05f7ecc368df6674",
74
- ".claude/skills/design-ui/references/orchestration.md": "058e65bd7768f3b31bfaba0c5d973fc74598f8ed732a0c7c5a6853eeb81a190f",
75
- ".claude/skills/design-ui/references/state-machine.md": "e15b121bc4dbb5fb2926d9dca8dc08d03c6b60875b420ca50898f1de5aaa7c9e",
102
+ ".claude/skills/design-ui/references/orchestration.md": "a3bb05a804427f00f857d2e23524cc644041ba49ef67bc05c60a673f9dbaa928",
103
+ ".claude/skills/design-ui/references/state-machine.md": "4d31ecdbca0ba114bdf83f6575724467ce3b260479160a8c8791c2eede8fe27f",
76
104
  ".claude/skills/document/SKILL.md": "7345488fe50923c273dfdf3277ec7251fee9184bc7de1a12192255b5ad183fda",
105
+ ".claude/skills/documentation/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
106
+ ".claude/skills/documentation/NOTICE": "c201f68939a610c948a4d0e6bebbcb8f8df370cfe41ceb6e5861c20ab4044d06",
77
107
  ".claude/skills/documentation/SKILL.md": "456160c1a3398cfece91b6696d0c7f1fcb1196ea5e101acb9a0e3050f2462a5d",
78
108
  ".claude/skills/google-analytics/SKILL.md": "f5d8c52c103e4e1bdbb6bfdda962aad198064ced701c20df753d77ba4603547c",
79
109
  ".claude/skills/google-analytics/references/audiences.md": "cdae62b0f40e82a60f96a6bd0e77798c6118beaebe812961e8c9d4c3242b227f",
@@ -91,9 +121,13 @@
91
121
  ".claude/skills/google-analytics/references/reporting.md": "37cb7cfd1dd547e86a41664ffe13893ef138194a2288d1a2c43c9195e8ec609f",
92
122
  ".claude/skills/google-analytics/references/setup.md": "26743b72341a5658e73c1f070b924de0f11b1681af06164cb13c19f2047a1087",
93
123
  ".claude/skills/google-analytics/references/user-tracking.md": "5a945df2a575291c6b35d24830b497915c82a843a93ee133577f1deda93f6d75",
94
- ".claude/skills/harness/SKILL.md": "f758faec70974e61b558e93055f8267f39f51816759a645b89a28ff362e18eb6",
124
+ ".claude/skills/harness/SKILL.md": "af7cf374013d881d216462ccba353747e1727f670bd9b1c45b089ffde247d67a",
125
+ ".claude/skills/humanizer/LICENSE": "5dd2bb7cb6b254edd93a87718efbfef8b81c8ef90e3f9180f06723683d7733a3",
126
+ ".claude/skills/humanizer/NOTICE": "5bdb69381ab078e7fbb5fb910f10253baa6fe9dabb88143c6f613959e131cbb3",
95
127
  ".claude/skills/humanizer/SKILL.md": "398beef0cabe34df435972a13fb9ef21be74d942f93321b220a5dd393d554e40",
96
128
  ".claude/skills/humanizer/references/ai-writing-detection.md": "e896c1b31f7af57b8cda81df6ded6e9d7e9ab742a0f5fdfc73f88a6be2e78f2b",
129
+ ".claude/skills/impeccable/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
130
+ ".claude/skills/impeccable/NOTICE": "635634b6132772183c1a9ca22035d1d1a15ab17fd70e49fa812f9205bce94093",
97
131
  ".claude/skills/impeccable/PROJECT_NOTES.md": "dfa989f50bc6d2a164adb6b272fcb15820fef1659fc710c2b8c58878275faae2",
98
132
  ".claude/skills/impeccable/SKILL.md": "37ad04b8f9b41d11618f294374d9b757b70e89f33fcbceecf190794143d682e4",
99
133
  ".claude/skills/impeccable/agents/openai.yaml": "cbd8bd68fa00935dd0f179adb169252629cf7ee443ea9dc7db77e7ef2cf77446",
@@ -151,9 +185,9 @@
151
185
  ".claude/skills/intake/SKILL.md": "7ad00f23ee28737dccef9c71ae477a54edad34a09f50b7774a34ae11e2ca016b",
152
186
  ".claude/skills/intake/template.md": "49262d5dd9c8b00c54822af5106671c84dff5d662285c41a2377a8b30d353661",
153
187
  ".claude/skills/integrate/SKILL.md": "31c54bdd0a1ea24efc078023842bd05c4db3c76d73718788dcc5fa4daf8ec771",
154
- ".claude/skills/memory-flush/SKILL.md": "ad971b4aef6820e0ae926812e499ed65496f6b14de57db04a5e9ebc440754631",
155
- ".claude/skills/memory-flush/sweep.py": "ebca5b2e09c021a61f434822cf693d552407cf52f753979dc403310666d490b6",
156
- ".claude/skills/memory-flush/tests/run.sh": "aa20d8f6057c3d34fd72ab1aca2c2dc498dede36497f68e5576547a755c8c315",
188
+ ".claude/skills/memory-flush/SKILL.md": "825f01fe6aff5d7faeaa654df4e371cb1f76857348f28e65addd4d37e60ff726",
189
+ ".claude/skills/memory-flush/sweep.py": "f04956bd98c8332feb77cd33a480d948c3b001813353fcf985e7bab8ddfda9d4",
190
+ ".claude/skills/memory-flush/tests/run.sh": "5eec4486cfda45d2ce5987d6286bf61b96f816ebdd9041bc9ba0207cf00abd4b",
157
191
  ".claude/skills/optimize-seo/SKILL.md": "b389dc604346220d5a0a59c8f41c058c192c58a35bbff831fbc4c7f9e8c1b386",
158
192
  ".claude/skills/optimize-seo/scripts/pagespeed.mjs": "8bef62078833139f9175c175339d1fc0eb635a5eeaa2a3100543928ef91869e4",
159
193
  ".claude/skills/pagespeed-insights/LICENSE.md": "10ee2ded8c2ae373a65aacfa51f2bf540d5f20d418fc7a5595a5ccb06cde2738",
@@ -179,23 +213,29 @@
179
213
  ".claude/skills/swarm-dispatch/swarm_merge.sh": "e1ab58c6d990665325d7749a769afbda1232b99fc8255215891fdd0c99a483e6",
180
214
  ".claude/skills/swarm-plan/SKILL.md": "6e530d5b67151ad1a4d310a966fbf4e742cc077a34c931350603a05e26fb6e88",
181
215
  ".claude/skills/swarm-plan/validate.sh": "b97b0063ed6f98f6e653b52db760c93bebca0138f3eeebb004a7ee9f7242bf02",
182
- ".claude/skills/tdd/SKILL.md": "19a18ed40847a751647090c553d762677313761c30aee8ad78413fff34e74105",
183
- ".claude/skills/technical-tutorials/SKILL.md": "870b881ab2349cf3197f3e637e1268bbeabc25e3072f46baaa8eae02edb58337",
216
+ ".claude/skills/tdd/SKILL.md": "284a2f3737f3f25242affbb8bc04c03a48e1c151cbaa06198820184f213a4a36",
217
+ ".claude/skills/tdd/drift_check.py": "8d0070eb48d97b79031d40618390dc1d8bb55d9aaa1874845ba3424a67b31066",
218
+ ".claude/skills/tdd/tests/drift_check_test.sh": "db08058ce9a30dc3df32dd4d2aa9ec4037316f49a85f11edbc13ba21f3107efd",
219
+ ".claude/skills/tdd/tests/run.sh": "ef81eb08a495c45ed43c7cc0683fa741bd8a79f8f4bce2092120b8d558969d45",
220
+ ".claude/skills/technical-tutorials/LICENSE": "8b834880d2992ef265e235ed561dbd35636309e42c916a4d867418188a27ad97",
221
+ ".claude/skills/technical-tutorials/NOTICE": "82e551a1e6758704b7566c1a0f23ce29c58bd0046de1f32dedbcddfc469eb1ca",
222
+ ".claude/skills/technical-tutorials/SKILL.md": "3eabf2bcf02d21612cc7f00c878f29b702dfd2c7ec298aee0c90e2496964c691",
184
223
  ".claude/skills/technical-tutorials/references/audience-context-README.md": "d0470e06463cb33980b6fd91a5f0ebec268e3b63481752988fc6378c60a00fd8",
185
224
  ".claude/skills/technical-tutorials/references/audience-context.md": "7e00189e72d7a87a0cf59f8302aa4adad26222d3bbd14ddb498515f137a32775",
186
225
  ".claude/skills/technical-tutorials/references/audience-example.md": "610f559f691de5169f672e8f69b72fd44790e5e3f894cebb7e644c3331db419c",
187
226
  ".claude/skills/technical-tutorials/references/audience-template.md": "9e8da0e05544df3961d75fb3a7b1d6374b6a1c129ac2fc9862dc111b5a75e433",
188
- ".claude/skills/triage/SKILL.md": "1a26797795bec07d57bf61ced22c1d271124ec32ae858f4cb10e0cd3a78cfdf3",
227
+ ".claude/skills/triage/SKILL.md": "499f82a26d77c60af827dd89a7fcb3eae0cd903e34c70740c297bc260aeed38e",
189
228
  ".claude/skills/verify/SKILL.md": "fcddba67cf7f3623fc8f8ae142303b16b9db0c9fc1652bc920e16c56fe4c7864",
190
229
  ".mcp.json": "8ebb7966045486187bbdf9bac643e690c4fbc7a9a70a8345e3665ba72fa19b96",
191
- "CLAUDE.md": "1bdd48d3f69c491a8dddac7b61adb72b84a54ad927a048e48e8537c2a86ef4e2",
192
- "docs/init/seed.md": "76f059186b31c8e01724f3dce4c70a71a20594ee301073458c611655a6c208d9"
230
+ "CLAUDE.md": "5aff9bb3534792961b3e5c79a23f7ae3a859bb22efc3553c62847f555c61a08d",
231
+ "docs/init/seed.md": "e0d708ccf06ae1ae124e0a3ada3e77bfbdbb9f2899a548a1729c9270a12f3e98"
193
232
  },
194
233
  "owners": {
195
234
  "skills": {
196
235
  "archive": "baseline",
197
236
  "audit-baseline": "baseline",
198
237
  "brd": "baseline",
238
+ "changelog": "baseline",
199
239
  "chore": "baseline",
200
240
  "claude-automation-recommender": "baseline",
201
241
  "code-structure": "baseline",
@@ -231,5 +271,5 @@
231
271
  "verify": "baseline"
232
272
  }
233
273
  },
234
- "build_id": "gha-25889207503"
274
+ "build_id": "gha-26054481720"
235
275
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@friedbotstudio/create-baseline",
3
- "version": "0.2.1",
4
- "description": "Zero-dependency Node CLI scaffolder that materializes the Claude Code baseline (hooks, skills, commands, MCP servers, governance docs) into a target project. Run via `npx @friedbotstudio/create-baseline <target>`.",
3
+ "version": "0.4.0",
4
+ "description": "Node CLI scaffolder that materializes the Claude Code baseline (hooks, skills, commands, MCP servers, governance docs) into a target project, with branded interactive install / upgrade / doctor flows. Run via `npx @friedbotstudio/create-baseline <target>`.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "create-baseline": "bin/cli.js"
@@ -43,6 +43,9 @@
43
43
  "email": "hello@friedbotstudio.com"
44
44
  },
45
45
  "homepage": "https://baseline.friedbotstudio.com",
46
+ "dependencies": {
47
+ "@clack/prompts": "1.4.0"
48
+ },
46
49
  "devDependencies": {
47
50
  "@11ty/eleventy": "3.1.5",
48
51
  "@semantic-release/changelog": "6.0.3",