@bjoernrochel/sevro 0.1.0-rc.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. package/CONTRIBUTING.md +52 -6
  2. package/README.md +12 -7
  3. package/dist/examples/basic/graded.json +13 -0
  4. package/dist/examples/basic/host.js +9 -0
  5. package/dist/examples/basic/host.js.map +1 -0
  6. package/dist/examples/basic/prompt-only.json +7 -0
  7. package/dist/examples/recipes/candidate.js +23 -0
  8. package/dist/examples/recipes/candidate.js.map +1 -0
  9. package/dist/examples/recipes/cases/coding-change.json +21 -0
  10. package/dist/examples/recipes/cases/host-tools.json +21 -0
  11. package/dist/examples/recipes/cases/mise.json +21 -0
  12. package/dist/examples/recipes/cases/node.json +21 -0
  13. package/dist/examples/recipes/cases/python-uv.json +21 -0
  14. package/dist/examples/recipes/cases/semantic.json +17 -0
  15. package/dist/examples/recipes/coding-change/check.js +16 -0
  16. package/dist/examples/recipes/coding-change/check.js.map +1 -0
  17. package/dist/examples/recipes/executable.js +20 -0
  18. package/dist/examples/recipes/executable.js.map +1 -0
  19. package/dist/examples/recipes/extension-artifacts.js +56 -0
  20. package/dist/examples/recipes/extension-artifacts.js.map +1 -0
  21. package/dist/examples/recipes/extension-methods.js +167 -0
  22. package/dist/examples/recipes/extension-methods.js.map +1 -0
  23. package/dist/examples/recipes/extension.js +28 -0
  24. package/dist/examples/recipes/extension.js.map +1 -0
  25. package/dist/examples/recipes/modules.js +9 -0
  26. package/dist/examples/recipes/modules.js.map +1 -0
  27. package/dist/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  28. package/dist/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  29. package/dist/examples/recipes/repository-skill/README.md +3 -0
  30. package/dist/examples/recipes/run-inputs.js +144 -0
  31. package/dist/examples/recipes/run-inputs.js.map +1 -0
  32. package/dist/examples/recipes/run-options.js +103 -0
  33. package/dist/examples/recipes/run-options.js.map +1 -0
  34. package/dist/examples/recipes/run.js +62 -0
  35. package/dist/examples/recipes/run.js.map +1 -0
  36. package/dist/examples/recipes/runtime/empty.json +1 -0
  37. package/dist/examples/recipes/runtime/goals.json +1 -0
  38. package/dist/examples/recipes/runtime/mise.json +6 -0
  39. package/dist/examples/recipes/runtime/path.json +1 -0
  40. package/dist/examples/recipes/runtime/plugins.json +4 -0
  41. package/dist/examples/recipes/runtime/python-uv.json +10 -0
  42. package/dist/examples/recipes/semantic-judge.js +27 -0
  43. package/dist/examples/recipes/semantic-judge.js.map +1 -0
  44. package/dist/examples/templates/coding/adapter.js +14 -0
  45. package/dist/examples/templates/coding/adapter.js.map +1 -0
  46. package/dist/examples/templates/coding/case.json +15 -0
  47. package/dist/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  48. package/dist/examples/templates/repository-skill/extension-data.js +61 -0
  49. package/dist/examples/templates/repository-skill/extension-data.js.map +1 -0
  50. package/dist/examples/templates/repository-skill/extension.js +29 -0
  51. package/dist/examples/templates/repository-skill/extension.js.map +1 -0
  52. package/dist/examples/templates/response/adapter.js +13 -0
  53. package/dist/examples/templates/response/adapter.js.map +1 -0
  54. package/dist/examples/templates/response/case.json +13 -0
  55. package/dist/src/advisory.js +86 -0
  56. package/dist/src/advisory.js.map +1 -0
  57. package/dist/src/candidate-artifacts.js +139 -0
  58. package/dist/src/candidate-artifacts.js.map +1 -0
  59. package/dist/src/candidate-codex-state.js +110 -0
  60. package/dist/src/candidate-codex-state.js.map +1 -0
  61. package/dist/src/case-validation.js +92 -0
  62. package/dist/src/case-validation.js.map +1 -0
  63. package/dist/src/cli/cancellation.js +21 -0
  64. package/dist/src/cli/cancellation.js.map +1 -0
  65. package/dist/src/cli/command.js +60 -0
  66. package/dist/src/cli/command.js.map +1 -0
  67. package/dist/src/cli/completion.js +14 -0
  68. package/dist/src/cli/completion.js.map +1 -0
  69. package/dist/src/cli/demo.js +45 -0
  70. package/dist/src/cli/demo.js.map +1 -0
  71. package/dist/src/cli/evaluation.js +40 -0
  72. package/dist/src/cli/evaluation.js.map +1 -0
  73. package/dist/src/cli/extension.js +54 -0
  74. package/dist/src/cli/extension.js.map +1 -0
  75. package/dist/src/cli/help.js +190 -0
  76. package/dist/src/cli/help.js.map +1 -0
  77. package/dist/src/cli/hosts.js +33 -0
  78. package/dist/src/cli/hosts.js.map +1 -0
  79. package/dist/src/cli/init-settings.js +29 -0
  80. package/dist/src/cli/init-settings.js.map +1 -0
  81. package/dist/src/cli/init.js +82 -0
  82. package/dist/src/cli/init.js.map +1 -0
  83. package/dist/src/cli/invocation.js +431 -0
  84. package/dist/src/cli/invocation.js.map +1 -0
  85. package/dist/src/cli/loading.js +110 -0
  86. package/dist/src/cli/loading.js.map +1 -0
  87. package/dist/src/cli/preparation.js +88 -0
  88. package/dist/src/cli/preparation.js.map +1 -0
  89. package/dist/src/cli/presentation.js +61 -0
  90. package/dist/src/cli/presentation.js.map +1 -0
  91. package/dist/src/cli/progress.js +5 -0
  92. package/dist/src/cli/progress.js.map +1 -0
  93. package/dist/src/cli/run-manifest.js +108 -0
  94. package/dist/src/cli/run-manifest.js.map +1 -0
  95. package/dist/src/cli/run-options.js +367 -0
  96. package/dist/src/cli/run-options.js.map +1 -0
  97. package/dist/src/cli/run-overrides.js +51 -0
  98. package/dist/src/cli/run-overrides.js.map +1 -0
  99. package/dist/src/cli/settings.js +127 -0
  100. package/dist/src/cli/settings.js.map +1 -0
  101. package/dist/src/cli/summary.js +28 -0
  102. package/dist/src/cli/summary.js.map +1 -0
  103. package/dist/src/cli.js +20 -0
  104. package/dist/src/cli.js.map +1 -0
  105. package/dist/src/contract-types.js +2 -0
  106. package/dist/src/contract-types.js.map +1 -0
  107. package/dist/src/engine.js +4 -0
  108. package/dist/src/engine.js.map +1 -0
  109. package/dist/src/evaluation/advisory.js +85 -0
  110. package/dist/src/evaluation/advisory.js.map +1 -0
  111. package/dist/src/evaluation/check-plan.js +292 -0
  112. package/dist/src/evaluation/check-plan.js.map +1 -0
  113. package/dist/src/evaluation/collection.js +61 -0
  114. package/dist/src/evaluation/collection.js.map +1 -0
  115. package/dist/src/evaluation/context.js +2 -0
  116. package/dist/src/evaluation/context.js.map +1 -0
  117. package/dist/src/evaluation/grading-host.js +28 -0
  118. package/dist/src/evaluation/grading-host.js.map +1 -0
  119. package/dist/src/evaluation/grading.js +154 -0
  120. package/dist/src/evaluation/grading.js.map +1 -0
  121. package/dist/src/evaluation/invocation-plan.js +312 -0
  122. package/dist/src/evaluation/invocation-plan.js.map +1 -0
  123. package/dist/src/evaluation/plan.js +376 -0
  124. package/dist/src/evaluation/plan.js.map +1 -0
  125. package/dist/src/evaluation/progress.js +14 -0
  126. package/dist/src/evaluation/progress.js.map +1 -0
  127. package/dist/src/evaluation/resources.js +159 -0
  128. package/dist/src/evaluation/resources.js.map +1 -0
  129. package/dist/src/evaluation/run.js +148 -0
  130. package/dist/src/evaluation/run.js.map +1 -0
  131. package/dist/src/evaluation/scheduler.js +27 -0
  132. package/dist/src/evaluation/scheduler.js.map +1 -0
  133. package/dist/src/evaluation/semantic.js +183 -0
  134. package/dist/src/evaluation/semantic.js.map +1 -0
  135. package/dist/src/evaluation/trial.js +593 -0
  136. package/dist/src/evaluation/trial.js.map +1 -0
  137. package/dist/src/evaluation/types.js +20 -0
  138. package/dist/src/evaluation/types.js.map +1 -0
  139. package/dist/src/evidence/host-results.js +67 -0
  140. package/dist/src/evidence/host-results.js.map +1 -0
  141. package/dist/src/evidence/retained-artifacts.js +17 -0
  142. package/dist/src/evidence/retained-artifacts.js.map +1 -0
  143. package/dist/src/evidence/trial-writer.js +131 -0
  144. package/dist/src/evidence/trial-writer.js.map +1 -0
  145. package/dist/src/evidence/usage.js +14 -0
  146. package/dist/src/evidence/usage.js.map +1 -0
  147. package/dist/src/executable.js +20 -0
  148. package/dist/src/executable.js.map +1 -0
  149. package/dist/src/extension-client.js +212 -0
  150. package/dist/src/extension-client.js.map +1 -0
  151. package/dist/src/extension-session.js +236 -0
  152. package/dist/src/extension-session.js.map +1 -0
  153. package/dist/src/fixtures/advisory.js +206 -0
  154. package/dist/src/fixtures/advisory.js.map +1 -0
  155. package/dist/src/fixtures/bin.js +41 -0
  156. package/dist/src/fixtures/bin.js.map +1 -0
  157. package/dist/src/fixtures/cleanup.js +43 -0
  158. package/dist/src/fixtures/cleanup.js.map +1 -0
  159. package/dist/src/fixtures/create.js +94 -0
  160. package/dist/src/fixtures/create.js.map +1 -0
  161. package/dist/src/fixtures/generated.js +181 -0
  162. package/dist/src/fixtures/generated.js.map +1 -0
  163. package/dist/src/fixtures/git-hooks.js +16 -0
  164. package/dist/src/fixtures/git-hooks.js.map +1 -0
  165. package/dist/src/fixtures/preparation.js +201 -0
  166. package/dist/src/fixtures/preparation.js.map +1 -0
  167. package/dist/src/fixtures/repository.js +255 -0
  168. package/dist/src/fixtures/repository.js.map +1 -0
  169. package/dist/src/fixtures/setup.js +175 -0
  170. package/dist/src/fixtures/setup.js.map +1 -0
  171. package/dist/src/fixtures/tools.js +57 -0
  172. package/dist/src/fixtures/tools.js.map +1 -0
  173. package/dist/src/fixtures/workspace-state.js +155 -0
  174. package/dist/src/fixtures/workspace-state.js.map +1 -0
  175. package/dist/src/generated/cli-result.cjs +2 -0
  176. package/dist/src/generated/extension.cjs +2 -0
  177. package/dist/src/generated/report.cjs +2 -0
  178. package/dist/src/generated/run-evidence.cjs +2 -0
  179. package/dist/src/generated/runtime.cjs +2 -0
  180. package/dist/src/git.js +72 -0
  181. package/dist/src/git.js.map +1 -0
  182. package/dist/src/graders/artifact.js +68 -0
  183. package/dist/src/graders/artifact.js.map +1 -0
  184. package/dist/src/graders/git-head.js +112 -0
  185. package/dist/src/graders/git-head.js.map +1 -0
  186. package/dist/src/graders/output.js +345 -0
  187. package/dist/src/graders/output.js.map +1 -0
  188. package/dist/src/graders/semantic.js +132 -0
  189. package/dist/src/graders/semantic.js.map +1 -0
  190. package/dist/src/graders/shell.js +321 -0
  191. package/dist/src/graders/shell.js.map +1 -0
  192. package/dist/src/host-diagnostic-redaction.js +52 -0
  193. package/dist/src/host-diagnostic-redaction.js.map +1 -0
  194. package/dist/src/host-diagnostics.js +248 -0
  195. package/dist/src/host-diagnostics.js.map +1 -0
  196. package/dist/src/hosts/claude-continuation.js +89 -0
  197. package/dist/src/hosts/claude-continuation.js.map +1 -0
  198. package/dist/src/hosts/claude-credential.js +121 -0
  199. package/dist/src/hosts/claude-credential.js.map +1 -0
  200. package/dist/src/hosts/claude-events.js +136 -0
  201. package/dist/src/hosts/claude-events.js.map +1 -0
  202. package/dist/src/hosts/claude-keychain.js +100 -0
  203. package/dist/src/hosts/claude-keychain.js.map +1 -0
  204. package/dist/src/hosts/claude-login-recovery.js +67 -0
  205. package/dist/src/hosts/claude-login-recovery.js.map +1 -0
  206. package/dist/src/hosts/claude-login-refresh.js +146 -0
  207. package/dist/src/hosts/claude-login-refresh.js.map +1 -0
  208. package/dist/src/hosts/claude-login-store.js +124 -0
  209. package/dist/src/hosts/claude-login-store.js.map +1 -0
  210. package/dist/src/hosts/claude-login.js +74 -0
  211. package/dist/src/hosts/claude-login.js.map +1 -0
  212. package/dist/src/hosts/claude-native-goal.js +138 -0
  213. package/dist/src/hosts/claude-native-goal.js.map +1 -0
  214. package/dist/src/hosts/claude-process.js +10 -0
  215. package/dist/src/hosts/claude-process.js.map +1 -0
  216. package/dist/src/hosts/claude-refresh-lock.js +76 -0
  217. package/dist/src/hosts/claude-refresh-lock.js.map +1 -0
  218. package/dist/src/hosts/claude-repository-invocation.js +229 -0
  219. package/dist/src/hosts/claude-repository-invocation.js.map +1 -0
  220. package/dist/src/hosts/claude-settings.js +156 -0
  221. package/dist/src/hosts/claude-settings.js.map +1 -0
  222. package/dist/src/hosts/claude-skill-activations.js +131 -0
  223. package/dist/src/hosts/claude-skill-activations.js.map +1 -0
  224. package/dist/src/hosts/claude-state.js +237 -0
  225. package/dist/src/hosts/claude-state.js.map +1 -0
  226. package/dist/src/hosts/claude-tool-calls.js +150 -0
  227. package/dist/src/hosts/claude-tool-calls.js.map +1 -0
  228. package/dist/src/hosts/claude.js +373 -0
  229. package/dist/src/hosts/claude.js.map +1 -0
  230. package/dist/src/hosts/codex-app-server.js +764 -0
  231. package/dist/src/hosts/codex-app-server.js.map +1 -0
  232. package/dist/src/hosts/codex-configuration.js +91 -0
  233. package/dist/src/hosts/codex-configuration.js.map +1 -0
  234. package/dist/src/hosts/codex-events.js +104 -0
  235. package/dist/src/hosts/codex-events.js.map +1 -0
  236. package/dist/src/hosts/codex-exec-controls.js +434 -0
  237. package/dist/src/hosts/codex-exec-controls.js.map +1 -0
  238. package/dist/src/hosts/codex-invocation.js +54 -0
  239. package/dist/src/hosts/codex-invocation.js.map +1 -0
  240. package/dist/src/hosts/codex-marketplace.js +185 -0
  241. package/dist/src/hosts/codex-marketplace.js.map +1 -0
  242. package/dist/src/hosts/codex-native-calls.js +516 -0
  243. package/dist/src/hosts/codex-native-calls.js.map +1 -0
  244. package/dist/src/hosts/codex-process.js +10 -0
  245. package/dist/src/hosts/codex-process.js.map +1 -0
  246. package/dist/src/hosts/codex-profile.js +206 -0
  247. package/dist/src/hosts/codex-profile.js.map +1 -0
  248. package/dist/src/hosts/codex-session-files.js +89 -0
  249. package/dist/src/hosts/codex-session-files.js.map +1 -0
  250. package/dist/src/hosts/codex-state.js +310 -0
  251. package/dist/src/hosts/codex-state.js.map +1 -0
  252. package/dist/src/hosts/codex.js +527 -0
  253. package/dist/src/hosts/codex.js.map +1 -0
  254. package/dist/src/hosts/isolation-common.js +43 -0
  255. package/dist/src/hosts/isolation-common.js.map +1 -0
  256. package/dist/src/hosts/isolation-roots.js +64 -0
  257. package/dist/src/hosts/isolation-roots.js.map +1 -0
  258. package/dist/src/hosts/isolation.js +12 -0
  259. package/dist/src/hosts/isolation.js.map +1 -0
  260. package/dist/src/hosts/linux-sandbox.js +127 -0
  261. package/dist/src/hosts/linux-sandbox.js.map +1 -0
  262. package/dist/src/hosts/mac-sandbox.js +137 -0
  263. package/dist/src/hosts/mac-sandbox.js.map +1 -0
  264. package/dist/src/hosts/native-controls.js +151 -0
  265. package/dist/src/hosts/native-controls.js.map +1 -0
  266. package/dist/src/hosts/native-request.js +33 -0
  267. package/dist/src/hosts/native-request.js.map +1 -0
  268. package/dist/src/hosts/process-lifecycle.js +167 -0
  269. package/dist/src/hosts/process-lifecycle.js.map +1 -0
  270. package/dist/src/hosts/protected-worktrees.js +81 -0
  271. package/dist/src/hosts/protected-worktrees.js.map +1 -0
  272. package/dist/src/hosts/skill-hook-catalog.js +100 -0
  273. package/dist/src/hosts/skill-hook-catalog.js.map +1 -0
  274. package/dist/src/hosts/skill-hook-handler.js +228 -0
  275. package/dist/src/hosts/skill-hook-handler.js.map +1 -0
  276. package/dist/src/hosts/skill-hooks.js +423 -0
  277. package/dist/src/hosts/skill-hooks.js.map +1 -0
  278. package/dist/src/hosts/workspace-fingerprint.js +72 -0
  279. package/dist/src/hosts/workspace-fingerprint.js.map +1 -0
  280. package/dist/src/identity.js +167 -0
  281. package/dist/src/identity.js.map +1 -0
  282. package/dist/src/instrumentation.js +83 -0
  283. package/dist/src/instrumentation.js.map +1 -0
  284. package/dist/src/native-transcript-state.js +85 -0
  285. package/dist/src/native-transcript-state.js.map +1 -0
  286. package/dist/src/native-transcript-view.js +65 -0
  287. package/dist/src/native-transcript-view.js.map +1 -0
  288. package/dist/src/native-transcripts.js +208 -0
  289. package/dist/src/native-transcripts.js.map +1 -0
  290. package/dist/src/paths.js +13 -0
  291. package/dist/src/paths.js.map +1 -0
  292. package/dist/src/process-lifecycle.js +101 -0
  293. package/dist/src/process-lifecycle.js.map +1 -0
  294. package/dist/src/provenance.js +263 -0
  295. package/dist/src/provenance.js.map +1 -0
  296. package/dist/src/prune.js +228 -0
  297. package/dist/src/prune.js.map +1 -0
  298. package/dist/src/report.js +276 -0
  299. package/dist/src/report.js.map +1 -0
  300. package/dist/src/resolved-case.js +29 -0
  301. package/dist/src/resolved-case.js.map +1 -0
  302. package/dist/src/results-lock.js +40 -0
  303. package/dist/src/results-lock.js.map +1 -0
  304. package/dist/src/results.js +127 -0
  305. package/dist/src/results.js.map +1 -0
  306. package/dist/src/run-owner.js +283 -0
  307. package/dist/src/run-owner.js.map +1 -0
  308. package/dist/src/runner-paths.js +11 -0
  309. package/dist/src/runner-paths.js.map +1 -0
  310. package/dist/src/runtime/config.js +323 -0
  311. package/dist/src/runtime/config.js.map +1 -0
  312. package/dist/src/runtime/discovery-apple.js +65 -0
  313. package/dist/src/runtime/discovery-apple.js.map +1 -0
  314. package/dist/src/runtime/discovery-providers.js +37 -0
  315. package/dist/src/runtime/discovery-providers.js.map +1 -0
  316. package/dist/src/runtime/discovery.js +40 -0
  317. package/dist/src/runtime/discovery.js.map +1 -0
  318. package/dist/src/runtime/hook-processes.js +81 -0
  319. package/dist/src/runtime/hook-processes.js.map +1 -0
  320. package/dist/src/runtime/hooks.js +304 -0
  321. package/dist/src/runtime/hooks.js.map +1 -0
  322. package/dist/src/runtime/paths.js +244 -0
  323. package/dist/src/runtime/paths.js.map +1 -0
  324. package/dist/src/runtime/query.js +76 -0
  325. package/dist/src/runtime/query.js.map +1 -0
  326. package/dist/src/runtime/seeds.js +98 -0
  327. package/dist/src/runtime/seeds.js.map +1 -0
  328. package/dist/src/runtime/shared-cache.js +81 -0
  329. package/dist/src/runtime/shared-cache.js.map +1 -0
  330. package/dist/src/runtime/state.js +106 -0
  331. package/dist/src/runtime/state.js.map +1 -0
  332. package/dist/src/runtime-process.js +148 -0
  333. package/dist/src/runtime-process.js.map +1 -0
  334. package/dist/src/schema-types.js +2 -0
  335. package/dist/src/schema-types.js.map +1 -0
  336. package/dist/src/schema.js +16 -0
  337. package/dist/src/schema.js.map +1 -0
  338. package/dist/src/shell.js +5 -0
  339. package/dist/src/shell.js.map +1 -0
  340. package/dist/src/sqlite-lock.js +18 -0
  341. package/dist/src/sqlite-lock.js.map +1 -0
  342. package/dist/src/storage.js +21 -0
  343. package/dist/src/storage.js.map +1 -0
  344. package/dist/src/transcript-retention.js +109 -0
  345. package/dist/src/transcript-retention.js.map +1 -0
  346. package/dist/src/value-guards.js +26 -0
  347. package/dist/src/value-guards.js.map +1 -0
  348. package/docs/README.md +19 -15
  349. package/docs/architecture.md +141 -17
  350. package/docs/assets/README.md +5 -4
  351. package/docs/builtin-graders-v1.md +9 -2
  352. package/docs/codex-host.md +155 -57
  353. package/docs/contracts.md +2 -1
  354. package/docs/creating-cases.md +10 -4
  355. package/docs/development-cli.md +197 -24
  356. package/docs/documentation-quality.md +16 -5
  357. package/docs/evaluation-workflow.md +110 -0
  358. package/docs/extension-protocol-v1.md +26 -3
  359. package/docs/getting-started.md +29 -7
  360. package/docs/guide-evaluation.md +34 -2
  361. package/docs/identity-v1.md +29 -3
  362. package/docs/installing.md +35 -17
  363. package/docs/licensing.md +2 -2
  364. package/docs/native-controls.md +76 -5
  365. package/docs/native-hosts.md +197 -8
  366. package/docs/reading-results.md +102 -0
  367. package/docs/recipes.md +490 -0
  368. package/docs/releases.md +48 -13
  369. package/docs/report-v1.md +29 -1
  370. package/docs/results-v1.md +122 -4
  371. package/docs/run-settings-v1.md +147 -0
  372. package/docs/runtime-v1.md +255 -22
  373. package/docs/specs/repository-guide.md +1 -1
  374. package/docs/troubleshooting.md +12 -12
  375. package/docs/typescript-quality.md +106 -26
  376. package/examples/recipes/candidate.ts +26 -0
  377. package/examples/recipes/cases/coding-change.json +21 -0
  378. package/examples/recipes/cases/host-tools.json +21 -0
  379. package/examples/recipes/cases/mise.json +21 -0
  380. package/examples/recipes/cases/node.json +21 -0
  381. package/examples/recipes/cases/python-uv.json +21 -0
  382. package/examples/recipes/cases/semantic.json +17 -0
  383. package/examples/recipes/coding-change/check.ts +23 -0
  384. package/examples/recipes/executable.ts +19 -0
  385. package/examples/recipes/extension-artifacts.ts +65 -0
  386. package/examples/recipes/extension-methods.ts +174 -0
  387. package/examples/recipes/extension.ts +38 -0
  388. package/examples/recipes/modules.ts +9 -0
  389. package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
  390. package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
  391. package/examples/recipes/repository-skill/README.md +3 -0
  392. package/examples/recipes/run-inputs.ts +183 -0
  393. package/examples/recipes/run-options.ts +132 -0
  394. package/examples/recipes/run.ts +77 -0
  395. package/examples/recipes/runtime/empty.json +1 -0
  396. package/examples/recipes/runtime/goals.json +1 -0
  397. package/examples/recipes/runtime/mise.json +6 -0
  398. package/examples/recipes/runtime/path.json +1 -0
  399. package/examples/recipes/runtime/plugins.json +4 -0
  400. package/examples/recipes/runtime/python-uv.json +10 -0
  401. package/examples/recipes/semantic-judge.ts +29 -0
  402. package/examples/templates/coding/adapter.ts +17 -0
  403. package/examples/templates/coding/case.json +15 -0
  404. package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
  405. package/examples/templates/repository-skill/extension-data.ts +64 -0
  406. package/examples/templates/repository-skill/extension.ts +32 -0
  407. package/examples/templates/response/adapter.ts +12 -0
  408. package/examples/templates/response/case.json +13 -0
  409. package/package.json +23 -9
  410. package/schemas/report-v1.schema.json +9 -0
  411. package/schemas/run-evidence-v1.schema.json +2 -1
  412. package/schemas/runtime-v1.schema.json +43 -7
  413. package/src/advisory.ts +2 -2
  414. package/src/candidate-artifacts.ts +42 -11
  415. package/src/candidate-codex-state.ts +185 -0
  416. package/src/case-validation.ts +73 -50
  417. package/src/cli/cancellation.ts +20 -0
  418. package/src/cli/command.ts +87 -0
  419. package/src/cli/completion.ts +15 -0
  420. package/src/cli/demo.ts +61 -0
  421. package/src/cli/evaluation.ts +55 -0
  422. package/src/cli/extension.ts +79 -0
  423. package/src/cli/help.ts +199 -0
  424. package/src/cli/hosts.ts +55 -0
  425. package/src/cli/init-settings.ts +31 -0
  426. package/src/cli/init.ts +112 -0
  427. package/src/{cli-invocation.ts → cli/invocation.ts} +215 -218
  428. package/src/cli/loading.ts +151 -0
  429. package/src/cli/preparation.ts +154 -0
  430. package/src/cli/presentation.ts +93 -0
  431. package/src/cli/progress.ts +6 -0
  432. package/src/cli/run-manifest.ts +128 -0
  433. package/src/cli/run-options.ts +403 -0
  434. package/src/cli/run-overrides.ts +69 -0
  435. package/src/cli/settings.ts +154 -0
  436. package/src/cli/summary.ts +43 -0
  437. package/src/cli.ts +14 -592
  438. package/src/contract-types.ts +94 -0
  439. package/src/engine.ts +9 -5
  440. package/src/evaluation/advisory.ts +150 -0
  441. package/src/{evaluation-check-plan.ts → evaluation/check-plan.ts} +103 -67
  442. package/src/evaluation/collection.ts +88 -0
  443. package/src/evaluation/context.ts +10 -0
  444. package/src/{evaluation-grading-host.ts → evaluation/grading-host.ts} +5 -5
  445. package/src/evaluation/grading.ts +235 -0
  446. package/src/{evaluation-invocation-plan.ts → evaluation/invocation-plan.ts} +147 -58
  447. package/src/{evaluation-plan.ts → evaluation/plan.ts} +208 -141
  448. package/src/evaluation/progress.ts +19 -0
  449. package/src/evaluation/resources.ts +241 -0
  450. package/src/evaluation/run.ts +206 -0
  451. package/src/{evaluation-semantic.ts → evaluation/semantic.ts} +77 -87
  452. package/src/evaluation/trial.ts +800 -0
  453. package/src/{evaluation-types.ts → evaluation/types.ts} +79 -29
  454. package/src/evidence/host-results.ts +85 -0
  455. package/src/evidence/retained-artifacts.ts +18 -0
  456. package/src/evidence/trial-writer.ts +203 -0
  457. package/src/evidence/usage.ts +17 -0
  458. package/src/executable.ts +19 -0
  459. package/src/extension-client.ts +40 -108
  460. package/src/extension-session.ts +24 -48
  461. package/src/{advisory-fixture.ts → fixtures/advisory.ts} +12 -72
  462. package/src/{fixture-bin.ts → fixtures/bin.ts} +1 -1
  463. package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
  464. package/src/fixtures/create.ts +183 -0
  465. package/src/{generated-fixture.ts → fixtures/generated.ts} +10 -53
  466. package/src/{git-hooks.ts → fixtures/git-hooks.ts} +1 -1
  467. package/src/{preparation.ts → fixtures/preparation.ts} +6 -16
  468. package/src/{repository-fixture.ts → fixtures/repository.ts} +30 -64
  469. package/src/{fixture-setup.ts → fixtures/setup.ts} +36 -53
  470. package/src/{fixture-tools.ts → fixtures/tools.ts} +1 -1
  471. package/src/{workspace-state.ts → fixtures/workspace-state.ts} +5 -5
  472. package/src/generated/cli-result.d.cts +2 -1
  473. package/src/generated/extension.d.cts +2 -1
  474. package/src/generated/report.cjs +1 -1
  475. package/src/generated/report.d.cts +2 -1
  476. package/src/generated/run-evidence.cjs +1 -1
  477. package/src/generated/run-evidence.d.cts +2 -1
  478. package/src/generated/runtime.cjs +1 -1
  479. package/src/generated/runtime.d.cts +2 -1
  480. package/src/git.ts +94 -0
  481. package/src/graders/git-head.ts +31 -85
  482. package/src/graders/shell.ts +54 -71
  483. package/src/host-diagnostic-redaction.ts +52 -0
  484. package/src/host-diagnostics.ts +331 -0
  485. package/src/hosts/claude-continuation.ts +57 -40
  486. package/src/hosts/claude-credential.ts +160 -63
  487. package/src/hosts/claude-events.ts +34 -18
  488. package/src/hosts/claude-keychain.ts +79 -21
  489. package/src/hosts/claude-login-recovery.ts +85 -0
  490. package/src/hosts/claude-login-refresh.ts +179 -0
  491. package/src/hosts/claude-login-store.ts +162 -0
  492. package/src/hosts/claude-login.ts +107 -0
  493. package/src/hosts/claude-native-goal.ts +15 -12
  494. package/src/hosts/claude-process.ts +10 -50
  495. package/src/hosts/claude-refresh-lock.ts +82 -0
  496. package/src/hosts/claude-repository-invocation.ts +9 -34
  497. package/src/hosts/claude-settings.ts +46 -9
  498. package/src/hosts/claude-skill-activations.ts +169 -0
  499. package/src/hosts/claude-state.ts +28 -15
  500. package/src/hosts/claude-tool-calls.ts +13 -10
  501. package/src/hosts/claude.ts +121 -81
  502. package/src/hosts/codex-app-server.ts +78 -52
  503. package/src/hosts/codex-configuration.ts +5 -10
  504. package/src/hosts/codex-exec-controls.ts +516 -0
  505. package/src/hosts/codex-marketplace.ts +12 -10
  506. package/src/hosts/codex-native-calls.ts +15 -122
  507. package/src/hosts/codex-process.ts +10 -183
  508. package/src/hosts/codex-profile.ts +36 -21
  509. package/src/hosts/codex-session-files.ts +1 -9
  510. package/src/hosts/codex-state.ts +134 -18
  511. package/src/hosts/codex.ts +210 -183
  512. package/src/hosts/isolation-common.ts +8 -11
  513. package/src/hosts/isolation-roots.ts +5 -4
  514. package/src/hosts/linux-sandbox.ts +15 -2
  515. package/src/hosts/mac-sandbox.ts +87 -18
  516. package/src/hosts/native-controls.ts +72 -22
  517. package/src/hosts/native-request.ts +55 -0
  518. package/src/hosts/process-lifecycle.ts +215 -49
  519. package/src/hosts/protected-worktrees.ts +3 -2
  520. package/src/hosts/skill-hook-catalog.ts +131 -0
  521. package/src/hosts/skill-hook-handler.ts +374 -0
  522. package/src/hosts/skill-hooks.ts +585 -0
  523. package/src/instrumentation.ts +7 -8
  524. package/src/native-transcript-state.ts +22 -3
  525. package/src/native-transcript-view.ts +52 -13
  526. package/src/native-transcripts.ts +26 -11
  527. package/src/paths.ts +22 -0
  528. package/src/process-lifecycle.ts +150 -0
  529. package/src/provenance.ts +34 -13
  530. package/src/prune.ts +300 -0
  531. package/src/report.ts +63 -36
  532. package/src/resolved-case.ts +1 -1
  533. package/src/results-lock.ts +42 -0
  534. package/src/results.ts +14 -18
  535. package/src/run-owner.ts +15 -9
  536. package/src/runner-paths.ts +21 -0
  537. package/src/{runtime-config.ts → runtime/config.ts} +160 -46
  538. package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
  539. package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
  540. package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
  541. package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +3 -2
  542. package/src/{runtime-hooks.ts → runtime/hooks.ts} +40 -28
  543. package/src/{runtime-paths.ts → runtime/paths.ts} +5 -19
  544. package/src/{runtime-query.ts → runtime/query.ts} +5 -5
  545. package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
  546. package/src/runtime/shared-cache.ts +130 -0
  547. package/src/{runtime-state.ts → runtime/state.ts} +28 -11
  548. package/src/runtime-process.ts +194 -0
  549. package/src/schema-types.ts +73 -161
  550. package/src/shell.ts +4 -0
  551. package/src/sqlite-lock.ts +25 -0
  552. package/src/transcript-retention.ts +146 -0
  553. package/src/value-guards.ts +22 -0
  554. package/docs/assets/sevro-logo.png +0 -0
  555. package/docs/assets/sevro-symbol.svg +0 -1
  556. package/docs/assets/sevro-wordmark.svg +0 -1
  557. package/docs/cache-ownership-validation.md +0 -49
  558. package/docs/claude-continuation-validation.md +0 -47
  559. package/docs/concurrency-validation.md +0 -86
  560. package/docs/configuration-root-validation.md +0 -70
  561. package/docs/engine-slice.md +0 -114
  562. package/docs/evidence/runtime-startup-30/README.md +0 -185
  563. package/docs/evidence/runtime-startup-30/after.json +0 -319
  564. package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
  565. package/docs/evidence/runtime-startup-30/before.json +0 -403
  566. package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
  567. package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
  568. package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
  569. package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
  570. package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
  571. package/docs/evidence.md +0 -17
  572. package/docs/fixture-cleanup-validation.md +0 -73
  573. package/docs/guide-verification.json +0 -239
  574. package/src/evaluation-context.ts +0 -259
  575. package/src/evaluation-fixture.ts +0 -302
  576. package/src/evaluation-run.ts +0 -200
  577. package/src/evaluation-trial.ts +0 -1016
  578. package/src/hosts/claude-nested-skills.ts +0 -272
  579. package/src/hosts/codex-command-output.ts +0 -510
  580. package/src/hosts/codex-executor-command.ts +0 -291
  581. package/src/hosts/codex-skill-reads.ts +0 -783
  582. /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
