@entelligentsia/forgecli 0.10.0 → 0.11.2

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 (188) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +21 -3
  3. package/dist/CHANGELOG-forge-plugin.md +90 -0
  4. package/dist/bin/config.js +6 -0
  5. package/dist/bin/config.js.map +1 -1
  6. package/dist/extensions/forgecli/add-pipeline.d.ts +19 -0
  7. package/dist/extensions/forgecli/add-pipeline.js +143 -0
  8. package/dist/extensions/forgecli/add-pipeline.js.map +1 -0
  9. package/dist/extensions/forgecli/add-task.d.ts +20 -0
  10. package/dist/extensions/forgecli/add-task.js +154 -0
  11. package/dist/extensions/forgecli/add-task.js.map +1 -0
  12. package/dist/extensions/forgecli/calibrate.d.ts +61 -0
  13. package/dist/extensions/forgecli/calibrate.js +488 -0
  14. package/dist/extensions/forgecli/calibrate.js.map +1 -0
  15. package/dist/extensions/forgecli/fix-bug.d.ts +9 -1
  16. package/dist/extensions/forgecli/fix-bug.js +155 -45
  17. package/dist/extensions/forgecli/fix-bug.js.map +1 -1
  18. package/dist/extensions/forgecli/forge-commands.js +15 -22
  19. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  20. package/dist/extensions/forgecli/forge-subagent.d.ts +16 -1
  21. package/dist/extensions/forgecli/forge-subagent.js +45 -8
  22. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  23. package/dist/extensions/forgecli/forge-update-command.d.ts +9 -0
  24. package/dist/extensions/forgecli/forge-update-command.js +106 -7
  25. package/dist/extensions/forgecli/forge-update-command.js.map +1 -1
  26. package/dist/extensions/forgecli/health-check.d.ts +22 -1
  27. package/dist/extensions/forgecli/health-check.js +177 -4
  28. package/dist/extensions/forgecli/health-check.js.map +1 -1
  29. package/dist/extensions/forgecli/hook-dispatcher.d.ts +25 -1
  30. package/dist/extensions/forgecli/hook-dispatcher.js +104 -9
  31. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  32. package/dist/extensions/forgecli/hooks/check-update.d.ts +81 -0
  33. package/dist/extensions/forgecli/hooks/check-update.js +308 -0
  34. package/dist/extensions/forgecli/hooks/check-update.js.map +1 -0
  35. package/dist/extensions/forgecli/hooks/forge-permissions.d.ts +32 -0
  36. package/dist/extensions/forgecli/hooks/forge-permissions.js +119 -0
  37. package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -0
  38. package/dist/extensions/forgecli/hooks/triage-error.d.ts +23 -0
  39. package/dist/extensions/forgecli/hooks/triage-error.js +62 -0
  40. package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -0
  41. package/dist/extensions/forgecli/hooks/write-guard.d.ts +28 -0
  42. package/dist/extensions/forgecli/hooks/write-guard.js +225 -0
  43. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -0
  44. package/dist/extensions/forgecli/index.js +60 -0
  45. package/dist/extensions/forgecli/index.js.map +1 -1
  46. package/dist/extensions/forgecli/init-context.d.ts +1 -1
  47. package/dist/extensions/forgecli/init-context.js +21 -6
  48. package/dist/extensions/forgecli/init-context.js.map +1 -1
  49. package/dist/extensions/forgecli/materialize.d.ts +16 -0
  50. package/dist/extensions/forgecli/materialize.js +195 -0
  51. package/dist/extensions/forgecli/materialize.js.map +1 -0
  52. package/dist/extensions/forgecli/migrate.d.ts +19 -0
  53. package/dist/extensions/forgecli/migrate.js +258 -0
  54. package/dist/extensions/forgecli/migrate.js.map +1 -0
  55. package/dist/extensions/forgecli/migration-engine.d.ts +111 -0
  56. package/dist/extensions/forgecli/migration-engine.js +533 -0
  57. package/dist/extensions/forgecli/migration-engine.js.map +1 -0
  58. package/dist/extensions/forgecli/quiz-agent.d.ts +17 -0
  59. package/dist/extensions/forgecli/quiz-agent.js +98 -0
  60. package/dist/extensions/forgecli/quiz-agent.js.map +1 -0
  61. package/dist/extensions/forgecli/remove-command.d.ts +17 -0
  62. package/dist/extensions/forgecli/remove-command.js +124 -0
  63. package/dist/extensions/forgecli/remove-command.js.map +1 -0
  64. package/dist/extensions/forgecli/report-bug.d.ts +25 -0
  65. package/dist/extensions/forgecli/report-bug.js +159 -0
  66. package/dist/extensions/forgecli/report-bug.js.map +1 -0
  67. package/dist/extensions/forgecli/retrospective.d.ts +19 -0
  68. package/dist/extensions/forgecli/retrospective.js +156 -0
  69. package/dist/extensions/forgecli/retrospective.js.map +1 -0
  70. package/dist/extensions/forgecli/run-sprint.js +36 -3
  71. package/dist/extensions/forgecli/run-sprint.js.map +1 -1
  72. package/dist/extensions/forgecli/run-task.d.ts +9 -1
  73. package/dist/extensions/forgecli/run-task.js +66 -13
  74. package/dist/extensions/forgecli/run-task.js.map +1 -1
  75. package/dist/extensions/forgecli/session-registry.d.ts +40 -2
  76. package/dist/extensions/forgecli/session-registry.js +71 -1
  77. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  78. package/dist/extensions/forgecli/status-command.d.ts +19 -0
  79. package/dist/extensions/forgecli/status-command.js +140 -0
  80. package/dist/extensions/forgecli/status-command.js.map +1 -0
  81. package/dist/extensions/forgecli/store-query.d.ts +22 -0
  82. package/dist/extensions/forgecli/store-query.js +107 -0
  83. package/dist/extensions/forgecli/store-query.js.map +1 -0
  84. package/dist/extensions/forgecli/store-repair.d.ts +17 -0
  85. package/dist/extensions/forgecli/store-repair.js +123 -0
  86. package/dist/extensions/forgecli/store-repair.js.map +1 -0
  87. package/dist/extensions/forgecli/test-orchestrate.js +1 -0
  88. package/dist/extensions/forgecli/test-orchestrate.js.map +1 -1
  89. package/dist/extensions/forgecli/thread-switcher.js +286 -41
  90. package/dist/extensions/forgecli/thread-switcher.js.map +1 -1
  91. package/dist/extensions/forgecli/transition-guard.js +7 -2
  92. package/dist/extensions/forgecli/transition-guard.js.map +1 -1
  93. package/dist/extensions/forgecli/update-tools.d.ts +23 -0
  94. package/dist/extensions/forgecli/update-tools.js +136 -0
  95. package/dist/extensions/forgecli/update-tools.js.map +1 -0
  96. package/dist/extensions/forgecli/viewport-events.js +10 -0
  97. package/dist/extensions/forgecli/viewport-events.js.map +1 -1
  98. package/dist/extensions/forgecli/viewport-renderer.d.ts +18 -0
  99. package/dist/extensions/forgecli/viewport-renderer.js +27 -0
  100. package/dist/extensions/forgecli/viewport-renderer.js.map +1 -1
  101. package/dist/extensions/forgecli/viewport-theme.js +4 -0
  102. package/dist/extensions/forgecli/viewport-theme.js.map +1 -1
  103. package/dist/extensions/forgecli/whats-new-widget.d.ts +13 -8
  104. package/dist/extensions/forgecli/whats-new-widget.js +111 -42
  105. package/dist/extensions/forgecli/whats-new-widget.js.map +1 -1
  106. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +29 -3
  107. package/dist/forge-payload/.base-pack/workflows/commit_task.md +15 -8
  108. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +327 -185
  109. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +18 -10
  110. package/dist/forge-payload/.base-pack/workflows/plan_task.md +15 -9
  111. package/dist/forge-payload/.base-pack/workflows/review_code.md +14 -6
  112. package/dist/forge-payload/.base-pack/workflows/review_plan.md +18 -10
  113. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  114. package/dist/forge-payload/.schemas/bug.schema.json +3 -2
  115. package/dist/forge-payload/.schemas/config.schema.json +83 -0
  116. package/dist/forge-payload/.schemas/migrations.json +2049 -0
  117. package/dist/forge-payload/commands/regenerate.md +17 -1
  118. package/dist/forge-payload/meta/personas/README.md +16 -0
  119. package/dist/forge-payload/meta/personas/meta-architect.md +70 -0
  120. package/dist/forge-payload/meta/personas/meta-bug-fixer.md +73 -0
  121. package/dist/forge-payload/meta/personas/meta-collator.md +72 -0
  122. package/dist/forge-payload/meta/personas/meta-engineer.md +70 -0
  123. package/dist/forge-payload/meta/personas/meta-orchestrator.md +71 -0
  124. package/dist/forge-payload/meta/personas/meta-product-manager.md +82 -0
  125. package/dist/forge-payload/meta/personas/meta-qa-engineer.md +91 -0
  126. package/dist/forge-payload/meta/personas/meta-supervisor.md +92 -0
  127. package/dist/forge-payload/meta/skill-recommendations.md +154 -0
  128. package/dist/forge-payload/meta/skills/meta-architect-skills.md +43 -0
  129. package/dist/forge-payload/meta/skills/meta-bug-fixer-skills.md +43 -0
  130. package/dist/forge-payload/meta/skills/meta-collator-skills.md +41 -0
  131. package/dist/forge-payload/meta/skills/meta-engineer-skills.md +43 -0
  132. package/dist/forge-payload/meta/skills/meta-generic-skills.md +58 -0
  133. package/dist/forge-payload/meta/skills/meta-qa-engineer-skills.md +46 -0
  134. package/dist/forge-payload/meta/skills/meta-supervisor-skills.md +43 -0
  135. package/dist/forge-payload/meta/store-schema/bug.schema.md +71 -0
  136. package/dist/forge-payload/meta/store-schema/event.schema.md +76 -0
  137. package/dist/forge-payload/meta/store-schema/feature.schema.md +65 -0
  138. package/dist/forge-payload/meta/store-schema/sprint.schema.md +64 -0
  139. package/dist/forge-payload/meta/store-schema/task.schema.md +78 -0
  140. package/dist/forge-payload/meta/templates/meta-code-review.md +26 -0
  141. package/dist/forge-payload/meta/templates/meta-plan-review.md +28 -0
  142. package/dist/forge-payload/meta/templates/meta-plan.md +28 -0
  143. package/dist/forge-payload/meta/templates/meta-progress.md +25 -0
  144. package/dist/forge-payload/meta/templates/meta-retrospective.md +28 -0
  145. package/dist/forge-payload/meta/templates/meta-sprint-manifest.md +26 -0
  146. package/dist/forge-payload/meta/templates/meta-sprint-requirements.md +91 -0
  147. package/dist/forge-payload/meta/templates/meta-task-prompt.md +26 -0
  148. package/dist/forge-payload/meta/tool-specs/collate.spec.md +88 -0
  149. package/dist/forge-payload/meta/tool-specs/generation-manifest.spec.md +139 -0
  150. package/dist/forge-payload/meta/tool-specs/manage-config.spec.md +143 -0
  151. package/dist/forge-payload/meta/tool-specs/seed-store.spec.md +91 -0
  152. package/dist/forge-payload/meta/tool-specs/store-cli.spec.md +328 -0
  153. package/dist/forge-payload/meta/tool-specs/validate-store.spec.md +191 -0
  154. package/dist/forge-payload/meta/workflows/_fragments/context-injection.md +75 -0
  155. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +73 -0
  156. package/dist/forge-payload/meta/workflows/_fragments/finalize.md +13 -0
  157. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +73 -0
  158. package/dist/forge-payload/meta/workflows/_fragments/progress-reporting.md +38 -0
  159. package/dist/forge-payload/meta/workflows/_fragments/store-cli-verbs.md +39 -0
  160. package/dist/forge-payload/meta/workflows/meta-approve.md +119 -0
  161. package/dist/forge-payload/meta/workflows/meta-collate.md +89 -0
  162. package/dist/forge-payload/meta/workflows/meta-commit.md +93 -0
  163. package/dist/forge-payload/meta/workflows/meta-enhance.md +286 -0
  164. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +501 -0
  165. package/dist/forge-payload/meta/workflows/meta-implement.md +132 -0
  166. package/dist/forge-payload/meta/workflows/meta-migrate.md +455 -0
  167. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +993 -0
  168. package/dist/forge-payload/meta/workflows/meta-plan-task.md +133 -0
  169. package/dist/forge-payload/meta/workflows/meta-quiz-agent.md +135 -0
  170. package/dist/forge-payload/meta/workflows/meta-retrospective.md +65 -0
  171. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +119 -0
  172. package/dist/forge-payload/meta/workflows/meta-review-plan.md +108 -0
  173. package/dist/forge-payload/meta/workflows/meta-review-sprint-completion.md +65 -0
  174. package/dist/forge-payload/meta/workflows/meta-sprint-intake.md +76 -0
  175. package/dist/forge-payload/meta/workflows/meta-sprint-plan.md +147 -0
  176. package/dist/forge-payload/meta/workflows/meta-update-implementation.md +76 -0
  177. package/dist/forge-payload/meta/workflows/meta-update-plan.md +76 -0
  178. package/dist/forge-payload/meta/workflows/meta-validate.md +111 -0
  179. package/dist/forge-payload/tools/check-structure.cjs +344 -0
  180. package/dist/forge-payload/tools/collate.cjs +34 -9
  181. package/dist/forge-payload/tools/list-skills.js +76 -0
  182. package/dist/forge-payload/tools/parse-gates.cjs +8 -2
  183. package/dist/forge-payload/tools/store-cli.cjs +56 -11
  184. package/dist/forge-payload/tools/store.cjs +61 -0
  185. package/dist/forge-payload/tools/substitute-placeholders.cjs +60 -8
  186. package/dist/forge-payload/tools/validate-store.cjs +6 -2
  187. package/dist/forge-payload/tools/verify-integrity.cjs +86 -0
  188. package/package.json +2 -2
