@accelerator-mzq/forge 1.4.0

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 (663) hide show
  1. package/LICENSE +21 -0
  2. package/LICENSE-THIRD-PARTY.md +50 -0
  3. package/README.md +159 -0
  4. package/dist/cli/commands/ack.d.ts +7 -0
  5. package/dist/cli/commands/ack.d.ts.map +1 -0
  6. package/dist/cli/commands/ack.js +223 -0
  7. package/dist/cli/commands/ack.js.map +1 -0
  8. package/dist/cli/commands/archive.d.ts +44 -0
  9. package/dist/cli/commands/archive.d.ts.map +1 -0
  10. package/dist/cli/commands/archive.js +689 -0
  11. package/dist/cli/commands/archive.js.map +1 -0
  12. package/dist/cli/commands/backlog.d.ts +3 -0
  13. package/dist/cli/commands/backlog.d.ts.map +1 -0
  14. package/dist/cli/commands/backlog.js +55 -0
  15. package/dist/cli/commands/backlog.js.map +1 -0
  16. package/dist/cli/commands/config.d.ts +3 -0
  17. package/dist/cli/commands/config.d.ts.map +1 -0
  18. package/dist/cli/commands/config.js +107 -0
  19. package/dist/cli/commands/config.js.map +1 -0
  20. package/dist/cli/commands/evidence.d.ts +7 -0
  21. package/dist/cli/commands/evidence.d.ts.map +1 -0
  22. package/dist/cli/commands/evidence.js +662 -0
  23. package/dist/cli/commands/evidence.js.map +1 -0
  24. package/dist/cli/commands/finding.d.ts +3 -0
  25. package/dist/cli/commands/finding.d.ts.map +1 -0
  26. package/dist/cli/commands/finding.js +93 -0
  27. package/dist/cli/commands/finding.js.map +1 -0
  28. package/dist/cli/commands/init.d.ts +3 -0
  29. package/dist/cli/commands/init.d.ts.map +1 -0
  30. package/dist/cli/commands/init.js +126 -0
  31. package/dist/cli/commands/init.js.map +1 -0
  32. package/dist/cli/commands/legacy-bridge.d.ts +11 -0
  33. package/dist/cli/commands/legacy-bridge.d.ts.map +1 -0
  34. package/dist/cli/commands/legacy-bridge.js +586 -0
  35. package/dist/cli/commands/legacy-bridge.js.map +1 -0
  36. package/dist/cli/commands/migrate.d.ts +3 -0
  37. package/dist/cli/commands/migrate.d.ts.map +1 -0
  38. package/dist/cli/commands/migrate.js +34 -0
  39. package/dist/cli/commands/migrate.js.map +1 -0
  40. package/dist/cli/commands/monitor.d.ts +3 -0
  41. package/dist/cli/commands/monitor.d.ts.map +1 -0
  42. package/dist/cli/commands/monitor.js +113 -0
  43. package/dist/cli/commands/monitor.js.map +1 -0
  44. package/dist/cli/commands/preflight.d.ts +7 -0
  45. package/dist/cli/commands/preflight.d.ts.map +1 -0
  46. package/dist/cli/commands/preflight.js +63 -0
  47. package/dist/cli/commands/preflight.js.map +1 -0
  48. package/dist/cli/commands/scope.d.ts +3 -0
  49. package/dist/cli/commands/scope.d.ts.map +1 -0
  50. package/dist/cli/commands/scope.js +32 -0
  51. package/dist/cli/commands/scope.js.map +1 -0
  52. package/dist/cli/commands/stage-extensions.d.ts +45 -0
  53. package/dist/cli/commands/stage-extensions.d.ts.map +1 -0
  54. package/dist/cli/commands/stage-extensions.js +590 -0
  55. package/dist/cli/commands/stage-extensions.js.map +1 -0
  56. package/dist/cli/commands/update.d.ts +3 -0
  57. package/dist/cli/commands/update.d.ts.map +1 -0
  58. package/dist/cli/commands/update.js +98 -0
  59. package/dist/cli/commands/update.js.map +1 -0
  60. package/dist/cli/commands/upgrade.d.ts +3 -0
  61. package/dist/cli/commands/upgrade.d.ts.map +1 -0
  62. package/dist/cli/commands/upgrade.js +277 -0
  63. package/dist/cli/commands/upgrade.js.map +1 -0
  64. package/dist/cli/commands/validate.d.ts +3 -0
  65. package/dist/cli/commands/validate.d.ts.map +1 -0
  66. package/dist/cli/commands/validate.js +66 -0
  67. package/dist/cli/commands/validate.js.map +1 -0
  68. package/dist/cli/index.d.ts +3 -0
  69. package/dist/cli/index.d.ts.map +1 -0
  70. package/dist/cli/index.js +69 -0
  71. package/dist/cli/index.js.map +1 -0
  72. package/dist/core/ack-log.d.ts +107 -0
  73. package/dist/core/ack-log.d.ts.map +1 -0
  74. package/dist/core/ack-log.js +197 -0
  75. package/dist/core/ack-log.js.map +1 -0
  76. package/dist/core/archive/ack-log-consistency.d.ts +15 -0
  77. package/dist/core/archive/ack-log-consistency.d.ts.map +1 -0
  78. package/dist/core/archive/ack-log-consistency.js +164 -0
  79. package/dist/core/archive/ack-log-consistency.js.map +1 -0
  80. package/dist/core/archive/fence.d.ts +66 -0
  81. package/dist/core/archive/fence.d.ts.map +1 -0
  82. package/dist/core/archive/fence.js +218 -0
  83. package/dist/core/archive/fence.js.map +1 -0
  84. package/dist/core/archive/index.d.ts +4 -0
  85. package/dist/core/archive/index.d.ts.map +1 -0
  86. package/dist/core/archive/index.js +6 -0
  87. package/dist/core/archive/index.js.map +1 -0
  88. package/dist/core/archive/legacy-exemption.d.ts +14 -0
  89. package/dist/core/archive/legacy-exemption.d.ts.map +1 -0
  90. package/dist/core/archive/legacy-exemption.js +82 -0
  91. package/dist/core/archive/legacy-exemption.js.map +1 -0
  92. package/dist/core/archive/lock.d.ts +46 -0
  93. package/dist/core/archive/lock.d.ts.map +1 -0
  94. package/dist/core/archive/lock.js +98 -0
  95. package/dist/core/archive/lock.js.map +1 -0
  96. package/dist/core/archive/pause-decisions-fence.d.ts +13 -0
  97. package/dist/core/archive/pause-decisions-fence.d.ts.map +1 -0
  98. package/dist/core/archive/pause-decisions-fence.js +384 -0
  99. package/dist/core/archive/pause-decisions-fence.js.map +1 -0
  100. package/dist/core/archive/process-evidence-fence.d.ts +110 -0
  101. package/dist/core/archive/process-evidence-fence.d.ts.map +1 -0
  102. package/dist/core/archive/process-evidence-fence.js +449 -0
  103. package/dist/core/archive/process-evidence-fence.js.map +1 -0
  104. package/dist/core/archive/process-evidence-rerun.d.ts +9 -0
  105. package/dist/core/archive/process-evidence-rerun.d.ts.map +1 -0
  106. package/dist/core/archive/process-evidence-rerun.js +238 -0
  107. package/dist/core/archive/process-evidence-rerun.js.map +1 -0
  108. package/dist/core/archive/recover-prompt.d.ts +10 -0
  109. package/dist/core/archive/recover-prompt.d.ts.map +1 -0
  110. package/dist/core/archive/recover-prompt.js +29 -0
  111. package/dist/core/archive/recover-prompt.js.map +1 -0
  112. package/dist/core/archive/recover.d.ts +83 -0
  113. package/dist/core/archive/recover.d.ts.map +1 -0
  114. package/dist/core/archive/recover.js +219 -0
  115. package/dist/core/archive/recover.js.map +1 -0
  116. package/dist/core/archive/resume-summary.d.ts +22 -0
  117. package/dist/core/archive/resume-summary.d.ts.map +1 -0
  118. package/dist/core/archive/resume-summary.js +82 -0
  119. package/dist/core/archive/resume-summary.js.map +1 -0
  120. package/dist/core/archive/summary-builder.d.ts +28 -0
  121. package/dist/core/archive/summary-builder.d.ts.map +1 -0
  122. package/dist/core/archive/summary-builder.js +287 -0
  123. package/dist/core/archive/summary-builder.js.map +1 -0
  124. package/dist/core/archive/summary-render.d.ts +8 -0
  125. package/dist/core/archive/summary-render.d.ts.map +1 -0
  126. package/dist/core/archive/summary-render.js +64 -0
  127. package/dist/core/archive/summary-render.js.map +1 -0
  128. package/dist/core/archive/three-level-fence.d.ts +10 -0
  129. package/dist/core/archive/three-level-fence.d.ts.map +1 -0
  130. package/dist/core/archive/three-level-fence.js +93 -0
  131. package/dist/core/archive/three-level-fence.js.map +1 -0
  132. package/dist/core/archive/transaction.d.ts +41 -0
  133. package/dist/core/archive/transaction.d.ts.map +1 -0
  134. package/dist/core/archive/transaction.js +184 -0
  135. package/dist/core/archive/transaction.js.map +1 -0
  136. package/dist/core/archive/verify-findings-fence.d.ts +11 -0
  137. package/dist/core/archive/verify-findings-fence.d.ts.map +1 -0
  138. package/dist/core/archive/verify-findings-fence.js +80 -0
  139. package/dist/core/archive/verify-findings-fence.js.map +1 -0
  140. package/dist/core/archive/version-retrograde-fence.d.ts +10 -0
  141. package/dist/core/archive/version-retrograde-fence.d.ts.map +1 -0
  142. package/dist/core/archive/version-retrograde-fence.js +103 -0
  143. package/dist/core/archive/version-retrograde-fence.js.map +1 -0
  144. package/dist/core/artifact-graph/builder.d.ts +16 -0
  145. package/dist/core/artifact-graph/builder.d.ts.map +1 -0
  146. package/dist/core/artifact-graph/builder.js +32 -0
  147. package/dist/core/artifact-graph/builder.js.map +1 -0
  148. package/dist/core/artifact-graph/index.d.ts +3 -0
  149. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  150. package/dist/core/artifact-graph/index.js +4 -0
  151. package/dist/core/artifact-graph/index.js.map +1 -0
  152. package/dist/core/artifact-graph/types.d.ts +14 -0
  153. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  154. package/dist/core/artifact-graph/types.js +2 -0
  155. package/dist/core/artifact-graph/types.js.map +1 -0
  156. package/dist/core/backlog/assets/backlog-readme.md +11 -0
  157. package/dist/core/backlog/index.d.ts +20 -0
  158. package/dist/core/backlog/index.d.ts.map +1 -0
  159. package/dist/core/backlog/index.js +60 -0
  160. package/dist/core/backlog/index.js.map +1 -0
  161. package/dist/core/backlog/render.d.ts +51 -0
  162. package/dist/core/backlog/render.d.ts.map +1 -0
  163. package/dist/core/backlog/render.js +196 -0
  164. package/dist/core/backlog/render.js.map +1 -0
  165. package/dist/core/bootstrap/index.d.ts +2 -0
  166. package/dist/core/bootstrap/index.d.ts.map +1 -0
  167. package/dist/core/bootstrap/index.js +5 -0
  168. package/dist/core/bootstrap/index.js.map +1 -0
  169. package/dist/core/canonical-json.d.ts +11 -0
  170. package/dist/core/canonical-json.d.ts.map +1 -0
  171. package/dist/core/canonical-json.js +43 -0
  172. package/dist/core/canonical-json.js.map +1 -0
  173. package/dist/core/git/utils.d.ts +27 -0
  174. package/dist/core/git/utils.d.ts.map +1 -0
  175. package/dist/core/git/utils.js +53 -0
  176. package/dist/core/git/utils.js.map +1 -0
  177. package/dist/core/harness-adapters/claude.d.ts +13 -0
  178. package/dist/core/harness-adapters/claude.d.ts.map +1 -0
  179. package/dist/core/harness-adapters/claude.js +53 -0
  180. package/dist/core/harness-adapters/claude.js.map +1 -0
  181. package/dist/core/harness-adapters/codex.d.ts +14 -0
  182. package/dist/core/harness-adapters/codex.d.ts.map +1 -0
  183. package/dist/core/harness-adapters/codex.js +60 -0
  184. package/dist/core/harness-adapters/codex.js.map +1 -0
  185. package/dist/core/harness-adapters/detector.d.ts +15 -0
  186. package/dist/core/harness-adapters/detector.d.ts.map +1 -0
  187. package/dist/core/harness-adapters/detector.js +45 -0
  188. package/dist/core/harness-adapters/detector.js.map +1 -0
  189. package/dist/core/harness-adapters/hash-compare.d.ts +21 -0
  190. package/dist/core/harness-adapters/hash-compare.d.ts.map +1 -0
  191. package/dist/core/harness-adapters/hash-compare.js +49 -0
  192. package/dist/core/harness-adapters/hash-compare.js.map +1 -0
  193. package/dist/core/harness-adapters/index.d.ts +8 -0
  194. package/dist/core/harness-adapters/index.d.ts.map +1 -0
  195. package/dist/core/harness-adapters/index.js +8 -0
  196. package/dist/core/harness-adapters/index.js.map +1 -0
  197. package/dist/core/harness-adapters/interface.d.ts +52 -0
  198. package/dist/core/harness-adapters/interface.d.ts.map +1 -0
  199. package/dist/core/harness-adapters/interface.js +3 -0
  200. package/dist/core/harness-adapters/interface.js.map +1 -0
  201. package/dist/core/harness-adapters/legacy-detector.d.ts +14 -0
  202. package/dist/core/harness-adapters/legacy-detector.d.ts.map +1 -0
  203. package/dist/core/harness-adapters/legacy-detector.js +83 -0
  204. package/dist/core/harness-adapters/legacy-detector.js.map +1 -0
  205. package/dist/core/harness-adapters/transaction.d.ts +12 -0
  206. package/dist/core/harness-adapters/transaction.d.ts.map +1 -0
  207. package/dist/core/harness-adapters/transaction.js +113 -0
  208. package/dist/core/harness-adapters/transaction.js.map +1 -0
  209. package/dist/core/harness-adapters/types.d.ts +45 -0
  210. package/dist/core/harness-adapters/types.d.ts.map +1 -0
  211. package/dist/core/harness-adapters/types.js +3 -0
  212. package/dist/core/harness-adapters/types.js.map +1 -0
  213. package/dist/core/hash/content.d.ts +10 -0
  214. package/dist/core/hash/content.d.ts.map +1 -0
  215. package/dist/core/hash/content.js +131 -0
  216. package/dist/core/hash/content.js.map +1 -0
  217. package/dist/core/hash/diff.d.ts +26 -0
  218. package/dist/core/hash/diff.d.ts.map +1 -0
  219. package/dist/core/hash/diff.js +40 -0
  220. package/dist/core/hash/diff.js.map +1 -0
  221. package/dist/core/hash/index.d.ts +6 -0
  222. package/dist/core/hash/index.d.ts.map +1 -0
  223. package/dist/core/hash/index.js +7 -0
  224. package/dist/core/hash/index.js.map +1 -0
  225. package/dist/core/hash/log.d.ts +7 -0
  226. package/dist/core/hash/log.d.ts.map +1 -0
  227. package/dist/core/hash/log.js +14 -0
  228. package/dist/core/hash/log.js.map +1 -0
  229. package/dist/core/hash/tasks.d.ts +9 -0
  230. package/dist/core/hash/tasks.d.ts.map +1 -0
  231. package/dist/core/hash/tasks.js +20 -0
  232. package/dist/core/hash/tasks.js.map +1 -0
  233. package/dist/core/legacy-bridge/ack.d.ts +30 -0
  234. package/dist/core/legacy-bridge/ack.d.ts.map +1 -0
  235. package/dist/core/legacy-bridge/ack.js +133 -0
  236. package/dist/core/legacy-bridge/ack.js.map +1 -0
  237. package/dist/core/legacy-bridge/anchors.d.ts +15 -0
  238. package/dist/core/legacy-bridge/anchors.d.ts.map +1 -0
  239. package/dist/core/legacy-bridge/anchors.js +119 -0
  240. package/dist/core/legacy-bridge/anchors.js.map +1 -0
  241. package/dist/core/legacy-bridge/budget.d.ts +39 -0
  242. package/dist/core/legacy-bridge/budget.d.ts.map +1 -0
  243. package/dist/core/legacy-bridge/budget.js +83 -0
  244. package/dist/core/legacy-bridge/budget.js.map +1 -0
  245. package/dist/core/legacy-bridge/conflict.d.ts +44 -0
  246. package/dist/core/legacy-bridge/conflict.d.ts.map +1 -0
  247. package/dist/core/legacy-bridge/conflict.js +105 -0
  248. package/dist/core/legacy-bridge/conflict.js.map +1 -0
  249. package/dist/core/legacy-bridge/diff-report.d.ts +14 -0
  250. package/dist/core/legacy-bridge/diff-report.d.ts.map +1 -0
  251. package/dist/core/legacy-bridge/diff-report.js +105 -0
  252. package/dist/core/legacy-bridge/diff-report.js.map +1 -0
  253. package/dist/core/legacy-bridge/encoding.d.ts +42 -0
  254. package/dist/core/legacy-bridge/encoding.d.ts.map +1 -0
  255. package/dist/core/legacy-bridge/encoding.js +104 -0
  256. package/dist/core/legacy-bridge/encoding.js.map +1 -0
  257. package/dist/core/legacy-bridge/excel.d.ts +32 -0
  258. package/dist/core/legacy-bridge/excel.d.ts.map +1 -0
  259. package/dist/core/legacy-bridge/excel.js +124 -0
  260. package/dist/core/legacy-bridge/excel.js.map +1 -0
  261. package/dist/core/legacy-bridge/hash-anchor.d.ts +23 -0
  262. package/dist/core/legacy-bridge/hash-anchor.d.ts.map +1 -0
  263. package/dist/core/legacy-bridge/hash-anchor.js +55 -0
  264. package/dist/core/legacy-bridge/hash-anchor.js.map +1 -0
  265. package/dist/core/legacy-bridge/indexer.d.ts +28 -0
  266. package/dist/core/legacy-bridge/indexer.d.ts.map +1 -0
  267. package/dist/core/legacy-bridge/indexer.js +145 -0
  268. package/dist/core/legacy-bridge/indexer.js.map +1 -0
  269. package/dist/core/legacy-bridge/mapper.d.ts +40 -0
  270. package/dist/core/legacy-bridge/mapper.d.ts.map +1 -0
  271. package/dist/core/legacy-bridge/mapper.js +241 -0
  272. package/dist/core/legacy-bridge/mapper.js.map +1 -0
  273. package/dist/core/legacy-bridge/quality-judge.d.ts +65 -0
  274. package/dist/core/legacy-bridge/quality-judge.d.ts.map +1 -0
  275. package/dist/core/legacy-bridge/quality-judge.js +277 -0
  276. package/dist/core/legacy-bridge/quality-judge.js.map +1 -0
  277. package/dist/core/legacy-bridge/redact.d.ts +28 -0
  278. package/dist/core/legacy-bridge/redact.d.ts.map +1 -0
  279. package/dist/core/legacy-bridge/redact.js +121 -0
  280. package/dist/core/legacy-bridge/redact.js.map +1 -0
  281. package/dist/core/legacy-bridge/regenerator.d.ts +50 -0
  282. package/dist/core/legacy-bridge/regenerator.d.ts.map +1 -0
  283. package/dist/core/legacy-bridge/regenerator.js +193 -0
  284. package/dist/core/legacy-bridge/regenerator.js.map +1 -0
  285. package/dist/core/legacy-bridge/resolve.d.ts +28 -0
  286. package/dist/core/legacy-bridge/resolve.d.ts.map +1 -0
  287. package/dist/core/legacy-bridge/resolve.js +75 -0
  288. package/dist/core/legacy-bridge/resolve.js.map +1 -0
  289. package/dist/core/legacy-bridge/sync-check.d.ts +47 -0
  290. package/dist/core/legacy-bridge/sync-check.d.ts.map +1 -0
  291. package/dist/core/legacy-bridge/sync-check.js +198 -0
  292. package/dist/core/legacy-bridge/sync-check.js.map +1 -0
  293. package/dist/core/legacy-bridge/types.d.ts +114 -0
  294. package/dist/core/legacy-bridge/types.d.ts.map +1 -0
  295. package/dist/core/legacy-bridge/types.js +4 -0
  296. package/dist/core/legacy-bridge/types.js.map +1 -0
  297. package/dist/core/markers/index.d.ts +3 -0
  298. package/dist/core/markers/index.d.ts.map +1 -0
  299. package/dist/core/markers/index.js +3 -0
  300. package/dist/core/markers/index.js.map +1 -0
  301. package/dist/core/markers/parse.d.ts +12 -0
  302. package/dist/core/markers/parse.d.ts.map +1 -0
  303. package/dist/core/markers/parse.js +31 -0
  304. package/dist/core/markers/parse.js.map +1 -0
  305. package/dist/core/markers/types.d.ts +142 -0
  306. package/dist/core/markers/types.d.ts.map +1 -0
  307. package/dist/core/markers/types.js +3 -0
  308. package/dist/core/markers/types.js.map +1 -0
  309. package/dist/core/migrate/ack.d.ts +13 -0
  310. package/dist/core/migrate/ack.d.ts.map +1 -0
  311. package/dist/core/migrate/ack.js +62 -0
  312. package/dist/core/migrate/ack.js.map +1 -0
  313. package/dist/core/migrate/archive-detect.d.ts +19 -0
  314. package/dist/core/migrate/archive-detect.d.ts.map +1 -0
  315. package/dist/core/migrate/archive-detect.js +89 -0
  316. package/dist/core/migrate/archive-detect.js.map +1 -0
  317. package/dist/core/migrate/budget.d.ts +7 -0
  318. package/dist/core/migrate/budget.d.ts.map +1 -0
  319. package/dist/core/migrate/budget.js +25 -0
  320. package/dist/core/migrate/budget.js.map +1 -0
  321. package/dist/core/migrate/conflict.d.ts +49 -0
  322. package/dist/core/migrate/conflict.d.ts.map +1 -0
  323. package/dist/core/migrate/conflict.js +99 -0
  324. package/dist/core/migrate/conflict.js.map +1 -0
  325. package/dist/core/migrate/index.d.ts +7 -0
  326. package/dist/core/migrate/index.d.ts.map +1 -0
  327. package/dist/core/migrate/index.js +389 -0
  328. package/dist/core/migrate/index.js.map +1 -0
  329. package/dist/core/migrate/markdown-aware.d.ts +27 -0
  330. package/dist/core/migrate/markdown-aware.d.ts.map +1 -0
  331. package/dist/core/migrate/markdown-aware.js +112 -0
  332. package/dist/core/migrate/markdown-aware.js.map +1 -0
  333. package/dist/core/migrate/quality.d.ts +66 -0
  334. package/dist/core/migrate/quality.d.ts.map +1 -0
  335. package/dist/core/migrate/quality.js +302 -0
  336. package/dist/core/migrate/quality.js.map +1 -0
  337. package/dist/core/migrate/regenerate.d.ts +24 -0
  338. package/dist/core/migrate/regenerate.d.ts.map +1 -0
  339. package/dist/core/migrate/regenerate.js +145 -0
  340. package/dist/core/migrate/regenerate.js.map +1 -0
  341. package/dist/core/migrate/report.d.ts +36 -0
  342. package/dist/core/migrate/report.d.ts.map +1 -0
  343. package/dist/core/migrate/report.js +154 -0
  344. package/dist/core/migrate/report.js.map +1 -0
  345. package/dist/core/migrate/sources/index.d.ts +4 -0
  346. package/dist/core/migrate/sources/index.d.ts.map +1 -0
  347. package/dist/core/migrate/sources/index.js +17 -0
  348. package/dist/core/migrate/sources/index.js.map +1 -0
  349. package/dist/core/migrate/sources/openspec.d.ts +14 -0
  350. package/dist/core/migrate/sources/openspec.d.ts.map +1 -0
  351. package/dist/core/migrate/sources/openspec.js +453 -0
  352. package/dist/core/migrate/sources/openspec.js.map +1 -0
  353. package/dist/core/migrate/sources/superpowers.d.ts +12 -0
  354. package/dist/core/migrate/sources/superpowers.d.ts.map +1 -0
  355. package/dist/core/migrate/sources/superpowers.js +310 -0
  356. package/dist/core/migrate/sources/superpowers.js.map +1 -0
  357. package/dist/core/migrate/types.d.ts +183 -0
  358. package/dist/core/migrate/types.d.ts.map +1 -0
  359. package/dist/core/migrate/types.js +5 -0
  360. package/dist/core/migrate/types.js.map +1 -0
  361. package/dist/core/migrate/utils.d.ts +2 -0
  362. package/dist/core/migrate/utils.d.ts.map +1 -0
  363. package/dist/core/migrate/utils.js +28 -0
  364. package/dist/core/migrate/utils.js.map +1 -0
  365. package/dist/core/monitor/artifact-observer.d.ts +9 -0
  366. package/dist/core/monitor/artifact-observer.d.ts.map +1 -0
  367. package/dist/core/monitor/artifact-observer.js +180 -0
  368. package/dist/core/monitor/artifact-observer.js.map +1 -0
  369. package/dist/core/monitor/config.d.ts +16 -0
  370. package/dist/core/monitor/config.d.ts.map +1 -0
  371. package/dist/core/monitor/config.js +48 -0
  372. package/dist/core/monitor/config.js.map +1 -0
  373. package/dist/core/monitor/divergence-map.d.ts +5 -0
  374. package/dist/core/monitor/divergence-map.d.ts.map +1 -0
  375. package/dist/core/monitor/divergence-map.js +92 -0
  376. package/dist/core/monitor/divergence-map.js.map +1 -0
  377. package/dist/core/monitor/exit-handler.d.ts +6 -0
  378. package/dist/core/monitor/exit-handler.d.ts.map +1 -0
  379. package/dist/core/monitor/exit-handler.js +27 -0
  380. package/dist/core/monitor/exit-handler.js.map +1 -0
  381. package/dist/core/monitor/health-verdict.d.ts +9 -0
  382. package/dist/core/monitor/health-verdict.d.ts.map +1 -0
  383. package/dist/core/monitor/health-verdict.js +55 -0
  384. package/dist/core/monitor/health-verdict.js.map +1 -0
  385. package/dist/core/monitor/report-renderer.d.ts +4 -0
  386. package/dist/core/monitor/report-renderer.d.ts.map +1 -0
  387. package/dist/core/monitor/report-renderer.js +82 -0
  388. package/dist/core/monitor/report-renderer.js.map +1 -0
  389. package/dist/core/monitor/trace-store.d.ts +39 -0
  390. package/dist/core/monitor/trace-store.d.ts.map +1 -0
  391. package/dist/core/monitor/trace-store.js +130 -0
  392. package/dist/core/monitor/trace-store.js.map +1 -0
  393. package/dist/core/monitor/types.d.ts +63 -0
  394. package/dist/core/monitor/types.d.ts.map +1 -0
  395. package/dist/core/monitor/types.js +26 -0
  396. package/dist/core/monitor/types.js.map +1 -0
  397. package/dist/core/parse/design.d.ts +14 -0
  398. package/dist/core/parse/design.d.ts.map +1 -0
  399. package/dist/core/parse/design.js +17 -0
  400. package/dist/core/parse/design.js.map +1 -0
  401. package/dist/core/parse/fenced-yaml.d.ts +18 -0
  402. package/dist/core/parse/fenced-yaml.d.ts.map +1 -0
  403. package/dist/core/parse/fenced-yaml.js +45 -0
  404. package/dist/core/parse/fenced-yaml.js.map +1 -0
  405. package/dist/core/parse/index.d.ts +7 -0
  406. package/dist/core/parse/index.d.ts.map +1 -0
  407. package/dist/core/parse/index.js +8 -0
  408. package/dist/core/parse/index.js.map +1 -0
  409. package/dist/core/parse/markdown.d.ts +30 -0
  410. package/dist/core/parse/markdown.d.ts.map +1 -0
  411. package/dist/core/parse/markdown.js +66 -0
  412. package/dist/core/parse/markdown.js.map +1 -0
  413. package/dist/core/parse/proposal.d.ts +18 -0
  414. package/dist/core/parse/proposal.d.ts.map +1 -0
  415. package/dist/core/parse/proposal.js +22 -0
  416. package/dist/core/parse/proposal.js.map +1 -0
  417. package/dist/core/parse/specs.d.ts +25 -0
  418. package/dist/core/parse/specs.d.ts.map +1 -0
  419. package/dist/core/parse/specs.js +58 -0
  420. package/dist/core/parse/specs.js.map +1 -0
  421. package/dist/core/parse/tasks.d.ts +33 -0
  422. package/dist/core/parse/tasks.d.ts.map +1 -0
  423. package/dist/core/parse/tasks.js +82 -0
  424. package/dist/core/parse/tasks.js.map +1 -0
  425. package/dist/core/parse/yaml.d.ts +13 -0
  426. package/dist/core/parse/yaml.d.ts.map +1 -0
  427. package/dist/core/parse/yaml.js +39 -0
  428. package/dist/core/parse/yaml.js.map +1 -0
  429. package/dist/core/process-evidence-freeze-warnings.d.ts +24 -0
  430. package/dist/core/process-evidence-freeze-warnings.d.ts.map +1 -0
  431. package/dist/core/process-evidence-freeze-warnings.js +153 -0
  432. package/dist/core/process-evidence-freeze-warnings.js.map +1 -0
  433. package/dist/core/schema/index.d.ts +5 -0
  434. package/dist/core/schema/index.d.ts.map +1 -0
  435. package/dist/core/schema/index.js +6 -0
  436. package/dist/core/schema/index.js.map +1 -0
  437. package/dist/core/schema/model-tiers-config.d.ts +41 -0
  438. package/dist/core/schema/model-tiers-config.d.ts.map +1 -0
  439. package/dist/core/schema/model-tiers-config.js +85 -0
  440. package/dist/core/schema/model-tiers-config.js.map +1 -0
  441. package/dist/core/schema/process-verification-config.d.ts +18 -0
  442. package/dist/core/schema/process-verification-config.d.ts.map +1 -0
  443. package/dist/core/schema/process-verification-config.js +74 -0
  444. package/dist/core/schema/process-verification-config.js.map +1 -0
  445. package/dist/core/schema/stage-extensions-config.d.ts +28 -0
  446. package/dist/core/schema/stage-extensions-config.d.ts.map +1 -0
  447. package/dist/core/schema/stage-extensions-config.js +228 -0
  448. package/dist/core/schema/stage-extensions-config.js.map +1 -0
  449. package/dist/core/schema/types.d.ts +262 -0
  450. package/dist/core/schema/types.d.ts.map +1 -0
  451. package/dist/core/schema/types.js +51 -0
  452. package/dist/core/schema/types.js.map +1 -0
  453. package/dist/core/schema/writing-plans-config.d.ts +11 -0
  454. package/dist/core/schema/writing-plans-config.d.ts.map +1 -0
  455. package/dist/core/schema/writing-plans-config.js +40 -0
  456. package/dist/core/schema/writing-plans-config.js.map +1 -0
  457. package/dist/core/schemas/archive-summary.d.ts +131 -0
  458. package/dist/core/schemas/archive-summary.d.ts.map +1 -0
  459. package/dist/core/schemas/archive-summary.js +31 -0
  460. package/dist/core/schemas/archive-summary.js.map +1 -0
  461. package/dist/core/schemas/process-evidence.d.ts +156 -0
  462. package/dist/core/schemas/process-evidence.d.ts.map +1 -0
  463. package/dist/core/schemas/process-evidence.js +12 -0
  464. package/dist/core/schemas/process-evidence.js.map +1 -0
  465. package/dist/core/schemas/scope-entries.d.ts +68 -0
  466. package/dist/core/schemas/scope-entries.d.ts.map +1 -0
  467. package/dist/core/schemas/scope-entries.js +47 -0
  468. package/dist/core/schemas/scope-entries.js.map +1 -0
  469. package/dist/core/schemas/severity.d.ts +58 -0
  470. package/dist/core/schemas/severity.d.ts.map +1 -0
  471. package/dist/core/schemas/severity.js +26 -0
  472. package/dist/core/schemas/severity.js.map +1 -0
  473. package/dist/core/scope/aggregator.d.ts +49 -0
  474. package/dist/core/scope/aggregator.d.ts.map +1 -0
  475. package/dist/core/scope/aggregator.js +141 -0
  476. package/dist/core/scope/aggregator.js.map +1 -0
  477. package/dist/core/scope/index.d.ts +2 -0
  478. package/dist/core/scope/index.d.ts.map +1 -0
  479. package/dist/core/scope/index.js +2 -0
  480. package/dist/core/scope/index.js.map +1 -0
  481. package/dist/core/specs-sync/apply.d.ts +8 -0
  482. package/dist/core/specs-sync/apply.d.ts.map +1 -0
  483. package/dist/core/specs-sync/apply.js +26 -0
  484. package/dist/core/specs-sync/apply.js.map +1 -0
  485. package/dist/core/specs-sync/deltas.d.ts +15 -0
  486. package/dist/core/specs-sync/deltas.d.ts.map +1 -0
  487. package/dist/core/specs-sync/deltas.js +27 -0
  488. package/dist/core/specs-sync/deltas.js.map +1 -0
  489. package/dist/core/specs-sync/index.d.ts +3 -0
  490. package/dist/core/specs-sync/index.d.ts.map +1 -0
  491. package/dist/core/specs-sync/index.js +4 -0
  492. package/dist/core/specs-sync/index.js.map +1 -0
  493. package/dist/core/stage-extensions/convergence-judge.d.ts +35 -0
  494. package/dist/core/stage-extensions/convergence-judge.d.ts.map +1 -0
  495. package/dist/core/stage-extensions/convergence-judge.js +47 -0
  496. package/dist/core/stage-extensions/convergence-judge.js.map +1 -0
  497. package/dist/core/stage-extensions/index.d.ts +13 -0
  498. package/dist/core/stage-extensions/index.d.ts.map +1 -0
  499. package/dist/core/stage-extensions/index.js +11 -0
  500. package/dist/core/stage-extensions/index.js.map +1 -0
  501. package/dist/core/stage-extensions/output-watcher.d.ts +93 -0
  502. package/dist/core/stage-extensions/output-watcher.d.ts.map +1 -0
  503. package/dist/core/stage-extensions/output-watcher.js +163 -0
  504. package/dist/core/stage-extensions/output-watcher.js.map +1 -0
  505. package/dist/core/stage-extensions/severity-mapper.d.ts +21 -0
  506. package/dist/core/stage-extensions/severity-mapper.d.ts.map +1 -0
  507. package/dist/core/stage-extensions/severity-mapper.js +26 -0
  508. package/dist/core/stage-extensions/severity-mapper.js.map +1 -0
  509. package/dist/core/stage-extensions/state-machine.d.ts +43 -0
  510. package/dist/core/stage-extensions/state-machine.d.ts.map +1 -0
  511. package/dist/core/stage-extensions/state-machine.js +19 -0
  512. package/dist/core/stage-extensions/state-machine.js.map +1 -0
  513. package/dist/core/stage-extensions/thread-map.d.ts +60 -0
  514. package/dist/core/stage-extensions/thread-map.d.ts.map +1 -0
  515. package/dist/core/stage-extensions/thread-map.js +107 -0
  516. package/dist/core/stage-extensions/thread-map.js.map +1 -0
  517. package/dist/core/stage-extensions/trend-analyzer.d.ts +29 -0
  518. package/dist/core/stage-extensions/trend-analyzer.d.ts.map +1 -0
  519. package/dist/core/stage-extensions/trend-analyzer.js +60 -0
  520. package/dist/core/stage-extensions/trend-analyzer.js.map +1 -0
  521. package/dist/core/stage-extensions/types.d.ts +39 -0
  522. package/dist/core/stage-extensions/types.d.ts.map +1 -0
  523. package/dist/core/stage-extensions/types.js +5 -0
  524. package/dist/core/stage-extensions/types.js.map +1 -0
  525. package/dist/core/staging-lock.d.ts +36 -0
  526. package/dist/core/staging-lock.d.ts.map +1 -0
  527. package/dist/core/staging-lock.js +122 -0
  528. package/dist/core/staging-lock.js.map +1 -0
  529. package/dist/core/templates/commands/ack-confirm.md +32 -0
  530. package/dist/core/templates/commands/apply.md +220 -0
  531. package/dist/core/templates/commands/archive.md +178 -0
  532. package/dist/core/templates/commands/brainstorm.md +58 -0
  533. package/dist/core/templates/commands/codex-adversarial.md +95 -0
  534. package/dist/core/templates/commands/explore.md +29 -0
  535. package/dist/core/templates/commands/index.d.ts +12 -0
  536. package/dist/core/templates/commands/index.d.ts.map +1 -0
  537. package/dist/core/templates/commands/index.js +26 -0
  538. package/dist/core/templates/commands/index.js.map +1 -0
  539. package/dist/core/templates/commands/propose.md +90 -0
  540. package/dist/core/templates/commands/review.md +105 -0
  541. package/dist/core/templates/commands/upgrade.md +58 -0
  542. package/dist/core/templates/commands/verify.md +186 -0
  543. package/dist/core/templates/index.d.ts +3 -0
  544. package/dist/core/templates/index.d.ts.map +1 -0
  545. package/dist/core/templates/index.js +5 -0
  546. package/dist/core/templates/index.js.map +1 -0
  547. package/dist/core/templates/skills/_shared/scope-category-guidance.md +40 -0
  548. package/dist/core/templates/skills/brainstorming.md +161 -0
  549. package/dist/core/templates/skills/dispatching-parallel-agents.md +209 -0
  550. package/dist/core/templates/skills/exploring.md +476 -0
  551. package/dist/core/templates/skills/finishing-a-development-branch.md +251 -0
  552. package/dist/core/templates/skills/index.d.ts +17 -0
  553. package/dist/core/templates/skills/index.d.ts.map +1 -0
  554. package/dist/core/templates/skills/index.js +53 -0
  555. package/dist/core/templates/skills/index.js.map +1 -0
  556. package/dist/core/templates/skills/process-evidence.md +146 -0
  557. package/dist/core/templates/skills/receiving-code-review.md +294 -0
  558. package/dist/core/templates/skills/requesting-code-review.md +108 -0
  559. package/dist/core/templates/skills/subagent-driven-development.md +405 -0
  560. package/dist/core/templates/skills/subagent-driven-discipline/references/codex-tools.md +72 -0
  561. package/dist/core/templates/skills/subagent-driven-discipline/references/opencode-tools.md +104 -0
  562. package/dist/core/templates/skills/subagent-driven-discipline.md +725 -0
  563. package/dist/core/templates/skills/systematic-debugging.md +297 -0
  564. package/dist/core/templates/skills/test-driven-development.md +402 -0
  565. package/dist/core/templates/skills/using-forge.md +163 -0
  566. package/dist/core/templates/skills/using-git-worktrees.md +229 -0
  567. package/dist/core/templates/skills/verification-before-completion.md +175 -0
  568. package/dist/core/templates/skills/verifying-three-dimensions.md +245 -0
  569. package/dist/core/templates/skills/writing-plans.md +259 -0
  570. package/dist/core/templates/skills/writing-skills.md +214 -0
  571. package/dist/core/test-reporters/index.d.ts +41 -0
  572. package/dist/core/test-reporters/index.d.ts.map +1 -0
  573. package/dist/core/test-reporters/index.js +39 -0
  574. package/dist/core/test-reporters/index.js.map +1 -0
  575. package/dist/core/test-reporters/junit.d.ts +8 -0
  576. package/dist/core/test-reporters/junit.d.ts.map +1 -0
  577. package/dist/core/test-reporters/junit.js +94 -0
  578. package/dist/core/test-reporters/junit.js.map +1 -0
  579. package/dist/core/test-reporters/tap.d.ts +18 -0
  580. package/dist/core/test-reporters/tap.d.ts.map +1 -0
  581. package/dist/core/test-reporters/tap.js +73 -0
  582. package/dist/core/test-reporters/tap.js.map +1 -0
  583. package/dist/core/test-reporters/vitest-json.d.ts +8 -0
  584. package/dist/core/test-reporters/vitest-json.d.ts.map +1 -0
  585. package/dist/core/test-reporters/vitest-json.js +56 -0
  586. package/dist/core/test-reporters/vitest-json.js.map +1 -0
  587. package/dist/core/upgrade/resign-markers.d.ts +14 -0
  588. package/dist/core/upgrade/resign-markers.d.ts.map +1 -0
  589. package/dist/core/upgrade/resign-markers.js +245 -0
  590. package/dist/core/upgrade/resign-markers.js.map +1 -0
  591. package/dist/core/validate/archive-summary-schema.d.ts +8 -0
  592. package/dist/core/validate/archive-summary-schema.d.ts.map +1 -0
  593. package/dist/core/validate/archive-summary-schema.js +186 -0
  594. package/dist/core/validate/archive-summary-schema.js.map +1 -0
  595. package/dist/core/validate/auto-findings.d.ts +36 -0
  596. package/dist/core/validate/auto-findings.d.ts.map +1 -0
  597. package/dist/core/validate/auto-findings.js +38 -0
  598. package/dist/core/validate/auto-findings.js.map +1 -0
  599. package/dist/core/validate/candidate-validators.d.ts +22 -0
  600. package/dist/core/validate/candidate-validators.d.ts.map +1 -0
  601. package/dist/core/validate/candidate-validators.js +46 -0
  602. package/dist/core/validate/candidate-validators.js.map +1 -0
  603. package/dist/core/validate/change.d.ts +3 -0
  604. package/dist/core/validate/change.d.ts.map +1 -0
  605. package/dist/core/validate/change.js +205 -0
  606. package/dist/core/validate/change.js.map +1 -0
  607. package/dist/core/validate/coverage-gap.d.ts +37 -0
  608. package/dist/core/validate/coverage-gap.d.ts.map +1 -0
  609. package/dist/core/validate/coverage-gap.js +181 -0
  610. package/dist/core/validate/coverage-gap.js.map +1 -0
  611. package/dist/core/validate/finding-hash.d.ts +14 -0
  612. package/dist/core/validate/finding-hash.d.ts.map +1 -0
  613. package/dist/core/validate/finding-hash.js +29 -0
  614. package/dist/core/validate/finding-hash.js.map +1 -0
  615. package/dist/core/validate/index.d.ts +15 -0
  616. package/dist/core/validate/index.d.ts.map +1 -0
  617. package/dist/core/validate/index.js +19 -0
  618. package/dist/core/validate/index.js.map +1 -0
  619. package/dist/core/validate/marker-integrity.d.ts +28 -0
  620. package/dist/core/validate/marker-integrity.d.ts.map +1 -0
  621. package/dist/core/validate/marker-integrity.js +170 -0
  622. package/dist/core/validate/marker-integrity.js.map +1 -0
  623. package/dist/core/validate/marker-schema.d.ts +10 -0
  624. package/dist/core/validate/marker-schema.d.ts.map +1 -0
  625. package/dist/core/validate/marker-schema.js +661 -0
  626. package/dist/core/validate/marker-schema.js.map +1 -0
  627. package/dist/core/validate/orphan-tmp.d.ts +13 -0
  628. package/dist/core/validate/orphan-tmp.d.ts.map +1 -0
  629. package/dist/core/validate/orphan-tmp.js +49 -0
  630. package/dist/core/validate/orphan-tmp.js.map +1 -0
  631. package/dist/core/validate/proposal.d.ts +4 -0
  632. package/dist/core/validate/proposal.d.ts.map +1 -0
  633. package/dist/core/validate/proposal.js +40 -0
  634. package/dist/core/validate/proposal.js.map +1 -0
  635. package/dist/core/validate/scope-entries.d.ts +23 -0
  636. package/dist/core/validate/scope-entries.d.ts.map +1 -0
  637. package/dist/core/validate/scope-entries.js +108 -0
  638. package/dist/core/validate/scope-entries.js.map +1 -0
  639. package/dist/core/validate/specs.d.ts +4 -0
  640. package/dist/core/validate/specs.d.ts.map +1 -0
  641. package/dist/core/validate/specs.js +74 -0
  642. package/dist/core/validate/specs.js.map +1 -0
  643. package/dist/core/validate/tasks.d.ts +4 -0
  644. package/dist/core/validate/tasks.d.ts.map +1 -0
  645. package/dist/core/validate/tasks.js +48 -0
  646. package/dist/core/validate/tasks.js.map +1 -0
  647. package/dist/core/validate/test-failure-stub.d.ts +23 -0
  648. package/dist/core/validate/test-failure-stub.d.ts.map +1 -0
  649. package/dist/core/validate/test-failure-stub.js +21 -0
  650. package/dist/core/validate/test-failure-stub.js.map +1 -0
  651. package/dist/core/validate/types.d.ts +33 -0
  652. package/dist/core/validate/types.d.ts.map +1 -0
  653. package/dist/core/validate/types.js +20 -0
  654. package/dist/core/validate/types.js.map +1 -0
  655. package/dist/core/worktree.d.ts +52 -0
  656. package/dist/core/worktree.d.ts.map +1 -0
  657. package/dist/core/worktree.js +145 -0
  658. package/dist/core/worktree.js.map +1 -0
  659. package/dist/index.d.ts +12 -0
  660. package/dist/index.d.ts.map +1 -0
  661. package/dist/index.js +14 -0
  662. package/dist/index.js.map +1 -0
  663. package/package.json +82 -0
