@entelligentsia/forgecli 1.0.20 → 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 (417) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/README.md +7 -1
  3. package/dist/CHANGELOG-forge-plugin.md +118 -0
  4. package/dist/bin/config.js +4 -4
  5. package/dist/bin/config.js.map +1 -1
  6. package/dist/bin/update-cli.d.ts +1 -1
  7. package/dist/bin/update-cli.js +1 -1
  8. package/dist/bin/update-cli.js.map +1 -1
  9. package/dist/extensions/forgecli/ask-user-tool.js +1 -1
  10. package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
  11. package/dist/extensions/forgecli/{add-pipeline.js → commands/add-pipeline.js} +1 -1
  12. package/dist/extensions/forgecli/commands/add-pipeline.js.map +1 -0
  13. package/dist/extensions/forgecli/{add-task.js → commands/add-task.js} +1 -1
  14. package/dist/extensions/forgecli/commands/add-task.js.map +1 -0
  15. package/dist/extensions/forgecli/{approve.d.ts → commands/approve.d.ts} +2 -2
  16. package/dist/extensions/forgecli/{approve.js → commands/approve.js} +8 -8
  17. package/dist/extensions/forgecli/commands/approve.js.map +1 -0
  18. package/dist/extensions/forgecli/{collate.d.ts → commands/collate.d.ts} +2 -2
  19. package/dist/extensions/forgecli/{collate.js → commands/collate.js} +6 -6
  20. package/dist/extensions/forgecli/commands/collate.js.map +1 -0
  21. package/dist/extensions/forgecli/{commit.d.ts → commands/commit.d.ts} +2 -2
  22. package/dist/extensions/forgecli/{commit.js → commands/commit.js} +8 -8
  23. package/dist/extensions/forgecli/commands/commit.js.map +1 -0
  24. package/dist/extensions/forgecli/{config-command.js → commands/config-command.js} +3 -3
  25. package/dist/extensions/forgecli/commands/config-command.js.map +1 -0
  26. package/dist/extensions/forgecli/commands/enhance.d.ts +45 -0
  27. package/dist/extensions/forgecli/{enhance.js → commands/enhance.js} +95 -75
  28. package/dist/extensions/forgecli/commands/enhance.js.map +1 -0
  29. package/dist/extensions/forgecli/{implement.d.ts → commands/implement.d.ts} +2 -2
  30. package/dist/extensions/forgecli/{implement.js → commands/implement.js} +8 -8
  31. package/dist/extensions/forgecli/commands/implement.js.map +1 -0
  32. package/dist/extensions/forgecli/{plan.d.ts → commands/plan.d.ts} +2 -2
  33. package/dist/extensions/forgecli/{plan.js → commands/plan.js} +8 -8
  34. package/dist/extensions/forgecli/commands/plan.js.map +1 -0
  35. package/dist/extensions/forgecli/{quiz-agent.js → commands/quiz-agent.js} +1 -1
  36. package/dist/extensions/forgecli/commands/quiz-agent.js.map +1 -0
  37. package/dist/extensions/forgecli/{read-command.js → commands/read-command.js} +2 -2
  38. package/dist/extensions/forgecli/commands/read-command.js.map +1 -0
  39. package/dist/extensions/forgecli/{regenerate.js → commands/regenerate.js} +7 -19
  40. package/dist/extensions/forgecli/commands/regenerate.js.map +1 -0
  41. package/dist/extensions/forgecli/{remove-command.js → commands/remove-command.js} +1 -1
  42. package/dist/extensions/forgecli/commands/remove-command.js.map +1 -0
  43. package/dist/extensions/forgecli/{report-bug.js → commands/report-bug.js} +1 -1
  44. package/dist/extensions/forgecli/commands/report-bug.js.map +1 -0
  45. package/dist/extensions/forgecli/{retrospective.d.ts → commands/retrospective.d.ts} +1 -1
  46. package/dist/extensions/forgecli/{retrospective.js → commands/retrospective.js} +5 -5
  47. package/dist/extensions/forgecli/commands/retrospective.js.map +1 -0
  48. package/dist/extensions/forgecli/{review-code.d.ts → commands/review-code.d.ts} +2 -2
  49. package/dist/extensions/forgecli/{review-code.js → commands/review-code.js} +9 -9
  50. package/dist/extensions/forgecli/commands/review-code.js.map +1 -0
  51. package/dist/extensions/forgecli/{review-plan.d.ts → commands/review-plan.d.ts} +2 -2
  52. package/dist/extensions/forgecli/{review-plan.js → commands/review-plan.js} +9 -9
  53. package/dist/extensions/forgecli/commands/review-plan.js.map +1 -0
  54. package/dist/extensions/forgecli/commands/sprint-intake.js.map +1 -0
  55. package/dist/extensions/forgecli/commands/sprint-plan.js.map +1 -0
  56. package/dist/extensions/forgecli/{status-command.js → commands/status-command.js} +1 -1
  57. package/dist/extensions/forgecli/commands/status-command.js.map +1 -0
  58. package/dist/extensions/forgecli/{store-query.js → commands/store-query.js} +1 -1
  59. package/dist/extensions/forgecli/commands/store-query.js.map +1 -0
  60. package/dist/extensions/forgecli/{store-repair.js → commands/store-repair.js} +1 -1
  61. package/dist/extensions/forgecli/commands/store-repair.js.map +1 -0
  62. package/dist/extensions/forgecli/{test-orchestrate.js → commands/test-orchestrate.js} +1 -1
  63. package/dist/extensions/forgecli/commands/test-orchestrate.js.map +1 -0
  64. package/dist/extensions/forgecli/commands/transcripts-command.d.ts +87 -0
  65. package/dist/extensions/forgecli/commands/transcripts-command.js +418 -0
  66. package/dist/extensions/forgecli/commands/transcripts-command.js.map +1 -0
  67. package/dist/extensions/forgecli/{validate.d.ts → commands/validate.d.ts} +2 -2
  68. package/dist/extensions/forgecli/{validate.js → commands/validate.js} +8 -8
  69. package/dist/extensions/forgecli/commands/validate.js.map +1 -0
  70. package/dist/extensions/forgecli/{config-layer.js → config/config-layer.js} +2 -2
  71. package/dist/extensions/forgecli/config/config-layer.js.map +1 -0
  72. package/dist/extensions/forgecli/{config-writer.js → config/config-writer.js} +2 -2
  73. package/dist/extensions/forgecli/config/config-writer.js.map +1 -0
  74. package/dist/extensions/forgecli/{model-registry.js → config/model-registry.js} +1 -1
  75. package/dist/extensions/forgecli/config/model-registry.js.map +1 -0
  76. package/dist/extensions/forgecli/config/model-resolver.js.map +1 -0
  77. package/dist/extensions/forgecli/config/model-validator.js.map +1 -0
  78. package/dist/extensions/forgecli/config-tui/component.js +1 -1
  79. package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
  80. package/dist/extensions/forgecli/config-tui/handler.js +1 -1
  81. package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
  82. package/dist/extensions/forgecli/config-tui/screens/override-editor.js +1 -1
  83. package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
  84. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +1 -1
  85. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
  86. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +1 -1
  87. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
  88. package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
  89. package/dist/extensions/forgecli/config-tui/state/model.d.ts +1 -1
  90. package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
  91. package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +2 -2
  92. package/dist/extensions/forgecli/config-tui/state/selectors.js +1 -1
  93. package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
  94. package/dist/extensions/forgecli/context-governor-compaction.d.ts +13 -2
  95. package/dist/extensions/forgecli/context-governor-compaction.js +66 -41
  96. package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -1
  97. package/dist/extensions/forgecli/context-governor.d.ts +3 -7
  98. package/dist/extensions/forgecli/context-governor.js +43 -69
  99. package/dist/extensions/forgecli/context-governor.js.map +1 -1
  100. package/dist/extensions/forgecli/dashboard/component.d.ts +10 -1
  101. package/dist/extensions/forgecli/dashboard/component.js +84 -18
  102. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  103. package/dist/extensions/forgecli/dashboard/register.js +1 -1
  104. package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
  105. package/dist/extensions/forgecli/forge-artifact-tool.js +1 -1
  106. package/dist/extensions/forgecli/forge-commands.js +1 -1
  107. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  108. package/dist/extensions/forgecli/{forge-init.js → forge-init/forge-init.js} +10 -10
  109. package/dist/extensions/forgecli/forge-init/forge-init.js.map +1 -0
  110. package/dist/extensions/forgecli/forge-init/init-context.js.map +1 -0
  111. package/dist/extensions/forgecli/forge-init/init-progress.js.map +1 -0
  112. package/dist/extensions/forgecli/forge-init/phase4-register.js +1 -1
  113. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  114. package/dist/extensions/forgecli/forge-init/run-phases.js +2 -2
  115. package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -1
  116. package/dist/extensions/forgecli/forge-subagent.d.ts +22 -0
  117. package/dist/extensions/forgecli/forge-subagent.js +42 -15
  118. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  119. package/dist/extensions/forgecli/forge-tools.d.ts +1 -25
  120. package/dist/extensions/forgecli/forge-tools.js +79 -37
  121. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  122. package/dist/extensions/forgecli/governor-config.d.ts +19 -0
  123. package/dist/extensions/forgecli/governor-config.js +58 -0
  124. package/dist/extensions/forgecli/governor-config.js.map +1 -0
  125. package/dist/extensions/forgecli/health-check.js +1 -1
  126. package/dist/extensions/forgecli/health-check.js.map +1 -1
  127. package/dist/extensions/forgecli/hook-dispatcher.js +2 -2
  128. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  129. package/dist/extensions/forgecli/hooks/post-init-hook.js +11 -6
  130. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
  131. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +11 -6
  132. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
  133. package/dist/extensions/forgecli/hooks/write-guard.js +1 -1
  134. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
  135. package/dist/extensions/forgecli/index.js +37 -35
  136. package/dist/extensions/forgecli/index.js.map +1 -1
  137. package/dist/extensions/forgecli/kickoff.d.ts +9 -0
  138. package/dist/extensions/forgecli/kickoff.js +15 -0
  139. package/dist/extensions/forgecli/kickoff.js.map +1 -1
  140. package/dist/extensions/forgecli/lib/forge-config.d.ts +1 -1
  141. package/dist/extensions/forgecli/lib/forge-config.js +1 -1
  142. package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
  143. package/dist/extensions/forgecli/{forge-root.d.ts → lib/forge-root.d.ts} +5 -0
  144. package/dist/extensions/forgecli/{forge-root.js → lib/forge-root.js} +14 -1
  145. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -0
  146. package/dist/extensions/forgecli/lib/run-cjs.d.ts +26 -0
  147. package/dist/extensions/forgecli/lib/run-cjs.js +42 -0
  148. package/dist/extensions/forgecli/lib/run-cjs.js.map +1 -0
  149. package/dist/extensions/forgecli/orchestrator-tree.d.ts +4 -0
  150. package/dist/extensions/forgecli/orchestrator-tree.js +21 -3
  151. package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -1
  152. package/dist/extensions/forgecli/{calibrate.d.ts → orchestrators/calibrate.d.ts} +2 -2
  153. package/dist/extensions/forgecli/{calibrate.js → orchestrators/calibrate.js} +4 -4
  154. package/dist/extensions/forgecli/orchestrators/calibrate.js.map +1 -0
  155. package/dist/extensions/forgecli/{fix-bug.d.ts → orchestrators/fix-bug.d.ts} +14 -5
  156. package/dist/extensions/forgecli/{fix-bug.js → orchestrators/fix-bug.js} +212 -61
  157. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -0
  158. package/dist/extensions/forgecli/{lib → orchestrators}/halt-advisor.d.ts +1 -1
  159. package/dist/extensions/forgecli/{lib → orchestrators}/halt-advisor.js +1 -1
  160. package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -0
  161. package/dist/extensions/forgecli/{materialize.js → orchestrators/materialize.js} +1 -1
  162. package/dist/extensions/forgecli/orchestrators/materialize.js.map +1 -0
  163. package/dist/extensions/forgecli/{migrate.d.ts → orchestrators/migrate.d.ts} +1 -1
  164. package/dist/extensions/forgecli/{migrate.js → orchestrators/migrate.js} +5 -5
  165. package/dist/extensions/forgecli/orchestrators/migrate.js.map +1 -0
  166. package/dist/extensions/forgecli/{lib → orchestrators}/orchestrator-preflight.d.ts +2 -2
  167. package/dist/extensions/forgecli/{lib → orchestrators}/orchestrator-preflight.js +2 -2
  168. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js.map +1 -0
  169. package/dist/extensions/forgecli/{run-sprint.d.ts → orchestrators/run-sprint.d.ts} +1 -1
  170. package/dist/extensions/forgecli/{run-sprint.js → orchestrators/run-sprint.js} +85 -18
  171. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -0
  172. package/dist/extensions/forgecli/{run-task.d.ts → orchestrators/run-task.d.ts} +14 -3
  173. package/dist/extensions/forgecli/{run-task.js → orchestrators/run-task.js} +121 -33
  174. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -0
  175. package/dist/extensions/forgecli/paths/paths.d.ts +8 -0
  176. package/dist/extensions/forgecli/paths/paths.js +17 -0
  177. package/dist/extensions/forgecli/paths/paths.js.map +1 -1
  178. package/dist/extensions/forgecli/phase-vocab.d.ts +31 -0
  179. package/dist/extensions/forgecli/phase-vocab.js +82 -0
  180. package/dist/extensions/forgecli/phase-vocab.js.map +1 -0
  181. package/dist/extensions/forgecli/session-registry.d.ts +2 -2
  182. package/dist/extensions/forgecli/session-registry.js +6 -2
  183. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  184. package/dist/extensions/forgecli/{friction-emit.d.ts → skill-curation/friction-emit.d.ts} +1 -1
  185. package/dist/extensions/forgecli/{friction-emit.js → skill-curation/friction-emit.js} +2 -2
  186. package/dist/extensions/forgecli/skill-curation/friction-emit.js.map +1 -0
  187. package/dist/extensions/forgecli/{skill-curation-flag.js → skill-curation/skill-curation-flag.js} +1 -1
  188. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js.map +1 -0
  189. package/dist/extensions/forgecli/{skill-curator-subagent.d.ts → skill-curation/skill-curator-subagent.d.ts} +2 -2
  190. package/dist/extensions/forgecli/{skill-curator-subagent.js → skill-curation/skill-curator-subagent.js} +1 -1
  191. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js.map +1 -0
  192. package/dist/extensions/forgecli/{skill-retriever.js → skill-curation/skill-retriever.js} +1 -1
  193. package/dist/extensions/forgecli/skill-curation/skill-retriever.js.map +1 -0
  194. package/dist/extensions/forgecli/{skill-usage-tracker.js → skill-curation/skill-usage-tracker.js} +1 -1
  195. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js.map +1 -0
  196. package/dist/extensions/forgecli/store/store-error-remediation.js.map +1 -0
  197. package/dist/extensions/forgecli/{store-resolver.js → store/store-resolver.js} +2 -2
  198. package/dist/extensions/forgecli/store/store-resolver.js.map +1 -0
  199. package/dist/extensions/forgecli/{store-validator.js → store/store-validator.js} +1 -1
  200. package/dist/extensions/forgecli/store/store-validator.js.map +1 -0
  201. package/dist/extensions/forgecli/{transition-guard.js → store/transition-guard.js} +2 -2
  202. package/dist/extensions/forgecli/store/transition-guard.js.map +1 -0
  203. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +5 -0
  204. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -1
  205. package/dist/extensions/forgecli/transcript-archive-types.d.ts +171 -0
  206. package/dist/extensions/forgecli/transcript-archive-types.js +130 -0
  207. package/dist/extensions/forgecli/transcript-archive-types.js.map +1 -0
  208. package/dist/extensions/forgecli/transcript-archive.d.ts +127 -0
  209. package/dist/extensions/forgecli/transcript-archive.js +656 -0
  210. package/dist/extensions/forgecli/transcript-archive.js.map +1 -0
  211. package/dist/extensions/forgecli/transcript-replay.d.ts +28 -0
  212. package/dist/extensions/forgecli/transcript-replay.js +153 -0
  213. package/dist/extensions/forgecli/transcript-replay.js.map +1 -0
  214. package/dist/extensions/forgecli/transcripts-tui/component.d.ts +36 -0
  215. package/dist/extensions/forgecli/transcripts-tui/component.js +112 -0
  216. package/dist/extensions/forgecli/transcripts-tui/component.js.map +1 -0
  217. package/dist/extensions/forgecli/transcripts-tui/index.d.ts +4 -0
  218. package/dist/extensions/forgecli/transcripts-tui/index.js +5 -0
  219. package/dist/extensions/forgecli/transcripts-tui/index.js.map +1 -0
  220. package/dist/extensions/forgecli/transcripts-tui/screens/browse.d.ts +21 -0
  221. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js +172 -0
  222. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js.map +1 -0
  223. package/dist/extensions/forgecli/transcripts-tui/screens/types.d.ts +22 -0
  224. package/dist/extensions/forgecli/transcripts-tui/screens/types.js +4 -0
  225. package/dist/extensions/forgecli/transcripts-tui/screens/types.js.map +1 -0
  226. package/dist/extensions/forgecli/transcripts-tui/state/index.d.ts +4 -0
  227. package/dist/extensions/forgecli/transcripts-tui/state/index.js +5 -0
  228. package/dist/extensions/forgecli/transcripts-tui/state/index.js.map +1 -0
  229. package/dist/extensions/forgecli/transcripts-tui/state/init.d.ts +8 -0
  230. package/dist/extensions/forgecli/transcripts-tui/state/init.js +18 -0
  231. package/dist/extensions/forgecli/transcripts-tui/state/init.js.map +1 -0
  232. package/dist/extensions/forgecli/transcripts-tui/state/model.d.ts +56 -0
  233. package/dist/extensions/forgecli/transcripts-tui/state/model.js +6 -0
  234. package/dist/extensions/forgecli/transcripts-tui/state/model.js.map +1 -0
  235. package/dist/extensions/forgecli/transcripts-tui/state/reducer.d.ts +2 -0
  236. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js +51 -0
  237. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js.map +1 -0
  238. package/dist/extensions/forgecli/transcripts-tui/state/selectors.d.ts +10 -0
  239. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js +62 -0
  240. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js.map +1 -0
  241. package/dist/extensions/forgecli/transcripts-tui/theme.d.ts +20 -0
  242. package/dist/extensions/forgecli/transcripts-tui/theme.js +47 -0
  243. package/dist/extensions/forgecli/transcripts-tui/theme.js.map +1 -0
  244. package/dist/extensions/forgecli/tui/banner.js.map +1 -0
  245. package/dist/extensions/forgecli/tui/forge-header.js.map +1 -0
  246. package/dist/extensions/forgecli/tui/input-router.js.map +1 -0
  247. package/dist/extensions/forgecli/{orchestrator-status-bar.d.ts → tui/orchestrator-status-bar.d.ts} +1 -1
  248. package/dist/extensions/forgecli/{orchestrator-status-bar.js → tui/orchestrator-status-bar.js} +1 -1
  249. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js.map +1 -0
  250. package/dist/extensions/forgecli/tui/thread-switcher.d.ts +18 -0
  251. package/dist/extensions/forgecli/{thread-switcher.js → tui/thread-switcher.js} +17 -12
  252. package/dist/extensions/forgecli/tui/thread-switcher.js.map +1 -0
  253. package/dist/extensions/forgecli/{forge-update-command.js → update/forge-update-command.js} +3 -3
  254. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -0
  255. package/dist/extensions/forgecli/{migration-engine.js → update/migration-engine.js} +1 -1
  256. package/dist/extensions/forgecli/update/migration-engine.js.map +1 -0
  257. package/dist/extensions/forgecli/{update-check.js → update/update-check.js} +1 -1
  258. package/dist/extensions/forgecli/update/update-check.js.map +1 -0
  259. package/dist/extensions/forgecli/{update-tools.js → update/update-tools.js} +1 -1
  260. package/dist/extensions/forgecli/update/update-tools.js.map +1 -0
  261. package/dist/extensions/forgecli/{whats-new-widget.js → update/whats-new-widget.js} +2 -2
  262. package/dist/extensions/forgecli/update/whats-new-widget.js.map +1 -0
  263. package/dist/extensions/forgecli/{whats-new.js → update/whats-new.js} +1 -1
  264. package/dist/extensions/forgecli/update/whats-new.js.map +1 -0
  265. package/dist/extensions/forgecli/{viewport-events.d.ts → viewport/events.d.ts} +37 -2
  266. package/dist/extensions/forgecli/{viewport-events.js → viewport/events.js} +70 -23
  267. package/dist/extensions/forgecli/viewport/events.js.map +1 -0
  268. package/dist/extensions/forgecli/{viewport-renderer.d.ts → viewport/renderer.d.ts} +19 -0
  269. package/dist/extensions/forgecli/{viewport-renderer.js → viewport/renderer.js} +46 -2
  270. package/dist/extensions/forgecli/viewport/renderer.js.map +1 -0
  271. package/dist/extensions/forgecli/{viewport-theme.js → viewport/theme.js} +13 -10
  272. package/dist/extensions/forgecli/viewport/theme.js.map +1 -0
  273. package/dist/extensions/forgecli/wf-engine/engine.js +1 -1
  274. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
  275. package/dist/forge-payload/.base-pack/workflows/_fragments/event-emission-schema.md +4 -0
  276. package/dist/forge-payload/.base-pack/workflows/_fragments/event-vocabulary.md +88 -0
  277. package/dist/forge-payload/.base-pack/workflows/commit_task.md +41 -38
  278. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +3 -3
  279. package/dist/forge-payload/.base-pack/workflows-js/wfl-fix-bug.js +42 -6
  280. package/dist/forge-payload/.base-pack/workflows-js/wfl-run-task.js +32 -1
  281. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  282. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  283. package/dist/forge-payload/.schemas/event.schema.json +8 -3
  284. package/dist/forge-payload/.schemas/migrations.json +56 -0
  285. package/dist/forge-payload/integrity.json +3 -3
  286. package/dist/forge-payload/meta/store-schema/event.schema.md +7 -0
  287. package/dist/forge-payload/meta/workflows/_fragments/event-emission-schema.md +4 -0
  288. package/dist/forge-payload/meta/workflows/_fragments/event-vocabulary.md +88 -0
  289. package/dist/forge-payload/meta/workflows/meta-commit.md +46 -43
  290. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +7 -2
  291. package/dist/forge-payload/meta/workflows/meta-implement.md +3 -3
  292. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +4 -1
  293. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  294. package/dist/forge-payload/schemas/event.schema.json +8 -3
  295. package/dist/forge-payload/schemas/structure-manifest.json +4 -2
  296. package/dist/forge-payload/tools/commit-task.cjs +218 -0
  297. package/dist/forge-payload/tools/store-cli.cjs +6 -1
  298. package/node_modules/@mariozechner/clipboard/package.json +2 -1
  299. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
  300. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
  301. package/package.json +5 -3
  302. package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
  303. package/dist/extensions/forgecli/add-task.js.map +0 -1
  304. package/dist/extensions/forgecli/approve.js.map +0 -1
  305. package/dist/extensions/forgecli/banner.js.map +0 -1
  306. package/dist/extensions/forgecli/calibrate.js.map +0 -1
  307. package/dist/extensions/forgecli/collate.js.map +0 -1
  308. package/dist/extensions/forgecli/commit.js.map +0 -1
  309. package/dist/extensions/forgecli/config-command.js.map +0 -1
  310. package/dist/extensions/forgecli/config-layer.js.map +0 -1
  311. package/dist/extensions/forgecli/config-writer.js.map +0 -1
  312. package/dist/extensions/forgecli/enhance.d.ts +0 -27
  313. package/dist/extensions/forgecli/enhance.js.map +0 -1
  314. package/dist/extensions/forgecli/fix-bug.js.map +0 -1
  315. package/dist/extensions/forgecli/forge-header.js.map +0 -1
  316. package/dist/extensions/forgecli/forge-init.js.map +0 -1
  317. package/dist/extensions/forgecli/forge-root.js.map +0 -1
  318. package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
  319. package/dist/extensions/forgecli/friction-emit.js.map +0 -1
  320. package/dist/extensions/forgecli/implement.js.map +0 -1
  321. package/dist/extensions/forgecli/init-context.js.map +0 -1
  322. package/dist/extensions/forgecli/init-progress.js.map +0 -1
  323. package/dist/extensions/forgecli/input-router.js.map +0 -1
  324. package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
  325. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
  326. package/dist/extensions/forgecli/materialize.js.map +0 -1
  327. package/dist/extensions/forgecli/migrate.js.map +0 -1
  328. package/dist/extensions/forgecli/migration-engine.js.map +0 -1
  329. package/dist/extensions/forgecli/model-registry.js.map +0 -1
  330. package/dist/extensions/forgecli/model-resolver.js.map +0 -1
  331. package/dist/extensions/forgecli/model-validator.js.map +0 -1
  332. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
  333. package/dist/extensions/forgecli/plan.js.map +0 -1
  334. package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
  335. package/dist/extensions/forgecli/read-command.js.map +0 -1
  336. package/dist/extensions/forgecli/regenerate.js.map +0 -1
  337. package/dist/extensions/forgecli/remove-command.js.map +0 -1
  338. package/dist/extensions/forgecli/report-bug.js.map +0 -1
  339. package/dist/extensions/forgecli/retrospective.js.map +0 -1
  340. package/dist/extensions/forgecli/review-code.js.map +0 -1
  341. package/dist/extensions/forgecli/review-plan.js.map +0 -1
  342. package/dist/extensions/forgecli/run-sprint.js.map +0 -1
  343. package/dist/extensions/forgecli/run-task.js.map +0 -1
  344. package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
  345. package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
  346. package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
  347. package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
  348. package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
  349. package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
  350. package/dist/extensions/forgecli/status-command.js.map +0 -1
  351. package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
  352. package/dist/extensions/forgecli/store-query.js.map +0 -1
  353. package/dist/extensions/forgecli/store-repair.js.map +0 -1
  354. package/dist/extensions/forgecli/store-resolver.js.map +0 -1
  355. package/dist/extensions/forgecli/store-validator.js.map +0 -1
  356. package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
  357. package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
  358. package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
  359. package/dist/extensions/forgecli/transition-guard.js.map +0 -1
  360. package/dist/extensions/forgecli/update-check.js.map +0 -1
  361. package/dist/extensions/forgecli/update-tools.js.map +0 -1
  362. package/dist/extensions/forgecli/validate.js.map +0 -1
  363. package/dist/extensions/forgecli/viewport-events.js.map +0 -1
  364. package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
  365. package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
  366. package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
  367. package/dist/extensions/forgecli/whats-new.js.map +0 -1
  368. /package/dist/extensions/forgecli/{add-pipeline.d.ts → commands/add-pipeline.d.ts} +0 -0
  369. /package/dist/extensions/forgecli/{add-task.d.ts → commands/add-task.d.ts} +0 -0
  370. /package/dist/extensions/forgecli/{config-command.d.ts → commands/config-command.d.ts} +0 -0
  371. /package/dist/extensions/forgecli/{quiz-agent.d.ts → commands/quiz-agent.d.ts} +0 -0
  372. /package/dist/extensions/forgecli/{read-command.d.ts → commands/read-command.d.ts} +0 -0
  373. /package/dist/extensions/forgecli/{regenerate.d.ts → commands/regenerate.d.ts} +0 -0
  374. /package/dist/extensions/forgecli/{remove-command.d.ts → commands/remove-command.d.ts} +0 -0
  375. /package/dist/extensions/forgecli/{report-bug.d.ts → commands/report-bug.d.ts} +0 -0
  376. /package/dist/extensions/forgecli/{sprint-intake.d.ts → commands/sprint-intake.d.ts} +0 -0
  377. /package/dist/extensions/forgecli/{sprint-intake.js → commands/sprint-intake.js} +0 -0
  378. /package/dist/extensions/forgecli/{sprint-plan.d.ts → commands/sprint-plan.d.ts} +0 -0
  379. /package/dist/extensions/forgecli/{sprint-plan.js → commands/sprint-plan.js} +0 -0
  380. /package/dist/extensions/forgecli/{status-command.d.ts → commands/status-command.d.ts} +0 -0
  381. /package/dist/extensions/forgecli/{store-query.d.ts → commands/store-query.d.ts} +0 -0
  382. /package/dist/extensions/forgecli/{store-repair.d.ts → commands/store-repair.d.ts} +0 -0
  383. /package/dist/extensions/forgecli/{test-orchestrate.d.ts → commands/test-orchestrate.d.ts} +0 -0
  384. /package/dist/extensions/forgecli/{config-layer.d.ts → config/config-layer.d.ts} +0 -0
  385. /package/dist/extensions/forgecli/{config-writer.d.ts → config/config-writer.d.ts} +0 -0
  386. /package/dist/extensions/forgecli/{model-registry.d.ts → config/model-registry.d.ts} +0 -0
  387. /package/dist/extensions/forgecli/{model-resolver.d.ts → config/model-resolver.d.ts} +0 -0
  388. /package/dist/extensions/forgecli/{model-resolver.js → config/model-resolver.js} +0 -0
  389. /package/dist/extensions/forgecli/{model-validator.d.ts → config/model-validator.d.ts} +0 -0
  390. /package/dist/extensions/forgecli/{model-validator.js → config/model-validator.js} +0 -0
  391. /package/dist/extensions/forgecli/{forge-init.d.ts → forge-init/forge-init.d.ts} +0 -0
  392. /package/dist/extensions/forgecli/{init-context.d.ts → forge-init/init-context.d.ts} +0 -0
  393. /package/dist/extensions/forgecli/{init-context.js → forge-init/init-context.js} +0 -0
  394. /package/dist/extensions/forgecli/{init-progress.d.ts → forge-init/init-progress.d.ts} +0 -0
  395. /package/dist/extensions/forgecli/{init-progress.js → forge-init/init-progress.js} +0 -0
  396. /package/dist/extensions/forgecli/{materialize.d.ts → orchestrators/materialize.d.ts} +0 -0
  397. /package/dist/extensions/forgecli/{skill-curation-flag.d.ts → skill-curation/skill-curation-flag.d.ts} +0 -0
  398. /package/dist/extensions/forgecli/{skill-retriever.d.ts → skill-curation/skill-retriever.d.ts} +0 -0
  399. /package/dist/extensions/forgecli/{skill-usage-tracker.d.ts → skill-curation/skill-usage-tracker.d.ts} +0 -0
  400. /package/dist/extensions/forgecli/{store-error-remediation.d.ts → store/store-error-remediation.d.ts} +0 -0
  401. /package/dist/extensions/forgecli/{store-error-remediation.js → store/store-error-remediation.js} +0 -0
  402. /package/dist/extensions/forgecli/{store-resolver.d.ts → store/store-resolver.d.ts} +0 -0
  403. /package/dist/extensions/forgecli/{store-validator.d.ts → store/store-validator.d.ts} +0 -0
  404. /package/dist/extensions/forgecli/{transition-guard.d.ts → store/transition-guard.d.ts} +0 -0
  405. /package/dist/extensions/forgecli/{banner.d.ts → tui/banner.d.ts} +0 -0
  406. /package/dist/extensions/forgecli/{banner.js → tui/banner.js} +0 -0
  407. /package/dist/extensions/forgecli/{forge-header.d.ts → tui/forge-header.d.ts} +0 -0
  408. /package/dist/extensions/forgecli/{forge-header.js → tui/forge-header.js} +0 -0
  409. /package/dist/extensions/forgecli/{input-router.d.ts → tui/input-router.d.ts} +0 -0
  410. /package/dist/extensions/forgecli/{input-router.js → tui/input-router.js} +0 -0
  411. /package/dist/extensions/forgecli/{forge-update-command.d.ts → update/forge-update-command.d.ts} +0 -0
  412. /package/dist/extensions/forgecli/{migration-engine.d.ts → update/migration-engine.d.ts} +0 -0
  413. /package/dist/extensions/forgecli/{update-check.d.ts → update/update-check.d.ts} +0 -0
  414. /package/dist/extensions/forgecli/{update-tools.d.ts → update/update-tools.d.ts} +0 -0
  415. /package/dist/extensions/forgecli/{whats-new-widget.d.ts → update/whats-new-widget.d.ts} +0 -0
  416. /package/dist/extensions/forgecli/{whats-new.d.ts → update/whats-new.d.ts} +0 -0
  417. /package/dist/extensions/forgecli/{viewport-theme.d.ts → viewport/theme.d.ts} +0 -0