@@ -27,7 +27,8 @@ deps:
27
27
 
28
28
  0. Pre-flight Gate Check:
29
29
  - Resolve FORGE_ROOT (`node -e "console.log(require('./.forge/config.json').paths.forgeRoot)"`).
30
- - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase implement --task {taskId}`
30
+ - **Entity-mode resolution:** read the kickoff arguments. `--task {id}` → `entity_kind = "task"`, `record_id = {id}`. `--bug {id}` → `entity_kind = "bug"`, `record_id = {id}`. All store-cli calls below substitute `{entity_kind}` and `{record_id}` for the literal "task"/{taskId} placeholders.
31
+ - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase implement --{entity_kind} {record_id}`
31
32
  - Exit 1 (gate failed) → print stderr and HALT. Do not proceed; do not attempt to produce the artifact.
32
33
  - Exit 2 (misconfiguration) → print stderr and HALT.
33
34
  - Exit 0 → continue.
@@ -59,15 +60,17 @@ deps:
59
60
  - Tag updates: `<!-- Discovered during {TASK_ID} — {date} -->`
60
61
 
61
62
  6. Finalize:
62
- - Transitions: task FSM legal predecessors are `planned`, `plan-approved`, or `implementing`; target is `implemented`.
63
- - `planned` `implemented` (workflow-prose path — direct)
64
- - `plan-approved` → `implementing` → `implemented` (supervisor-review path)
65
- - Out-of-band escapes (any state): `plan-revision-required`, `code-revision-required`, `blocked`, `escalated`, `abandoned`
66
- - Update task status via `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status implemented`
63
+ - Transitions:
64
+ - **Task mode** — legal predecessors are `planned`, `plan-approved`, or `implementing`; target is `implemented`.
65
+ - `planned` → `implemented` (workflow-prose path — direct)
66
+ - `plan-approved` `implementing` `implemented` (supervisor-review path)
67
+ - Out-of-band escapes (any state): `plan-revision-required`, `code-revision-required`, `blocked`, `escalated`, `abandoned`
68
+ Update status: `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status implemented`
69
+ - **Bug mode** — NO status write. The bug remains `in-progress` until the commit phase transitions it to `fixed`. Writing `bug.status` here violates `meta-fix-bug.md § Iron Laws #2`.
67
70
  - **Do NOT emit a phase event yourself.** The orchestrator owns event emission — it composes the canonical event from runtime telemetry (model, provider, tokens, wall times) plus the SUMMARY you write in the next step. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (see Plan 11 / Slice 2). Write the SUMMARY and return.
