@entelligentsia/forgecli 0.21.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +31 -33
  3. package/dist/CHANGELOG-forge-plugin.md +118 -0
  4. package/dist/CHANGELOG-pi.md +24 -1
  5. package/dist/bin/forgecli.d.ts +2 -0
  6. package/dist/bin/forgecli.js +6 -0
  7. package/dist/bin/forgecli.js.map +1 -0
  8. package/dist/extensions/forgecli/add-pipeline.js +1 -1
  9. package/dist/extensions/forgecli/add-pipeline.js.map +1 -1
  10. package/dist/extensions/forgecli/add-task.js +1 -1
  11. package/dist/extensions/forgecli/add-task.js.map +1 -1
  12. package/dist/extensions/forgecli/approve.js +17 -2
  13. package/dist/extensions/forgecli/approve.js.map +1 -1
  14. package/dist/extensions/forgecli/calibrate.js +11 -8
  15. package/dist/extensions/forgecli/calibrate.js.map +1 -1
  16. package/dist/extensions/forgecli/collate.js +1 -1
  17. package/dist/extensions/forgecli/collate.js.map +1 -1
  18. package/dist/extensions/forgecli/commit.js +17 -2
  19. package/dist/extensions/forgecli/commit.js.map +1 -1
  20. package/dist/extensions/forgecli/enhance.js +1 -1
  21. package/dist/extensions/forgecli/enhance.js.map +1 -1
  22. package/dist/extensions/forgecli/forge-artifact-tool.d.ts +6 -8
  23. package/dist/extensions/forgecli/forge-artifact-tool.js +80 -195
  24. package/dist/extensions/forgecli/forge-artifact-tool.js.map +1 -1
  25. package/dist/extensions/forgecli/forge-commands.js +57 -18
  26. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  27. package/dist/extensions/forgecli/forge-init/phase4-register.js +6 -7
  28. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  29. package/dist/extensions/forgecli/forge-init/run-phases.d.ts +4 -0
  30. package/dist/extensions/forgecli/forge-init/run-phases.js +304 -0
  31. package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -0
  32. package/dist/extensions/forgecli/forge-init/verifiers.d.ts +14 -5
  33. package/dist/extensions/forgecli/forge-init/verifiers.js +79 -62
  34. package/dist/extensions/forgecli/forge-init/verifiers.js.map +1 -1
  35. package/dist/extensions/forgecli/forge-init.js +131 -76
  36. package/dist/extensions/forgecli/forge-init.js.map +1 -1
  37. package/dist/extensions/forgecli/forge-subagent.d.ts +9 -0
  38. package/dist/extensions/forgecli/forge-subagent.js +11 -6
  39. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  40. package/dist/extensions/forgecli/forge-tools.d.ts +28 -4
  41. package/dist/extensions/forgecli/forge-tools.js +122 -73
  42. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  43. package/dist/extensions/forgecli/health-check.js +3 -3
  44. package/dist/extensions/forgecli/health-check.js.map +1 -1
  45. package/dist/extensions/forgecli/hook-dispatcher.d.ts +1 -1
  46. package/dist/extensions/forgecli/hooks/check-update.d.ts +8 -0
  47. package/dist/extensions/forgecli/hooks/check-update.js +29 -1
  48. package/dist/extensions/forgecli/hooks/check-update.js.map +1 -1
  49. package/dist/extensions/forgecli/hooks/post-init-hook.js +6 -6
  50. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
  51. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +6 -6
  52. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
  53. package/dist/extensions/forgecli/hooks/triage-error.js +1 -0
  54. package/dist/extensions/forgecli/hooks/triage-error.js.map +1 -1
  55. package/dist/extensions/forgecli/implement.js +20 -2
  56. package/dist/extensions/forgecli/implement.js.map +1 -1
  57. package/dist/extensions/forgecli/index.js +39 -32
  58. package/dist/extensions/forgecli/index.js.map +1 -1
  59. package/dist/extensions/forgecli/lib/pipeline-guard.d.ts +41 -0
  60. package/dist/extensions/forgecli/lib/pipeline-guard.js +100 -0
  61. package/dist/extensions/forgecli/lib/pipeline-guard.js.map +1 -0
  62. package/dist/extensions/forgecli/loaders/persona-skill-loader.js +2 -2
  63. package/dist/extensions/forgecli/loaders/persona-skill-loader.js.map +1 -1
  64. package/dist/extensions/forgecli/migrate.d.ts +3 -0
  65. package/dist/extensions/forgecli/migrate.js +4 -2
  66. package/dist/extensions/forgecli/migrate.js.map +1 -1
  67. package/dist/extensions/forgecli/plan.js +21 -2
  68. package/dist/extensions/forgecli/plan.js.map +1 -1
  69. package/dist/extensions/forgecli/quiz-agent.js +7 -7
  70. package/dist/extensions/forgecli/quiz-agent.js.map +1 -1
  71. package/dist/extensions/forgecli/regenerate.js +49 -18
  72. package/dist/extensions/forgecli/regenerate.js.map +1 -1
  73. package/dist/extensions/forgecli/remove-command.js +1 -1
  74. package/dist/extensions/forgecli/remove-command.js.map +1 -1
  75. package/dist/extensions/forgecli/report-bug.js +1 -1
  76. package/dist/extensions/forgecli/report-bug.js.map +1 -1
  77. package/dist/extensions/forgecli/retrospective.js +9 -9
  78. package/dist/extensions/forgecli/retrospective.js.map +1 -1
  79. package/dist/extensions/forgecli/review-code.d.ts +13 -0
  80. package/dist/extensions/forgecli/review-code.js +62 -3
  81. package/dist/extensions/forgecli/review-code.js.map +1 -1
  82. package/dist/extensions/forgecli/review-plan.d.ts +13 -0
  83. package/dist/extensions/forgecli/review-plan.js +65 -3
  84. package/dist/extensions/forgecli/review-plan.js.map +1 -1
  85. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +2 -1
  86. package/dist/extensions/forgecli/skill-curator-subagent.js +2 -1
  87. package/dist/extensions/forgecli/skill-curator-subagent.js.map +1 -1
  88. package/dist/extensions/forgecli/sprint-intake.js +6 -6
  89. package/dist/extensions/forgecli/sprint-intake.js.map +1 -1
  90. package/dist/extensions/forgecli/sprint-plan.js +9 -9
  91. package/dist/extensions/forgecli/sprint-plan.js.map +1 -1
  92. package/dist/extensions/forgecli/status-command.js +1 -1
  93. package/dist/extensions/forgecli/status-command.js.map +1 -1
  94. package/dist/extensions/forgecli/store-query.js +11 -11
  95. package/dist/extensions/forgecli/store-query.js.map +1 -1
  96. package/dist/extensions/forgecli/store-repair.js +7 -7
  97. package/dist/extensions/forgecli/store-repair.js.map +1 -1
  98. package/dist/extensions/forgecli/validate.js +17 -2
  99. package/dist/extensions/forgecli/validate.js.map +1 -1
  100. package/dist/forge-payload/.base-pack/commands/check-agent.md +22 -0
  101. package/dist/forge-payload/.base-pack/commands/new-sprint.md +22 -0
  102. package/dist/forge-payload/.base-pack/commands/plan-sprint.md +22 -0
  103. package/dist/forge-payload/.base-pack/commands/quiz-agent.md +2 -18
  104. package/dist/forge-payload/.base-pack/commands/retro.md +22 -0
  105. package/dist/forge-payload/.base-pack/commands/retrospective.md +2 -18
  106. package/dist/forge-payload/.base-pack/commands/sprint-intake.md +2 -18
  107. package/dist/forge-payload/.base-pack/commands/sprint-plan.md +2 -18
  108. package/dist/forge-payload/.base-pack/workflows/_fragments/friction-emit.md +2 -2
  109. package/dist/forge-payload/.base-pack/workflows/_fragments/generation-instructions.md +4 -4
  110. package/dist/forge-payload/.base-pack/workflows/_fragments/iron-laws.md +1 -1
  111. package/dist/forge-payload/.base-pack/workflows/architect_approve.md +13 -1
  112. package/dist/forge-payload/.base-pack/workflows/commit_task.md +12 -1
  113. package/dist/forge-payload/.base-pack/workflows/enhance.md +6 -6
  114. package/dist/forge-payload/.base-pack/workflows/fix_bug.md +1 -1
  115. package/dist/forge-payload/.base-pack/workflows/implement_plan.md +14 -2
  116. package/dist/forge-payload/.base-pack/workflows/migrate_structural.md +2 -2
  117. package/dist/forge-payload/.base-pack/workflows/orchestrate_task.md +20 -4
  118. package/dist/forge-payload/.base-pack/workflows/plan_task.md +14 -2
  119. package/dist/forge-payload/.base-pack/workflows/review_code.md +37 -7
  120. package/dist/forge-payload/.base-pack/workflows/review_plan.md +36 -6
  121. package/dist/forge-payload/.base-pack/workflows/run_sprint.md +2 -2
  122. package/dist/forge-payload/.base-pack/workflows/validate_task.md +37 -7
  123. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  124. package/dist/forge-payload/.schemas/config.schema.json +0 -5
  125. package/dist/forge-payload/.schemas/enum-catalog.json +9 -13
  126. package/dist/forge-payload/.schemas/migrations.json +54 -0
  127. package/dist/forge-payload/agents/tomoshibi.md +150 -6
  128. package/dist/forge-payload/commands/add-pipeline.md +1 -1
  129. package/dist/forge-payload/commands/add-task.md +1 -1
  130. package/dist/forge-payload/commands/calibrate.md +4 -350
  131. package/dist/forge-payload/commands/check-agent.md +38 -0
  132. package/dist/forge-payload/commands/config.md +3 -113
  133. package/dist/forge-payload/commands/enhance.md +5 -32
  134. package/dist/forge-payload/commands/health.md +155 -13
  135. package/dist/forge-payload/commands/init.md +25 -31
  136. package/dist/forge-payload/commands/migrate.md +6 -154
  137. package/dist/forge-payload/commands/quiz-agent.md +2 -34
  138. package/dist/forge-payload/commands/rebuild.md +664 -0
  139. package/dist/forge-payload/commands/regenerate.md +2 -774
  140. package/dist/forge-payload/commands/remove.md +10 -13
  141. package/dist/forge-payload/commands/repair.md +187 -0
  142. package/dist/forge-payload/commands/search.md +73 -0
  143. package/dist/forge-payload/commands/status.md +105 -0
  144. package/dist/forge-payload/commands/store-query.md +2 -69
  145. package/dist/forge-payload/commands/store-repair.md +2 -183
  146. package/dist/forge-payload/commands/update-tools.md +4 -50
  147. package/dist/forge-payload/commands/update.md +64 -58
  148. package/dist/forge-payload/hooks/check-update.cjs +1 -1
  149. package/dist/forge-payload/hooks/post-init.cjs +2 -2
  150. package/dist/forge-payload/hooks/post-sprint.cjs +2 -2
  151. package/dist/forge-payload/hooks/triage-error.cjs +11 -10
  152. package/dist/forge-payload/init/phases/phase-1-collect.md +138 -0
  153. package/dist/forge-payload/init/phases/phase-2-discover.md +127 -0
  154. package/dist/forge-payload/init/phases/phase-3-materialize.md +113 -0
  155. package/dist/forge-payload/init/phases/phase-4-register.md +159 -0
  156. package/dist/forge-payload/integrity.json +21 -24
  157. package/dist/forge-payload/meta/fragments/tool-discipline.md +22 -0
  158. package/dist/forge-payload/meta/templates/meta-retro.md +28 -0
  159. package/dist/forge-payload/meta/workflows/_fragments/friction-emit.md +2 -2
  160. package/dist/forge-payload/meta/workflows/_fragments/generation-instructions.md +4 -4
  161. package/dist/forge-payload/meta/workflows/_fragments/iron-laws.md +1 -1
  162. package/dist/forge-payload/meta/workflows/meta-approve.md +13 -1
  163. package/dist/forge-payload/meta/workflows/meta-check-agent.md +138 -0
  164. package/dist/forge-payload/meta/workflows/meta-commit.md +12 -1
  165. package/dist/forge-payload/meta/workflows/meta-enhance.md +5 -5
  166. package/dist/forge-payload/meta/workflows/meta-fix-bug.md +1 -1
  167. package/dist/forge-payload/meta/workflows/meta-implement.md +13 -1
  168. package/dist/forge-payload/meta/workflows/meta-migrate.md +3 -3
  169. package/dist/forge-payload/meta/workflows/meta-new-sprint.md +84 -0
  170. package/dist/forge-payload/meta/workflows/meta-orchestrate.md +20 -4
  171. package/dist/forge-payload/meta/workflows/meta-plan-sprint.md +152 -0
  172. package/dist/forge-payload/meta/workflows/meta-plan-task.md +13 -1
  173. package/dist/forge-payload/meta/workflows/meta-retro.md +73 -0
  174. package/dist/forge-payload/meta/workflows/meta-review-implementation.md +37 -7
  175. package/dist/forge-payload/meta/workflows/meta-review-plan.md +36 -6
  176. package/dist/forge-payload/meta/workflows/meta-validate.md +37 -7
  177. package/dist/forge-payload/schemas/config.schema.json +0 -5
  178. package/dist/forge-payload/schemas/enum-catalog.json +9 -13
  179. package/dist/forge-payload/schemas/structure-manifest.json +6 -8
  180. package/dist/forge-payload/tools/artifact.cjs +295 -0
  181. package/dist/forge-payload/tools/banners.cjs +3 -4
  182. package/dist/forge-payload/tools/build-context-pack.cjs +1 -1
  183. package/dist/forge-payload/tools/check-structure.cjs +8 -3
  184. package/dist/forge-payload/tools/store-cli.cjs +67 -7
  185. package/dist/forge-payload/tools/substitute-placeholders.cjs +1 -1
  186. package/dist/forge-payload/tools/verify-apply.cjs +75 -0
  187. package/dist/forge-payload/tools/verify-phase.cjs +259 -0
  188. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  189. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +0 -17
  190. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  191. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +21 -38
  192. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  193. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  194. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +5 -4
  195. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  196. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +2 -1
  197. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  198. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +5 -2
  199. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  200. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  201. package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +24 -1
  202. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.d.ts.map +1 -1
  203. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.js +2 -3
  204. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/file-processor.js.map +1 -1
  205. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.d.ts +1 -0
  206. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.d.ts.map +1 -1
  207. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.js +52 -22
  208. package/node_modules/@earendil-works/pi-coding-agent/dist/core/output-guard.js.map +1 -1
  209. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  210. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js +16 -4
  211. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  212. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  213. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js +45 -50
  214. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  215. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  216. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js +43 -81
  217. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  218. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  219. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.js +27 -12
  220. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/file-mutation-queue.js.map +1 -1
  221. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  222. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js +2 -3
  223. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  224. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  225. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js +3 -3
  226. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  227. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  228. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +5 -5
  229. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  230. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.d.ts +2 -0
  231. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.d.ts.map +1 -1
  232. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.js +37 -0
  233. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/path-utils.js.map +1 -1
  234. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  235. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +9 -8
  236. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  237. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  238. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +20 -35
  239. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  240. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +3 -0
  241. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  242. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js +64 -7
  243. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  244. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  245. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +15 -3
  246. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  247. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.d.ts +3 -1
  248. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.d.ts.map +1 -1
  249. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.js +14 -8
  250. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/clipboard-native.js.map +1 -1
  251. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.d.ts +30 -0
  252. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.d.ts.map +1 -0
  253. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.js +124 -0
  254. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-core.js.map +1 -0
  255. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.d.ts +2 -0
  256. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.d.ts.map +1 -0
  257. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.js +31 -0
  258. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize-worker.js.map +1 -0
  259. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.d.ts +7 -27
  260. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.d.ts.map +1 -1
  261. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.js +75 -115
  262. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/image-resize.js.map +1 -1
  263. package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +6 -0
  264. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
  265. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  266. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
  267. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
  268. package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +12 -14
  269. package/node_modules/@earendil-works/pi-coding-agent/package.json +5 -5
  270. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts +3 -0
  271. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +1 -0
  272. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js +53 -0
  273. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -0
  274. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  275. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +4 -1
  276. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  277. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +2 -0
  278. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  279. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +13 -1
  280. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  281. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  282. package/node_modules/@earendil-works/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  283. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  284. package/package.json +6 -6
  285. package/dist/extensions/forgecli/forge-init/phase-descriptors.d.ts +0 -72
  286. package/dist/extensions/forgecli/forge-init/phase-descriptors.js +0 -359
  287. package/dist/extensions/forgecli/forge-init/phase-descriptors.js.map +0 -1
  288. package/dist/extensions/forgecli/forge-init/prompts.d.ts +0 -10
  289. package/dist/extensions/forgecli/forge-init/prompts.js +0 -91
  290. package/dist/extensions/forgecli/forge-init/prompts.js.map +0 -1
  291. package/dist/extensions/forgecli/lib/store-error-remediation.d.ts +0 -65
  292. package/dist/extensions/forgecli/lib/store-error-remediation.js +0 -298
  293. package/dist/extensions/forgecli/lib/store-error-remediation.js.map +0 -1
  294. package/dist/forge-payload/hooks/check-update.js +0 -378
  295. package/dist/forge-payload/hooks/forge-permissions.js +0 -164
  296. package/dist/forge-payload/hooks/triage-error.js +0 -77
  297. package/dist/forge-payload/hooks/validate-write.js +0 -250
