@fitlab-ai/agent-infra 0.9.1 → 0.9.2

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 (283) hide show
  1. package/README.md +16 -4
  2. package/README.zh-CN.md +16 -4
  3. package/bin/cli.ts +12 -0
  4. package/dist/bin/cli.js +14 -0
  5. package/dist/bin/internal-cli.js +15 -0
  6. package/dist/lib/agent-client.js +163 -0
  7. package/dist/lib/agent-clients/adapter.js +294 -0
  8. package/dist/lib/agent-clients/adapters/claude-code.js +62 -0
  9. package/dist/lib/agent-clients/adapters/codex-sandbox.js +210 -0
  10. package/dist/lib/agent-clients/adapters/codex.js +54 -0
  11. package/dist/lib/agent-clients/adapters/gemini-cli.js +64 -0
  12. package/dist/lib/agent-clients/adapters/index.js +20 -0
  13. package/dist/lib/agent-clients/adapters/opencode.js +64 -0
  14. package/dist/lib/agent-clients/config.js +177 -0
  15. package/dist/lib/agent-clients/custom-tuis.js +99 -0
  16. package/dist/lib/agent-clients/invocation.js +9 -0
  17. package/dist/lib/agent-clients/next-steps.js +38 -0
  18. package/dist/lib/agent-clients/project-assets.js +45 -0
  19. package/dist/lib/agent-clients/reconcile.js +235 -0
  20. package/dist/lib/agent-clients/registry.js +72 -0
  21. package/dist/lib/agent-clients/schema.js +57 -0
  22. package/dist/lib/agent-clients/types.js +29 -0
  23. package/dist/lib/builtin-tuis.js +9 -14
  24. package/dist/lib/defaults.json +85 -73
  25. package/dist/lib/git/review-snapshot.js +25 -10
  26. package/dist/lib/git/reviewed-commit-equivalence.js +110 -0
  27. package/dist/lib/init.js +47 -91
  28. package/dist/lib/internal/agent-client.js +117 -0
  29. package/dist/lib/internal/git-workflow.js +1 -1
  30. package/dist/lib/internal/release-workflow.js +71 -16
  31. package/dist/lib/internal/task-orchestration.js +151 -0
  32. package/dist/lib/internal/task-review.js +65 -0
  33. package/dist/lib/merge.js +2 -1
  34. package/dist/lib/platform/adapters.js +38 -1
  35. package/dist/lib/platform/change-request-git-evidence.js +113 -0
  36. package/dist/lib/platform/merged-pr-equivalence.js +41 -11
  37. package/dist/lib/platform/pr-checks.js +38 -10
  38. package/dist/lib/platform/pull-requests.js +110 -6
  39. package/dist/lib/platform/releases.js +1 -1
  40. package/dist/lib/platform/verification-required.js +8 -10
  41. package/dist/lib/prompt.js +15 -3
  42. package/dist/lib/release/channels.js +4 -1
  43. package/dist/lib/release/workflow.js +4 -2
  44. package/dist/lib/remove-dir.js +25 -0
  45. package/dist/lib/run/tui.js +8 -2
  46. package/dist/lib/sandbox/agent-client-reconciler.js +234 -0
  47. package/dist/lib/sandbox/clipboard/linux.js +2 -1
  48. package/dist/lib/sandbox/commands/create.js +76 -180
  49. package/dist/lib/sandbox/commands/enter.js +17 -1
  50. package/dist/lib/sandbox/commands/prune.js +2 -2
  51. package/dist/lib/sandbox/commands/rm.js +3 -2
  52. package/dist/lib/sandbox/config.js +21 -4
  53. package/dist/lib/sandbox/constants.js +3 -0
  54. package/dist/lib/sandbox/dockerfile.js +2 -1
  55. package/dist/lib/sandbox/managed-fs.js +10 -5
  56. package/dist/lib/sandbox/recovery.js +52 -36
  57. package/dist/lib/sandbox/shell.js +1 -1
  58. package/dist/lib/sandbox/tool-types.js +8 -0
  59. package/dist/lib/sandbox/tools.js +2 -126
  60. package/dist/lib/task/artifact-lifecycle.js +1 -49
  61. package/dist/lib/task/commands/decisions.js +50 -20
  62. package/dist/lib/task/delegation-receipts.js +107 -0
  63. package/dist/lib/task/events.js +100 -1
  64. package/dist/lib/task/orchestration.js +420 -0
  65. package/dist/lib/task/review-artifacts.js +143 -59
  66. package/dist/lib/task/review-finalization.js +166 -0
  67. package/dist/lib/task/review-fingerprint.js +4 -0
  68. package/dist/lib/task/verification-checks.js +2 -1
  69. package/dist/lib/task/verification-engine.js +156 -28
  70. package/dist/lib/task/verification-review.js +1 -1
  71. package/dist/lib/task/verification.js +3 -1
  72. package/dist/lib/task/workspace-snapshot.js +34 -0
  73. package/dist/lib/update.js +42 -161
  74. package/lib/agent-client.ts +214 -0
  75. package/lib/agent-clients/adapter.ts +461 -0
  76. package/lib/agent-clients/adapters/claude-code.ts +70 -0
  77. package/lib/agent-clients/adapters/codex-sandbox.ts +245 -0
  78. package/lib/agent-clients/adapters/codex.ts +58 -0
  79. package/lib/agent-clients/adapters/gemini-cli.ts +65 -0
  80. package/lib/agent-clients/adapters/index.ts +27 -0
  81. package/lib/agent-clients/adapters/opencode.ts +66 -0
  82. package/lib/agent-clients/config.ts +278 -0
  83. package/lib/agent-clients/custom-tuis.ts +149 -0
  84. package/lib/agent-clients/invocation.ts +19 -0
  85. package/lib/agent-clients/next-steps.ts +72 -0
  86. package/lib/agent-clients/project-assets.ts +96 -0
  87. package/lib/agent-clients/reconcile.ts +324 -0
  88. package/lib/agent-clients/registry.ts +144 -0
  89. package/lib/agent-clients/schema.ts +62 -0
  90. package/lib/agent-clients/types.ts +78 -0
  91. package/lib/benchmark/schemas/v1.0.0/case-manifest.schema.json +120 -0
  92. package/lib/benchmark/schemas/v1.0.0/common.schema.json +109 -0
  93. package/lib/benchmark/schemas/v1.0.0/grader-result.schema.json +160 -0
  94. package/lib/benchmark/schemas/v1.0.0/run-manifest.schema.json +122 -0
  95. package/lib/benchmark/schemas/v1.0.0/subject.schema.json +227 -0
  96. package/lib/builtin-tuis.ts +16 -15
  97. package/lib/defaults.json +24 -12
  98. package/lib/git/review-snapshot.ts +39 -9
  99. package/lib/git/reviewed-commit-equivalence.ts +135 -0
  100. package/lib/init.ts +53 -121
  101. package/lib/internal/agent-client.ts +131 -0
  102. package/lib/internal/git-workflow.ts +1 -1
  103. package/lib/internal/release-workflow.ts +68 -16
  104. package/lib/internal/task-orchestration.ts +132 -0
  105. package/lib/internal/task-review.ts +65 -0
  106. package/lib/merge.ts +2 -1
  107. package/lib/platform/adapters.ts +142 -3
  108. package/lib/platform/change-request-git-evidence.ts +159 -0
  109. package/lib/platform/merged-pr-equivalence.ts +51 -14
  110. package/lib/platform/pr-checks.ts +50 -22
  111. package/lib/platform/pull-requests.ts +134 -25
  112. package/lib/platform/releases.ts +1 -1
  113. package/lib/platform/verification-required.ts +12 -10
  114. package/lib/prompt.ts +16 -3
  115. package/lib/release/channels.ts +4 -1
  116. package/lib/release/workflow.ts +4 -3
  117. package/lib/remove-dir.ts +28 -0
  118. package/lib/run/tui.ts +9 -1
  119. package/lib/sandbox/agent-client-reconciler.ts +378 -0
  120. package/lib/sandbox/clipboard/linux.ts +2 -1
  121. package/lib/sandbox/commands/create.ts +111 -192
  122. package/lib/sandbox/commands/enter.ts +23 -1
  123. package/lib/sandbox/commands/prune.ts +2 -2
  124. package/lib/sandbox/commands/rm.ts +3 -2
  125. package/lib/sandbox/config.ts +31 -4
  126. package/lib/sandbox/constants.ts +6 -0
  127. package/lib/sandbox/dockerfile.ts +2 -1
  128. package/lib/sandbox/managed-fs.ts +18 -5
  129. package/lib/sandbox/recovery.ts +98 -67
  130. package/lib/sandbox/shell.ts +1 -1
  131. package/lib/sandbox/tool-types.ts +143 -0
  132. package/lib/sandbox/tools.ts +5 -157
  133. package/lib/task/artifact-lifecycle.ts +1 -38
  134. package/lib/task/commands/decisions.ts +53 -20
  135. package/lib/task/delegation-receipts.ts +170 -0
  136. package/lib/task/events.ts +110 -2
  137. package/lib/task/orchestration.ts +543 -0
  138. package/lib/task/review-artifacts.ts +201 -69
  139. package/lib/task/review-finalization.ts +275 -0
  140. package/lib/task/review-fingerprint.ts +5 -0
  141. package/lib/task/verification-checks.ts +2 -1
  142. package/lib/task/verification-engine.ts +177 -28
  143. package/lib/task/verification-review.ts +1 -0
  144. package/lib/task/verification.ts +5 -2
  145. package/lib/task/workspace-snapshot.ts +36 -0
  146. package/lib/update.ts +48 -184
  147. package/package.json +2 -2
  148. package/templates/.agents/README.en.md +21 -20
  149. package/templates/.agents/README.zh-CN.md +21 -20
  150. package/templates/.agents/hooks/lifecycle-delegation.js +64 -0
  151. package/templates/.agents/rules/README.en.md +2 -0
  152. package/templates/.agents/rules/README.zh-CN.md +2 -0
  153. package/templates/.agents/rules/commit-and-pr.en.md +1 -0
  154. package/templates/.agents/rules/commit-and-pr.zh-CN.md +1 -0
  155. package/templates/.agents/rules/human-decision-context.en.md +14 -12
  156. package/templates/.agents/rules/human-decision-context.zh-CN.md +14 -12
  157. package/templates/.agents/rules/lifecycle-orchestration.en.md +21 -0
  158. package/templates/.agents/rules/lifecycle-orchestration.zh-CN.md +21 -0
  159. package/templates/.agents/rules/next-step-output.en.md +16 -0
  160. package/templates/.agents/rules/next-step-output.zh-CN.md +16 -0
  161. package/templates/.agents/rules/no-mid-flow-questions.en.md +2 -0
  162. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +2 -0
  163. package/templates/.agents/rules/release-commands.github.en.md +11 -5
  164. package/templates/.agents/rules/release-commands.github.zh-CN.md +11 -5
  165. package/templates/.agents/rules/review-handshake.en.md +4 -4
  166. package/templates/.agents/rules/review-handshake.zh-CN.md +4 -4
  167. package/templates/.agents/rules/review-method.en.md +113 -0
  168. package/templates/.agents/rules/review-method.zh-CN.md +98 -0
  169. package/templates/.agents/skills/analyze-task/SKILL.en.md +5 -5
  170. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +5 -5
  171. package/templates/.agents/skills/block-task/SKILL.en.md +4 -4
  172. package/templates/.agents/skills/block-task/SKILL.zh-CN.md +4 -4
  173. package/templates/.agents/skills/cancel-task/SKILL.en.md +4 -4
  174. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +5 -5
  175. package/templates/.agents/skills/check-task/SKILL.en.md +16 -16
  176. package/templates/.agents/skills/check-task/SKILL.zh-CN.md +16 -16
  177. package/templates/.agents/skills/close-codescan/SKILL.en.md +4 -4
  178. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +4 -4
  179. package/templates/.agents/skills/close-dependabot/SKILL.en.md +4 -4
  180. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +4 -4
  181. package/templates/.agents/skills/code-task/SKILL.en.md +1 -1
  182. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +2 -2
  183. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +14 -16
  184. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +14 -16
  185. package/templates/.agents/skills/code-task/reference/output-template.en.md +3 -3
  186. package/templates/.agents/skills/code-task/reference/output-template.zh-CN.md +3 -3
  187. package/templates/.agents/skills/commit/SKILL.en.md +11 -1
  188. package/templates/.agents/skills/commit/SKILL.zh-CN.md +11 -1
  189. package/templates/.agents/skills/commit/reference/task-status-update.en.md +24 -28
  190. package/templates/.agents/skills/commit/reference/task-status-update.zh-CN.md +24 -28
  191. package/templates/.agents/skills/complete-task/SKILL.en.md +2 -2
  192. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +2 -2
  193. package/templates/.agents/skills/create-pr/SKILL.en.md +10 -10
  194. package/templates/.agents/skills/create-pr/SKILL.zh-CN.md +10 -10
  195. package/templates/.agents/skills/create-pr/reference/pr-body-template.en.md +3 -3
  196. package/templates/.agents/skills/create-pr/reference/pr-body-template.zh-CN.md +3 -3
  197. package/templates/.agents/skills/create-task/SKILL.en.md +11 -11
  198. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +11 -11
  199. package/templates/.agents/skills/import-codescan/SKILL.en.md +5 -5
  200. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +5 -5
  201. package/templates/.agents/skills/import-dependabot/SKILL.en.md +5 -5
  202. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +5 -5
  203. package/templates/.agents/skills/import-issue/SKILL.en.md +5 -5
  204. package/templates/.agents/skills/import-issue/SKILL.zh-CN.md +5 -5
  205. package/templates/.agents/skills/init-labels/SKILL.en.md +4 -4
  206. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +4 -4
  207. package/templates/.agents/skills/init-milestones/SKILL.en.md +4 -4
  208. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +4 -4
  209. package/templates/.agents/skills/plan-task/SKILL.en.md +5 -5
  210. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +5 -5
  211. package/templates/.agents/skills/refine-title/SKILL.en.md +1 -1
  212. package/templates/.agents/skills/refine-title/SKILL.zh-CN.md +1 -1
  213. package/templates/.agents/skills/release/SKILL.en.md +1 -1
  214. package/templates/.agents/skills/review-analysis/SKILL.en.md +13 -2
  215. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -3
  216. package/templates/.agents/skills/review-analysis/config/verify.en.json +6 -0
  217. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +6 -0
  218. package/templates/.agents/skills/review-analysis/reference/output-templates.en.md +13 -15
  219. package/templates/.agents/skills/review-analysis/reference/output-templates.zh-CN.md +13 -15
  220. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +51 -5
  221. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +52 -6
  222. package/templates/.agents/skills/review-analysis/reference/review-criteria.en.md +25 -22
  223. package/templates/.agents/skills/review-analysis/reference/review-criteria.zh-CN.md +25 -22
  224. package/templates/.agents/skills/review-code/SKILL.en.md +28 -8
  225. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +28 -8
  226. package/templates/.agents/skills/review-code/config/verify.en.json +7 -0
  227. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +7 -0
  228. package/templates/.agents/skills/review-code/reference/concurrency-risks.en.md +25 -0
  229. package/templates/.agents/skills/review-code/reference/concurrency-risks.zh-CN.md +25 -0
  230. package/templates/.agents/skills/review-code/reference/cross-platform-risks.en.md +27 -0
  231. package/templates/.agents/skills/review-code/reference/cross-platform-risks.zh-CN.md +27 -0
  232. package/templates/.agents/skills/review-code/reference/documentation-antipatterns.en.md +13 -0
  233. package/templates/.agents/skills/review-code/reference/documentation-antipatterns.zh-CN.md +13 -0
  234. package/templates/.agents/skills/review-code/reference/migration-risks.en.md +25 -0
  235. package/templates/.agents/skills/review-code/reference/migration-risks.zh-CN.md +25 -0
  236. package/templates/.agents/skills/review-code/reference/output-templates.en.md +22 -24
  237. package/templates/.agents/skills/review-code/reference/output-templates.zh-CN.md +22 -24
  238. package/templates/.agents/skills/review-code/reference/report-template.en.md +54 -7
  239. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +54 -7
  240. package/templates/.agents/skills/review-code/reference/review-criteria.en.md +29 -24
  241. package/templates/.agents/skills/review-code/reference/review-criteria.zh-CN.md +29 -24
  242. package/templates/.agents/skills/review-code/reference/security-risks.en.md +25 -0
  243. package/templates/.agents/skills/review-code/reference/security-risks.zh-CN.md +25 -0
  244. package/templates/.agents/skills/review-plan/SKILL.en.md +13 -2
  245. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -3
  246. package/templates/.agents/skills/review-plan/config/verify.en.json +6 -0
  247. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +6 -0
  248. package/templates/.agents/skills/review-plan/reference/output-templates.en.md +13 -15
  249. package/templates/.agents/skills/review-plan/reference/output-templates.zh-CN.md +13 -15
  250. package/templates/.agents/skills/review-plan/reference/report-template.en.md +61 -5
  251. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +61 -5
  252. package/templates/.agents/skills/review-plan/reference/review-criteria.en.md +21 -24
  253. package/templates/.agents/skills/review-plan/reference/review-criteria.zh-CN.md +21 -24
  254. package/templates/.agents/skills/run-task/SKILL.en.md +22 -0
  255. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +22 -0
  256. package/templates/.agents/skills/run-task/config/verify.en.json +9 -0
  257. package/templates/.agents/skills/run-task/config/verify.zh-CN.json +9 -0
  258. package/templates/.agents/skills/test/SKILL.en.md +4 -4
  259. package/templates/.agents/skills/test/SKILL.zh-CN.md +4 -4
  260. package/templates/.agents/skills/test-integration/SKILL.en.md +4 -4
  261. package/templates/.agents/skills/test-integration/SKILL.zh-CN.md +4 -4
  262. package/templates/.agents/skills/update-agent-infra/SKILL.en.md +5 -5
  263. package/templates/.agents/skills/update-agent-infra/SKILL.zh-CN.md +5 -5
  264. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +647 -203
  265. package/templates/.agents/skills/upgrade-dependency/SKILL.en.md +4 -4
  266. package/templates/.agents/skills/upgrade-dependency/SKILL.zh-CN.md +4 -4
  267. package/templates/.agents/skills/watch-pr/SKILL.en.md +8 -8
  268. package/templates/.agents/skills/watch-pr/SKILL.zh-CN.md +8 -8
  269. package/templates/.claude/agents/agent-infra-lifecycle-executor.en.md +6 -0
  270. package/templates/.claude/agents/agent-infra-lifecycle-executor.zh-CN.md +6 -0
  271. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.en.md +6 -0
  272. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.zh-CN.md +6 -0
  273. package/templates/.claude/commands/run-task.en.md +8 -0
  274. package/templates/.claude/commands/run-task.zh-CN.md +8 -0
  275. package/templates/.claude/settings.json +24 -0
  276. package/templates/.codex/agents/agent-infra-lifecycle-executor.en.toml +3 -0
  277. package/templates/.codex/agents/agent-infra-lifecycle-executor.zh-CN.toml +3 -0
  278. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.en.toml +3 -0
  279. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.zh-CN.toml +3 -0
  280. package/templates/.gemini/commands/_project_/run-task.en.toml +8 -0
  281. package/templates/.gemini/commands/_project_/run-task.zh-CN.toml +8 -0
  282. package/templates/.opencode/commands/run-task.en.md +11 -0
  283. package/templates/.opencode/commands/run-task.zh-CN.md +11 -0