68
71
 
69
72
  7. Emit Summary Sidecar:
70
- - Write `IMPLEMENTATION-SUMMARY.json` to the task directory with the following shape:
73
+ - Write `IMPLEMENTATION-SUMMARY.json` to the record's directory with the following shape:
71
74
  ```json
72
75
  {
73
76
  "objective": "<one sentence — what this implementation delivered>",
@@ -77,12 +80,17 @@ deps:
77
80
  "artifact_ref":"PROGRESS.md"
78
81
  }
79
82
  ```
80
- - Call:
83
+ - Call (task mode):
81
84
  ```
82
- node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} implementation \
85
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} implementation \
83
86
  engineering/sprints/{sprint}/{task}/IMPLEMENTATION-SUMMARY.json
84
87
  ```
85
- - If set-summary exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
88
+ Or (bug mode):
89
+ ```
90
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} implementation \
91
+ engineering/bugs/{bugDir}/IMPLEMENTATION-SUMMARY.json
92
+ ```
93
+ - If the set-summary call exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
86
94
  ```
87
95
 
88
96
  ## Iron Laws
@@ -27,7 +27,8 @@ deps:
27
27
 
28
28
  0. Pre-flight Gate Check:
29
29
  - Resolve FORGE_ROOT (`node -e "console.log(require('./.forge/config.json').paths.forgeRoot)"`).
30
- - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase plan --task {taskId}`
30
+ - **Entity-mode resolution:** read the kickoff arguments. `--task {id}` → `entity_kind = "task"`, `record_id = {id}`. `--bug {id}` → `entity_kind = "bug"`, `record_id = {id}`. All store-cli calls below substitute `{entity_kind}` and `{record_id}` for the literal "task"/{taskId} placeholders.
31
+ - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase plan --{entity_kind} {record_id}`
31
32
  - Exit 1 (gate failed) → print stderr and HALT. Do not proceed; do not attempt to produce the artifact.
32
33
  - Exit 2 (misconfiguration) → print stderr and HALT.
33
34
  - Exit 0 → continue.
@@ -64,14 +65,14 @@ deps:
64
65
  - If new patterns were discovered, update architecture or business domain docs
65
66
 
66
67
  5. Finalize:
67
- - Transitions: task FSM legal targets from this step
68
- - `draft``planned` (this workflow's only legal target)
69
- - Out-of-band escapes (any state): `plan-revision-required`, `code-revision-required`, `blocked`, `escalated`, `abandoned`
70
- - Update task status via `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status planned`
68
+ - Transitions:
69
+ - **Task mode** — legal target from this step: `draft → planned`. Out-of-band escapes (any state): `plan-revision-required`, `code-revision-required`, `blocked`, `escalated`, `abandoned`.
70
+ Update status: `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status planned`
71
+ - **Bug mode** — NO status write. The bug remains `in-progress` until the commit phase transitions it to `fixed`. Writing `bug.status` here violates `meta-fix-bug.md § Iron Laws #2`.
71
72
  - **Do NOT emit a phase event yourself.** The orchestrator owns event emission — it composes the canonical event from runtime telemetry (model, provider, tokens, wall times) plus the SUMMARY you write in the next step. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (see Plan 11 / Slice 2). Write the SUMMARY and return.