@@ -1,250 +0,0 @@
1
- #!/usr/bin/env node
2
- // Forge write-boundary hook — runs PreToolUse on Write / Edit / MultiEdit.
3
- //
4
- // Purpose: enforce Forge schemas at the filesystem boundary so agents remain
5
- // free to bypass deterministic tools (store-cli), as long as any write they
6
- // do against Forge-owned paths honors the schema contract.
7
- //
8
- // Protocol (Claude Code PreToolUse hook):
9
- // - stdin: JSON envelope { tool_name, tool_input, ... }
10
- // - exit 0: allow the tool call
11
- // - exit 2 with stderr payload: block the tool call and surface the message
12
- //
13
- // Fail-open philosophy: any internal error (unreadable schema, parse bug,
14
- // unexpected tool input shape) exits 0 with a stderr warning. A broken
15
- // validator must never block legitimate work — validate-store.cjs remains
16
- // as a post-hoc auditor.
17
-
18
- 'use strict';
19
-
20
- process.on('uncaughtException', (err) => {
21
- try { process.stderr.write(`forge validate-write: internal error (fail-open): ${err.message}\n`); } catch (_) {}
22
- process.exit(0);
23
- });
24
-
25
- const fs = require('fs');
26
- const path = require('path');
27
-
28
- const { matchRegistry } = require('./lib/write-registry.js');
29
-
30
- // Schema resolution — delegates to lib/schema-loader.cjs which implements the
31
- // same 4-path search chain (project → in-tree → plugin-installed → bundled)
32
- // that store-cli.cjs uses. This ensures the hook sees the exact same schemas
33
- // as tool writes do, and gains the bundled .schemas/ lookup that the previous
34
- // inline loadSchema() was missing.
35
- const PLUGIN_ROOT = process.env.CLAUDE_PLUGIN_ROOT || path.join(__dirname, '..');
36
-
37
- function resolveValidator() {
38
- // store-cli's shared validator lives at forge/tools/lib/validate.js. Require
39
- // it relative to the plugin root so the hook works from both dev tree and
40
- // installed plugin cache.
41
- const candidates = [
42
- path.join(PLUGIN_ROOT, 'tools', 'lib', 'validate.js'),
43
- path.join(__dirname, '..', 'tools', 'lib', 'validate.js'),
44
- ];
45
- for (const c of candidates) {
46
- if (fs.existsSync(c)) return require(c);
47
- }
48
- throw new Error(`validate.js not found (looked in: ${candidates.join(', ')})`);
49
- }
50
-
51
- function resolveSchemaLoader() {
52
- // schema-loader.cjs lives at forge/tools/lib/schema-loader.cjs. Resolve it
53
- // relative to the plugin root so the hook works from both dev tree and
54
- // installed plugin cache.
55
- const candidates = [
56
- path.join(PLUGIN_ROOT, 'tools', 'lib', 'schema-loader.cjs'),
57
- path.join(__dirname, '..', 'tools', 'lib', 'schema-loader.cjs'),
58
- ];
59
- for (const c of candidates) {
60
- if (fs.existsSync(c)) return require(c);
61
- }
62
- throw new Error(`schema-loader.cjs not found (looked in: ${candidates.join(', ')})`);
63
- }
64
-
65
- function loadSchema(filename) {
66
- // filename is e.g. "task.schema.json"; the schema-loader key is "task".
67
- const typeKey = filename.replace(/\.schema\.json$/, '');
68
- const { loadSchemas } = resolveSchemaLoader();
69
- const schemas = loadSchemas();
70
- const schema = schemas[typeKey];
71
- if (!schema) {
72
- throw new Error(`schema not found: ${filename}`);
73
- }
74
- return schema;
75
- }
76
-
77
- function readStdinSync() {
78
- try {
79
- return fs.readFileSync(0, 'utf8');
80
- } catch (_) {
81
- return '';
82
- }
83
- }
84
-
85
- // Apply Edit semantics: replace old_string with new_string in contents.
86
- // If replace_all is true, replace every occurrence; otherwise replace the
87
- // first (and only) occurrence. Errors if old_string is absent or ambiguous
88
- // when replace_all is false — mirrors the Edit tool contract.
89
- function applyEdit(contents, oldStr, newStr, replaceAll) {
90
- if (oldStr === '' && contents === '') return newStr; // new-file Edit
91
- if (oldStr === '') throw new Error('Edit: old_string is empty');
92
- if (replaceAll) return contents.split(oldStr).join(newStr);
93
- const idx = contents.indexOf(oldStr);
94
- if (idx === -1) throw new Error('Edit: old_string not found in file');
95
- const next = contents.indexOf(oldStr, idx + oldStr.length);
96
- if (next !== -1) throw new Error('Edit: old_string is ambiguous (appears more than once)');
97
- return contents.slice(0, idx) + newStr + contents.slice(idx + oldStr.length);
98
- }
99
-
100
- function computePostEditContents(toolName, toolInput) {
101
- const filePath = toolInput.file_path;
102
- if (toolName === 'Write') {
103
- return { filePath, contents: toolInput.content != null ? String(toolInput.content) : '' };
104
- }
105
- const prior = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : '';
106
- if (toolName === 'Edit') {
107
- return {
108
- filePath,
109
- contents: applyEdit(prior, toolInput.old_string || '', toolInput.new_string || '', !!toolInput.replace_all),
110
- };
111
- }
112
- // MultiEdit
113
- let cur = prior;
114
- const edits = Array.isArray(toolInput.edits) ? toolInput.edits : [];
115
- for (const e of edits) {
116
- cur = applyEdit(cur, e.old_string || '', e.new_string || '', !!e.replace_all);
117
- }
118
- return { filePath, contents: cur, prior };
119
- }
120
-
121
- function parseProgressLine(line) {
122
- // timestamp|agentName|bannerKey|status|detail
123
- const parts = line.split('|');
124
- if (parts.length < 4) return null;
125
- return {
126
- timestamp: parts[0],
127
- agentName: parts[1],
128
- bannerKey: parts[2],
129
- status: parts[3],
130
- detail: parts.slice(4).join('|'),
131
- };
132
- }
133
-
134
- function validateProgressAppend(prior, proposed, validator, schema) {
135
- // Only validate lines that are NEW — anything already on disk is grandfathered.
136
- if (!proposed.startsWith(prior)) {
137
- // Wholesale rewrite, not an append. Validate every non-empty line.
138
- const lines = proposed.split('\n').filter(l => l.length > 0);
139
- return lines.flatMap((l, i) => annotateLine(validator, schema, l, i));
140
- }
141
- const suffix = proposed.slice(prior.length);
142
- const newLines = suffix.split('\n').filter(l => l.length > 0);
143
- return newLines.flatMap((l, i) => annotateLine(validator, schema, l, i));
144
- }
145
-
146
- function annotateLine(validator, schema, line, idx) {
147
- const rec = parseProgressLine(line);
148
- if (!rec) return [`line ${idx + 1}: malformed (expected 4+ pipe-delimited fields)`];
149
- const errors = validator.validateRecord(rec, schema);
150
- return errors.map(e => `line ${idx + 1}: ${e}`);
151
- }
152
-
153
- function writeBypassAudit(filePath, reason) {
154
- try {
155
- const m = /\/\.forge\/store\/events\/([^/]+)\//.exec(filePath) || /\.forge\/store\/events\/([^/]+)\//.exec(filePath);
156
- const bucket = m ? m[1] : 'unknown';
157
- const logPath = path.join(process.cwd(), '.forge', 'store', 'events', bucket, 'progress.log');
158
- if (!fs.existsSync(path.dirname(logPath))) return;
159
- const ts = new Date().toISOString();
160
- const line = `${ts}|forge-hook|write-boundary|progress|${reason}\n`;
161
- fs.appendFileSync(logPath, line, 'utf8');
162
- } catch (_) { /* audit best-effort */ }
163
- }
164
-
165
- function block(message) {
166
- process.stderr.write(message + '\n');
167
- process.exit(2);
168
- }
169
-
170
- function main() {
171
- const raw = readStdinSync();
172
- if (!raw) process.exit(0);
173
-
174
- let envelope;
175
- try { envelope = JSON.parse(raw); } catch (_) { process.exit(0); }
176
-
177
- const toolName = envelope.tool_name;
178
- if (!['Write', 'Edit', 'MultiEdit'].includes(toolName)) process.exit(0);
179
-
180
- const toolInput = envelope.tool_input || {};
181
- const filePath = toolInput.file_path;
182
- if (!filePath || typeof filePath !== 'string') process.exit(0);
183
-
184
- const entry = matchRegistry(filePath);
185
- if (!entry) process.exit(0);
186
-
187
- if (process.env.FORGE_SKIP_WRITE_VALIDATION === '1') {
188
- writeBypassAudit(filePath, `FORGE_SKIP_WRITE_VALIDATION=1 bypass on ${toolName} ${path.relative(process.cwd(), filePath)}`);
189
- process.exit(0);
190
- }
191
-
192
- let validator, schema, post;
193
- try {
194
- validator = resolveValidator();
195
- schema = loadSchema(entry.schema);
196
- post = computePostEditContents(toolName, toolInput);
197
- } catch (err) {
198
- process.stderr.write(`forge validate-write: setup error (fail-open): ${err.message}\n`);
199
- process.exit(0);
200
- }
201
-
202
- const relPath = path.relative(process.cwd(), post.filePath);
203
-
204
- if (entry.format === 'line-pipe-delimited') {
205
- const prior = post.prior != null ? post.prior : (fs.existsSync(post.filePath) ? fs.readFileSync(post.filePath, 'utf8') : '');
206
- const errs = validateProgressAppend(prior, post.contents, validator, schema);
207
- if (errs.length > 0) {
208
- block(
209
- '❌ Forge schema violation — write blocked\n' +
210
- `Path: ${relPath}\n` +
211
- `Kind: ${entry.kind}\n` +
212
- `Violations:\n - ${errs.join('\n - ')}\n` +
213
- `Hint: progress.log lines must be "timestamp|agentName|bannerKey|status|detail"; see forge/schemas/${entry.schema}.\n` +
214
- 'To bypass for one turn (emergency repair): FORGE_SKIP_WRITE_VALIDATION=1.'
215
- );
216
- }
217
- process.exit(0);
218
- }
219
-
220
- // JSON payloads
221
- let parsed;
222
- try {
223
- parsed = JSON.parse(post.contents);
224
- } catch (err) {
225
- block(
226
- '❌ Forge schema violation — write blocked\n' +
227
- `Path: ${relPath}\n` +
228
- `Kind: ${entry.kind}\n` +
229
- `Violation: Invalid JSON: ${err.message}\n` +
230
- `Hint: see forge/schemas/${entry.schema} for the expected shape.\n` +
231
- 'To bypass for one turn (emergency repair): FORGE_SKIP_WRITE_VALIDATION=1.'
232
- );
233
- }
234
-
235
- const errs = validator.validateRecord(parsed, schema);
236
- if (errs.length > 0) {
237
- block(
238
- '❌ Forge schema violation — write blocked\n' +
239
- `Path: ${relPath}\n` +
240
- `Kind: ${entry.kind}\n` +
241
- `Violations:\n - ${errs.join('\n - ')}\n` +
242
- `Hint: see forge/schemas/${entry.schema} for the full shape.\n` +
243
- 'To bypass for one turn (emergency repair): FORGE_SKIP_WRITE_VALIDATION=1.'
244
- );
245
- }
246
-
247
- process.exit(0);
248
- }
249
-
250
- main();