@@ -10,6 +10,13 @@
10
10
 
11
11
  Example: `20260415T141523000Z_ACME-S02-T03_engineer_implement`
12
12
 
13
+ ## Type Vocabulary
14
+
15
+ The optional `type` field, when present, must come from the canonical
16
+ phase→type tables in `meta/workflows/_fragments/event-vocabulary.md`
17
+ (task / bug / sprint / friction / skill_usage families). The schema enum in
18
+ `schemas/event.schema.json` mirrors that fragment.
19
+
13
20
  ## Fields
14
21
 
15
22
  | Field | Type | Required | Description |
@@ -4,6 +4,10 @@
4
4
  orchestrator stitches runtime telemetry + judgement into the canonical
5
5
  event and emits it. Referenced by meta-orchestrate.md and meta-fix-bug.md.
6
6
 
7
+ Companion: _fragments/event-vocabulary.md owns the `type` token
8
+ vocabulary (phase→type tables for task/bug/sprint events). This fragment
9
+ owns WHO emits; that one owns WHAT token.
10
+
7
11
  PLAN-11 / SLICE-2 (2026-05-14): the LLM no longer hand-builds event JSON.
8
12
  Runtime facts (model, provider, eventId, timestamps, iteration, tokens)
9
13
  are owned by the orchestrator, never the subagent. The subagent only