72
73
 
73
74
  6. Emit Summary Sidecar:
74
- - Write `PLAN-SUMMARY.json` to the task directory with the following shape:
75
+ - Write `PLAN-SUMMARY.json` (task mode) or `BUG-FIX-PLAN-SUMMARY.json` (bug mode) to the record's directory. Shape:
75
76
  ```json
76
77
  {
77
78
  "objective": "<one sentence — what this plan sets out to build>",
@@ -81,12 +82,17 @@ deps:
81
82
  "artifact_ref":"PLAN.md"
82
83
  }
83
84
  ```
84
- - Call:
85
+ - Call (task mode):
85
86
  ```
86
- node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} plan \
87
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} plan \
87
88
  engineering/sprints/{sprint}/{task}/PLAN-SUMMARY.json
88
89
  ```
89
- - If set-summary exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
90
+ Or (bug mode):
91
+ ```
92
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} plan \
93
+ engineering/bugs/{bugDir}/BUG-FIX-PLAN-SUMMARY.json
94
+ ```
95
+ - If the set-summary call exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
90
96
  ```
91
97
 
92
98
  ## Iron Laws
@@ -45,7 +45,8 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
45
45
 
46
46
  0. Pre-flight Gate Check:
47
47
  - Resolve FORGE_ROOT (`node -e "console.log(require('./.forge/config.json').paths.forgeRoot)"`).
48
- - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase review-code --task {taskId}`
48
+ - **Entity-mode resolution:** read the kickoff arguments. `--task {id}` → `entity_kind = "task"`, `record_id = {id}`. `--bug {id}` → `entity_kind = "bug"`, `record_id = {id}`. All store-cli calls below substitute `{entity_kind}` and `{record_id}` for the literal "task"/{taskId} placeholders.
49
+ - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase review-code --{entity_kind} {record_id}`
49
50
  - Exit 1 (gate failed) → print stderr and HALT. Do not proceed; do not attempt to produce the artifact.
50
51
  - Exit 2 (misconfiguration) → print stderr and HALT.
51
52
  - Exit 0 → continue.
@@ -71,11 +72,13 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
71
72
  - Update stack-checklist.md if new patterns or pitfalls were discovered
72
73
 
73
74
  5. Finalize:
74
- - Update task status via `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status review-approved` (if Approved) or `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status code-revision-required` (if Revision Required)
75
+ - Transitions:
76
+ - **Task mode** — Update status: `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status review-approved` (if Approved) or `... status code-revision-required` (if Revision Required).
77
+ - **Bug mode** — NO status write. The bug remains `in-progress`. The verdict signal travels through `summaries.code_review.verdict` (read by `read-verdict.cjs § BUG_PHASE_VERDICT_SOURCE`), not `bug.status`. Writing `bug.status` here violates `meta-fix-bug.md § Iron Laws #2`.
75
78
  - **Do NOT emit a phase event yourself.** The orchestrator (or kickoff handler) owns event emission — it composes the canonical event from runtime telemetry (model, provider, tokens, wall times) plus the SUMMARY you write in the next step. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (see Plan 11 / Slice 2). Write the SUMMARY and return.