@@ -0,0 +1,227 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://github.com/fitlab-ai/agent-infra/lib/benchmark/schemas/v1.0.0/subject.schema.json",
4
+ "title": "agent-infra benchmark subject",
5
+ "description": "The evaluated Agent configuration and its declared runtime conditions.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "contractVersion",
10
+ "subjectId",
11
+ "model",
12
+ "agentClient",
13
+ "executionMode",
14
+ "tools",
15
+ "permissions",
16
+ "networkPolicy"
17
+ ],
18
+ "properties": {
19
+ "contractVersion": {
20
+ "$ref": "common.schema.json#/definitions/contractVersion"
21
+ },
22
+ "subjectId": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ },
26
+ "model": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": [
30
+ "provider",
31
+ "modelId"
32
+ ],
33
+ "properties": {
34
+ "provider": {
35
+ "type": "string",
36
+ "minLength": 1
37
+ },
38
+ "modelId": {
39
+ "type": "string",
40
+ "minLength": 1
41
+ },
42
+ "version": {
43
+ "type": "string",
44
+ "minLength": 1
45
+ }
46
+ }
47
+ },
48
+ "agentClient": {
49
+ "type": "object",
50
+ "additionalProperties": false,
51
+ "required": [
52
+ "clientId",
53
+ "version"
54
+ ],
55
+ "properties": {
56
+ "clientId": {
57
+ "type": "string",
58
+ "minLength": 1
59
+ },
60
+ "version": {
61
+ "type": "string",
62
+ "minLength": 1
63
+ }
64
+ }
65
+ },
66
+ "executionMode": {
67
+ "enum": [
68
+ "direct-repair",
69
+ "agent-infra-workflow",
70
+ "custom"
71
+ ]
72
+ },
73
+ "workflowRef": {
74
+ "type": "string",
75
+ "minLength": 1
76
+ },
77
+ "tools": {
78
+ "type": "array",
79
+ "items": {
80
+ "type": "object",
81
+ "additionalProperties": false,
82
+ "required": [
83
+ "toolId",
84
+ "version"
85
+ ],
86
+ "properties": {
87
+ "toolId": {
88
+ "type": "string",
89
+ "minLength": 1
90
+ },
91
+ "version": {
92
+ "type": "string",
93
+ "minLength": 1
94
+ },
95
+ "capabilities": {
96
+ "type": "array",
97
+ "items": {
98
+ "type": "string",
99
+ "minLength": 1
100
+ },
101
+ "uniqueItems": true
102
+ }
103
+ }
104
+ }
105
+ },
106
+ "permissions": {
107
+ "type": "object",
108
+ "additionalProperties": false,
109
+ "required": [
110
+ "filesystem",
111
+ "credentials"
112
+ ],
113
+ "properties": {
114
+ "filesystem": {
115
+ "enum": [
116
+ "challenge-workspace-write",
117
+ "challenge-workspace-read-only",
118
+ "none"
119
+ ]
120
+ },
121
+ "credentials": {
122
+ "enum": [
123
+ "none",
124
+ "scoped"
125
+ ]
126
+ },
127
+ "commands": {
128
+ "type": "array",
129
+ "items": {
130
+ "type": "string",
131
+ "minLength": 1
132
+ },
133
+ "uniqueItems": true
134
+ }
135
+ }
136
+ },
137
+ "networkPolicy": {
138
+ "type": "object",
139
+ "additionalProperties": false,
140
+ "required": [
141
+ "mode"
142
+ ],
143
+ "properties": {
144
+ "mode": {
145
+ "enum": [
146
+ "none",
147
+ "allowlist",
148
+ "unrestricted"
149
+ ]
150
+ },
151
+ "allowlist": {
152
+ "type": "array",
153
+ "items": {
154
+ "type": "string",
155
+ "minLength": 1
156
+ },
157
+ "minItems": 1,
158
+ "uniqueItems": true
159
+ },
160
+ "enforcementEvidence": {
161
+ "type": "string",
162
+ "minLength": 1
163
+ }
164
+ },
165
+ "allOf": [
166
+ {
167
+ "if": {
168
+ "properties": {
169
+ "mode": {
170
+ "const": "allowlist"
171
+ }
172
+ }
173
+ },
174
+ "then": {
175
+ "required": [
176
+ "allowlist"
177
+ ]
178
+ }
179
+ }
180
+ ]
181
+ },
182
+ "budget": {
183
+ "type": "object",
184
+ "additionalProperties": false,
185
+ "properties": {
186
+ "timeLimitMs": {
187
+ "type": "integer",
188
+ "minimum": 1
189
+ },
190
+ "tokenLimit": {
191
+ "type": "integer",
192
+ "minimum": 1
193
+ },
194
+ "costLimit": {
195
+ "type": "number",
196
+ "minimum": 0
197
+ },
198
+ "costCurrency": {
199
+ "type": "string",
200
+ "minLength": 1
201
+ }
202
+ }
203
+ },
204
+ "extensions": {
205
+ "$ref": "common.schema.json#/definitions/extensions"
206
+ }
207
+ },
208
+ "allOf": [
209
+ {
210
+ "if": {
211
+ "properties": {
212
+ "executionMode": {
213
+ "enum": [
214
+ "agent-infra-workflow",
215
+ "custom"
216
+ ]
217
+ }
218
+ }
219
+ },
220
+ "then": {
221
+ "required": [
222
+ "workflowRef"
223
+ ]
224
+ }
225
+ }
226
+ ]
227
+ }
@@ -1,22 +1,23 @@
1
- const BUILTIN_TUI_IDS = ['claude-code', 'codex', 'gemini-cli', 'opencode'] as const;
2
- type BuiltinTUIId = (typeof BUILTIN_TUI_IDS)[number];
1
+ import { AGENT_CLIENT_IDS, isAgentClientId } from './agent-clients/types.ts';
2
+ import type { AgentClientId } from './agent-clients/types.ts';
3
+ import { listAgentClientAdapters } from './agent-clients/registry.ts';
3
4
 
