@bjoernrochel/sevro 1.0.0 → 1.1.1

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 (405) hide show
  1. package/CONTRIBUTING.md +34 -4
  2. package/README.md +7 -6
  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 +158 -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/architecture.md +5 -2
  349. package/docs/creating-cases.md +2 -3
  350. package/docs/development-cli.md +12 -7
  351. package/docs/documentation-quality.md +4 -3
  352. package/docs/evaluation-workflow.md +8 -8
  353. package/docs/getting-started.md +7 -6
  354. package/docs/guide-evaluation.md +1 -1
  355. package/docs/identity-v1.md +4 -1
  356. package/docs/installing.md +31 -13
  357. package/docs/licensing.md +2 -2
  358. package/docs/native-hosts.md +1 -1
  359. package/docs/recipes.md +41 -40
  360. package/docs/releases.md +20 -4
  361. package/docs/run-settings-v1.md +3 -3
  362. package/docs/specs/repository-guide.md +1 -1
  363. package/docs/troubleshooting.md +1 -1
  364. package/docs/typescript-quality.md +18 -1
  365. package/examples/recipes/executable.ts +19 -0
  366. package/examples/recipes/extension-artifacts.ts +1 -1
  367. package/examples/recipes/extension.ts +2 -1
  368. package/examples/recipes/modules.ts +9 -0
  369. package/examples/recipes/run-inputs.ts +14 -19
  370. package/examples/recipes/run-options.ts +9 -8
  371. package/examples/recipes/run.ts +21 -7
  372. package/examples/templates/repository-skill/extension-data.ts +1 -1
  373. package/examples/templates/repository-skill/extension.ts +2 -1
  374. package/package.json +14 -6
  375. package/src/cli/demo.ts +3 -2
  376. package/src/cli/help.ts +4 -3
  377. package/src/cli/init-settings.ts +5 -4
  378. package/src/cli/init.ts +9 -8
  379. package/src/cli/invocation.ts +2 -1
  380. package/src/cli/preparation.ts +2 -2
  381. package/src/cli.ts +1 -1
  382. package/src/executable.ts +19 -0
  383. package/src/extension-client.ts +6 -12
  384. package/src/fixtures/setup.ts +3 -2
  385. package/src/git.ts +2 -1
  386. package/src/graders/git-head.ts +3 -2
  387. package/src/graders/shell.ts +4 -3
  388. package/src/hosts/claude-keychain.ts +3 -2
  389. package/src/hosts/claude-login-refresh.ts +3 -2
  390. package/src/hosts/claude-refresh-lock.ts +2 -1
  391. package/src/hosts/claude-settings.ts +3 -1
  392. package/src/hosts/claude.ts +1 -1
  393. package/src/hosts/isolation-roots.ts +3 -2
  394. package/src/hosts/process-lifecycle.ts +4 -6
  395. package/src/hosts/protected-worktrees.ts +2 -1
  396. package/src/hosts/skill-hook-handler.ts +1 -1
  397. package/src/hosts/skill-hooks.ts +10 -2
  398. package/src/provenance.ts +7 -6
  399. package/src/results-lock.ts +4 -4
  400. package/src/run-owner.ts +15 -9
  401. package/src/runner-paths.ts +21 -0
  402. package/src/runtime/hook-processes.ts +2 -1
  403. package/src/runtime/hooks.ts +9 -7
  404. package/src/runtime-process.ts +194 -0
  405. package/src/sqlite-lock.ts +25 -0