76
79
 
77
80
  6. Emit Summary Sidecar:
78
- - Write `REVIEW-IMPL-SUMMARY.json` to the task directory with the following shape:
81
+ - Write `REVIEW-IMPL-SUMMARY.json` to the record's directory with the following shape:
79
82
  ```json
80
83
  {
81
84
  "objective": "<one sentence — what this review assessed>",
@@ -85,10 +88,15 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
85
88
  "artifact_ref":"CODE_REVIEW.md"
86
89
  }
87
90
  ```
88
- - Call:
91
+ - Call (task mode):
89
92
  ```
90
- node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} code_review \
93
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} code_review \
91
94
  engineering/sprints/{sprint}/{task}/REVIEW-IMPL-SUMMARY.json
92
95
  ```
93
- - If set-summary exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
96
+ Or (bug mode):
97
+ ```
98
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} code_review \
99
+ engineering/bugs/{bugDir}/REVIEW-IMPL-SUMMARY.json
100
+ ```
101
+ - If the set-summary call exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
94
102
  ```
@@ -46,7 +46,8 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
46
46
 
47
47
  0. Pre-flight Gate Check:
48
48
  - Resolve FORGE_ROOT (`node -e "console.log(require('./.forge/config.json').paths.forgeRoot)"`).
49
- - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase review-plan --task {taskId}`
49
+ - **Entity-mode resolution:** read the kickoff arguments. `--task {id}` → `entity_kind = "task"`, `record_id = {id}`. `--bug {id}` → `entity_kind = "bug"`, `record_id = {id}`. All store-cli calls below substitute `{entity_kind}` and `{record_id}` for the literal "task"/{taskId} placeholders.
50
+ - Run: `node "$FORGE_ROOT/tools/preflight-gate.cjs" --phase review-plan --{entity_kind} {record_id}`
50
51
  - Exit 1 (gate failed) → print stderr and HALT. Do not proceed; do not attempt to produce the artifact.