4
- const BUILTIN_TUI_DISPLAY: Record<BuiltinTUIId, string> = {
5
- 'claude-code': 'Claude Code',
6
- 'codex': 'Codex',
7
- 'gemini-cli': 'Gemini CLI',
8
- 'opencode': 'OpenCode'
9
- };
5
+ const BUILTIN_TUI_IDS = AGENT_CLIENT_IDS;
6
+ type BuiltinTUIId = AgentClientId;
10
7
 
11
- const BUILTIN_TUI_OWNED_PATH_PREFIXES: Record<BuiltinTUIId, string[]> = {
12
- 'claude-code': ['.claude/'],
13
- 'codex': ['.codex/'],
14
- 'gemini-cli': ['.gemini/'],
15
- 'opencode': ['.opencode/']
16
- };
8
+ const BUILTIN_TUI_DISPLAY = Object.fromEntries(
9
+ listAgentClientAdapters().map((adapter) => [adapter.id, adapter.displayName])
10
+ ) as Record<BuiltinTUIId, string>;
11
+
12
+ const BUILTIN_TUI_OWNED_PATH_PREFIXES = Object.fromEntries(
13
+ listAgentClientAdapters().map((adapter) => [
14
+ adapter.id,
15
+ [...adapter.project.ownedPathPrefixes]
16
+ ])
17
+ ) as Record<BuiltinTUIId, string[]>;
17
18
 
