@entelligentsia/forgecli 1.0.21 → 1.0.25

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 (232) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/CHANGELOG-forge-plugin.md +118 -0
  3. package/dist/extensions/forgecli/forge-tools.d.ts +1 -0
  4. package/dist/extensions/forgecli/forge-tools.js +73 -0
  5. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  6. package/dist/extensions/forgecli/lib/forge-root.d.ts +5 -0
  7. package/dist/extensions/forgecli/lib/forge-root.js +14 -1
  8. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
  9. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +1 -0
  10. package/dist/extensions/forgecli/orchestrators/fix-bug.js +26 -0
  11. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -1
  12. package/dist/extensions/forgecli/orchestrators/run-sprint.js +49 -0
  13. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -1
  14. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
  15. package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
  16. package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
  17. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
  18. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
  19. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
  20. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  21. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  22. package/dist/forge-payload/.schemas/event.schema.json +8 -3
  23. package/dist/forge-payload/.schemas/migrations.json +56 -0
  24. package/dist/forge-payload/integrity.json +3 -3
  25. package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
  26. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
  27. package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
  28. package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
  29. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
  30. package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
  31. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
  32. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  33. package/dist/forge-payload/schemas/event.schema.json +8 -3
  34. package/dist/forge-payload/schemas/structure-manifest.json +4 -2
  35. package/dist/forge-payload/tools/commit-task.cjs +218 -0
  36. package/dist/forge-payload/tools/store-cli.cjs +6 -1
  37. package/node_modules/@mariozechner/clipboard/package.json +2 -1
  38. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
  39. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
  40. package/package.json +2 -2
  41. package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
  42. package/dist/extensions/forgecli/add-pipeline.js +0 -143
  43. package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
  44. package/dist/extensions/forgecli/add-task.d.ts +0 -20
  45. package/dist/extensions/forgecli/add-task.js +0 -154
  46. package/dist/extensions/forgecli/add-task.js.map +0 -1
  47. package/dist/extensions/forgecli/approve.d.ts +0 -22
  48. package/dist/extensions/forgecli/approve.js +0 -152
  49. package/dist/extensions/forgecli/approve.js.map +0 -1
  50. package/dist/extensions/forgecli/banner.d.ts +0 -10
  51. package/dist/extensions/forgecli/banner.js +0 -36
  52. package/dist/extensions/forgecli/banner.js.map +0 -1
  53. package/dist/extensions/forgecli/calibrate.d.ts +0 -64
  54. package/dist/extensions/forgecli/calibrate.js +0 -481
  55. package/dist/extensions/forgecli/calibrate.js.map +0 -1
  56. package/dist/extensions/forgecli/collate.d.ts +0 -22
  57. package/dist/extensions/forgecli/collate.js +0 -134
  58. package/dist/extensions/forgecli/collate.js.map +0 -1
  59. package/dist/extensions/forgecli/commit.d.ts +0 -22
  60. package/dist/extensions/forgecli/commit.js +0 -152
  61. package/dist/extensions/forgecli/commit.js.map +0 -1
  62. package/dist/extensions/forgecli/config-command.d.ts +0 -8
  63. package/dist/extensions/forgecli/config-command.js +0 -67
  64. package/dist/extensions/forgecli/config-command.js.map +0 -1
  65. package/dist/extensions/forgecli/config-layer.d.ts +0 -53
  66. package/dist/extensions/forgecli/config-layer.js +0 -72
  67. package/dist/extensions/forgecli/config-layer.js.map +0 -1
  68. package/dist/extensions/forgecli/config-writer.d.ts +0 -16
  69. package/dist/extensions/forgecli/config-writer.js +0 -69
  70. package/dist/extensions/forgecli/config-writer.js.map +0 -1
  71. package/dist/extensions/forgecli/enhance.d.ts +0 -27
  72. package/dist/extensions/forgecli/enhance.js +0 -199
  73. package/dist/extensions/forgecli/enhance.js.map +0 -1
  74. package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
  75. package/dist/extensions/forgecli/fix-bug.js +0 -1580
  76. package/dist/extensions/forgecli/fix-bug.js.map +0 -1
  77. package/dist/extensions/forgecli/forge-header.d.ts +0 -12
  78. package/dist/extensions/forgecli/forge-header.js +0 -114
  79. package/dist/extensions/forgecli/forge-header.js.map +0 -1
  80. package/dist/extensions/forgecli/forge-init.d.ts +0 -26
  81. package/dist/extensions/forgecli/forge-init.js +0 -514
  82. package/dist/extensions/forgecli/forge-init.js.map +0 -1
  83. package/dist/extensions/forgecli/forge-root.d.ts +0 -10
  84. package/dist/extensions/forgecli/forge-root.js +0 -62
  85. package/dist/extensions/forgecli/forge-root.js.map +0 -1
  86. package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
  87. package/dist/extensions/forgecli/forge-update-command.js +0 -435
  88. package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
  89. package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
  90. package/dist/extensions/forgecli/friction-emit.js +0 -245
  91. package/dist/extensions/forgecli/friction-emit.js.map +0 -1
  92. package/dist/extensions/forgecli/implement.d.ts +0 -22
  93. package/dist/extensions/forgecli/implement.js +0 -170
  94. package/dist/extensions/forgecli/implement.js.map +0 -1
  95. package/dist/extensions/forgecli/init-context.d.ts +0 -99
  96. package/dist/extensions/forgecli/init-context.js +0 -178
  97. package/dist/extensions/forgecli/init-context.js.map +0 -1
  98. package/dist/extensions/forgecli/init-progress.d.ts +0 -39
  99. package/dist/extensions/forgecli/init-progress.js +0 -117
  100. package/dist/extensions/forgecli/init-progress.js.map +0 -1
  101. package/dist/extensions/forgecli/input-router.d.ts +0 -33
  102. package/dist/extensions/forgecli/input-router.js +0 -136
  103. package/dist/extensions/forgecli/input-router.js.map +0 -1
  104. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
  105. package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
  106. package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
  107. package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
  108. package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
  109. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
  110. package/dist/extensions/forgecli/materialize.d.ts +0 -16
  111. package/dist/extensions/forgecli/materialize.js +0 -195
  112. package/dist/extensions/forgecli/materialize.js.map +0 -1
  113. package/dist/extensions/forgecli/migrate.d.ts +0 -22
  114. package/dist/extensions/forgecli/migrate.js +0 -260
  115. package/dist/extensions/forgecli/migrate.js.map +0 -1
  116. package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
  117. package/dist/extensions/forgecli/migration-engine.js +0 -563
  118. package/dist/extensions/forgecli/migration-engine.js.map +0 -1
  119. package/dist/extensions/forgecli/model-registry.d.ts +0 -61
  120. package/dist/extensions/forgecli/model-registry.js +0 -127
  121. package/dist/extensions/forgecli/model-registry.js.map +0 -1
  122. package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
  123. package/dist/extensions/forgecli/model-resolver.js +0 -65
  124. package/dist/extensions/forgecli/model-resolver.js.map +0 -1
  125. package/dist/extensions/forgecli/model-validator.d.ts +0 -29
  126. package/dist/extensions/forgecli/model-validator.js +0 -107
  127. package/dist/extensions/forgecli/model-validator.js.map +0 -1
  128. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
  129. package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
  130. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
  131. package/dist/extensions/forgecli/plan.d.ts +0 -22
  132. package/dist/extensions/forgecli/plan.js +0 -167
  133. package/dist/extensions/forgecli/plan.js.map +0 -1
  134. package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
  135. package/dist/extensions/forgecli/quiz-agent.js +0 -98
  136. package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
  137. package/dist/extensions/forgecli/read-command.d.ts +0 -2
  138. package/dist/extensions/forgecli/read-command.js +0 -100
  139. package/dist/extensions/forgecli/read-command.js.map +0 -1
  140. package/dist/extensions/forgecli/regenerate.d.ts +0 -40
  141. package/dist/extensions/forgecli/regenerate.js +0 -438
  142. package/dist/extensions/forgecli/regenerate.js.map +0 -1
  143. package/dist/extensions/forgecli/remove-command.d.ts +0 -17
  144. package/dist/extensions/forgecli/remove-command.js +0 -124
  145. package/dist/extensions/forgecli/remove-command.js.map +0 -1
  146. package/dist/extensions/forgecli/report-bug.d.ts +0 -25
  147. package/dist/extensions/forgecli/report-bug.js +0 -159
  148. package/dist/extensions/forgecli/report-bug.js.map +0 -1
  149. package/dist/extensions/forgecli/retrospective.d.ts +0 -20
  150. package/dist/extensions/forgecli/retrospective.js +0 -126
  151. package/dist/extensions/forgecli/retrospective.js.map +0 -1
  152. package/dist/extensions/forgecli/review-code.d.ts +0 -35
  153. package/dist/extensions/forgecli/review-code.js +0 -196
  154. package/dist/extensions/forgecli/review-code.js.map +0 -1
  155. package/dist/extensions/forgecli/review-plan.d.ts +0 -35
  156. package/dist/extensions/forgecli/review-plan.js +0 -200
  157. package/dist/extensions/forgecli/review-plan.js.map +0 -1
  158. package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
  159. package/dist/extensions/forgecli/run-sprint.js +0 -716
  160. package/dist/extensions/forgecli/run-sprint.js.map +0 -1
  161. package/dist/extensions/forgecli/run-task.d.ts +0 -204
  162. package/dist/extensions/forgecli/run-task.js +0 -1403
  163. package/dist/extensions/forgecli/run-task.js.map +0 -1
  164. package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
  165. package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
  166. package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
  167. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
  168. package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
  169. package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
  170. package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
  171. package/dist/extensions/forgecli/skill-retriever.js +0 -246
  172. package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
  173. package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
  174. package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
  175. package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
  176. package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
  177. package/dist/extensions/forgecli/sprint-intake.js +0 -91
  178. package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
  179. package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
  180. package/dist/extensions/forgecli/sprint-plan.js +0 -122
  181. package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
  182. package/dist/extensions/forgecli/status-command.d.ts +0 -19
  183. package/dist/extensions/forgecli/status-command.js +0 -140
  184. package/dist/extensions/forgecli/status-command.js.map +0 -1
  185. package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
  186. package/dist/extensions/forgecli/store-error-remediation.js +0 -307
  187. package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
  188. package/dist/extensions/forgecli/store-query.d.ts +0 -22
  189. package/dist/extensions/forgecli/store-query.js +0 -107
  190. package/dist/extensions/forgecli/store-query.js.map +0 -1
  191. package/dist/extensions/forgecli/store-repair.d.ts +0 -17
  192. package/dist/extensions/forgecli/store-repair.js +0 -123
  193. package/dist/extensions/forgecli/store-repair.js.map +0 -1
  194. package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
  195. package/dist/extensions/forgecli/store-resolver.js +0 -263
  196. package/dist/extensions/forgecli/store-resolver.js.map +0 -1
  197. package/dist/extensions/forgecli/store-validator.d.ts +0 -16
  198. package/dist/extensions/forgecli/store-validator.js +0 -32
  199. package/dist/extensions/forgecli/store-validator.js.map +0 -1
  200. package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
  201. package/dist/extensions/forgecli/test-orchestrate.js +0 -182
  202. package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
  203. package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
  204. package/dist/extensions/forgecli/thread-switcher.js +0 -189
  205. package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
  206. package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
  207. package/dist/extensions/forgecli/transition-guard.js +0 -89
  208. package/dist/extensions/forgecli/transition-guard.js.map +0 -1
  209. package/dist/extensions/forgecli/update-check.d.ts +0 -37
  210. package/dist/extensions/forgecli/update-check.js +0 -185
  211. package/dist/extensions/forgecli/update-check.js.map +0 -1
  212. package/dist/extensions/forgecli/update-tools.d.ts +0 -23
  213. package/dist/extensions/forgecli/update-tools.js +0 -135
  214. package/dist/extensions/forgecli/update-tools.js.map +0 -1
  215. package/dist/extensions/forgecli/validate.d.ts +0 -22
  216. package/dist/extensions/forgecli/validate.js +0 -152
  217. package/dist/extensions/forgecli/validate.js.map +0 -1
  218. package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
  219. package/dist/extensions/forgecli/viewport-events.js +0 -243
  220. package/dist/extensions/forgecli/viewport-events.js.map +0 -1
  221. package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
  222. package/dist/extensions/forgecli/viewport-renderer.js +0 -233
  223. package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
  224. package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
  225. package/dist/extensions/forgecli/viewport-theme.js +0 -128
  226. package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
  227. package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
  228. package/dist/extensions/forgecli/whats-new-widget.js +0 -376
  229. package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
  230. package/dist/extensions/forgecli/whats-new.d.ts +0 -120
  231. package/dist/extensions/forgecli/whats-new.js +0 -470
  232. package/dist/extensions/forgecli/whats-new.js.map +0 -1