51
52
  - Exit 2 (misconfiguration) → print stderr and HALT.
52
53
  - Exit 0 → continue.
@@ -66,15 +67,17 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
66
67
  - If Approved: provide any advisory notes
67
68
 
68
69
  4. Finalize:
69
- - Transitions: task FSM predecessor must be `planned`.
70
- - Approved → `plan-approved`
71
- - Revision Required → `plan-revision-required`
72
- - Out-of-band escapes (any state): `code-revision-required`, `blocked`, `escalated`, `abandoned`
73
- - Update task status via `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status plan-approved` (if Approved) or `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status plan-revision-required` (if Revision Required)
70
+ - Transitions:
71
+ - **Task mode** — predecessor must be `planned`.
72
+ - Approved → `plan-approved`
73
+ - Revision Required `plan-revision-required`
74
+ - Out-of-band escapes (any state): `code-revision-required`, `blocked`, `escalated`, `abandoned`
75
+ Update status: `node "$FORGE_ROOT/tools/store-cli.cjs" update-status task {taskId} status plan-approved` (if Approved) or `... status plan-revision-required` (if Revision Required)
76
+ - **Bug mode** — NO status write. The bug remains `in-progress`. The verdict signal travels through `summaries.review_plan.verdict` (read by `read-verdict.cjs § BUG_PHASE_VERDICT_SOURCE`), not `bug.status`. Writing `bug.status` here violates `meta-fix-bug.md § Iron Laws #2`.
74
77
  - **Do NOT emit a phase event yourself.** The orchestrator owns event emission — it composes the canonical event from runtime telemetry (model, provider, tokens, wall times) plus the SUMMARY you write in the next step. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (see Plan 11 / Slice 2). Write the SUMMARY and return.
