@fitlab-ai/agent-infra 0.9.13 → 0.9.15

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 (428) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/cli.ts +26 -9
  4. package/bin/internal-cli.sh +45 -0
  5. package/dist/bin/cli.js +173 -157
  6. package/dist/bin/internal-cli.js +126 -42
  7. package/dist/lib/agent-client.js +5 -0
  8. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  9. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
  10. package/dist/lib/defaults.json +103 -103
  11. package/dist/lib/fs/durable-write.js +37 -0
  12. package/dist/lib/fs/file-lock.js +111 -0
  13. package/dist/lib/host-control/audit.js +19 -0
  14. package/dist/lib/host-control/client.js +142 -0
  15. package/dist/lib/host-control/command.js +49 -0
  16. package/dist/lib/host-control/path.js +160 -0
  17. package/dist/lib/host-control/secure-fs.js +140 -0
  18. package/dist/lib/host-control/server.js +159 -0
  19. package/dist/lib/host-control/service.js +112 -0
  20. package/dist/lib/init.js +11 -2
  21. package/dist/lib/internal/agent-client.js +5 -2
  22. package/dist/lib/internal/cli-route-inventory.js +154 -0
  23. package/dist/lib/internal/codex-lifecycle.js +15 -12
  24. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  25. package/dist/lib/internal/demo-promotion.js +322 -0
  26. package/dist/lib/internal/demo-transcript.js +454 -0
  27. package/dist/lib/internal/git-workflow.js +10 -6
  28. package/dist/lib/internal/host-control.js +28 -0
  29. package/dist/lib/internal/manual-validation.js +322 -0
  30. package/dist/lib/internal/platform-checks.js +16 -4
  31. package/dist/lib/internal/platform-comment.js +16 -4
  32. package/dist/lib/internal/platform-context.js +4 -1
  33. package/dist/lib/internal/platform-issue.js +12 -4
  34. package/dist/lib/internal/platform-metadata.js +88 -0
  35. package/dist/lib/internal/platform-pr-review.js +16 -3
  36. package/dist/lib/internal/platform-pr.js +42 -14
  37. package/dist/lib/internal/platform-release-notes.js +6 -3
  38. package/dist/lib/internal/platform-security.js +93 -0
  39. package/dist/lib/internal/pr-review-grade.js +14 -3
  40. package/dist/lib/internal/release-workflow.js +82 -89
  41. package/dist/lib/internal/sandbox-control.js +171 -7
  42. package/dist/lib/internal/task-activity.js +13 -4
  43. package/dist/lib/internal/task-artifact.js +19 -107
  44. package/dist/lib/internal/task-context.js +4 -1
  45. package/dist/lib/internal/task-create.js +48 -14
  46. package/dist/lib/internal/task-delivery.js +4 -1
  47. package/dist/lib/internal/task-event.js +38 -35
  48. package/dist/lib/internal/task-finalization.js +4 -1
  49. package/dist/lib/internal/task-invalidation.js +4 -1
  50. package/dist/lib/internal/task-ledger.js +12 -1
  51. package/dist/lib/internal/task-lifecycle.js +4 -1
  52. package/dist/lib/internal/task-operation-registry.js +519 -0
  53. package/dist/lib/internal/task-orchestration.js +12 -0
  54. package/dist/lib/internal/task-override.js +10 -3
  55. package/dist/lib/internal/task-qualification.js +90 -0
  56. package/dist/lib/internal/task-review.js +10 -52
  57. package/dist/lib/internal/task-short-id.js +11 -1
  58. package/dist/lib/internal/task-snapshot.js +4 -1
  59. package/dist/lib/internal/task-validate.js +37 -12
  60. package/dist/lib/internal/task-verify.js +5 -1
  61. package/dist/lib/internal/task-warning.js +8 -1
  62. package/dist/lib/owned-path.js +33 -0
  63. package/dist/lib/platform/check-status.js +11 -0
  64. package/dist/lib/platform/comment-safety.js +229 -0
  65. package/dist/lib/platform/completion-backfill.js +1 -1
  66. package/dist/lib/platform/github-data.js +241 -0
  67. package/dist/lib/platform/github-provider.js +248 -26
  68. package/dist/lib/platform/issue-comments.js +146 -34
  69. package/dist/lib/platform/issues.js +1 -179
  70. package/dist/lib/platform/pr-change-report.js +6 -12
  71. package/dist/lib/platform/pr-checks.js +12 -65
  72. package/dist/lib/platform/pr-summary.js +83 -10
  73. package/dist/lib/platform/provider-contract.d.ts +67 -1
  74. package/dist/lib/platform/provider-contract.js +6 -2
  75. package/dist/lib/platform/provider-validation.js +76 -3
  76. package/dist/lib/platform/pull-requests.js +117 -275
  77. package/dist/lib/platform/repository-metadata.js +377 -0
  78. package/dist/lib/platform/security-alerts.js +155 -0
  79. package/dist/lib/platform/snapshots.js +2 -0
  80. package/dist/lib/platform/verification-sync.js +154 -162
  81. package/dist/lib/process-data/index.js +7 -0
  82. package/dist/lib/release/workflow.js +1 -1
  83. package/dist/lib/run/index.js +5 -0
  84. package/dist/lib/sandbox/commands/control-status.js +22 -0
  85. package/dist/lib/sandbox/commands/create.js +39 -8
  86. package/dist/lib/sandbox/commands/ls.js +5 -0
  87. package/dist/lib/sandbox/commands/rm.js +3 -807
  88. package/dist/lib/sandbox/commands/show.js +16 -0
  89. package/dist/lib/sandbox/control/audit.js +203 -0
  90. package/dist/lib/sandbox/control/client.js +125 -12
  91. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  92. package/dist/lib/sandbox/control/container-identity.js +28 -31
  93. package/dist/lib/sandbox/control/executor.js +233 -34
  94. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  95. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  96. package/dist/lib/sandbox/control/lifecycle.js +656 -128
  97. package/dist/lib/sandbox/control/native-file-lock.js +85 -0
  98. package/dist/lib/sandbox/control/protocol.js +55 -4
  99. package/dist/lib/sandbox/control/server.js +720 -79
  100. package/dist/lib/sandbox/control/state.js +63 -3
  101. package/dist/lib/sandbox/control/task-view.js +183 -0
  102. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  103. package/dist/lib/sandbox/control/workflow-executor.js +99 -0
  104. package/dist/lib/sandbox/engines/authority.js +289 -0
  105. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  106. package/dist/lib/sandbox/index.js +7 -2
  107. package/dist/lib/sandbox/recovery.js +49 -5
  108. package/dist/lib/sandbox/removal.js +1717 -0
  109. package/dist/lib/sandbox/task-cleanup.js +217 -0
  110. package/dist/lib/sandbox/workspace-view.js +15 -15
  111. package/dist/lib/sandbox/worktree-safety.js +4 -1
  112. package/dist/lib/server/index.js +8 -0
  113. package/dist/lib/task/activity-intent.js +2 -1
  114. package/dist/lib/task/activity-log.js +30 -24
  115. package/dist/lib/task/artifact-command.js +101 -0
  116. package/dist/lib/task/artifact-lifecycle.js +71 -40
  117. package/dist/lib/task/artifact-name.js +36 -0
  118. package/dist/lib/task/artifact-operations.js +474 -0
  119. package/dist/lib/task/artifact-receipts.js +3 -15
  120. package/dist/lib/task/artifact-repair-intent.js +130 -0
  121. package/dist/lib/task/artifact-schema.js +127 -0
  122. package/dist/lib/task/capabilities.js +83 -19
  123. package/dist/lib/task/codex-orchestration.js +71 -25
  124. package/dist/lib/task/commit-identity.js +28 -0
  125. package/dist/lib/task/commit-operation.js +2 -16
  126. package/dist/lib/task/control-authority.js +375 -5
  127. package/dist/lib/task/control-recovery.js +128 -0
  128. package/dist/lib/task/create-service.js +103 -4
  129. package/dist/lib/task/create.js +80 -2
  130. package/dist/lib/task/decision-details.js +2 -46
  131. package/dist/lib/task/events.js +306 -76
  132. package/dist/lib/task/finalization-state.js +9 -0
  133. package/dist/lib/task/human-override.js +3 -6
  134. package/dist/lib/task/implementation-inputs.js +3 -3
  135. package/dist/lib/task/index.js +11 -3
  136. package/dist/lib/task/intermediate-cleanup.js +383 -0
  137. package/dist/lib/task/invalidation.js +18 -65
  138. package/dist/lib/task/ledger-intents.js +7 -22
  139. package/dist/lib/task/ledger.js +1 -3
  140. package/dist/lib/task/lifecycle.js +19 -1
  141. package/dist/lib/task/local-artifact-finalization.js +190 -290
  142. package/dist/lib/task/manual-validation-completion.js +26 -0
  143. package/dist/lib/task/manual-validation-evidence.js +130 -0
  144. package/dist/lib/task/manual-validation-receipt.js +101 -0
  145. package/dist/lib/task/manual-validation-shared.js +40 -0
  146. package/dist/lib/task/manual-validation-transaction.js +243 -0
  147. package/dist/lib/task/markdown.js +47 -0
  148. package/dist/lib/task/orchestration.js +206 -69
  149. package/dist/lib/task/qualification-audit.js +476 -0
  150. package/dist/lib/task/qualification-confirmation.js +109 -0
  151. package/dist/lib/task/qualification-intents.js +148 -0
  152. package/dist/lib/task/review-artifacts.js +23 -40
  153. package/dist/lib/task/review-command.js +25 -0
  154. package/dist/lib/task/review-finalization.js +146 -97
  155. package/dist/lib/task/review-fingerprint.js +2 -2
  156. package/dist/lib/task/sections.js +34 -54
  157. package/dist/lib/task/verification-config.js +11 -0
  158. package/dist/lib/task/verification-engine.js +170 -327
  159. package/dist/lib/task/verification.js +1 -1
  160. package/dist/lib/task/workflow-command.js +17 -0
  161. package/dist/lib/task/workflow-warning-intents.js +0 -16
  162. package/dist/lib/task/workflow-warnings.js +28 -2
  163. package/dist/lib/update.js +2 -0
  164. package/dist/lifecycle-build-manifest.json +3 -3
  165. package/lib/agent-client.ts +9 -0
  166. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  167. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
  168. package/lib/fs/durable-write.ts +29 -0
  169. package/lib/fs/file-lock.ts +113 -0
  170. package/lib/host-control/audit.ts +22 -0
  171. package/lib/host-control/client.ts +172 -0
  172. package/lib/host-control/command.ts +60 -0
  173. package/lib/host-control/path.ts +167 -0
  174. package/lib/host-control/secure-fs.ts +135 -0
  175. package/lib/host-control/server.ts +180 -0
  176. package/lib/host-control/service.ts +133 -0
  177. package/lib/init.ts +15 -2
  178. package/lib/internal/agent-client.ts +4 -2
  179. package/lib/internal/cli-route-inventory.ts +142 -0
  180. package/lib/internal/codex-lifecycle.ts +14 -12
  181. package/lib/internal/codex-sandbox-controller.ts +7 -2
  182. package/lib/internal/demo-promotion.ts +354 -0
  183. package/lib/internal/demo-transcript.ts +419 -0
  184. package/lib/internal/git-workflow.ts +9 -6
  185. package/lib/internal/host-control.ts +28 -0
  186. package/lib/internal/manual-validation.ts +306 -0
  187. package/lib/internal/platform-checks.ts +12 -4
  188. package/lib/internal/platform-comment.ts +12 -4
  189. package/lib/internal/platform-context.ts +3 -1
  190. package/lib/internal/platform-issue.ts +11 -4
  191. package/lib/internal/platform-metadata.ts +70 -0
  192. package/lib/internal/platform-pr-review.ts +14 -3
  193. package/lib/internal/platform-pr.ts +38 -14
  194. package/lib/internal/platform-release-notes.ts +5 -3
  195. package/lib/internal/platform-security.ts +83 -0
  196. package/lib/internal/pr-review-grade.ts +10 -3
  197. package/lib/internal/release-workflow.ts +91 -87
  198. package/lib/internal/sandbox-control.ts +181 -6
  199. package/lib/internal/task-activity.ts +12 -4
  200. package/lib/internal/task-artifact.ts +15 -79
  201. package/lib/internal/task-context.ts +3 -1
  202. package/lib/internal/task-create.ts +76 -15
  203. package/lib/internal/task-delivery.ts +3 -1
  204. package/lib/internal/task-event.ts +21 -10
  205. package/lib/internal/task-finalization.ts +3 -1
  206. package/lib/internal/task-invalidation.ts +3 -1
  207. package/lib/internal/task-ledger.ts +11 -1
  208. package/lib/internal/task-lifecycle.ts +3 -1
  209. package/lib/internal/task-operation-registry.ts +590 -0
  210. package/lib/internal/task-orchestration.ts +12 -0
  211. package/lib/internal/task-override.ts +9 -3
  212. package/lib/internal/task-qualification.ts +61 -0
  213. package/lib/internal/task-review.ts +7 -50
  214. package/lib/internal/task-short-id.ts +10 -1
  215. package/lib/internal/task-snapshot.ts +3 -1
  216. package/lib/internal/task-validate.ts +32 -12
  217. package/lib/internal/task-verify.ts +4 -1
  218. package/lib/internal/task-warning.ts +7 -1
  219. package/lib/owned-path.ts +26 -0
  220. package/lib/platform/check-status.ts +9 -0
  221. package/lib/platform/comment-safety.ts +255 -0
  222. package/lib/platform/completion-backfill.ts +1 -1
  223. package/lib/platform/github-data.ts +322 -0
  224. package/lib/platform/github-provider.ts +244 -27
  225. package/lib/platform/issue-comments.ts +159 -35
  226. package/lib/platform/issues.ts +4 -245
  227. package/lib/platform/pr-change-report.ts +6 -12
  228. package/lib/platform/pr-checks.ts +13 -77
  229. package/lib/platform/pr-summary.ts +88 -11
  230. package/lib/platform/provider-contract.ts +78 -3
  231. package/lib/platform/provider-validation.ts +85 -3
  232. package/lib/platform/pull-requests.ts +129 -348
  233. package/lib/platform/repository-metadata.ts +453 -0
  234. package/lib/platform/security-alerts.ts +191 -0
  235. package/lib/platform/snapshots.ts +53 -0
  236. package/lib/platform/verification-sync.ts +171 -177
  237. package/lib/process-data/index.ts +7 -0
  238. package/lib/release/workflow.ts +3 -3
  239. package/lib/run/index.ts +5 -0
  240. package/lib/sandbox/commands/control-status.ts +26 -0
  241. package/lib/sandbox/commands/create.ts +53 -12
  242. package/lib/sandbox/commands/ls.ts +7 -0
  243. package/lib/sandbox/commands/rm.ts +3 -996
  244. package/lib/sandbox/commands/show.ts +16 -0
  245. package/lib/sandbox/control/audit.ts +253 -0
  246. package/lib/sandbox/control/client.ts +150 -13
  247. package/lib/sandbox/control/completed-reentry.ts +98 -0
  248. package/lib/sandbox/control/container-identity.ts +27 -43
  249. package/lib/sandbox/control/executor.ts +262 -37
  250. package/lib/sandbox/control/finalization-response.ts +29 -0
  251. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  252. package/lib/sandbox/control/lifecycle.ts +672 -18
  253. package/lib/sandbox/control/native-file-lock.ts +108 -0
  254. package/lib/sandbox/control/protocol.ts +80 -8
  255. package/lib/sandbox/control/server.ts +779 -82
  256. package/lib/sandbox/control/state.ts +84 -3
  257. package/lib/sandbox/control/task-view.ts +240 -0
  258. package/lib/sandbox/control/task-workflow.ts +95 -0
  259. package/lib/sandbox/control/workflow-executor.ts +102 -0
  260. package/lib/sandbox/engines/authority.ts +365 -0
  261. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  262. package/lib/sandbox/index.ts +9 -2
  263. package/lib/sandbox/recovery.ts +49 -6
  264. package/lib/sandbox/removal.ts +2144 -0
  265. package/lib/sandbox/task-cleanup.ts +209 -0
  266. package/lib/sandbox/workspace-view.ts +26 -18
  267. package/lib/sandbox/worktree-safety.ts +4 -1
  268. package/lib/server/index.ts +10 -0
  269. package/lib/task/activity-intent.ts +2 -2
  270. package/lib/task/activity-log.ts +27 -19
  271. package/lib/task/artifact-command.ts +104 -0
  272. package/lib/task/artifact-lifecycle.ts +66 -39
  273. package/lib/task/artifact-name.ts +55 -0
  274. package/lib/task/artifact-operations.ts +580 -0
  275. package/lib/task/artifact-receipts.ts +3 -14
  276. package/lib/task/artifact-repair-intent.ts +152 -0
  277. package/lib/task/artifact-schema.ts +163 -0
  278. package/lib/task/capabilities.ts +82 -22
  279. package/lib/task/codex-orchestration.ts +85 -24
  280. package/lib/task/commit-identity.ts +31 -0
  281. package/lib/task/commit-operation.ts +2 -16
  282. package/lib/task/control-authority.ts +513 -6
  283. package/lib/task/control-recovery.ts +174 -0
  284. package/lib/task/create-service.ts +131 -6
  285. package/lib/task/create.ts +83 -1
  286. package/lib/task/decision-details.ts +3 -71
  287. package/lib/task/events.ts +292 -75
  288. package/lib/task/finalization-state.ts +11 -0
  289. package/lib/task/human-override.ts +3 -8
  290. package/lib/task/implementation-inputs.ts +3 -3
  291. package/lib/task/index.ts +16 -3
  292. package/lib/task/intermediate-cleanup.ts +455 -0
  293. package/lib/task/invalidation.ts +18 -62
  294. package/lib/task/ledger-intents.ts +7 -24
  295. package/lib/task/ledger.ts +1 -3
  296. package/lib/task/lifecycle.ts +17 -1
  297. package/lib/task/local-artifact-finalization.ts +223 -388
  298. package/lib/task/manual-validation-completion.ts +40 -0
  299. package/lib/task/manual-validation-evidence.ts +209 -0
  300. package/lib/task/manual-validation-receipt.ts +152 -0
  301. package/lib/task/manual-validation-shared.ts +50 -0
  302. package/lib/task/manual-validation-transaction.ts +304 -0
  303. package/lib/task/markdown.ts +70 -0
  304. package/lib/task/orchestration.ts +191 -68
  305. package/lib/task/qualification-audit.ts +588 -0
  306. package/lib/task/qualification-confirmation.ts +117 -0
  307. package/lib/task/qualification-intents.ts +150 -0
  308. package/lib/task/review-artifacts.ts +21 -41
  309. package/lib/task/review-command.ts +23 -0
  310. package/lib/task/review-finalization.ts +154 -153
  311. package/lib/task/review-fingerprint.ts +2 -2
  312. package/lib/task/sections.ts +33 -52
  313. package/lib/task/verification-config.ts +12 -0
  314. package/lib/task/verification-engine.ts +165 -370
  315. package/lib/task/verification-types.ts +17 -0
  316. package/lib/task/verification.ts +1 -1
  317. package/lib/task/workflow-command.ts +18 -0
  318. package/lib/task/workflow-warning-intents.ts +0 -13
  319. package/lib/task/workflow-warnings.ts +21 -2
  320. package/lib/update.ts +6 -0
  321. package/package.json +7 -2
  322. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  323. package/templates/.agents/rules/README.en.md +2 -0
  324. package/templates/.agents/rules/README.zh-CN.md +2 -0
  325. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  326. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  327. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  328. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  329. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  330. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  331. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  332. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  333. package/templates/.agents/rules/security-alerts.en.md +8 -8
  334. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  335. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  336. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  337. package/templates/.agents/scripts/package.json +3 -0
  338. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  339. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  340. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  341. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  342. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  343. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  344. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  345. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  346. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  347. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  348. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  349. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  350. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  351. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  352. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  353. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  354. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  355. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  356. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  357. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  358. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +37 -21
  359. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +37 -21
  360. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  361. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  362. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +4 -0
  363. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +4 -0
  364. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  365. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  366. package/templates/.agents/skills/complete-task/SKILL.en.md +10 -23
  367. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +10 -23
  368. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  369. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  370. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  371. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  372. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  373. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  374. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  375. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  376. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  377. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  378. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  379. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  380. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  381. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  382. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  383. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  384. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  385. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  386. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  387. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  388. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  389. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  390. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  391. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  392. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  393. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  394. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  395. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  396. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  397. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  398. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  399. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  400. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  401. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  402. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  403. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  404. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  405. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  406. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +25 -4
  407. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +25 -4
  408. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  409. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  410. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +5 -1
  411. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +5 -1
  412. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  413. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  414. package/templates/.agents/skills/test/SKILL.en.md +29 -7
  415. package/templates/.agents/skills/test/SKILL.zh-CN.md +29 -7
  416. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  417. package/templates/.agents/templates/task.en.md +6 -0
  418. package/templates/.agents/templates/task.zh-CN.md +6 -0
  419. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  420. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  421. package/dist/lib/platform/adapters.js +0 -56
  422. package/lib/platform/adapters.ts +0 -197
  423. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  424. package/templates/.agents/scripts/security-alerts.sh +0 -31
  425. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  426. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  427. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  428. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -0,0 +1,130 @@
