@fitlab-ai/agent-infra 0.11.3 → 0.11.5

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 (172) hide show
  1. package/README.md +17 -8
  2. package/README.zh-CN.md +17 -8
  3. package/dist/bin/internal-cli.js +1 -6
  4. package/dist/lib/decide.js +4 -41
  5. package/dist/lib/git/branch-worktree.js +45 -0
  6. package/dist/lib/internal/cli-route-inventory.js +1 -4
  7. package/dist/lib/internal/task-activity.js +7 -40
  8. package/dist/lib/internal/task-artifact.js +1 -1
  9. package/dist/lib/internal/task-event.js +4 -37
  10. package/dist/lib/internal/task-finalization.js +48 -1
  11. package/dist/lib/internal/task-ledger.js +14 -44
  12. package/dist/lib/internal/task-lifecycle.js +1 -1
  13. package/dist/lib/internal/task-operation-registry.js +2 -4
  14. package/dist/lib/internal/task-review.js +5 -37
  15. package/dist/lib/internal/task-verify.js +3 -47
  16. package/dist/lib/internal/task-warning.js +4 -40
  17. package/dist/lib/platform/completion-backfill.js +63 -17
  18. package/dist/lib/platform/pr-summary.js +4 -23
  19. package/dist/lib/platform/verification-sync.js +12 -49
  20. package/dist/lib/sandbox/control/client.js +4 -1
  21. package/dist/lib/sandbox/control/executor.js +12 -4
  22. package/dist/lib/sandbox/control/protocol.js +2 -1
  23. package/dist/lib/sandbox/control/server.js +26 -143
  24. package/dist/lib/sandbox/removal.js +15 -8
  25. package/dist/lib/sandbox/task-cleanup.js +13 -20
  26. package/dist/lib/task/activity-intent.js +1 -2
  27. package/dist/lib/task/artifact-command.js +11 -4
  28. package/dist/lib/task/artifact-lifecycle.js +217 -85
  29. package/dist/lib/task/artifact-operations.js +37 -28
  30. package/dist/lib/task/artifact-receipts.js +4 -1
  31. package/dist/lib/task/artifact-schema.js +8 -7
  32. package/dist/lib/task/artifact-selection.js +25 -0
  33. package/dist/lib/task/capabilities.js +158 -39
  34. package/dist/lib/task/commands/status.js +9 -2
  35. package/dist/lib/task/control-authority.js +12 -168
  36. package/dist/lib/task/decision-intents.js +14 -4
  37. package/dist/lib/task/delivery.js +1 -43
  38. package/dist/lib/task/events.js +68 -73
  39. package/dist/lib/task/finalization-handoff.js +92 -0
  40. package/dist/lib/task/finalization.js +423 -154
  41. package/dist/lib/task/intermediate-cleanup.js +9 -148
  42. package/dist/lib/task/ledger-intents.js +159 -20
  43. package/dist/lib/task/lifecycle-path.js +75 -0
  44. package/dist/lib/task/lifecycle.js +60 -11
  45. package/dist/lib/task/local-artifact-finalization.js +13 -47
  46. package/dist/lib/task/orchestration.js +17 -7
  47. package/dist/lib/task/review-command.js +1 -2
  48. package/dist/lib/task/review-finalization.js +4 -18
  49. package/dist/lib/task/rework-intent.js +70 -4
  50. package/dist/lib/task/snapshot.js +6 -6
  51. package/dist/lib/task/verification-engine.js +25 -30
  52. package/dist/lib/task/verification.js +2 -13
  53. package/dist/lib/task/workflow-warning-intents.js +23 -10
  54. package/dist/lib/task/workspace-snapshot.js +7 -2
  55. package/dist/lib/task/write.js +1 -2
  56. package/dist/lifecycle-build-manifest.json +3 -3
  57. package/lib/decide.ts +5 -35
  58. package/lib/git/branch-worktree.ts +41 -0
  59. package/lib/internal/cli-route-inventory.ts +1 -3
  60. package/lib/internal/task-activity.ts +6 -34
  61. package/lib/internal/task-artifact.ts +1 -1
  62. package/lib/internal/task-event.ts +4 -37
  63. package/lib/internal/task-finalization.ts +47 -1
  64. package/lib/internal/task-ledger.ts +15 -41
  65. package/lib/internal/task-lifecycle.ts +2 -2
  66. package/lib/internal/task-operation-registry.ts +2 -4
  67. package/lib/internal/task-review.ts +5 -31
  68. package/lib/internal/task-verify.ts +3 -39
  69. package/lib/internal/task-warning.ts +3 -32
  70. package/lib/platform/completion-backfill.ts +78 -16
  71. package/lib/platform/pr-summary.ts +4 -25
  72. package/lib/platform/verification-sync.ts +13 -53
  73. package/lib/sandbox/control/client.ts +5 -1
  74. package/lib/sandbox/control/executor.ts +13 -4
  75. package/lib/sandbox/control/protocol.ts +3 -2
  76. package/lib/sandbox/control/server.ts +21 -146
  77. package/lib/sandbox/removal.ts +23 -7
  78. package/lib/sandbox/task-cleanup.ts +12 -20
  79. package/lib/task/activity-intent.ts +1 -2
  80. package/lib/task/artifact-command.ts +14 -4
  81. package/lib/task/artifact-lifecycle.ts +236 -85
  82. package/lib/task/artifact-operations.ts +59 -28
  83. package/lib/task/artifact-receipts.ts +4 -1
  84. package/lib/task/artifact-schema.ts +10 -7
  85. package/lib/task/artifact-selection.ts +53 -0
  86. package/lib/task/capabilities.ts +154 -40
  87. package/lib/task/commands/status.ts +11 -2
  88. package/lib/task/control-authority.ts +17 -189
  89. package/lib/task/decision-intents.ts +11 -4
  90. package/lib/task/delivery.ts +1 -40
  91. package/lib/task/events.ts +73 -74
  92. package/lib/task/finalization-handoff.ts +104 -0
  93. package/lib/task/finalization.ts +388 -122
  94. package/lib/task/intermediate-cleanup.ts +9 -125
  95. package/lib/task/ledger-intents.ts +157 -20
  96. package/lib/task/lifecycle-path.ts +98 -0
  97. package/lib/task/lifecycle.ts +58 -13
  98. package/lib/task/local-artifact-finalization.ts +14 -56
  99. package/lib/task/orchestration.ts +26 -8
  100. package/lib/task/review-command.ts +2 -5
  101. package/lib/task/review-finalization.ts +4 -20
  102. package/lib/task/rework-intent.ts +75 -5
  103. package/lib/task/snapshot.ts +6 -6
  104. package/lib/task/verification-engine.ts +29 -30
  105. package/lib/task/verification.ts +3 -16
  106. package/lib/task/workflow-warning-intents.ts +20 -10
  107. package/lib/task/workspace-snapshot.ts +3 -2
  108. package/lib/task/write.ts +1 -4
  109. package/package.json +1 -1
  110. package/templates/.agents/rules/review-handshake.en.md +4 -4
  111. package/templates/.agents/rules/review-handshake.zh-CN.md +4 -4
  112. package/templates/.agents/skills/analyze-task/SKILL.en.md +21 -5
  113. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +21 -5
  114. package/templates/.agents/skills/code-task/SKILL.en.md +14 -8
  115. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +18 -13
  116. package/templates/.agents/skills/code-task/reference/code-rules.en.md +2 -2
  117. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +2 -2
  118. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +4 -4
  119. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +4 -4
  120. package/templates/.agents/skills/code-task/reference/report-template.en.md +7 -7
  121. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +7 -7
  122. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +2 -2
  123. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +2 -2
  124. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +1 -3
  125. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +1 -3
  126. package/templates/.agents/skills/complete-task/SKILL.en.md +2 -2
  127. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +2 -2
  128. package/templates/.agents/skills/complete-task/config/verify.en.json +2 -2
  129. package/templates/.agents/skills/complete-task/config/verify.zh-CN.json +2 -2
  130. package/templates/.agents/skills/plan-task/SKILL.en.md +13 -10
  131. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +13 -10
  132. package/templates/.agents/skills/review-analysis/SKILL.en.md +5 -1
  133. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +5 -1
  134. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +3 -3
  135. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +3 -3
  136. package/templates/.agents/skills/review-code/SKILL.en.md +5 -1
  137. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +5 -1
  138. package/templates/.agents/skills/review-code/reference/report-template.en.md +3 -3
  139. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +3 -3
  140. package/templates/.agents/skills/review-plan/SKILL.en.md +5 -1
  141. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +5 -1
  142. package/templates/.agents/skills/review-plan/reference/report-template.en.md +3 -3
  143. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +3 -3
  144. package/templates/.agents/skills/review-pr/config/verify.en.json +3 -1
  145. package/templates/.agents/skills/review-pr/config/verify.zh-CN.json +3 -1
  146. package/templates/.agents/skills/review-pr/reference/report-template.en.md +3 -3
  147. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +3 -3
  148. package/templates/.agents/skills/run-manual-validation/config/verify.en.json +2 -2
  149. package/templates/.agents/skills/run-manual-validation/config/verify.zh-CN.json +2 -2
  150. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +2 -2
  151. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +2 -2
  152. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +18 -2
  153. package/templates/.agents/templates/task.en.md +2 -2
  154. package/templates/.agents/templates/task.zh-CN.md +2 -2
  155. package/templates/.agents/workflows/bug-fix.en.yaml +11 -6
  156. package/templates/.agents/workflows/bug-fix.zh-CN.yaml +11 -6
  157. package/templates/.agents/workflows/feature-development.en.yaml +11 -6
  158. package/templates/.agents/workflows/feature-development.zh-CN.yaml +11 -6
  159. package/templates/.agents/workflows/refactoring.en.yaml +11 -6
  160. package/templates/.agents/workflows/refactoring.zh-CN.yaml +11 -6
  161. package/dist/lib/internal/task-override.js +0 -138
  162. package/dist/lib/sandbox/control/finalization-response.js +0 -33
  163. package/dist/lib/task/artifact-recovery.js +0 -476
  164. package/dist/lib/task/artifact-repair-intent.js +0 -181
  165. package/dist/lib/task/guard-override.js +0 -31
  166. package/dist/lib/task/human-override.js +0 -1259
  167. package/lib/internal/task-override.ts +0 -144
  168. package/lib/sandbox/control/finalization-response.ts +0 -35
  169. package/lib/task/artifact-recovery.ts +0 -572
  170. package/lib/task/artifact-repair-intent.ts +0 -227
  171. package/lib/task/guard-override.ts +0 -50
  172. package/lib/task/human-override.ts +0 -1522