75
78
 
76
79
  5. Emit Summary Sidecar:
77
- - Write `REVIEW-PLAN-SUMMARY.json` to the task directory with the following shape:
80
+ - Write `REVIEW-PLAN-SUMMARY.json` to the record's directory with the following shape:
78
81
  ```json
79
82
  {
80
83
  "objective": "<one sentence — what this review assessed>",
@@ -84,12 +87,17 @@ Never set `FORGE_SKIP_WRITE_VALIDATION=1` — operator-only emergency switch.
84
87
  "artifact_ref":"PLAN_REVIEW.md"
85
88
  }
86
89
  ```
87
- - Call:
90
+ - Call (task mode):
88
91
  ```
89
- node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {task_id} review_plan \
92
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-summary {taskId} review_plan \
90
93
  engineering/sprints/{sprint}/{task}/REVIEW-PLAN-SUMMARY.json
91
94
  ```
92
- - If set-summary exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
95
+ Or (bug mode):
96
+ ```
97
+ node "$FORGE_ROOT/tools/store-cli.cjs" set-bug-summary {bugId} review_plan \
98
+ engineering/bugs/{bugDir}/REVIEW-PLAN-SUMMARY.json
99
+ ```
100
+ - If the set-summary call exits non-zero, fix the sidecar JSON and retry. Do not proceed without a valid summary.
93
101
  ```
94
102
 
95
103
  ## Generation Notes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge",
3
- "version": "0.43.19",
3
+ "version": "0.44.6",
4
4
  "description": "Self-enhancing AI software development lifecycle \u2014 generates project-specific SDLC instances from meta-definitions",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -9,7 +9,7 @@
9
9
  "title": { "type": "string" },
10
10
  "description": { "type": "string" },
11
11
  "severity": { "type": "string", "enum": ["critical", "major", "minor"] },
12
- "status": { "type": "string", "enum": ["reported", "triaged", "in-progress", "fixed", "approved", "verified"] },
12
+ "status": { "type": "string", "enum": ["reported", "triaged", "in-progress", "fixed"] },
13
13
  "path": { "type": "string" },
14
14
  "rootCauseCategory": {
15
15
  "type": "string",
@@ -47,7 +47,8 @@
47
47
  "findings": { "type": "array", "items": { "type": "string", "maxLength": 200 }, "maxItems": 12 },
48
48
  "verdict": { "type": "string", "enum": ["approved", "revision", "n/a"] },
49
49
  "written_at": { "type": "string", "format": "date-time" },
50
- "artifact_ref":{ "type": "string", "description": "Relative path to the full artifact" }
50
+ "artifact_ref":{ "type": "string", "description": "Relative path to the full artifact" },
51
+ "route": { "type": "string", "enum": ["A", "B"], "description": "Fix-bug pipeline route decision. Only set on the triage phase summary by meta-fix-bug.md. A = short-circuit (skip plan-fix + review-plan); B = full loop (default). Optional and meaningless on non-triage phases — see meta-fix-bug.md § Triage Judgement." }
51
52
  },
52
53
  "additionalProperties": false
53
54
  }
@@ -0,0 +1,83 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "forge/config.schema.json",
4
+ "title": "ForgeConfig",
5
+ "description": "Schema for .forge/config.json — the per-project Forge configuration file.",
6
+ "type": "object",
7
+ "required": ["version", "project", "paths"],
8
+ "properties": {
9
+ "version": {
10
+ "type": "string",
11
+ "description": "Config schema version (e.g. '1.0')"
12
+ },
13
+ "project": {
14
+ "type": "object",
15
+ "required": ["prefix", "name"],
16
+ "properties": {
17
+ "prefix": { "type": "string", "description": "Task ID prefix (e.g. FORGE)" },
18
+ "name": { "type": "string", "description": "Human-readable project name" },
19
+ "description": { "type": "string" }
20
+ }
21
+ },
22
+ "stack": {
23
+ "type": "object",
24
+ "properties": {
25
+ "languages": { "type": "array", "items": { "type": "string" } },
26
+ "framework": { "type": ["string", "null"] },
27
+ "frontendFramework": { "type": ["string", "null"] },
28
+ "database": { "type": ["string", "null"] },
29
+ "taskQueue": { "type": ["string", "null"] },
30
+ "containerisation": { "type": ["string", "null"] }
31
+ }
32
+ },
33
+ "commands": {
34
+ "type": "object",
35
+ "properties": {
36
+ "test": { "type": "string" },
37
+ "lint": { "type": "string" },
38
+ "syntaxCheck": {}
39
+ }
40
+ },
41
+ "paths": {
42
+ "type": "object",
43
+ "required": ["engineering", "store", "forgeRoot"],
44
+ "properties": {
45
+ "engineering": { "type": "string" },
46
+ "store": { "type": "string" },
47
+ "workflows": { "type": "string" },
48
+ "commands": { "type": "string" },
49
+ "templates": { "type": "string" },
50
+ "customCommands": { "type": "string" },
51
+ "forgeRoot": { "type": "string" },
52
+ "forgeRef": { "type": "string" }
53
+ }
54
+ },
55
+ "pipeline": {
56
+ "type": "object",
57
+ "properties": {
58
+ "maxReviewIterations": { "type": "integer", "minimum": 1 }
59
+ }
60
+ },
61
+ "pipelines": {
62
+ "type": "object",
63
+ "description": "Custom pipeline definitions keyed by pipeline name"
64
+ },
65
+ "installedSkills": {
66
+ "type": "array",
67
+ "items": { "type": "string" }
68
+ },
69
+ "calibrationBaseline": {
70
+ "type": "object",
71
+ "properties": {
72
+ "lastCalibrated": { "type": "string" },
73
+ "version": { "type": "string" },
74
+ "masterIndexHash": { "type": "string" },
75
+ "sprintsCovered": { "type": "array", "items": { "type": "string" } }
76
+ }
77
+ },
78
+ "mode": {
79
+ "type": "string",
80
+ "enum": ["full", "fast"]
81
+ }
82
+ }
83
+ }