1
+ import fs from 'node:fs';
2
+ import { createHash } from 'node:crypto';
3
+ import { MANUAL_VALIDATION_SHA40 as SHA40, MANUAL_VALIDATION_TASK_ID as TASK_ID, exactKeys, isRecord, validTimestamp } from './manual-validation-shared.js';
4
+ const MANUAL_VALIDATION_EVIDENCE_SCHEMA = 'agent-infra/branch-only-validation-evidence';
5
+ const MANUAL_VALIDATION_EVIDENCE_VERSION = 1;
6
+ function invalid(message) {
7
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_EVIDENCE_INVALID', message } };
8
+ }
9
+ function validateShape(value) {
10
+ if (!isRecord(value))
11
+ return invalid('evidence must be a JSON object');
12
+ const topError = exactKeys(value, ['schema', 'version', 'mode', 'taskId', 'branch', 'commit', 'recoverable', 'source', 'result'], 'evidence');
13
+ if (topError)
14
+ return invalid(topError);
15
+ if (value.schema !== MANUAL_VALIDATION_EVIDENCE_SCHEMA || value.version !== MANUAL_VALIDATION_EVIDENCE_VERSION) {
16
+ return invalid('evidence schema or version is unsupported');
17
+ }
18
+ if (value.mode !== 'task-bound' && value.mode !== 'branch-only')
19
+ return invalid('mode must be task-bound or branch-only');
20
+ if (value.taskId !== null && (typeof value.taskId !== 'string' || !TASK_ID.test(value.taskId)))
21
+ return invalid('taskId must be a TASK identifier or null');
22
+ if (typeof value.branch !== 'string' || !value.branch.trim() || /[\r\n]/u.test(value.branch))
23
+ return invalid('branch must be a non-empty single line');
24
+ if (typeof value.commit !== 'string' || !SHA40.test(value.commit))
25
+ return invalid('commit must be a 40-character lowercase hexadecimal SHA');
26
+ if (typeof value.recoverable !== 'boolean')
27
+ return invalid('recoverable must be boolean');
28
+ if (value.source !== 'run-manual-validation')
29
+ return invalid('source is unsupported');
30
+ if (value.mode === 'branch-only' && (value.taskId !== null || value.recoverable !== false))
31
+ return invalid('branch-only evidence must be non-recoverable and task-free');
32
+ if (value.mode === 'task-bound' && (value.taskId === null || value.recoverable !== true))
33
+ return invalid('task-bound evidence must identify a recoverable task');
34
+ if (!isRecord(value.result))
35
+ return invalid('result must be a JSON object');
36
+ const result = value.result;
37
+ const resultError = exactKeys(result, ['scope', 'command', 'startedAt', 'completedAt', 'exitCode', 'signal', 'cleanup'], 'result');
38
+ if (resultError)
39
+ return invalid(resultError);
40
+ if (result.scope !== 'snapshot' && result.scope !== 'inplace')
41
+ return invalid('result.scope is invalid');
42
+ if (typeof result.command !== 'string' || !result.command || /[\\/\r\n]/u.test(result.command))
43
+ return invalid('result.command must be a basename');
44
+ if (!validTimestamp(result.startedAt) || !validTimestamp(result.completedAt) || Date.parse(result.completedAt) < Date.parse(result.startedAt))
45
+ return invalid('result timestamps are invalid');
46
+ const exitCode = result.exitCode;
47
+ if (!Number.isSafeInteger(exitCode) || exitCode < 0)
48
+ return invalid('result.exitCode must be a non-negative integer');
49
+ if (result.signal !== null && (typeof result.signal !== 'string' || !result.signal || /[\r\n]/u.test(result.signal)))
50
+ return invalid('result.signal must be a string or null');
51
+ if (!['completed', 'pending', 'failed', 'not-created'].includes(result.cleanup))
52
+ return invalid('result.cleanup is invalid');
53
+ return { ok: true, value: value };
54
+ }
55
+ function createManualValidationEvidence(input) {
56
+ const value = {
57
+ schema: MANUAL_VALIDATION_EVIDENCE_SCHEMA,
58
+ version: MANUAL_VALIDATION_EVIDENCE_VERSION,
59
+ mode: input.mode,
60
+ taskId: input.taskId,
61
+ branch: input.branch,
62
+ commit: input.commit,
63
+ recoverable: input.recoverable,
64
+ source: 'run-manual-validation',
65
+ result: {
66
+ scope: input.scope,
67
+ command: input.command,
68
+ startedAt: input.startedAt,
69
+ completedAt: input.completedAt,
70
+ exitCode: input.exitCode,
71
+ signal: input.signal,
72
+ cleanup: input.cleanup
73
+ }
74
+ };
75
+ const checked = validateShape(value);
76
+ if (!checked.ok)
77
+ throw new Error(`${checked.error.code}: ${checked.error.message}`);
78
+ return checked.value;
79
+ }
80
+ function manualValidationEvidenceSummary(evidence) {
81
+ return {
82
+ version: 1,
83
+ taskId: evidence.taskId,
84
+ branch: evidence.branch,
85
+ scope: evidence.result.scope,
86
+ commit: evidence.commit,
87
+ command: evidence.result.command,
88
+ startedAt: evidence.result.startedAt,
89
+ completedAt: evidence.result.completedAt,
90
+ exitCode: evidence.result.exitCode,
91
+ signal: evidence.result.signal,
92
+ cleanup: evidence.result.cleanup
93
+ };
94
+ }
95
+ function validateManualValidationEvidence(value, expected) {
96
+ const shape = validateShape(value);
97
+ if (!shape.ok)
98
+ return shape;
99
+ const evidence = shape.value;
100
+ if (evidence.result.exitCode !== 0 || evidence.result.signal !== null || evidence.result.cleanup !== 'completed') {
101
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_EVIDENCE_UNSUCCESSFUL', message: 'validation must exit 0 without a signal and complete cleanup' } };
102
+ }
103
+ if (expected) {
104
+ if (evidence.taskId !== expected.taskId || evidence.branch !== expected.branch) {
105
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_EVIDENCE_IDENTITY_MISMATCH', message: 'evidence task or branch does not match the expected identity' } };
106
+ }
107
+ if (expected.commit !== undefined && evidence.commit !== expected.commit) {
108
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_EVIDENCE_STALE', message: 'evidence commit does not match the current head' } };
109
+ }
110
+ }
111
+ return shape;
112
+ }
113
+ function readManualValidationEvidence(file, expected) {
114
+ let parsed;
115
+ try {
116
+ parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
117
+ }
118
+ catch (error) {
119
+ const code = error.code === 'ENOENT'
120
+ ? 'MANUAL_VALIDATION_EVIDENCE_MISSING'
121
+ : 'MANUAL_VALIDATION_EVIDENCE_INVALID';
122
+ return { ok: false, error: { code, message: error instanceof Error ? error.message : String(error) } };
123
+ }
124
+ return validateManualValidationEvidence(parsed, expected);
125
+ }
126
+ function manualValidationEvidenceDigest(evidence) {
127
+ return createHash('sha256').update(JSON.stringify(evidence), 'utf8').digest('hex');
128
+ }
129
+ export { MANUAL_VALIDATION_EVIDENCE_SCHEMA, MANUAL_VALIDATION_EVIDENCE_VERSION, createManualValidationEvidence, manualValidationEvidenceSummary, manualValidationEvidenceDigest, readManualValidationEvidence, validateManualValidationEvidence };
130
+ //# sourceMappingURL=manual-validation-evidence.js.map
@@ -0,0 +1,101 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { MANUAL_VALIDATION_ARTIFACT as ARTIFACT, MANUAL_VALIDATION_SHA40 as SHA40, MANUAL_VALIDATION_SHA64 as SHA64, MANUAL_VALIDATION_TASK_ID as TASK_ID, exactKeys, isRecord, validTimestamp, writeJsonAtomic } from './manual-validation-shared.js';
5
+ const MANUAL_VALIDATION_RECEIPT_SCHEMA = 'agent-infra/manual-validation-receipt';
6
+ const MANUAL_VALIDATION_RECEIPT_VERSION = 1;
7
+ function invalid(message) {
8
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_RECEIPT_INVALID', message } };
9
+ }
10
+ function canonicalPayload(receipt) {
11
+ return {
12
+ schema: MANUAL_VALIDATION_RECEIPT_SCHEMA,
13
+ version: MANUAL_VALIDATION_RECEIPT_VERSION,
14
+ transactionId: receipt.transactionId,
15
+ taskId: receipt.taskId,
16
+ prNumber: receipt.prNumber,
17
+ prHeadSha: receipt.prHeadSha,
18
+ evidenceDigest: receipt.evidenceDigest,
19
+ artifact: receipt.artifact,
20
+ artifactSha256: receipt.artifactSha256,
21
+ pendingSummaryDigest: receipt.pendingSummaryDigest,
22
+ finalSummaryDigest: receipt.finalSummaryDigest,
23
+ committedAt: receipt.committedAt
24
+ };
25
+ }
26
+ function manualValidationReceiptDigest(receipt) {
27
+ return createHash('sha256').update(JSON.stringify(canonicalPayload(receipt)), 'utf8').digest('hex');
28
+ }
29
+ function manualValidationFinalSummaryDigest(body) {
30
+ const heading = /^###\s+✅\s+(?:Manual Validation Passed|人工验证已通过)\s*$/mu.exec(body);
31
+ const projection = heading ? body.slice(heading.index).replace(/\s+$/u, '') : body;
32
+ const preimage = projection.replace(/receipt=(?:[a-f0-9]{64}|<receipt>)/gu, 'receipt=<receipt>');
33
+ return createHash('sha256').update(preimage, 'utf8').digest('hex');
34
+ }
35
+ function manualValidationFinalSummaryProjectionMatches(body, receipt) {
36
+ const identity = `transaction=${receipt.transactionId}; receipt=${receipt.receiptDigest}; evidence=${receipt.evidenceDigest}; head=${receipt.prHeadSha}`;
37
+ return body.includes(identity) && manualValidationFinalSummaryDigest(body) === receipt.finalSummaryDigest;
38
+ }
39
+ function validateManualValidationReceipt(value, expected) {
40
+ if (!isRecord(value))
41
+ return invalid('receipt must be a JSON object');
42
+ const keys = ['schema', 'version', 'transactionId', 'taskId', 'prNumber', 'prHeadSha', 'evidenceDigest', 'artifact', 'artifactSha256', 'pendingSummaryDigest', 'finalSummaryDigest', 'committedAt', 'receiptDigest'];
43
+ const keyError = exactKeys(value, keys, 'receipt');
44
+ if (keyError)
45
+ return invalid(keyError);
46
+ if (value.schema !== MANUAL_VALIDATION_RECEIPT_SCHEMA || value.version !== MANUAL_VALIDATION_RECEIPT_VERSION)
47
+ return invalid('receipt schema or version is unsupported');
48
+ if (typeof value.transactionId !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u.test(value.transactionId))
49
+ return invalid('transactionId is invalid');
50
+ if (typeof value.taskId !== 'string' || !TASK_ID.test(value.taskId))
51
+ return invalid('taskId is invalid');
52
+ const prNumber = value.prNumber;
53
+ if (!Number.isSafeInteger(prNumber) || prNumber <= 0)
54
+ return invalid('prNumber is invalid');
55
+ for (const [name, pattern] of [['prHeadSha', SHA40], ['evidenceDigest', SHA64], ['artifactSha256', SHA64], ['pendingSummaryDigest', SHA64], ['finalSummaryDigest', SHA64], ['receiptDigest', SHA64]]) {
56
+ if (typeof value[name] !== 'string' || !pattern.test(value[name]))
57
+ return invalid(`${name} is invalid`);
58
+ }
59
+ if (typeof value.artifact !== 'string' || !ARTIFACT.test(value.artifact))
60
+ return invalid('artifact is not a canonical manual-validation artifact');
61
+ if (!validTimestamp(value.committedAt))
62
+ return invalid('committedAt is invalid');
63
+ const receipt = value;
64
+ if (manualValidationReceiptDigest(receipt) !== receipt.receiptDigest)
65
+ return invalid('receiptDigest does not match receipt contents');
66
+ if (expected && Object.entries(expected).some(([key, expectedValue]) => expectedValue !== undefined && receipt[key] !== expectedValue)) {
67
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_RECEIPT_IDENTITY_MISMATCH', message: 'receipt identity does not match the expected transaction' } };
68
+ }
69
+ return { ok: true, value: receipt };
70
+ }
71
+ function createManualValidationReceipt(input) {
72
+ const payload = canonicalPayload(input);
73
+ const receipt = { ...payload, receiptDigest: manualValidationReceiptDigest(input) };
74
+ const checked = validateManualValidationReceipt(receipt);
75
+ if (!checked.ok)
76
+ throw new Error(`${checked.error.code}: ${checked.error.message}`);
77
+ return checked.value;
78
+ }
79
+ function manualValidationReceiptPath(taskDir) {
80
+ return path.join(taskDir, '.manual-validation', 'receipt.json');
81
+ }
82
+ function writeManualValidationReceiptAtomic(taskDir, receipt) {
83
+ const checked = validateManualValidationReceipt(receipt);
84
+ if (!checked.ok)
85
+ throw new Error(`${checked.error.code}: ${checked.error.message}`);
86
+ const target = manualValidationReceiptPath(taskDir);
87
+ return writeJsonAtomic(target, receipt);
88
+ }
89
+ function readManualValidationReceipt(taskDir, expected) {
90
+ const file = manualValidationReceiptPath(taskDir);
91
+ let value;
92
+ try {
93
+ value = JSON.parse(fs.readFileSync(file, 'utf8'));
94
+ }
95
+ catch (error) {
96
+ return { ok: false, error: { code: error.code === 'ENOENT' ? 'MANUAL_VALIDATION_RECEIPT_MISSING' : 'MANUAL_VALIDATION_RECEIPT_INVALID', message: error instanceof Error ? error.message : String(error) } };
97
+ }
98
+ return validateManualValidationReceipt(value, expected);
99
+ }
100
+ export { MANUAL_VALIDATION_RECEIPT_SCHEMA, MANUAL_VALIDATION_RECEIPT_VERSION, createManualValidationReceipt, manualValidationFinalSummaryDigest, manualValidationFinalSummaryProjectionMatches, manualValidationReceiptDigest, manualValidationReceiptPath, readManualValidationReceipt, validateManualValidationReceipt, writeManualValidationReceiptAtomic };
101
+ //# sourceMappingURL=manual-validation-receipt.js.map
@@ -0,0 +1,40 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { randomUUID } from 'node:crypto';
4
+ const MANUAL_VALIDATION_TASK_ID = /^TASK-\d{8}-\d{6}$/u;
5
+ const MANUAL_VALIDATION_SHA40 = /^[a-f0-9]{40}$/u;
6
+ const MANUAL_VALIDATION_SHA64 = /^[a-f0-9]{64}$/u;
7
+ const MANUAL_VALIDATION_ARTIFACT = /^manual-validation(?:-r[2-9]|-r[1-9]\d+)?.md$/u;
8
+ const MANUAL_VALIDATION_TIMESTAMP = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u;
9
+ function isRecord(value) {
10
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
11
+ }
12
+ function exactKeys(value, keys, label) {
13
+ const allowed = new Set(keys);
14
+ const unknown = Object.keys(value).find((key) => !allowed.has(key));
15
+ if (unknown)
16
+ return `${label} contains unknown field '${unknown}'`;
17
+ const missing = keys.find((key) => !Object.hasOwn(value, key));
18
+ return missing ? `${label} is missing '${missing}'` : null;
19
+ }
20
+ function validTimestamp(value) {
21
+ return typeof value === 'string' && MANUAL_VALIDATION_TIMESTAMP.test(value) && Number.isFinite(Date.parse(value));
22
+ }
23
+ function writeJsonAtomic(file, value) {
24
+ const temporary = `${file}.${process.pid}.${randomUUID()}.tmp`;
25
+ fs.mkdirSync(path.dirname(file), { recursive: true });
26
+ try {
27
+ fs.writeFileSync(temporary, `${JSON.stringify(value)}\n`, { mode: 0o600 });
28
+ fs.renameSync(temporary, file);
29
+ }
30
+ catch (error) {
31
+ try {
32
+ fs.unlinkSync(temporary);
33
+ }
34
+ catch { /* best effort cleanup of our own temp file */ }
35
+ throw error;
36
+ }
37
+ return file;
38
+ }
39
+ export { MANUAL_VALIDATION_ARTIFACT, MANUAL_VALIDATION_SHA40, MANUAL_VALIDATION_SHA64, MANUAL_VALIDATION_TASK_ID, MANUAL_VALIDATION_TIMESTAMP, exactKeys, isRecord, validTimestamp, writeJsonAtomic };
40
+ //# sourceMappingURL=manual-validation-shared.js.map
@@ -0,0 +1,243 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import { validateManualValidationReceipt } from './manual-validation-receipt.js';
5
+ import { MANUAL_VALIDATION_ARTIFACT as ARTIFACT, MANUAL_VALIDATION_SHA40 as SHA40, MANUAL_VALIDATION_SHA64 as SHA64, MANUAL_VALIDATION_TASK_ID as TASK_ID, exactKeys, isRecord, validTimestamp, writeJsonAtomic } from './manual-validation-shared.js';
6
+ const MANUAL_VALIDATION_TRANSACTION_SCHEMA = 'agent-infra/manual-validation-transaction';
7
+ const MANUAL_VALIDATION_TRANSACTION_VERSION = 1;
8
+ const TRANSACTION_ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;
9
+ function invalid(message) {
10
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_INVALID', message } };
11
+ }
12
+ function summaryPreimageDigest(body) {
13
+ return createHash('sha256').update(body, 'utf8').digest('hex');
14
+ }
15
+ function validateManualValidationTransaction(value, expected) {
16
+ if (!isRecord(value))
17
+ return invalid('transaction must be a JSON object');
18
+ const keys = ['schema', 'version', 'transactionId', 'taskId', 'prNumber', 'prHeadSha', 'evidenceDigest', 'summaryPreimage', 'pendingSummaryDigest', 'finalSummaryDigest', 'artifact', 'phase', 'committedReceipt', 'eventAppended', 'attempt', 'postWriteVerified', 'createdAt', 'updatedAt', 'error'];
19
+ const keyError = exactKeys(value, keys, 'transaction');
20
+ if (keyError)
21
+ return invalid(keyError);
22
+ if (value.schema !== MANUAL_VALIDATION_TRANSACTION_SCHEMA || value.version !== MANUAL_VALIDATION_TRANSACTION_VERSION)
23
+ return invalid('transaction schema or version is unsupported');
24
+ if (typeof value.transactionId !== 'string' || !TRANSACTION_ID.test(value.transactionId))
25
+ return invalid('transactionId is invalid');
26
+ if (typeof value.taskId !== 'string' || !TASK_ID.test(value.taskId))
27
+ return invalid('taskId is invalid');
28
+ const prNumber = value.prNumber;
29
+ if (!Number.isSafeInteger(prNumber) || prNumber <= 0)
30
+ return invalid('prNumber is invalid');
31
+ if (typeof value.prHeadSha !== 'string' || !SHA40.test(value.prHeadSha))
32
+ return invalid('prHeadSha is invalid');
33
+ if (typeof value.evidenceDigest !== 'string' || !SHA64.test(value.evidenceDigest))
34
+ return invalid('evidenceDigest is invalid');
35
+ if (!isRecord(value.summaryPreimage))
36
+ return invalid('summaryPreimage is invalid');
37
+ const preimage = value.summaryPreimage;
38
+ const preimageKeyError = exactKeys(preimage, ['commentId', 'body', 'digest'], 'summaryPreimage');
39
+ if (preimageKeyError)
40
+ return invalid(preimageKeyError);
41
+ if (preimage.commentId !== null && typeof preimage.commentId !== 'number' && typeof preimage.commentId !== 'string')
42
+ return invalid('summaryPreimage.commentId is invalid');
43
+ if (typeof preimage.body !== 'string' || typeof preimage.digest !== 'string' || !SHA64.test(preimage.digest) || summaryPreimageDigest(preimage.body) !== preimage.digest)
44
+ return invalid('summaryPreimage digest is invalid');
45
+ for (const field of ['pendingSummaryDigest', 'finalSummaryDigest'])
46
+ if (typeof value[field] !== 'string' || !SHA64.test(value[field]))
47
+ return invalid(`${field} is invalid`);
48
+ if (typeof value.artifact !== 'string' || !ARTIFACT.test(value.artifact))
49
+ return invalid('artifact is invalid');
50
+ if (!['prepared', 'summary-staged', 'receipt-committed', 'final-promotion-in-progress', 'committed', 'aborted', 'recovery-required'].includes(value.phase))
51
+ return invalid('phase is invalid');
52
+ if (value.committedReceipt !== null && (typeof value.committedReceipt !== 'string' || !SHA64.test(value.committedReceipt)))
53
+ return invalid('committedReceipt is invalid');
54
+ if (typeof value.eventAppended !== 'boolean' || typeof value.postWriteVerified !== 'boolean')
55
+ return invalid('transaction completion flags are invalid');
56
+ const attempt = value.attempt;
57
+ if (!Number.isSafeInteger(attempt) || attempt < 1)
58
+ return invalid('attempt is invalid');
59
+ if (!validTimestamp(value.createdAt) || !validTimestamp(value.updatedAt))
60
+ return invalid('transaction timestamps are invalid');
61
+ if (value.error !== null && (typeof value.error !== 'string' || !value.error || /[\r\n]/u.test(value.error)))
62
+ return invalid('transaction error is invalid');
63
+ if (['receipt-committed', 'final-promotion-in-progress', 'committed'].includes(value.phase) && value.committedReceipt === null)
64
+ return invalid('receipt-backed phases require committedReceipt');
65
+ if (['final-promotion-in-progress', 'committed'].includes(value.phase) && !value.eventAppended)
66
+ return invalid('final promotion requires an appended completion event');
67
+ if (value.phase === 'committed' && !value.postWriteVerified)
68
+ return invalid('committed phase requires post-write verification');
69
+ const transaction = value;
70
+ if (expected && Object.entries(expected).some(([key, expectedValue]) => expectedValue !== undefined && transaction[key] !== expectedValue)) {
71
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_IDENTITY_MISMATCH', message: 'transaction identity does not match the expected operation' } };
72
+ }
73
+ return { ok: true, value: transaction };
74
+ }
75
+ function createManualValidationTransaction(input) {
76
+ const transaction = {
77
+ schema: MANUAL_VALIDATION_TRANSACTION_SCHEMA,
78
+ version: MANUAL_VALIDATION_TRANSACTION_VERSION,
79
+ transactionId: input.transactionId ?? `mv-${randomUUID()}`,
80
+ taskId: input.taskId,
81
+ prNumber: input.prNumber,
82
+ prHeadSha: input.prHeadSha,
83
+ evidenceDigest: input.evidenceDigest,
84
+ summaryPreimage: input.summaryPreimage,
85
+ pendingSummaryDigest: input.pendingSummaryDigest,
86
+ finalSummaryDigest: input.finalSummaryDigest,
87
+ artifact: input.artifact,
88
+ phase: 'prepared',
89
+ committedReceipt: null,
90
+ eventAppended: false,
91
+ attempt: input.attempt,
92
+ postWriteVerified: false,
93
+ createdAt: input.createdAt,
94
+ updatedAt: input.updatedAt,
95
+ error: null
96
+ };
97
+ const checked = validateManualValidationTransaction(transaction);
98
+ if (!checked.ok)
99
+ throw new Error(`${checked.error.code}: ${checked.error.message}`);
100
+ return checked.value;
101
+ }
102
+ const allowedTransitions = {
103
+ prepared: ['prepared', 'summary-staged', 'aborted', 'recovery-required'],
104
+ 'summary-staged': ['summary-staged', 'receipt-committed', 'aborted', 'recovery-required'],
105
+ 'receipt-committed': ['receipt-committed', 'final-promotion-in-progress', 'aborted', 'recovery-required'],
106
+ 'final-promotion-in-progress': ['final-promotion-in-progress', 'committed', 'aborted', 'recovery-required'],
107
+ committed: ['committed'],
108
+ aborted: ['aborted', 'prepared'],
109
+ 'recovery-required': ['recovery-required', 'prepared']
110
+ };
111
+ function transitionManualValidationTransaction(current, phase, patch = {}) {
112
+ if (!allowedTransitions[current.phase].includes(phase))
113
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID', message: `cannot transition from ${current.phase} to ${phase}` } };
114
+ if (phase === 'final-promotion-in-progress' && (!current.eventAppended && patch.eventAppended !== true))
115
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID', message: 'final promotion requires an appended completion event' } };
116
+ const next = {
117
+ ...current,
118
+ phase,
119
+ committedReceipt: patch.committedReceipt !== undefined ? patch.committedReceipt : current.committedReceipt,
120
+ eventAppended: patch.eventAppended ?? current.eventAppended,
121
+ postWriteVerified: patch.postWriteVerified ?? current.postWriteVerified,
122
+ attempt: patch.attempt ?? current.attempt,
123
+ error: patch.error !== undefined ? patch.error : current.error,
124
+ updatedAt: patch.updatedAt ?? new Date().toISOString()
125
+ };
126
+ const checked = validateManualValidationTransaction(next);
127
+ if (!checked.ok)
128
+ return checked;
129
+ return checked;
130
+ }
131
+ function retryManualValidationTransaction(current, now = new Date().toISOString()) {
132
+ if (!['aborted', 'recovery-required'].includes(current.phase))
133
+ return { ok: false, error: { code: 'MANUAL_VALIDATION_TRANSACTION_PHASE_INVALID', message: 'only aborted or recovery-required transactions can be retried' } };
134
+ return transitionManualValidationTransaction(current, 'prepared', {
135
+ updatedAt: now,
136
+ error: null,
137
+ committedReceipt: null,
138
+ eventAppended: false,
139
+ postWriteVerified: false,
140
+ attempt: current.attempt + 1
141
+ });
142
+ }
143
+ function manualValidationTransactionPath(taskDir) {
144
+ return path.join(taskDir, '.manual-validation', 'transaction.json');
145
+ }
146
+ function manualValidationGenerationPaths(taskDir, transaction) {
147
+ const stateDir = path.join(taskDir, '.manual-validation');
148
+ const historyDir = path.join(stateDir, 'history');
149
+ return {
150
+ receipt: {
151
+ current: path.join(stateDir, 'receipt.json'),
152
+ history: path.join(historyDir, `receipt-${transaction.transactionId}-attempt-${transaction.attempt}.json`)
153
+ },
154
+ transaction: {
155
+ current: manualValidationTransactionPath(taskDir),
156
+ history: path.join(historyDir, `transaction-${transaction.transactionId}-attempt-${transaction.attempt}.json`)
157
+ }
158
+ };
159
+ }
160
+ function readReceiptAt(file, transaction) {
161
+ let value;
162
+ try {
163
+ value = JSON.parse(fs.readFileSync(file, 'utf8'));
164
+ }
165
+ catch (error) {
166
+ if (error.code === 'ENOENT')
167
+ return 'missing';
168
+ throw new Error(`manual-validation receipt is unreadable: ${error instanceof Error ? error.message : String(error)}`);
169
+ }
170
+ const checked = validateManualValidationReceipt(value, {
171
+ transactionId: transaction.transactionId,
172
+ taskId: transaction.taskId,
173
+ prNumber: transaction.prNumber,
174
+ prHeadSha: transaction.prHeadSha,
175
+ evidenceDigest: transaction.evidenceDigest,
176
+ artifact: transaction.artifact
177
+ });
178
+ if (!checked.ok)
179
+ throw new Error(`manual-validation receipt is invalid: ${checked.error.message}`);
180
+ if (transaction.committedReceipt !== null && checked.value.receiptDigest !== transaction.committedReceipt) {
181
+ throw new Error('manual-validation receipt does not match the committed transaction');
182
+ }
183
+ return 'valid';
184
+ }
185
+ function validateManualValidationGenerationArchive(taskDir, transaction, requireReceipt = false) {
186
+ const paths = manualValidationGenerationPaths(taskDir, transaction);
187
+ const currentTransaction = fs.existsSync(paths.transaction.current);
188
+ const archivedTransaction = fs.existsSync(paths.transaction.history);
189
+ if (currentTransaction && archivedTransaction)
190
+ throw new Error(`manual-validation archive has conflicting transaction files for ${transaction.transactionId}`);
191
+ if (!currentTransaction && !archivedTransaction)
192
+ throw new Error(`manual-validation archive source is missing: ${paths.transaction.current}`);
193
+ const currentReceipt = requireReceipt
194
+ ? readReceiptAt(paths.receipt.current, transaction)
195
+ : (fs.existsSync(paths.receipt.current) ? 'valid' : 'missing');
196
+ const archivedReceipt = requireReceipt
197
+ ? readReceiptAt(paths.receipt.history, transaction)
198
+ : (fs.existsSync(paths.receipt.history) ? 'valid' : 'missing');
199
+ if (requireReceipt && currentReceipt === 'missing' && archivedReceipt === 'missing') {
200
+ throw new Error(`manual-validation receipt is missing for transaction ${transaction.transactionId}`);
201
+ }
202
+ if (currentReceipt === 'valid' && archivedReceipt === 'valid') {
203
+ throw new Error(`manual-validation archive has conflicting receipt files for ${transaction.transactionId}`);
204
+ }
205
+ }
206
+ function archiveManualValidationGeneration(taskDir, transaction, requireReceipt = false, options = {}) {
207
+ const paths = manualValidationGenerationPaths(taskDir, transaction);
208
+ validateManualValidationGenerationArchive(taskDir, transaction, requireReceipt);
209
+ fs.mkdirSync(path.dirname(paths.receipt.history), { recursive: true });
210
+ const move = (source, target, required) => {
211
+ if (!fs.existsSync(source)) {
212
+ if (fs.existsSync(target) || !required)
213
+ return;
214
+ throw new Error(`manual-validation archive source is missing: ${source}`);
215
+ }
216
+ if (fs.existsSync(target))
217
+ throw new Error(`manual-validation archive target already exists: ${target}`);
218
+ fs.renameSync(source, target);
219
+ };
220
+ move(paths.receipt.current, paths.receipt.history, requireReceipt);
221
+ options.afterReceiptMove?.();
222
+ move(paths.transaction.current, paths.transaction.history, true);
223
+ }
224
+ function writeManualValidationTransactionAtomic(taskDir, transaction) {
225
+ const checked = validateManualValidationTransaction(transaction);
226
+ if (!checked.ok)
227
+ throw new Error(`${checked.error.code}: ${checked.error.message}`);
228
+ const target = manualValidationTransactionPath(taskDir);
229
+ return writeJsonAtomic(target, transaction);
230
+ }
231
+ function readManualValidationTransaction(taskDir, expected) {
232
+ const file = manualValidationTransactionPath(taskDir);
233
+ let value;
234
+ try {
235
+ value = JSON.parse(fs.readFileSync(file, 'utf8'));
236
+ }
237
+ catch (error) {
238
+ return { ok: false, error: { code: error.code === 'ENOENT' ? 'MANUAL_VALIDATION_TRANSACTION_MISSING' : 'MANUAL_VALIDATION_TRANSACTION_INVALID', message: error instanceof Error ? error.message : String(error) } };
239
+ }
240
+ return validateManualValidationTransaction(value, expected);
241
+ }
242
+ export { MANUAL_VALIDATION_TRANSACTION_SCHEMA, MANUAL_VALIDATION_TRANSACTION_VERSION, archiveManualValidationGeneration, createManualValidationTransaction, manualValidationTransactionPath, validateManualValidationGenerationArchive, readManualValidationTransaction, retryManualValidationTransaction, summaryPreimageDigest, transitionManualValidationTransaction, validateManualValidationTransaction, writeManualValidationTransactionAtomic };
243
+ //# sourceMappingURL=manual-validation-transaction.js.map
@@ -0,0 +1,47 @@
1
+ const HEADING = /^ {0,3}(#{1,6})[ \t]+(.+?)\s*$/;
2
+ const FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})(.*)$/;
3
+ const FENCE_CLOSE = /^ {0,3}(`{3,}|~{3,})\s*$/;
4
+ const ANCHOR = /^\s*<a\s+id=(['"])([^'"]+)\1\s*><\/a>\s*$/;
5
+ function sourceLines(content) {
6
+ const lines = [];
7
+ let start = 0;
8
+ while (start < content.length) {
9
+ const newline = content.indexOf('\n', start);
10
+ const end = newline === -1 ? content.length : newline;
11
+ lines.push({ start, end, text: content.slice(start, end).replace(/\r$/, '') });
12
+ start = newline === -1 ? content.length : newline + 1;
13
+ }
14
+ return lines;
15
+ }
16
+ function scanVisibleMarkdown(content) {
17
+ const lines = sourceLines(content);
18
+ const visible = [];
19
+ const headings = [];
20
+ const anchors = [];
21
+ let fence = null;
22
+ for (const line of lines) {
23
+ if (fence) {
24
+ const close = line.text.match(FENCE_CLOSE);
25
+ if (close && close[1][0] === fence.character && close[1].length >= fence.length)
26
+ fence = null;
27
+ continue;
28
+ }
29
+ const open = line.text.match(FENCE_OPEN);
30
+ const marker = open?.[1];
31
+ const info = open?.[2] ?? '';
32
+ if (marker && !(marker[0] === '`' && info.includes('`'))) {
33
+ fence = { character: marker[0], length: marker.length };
34
+ continue;
35
+ }
36
+ visible.push(line);
37
+ const heading = line.text.match(HEADING);
38
+ if (heading)
39
+ headings.push({ ...line, level: heading[1].length, text: heading[2].trim() });
40
+ const anchor = line.text.match(ANCHOR);
41
+ if (anchor)
42
+ anchors.push({ ...line, id: anchor[2] });
43
+ }
44
+ return { lines: visible, headings, anchors, hasUnclosedFence: fence !== null };
45
+ }
46
+ export { scanVisibleMarkdown };
47
+ //# sourceMappingURL=markdown.js.map