@polymorphism-tech/morph-spec 7.9.4 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/CLAUDE.md +2 -2
  2. package/README.md +31 -2
  3. package/bin/morph-spec.js +50 -2
  4. package/bin/validate.js +379 -379
  5. package/claude-plugin.json +1 -1
  6. package/docs/CHEATSHEET.md +38 -1
  7. package/docs/QUICKSTART.md +60 -1
  8. package/framework/CLAUDE.md +13 -2
  9. package/framework/MORPH.md +38 -2
  10. package/framework/agents.json +22 -3
  11. package/framework/commands/commit.md +166 -166
  12. package/framework/commands/morph-hotfix.md +39 -0
  13. package/framework/commands/morph-infra.md +215 -215
  14. package/framework/commands/morph-preflight.md +205 -205
  15. package/framework/commands/morph-troubleshoot.md +124 -124
  16. package/framework/hooks/README.md +25 -10
  17. package/framework/hooks/claude-code/core/gate-guard.js +4 -2
  18. package/framework/hooks/claude-code/core/loop-detect.js +2 -1
  19. package/framework/hooks/claude-code/core/post-edit-typecheck.js +14 -5
  20. package/framework/hooks/claude-code/core/tasks-json-guard.js +4 -2
  21. package/framework/hooks/claude-code/core/validate-completion.js +1 -1
  22. package/framework/hooks/claude-code/core/worktree-context.js +160 -0
  23. package/framework/hooks/claude-code/statusline.py +679 -679
  24. package/framework/hooks/claude-code/statusline.sh +11 -11
  25. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  26. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  27. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  28. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  29. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  30. package/framework/hooks/shared/activity-logger.js +160 -160
  31. package/framework/hooks/shared/build-check.js +2 -2
  32. package/framework/hooks/shared/hook-response.js +17 -5
  33. package/framework/hooks/shared/payload-utils.js +42 -0
  34. package/framework/hooks/shared/state-reader.js +22 -2
  35. package/framework/hooks/shared/stdin-reader.js +26 -26
  36. package/framework/rubrics/backend.json +41 -41
  37. package/framework/rules/ai-agents-standards.md +45 -45
  38. package/framework/rules/dotnet-templates.md +86 -86
  39. package/framework/rules/frontend-standards.md +13 -13
  40. package/framework/rules/infrastructure-standards.md +27 -27
  41. package/framework/rules/neon-standards.md +25 -25
  42. package/framework/rules/nextjs-standards.md +20 -20
  43. package/framework/rules/nextjs-templates.md +40 -40
  44. package/framework/schemas/feature.schema.json +95 -1
  45. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  46. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  47. package/framework/skills/core/morph-apply/SKILL.md +39 -8
  48. package/framework/skills/core/morph-brainstorming/SKILL.md +9 -1
  49. package/framework/skills/core/morph-eval/SKILL.md +6 -1
  50. package/framework/skills/core/morph-hotfix/SKILL.md +136 -0
  51. package/framework/skills/core/morph-implement/SKILL.md +8 -4
  52. package/framework/skills/core/morph-plan/SKILL.md +5 -1
  53. package/framework/skills/core/morph-proposal/SKILL.md +24 -1
  54. package/framework/skills/core/morph-review/SKILL.md +3 -2
  55. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  56. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  57. package/framework/standards/ai-agents/agent-session.md +160 -160
  58. package/framework/standards/ai-agents/batching.md +193 -193
  59. package/framework/standards/ai-agents/context-providers.md +188 -188
  60. package/framework/standards/ai-agents/mcp-server.md +250 -250
  61. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  62. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  63. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  64. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  65. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  66. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  67. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  68. package/framework/standards/ai-agents/production.md +275 -275
  69. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  70. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  71. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  72. package/framework/standards/ai-agents/structured-output.md +249 -249
  73. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  74. package/framework/templates/.idea/morph-templates.xml +92 -0
  75. package/framework/templates/.vscode/morph-templates.code-snippets +186 -0
  76. package/framework/templates/IDE-SNIPPETS.md +262 -262
  77. package/framework/templates/REGISTRY.json +0 -62
  78. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  79. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  80. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  81. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  82. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  83. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  84. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  85. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  86. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  87. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  88. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  89. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  90. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  91. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  92. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  93. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  94. package/framework/templates/code/typescript/contracts.ts +167 -167
  95. package/framework/templates/docs/clarifications.md +253 -253
  96. package/framework/templates/docs/schema-analysis.md +119 -119
  97. package/framework/templates/docs/ui-components.md +52 -52
  98. package/framework/templates/docs/ui-design-system.md +76 -76
  99. package/framework/templates/docs/ui-flows.md +167 -167
  100. package/framework/templates/docs/ui-mockups.md +98 -98
  101. package/framework/templates/feature/decisions.md +122 -122
  102. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  103. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  104. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  105. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  106. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  107. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  108. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  109. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  110. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  111. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  112. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  113. package/framework/templates/infrastructure/github/README.md +56 -56
  114. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  115. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  116. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  117. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  118. package/framework/templates/integrations/asaas-client.cs +387 -387
  119. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  120. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  121. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  122. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  123. package/framework/templates/project/validate.js +120 -120
  124. package/framework/templates/state.template.json +17 -17
  125. package/framework/templates/ui/design-system.css +226 -226
  126. package/package.json +1 -1
  127. package/src/commands/dashboard/dashboard.js +53 -53
  128. package/src/commands/index.js +13 -13
  129. package/src/commands/mcp/mcp-setup.js +519 -519
  130. package/src/commands/project/checkpoint.js +209 -209
  131. package/src/commands/project/doctor.js +4 -2
  132. package/src/commands/project/init.js +46 -2
  133. package/src/commands/project/update.js +5 -3
  134. package/src/commands/project/worktree.js +1005 -46
  135. package/src/commands/state/advance.js +17 -2
  136. package/src/commands/state/approve.js +18 -1
  137. package/src/commands/state/create.js +158 -14
  138. package/src/commands/state/retype.js +126 -0
  139. package/src/commands/state/score.js +4 -0
  140. package/src/commands/tasks/dag.js +32 -0
  141. package/src/commands/validation/index.js +1 -0
  142. package/src/commands/validation/validate-feature.js +33 -5
  143. package/src/commands/validation/verify.js +190 -0
  144. package/src/core/state/phase-state-machine.js +197 -197
  145. package/src/core/state/state-manager.js +35 -10
  146. package/src/core/templates/template-renderer.js +477 -477
  147. package/src/core/work-types.js +79 -0
  148. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  149. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  150. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  151. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  152. package/src/dashboard/app/main.jsx +13 -13
  153. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  154. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  155. package/src/dashboard/app/pages/LiveState.jsx +11 -1
  156. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  157. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  158. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  159. package/src/dashboard/app/pages/Standards.jsx +332 -332
  160. package/src/dashboard/app/styles/index.css +47 -47
  161. package/src/dashboard/index.html +12 -12
  162. package/src/dashboard/package.json +24 -24
  163. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  164. package/src/dashboard/scanner/phases-scanner.js +15 -15
  165. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  166. package/src/dashboard/scanner/rules-scanner.js +37 -37
  167. package/src/dashboard/scanner/skills-scanner.js +43 -43
  168. package/src/dashboard/scanner/squads-scanner.js +13 -13
  169. package/src/dashboard/scanner/standards-scanner.js +26 -26
  170. package/src/dashboard/scanner/state-scanner.js +42 -0
  171. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  172. package/src/dashboard/vite.config.js +24 -24
  173. package/src/lib/agents/metrics-aggregator.js +56 -56
  174. package/src/lib/agents/metrics-calculator.js +125 -125
  175. package/src/lib/agents/output-collector.js +73 -73
  176. package/src/lib/detectors/claude-config-detector.js +152 -152
  177. package/src/lib/detectors/design-system-detector.js +231 -231
  178. package/src/lib/detectors/index.js +217 -217
  179. package/src/lib/generators/architecture-scanner.js +639 -639
  180. package/src/lib/generators/design-system-generator.js +508 -508
  181. package/src/lib/generators/index.js +13 -13
  182. package/src/lib/generators/settings-generator.js +209 -209
  183. package/src/lib/hooks/hook-executor.js +167 -167
  184. package/src/lib/installers/mcp-installer.js +719 -719
  185. package/src/lib/installers/memory-installer.js +1 -1
  186. package/src/lib/risk-detector.js +16 -0
  187. package/src/lib/tasks/dispatch-planner.js +122 -4
  188. package/src/lib/tasks/mermaid-renderer.js +132 -0
  189. package/src/lib/tasks/task-classifier.js +30 -30
  190. package/src/lib/tasks/task-parser.js +209 -209
  191. package/src/lib/tasks/test-runner.js +27 -6
  192. package/src/lib/validators/architecture/architecture-validator.js +259 -259
  193. package/src/lib/validators/checkpoint-persistence.js +39 -39
  194. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
  195. package/src/lib/validators/css/css-validator.js +340 -340
  196. package/src/lib/validators/packages/package-validator.js +347 -347
  197. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  198. package/src/lib/validators/shared/issue-counter.js +14 -14
  199. package/src/lib/validators/validation-runner.js +349 -349
  200. package/src/lib/validators/verify-runner.js +322 -0
  201. package/src/lib/work-type-detector.js +143 -0
  202. package/src/scripts/setup-infra.js +32 -5
  203. package/src/utils/agent-id-mapper.js +11 -11
  204. package/src/utils/agents-installer.js +10 -6
  205. package/src/utils/claude-settings-manager.js +300 -300
  206. package/src/utils/file-copier.js +43 -0
  207. package/src/utils/hooks-installer.js +41 -11
  208. package/src/utils/skills-installer.js +174 -174
  209. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
  210. package/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
  211. package/src/lib/tasks/wave-resolver.js +0 -353
