@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,217 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { inspectOwnedPath } from '../owned-path.js';
4
+ import { parseTaskFrontmatter } from '../task/frontmatter.js';
5
+ import { readTaskFinalizationReceipt } from '../task/finalization.js';
6
+ import { taskFinalizationReceiptState } from '../task/finalization-state.js';
7
+ import { enumerateAllTaskDirs } from '../task/resolve-ref.js';
8
+ import { resolveSandboxCleanupTarget } from './workspace-identity.js';
9
+ import { readSandboxControlManifest } from './control/lifecycle.js';
10
+ import { readJsonFile, readSandboxControlStatus } from './control/state.js';
11
+ import { finalizationTerminalResponse } from './control/finalization-response.js';
12
+ const TASK_ID_RE = /^TASK-\d{8}-\d{6}$/;
13
+ function matchingControlManifest(repoRoot, controlRoot, taskId, binding) {
14
+ if (!controlRootIdentity(controlRoot))
15
+ return null;
16
+ const manifestPath = path.join(controlRoot, 'manifest.json');
17
+ let manifest;
18
+ try {
19
+ manifest = readSandboxControlManifest(manifestPath);
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ if (manifest.mode !== 'task-bound' || manifest.taskId !== taskId
25
+ || canonicalPath(manifest.repoRoot) !== repoRoot || manifest.generation !== binding.generation
26
+ || path.resolve(manifest.channelDir) !== path.join(controlRoot, 'channel')
27
+ || path.resolve(manifest.publicStatusDir) !== path.join(controlRoot, 'public')
28
+ || path.resolve(manifest.processingDir) !== path.join(controlRoot, 'processing')
29
+ || path.resolve(manifest.runtimeDir) !== path.join(controlRoot, 'runtime'))
30
+ return null;
31
+ return manifest;
32
+ }
33
+ function errorCode(error) {
34
+ const code = error?.code;
35
+ return typeof code === 'string' ? code : null;
36
+ }
37
+ function controlBindingKey(taskId, binding) {
38
+ return `${taskId}\0${binding.generation}\0${binding.requestId}`;
39
+ }
40
+ function controlRootIdentity(root) {
41
+ try {
42
+ const stat = fs.lstatSync(root);
43
+ if (!stat.isDirectory() || stat.isSymbolicLink())
44
+ return null;
45
+ return { dev: String(stat.dev), ino: String(stat.ino) };
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ function controlRootState(root, expected) {
52
+ let stat;
53
+ try {
54
+ stat = fs.lstatSync(root);
55
+ }
56
+ catch (error) {
57
+ return errorCode(error) === 'ENOENT' ? 'missing' : 'replaced';
58
+ }
59
+ if (stat.isSymbolicLink() || !stat.isDirectory())
60
+ return 'replaced';
61
+ return String(stat.dev) === expected.dev && String(stat.ino) === expected.ino ? 'same' : 'replaced';
62
+ }
63
+ function controlRootIsAbsent(root) {
64
+ try {
65
+ fs.lstatSync(root);
66
+ return false;
67
+ }
68
+ catch (error) {
69
+ return errorCode(error) === 'ENOENT';
70
+ }
71
+ }
72
+ function canonicalPath(input) {
73
+ try {
74
+ return fs.realpathSync.native(input);
75
+ }
76
+ catch {
77
+ return path.resolve(input);
78
+ }
79
+ }
80
+ function taskFinalizationReceiptComplete(receipt, taskId, binding) {
81
+ return receipt.taskId === taskId
82
+ && taskFinalizationReceiptState(receipt) === 'complete'
83
+ && receipt.controlBinding?.generation === binding.generation
84
+ && receipt.controlBinding.requestId === binding.requestId;
85
+ }
86
+ function terminalControlBindingEvidence(repoRootInput, controlRootInput, taskId, binding) {
87
+ const repoRoot = canonicalPath(repoRootInput);
88
+ const controlRoot = path.resolve(controlRootInput);
89
+ if (!TASK_ID_RE.test(taskId) || !controlRootIdentity(controlRoot))
90
+ return false;
91
+ const manifestPath = path.join(controlRoot, 'manifest.json');
92
+ if (!inspectOwnedPath(controlRoot, manifestPath, 'file'))
93
+ return false;
94
+ const manifest = matchingControlManifest(repoRoot, controlRoot, taskId, binding);
95
+ if (!manifest)
96
+ return false;
97
+ try {
98
+ const leasePath = path.join(controlRoot, 'lease.json');
99
+ try {
100
+ fs.lstatSync(leasePath);
101
+ return false;
102
+ }
103
+ catch (error) {
104
+ if (errorCode(error) !== 'ENOENT')
105
+ return false;
106
+ }
107
+ const receipt = readTaskFinalizationReceipt(repoRoot, taskId);
108
+ if (!receipt || !taskFinalizationReceiptComplete(receipt, taskId, binding)) {
109
+ return false;
110
+ }
111
+ const status = readSandboxControlStatus(manifest.publicStatusDir);
112
+ const viewReceipt = status.taskView.receipt;
113
+ const terminalTaskView = (status.taskView.state === 'current' && status.taskView.observedSource === 'completed')
114
+ || (status.taskView.state === 'finalized-stale' && status.taskView.observedSource === 'active');
115
+ if (status.generation !== binding.generation || status.state !== 'healthy'
116
+ || status.activeRequestId !== null || !terminalTaskView || status.taskView.taskId !== taskId
117
+ || !viewReceipt || viewReceipt.generation !== binding.generation
118
+ || viewReceipt.requestId !== binding.requestId
119
+ || viewReceipt.receiptId !== receipt.receiptId
120
+ || viewReceipt.revision !== receipt.revision)
121
+ return false;
122
+ const responsePath = path.join(manifest.channelDir, 'responses', `${binding.requestId}.json`);
123
+ if (!inspectOwnedPath(path.join(controlRoot, 'channel'), responsePath, 'file'))
124
+ return false;
125
+ const actual = readJsonFile(responsePath);
126
+ const expected = finalizationTerminalResponse(taskId, binding.requestId, receipt);
127
+ return JSON.stringify(actual) === JSON.stringify(expected);
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ function removedControlBindingEvidence(repoRootInput, journal, taskId, binding) {
134
+ const repoRoot = canonicalPath(repoRootInput);
135
+ if (journal.phase !== 'completed'
136
+ || journal.generation !== binding.generation
137
+ || !path.isAbsolute(journal.target.controlRoot))
138
+ return false;
139
+ const controlRoot = path.resolve(journal.target.controlRoot);
140
+ if (!controlRootIsAbsent(controlRoot))
141
+ return false;
142
+ const task = enumerateAllTaskDirs(repoRoot).find((entry) => entry.taskId === taskId);
143
+ if (!task || (task.state !== 'completed' && task.state !== 'archive'))
144
+ return false;
145
+ let frontmatter;
146
+ try {
147
+ frontmatter = parseTaskFrontmatter(fs.readFileSync(path.join(task.taskDir, 'task.md'), 'utf8'));
148
+ }
149
+ catch {
150
+ return false;
151
+ }
152
+ if (frontmatter.id !== taskId || frontmatter.branch !== journal.target.branch)
153
+ return false;
154
+ try {
155
+ const receipt = readTaskFinalizationReceipt(repoRoot, taskId);
156
+ return receipt !== null && taskFinalizationReceiptComplete(receipt, taskId, binding);
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ export function createSandboxControlBindingEvidence(repoRoot, controlRoots, removalJournals = []) {
163
+ const canonicalRepoRoot = canonicalPath(repoRoot);
164
+ const roots = [...new Set(controlRoots.map((candidate) => path.resolve(candidate)))];
165
+ const captured = roots.flatMap((controlRoot) => {
166
+ let manifest;
167
+ try {
168
+ manifest = readSandboxControlManifest(path.join(controlRoot, 'manifest.json'));
169
+ }
170
+ catch {
171
+ return [];
172
+ }
173
+ const rootIdentity = controlRootIdentity(controlRoot);
174
+ if (!rootIdentity)
175
+ return [];
176
+ const receipt = (() => {
177
+ try {
178
+ return readSandboxControlStatus(manifest.publicStatusDir).taskView.receipt;
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ })();
184
+ if (!receipt || !terminalControlBindingEvidence(canonicalRepoRoot, controlRoot, manifest.taskId ?? '', receipt))
185
+ return [];
186
+ return [{
187
+ controlRoot,
188
+ taskId: manifest.taskId,
189
+ key: controlBindingKey(manifest.taskId, receipt),
190
+ rootIdentity
191
+ }];
192
+ });
193
+ return (taskId, binding) => {
194
+ const terminal = captured.some((candidate) => {
195
+ if (candidate.taskId !== taskId || candidate.key !== controlBindingKey(taskId, binding))
196
+ return false;
197
+ const state = controlRootState(candidate.controlRoot, candidate.rootIdentity);
198
+ return state === 'missing'
199
+ || state === 'same' && terminalControlBindingEvidence(canonicalRepoRoot, candidate.controlRoot, taskId, binding);
200
+ }) || removalJournals.some((journal) => removedControlBindingEvidence(canonicalRepoRoot, journal, taskId, binding));
201
+ if (terminal)
202
+ return 'terminal';
203
+ if (roots.some((root) => matchingControlManifest(canonicalRepoRoot, root, taskId, binding)))
204
+ return 'pending';
205
+ try {
206
+ const branch = resolveSandboxCleanupTarget(taskId, canonicalRepoRoot, { allowProtected: true }).branch;
207
+ if (removalJournals.some((journal) => journal.phase !== 'completed'
208
+ && journal.generation === binding.generation && journal.target.branch === branch))
209
+ return 'pending';
210
+ }
211
+ catch {
212
+ // Missing or conflicting task identity cannot authorize removal.
213
+ }
214
+ return 'mismatch';
215
+ };
216
+ }
217
+ //# sourceMappingURL=task-cleanup.js.map
@@ -1,6 +1,7 @@
1
1
  import { createHash, randomBytes } from 'node:crypto';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
+ import { createSandboxControlIdentitySentinel, writeSandboxControlIdentitySentinel } from './control/identity-sentinel.js';
4
5
  export const SANDBOX_WORKSPACE_VIEW_STATES = Object.freeze([
5
6
  'active',
6
7
  'completed',
@@ -20,12 +21,7 @@ export function sandboxWorkspaceViewPaths(params) {
20
21
  const digest = createHash('sha256').update(identityKey).digest('hex').slice(0, 16);
21
22
  const projectRoot = path.resolve(params.base, params.project);
22
23
  const root = path.resolve(projectRoot, params.container, digest);
23
- return {
24
- root,
25
- taskMountPath: params.identity.mode === 'task-bound'
26
- ? path.join(root, 'active', params.identity.taskId)
27
- : null
28
- };
24
+ return { root };
29
25
  }
30
26
  export function sandboxControlPaths(params) {
31
27
  const identityKey = params.identity.mode === 'task-bound'
@@ -108,7 +104,7 @@ export function prepareSandboxWorkspaceMountTargets(worktreeRoot) {
108
104
  }
109
105
  export function materializeSandboxWorkspaceView(params) {
110
106
  const projectRoot = path.resolve(params.base, params.project);
111
- const { root, taskMountPath } = sandboxWorkspaceViewPaths(params);
107
+ const { root } = sandboxWorkspaceViewPaths(params);
112
108
  assertSafeDirectory(projectRoot, path.resolve(params.base));
113
109
  assertSafeDirectory(root, projectRoot);
114
110
  fs.mkdirSync(root, { recursive: true, mode: 0o700 });
@@ -128,11 +124,7 @@ export function materializeSandboxWorkspaceView(params) {
128
124
  encoding: 'utf8',
129
125
  mode: 0o600
130
126
  });
131
- if (taskMountPath) {
132
- assertSafeDirectory(taskMountPath, active);
133
- fs.mkdirSync(taskMountPath, { recursive: true, mode: 0o700 });
134
- }
135
- return { root, taskMountPath };
127
+ return { root };
136
128
  }
137
129
  export function materializeSandboxControl(params) {
138
130
  const { root, channelDir, statusDir, processingDir, runtimeDir, manifestPath } = sandboxControlPaths(params);
@@ -170,6 +162,12 @@ export function materializeSandboxControl(params) {
170
162
  }
171
163
  const token = randomBytes(32).toString('hex');
172
164
  const generation = randomBytes(16).toString('hex');
165
+ const identitySentinel = createSandboxControlIdentitySentinel({
166
+ mode: params.identity.mode,
167
+ taskId: params.identity.mode === 'task-bound' ? params.identity.taskId : null,
168
+ generation
169
+ });
170
+ writeSandboxControlIdentitySentinel(statusDir, identitySentinel);
173
171
  const repoRoot = fs.realpathSync.native(params.repoRoot);
174
172
  const manifestDraft = {
175
173
  engine: params.engine ?? 'docker',
@@ -182,12 +180,13 @@ export function materializeSandboxControl(params) {
182
180
  taskId: params.identity.mode === 'task-bound' ? params.identity.taskId : null,
183
181
  token,
184
182
  generation,
183
+ controlRootId: identitySentinel.controlRootId,
185
184
  channelDir,
186
185
  publicStatusDir: statusDir,
187
186
  processingDir,
188
- runtimeDir
187
+ runtimeDir,
189
188
  };
190
- return { root, channelDir, statusDir, runtimeDir, manifestPath, manifestDraft, token, generation };
189
+ return { root, channelDir, statusDir, runtimeDir, manifestPath, manifestDraft, token, generation, controlRootId: identitySentinel.controlRootId };
191
190
  }
192
191
  export function finalizeSandboxControlManifest(setup, identity) {
193
192
  if (!identity.engine || !identity.id)
@@ -195,7 +194,8 @@ export function finalizeSandboxControlManifest(setup, identity) {
195
194
  const manifest = {
196
195
  ...setup.manifestDraft,
197
196
  engine: identity.engine,
198
- containerIdentity: { id: identity.id, labels: { ...identity.labels } }
197
+ containerIdentity: { id: identity.id, labels: { ...identity.labels } },
198
+ authorityEvidence: identity.authorityEvidence
199
199
  };
200
200
  const temporary = `${setup.manifestPath}.${process.pid}.${randomBytes(8).toString('hex')}.tmp`;
201
201
  try {
@@ -387,7 +387,10 @@ function verifyWorktreePermit(permit, options = {}) {
387
387
  : inspectWorktree(permit.snapshot.worktree, options);
388
388
  if (current.status === 'failed')
389
389
  throw new Error(`Unable to verify worktree permit: ${current.message}`);
390
- if (current.snapshot.identity !== permit.snapshot.identity || (permit.mode === 'clean' && current.status !== 'clean')) {
390
+ const sameTarget = current.snapshot.worktree === permit.snapshot.worktree
391
+ && current.snapshot.branch === permit.snapshot.branch;
392
+ if (!sameTarget || (permit.mode === 'clean'
393
+ && (current.snapshot.identity !== permit.snapshot.identity || current.status !== 'clean'))) {
391
394
  throw new Error(`Worktree changed after authorization: ${permit.snapshot.worktree}`);
392
395
  }
393
396
  return current.snapshot;
@@ -1,5 +1,7 @@
1
1
  import { runDaemon } from './daemon.js';
2
2
  import { start, stop, status, logs } from './process-control.js';
3
+ import { PUBLIC_CLI_ROUTE_SELECTORS } from '../internal/cli-route-inventory.js';
4
+ const SERVER_OPERATIONS = PUBLIC_CLI_ROUTE_SELECTORS.server;
3
5
  const USAGE = `Usage: ai server <command> [options]
4
6
 
5
7
  Commands:
@@ -21,6 +23,12 @@ export async function runServer(args) {
21
23
  process.stdout.write(`${USAGE}\n`);
22
24
  return;
23
25
  }
26
+ if (!SERVER_OPERATIONS.includes(subcommand)) {
27
+ process.stderr.write(`Unknown server command: ${subcommand}\n`);
28
+ process.stdout.write(`${USAGE}\n`);
29
+ process.exitCode = 1;
30
+ return;
31
+ }
24
32
  switch (subcommand) {
25
33
  case 'start':
26
34
  await start({ foreground: rest.includes('--foreground') });
@@ -2,7 +2,8 @@ import fs from 'node:fs';
2
2
  import { normalizeAgentToken } from '../agent-clients/tokens.js';
3
3
  import { resolveTaskRef } from './resolve-ref.js';
4
4
  import { locateActivityLog, appendActivityEntry } from './activity-log.js';
5
- import { assertWritableInventory, buildArtifactLinkSection, inspectTaskArtifacts, parseArtifactName } from './artifact-lifecycle.js';
5
+ import { assertWritableInventory, buildArtifactLinkSection, inspectTaskArtifacts } from './artifact-lifecycle.js';
6
+ import { parseArtifactName } from './artifact-name.js';
6
7
  import { TaskExecutionLockError, withTaskExecutionLock } from './task-execution-lock.js';
7
8
  import { captureTaskWriteMetadata, writeTask } from './write.js';
8
9
  import { allowsManualOverride } from './guard-override.js';
@@ -1,5 +1,4 @@
1
- const HEADING_RE = /^##\s+(活动日志|Activity Log)\s*$/;
2
- const NEXT_H2_RE = /^##\s/;
1
+ import { scanVisibleMarkdown } from './markdown.js';
3
2
  const ENTRY_RE = /^- (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}) — \*\*(.+?)\*\* by (.+?) — (.*)$/;
4
3
  const STARTED_SUFFIX_RE = /\s*\[started\]\s*$/;
5
4
  const ABORTED_SUFFIX_RE = /\s*\[aborted\]\s*$/;
@@ -10,29 +9,36 @@ function parseActivityLog(content) {
10
9
  const section = locateActivityLog(content);
11
10
  return section ? { sectionFound: true, entries: section.entries } : { sectionFound: false, entries: [] };
12
11
  }
13
- function locateActivityLog(content) {
14
- const lines = content.split('\n');
15
- const headings = lines.map((line, index) => HEADING_RE.test(line) ? index : -1).filter((index) => index >= 0);
16
- if (headings.length !== 1)
17
- return null;
18
- const i = headings[0];
19
- let end = lines.length;
20
- for (let j = i + 1; j < lines.length; j += 1) {
21
- if (NEXT_H2_RE.test(lines[j])) {
22
- end = j;
23
- break;
24
- }
25
- }
26
- const bodyLines = lines.slice(i + 1, end);
27
- const parsed = [];
28
- for (const line of bodyLines) {
29
- const m = ENTRY_RE.exec(line);
30
- if (!m)
12
+ /** Returns source-order entries and malformed bullets without applying display or gate policy. */
13
+ function inspectActivityLog(content) {
14
+ const scanned = scanVisibleMarkdown(content);
15
+ const headings = scanned.headings.filter((heading) => heading.level === 2);
16
+ const matches = headings.filter((heading) => heading.text === '活动日志' || heading.text === 'Activity Log');
17
+ if (matches.length !== 1)
18
+ return { section: null, invalidEntries: [] };
19
+ const heading = matches[0];
20
+ const end = headings.find((candidate) => candidate.start > heading.start)?.start ?? content.length;
21
+ const entries = [];
22
+ const invalidEntries = [];
23
+ for (const line of scanned.lines) {
24
+ if (line.start <= heading.end || line.start >= end)
31
25
  continue;
32
- parsed.push({ entry: { time: m[1], step: m[2], agent: m[3], note: m[4] }, epoch: Date.parse(m[1].replace(' ', 'T')), order: parsed.length });
26
+ const text = line.text.trimStart();
27
+ const match = ENTRY_RE.exec(text);
28
+ if (match)
29
+ entries.push({ time: match[1], step: match[2], agent: match[3], note: match[4] });
30
+ else if (text.startsWith('- '))
31
+ invalidEntries.push(text);
33
32
  }
34
- parsed.sort((a, b) => a.epoch - b.epoch || a.order - b.order);
35
- return { heading: HEADING_RE.exec(lines[i])[1], body: bodyLines.join('\n').replace(/^\n+|\n+$/g, ''), entries: parsed.map((item) => item.entry) };
33
+ const body = content.slice(heading.end + 1, end).replace(/\r\n/g, '\n').replace(/^\n+|\n+$/g, '');
34
+ return { section: { heading: heading.text, body, entries }, invalidEntries };
35
+ }
36
+ function locateActivityLog(content) {
37
+ const { section } = inspectActivityLog(content);
38
+ if (!section)
39
+ return null;
40
+ section.entries.sort((left, right) => Date.parse(left.time.replace(' ', 'T')) - Date.parse(right.time.replace(' ', 'T')));
41
+ return section;
36
42
  }
37
43
  function appendActivityEntry(section, entry) {
38
44
  const line = `- ${entry.time} — **${entry.step}** by ${entry.agent} — ${entry.note}`;
@@ -94,5 +100,5 @@ function hasOpenLifecycleExecution(content) {
94
100
  return false;
95
101
  return pairEntries(section.entries).some((row) => row.done === '' && LIFECYCLE_STEP_RE.test(row.step));
96
102
  }
97
- export { activityAttempt, appendActivityEntry, hasOpenLifecycleExecution, commitAttemptStartedNote, locateActivityLog, pairEntries, parseActivityLog, parseCommitAttemptStarted, startedBackedRows };
103
+ export { activityAttempt, appendActivityEntry, hasOpenLifecycleExecution, commitAttemptStartedNote, inspectActivityLog, locateActivityLog, pairEntries, parseActivityLog, parseCommitAttemptStarted, startedBackedRows };
98
104
  //# sourceMappingURL=activity-log.js.map
@@ -0,0 +1,101 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readStableFileSync } from '../host-control/secure-fs.js';
4
+ import { resolveArtifactContext, hasOpenArtifactRound } from './artifact-lifecycle.js';
5
+ import { parseArtifactName } from './artifact-name.js';
6
+ import { resolveTaskRef } from './resolve-ref.js';
7
+ import { getArtifactSchema } from './artifact-schema.js';
8
+ import { finalizeLocalArtifact } from './local-artifact-finalization.js';
9
+ import { applyArtifactRepair, initializeArtifactSkeleton, inspectArtifactStructure } from './artifact-operations.js';
10
+ /** One option contract for the CLI and trusted projection executor. */
11
+ export function parseArtifactCommand(args) {
12
+ const [taskRef, operation] = args;
13
+ if (!taskRef || !['inspect', 'init', 'repair', 'finalize-local'].includes(operation ?? '')) {
14
+ throw new Error('task ref and a supported artifact operation are required');
15
+ }
16
+ const fields = {};
17
+ const allowed = {
18
+ inspect: ['--family'],
19
+ init: ['--family', '--artifact', '--locale'],
20
+ repair: ['--family', '--artifact', '--expected-sha256', '--expected-semantic-digest'],
21
+ 'finalize-local': ['--family', '--artifact']
22
+ }[operation];
23
+ for (let index = 2; index < args.length; index += 1) {
24
+ const flag = args[index];
25
+ if (!allowed.includes(flag))
26
+ throw new Error(`unknown option '${flag}'`);
27
+ if (Object.hasOwn(fields, flag))
28
+ throw new Error(`duplicate option '${flag}'`);
29
+ const value = args[++index];
30
+ if (!value || value.startsWith('--'))
31
+ throw new Error(`option '${flag}' requires a value`);
32
+ fields[flag] = value;
33
+ }
34
+ if (!fields['--family'])
35
+ throw new Error("option '--family' is required");
36
+ if (operation !== 'inspect' && !fields['--artifact'])
37
+ throw new Error("option '--artifact' is required");
38
+ const locale = fields['--locale'];
39
+ if (locale !== undefined && locale !== 'zh-CN' && locale !== 'en')
40
+ throw new Error("option '--locale' must be 'zh-CN' or 'en'");
41
+ if (operation === 'repair' && !['--expected-sha256', '--expected-semantic-digest'].every((flag) => /^[a-f0-9]{64}$/u.test(fields[flag] ?? ''))) {
42
+ throw new Error('repair requires lowercase 64-character digests');
43
+ }
44
+ return {
45
+ taskRef, operation: operation, family: fields['--family'],
46
+ artifact: fields['--artifact'] ?? '', locale,
47
+ expectedSha256: fields['--expected-sha256'] ?? '', expectedSemanticDigest: fields['--expected-semantic-digest'] ?? ''
48
+ };
49
+ }
50
+ /** Resolve authoritative task metadata separately from a trusted candidate directory. */
51
+ export function executeArtifactCommand(command, options = {}) {
52
+ const { taskRef, operation, family, artifact, locale, expectedSha256, expectedSemanticDigest } = command;
53
+ const fail = (code, message) => ({ status: 'failed', changed: false, error: { code, message } });
54
+ if (operation === 'inspect') {
55
+ const result = resolveArtifactContext(taskRef, family, { repoRoot: options.repoRoot });
56
+ return family === 'code' && result.codeMode ? {
57
+ ...result, mode: result.codeMode.mode, code_max: result.codeMode.codeMax, rev_max: result.codeMode.reviewMax,
58
+ verdict: result.codeMode.verdict, next_round: result.next?.round ?? null, next_artifact: result.next?.name ?? null,
59
+ review_artifact: result.codeMode.reviewArtifact, implementation_input: result.codeMode.implementationInput,
60
+ decision_id: result.codeMode.decisionId, decision_evidence: result.codeMode.decisionEvidence, message: result.codeMode.message
61
+ } : { ...result };
62
+ }
63
+ const resolved = resolveTaskRef(taskRef, { repoRoot: options.repoRoot });
64
+ if (!resolved.ok)
65
+ return fail(resolved.code, resolved.message);
66
+ const schema = getArtifactSchema(family);
67
+ const parsed = parseArtifactName(artifact);
68
+ if (!schema || !parsed || parsed.family !== family) {
69
+ return fail('ARTIFACT_IDENTITY_INVALID', `artifact '${artifact}' does not match ${family}`);
70
+ }
71
+ const taskDir = options.artifactDir ?? resolved.taskDir;
72
+ const identity = { taskId: resolved.taskId, taskDir, family, artifact };
73
+ const input = { repoRoot: resolved.repoRoot, taskId: resolved.taskId, taskDir, family: schema.family, artifact };
74
+ if (operation === 'init') {
75
+ const context = resolveArtifactContext(taskRef, family, { repoRoot: resolved.repoRoot });
76
+ if (context.status !== 'ready' || (context.next?.name !== artifact && !hasOpenArtifactRound(fs.readFileSync(resolved.taskMdPath, 'utf8'), family, parsed.round))) {
77
+ return fail('ARTIFACT_INIT_CONTEXT_INVALID', context.error?.message ?? `artifact '${artifact}' is not the next ${family} artifact`);
78
+ }
79
+ return { ...initializeArtifactSkeleton({ ...input, ...(locale ? { locale } : {}) }), ...identity };
80
+ }
81
+ if (operation === 'repair') {
82
+ let content;
83
+ try {
84
+ content = readStableFileSync(path.join(taskDir, artifact), { maxBytes: 1024 * 1024 }).bytes.toString('utf8');
85
+ }
86
+ catch (error) {
87
+ return fail('ARTIFACT_REPAIR_TARGET_INVALID', String(error));
88
+ }
89
+ const inspection = inspectArtifactStructure(content, schema);
90
+ if (!inspection.repair) {
91
+ return { ...fail('ARTIFACT_REPAIR_UNSAFE', inspection.diagnostics.map((item) => `${item.code}: ${item.message}`).join('; ') || 'no deterministic structural repair is available'),
92
+ artifact, family, diagnostics: inspection.diagnostics };
93
+ }
94
+ return { ...applyArtifactRepair({ ...input, expectedSha256, expectedSemanticDigest, operation: inspection.repair }), ...identity };
95
+ }
96
+ if (family !== 'analysis' && family !== 'plan' && family !== 'code') {
97
+ return fail('ARTIFACT_PAYLOAD_INVALID', "finalize-local only supports 'analysis', 'plan', and 'code'");
98
+ }
99
+ return { ...finalizeLocalArtifact({ taskRef, family, artifact, repoRoot: resolved.repoRoot }) };
100
+ }
101
+ //# sourceMappingURL=artifact-command.js.map