@entelligentsia/forgecli 1.0.36 → 1.0.40

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 (654) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/CHANGELOG-forge-plugin.md +101 -0
  3. package/dist/CHANGELOG-pi.md +143 -0
  4. package/dist/bin/argv.d.ts +1 -1
  5. package/dist/bin/argv.js +12 -0
  6. package/dist/bin/argv.js.map +1 -1
  7. package/dist/bin/forge.js +18 -16
  8. package/dist/bin/forge.js.map +1 -1
  9. package/dist/bin/reset.d.ts +39 -0
  10. package/dist/bin/reset.js +101 -0
  11. package/dist/bin/reset.js.map +1 -0
  12. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js +56 -265
  13. package/dist/extensions/forgecli/claude-bootstrap/bootstrap.js.map +1 -1
  14. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js +52 -32
  15. package/dist/extensions/forgecli/claude-bootstrap/uninstall.js.map +1 -1
  16. package/dist/extensions/forgecli/commands/reset.d.ts +16 -0
  17. package/dist/extensions/forgecli/commands/reset.js +83 -0
  18. package/dist/extensions/forgecli/commands/reset.js.map +1 -0
  19. package/dist/extensions/forgecli/forge-commands.d.ts +7 -2
  20. package/dist/extensions/forgecli/forge-commands.js +19 -5
  21. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  22. package/dist/extensions/forgecli/forge-subagent.d.ts +4 -4
  23. package/dist/extensions/forgecli/hooks/forge-permissions.js +20 -6
  24. package/dist/extensions/forgecli/hooks/forge-permissions.js.map +1 -1
  25. package/dist/extensions/forgecli/index.js +6 -3
  26. package/dist/extensions/forgecli/index.js.map +1 -1
  27. package/dist/extensions/forgecli/lib/forge-root.d.ts +6 -0
  28. package/dist/extensions/forgecli/lib/forge-root.js +52 -0
  29. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -1
  30. package/dist/extensions/forgecli/lib/payload-manifest.d.ts +62 -0
  31. package/dist/extensions/forgecli/lib/payload-manifest.js +151 -0
  32. package/dist/extensions/forgecli/lib/payload-manifest.js.map +1 -0
  33. package/dist/extensions/forgecli/orchestrators/advisory-render.d.ts +9 -0
  34. package/dist/extensions/forgecli/orchestrators/advisory-render.js +107 -0
  35. package/dist/extensions/forgecli/orchestrators/advisory-render.js.map +1 -0
  36. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.d.ts +3 -0
  37. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js +22 -0
  38. package/dist/extensions/forgecli/orchestrators/bug/bug-phases.js.map +1 -1
  39. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.d.ts +1 -1
  40. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js +34 -2
  41. package/dist/extensions/forgecli/orchestrators/bug/bug-verdict-loop.js.map +1 -1
  42. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js +2 -2
  43. package/dist/extensions/forgecli/orchestrators/bug/run-bug-pipeline.js.map +1 -1
  44. package/dist/extensions/forgecli/orchestrators/common/recovery-menu.d.ts +24 -0
  45. package/dist/extensions/forgecli/orchestrators/common/recovery-menu.js +58 -0
  46. package/dist/extensions/forgecli/orchestrators/common/recovery-menu.js.map +1 -0
  47. package/dist/extensions/forgecli/orchestrators/common/reset-pipeline.d.ts +53 -0
  48. package/dist/extensions/forgecli/orchestrators/common/reset-pipeline.js +131 -0
  49. package/dist/extensions/forgecli/orchestrators/common/reset-pipeline.js.map +1 -0
  50. package/dist/extensions/forgecli/orchestrators/halt-advisor.js +25 -3
  51. package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -1
  52. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js +3 -3
  53. package/dist/extensions/forgecli/orchestrators/task/run-task-pipeline.js.map +1 -1
  54. package/dist/extensions/forgecli/orchestrators/task/task-phases.d.ts +3 -0
  55. package/dist/extensions/forgecli/orchestrators/task/task-phases.js +22 -0
  56. package/dist/extensions/forgecli/orchestrators/task/task-phases.js.map +1 -1
  57. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.d.ts +1 -1
  58. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js +37 -2
  59. package/dist/extensions/forgecli/orchestrators/task/task-verdict-loop.js.map +1 -1
  60. package/dist/extensions/forgecli/store/store-resolver.d.ts +15 -0
  61. package/dist/extensions/forgecli/store/store-resolver.js +118 -18
  62. package/dist/extensions/forgecli/store/store-resolver.js.map +1 -1
  63. package/dist/forge-payload/.claude-plugin/plugin.json +1 -1
  64. package/dist/forge-payload/.schemas/enum-catalog.json +2 -2
  65. package/dist/forge-payload/.schemas/migrations.json +85 -0
  66. package/dist/forge-payload/.schemas/payload-manifest.schema.json +100 -0
  67. package/dist/forge-payload/commands/check-agent.md +7 -23
  68. package/dist/forge-payload/commands/enhance.md +31 -5
  69. package/dist/forge-payload/commands/init.md +161 -97
  70. package/dist/forge-payload/commands/reset.md +117 -0
  71. package/dist/forge-payload/hooks/forge-permissions.cjs +29 -6
  72. package/dist/forge-payload/init/phases/phase-3-materialize.md +5 -1
  73. package/dist/forge-payload/integrity.json +22 -7
  74. package/dist/forge-payload/payload-manifest.json +314 -0
  75. package/dist/forge-payload/schemas/enum-catalog.json +2 -2
  76. package/dist/forge-payload/schemas/payload-manifest.schema.json +100 -0
  77. package/dist/forge-payload/schemas/structure-manifest.json +4 -2
  78. package/dist/forge-payload/tools/reset-plan.cjs +210 -0
  79. package/dist/forge-payload/tools/store.cjs +4 -1
  80. package/dist/forge-payload/tools/substitute-placeholders.cjs +10 -2
  81. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  82. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -0
  83. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  84. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts +1 -1
  85. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  86. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +1 -1
  87. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  88. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts +4 -0
  89. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.d.ts.map +1 -0
  90. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js +3 -0
  91. package/node_modules/@earendil-works/pi-agent-core/dist/harness/execution-env.js.map +1 -0
  92. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts +20 -0
  93. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.d.ts.map +1 -0
  94. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js +92 -0
  95. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/jsonl.js.map +1 -0
  96. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts +18 -0
  97. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.d.ts.map +1 -0
  98. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js +42 -0
  99. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/memory.js.map +1 -0
  100. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts +10 -0
  101. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.d.ts.map +1 -0
  102. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js +31 -0
  103. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo/shared.js.map +1 -0
  104. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts +30 -0
  105. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.d.ts.map +1 -0
  106. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js +170 -0
  107. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/jsonl.js.map +1 -0
  108. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts +26 -0
  109. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.d.ts.map +1 -0
  110. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js +90 -0
  111. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/storage/memory.js.map +1 -0
  112. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +6 -1
  113. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  114. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  115. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  116. package/node_modules/@earendil-works/pi-ai/README.md +12 -4
  117. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  118. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +3 -0
  119. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  120. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +45 -0
  121. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  122. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +45 -0
  123. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  124. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +1804 -815
  125. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  126. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +2031 -1384
  127. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  128. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  129. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +71 -27
  130. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  131. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts +1 -1
  132. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  133. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +24 -16
  134. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  135. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  136. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +1 -0
  137. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  138. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  139. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +3 -1
  140. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  141. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  142. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +35 -13
  143. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  144. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  145. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +2 -1
  146. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  147. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +1 -0
  149. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +12 -4
  151. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  153. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +13 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  156. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js +4 -2
  158. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  159. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  161. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +3 -2
  162. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  163. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  164. package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +143 -0
  165. package/node_modules/@earendil-works/pi-coding-agent/README.md +26 -4
  166. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts +1 -0
  167. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  168. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js +11 -0
  169. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/args.js.map +1 -1
  170. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/project-trust.d.ts +10 -0
  171. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/project-trust.d.ts.map +1 -0
  172. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/project-trust.js +48 -0
  173. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/project-trust.js.map +1 -0
  174. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/startup-ui.d.ts +17 -0
  175. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/startup-ui.d.ts.map +1 -0
  176. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/startup-ui.js +128 -0
  177. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/startup-ui.js.map +1 -0
  178. package/node_modules/@earendil-works/pi-coding-agent/dist/config.d.ts.map +1 -1
  179. package/node_modules/@earendil-works/pi-coding-agent/dist/config.js +9 -1
  180. package/node_modules/@earendil-works/pi-coding-agent/dist/config.js.map +1 -1
  181. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-runtime.d.ts +3 -1
  182. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-runtime.d.ts.map +1 -1
  183. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-runtime.js +4 -1
  184. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-runtime.js.map +1 -1
  185. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts +2 -1
  186. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.d.ts.map +1 -1
  187. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js +2 -2
  188. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js.map +1 -1
  189. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts +4 -1
  190. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  191. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +16 -3
  192. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  193. package/node_modules/@earendil-works/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  194. package/node_modules/@earendil-works/pi-coding-agent/dist/core/auth-storage.js +4 -3
  195. package/node_modules/@earendil-works/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  196. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +3 -1
  197. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  198. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/branch-summarization.js +9 -3
  199. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  200. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/utils.d.ts +1 -1
  201. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  202. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/utils.js +1 -1
  203. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  204. package/node_modules/@earendil-works/pi-coding-agent/dist/core/experimental.d.ts +2 -0
  205. package/node_modules/@earendil-works/pi-coding-agent/dist/core/experimental.d.ts.map +1 -0
  206. package/node_modules/@earendil-works/pi-coding-agent/dist/core/experimental.js +4 -0
  207. package/node_modules/@earendil-works/pi-coding-agent/dist/core/experimental.js.map +1 -0
  208. package/node_modules/@earendil-works/pi-coding-agent/dist/core/export-html/template.js +19 -6
  209. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  210. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  211. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  212. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -1
  213. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  214. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.js +4 -4
  215. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  216. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts +10 -3
  217. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  218. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js +47 -1
  219. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  220. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts +28 -2
  221. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  222. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  223. package/node_modules/@earendil-works/pi-coding-agent/dist/core/footer-data-provider.d.ts +2 -0
  224. package/node_modules/@earendil-works/pi-coding-agent/dist/core/footer-data-provider.d.ts.map +1 -1
  225. package/node_modules/@earendil-works/pi-coding-agent/dist/core/footer-data-provider.js +29 -1
  226. package/node_modules/@earendil-works/pi-coding-agent/dist/core/footer-data-provider.js.map +1 -1
  227. package/node_modules/@earendil-works/pi-coding-agent/dist/core/index.d.ts +1 -0
  228. package/node_modules/@earendil-works/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  229. package/node_modules/@earendil-works/pi-coding-agent/dist/core/index.js +1 -0
  230. package/node_modules/@earendil-works/pi-coding-agent/dist/core/index.js.map +1 -1
  231. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  232. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js +1 -0
  233. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  234. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.d.ts +1 -0
  235. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  236. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js +44 -5
  237. package/node_modules/@earendil-works/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  238. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.d.ts +3 -0
  239. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  240. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js +47 -13
  241. package/node_modules/@earendil-works/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  242. package/node_modules/@earendil-works/pi-coding-agent/dist/core/project-trust.d.ts +15 -0
  243. package/node_modules/@earendil-works/pi-coding-agent/dist/core/project-trust.d.ts.map +1 -0
  244. package/node_modules/@earendil-works/pi-coding-agent/dist/core/project-trust.js +58 -0
  245. package/node_modules/@earendil-works/pi-coding-agent/dist/core/project-trust.js.map +1 -0
  246. package/node_modules/@earendil-works/pi-coding-agent/dist/core/prompt-templates.d.ts +2 -1
  247. package/node_modules/@earendil-works/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  248. package/node_modules/@earendil-works/pi-coding-agent/dist/core/prompt-templates.js +24 -26
  249. package/node_modules/@earendil-works/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  250. package/node_modules/@earendil-works/pi-coding-agent/dist/core/provider-attribution.d.ts +4 -0
  251. package/node_modules/@earendil-works/pi-coding-agent/dist/core/provider-attribution.d.ts.map +1 -0
  252. package/node_modules/@earendil-works/pi-coding-agent/dist/core/provider-attribution.js +72 -0
  253. package/node_modules/@earendil-works/pi-coding-agent/dist/core/provider-attribution.js.map +1 -0
  254. package/node_modules/@earendil-works/pi-coding-agent/dist/core/provider-display-names.d.ts.map +1 -1
  255. package/node_modules/@earendil-works/pi-coding-agent/dist/core/provider-display-names.js +3 -0
  256. package/node_modules/@earendil-works/pi-coding-agent/dist/core/provider-display-names.js.map +1 -1
  257. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resource-loader.d.ts +13 -2
  258. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  259. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resource-loader.js +112 -37
  260. package/node_modules/@earendil-works/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  261. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  262. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js +7 -33
  263. package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js.map +1 -1
  264. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  265. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js +103 -70
  266. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  267. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts +20 -2
  268. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  269. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js +97 -30
  270. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  271. package/node_modules/@earendil-works/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  272. package/node_modules/@earendil-works/pi-coding-agent/dist/core/slash-commands.js +1 -0
  273. package/node_modules/@earendil-works/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  274. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  275. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js +1 -1
  276. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  277. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  278. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js +1 -1
  279. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  280. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  281. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js +1 -1
  282. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  283. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  284. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js +1 -1
  285. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  286. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  287. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js +1 -1
  288. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  289. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  290. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js +1 -1
  291. package/node_modules/@earendil-works/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  292. package/node_modules/@earendil-works/pi-coding-agent/dist/core/trust-manager.d.ts +36 -0
  293. package/node_modules/@earendil-works/pi-coding-agent/dist/core/trust-manager.d.ts.map +1 -0
  294. package/node_modules/@earendil-works/pi-coding-agent/dist/core/trust-manager.js +202 -0
  295. package/node_modules/@earendil-works/pi-coding-agent/dist/core/trust-manager.js.map +1 -0
  296. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts +5 -4
  297. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts.map +1 -1
  298. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js +2 -1
  299. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js.map +1 -1
  300. package/node_modules/@earendil-works/pi-coding-agent/dist/main.d.ts.map +1 -1
  301. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js +72 -32
  302. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js.map +1 -1
  303. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  304. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js +39 -34
  305. package/node_modules/@earendil-works/pi-coding-agent/dist/migrations.js.map +1 -1
  306. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/index.d.ts +1 -1
  307. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/index.d.ts.map +1 -1
  308. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/index.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  310. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -2
  311. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  312. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  313. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  314. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/first-time-setup.js +103 -0
  315. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  316. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  317. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/footer.js +7 -0
  318. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  319. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/index.d.ts +2 -0
  320. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/index.d.ts.map +1 -1
  321. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/index.js +2 -0
  322. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/index.js.map +1 -1
  323. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  324. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  325. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js +10 -13
  326. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/login-dialog.js.map +1 -1
  327. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  328. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  329. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +20 -0
  330. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  331. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  332. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +22 -0
  333. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  335. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  336. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/trust-selector.js +91 -0
  337. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/trust-selector.js.map +1 -0
  338. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +7 -0
  339. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  340. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +101 -5
  341. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  343. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/print-mode.js +1 -0
  344. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  345. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  346. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +1 -0
  347. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  348. package/node_modules/@earendil-works/pi-coding-agent/dist/package-manager-cli.d.ts +6 -2
  349. package/node_modules/@earendil-works/pi-coding-agent/dist/package-manager-cli.d.ts.map +1 -1
  350. package/node_modules/@earendil-works/pi-coding-agent/dist/package-manager-cli.js +111 -10
  351. package/node_modules/@earendil-works/pi-coding-agent/dist/package-manager-cli.js.map +1 -1
  352. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/changelog.d.ts +1 -0
  353. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  354. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/changelog.js +78 -0
  355. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  356. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/git.d.ts.map +1 -1
  357. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/git.js +54 -22
  358. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/git.js.map +1 -1
  359. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/open-browser.d.ts +9 -0
  360. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/open-browser.d.ts.map +1 -0
  361. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/open-browser.js +22 -0
  362. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/open-browser.js.map +1 -0
  363. package/node_modules/@earendil-works/pi-coding-agent/docs/containerization.md +111 -0
  364. package/node_modules/@earendil-works/pi-coding-agent/docs/docs.json +8 -0
  365. package/node_modules/@earendil-works/pi-coding-agent/docs/extensions.md +67 -13
  366. package/node_modules/@earendil-works/pi-coding-agent/docs/index.md +2 -0
  367. package/node_modules/@earendil-works/pi-coding-agent/docs/models.md +4 -3
  368. package/node_modules/@earendil-works/pi-coding-agent/docs/packages.md +1 -1
  369. package/node_modules/@earendil-works/pi-coding-agent/docs/prompt-templates.md +9 -2
  370. package/node_modules/@earendil-works/pi-coding-agent/docs/providers.md +5 -0
  371. package/node_modules/@earendil-works/pi-coding-agent/docs/rpc.md +1 -1
  372. package/node_modules/@earendil-works/pi-coding-agent/docs/sdk.md +5 -0
  373. package/node_modules/@earendil-works/pi-coding-agent/docs/security.md +59 -0
  374. package/node_modules/@earendil-works/pi-coding-agent/docs/settings.md +15 -0
  375. package/node_modules/@earendil-works/pi-coding-agent/docs/skills.md +1 -1
  376. package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +36 -2
  377. package/node_modules/@earendil-works/pi-coding-agent/docs/themes.md +1 -1
  378. package/node_modules/@earendil-works/pi-coding-agent/docs/tmux.md +4 -2
  379. package/node_modules/@earendil-works/pi-coding-agent/docs/tui.md +10 -1
  380. package/node_modules/@earendil-works/pi-coding-agent/docs/usage.md +19 -2
  381. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/README.md +2 -0
  382. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-header.ts +1 -1
  383. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
  384. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  385. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/doom-overlay/index.ts +1 -1
  386. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/gondolin/index.ts +531 -0
  387. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/gondolin/package-lock.json +185 -0
  388. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/gondolin/package.json +19 -0
  389. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/handoff.ts +1 -1
  390. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/interactive-shell.ts +1 -1
  391. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/overlay-qa-tests.ts +152 -81
  392. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/project-trust.ts +64 -0
  393. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/qna.ts +1 -1
  394. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/question.ts +1 -1
  395. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/questionnaire.ts +1 -1
  396. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
  397. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/snake.ts +1 -1
  398. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/space-invaders.ts +1 -1
  399. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/summarize.ts +1 -1
  400. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/tic-tac-toe.ts +1 -1
  401. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/todo.ts +1 -1
  402. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/tools.ts +5 -0
  403. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
  404. package/node_modules/@earendil-works/pi-coding-agent/npm-shrinkwrap.json +12 -419
  405. package/node_modules/@earendil-works/pi-coding-agent/package.json +5 -8
  406. package/node_modules/@earendil-works/pi-tui/README.md +13 -1
  407. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +2 -0
  408. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  409. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  410. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -1
  411. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  412. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +102 -43
  413. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  414. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +2 -1
  415. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  416. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +11 -1
  417. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  418. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts +1 -1
  419. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +1 -1
  420. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js +2 -2
  421. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +1 -1
  422. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  423. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  424. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +4 -7
  426. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  427. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +38 -77
  428. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  429. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +20 -4
  430. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  431. package/node_modules/@earendil-works/pi-tui/dist/tui.js +244 -42
  432. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  433. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts +1 -0
  434. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  435. package/node_modules/@earendil-works/pi-tui/dist/utils.js +46 -15
  436. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  437. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  438. package/node_modules/@mariozechner/clipboard/package.json +2 -1
  439. package/node_modules/@mariozechner/clipboard-linux-x64-musl/README.md +3 -0
  440. package/node_modules/@mariozechner/clipboard-linux-x64-musl/package.json +25 -0
  441. package/package.json +7 -6
  442. package/dist/extensions/forgecli/add-pipeline.d.ts +0 -19
  443. package/dist/extensions/forgecli/add-pipeline.js +0 -143
  444. package/dist/extensions/forgecli/add-pipeline.js.map +0 -1
  445. package/dist/extensions/forgecli/add-task.d.ts +0 -20
  446. package/dist/extensions/forgecli/add-task.js +0 -154
  447. package/dist/extensions/forgecli/add-task.js.map +0 -1
  448. package/dist/extensions/forgecli/approve.d.ts +0 -22
  449. package/dist/extensions/forgecli/approve.js +0 -152
  450. package/dist/extensions/forgecli/approve.js.map +0 -1
  451. package/dist/extensions/forgecli/banner.d.ts +0 -10
  452. package/dist/extensions/forgecli/banner.js +0 -36
  453. package/dist/extensions/forgecli/banner.js.map +0 -1
  454. package/dist/extensions/forgecli/calibrate.d.ts +0 -64
  455. package/dist/extensions/forgecli/calibrate.js +0 -481
  456. package/dist/extensions/forgecli/calibrate.js.map +0 -1
  457. package/dist/extensions/forgecli/collate.d.ts +0 -22
  458. package/dist/extensions/forgecli/collate.js +0 -134
  459. package/dist/extensions/forgecli/collate.js.map +0 -1
  460. package/dist/extensions/forgecli/commit.d.ts +0 -22
  461. package/dist/extensions/forgecli/commit.js +0 -152
  462. package/dist/extensions/forgecli/commit.js.map +0 -1
  463. package/dist/extensions/forgecli/config-command.d.ts +0 -8
  464. package/dist/extensions/forgecli/config-command.js +0 -67
  465. package/dist/extensions/forgecli/config-command.js.map +0 -1
  466. package/dist/extensions/forgecli/config-layer.d.ts +0 -53
  467. package/dist/extensions/forgecli/config-layer.js +0 -72
  468. package/dist/extensions/forgecli/config-layer.js.map +0 -1
  469. package/dist/extensions/forgecli/config-writer.d.ts +0 -16
  470. package/dist/extensions/forgecli/config-writer.js +0 -69
  471. package/dist/extensions/forgecli/config-writer.js.map +0 -1
  472. package/dist/extensions/forgecli/enhance.d.ts +0 -27
  473. package/dist/extensions/forgecli/enhance.js +0 -199
  474. package/dist/extensions/forgecli/enhance.js.map +0 -1
  475. package/dist/extensions/forgecli/fix-bug.d.ts +0 -85
  476. package/dist/extensions/forgecli/fix-bug.js +0 -1580
  477. package/dist/extensions/forgecli/fix-bug.js.map +0 -1
  478. package/dist/extensions/forgecli/forge-header.d.ts +0 -12
  479. package/dist/extensions/forgecli/forge-header.js +0 -114
  480. package/dist/extensions/forgecli/forge-header.js.map +0 -1
  481. package/dist/extensions/forgecli/forge-init.d.ts +0 -26
  482. package/dist/extensions/forgecli/forge-init.js +0 -514
  483. package/dist/extensions/forgecli/forge-init.js.map +0 -1
  484. package/dist/extensions/forgecli/forge-root.d.ts +0 -10
  485. package/dist/extensions/forgecli/forge-root.js +0 -62
  486. package/dist/extensions/forgecli/forge-root.js.map +0 -1
  487. package/dist/extensions/forgecli/forge-update-command.d.ts +0 -100
  488. package/dist/extensions/forgecli/forge-update-command.js +0 -435
  489. package/dist/extensions/forgecli/forge-update-command.js.map +0 -1
  490. package/dist/extensions/forgecli/friction-emit.d.ts +0 -99
  491. package/dist/extensions/forgecli/friction-emit.js +0 -245
  492. package/dist/extensions/forgecli/friction-emit.js.map +0 -1
  493. package/dist/extensions/forgecli/implement.d.ts +0 -22
  494. package/dist/extensions/forgecli/implement.js +0 -170
  495. package/dist/extensions/forgecli/implement.js.map +0 -1
  496. package/dist/extensions/forgecli/init-context.d.ts +0 -99
  497. package/dist/extensions/forgecli/init-context.js +0 -178
  498. package/dist/extensions/forgecli/init-context.js.map +0 -1
  499. package/dist/extensions/forgecli/init-progress.d.ts +0 -39
  500. package/dist/extensions/forgecli/init-progress.js +0 -117
  501. package/dist/extensions/forgecli/init-progress.js.map +0 -1
  502. package/dist/extensions/forgecli/input-router.d.ts +0 -33
  503. package/dist/extensions/forgecli/input-router.js +0 -136
  504. package/dist/extensions/forgecli/input-router.js.map +0 -1
  505. package/dist/extensions/forgecli/lib/halt-advisor.d.ts +0 -59
  506. package/dist/extensions/forgecli/lib/halt-advisor.js +0 -113
  507. package/dist/extensions/forgecli/lib/halt-advisor.js.map +0 -1
  508. package/dist/extensions/forgecli/lib/orchestrator-preflight.d.ts +0 -46
  509. package/dist/extensions/forgecli/lib/orchestrator-preflight.js +0 -64
  510. package/dist/extensions/forgecli/lib/orchestrator-preflight.js.map +0 -1
  511. package/dist/extensions/forgecli/materialize.d.ts +0 -16
  512. package/dist/extensions/forgecli/materialize.js +0 -195
  513. package/dist/extensions/forgecli/materialize.js.map +0 -1
  514. package/dist/extensions/forgecli/migrate.d.ts +0 -22
  515. package/dist/extensions/forgecli/migrate.js +0 -260
  516. package/dist/extensions/forgecli/migrate.js.map +0 -1
  517. package/dist/extensions/forgecli/migration-engine.d.ts +0 -117
  518. package/dist/extensions/forgecli/migration-engine.js +0 -563
  519. package/dist/extensions/forgecli/migration-engine.js.map +0 -1
  520. package/dist/extensions/forgecli/model-registry.d.ts +0 -61
  521. package/dist/extensions/forgecli/model-registry.js +0 -127
  522. package/dist/extensions/forgecli/model-registry.js.map +0 -1
  523. package/dist/extensions/forgecli/model-resolver.d.ts +0 -32
  524. package/dist/extensions/forgecli/model-resolver.js +0 -65
  525. package/dist/extensions/forgecli/model-resolver.js.map +0 -1
  526. package/dist/extensions/forgecli/model-validator.d.ts +0 -29
  527. package/dist/extensions/forgecli/model-validator.js +0 -107
  528. package/dist/extensions/forgecli/model-validator.js.map +0 -1
  529. package/dist/extensions/forgecli/orchestrator-status-bar.d.ts +0 -26
  530. package/dist/extensions/forgecli/orchestrator-status-bar.js +0 -213
  531. package/dist/extensions/forgecli/orchestrator-status-bar.js.map +0 -1
  532. package/dist/extensions/forgecli/plan.d.ts +0 -22
  533. package/dist/extensions/forgecli/plan.js +0 -167
  534. package/dist/extensions/forgecli/plan.js.map +0 -1
  535. package/dist/extensions/forgecli/quiz-agent.d.ts +0 -17
  536. package/dist/extensions/forgecli/quiz-agent.js +0 -98
  537. package/dist/extensions/forgecli/quiz-agent.js.map +0 -1
  538. package/dist/extensions/forgecli/read-command.d.ts +0 -2
  539. package/dist/extensions/forgecli/read-command.js +0 -100
  540. package/dist/extensions/forgecli/read-command.js.map +0 -1
  541. package/dist/extensions/forgecli/regenerate.d.ts +0 -40
  542. package/dist/extensions/forgecli/regenerate.js +0 -438
  543. package/dist/extensions/forgecli/regenerate.js.map +0 -1
  544. package/dist/extensions/forgecli/remove-command.d.ts +0 -17
  545. package/dist/extensions/forgecli/remove-command.js +0 -124
  546. package/dist/extensions/forgecli/remove-command.js.map +0 -1
  547. package/dist/extensions/forgecli/report-bug.d.ts +0 -25
  548. package/dist/extensions/forgecli/report-bug.js +0 -159
  549. package/dist/extensions/forgecli/report-bug.js.map +0 -1
  550. package/dist/extensions/forgecli/retrospective.d.ts +0 -20
  551. package/dist/extensions/forgecli/retrospective.js +0 -126
  552. package/dist/extensions/forgecli/retrospective.js.map +0 -1
  553. package/dist/extensions/forgecli/review-code.d.ts +0 -35
  554. package/dist/extensions/forgecli/review-code.js +0 -196
  555. package/dist/extensions/forgecli/review-code.js.map +0 -1
  556. package/dist/extensions/forgecli/review-plan.d.ts +0 -35
  557. package/dist/extensions/forgecli/review-plan.js +0 -200
  558. package/dist/extensions/forgecli/review-plan.js.map +0 -1
  559. package/dist/extensions/forgecli/run-sprint.d.ts +0 -27
  560. package/dist/extensions/forgecli/run-sprint.js +0 -716
  561. package/dist/extensions/forgecli/run-sprint.js.map +0 -1
  562. package/dist/extensions/forgecli/run-task.d.ts +0 -204
  563. package/dist/extensions/forgecli/run-task.js +0 -1403
  564. package/dist/extensions/forgecli/run-task.js.map +0 -1
  565. package/dist/extensions/forgecli/skill-curation-flag.d.ts +0 -21
  566. package/dist/extensions/forgecli/skill-curation-flag.js +0 -71
  567. package/dist/extensions/forgecli/skill-curation-flag.js.map +0 -1
  568. package/dist/extensions/forgecli/skill-curator-subagent.d.ts +0 -102
  569. package/dist/extensions/forgecli/skill-curator-subagent.js +0 -339
  570. package/dist/extensions/forgecli/skill-curator-subagent.js.map +0 -1
  571. package/dist/extensions/forgecli/skill-retriever.d.ts +0 -84
  572. package/dist/extensions/forgecli/skill-retriever.js +0 -246
  573. package/dist/extensions/forgecli/skill-retriever.js.map +0 -1
  574. package/dist/extensions/forgecli/skill-usage-tracker.d.ts +0 -91
  575. package/dist/extensions/forgecli/skill-usage-tracker.js +0 -224
  576. package/dist/extensions/forgecli/skill-usage-tracker.js.map +0 -1
  577. package/dist/extensions/forgecli/sprint-intake.d.ts +0 -10
  578. package/dist/extensions/forgecli/sprint-intake.js +0 -91
  579. package/dist/extensions/forgecli/sprint-intake.js.map +0 -1
  580. package/dist/extensions/forgecli/sprint-plan.d.ts +0 -14
  581. package/dist/extensions/forgecli/sprint-plan.js +0 -122
  582. package/dist/extensions/forgecli/sprint-plan.js.map +0 -1
  583. package/dist/extensions/forgecli/status-command.d.ts +0 -19
  584. package/dist/extensions/forgecli/status-command.js +0 -140
  585. package/dist/extensions/forgecli/status-command.js.map +0 -1
  586. package/dist/extensions/forgecli/store-error-remediation.d.ts +0 -65
  587. package/dist/extensions/forgecli/store-error-remediation.js +0 -307
  588. package/dist/extensions/forgecli/store-error-remediation.js.map +0 -1
  589. package/dist/extensions/forgecli/store-query.d.ts +0 -22
  590. package/dist/extensions/forgecli/store-query.js +0 -107
  591. package/dist/extensions/forgecli/store-query.js.map +0 -1
  592. package/dist/extensions/forgecli/store-repair.d.ts +0 -17
  593. package/dist/extensions/forgecli/store-repair.js +0 -123
  594. package/dist/extensions/forgecli/store-repair.js.map +0 -1
  595. package/dist/extensions/forgecli/store-resolver.d.ts +0 -56
  596. package/dist/extensions/forgecli/store-resolver.js +0 -263
  597. package/dist/extensions/forgecli/store-resolver.js.map +0 -1
  598. package/dist/extensions/forgecli/store-validator.d.ts +0 -16
  599. package/dist/extensions/forgecli/store-validator.js +0 -32
  600. package/dist/extensions/forgecli/store-validator.js.map +0 -1
  601. package/dist/extensions/forgecli/test-orchestrate.d.ts +0 -2
  602. package/dist/extensions/forgecli/test-orchestrate.js +0 -182
  603. package/dist/extensions/forgecli/test-orchestrate.js.map +0 -1
  604. package/dist/extensions/forgecli/thread-switcher.d.ts +0 -5
  605. package/dist/extensions/forgecli/thread-switcher.js +0 -189
  606. package/dist/extensions/forgecli/thread-switcher.js.map +0 -1
  607. package/dist/extensions/forgecli/transition-guard.d.ts +0 -20
  608. package/dist/extensions/forgecli/transition-guard.js +0 -89
  609. package/dist/extensions/forgecli/transition-guard.js.map +0 -1
  610. package/dist/extensions/forgecli/update-check.d.ts +0 -37
  611. package/dist/extensions/forgecli/update-check.js +0 -185
  612. package/dist/extensions/forgecli/update-check.js.map +0 -1
  613. package/dist/extensions/forgecli/update-tools.d.ts +0 -23
  614. package/dist/extensions/forgecli/update-tools.js +0 -135
  615. package/dist/extensions/forgecli/update-tools.js.map +0 -1
  616. package/dist/extensions/forgecli/validate.d.ts +0 -22
  617. package/dist/extensions/forgecli/validate.js +0 -152
  618. package/dist/extensions/forgecli/validate.js.map +0 -1
  619. package/dist/extensions/forgecli/viewport-events.d.ts +0 -78
  620. package/dist/extensions/forgecli/viewport-events.js +0 -243
  621. package/dist/extensions/forgecli/viewport-events.js.map +0 -1
  622. package/dist/extensions/forgecli/viewport-renderer.d.ts +0 -83
  623. package/dist/extensions/forgecli/viewport-renderer.js +0 -233
  624. package/dist/extensions/forgecli/viewport-renderer.js.map +0 -1
  625. package/dist/extensions/forgecli/viewport-theme.d.ts +0 -11
  626. package/dist/extensions/forgecli/viewport-theme.js +0 -128
  627. package/dist/extensions/forgecli/viewport-theme.js.map +0 -1
  628. package/dist/extensions/forgecli/whats-new-widget.d.ts +0 -26
  629. package/dist/extensions/forgecli/whats-new-widget.js +0 -376
  630. package/dist/extensions/forgecli/whats-new-widget.js.map +0 -1
  631. package/dist/extensions/forgecli/whats-new.d.ts +0 -120
  632. package/dist/extensions/forgecli/whats-new.js +0 -470
  633. package/dist/extensions/forgecli/whats-new.js.map +0 -1
  634. package/dist/forge-payload/.base-pack/commands/check-agent.md +0 -22
  635. package/dist/forge-payload/.base-pack/commands/enhance.md +0 -37
  636. package/dist/forge-payload/.base-pack/commands/init.md +0 -278
  637. package/dist/forge-payload/init/generation/generate-knowledge-base.md +0 -56
  638. package/dist/forge-payload/init/generation/generate-personas.md +0 -54
  639. package/dist/forge-payload/init/generation/generate-skills.md +0 -36
  640. package/dist/forge-payload/init/generation/generate-templates.md +0 -39
  641. /package/dist/forge-payload/{.base-pack/commands → commands}/approve.md +0 -0
  642. /package/dist/forge-payload/{.base-pack/commands → commands}/collate.md +0 -0
  643. /package/dist/forge-payload/{.base-pack/commands → commands}/commit.md +0 -0
  644. /package/dist/forge-payload/{.base-pack/commands → commands}/fix-bug.md +0 -0
  645. /package/dist/forge-payload/{.base-pack/commands → commands}/implement.md +0 -0
  646. /package/dist/forge-payload/{.base-pack/commands → commands}/new-sprint.md +0 -0
  647. /package/dist/forge-payload/{.base-pack/commands → commands}/plan-sprint.md +0 -0
  648. /package/dist/forge-payload/{.base-pack/commands → commands}/plan.md +0 -0
  649. /package/dist/forge-payload/{.base-pack/commands → commands}/retro.md +0 -0
  650. /package/dist/forge-payload/{.base-pack/commands → commands}/review-code.md +0 -0
  651. /package/dist/forge-payload/{.base-pack/commands → commands}/review-plan.md +0 -0
  652. /package/dist/forge-payload/{.base-pack/commands → commands}/run-sprint.md +0 -0
  653. /package/dist/forge-payload/{.base-pack/commands → commands}/run-task.md +0 -0
  654. /package/dist/forge-payload/{.base-pack/commands → commands}/validate.md +0 -0