@@ -0,0 +1,14 @@
1
+ import { dirname, join } from "node:path";
2
+ import { atomicWriteJson } from "../storage.js";
3
+ import { createReport } from "../report.js";
4
+ import { withResultsLock } from "../results-lock.js";
5
+ /** Latest means the last successfully retained CLI result, including dry/failing runs. */
6
+ export async function retainCliResult(result, resultsRoot) {
7
+ return withResultsLock(resultsRoot, async () => {
8
+ const resultFile = join(dirname(result.evidencePath), "result.json");
9
+ await atomicWriteJson(resultFile, result);
10
+ await atomicWriteJson(join(resultsRoot, "latest.json"), result);
11
+ return { resultFile, report: await createReport([resultFile]) };
12
+ });
13
+ }
14
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB;AAC1C,OAAO,EAAE,eAAe,EAAE,sBAAmB;AAE7C,OAAO,EAAE,YAAY,EAAE,qBAAkB;AACzC,OAAO,EAAE,eAAe,EAAE,2BAAwB;AAElD,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAiB,EAAE,WAAmB;IAC1E,OAAO,eAAe,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { dirname, join } from \"node:path\";\nimport { atomicWriteJson } from \"../storage\";\nimport type { CliResult } from \"../engine\";\nimport { createReport } from \"../report\";\nimport { withResultsLock } from \"../results-lock\";\n\n/** Latest means the last successfully retained CLI result, including dry/failing runs. */\nexport async function retainCliResult(result: CliResult, resultsRoot: string) {\n return withResultsLock(resultsRoot, async () => {\n const resultFile = join(dirname(result.evidencePath), \"result.json\");\n await atomicWriteJson(resultFile, result);\n await atomicWriteJson(join(resultsRoot, \"latest.json\"), result);\n return { resultFile, report: await createReport([resultFile]) };\n });\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import { examplePath } from "../runner-paths.js";
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.js";
6
+ import { InvocationError } from "./invocation.js";
7
+ import { displayFailure } from "./presentation.js";
8
+ /** Run the packaged deterministic case without inheriting a caller's project policy. */
9
+ export async function demoCommand(argv) {
10
+ const json = argv.includes("--json");
11
+ if (argv.some((arg) => arg !== "--json")) {
12
+ displayFailure(new InvocationError("demo accepts only --json; run sevro demo --help"), json, 64, "invalid demo invocation", "demo");
13
+ return;
14
+ }
15
+ let projectRoot;
16
+ try {
17
+ projectRoot = await mkdtemp(join(tmpdir(), "sevro-demo-"));
18
+ }
19
+ catch (cause) {
20
+ displayFailure(new Error(`demo temporary project could not be created under ${tmpdir()}; set TMPDIR to a writable directory`, { cause }), json, 70, "demo preparation failed");
21
+ return;
22
+ }
23
+ await main([
24
+ "run",
25
+ ...(json ? ["--json"] : []),
26
+ "--case-file",
27
+ examplePath("basic", "graded.json"),
28
+ "--adapter-module",
29
+ examplePath("basic", "host.ts"),
30
+ "--project-root",
31
+ projectRoot,
32
+ "--results-root",
33
+ join(process.cwd(), ".sevro", "results"),
34
+ ], demoCleanup(projectRoot));
35
+ }
36
+ function demoCleanup(projectRoot) {
37
+ let attempted = false;
38
+ return async () => {
39
+ if (attempted)
40
+ return;
41
+ attempted = true;
42
+ await rm(projectRoot, { recursive: true, force: true });
43
+ };
44
+ }
45
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["demo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,2BAAwB;AAC9C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,yBAAyB;AAC/C,OAAO,EAAE,MAAM,EAAE,gBAAgB;AACjC,OAAO,EAAE,IAAI,EAAE,kBAAkB;AACjC,OAAO,EAAE,IAAI,EAAE,qBAAkB;AACjC,OAAO,EAAE,eAAe,EAAE,wBAAqB;AAC/C,OAAO,EAAE,cAAc,EAAE,0BAAuB;AAEhD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;QACzC,cAAc,CACZ,IAAI,eAAe,CAAC,iDAAiD,CAAC,EACtE,IAAI,EACJ,EAAE,EACF,yBAAyB,EACzB,MAAM,CACP,CAAC;QACF,OAAO;IACT,CAAC;IACD,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CACZ,IAAI,KAAK,CACP,qDAAqD,MAAM,EAAE,sCAAsC,EACnG,EAAE,KAAK,EAAE,CACV,EACD,IAAI,EACJ,EAAE,EACF,yBAAyB,CAC1B,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,IAAI,CACR;QACE,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,aAAa;QACb,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC;QACnC,kBAAkB;QAClB,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC;QAC/B,gBAAgB;QAChB,WAAW;QACX,gBAAgB;QAChB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC;KACzC,EACD,WAAW,CAAC,WAAW,CAAC,CACzB,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,WAAmB;IACtC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,SAAS;YAAE,OAAO;QACtB,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { examplePath } from \"../runner-paths\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { main } from \"./command\";\nimport { InvocationError } from \"./invocation\";\nimport { displayFailure } from \"./presentation\";\n\n/** Run the packaged deterministic case without inheriting a caller's project policy. */\nexport async function demoCommand(argv: string[]): Promise<void> {\n const json = argv.includes(\"--json\");\n if (argv.some((arg) => arg !== \"--json\")) {\n displayFailure(\n new InvocationError(\"demo accepts only --json; run sevro demo --help\"),\n json,\n 64,\n \"invalid demo invocation\",\n \"demo\",\n );\n return;\n }\n let projectRoot: string;\n try {\n projectRoot = await mkdtemp(join(tmpdir(), \"sevro-demo-\"));\n } catch (cause) {\n displayFailure(\n new Error(\n `demo temporary project could not be created under ${tmpdir()}; set TMPDIR to a writable directory`,\n { cause },\n ),\n json,\n 70,\n \"demo preparation failed\",\n );\n return;\n }\n await main(\n [\n \"run\",\n ...(json ? [\"--json\"] : []),\n \"--case-file\",\n examplePath(\"basic\", \"graded.json\"),\n \"--adapter-module\",\n examplePath(\"basic\", \"host.ts\"),\n \"--project-root\",\n projectRoot,\n \"--results-root\",\n join(process.cwd(), \".sevro\", \"results\"),\n ],\n demoCleanup(projectRoot),\n );\n}\n\nfunction demoCleanup(projectRoot: string): () => Promise<void> {\n let attempted = false;\n return async () => {\n if (attempted) return;\n attempted = true;\n await rm(projectRoot, { recursive: true, force: true });\n };\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { runEvaluation } from "../engine.js";
2
+ import { packageBuildDigest, projectIdentityDigest, projectProvenance, } from "../provenance.js";
3
+ import { selectedCase } from "./extension.js";
4
+ import { assessmentSettings, effectiveSettings } from "./settings.js";
5
+ import { displayProgress } from "./progress.js";
6
+ export async function evaluateInvocation(prepared, signal) {
7
+ const { invocation, preparationSources, host, semanticHost, advisoryHost } = prepared;
8
+ const { caseData, extension } = await selectedCase(prepared, signal);
9
+ return runEvaluation({
10
+ onProgress: displayProgress,
11
+ resolvedRunSettings: effectiveSettings(prepared),
12
+ assessmentSettings: assessmentSettings(prepared),
13
+ runtimePolicy: prepared.runtimePolicy,
14
+ projectRoot: invocation.projectRoot,
15
+ resultsRoot: invocation.resultsRoot,
16
+ runStateRoot: invocation.runStateRoot,
17
+ case: caseData,
18
+ extension,
19
+ preparationSources,
20
+ host,
21
+ semanticHost,
22
+ advisoryHost,
23
+ advisoryExcludedPaths: invocation.advisoryExcludedPaths,
24
+ shellIsolation: invocation.shellIsolation,
25
+ runnerBuildDigest: invocation.runnerBuildDigest ?? (await packageBuildDigest()),
26
+ runnerCheckoutRoot: invocation.runnerCheckoutRoot,
27
+ projectDigest: invocation.projectDigest ??
28
+ (await projectIdentityDigest(invocation.projectRoot, await projectProvenance(invocation.projectRoot, [
29
+ invocation.resultsRoot,
30
+ invocation.runStateRoot,
31
+ ]), [invocation.resultsRoot, invocation.runStateRoot])),
32
+ condition: invocation.condition,
33
+ trialCount: invocation.trialCount,
34
+ jobs: invocation.jobs,
35
+ passThreshold: invocation.passThreshold,
36
+ dry: invocation.dry,
37
+ signal,
38
+ });
39
+ }
40
+ //# sourceMappingURL=evaluation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation.js","sourceRoot":"","sources":["evaluation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAkB;AAC1C,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,GAClB,yBAAsB;AACvB,OAAO,EAAE,YAAY,EAAE,uBAAoB;AAE3C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,sBAAmB;AACnE,OAAO,EAAE,eAAe,EAAE,sBAAmB;AAE7C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAA4B,EAC5B,MAAmB;IAEnB,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,GACxE,QAAQ,CAAC;IACX,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrE,OAAO,aAAa,CAAC;QACnB,UAAU,EAAE,eAAe;QAC3B,mBAAmB,EAAE,iBAAiB,CAAC,QAAQ,CAAC;QAChD,kBAAkB,EAAE,kBAAkB,CAAC,QAAQ,CAAC;QAChD,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,IAAI,EAAE,QAAQ;QACd,SAAS;QACT,kBAAkB;QAClB,IAAI;QACJ,YAAY;QACZ,YAAY;QACZ,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;QACvD,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,iBAAiB,EACf,UAAU,CAAC,iBAAiB,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC;QAC9D,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,aAAa,EACX,UAAU,CAAC,aAAa;YACxB,CAAC,MAAM,qBAAqB,CAC1B,UAAU,CAAC,WAAW,EACtB,MAAM,iBAAiB,CAAC,UAAU,CAAC,WAAW,EAAE;gBAC9C,UAAU,CAAC,WAAW;gBACtB,UAAU,CAAC,YAAY;aACxB,CAAC,EACF,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,YAAY,CAAC,CAClD,CAAC;QACJ,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,GAAG,EAAE,UAAU,CAAC,GAAG;QACnB,MAAM;KACP,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { runEvaluation } from \"../engine\";\nimport {\n packageBuildDigest,\n projectIdentityDigest,\n projectProvenance,\n} from \"../provenance\";\nimport { selectedCase } from \"./extension\";\nimport type { PreparedInvocation } from \"./preparation\";\nimport { assessmentSettings, effectiveSettings } from \"./settings\";\nimport { displayProgress } from \"./progress\";\n\nexport async function evaluateInvocation(\n prepared: PreparedInvocation,\n signal: AbortSignal,\n) {\n const { invocation, preparationSources, host, semanticHost, advisoryHost } =\n prepared;\n const { caseData, extension } = await selectedCase(prepared, signal);\n return runEvaluation({\n onProgress: displayProgress,\n resolvedRunSettings: effectiveSettings(prepared),\n assessmentSettings: assessmentSettings(prepared),\n runtimePolicy: prepared.runtimePolicy,\n projectRoot: invocation.projectRoot,\n resultsRoot: invocation.resultsRoot,\n runStateRoot: invocation.runStateRoot,\n case: caseData,\n extension,\n preparationSources,\n host,\n semanticHost,\n advisoryHost,\n advisoryExcludedPaths: invocation.advisoryExcludedPaths,\n shellIsolation: invocation.shellIsolation,\n runnerBuildDigest:\n invocation.runnerBuildDigest ?? (await packageBuildDigest()),\n runnerCheckoutRoot: invocation.runnerCheckoutRoot,\n projectDigest:\n invocation.projectDigest ??\n (await projectIdentityDigest(\n invocation.projectRoot,\n await projectProvenance(invocation.projectRoot, [\n invocation.resultsRoot,\n invocation.runStateRoot,\n ]),\n [invocation.resultsRoot, invocation.runStateRoot],\n )),\n condition: invocation.condition,\n trialCount: invocation.trialCount,\n jobs: invocation.jobs,\n passThreshold: invocation.passThreshold,\n dry: invocation.dry,\n signal,\n });\n}\n"]}
@@ -0,0 +1,54 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { openExtensionSession } from "../extension-session.js";
3
+ import { resolvedFixture } from "../resolved-case.js";
4
+ import { InvocationError } from "./invocation.js";
5
+ import { parseCase, loadExtensionOptions } from "./loading.js";
6
+ function selectExtensionCase(cases, caseId) {
7
+ const resolvedCase = cases.find((item) => item.id === caseId);
8
+ if (!resolvedCase)
9
+ throw new InvocationError("extension did not resolve the selected case");
10
+ const caseData = parseCase({
11
+ ...resolvedCase,
12
+ fixture: resolvedFixture(resolvedCase.fixture),
13
+ });
14
+ return { caseData, resolvedCase };
15
+ }
16
+ async function resolveSelectedExtension(prepared, selected, signal) {
17
+ const { invocation, host } = prepared;
18
+ const options = await loadExtensionOptions(selected);
19
+ const hostCapabilities = [
20
+ ...(host.instrumentation ?? []).map((item) => item.id),
21
+ ...(host.hostCapabilities ?? []),
22
+ ];
23
+ const session = await openExtensionSession({
24
+ ...options,
25
+ sourceFiles: selected.sourceFiles,
26
+ engineCapabilities: [
27
+ "sevro.host.exec",
28
+ "sevro.fixture.setup",
29
+ "sevro.case.host-route",
30
+ ],
31
+ hostCapabilities,
32
+ taskVerdictPolicy: selected.taskVerdictPolicy,
33
+ replaceBuiltinGraders: selected.replaceBuiltinGraders,
34
+ signal,
35
+ });
36
+ const chosen = selectExtensionCase(await session.resolve(pathToFileURL(invocation.projectRoot).href, { caseIds: [selected.caseId] }, {
37
+ id: host.id,
38
+ model: host.model,
39
+ effort: host.effort,
40
+ capabilities: hostCapabilities,
41
+ }), selected.caseId);
42
+ return {
43
+ caseData: chosen.caseData,
44
+ extension: { session, resolvedCase: chosen.resolvedCase },
45
+ };
46
+ }
47
+ export async function selectedCase(prepared, signal) {
48
+ if (prepared.invocation.extension)
49
+ return resolveSelectedExtension(prepared, prepared.invocation.extension, signal);
50
+ if (!prepared.caseData)
51
+ throw new InvocationError("invalid resolved case file");
52
+ return { caseData: prepared.caseData, extension: undefined };
53
+ }
54
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB;AAEzC,OAAO,EAAE,oBAAoB,EAAsB,gCAA6B;AAChF,OAAO,EAAE,eAAe,EAAE,4BAAyB;AACnD,OAAO,EAAE,eAAe,EAAmB,wBAAqB;AAChE,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,qBAAkB;AAG5D,SAAS,mBAAmB,CAC1B,KAAsB,EACtB,MAAc;IAEd,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC,YAAY;QACf,MAAM,IAAI,eAAe,CAAC,6CAA6C,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC;QACzB,GAAG,YAAY;QACf,OAAO,EAAE,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,wBAAwB,CACrC,QAA4B,EAC5B,QAA8C,EAC9C,MAAmB;IAEnB,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;IACtC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG;QACvB,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;KACjC,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC;QACzC,GAAG,OAAO;QACV,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,kBAAkB,EAAE;YAClB,iBAAiB;YACjB,qBAAqB;YACrB,uBAAuB;SACxB;QACD,gBAAgB;QAChB,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;QAC7C,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB;QACrD,MAAM;KACP,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,mBAAmB,CAChC,MAAM,OAAO,CAAC,OAAO,CACnB,aAAa,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,EAC1C,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAC9B;QACE,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,gBAAgB;KAC/B,CACF,EACD,QAAQ,CAAC,MAAM,CAChB,CAAC;IACF,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA4B,EAC5B,MAAmB;IAEnB,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS;QAC/B,OAAO,wBAAwB,CAC7B,QAAQ,EACR,QAAQ,CAAC,UAAU,CAAC,SAAS,EAC7B,MAAM,CACP,CAAC;IACJ,IAAI,CAAC,QAAQ,CAAC,QAAQ;QACpB,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAC;IAC1D,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC/D,CAAC","sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport type { ResolvedCase } from \"../engine\";\nimport { openExtensionSession, type ExtensionCase } from \"../extension-session\";\nimport { resolvedFixture } from \"../resolved-case\";\nimport { InvocationError, type Invocation } from \"./invocation\";\nimport { parseCase, loadExtensionOptions } from \"./loading\";\nimport type { PreparedInvocation } from \"./preparation\";\n\nfunction selectExtensionCase(\n cases: ExtensionCase[],\n caseId: string,\n): { caseData: ResolvedCase; resolvedCase: ExtensionCase } {\n const resolvedCase = cases.find((item) => item.id === caseId);\n if (!resolvedCase)\n throw new InvocationError(\"extension did not resolve the selected case\");\n const caseData = parseCase({\n ...resolvedCase,\n fixture: resolvedFixture(resolvedCase.fixture),\n });\n return { caseData, resolvedCase };\n}\n\nasync function resolveSelectedExtension(\n prepared: PreparedInvocation,\n selected: NonNullable<Invocation[\"extension\"]>,\n signal: AbortSignal,\n) {\n const { invocation, host } = prepared;\n const options = await loadExtensionOptions(selected);\n const hostCapabilities = [\n ...(host.instrumentation ?? []).map((item) => item.id),\n ...(host.hostCapabilities ?? []),\n ];\n const session = await openExtensionSession({\n ...options,\n sourceFiles: selected.sourceFiles,\n engineCapabilities: [\n \"sevro.host.exec\",\n \"sevro.fixture.setup\",\n \"sevro.case.host-route\",\n ],\n hostCapabilities,\n taskVerdictPolicy: selected.taskVerdictPolicy,\n replaceBuiltinGraders: selected.replaceBuiltinGraders,\n signal,\n });\n const chosen = selectExtensionCase(\n await session.resolve(\n pathToFileURL(invocation.projectRoot).href,\n { caseIds: [selected.caseId] },\n {\n id: host.id,\n model: host.model,\n effort: host.effort,\n capabilities: hostCapabilities,\n },\n ),\n selected.caseId,\n );\n return {\n caseData: chosen.caseData,\n extension: { session, resolvedCase: chosen.resolvedCase },\n };\n}\n\nexport async function selectedCase(\n prepared: PreparedInvocation,\n signal: AbortSignal,\n) {\n if (prepared.invocation.extension)\n return resolveSelectedExtension(\n prepared,\n prepared.invocation.extension,\n signal,\n );\n if (!prepared.caseData)\n throw new InvocationError(\"invalid resolved case file\");\n return { caseData: prepared.caseData, extension: undefined };\n}\n"]}
@@ -0,0 +1,190 @@
1
+ import { RUN_OPTIONS, optionsWith } from "./run-options.js";
2
+ import packageJson from "../../../package.json" with { type: "json" };
3
+ const { version } = packageJson;
4
+ const TOP_LEVEL_HELP = `Usage: sevro <command> [options]
5
+
6
+ Examples:
7
+ sevro demo
8
+ sevro init --template response --directory ./my-evaluation
9
+ sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\
10
+ --project-root /absolute/project --results-root /absolute/results \\
11
+ --condition passive --trials 1 --threshold 1
12
+ sevro run --help
13
+ sevro report --result-file /absolute/results/run/result.json
14
+ sevro prune
15
+
16
+ Commands:
17
+ demo Run the packaged credential-free assessed example; use demo --help.
18
+ init Create a new evaluation project; use init --help.
19
+ run Evaluate one resolved case or extension case; use run --help.
20
+ report Summarize retained results; use report --help.
21
+ prune Remove retained results using a retention policy; use prune --help.
22
+
23
+ Options:
24
+ -h, --help Show help without preparing a run.
25
+ -v, --version Print the installed Sevro package version.
26
+ `;
27
+ const RUN_HELP = `Usage: sevro run [options]
28
+
29
+ Examples:
30
+ sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\
31
+ --project-root /absolute/project --results-root /absolute/results \\
32
+ --condition passive --trials 1 --threshold 1
33
+ Add --dry to prepare without calling the candidate or graders.
34
+ Add --json to save a sevro.cli-result.v1 result from stdout.
35
+
36
+ Required:
37
+ ${runOptionHelp("required")}
38
+
39
+ Common options and defaults:
40
+ ${runOptionHelp("common")}
41
+ Precedence: built-in defaults, saved settings, then explicit CLI options.
42
+ Manifest paths use its own directory; CLI paths use the current directory.
43
+ --no-dry, --no-shell-isolation and other --no-<boolean> flags override saved true.
44
+ Relative run paths resolve from the current directory and are canonicalized before protection checks.
45
+
46
+ Bundled hosts:
47
+ ${runOptionHelp("native")}
48
+ Native timeout defaults to 600000 ms; shell checks expect exit 0 within 30000 ms.
49
+
50
+ Extension cases:
51
+ ${runOptionHelp("extension")}
52
+
53
+ Optional grading routes (none selected by default):
54
+ ${runOptionHelp("grading")}
55
+
56
+ Provenance overrides (normally derived automatically):
57
+ ${runOptionHelp("provenance")}
58
+
59
+ Deprecated runtime options:
60
+ ${runOptionHelp("deprecated")}
61
+
62
+ -h, --help Show this help without preparing a run.
63
+ Reference: docs/development-cli.md, docs/run-settings-v1.md and docs/results-v1.md in the installed package.
64
+ `;
65
+ function runOptionHelp(section) {
66
+ return optionsWith("section", section)
67
+ .map((name) => ` --${name} ${RUN_OPTIONS[name].help}`)
68
+ .join("\n");
69
+ }
70
+ const DEMO_HELP = `Usage: sevro demo [--json]
71
+
72
+ Examples:
73
+ sevro demo
74
+ sevro demo --json
75
+
76
+ Run the packaged deterministic fixture and adapter without model credentials.
77
+ Shows an assessed verdict and retains evidence in .sevro/results beneath the current directory.
78
+ Caller project files, sevro.json and native configuration are not loaded.
79
+
80
+ Options:
81
+ --json Emit one sevro.cli-result.v1 document on stdout.
82
+ -h, --help Show this help without preparing a run.
83
+ `;
84
+ const REPORT_HELP = `Usage: sevro report [options]
85
+
86
+ Examples:
87
+ sevro report --latest
88
+ sevro report --result-file /absolute/results/run/result.json
89
+ sevro report --result-file /absolute/results/first/result.json \\
90
+ --result-file /absolute/results/second/result.json --json
91
+
92
+ Required:
93
+ --latest OR --result-file <path> A retained result; repeat paths for distinct runs.
94
+ Relative or absolute paths use the current directory.
95
+ Keep each result's referenced evidence available and unchanged.
96
+
97
+ Options and defaults:
98
+ --latest Read the last retained CLI result, including dry or failed runs.
99
+ --results-root <path> With --latest, override <cwd>/.sevro/results.
100
+ --json Emit sevro.report.v1 JSON; Markdown by default.
101
+ -h, --help Show this help without reading result files.
102
+ `;
103
+ const PRUNE_HELP = `Usage: sevro prune [options]
104
+
105
+ Examples:
106
+ sevro prune
107
+ sevro prune --results-root ./other-results --keep 5
108
+ sevro prune --older-than 30d
109
+ sevro prune --latest
110
+ sevro prune --native-transcripts --older-than 30d
111
+
112
+ Defaults: keep the newest 10 completed results under <cwd>/.sevro/results.
113
+ Select at most one explicit retention policy:
114
+ --keep <positive-integer> Keep this many newest results.
115
+ --latest Keep only the newest result (same as --keep 1).
116
+ --older-than <duration> Remove results older than a positive integer plus ms, s, m, h, d or w.
117
+ --results-root <path> Relative or absolute results root, resolved from cwd.
118
+ --native-transcripts Remove only native transcript bundles; keep results and hashes.
119
+ -h, --help Show help without reading or deleting results.
120
+
121
+ Age and ordering use result.json modification times; equal times sort by path.
122
+ Each retained attempt counts separately, including dry, failed and interrupted runs.
123
+ Active/unrecognized attempts and directories without result.json are preserved.
124
+ Evidence is permanently deleted. Remaining results stay usable by sevro report;
125
+ latest.json is updated, or removed when no completed results remain.
126
+ With --native-transcripts, no policy removes bundles from all completed results;
127
+ --keep/--latest preserve bundles for the newest results, and --older-than selects older results.
128
+ Result/evidence files and latest.json stay unchanged. Reports label removed bundles as pruned.
129
+ Missing or empty results roots are a successful no-op. Invalid or unreadable inputs exit 64.
130
+ Reference: docs/reading-results.md in the installed package.
131
+ `;
132
+ const INIT_HELP = `Usage: sevro init [options]
133
+
134
+ Examples:
135
+ sevro init --template response --directory ./my-evaluation
136
+ cd my-evaluation
137
+ sevro run --run-manifest-file run.json --dry
138
+ sevro run --run-manifest-file run.json
139
+ sevro report --latest
140
+
141
+ Options and defaults:
142
+ --template <response|repository-skill|coding> Default: response.
143
+ --directory <new-path> Default: ./sevro-evaluation; refuses existing paths.
144
+ -h, --help Show this help without creating files.
145
+
146
+ Response and coding use deterministic adapters and real assertions, including negative controls.
147
+ Coding checks need sandbox-exec (macOS) or bubblewrap/socat (Linux).
148
+ Repository-skill uses native Codex and requires explicit --model, --effort and --codex-auth-file.
149
+ Read the generated README.md for prerequisites and live commands; dry preparation is not an assessment.
150
+ Reference: docs/evaluation-workflow.md in the installed package.
151
+ `;
152
+ const HELP_REQUESTS = {
153
+ "": TOP_LEVEL_HELP,
154
+ "--help": TOP_LEVEL_HELP,
155
+ "-h": TOP_LEVEL_HELP,
156
+ help: TOP_LEVEL_HELP,
157
+ "run --help": RUN_HELP,
158
+ "run -h": RUN_HELP,
159
+ "help run": RUN_HELP,
160
+ "demo --help": DEMO_HELP,
161
+ "demo -h": DEMO_HELP,
162
+ "help demo": DEMO_HELP,
163
+ "init --help": INIT_HELP,
164
+ "init -h": INIT_HELP,
165
+ "help init": INIT_HELP,
166
+ "report --help": REPORT_HELP,
167
+ "report -h": REPORT_HELP,
168
+ "help report": REPORT_HELP,
169
+ "prune --help": PRUNE_HELP,
170
+ "prune -h": PRUNE_HELP,
171
+ "help prune": PRUNE_HELP,
172
+ };
173
+ /** Handle informational commands before loading inputs or creating run state. */
174
+ export function informationCommand(argv) {
175
+ const request = argv.slice(1).some((arg) => ["--help", "-h"].includes(arg))
176
+ ? [argv[0], "--help"].join(" ")
177
+ : argv.join(" ");
178
+ if (["--version", "-v"].includes(request)) {
179
+ process.stdout.write(`sevro ${version}\n`);
180
+ return true;
181
+ }
182
+ const help = Object.hasOwn(HELP_REQUESTS, request)
183
+ ? HELP_REQUESTS[request]
184
+ : undefined;
185
+ if (help === undefined)
186
+ return false;
187
+ process.stdout.write(help);
188
+ return true;
189
+ }
190
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["help.ts"],"names":[],"mappings":"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","sourcesContent":["import { RUN_OPTIONS, optionsWith, type RunOptionName } from \"./run-options\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nconst { version } = packageJson;\n\nconst TOP_LEVEL_HELP = `Usage: sevro <command> [options]\n\nExamples:\n sevro demo\n sevro init --template response --directory ./my-evaluation\n sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\\\\n --project-root /absolute/project --results-root /absolute/results \\\\\n --condition passive --trials 1 --threshold 1\n sevro run --help\n sevro report --result-file /absolute/results/run/result.json\n sevro prune\n\nCommands:\n demo Run the packaged credential-free assessed example; use demo --help.\n init Create a new evaluation project; use init --help.\n run Evaluate one resolved case or extension case; use run --help.\n report Summarize retained results; use report --help.\n prune Remove retained results using a retention policy; use prune --help.\n\nOptions:\n -h, --help Show help without preparing a run.\n -v, --version Print the installed Sevro package version.\n`;\n\nconst RUN_HELP = `Usage: sevro run [options]\n\nExamples:\n sevro run --case-file /absolute/case.json --adapter-module /absolute/adapter.js \\\\\n --project-root /absolute/project --results-root /absolute/results \\\\\n --condition passive --trials 1 --threshold 1\n Add --dry to prepare without calling the candidate or graders.\n Add --json to save a sevro.cli-result.v1 result from stdout.\n\nRequired:\n${runOptionHelp(\"required\")}\n\nCommon options and defaults:\n${runOptionHelp(\"common\")}\n Precedence: built-in defaults, saved settings, then explicit CLI options.\n Manifest paths use its own directory; CLI paths use the current directory.\n --no-dry, --no-shell-isolation and other --no-<boolean> flags override saved true.\n Relative run paths resolve from the current directory and are canonicalized before protection checks.\n\nBundled hosts:\n${runOptionHelp(\"native\")}\n Native timeout defaults to 600000 ms; shell checks expect exit 0 within 30000 ms.\n\nExtension cases:\n${runOptionHelp(\"extension\")}\n\nOptional grading routes (none selected by default):\n${runOptionHelp(\"grading\")}\n\nProvenance overrides (normally derived automatically):\n${runOptionHelp(\"provenance\")}\n\nDeprecated runtime options:\n${runOptionHelp(\"deprecated\")}\n\n -h, --help Show this help without preparing a run.\nReference: docs/development-cli.md, docs/run-settings-v1.md and docs/results-v1.md in the installed package.\n`;\n\nfunction runOptionHelp(\n section: (typeof RUN_OPTIONS)[RunOptionName][\"section\"],\n): string {\n return optionsWith(\"section\", section)\n .map((name) => ` --${name} ${RUN_OPTIONS[name].help}`)\n .join(\"\\n\");\n}\n\nconst DEMO_HELP = `Usage: sevro demo [--json]\n\nExamples:\n sevro demo\n sevro demo --json\n\nRun the packaged deterministic fixture and adapter without model credentials.\nShows an assessed verdict and retains evidence in .sevro/results beneath the current directory.\nCaller project files, sevro.json and native configuration are not loaded.\n\nOptions:\n --json Emit one sevro.cli-result.v1 document on stdout.\n -h, --help Show this help without preparing a run.\n`;\n\nconst REPORT_HELP = `Usage: sevro report [options]\n\nExamples:\n sevro report --latest\n sevro report --result-file /absolute/results/run/result.json\n sevro report --result-file /absolute/results/first/result.json \\\\\n --result-file /absolute/results/second/result.json --json\n\nRequired:\n --latest OR --result-file <path> A retained result; repeat paths for distinct runs.\n Relative or absolute paths use the current directory.\n Keep each result's referenced evidence available and unchanged.\n\nOptions and defaults:\n --latest Read the last retained CLI result, including dry or failed runs.\n --results-root <path> With --latest, override <cwd>/.sevro/results.\n --json Emit sevro.report.v1 JSON; Markdown by default.\n -h, --help Show this help without reading result files.\n`;\n\nconst PRUNE_HELP = `Usage: sevro prune [options]\n\nExamples:\n sevro prune\n sevro prune --results-root ./other-results --keep 5\n sevro prune --older-than 30d\n sevro prune --latest\n sevro prune --native-transcripts --older-than 30d\n\nDefaults: keep the newest 10 completed results under <cwd>/.sevro/results.\nSelect at most one explicit retention policy:\n --keep <positive-integer> Keep this many newest results.\n --latest Keep only the newest result (same as --keep 1).\n --older-than <duration> Remove results older than a positive integer plus ms, s, m, h, d or w.\n --results-root <path> Relative or absolute results root, resolved from cwd.\n --native-transcripts Remove only native transcript bundles; keep results and hashes.\n -h, --help Show help without reading or deleting results.\n\nAge and ordering use result.json modification times; equal times sort by path.\nEach retained attempt counts separately, including dry, failed and interrupted runs.\nActive/unrecognized attempts and directories without result.json are preserved.\nEvidence is permanently deleted. Remaining results stay usable by sevro report;\nlatest.json is updated, or removed when no completed results remain.\nWith --native-transcripts, no policy removes bundles from all completed results;\n--keep/--latest preserve bundles for the newest results, and --older-than selects older results.\nResult/evidence files and latest.json stay unchanged. Reports label removed bundles as pruned.\nMissing or empty results roots are a successful no-op. Invalid or unreadable inputs exit 64.\nReference: docs/reading-results.md in the installed package.\n`;\n\nconst INIT_HELP = `Usage: sevro init [options]\n\nExamples:\n sevro init --template response --directory ./my-evaluation\n cd my-evaluation\n sevro run --run-manifest-file run.json --dry\n sevro run --run-manifest-file run.json\n sevro report --latest\n\nOptions and defaults:\n --template <response|repository-skill|coding> Default: response.\n --directory <new-path> Default: ./sevro-evaluation; refuses existing paths.\n -h, --help Show this help without creating files.\n\nResponse and coding use deterministic adapters and real assertions, including negative controls.\nCoding checks need sandbox-exec (macOS) or bubblewrap/socat (Linux).\nRepository-skill uses native Codex and requires explicit --model, --effort and --codex-auth-file.\nRead the generated README.md for prerequisites and live commands; dry preparation is not an assessment.\nReference: docs/evaluation-workflow.md in the installed package.\n`;\n\nconst HELP_REQUESTS: Record<string, string> = {\n \"\": TOP_LEVEL_HELP,\n \"--help\": TOP_LEVEL_HELP,\n \"-h\": TOP_LEVEL_HELP,\n help: TOP_LEVEL_HELP,\n \"run --help\": RUN_HELP,\n \"run -h\": RUN_HELP,\n \"help run\": RUN_HELP,\n \"demo --help\": DEMO_HELP,\n \"demo -h\": DEMO_HELP,\n \"help demo\": DEMO_HELP,\n \"init --help\": INIT_HELP,\n \"init -h\": INIT_HELP,\n \"help init\": INIT_HELP,\n \"report --help\": REPORT_HELP,\n \"report -h\": REPORT_HELP,\n \"help report\": REPORT_HELP,\n \"prune --help\": PRUNE_HELP,\n \"prune -h\": PRUNE_HELP,\n \"help prune\": PRUNE_HELP,\n};\n\n/** Handle informational commands before loading inputs or creating run state. */\nexport function informationCommand(argv: string[]): boolean {\n const request = argv.slice(1).some((arg) => [\"--help\", \"-h\"].includes(arg))\n ? [argv[0], \"--help\"].join(\" \")\n : argv.join(\" \");\n if ([\"--version\", \"-v\"].includes(request)) {\n process.stdout.write(`sevro ${version}\\n`);\n return true;\n }\n const help = Object.hasOwn(HELP_REQUESTS, request)\n ? HELP_REQUESTS[request]\n : undefined;\n if (help === undefined) return false;\n process.stdout.write(help);\n return true;\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { createClaudeHost } from "../hosts/claude.js";
2
+ import { createCodexHost } from "../hosts/codex.js";
3
+ import { codexAgentConcurrency } from "../hosts/codex-configuration.js";
4
+ import { InvocationError, nativeRoutes } from "./invocation.js";
5
+ import { loadHost } from "./loading.js";
6
+ export async function selectedConcurrency(invocation, configRoot) {
7
+ return nativeRoutes({ ...invocation, claude: undefined }).length
8
+ ? codexAgentConcurrency(configRoot)
9
+ : null;
10
+ }
11
+ export async function candidateHost(invocation, agentConcurrencyLimit) {
12
+ if (invocation.codex)
13
+ return retainExecutable(createCodexHost({ ...invocation.codex, agentConcurrencyLimit }), invocation.codex.binary);
14
+ if (invocation.claude)
15
+ return retainExecutable(createClaudeHost(invocation.claude), invocation.claude.binary);
16
+ if (!invocation.adapterModule)
17
+ throw new InvocationError("missing --adapter-module or --host");
18
+ return loadHost(invocation.adapterModule);
19
+ }
20
+ export async function secondaryHost(module, codex, agentConcurrencyLimit) {
21
+ if (module)
22
+ return loadHost(module);
23
+ if (codex)
24
+ return retainExecutable(createCodexHost({ ...codex, agentConcurrencyLimit }), codex.binary);
25
+ return undefined;
26
+ }
27
+ function retainExecutable(host, binary) {
28
+ return {
29
+ ...host,
30
+ configuration: { ...host.configuration, "sevro.host.executable": binary },
31
+ };
32
+ }
33
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["hosts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,2BAAwB;AACnD,OAAO,EAAE,eAAe,EAAE,0BAAuB;AACjD,OAAO,EAAE,qBAAqB,EAAE,wCAAqC;AACrE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAmB,wBAAqB;AAC9E,OAAO,EAAE,QAAQ,EAAE,qBAAkB;AAErC,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAsB,EACtB,UAAkB;IAElB,OAAO,YAAY,CAAC,EAAE,GAAG,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM;QAC9D,CAAC,CAAC,qBAAqB,CAAC,UAAU,CAAC;QACnC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAsB,EACtB,qBAAoC;IAEpC,IAAI,UAAU,CAAC,KAAK;QAClB,OAAO,gBAAgB,CACrB,eAAe,CAAC,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,qBAAqB,EAAE,CAAC,EAC/D,UAAU,CAAC,KAAK,CAAC,MAAM,CACxB,CAAC;IACJ,IAAI,UAAU,CAAC,MAAM;QACnB,OAAO,gBAAgB,CACrB,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EACnC,UAAU,CAAC,MAAM,CAAC,MAAM,CACzB,CAAC;IACJ,IAAI,CAAC,UAAU,CAAC,aAAa;QAC3B,MAAM,IAAI,eAAe,CAAC,oCAAoC,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAA0B,EAC1B,KAAkC,EAClC,qBAAoC;IAEpC,IAAI,MAAM;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,KAAK;QACP,OAAO,gBAAgB,CACrB,eAAe,CAAC,EAAE,GAAG,KAAK,EAAE,qBAAqB,EAAE,CAAC,EACpD,KAAK,CAAC,MAAM,CACb,CAAC;IACJ,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAiB,EAAE,MAAc;IACzD,OAAO;QACL,GAAG,IAAI;QACP,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,uBAAuB,EAAE,MAAM,EAAE;KAC1E,CAAC;AACJ,CAAC","sourcesContent":["import type { HostAdapter } from \"../engine\";\nimport { createClaudeHost } from \"../hosts/claude\";\nimport { createCodexHost } from \"../hosts/codex\";\nimport { codexAgentConcurrency } from \"../hosts/codex-configuration\";\nimport { InvocationError, nativeRoutes, type Invocation } from \"./invocation\";\nimport { loadHost } from \"./loading\";\n\nexport async function selectedConcurrency(\n invocation: Invocation,\n configRoot: string,\n): Promise<number | null> {\n return nativeRoutes({ ...invocation, claude: undefined }).length\n ? codexAgentConcurrency(configRoot)\n : null;\n}\n\nexport async function candidateHost(\n invocation: Invocation,\n agentConcurrencyLimit: number | null,\n): Promise<HostAdapter> {\n if (invocation.codex)\n return retainExecutable(\n createCodexHost({ ...invocation.codex, agentConcurrencyLimit }),\n invocation.codex.binary,\n );\n if (invocation.claude)\n return retainExecutable(\n createClaudeHost(invocation.claude),\n invocation.claude.binary,\n );\n if (!invocation.adapterModule)\n throw new InvocationError(\"missing --adapter-module or --host\");\n return loadHost(invocation.adapterModule);\n}\n\nexport async function secondaryHost(\n module: string | undefined,\n codex: Invocation[\"semanticCodex\"],\n agentConcurrencyLimit: number | null,\n): Promise<HostAdapter | undefined> {\n if (module) return loadHost(module);\n if (codex)\n return retainExecutable(\n createCodexHost({ ...codex, agentConcurrencyLimit }),\n codex.binary,\n );\n return undefined;\n}\n\nfunction retainExecutable(host: HostAdapter, binary: string): HostAdapter {\n return {\n ...host,\n configuration: { ...host.configuration, \"sevro.host.executable\": binary },\n };\n}\n"]}
@@ -0,0 +1,29 @@
1
+ import { join } from "node:path";
2
+ import { runtimeModule } from "../runner-paths.js";
3
+ export function templateSettings(template) {
4
+ if (template === "repository-skill")
5
+ return {
6
+ "project-root": ".",
7
+ "extension-command-file": "command.json",
8
+ "extension-source-file": [
9
+ "extension.ts",
10
+ "extension-data.ts",
11
+ ".agents/skills/startup-guide/SKILL.md",
12
+ ].map(runtimeModule),
13
+ "case-id": "repository-skill",
14
+ host: "codex",
15
+ };
16
+ return {
17
+ "case-file": "case.json",
18
+ "adapter-module": runtimeModule("adapter.ts"),
19
+ "project-root": ".",
20
+ ...(template === "coding" ? { "shell-isolation": true } : {}),
21
+ };
22
+ }
23
+ export function templateCommand(destination) {
24
+ return [process.execPath, join(destination, runtimeModule("extension.ts"))];
25
+ }
26
+ export function nativeReadme() {
27
+ 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`;
28
+ }
29
+ //# sourceMappingURL=init-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-settings.js","sourceRoot":"","sources":["init-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,kBAAkB;AACjC,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAEhD,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,QAAQ,KAAK,kBAAkB;QACjC,OAAO;YACL,cAAc,EAAE,GAAG;YACnB,wBAAwB,EAAE,cAAc;YACxC,uBAAuB,EAAE;gBACvB,cAAc;gBACd,mBAAmB;gBACnB,uCAAuC;aACxC,CAAC,GAAG,CAAC,aAAa,CAAC;YACpB,SAAS,EAAE,kBAAkB;YAC7B,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,OAAO;QACL,WAAW,EAAE,WAAW;QACxB,gBAAgB,EAAE,aAAa,CAAC,YAAY,CAAC;QAC7C,cAAc,EAAE,GAAG;QACnB,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,y+CAAy+C,CAAC;AACn/C,CAAC","sourcesContent":["import { join } from \"node:path\";\nimport { runtimeModule } from \"../runner-paths\";\n\nexport function templateSettings(template: string) {\n if (template === \"repository-skill\")\n return {\n \"project-root\": \".\",\n \"extension-command-file\": \"command.json\",\n \"extension-source-file\": [\n \"extension.ts\",\n \"extension-data.ts\",\n \".agents/skills/startup-guide/SKILL.md\",\n ].map(runtimeModule),\n \"case-id\": \"repository-skill\",\n host: \"codex\",\n };\n return {\n \"case-file\": \"case.json\",\n \"adapter-module\": runtimeModule(\"adapter.ts\"),\n \"project-root\": \".\",\n ...(template === \"coding\" ? { \"shell-isolation\": true } : {}),\n };\n}\n\nexport function templateCommand(destination: string) {\n return [process.execPath, join(destination, runtimeModule(\"extension.ts\"))];\n}\n\nexport function nativeReadme() {\n 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`;\n}\n"]}
@@ -0,0 +1,82 @@
1
+ import { examplePath, sourceRuntime } from "../runner-paths.js";
2
+ import { cp, mkdir, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join, resolve } from "node:path";
4
+ import { parseArgs } from "node:util";
5
+ import { nativeReadme, templateCommand, templateSettings, } from "./init-settings.js";
6
+ function initOptions(argv) {
7
+ const { values, positionals } = parseArgs({
8
+ args: argv,
9
+ strict: true,
10
+ allowPositionals: true,
11
+ options: {
12
+ template: { type: "string", default: "response" },
13
+ directory: { type: "string", default: "sevro-evaluation" },
14
+ },
15
+ });
16
+ if (positionals.length ||
17
+ !["response", "coding", "repository-skill"].includes(values.template))
18
+ throw new Error("use --template response, coding or repository-skill; run sevro init --help");
19
+ if (!values.directory.trim())
20
+ throw new Error("--directory must name a new directory");
21
+ return { template: values.template, destination: resolve(values.directory) };
22
+ }
23
+ async function reserveDirectory(destination) {
24
+ await mkdir(dirname(destination), { recursive: true });
25
+ try {
26
+ await mkdir(destination);
27
+ }
28
+ catch (cause) {
29
+ throw new Error(`init destination already exists or cannot be created: ${destination}; choose a new --directory`, { cause });
30
+ }
31
+ }
32
+ function starterReadme(template) {
33
+ if (template === "repository-skill")
34
+ return nativeReadme();
35
+ const assertion = template === "coding"
36
+ ? "positive, negative and zero addition assertions against edited add.sh"
37
+ : "an exact response assertion";
38
+ const prerequisites = template === "coding"
39
+ ? "Node.js 24.13.0 or newer, or Bun 1.3.13, plus sandbox-exec on macOS or bubblewrap/socat on Linux"
40
+ : "Node.js 24.13.0 or newer, or Bun 1.3.13";
41
+ return `# ${template} evaluation\n\nThis deterministic adapter exercises ${assertion}, without model credentials. Prerequisites: ${prerequisites}.\n\n\`\`\`sh\nsevro run --run-manifest-file run.json --dry\nsevro run --run-manifest-file run.json\nsevro report --latest\nSEVRO_TEMPLATE_FAIL=1 sevro run --run-manifest-file run.json\n\`\`\`\n\nThe negative control must report task=failed and exit 1. Dry preparation is not an assessment.\nEdit case.json and ${sourceRuntime ? "adapter.ts" : "adapter.js"}, prepare, then run again. Keep private .sevro evidence out of Git.\nFor a native model, replace the adapter route explicitly with --host, --model and --effort; Codex also requires --codex-auth-file. No model execution or native skill dispatch is established by this adapter.\n`;
42
+ }
43
+ async function initialize(template, destination) {
44
+ await reserveDirectory(destination);
45
+ try {
46
+ await cp(examplePath("templates", template), destination, {
47
+ recursive: true,
48
+ errorOnExist: true,
49
+ force: false,
50
+ });
51
+ await writeFile(join(destination, "run.json"), JSON.stringify({ format: "sevro.run.v1", settings: templateSettings(template) }, null, 2) + "\n", { flag: "wx" });
52
+ if (template === "repository-skill")
53
+ await writeFile(join(destination, "command.json"), JSON.stringify(templateCommand(destination)) + "\n", { flag: "wx" });
54
+ await writeFile(join(destination, ".gitignore"), ".sevro/\n", {
55
+ flag: "wx",
56
+ });
57
+ await writeFile(join(destination, "README.md"), starterReadme(template), {
58
+ flag: "wx",
59
+ });
60
+ }
61
+ catch (cause) {
62
+ await rm(destination, { recursive: true, force: true });
63
+ throw cause;
64
+ }
65
+ }
66
+ export async function initCommand(argv) {
67
+ try {
68
+ const { template, destination } = initOptions(argv);
69
+ await initialize(template, destination);
70
+ const quoted = `'${destination.replaceAll("'", "'\\''")}'`;
71
+ const native = template === "repository-skill"
72
+ ? " --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json"
73
+ : "";
74
+ process.stdout.write(`Created ${template} evaluation at ${destination}\nOpen README.md, then:\n cd ${quoted}\n sevro run --run-manifest-file run.json${native} --dry\n sevro run --run-manifest-file run.json${native}\n`);
75
+ return 0;
76
+ }
77
+ catch (error) {
78
+ process.stderr.write(`sevro: ${error instanceof Error ? error.message : "initialization failed"}\n`);
79
+ return 64;
80
+ }
81
+ }
82
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["init.ts"],"names":[],"mappings":"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","sourcesContent":["import { examplePath, sourceRuntime } from \"../runner-paths\";\nimport { cp, mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport {\n nativeReadme,\n templateCommand,\n templateSettings,\n} from \"./init-settings\";\n\nfunction initOptions(argv: string[]) {\n const { values, positionals } = parseArgs({\n args: argv,\n strict: true,\n allowPositionals: true,\n options: {\n template: { type: \"string\", default: \"response\" },\n directory: { type: \"string\", default: \"sevro-evaluation\" },\n },\n });\n if (\n positionals.length ||\n ![\"response\", \"coding\", \"repository-skill\"].includes(values.template)\n )\n throw new Error(\n \"use --template response, coding or repository-skill; run sevro init --help\",\n );\n if (!values.directory.trim())\n throw new Error(\"--directory must name a new directory\");\n return { template: values.template, destination: resolve(values.directory) };\n}\n\nasync function reserveDirectory(destination: string): Promise<void> {\n await mkdir(dirname(destination), { recursive: true });\n try {\n await mkdir(destination);\n } catch (cause) {\n throw new Error(\n `init destination already exists or cannot be created: ${destination}; choose a new --directory`,\n { cause },\n );\n }\n}\n\nfunction starterReadme(template: string) {\n if (template === \"repository-skill\") return nativeReadme();\n const assertion =\n template === \"coding\"\n ? \"positive, negative and zero addition assertions against edited add.sh\"\n : \"an exact response assertion\";\n const prerequisites =\n template === \"coding\"\n ? \"Node.js 24.13.0 or newer, or Bun 1.3.13, plus sandbox-exec on macOS or bubblewrap/socat on Linux\"\n : \"Node.js 24.13.0 or newer, or Bun 1.3.13\";\n return `# ${template} evaluation\\n\\nThis deterministic adapter exercises ${assertion}, without model credentials. Prerequisites: ${prerequisites}.\\n\\n\\`\\`\\`sh\\nsevro run --run-manifest-file run.json --dry\\nsevro run --run-manifest-file run.json\\nsevro report --latest\\nSEVRO_TEMPLATE_FAIL=1 sevro run --run-manifest-file run.json\\n\\`\\`\\`\\n\\nThe negative control must report task=failed and exit 1. Dry preparation is not an assessment.\\nEdit case.json and ${sourceRuntime ? \"adapter.ts\" : \"adapter.js\"}, prepare, then run again. Keep private .sevro evidence out of Git.\\nFor a native model, replace the adapter route explicitly with --host, --model and --effort; Codex also requires --codex-auth-file. No model execution or native skill dispatch is established by this adapter.\\n`;\n}\n\nasync function initialize(template: string, destination: string) {\n await reserveDirectory(destination);\n try {\n await cp(examplePath(\"templates\", template), destination, {\n recursive: true,\n errorOnExist: true,\n force: false,\n });\n await writeFile(\n join(destination, \"run.json\"),\n JSON.stringify(\n { format: \"sevro.run.v1\", settings: templateSettings(template) },\n null,\n 2,\n ) + \"\\n\",\n { flag: \"wx\" },\n );\n if (template === \"repository-skill\")\n await writeFile(\n join(destination, \"command.json\"),\n JSON.stringify(templateCommand(destination)) + \"\\n\",\n { flag: \"wx\" },\n );\n await writeFile(join(destination, \".gitignore\"), \".sevro/\\n\", {\n flag: \"wx\",\n });\n await writeFile(join(destination, \"README.md\"), starterReadme(template), {\n flag: \"wx\",\n });\n } catch (cause) {\n await rm(destination, { recursive: true, force: true });\n throw cause;\n }\n}\n\nexport async function initCommand(argv: string[]): Promise<number> {\n try {\n const { template, destination } = initOptions(argv);\n await initialize(template, destination);\n const quoted = `'${destination.replaceAll(\"'\", \"'\\\\''\")}'`;\n const native =\n template === \"repository-skill\"\n ? \" --model YOUR_MODEL --effort YOUR_EFFORT --codex-auth-file /absolute/auth.json\"\n : \"\";\n process.stdout.write(\n `Created ${template} evaluation at ${destination}\\nOpen README.md, then:\\n cd ${quoted}\\n sevro run --run-manifest-file run.json${native} --dry\\n sevro run --run-manifest-file run.json${native}\\n`,\n );\n return 0;\n } catch (error) {\n process.stderr.write(\n `sevro: ${error instanceof Error ? error.message : \"initialization failed\"}\\n`,\n );\n return 64;\n }\n}\n"]}