@@ -32,6 +32,8 @@ Seal a completed and approved task by committing its artifacts to the VCS and up
32
32
  - Commit only the artifacts produced for this task; do not sweep unrelated working-tree changes into the commit. The commit boundary mirrors the task boundary.
33
33
  - Read `.forge/personas/engineer.md` first; print the persona identity line (emoji, name, tagline) to stdout before any other tool use.
34
34
  - All store I/O via `forge_store` (or `node .forge/tools/store-cli.cjs`). Never edit `.forge/store/*.json` directly.
35
+ - **Never run `git add`/`git commit`/`git reset` yourself** — `commit-task.cjs` owns staging, boundary checks, committing, and the terminal transition (#40). Your judgement input is the message.
36
+ - **Commit writes NO summary** (`commit` ∉ `VALID_SUMMARY_PHASES` — any `set-summary` is rejected); the tool's terminal `update-status` is this phase's only store write.
35
37
 
36
38
  ## Store-Write Verification
37
39
 
@@ -41,55 +43,56 @@ Seal a completed and approved task by committing its artifacts to the VCS and up
41
43
 
42
44
  ```
43
45
 
44
- 0a. Pre-flight Gate Check:
45
- - **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.
46
- - Run: `node .forge/tools/preflight-gate.cjs --phase commit --{entity_kind} {record_id}`
47
- - Exit 1 (gate failed) → print stderr and HALT. Do not proceed; do not attempt to produce the artifact.
48
- - Exit 2 (misconfiguration) print stderr and HALT.
49
- - Exit 0 continue.
50
-
51
- 0b. Pipeline Step Guard (user-invoked state check):
52
- - If `--force` is present in the invocation arguments, skip this step entirely.
53
- - If `entity_kind == "bug"`, skip this step entirely (bug state is managed by meta-fix-bug.md).
54
- - Read current task state:
55
- `node .forge/tools/store-cli.cjs read task {record_id} --json`
56
- - Extract the `status` field from the JSON output.
57
- - Allowed states for this phase: `approved`.
58
- - If the current status is NOT in the allowed set:
59
- Print the following and HALT (do not proceed):
60
- `× Task {record_id} is in state '{status}' — /forge:approve must complete first. To run the full pipeline: /forge:run-task {record_id}`
61
-
62
- 1. Load Context:
63
- - Read the record manifest (task or bug, per entity_kind).
64
- - Read ARCHITECT_APPROVAL.md by kind never construct the path:
65
- `forge_artifact({ command:"read", entity:"{entity_kind}", entityId:"{record_id}", artifact:"architect-approval" })`
66
-
67
- 2. Staging:
68
- - Stage all record-related artifacts and the code changes:
69
- - Task mode: PLAN.md, PROGRESS.md, REVIEW files, ARCHITECT_APPROVAL.md, and the implementation diff under the task directory plus modified source files.
70
- - Bug mode: BUG_FIX_PLAN.md (Path B only absent on Path A), TRIAGE.md, PROGRESS.md, REVIEW files, ARCHITECT_APPROVAL.md, the regression test, and the implementation diff.
71
- - Verify no unrelated files are staged.
72
-
73
- 3. Commit:
74
- - Create a commit with a message following project conventions.
75
- - Include the record ID in the commit message: task ID for task mode, bug ID for bug mode.
76
- - Append a `Co-authored-by:` trailer crediting the AI assistant that actually ran the session. Resolve the identity from the host runtime: on Claude Code use `Co-authored-by: Claude <noreply@anthropic.com>`; on pi / Ollama / any other runtime use `Co-authored-by: {modelId} <noreply@{provider}.ai>` derived from the session's `provider` and `modelId` (e.g. `Co-authored-by: glm-5.1:cloud <noreply@ollama.ai>`); if neither is resolvable, omit the trailer rather than guess. Do NOT hardcode `Claude Opus 4.6 <noreply@anthropic.com>` — that literal is rejected as a regression of forge#82 (commits authored under the wrong model).
77
- - Let git's configured `user.name` / `user.email` own the commit author; never pass `--author` to override it.
78
-
79
- 4. Store Finalization:
80
- - Transitions:
81
- - **Task mode** `approved committed` (terminal): `node .forge/tools/store-cli.cjs update-status task {taskId} status committed`
82
- - **Bug mode** — `in-progress → fixed` (terminal): `node .forge/tools/store-cli.cjs update-status bug {bugId} status fixed`. This is the ONLY phase in the bug pipeline that writes `bug.status` post-triage (see `meta-fix-bug.md § Iron Laws #2`). Do NOT write `approved` or `verified` — those values are vestigial enum members slated for removal.
83
-
84
- 5. Finalize:
85
- - **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.
46
+ 0. Entity-mode resolution:
47
+ - Read the kickoff arguments. `--task {id}` → `entity_kind = "task"`, `record_id = {id}`. `--bug {id}` → `entity_kind = "bug"`, `record_id = {id}`.
48
+
49
+ 1. Inspect ONCE (message material only #40 batched-inspection rule):
50
+ - One `git diff --stat`; at most ONE combined `git diff` if the message needs detail.
51
+ Never per-file diffs, never repeated `git status` — each extra turn re-pays full context.
52
+ - Staging is NOT your decision — the tool derives it from the store record.
53
+
54
+ 2. Craft the commit message:
55
+ - Follow project conventions; include the record ID ({taskId} / {bugId}) in the subject.
56
+ - `Co-authored-by:` trailer from the host runtime: Claude Code →
57
+ `Co-authored-by: Claude <noreply@anthropic.com>`; pi / Ollama / other
58
+ `Co-authored-by: {modelId} <noreply@{provider}.ai>` from the session's `provider` and
59
+ `modelId`; if unresolvable, omit rather than guess. Never hardcode
60
+ `Claude Opus 4.6 <noreply@anthropic.com>` (forge#82 regression).
61
+ - Git's configured `user.name`/`user.email` own authorship; never `--author`.
62
+
63
+ 3. Commit via the tool — ONE call:
64
+ - If the `forge_commit` named tool is available (forgecli): call it —
65
+ `forge_commit({ entity:"{entity_kind}", id:"{record_id}", message:"<message>", trailer:"<line>" })`.
66
+ Never pass the message through a bash string when the typed tool exists.
67
+ - Otherwise (Claude Code): `node .forge/tools/commit-task.cjs --{entity_kind} {record_id} --message "<message>" [--trailer "<Co-authored-by line>"]`
68
+ - The tool owns the choreography: preflight gate (`preflight-gate.cjs --phase commit`
69
+ internally), status precondition (task `approved` / bug `in-progress` — wrong-state runs
70
+ halt with {record_id} is in state '{status}' …; /forge:approve must complete first`),
71
+ staging (artifact dir + `summaries.implementation.files_changed` provenance),
72
+ commit-boundary guard (aborts on a pre-staged index), `git commit`, terminal transition
73
+ (task `committed`; bug `fixed`, the ONLY post-triage `bug.status` write).
74
+ - On `no files_changed provenance` warning: ONE `git status --porcelain`, then re-run the
75
+ tool with `--also <path>` per source file. Never manual `git add`.
76
+ - Success JSON with `ok:true`. `committed:true` carries `sha` + `staged`;
77
+ `committed:false, reason:"nothing-to-commit"` is ALSO success (fix already at HEAD /
78
+ staging set clean the tool still sealed the record's terminal status). Do not
79
+ "fix" a no-op by staging things yourself.
80
+ - Failure (exit 1 / ok:false) → print stderr and HALT — no manual staging, no
81
+ `git reset`, no `--force` retry (operator-gated). Tool file missing → HALT;
82
+ instruct `/forge:update` + `/forge:rebuild tools`.
83
+ - NEVER commit before the tool reports `ok: true` — the premature-commit/reset/redo loop
84
+ is forbidden.
85
+
86
+ 4. Finalize:
87
+ - No summary, no `set-summary` (see Iron Laws). **Do NOT emit a phase event yourself**
88
+ the orchestrator owns event emission. Return the tool's JSON result as your phase output.
86
89
  ```
87
90
 
88
91
  <!-- See _fragments/generation-instructions.md for Generation Instructions template -->
89
92
  ## Generation Instructions
90
93
 
91
94
  - **Workflow Structure:** The generated `commit_task.md` must follow the strict "Algorithm" block format.
92
- - **Context Isolation:** Forbid inline execution of commit operations; use the `Agent` tool for sub-tasks.
95
+ - **Tool Ownership:** All git operations route through `commit-task.cjs` (forge-engineering#40) the generated workflow must never instruct manual `git add`/`git commit`/`git reset`.
93
96
  - **Project Specifics:**
94
97
  - Embed project's commit message conventions.
95
98
  - **Token Reporting:** See `_fragments/finalize.md` — wire via `file_ref:`.
@@ -148,7 +148,9 @@ Differences are confined to the **triage** step and the **path branch**.
148
148
  - Detect execution cluster from ANTHROPIC_DEFAULT_*_MODEL env vars.
149
149
  - Clear progress log: store-cli progress-clear bugs
150
150
  - Read bug record. If status ∈ {blocked, escalated, fixed, abandoned}:
151
- skip the run, emit a single `bug_skipped` event, return.
151
+ skip the run, emit a single `bug-skipped` event (token + payload shape per
152
+ `_fragments/event-vocabulary.md` § Bug pipeline: requires `bugId`, no
153
+ phase/iteration; model/provider `"n/a"`; skip reason in `notes`), return.
152
154
 
153
155
  2. Triage:
154
156
  - Locate or create the bug record (MANDATORY — do this before anything else):
@@ -503,7 +505,10 @@ After each subagent returns: `✓` for completed/approved, `↻` for revision re
503
505
  <!-- See _fragments/event-emission-schema.md for canonical contract -->
504
506
  > See `_fragments/event-emission-schema.md` for the actor split (subagent
505
507
  > writes judgement-only SUMMARY; orchestrator composes the canonical event
506
- > from runtime telemetry + SUMMARY and emits it).
508
+ > from runtime telemetry + SUMMARY and emits it), and
509
+ > `_fragments/event-vocabulary.md` § Bug pipeline for the canonical
510
+ > phase→`type` token table (pass/fail tokens per phase, `bug-skipped`
511
+ > pre-loop skip shape). Emitted tokens MUST come from that table.
507
512
 
508
513
  The orchestrator is the only actor that calls `store-cli emit` for phase
509
514
  events. All bug-phase events use `sprintId="bugs"` (the reserved virtual
@@ -87,13 +87,13 @@ The Engineer implements the approved plan: write code, run tests, verify, and do
87
87
  `node .forge/tools/store-cli.cjs update-status task {taskId} status implementing`
88
88
  `node .forge/tools/store-cli.cjs update-status task {taskId} status implemented`
89
89
  - **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`.
90
- - **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.
90
+ - **Do NOT emit a phase event yourself.** The orchestrator owns event emission — it composes the canonical event from runtime telemetry plus the SUMMARY you write next. Subagents that call `store-cli emit` for phase events hallucinate runtime facts (Plan 11 / Slice 2). Write the SUMMARY and return.
91
91
 
92
92
  7. Emit Summary Sidecar:
93
93
  - Write `IMPLEMENTATION-SUMMARY.json` via `forge_artifact`:
94
94
  `forge_artifact({ command:"write", entity:"{entity_kind}", entityId:"{record_id}", artifact:"implementation-summary", content:"<JSON>" })`
95
- JSON shape: `{"objective":"<one sentence>", "key_changes":["<up to 12 bullets>"], "verdict":"n/a", "written_at":"<ISO 8601>", "artifact_ref":"PROGRESS.md"}`
96
- The tool validates required fields automatically fix and retry if it rejects.
95
+ JSON shape: `{"objective":"<one sentence>", "key_changes":["<up to 12 bullets>"], "files_changed":["<path>"], "verdict":"n/a", "written_at":"<ISO 8601>", "artifact_ref":"PROGRESS.md"}`
96
+ - `files_changed`: every repo path this phase changed (one `git status --porcelain`); `commit-task.cjs` stages from it.
97
97
  - Then link sidecar to store (task mode):
98
98
  `forge_store({ command:"set-summary", args:["{taskId}", "implementation"] })`
99
99
  Or (bug mode):
@@ -950,7 +950,10 @@ is a violation of the Iron Laws.
950
950
  <!-- See _fragments/event-emission-schema.md for canonical contract -->
951
951
  > See `_fragments/event-emission-schema.md` for the actor split (subagent
952
952
  > writes judgement-only SUMMARY; orchestrator composes the canonical event
953
- > from runtime telemetry + SUMMARY and emits it).
953
+ > from runtime telemetry + SUMMARY and emits it), and
954
+ > `_fragments/event-vocabulary.md` § Task pipeline / § Sprint grain for the
955
+ > canonical phase→`type` token tables. When setting `type` on a phase or
956
+ > sprint event, the token MUST come from those tables.
954
957
 
955
958
  The **orchestrator** is the only actor that calls `store-cli emit` for phase
956
959
  events. Phase subagents write `{PHASE}-SUMMARY.json` and return. After each
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.2.13",
3
- "generated": "2026-06-03",
2
+ "version": "1.2.21",
3
+ "generated": "2026-06-06",
4
4
  "note": "Authoritative enum catalog. Source: build-enum-catalog.cjs. Regenerate via node forge/tools/build-manifest.cjs.",
5
5
  "enums": {
6
6
  "task.status": [
@@ -59,11 +59,11 @@
59
59
  "sprint-complete",
60
60
  "sprint-halted",
61
61
  "task-dispatch",
62
- "bug-fixed",
63
62
 
64
63
  "bug-triaged", "fix-planned", "fix-review-passed", "fix-review-failed",
65
64
  "fix-implemented", "fix-code-review-passed", "fix-code-review-failed",
66
- "fix-approved", "bug-committed",
65
+ "fix-approved", "fix-revision-requested", "bug-committed",
66
+ "bug-commit-failed", "bug-skipped",
67
67
 
68
68
  "skill_usage"
69
69
  ]
@@ -129,7 +129,8 @@
129
129
  "enum": [
130
130
  "bug-triaged", "fix-planned", "fix-review-passed", "fix-review-failed",
131
131
  "fix-implemented", "fix-code-review-passed", "fix-code-review-failed",
132
- "fix-approved", "bug-committed", "bug-fixed"
132
+ "fix-approved", "fix-revision-requested", "bug-committed",
133
+ "bug-commit-failed"
133
134
  ]
134
135
  }
135
136
  },
@@ -137,6 +138,10 @@
137
138
  },
138
139
  "then": { "required": ["bugId", "phase", "iteration"] }
139
140
  },
141
+ {
142
+ "if": { "properties": { "type": { "const": "bug-skipped" } }, "required": ["type"] },
143
+ "then": { "required": ["bugId"] }
144
+ },
140
145
  {
141
146
  "if": { "properties": { "type": { "const": "sprint-start" } }, "required": ["type"] },
142
147
  "then": {
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.2.13",
3
- "generatedAt": "2026-06-03T05:20:45.625Z",
2
+ "version": "1.2.21",
3
+ "generatedAt": "2026-06-06T15:46:43.003Z",
4
4
  "generatedByTool": "build-manifest.cjs",
5
5
  "namespaces": {
6
6
  "personas": {
@@ -94,6 +94,7 @@
94
94
  "files": [
95
95
  "context-injection.md",
96
96
  "event-emission-schema.md",
97
+ "event-vocabulary.md",
97
98
  "finalize.md",
98
99
  "friction-emit.md",
99
100
  "generation-instructions.md",
@@ -151,6 +152,7 @@
151
152
  "check-no-skipped-tests.cjs",
152
153
  "check-structure.cjs",
153
154
  "collate.cjs",
155
+ "commit-task.cjs",
154
156
  "compression-gate.cjs",
155
157
  "delete-candidate-detector.cjs",
156
158
  "estimate-usage.cjs",
@@ -0,0 +1,218 @@
1
+ 'use strict';
2
+
3
+ // commit-task.cjs — deterministic commit choreography (forge-engineering#40).
4
+ //
5
+ // The commit phase was the most expensive phase of the SDLC pipeline
6
+ // (15–31% of run input tokens across instrumented runs) because an LLM
7
+ // re-derived deterministic choreography turn-by-turn: gate, state check,
8
+ // staging-set discovery, boundary verification, commit, terminal status
9
+ // transition. This tool owns the whole sequence; the agent supplies only the
10
+ // commit message (the single judgement-worthy step).
11
+ //
12
+ // Staging-set derivation (the commit boundary mirrors the task boundary):
13
+ // 1. record.path — the task/bug artifact directory (always staged)
14
+ // 2. record.summaries.implementation.files_changed — provenance recorded
15
+ // by the implement phase (PHASE_SUMMARY_SCHEMA.files_changed)
16
+ // 3. --also <path> extras (each validated to stay inside the project root)
17
+ //
18
+ // Usage:
19
+ // node commit-task.cjs --task <id> | --bug <id>
20
+ // --message <msg> commit subject/body (required unless --dry-run)
21
+ // [--trailer <line>] optional Co-authored-by trailer
22
+ // [--also <path>] extra path to stage (repeatable)
23
+ // [--skip-gate] skip preflight-gate (orchestrator already ran it)
24
+ // [--force] bypass the status precondition
25
+ // [--dry-run] print the staging plan as JSON; no writes
26
+ //
27
+ // Exit codes: 0 ok | 1 failure (message on stderr).
28
+
29
+ const fs = require('node:fs');
30
+ const path = require('node:path');
31
+ const { spawnSync } = require('node:child_process');
32
+ const { findProjectRoot } = require('./lib/project-root.cjs');
33
+
34
+ const ALLOWED_STATUS = { task: 'approved', bug: 'in-progress' };
35
+ const TERMINAL_STATUS = { task: 'committed', bug: 'fixed' };
36
+
37
+ function fail(msg) {
38
+ console.error(`commit-task: ${msg}`);
39
+ process.exit(1);
40
+ }
41
+
42
+ function parseArgs(argv) {
43
+ const opts = { also: [] };
44
+ for (let i = 0; i < argv.length; i++) {
45
+ const a = argv[i];
46
+ switch (a) {
47
+ case '--task': opts.entityKind = 'task'; opts.recordId = argv[++i]; break;
48
+ case '--bug': opts.entityKind = 'bug'; opts.recordId = argv[++i]; break;
49
+ case '--message': opts.message = argv[++i]; break;
50
+ case '--trailer': opts.trailer = argv[++i]; break;
51
+ case '--also': opts.also.push(argv[++i]); break;
52
+ case '--skip-gate': opts.skipGate = true; break;
53
+ case '--force': opts.force = true; break;
54
+ case '--dry-run': opts.dryRun = true; break;
55
+ default: fail(`unknown argument: ${a}`);
56
+ }
57
+ }
58
+ if (!opts.entityKind || !opts.recordId) {
59
+ fail('usage: commit-task.cjs --task <id> | --bug <id> --message <msg> [--trailer <line>] [--also <path>]... [--skip-gate] [--force] [--dry-run]');
60
+ }
61
+ if (!opts.dryRun && (!opts.message || !opts.message.trim())) {
62
+ fail('--message is required (the commit message is the only input the agent supplies)');
63
+ }
64
+ return opts;
65
+ }
66
+
67
+ function git(root, args, { allowFail = false } = {}) {
68
+ const r = spawnSync('git', args, { cwd: root, encoding: 'utf8' });
69
+ if (r.status !== 0 && !allowFail) {
70
+ fail(`git ${args.join(' ')} failed: ${(r.stderr || r.stdout || '').trim()}`);
71
+ }
72
+ return r;
73
+ }
74
+
75
+ // Resolve a repo-relative path and reject anything escaping the project root.
76
+ function insideRoot(root, p) {
77
+ const abs = path.resolve(root, p);
78
+ const rel = path.relative(root, abs);
79
+ if (rel.startsWith('..') || path.isAbsolute(rel)) return null;
80
+ return rel;
81
+ }
82
+
83
+ function main() {
84
+ const opts = parseArgs(process.argv.slice(2));
85
+ const root = findProjectRoot();
86
+ if (!root) fail('no .forge/config.json found above the current directory');
87
+
88
+ // 1. Record read (store facade — never raw .forge/store writes).
89
+ const store = require('./store.cjs');
90
+ const record = opts.entityKind === 'task' ? store.getTask(opts.recordId) : store.getBug(opts.recordId);
91
+ if (!record) fail(`${opts.entityKind} ${opts.recordId} not found in the store`);
92
+
93
+ // 2. Status precondition (deterministic version of the Pipeline Step Guard).
94
+ const allowed = ALLOWED_STATUS[opts.entityKind];
95
+ if (record.status !== allowed && !opts.force) {
96
+ const hint = opts.entityKind === 'task' ? "; /forge:approve must complete first" : '';
97
+ fail(`× ${opts.recordId} is in state '${record.status}' — commit requires '${allowed}'${hint}. Use --force to bypass (operator-gated, user-invoked re-runs only).`);
98
+ }
99
+
100
+ // 3. Preflight gate (skippable when the orchestrator already ran it).
101
+ if (!opts.skipGate) {
102
+ const gate = spawnSync(process.execPath,
103
+ [path.join(__dirname, 'preflight-gate.cjs'), '--phase', 'commit', `--${opts.entityKind}`, opts.recordId],
104
+ { cwd: root, encoding: 'utf8' });
105
+ if (gate.status !== 0) {
106
+ fail(`preflight gate failed (exit ${gate.status}):\n${(gate.stderr || gate.stdout || '').trim()}`);
107
+ }
108
+ }
109
+
110
+ // 4. Staging set: artifact dir + implementation provenance + --also extras.
111
+ const stage = [];
112
+ const warnings = [];
113
+ if (record.path) {
114
+ const rel = insideRoot(root, record.path);
115
+ if (rel && fs.existsSync(path.join(root, rel))) stage.push(rel);
116
+ else warnings.push(`artifact dir missing on disk: ${record.path}`);
117
+ }
118
+ const provenance = record.summaries?.implementation?.files_changed;
119
+ if (Array.isArray(provenance) && provenance.length > 0) {
120
+ for (const p of provenance) {
121
+ const rel = insideRoot(root, p);
122
+ if (rel === null) { warnings.push(`provenance path outside the project root, skipped: ${p}`); continue; }
123
+ if (!fs.existsSync(path.join(root, rel))) {
124
+ // Deleted files are legitimate changes — git add stages deletions of
125
+ // tracked paths; only warn when git knows nothing about the path.
126
+ const known = git(root, ['ls-files', '--error-unmatch', '--', rel], { allowFail: true });
127
+ if (known.status !== 0) { warnings.push(`provenance path not found (skipped): ${p}`); continue; }
128
+ }
129
+ stage.push(rel);
130
+ }
131
+ } else {
132
+ warnings.push('no files_changed provenance in summaries.implementation — staging the artifact dir only. Pass source files via --also if the task changed code.');
133
+ }
134
+ for (const p of opts.also) {
135
+ const rel = insideRoot(root, p);
136
+ if (rel === null) fail(`--also path outside the project root: ${p}`);
137
+ stage.push(rel);
138
+ }
139
+ let stageSet = [...new Set(stage)];
140
+ if (stageSet.length === 0) fail('nothing to stage — no artifact dir, no provenance, no --also paths');
141
+
142
+ // Pre-filter gitignored paths (live-run finding, forge-engineering#40):
143
+ // `git add` of the whole set is all-or-nothing — one ignored path aborts
144
+ // everything. check-ignore each path; warn-skip the ignored ones.
145
+ const ignored = [];
146
+ for (const rel of stageSet) {
147
+ const ci = git(root, ['check-ignore', '-q', '--', rel], { allowFail: true });
148
+ if (ci.status === 0) ignored.push(rel);
149
+ }
150
+ if (ignored.length > 0) {
151
+ warnings.push(`gitignored path(s) skipped from the staging set: ${ignored.join(', ')} — track them or stage explicitly with git add -f outside this tool.`);
152
+ stageSet = stageSet.filter((p) => !ignored.includes(p));
153
+ }
154
+
155
+ for (const w of warnings) console.error(`commit-task: warning: ${w}`);
156
+
157
+ if (opts.dryRun) {
158
+ process.stdout.write(JSON.stringify({ dryRun: true, entityKind: opts.entityKind, recordId: opts.recordId, stage: stageSet }, null, 2) + '\n');
159
+ return;
160
+ }
161
+
162
+ // 5. Commit-boundary guard: a pre-populated index means someone else's
163
+ // changes would be swept into this commit. Abort loudly (Iron Law:
164
+ // the commit boundary mirrors the task boundary).
165
+ const preStaged = git(root, ['diff', '--cached', '--name-only']).stdout.trim();
166
+ if (preStaged) {
167
+ fail(`index already has staged changes — refusing to sweep them into the ${opts.recordId} commit:\n${preStaged}\nUnstage them (git reset) or commit them separately, then re-run.`);
168
+ }
169
+
170
+ // 6. Terminal status transition helper — through store-cli (single source
171
+ // of truth for transition legality — never reimplemented here).
172
+ const target = TERMINAL_STATUS[opts.entityKind];
173
+ const transition = (context) => {
174
+ const updArgs = [path.join(__dirname, 'store-cli.cjs'), 'update-status', opts.entityKind, opts.recordId, 'status', target];
175
+ if (opts.force) updArgs.push('--force'); // --force bypasses the transition map too (user-invoked re-runs)
176
+ const upd = spawnSync(process.execPath, updArgs, { cwd: root, encoding: 'utf8' });
177
+ if (upd.status !== 0) {
178
+ fail(`${context} but status transition to '${target}' failed:\n${(upd.stderr || upd.stdout || '').trim()}`);
179
+ }
180
+ };
181
+
182
+ // 7. Stage exactly the derived set. A clean staging set is a legitimate
183
+ // terminal state (e.g. a bug whose fix is already at HEAD): no commit,
184
+ // but the record is still sealed (live-run finding, forge-engineering#40).
185
+ const noop = (why) => {
186
+ console.error(`commit-task: ${why} — nothing to commit; sealing the record without a commit.`);
187
+ transition('no-op commit');
188
+ process.stdout.write(JSON.stringify(
189
+ { ok: true, committed: false, reason: 'nothing-to-commit', skippedIgnored: ignored, status: target }, null, 2) + '\n');
190
+ };
191
+ if (stageSet.length === 0) {
192
+ noop('entire staging set is gitignored');
193
+ return;
194
+ }
195
+ git(root, ['add', '--', ...stageSet]);
196
+ const staged = git(root, ['diff', '--cached', '--name-only']).stdout.trim().split('\n').filter(Boolean);
197
+ if (staged.length === 0) {
198
+ noop('working tree already clean for the staging set');
199
+ return;
200
+ }
201
+
202
+ // 8. Commit. Message comes from the agent; the optional trailer is appended
203
+ // after a blank line per git convention.
204
+ const message = opts.trailer ? `${opts.message.trim()}\n\n${opts.trailer.trim()}\n` : `${opts.message.trim()}\n`;
205
+ git(root, ['commit', '-m', message]);
206
+ const sha = git(root, ['rev-parse', 'HEAD']).stdout.trim();
207
+
208
+ transition(`commit ${sha} created`);
209
+
210
+ process.stdout.write(JSON.stringify({ ok: true, committed: true, sha, staged, status: target }, null, 2) + '\n');
211
+ }
212
+
213
+ try {
214
+ main();
215
+ } catch (err) {
216
+ console.error(`commit-task: ${err.message}`);
217
+ process.exit(1);
218
+ }
@@ -77,7 +77,12 @@ const PHASE_SUMMARY_SCHEMA = {
77
77
  verdict: { type: 'string', enum: ['approved', 'revision', 'n/a'] },
78
78
  written_at: { type: 'string' },
79
79
  artifact_ref:{ type: 'string' },
80
- route: { type: 'string', enum: ['A', 'B'] }
80
+ route: { type: 'string', enum: ['A', 'B'] },
81
+ // forge-engineering#40: implement-phase file provenance. The implement
82
+ // workflow records the repo-relative paths it created/modified;
83
+ // commit-task.cjs derives its staging set from this list instead of the
84
+ // LLM re-deriving the change surface from git each run.
85
+ files_changed: { type: 'array', items: { type: 'string', maxLength: 300 }, maxItems: 100 }
81
86
  },
82
87
  additionalProperties: false
83
88
  };
@@ -42,6 +42,7 @@
42
42
  "version": "napi version"
43
43
  },
44
44
  "optionalDependencies": {
45
- "@mariozechner/clipboard-linux-x64-gnu": "0.3.9"
45
+ "@mariozechner/clipboard-linux-x64-gnu": "0.3.9",
46
+ "@mariozechner/clipboard-linux-x64-musl": "0.3.9"
46
47
  }
47
48
  }
@@ -0,0 +1,3 @@
1
+ # `@mariozechner/clipboard-linux-x64-musl`
2
+
3
+ This is the **x86_64-unknown-linux-musl** binary for `@mariozechner/clipboard`
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@mariozechner/clipboard-linux-x64-musl",
3
+ "version": "0.3.9",
4
+ "os": [
5
+ "linux"
6
+ ],
7
+ "cpu": [
8
+ "x64"
9
+ ],
10
+ "main": "clipboard.linux-x64-musl.node",
11
+ "files": [
12
+ "clipboard.linux-x64-musl.node"
13
+ ],
14
+ "license": "MIT",
15
+ "engines": {
16
+ "node": ">= 10"
17
+ },
18
+ "libc": [
19
+ "musl"
20
+ ],
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/badlogic/clipboard.git"
24
+ }
25
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entelligentsia/forgecli",
3
- "version": "1.0.21",
3
+ "version": "1.0.25",
4
4
  "description": "Forge SDLC ported onto @earendil-works/pi-coding-agent — production launcher with three bin aliases (forge/forgecli/4ge). Bundles a curated fork of pi-coding-agent vendored under earendil-works names.",
5
5
  "license": "MIT",
6
6
  "author": "Entelligentsia",
@@ -49,7 +49,7 @@
49
49
  ]
50
50
  },
51
51
  "forge": {
52
- "bundledVersion": "1.0.10",
52
+ "bundledVersion": "1.2.21",
53
53
  "forgeRoot": "../forge/forge"
54
54
  },
55
55
  "scripts": {
@@ -1,19 +0,0 @@
1
- import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
- export type AddPipelineMode = "add" | "edit" | "view" | "remove";
3
- export interface ParsedAddPipelineArgs {
4
- mode: AddPipelineMode;
5
- pipelineName: string | null;
6
- seed: string;
7
- sourceLabel: string;
8
- }
9
- export declare function parseAddPipelineArgs(rawArgs: string, cwd: string): ParsedAddPipelineArgs;
10
- export interface ComposeAddPipelineKickoffOpts {
11
- commandMd: string;
12
- parsed: ParsedAddPipelineArgs;
13
- }
14
- export declare function composeAddPipelineKickoff(opts: ComposeAddPipelineKickoffOpts): string;
15
- export interface RegisterAddPipelineOptions {
16
- forgeRoot: string | null;
17
- cwd?: string;
18
- }
19
- export declare function registerAddPipeline(pi: ExtensionAPI, options: RegisterAddPipelineOptions): void;