@@ -7,9 +7,18 @@
7
7
  // Pattern modelled on `findNearestProjectAgentsDir` in
8
8
  // `subagent/agents.ts:96-106`.
9
9
  import * as fs from "node:fs";
10
+ import * as os from "node:os";
10
11
  import * as path from "node:path";
11
12
  import { resolveBundledPayloadRoot } from "./catalog-loader.js";
12
13
  import { isDirectory, isFile } from "./shared-fs-utils.js";
14
+ /**
15
+ * True when `child` is `parent` itself or lives anywhere beneath it.
16
+ * Used to constrain a config-supplied `forgeRoot` to trusted locations.
17
+ */
18
+ function isWithinOrEqual(parent, child) {
19
+ const rel = path.relative(parent, child);
20
+ return rel === "" || (!rel.startsWith("..") && !path.isAbsolute(rel));
21
+ }
13
22
  function findNearestForgeConfig(cwd) {
14
23
  let currentDir = cwd;
15
24
  while (true) {
@@ -70,6 +79,49 @@ export function discoverForgeConfig(cwd = process.cwd()) {
70
79
  return { forgeRoot: bundled, configPath, healedFrom: resolved };
71
80
  }
72
81
  }
82
+ // Containment guard (security: clone-and-run RCE — see issue #43).
83
+ // `forgeRoot` selects the directory whose `tools/*.cjs` this process spawns
84
+ // (`lib/run-cjs.ts`) and `require()`s (`hooks/write-guard.ts`). A shared or
85
+ // cloned `.forge/config.json` can therefore point it at attacker-controlled
86
+ // code. We only honour a `forgeRoot` that resolves INSIDE one of the trusted
87
+ // install roots:
88
+ // (a) the project tree (the parent of `.forge/`) — covers the dogfood
89
+ // layout `forgeRoot: "./forge/forge"` and any in-project payload,
90
+ // (b) this forgecli's bundled payload (the trusted installed copy),
91
+ // (c) the Claude Code plugin cache `<home>/.claude/plugins/` (the common
92
+ // installed-user case — `forge init` stamps a path under here), plus
93
+ // its `CLAUDE_CONFIG_DIR` / `CLAUDE_PLUGIN_ROOT` overrides.
94
+ // Trusted roots are matched by absolute path containment (NOT substring), so
95
+ // a spoof like `/tmp/evil/.claude/plugins/...` does not qualify. Anything
96
+ // else (an absolute path elsewhere, a `..`-escape outside the project) is
97
+ // rejected and healed to the bundled payload — the same safe fallback the
98
+ // dangling-path heal above uses. `FORGE_ALLOW_EXTERNAL_ROOT=1` is an explicit
99
+ // opt-out for users who intentionally point forgeRoot at an out-of-tree
100
+ // plugin checkout.
101
+ //
102
+ // Residual: a fully-populated malicious payload committed INSIDE a cloned
103
+ // repo is still trusted under (a) — that is the inherent "you ran this
104
+ // repo's code" boundary (cf. npm lifecycle scripts / Makefiles) and is out
105
+ // of scope for a path-containment guard.
106
+ if (process.env.FORGE_ALLOW_EXTERNAL_ROOT !== "1") {
107
+ const bundled = resolveBundledPayloadRoot();
108
+ const trustedRoots = [projectDir, path.join(os.homedir(), ".claude", "plugins")];
109
+ if (isDirectory(bundled))
110
+ trustedRoots.push(bundled);
111
+ if (process.env.CLAUDE_CONFIG_DIR)
112
+ trustedRoots.push(path.join(process.env.CLAUDE_CONFIG_DIR, "plugins"));
113
+ if (process.env.CLAUDE_PLUGIN_ROOT)
114
+ trustedRoots.push(process.env.CLAUDE_PLUGIN_ROOT);
115
+ const trusted = trustedRoots.some((root) => isWithinOrEqual(root, resolved));
116
+ if (!trusted) {
117
+ if (isDirectory(bundled)) {
118
+ return { forgeRoot: bundled, configPath, rejectedFrom: resolved };
119
+ }
120
+ // No bundled payload to fall back to: refuse rather than spawn from
121
+ // an untrusted location.
122
+ return null;
123
+ }
124
+ }
73
125
  return { forgeRoot: resolved, configPath };
74
126
  }