18
19
  function isBuiltinTUIId(value: unknown): value is BuiltinTUIId {
19
- return typeof value === 'string' && (BUILTIN_TUI_IDS as readonly string[]).includes(value);
20
+ return isAgentClientId(value);
20
21
  }
21
22
 
22
23
  function resolveEnabledTUIs(value: unknown): Set<BuiltinTUIId> {
package/lib/defaults.json CHANGED
@@ -2,17 +2,35 @@
2
2
  "platform": {
3
3
  "type": "github"
4
4
  },
5
+ "agentClients": [
6
+ {
7
+ "id": "claude-code",
8
+ "enabled": true,
9
+ "installInSandbox": true
10
+ },
11
+ {
12
+ "id": "codex",
13
+ "enabled": true,
14
+ "installInSandbox": true
15
+ },
16
+ {
17
+ "id": "gemini-cli",
18
+ "enabled": true,
19
+ "installInSandbox": true
20
+ },
21
+ {
22
+ "id": "opencode",
23
+ "enabled": true,
24
+ "installInSandbox": true
25
+ }
26
+ ],
5
27
  "sandbox": {
6
28
  "engine": null,
7
29
  "runtimes": [
8
30
  "node22"
9
31
  ],
10
32
  "tools": [
11
- "agent-infra",
12
- "claude-code",
13
- "codex",
14
- "gemini-cli",
15
- "opencode"
33
+ "agent-infra"
16
34
  ],
17
35
  "refreshIntervalDays": 7,
18
36
  "dockerfile": null,
@@ -39,16 +57,12 @@
39
57
  ".agents/templates/",
40
58
  ".agents/workflows/",
41
59
  ".agents/workspace/README.md",
42
- ".claude/commands/",
43
- ".codex/hooks.json",
44
- ".gemini/commands/",
45
60
  ".git-hooks/check-large-files.cjs",
46
61
  ".git-hooks/check-version-format.sh",
47
62
  ".github/scripts/",
48
63
  ".github/workflows/metadata-sync.yml",
49
64
  ".github/workflows/pr-label.yml",
50
- ".github/workflows/status-label.yml",
51
- ".opencode/commands/"
65
+ ".github/workflows/status-label.yml"
52
66
  ],
53
67
  "guardedManaged": [
54
68
  ".github/workflows/metadata-sync.yml",
@@ -67,8 +81,6 @@
67
81
  ".agents/skills/test-integration/SKILL.*",
68
82
  ".agents/skills/test/SKILL.*",
69
83
  ".agents/skills/upgrade-dependency/SKILL.*",
70
- ".claude/settings.json",
71
- ".gemini/settings.json",
72
84
  ".git-hooks/pre-commit",
73
85
  ".gitignore"
74
86
  ],
@@ -40,21 +40,51 @@ function projectStaged(repoRoot: string, baseline: string, globs: string[], env:
40
40
  }
41
41
  }