package/CLAUDE.md CHANGED
@@ -49,7 +49,7 @@ No build step — pure ESM JavaScript, runs directly via Node.js 18+.
49
49
  - **`framework/`** — Metadata installed into target projects (READ-ONLY at runtime):
50
50
  - `MORPH.md` — NLH charter (the single source of behavioral truth)
51
51
  - `CLAUDE.md` — Runtime instructions injected into target's `.claude/CLAUDE.md`
52
- - `agents.json` (v5.0.0) — 7 domain personas, no tiers
52
+ - `agents.json` (v5.2.0) — 8 agents: 7 domain personas + 1 stage persona (`scout`, read-only), no tiers
53
53
  - `phases.json` — 5 phases (proposal, uiux, plan, implement, review)
54
54
  - `standards/STANDARDS.json` — index of available standards
55
55
  - `hooks/claude-code/core/` — 7 fail-open guardrail hooks
@@ -70,7 +70,7 @@ No build step — pure ESM JavaScript, runs directly via Node.js 18+.
70
70
 
71
71
  **Stack-aware filtering:** Assets declare `stacks: ['dotnet']` in YAML frontmatter or `stack: ['dotnet']` in `agents.json`. `setup-infra.js` reads `config.json → project.stack`, splits into tags, and installs only matching assets.