75
127
  //# sourceMappingURL=forge-root.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forge-root.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/lib/forge-root.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,uGAAuG;AACvG,oEAAoE;AACpE,EAAE;AACF,uDAAuD;AACvD,+BAA+B;AAE/B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE3D,SAAS,sBAAsB,CAAC,GAAW;IAC1C,IAAI,UAAU,GAAG,GAAG,CAAC;IACrB,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAExC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,SAAS,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC;QAC1C,UAAU,GAAG,SAAS,CAAC;IACxB,CAAC;AACF,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,MAAM,UAAU,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACJ,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,cAAc,GACnB,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;QACxD,CAAC,CAAE,MAA8C,CAAC,KAAK,EAAE,SAAS;QAClE,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACb,CAAC;IAED,0EAA0E;IAC1E,uEAAuE;IACvE,sEAAsE;IACtE,2DAA2D;IAC3D,8BAA8B;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAE7G,uEAAuE;IACvE,mEAAmE;IACnE,0EAA0E;IAC1E,sEAAsE;IACtE,0EAA0E;IAC1E,2CAA2C;IAC3C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,yBAAyB,EAAE,CAAC;QAC5C,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QACjE,CAAC;IACF,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"forge-root.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/lib/forge-root.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /** Selection filter for dir entries (mirrors build-payload Pass-2 logic). */