@@ -0,0 +1,88 @@
1
+ # Fragment: Event Type Vocabulary
2
+
3
+ <!-- Canonical phase→type vocabulary for store events (forge-engineering#39).
4
+ This fragment OWNS the `type` token vocabulary; `schemas/event.schema.json`
5
+ mirrors it. Any vocabulary change lands here first, then in the schema enum
6
+ (test-first via tools/__tests__/event-schema-variants.test.cjs), then in
7
+ emitters (forge-cli orchestrators, wfl JS drivers, meta workflows).
8
+
9
+ Companion: _fragments/event-emission-schema.md owns WHO emits (orchestrator
10
+ vs subagent field ownership). This fragment owns WHAT token each phase emits.
11
+
12
+ Invariant: every token emitted by any surface MUST appear in the schema
13
+ enum, and every enum token MUST have a named emitter below. Dead tokens are
14
+ removed (bug-fixed was retired by forge-engineering#39 — defined, never
15
+ emitted by anything). -->
16
+
17
+ ## Rules
18
+
19
+ 1. **Emitted tokens ⊆ schema enum.** An emitter never invents a token. If a new
20
+ phase outcome needs a token, add it here + the schema enum first.
21
+ 2. **`type` is optional** on events. An untyped event is valid (task-pipeline
22
+ events from forge-cli run-task are currently untyped). When a `type` IS set,
23
+ it must come from the tables below.
24
+ 3. **Kebab-case for lifecycle tokens.** Underscore names are reserved for the
25
+ `friction` and `skill_usage` event families.
26
+ 4. **Conditional fields.** Typed events trigger schema conditionals — see the
27
+ "Requires" column. Driver-emitted skip events have no model/provider; emit
28
+ the literal `"n/a"` for both (never guess a model string — see
29
+ `_fragments/event-emission-schema.md` §Why no example record here).
30
+ 5. **Skip reasons ride in `notes`.** `reason` is not a declared event property
31
+ (`additionalProperties: false` rejects it).
32
+
33
+ ## Task pipeline (orchestrate_task / run-task / wfl:run-task)
34
+
35
+ | Phase | Pass token | Fail token | Requires |
36
+ |---|---|---|---|
37
+ | plan | `task-planned` | `task-planned` | taskId, phase, iteration |
38
+ | review-plan | `plan-approved` | `review-failed` | taskId, phase, iteration |
39
+ | implement | `task-implemented` | `task-implemented` | taskId, phase, iteration |
40
+ | review-code | `review-passed` | `review-failed` | taskId, phase, iteration |
41
+ | validate | `task-validated` | `review-failed` | taskId, phase, iteration |
42
+ | approve | `task-approved` | `review-failed` | taskId, phase, iteration |
43
+ | commit | `task-committed` | `task-committed` | taskId, phase, iteration |
44
+
45
+ `plan-complete` is a legacy alias accepted by the enum for plan-phase events;
46
+ new emitters use `task-planned`.
47
+
48
+ ## Bug pipeline (fix_bug / fix-bug / wfl:fix-bug)
49
+
50
+ | Phase | Pass token | Fail token | Requires |
51
+ |---|---|---|---|
52
+ | pre-loop skip | `bug-skipped` | — | bugId (no phase/iteration; model/provider `"n/a"`) |
53
+ | triage | `bug-triaged` | `bug-triaged` | bugId, phase, iteration |
54
+ | plan-fix | `fix-planned` | `fix-planned` | bugId, phase, iteration |
55
+ | review-plan | `fix-review-passed` | `fix-review-failed` | bugId, phase, iteration |
56
+ | implement | `fix-implemented` | `fix-implemented` | bugId, phase, iteration |
57
+ | review-code | `fix-code-review-passed` | `fix-code-review-failed` | bugId, phase, iteration |
58
+ | approve | `fix-approved` | `fix-revision-requested` | bugId, phase, iteration |
59
+ | commit | `bug-committed` | `bug-commit-failed` | bugId, phase, iteration |
60
+
61
+ Non-review phases emit their single token regardless of outcome (the verdict
62
+ field carries the judgement); review phases (review-plan, review-code, approve)
63
+ select pass/fail on `verdict == "revision"`.
64
+
65
+ ## Sprint grain (run_sprint / run-sprint / wfl:run-sprint)
66
+
67
+ | Moment | Token | Requires |
68
+ |---|---|---|
69
+ | before wave loop | `sprint-start` | sprintId (taskCount optional) |
70
+ | before each task dispatch | `task-dispatch` | taskId (convention; phase/iteration carried but not schema-enforced) |
71
+ | sprint finished | `sprint-complete` | taskCount, completedTaskIds, verdict |
72
+ | sprint aborted | `sprint-halted` | haltedAtTaskIndex, haltedAtTaskId, lastError |
73
+
74
+ ## Other families
75
+
76
+ | Token | Emitter | Spec |
77
+ |---|---|---|
78
+ | `friction` | any persona, drained by orchestrator | `_fragments/friction-emit.md` |
79
+ | `skill_usage` | forge-cli skill-curation telemetry | `event.schema.json` skill_usage conditional |
80
+
81
+ ## Out of scope (known follow-ups)
82
+
83
+ - **Feature events** have no lifecycle tokens; feature-related events are
84
+ emitted untyped. Defining a feature vocabulary is a future change to this
85
+ fragment + the enum.
86
+ - **Task-pipeline typed emission in forge-cli** — run-task currently emits
87
+ untyped events (valid under Rule 2); adopting the task table above is
88
+ forward work tracked in forge-engineering#39 step 3.
@@ -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
+ }