42
42
 
43
- function snapshotReview(input: { cwd: string; mode: 'worktree' | 'staged'; baseline: string; globs: string[] }) {
44
- const repoRoot = String(git(input.cwd, ['rev-parse', '--show-toplevel'])).trim();
45
- const resolvedBaseline = String(git(repoRoot, ['rev-parse', '--verify', `${input.baseline}^{commit}`])).trim();
46
- return withTemporaryIndex(repoRoot, resolvedBaseline, (env) => {
47
- if (input.mode === 'worktree') projectWorktree(repoRoot, resolvedBaseline, input.globs, env);
48
- else projectStaged(repoRoot, resolvedBaseline, input.globs, env);
49
- const diff = execFileSync('git', ['diff', '--cached', '--binary', resolvedBaseline, '--', ...input.globs], { cwd: repoRoot, encoding: 'buffer', env });
43
+ function projectSnapshot(
44
+ repoRoot: string,
45
+ mode: 'worktree' | 'staged',
46
+ baseline: string,
47
+ globs: string[]
48
+ ) {
49
+ return withTemporaryIndex(repoRoot, baseline, (env) => {
50
+ if (mode === 'worktree') projectWorktree(repoRoot, baseline, globs, env);
51
+ else projectStaged(repoRoot, baseline, globs, env);
50
52
  return {
51
- baseline: resolvedBaseline,
52
- fingerprint: `sha256:${crypto.createHash('sha256').update(diff).digest('hex')}`,
53
+ diff: execFileSync('git', ['diff', '--cached', '--binary', baseline, '--', ...globs], {
54
+ cwd: repoRoot,
55
+ encoding: 'buffer',
56
+ env
57
+ }),
53
58
  tree: String(git(repoRoot, ['write-tree'], { env })).trim()
54
59
  };
55
60
  });
56
61
  }
57
62
 
63
+ function snapshotReview(input: {
64
+ cwd: string;
65
+ mode: 'worktree' | 'staged';
66
+ baseline: string;
67
+ diffBase?: string;
68
+ globs: string[];
69
+ }) {
70
+ const repoRoot = String(git(input.cwd, ['rev-parse', '--show-toplevel'])).trim();
71
+ const resolvedBaseline = String(git(repoRoot, ['rev-parse', '--verify', `${input.baseline}^{commit}`])).trim();
72
+ const resolvedDiffBase = String(git(
73
+ repoRoot,
74
+ ['rev-parse', '--verify', `${input.diffBase || resolvedBaseline}^{commit}`]
75
+ )).trim();
76
+ const reviewed = projectSnapshot(repoRoot, input.mode, resolvedBaseline, input.globs);
77
+ const fingerprintSource = resolvedDiffBase === resolvedBaseline
78
+ ? reviewed.diff
79
+ : projectSnapshot(repoRoot, input.mode, resolvedDiffBase, input.globs).diff;
80
+ return {
81
+ baseline: resolvedBaseline,
82
+ diffBase: resolvedDiffBase,
83
+ fingerprint: `sha256:${crypto.createHash('sha256').update(fingerprintSource).digest('hex')}`,
84
+ tree: reviewed.tree
85
+ };
86
+ }
87
+
58
88
  function compareReviewTrees(input: { cwd: string; expected: string; actual: string }) {
59
89
  const repoRoot = String(git(input.cwd, ['rev-parse', '--show-toplevel'])).trim();
60
90
  git(repoRoot, ['rev-parse', '--verify', `${input.expected}^{tree}`]);
@@ -0,0 +1,135 @@
1
+ import { execFileSync, spawnSync } from "node:child_process";
2
+
3
+ const SHA_PATTERN = /^[0-9a-f]{40}$/i;
4
+
5
+ type LocalReviewedCommitRelation =
6
+ | {
7
+ status: "local-equivalent";
8
+ reviewedHead: string;
9
+ rewrittenCommit: string;
10
+ }
11
+ | {
12
+ status: "failed" | "blocked";
13
+ code: string;
14
+ message: string;
15
+ };
16
+
17
+ function git(cwd: string, args: string[]): string {
18
+ return execFileSync("git", args, { cwd, encoding: "utf8", maxBuffer: 32 * 1024 * 1024 });
19
+ }
20
+
21
+ function commitExists(gitRoot: string, sha: string): boolean {
22
+ try {
23
+ git(gitRoot, ["cat-file", "-e", `${sha}^{commit}`]);
24
+ return true;
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ function isAncestor(gitRoot: string, ancestor: string, descendant: string): boolean | null {
31
+ const result = spawnSync("git", ["merge-base", "--is-ancestor", ancestor, descendant], {
32
+ cwd: gitRoot,
33
+ encoding: "utf8"
34
+ });
35
+ if (result.status === 0) return true;
36
+ if (result.status === 1) return false;
37
+ return null;
38
+ }
39
+
40
+ export function resolveLocalReviewedCommitRelation(input: {
41
+ gitRoot: string;
42
+ localHead: string;
43
+ lastReviewedCommit: string;
44
+ rewrittenCommit: string;
45
+ pathspecs: string[];
46
+ }): LocalReviewedCommitRelation {
47
+ const { gitRoot, localHead, lastReviewedCommit, rewrittenCommit, pathspecs } = input;
48
+ const shas = [localHead, lastReviewedCommit, rewrittenCommit];
49
+ if (shas.some((sha) => !SHA_PATTERN.test(sha) || !commitExists(gitRoot, sha))) {
50
+ return {
51
+ status: "blocked",
52
+ code: "LOCAL_REWRITE_OBJECT_MISSING",
53
+ message: "Required local rewrite Git objects are unavailable"
54
+ };
55
+ }
56
+
57
+ const ancestor = isAncestor(gitRoot, rewrittenCommit, localHead);
58
+ if (ancestor === false) {
59
+ return {
60
+ status: "failed",
61
+ code: "LOCAL_REWRITE_TOPOLOGY_INVALID",
62
+ message: "Local rewritten commit is not in the current HEAD history"
63
+ };
64
+ }
65
+ if (ancestor === null) {
66
+ return {
67
+ status: "blocked",
68
+ code: "LOCAL_REWRITE_GIT_EVIDENCE_UNAVAILABLE",
69
+ message: "Unable to verify local rewrite ancestry"
70
+ };
71
+ }
72
+
73
+ try {
74
+ const parents = git(gitRoot, ["rev-parse", `${rewrittenCommit}^@`])
75
+ .split(/\r?\n/)
76
+ .filter((line) => line.trim() !== "");
77
+ if (parents.length !== 1) {
78
+ return {
79
+ status: "failed",
80
+ code: "LOCAL_REWRITE_TOPOLOGY_INVALID",
81
+ message: "Local rewritten commit is not a single-parent commit"
82
+ };
83
+ }
84
+
85
+ const reviewedTree = git(gitRoot, ["rev-parse", `${lastReviewedCommit}^{tree}`]).trim();
86
+ const rewrittenTree = git(gitRoot, ["rev-parse", `${rewrittenCommit}^{tree}`]).trim();
87
+ if (reviewedTree !== rewrittenTree) {
88
+ const protectedDiff = git(gitRoot, [
89
+ "diff",
90
+ "--no-renames",
91
+ "--binary",
92
+ "--full-index",
93
+ lastReviewedCommit,
94
+ rewrittenCommit,
95
+ "--",
96
+ ...pathspecs
97
+ ]);
98
+ if (protectedDiff !== "") {
99
+ return {
100
+ status: "failed",
101
+ code: "LOCAL_REWRITE_CONTENT_MISMATCH",
102
+ message: "Local rewritten commit differs from the reviewed protected content"
103
+ };
104
+ }
105
+ }
106
+
107
+ const postRewrite = git(gitRoot, [
108
+ "rev-list",
109
+ `${rewrittenCommit}..${localHead}`,
110
+ "--",
111
+ ...pathspecs
112
+ ]).trim();
113
+ if (postRewrite) {
114
+ return {
115
+ status: "failed",
116
+ code: "POST_LOCAL_REWRITE_CHANGES",
117
+ message: "Protected paths changed after the equivalent local rewrite"
118
+ };
119
+ }
120
+ } catch {
121
+ return {
122
+ status: "blocked",
123
+ code: "LOCAL_REWRITE_GIT_EVIDENCE_UNAVAILABLE",
124
+ message: "Unable to verify local rewrite topology or content"
125
+ };
126
+ }
127
+
128
+ return {
129
+ status: "local-equivalent",
130
+ reviewedHead: lastReviewedCommit,
131
+ rewrittenCommit
132
+ };
133
+ }
134
+
135
+ export type { LocalReviewedCommitRelation };