@@ -1,26 +1,25 @@
1
- import { parseArgs } from "node:util";
2
- import { isAbsolute } from "node:path";
1
+ import { which } from "../executable";
2
+ import { join, resolve } from "node:path";
3
+ import { validQualifiedId } from "../value-guards";
4
+ import { canonicalRuntimeRoot } from "../runtime/paths";
5
+ import {
6
+ PATH_OPTIONS,
7
+ PATH_LIST_OPTIONS,
8
+ EXTENSION_OPTIONS,
9
+ RUN_OPTIONS,
10
+ optionsWith,
11
+ runArguments,
12
+ } from "./run-options";
13
+ import { savedRunValues } from "./run-manifest";
3
14
 
4
15
  export class InvocationError extends Error {}
5
16
 
6
17
  function requiredOption(value: string | undefined, name: string): string {
7
- if (!value) throw new InvocationError(`missing ${name}`);
18
+ if (!value)
19
+ throw new InvocationError(`missing ${name}; supply ${name} with a value`);
8
20
  return value;
9
21
  }
10
22
 
11
- function absoluteOption(value: string | undefined, name: string): string {
12
- const path = requiredOption(value, name);
13
- if (!isAbsolute(path)) throw new InvocationError(`${name} must be absolute`);
14
- return path;
15
- }
16
-
17
- function optionalAbsolute(
18
- value: string | undefined,
19
- name: string,
20
- ): string | undefined {
21
- return value ? absoluteOption(value, name) : undefined;
22
- }
23
-
24
23
  function optionalDigest(value: string | undefined, name: string) {
25
24
  if (value !== undefined && !/^[a-f0-9]{64}$/.test(value))
26
25
  throw new InvocationError(`${name} must be a 64-character SHA-256 digest`);
@@ -30,71 +29,16 @@ function optionalDigest(value: string | undefined, name: string) {
30
29
  function conditionOption(value: string | undefined): "passive" | "enforced" {
31
30
  const condition = requiredOption(value, "--condition");
32
31
  if (condition !== "passive" && condition !== "enforced")
33
- throw new InvocationError("invalid --condition");
32
+ throw new InvocationError("invalid --condition; use passive or enforced");
34
33
  return condition;
35
34
  }
36
35
 
37
- const RUN_OPTIONS = {
38
- json: { type: "boolean" },
39
- dry: { type: "boolean" },
40
- "case-file": { type: "string" },
41
- "case-id": { type: "string" },
42
- "extension-command-file": { type: "string" },
43
- "extension-source-file": { type: "string", multiple: true },
44
- "extension-configuration-file": { type: "string" },
45
- "extension-redacted-configuration-file": { type: "string" },
46
- "task-verdict-policy": { type: "string" },
47
- "replace-builtin-grader": { type: "string", multiple: true },
48
- "case-source-root": { type: "string" },
49
- "case-source-map-file": { type: "string" },
50
- "adapter-module": { type: "string" },
51
- "semantic-adapter-module": { type: "string" },
52
- "semantic-host": { type: "string" },
53
- "semantic-model": { type: "string" },
54
- "semantic-effort": { type: "string" },
55
- "advisory-adapter-module": { type: "string" },
56
- "advisory-host": { type: "string" },
57
- "advisory-model": { type: "string" },
58
- "advisory-effort": { type: "string" },
59
- "advisory-exclude": { type: "string", multiple: true },
60
- host: { type: "string" },
61
- "codex-bin": { type: "string" },
62
- "codex-entrypoint": { type: "string" },
63
- "codex-timeout-ms": { type: "string" },
64
- "codex-auth-file": { type: "string" },
65
- "claude-bin": { type: "string" },
66
- "claude-credential-file": { type: "string" },
67
- "claude-uv-cache-dir": { type: "string" },
68
- "claude-project-settings": { type: "boolean" },
69
- "toolchain-bin-dir": { type: "string" },
70
- model: { type: "string" },
71
- effort: { type: "string" },
72
- "shell-isolation": { type: "boolean" },
73
- "protected-root": { type: "string", multiple: true },
74
- "project-root": { type: "string" },
75
- "config-root": { type: "string" },
76
- "runtime-config-file": { type: "string" },
77
- "results-root": { type: "string" },
78
- "run-state-root": { type: "string" },
79
- "runner-build-digest": { type: "string" },
80
- "runner-checkout-root": { type: "string" },
81
- "project-digest": { type: "string" },
82
- condition: { type: "string" },
83
- trials: { type: "string" },
84
- jobs: { type: "string", default: "3" },
85
- threshold: { type: "string" },
86
- } as const;
87
-
88
36
  function cliArguments(argv: string[]) {
89
37
  try {
90
- return parseArgs({
91
- args: argv,
92
- allowPositionals: true,
93
- strict: true,
94
- options: RUN_OPTIONS,
95
- });
38
+ return runArguments(argv);
96
39
  } catch (cause) {
97
- throw new InvocationError("invalid CLI arguments", { cause });
40
+ const detail = cause instanceof Error ? `: ${cause.message}` : "";
41
+ throw new InvocationError(`invalid CLI arguments${detail}`, { cause });
98
42
  }
99
43
  }
100
44
 
@@ -112,24 +56,29 @@ function trialParameters(values: Values) {
112
56
  passThreshold <= 0 ||
113
57
  passThreshold > 1
114
58
  )
115
- throw new InvocationError("invalid --threshold");
59
+ throw new InvocationError(
60
+ "invalid --threshold; supply a number greater than 0 and at most 1",
61
+ );
116
62
  return { condition, trialCount, jobs, passThreshold };
117
63
  }
118
64
 
119
65
  function positiveInteger(value: number, option: string): void {
120
66
  if (!Number.isSafeInteger(value) || value < 1)
121
- throw new InvocationError(`invalid ${option}`);
67
+ throw new InvocationError(`invalid ${option}; supply a positive integer`);
122
68
  }
123
69
 
124
70
  function hostRoutes(values: Values) {
125
71
  const codex = values.host === "codex";
126
72
  const claude = values.host === "claude";
73
+ const semanticCodex = values["semantic-host"] === "codex";
74
+ const advisoryCodex = values["advisory-host"] === "codex";
127
75
  return {
128
76
  codex,
129
77
  claude,
130
78
  builtinHost: codex || claude,
131
- semanticCodex: values["semantic-host"] === "codex",
132
- advisoryCodex: values["advisory-host"] === "codex",
79
+ semanticCodex,
80
+ advisoryCodex,
81
+ anyCodex: codex || semanticCodex || advisoryCodex,
133
82
  };
134
83
  }
135
84
 
@@ -147,15 +96,15 @@ const HOST_COMPATIBILITY: CompatibilityRule[] = [
147
96
  },
148
97
  {
149
98
  invalid: (v, r) => v.host && !r.builtinHost,
150
- message: "unsupported --host",
99
+ message: "unsupported --host; use codex or claude",
151
100
  },
152
101
  {
153
102
  invalid: (v, r) => v["semantic-host"] && !r.semanticCodex,
154
- message: "unsupported --semantic-host",
103
+ message: "unsupported --semantic-host; use codex",
155
104
  },
156
105
  {
157
106
  invalid: (v, r) => v["advisory-host"] && !r.advisoryCodex,
158
- message: "unsupported --advisory-host",
107
+ message: "unsupported --advisory-host; use codex",
159
108
  },
160
109
  {
161
110
  invalid: (v, r) => r.semanticCodex && v["semantic-adapter-module"],
@@ -195,24 +144,11 @@ const HOST_COMPATIBILITY: CompatibilityRule[] = [
195
144
  message: "--advisory-exclude requires an advisory route",
196
145
  },
197
146
  {
198
- invalid: (v, r) =>
199
- !r.codex &&
200
- !r.semanticCodex &&
201
- !r.advisoryCodex &&
202
- [
203
- v["codex-bin"],
204
- v["codex-auth-file"],
205
- v["codex-timeout-ms"] !== undefined,
206
- ].some(Boolean),
147
+ invalid: (v, r) => !r.anyCodex && hasRouteOptions(v, "codex"),
207
148
  message: "Codex options require a Codex host route",
208
149
  },
209
150
  {
210
- invalid: (v, r) =>
211
- !r.claude &&
212
- (v["claude-bin"] ||
213
- v["claude-credential-file"] ||
214
- v["claude-uv-cache-dir"] ||
215
- v["claude-project-settings"]),
151
+ invalid: (v, r) => !r.claude && hasRouteOptions(v, "claude"),
216
152
  message: "Claude options require --host claude",
217
153
  },
218
154
  {
@@ -226,6 +162,13 @@ const HOST_COMPATIBILITY: CompatibilityRule[] = [
226
162
  },
227
163
  ];
228
164
 
165
+ function hasRouteOptions(values: Values, route: "codex" | "claude"): boolean {
166
+ return optionsWith("route", route).some((name) => {
167
+ if (RUN_OPTIONS[name].kind === "number") return values[name] !== undefined;
168
+ return Boolean(values[name]);
169
+ });
170
+ }
171
+
229
172
  function validateHostCompatibility(
230
173
  values: Values,
231
174
  routes: Routes,
@@ -237,24 +180,20 @@ function validateHostCompatibility(
237
180
  }
238
181
 
239
182
  function rootParameters(values: Values) {
240
- const projectRoot = absoluteOption(values["project-root"], "--project-root");
183
+ const projectRoot = requiredOption(values["project-root"], "--project-root");
241
184
  const configRoot =
242
185
  values["config-root"] !== undefined
243
- ? absoluteOption(values["config-root"], "--config-root")
186
+ ? requiredOption(values["config-root"], "--config-root")
244
187
  : projectRoot;
245
- const resultsRoot = absoluteOption(values["results-root"], "--results-root");
188
+ const resultsRoot = requiredOption(values["results-root"], "--results-root");
246
189
  const runStateRoot = values["run-state-root"]
247
- ? absoluteOption(values["run-state-root"], "--run-state-root")
190
+ ? requiredOption(values["run-state-root"], "--run-state-root")
248
191
  : resultsRoot;
249
192
  return { projectRoot, configRoot, resultsRoot, runStateRoot };
250
193
  }
251
194
 
252
195
  type Roots = ReturnType<typeof rootParameters>;
253
196
 
254
- function validQualifiedId(id: string): boolean {
255
- return /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)+$/.test(id);
256
- }
257
-
258
197
  function validateExtensionSelection(values: Values): void {
259
198
  const policy = values["task-verdict-policy"];
260
199
  if (policy !== undefined && !validQualifiedId(policy))
@@ -280,24 +219,18 @@ function validateReplacements(replacements: string[]): void {
280
219
  }
281
220
 
282
221
  function hasExtensionArguments(values: Values): boolean {
283
- return (
284
- [
285
- values["case-id"],
286
- values["extension-source-file"],
287
- values["extension-configuration-file"],
288
- values["extension-redacted-configuration-file"],
289
- ].some(Boolean) ||
290
- values["task-verdict-policy"] !== undefined ||
291
- (values["replace-builtin-grader"] ?? []).length > 0
292
- );
222
+ return EXTENSION_OPTIONS.some((name) => {
223
+ const value = values[name];
224
+ if (Array.isArray(value)) return value.length > 0;
225
+ if (name === "task-verdict-policy") return value !== undefined;
226
+ return Boolean(value);
227
+ });
293
228
  }
294
229
 
295
230
  function extensionSources(values: Values): string[] {
296
231
  const sources = values["extension-source-file"];
297
232
  if (!sources?.length)
298
233
  throw new InvocationError("missing --extension-source-file");
299
- if (sources.some((path) => !isAbsolute(path)))
300
- throw new InvocationError("--extension-source-file must be absolute");
301
234
  return sources;
302
235
  }
303
236
 
@@ -334,42 +267,36 @@ function privateRootDeclarations(
334
267
  return [
335
268
  configRoot,
336
269
  ...protectedRoots,
337
- values["claude-credential-file"],
338
- values["codex-auth-file"],
339
- values["runtime-config-file"],
340
- values["case-file"],
341
- values["extension-command-file"],
342
- ...(values["extension-source-file"] ?? []),
343
- values["extension-configuration-file"],
344
- values["extension-redacted-configuration-file"],
345
- values["case-source-root"],
346
- values["case-source-map-file"],
347
- values["semantic-adapter-module"],
348
- values["advisory-adapter-module"],
270
+ ...optionsWith("private", true).flatMap((name) => values[name] ?? []),
349
271
  ].filter((value): value is string => Boolean(value));
350
272
  }
351
273
 
352
274
  function commonCodexOptions(
353
275
  values: Values,
354
- routes: Routes,
355
276
  roots: Roots,
356
277
  privateRoots: string[],
357
278
  ) {
358
- if (![routes.codex, routes.semanticCodex, routes.advisoryCodex].some(Boolean))
359
- return undefined;
360
279
  return {
361
- binary: absoluteOption(values["codex-bin"], "--codex-bin"),
362
- authFile: absoluteOption(values["codex-auth-file"], "--codex-auth-file"),
363
- timeoutMs:
364
- values["codex-timeout-ms"] === undefined
365
- ? undefined
366
- : Number(values["codex-timeout-ms"]),
280
+ binary: requiredOption(values["codex-bin"], "--codex-bin"),
281
+ authFile: requiredOption(values["codex-auth-file"], "--codex-auth-file"),
282
+ retainHostDiagnostics: values["retain-host-diagnostics"] === true,
283
+ timeoutMs: codexTimeout(values["codex-timeout-ms"]),
367
284
  projectRoot: roots.projectRoot,
368
285
  resultsRoot: roots.resultsRoot,
369
286
  additionalProtectedRoots: [...privateRoots, roots.runStateRoot],
370
287
  };
371
288
  }
372
289
 
290
+ function codexTimeout(value: string | undefined): number | undefined {
291
+ if (value === undefined) return undefined;
292
+ const timeout = Number(value);
293
+ if (!Number.isSafeInteger(timeout) || timeout < 1 || timeout > 30 * 60_000)
294
+ throw new InvocationError(
295
+ "invalid --codex-timeout-ms; supply a positive integer at most 1800000 (30 minutes)",
296
+ );
297
+ return timeout;
298
+ }
299
+
373
300
  function claudeHostOptions(
374
301
  values: Values,
375
302
  routes: Routes,
@@ -379,10 +306,11 @@ function claudeHostOptions(
379
306
  ) {
380
307
  if (!routes.claude) return undefined;
381
308
  return {
382
- binary: absoluteOption(values["claude-bin"], "--claude-bin"),
309
+ retainHostDiagnostics: values["retain-host-diagnostics"] === true,
310
+ binary: requiredOption(values["claude-bin"], "--claude-bin"),
383
311
  ...(values["claude-credential-file"]
384
312
  ? {
385
- credentialFile: absoluteOption(
313
+ credentialFile: requiredOption(
386
314
  values["claude-credential-file"],
387
315
  "--claude-credential-file",
388
316
  ),
@@ -390,7 +318,7 @@ function claudeHostOptions(
390
318
  : {}),
391
319
  ...(values["claude-uv-cache-dir"]
392
320
  ? {
393
- uvCacheDir: absoluteOption(
321
+ uvCacheDir: requiredOption(
394
322
  values["claude-uv-cache-dir"],
395
323
  "--claude-uv-cache-dir",
396
324
  ),
@@ -410,17 +338,11 @@ function extensionInvocation(values: Values) {
410
338
  const command = values["extension-command-file"];
411
339
  if (!command) return undefined;
412
340
  return {
413
- commandFile: absoluteOption(command, "--extension-command-file"),
341
+ commandFile: requiredOption(command, "--extension-command-file"),
414
342
  sourceFiles: extensionSources(values),
415
343
  caseId: requiredOption(values["case-id"], "--case-id"),
416
- configurationFile: optionalAbsolute(
417
- values["extension-configuration-file"],
418
- "--extension-configuration-file",
419
- ),
420
- redactedConfigurationFile: optionalAbsolute(
421
- values["extension-redacted-configuration-file"],
422
- "--extension-redacted-configuration-file",
423
- ),
344
+ configurationFile: values["extension-configuration-file"],
345
+ redactedConfigurationFile: values["extension-redacted-configuration-file"],
424
346
  taskVerdictPolicy: values["task-verdict-policy"],
425
347
  replaceBuiltinGraders: values["replace-builtin-grader"] ?? [],
426
348
  };
@@ -435,16 +357,15 @@ const CODEX_MODEL_KEYS = {
435
357
  function codexRoleOptions(
436
358
  values: Values,
437
359
  common: ReturnType<typeof commonCodexOptions>,
438
- enabled: boolean,
439
360
  role: keyof typeof CODEX_MODEL_KEYS,
440
361
  ) {
441
- if (!enabled) return undefined;
442
- if (!common)
443
- throw new InvocationError("Codex options require a Codex host route");
444
362
  const [modelKey, effortKey] = CODEX_MODEL_KEYS[role];
445
363
  return {
446
364
  ...(role === "candidate"
447
- ? { entrypoint: codexEntrypoint(values["codex-entrypoint"]) }
365
+ ? {
366
+ entrypoint: values["codex-entrypoint"] as
367
+ "exec" | "app-server" | undefined,
368
+ }
448
369
  : {}),
449
370
  ...common,
450
371
  model: requiredOption(values[modelKey], `--${modelKey}`),
@@ -452,15 +373,25 @@ function codexRoleOptions(
452
373
  };
453
374
  }
454
375
 
455
- function codexEntrypoint(
456
- value: string | undefined,
457
- ): "exec" | "app-server" | undefined {
458
- if (value === undefined) return undefined;
459
- if (value !== "exec" && value !== "app-server")
460
- throw new InvocationError(
461
- "--codex-entrypoint requires --host codex and exec or app-server",
462
- );
463
- return value;
376
+ function selectedCodexOptions(
377
+ values: Values,
378
+ routes: Routes,
379
+ roots: Roots,
380
+ privateRoots: string[],
381
+ ) {
382
+ if (!routes.anyCodex) return {};
383
+ const common = commonCodexOptions(values, roots, privateRoots);
384
+ return {
385
+ codex: routes.codex
386
+ ? codexRoleOptions(values, common, "candidate")
387
+ : undefined,
388
+ semanticCodex: routes.semanticCodex
389
+ ? codexRoleOptions(values, common, "semantic")
390
+ : undefined,
391
+ advisoryCodex: routes.advisoryCodex
392
+ ? codexRoleOptions(values, common, "advisory")
393
+ : undefined,
394
+ };
464
395
  }
465
396
 
466
397
  function invocationInputs(
@@ -472,55 +403,30 @@ function invocationInputs(
472
403
  roots,
473
404
  privateRoots,
474
405
  toolchainBinDir,
475
- codexCommon,
406
+ codexOptions,
476
407
  claudeOptions,
477
408
  trials,
478
409
  } = context;
479
410
  return {
480
411
  json: values.json ?? false,
481
- deprecatedRuntimeOptions: (
482
- ["toolchain-bin-dir", "claude-uv-cache-dir"] as const
483
- ).filter((name) => values[name] !== undefined),
484
- dry: values.dry ?? false,
485
- runtimeConfigFile: optionalAbsolute(
486
- values["runtime-config-file"],
487
- "--runtime-config-file",
412
+ runManifestFile: values["run-manifest-file"],
413
+ protectedRoots: context.protectedRoots,
414
+ deprecatedRuntimeOptions: optionsWith("section", "deprecated").filter(
415
+ (name) => values[name] !== undefined,
488
416
  ),
489
- caseFile: optionalAbsolute(values["case-file"], "--case-file"),
417
+ dry: values.dry ?? false,
418
+ runtimeConfigFile: values["runtime-config-file"],
419
+ caseFile: values["case-file"],
490
420
  extension: extensionInvocation(values),
491
- caseSourceRoot: optionalAbsolute(
492
- values["case-source-root"],
493
- "--case-source-root",
494
- ),
495
- caseSourceMapFile: optionalAbsolute(
496
- values["case-source-map-file"],
497
- "--case-source-map-file",
498
- ),
421
+ caseSourceRoot: values["case-source-root"],
422
+ caseSourceMapFile: values["case-source-map-file"],
499
423
  adapterModule: routes.builtinHost
500
424
  ? undefined
501
- : absoluteOption(values["adapter-module"], "--adapter-module"),
502
- semanticAdapterModule: optionalAbsolute(
503
- values["semantic-adapter-module"],
504
- "--semantic-adapter-module",
505
- ),
506
- semanticCodex: codexRoleOptions(
507
- values,
508
- codexCommon,
509
- routes.semanticCodex,
510
- "semantic",
511
- ),
512
- advisoryAdapterModule: optionalAbsolute(
513
- values["advisory-adapter-module"],
514
- "--advisory-adapter-module",
515
- ),
516
- advisoryCodex: codexRoleOptions(
517
- values,
518
- codexCommon,
519
- routes.advisoryCodex,
520
- "advisory",
521
- ),
425
+ : requiredOption(values["adapter-module"], "--adapter-module"),
426
+ semanticAdapterModule: values["semantic-adapter-module"],
427
+ advisoryAdapterModule: values["advisory-adapter-module"],
522
428
  advisoryExcludedPaths: values["advisory-exclude"] ?? [],
523
- codex: codexRoleOptions(values, codexCommon, routes.codex, "candidate"),
429
+ ...codexOptions,
524
430
  claude: claudeOptions,
525
431
  shellIsolation: shellIsolationOptions(
526
432
  values,
@@ -532,10 +438,7 @@ function invocationInputs(
532
438
  values["runner-build-digest"],
533
439
  "--runner-build-digest",
534
440
  ),
535
- runnerCheckoutRoot: optionalAbsolute(
536
- values["runner-checkout-root"],
537
- "--runner-checkout-root",
538
- ),
441
+ runnerCheckoutRoot: values["runner-checkout-root"],
539
442
  projectDigest: optionalDigest(values["project-digest"], "--project-digest"),
540
443
  ...trials,
541
444
  };
@@ -558,14 +461,8 @@ function shellIsolationOptions(
558
461
  function invocationContext(values: Values) {
559
462
  const trials = trialParameters(values);
560
463
  const protectedRoots = values["protected-root"] ?? [];
561
- if (protectedRoots.some((path) => !isAbsolute(path)))
562
- throw new InvocationError("--protected-root must be absolute");
563
- const toolchainBinDir = optionalAbsolute(
564
- values["toolchain-bin-dir"],
565
- "--toolchain-bin-dir",
566
- );
464
+ const toolchainBinDir = values["toolchain-bin-dir"];
567
465
  const routes = hostRoutes(values);
568
- validateHostCompatibility(values, routes, protectedRoots);
569
466
  const roots = rootParameters(values);
570
467
  validateExtensionSelection(values);
571
468
  const privateRoots = privateRootDeclarations(
@@ -573,7 +470,12 @@ function invocationContext(values: Values) {
573
470
  roots.configRoot,
574
471
  protectedRoots,
575
472
  );
576
- const codexCommon = commonCodexOptions(values, routes, roots, privateRoots);
473
+ const codexOptions = selectedCodexOptions(
474
+ values,
475
+ routes,
476
+ roots,
477
+ privateRoots,
478
+ );
577
479
  const claudeOptions = claudeHostOptions(
578
480
  values,
579
481
  routes,
@@ -584,18 +486,113 @@ function invocationContext(values: Values) {
584
486
  return {
585
487
  routes,
586
488
  roots,
489
+ protectedRoots,
587
490
  privateRoots,
588
491
  toolchainBinDir,
589
- codexCommon,
492
+ codexOptions,
590
493
  claudeOptions,
591
494
  trials,
592
495
  };
593
496
  }
594
497
 
595
498
  /** Decode CLI flags in their documented validation order. */
596
- export function parseInvocation(argv: string[]) {
499
+ export async function parseInvocation(argv: string[]) {
500
+ if (argv[0] !== "run")
501
+ throw new InvocationError(
502
+ "unknown command; available commands: demo, init, run, report, prune; run sevro --help",
503
+ );
597
504
  const parsed = cliArguments(argv);
598
- if (parsed.positionals.length !== 1 || parsed.positionals[0] !== "run")
505
+ if (parsed.positionals.length !== 1)
599
506
  throw new InvocationError("expected the run command");
507
+ parsed.values = await savedRunValues(parsed.values);
508
+ applyRunDefaults(parsed.values);
509
+ validateHostCompatibility(
510
+ parsed.values,
511
+ hostRoutes(parsed.values),
512
+ parsed.values["protected-root"] ?? [],
513
+ );
514
+ applyRootDefaults(parsed.values);
515
+ resolveNativeBinaries(parsed.values);
516
+ await canonicalizePaths(parsed.values);
600
517
  return invocationInputs(parsed.values, invocationContext(parsed.values));
601
518
  }
519
+
520
+ function resolveNativeBinaries(values: Values): void {
521
+ const routes = hostRoutes(values);
522
+ if (routes.anyCodex) values["codex-bin"] ??= nativeBinary("codex");
523
+ if (routes.claude) values["claude-bin"] ??= nativeBinary("claude");
524
+ }
525
+
526
+ function nativeBinary(host: "codex" | "claude"): string {
527
+ const binary = which(host);
528
+ if (!binary)
529
+ throw new InvocationError(
530
+ `selected ${host} executable was not found on PATH; install ${host} or supply --${host}-bin <path>`,
531
+ );
532
+ return binary;
533
+ }
534
+
535
+ export type Invocation = Awaited<ReturnType<typeof parseInvocation>>;
536
+
537
+ /** Keep all selected native roles visible to protection and evidence callers. */
538
+ export function nativeRoutes(
539
+ invocation: Pick<
540
+ Invocation,
541
+ "codex" | "claude" | "semanticCodex" | "advisoryCodex"
542
+ >,
543
+ ) {
544
+ return [
545
+ invocation.codex,
546
+ invocation.claude,
547
+ invocation.semanticCodex,
548
+ invocation.advisoryCodex,
549
+ ].filter((host) => host !== undefined);
550
+ }
551
+
552
+ function applyRunDefaults(values: Values): void {
553
+ values.condition ??= "passive";
554
+ values.trials ??= "1";
555
+ values.jobs ??= "3";
556
+ values.threshold ??= "1";
557
+ }
558
+
559
+ function applyRootDefaults(values: Values): void {
560
+ values["project-root"] ??= process.cwd();
561
+ values["results-root"] ??= join(
562
+ resolve(values["project-root"]),
563
+ ".sevro",
564
+ "results",
565
+ );
566
+ }
567
+
568
+ async function canonicalOption(path: string, option: string): Promise<string> {
569
+ try {
570
+ return await canonicalRuntimeRoot(resolve(path));
571
+ } catch (cause) {
572
+ const error = cause as NodeJS.ErrnoException;
573
+ throw new InvocationError(
574
+ `--${option} cannot be resolved at ${path}: filesystem ${error.syscall ?? "realpath"} failed (${error.code ?? "unknown"}); supply a usable file or directory path`,
575
+ { cause },
576
+ );
577
+ }
578
+ }
579
+
580
+ async function canonicalizePaths(values: Values): Promise<void> {
581
+ for (const name of PATH_OPTIONS) {
582
+ const value = values[name];
583
+ if (value !== undefined)
584
+ values[name] = await canonicalOption(
585
+ requiredOption(value, `--${name}`),
586
+ name,
587
+ );
588
+ }
589
+ for (const name of PATH_LIST_OPTIONS) {
590
+ const paths = values[name];
591
+ if (paths)
592
+ values[name] = await Promise.all(
593
+ paths.map((path) =>
594
+ canonicalOption(requiredOption(path, `--${name}`), name),
595
+ ),
596
+ );
597
+ }
598
+ }