@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 @@
1
+ {"version":3,"file":"extension-methods.js","sourceRoot":"","sources":["extension-methods.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n artifact,\n pluginArtifacts,\n repositoryArtifacts,\n} from \"./extension-artifacts\";\n\nexport function record(value: unknown): Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value))\n throw new Error(\"Expected a JSON object\");\n return value as Record<string, unknown>;\n}\n\nexport function describe(mode: string, host: string) {\n const capabilities: Record<string, string[]> = {\n lifecycle: [],\n \"repository-skill\": [`sevro.${host}.repository-invocation`],\n plugins:\n host === \"codex\"\n ? [\"sevro.codex.plugin-marketplace\", \"sevro.codex.explicit-invocation\"]\n : [\"sevro.claude.plugin-dirs\", \"sevro.claude.explicit-invocation\"],\n };\n const requiredCapabilities = capabilities[mode];\n if (!requiredCapabilities) throw new Error(\"Unknown extension recipe\");\n return {\n extension: { id: \"recipes.startup\", version: \"1.0.0\" },\n protocols: [\"sevro.extension.v1\"],\n requiredCapabilities,\n optionalCapabilities: [],\n graders: [\"recipes.startup\"],\n taskVerdictPolicies: [],\n };\n}\n\nfunction requiredInvocation(mode: string, host: string): string[] {\n if (mode !== \"repository-skill\") return [];\n return [\n host === \"codex\"\n ? \"sevro.codex.explicit-invocation\"\n : \"sevro.claude.repository-invocation\",\n ];\n}\n\nexport function resolveCase(mode: string, host: string, fail: boolean) {\n const invocation = mode === \"lifecycle\" ? \"\" : \"{{sevro.skill_invocation}} \";\n const prompt = fail\n ? \"Deliberate negative control: return only wrong.\"\n : \"Read README.md. Explain the application's start command and port. Do not change files.\";\n const requiredEvidence = requiredInvocation(mode, host);\n return {\n cases: [\n {\n id: \"recipe-extension\",\n prompt: invocation + prompt,\n fixture: {\n kind: \"generated\",\n commits: [\n {\n message: \"chore: initialize sample\",\n files: { \"README.md\": \"Run bun run dev on port 3000.\\n\" },\n },\n ],\n },\n checks: [\n {\n id: \"startup-command\",\n grader: \"sevro.regex\",\n configuration: { pattern: \"bun run dev\" },\n },\n {\n id: \"prepared-input\",\n grader: \"sevro.shell\",\n configuration: {\n run: \"test \\\"$(cat startup.txt)\\\" = 'prepared startup data'\",\n },\n },\n ...(mode === \"plugins\"\n ? [\n {\n id: \"plugin-hook\",\n grader: \"sevro.shell\",\n configuration: {\n run: \"cat hook-ran.txt\",\n expectExact: \"hook ran\",\n },\n },\n ]\n : []),\n {\n id: \"recipes.startup.answer\",\n grader: \"recipes.startup\",\n configuration: {},\n },\n ],\n requiredEvidence,\n extensionData: { \"recipes.startup\": { mode, host } },\n },\n ],\n };\n}\n\nexport async function prepare(mode: string, host: string) {\n const base = {\n artifacts: [artifact(\"startup.txt\", \"prepared startup data\\n\")],\n requestedInstrumentation: [],\n extensionData: { \"recipes.startup\": { mode, host } },\n };\n switch (mode) {\n case \"repository-skill\":\n return {\n ...base,\n artifacts: [...base.artifacts, ...(await repositoryArtifacts(host))],\n ...(host === \"codex\"\n ? { codexRepositorySkillInvocation: { skillName: \"startup-guide\" } }\n : {\n claudeRepositorySkillInvocation: { skillName: \"startup-guide\" },\n }),\n };\n case \"plugins\":\n return {\n ...base,\n artifacts: [...base.artifacts, ...pluginArtifacts()],\n ...(host === \"codex\"\n ? {\n codexMarketplace: {\n artifactRoot: \"marketplace\",\n marketplaceName: \"recipes\",\n pluginNames: [\"startup\"],\n },\n codexSkillInvocation: {\n pluginName: \"startup\",\n skillName: \"startup-guide\",\n },\n }\n : {\n claudePluginDirs: { artifactRoots: [\"marketplace/plugin\"] },\n claudeSkillInvocation: {\n pluginName: \"startup\",\n skillName: \"startup-guide\",\n },\n }),\n };\n default:\n return base;\n }\n}\n\nfunction answerStatus(observation: Record<string, unknown>) {\n if (observation.completeness !== \"complete\") return \"unavailable\";\n const text = record(observation.data).text;\n return typeof text === \"string\" && /\\b3000\\b/.test(text)\n ? \"passed\"\n : \"failed\";\n}\n\nexport function evaluate(params: Record<string, unknown>) {\n if (!Array.isArray(params.observations))\n throw new Error(\"Missing observations\");\n const observations: unknown[] = params.observations;\n const observation = observations\n .map(record)\n .find((item) => item.id === \"sevro.observation.final-message\");\n if (!observation) throw new Error(\"Missing final-message observation\");\n const status = answerStatus(observation);\n return {\n checks: [\n {\n id: \"recipes.startup.answer\",\n status,\n evidenceRefs: [\"sevro.observation.final-message\"],\n },\n ],\n metrics: [],\n };\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { describe, evaluate, prepare, record, resolveCase, } from "./extension-methods.js";
3
+ const mode = process.argv[2] ?? "lifecycle";
4
+ const host = process.argv[3] ?? "deterministic";
5
+ const fail = process.argv[4] === "fail";
6
+ const request = record(JSON.parse(readFileSync(0, "utf8")));
7
+ async function result() {
8
+ switch (request.method) {
9
+ case "describe":
10
+ return describe(mode, host);
11
+ case "resolve":
12
+ return resolveCase(mode, host, fail);
13
+ case "prepare":
14
+ return await prepare(mode, host);
15
+ case "evaluate":
16
+ return evaluate(record(request.params));
17
+ default:
18
+ throw new Error("Unsupported extension method");
19
+ }
20
+ }
21
+ // One request per process; stdout contains only the matching protocol response.
22
+ process.stdout.write(JSON.stringify({
23
+ protocol: request.protocol,
24
+ id: request.id,
25
+ method: request.method,
26
+ result: await result(),
27
+ }));
28
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB;AACvC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,MAAM,EACN,WAAW,GACZ,+BAA4B;AAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;AAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC;AAChD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;AACxC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC,CAAC;AAEvE,KAAK,UAAU,MAAM;IACnB,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,KAAK,SAAS;YACZ,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,KAAK,SAAS;YACZ,OAAO,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,EAAE,EAAE,OAAO,CAAC,EAAE;IACd,MAAM,EAAE,OAAO,CAAC,MAAM;IACtB,MAAM,EAAE,MAAM,MAAM,EAAE;CACvB,CAAC,CACH,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport {\n describe,\n evaluate,\n prepare,\n record,\n resolveCase,\n} from \"./extension-methods\";\n\nconst mode = process.argv[2] ?? \"lifecycle\";\nconst host = process.argv[3] ?? \"deterministic\";\nconst fail = process.argv[4] === \"fail\";\nconst request = record(JSON.parse(readFileSync(0, \"utf8\")) as unknown);\n\nasync function result() {\n switch (request.method) {\n case \"describe\":\n return describe(mode, host);\n case \"resolve\":\n return resolveCase(mode, host, fail);\n case \"prepare\":\n return await prepare(mode, host);\n case \"evaluate\":\n return evaluate(record(request.params));\n default:\n throw new Error(\"Unsupported extension method\");\n }\n}\n\n// One request per process; stdout contains only the matching protocol response.\nprocess.stdout.write(\n JSON.stringify({\n protocol: request.protocol,\n id: request.id,\n method: request.method,\n result: await result(),\n }),\n);\n"]}
@@ -0,0 +1,9 @@
1
+ import { join } from "node:path";
2
+ /** Locate source modules for Bun development or compiled modules for consumers. */
3
+ export function recipeFile(...parts) {
4
+ const path = join(import.meta.dirname, ...parts);
5
+ return import.meta.filename.endsWith(".ts")
6
+ ? path
7
+ : path.replace(/\.ts$/, ".js");
8
+ }
9
+ //# sourceMappingURL=modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["modules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,kBAAkB;AAEjC,mFAAmF;AACnF,MAAM,UAAU,UAAU,CAAC,GAAG,KAAe;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC","sourcesContent":["import { join } from \"node:path\";\n\n/** Locate source modules for Bun development or compiled modules for consumers. */\nexport function recipeFile(...parts: string[]): string {\n const path = join(import.meta.dirname, ...parts);\n return import.meta.filename.endsWith(\".ts\")\n ? path\n : path.replace(/\\.ts$/, \".js\");\n}\n"]}
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: startup-guide
3
+ description: Explain how to start this sample application and identify its port.
4
+ ---
5
+
6
+ Read README.md. Explain the exact start command and port from that file.
7
+ Do not change files. Do not invent a different command or port.
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: startup-guide
3
+ description: Explain how to start this sample application and identify its port.
4
+ ---
5
+
6
+ Read README.md. Explain the exact start command and port from that file.
7
+ Do not change files. Do not invent a different command or port.
@@ -0,0 +1,3 @@
1
+ # Sample application
2
+
3
+ Run `bun run dev` to start the application on port `3000`.
@@ -0,0 +1,144 @@
1
+ import { recipeFile } from "./modules.js";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { record } from "./extension-methods.js";
5
+ import { requireTool } from "./run-options.js";
6
+ function shellQuote(text) {
7
+ return `'${text.replaceAll("'", "'\\''")}'`;
8
+ }
9
+ function evaluatorCode(test) {
10
+ if (import.meta.filename.endsWith(".js"))
11
+ return test;
12
+ return new Bun.Transpiler({ loader: "ts" }).transformSync(test);
13
+ }
14
+ async function caseFile(options, state) {
15
+ const value = record(JSON.parse(await readFile(join(import.meta.dirname, "cases", `${options.recipe}.json`), "utf8")));
16
+ if (options.recipe === "coding-change") {
17
+ const test = await readFile(recipeFile("coding-change/check.ts"), "utf8");
18
+ const checks = Array.isArray(value.checks) ? value.checks : [];
19
+ const check = record(checks[0]);
20
+ const javascript = evaluatorCode(test);
21
+ const protectedTest = shellQuote(recipeFile("coding-change/check.ts"));
22
+ record(check.configuration).run =
23
+ `test ! -r ${protectedTest}\nnode --input-type=module -e ${shellQuote(javascript)}`;
24
+ }
25
+ if (options.fail)
26
+ negativeFixture(value, options.recipe);
27
+ const path = join(state, "case.json");
28
+ await writeFile(path, JSON.stringify(value));
29
+ return ["--case-file", path];
30
+ }
31
+ function negativeFixture(value, recipe) {
32
+ if (["coding-change", "semantic"].includes(recipe)) {
33
+ value.prompt =
34
+ "Deliberate negative control: leave math.cjs unchanged if present and respond only: npm start on port 9000.";
35
+ return;
36
+ }
37
+ const files = record(record(value.fixture).files);
38
+ for (const [path, content] of Object.entries(files)) {
39
+ if (typeof content !== "string")
40
+ throw new Error("Expected inline fixture text");
41
+ files[path] = content.replaceAll("3000", "9000");
42
+ }
43
+ }
44
+ async function extensionFiles(options, state) {
45
+ const command = join(state, "extension-command.json");
46
+ await writeFile(command, JSON.stringify([
47
+ process.execPath,
48
+ recipeFile("extension.ts"),
49
+ options.recipe,
50
+ options.route,
51
+ options.fail ? "fail" : "pass",
52
+ ]));
53
+ const sources = [
54
+ "extension.ts",
55
+ "extension-methods.ts",
56
+ "extension-artifacts.ts",
57
+ "repository-skill/.agents/skills/startup-guide/SKILL.md",
58
+ "repository-skill/.claude/skills/startup-guide/SKILL.md",
59
+ ];
60
+ return [
61
+ "--extension-command-file",
62
+ command,
63
+ "--case-id",
64
+ "recipe-extension",
65
+ ...sources.flatMap((path) => ["--extension-source-file", recipeFile(path)]),
66
+ ];
67
+ }
68
+ export async function recipeInputs(options, state) {
69
+ if (["lifecycle", "repository-skill", "plugins"].includes(options.recipe))
70
+ return extensionFiles(options, state);
71
+ return caseFile(options, state);
72
+ }
73
+ async function codexAuthentication(options, state) {
74
+ if (!options.dry) {
75
+ const path = process.env.SEVRO_RECIPE_CODEX_AUTH;
76
+ if (!path)
77
+ throw new Error("Set SEVRO_RECIPE_CODEX_AUTH to your private Codex auth.json path");
78
+ return path;
79
+ }
80
+ const path = join(state, "dry-auth.json");
81
+ await writeFile(path, "{}\n");
82
+ return path;
83
+ }
84
+ export async function hostArguments(options, state) {
85
+ if (options.route === "deterministic")
86
+ return ["--adapter-module", recipeFile("candidate.ts")];
87
+ const model = selectedModel(options.dry, "SEVRO_RECIPE_MODEL");
88
+ if (!model)
89
+ throw new Error("Set SEVRO_RECIPE_MODEL to an available model for the selected native host");
90
+ const args = [
91
+ "--host",
92
+ options.route,
93
+ "--model",
94
+ model,
95
+ "--effort",
96
+ "medium",
97
+ ];
98
+ if (options.route === "codex")
99
+ return [
100
+ ...args,
101
+ "--codex-bin",
102
+ requireTool("codex"),
103
+ "--codex-auth-file",
104
+ await codexAuthentication(options, state),
105
+ ];
106
+ return [
107
+ ...args,
108
+ "--claude-bin",
109
+ requireTool("claude"),
110
+ ...(options.recipe === "repository-skill"
111
+ ? ["--claude-project-settings"]
112
+ : []),
113
+ ];
114
+ }
115
+ export async function semanticArguments(options, state) {
116
+ if (options.recipe !== "semantic")
117
+ return [];
118
+ if (options.route === "deterministic")
119
+ return ["--semantic-adapter-module", recipeFile("semantic-judge.ts")];
120
+ const model = selectedModel(options.dry, "SEVRO_RECIPE_JUDGE_MODEL");
121
+ if (!model)
122
+ throw new Error("Set SEVRO_RECIPE_JUDGE_MODEL for the separate Codex judge route");
123
+ const args = [
124
+ "--semantic-host",
125
+ "codex",
126
+ "--semantic-model",
127
+ model,
128
+ "--semantic-effort",
129
+ "medium",
130
+ ];
131
+ if (options.route === "codex")
132
+ return args;
133
+ return [
134
+ ...args,
135
+ "--codex-bin",
136
+ requireTool("codex"),
137
+ "--codex-auth-file",
138
+ await codexAuthentication(options, state),
139
+ ];
140
+ }
141
+ function selectedModel(dry, variable) {
142
+ return dry ? "dry-model" : process.env[variable];
143
+ }
144
+ //# sourceMappingURL=run-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-inputs.js","sourceRoot":"","sources":["run-inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,qBAAkB;AACvC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,yBAAyB;AACvD,OAAO,EAAE,IAAI,EAAE,kBAAkB;AACjC,OAAO,EAAE,MAAM,EAAE,+BAA4B;AAC7C,OAAO,EAAE,WAAW,EAAsB,yBAAsB;AAEhE,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,OAAsB,EACtB,KAAa;IAEb,MAAM,KAAK,GAAG,MAAM,CAClB,IAAI,CAAC,KAAK,CACR,MAAM,QAAQ,CACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,EAC5D,MAAM,CACP,CACS,CACb,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAc,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG;YAC7B,aAAa,aAAa,iCAAiC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,OAAO,CAAC,IAAI;QAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,KAA8B,EAAE,MAAc;IACrE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,KAAK,CAAC,MAAM;YACV,4GAA4G,CAAC;QAC/G,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,IAAI,OAAO,OAAO,KAAK,QAAQ;YAC7B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAsB,EACtB,KAAa;IAEb,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IACtD,MAAM,SAAS,CACb,OAAO,EACP,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,CAAC,QAAQ;QAChB,UAAU,CAAC,cAAc,CAAC;QAC1B,OAAO,CAAC,MAAM;QACd,OAAO,CAAC,KAAK;QACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;KAC/B,CAAC,CACH,CAAC;IACF,MAAM,OAAO,GAAG;QACd,cAAc;QACd,sBAAsB;QACtB,wBAAwB;QACxB,wDAAwD;QACxD,wDAAwD;KACzD,CAAC;IACF,OAAO;QACL,0BAA0B;QAC1B,OAAO;QACP,WAAW;QACX,kBAAkB;QAClB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,yBAAyB,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAsB,EACtB,KAAa;IAEb,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;QACvE,OAAO,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,OAAsB,EACtB,KAAa;IAEb,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACjD,IAAI,CAAC,IAAI;YACP,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;QACJ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAsB,EACtB,KAAa;IAEb,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe;QACnC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK;QACR,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;IACJ,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,OAAO,CAAC,KAAK;QACb,SAAS;QACT,KAAK;QACL,UAAU;QACV,QAAQ;KACT,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO;QAC3B,OAAO;YACL,GAAG,IAAI;YACP,aAAa;YACb,WAAW,CAAC,OAAO,CAAC;YACpB,mBAAmB;YACnB,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;SAC1C,CAAC;IACJ,OAAO;QACL,GAAG,IAAI;QACP,cAAc;QACd,WAAW,CAAC,QAAQ,CAAC;QACrB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,kBAAkB;YACvC,CAAC,CAAC,CAAC,2BAA2B,CAAC;YAC/B,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAsB,EACtB,KAAa;IAEb,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,OAAO,CAAC,KAAK,KAAK,eAAe;QACnC,OAAO,CAAC,2BAA2B,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACxE,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK;QACR,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,MAAM,IAAI,GAAG;QACX,iBAAiB;QACjB,OAAO;QACP,kBAAkB;QAClB,KAAK;QACL,mBAAmB;QACnB,QAAQ;KACT,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO;QACL,GAAG,IAAI;QACP,aAAa;QACb,WAAW,CAAC,OAAO,CAAC;QACpB,mBAAmB;QACnB,MAAM,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAY,EAAE,QAAgB;IACnD,OAAO,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACnD,CAAC","sourcesContent":["import { recipeFile } from \"./modules\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { record } from \"./extension-methods\";\nimport { requireTool, type RecipeOptions } from \"./run-options\";\n\nfunction shellQuote(text: string): string {\n return `'${text.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction evaluatorCode(test: string): string {\n if (import.meta.filename.endsWith(\".js\")) return test;\n return new Bun.Transpiler({ loader: \"ts\" }).transformSync(test);\n}\n\nasync function caseFile(\n options: RecipeOptions,\n state: string,\n): Promise<string[]> {\n const value = record(\n JSON.parse(\n await readFile(\n join(import.meta.dirname, \"cases\", `${options.recipe}.json`),\n \"utf8\",\n ),\n ) as unknown,\n );\n if (options.recipe === \"coding-change\") {\n const test = await readFile(recipeFile(\"coding-change/check.ts\"), \"utf8\");\n const checks: unknown[] = Array.isArray(value.checks) ? value.checks : [];\n const check = record(checks[0]);\n const javascript = evaluatorCode(test);\n const protectedTest = shellQuote(recipeFile(\"coding-change/check.ts\"));\n record(check.configuration).run =\n `test ! -r ${protectedTest}\\nnode --input-type=module -e ${shellQuote(javascript)}`;\n }\n if (options.fail) negativeFixture(value, options.recipe);\n const path = join(state, \"case.json\");\n await writeFile(path, JSON.stringify(value));\n return [\"--case-file\", path];\n}\n\nfunction negativeFixture(value: Record<string, unknown>, recipe: string): void {\n if ([\"coding-change\", \"semantic\"].includes(recipe)) {\n value.prompt =\n \"Deliberate negative control: leave math.cjs unchanged if present and respond only: npm start on port 9000.\";\n return;\n }\n const files = record(record(value.fixture).files);\n for (const [path, content] of Object.entries(files)) {\n if (typeof content !== \"string\")\n throw new Error(\"Expected inline fixture text\");\n files[path] = content.replaceAll(\"3000\", \"9000\");\n }\n}\n\nasync function extensionFiles(\n options: RecipeOptions,\n state: string,\n): Promise<string[]> {\n const command = join(state, \"extension-command.json\");\n await writeFile(\n command,\n JSON.stringify([\n process.execPath,\n recipeFile(\"extension.ts\"),\n options.recipe,\n options.route,\n options.fail ? \"fail\" : \"pass\",\n ]),\n );\n const sources = [\n \"extension.ts\",\n \"extension-methods.ts\",\n \"extension-artifacts.ts\",\n \"repository-skill/.agents/skills/startup-guide/SKILL.md\",\n \"repository-skill/.claude/skills/startup-guide/SKILL.md\",\n ];\n return [\n \"--extension-command-file\",\n command,\n \"--case-id\",\n \"recipe-extension\",\n ...sources.flatMap((path) => [\"--extension-source-file\", recipeFile(path)]),\n ];\n}\n\nexport async function recipeInputs(\n options: RecipeOptions,\n state: string,\n): Promise<string[]> {\n if ([\"lifecycle\", \"repository-skill\", \"plugins\"].includes(options.recipe))\n return extensionFiles(options, state);\n return caseFile(options, state);\n}\n\nasync function codexAuthentication(\n options: RecipeOptions,\n state: string,\n): Promise<string> {\n if (!options.dry) {\n const path = process.env.SEVRO_RECIPE_CODEX_AUTH;\n if (!path)\n throw new Error(\n \"Set SEVRO_RECIPE_CODEX_AUTH to your private Codex auth.json path\",\n );\n return path;\n }\n const path = join(state, \"dry-auth.json\");\n await writeFile(path, \"{}\\n\");\n return path;\n}\n\nexport async function hostArguments(\n options: RecipeOptions,\n state: string,\n): Promise<string[]> {\n if (options.route === \"deterministic\")\n return [\"--adapter-module\", recipeFile(\"candidate.ts\")];\n const model = selectedModel(options.dry, \"SEVRO_RECIPE_MODEL\");\n if (!model)\n throw new Error(\n \"Set SEVRO_RECIPE_MODEL to an available model for the selected native host\",\n );\n const args = [\n \"--host\",\n options.route,\n \"--model\",\n model,\n \"--effort\",\n \"medium\",\n ];\n if (options.route === \"codex\")\n return [\n ...args,\n \"--codex-bin\",\n requireTool(\"codex\"),\n \"--codex-auth-file\",\n await codexAuthentication(options, state),\n ];\n return [\n ...args,\n \"--claude-bin\",\n requireTool(\"claude\"),\n ...(options.recipe === \"repository-skill\"\n ? [\"--claude-project-settings\"]\n : []),\n ];\n}\n\nexport async function semanticArguments(\n options: RecipeOptions,\n state: string,\n): Promise<string[]> {\n if (options.recipe !== \"semantic\") return [];\n if (options.route === \"deterministic\")\n return [\"--semantic-adapter-module\", recipeFile(\"semantic-judge.ts\")];\n const model = selectedModel(options.dry, \"SEVRO_RECIPE_JUDGE_MODEL\");\n if (!model)\n throw new Error(\n \"Set SEVRO_RECIPE_JUDGE_MODEL for the separate Codex judge route\",\n );\n const args = [\n \"--semantic-host\",\n \"codex\",\n \"--semantic-model\",\n model,\n \"--semantic-effort\",\n \"medium\",\n ];\n if (options.route === \"codex\") return args;\n return [\n ...args,\n \"--codex-bin\",\n requireTool(\"codex\"),\n \"--codex-auth-file\",\n await codexAuthentication(options, state),\n ];\n}\n\nfunction selectedModel(dry: boolean, variable: string): string | undefined {\n return dry ? \"dry-model\" : process.env[variable];\n}\n"]}
@@ -0,0 +1,103 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { which } from "./executable.js";
3
+ import { delimiter, isAbsolute, join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ export const recipeNames = [
6
+ "coding-change",
7
+ "host-tools",
8
+ "node",
9
+ "python-uv",
10
+ "mise",
11
+ "semantic",
12
+ "lifecycle",
13
+ "repository-skill",
14
+ "plugins",
15
+ ];
16
+ function validateSelection(recipe, route, flags) {
17
+ if (!recipeNames.includes(recipe))
18
+ throw new Error(`Choose a recipe: ${recipeNames.join(", ")}`);
19
+ if (!["deterministic", "codex", "claude"].includes(route))
20
+ throw new Error("Choose deterministic, codex, or claude");
21
+ if (flags.some((flag) => !["--dry", "--fail", "--goals-only"].includes(flag)))
22
+ throw new Error("Supported flags: --dry --fail --goals-only");
23
+ }
24
+ function validateNativeRecipe(recipe, route) {
25
+ if (["repository-skill", "plugins"].includes(recipe) &&
26
+ route === "deterministic")
27
+ throw new Error("Skill and plugin recipes require codex or claude (add --dry to prepare without model calls)");
28
+ }
29
+ export function selectedOptions() {
30
+ const [recipe = "", route = "deterministic", ...flags] = process.argv.slice(2);
31
+ validateSelection(recipe, route, flags);
32
+ validateNativeRecipe(recipe, route);
33
+ validateGoalsStep(flags);
34
+ return {
35
+ recipe,
36
+ route,
37
+ dry: flags.includes("--dry"),
38
+ fail: flags.includes("--fail"),
39
+ goalsOnly: flags.includes("--goals-only"),
40
+ };
41
+ }
42
+ function validateGoalsStep(flags) {
43
+ if (flags.includes("--goals-only") && !flags.includes("--dry"))
44
+ throw new Error("--goals-only is a dry preparation step; omit it for the complete hook recipe");
45
+ }
46
+ export function requireTool(name) {
47
+ const path = which(name);
48
+ if (!path)
49
+ throw new Error(`Recipe prerequisite missing: install ${name} and put it on PATH`);
50
+ return path;
51
+ }
52
+ export function runtimeFile(options) {
53
+ const files = {
54
+ "coding-change": "path",
55
+ "host-tools": "path",
56
+ node: "path",
57
+ "python-uv": "python-uv",
58
+ mise: "mise",
59
+ plugins: options.goalsOnly ? "goals" : "plugins",
60
+ };
61
+ return join(import.meta.dirname, "runtime", `${files[options.recipe] ?? "empty"}.json`);
62
+ }
63
+ function languagePrerequisites(recipe) {
64
+ if (recipe === "python-uv")
65
+ process.env.RECIPE_PYTHON ??= requireTool("python3");
66
+ if (recipe === "mise")
67
+ selectMiseNode();
68
+ if (recipe === "host-tools")
69
+ requireStandaloneRipgrep();
70
+ }
71
+ function requireStandaloneRipgrep() {
72
+ const roots = [
73
+ process.env.CODEX_HOME ?? join(homedir(), ".codex"),
74
+ process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), ".claude"),
75
+ ];
76
+ const paths = (process.env.PATH ?? "")
77
+ .split(delimiter)
78
+ .filter((entry) => !roots.some((root) => entry.startsWith(root)));
79
+ if (!which("rg", paths.join(delimiter)))
80
+ throw new Error("Install standalone ripgrep outside Codex/Claude credential directories, then put it on PATH (for example brew install ripgrep or apt-get install ripgrep)");
81
+ }
82
+ function selectMiseNode() {
83
+ const result = spawnSync(requireTool("mise"), ["where", "node@24.13.0"], {
84
+ encoding: "utf8",
85
+ });
86
+ const installation = result.stdout.trim();
87
+ if (result.status !== 0 || !isAbsolute(installation))
88
+ throw new Error("Install the recipe's Node with mise install node@24.13.0 before running it");
89
+ process.env.PATH = `${join(installation, "bin")}${delimiter}${process.env.PATH ?? "/usr/bin:/bin"}`;
90
+ }
91
+ export function runtimePrerequisites(recipe) {
92
+ const tools = {
93
+ "coding-change": ["node"],
94
+ "host-tools": ["rg"],
95
+ node: ["node"],
96
+ "python-uv": ["uv", "python3"],
97
+ mise: ["mise"],
98
+ };
99
+ for (const tool of tools[recipe] ?? [])
100
+ requireTool(tool);
101
+ languagePrerequisites(recipe);
102
+ }
103
+ //# sourceMappingURL=run-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-options.js","sourceRoot":"","sources":["run-options.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawnSync } from \"node:child_process\";\nimport { which } from \"./executable\";\nimport { delimiter, isAbsolute, join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nexport const recipeNames = [\n \"coding-change\",\n \"host-tools\",\n \"node\",\n \"python-uv\",\n \"mise\",\n \"semantic\",\n \"lifecycle\",\n \"repository-skill\",\n \"plugins\",\n];\n\nfunction validateSelection(\n recipe: string,\n route: string,\n flags: string[],\n): void {\n if (!recipeNames.includes(recipe))\n throw new Error(`Choose a recipe: ${recipeNames.join(\", \")}`);\n if (![\"deterministic\", \"codex\", \"claude\"].includes(route))\n throw new Error(\"Choose deterministic, codex, or claude\");\n if (flags.some((flag) => ![\"--dry\", \"--fail\", \"--goals-only\"].includes(flag)))\n throw new Error(\"Supported flags: --dry --fail --goals-only\");\n}\n\nfunction validateNativeRecipe(recipe: string, route: string): void {\n if (\n [\"repository-skill\", \"plugins\"].includes(recipe) &&\n route === \"deterministic\"\n )\n throw new Error(\n \"Skill and plugin recipes require codex or claude (add --dry to prepare without model calls)\",\n );\n}\n\nexport function selectedOptions() {\n const [recipe = \"\", route = \"deterministic\", ...flags] =\n process.argv.slice(2);\n validateSelection(recipe, route, flags);\n validateNativeRecipe(recipe, route);\n validateGoalsStep(flags);\n return {\n recipe,\n route,\n dry: flags.includes(\"--dry\"),\n fail: flags.includes(\"--fail\"),\n goalsOnly: flags.includes(\"--goals-only\"),\n };\n}\nexport type RecipeOptions = ReturnType<typeof selectedOptions>;\n\nfunction validateGoalsStep(flags: string[]): void {\n if (flags.includes(\"--goals-only\") && !flags.includes(\"--dry\"))\n throw new Error(\n \"--goals-only is a dry preparation step; omit it for the complete hook recipe\",\n );\n}\n\nexport function requireTool(name: string): string {\n const path = which(name);\n if (!path)\n throw new Error(\n `Recipe prerequisite missing: install ${name} and put it on PATH`,\n );\n return path;\n}\n\nexport function runtimeFile(options: RecipeOptions): string {\n const files: Record<string, string> = {\n \"coding-change\": \"path\",\n \"host-tools\": \"path\",\n node: \"path\",\n \"python-uv\": \"python-uv\",\n mise: \"mise\",\n plugins: options.goalsOnly ? \"goals\" : \"plugins\",\n };\n return join(\n import.meta.dirname,\n \"runtime\",\n `${files[options.recipe] ?? \"empty\"}.json`,\n );\n}\n\nfunction languagePrerequisites(recipe: string): void {\n if (recipe === \"python-uv\")\n process.env.RECIPE_PYTHON ??= requireTool(\"python3\");\n if (recipe === \"mise\") selectMiseNode();\n if (recipe === \"host-tools\") requireStandaloneRipgrep();\n}\n\nfunction requireStandaloneRipgrep(): void {\n const roots = [\n process.env.CODEX_HOME ?? join(homedir(), \".codex\"),\n process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), \".claude\"),\n ];\n const paths = (process.env.PATH ?? \"\")\n .split(delimiter)\n .filter((entry) => !roots.some((root) => entry.startsWith(root)));\n if (!which(\"rg\", paths.join(delimiter)))\n throw new Error(\n \"Install standalone ripgrep outside Codex/Claude credential directories, then put it on PATH (for example brew install ripgrep or apt-get install ripgrep)\",\n );\n}\n\nfunction selectMiseNode(): void {\n const result = spawnSync(requireTool(\"mise\"), [\"where\", \"node@24.13.0\"], {\n encoding: \"utf8\",\n });\n const installation = result.stdout.trim();\n if (result.status !== 0 || !isAbsolute(installation))\n throw new Error(\n \"Install the recipe's Node with mise install node@24.13.0 before running it\",\n );\n process.env.PATH = `${join(installation, \"bin\")}${delimiter}${process.env.PATH ?? \"/usr/bin:/bin\"}`;\n}\n\nexport function runtimePrerequisites(recipe: string): void {\n const tools: Record<string, string[]> = {\n \"coding-change\": [\"node\"],\n \"host-tools\": [\"rg\"],\n node: [\"node\"],\n \"python-uv\": [\"uv\", \"python3\"],\n mise: [\"mise\"],\n };\n for (const tool of tools[recipe] ?? []) requireTool(tool);\n languagePrerequisites(recipe);\n}\n"]}
@@ -0,0 +1,62 @@
1
+ import { spawn } from "node:child_process";
2
+ import { Readable } from "node:stream";
3
+ import { mkdir, realpath, writeFile } from "node:fs/promises";
4
+ import { join, resolve } from "node:path";
5
+ import { hostArguments, recipeInputs, semanticArguments } from "./run-inputs.js";
6
+ import { runtimeFile, runtimePrerequisites, selectedOptions, } from "./run-options.js";
7
+ const options = selectedOptions();
8
+ runtimePrerequisites(options.recipe);
9
+ const mode = options.dry ? "dry" : options.fail ? "fail" : "pass";
10
+ const state = resolve(".sevro-recipes", options.recipe, options.route, options.goalsOnly ? "goals" : mode);
11
+ await mkdir(join(state, "project"), { recursive: true });
12
+ await mkdir(join(state, "config"), { recursive: true });
13
+ const root = await realpath(state);
14
+ const cli = process.env.SEVRO_RECIPE_CLI ??
15
+ resolve(import.meta.dirname, import.meta.filename.endsWith(".ts")
16
+ ? "../../src/cli.ts"
17
+ : "../../src/cli.js");
18
+ const args = [
19
+ process.execPath,
20
+ cli,
21
+ "run",
22
+ "--json",
23
+ "--project-root",
24
+ join(root, "project"),
25
+ "--config-root",
26
+ join(root, "config"),
27
+ "--results-root",
28
+ join(root, "results"),
29
+ "--runtime-config-file",
30
+ runtimeFile(options),
31
+ "--condition",
32
+ "passive",
33
+ "--trials",
34
+ "1",
35
+ "--threshold",
36
+ "1",
37
+ "--shell-isolation",
38
+ "--protected-root",
39
+ import.meta.dirname,
40
+ ...(await recipeInputs(options, root)),
41
+ ...(await hostArguments(options, root)),
42
+ ...(await semanticArguments(options, root)),
43
+ ...(options.dry ? ["--dry"] : []),
44
+ ];
45
+ const child = spawn(process.execPath, args.slice(1), {
46
+ env: { ...process.env, SEVRO_RECIPE_FAIL: options.fail ? "1" : "0" },
47
+ stdio: ["ignore", "pipe", "inherit"],
48
+ });
49
+ const [output, code] = await Promise.all([
50
+ new Response(Readable.toWeb(child.stdout)).text(),
51
+ new Promise((resolve, reject) => {
52
+ child.once("error", reject);
53
+ child.once("close", (code) => {
54
+ resolve(code ?? 1);
55
+ });
56
+ }),
57
+ ]);
58
+ await writeFile(join(root, "result.json"), output);
59
+ process.stderr.write(`Recipe result: ${join(root, "result.json")}\n`);
60
+ process.stdout.write(output);
61
+ process.exit(code);
62
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["run.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { Readable } from \"node:stream\";\nimport { mkdir, realpath, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { hostArguments, recipeInputs, semanticArguments } from \"./run-inputs\";\nimport {\n runtimeFile,\n runtimePrerequisites,\n selectedOptions,\n} from \"./run-options\";\n\nconst options = selectedOptions();\nruntimePrerequisites(options.recipe);\nconst mode = options.dry ? \"dry\" : options.fail ? \"fail\" : \"pass\";\nconst state = resolve(\n \".sevro-recipes\",\n options.recipe,\n options.route,\n options.goalsOnly ? \"goals\" : mode,\n);\nawait mkdir(join(state, \"project\"), { recursive: true });\nawait mkdir(join(state, \"config\"), { recursive: true });\nconst root = await realpath(state);\nconst cli =\n process.env.SEVRO_RECIPE_CLI ??\n resolve(\n import.meta.dirname,\n import.meta.filename.endsWith(\".ts\")\n ? \"../../src/cli.ts\"\n : \"../../src/cli.js\",\n );\nconst args = [\n process.execPath,\n cli,\n \"run\",\n \"--json\",\n \"--project-root\",\n join(root, \"project\"),\n \"--config-root\",\n join(root, \"config\"),\n \"--results-root\",\n join(root, \"results\"),\n \"--runtime-config-file\",\n runtimeFile(options),\n \"--condition\",\n \"passive\",\n \"--trials\",\n \"1\",\n \"--threshold\",\n \"1\",\n \"--shell-isolation\",\n \"--protected-root\",\n import.meta.dirname,\n ...(await recipeInputs(options, root)),\n ...(await hostArguments(options, root)),\n ...(await semanticArguments(options, root)),\n ...(options.dry ? [\"--dry\"] : []),\n];\nconst child = spawn(process.execPath, args.slice(1), {\n env: { ...process.env, SEVRO_RECIPE_FAIL: options.fail ? \"1\" : \"0\" },\n stdio: [\"ignore\", \"pipe\", \"inherit\"],\n});\nconst [output, code] = await Promise.all([\n new Response(\n Readable.toWeb(child.stdout) as unknown as ReadableStream<Uint8Array>,\n ).text(),\n new Promise<number>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"close\", (code) => {\n resolve(code ?? 1);\n });\n }),\n]);\nawait writeFile(join(root, \"result.json\"), output);\nprocess.stderr.write(`Recipe result: ${join(root, \"result.json\")}\\n`);\nprocess.stdout.write(output);\nprocess.exit(code);\n"]}
@@ -0,0 +1 @@
1
+ { "format": "sevro.runtime.v1" }
@@ -0,0 +1 @@
1
+ { "format": "sevro.runtime.v1", "hooks": { "nativeGoal": true } }
@@ -0,0 +1,6 @@
1
+ {
2
+ "format": "sevro.runtime.v1",
3
+ "environment": {
4
+ "inherit": ["PATH"]
5
+ }
6
+ }
@@ -0,0 +1 @@
1
+ { "format": "sevro.runtime.v1", "environment": { "inherit": ["PATH"] } }
@@ -0,0 +1,4 @@
1
+ {
2
+ "format": "sevro.runtime.v1",
3
+ "hooks": { "nativeGoal": true, "plugins": ["startup"] }
4
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "format": "sevro.runtime.v1",
3
+ "environment": {
4
+ "inherit": ["PATH", "RECIPE_PYTHON"],
5
+ "set": {
6
+ "UV_CACHE_DIR": "{{sevro.runtime}}/uv-cache",
7
+ "UV_PYTHON_DOWNLOADS": "never"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,27 @@
1
+ /** Protocol control only: use a real judge for qualitative model assessment. */
2
+ const judge = {
3
+ id: "recipes.protocol-judge",
4
+ model: "exact-fixture-oracle",
5
+ effort: "none",
6
+ run({ prompt }) {
7
+ const match = /<candidate-response-json>\s*([\s\S]*?)\s*<\/candidate-response-json>/.exec(prompt);
8
+ if (!match?.[1])
9
+ throw new Error("Missing semantic candidate response");
10
+ const candidate = JSON.parse(match[1]);
11
+ const passed = candidate === "Run bun run dev on port 3000.";
12
+ return Promise.resolve({
13
+ complete: true,
14
+ finalMessage: JSON.stringify({
15
+ checks: [
16
+ {
17
+ id: "startup-meaning",
18
+ verdict: passed ? "pass" : "fail",
19
+ reason: "Exact deterministic fixture oracle; no model judgment was made.",
20
+ },
21
+ ],
22
+ }),
23
+ });
24
+ },
25
+ };
26
+ export default judge;
27
+ //# sourceMappingURL=semantic-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-judge.js","sourceRoot":"","sources":["semantic-judge.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,KAAK,GAAG;IACZ,EAAE,EAAE,wBAAwB;IAC5B,KAAK,EAAE,sBAAsB;IAC7B,MAAM,EAAE,MAAM;IACd,GAAG,CAAC,EAAE,MAAM,EAAsB;QAChC,MAAM,KAAK,GACT,sEAAsE,CAAC,IAAI,CACzE,MAAM,CACP,CAAC;QACJ,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACxE,MAAM,SAAS,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,SAAS,KAAK,+BAA+B,CAAC;QAC7D,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC;gBAC3B,MAAM,EAAE;oBACN;wBACE,EAAE,EAAE,iBAAiB;wBACrB,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBACjC,MAAM,EACJ,iEAAiE;qBACpE;iBACF;aACF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AACF,eAAe,KAAK,CAAC","sourcesContent":["/** Protocol control only: use a real judge for qualitative model assessment. */\nconst judge = {\n id: \"recipes.protocol-judge\",\n model: \"exact-fixture-oracle\",\n effort: \"none\",\n run({ prompt }: { prompt: string }) {\n const match =\n /<candidate-response-json>\\s*([\\s\\S]*?)\\s*<\\/candidate-response-json>/.exec(\n prompt,\n );\n if (!match?.[1]) throw new Error(\"Missing semantic candidate response\");\n const candidate: unknown = JSON.parse(match[1]);\n const passed = candidate === \"Run bun run dev on port 3000.\";\n return Promise.resolve({\n complete: true,\n finalMessage: JSON.stringify({\n checks: [\n {\n id: \"startup-meaning\",\n verdict: passed ? \"pass\" : \"fail\",\n reason:\n \"Exact deterministic fixture oracle; no model judgment was made.\",\n },\n ],\n }),\n });\n },\n};\nexport default judge;\n"]}
@@ -0,0 +1,14 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ /** Deterministic file editor; it exercises the evaluator, not model coding ability. */
4
+ export default {
5
+ id: "template.coding",
6
+ model: "deterministic-editor",
7
+ effort: "none",
8
+ async run({ workspace }) {
9
+ if (process.env.SEVRO_TEMPLATE_FAIL !== "1")
10
+ await writeFile(join(workspace, "add.sh"), 'add() { echo "$(( $1 + $2 ))"; }\n');
11
+ return { finalMessage: "Completed the coding task.", complete: true };
12
+ },
13
+ };
14
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,yBAAyB;AAC7C,OAAO,EAAE,IAAI,EAAE,kBAAkB;AAEjC,uFAAuF;AACvF,eAAe;IACb,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,sBAAsB;IAC7B,MAAM,EAAE,MAAM;IACd,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAyB;QAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG;YACzC,MAAM,SAAS,CACb,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EACzB,oCAAoC,CACrC,CAAC;QACJ,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACxE,CAAC;CACF,CAAC","sourcesContent":["import { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Deterministic file editor; it exercises the evaluator, not model coding ability. */\nexport default {\n id: \"template.coding\",\n model: \"deterministic-editor\",\n effort: \"none\",\n async run({ workspace }: { workspace: string }) {\n if (process.env.SEVRO_TEMPLATE_FAIL !== \"1\")\n await writeFile(\n join(workspace, \"add.sh\"),\n 'add() { echo \"$(( $1 + $2 ))\"; }\\n',\n );\n return { finalMessage: \"Completed the coding task.\", complete: true };\n },\n};\n"]}
@@ -0,0 +1,15 @@
1
+ {
2
+ "id": "coding-addition",
3
+ "prompt": "Fix add.sh so add computes integer addition. Preserve the add shell function interface.",
4
+ "fixture": { "files": { "add.sh": "add() { echo \"$(( $1 - $2 ))\"; }\n" } },
5
+ "checks": [
6
+ {
7
+ "id": "addition",
8
+ "grader": "sevro.shell",
9
+ "configuration": {
10
+ "run": ". ./add.sh; test \"$(add 2 3)\" = 5 && test \"$(add -2 -3)\" = -5 && test \"$(add 0 0)\" = 0"
11
+ }
12
+ }
13
+ ],
14
+ "requiredEvidence": []
15
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ name: startup-guide
3
+ description: Explain the sample application's start command and port.
4
+ ---
5
+
6
+ Read README.md. State the exact start command and port. Do not change files.