@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
@@ -0,0 +1,20 @@
1
+ export class CommandCancellation {
2
+ private readonly controller = new AbortController();
3
+ private readonly interrupt = () => {
4
+ this.controller.abort("SIGINT");
5
+ };
6
+ private readonly terminate = () => {
7
+ this.controller.abort("SIGTERM");
8
+ };
9
+ get signal(): AbortSignal {
10
+ return this.controller.signal;
11
+ }
12
+ constructor() {
13
+ process.on("SIGINT", this.interrupt);
14
+ process.on("SIGTERM", this.terminate);
15
+ }
16
+ dispose(): void {
17
+ process.off("SIGINT", this.interrupt);
18
+ process.off("SIGTERM", this.terminate);
19
+ }
20
+ }
@@ -0,0 +1,87 @@
1
+ import { prepareRunInvocation, type PreparedInvocation } from "./preparation";
2
+ import { evaluateInvocation } from "./evaluation";
3
+ import { CommandCancellation } from "./cancellation";
4
+ import { display, displayFailure, runnerFailureCategory } from "./presentation";
5
+ import { displayEffectiveSettings } from "./settings";
6
+ import { jsonOutputRequested } from "./run-options";
7
+ import { retainCliResult } from "./completion";
8
+
9
+ type CommandRelease = (() => Promise<void>) | undefined;
10
+
11
+ export async function main(
12
+ argv: string[],
13
+ release?: () => Promise<void>,
14
+ ): Promise<void> {
15
+ const json = jsonOutputRequested(argv);
16
+ let prepared: PreparedInvocation;
17
+ try {
18
+ prepared = await prepareRunInvocation(argv);
19
+ } catch (error) {
20
+ await releaseBeforeDisplay(release, 64);
21
+ displayFailure(
22
+ error,
23
+ json,
24
+ 64,
25
+ "invalid invocation",
26
+ argv[0] === "run" ? "run" : "",
27
+ );
28
+ return;
29
+ }
30
+ const cancellation = new CommandCancellation();
31
+ try {
32
+ displayEffectiveSettings(prepared);
33
+ const { result } = await evaluateInvocation(prepared, cancellation.signal);
34
+ const completion = await retainCompletion(
35
+ result,
36
+ prepared.invocation.resultsRoot,
37
+ );
38
+ await releaseBeforeDisplay(release, result.exitCode);
39
+ display(result, prepared.invocation.json, completion);
40
+ process.exitCode = result.exitCode;
41
+ } catch (error) {
42
+ await releaseBeforeDisplay(release, 70);
43
+ displayFailure(
44
+ error,
45
+ prepared.invocation.json,
46
+ runnerFailureCategory(error),
47
+ "runner failure",
48
+ );
49
+ } finally {
50
+ cancellation.dispose();
51
+ }
52
+ }
53
+
54
+ async function retainCompletion(
55
+ result: Parameters<typeof retainCliResult>[0],
56
+ resultsRoot: string,
57
+ ) {
58
+ try {
59
+ return await retainCliResult(result, resultsRoot);
60
+ } catch (cause) {
61
+ if (result.exitCode === 0)
62
+ throw new Error(
63
+ "CLI result/latest could not be retained; check --results-root permissions",
64
+ { cause },
65
+ );
66
+ process.stderr.write(
67
+ "sevro: CLI result/latest could not be retained; original run outcome preserved; inspect evidence directly\n",
68
+ );
69
+ return undefined;
70
+ }
71
+ }
72
+
73
+ async function releaseBeforeDisplay(
74
+ release: CommandRelease,
75
+ exitCode: number,
76
+ ): Promise<void> {
77
+ try {
78
+ await release?.();
79
+ } catch (error) {
80
+ if (exitCode === 0) throw error;
81
+ const detail =
82
+ error instanceof Error
83
+ ? error.message
84
+ : "temporary project could not be removed";
85
+ process.stderr.write(`sevro: demo cleanup failed: ${detail}\n`);
86
+ }
87
+ }
@@ -0,0 +1,15 @@
1
+ import { dirname, join } from "node:path";
2
+ import { atomicWriteJson } from "../storage";
3
+ import type { CliResult } from "../engine";
4
+ import { createReport } from "../report";
5
+ import { withResultsLock } from "../results-lock";
6
+
7
+ /** Latest means the last successfully retained CLI result, including dry/failing runs. */
8
+ export async function retainCliResult(result: CliResult, resultsRoot: string) {
9
+ return withResultsLock(resultsRoot, async () => {
10
+ const resultFile = join(dirname(result.evidencePath), "result.json");
11
+ await atomicWriteJson(resultFile, result);
12
+ await atomicWriteJson(join(resultsRoot, "latest.json"), result);
13
+ return { resultFile, report: await createReport([resultFile]) };
14
+ });
15
+ }
@@ -0,0 +1,61 @@
1
+ import { examplePath } from "../runner-paths";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { main } from "./command";
6
+ import { InvocationError } from "./invocation";
7
+ import { displayFailure } from "./presentation";
8
+
9
+ /** Run the packaged deterministic case without inheriting a caller's project policy. */
10
+ export async function demoCommand(argv: string[]): Promise<void> {
11
+ const json = argv.includes("--json");
12
+ if (argv.some((arg) => arg !== "--json")) {
13
+ displayFailure(
14
+ new InvocationError("demo accepts only --json; run sevro demo --help"),
15
+ json,
16
+ 64,
17
+ "invalid demo invocation",
18
+ "demo",
19
+ );
20
+ return;
21
+ }
22
+ let projectRoot: string;
23
+ try {
24
+ projectRoot = await mkdtemp(join(tmpdir(), "sevro-demo-"));
25
+ } catch (cause) {
26
+ displayFailure(
27
+ new Error(
28
+ `demo temporary project could not be created under ${tmpdir()}; set TMPDIR to a writable directory`,
29
+ { cause },
30
+ ),
31
+ json,
32
+ 70,
33
+ "demo preparation failed",
34
+ );
35
+ return;
36
+ }
37
+ await main(
38
+ [
39
+ "run",
40
+ ...(json ? ["--json"] : []),
41
+ "--case-file",
42
+ examplePath("basic", "graded.json"),
43
+ "--adapter-module",
44
+ examplePath("basic", "host.ts"),
45
+ "--project-root",
46
+ projectRoot,
47
+ "--results-root",
48
+ join(process.cwd(), ".sevro", "results"),
49
+ ],
50
+ demoCleanup(projectRoot),
51
+ );
52
+ }
53
+
54
+ function demoCleanup(projectRoot: string): () => Promise<void> {
55
+ let attempted = false;
56
+ return async () => {
57
+ if (attempted) return;
58
+ attempted = true;
59
+ await rm(projectRoot, { recursive: true, force: true });
60
+ };
61
+ }
@@ -0,0 +1,55 @@
1
+ import { runEvaluation } from "../engine";
2
+ import {
3
+ packageBuildDigest,
4
+ projectIdentityDigest,
5
+ projectProvenance,
6
+ } from "../provenance";
7
+ import { selectedCase } from "./extension";
8
+ import type { PreparedInvocation } from "./preparation";
9
+ import { assessmentSettings, effectiveSettings } from "./settings";
10
+ import { displayProgress } from "./progress";
11
+
12
+ export async function evaluateInvocation(
13
+ prepared: PreparedInvocation,
14
+ signal: AbortSignal,
15
+ ) {
16
+ const { invocation, preparationSources, host, semanticHost, advisoryHost } =
17
+ prepared;
18
+ const { caseData, extension } = await selectedCase(prepared, signal);
19
+ return runEvaluation({
20
+ onProgress: displayProgress,
21
+ resolvedRunSettings: effectiveSettings(prepared),
22
+ assessmentSettings: assessmentSettings(prepared),
23
+ runtimePolicy: prepared.runtimePolicy,
24
+ projectRoot: invocation.projectRoot,
25
+ resultsRoot: invocation.resultsRoot,
26
+ runStateRoot: invocation.runStateRoot,
27
+ case: caseData,
28
+ extension,
29
+ preparationSources,
30
+ host,
31
+ semanticHost,
32
+ advisoryHost,
33
+ advisoryExcludedPaths: invocation.advisoryExcludedPaths,
34
+ shellIsolation: invocation.shellIsolation,
35
+ runnerBuildDigest:
36
+ invocation.runnerBuildDigest ?? (await packageBuildDigest()),
37
+ runnerCheckoutRoot: invocation.runnerCheckoutRoot,
38
+ projectDigest:
39
+ invocation.projectDigest ??
40
+ (await projectIdentityDigest(
41
+ invocation.projectRoot,
42
+ await projectProvenance(invocation.projectRoot, [
43
+ invocation.resultsRoot,
44
+ invocation.runStateRoot,
45
+ ]),
46
+ [invocation.resultsRoot, invocation.runStateRoot],
47
+ )),
48
+ condition: invocation.condition,
49
+ trialCount: invocation.trialCount,
50
+ jobs: invocation.jobs,
51
+ passThreshold: invocation.passThreshold,
52
+ dry: invocation.dry,
53
+ signal,
54
+ });
55
+ }
@@ -0,0 +1,79 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import type { ResolvedCase } from "../engine";
3
+ import { openExtensionSession, type ExtensionCase } from "../extension-session";
4
+ import { resolvedFixture } from "../resolved-case";
5
+ import { InvocationError, type Invocation } from "./invocation";
6
+ import { parseCase, loadExtensionOptions } from "./loading";
7
+ import type { PreparedInvocation } from "./preparation";
8
+
9
+ function selectExtensionCase(
10
+ cases: ExtensionCase[],
11
+ caseId: string,
12
+ ): { caseData: ResolvedCase; resolvedCase: ExtensionCase } {
13
+ const resolvedCase = cases.find((item) => item.id === caseId);
14
+ if (!resolvedCase)
15
+ throw new InvocationError("extension did not resolve the selected case");
16
+ const caseData = parseCase({
17
+ ...resolvedCase,
18
+ fixture: resolvedFixture(resolvedCase.fixture),
19
+ });
20
+ return { caseData, resolvedCase };
21
+ }
22
+
23
+ async function resolveSelectedExtension(
24
+ prepared: PreparedInvocation,
25
+ selected: NonNullable<Invocation["extension"]>,
26
+ signal: AbortSignal,
27
+ ) {
28
+ const { invocation, host } = prepared;
29
+ const options = await loadExtensionOptions(selected);
30
+ const hostCapabilities = [
31
+ ...(host.instrumentation ?? []).map((item) => item.id),
32
+ ...(host.hostCapabilities ?? []),
33
+ ];
34
+ const session = await openExtensionSession({
35
+ ...options,
36
+ sourceFiles: selected.sourceFiles,
37
+ engineCapabilities: [
38
+ "sevro.host.exec",
39
+ "sevro.fixture.setup",
40
+ "sevro.case.host-route",
41
+ ],
42
+ hostCapabilities,
43
+ taskVerdictPolicy: selected.taskVerdictPolicy,
44
+ replaceBuiltinGraders: selected.replaceBuiltinGraders,
45
+ signal,
46
+ });
47
+ const chosen = selectExtensionCase(
48
+ await session.resolve(
49
+ pathToFileURL(invocation.projectRoot).href,
50
+ { caseIds: [selected.caseId] },
51
+ {
52
+ id: host.id,
53
+ model: host.model,
54
+ effort: host.effort,
55
+ capabilities: hostCapabilities,
56
+ },
57
+ ),
58
+ selected.caseId,
59
+ );
60
+ return {
61
+ caseData: chosen.caseData,
62
+ extension: { session, resolvedCase: chosen.resolvedCase },
63
+ };
64
+ }
65
+
66
+ export async function selectedCase(
67
+ prepared: PreparedInvocation,
68
+ signal: AbortSignal,
69
+ ) {
70
+ if (prepared.invocation.extension)
71
+ return resolveSelectedExtension(
72
+ prepared,
73
+ prepared.invocation.extension,
74
+ signal,
75
+ );
76
+ if (!prepared.caseData)
77
+ throw new InvocationError("invalid resolved case file");
78
+ return { caseData: prepared.caseData, extension: undefined };
79
+ }
@@ -0,0 +1,199 @@
1
+ import { RUN_OPTIONS, optionsWith, type RunOptionName } from "./run-options";
2
+ import packageJson from "../../package.json" with { type: "json" };
3
+ const { version } = packageJson;
4
+
5
+ const TOP_LEVEL_HELP = `Usage: sevro <command> [options]
6
+
7
+ Examples:
8
+ sevro demo
9
+ sevro init --template response --directory ./my-evaluation
10
+ sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\
11
+ --project-root /absolute/project --results-root /absolute/results \\
12
+ --condition passive --trials 1 --threshold 1
13
+ sevro run --help
14
+ sevro report --result-file /absolute/results/run/result.json
15
+ sevro prune
16
+
17
+ Commands:
18
+ demo Run the packaged credential-free assessed example; use demo --help.
19
+ init Create a new evaluation project; use init --help.
20
+ run Evaluate one resolved case or extension case; use run --help.
21
+ report Summarize retained results; use report --help.
22
+ prune Remove retained results using a retention policy; use prune --help.
23
+
24
+ Options:
25
+ -h, --help Show help without preparing a run.
26
+ -v, --version Print the installed Sevro package version.
27
+ `;
28
+
29
+ const RUN_HELP = `Usage: sevro run [options]
30
+
31
+ Examples:
32
+ sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\
33
+ --project-root /absolute/project --results-root /absolute/results \\
34
+ --condition passive --trials 1 --threshold 1
35
+ Add --dry to prepare without calling the candidate or graders.
36
+ Add --json to save a sevro.cli-result.v1 result from stdout.
37
+
38
+ Required:
39
+ ${runOptionHelp("required")}
40
+
41
+ Common options and defaults:
42
+ ${runOptionHelp("common")}
43
+ Precedence: built-in defaults, saved settings, then explicit CLI options.
44
+ Manifest paths use its own directory; CLI paths use the current directory.
45
+ --no-dry, --no-shell-isolation and other --no-<boolean> flags override saved true.
46
+ Relative run paths resolve from the current directory and are canonicalized before protection checks.
47
+
48
+ Bundled hosts:
49
+ ${runOptionHelp("native")}
50
+ Native timeout defaults to 600000 ms; shell checks expect exit 0 within 30000 ms.
51
+
52
+ Extension cases:
53
+ ${runOptionHelp("extension")}
54
+
55
+ Optional grading routes (none selected by default):
56
+ ${runOptionHelp("grading")}
57
+
58
+ Provenance overrides (normally derived automatically):
59
+ ${runOptionHelp("provenance")}
60
+
61
+ Deprecated runtime options:
62
+ ${runOptionHelp("deprecated")}
63
+
64
+ -h, --help Show this help without preparing a run.
65
+ Reference: docs/development-cli.md, docs/run-settings-v1.md and docs/results-v1.md in the installed package.
66
+ `;
67
+
68
+ function runOptionHelp(
69
+ section: (typeof RUN_OPTIONS)[RunOptionName]["section"],
70
+ ): string {
71
+ return optionsWith("section", section)
72
+ .map((name) => ` --${name} ${RUN_OPTIONS[name].help}`)
73
+ .join("\n");
74
+ }
75
+
76
+ const DEMO_HELP = `Usage: sevro demo [--json]
77
+
78
+ Examples:
79
+ sevro demo
80
+ sevro demo --json
81
+
82
+ Run the packaged deterministic fixture and adapter without model credentials.
83
+ Shows an assessed verdict and retains evidence in .sevro/results beneath the current directory.
84
+ Caller project files, sevro.json and native configuration are not loaded.
85
+
86
+ Options:
87
+ --json Emit one sevro.cli-result.v1 document on stdout.
88
+ -h, --help Show this help without preparing a run.
89
+ `;
90
+
91
+ const REPORT_HELP = `Usage: sevro report [options]
92
+
93
+ Examples:
94
+ sevro report --latest
95
+ sevro report --result-file /absolute/results/run/result.json
96
+ sevro report --result-file /absolute/results/first/result.json \\
97
+ --result-file /absolute/results/second/result.json --json
98
+
99
+ Required:
100
+ --latest OR --result-file <path> A retained result; repeat paths for distinct runs.
101
+ Relative or absolute paths use the current directory.
102
+ Keep each result's referenced evidence available and unchanged.
103
+
104
+ Options and defaults:
105
+ --latest Read the last retained CLI result, including dry or failed runs.
106
+ --results-root <path> With --latest, override <cwd>/.sevro/results.
107
+ --json Emit sevro.report.v1 JSON; Markdown by default.
108
+ -h, --help Show this help without reading result files.
109
+ `;
110
+
111
+ const PRUNE_HELP = `Usage: sevro prune [options]
112
+
113
+ Examples:
114
+ sevro prune
115
+ sevro prune --results-root ./other-results --keep 5
116
+ sevro prune --older-than 30d
117
+ sevro prune --latest
118
+ sevro prune --native-transcripts --older-than 30d
119
+
120
+ Defaults: keep the newest 10 completed results under <cwd>/.sevro/results.
121
+ Select at most one explicit retention policy:
122
+ --keep <positive-integer> Keep this many newest results.
123
+ --latest Keep only the newest result (same as --keep 1).
124
+ --older-than <duration> Remove results older than a positive integer plus ms, s, m, h, d or w.
125
+ --results-root <path> Relative or absolute results root, resolved from cwd.
126
+ --native-transcripts Remove only native transcript bundles; keep results and hashes.
127
+ -h, --help Show help without reading or deleting results.
128
+
129
+ Age and ordering use result.json modification times; equal times sort by path.
130
+ Each retained attempt counts separately, including dry, failed and interrupted runs.
131
+ Active/unrecognized attempts and directories without result.json are preserved.
132
+ Evidence is permanently deleted. Remaining results stay usable by sevro report;
133
+ latest.json is updated, or removed when no completed results remain.
134
+ With --native-transcripts, no policy removes bundles from all completed results;
135
+ --keep/--latest preserve bundles for the newest results, and --older-than selects older results.
136
+ Result/evidence files and latest.json stay unchanged. Reports label removed bundles as pruned.
137
+ Missing or empty results roots are a successful no-op. Invalid or unreadable inputs exit 64.
138
+ Reference: docs/reading-results.md in the installed package.
139
+ `;
140
+
141
+ const INIT_HELP = `Usage: sevro init [options]
142
+
143
+ Examples:
144
+ sevro init --template response --directory ./my-evaluation
145
+ cd my-evaluation
146
+ sevro run --run-manifest-file run.json --dry
147
+ sevro run --run-manifest-file run.json
148
+ sevro report --latest
149
+
150
+ Options and defaults:
151
+ --template <response|repository-skill|coding> Default: response.
152
+ --directory <new-path> Default: ./sevro-evaluation; refuses existing paths.
153
+ -h, --help Show this help without creating files.
154
+
155
+ Response and coding use deterministic adapters and real assertions, including negative controls.
156
+ Coding checks need sandbox-exec (macOS) or bubblewrap/socat (Linux).
157
+ Repository-skill uses native Codex and requires explicit --model, --effort and --codex-auth-file.
158
+ Read the generated README.md for prerequisites and live commands; dry preparation is not an assessment.
159
+ Reference: docs/evaluation-workflow.md in the installed package.
160
+ `;
161
+
162
+ const HELP_REQUESTS: Record<string, string> = {
163
+ "": TOP_LEVEL_HELP,
164
+ "--help": TOP_LEVEL_HELP,
165
+ "-h": TOP_LEVEL_HELP,
166
+ help: TOP_LEVEL_HELP,
167
+ "run --help": RUN_HELP,
168
+ "run -h": RUN_HELP,
169
+ "help run": RUN_HELP,
170
+ "demo --help": DEMO_HELP,
171
+ "demo -h": DEMO_HELP,
172
+ "help demo": DEMO_HELP,
173
+ "init --help": INIT_HELP,
174
+ "init -h": INIT_HELP,
175
+ "help init": INIT_HELP,
176
+ "report --help": REPORT_HELP,
177
+ "report -h": REPORT_HELP,
178
+ "help report": REPORT_HELP,
179
+ "prune --help": PRUNE_HELP,
180
+ "prune -h": PRUNE_HELP,
181
+ "help prune": PRUNE_HELP,
182
+ };
183
+
184
+ /** Handle informational commands before loading inputs or creating run state. */
185
+ export function informationCommand(argv: string[]): boolean {
186
+ const request = argv.slice(1).some((arg) => ["--help", "-h"].includes(arg))
187
+ ? [argv[0], "--help"].join(" ")
188
+ : argv.join(" ");
189
+ if (["--version", "-v"].includes(request)) {
190
+ process.stdout.write(`sevro ${version}\n`);
191
+ return true;
192
+ }
193
+ const help = Object.hasOwn(HELP_REQUESTS, request)
194
+ ? HELP_REQUESTS[request]
195
+ : undefined;
196
+ if (help === undefined) return false;
197
+ process.stdout.write(help);
198
+ return true;
199
+ }
@@ -0,0 +1,55 @@
1
+ import type { HostAdapter } from "../engine";
2
+ import { createClaudeHost } from "../hosts/claude";
3
+ import { createCodexHost } from "../hosts/codex";
4
+ import { codexAgentConcurrency } from "../hosts/codex-configuration";
5
+ import { InvocationError, nativeRoutes, type Invocation } from "./invocation";
6
+ import { loadHost } from "./loading";
7
+
8
+ export async function selectedConcurrency(
9
+ invocation: Invocation,
10
+ configRoot: string,
11
+ ): Promise<number | null> {
12
+ return nativeRoutes({ ...invocation, claude: undefined }).length
13
+ ? codexAgentConcurrency(configRoot)
14
+ : null;
15
+ }
16
+
17
+ export async function candidateHost(
18
+ invocation: Invocation,
19
+ agentConcurrencyLimit: number | null,
20
+ ): Promise<HostAdapter> {
21
+ if (invocation.codex)
22
+ return retainExecutable(
23
+ createCodexHost({ ...invocation.codex, agentConcurrencyLimit }),
24
+ invocation.codex.binary,
25
+ );
26
+ if (invocation.claude)
27
+ return retainExecutable(
28
+ createClaudeHost(invocation.claude),
29
+ invocation.claude.binary,
30
+ );
31
+ if (!invocation.adapterModule)
32
+ throw new InvocationError("missing --adapter-module or --host");
33
+ return loadHost(invocation.adapterModule);
34
+ }
35
+
36
+ export async function secondaryHost(
37
+ module: string | undefined,
38
+ codex: Invocation["semanticCodex"],
39
+ agentConcurrencyLimit: number | null,
40
+ ): Promise<HostAdapter | undefined> {
41
+ if (module) return loadHost(module);
42
+ if (codex)
43
+ return retainExecutable(
44
+ createCodexHost({ ...codex, agentConcurrencyLimit }),
45
+ codex.binary,
46
+ );
47
+ return undefined;
48
+ }
49
+
50
+ function retainExecutable(host: HostAdapter, binary: string): HostAdapter {
51
+ return {
52
+ ...host,
53
+ configuration: { ...host.configuration, "sevro.host.executable": binary },
54
+ };
55
+ }
@@ -0,0 +1,31 @@
1
+ import { join } from "node:path";
2
+ import { runtimeModule } from "../runner-paths";
3
+
4
+ export function templateSettings(template: string) {
5
+ if (template === "repository-skill")
6
+ return {
7
+ "project-root": ".",
8
+ "extension-command-file": "command.json",
9
+ "extension-source-file": [
10
+ "extension.ts",
11
+ "extension-data.ts",
12
+ ".agents/skills/startup-guide/SKILL.md",
13
+ ].map(runtimeModule),
14
+ "case-id": "repository-skill",
15
+ host: "codex",
16
+ };
17
+ return {
18
+ "case-file": "case.json",
19
+ "adapter-module": runtimeModule("adapter.ts"),
20
+ "project-root": ".",
21
+ ...(template === "coding" ? { "shell-isolation": true } : {}),
22
+ };
23
+ }
24
+
25
+ export function templateCommand(destination: string) {
26
+ return [process.execPath, join(destination, runtimeModule("extension.ts"))];
27
+ }
28
+
29
+ export function nativeReadme() {
30
+ return `# Repository skill evaluation\n\nThis template mounts the actual startup-guide skill and requires Codex's explicit invocation evidence plus assertions for the start command and port. Missing evidence remains not_assessed.\n\nPrerequisites: Node.js 24.13.0 or newer, or Bun 1.3.13, plus Git, Codex on PATH, supported native isolation (sandbox-exec on macOS or bubblewrap/socat on Linux), and a readable Codex authentication file. Choose the exact model and effort explicitly. Do not store credentials in run.json.\n\n\`\`\`sh\nsevro run --run-manifest-file run.json --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json --dry\nsevro run --run-manifest-file run.json --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json\nsevro report --latest\n\`\`\`\n\nDry preparation checks mounts and declarations without calling the model. No authenticated model execution or skill dispatch is established by dry preparation. Live execution may incur provider charges. To create a negative control, change the expected port in the extension data file to 9000 while leaving the fixture at 3000; rerun and inspect the failed port assertion. Model compliance and measurements are unknown until actually executed.\n\nEdit the copied skill and assertions, prepare again, then rerun the same model/effort/condition. Keep private .sevro evidence out of Git. command.json uses the initializer's absolute selected runtime and extension paths; regenerate it after moving this project.\n`;
31
+ }