@@ -0,0 +1,180 @@
1
+ // src/core/monitor/artifact-observer.ts — 把 forge 常规产物反推成 CLI 层 trace 事件(spec §3 / §3.2)
2
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { parse as parseYAML } from 'yaml';
5
+ import { parseMarker } from '../markers/parse.js';
6
+ import { validateMarkerSchema } from '../validate/marker-schema.js';
7
+ import { validateArchiveSummarySchema } from '../validate/archive-summary-schema.js';
8
+ /** marker 文件名 → 监控阶段(以 Step 1 确认的实际文件名为准) */
9
+ const MARKER_FILES = {
10
+ '.verify-passed': 'verify',
11
+ '.verify-failed': 'verify',
12
+ '.review-passed': 'review',
13
+ '.review-failed': 'review',
14
+ };
15
+ function mkEvent(changeId, stage, event, data, ts) {
16
+ return {
17
+ // 优先用产物自带时间戳;缺失才回退观察时刻 —— 报告时间线才不乱序(Codex 计划审查第 4 轮 检查点 3)
18
+ ts: ts ?? new Date().toISOString(),
19
+ schema: 'forge-monitor-trace/v1',
20
+ change_id: changeId,
21
+ stage,
22
+ layer: 'cli',
23
+ event,
24
+ data,
25
+ };
26
+ }
27
+ /** 扫一个目录里的 4 个 marker 文件,产出 marker_observed / record_error 事件 */
28
+ function observeMarkers(dir, relBase, changeId) {
29
+ const events = [];
30
+ for (const [fileName, stage] of Object.entries(MARKER_FILES)) {
31
+ const markerPath = join(dir, fileName);
32
+ if (!existsSync(markerPath))
33
+ continue;
34
+ const relPath = join(relBase, fileName);
35
+ try {
36
+ const marker = parseMarker(readFileSync(markerPath, 'utf8'));
37
+ // marker 是 union 类型;失败类 marker 无 hash 字段,转 record 安全取值
38
+ const obj = marker;
39
+ const validation = validateMarkerSchema(marker, markerPath);
40
+ // 事件 ts 取 marker 自带时间戳(verify→verified_at / review→reviewed_at / failed→failed_at);
41
+ // 报告「阶段时间线」按真实时序排序才有意义(Codex 计划审查第 4 轮 检查点 3)。
42
+ // 用 typeof runtime guard 而非 as 断言 —— schema-invalid marker 的时间戳字段可能不是 string,
43
+ // as 会让非 string 值漏进 TraceEvent.ts,致 Task 11 排序 localeCompare 崩溃(第 5 轮 Finding 1)
44
+ const markerTs = typeof obj.verified_at === 'string'
45
+ ? obj.verified_at
46
+ : typeof obj.reviewed_at === 'string'
47
+ ? obj.reviewed_at
48
+ : typeof obj.failed_at === 'string'
49
+ ? obj.failed_at
50
+ : undefined;
51
+ events.push(mkEvent(changeId, stage, 'marker_observed', {
52
+ marker_schema: marker.schema,
53
+ path: relPath,
54
+ hashes: { tasks_hash: obj.tasks_hash, content_hash: obj.content_hash },
55
+ ok: validation.valid, // spec §3.2:ok = marker schema 校验是否通过
56
+ observed_at: new Date().toISOString(), // observer 实际跑的时刻,与 ts 区分
57
+ }, markerTs));
58
+ // I-2(spec §3.2):verify/review fence_observed —— 从 marker findings 抽未决项。
59
+ // findings 数组字段名按 marker 类型不同:verify(pass/fail)用 verify_findings;
60
+ // review-passed 用 review_outcomes;review-failed 用 unresolved_outcomes。
61
+ // 一个 marker 至多含其一,逐个探测取首个数组。
62
+ let rawFindings = [];
63
+ for (const key of ['verify_findings', 'review_outcomes', 'unresolved_outcomes']) {
64
+ if (Array.isArray(obj[key])) {
65
+ rawFindings = obj[key];
66
+ break;
67
+ }
68
+ }
69
+ const blockedFindings = rawFindings
70
+ .filter((f) => f.resolved === false)
71
+ .map((f, i) => ({ id: f.id ?? i, severity: f.severity ?? null, dimension: f.dimension }));
72
+ // 'S' 是 review_outcomes 的 CRITICAL 简码(verify_findings 不用简码)
73
+ const fenceOk = !blockedFindings.some((b) => b.severity === 'CRITICAL' || b.severity === 'S');
74
+ events.push(mkEvent(changeId, stage, 'fence_observed', { level: stage, ok: fenceOk, blocked_findings: blockedFindings, path: relPath }, markerTs));
75
+ }
76
+ catch (err) {
77
+ events.push(mkEvent(changeId, stage, 'record_error', { path: relPath, error: err.message }));
78
+ }
79
+ }
80
+ return events;
81
+ }
82
+ /** 读一个 change 目录的 .evidence/ack-log.jsonl,对每条 ack entry 产 ack_observed 事件(spec §3.2) */
83
+ function observeAckLog(dir, changeId) {
84
+ const events = [];
85
+ const logPath = join(dir, '.evidence', 'ack-log.jsonl');
86
+ if (!existsSync(logPath))
87
+ return events;
88
+ let lines;
89
+ try {
90
+ lines = readFileSync(logPath, 'utf8').split(/\r?\n/);
91
+ }
92
+ catch {
93
+ return events; // 读失败 → 跳过,never-throw
94
+ }
95
+ for (const line of lines) {
96
+ if (!line.trim())
97
+ continue;
98
+ try {
99
+ const entry = JSON.parse(line);
100
+ if (entry.kind !== 'ack')
101
+ continue; // 只记 ack entry,跳过 evidence-helper
102
+ events.push(mkEvent(changeId, 'ack-confirm', 'ack_observed', {
103
+ action: entry.action ?? null,
104
+ finding_id: entry.finding_id ?? null,
105
+ severity: entry.target_severity ?? null,
106
+ user: entry.user ?? null,
107
+ }, typeof entry.timestamp === 'string' ? entry.timestamp : undefined));
108
+ }
109
+ catch {
110
+ /* 坏 JSON 行跳过 */
111
+ }
112
+ }
113
+ return events;
114
+ }
115
+ /**
116
+ * 扫描某 change 的产物,反推 CLI 层事件(spec §3 / §3.2)。
117
+ * 同时扫 active 目录 forge/changes/<id>/ 与 archive 目录 forge/changes/archive/<id>/
118
+ * —— 产物是 forge 常规输出、与监控开关无关,故可回溯 enable 之前的阶段(spec §2.4)。
119
+ * 单个产物解析失败不抛,产出一条 record_error 事件。
120
+ */
121
+ export function observeArtifacts(projectRoot, changeId) {
122
+ const events = [];
123
+ // 1. active change 目录的 marker + ack-log
124
+ const activeDir = join(projectRoot, 'forge', 'changes', changeId);
125
+ if (existsSync(activeDir)) {
126
+ events.push(...observeMarkers(activeDir, join('forge', 'changes', changeId), changeId));
127
+ events.push(...observeAckLog(activeDir, changeId));
128
+ }
129
+ // 2. archive 目录 —— archive 成功后 change 移到 forge/changes/archive/<YYYY-MM-DD>-<changeId>/
130
+ // (transaction.ts:56 给目录名加 archiveDate 前缀;monitor 不知 archiveDate,按正则反解;
131
+ // Codex 计划审查第 2 轮 F-2 / 新-1 / 新-3)
132
+ const archiveRoot = join(projectRoot, 'forge', 'changes', 'archive');
133
+ if (existsSync(archiveRoot)) {
134
+ try {
135
+ for (const entry of readdirSync(archiveRoot, { withFileTypes: true })) {
136
+ if (!entry.isDirectory())
137
+ continue;
138
+ // 目录名 = <YYYY-MM-DD>-<changeId>;剥一层日期前缀,余下须严格等于 changeId
139
+ const m = /^\d{4}-\d{2}-\d{2}-(.+)$/.exec(entry.name);
140
+ if (!m || m[1] !== changeId)
141
+ continue;
142
+ const archiveDir = join(archiveRoot, entry.name);
143
+ const archiveRel = join('forge', 'changes', 'archive', entry.name);
144
+ events.push(...observeMarkers(archiveDir, archiveRel, changeId));
145
+ events.push(...observeAckLog(archiveDir, changeId));
146
+ // archive_summary.yaml —— 三级 fence 的 archive 侧裁决产物(spec §3.2)
147
+ const summaryPath = join(archiveDir, 'archive_summary.yaml');
148
+ if (!existsSync(summaryPath))
149
+ continue;
150
+ const summaryRel = join(archiveRel, 'archive_summary.yaml');
151
+ try {
152
+ const summary = parseYAML(readFileSync(summaryPath, 'utf8'));
153
+ // Codex 计划审查第 2 轮 新-2:用完整 schema 校验定 ok,而非浅守卫 looksLikeArchiveSummary
154
+ const validation = validateArchiveSummarySchema(summary, summaryPath);
155
+ const s = (summary ?? {});
156
+ events.push(mkEvent(changeId, 'archive', 'fence_observed', {
157
+ level: 'archive',
158
+ ok: validation.valid,
159
+ path: summaryRel,
160
+ verify_passed: s.verify_passed,
161
+ review_passed: s.review_passed,
162
+ process_evidence_summary: s.process_evidence_summary,
163
+ observed_at: new Date().toISOString(),
164
+ }, typeof s.archived_at === 'string' ? s.archived_at : undefined));
165
+ }
166
+ catch (err) {
167
+ events.push(mkEvent(changeId, 'archive', 'record_error', {
168
+ path: summaryRel,
169
+ error: err.message,
170
+ }));
171
+ }
172
+ }
173
+ }
174
+ catch {
175
+ // archive 目录读取失败(并发删除/权限)→ 跳过 archive 扫描,不破坏 active 事件契约
176
+ }
177
+ }
178
+ return events;
179
+ }
180
+ //# sourceMappingURL=artifact-observer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-observer.js","sourceRoot":"","sources":["../../../src/core/monitor/artifact-observer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** forge/config.yaml 的绝对路径(cwd=项目根约定,对齐 config 命令,spec §9 G-9) */
2
+ export declare function monitorConfigPath(projectRoot: string): string;
3
+ /**
4
+ * 读路径:任何异常(缺失 / 损坏 / 缺段)一律返回 false,绝不抛(spec §3.1)。
5
+ * 同步实现 —— exit 处理器与 CLI 子命令都可调。
6
+ */
7
+ export declare function isMonitorEnabled(projectRoot: string): boolean;
8
+ /**
9
+ * 写路径:fail-fast(spec §3.1 G-8)。
10
+ * - config 不存在 → 报错提示先 forge init(不自行造 config)。
11
+ * - config 损坏 → 报错 abort(不静默覆盖损坏文件)。
12
+ * 正常路径 read-modify-write,保留其它字段值(注释/格式不保留,与 `forge config set` 一致)。
13
+ * monitor 段内部也走 spread 合并,保留 monitor 对象的其它字段。
14
+ */
15
+ export declare function setMonitorEnabled(projectRoot: string, enabled: boolean): void;
16
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/config.ts"],"names":[],"mappings":"AAOA,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAS7D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAa7E"}
@@ -0,0 +1,48 @@
1
+ // src/core/monitor/config.ts — monitor 开关读写(spec §3.1)
2
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { stringify as stringifyYAML } from 'yaml';
5
+ import { parseConfig } from '../parse/index.js';
6
+ /** forge/config.yaml 的绝对路径(cwd=项目根约定,对齐 config 命令,spec §9 G-9) */
7
+ export function monitorConfigPath(projectRoot) {
8
+ return join(projectRoot, 'forge', 'config.yaml');
9
+ }
10
+ /**
11
+ * 读路径:任何异常(缺失 / 损坏 / 缺段)一律返回 false,绝不抛(spec §3.1)。
12
+ * 同步实现 —— exit 处理器与 CLI 子命令都可调。
13
+ */
14
+ export function isMonitorEnabled(projectRoot) {
15
+ try {
16
+ const path = monitorConfigPath(projectRoot);
17
+ if (!existsSync(path))
18
+ return false;
19
+ const config = parseConfig(readFileSync(path, 'utf8'));
20
+ return config.monitor?.enabled === true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ /**
27
+ * 写路径:fail-fast(spec §3.1 G-8)。
28
+ * - config 不存在 → 报错提示先 forge init(不自行造 config)。
29
+ * - config 损坏 → 报错 abort(不静默覆盖损坏文件)。
30
+ * 正常路径 read-modify-write,保留其它字段值(注释/格式不保留,与 `forge config set` 一致)。
31
+ * monitor 段内部也走 spread 合并,保留 monitor 对象的其它字段。
32
+ */
33
+ export function setMonitorEnabled(projectRoot, enabled) {
34
+ const path = monitorConfigPath(projectRoot);
35
+ if (!existsSync(path)) {
36
+ throw new Error(`forge/config.yaml 不存在(${path})—— 先跑 \`forge init\` 初始化项目`);
37
+ }
38
+ let config;
39
+ try {
40
+ config = parseConfig(readFileSync(path, 'utf8'));
41
+ }
42
+ catch (err) {
43
+ throw new Error(`forge/config.yaml 解析失败,拒绝覆盖:${err.message}`);
44
+ }
45
+ config.monitor = { ...config.monitor, enabled };
46
+ writeFileSync(path, stringifyYAML(config), 'utf8');
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/monitor/config.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,kEAAkE;AAClE,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACpC,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAAgB;IACrE,MAAM,IAAI,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,6BAA6B,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+BAAgC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAChD,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DivergenceMap, DivergenceScenario } from './types.js';
2
+ export declare const DIVERGENCE_MAP: DivergenceMap;
3
+ /** 按 scenario_id 查询 */
4
+ export declare function findScenario(id: string): DivergenceScenario | undefined;
5
+ //# sourceMappingURL=divergence-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divergence-map.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/divergence-map.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEpE,eAAO,MAAM,cAAc,EAAE,aA0G5B,CAAC;AAEF,uBAAuB;AACvB,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEvE"}
@@ -0,0 +1,92 @@
1
+ export const DIVERGENCE_MAP = {
2
+ meta: {
3
+ schema: 'forge-monitor-divergence-map/v1',
4
+ // 挖掘时两上游仓的实际 commit(git -C ../OpenSpec / ../superpowers rev-parse --short HEAD)
5
+ synced_against: { openspec: '435458b', superpowers: 'e7a2d16' },
6
+ synced_at: '2026-05-16',
7
+ },
8
+ scenarios: [
9
+ // ── brainstorm ────────────────────────────────────────────────────────
10
+ {
11
+ stage: 'brainstorm',
12
+ scenario_id: 'brainstorm-one-line-need',
13
+ desc: '用户给一句话需求(如「加个 todo list」),要不要先问澄清问题再动手?',
14
+ openspec: 'openspec change new 仅 scaffold 出 change 目录骨架,无强制澄清问答,直接进产物起草',
15
+ superpowers: 'brainstorming skill 有 HARD-GATE + 逐个澄清问答 checklist,但属 skill 行为约束,无机器 fence 兜底',
16
+ forge: 'forge:brainstorming skill 强制逐个提问 + 「禁止行为」明令即使用户说「我想清楚了」也不许跳过问答,产物只能落 forge/drafts/',
17
+ rationale: '反向加固 —— 防 AI 拿一句话需求当完整 spec、跳过澄清直接写代码',
18
+ regression_signal: 'brainstorm 阶段 trace 无 clarifying-question 事件、直接出现 draft/artifact 写入 → forge 塌回 OpenSpec 无澄清基线',
19
+ },
20
+ // ── propose ───────────────────────────────────────────────────────────
21
+ {
22
+ stage: 'propose',
23
+ scenario_id: 'propose-artifact-completeness',
24
+ desc: 'proposal 写完了,specs/design/tasks 还没补齐,要不要就这样进 apply?',
25
+ openspec: 'openspec 产物按 artifact-graph 逐件生成,validate 做结构校验但不阻塞流程推进,缺件可继续',
26
+ superpowers: 'writing-plans skill 产计划文档并自检 placeholder,但无四件套强校验,scope 解耦靠人把关',
27
+ forge: 'propose 末尾强制跑 forge validate <id> 校验 proposal+specs+design+tasks 四件套齐全 + 三段 scope anchor,失败回补不留半成品',
28
+ rationale: '反向加固 —— 防 AI 只写 proposal 就推进、留不完整产物拖到后续阶段',
29
+ regression_signal: 'propose 阶段 trace 无 forge-validate 通过事件、或 validate exit_code≠0 仍进 apply → forge 塌回 OpenSpec 弱校验基线',
30
+ },
31
+ // ── apply ─────────────────────────────────────────────────────────────
32
+ {
33
+ stage: 'apply',
34
+ scenario_id: 'apply-out-of-scope-finding',
35
+ desc: '子代理实施中发现一个本 change 没覆盖、但相关的需求,要不要顺手做掉?',
36
+ openspec: 'openspec 无子代理派发协议,实施由单一代理顺序跑,scope 外发现多半被就地吸收进当前改动',
37
+ superpowers: 'subagent-driven-development 派 fresh 子代理逐 task 实施,但 scope 外发现的处置靠主代理判断,无强制四选项',
38
+ forge: 'apply 的 Fluid Pause:子代理报非 CRITICAL concern 时主代理停下走 AskUserQuestion 四选项(扩 scope/加 task/转 out-of-scope/Other),决策写 marker pause_decisions',
39
+ rationale: '反向加固 —— 防 AI 子代理擅自扩 scope、把计划外改动悄悄塞进当前 change',
40
+ regression_signal: 'apply 阶段 trace 出现 scope 外 commit 但无 fluid-pause / pause_decision 事件 → forge 塌回 superpowers 无强制暂停基线',
41
+ },
42
+ // ── review ────────────────────────────────────────────────────────────
43
+ {
44
+ stage: 'review',
45
+ scenario_id: 'review-finding-severity-ack',
46
+ desc: 'review 子代理报了一条意见,主代理觉得不重要,要不要直接略过?',
47
+ openspec: 'openspec 无独立 review 阶段,正确性靠 validate + 人工把关,review finding 无 severity 分级与签收',
48
+ superpowers: 'requesting-code-review 派 code-reviewer 子代理并分 Critical/Important/Minor,但接受/反驳由主代理自由裁量,无存档强制',
49
+ forge: 'review finding 带严重度分级,主代理逐条判接受/拒绝,拒绝须证据存档;仅「无未存档拒绝 + 接受项全实现测试通过 + 本轮无新 task」三条件齐才打 .review-passed',
50
+ rationale: '反向加固 —— 防 AI 主代理无证据略过 review 意见、草率打 review-passed marker',
51
+ regression_signal: 'review 阶段 trace 有 reviewer finding 但无对应 accept/reject 记录,或 .review-passed 在仍有 finding 未处置时落地 → forge 塌回 superpowers 自由裁量基线',
52
+ },
53
+ // ── verify ────────────────────────────────────────────────────────────
54
+ {
55
+ stage: 'verify',
56
+ scenario_id: 'verify-tests-green',
57
+ desc: '测试全 pass,要不要继续深挖?',
58
+ openspec: '无强 verify 阶段,验证靠 review,≈ 弱/无对应',
59
+ superpowers: 'verification-before-completion:跑验证命令、确认输出;pass 即可声明完成',
60
+ forge: 'verifying-three-dimensions:测试 pass 只是 Correctness 一维;还需 Completeness + Coherence',
61
+ rationale: '反向加固 —— 防 AI 拿「测试绿」当完工',
62
+ regression_signal: 'verify 阶段 trace 只有 Correctness 维度 record,缺 Completeness/Coherence → forge 塌回 superpowers 基线',
63
+ },
64
+ // ── archive ───────────────────────────────────────────────────────────
65
+ {
66
+ stage: 'archive',
67
+ scenario_id: 'archive-unresolved-warning',
68
+ desc: 'review 留了个未解决 WARNING,要不要归档?',
69
+ openspec: 'openspec archive 无 severity 分级 fence → 多半放行',
70
+ superpowers: 'finishing-a-development-branch:给 merge/PR/cleanup 选项,不强制 finding 解决',
71
+ forge: '三级 fence:WARNING 未 resolve 且无 ack → 拒签 exit 1',
72
+ rationale: '反向加固 —— 强 fence 防偷懒归档',
73
+ regression_signal: 'archive 在有未 ack WARNING 时 cli_exit.exit_code=0 → 回归',
74
+ },
75
+ // ── explore ───────────────────────────────────────────────────────────
76
+ {
77
+ stage: 'explore',
78
+ scenario_id: 'explore-capture-conclusion',
79
+ desc: '一轮探索想出了结论,要不要顺手把结论写进 design/proposal 产物?',
80
+ openspec: 'openspec 探索能力弱,无显式 explore 阶段;探索心得多半直接被吸收进产物或散落上下文',
81
+ superpowers: 'superpowers 无 exploring skill,非线性探索靠 brainstorming/systematic-debugging 边角覆盖,结论落点无约束',
82
+ forge: 'forge:exploring skill 强制末尾输出 ## Exploration Summary 收尾、capture offer 必须给具体 file:section,且禁止 explore turn 内直接 Write/Edit 改 forge/changes/* 产物',
83
+ rationale: '反向加固 —— 防 AI 探索完无结论、或绕开用户确认直接把探索改动塞进产物',
84
+ regression_signal: 'explore 阶段 trace 出现 forge/changes/* 产物写入但无 capture-offer + 用户确认事件,或无 exploration-summary 收尾 → forge 塌回上游无约束基线',
85
+ },
86
+ ],
87
+ };
88
+ /** 按 scenario_id 查询 */
89
+ export function findScenario(id) {
90
+ return DIVERGENCE_MAP.scenarios.find((s) => s.scenario_id === id);
91
+ }
92
+ //# sourceMappingURL=divergence-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divergence-map.js","sourceRoot":"","sources":["../../../src/core/monitor/divergence-map.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,IAAI,EAAE;QACJ,MAAM,EAAE,iCAAiC;QACzC,gFAAgF;QAChF,cAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE;QAC/D,SAAS,EAAE,YAAY;KACxB;IACD,SAAS,EAAE;QACT,yEAAyE;QACzE;YACE,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,0BAA0B;YACvC,IAAI,EAAE,yCAAyC;YAC/C,QAAQ,EAAE,8DAA8D;YACxE,WAAW,EACT,+EAA+E;YACjF,KAAK,EACH,oFAAoF;YACtF,SAAS,EAAE,uCAAuC;YAClD,iBAAiB,EACf,+FAA+F;SAClG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,+BAA+B;YAC5C,IAAI,EAAE,qDAAqD;YAC3D,QAAQ,EACN,+DAA+D;YACjE,WAAW,EACT,gEAAgE;YAClE,KAAK,EACH,oGAAoG;YACtG,SAAS,EAAE,2CAA2C;YACtD,iBAAiB,EACf,kGAAkG;SACrG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,wCAAwC;YAC9C,QAAQ,EACN,oDAAoD;YACtD,WAAW,EACT,8EAA8E;YAChF,KAAK,EACH,wIAAwI;YAC1I,SAAS,EAAE,+CAA+C;YAC1D,iBAAiB,EACf,oGAAoG;SACvG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,6BAA6B;YAC1C,IAAI,EAAE,oCAAoC;YAC1C,QAAQ,EACN,6EAA6E;YAC/E,WAAW,EACT,4FAA4F;YAC9F,KAAK,EACH,mGAAmG;YACrG,SAAS,EAAE,0DAA0D;YACrE,iBAAiB,EACf,4HAA4H;SAC/H;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,oBAAoB;YACjC,IAAI,EAAE,mBAAmB;YACzB,QAAQ,EAAE,iCAAiC;YAC3C,WAAW,EAAE,uDAAuD;YACpE,KAAK,EACH,kFAAkF;YACpF,SAAS,EAAE,wBAAwB;YACnC,iBAAiB,EACf,6FAA6F;SAChG;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,8BAA8B;YACpC,QAAQ,EAAE,6CAA6C;YACvD,WAAW,EAAE,qEAAqE;YAClF,KAAK,EAAE,+CAA+C;YACtD,SAAS,EAAE,uBAAuB;YAClC,iBAAiB,EAAE,qDAAqD;SACzE;QACD,yEAAyE;QACzE;YACE,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,0CAA0C;YAChD,QAAQ,EAAE,oDAAoD;YAC9D,WAAW,EACT,sFAAsF;YACxF,KAAK,EACH,8IAA8I;YAChJ,SAAS,EAAE,wCAAwC;YACnD,iBAAiB,EACf,+GAA+G;SAClH;KACF;CACF,CAAC;AAEF,uBAAuB;AACvB,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,OAAO,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * exit 处理器的可测逻辑:config 守卫 + 跳过自身 + 绝不抛(spec §4 约束 1/3/4)。
3
+ * `process.on('exit')` 注册体只调本函数。
4
+ */
5
+ export declare function maybeRecordCliExit(projectRoot: string, argv: string[], exitCode: number): void;
6
+ //# sourceMappingURL=exit-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-handler.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/exit-handler.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAc9F"}
@@ -0,0 +1,27 @@
1
+ // src/core/monitor/exit-handler.ts — exit 处理器逻辑(spec §4)
2
+ import { isMonitorEnabled } from './config.js';
3
+ import { recordCliExit } from './trace-store.js';
4
+ /**
5
+ * exit 处理器的可测逻辑:config 守卫 + 跳过自身 + 绝不抛(spec §4 约束 1/3/4)。
6
+ * `process.on('exit')` 注册体只调本函数。
7
+ */
8
+ export function maybeRecordCliExit(projectRoot, argv, exitCode) {
9
+ try {
10
+ if (!Array.isArray(argv))
11
+ return;
12
+ if (argv[0] === 'monitor')
13
+ return; // 跳过自身,避免噪声/递归
14
+ if (!isMonitorEnabled(projectRoot))
15
+ return; // config 守卫:关闭即返回
16
+ recordCliExit(projectRoot, {
17
+ ts: new Date().toISOString(),
18
+ command: argv,
19
+ cwd: projectRoot,
20
+ exit_code: exitCode,
21
+ });
22
+ }
23
+ catch {
24
+ // 绝不抛 —— 'exit' 处理器抛异常会污染进程退出
25
+ }
26
+ }
27
+ //# sourceMappingURL=exit-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-handler.js","sourceRoot":"","sources":["../../../src/core/monitor/exit-handler.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB,EAAE,IAAc,EAAE,QAAgB;IACtF,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO;QACjC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,eAAe;QAClD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC;YAAE,OAAO,CAAC,kBAAkB;QAC9D,aAAa,CAAC,WAAW,EAAE;YACzB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,WAAW;YAChB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type TraceEvent, type HealthVerdict } from './types.js';
2
+ /**
3
+ * 计算健康裁决。只做 spec §10.1 列的「可机检」项:
4
+ * - regression:hardening_step.executed === false(加固步骤未执行)。
5
+ * - anomaly:某阶段有 CLI 事件但完全无 AI stage_enter(AI trace 缺该阶段)。
6
+ * 语义细微的 regression_signal 不在此机评,交报告并排呈现给人判。
7
+ */
8
+ export declare function computeVerdict(events: TraceEvent[]): HealthVerdict;
9
+ //# sourceMappingURL=health-verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-verdict.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/health-verdict.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EAGnB,MAAM,YAAY,CAAC;AAKpB;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CA2ClE"}
@@ -0,0 +1,55 @@
1
+ // src/core/monitor/health-verdict.ts — 健康裁决(spec §10.1:只做可机检的判定)
2
+ import { COMPARABLE_STAGES, } from './types.js';
3
+ /** 可对比阶段集合 —— check 2 只对它们判 AI trace 缺失(forge 专属阶段 CLI-only,不判) */
4
+ const COMPARABLE_STAGE_SET = new Set(COMPARABLE_STAGES);
5
+ /**
6
+ * 计算健康裁决。只做 spec §10.1 列的「可机检」项:
7
+ * - regression:hardening_step.executed === false(加固步骤未执行)。
8
+ * - anomaly:某阶段有 CLI 事件但完全无 AI stage_enter(AI trace 缺该阶段)。
9
+ * 语义细微的 regression_signal 不在此机评,交报告并排呈现给人判。
10
+ */
11
+ export function computeVerdict(events) {
12
+ const items = [];
13
+ // 检查 1:加固步骤未执行 → regression
14
+ for (const e of events) {
15
+ if (e.layer === 'ai' && e.event === 'hardening_step' && e.data.executed === false) {
16
+ items.push({
17
+ kind: 'regression',
18
+ stage: e.stage,
19
+ detail: `加固步骤未执行:${String(e.data.step ?? '(未命名)')}`,
20
+ evidence: `trace ${e.ts} hardening_step executed=false`,
21
+ });
22
+ }
23
+ }
24
+ // 检查 2:某阶段有 CLI 事件但无 AI stage_enter → anomaly
25
+ const stagesWithCli = new Set();
26
+ const stagesWithAiEnter = new Set();
27
+ for (const e of events) {
28
+ if (e.layer === 'cli')
29
+ stagesWithCli.add(e.stage);
30
+ if (e.layer === 'ai' && e.event === 'stage_enter')
31
+ stagesWithAiEnter.add(e.stage);
32
+ }
33
+ for (const stage of stagesWithCli) {
34
+ // 只对可对比阶段判 AI trace 缺失;forge 专属阶段(ack-confirm/upgrade/codex-adversarial)
35
+ // 按 spec §1.3 本就 CLI-only、注入内容不要求 AI record,跳过避免假阳性(M-3)
36
+ if (!COMPARABLE_STAGE_SET.has(stage))
37
+ continue;
38
+ if (!stagesWithAiEnter.has(stage)) {
39
+ items.push({
40
+ kind: 'anomaly',
41
+ stage,
42
+ detail: `${stage} 阶段有 CLI 事件但缺 AI stage_enter record`,
43
+ evidence: `${stage} AI trace 不完整(可能漏记或中途启用)`,
44
+ });
45
+ }
46
+ }
47
+ // 计算最终 level:如果有 regression 则为 regression,否则有 items 就 anomaly,都没有就 ok
48
+ const level = items.some((i) => i.kind === 'regression')
49
+ ? 'regression'
50
+ : items.length > 0
51
+ ? 'anomaly'
52
+ : 'ok';
53
+ return { level, items };
54
+ }
55
+ //# sourceMappingURL=health-verdict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-verdict.js","sourceRoot":"","sources":["../../../src/core/monitor/health-verdict.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EACL,iBAAiB,GAKlB,MAAM,YAAY,CAAC;AAEpB,mEAAmE;AACnE,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAe,iBAAiB,CAAC,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAEhC,4BAA4B;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YAClF,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,WAAW,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE;gBACnD,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,gCAAgC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgB,CAAC;IAC9C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAgB,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK;YAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,aAAa;YAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,yEAAyE;QACzE,yDAAyD;QACzD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,SAAS;gBACf,KAAK;gBACL,MAAM,EAAE,GAAG,KAAK,qCAAqC;gBACrD,QAAQ,EAAE,GAAG,KAAK,0BAA0B;aAC7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,KAAK,GAA2B,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;QAC9E,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAChB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,CAAC;IACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { TraceEvent, CliExitRecord } from './types.js';
2
+ /** 渲染某 change 的完整监控报告 markdown */
3
+ export declare function renderReport(changeId: string, events: TraceEvent[], cliExits: CliExitRecord[], now?: string): string;
4
+ //# sourceMappingURL=report-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-renderer.d.ts","sourceRoot":"","sources":["../../../src/core/monitor/report-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAS5D,kCAAkC;AAClC,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,EAAE,aAAa,EAAE,EACzB,GAAG,GAAE,MAAiC,GACrC,MAAM,CAmFR"}
@@ -0,0 +1,82 @@
1
+ import { computeVerdict } from './health-verdict.js';
2
+ import { DIVERGENCE_MAP, findScenario } from './divergence-map.js';
3
+ /** 净化 markdown 表格单元格:转义管道符、压平换行(防 AI 自由文本破坏表格) */
4
+ function sanitizeCell(s) {
5
+ return s.replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
6
+ }
7
+ /** 渲染某 change 的完整监控报告 markdown */
8
+ export function renderReport(changeId, events, cliExits, now = new Date().toISOString()) {
9
+ const verdict = computeVerdict(events);
10
+ const lines = [];
11
+ lines.push(`# Forge 工作流监控报告 — ${changeId}`, '');
12
+ lines.push(`生成时间:${now}`);
13
+ lines.push(`差异映射表同步于:${DIVERGENCE_MAP.meta.synced_at}`, '');
14
+ // ── 1. 健康裁决 ──
15
+ lines.push('## 1. 健康裁决', '');
16
+ const levelText = { ok: '✓ OK', regression: '✗ 检出回归', anomaly: '⚠ 检出异常' }[verdict.level];
17
+ lines.push(`整体:${levelText}`, '');
18
+ if (verdict.items.length === 0) {
19
+ lines.push('无命中项。', '');
20
+ }
21
+ else {
22
+ for (const it of verdict.items) {
23
+ const tag = it.kind === 'regression' ? '回归' : '异常';
24
+ lines.push(`- [${tag}] (${it.stage}) ${it.detail}`);
25
+ lines.push(` 证据:${it.evidence}`);
26
+ }
27
+ lines.push('');
28
+ }
29
+ // ── 2. 阶段时间线 ──
30
+ lines.push('## 2. 阶段时间线', '');
31
+ // §2.4:分维度覆盖标注 —— 中途启用监控时各维度覆盖范围不同,如实呈现、不假装完整
32
+ const markerStages = [...new Set(events.filter((e) => e.layer === 'cli').map((e) => e.stage))];
33
+ const aiStages = [...new Set(events.filter((e) => e.layer === 'ai').map((e) => e.stage))];
34
+ const exitCmds = [...new Set(cliExits.map((c) => c.command[0] ?? '?'))];
35
+ if (events.length > 0 || cliExits.length > 0) {
36
+ lines.push(`维度覆盖 —— CLI 产物观察: ${markerStages.join(', ') || '(无)'};` +
37
+ ` AI trace: ${aiStages.join(', ') || '(无)'};` +
38
+ ` CLI exit: ${exitCmds.join(', ') || '(无)'}`, '');
39
+ }
40
+ if (events.length === 0) {
41
+ lines.push('(无 trace 事件)', '');
42
+ }
43
+ else {
44
+ lines.push('| 时间 | 阶段 | 层 | 事件 |', '| --- | --- | --- | --- |');
45
+ for (const e of events) {
46
+ lines.push(`| ${e.ts} | ${e.stage} | ${e.layer} | ${sanitizeCell(e.event)} |`);
47
+ }
48
+ lines.push('');
49
+ }
50
+ if (cliExits.length > 0) {
51
+ lines.push('CLI exit 记录:');
52
+ for (const c of cliExits) {
53
+ lines.push(`- ${c.ts} \`forge ${c.command.join(' ')}\` → exit ${c.exit_code}`);
54
+ }
55
+ lines.push('');
56
+ }
57
+ // ── 3. 三方对比表 ──
58
+ lines.push('## 3. 三方对比表(Forge vs OpenSpec vs Superpowers)', '');
59
+ lines.push('| scenario | forge 实际走法 | openspec | superpowers | 加固守住? |', '| --- | --- | --- | --- | --- |');
60
+ const decisions = events.filter((e) => e.layer === 'ai' && e.event === 'decision');
61
+ if (decisions.length === 0) {
62
+ lines.push('| (无 decision record) | — | — | — | — |');
63
+ }
64
+ else {
65
+ for (const d of decisions) {
66
+ const sidRaw = String(d.data.scenario_id ?? '');
67
+ const chosen = sanitizeCell(String(d.data.chosen ?? '(未记录)'));
68
+ const sc = findScenario(sidRaw);
69
+ lines.push(`| ${sanitizeCell(sidRaw)} | ${chosen} | ${sanitizeCell(sc?.openspec ?? '?')} | ${sanitizeCell(sc?.superpowers ?? '?')} | ? |`);
70
+ }
71
+ }
72
+ lines.push('');
73
+ lines.push('> `加固守住?` 列填 `?` 的需人工对照 `regression_signal` 判定(spec §10.1)。', '');
74
+ // ── 4. 附录 ──
75
+ lines.push('## 4. 附录:原始 trace', '');
76
+ lines.push('```jsonl');
77
+ for (const e of events)
78
+ lines.push(JSON.stringify(e));
79
+ lines.push('```', '');
80
+ return lines.join('\n');
81
+ }
82
+ //# sourceMappingURL=report-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-renderer.js","sourceRoot":"","sources":["../../../src/core/monitor/report-renderer.ts"],"names":[],"mappings":"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"}