72
72
 
73
- **Personas, not tiers:** `agents.json` has 7 flat domain personas (dotnet-senior, ef-modeler, maf-expert, nextjs-expert, ui-designer, infra-engineer, evaluator). No tier system — Claude assumes the 3 NLH roles (Orchestrator/Specialist/Evaluator) per MORPH.md.
73
+ **Personas, not tiers:** `agents.json` has 8 flat personas — 7 domain personas (dotnet-senior, ef-modeler, maf-expert, nextjs-expert, ui-designer, infra-engineer, evaluator) plus 1 stage persona (`scout`, read-only). `model` is sized per stage: `sonnet` for implementers, `opus` for `evaluator`, `haiku` for `scout`. No tier system — Claude assumes the 3 NLH roles (Orchestrator/Specialist/Evaluator) per MORPH.md.
74
74
 
75
75
  ### Phase Sequence
76
76
 
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > Spec-driven development framework for multi-stack projects. Turns feature requests into implementation-ready code through structured, AI-orchestrated phases.
4
4
 
5
5
  **Package:** `@polymorphism-tech/morph-spec`
6
- **Version:** 7.9.4
6
+ **Version:** 8.0.0
7
7
  **Requires:** Node.js 22+, Claude Code
8
8
 
9
9
  ---
@@ -121,6 +121,14 @@ morph-spec approval-status {feature}
121
121
 