@@ -8,6 +8,11 @@
8
8
  name: feature-development
9
9
  description: 开发新功能的端到端工作流。
10
10
 
11
+ lifecycle_paths:
12
+ streamlined: [analysis, code, code-review]
13
+ standard: [analysis, design, code, code-review]
14
+ full: [analysis, analysis-review, design, design-review, code, code-review]
15
+
11
16
  steps:
12
17
  - name: analysis
13
18
  description: 分析功能需求,探索代码库,识别受影响的区域。
@@ -26,7 +31,7 @@ steps:
26
31
  outputs:
27
32
  - name: analysis
28
33
  pattern: "analysis.md | analysis-r{N}.md"
29
- rule: "扫描现有分析产物;首轮创建 analysis.md,后续修订创建 analysis-r{N}.md(N = 当前最高轮次 + 1)"
34
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
30
35
  outputs:
31
36
  - 需求分析报告
32
37
  - 受影响文件列表
@@ -53,7 +58,7 @@ steps:
53
58
  outputs:
54
59
  - name: review-analysis
55
60
  pattern: "review-analysis.md | review-analysis-r{N}.md"
56
- rule: "扫描现有需求分析审查产物;首轮创建 review-analysis.md,后续轮次创建 review-analysis-r{N}.md(N = 当前最高轮次 + 1)"
61
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
57
62
  outputs:
58
63
  - 需求分析审查报告
59
64
  - 待修正问题列表(如有)
@@ -82,7 +87,7 @@ steps:
82
87
  outputs:
83
88
  - name: plan
84
89
  pattern: "plan.md | plan-r{N}.md"
85
- rule: "扫描现有方案产物;首轮创建 plan.md,后续修订创建 plan-r{N}.md(N = 当前最高轮次 + 1)"
90
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
86
91
  outputs:
87
92
  - 技术方案
88
93
  - 接口定义
@@ -109,7 +114,7 @@ steps:
109
114
  outputs:
110
115
  - name: review-plan
111
116
  pattern: "review-plan.md | review-plan-r{N}.md"
112
- rule: "扫描现有方案审查产物;首轮创建 review-plan.md,后续轮次创建 review-plan-r{N}.md(N = 当前最高轮次 + 1)"
117
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
113
118
  outputs:
114
119
  - 技术方案审查报告
115
120
  - 待修正问题列表(如有)
@@ -145,7 +150,7 @@ steps:
145
150
  outputs:
146
151
  - name: code
147
152
  pattern: "code.md | code-r{N}.md"
148
- rule: "扫描现有实现产物;首轮创建 code.md,后续修复或重实现创建 code-r{N}.md(N = 当前最高轮次 + 1)"
153
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
149
154
  outputs:
150
155
  - 包含实现或修复的功能分支
151
156
  - 测试文件
@@ -172,7 +177,7 @@ steps:
172
177
  outputs:
173
178
  - name: review-code
174
179
  pattern: "review-code.md | review-code-r{N}.md"
175
- rule: "扫描现有代码审查产物;首轮创建 review-code.md,后续轮次创建 review-code-r{N}.md(N = 当前最高轮次 + 1)"
180
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
176
181
  outputs:
177
182
  - 代码审查报告
178
183
  - 待修复问题列表
@@ -9,6 +9,11 @@
9
9
  name: refactoring
10
10
  description: Safe and structured workflow for code refactoring.
11
11
 
12
+ lifecycle_paths:
13
+ streamlined: [analysis, code, code-review]
14
+ standard: [analysis, design, code, code-review]
15
+ full: [analysis, analysis-review, design, design-review, code, code-review]
16
+
12
17
  steps:
13
18
  - name: analysis
14
19
  description: Analyze the current code and define the refactoring scope.
@@ -28,7 +33,7 @@ steps:
28
33
  outputs:
29
34
  - name: analysis
30
35
  pattern: "analysis.md | analysis-r{N}.md"
31
- rule: "Scan existing analysis artifacts; create analysis.md for round 1 and analysis-r{N}.md for later revisions (N = current highest round + 1)"
36
+ rule: "Let the task-artifact selector decide: reuse a completed artifact when inputs and substantive results match; create the next round only for new inputs, rework evidence, or result changes"
32
37
  outputs:
33
38
  - Scope analysis with dependency map
34
39
  - Risk assessment
@@ -55,7 +60,7 @@ steps:
55
60
  outputs:
56
61
  - name: review-analysis
57
62
  pattern: "review-analysis.md | review-analysis-r{N}.md"
58
- rule: "Scan existing requirement-analysis review artifacts; create review-analysis.md for round 1 and review-analysis-r{N}.md for later rounds (N = current highest round + 1)"
63
+ rule: "Let the task-artifact selector decide: reuse a completed artifact when inputs and substantive results match; create the next round only for new inputs, rework evidence, or result changes"
59
64
  outputs:
60
65
  - Requirement analysis review report
61
66
  - Findings to fix, if any
@@ -84,7 +89,7 @@ steps:
84
89
  outputs:
85
90
  - name: plan
86
91
  pattern: "plan.md | plan-r{N}.md"
87
- rule: "Scan existing plan artifacts; create plan.md for round 1 and plan-r{N}.md for later revisions (N = current highest round + 1)"
92
+ rule: "Let the task-artifact selector decide: reuse a completed artifact when inputs and substantive results match; create the next round only for new inputs, rework evidence, or result changes"
88
93
  outputs:
89
94
  - Incremental refactoring plan
90
95
  - Prerequisite test list
@@ -111,7 +116,7 @@ steps:
111
116
  outputs:
112
117
  - name: review-plan
113
118
  pattern: "review-plan.md | review-plan-r{N}.md"
114
- rule: "Scan existing plan review artifacts; create review-plan.md for round 1 and review-plan-r{N}.md for later rounds (N = current highest round + 1)"
119
+ rule: "Let the task-artifact selector decide: reuse a completed artifact when inputs and substantive results match; create the next round only for new inputs, rework evidence, or result changes"
115
120
  outputs:
116
121
  - Plan review report
117
122
  - Findings to fix, if any
@@ -148,7 +153,7 @@ steps:
148
153
  outputs:
149
154
  - name: code
150
155
  pattern: "code.md | code-r{N}.md"
151
- rule: "Scan existing code artifacts; create code.md for round 1 and code-r{N}.md for later fixes or reimplementation (N = current highest round + 1)"
156
+ rule: "Let the task-artifact selector decide: reuse a completed artifact when inputs and substantive results match; create the next round only for new inputs, rework evidence, or result changes"
152
157
  outputs:
153
158
  - Refactoring branch with implementation or fixes
154
159
  - Updated or new test files
@@ -177,7 +182,7 @@ steps:
177
182
  outputs:
178
183
  - name: review-code
179
184
  pattern: "review-code.md | review-code-r{N}.md"
180
- rule: "Scan existing code review artifacts; create review-code.md for round 1 and review-code-r{N}.md for later rounds (N = current highest round + 1)"
185
+ rule: "Let the task-artifact selector decide: reuse a completed artifact when inputs and substantive results match; create the next round only for new inputs, rework evidence, or result changes"
181
186
  outputs:
182
187
  - Code review report
183
188
  - Findings list, if any
@@ -8,6 +8,11 @@
8
8
  name: refactoring
9
9
  description: 安全且结构化的代码重构工作流。
10
10
 
11
+ lifecycle_paths:
12
+ streamlined: [analysis, code, code-review]
13
+ standard: [analysis, design, code, code-review]
14
+ full: [analysis, analysis-review, design, design-review, code, code-review]
15
+
11
16
  steps:
12
17
  - name: analysis
13
18
  description: 分析当前代码并确定重构范围。
@@ -27,7 +32,7 @@ steps:
27
32
  outputs:
28
33
  - name: analysis
29
34
  pattern: "analysis.md | analysis-r{N}.md"
30
- rule: "扫描现有分析产物;首轮创建 analysis.md,后续修订创建 analysis-r{N}.md(N = 当前最高轮次 + 1)"
35
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
31
36
  outputs:
32
37
  - 包含依赖关系图的范围分析
33
38
  - 风险评估
@@ -54,7 +59,7 @@ steps:
54
59
  outputs:
55
60
  - name: review-analysis
56
61
  pattern: "review-analysis.md | review-analysis-r{N}.md"
57
- rule: "扫描现有需求分析审查产物;首轮创建 review-analysis.md,后续轮次创建 review-analysis-r{N}.md(N = 当前最高轮次 + 1)"
62
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
58
63
  outputs:
59
64
  - 需求分析审查报告
60
65
  - 待修正问题列表(如有)
@@ -83,7 +88,7 @@ steps:
83
88
  outputs:
84
89
  - name: plan
85
90
  pattern: "plan.md | plan-r{N}.md"
86
- rule: "扫描现有方案产物;首轮创建 plan.md,后续修订创建 plan-r{N}.md(N = 当前最高轮次 + 1)"
91
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
87
92
  outputs:
88
93
  - 包含增量步骤的重构计划
89
94
  - 前置测试列表
@@ -110,7 +115,7 @@ steps:
110
115
  outputs:
111
116
  - name: review-plan
112
117
  pattern: "review-plan.md | review-plan-r{N}.md"
113
- rule: "扫描现有方案审查产物;首轮创建 review-plan.md,后续轮次创建 review-plan-r{N}.md(N = 当前最高轮次 + 1)"
118
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
114
119
  outputs:
115
120
  - 技术方案审查报告
116
121
  - 待修正问题列表(如有)
@@ -147,7 +152,7 @@ steps:
147
152
  outputs:
148
153
  - name: code
149
154
  pattern: "code.md | code-r{N}.md"
150
- rule: "扫描现有实现产物;首轮创建 code.md,后续修复或重实现创建 code-r{N}.md(N = 当前最高轮次 + 1)"
155
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
151
156
  outputs:
152
157
  - 包含变更的重构分支
153
158
  - 更新或新增的测试文件
@@ -176,7 +181,7 @@ steps:
176
181
  outputs:
177
182
  - name: review-code
178
183
  pattern: "review-code.md | review-code-r{N}.md"
179
- rule: "扫描现有代码审查产物;首轮创建 review-code.md,后续轮次创建 review-code-r{N}.md(N = 当前最高轮次 + 1)"
184
+ rule: "由 task-artifact 选择器决定:输入与实质结果未变化时复用已完成产物;仅在新输入、新返工证据或结果变化时创建下一轮"
180
185
  outputs:
181
186
  - 代码审查报告
182
187
  - 问题列表(如有)