2
+ export interface PayloadSelect {
3
+ recursive?: boolean;
4
+ ext?: string[];
5
+ include?: string[];
6
+ exclude?: string[];
7
+ prefix?: string[];
8
+ }
9
+ /** A single payload manifest entry. */
10
+ export interface PayloadEntry {
11
+ /** Repo-relative path under forge/forge/ (file or directory root). */
12
+ source: string;
13
+ /** Destination path inside dist/forge-payload/ that build-payload emits. */
14
+ bundle: string;
15
+ /** Destination inside a bootstrapped project (absent for bundleOnly entries). */
16
+ install?: string;
17
+ /** True when shipped to the bundle but NOT vendored into a project (FORGE-BUG-044/045). */
18
+ bundleOnly?: boolean;
19
+ /** Removal owner consumed by uninstall.ts. */
20
+ owner: string;
21
+ kind: "file" | "dir";
22
+ /** True when build-payload synthesizes the artifact rather than copying it. */
23
+ synthesized?: boolean;
24
+ select?: PayloadSelect;
25
+ note?: string;
26
+ }
27
+ export interface PayloadManifest {
28
+ entries: PayloadEntry[];
29
+ [key: string]: unknown;
30
+ }
31
+ /**
32
+ * Does `name` satisfy an entry's ext/prefix filter? Curated `include` is handled
33
+ * by the caller (applySelect); `exclude` is matched separately on path segments.
34
+ */
35
+ export declare function matchesFilter(name: string, select?: PayloadSelect): boolean;
36
+ /** Is any path segment of `rel` (or the basename) in the exclude list? */
37
+ export declare function isExcluded(rel: string, name: string, select?: PayloadSelect): boolean;
38
+ /**
39
+ * Resolve a dir entry's `select` against a concrete directory, returning the
40
+ * sorted list of entry-relative paths the select claims. Mirrors the walk +
41
+ * claim logic of check-payload-manifest.cjs (recursive / ext / prefix / exclude
42
+ * / curated include) so build, bundle and install agree on the set.
43
+ */
44
+ export declare function applySelect(absDir: string, select?: PayloadSelect): string[];
45
+ /**
46
+ * Load + shape-validate the payload manifest from a root directory (the forge
47
+ * root at build time, or the payload root at runtime — both carry the file).
48
+ * Throws on a missing file or a malformed (no entries[]) manifest.
49
+ */
50
+ export declare function loadManifest(root: string): PayloadManifest;
51
+ /**
52
+ * Entries that are vendored into a bootstrapped project (bundleOnly entries are
53
+ * excluded — they ship to the bundle for tool resolution only). Order is
54
+ * preserved from the manifest. FORGE-S32-T06 collapsed the former two command
55
+ * trees into a single unified `commands/` entry, so there is no longer a
56
+ * commands-union precedence or name-collision ordering to honour.
57
+ */
58
+ export declare function installEntries(manifest: PayloadManifest): PayloadEntry[];
59
+ /** Group install-bearing entries by their install destination (manifest order). */
60
+ export declare function groupByInstall(manifest: PayloadManifest): Map<string, PayloadEntry[]>;
61
+ /** Group install-bearing entries by removal owner (uninstall grouping). */
62
+ export declare function groupByOwner(manifest: PayloadManifest): Map<string, PayloadEntry[]>;
@@ -0,0 +1,151 @@
1
+ // lib/payload-manifest.ts — typed reader for the Forge payload manifest (FORGE-S32-T03).
2
+ //
3
+ // The single source of truth for "what the Forge payload ships" is
4
+ // forge/forge/payload-manifest.json, bundled into dist/forge-payload/ by
5
+ // scripts/build-payload.cjs. This module loads + shape-validates that manifest
6
+ // and exposes the select/grouping helpers the two TypeScript consumers need:
7
+ // - bootstrap.ts → groupByInstall() to vendor bundle → install destinations
8
+ // - uninstall.ts → groupByOwner() to remove install destinations by owner
9
+ //
10
+ // The select semantics (matchesFilter / isExcluded / curated include) are a
11
+ // faithful re-implementation of forge/forge/tools/check-payload-manifest.cjs
12
+ // and scripts/lib/payload-manifest.cjs, pinned together by a shared-fixture
13
+ // parity test (advisory 2) so the three consumers never drift from the T02
14
+ // validator's reading of ext / prefix / include / exclude / recursive.
15
+ //
16
+ // Pure fs; no network, no LLM, no store writes.
17
+ import * as fs from "node:fs";
18
+ import * as path from "node:path";
19
+ // ── Select helpers (mirror check-payload-manifest.cjs) ───────────────────────
20
+ /**
21
+ * Does `name` satisfy an entry's ext/prefix filter? Curated `include` is handled
22
+ * by the caller (applySelect); `exclude` is matched separately on path segments.
23
+ */
24
+ export function matchesFilter(name, select) {
25
+ if (!select)
26
+ return true;
27
+ if (Array.isArray(select.ext) && select.ext.length > 0) {
28
+ if (!select.ext.some((e) => name.endsWith(e)))
29
+ return false;
30
+ }
31
+ if (Array.isArray(select.prefix) && select.prefix.length > 0) {
32
+ if (!select.prefix.some((p) => name.startsWith(p)))
33
+ return false;
34
+ }
35
+ return true;
36
+ }
37
+ /** Is any path segment of `rel` (or the basename) in the exclude list? */
38
+ export function isExcluded(rel, name, select) {
39
+ if (!select || !Array.isArray(select.exclude))
40
+ return false;
41
+ const segs = rel.split(path.sep);
42
+ return select.exclude.some((x) => x === name || segs.includes(x));
43
+ }
44
+ /**
45
+ * Resolve a dir entry's `select` against a concrete directory, returning the
46
+ * sorted list of entry-relative paths the select claims. Mirrors the walk +
47
+ * claim logic of check-payload-manifest.cjs (recursive / ext / prefix / exclude
48
+ * / curated include) so build, bundle and install agree on the set.
49
+ */
50
+ export function applySelect(absDir, select) {
51
+ const out = [];
52
+ if (!fs.existsSync(absDir) || !fs.statSync(absDir).isDirectory())
53
+ return out;
54
+ const sel = select ?? {};
55
+ const curated = Array.isArray(sel.include) && sel.include.length > 0;
56
+ const walk = (dir, relBase) => {
57
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
58
+ const abs = path.join(dir, entry.name);
59
+ const rel = relBase ? path.join(relBase, entry.name) : entry.name;
60
+ if (isExcluded(rel, entry.name, sel))
61
+ continue;
62
+ if (entry.isDirectory()) {
63
+ // Non-recursive entries do not descend — unless the directory name
64
+ // is itself a curated include target (e.g. skills/<skill-dir>/).
65
+ if (sel.recursive === false && !(curated && sel.include?.includes(entry.name)))
66
+ continue;
67
+ walk(abs, rel);
68
+ }
69
+ else if (entry.isFile()) {
70
+ if (curated) {
71
+ const top = rel.split(path.sep)[0];
72
+ if (!(sel.include?.includes(top) || sel.include?.includes(entry.name)))
73
+ continue;
74
+ }
75
+ else if (!matchesFilter(entry.name, sel)) {
76
+ continue;
77
+ }
78
+ out.push(rel);
79
+ }
80
+ }
81
+ };
82
+ walk(absDir, "");
83
+ out.sort();
84
+ return out;
85
+ }
86
+ // ── Loader ────────────────────────────────────────────────────────────────────
87
+ /**
88
+ * Load + shape-validate the payload manifest from a root directory (the forge
89
+ * root at build time, or the payload root at runtime — both carry the file).
90
+ * Throws on a missing file or a malformed (no entries[]) manifest.
91
+ */
92
+ export function loadManifest(root) {
93
+ const manifestPath = path.join(root, "payload-manifest.json");
94
+ let raw;
95
+ try {
96
+ raw = fs.readFileSync(manifestPath, "utf8");
97
+ }
98
+ catch (err) {
99
+ const e = err;
100
+ throw new Error(`payload-manifest: cannot read ${manifestPath}: ${e.message ?? String(err)}`);
101
+ }
102
+ let parsed;
103
+ try {
104
+ parsed = JSON.parse(raw);
105
+ }
106
+ catch (err) {
107
+ const e = err;
108
+ throw new Error(`payload-manifest: ${manifestPath} is not valid JSON: ${e.message ?? String(err)}`);
109
+ }
110
+ if (!parsed || typeof parsed !== "object" || !Array.isArray(parsed.entries)) {
111
+ throw new Error(`payload-manifest: ${manifestPath} is malformed (missing entries[] array).`);
112
+ }
113
+ return parsed;
114
+ }
115
+ // ── Grouping helpers ──────────────────────────────────────────────────────────
116
+ /**
117
+ * Entries that are vendored into a bootstrapped project (bundleOnly entries are
118
+ * excluded — they ship to the bundle for tool resolution only). Order is
119
+ * preserved from the manifest. FORGE-S32-T06 collapsed the former two command
120
+ * trees into a single unified `commands/` entry, so there is no longer a
121
+ * commands-union precedence or name-collision ordering to honour.
122
+ */
123
+ export function installEntries(manifest) {
124
+ return manifest.entries.filter((e) => e.bundleOnly !== true && typeof e.install === "string" && e.install.length > 0);
125
+ }
126
+ /** Group install-bearing entries by their install destination (manifest order). */
127
+ export function groupByInstall(manifest) {
128
+ const groups = new Map();
129
+ for (const entry of installEntries(manifest)) {
130
+ const key = entry.install;
131
+ const list = groups.get(key);
132
+ if (list)
133
+ list.push(entry);
134
+ else
135
+ groups.set(key, [entry]);
136
+ }
137
+ return groups;
138
+ }
139
+ /** Group install-bearing entries by removal owner (uninstall grouping). */
140
+ export function groupByOwner(manifest) {
141
+ const groups = new Map();
142
+ for (const entry of installEntries(manifest)) {
143
+ const list = groups.get(entry.owner);
144
+ if (list)
145
+ list.push(entry);
146
+ else
147
+ groups.set(entry.owner, [entry]);
148
+ }
149
+ return groups;
150
+ }
151
+ //# sourceMappingURL=payload-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payload-manifest.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/lib/payload-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface RenderAdvisoryOptions {
2
+ /** Total frame width (default 78, clamped to ≥24). */
3
+ width?: number;
4
+ }
5
+ /**
6
+ * Render an advisory's markdown body into a bordered block of plain-text lines.
7
+ * `title` becomes the top-border label.
8
+ */
9
+ export declare function renderAdvisoryBlock(title: string, markdown: string, opts?: RenderAdvisoryOptions): string[];
@@ -0,0 +1,107 @@
1
+ // advisory-render.ts — FEAT-009 T02 (rich advisory rendering).
2
+ //
3
+ // The halt-recovery advisor returns markdown; piping it straight through
4
+ // ctx.ui.notify (a plaintext, dimmed sink) rendered it as a raw grey wall of
5
+ // `##`/`**`/backtick source. This renders that markdown into a clean, bordered,
6
+ // terminal-friendly block that stays in the transcript/scrollback (a non-modal
7
+ // "widget"), so the operator can read it while the recovery menu handles input.
8
+ //
9
+ // Pure and deterministic — no ANSI colour (the notify sink does not reliably
10
+ // pass escape codes, and plain text keeps the border alignment honest). The
11
+ // substance of the fix is stripping markdown syntax + wrapping + framing.
12
+ const DEFAULT_WIDTH = 78;
13
+ const MIN_WIDTH = 24;
14
+ /** Strip inline markdown emphasis/code markers, keeping the text. */
15
+ function stripInline(s) {
16
+ return s
17
+ .replace(/\*\*(.+?)\*\*/g, "$1") // bold
18
+ .replace(/__(.+?)__/g, "$1") // bold (underscore)
19
+ .replace(/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g, "$1") // italic
20
+ .replace(/`([^`]+)`/g, "$1"); // inline code
21
+ }
22
+ /** Convert one markdown line to a clean text line (no framing yet). */
23
+ function transformLine(line) {
24
+ const trimmedRight = line.replace(/\s+$/, "");
25
+ // Headings: drop leading #'s.
26
+ const heading = /^#{1,6}\s+(.*)$/.exec(trimmedRight);
27
+ if (heading)
28
+ return stripInline(heading[1]).trim();
29
+ // Bullets: normalise -/*/+ to a bullet glyph, preserve indent.
30
+ const bullet = /^(\s*)[-*+]\s+(.*)$/.exec(trimmedRight);
31
+ if (bullet)
32
+ return `${bullet[1]}• ${stripInline(bullet[2])}`;
33
+ return stripInline(trimmedRight);
34
+ }
35
+ /** Greedy word-wrap a single logical line to `width` columns. */
36
+ function wrap(text, width) {
37
+ if (text.length === 0)
38
+ return [""];
39
+ const indentMatch = /^(\s*)/.exec(text);
40
+ const indent = indentMatch ? indentMatch[1] : "";
41
+ const words = text.slice(indent.length).split(/\s+/).filter(Boolean);
42
+ if (words.length === 0)
43
+ return [""];
44
+ const lines = [];
45
+ let cur = indent;
46
+ for (const w of words) {
47
+ const candidate = cur === indent ? indent + w : `${cur} ${w}`;
48
+ if (candidate.length > width && cur !== indent) {
49
+ lines.push(cur);
50
+ cur = indent + w;
51
+ }
52
+ else if (candidate.length > width && cur === indent) {
53
+ // single word longer than width — hard-break it
54
+ let rest = w;
55
+ while (rest.length > width) {
56
+ lines.push(indent + rest.slice(0, width - indent.length));
57
+ rest = rest.slice(width - indent.length);
58
+ }
59
+ cur = indent + rest;
60
+ }
61
+ else {
62
+ cur = candidate;
63
+ }
64
+ }
65
+ if (cur.length > 0 || lines.length === 0)
66
+ lines.push(cur);
67
+ return lines;
68
+ }
69
+ /**
70
+ * Render an advisory's markdown body into a bordered block of plain-text lines.
71
+ * `title` becomes the top-border label.
72
+ */
73
+ export function renderAdvisoryBlock(title, markdown, opts = {}) {
74
+ const width = Math.max(MIN_WIDTH, opts.width ?? DEFAULT_WIDTH);
75
+ const inner = width - 4; // "│ " + " │"
76
+ // Transform + wrap, collapsing 3+ blank lines to one.
77
+ const body = [];
78
+ let blanks = 0;
79
+ for (const raw of markdown.replace(/\r\n/g, "\n").split("\n")) {
80
+ const t = transformLine(raw);
81
+ if (t.trim() === "") {
82
+ blanks++;
83
+ if (blanks <= 1)
84
+ body.push("");
85
+ continue;
86
+ }
87
+ blanks = 0;
88
+ for (const wl of wrap(t, inner))
89
+ body.push(wl);
90
+ }
91
+ // Trim leading/trailing blank lines.
92
+ while (body.length && body[0] === "")
93
+ body.shift();
94
+ while (body.length && body[body.length - 1] === "")
95
+ body.pop();
96
+ // Frame.
97
+ const label = ` ${title} `;
98
+ const dashCount = Math.max(0, width - 2 - label.length);
99
+ const top = `╭${label}${"─".repeat(dashCount)}╮`.slice(0, width);
100
+ const bottom = `╰${"─".repeat(width - 2)}╯`;
101
+ const framed = body.map((l) => {
102
+ const padded = l.length > inner ? l.slice(0, inner) : l.padEnd(inner, " ");
103
+ return `│ ${padded} │`;
104
+ });
105
+ return [top, ...framed, bottom];
106
+ }
107
+ //# sourceMappingURL=advisory-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advisory-render.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/orchestrators/advisory-render.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,6EAA6E;AAC7E,gFAAgF;AAChF,+EAA+E;AAC/E,gFAAgF;AAChF,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAE1E,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,qEAAqE;AACrE,SAAS,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC;SACN,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,OAAO;SACvC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,oBAAoB;SAChD,OAAO,CAAC,sCAAsC,EAAE,IAAI,CAAC,CAAC,SAAS;SAC/D,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,cAAc;AAC9C,CAAC;AAED,uEAAuE;AACvE,SAAS,aAAa,CAAC,IAAY;IAClC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,8BAA8B;IAC9B,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,OAAO;QAAE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,+DAA+D;IAC/D,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,MAAM;QAAE,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,WAAW,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC;AAED,iEAAiE;AACjE,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACxC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;QAC9D,IAAI,SAAS,CAAC,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,GAAG,GAAG,MAAM,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,SAAS,CAAC,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACvD,gDAAgD;YAChD,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC1D,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;YACD,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;aAAM,CAAC;YACP,GAAG,GAAG,SAAS,CAAC;QACjB,CAAC;IACF,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC;AACd,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAClC,KAAa,EACb,QAAgB,EAChB,OAA8B,EAAE;IAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc;IAEvC,sDAAsD;IACtD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrB,MAAM,EAAE,CAAC;YACT,IAAI,MAAM,IAAI,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,SAAS;QACV,CAAC;QACD,MAAM,GAAG,CAAC,CAAC;QACX,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,qCAAqC;IACrC,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACnD,OAAO,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IAE/D,SAAS;IACT,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC3E,OAAO,KAAK,MAAM,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC"}
@@ -1,5 +1,8 @@
1
1
  import type { PhaseDescriptor } from "../task/task-phases.js";
2
2
  export declare const BUG_PHASES: PhaseDescriptor[];
3
+ export declare const BUG_PHASE_PRE_STATUS: Record<string, string>;
4
+ /** Index of a bug phase in the BUG_PHASES table by role, or -1 if unknown. */
5
+ export declare function bugPhaseIndexByRole(role: string): number;
3
6
  export declare const BUG_TYPE_TOKENS: Record<string, {
4
7
  pass: string;
5
8
  fail: string;
@@ -24,6 +24,28 @@ export const BUG_PHASES = [
24
24
  { role: "approve", workflowFile: "architect_approve", personaNoun: "architect", isReview: true, maxIterations: 3 },
25
25
  { role: "commit", workflowFile: "commit_task", personaNoun: "engineer", isReview: false, maxIterations: 1 },
26
26
  ];
27
+ // FEAT-009 (halt-recovery UX): the bug status a record must hold for a given
28
+ // phase to (re-)run — the status `resetPipelineState` sets when rewinding the
29
+ // fix-bug pipeline to that phase. The bug FSM is intentionally coarse
30
+ // (reported → triaged → in-progress → fixed): `triage` owns reported→triaged→
31
+ // in-progress, then NO phase writes bug.status until `commit` does
32
+ // in-progress→fixed (meta-fix-bug.md § Iron Laws #2 — verdicts travel through
33
+ // summaries, not status). So every post-triage phase resets to `in-progress`;
34
+ // only `triage` resets to `reported`. The reset is therefore dominated by the
35
+ // resume-state phaseIndex, with status forced to the right coarse bucket.
36
+ export const BUG_PHASE_PRE_STATUS = {
37
+ triage: "reported",
38
+ "plan-fix": "in-progress",
39
+ "review-plan": "in-progress",
40
+ implement: "in-progress",
41
+ "review-code": "in-progress",
42
+ approve: "in-progress",
43
+ commit: "in-progress",
44
+ };
45
+ /** Index of a bug phase in the BUG_PHASES table by role, or -1 if unknown. */
46
+ export function bugPhaseIndexByRole(role) {
47
+ return BUG_PHASES.findIndex((p) => p.role === role);
48
+ }
27
49
  // ── Bug-event type tokens ──────────────────────────────────────────────────
28
50
  // Explicit mapping per review finding #3. Non-review phases always emit the
29
51
  // pass token. Review phases select pass or fail based on ec.judgement.verdict.
@@ -1 +1 @@
1
- {"version":3,"file":"bug-phases.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/bug-phases.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAI7E,+EAA+E;AAC/E,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,mDAAmD;AAEnD,uEAAuE;AACvE,uEAAuE;AAEvE,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC5C,8EAA8E;IAC9E,sEAAsE;IACtE,uEAAuE;IACvE,0EAA0E;IAC1E,kEAAkE;IAClE,uEAAuE;IACvE,2BAA2B;IAC3B,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;IACvG,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;IAC3G,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IACjH,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;IACjH,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IACjH,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IAClH,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;CAC3G,CAAC;AAEF,8EAA8E;AAC9E,4EAA4E;AAC5E,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAmD;IAC9E,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE;IACpD,UAAU,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE;IACxD,aAAa,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACvE,SAAS,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAC/D,aAAa,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACjF,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACjE,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE;CAC5D,CAAC;AAEF,8EAA8E;AAC9E,wDAAwD;AACxD,sEAAsE;AACtE,+DAA+D;AAE/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtD,wEAAwE;AACxE,oEAAoE;AACpE,qEAAqE;AACrE,0EAA0E;AAC1E,yEAAyE;AACzE,wEAAwE;AACxE,wEAAwE;AACxE,iEAAiE;AACjE,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC/D,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,OAAO,EAAE,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"bug-phases.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/bug-phases.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+EAA+E;AAC/E,6EAA6E;AAI7E,+EAA+E;AAC/E,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,mDAAmD;AAEnD,uEAAuE;AACvE,uEAAuE;AAEvE,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC5C,8EAA8E;IAC9E,sEAAsE;IACtE,uEAAuE;IACvE,0EAA0E;IAC1E,kEAAkE;IAClE,uEAAuE;IACvE,2BAA2B;IAC3B,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;IACvG,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;IAC3G,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IACjH,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;IACjH,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IACjH,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IAClH,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,EAAE;CAC3G,CAAC;AAEF,6EAA6E;AAC7E,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAC9E,mEAAmE;AACnE,8EAA8E;AAC9E,8EAA8E;AAC9E,8EAA8E;AAC9E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,oBAAoB,GAA2B;IAC3D,MAAM,EAAE,UAAU;IAClB,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,aAAa;IAC5B,SAAS,EAAE,aAAa;IACxB,aAAa,EAAE,aAAa;IAC5B,OAAO,EAAE,aAAa;IACtB,MAAM,EAAE,aAAa;CACrB,CAAC;AAEF,8EAA8E;AAC9E,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC/C,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,4EAA4E;AAC5E,+EAA+E;AAC/E,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAmD;IAC9E,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE;IACpD,UAAU,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE;IACxD,aAAa,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACvE,SAAS,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAC/D,aAAa,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACjF,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,wBAAwB,EAAE;IACjE,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE;CAC5D,CAAC;AAEF,8EAA8E;AAC9E,wDAAwD;AACxD,sEAAsE;AACtE,+DAA+D;AAE/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtD,wEAAwE;AACxE,oEAAoE;AACpE,qEAAqE;AACrE,0EAA0E;AAC1E,yEAAyE;AACzE,wEAAwE;AACxE,wEAAwE;AACxE,iEAAiE;AACjE,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC/D,IAAI,MAAM,KAAK,UAAU;QAAE,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC7D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,OAAO,EAAE,CAAC;AACX,CAAC"}
@@ -35,4 +35,4 @@ export interface BugVerdictLoopParams {
35
35
  * Evaluate the review-phase verdict and decide the loop's next move.
36
36
  * Mirrors the inline block that previously lived in runBugPipelineInner.
37
37
  */
38
- export declare function handleBugReviewVerdict(p: BugVerdictLoopParams): BugVerdictLoopOutcome;
38
+ export declare function handleBugReviewVerdict(p: BugVerdictLoopParams): Promise<BugVerdictLoopOutcome>;
@@ -12,6 +12,7 @@
12
12
  // (approved) path returns `{ kind: "advance" }`.
13
13
  import { spawnSync } from "node:child_process";
14
14
  import { resolveAdvisorModel, runHaltAdvisor } from "../halt-advisor.js";
15
+ import { offerRecoveryMenu } from "../common/recovery-menu.js";
15
16
  import { recoverPhaseSummary } from "../common/summary-recovery.js";
16
17
  import { findPredecessorIndex } from "../run-task.js";
17
18
  import { BUG_PHASES } from "./bug-phases.js";
@@ -22,7 +23,7 @@ import { readBugVerdict } from "./bug-verdict.js";
22
23
  * Evaluate the review-phase verdict and decide the loop's next move.
23
24
  * Mirrors the inline block that previously lived in runBugPipelineInner.
24
25
  */
25
- export function handleBugReviewVerdict(p) {
26
+ export async function handleBugReviewVerdict(p) {
26
27
  const { phase, bugId, storeCli, cwd, forgeRoot, iterationCounts, currentPhaseIndex, modelRoutingConfig, ctx } = p;
27
28
  const { orchTranscript, finishPhaseNode, summaryKeyByRole, recoveredPhases } = p;
28
29
  // Re-read bug record for latest status after subagent ran
@@ -72,7 +73,9 @@ export function handleBugReviewVerdict(p) {
72
73
  // (FORGE-S26-T18) — the same hand-off the preflight/postflight gate
73
74
  // failures use — instead of a bare escalation. Best-effort, non-fatal.
74
75
  const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
75
- void runHaltAdvisor({
76
+ // FORGE-BUG-046: await the advisor so its diagnosis surfaces BEFORE the
77
+ // pipeline tears down (was `void` — fire-and-forget before pipeline-end).
78
+ await runHaltAdvisor({
76
79
  gateFailure: {
77
80
  phase: phase.role,
78
81
  reasonCode: "verdict-missing",
@@ -88,6 +91,9 @@ export function handleBugReviewVerdict(p) {
88
91
  ctx: { ui: ctx.ui },
89
92
  forgeRoot,
90
93
  });
94
+ // FEAT-009: offer an interactive recovery menu (reset → resume). No-op in
95
+ // non-interactive mode; best-effort, never masks the halt.
96
+ await offerRecoveryMenu({ ui: ctx.ui, kind: "bug", id: bugId, cwd, storeCli });
91
97
  return {
92
98
  kind: "return",
93
99
  result: {
@@ -112,6 +118,32 @@ export function handleBugReviewVerdict(p) {
112
118
  lastError: `revision cap reached for ${phase.role}`,
113
119
  savedAt: new Date().toISOString(),
114
120
  });
121
+ // FEAT-009: a revision-cap escalation is a halt like any other — route it
122
+ // through the halt-recovery advisor + recovery menu instead of leaving the
123
+ // bare error notify above as the only signal (matches the verdict-missing
124
+ // hand-off above and the run-task twin). Best-effort, non-fatal.
125
+ const gateFailure = {
126
+ phase: phase.role,
127
+ reasonCode: "revision-cap-reached",
128
+ detail: `Phase '${phase.role}' returned 'revision' ${iterationCounts[phase.role]} time(s), ` +
129
+ `reaching its cap of ${phase.maxIterations}. The reviewer kept requesting changes ` +
130
+ "and the predecessor phase could not satisfy them within the allowed iterations, " +
131
+ "so the pipeline halted rather than loop indefinitely.",
132
+ remediation: "Inspect the latest review feedback for this phase, address it manually, then " +
133
+ `reset the pipeline to the predecessor phase and resume — e.g. \`4ge reset ${bugId} ` +
134
+ `--to ${BUG_PHASES[findPredecessorIndex(BUG_PHASES, currentPhaseIndex)]?.role ?? phase.role}\` ` +
135
+ "— or re-run the bug once the underlying disagreement is resolved.",
136
+ };
137
+ const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
138
+ await runHaltAdvisor({
139
+ gateFailure,
140
+ advisorModel,
141
+ taskId: bugId,
142
+ cwd,
143
+ ctx: { ui: ctx.ui },
144
+ forgeRoot,
145
+ });
146
+ await offerRecoveryMenu({ ui: ctx.ui, kind: "bug", id: bugId, cwd, storeCli });
115
147
  return {
116
148
  kind: "return",
117
149
  result: {
@@ -1 +1 @@
1
- {"version":3,"file":"bug-verdict-loop.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/bug-verdict-loop.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bug-verdict-loop.js","sourceRoot":"","sources":["../../../../../src/extensions/forgecli/orchestrators/bug/bug-verdict-loop.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAC9E,4EAA4E;AAC5E,iFAAiF;AACjF,+EAA+E;AAC/E,eAAe;AACf,EAAE;AACF,gFAAgF;AAChF,2EAA2E;AAC3E,gFAAgF;AAChF,iDAAiD;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAM/C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAwB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA4BlD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,CAAuB;IACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClH,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;IAEjF,0DAA0D;IAC1D,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7D,IAAI,OAAO,GAAG,cAAc,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAE7E,8EAA8E;IAC9E,wEAAwE;IACxE,0EAA0E;IAC1E,+EAA+E;IAC/E,gFAAgF;IAChF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,UAAU,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,GAAG,GAAG,mBAAmB,CAAC;gBAC/B,QAAQ;gBACR,QAAQ,EAAE,KAAK;gBACf,UAAU;gBACV,GAAG;gBACH,WAAW,EAAE,iBAAiB;aAC9B,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAClG,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,qBAAqB,KAAK,CAAC,IAAI,8DAA8D;wBAC5F,QAAQ,UAAU,2CAA2C,EAC9D,MAAM,CACN,CAAC;oBACF,OAAO,GAAG,OAAO,CAAC;gBACnB,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,+CAA+C,KAAK,CAAC,IAAI,kDAAkD,EAC3G,OAAO,CACP,CAAC;QACF,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1B,aAAa,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,UAAU,EAAE,iBAAiB;YAC7B,eAAe;YACf,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,uBAAuB,KAAK,CAAC,IAAI,EAAE;YAC9C,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACjC,CAAC,CAAC;QACH,mEAAmE;QACnE,qEAAqE;QACrE,iEAAiE;QACjE,kEAAkE;QAClE,oEAAoE;QACpE,uEAAuE;QACvE,MAAM,YAAY,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,GAAG,CAAC,KAAY,CAAC,CAAC;QAC/E,wEAAwE;QACxE,0EAA0E;QAC1E,MAAM,cAAc,CAAC;YACpB,WAAW,EAAE;gBACZ,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,UAAU,EAAE,iBAAiB;gBAC7B,MAAM,EACL,UAAU,KAAK,CAAC,IAAI,qDAAqD;oBACzE,8FAA8F;gBAC/F,WAAW,EACV,8EAA8E;oBAC9E,4EAA4E;oBAC5E,+EAA+E;aAChF;YACD,YAAY;YACZ,MAAM,EAAE,KAAK;YACb,GAAG;YACH,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAS,EAAE;YAC1B,SAAS;SACT,CAAC,CAAC;QACH,0EAA0E;QAC1E,2DAA2D;QAC3D,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/E,OAAO;YACN,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE;gBACP,MAAM,EAAE,QAAQ;gBAChB,cAAc,EAAE,iBAAiB;gBACjC,eAAe;gBACf,SAAS,EAAE,uBAAuB,KAAK,CAAC,IAAI,EAAE;aAC9C;SACD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC5B,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAErE,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxD,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,oDAAoD,KAAK,CAAC,IAAI,GAAG;gBAChE,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,aAAa,2BAA2B,EAClF,OAAO,CACP,CAAC;YACF,eAAe,CAAC,WAAW,CAAC,CAAC;YAC7B,aAAa,CAAC,GAAG,EAAE;gBAClB,KAAK;gBACL,UAAU,EAAE,iBAAiB;gBAC7B,eAAe;gBACf,MAAM,EAAE,IAAI;gBACZ,SAAS,EAAE,4BAA4B,KAAK,CAAC,IAAI,EAAE;gBACnD,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACjC,CAAC,CAAC;YACH,0EAA0E;YAC1E,2EAA2E;YAC3E,0EAA0E;YAC1E,iEAAiE;YACjE,MAAM,WAAW,GAAG;gBACnB,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,UAAU,EAAE,sBAAsB;gBAClC,MAAM,EACL,UAAU,KAAK,CAAC,IAAI,yBAAyB,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY;oBACpF,uBAAuB,KAAK,CAAC,aAAa,yCAAyC;oBACnF,kFAAkF;oBAClF,uDAAuD;gBACxD,WAAW,EACV,+EAA+E;oBAC/E,6EAA6E,KAAK,GAAG;oBACrF,QAAQ,UAAU,CAAC,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK;oBAChG,mEAAmE;aACpE,CAAC;YACF,MAAM,YAAY,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,GAAG,CAAC,KAAY,CAAC,CAAC;YAC/E,MAAM,cAAc,CAAC;gBACpB,WAAW;gBACX,YAAY;gBACZ,MAAM,EAAE,KAAK;gBACb,GAAG;gBACH,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAS,EAAE;gBAC1B,SAAS;aACT,CAAC,CAAC;YACH,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/E,OAAO;gBACN,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE;oBACP,MAAM,EAAE,WAAW;oBACnB,cAAc,EAAE,iBAAiB;oBACjC,eAAe;oBACf,SAAS,EAAE,4BAA4B,KAAK,CAAC,IAAI,EAAE;iBACnD;aACD,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,8EAA8E;QAC9E,MAAM,gBAAgB,GAAG,gBAAgB,EAAE,MAAM,CAAC;QAClD,IAAI,gBAAgB,KAAK,OAAO,IAAI,gBAAgB,KAAK,UAAU,EAAE,CAAC;YACrE,MAAM,gBAAgB,GAAG,SAAS,CACjC,MAAM,EACN,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,EAClE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CACzB,CAAC;YACF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,8CAA8C,KAAK,SAAS,gBAAgB,oBAAoB,gBAAgB,CAAC,MAAM,IAAI,SAAS,EAAE,EACtI,SAAS,CACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sCAAsC,KAAK,KAAK,gBAAgB,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACzG,CAAC;QACF,CAAC;QAED,2DAA2D;QAC3D,wDAAwD;QACxD,yDAAyD;QACzD,iBAAiB;QACjB,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7B,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QACtE,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,qBAAqB,KAAK,CAAC,IAAI,kCAAkC,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,SAAS,GAAG;YAC3G,YAAY,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,aAAa,GAAG,EAClE,MAAM,CACN,CAAC;QACF,cAAc,CAAC,MAAM,CAAC;YACrB,IAAI,EAAE,gBAAgB;YACtB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC;YACzD,cAAc,EAAE,iBAAiB;YACjC,YAAY,EAAE,SAAS;YACvB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,+BAA+B,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,aAAa,GAAG;SACzG,CAAC,CAAC;QACH,aAAa,CAAC,GAAG,EAAE;YAClB,KAAK;YACL,UAAU,EAAE,SAAS;YACrB,eAAe;YACf,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACjC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAED,kDAAkD;IAClD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC5B,CAAC"}
@@ -195,7 +195,7 @@ async function runBugPipelineInner(opts, modelRoutingConfig, session) {
195
195
  // Spawn halt-recovery advisor (Tier 1, best-effort — non-fatal).
196
196
  if (preflightOutcome.gateFailure) {
197
197
  const advisorModel = resolveAdvisorModel(modelRoutingConfig, ctx.model);
198
- void runHaltAdvisor({
198
+ await runHaltAdvisor({
199
199
  gateFailure: preflightOutcome.gateFailure,
200
200
  advisorModel,
201
201
  taskId: bugId,
@@ -427,7 +427,7 @@ async function runBugPipelineInner(opts, modelRoutingConfig, session) {
427
427
  }
428
428
  // ── 6b. Verdict check (review phases only) ────────────────────
429
429
  if (phase.isReview) {
430
- const outcome = handleBugReviewVerdict({
430
+ const outcome = await handleBugReviewVerdict({
431
431
  phase,
432
432
  bugId,
433
433
  storeCli,