122
122
  ---
123
123
 
124
+ ## Work-type routing & worktrees
125
+
126
+ Not every change deserves the full pipeline. Every feature is born with a **work type** — `feature`, `bug`, `chore`, or `hotfix` — set via `morph-spec create {feature} --type <type>` or classified from free text with `--request "<text>"`. The type dimensions the pipeline: `feature` runs the full proposal → [uiux] → plan → implement → review sequence; `bug` runs a lean proposal/plan; `chore` skips straight to implement (Gates 1/2 stamped by policy at birth); `hotfix` runs scout (read-only root-cause) → surgical fix → test loop, and its Gate 3 always pauses for a human even under `trust: auto`. Change the type mid-flight with `morph-spec retype {feature} {newType}` (undoes only policy-stamped gates, preserves human approvals, blocked after Gate 3).
127
+
128
+ Independent features can also be developed **in parallel, each isolated in its own git worktree** — one feature, one worktree, one Claude Code instance. `morph-spec create {feature} --worktree` (or `morph-spec worktree setup {feature}`) creates `.worktrees/{feature}/` on branch `morph/{feature}`. The authoritative `feature.json` travels committed on the branch; shared infra (`node_modules`, `.claude`, `.morph/framework`) is linked via junctions (`morph-spec worktree link --all` repairs it if missing). Close out with `morph-spec worktree finish {feature}` (merges `--no-ff` back into the clean primary root) followed by `morph-spec archive {feature}` at the root; `morph-spec worktree list` shows every active worktree with its phase and gate status.
129
+
130
+ ---
131
+
124
132
  ## Slash commands
125
133
 
126
134
  These commands are available inside Claude Code after init.
@@ -130,6 +138,7 @@ These commands are available inside Claude Code after init.
130
138
  | --------------------------- | --------------------------------------------------------- |
131
139
  | `/morph-proposal {feature}` | Full spec pipeline (phases 0-4, pauses at approval gates) |
132
140
  | `/morph-apply {feature}` | Implement approved feature (phase 5) |
141
+ | `/morph-hotfix {feature}` | Surgical hotfix ADW — scout → fix → human Gate 3 → ship |
133
142
  | `/morph-status` | Feature status dashboard |
134
143
  | `/morph-preflight` | Pre-implementation validation |
135
144
 
@@ -166,6 +175,26 @@ morph-spec status {feature} # Feature status dashboard
166
175
  morph-spec validate # Run all validators
167
176
  morph-spec validate {validator} # Run specific validator
168
177
  morph-spec validate-feature {feature} # Content-aware feature validation