@@ -1,138 +0,0 @@
1
- import { consumeHumanOverride, diagnoseHumanOverrideForTask, issueHumanOverride } from '../task/human-override.js';
2
- import { resolveTaskRef } from '../task/resolve-ref.js';
3
- import { TaskExecutionLockError, withTaskExecutionLock } from '../task/task-execution-lock.js';
4
- import { ensureInternalHandlerRoute, internalHandlerRoute } from './cli-route-inventory.js';
5
- const USAGE = `Usage: agent-infra-internal task-override <task-ref> <diagnose|issue|consume> [options]
6
-
7
- Options: --failure-id <id> --target <target> --operator <operator> --reason <reason> --scope <scope>
8
- --intent <lifecycle-intent> --alert-number <N> --issue-number <N> --staging-dir <path>
9
- --expires-at <timestamp> --ticket <ticket-id> --pr-number <N>
10
- `;
11
- const FLAGS = {
12
- '--failure-id': 'failureId',
13
- '--target': 'target',
14
- '--operator': 'operator',
15
- '--reason': 'reason',
16
- '--scope': 'scope',
17
- '--intent': 'intent',
18
- '--failure-digest': 'failureDigest',
19
- '--expires-at': 'expiresAt',
20
- '--ticket': 'ticketId',
21
- '--facts': 'observedFacts',
22
- '--alert-number': 'alertNumber',
23
- '--issue-number': 'issueNumber',
24
- '--pr-number': 'pullRequestNumber',
25
- '--staging-dir': 'stagingDir'
26
- };
27
- function usageFailure(message) {
28
- process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: 'OVERRIDE_PAYLOAD_INVALID', message } })}\n`);
29
- process.stderr.write(USAGE);
30
- process.exitCode = 1;
31
- }
32
- async function taskOverride(args = []) {
33
- if (!ensureInternalHandlerRoute('task-override', args))
34
- return;
35
- if (args[0] === '--help' || args[0] === '-h') {
36
- process.stdout.write(USAGE);
37
- return;
38
- }
39
- const [taskRef, operation] = args;
40
- if (!taskRef || !operation || ![
41
- internalHandlerRoute('task-override', 'diagnose', operation ?? ''),
42
- internalHandlerRoute('task-override', 'issue', operation ?? ''),
43
- internalHandlerRoute('task-override', 'consume', operation ?? '')
44
- ].some(Boolean)) {
45
- usageFailure('task ref and a valid operation are required');
46
- return;
47
- }
48
- const values = { taskRef };
49
- const seen = new Set();
50
- for (let index = 2; index < args.length; index += 1) {
51
- const flag = args[index];
52
- const key = FLAGS[flag];
53
- if (!key) {
54
- usageFailure(`unknown option '${flag}'`);
55
- return;
56
- }
57
- if (seen.has(flag)) {
58
- usageFailure(`duplicate option '${flag}'`);
59
- return;
60
- }
61
- const value = args[++index];
62
- if (value === undefined || value.startsWith('--')) {
63
- usageFailure(`option '${flag}' requires a value`);
64
- return;
65
- }
66
- seen.add(flag);
67
- values[key] = key === 'observedFacts' ? value.split(',').map((fact) => fact.trim()).filter(Boolean)
68
- : key === 'alertNumber' || key === 'issueNumber' || key === 'pullRequestNumber' ? Number(value) : value;
69
- }
70
- const required = {
71
- diagnose: [],
72
- issue: ['failureId', 'target', 'operator', 'reason', 'scope', 'expiresAt'],
73
- consume: ['failureId', 'target', 'scope', 'ticketId']
74
- };
75
- const missing = required[operation].find((key) => values[key] === undefined);
76
- if (missing) {
77
- usageFailure(`${operation} requires '--${missing.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`)}'`);
78
- return;
79
- }
80
- const resolved = resolveTaskRef(taskRef);
81
- if (!resolved.ok) {
82
- process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: resolved.code, message: resolved.message } })}\n`);
83
- process.exitCode = 1;
84
- return;
85
- }
86
- let result;
87
- try {
88
- if (internalHandlerRoute('task-override', 'diagnose', operation)) {
89
- result = await diagnoseHumanOverrideForTask(taskRef, values.failureId ? String(values.failureId) : undefined, values.target ? String(values.target) : undefined);
90
- }
91
- else if (internalHandlerRoute('task-override', 'issue', operation)) {
92
- result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-override.issue', async () => issueHumanOverride({
93
- taskRef,
94
- failureId: String(values.failureId),
95
- target: String(values.target),
96
- operator: String(values.operator),
97
- reason: String(values.reason),
98
- scope: String(values.scope),
99
- expiresAt: String(values.expiresAt),
100
- ...(values.intent ? { intent: String(values.intent) } : {}),
101
- ...(values.alertNumber !== undefined ? { alertNumber: Number(values.alertNumber) } : {}),
102
- ...(values.issueNumber !== undefined ? { issueNumber: Number(values.issueNumber) } : {}),
103
- ...(values.pullRequestNumber !== undefined ? { pullRequestNumber: Number(values.pullRequestNumber) } : {}),
104
- ...(values.stagingDir ? { stagingDir: String(values.stagingDir) } : {}),
105
- ...(values.failureDigest ? { failureDigest: String(values.failureDigest) } : {})
106
- }));
107
- }
108
- else {
109
- result = await withTaskExecutionLock(resolved.repoRoot, resolved.taskId, 'task-override.consume', async () => consumeHumanOverride({
110
- taskRef,
111
- ticketId: String(values.ticketId),
112
- failureId: String(values.failureId),
113
- target: String(values.target),
114
- scope: String(values.scope),
115
- ...(values.intent ? { intent: String(values.intent) } : {}),
116
- ...(values.alertNumber !== undefined ? { alertNumber: Number(values.alertNumber) } : {}),
117
- ...(values.issueNumber !== undefined ? { issueNumber: Number(values.issueNumber) } : {}),
118
- ...(values.pullRequestNumber !== undefined ? { pullRequestNumber: Number(values.pullRequestNumber) } : {}),
119
- ...(values.stagingDir ? { stagingDir: String(values.stagingDir) } : {}),
120
- ...(values.failureDigest ? { failureDigest: String(values.failureDigest) } : {}),
121
- ...(values.observedFacts ? { observedFacts: values.observedFacts } : {})
122
- }));
123
- }
124
- }
125
- catch (cause) {
126
- if (cause instanceof TaskExecutionLockError) {
127
- process.stdout.write(`${JSON.stringify({ status: 'failed', changed: false, error: { code: cause.code, message: cause.message } })}\n`);
128
- process.exitCode = 1;
129
- return;
130
- }
131
- throw cause;
132
- }
133
- process.stdout.write(`${JSON.stringify(result)}\n`);
134
- if (result.status === 'failed')
135
- process.exitCode = 1;
136
- }
137
- export { taskOverride };
138
- //# sourceMappingURL=task-override.js.map
@@ -1,33 +0,0 @@
1
- export function finalizationTerminalResponse(taskId, requestId, receipt) {
2
- const pendingSteps = [
3
- receipt.taskComment === 'pending' ? 'task-comment' : null,
4
- receipt.verification === 'pending' ? 'verification' : null,
5
- receipt.summary === 'pending' ? 'summary' : null
6
- ].filter((step) => step !== null);
7
- const completedSteps = [
8
- 'lifecycle', receipt.taskComment === 'pending' ? null : 'task-comment',
9
- receipt.verification === 'pending' ? null : 'verification', receipt.summary === 'pending' ? null : 'summary'
10
- ]
11
- .filter((step) => step !== null);
12
- const warnings = receipt.warnings
13
- .filter((warning) => warning.status === 'open')
14
- .map(({ status: _status, resolvedAt: _resolvedAt, ...warning }) => warning);
15
- const result = {
16
- status: 'completed', changed: false, taskId,
17
- backfill: { status: 'no-op', changed: false, error: null },
18
- lifecycle: { status: 'no-op', changed: false, error: null },
19
- taskComment: receipt.taskComment === 'pending' ? null : { status: 'no-op', changed: false, error: null },
20
- verification: receipt.verification === 'pending' ? null : { status: 'no-op', changed: false, error: null },
21
- summary: receipt.summary === 'pending' ? null : { status: 'no-op', changed: false, error: null },
22
- completedSteps, pendingSteps,
23
- result: pendingSteps.length > 0 || receipt.warningProjection === 'pending' || warnings.length > 0
24
- ? 'completed_with_warnings' : 'completed',
25
- warnings, error: null
26
- };
27
- return {
28
- version: 2, id: requestId, phase: 'completed', exitCode: 0,
29
- stdout: `${JSON.stringify({ version: 1, status: 'completed', changed: false, accepted: true, result, error: null })}\n`,
30
- stderr: '', error: null
31
- };
32
- }
33
- //# sourceMappingURL=finalization-response.js.map