178
+ morph-spec verify {feature} [task] # Deterministic build+tests+validators chain, before the LLM judge
179
+ ```
180
+
181
+ ### Work-type routing
182
+
183
+ ```bash
184
+ morph-spec create {feature} --type feature|bug|chore|hotfix # Explicit birth: type dimensions the pipeline
185
+ morph-spec create {feature} --request "<free text>" # Deterministic detector classifies the type
186
+ morph-spec retype {feature} {newType} # Change work type mid-flight (blocked after Gate 3)
187
+ morph-spec dag {feature} [--mermaid] # DAG dispatch decision; --mermaid emits a flowchart
188
+ ```
189
+
190
+ ### Worktrees (parallel development)
191
+
192
+ ```bash
193
+ morph-spec create {feature} --worktree # Birth the feature already isolated in its own worktree
194
+ morph-spec worktree setup {feature} # Create .worktrees/{feature}/ on branch morph/{feature}
195
+ morph-spec worktree link [--all] # Relink shared infra (node_modules, .claude, .morph/framework)
196
+ morph-spec worktree finish {feature} # Merge --no-ff back to the primary root, clean up (requires Gate 3)
197
+ morph-spec worktree list [--json] # List active feature worktrees with phase/gate status
169
198
  ```
170
199
 
171
200
  ---
@@ -365,4 +394,4 @@ Code generated by morph-spec (contracts, templates, implementation output) belon
365
394
 
366
395
  ---
367
396
 
368
- *morph-spec v7.9.4 by [Polymorphism Tech](https://polymorphism.tech)*
397
+ *morph-spec v8.0.0 by [Polymorphism Tech](https://polymorphism.tech)*
package/bin/morph-spec.js CHANGED
@@ -23,7 +23,7 @@ import { installPluginCommand } from '../src/commands/project/install-plugin-cmd
23
23
  import { updateCommand } from '../src/commands/project/update.js';
24
24
  import { doctorCommand } from '../src/commands/project/doctor.js';
25
25
  import { statusCommand } from '../src/commands/project/status.js';
26
- import { worktreeSetupCommand } from '../src/commands/project/worktree.js';
26
+ import { worktreeSetupCommand, worktreeLinkCommand, worktreeFinishCommand, worktreeListCommand } from '../src/commands/project/worktree.js';
27
27
 
28
28
  // === Approval gates (human-only) ===
29
29
  import { approveCommand, approvalStatusCommand, unapproveCommand } from '../src/commands/state/approve.js';
@@ -32,6 +32,7 @@ import { archiveCommand } from '../src/commands/state/archive.js';
32
32
  import { scoreCommand } from '../src/commands/state/score.js';
33
33
  import { gateDecisionCommand } from '../src/commands/state/gate-decision.js';
34
34
  import { createCommand } from '../src/commands/state/create.js';
35
+ import { retypeCommand } from '../src/commands/state/retype.js';
35
36
 
36
37
  // === Tasks ===
37
38
  import { dagCommand } from '../src/commands/tasks/dag.js';
@@ -39,6 +40,7 @@ import { dagCommand } from '../src/commands/tasks/dag.js';
39
40
  // === Validation ===
40
41
  import { validateCommand } from './validate.js';
41
42
  import { validateFeatureCommand } from '../src/commands/validation/validate-feature.js';
43
+ import { verifyCommand } from '../src/commands/validation/verify.js';
42
44
 
43
45
  // === Scaffolding ===
44
46
  import { scaffoldDotnetCommand, scaffoldNextjsCommand } from '../src/commands/scaffold/scaffold.js';
@@ -170,8 +172,12 @@ program
170
172
 
171
173
  program
172
174
  .command('create <feature>')
173
- .description('Create the feature folder structure + canonical feature.json (explicit birth — see framework/schemas/feature.schema.json)')
175
+ .description('Classify work type (--type/--request), scaffold + stamp policy gates, and create the canonical feature.json (explicit birth — see framework/schemas/feature.schema.json)')
174
176
  .option('--status <status>', 'Initial feature status (default: in_progress)')
177
+ .option('--type <type>', 'Work type: feature|bug|chore|hotfix (default: feature) — see src/core/work-types.js')
178
+ .option('--request <text>', 'Free-text request classified by the deterministic detector; tie/none exits 2 with candidates for an LLM/user decision (feature NOT created)')
179
+ .option('--detect-source <source>', 'workTypeDetection.source recorded when --type is explicit: deterministic|llm|user (default: user)')
180
+ .option('--worktree', 'Create the feature already inside its own git worktree (branch morph/{feature}) — fails open outside a git repo')
175
181
  .option('--json', 'Output as JSON')
176
182
  .action((feature, options) => createCommand(feature, options));
177
183
 
@@ -182,11 +188,19 @@ program
182
188
  .option('--json', 'Output as JSON')
183
189
  .action((feature, task, score, options) => scoreCommand(feature, task, score, options));
184
190
 
191
+ program
192
+ .command('retype <feature> <newType>')
193
+ .description('Change a feature work type mid-flight (feature|bug|chore|hotfix) — resets only policy-stamped gates, preserves human approvals')
194
+ .option('--reason <text>', 'Why the type changed')
195
+ .option('--json', 'Output as JSON')
196
+ .action((feature, newType, options) => retypeCommand(feature, newType, options));
197
+
185
198
  // ─── Tasks ────────────────────────────────────────────────────────────────
186
199
  program
187
200
  .command('dag <feature>')
188
201
  .description('Analyze the tasks.json DAG and print the sequential vs parallel dispatch decision (effort-weighted)')
189
202
  .option('--json', 'Output as JSON')
203
+ .option('--mermaid', 'Emit the tasks.json DAG as a Mermaid flowchart (flowchart TD)')
190
204
  .action((feature, options) => dagCommand(feature, options));
191
205
 
192
206
  // ─── Validation ───────────────────────────────────────────────────────────
@@ -215,6 +229,19 @@ program
215
229
  .option('-v, --verbose', 'Show detailed output')
216
230
  .action(validateFeatureCommand);
217
231
 
232
+ program
233
+ .command('verify <feature> [task]')
234
+ .description('Run the deterministic verification chain (build + tests + validators) — code before the LLM judge')
235
+ .option('--json', 'Output as JSON')
236
+ .option('--rubric <id>', 'Force a rubric (default: by task group → config → default)')
237
+ .option('--timeout <ms>', 'Build timeout in ms (default 120000)', (v) => parseInt(v, 10))
238
+ .option('--skip-tests', 'Skip the test node')
239
+ .option('--skip-build', 'Skip the build node')
240
+ .option('--no-persist', 'Do not persist the result to feature.json')
241
+ .action((feature, task, options) =>
242
+ verifyCommand(feature, task, { ...options, noPersist: options.persist === false })
243
+ );
244
+
218
245
  // ─── Scaffolding ──────────────────────────────────────────────────────────
219
246
  const scaffoldCmd = program
220
247
  .command('scaffold')
@@ -273,6 +300,27 @@ worktreeCommand
273
300
  .option('--fresh', 'Create a new dated branch even if one already exists')
274
301
  .action((feature, options) => worktreeSetupCommand(feature, options));
275
302
 
303
+ worktreeCommand
304
+ .command('link')
305
+ .description('Link shared infra (node_modules[, .claude, .morph/framework]) into the current worktree')
306
+ .option('--target <path>', 'Worktree path to link into (default: cwd)')
307
+ .option('--all', 'Link all shared dirs, not just node_modules')
308
+ .action((options) => worktreeLinkCommand(options));
309
+
310
+ worktreeCommand
311
+ .command('finish <feature>')
312
+ .description('Merge the feature branch back into the primary root and clean up the worktree (requires Gate 3 approved)')
313
+ .option('--keep', 'Keep the worktree and branch after merging')
314
+ .option('--force', 'Skip the Gate-3-approved precondition')
315
+ .option('--discard-ignored', 'Allow removing the worktree even though it holds gitignored files that exist nowhere else (e.g. .env) — they are destroyed')
316
+ .action((feature, options) => worktreeFinishCommand(feature, options));
317
+
318
+ worktreeCommand
319
+ .command('list')
320
+ .description('List active feature worktrees with their phase and gate status')
321
+ .option('--json', 'Output as JSON')
322
+ .action((options) => worktreeListCommand(options));
323
+
276
324
  // ─── Dashboard ────────────────────────────────────────────────────────────
277
325
  program
278
326
  .command('dashboard')