@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.
- package/CONTRIBUTING.md +52 -6
- package/README.md +12 -7
- package/dist/examples/basic/graded.json +13 -0
- package/dist/examples/basic/host.js +9 -0
- package/dist/examples/basic/host.js.map +1 -0
- package/dist/examples/basic/prompt-only.json +7 -0
- package/dist/examples/recipes/candidate.js +23 -0
- package/dist/examples/recipes/candidate.js.map +1 -0
- package/dist/examples/recipes/cases/coding-change.json +21 -0
- package/dist/examples/recipes/cases/host-tools.json +21 -0
- package/dist/examples/recipes/cases/mise.json +21 -0
- package/dist/examples/recipes/cases/node.json +21 -0
- package/dist/examples/recipes/cases/python-uv.json +21 -0
- package/dist/examples/recipes/cases/semantic.json +17 -0
- package/dist/examples/recipes/coding-change/check.js +16 -0
- package/dist/examples/recipes/coding-change/check.js.map +1 -0
- package/dist/examples/recipes/executable.js +20 -0
- package/dist/examples/recipes/executable.js.map +1 -0
- package/dist/examples/recipes/extension-artifacts.js +56 -0
- package/dist/examples/recipes/extension-artifacts.js.map +1 -0
- package/dist/examples/recipes/extension-methods.js +167 -0
- package/dist/examples/recipes/extension-methods.js.map +1 -0
- package/dist/examples/recipes/extension.js +28 -0
- package/dist/examples/recipes/extension.js.map +1 -0
- package/dist/examples/recipes/modules.js +9 -0
- package/dist/examples/recipes/modules.js.map +1 -0
- package/dist/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
- package/dist/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
- package/dist/examples/recipes/repository-skill/README.md +3 -0
- package/dist/examples/recipes/run-inputs.js +144 -0
- package/dist/examples/recipes/run-inputs.js.map +1 -0
- package/dist/examples/recipes/run-options.js +103 -0
- package/dist/examples/recipes/run-options.js.map +1 -0
- package/dist/examples/recipes/run.js +62 -0
- package/dist/examples/recipes/run.js.map +1 -0
- package/dist/examples/recipes/runtime/empty.json +1 -0
- package/dist/examples/recipes/runtime/goals.json +1 -0
- package/dist/examples/recipes/runtime/mise.json +6 -0
- package/dist/examples/recipes/runtime/path.json +1 -0
- package/dist/examples/recipes/runtime/plugins.json +4 -0
- package/dist/examples/recipes/runtime/python-uv.json +10 -0
- package/dist/examples/recipes/semantic-judge.js +27 -0
- package/dist/examples/recipes/semantic-judge.js.map +1 -0
- package/dist/examples/templates/coding/adapter.js +14 -0
- package/dist/examples/templates/coding/adapter.js.map +1 -0
- package/dist/examples/templates/coding/case.json +15 -0
- package/dist/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
- package/dist/examples/templates/repository-skill/extension-data.js +61 -0
- package/dist/examples/templates/repository-skill/extension-data.js.map +1 -0
- package/dist/examples/templates/repository-skill/extension.js +29 -0
- package/dist/examples/templates/repository-skill/extension.js.map +1 -0
- package/dist/examples/templates/response/adapter.js +13 -0
- package/dist/examples/templates/response/adapter.js.map +1 -0
- package/dist/examples/templates/response/case.json +13 -0
- package/dist/src/advisory.js +86 -0
- package/dist/src/advisory.js.map +1 -0
- package/dist/src/candidate-artifacts.js +139 -0
- package/dist/src/candidate-artifacts.js.map +1 -0
- package/dist/src/candidate-codex-state.js +110 -0
- package/dist/src/candidate-codex-state.js.map +1 -0
- package/dist/src/case-validation.js +92 -0
- package/dist/src/case-validation.js.map +1 -0
- package/dist/src/cli/cancellation.js +21 -0
- package/dist/src/cli/cancellation.js.map +1 -0
- package/dist/src/cli/command.js +60 -0
- package/dist/src/cli/command.js.map +1 -0
- package/dist/src/cli/completion.js +14 -0
- package/dist/src/cli/completion.js.map +1 -0
- package/dist/src/cli/demo.js +45 -0
- package/dist/src/cli/demo.js.map +1 -0
- package/dist/src/cli/evaluation.js +40 -0
- package/dist/src/cli/evaluation.js.map +1 -0
- package/dist/src/cli/extension.js +54 -0
- package/dist/src/cli/extension.js.map +1 -0
- package/dist/src/cli/help.js +190 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hosts.js +33 -0
- package/dist/src/cli/hosts.js.map +1 -0
- package/dist/src/cli/init-settings.js +29 -0
- package/dist/src/cli/init-settings.js.map +1 -0
- package/dist/src/cli/init.js +82 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/invocation.js +431 -0
- package/dist/src/cli/invocation.js.map +1 -0
- package/dist/src/cli/loading.js +110 -0
- package/dist/src/cli/loading.js.map +1 -0
- package/dist/src/cli/preparation.js +88 -0
- package/dist/src/cli/preparation.js.map +1 -0
- package/dist/src/cli/presentation.js +61 -0
- package/dist/src/cli/presentation.js.map +1 -0
- package/dist/src/cli/progress.js +5 -0
- package/dist/src/cli/progress.js.map +1 -0
- package/dist/src/cli/run-manifest.js +108 -0
- package/dist/src/cli/run-manifest.js.map +1 -0
- package/dist/src/cli/run-options.js +367 -0
- package/dist/src/cli/run-options.js.map +1 -0
- package/dist/src/cli/run-overrides.js +51 -0
- package/dist/src/cli/run-overrides.js.map +1 -0
- package/dist/src/cli/settings.js +127 -0
- package/dist/src/cli/settings.js.map +1 -0
- package/dist/src/cli/summary.js +28 -0
- package/dist/src/cli/summary.js.map +1 -0
- package/dist/src/cli.js +20 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/contract-types.js +2 -0
- package/dist/src/contract-types.js.map +1 -0
- package/dist/src/engine.js +4 -0
- package/dist/src/engine.js.map +1 -0
- package/dist/src/evaluation/advisory.js +85 -0
- package/dist/src/evaluation/advisory.js.map +1 -0
- package/dist/src/evaluation/check-plan.js +292 -0
- package/dist/src/evaluation/check-plan.js.map +1 -0
- package/dist/src/evaluation/collection.js +61 -0
- package/dist/src/evaluation/collection.js.map +1 -0
- package/dist/src/evaluation/context.js +2 -0
- package/dist/src/evaluation/context.js.map +1 -0
- package/dist/src/evaluation/grading-host.js +28 -0
- package/dist/src/evaluation/grading-host.js.map +1 -0
- package/dist/src/evaluation/grading.js +154 -0
- package/dist/src/evaluation/grading.js.map +1 -0
- package/dist/src/evaluation/invocation-plan.js +312 -0
- package/dist/src/evaluation/invocation-plan.js.map +1 -0
- package/dist/src/evaluation/plan.js +376 -0
- package/dist/src/evaluation/plan.js.map +1 -0
- package/dist/src/evaluation/progress.js +14 -0
- package/dist/src/evaluation/progress.js.map +1 -0
- package/dist/src/evaluation/resources.js +159 -0
- package/dist/src/evaluation/resources.js.map +1 -0
- package/dist/src/evaluation/run.js +148 -0
- package/dist/src/evaluation/run.js.map +1 -0
- package/dist/src/evaluation/scheduler.js +27 -0
- package/dist/src/evaluation/scheduler.js.map +1 -0
- package/dist/src/evaluation/semantic.js +183 -0
- package/dist/src/evaluation/semantic.js.map +1 -0
- package/dist/src/evaluation/trial.js +593 -0
- package/dist/src/evaluation/trial.js.map +1 -0
- package/dist/src/evaluation/types.js +20 -0
- package/dist/src/evaluation/types.js.map +1 -0
- package/dist/src/evidence/host-results.js +67 -0
- package/dist/src/evidence/host-results.js.map +1 -0
- package/dist/src/evidence/retained-artifacts.js +17 -0
- package/dist/src/evidence/retained-artifacts.js.map +1 -0
- package/dist/src/evidence/trial-writer.js +131 -0
- package/dist/src/evidence/trial-writer.js.map +1 -0
- package/dist/src/evidence/usage.js +14 -0
- package/dist/src/evidence/usage.js.map +1 -0
- package/dist/src/executable.js +20 -0
- package/dist/src/executable.js.map +1 -0
- package/dist/src/extension-client.js +212 -0
- package/dist/src/extension-client.js.map +1 -0
- package/dist/src/extension-session.js +236 -0
- package/dist/src/extension-session.js.map +1 -0
- package/dist/src/fixtures/advisory.js +206 -0
- package/dist/src/fixtures/advisory.js.map +1 -0
- package/dist/src/fixtures/bin.js +41 -0
- package/dist/src/fixtures/bin.js.map +1 -0
- package/dist/src/fixtures/cleanup.js +43 -0
- package/dist/src/fixtures/cleanup.js.map +1 -0
- package/dist/src/fixtures/create.js +94 -0
- package/dist/src/fixtures/create.js.map +1 -0
- package/dist/src/fixtures/generated.js +181 -0
- package/dist/src/fixtures/generated.js.map +1 -0
- package/dist/src/fixtures/git-hooks.js +16 -0
- package/dist/src/fixtures/git-hooks.js.map +1 -0
- package/dist/src/fixtures/preparation.js +201 -0
- package/dist/src/fixtures/preparation.js.map +1 -0
- package/dist/src/fixtures/repository.js +255 -0
- package/dist/src/fixtures/repository.js.map +1 -0
- package/dist/src/fixtures/setup.js +175 -0
- package/dist/src/fixtures/setup.js.map +1 -0
- package/dist/src/fixtures/tools.js +57 -0
- package/dist/src/fixtures/tools.js.map +1 -0
- package/dist/src/fixtures/workspace-state.js +155 -0
- package/dist/src/fixtures/workspace-state.js.map +1 -0
- package/dist/src/generated/cli-result.cjs +2 -0
- package/dist/src/generated/extension.cjs +2 -0
- package/dist/src/generated/report.cjs +2 -0
- package/dist/src/generated/run-evidence.cjs +2 -0
- package/dist/src/generated/runtime.cjs +2 -0
- package/dist/src/git.js +72 -0
- package/dist/src/git.js.map +1 -0
- package/dist/src/graders/artifact.js +68 -0
- package/dist/src/graders/artifact.js.map +1 -0
- package/dist/src/graders/git-head.js +112 -0
- package/dist/src/graders/git-head.js.map +1 -0
- package/dist/src/graders/output.js +345 -0
- package/dist/src/graders/output.js.map +1 -0
- package/dist/src/graders/semantic.js +132 -0
- package/dist/src/graders/semantic.js.map +1 -0
- package/dist/src/graders/shell.js +321 -0
- package/dist/src/graders/shell.js.map +1 -0
- package/dist/src/host-diagnostic-redaction.js +52 -0
- package/dist/src/host-diagnostic-redaction.js.map +1 -0
- package/dist/src/host-diagnostics.js +248 -0
- package/dist/src/host-diagnostics.js.map +1 -0
- package/dist/src/hosts/claude-continuation.js +89 -0
- package/dist/src/hosts/claude-continuation.js.map +1 -0
- package/dist/src/hosts/claude-credential.js +121 -0
- package/dist/src/hosts/claude-credential.js.map +1 -0
- package/dist/src/hosts/claude-events.js +136 -0
- package/dist/src/hosts/claude-events.js.map +1 -0
- package/dist/src/hosts/claude-keychain.js +100 -0
- package/dist/src/hosts/claude-keychain.js.map +1 -0
- package/dist/src/hosts/claude-login-recovery.js +67 -0
- package/dist/src/hosts/claude-login-recovery.js.map +1 -0
- package/dist/src/hosts/claude-login-refresh.js +146 -0
- package/dist/src/hosts/claude-login-refresh.js.map +1 -0
- package/dist/src/hosts/claude-login-store.js +124 -0
- package/dist/src/hosts/claude-login-store.js.map +1 -0
- package/dist/src/hosts/claude-login.js +74 -0
- package/dist/src/hosts/claude-login.js.map +1 -0
- package/dist/src/hosts/claude-native-goal.js +138 -0
- package/dist/src/hosts/claude-native-goal.js.map +1 -0
- package/dist/src/hosts/claude-process.js +10 -0
- package/dist/src/hosts/claude-process.js.map +1 -0
- package/dist/src/hosts/claude-refresh-lock.js +76 -0
- package/dist/src/hosts/claude-refresh-lock.js.map +1 -0
- package/dist/src/hosts/claude-repository-invocation.js +229 -0
- package/dist/src/hosts/claude-repository-invocation.js.map +1 -0
- package/dist/src/hosts/claude-settings.js +156 -0
- package/dist/src/hosts/claude-settings.js.map +1 -0
- package/dist/src/hosts/claude-skill-activations.js +131 -0
- package/dist/src/hosts/claude-skill-activations.js.map +1 -0
- package/dist/src/hosts/claude-state.js +237 -0
- package/dist/src/hosts/claude-state.js.map +1 -0
- package/dist/src/hosts/claude-tool-calls.js +150 -0
- package/dist/src/hosts/claude-tool-calls.js.map +1 -0
- package/dist/src/hosts/claude.js +373 -0
- package/dist/src/hosts/claude.js.map +1 -0
- package/dist/src/hosts/codex-app-server.js +764 -0
- package/dist/src/hosts/codex-app-server.js.map +1 -0
- package/dist/src/hosts/codex-configuration.js +91 -0
- package/dist/src/hosts/codex-configuration.js.map +1 -0
- package/dist/src/hosts/codex-events.js +104 -0
- package/dist/src/hosts/codex-events.js.map +1 -0
- package/dist/src/hosts/codex-exec-controls.js +434 -0
- package/dist/src/hosts/codex-exec-controls.js.map +1 -0
- package/dist/src/hosts/codex-invocation.js +54 -0
- package/dist/src/hosts/codex-invocation.js.map +1 -0
- package/dist/src/hosts/codex-marketplace.js +185 -0
- package/dist/src/hosts/codex-marketplace.js.map +1 -0
- package/dist/src/hosts/codex-native-calls.js +516 -0
- package/dist/src/hosts/codex-native-calls.js.map +1 -0
- package/dist/src/hosts/codex-process.js +10 -0
- package/dist/src/hosts/codex-process.js.map +1 -0
- package/dist/src/hosts/codex-profile.js +206 -0
- package/dist/src/hosts/codex-profile.js.map +1 -0
- package/dist/src/hosts/codex-session-files.js +89 -0
- package/dist/src/hosts/codex-session-files.js.map +1 -0
- package/dist/src/hosts/codex-state.js +310 -0
- package/dist/src/hosts/codex-state.js.map +1 -0
- package/dist/src/hosts/codex.js +527 -0
- package/dist/src/hosts/codex.js.map +1 -0
- package/dist/src/hosts/isolation-common.js +43 -0
- package/dist/src/hosts/isolation-common.js.map +1 -0
- package/dist/src/hosts/isolation-roots.js +64 -0
- package/dist/src/hosts/isolation-roots.js.map +1 -0
- package/dist/src/hosts/isolation.js +12 -0
- package/dist/src/hosts/isolation.js.map +1 -0
- package/dist/src/hosts/linux-sandbox.js +127 -0
- package/dist/src/hosts/linux-sandbox.js.map +1 -0
- package/dist/src/hosts/mac-sandbox.js +137 -0
- package/dist/src/hosts/mac-sandbox.js.map +1 -0
- package/dist/src/hosts/native-controls.js +151 -0
- package/dist/src/hosts/native-controls.js.map +1 -0
- package/dist/src/hosts/native-request.js +33 -0
- package/dist/src/hosts/native-request.js.map +1 -0
- package/dist/src/hosts/process-lifecycle.js +167 -0
- package/dist/src/hosts/process-lifecycle.js.map +1 -0
- package/dist/src/hosts/protected-worktrees.js +81 -0
- package/dist/src/hosts/protected-worktrees.js.map +1 -0
- package/dist/src/hosts/skill-hook-catalog.js +100 -0
- package/dist/src/hosts/skill-hook-catalog.js.map +1 -0
- package/dist/src/hosts/skill-hook-handler.js +228 -0
- package/dist/src/hosts/skill-hook-handler.js.map +1 -0
- package/dist/src/hosts/skill-hooks.js +423 -0
- package/dist/src/hosts/skill-hooks.js.map +1 -0
- package/dist/src/hosts/workspace-fingerprint.js +72 -0
- package/dist/src/hosts/workspace-fingerprint.js.map +1 -0
- package/dist/src/identity.js +167 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/instrumentation.js +83 -0
- package/dist/src/instrumentation.js.map +1 -0
- package/dist/src/native-transcript-state.js +85 -0
- package/dist/src/native-transcript-state.js.map +1 -0
- package/dist/src/native-transcript-view.js +65 -0
- package/dist/src/native-transcript-view.js.map +1 -0
- package/dist/src/native-transcripts.js +208 -0
- package/dist/src/native-transcripts.js.map +1 -0
- package/dist/src/paths.js +13 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/process-lifecycle.js +101 -0
- package/dist/src/process-lifecycle.js.map +1 -0
- package/dist/src/provenance.js +263 -0
- package/dist/src/provenance.js.map +1 -0
- package/dist/src/prune.js +228 -0
- package/dist/src/prune.js.map +1 -0
- package/dist/src/report.js +276 -0
- package/dist/src/report.js.map +1 -0
- package/dist/src/resolved-case.js +29 -0
- package/dist/src/resolved-case.js.map +1 -0
- package/dist/src/results-lock.js +40 -0
- package/dist/src/results-lock.js.map +1 -0
- package/dist/src/results.js +127 -0
- package/dist/src/results.js.map +1 -0
- package/dist/src/run-owner.js +283 -0
- package/dist/src/run-owner.js.map +1 -0
- package/dist/src/runner-paths.js +11 -0
- package/dist/src/runner-paths.js.map +1 -0
- package/dist/src/runtime/config.js +323 -0
- package/dist/src/runtime/config.js.map +1 -0
- package/dist/src/runtime/discovery-apple.js +65 -0
- package/dist/src/runtime/discovery-apple.js.map +1 -0
- package/dist/src/runtime/discovery-providers.js +37 -0
- package/dist/src/runtime/discovery-providers.js.map +1 -0
- package/dist/src/runtime/discovery.js +40 -0
- package/dist/src/runtime/discovery.js.map +1 -0
- package/dist/src/runtime/hook-processes.js +81 -0
- package/dist/src/runtime/hook-processes.js.map +1 -0
- package/dist/src/runtime/hooks.js +304 -0
- package/dist/src/runtime/hooks.js.map +1 -0
- package/dist/src/runtime/paths.js +244 -0
- package/dist/src/runtime/paths.js.map +1 -0
- package/dist/src/runtime/query.js +76 -0
- package/dist/src/runtime/query.js.map +1 -0
- package/dist/src/runtime/seeds.js +98 -0
- package/dist/src/runtime/seeds.js.map +1 -0
- package/dist/src/runtime/shared-cache.js +81 -0
- package/dist/src/runtime/shared-cache.js.map +1 -0
- package/dist/src/runtime/state.js +106 -0
- package/dist/src/runtime/state.js.map +1 -0
- package/dist/src/runtime-process.js +148 -0
- package/dist/src/runtime-process.js.map +1 -0
- package/dist/src/schema-types.js +2 -0
- package/dist/src/schema-types.js.map +1 -0
- package/dist/src/schema.js +16 -0
- package/dist/src/schema.js.map +1 -0
- package/dist/src/shell.js +5 -0
- package/dist/src/shell.js.map +1 -0
- package/dist/src/sqlite-lock.js +18 -0
- package/dist/src/sqlite-lock.js.map +1 -0
- package/dist/src/storage.js +21 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/transcript-retention.js +109 -0
- package/dist/src/transcript-retention.js.map +1 -0
- package/dist/src/value-guards.js +26 -0
- package/dist/src/value-guards.js.map +1 -0
- package/docs/README.md +19 -15
- package/docs/architecture.md +141 -17
- package/docs/assets/README.md +5 -4
- package/docs/builtin-graders-v1.md +9 -2
- package/docs/codex-host.md +155 -57
- package/docs/contracts.md +2 -1
- package/docs/creating-cases.md +10 -4
- package/docs/development-cli.md +197 -24
- package/docs/documentation-quality.md +16 -5
- package/docs/evaluation-workflow.md +110 -0
- package/docs/extension-protocol-v1.md +26 -3
- package/docs/getting-started.md +29 -7
- package/docs/guide-evaluation.md +34 -2
- package/docs/identity-v1.md +29 -3
- package/docs/installing.md +35 -17
- package/docs/licensing.md +2 -2
- package/docs/native-controls.md +76 -5
- package/docs/native-hosts.md +197 -8
- package/docs/reading-results.md +102 -0
- package/docs/recipes.md +490 -0
- package/docs/releases.md +48 -13
- package/docs/report-v1.md +29 -1
- package/docs/results-v1.md +122 -4
- package/docs/run-settings-v1.md +147 -0
- package/docs/runtime-v1.md +255 -22
- package/docs/specs/repository-guide.md +1 -1
- package/docs/troubleshooting.md +12 -12
- package/docs/typescript-quality.md +106 -26
- package/examples/recipes/candidate.ts +26 -0
- package/examples/recipes/cases/coding-change.json +21 -0
- package/examples/recipes/cases/host-tools.json +21 -0
- package/examples/recipes/cases/mise.json +21 -0
- package/examples/recipes/cases/node.json +21 -0
- package/examples/recipes/cases/python-uv.json +21 -0
- package/examples/recipes/cases/semantic.json +17 -0
- package/examples/recipes/coding-change/check.ts +23 -0
- package/examples/recipes/executable.ts +19 -0
- package/examples/recipes/extension-artifacts.ts +65 -0
- package/examples/recipes/extension-methods.ts +174 -0
- package/examples/recipes/extension.ts +38 -0
- package/examples/recipes/modules.ts +9 -0
- package/examples/recipes/repository-skill/.agents/skills/startup-guide/SKILL.md +7 -0
- package/examples/recipes/repository-skill/.claude/skills/startup-guide/SKILL.md +7 -0
- package/examples/recipes/repository-skill/README.md +3 -0
- package/examples/recipes/run-inputs.ts +183 -0
- package/examples/recipes/run-options.ts +132 -0
- package/examples/recipes/run.ts +77 -0
- package/examples/recipes/runtime/empty.json +1 -0
- package/examples/recipes/runtime/goals.json +1 -0
- package/examples/recipes/runtime/mise.json +6 -0
- package/examples/recipes/runtime/path.json +1 -0
- package/examples/recipes/runtime/plugins.json +4 -0
- package/examples/recipes/runtime/python-uv.json +10 -0
- package/examples/recipes/semantic-judge.ts +29 -0
- package/examples/templates/coding/adapter.ts +17 -0
- package/examples/templates/coding/case.json +15 -0
- package/examples/templates/repository-skill/.agents/skills/startup-guide/SKILL.md +6 -0
- package/examples/templates/repository-skill/extension-data.ts +64 -0
- package/examples/templates/repository-skill/extension.ts +32 -0
- package/examples/templates/response/adapter.ts +12 -0
- package/examples/templates/response/case.json +13 -0
- package/package.json +23 -9
- package/schemas/report-v1.schema.json +9 -0
- package/schemas/run-evidence-v1.schema.json +2 -1
- package/schemas/runtime-v1.schema.json +43 -7
- package/src/advisory.ts +2 -2
- package/src/candidate-artifacts.ts +42 -11
- package/src/candidate-codex-state.ts +185 -0
- package/src/case-validation.ts +73 -50
- package/src/cli/cancellation.ts +20 -0
- package/src/cli/command.ts +87 -0
- package/src/cli/completion.ts +15 -0
- package/src/cli/demo.ts +61 -0
- package/src/cli/evaluation.ts +55 -0
- package/src/cli/extension.ts +79 -0
- package/src/cli/help.ts +199 -0
- package/src/cli/hosts.ts +55 -0
- package/src/cli/init-settings.ts +31 -0
- package/src/cli/init.ts +112 -0
- package/src/{cli-invocation.ts → cli/invocation.ts} +215 -218
- package/src/cli/loading.ts +151 -0
- package/src/cli/preparation.ts +154 -0
- package/src/cli/presentation.ts +93 -0
- package/src/cli/progress.ts +6 -0
- package/src/cli/run-manifest.ts +128 -0
- package/src/cli/run-options.ts +403 -0
- package/src/cli/run-overrides.ts +69 -0
- package/src/cli/settings.ts +154 -0
- package/src/cli/summary.ts +43 -0
- package/src/cli.ts +14 -592
- package/src/contract-types.ts +94 -0
- package/src/engine.ts +9 -5
- package/src/evaluation/advisory.ts +150 -0
- package/src/{evaluation-check-plan.ts → evaluation/check-plan.ts} +103 -67
- package/src/evaluation/collection.ts +88 -0
- package/src/evaluation/context.ts +10 -0
- package/src/{evaluation-grading-host.ts → evaluation/grading-host.ts} +5 -5
- package/src/evaluation/grading.ts +235 -0
- package/src/{evaluation-invocation-plan.ts → evaluation/invocation-plan.ts} +147 -58
- package/src/{evaluation-plan.ts → evaluation/plan.ts} +208 -141
- package/src/evaluation/progress.ts +19 -0
- package/src/evaluation/resources.ts +241 -0
- package/src/evaluation/run.ts +206 -0
- package/src/{evaluation-semantic.ts → evaluation/semantic.ts} +77 -87
- package/src/evaluation/trial.ts +800 -0
- package/src/{evaluation-types.ts → evaluation/types.ts} +79 -29
- package/src/evidence/host-results.ts +85 -0
- package/src/evidence/retained-artifacts.ts +18 -0
- package/src/evidence/trial-writer.ts +203 -0
- package/src/evidence/usage.ts +17 -0
- package/src/executable.ts +19 -0
- package/src/extension-client.ts +40 -108
- package/src/extension-session.ts +24 -48
- package/src/{advisory-fixture.ts → fixtures/advisory.ts} +12 -72
- package/src/{fixture-bin.ts → fixtures/bin.ts} +1 -1
- package/src/{fixture-cleanup.ts → fixtures/cleanup.ts} +13 -7
- package/src/fixtures/create.ts +183 -0
- package/src/{generated-fixture.ts → fixtures/generated.ts} +10 -53
- package/src/{git-hooks.ts → fixtures/git-hooks.ts} +1 -1
- package/src/{preparation.ts → fixtures/preparation.ts} +6 -16
- package/src/{repository-fixture.ts → fixtures/repository.ts} +30 -64
- package/src/{fixture-setup.ts → fixtures/setup.ts} +36 -53
- package/src/{fixture-tools.ts → fixtures/tools.ts} +1 -1
- package/src/{workspace-state.ts → fixtures/workspace-state.ts} +5 -5
- package/src/generated/cli-result.d.cts +2 -1
- package/src/generated/extension.d.cts +2 -1
- package/src/generated/report.cjs +1 -1
- package/src/generated/report.d.cts +2 -1
- package/src/generated/run-evidence.cjs +1 -1
- package/src/generated/run-evidence.d.cts +2 -1
- package/src/generated/runtime.cjs +1 -1
- package/src/generated/runtime.d.cts +2 -1
- package/src/git.ts +94 -0
- package/src/graders/git-head.ts +31 -85
- package/src/graders/shell.ts +54 -71
- package/src/host-diagnostic-redaction.ts +52 -0
- package/src/host-diagnostics.ts +331 -0
- package/src/hosts/claude-continuation.ts +57 -40
- package/src/hosts/claude-credential.ts +160 -63
- package/src/hosts/claude-events.ts +34 -18
- package/src/hosts/claude-keychain.ts +79 -21
- package/src/hosts/claude-login-recovery.ts +85 -0
- package/src/hosts/claude-login-refresh.ts +179 -0
- package/src/hosts/claude-login-store.ts +162 -0
- package/src/hosts/claude-login.ts +107 -0
- package/src/hosts/claude-native-goal.ts +15 -12
- package/src/hosts/claude-process.ts +10 -50
- package/src/hosts/claude-refresh-lock.ts +82 -0
- package/src/hosts/claude-repository-invocation.ts +9 -34
- package/src/hosts/claude-settings.ts +46 -9
- package/src/hosts/claude-skill-activations.ts +169 -0
- package/src/hosts/claude-state.ts +28 -15
- package/src/hosts/claude-tool-calls.ts +13 -10
- package/src/hosts/claude.ts +121 -81
- package/src/hosts/codex-app-server.ts +78 -52
- package/src/hosts/codex-configuration.ts +5 -10
- package/src/hosts/codex-exec-controls.ts +516 -0
- package/src/hosts/codex-marketplace.ts +12 -10
- package/src/hosts/codex-native-calls.ts +15 -122
- package/src/hosts/codex-process.ts +10 -183
- package/src/hosts/codex-profile.ts +36 -21
- package/src/hosts/codex-session-files.ts +1 -9
- package/src/hosts/codex-state.ts +134 -18
- package/src/hosts/codex.ts +210 -183
- package/src/hosts/isolation-common.ts +8 -11
- package/src/hosts/isolation-roots.ts +5 -4
- package/src/hosts/linux-sandbox.ts +15 -2
- package/src/hosts/mac-sandbox.ts +87 -18
- package/src/hosts/native-controls.ts +72 -22
- package/src/hosts/native-request.ts +55 -0
- package/src/hosts/process-lifecycle.ts +215 -49
- package/src/hosts/protected-worktrees.ts +3 -2
- package/src/hosts/skill-hook-catalog.ts +131 -0
- package/src/hosts/skill-hook-handler.ts +374 -0
- package/src/hosts/skill-hooks.ts +585 -0
- package/src/instrumentation.ts +7 -8
- package/src/native-transcript-state.ts +22 -3
- package/src/native-transcript-view.ts +52 -13
- package/src/native-transcripts.ts +26 -11
- package/src/paths.ts +22 -0
- package/src/process-lifecycle.ts +150 -0
- package/src/provenance.ts +34 -13
- package/src/prune.ts +300 -0
- package/src/report.ts +63 -36
- package/src/resolved-case.ts +1 -1
- package/src/results-lock.ts +42 -0
- package/src/results.ts +14 -18
- package/src/run-owner.ts +15 -9
- package/src/runner-paths.ts +21 -0
- package/src/{runtime-config.ts → runtime/config.ts} +160 -46
- package/src/{runtime-discovery-apple.ts → runtime/discovery-apple.ts} +3 -3
- package/src/{runtime-discovery-providers.ts → runtime/discovery-providers.ts} +3 -9
- package/src/{runtime-discovery.ts → runtime/discovery.ts} +4 -4
- package/src/{runtime-hook-processes.ts → runtime/hook-processes.ts} +3 -2
- package/src/{runtime-hooks.ts → runtime/hooks.ts} +40 -28
- package/src/{runtime-paths.ts → runtime/paths.ts} +5 -19
- package/src/{runtime-query.ts → runtime/query.ts} +5 -5
- package/src/{runtime-seeds.ts → runtime/seeds.ts} +3 -3
- package/src/runtime/shared-cache.ts +130 -0
- package/src/{runtime-state.ts → runtime/state.ts} +28 -11
- package/src/runtime-process.ts +194 -0
- package/src/schema-types.ts +73 -161
- package/src/shell.ts +4 -0
- package/src/sqlite-lock.ts +25 -0
- package/src/transcript-retention.ts +146 -0
- package/src/value-guards.ts +22 -0
- package/docs/assets/sevro-logo.png +0 -0
- package/docs/assets/sevro-symbol.svg +0 -1
- package/docs/assets/sevro-wordmark.svg +0 -1
- package/docs/cache-ownership-validation.md +0 -49
- package/docs/claude-continuation-validation.md +0 -47
- package/docs/concurrency-validation.md +0 -86
- package/docs/configuration-root-validation.md +0 -70
- package/docs/engine-slice.md +0 -114
- package/docs/evidence/runtime-startup-30/README.md +0 -185
- package/docs/evidence/runtime-startup-30/after.json +0 -319
- package/docs/evidence/runtime-startup-30/baseline-timeout.jsonl +0 -2
- package/docs/evidence/runtime-startup-30/before.json +0 -403
- package/docs/evidence/runtime-startup-30/consumer-smoke.json +0 -63
- package/docs/evidence/runtime-startup-30/full-policy-diagnostic.jsonl +0 -3
- package/docs/evidence/runtime-startup-30/minimal-policy-diagnostic.jsonl +0 -3
- package/docs/evidence/runtime-startup-30/plugin-template-assessment.json +0 -20
- package/docs/evidence/runtime-startup-30/seedless-timeout.jsonl +0 -2
- package/docs/evidence.md +0 -17
- package/docs/fixture-cleanup-validation.md +0 -73
- package/docs/guide-verification.json +0 -239
- package/src/evaluation-context.ts +0 -259
- package/src/evaluation-fixture.ts +0 -302
- package/src/evaluation-run.ts +0 -200
- package/src/evaluation-trial.ts +0 -1016
- package/src/hosts/claude-nested-skills.ts +0 -272
- package/src/hosts/codex-command-output.ts +0 -510
- package/src/hosts/codex-executor-command.ts +0 -291
- package/src/hosts/codex-skill-reads.ts +0 -783
- /package/src/{trial-scheduler.ts → evaluation/scheduler.ts} +0 -0
package/CONTRIBUTING.md
CHANGED
|
@@ -26,8 +26,13 @@ by applicable law.
|
|
|
26
26
|
|
|
27
27
|
## Set up development
|
|
28
28
|
|
|
29
|
-
Use Bun 1.3.13, Git, Node 24, and
|
|
30
|
-
on macOS or `bubblewrap` and `socat` on Ubuntu.
|
|
29
|
+
Use Bun 1.3.13, Git, Node 24, npm, and ripgrep (`rg`). Full suite isolation uses `sandbox-exec`
|
|
30
|
+
on macOS or `bubblewrap` and `socat` on Ubuntu. The macOS synthetic libc regression
|
|
31
|
+
fixtures compile with `/usr/bin/cc`, supplied by Apple's Command Line Tools.
|
|
32
|
+
Windows acceptance is unverified. Bun remains the development runtime; installed
|
|
33
|
+
users may use Node without Bun. `bun run build` generates ignored `dist/`
|
|
34
|
+
JavaScript and source maps. `npm pack` builds automatically through `prepack`;
|
|
35
|
+
when packing with `--ignore-scripts`, build explicitly first.
|
|
31
36
|
From a fresh checkout:
|
|
32
37
|
|
|
33
38
|
```sh
|
|
@@ -36,8 +41,42 @@ bun run test:docs-examples
|
|
|
36
41
|
```
|
|
37
42
|
|
|
38
43
|
The second command checks the tutorial in fresh consumer/contributor directories.
|
|
44
|
+
Its complete recipe checks also require UV, Python 3, mise, and an existing
|
|
45
|
+
`mise install node@24.13.0` installation; see [recipe prerequisites](docs/recipes.md).
|
|
46
|
+
CI explicitly provisions these tools. Missing prerequisites fail with a named
|
|
47
|
+
setup instruction rather than skipping a recipe.
|
|
48
|
+
To run the documented JavaScript recipes from this source checkout, build first:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
bun run build
|
|
52
|
+
export SEVRO_RECIPES="$PWD/dist/examples/recipes"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Then follow the [recipe commands](docs/recipes.md#prepare-a-recipe-project).
|
|
39
56
|
Native model trials need their own [credentials and prerequisites](docs/native-hosts.md).
|
|
40
57
|
|
|
58
|
+
## Install a development archive
|
|
59
|
+
|
|
60
|
+
To try source changes in an installed package, prepare an archive from the
|
|
61
|
+
repository root with Bun:
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
bun install --frozen-lockfile
|
|
65
|
+
bun run build
|
|
66
|
+
npm pack --ignore-scripts
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The last command prints the archive filename. Transfer that file to the consumer
|
|
70
|
+
project and install it with Node and npm; Bun is not required there:
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
npm install --save-exact /absolute/path/to/candidate.tgz
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Continue with the [installed-package tutorial](docs/getting-started.md#from-an-installed-package).
|
|
77
|
+
This creates a development package; maintainers follow the separate
|
|
78
|
+
[release workflow](docs/releases.md) for publication.
|
|
79
|
+
|
|
41
80
|
## Quality contract and checks
|
|
42
81
|
|
|
43
82
|
[The TypeScript quality contract](docs/typescript-quality.md) defines the checked
|
|
@@ -54,8 +93,9 @@ documentation and guide dry-run checks, tutorial examples, the real Bun suite,
|
|
|
54
93
|
coverage integrity and thresholds, and installed-package validation. Statements
|
|
55
94
|
and branches must each reach at least 95% using raw exact counts over the
|
|
56
95
|
platform-reachable authored production inventory, including unimported files.
|
|
57
|
-
The macOS and Ubuntu
|
|
58
|
-
module and branch-outcome exclusions are recorded in coverage
|
|
96
|
+
The local-only macOS gate and Ubuntu CI gate each measure their reachable host
|
|
97
|
+
modules; the exact module and branch-outcome exclusions are recorded in coverage
|
|
98
|
+
artifacts. The five explicitly
|
|
59
99
|
inventoried generated AJV validators are excluded from coverage because this
|
|
60
100
|
target measures authored runner behavior; their syntax, schema freshness, typed
|
|
61
101
|
boundaries and runtime tests remain checked. Tests and fixtures remain linted and
|
|
@@ -66,6 +106,12 @@ Before committing, use `bun run check:typescript --fast` after installing the
|
|
|
66
106
|
locked dependencies. This runs inventory, schema, formatting, lint, typing and
|
|
67
107
|
documentation checks; it does not replace full acceptance. CI retains machine-readable coverage
|
|
68
108
|
reports under `.quality/` and exposes the stable `TypeScript quality` status.
|
|
109
|
+
The complete command's `static`, `docs`, `tests` and `package` phases run as
|
|
110
|
+
concurrent CI jobs. CI divides the tests among four duration-balanced jobs and
|
|
111
|
+
requires one combined coverage gate; every test and both 95% thresholds remain
|
|
112
|
+
required. Superseded runs for the same pull request are cancelled. After frozen installation, use
|
|
113
|
+
`bun run check:typescript --phase <name>` to run one phase locally; it does not
|
|
114
|
+
replace acceptance across all four. See the [phase inventory](docs/typescript-quality.md).
|
|
69
115
|
|
|
70
116
|
Run `bun run check:docs:external` separately and [triage network failures](docs/documentation-quality.md#external-links).
|
|
71
117
|
Guide changes also need [native evals](docs/guide-evaluation.md).
|
|
@@ -82,8 +128,8 @@ repairing in-scope failures; it does not authorize merging or unrelated changes.
|
|
|
82
128
|
non-root user, and isolation prerequisites. Reproducing that environment locally
|
|
83
129
|
with Docker is optional for diagnosis and is not a publication prerequisite.
|
|
84
130
|
- After the local pre-commit checks, publish the authorized candidate to its PR
|
|
85
|
-
and require
|
|
86
|
-
delivery as complete. A local run, fast check, targeted suite, or historical
|
|
131
|
+
and require all four canonical `check:typescript` phases to succeed in GitHub CI
|
|
132
|
+
before reporting delivery as complete. A local run, fast check, targeted suite, or historical
|
|
87
133
|
result does not establish that the current Ubuntu gate passes.
|
|
88
134
|
- Keep the quality bar intact. Repair behavior or add meaningful coverage for
|
|
89
135
|
accepted behavior; do not lower thresholds, exempt authored sources, skip tests,
|
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Sevro
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
|
-
<img src="docs/assets/sevro-logo.png" alt="Sevro logo: a black S-shaped track with red segments above the sevro wordmark" width="360">
|
|
4
|
+
<img src="https://raw.githubusercontent.com/BjRo/sevro/main/docs/assets/sevro-logo.png" alt="Sevro logo: a black S-shaped track with red segments above the sevro wordmark" width="360">
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
Sevro runs repeatable evaluations of coding agents. Give it a case, a host
|
|
@@ -19,11 +19,12 @@ Sevro is under active development. The npm package is `@bjoernrochel/sevro`;
|
|
|
19
19
|
its command is `sevro`. The [current release](docs/installing.md#current-release) includes runtime
|
|
20
20
|
configuration, native goals, selected plugin hooks, and the current licensing terms.
|
|
21
21
|
Earlier `rc.1` and `rc.2` packages retain their original BSL grants.
|
|
22
|
-
See [installation
|
|
22
|
+
See [installation](docs/installing.md).
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
Run the installed package with Node.js 24.13.0 or newer, or Bun 1.3.13.
|
|
25
|
+
Bun is not required for Node users. Native isolation uses macOS `sandbox-exec`
|
|
26
|
+
or Ubuntu `bubblewrap` and `socat`. Contributors keep Bun 1.3.13 for development,
|
|
27
|
+
builds and tests, plus Node 24.13.0 and npm for package acceptance.
|
|
27
28
|
Windows support is unverified. The basic example uses an injected
|
|
28
29
|
deterministic adapter and needs no native model credentials.
|
|
29
30
|
|
|
@@ -32,7 +33,7 @@ deterministic adapter and needs no native model credentials.
|
|
|
32
33
|
```sh
|
|
33
34
|
mkdir sevro-demo
|
|
34
35
|
cd sevro-demo
|
|
35
|
-
|
|
36
|
+
npm init -y
|
|
36
37
|
```
|
|
37
38
|
|
|
38
39
|
Install the [current release](docs/installing.md#current-release) in that directory.
|
|
@@ -40,6 +41,10 @@ Continue with [your first evaluation](docs/getting-started.md): the exact comman
|
|
|
40
41
|
expected `passed` result, and retained evidence. Read [installation](docs/installing.md)
|
|
41
42
|
for updates, removal, and source checkouts.
|
|
42
43
|
|
|
44
|
+
Then follow the [demo-to-iteration workflow](docs/evaluation-workflow.md):
|
|
45
|
+
initialize real assertions, prepare, execute, read progress and inspect the
|
|
46
|
+
latest result.
|
|
47
|
+
|
|
43
48
|
## Find your next task
|
|
44
49
|
|
|
45
50
|
The [documentation hub](docs/README.md) routes to running evaluations, authoring
|
|
@@ -50,7 +55,7 @@ Machine-readable contracts live in [schemas/](schemas/).
|
|
|
50
55
|
|
|
51
56
|
## Ask the repository guide
|
|
52
57
|
|
|
53
|
-
Open
|
|
58
|
+
Open the Sevro repository in a fresh Codex or Claude Code session and ask
|
|
54
59
|
“What is Sevro, and how do I run my first evaluation?” Explicit invocation is
|
|
55
60
|
`$sevro-guide` in Codex or `/sevro-guide` in Claude Code.
|
|
56
61
|
The guide reads sources, cites its answers, and handles follow-ups. It explains
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "basic-graded",
|
|
3
|
+
"prompt": "Return ready.",
|
|
4
|
+
"fixture": { "files": { "README.md": "fixture\n" } },
|
|
5
|
+
"checks": [
|
|
6
|
+
{
|
|
7
|
+
"id": "ready",
|
|
8
|
+
"grader": "sevro.regex",
|
|
9
|
+
"configuration": { "pattern": "^ready$" }
|
|
10
|
+
}
|
|
11
|
+
],
|
|
12
|
+
"requiredEvidence": []
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["host.ts"],"names":[],"mappings":"AAAA,eAAe;IACb,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,uBAAuB;IAC9B,MAAM,EAAE,MAAM;IACd,GAAG;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;CACF,CAAC","sourcesContent":["export default {\n id: \"sevro.host.example\",\n model: \"deterministic-example\",\n effort: \"none\",\n run() {\n return Promise.resolve({ finalMessage: \"ready\", complete: true });\n },\n};\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/** Trusted, deterministic participant for exercising the recipe's real graders. */
|
|
4
|
+
const host = {
|
|
5
|
+
id: "recipes.deterministic",
|
|
6
|
+
model: "fixture-editor",
|
|
7
|
+
effort: "none",
|
|
8
|
+
async run({ workspace }) {
|
|
9
|
+
const task = await readFile(join(workspace, "README.md"), "utf8");
|
|
10
|
+
const failing = process.env.SEVRO_RECIPE_FAIL === "1";
|
|
11
|
+
if (task.includes("Fix add")) {
|
|
12
|
+
await writeFile(join(workspace, "math.cjs"), `exports.add = (a, b) => a ${failing ? "-" : "+"} b;\n`);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
finalMessage: failing
|
|
16
|
+
? "Start with npm start on port 9000."
|
|
17
|
+
: "Run bun run dev on port 3000.",
|
|
18
|
+
complete: true,
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
export default host;
|
|
23
|
+
//# sourceMappingURL=candidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"candidate.js","sourceRoot":"","sources":["candidate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,yBAAyB;AACvD,OAAO,EAAE,IAAI,EAAE,kBAAkB;AAEjC,mFAAmF;AACnF,MAAM,IAAI,GAAG;IACX,EAAE,EAAE,uBAAuB;IAC3B,KAAK,EAAE,gBAAgB;IACvB,MAAM,EAAE,MAAM;IACd,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAyB;QAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG,CAAC;QACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,SAAS,CACb,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAC3B,6BAA6B,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CACxD,CAAC;QACJ,CAAC;QACD,OAAO;YACL,YAAY,EAAE,OAAO;gBACnB,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,+BAA+B;YACnC,QAAQ,EAAE,IAAI;SACf,CAAC;IACJ,CAAC;CACF,CAAC;AACF,eAAe,IAAI,CAAC","sourcesContent":["import { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Trusted, deterministic participant for exercising the recipe's real graders. */\nconst host = {\n id: \"recipes.deterministic\",\n model: \"fixture-editor\",\n effort: \"none\",\n async run({ workspace }: { workspace: string }) {\n const task = await readFile(join(workspace, \"README.md\"), \"utf8\");\n const failing = process.env.SEVRO_RECIPE_FAIL === \"1\";\n if (task.includes(\"Fix add\")) {\n await writeFile(\n join(workspace, \"math.cjs\"),\n `exports.add = (a, b) => a ${failing ? \"-\" : \"+\"} b;\\n`,\n );\n }\n return {\n finalMessage: failing\n ? \"Start with npm start on port 9000.\"\n : \"Run bun run dev on port 3000.\",\n complete: true,\n };\n },\n};\nexport default host;\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "recipe-coding-change",
|
|
3
|
+
"prompt": "Fix add in math.cjs so it adds its two numeric arguments. Do not modify README.md. Explain how to start the application.",
|
|
4
|
+
"fixture": {
|
|
5
|
+
"files": {
|
|
6
|
+
"README.md": "Fix add in math.cjs. Start the application with bun run dev on port 3000.\n",
|
|
7
|
+
"math.cjs": "exports.add = (a, b) => a - b;\n"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"checks": [
|
|
11
|
+
{
|
|
12
|
+
"id": "addition",
|
|
13
|
+
"grader": "sevro.shell",
|
|
14
|
+
"configuration": {
|
|
15
|
+
"run": "{{evaluator-test}}",
|
|
16
|
+
"expectExact": "coding checks passed"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"requiredEvidence": []
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "recipe-host-tools",
|
|
3
|
+
"prompt": "Read app.env with rg, then explain the application's start command and port.",
|
|
4
|
+
"fixture": {
|
|
5
|
+
"files": {
|
|
6
|
+
"README.md": "Start with bun run dev on port 3000.\n",
|
|
7
|
+
"app.env": "port=3000\n"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"checks": [
|
|
11
|
+
{
|
|
12
|
+
"id": "rg-access",
|
|
13
|
+
"grader": "sevro.shell",
|
|
14
|
+
"configuration": {
|
|
15
|
+
"run": "rg '^port=3000$' app.env",
|
|
16
|
+
"expectExact": "port=3000"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"requiredEvidence": []
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "recipe-mise",
|
|
3
|
+
"prompt": "Use node from PATH to read app.json, then explain the application's start command and port. The operator has resolved mise's existing node@24.13.0 installation; do not download anything.",
|
|
4
|
+
"fixture": {
|
|
5
|
+
"files": {
|
|
6
|
+
"README.md": "Start with bun run dev on port 3000.\n",
|
|
7
|
+
"app.json": "{\"port\":3000}\n"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"checks": [
|
|
11
|
+
{
|
|
12
|
+
"id": "mise-node-access",
|
|
13
|
+
"grader": "sevro.shell",
|
|
14
|
+
"configuration": {
|
|
15
|
+
"run": "node -e 'if (process.version !== \"v24.13.0\") process.exit(1); const a = require(\"./app.json\"); if (a.port !== 3000) process.exit(1); console.log(a.port)'",
|
|
16
|
+
"expectExact": "3000"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"requiredEvidence": []
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "recipe-node",
|
|
3
|
+
"prompt": "Read app.json with Node and explain the application's start command and port.",
|
|
4
|
+
"fixture": {
|
|
5
|
+
"files": {
|
|
6
|
+
"README.md": "Start with bun run dev on port 3000.\n",
|
|
7
|
+
"app.json": "{\"port\":3000}\n"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"checks": [
|
|
11
|
+
{
|
|
12
|
+
"id": "node-access",
|
|
13
|
+
"grader": "sevro.shell",
|
|
14
|
+
"configuration": {
|
|
15
|
+
"run": "node -e 'const a = require(\"./app.json\"); if (a.port !== 3000) process.exit(1); console.log(a.port)'",
|
|
16
|
+
"expectExact": "3000"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"requiredEvidence": []
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "recipe-python-uv",
|
|
3
|
+
"prompt": "Use uv run --offline --no-project --python \"$RECIPE_PYTHON\" python to read app.json, then explain the application's start command and port.",
|
|
4
|
+
"fixture": {
|
|
5
|
+
"files": {
|
|
6
|
+
"README.md": "Start with bun run dev on port 3000.\n",
|
|
7
|
+
"app.json": "{\"port\":3000}\n"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"checks": [
|
|
11
|
+
{
|
|
12
|
+
"id": "uv-python-access",
|
|
13
|
+
"grader": "sevro.shell",
|
|
14
|
+
"configuration": {
|
|
15
|
+
"run": "uv run --offline --no-project --python \"$RECIPE_PYTHON\" python -c 'import json; p=json.load(open(\"app.json\"))[\"port\"]; assert p == 3000; print(p)'",
|
|
16
|
+
"expectExact": "3000"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"requiredEvidence": []
|
|
21
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "recipe-semantic",
|
|
3
|
+
"prompt": "Read README.md and explain how to start the application, including its port.",
|
|
4
|
+
"fixture": {
|
|
5
|
+
"files": { "README.md": "Start with bun run dev on port 3000.\n" }
|
|
6
|
+
},
|
|
7
|
+
"checks": [
|
|
8
|
+
{
|
|
9
|
+
"id": "startup-meaning",
|
|
10
|
+
"grader": "sevro.semantic",
|
|
11
|
+
"configuration": {
|
|
12
|
+
"proposition": "The response tells the reader to run bun run dev and says that the application listens on port 3000."
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"requiredEvidence": []
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
function isAddition(value) {
|
|
5
|
+
return (typeof value === "object" &&
|
|
6
|
+
value !== null &&
|
|
7
|
+
"add" in value &&
|
|
8
|
+
typeof value.add === "function");
|
|
9
|
+
}
|
|
10
|
+
const candidate = await import(pathToFileURL(join(process.cwd(), "math.cjs")).href);
|
|
11
|
+
assert.ok(isAddition(candidate), "Candidate must export add");
|
|
12
|
+
assert.equal(candidate.add(2, 3), 5);
|
|
13
|
+
assert.equal(candidate.add(-2, 3), 1);
|
|
14
|
+
assert.equal(candidate.add(0, 0), 0);
|
|
15
|
+
console.log("coding checks passed");
|
|
16
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["check.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,2BAA2B;AACxC,OAAO,EAAE,IAAI,EAAE,kBAAkB;AACjC,OAAO,EAAE,aAAa,EAAE,iBAAiB;AAKzC,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,KAAK,IAAI,KAAK;QACd,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU,CAChC,CAAC;AACJ,CAAC;AACD,MAAM,SAAS,GAAY,MAAM,MAAM,CACrC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CACpD,CAAC;AACF,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,2BAA2B,CAAC,CAAC;AAC9D,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\ninterface Addition {\n add: (left: number, right: number) => number;\n}\nfunction isAddition(value: unknown): value is Addition {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"add\" in value &&\n typeof value.add === \"function\"\n );\n}\nconst candidate: unknown = await import(\n pathToFileURL(join(process.cwd(), \"math.cjs\")).href\n);\nassert.ok(isAddition(candidate), \"Candidate must export add\");\nassert.equal(candidate.add(2, 3), 5);\nassert.equal(candidate.add(-2, 3), 1);\nassert.equal(candidate.add(0, 0), 0);\nconsole.log(\"coding checks passed\");\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { accessSync, constants, statSync } from "node:fs";
|
|
2
|
+
import { delimiter, resolve } from "node:path";
|
|
3
|
+
export function which(name, path) {
|
|
4
|
+
for (const directory of executablePath(path).split(delimiter)) {
|
|
5
|
+
const candidate = resolve(directory, name);
|
|
6
|
+
try {
|
|
7
|
+
accessSync(candidate, constants.X_OK);
|
|
8
|
+
if (statSync(candidate).isFile())
|
|
9
|
+
return candidate;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
/* Continue searching the declared executable path. */
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
function executablePath(path) {
|
|
18
|
+
return path ?? process.env.PATH ?? "";
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=executable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executable.js","sourceRoot":"","sources":["executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB;AAC1D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB;AAE/C,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,IAAa;IAC/C,KAAK,MAAM,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,SAAS,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,IAAwB;IAC9C,OAAO,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC","sourcesContent":["import { accessSync, constants, statSync } from \"node:fs\";\nimport { delimiter, resolve } from \"node:path\";\n\nexport function which(name: string, path?: string): string | null {\n for (const directory of executablePath(path).split(delimiter)) {\n const candidate = resolve(directory, name);\n try {\n accessSync(candidate, constants.X_OK);\n if (statSync(candidate).isFile()) return candidate;\n } catch {\n /* Continue searching the declared executable path. */\n }\n }\n return null;\n}\n\nfunction executablePath(path: string | undefined): string {\n return path ?? process.env.PATH ?? \"\";\n}\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export function artifact(relativePath, content) {
|
|
5
|
+
return {
|
|
6
|
+
id: `recipes.${createHash("sha256").update(relativePath).digest("hex").slice(0, 16)}`,
|
|
7
|
+
relativePath,
|
|
8
|
+
sha256: createHash("sha256").update(content).digest("hex"),
|
|
9
|
+
contentBase64: Buffer.from(content).toString("base64"),
|
|
10
|
+
gitExclude: true,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export async function repositoryArtifacts(host) {
|
|
14
|
+
const directory = host === "claude" ? ".claude" : ".agents";
|
|
15
|
+
const relative = `${directory}/skills/startup-guide/SKILL.md`;
|
|
16
|
+
const body = await readFile(join(import.meta.dirname, "repository-skill", relative), "utf8");
|
|
17
|
+
return [artifact(relative, body)];
|
|
18
|
+
}
|
|
19
|
+
export function pluginArtifacts() {
|
|
20
|
+
const files = {
|
|
21
|
+
"marketplace/.claude-plugin/marketplace.json": JSON.stringify({
|
|
22
|
+
name: "recipes",
|
|
23
|
+
owner: { name: "Sevro examples" },
|
|
24
|
+
plugins: [
|
|
25
|
+
{ name: "startup", source: "./plugin", description: "Startup recipe" },
|
|
26
|
+
],
|
|
27
|
+
}),
|
|
28
|
+
"marketplace/plugin/.claude-plugin/plugin.json": JSON.stringify({
|
|
29
|
+
name: "startup",
|
|
30
|
+
version: "1.0.0",
|
|
31
|
+
}),
|
|
32
|
+
"marketplace/plugin/.codex-plugin/plugin.json": JSON.stringify({
|
|
33
|
+
name: "startup",
|
|
34
|
+
version: "1.0.0",
|
|
35
|
+
skills: "./skills/",
|
|
36
|
+
}),
|
|
37
|
+
"marketplace/plugin/skills/startup-guide/SKILL.md": "---\nname: startup-guide\ndescription: Explain application startup.\n---\nRead README.md. Explain its command and port.\n",
|
|
38
|
+
"marketplace/plugin/hooks/hooks.json": JSON.stringify({
|
|
39
|
+
hooks: {
|
|
40
|
+
SessionStart: [
|
|
41
|
+
{
|
|
42
|
+
hooks: [
|
|
43
|
+
{
|
|
44
|
+
type: "command",
|
|
45
|
+
command: '/bin/sh "${CLAUDE_PLUGIN_ROOT}/hooks/start.sh"',
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
}),
|
|
52
|
+
"marketplace/plugin/hooks/start.sh": "#!/bin/sh\nprintf 'hook ran\\n' > \"$PWD/hook-ran.txt\"\n",
|
|
53
|
+
};
|
|
54
|
+
return Object.entries(files).map(([path, content]) => artifact(path, content));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=extension-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-artifacts.js","sourceRoot":"","sources":["extension-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB;AACzC,OAAO,EAAE,QAAQ,EAAE,yBAAyB;AAC5C,OAAO,EAAE,IAAI,EAAE,kBAAkB;AAEjC,MAAM,UAAU,QAAQ,CAAC,YAAoB,EAAE,OAAe;IAC5D,OAAO;QACL,EAAE,EAAE,WAAW,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;QACrF,YAAY;QACZ,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1D,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACtD,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,SAAS,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,MAAM,QAAQ,GAAG,GAAG,SAAS,gCAAgC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,CAAC,EACvD,MAAM,CACP,CAAC;IACF,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG;QACZ,6CAA6C,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5D,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;YACjC,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE;aACvE;SACF,CAAC;QACF,+CAA+C,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9D,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO;SACjB,CAAC;QACF,8CAA8C,EAAE,IAAI,CAAC,SAAS,CAAC;YAC7D,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,WAAW;SACpB,CAAC;QACF,kDAAkD,EAChD,2HAA2H;QAC7H,qCAAqC,EAAE,IAAI,CAAC,SAAS,CAAC;YACpD,KAAK,EAAE;gBACL,YAAY,EAAE;oBACZ;wBACE,KAAK,EAAE;4BACL;gCACE,IAAI,EAAE,SAAS;gCACf,OAAO,EAAE,gDAAgD;6BAC1D;yBACF;qBACF;iBACF;aACF;SACF,CAAC;QACF,mCAAmC,EACjC,2DAA2D;KAC9D,CAAC;IACF,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CACnD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CACxB,CAAC;AACJ,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport function artifact(relativePath: string, content: string) {\n return {\n id: `recipes.${createHash(\"sha256\").update(relativePath).digest(\"hex\").slice(0, 16)}`,\n relativePath,\n sha256: createHash(\"sha256\").update(content).digest(\"hex\"),\n contentBase64: Buffer.from(content).toString(\"base64\"),\n gitExclude: true,\n };\n}\n\nexport async function repositoryArtifacts(host: string) {\n const directory = host === \"claude\" ? \".claude\" : \".agents\";\n const relative = `${directory}/skills/startup-guide/SKILL.md`;\n const body = await readFile(\n join(import.meta.dirname, \"repository-skill\", relative),\n \"utf8\",\n );\n return [artifact(relative, body)];\n}\n\nexport function pluginArtifacts() {\n const files = {\n \"marketplace/.claude-plugin/marketplace.json\": JSON.stringify({\n name: \"recipes\",\n owner: { name: \"Sevro examples\" },\n plugins: [\n { name: \"startup\", source: \"./plugin\", description: \"Startup recipe\" },\n ],\n }),\n \"marketplace/plugin/.claude-plugin/plugin.json\": JSON.stringify({\n name: \"startup\",\n version: \"1.0.0\",\n }),\n \"marketplace/plugin/.codex-plugin/plugin.json\": JSON.stringify({\n name: \"startup\",\n version: \"1.0.0\",\n skills: \"./skills/\",\n }),\n \"marketplace/plugin/skills/startup-guide/SKILL.md\":\n \"---\\nname: startup-guide\\ndescription: Explain application startup.\\n---\\nRead README.md. Explain its command and port.\\n\",\n \"marketplace/plugin/hooks/hooks.json\": JSON.stringify({\n hooks: {\n SessionStart: [\n {\n hooks: [\n {\n type: \"command\",\n command: '/bin/sh \"${CLAUDE_PLUGIN_ROOT}/hooks/start.sh\"',\n },\n ],\n },\n ],\n },\n }),\n \"marketplace/plugin/hooks/start.sh\":\n \"#!/bin/sh\\nprintf 'hook ran\\\\n' > \\\"$PWD/hook-ran.txt\\\"\\n\",\n };\n return Object.entries(files).map(([path, content]) =>\n artifact(path, content),\n );\n}\n"]}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { artifact, pluginArtifacts, repositoryArtifacts, } from "./extension-artifacts.js";
|
|
2
|
+
export function record(value) {
|
|
3
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
4
|
+
throw new Error("Expected a JSON object");
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
export function describe(mode, host) {
|
|
8
|
+
const capabilities = {
|
|
9
|
+
lifecycle: [],
|
|
10
|
+
"repository-skill": [`sevro.${host}.repository-invocation`],
|
|
11
|
+
plugins: host === "codex"
|
|
12
|
+
? ["sevro.codex.plugin-marketplace", "sevro.codex.explicit-invocation"]
|
|
13
|
+
: ["sevro.claude.plugin-dirs", "sevro.claude.explicit-invocation"],
|
|
14
|
+
};
|
|
15
|
+
const requiredCapabilities = capabilities[mode];
|
|
16
|
+
if (!requiredCapabilities)
|
|
17
|
+
throw new Error("Unknown extension recipe");
|
|
18
|
+
return {
|
|
19
|
+
extension: { id: "recipes.startup", version: "1.0.0" },
|
|
20
|
+
protocols: ["sevro.extension.v1"],
|
|
21
|
+
requiredCapabilities,
|
|
22
|
+
optionalCapabilities: [],
|
|
23
|
+
graders: ["recipes.startup"],
|
|
24
|
+
taskVerdictPolicies: [],
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function requiredInvocation(mode, host) {
|
|
28
|
+
if (mode !== "repository-skill")
|
|
29
|
+
return [];
|
|
30
|
+
return [
|
|
31
|
+
host === "codex"
|
|
32
|
+
? "sevro.codex.explicit-invocation"
|
|
33
|
+
: "sevro.claude.repository-invocation",
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
export function resolveCase(mode, host, fail) {
|
|
37
|
+
const invocation = mode === "lifecycle" ? "" : "{{sevro.skill_invocation}} ";
|
|
38
|
+
const prompt = fail
|
|
39
|
+
? "Deliberate negative control: return only wrong."
|
|
40
|
+
: "Read README.md. Explain the application's start command and port. Do not change files.";
|
|
41
|
+
const requiredEvidence = requiredInvocation(mode, host);
|
|
42
|
+
return {
|
|
43
|
+
cases: [
|
|
44
|
+
{
|
|
45
|
+
id: "recipe-extension",
|
|
46
|
+
prompt: invocation + prompt,
|
|
47
|
+
fixture: {
|
|
48
|
+
kind: "generated",
|
|
49
|
+
commits: [
|
|
50
|
+
{
|
|
51
|
+
message: "chore: initialize sample",
|
|
52
|
+
files: { "README.md": "Run bun run dev on port 3000.\n" },
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
checks: [
|
|
57
|
+
{
|
|
58
|
+
id: "startup-command",
|
|
59
|
+
grader: "sevro.regex",
|
|
60
|
+
configuration: { pattern: "bun run dev" },
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "prepared-input",
|
|
64
|
+
grader: "sevro.shell",
|
|
65
|
+
configuration: {
|
|
66
|
+
run: "test \"$(cat startup.txt)\" = 'prepared startup data'",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
...(mode === "plugins"
|
|
70
|
+
? [
|
|
71
|
+
{
|
|
72
|
+
id: "plugin-hook",
|
|
73
|
+
grader: "sevro.shell",
|
|
74
|
+
configuration: {
|
|
75
|
+
run: "cat hook-ran.txt",
|
|
76
|
+
expectExact: "hook ran",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
]
|
|
80
|
+
: []),
|
|
81
|
+
{
|
|
82
|
+
id: "recipes.startup.answer",
|
|
83
|
+
grader: "recipes.startup",
|
|
84
|
+
configuration: {},
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
requiredEvidence,
|
|
88
|
+
extensionData: { "recipes.startup": { mode, host } },
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export async function prepare(mode, host) {
|
|
94
|
+
const base = {
|
|
95
|
+
artifacts: [artifact("startup.txt", "prepared startup data\n")],
|
|
96
|
+
requestedInstrumentation: [],
|
|
97
|
+
extensionData: { "recipes.startup": { mode, host } },
|
|
98
|
+
};
|
|
99
|
+
switch (mode) {
|
|
100
|
+
case "repository-skill":
|
|
101
|
+
return {
|
|
102
|
+
...base,
|
|
103
|
+
artifacts: [...base.artifacts, ...(await repositoryArtifacts(host))],
|
|
104
|
+
...(host === "codex"
|
|
105
|
+
? { codexRepositorySkillInvocation: { skillName: "startup-guide" } }
|
|
106
|
+
: {
|
|
107
|
+
claudeRepositorySkillInvocation: { skillName: "startup-guide" },
|
|
108
|
+
}),
|
|
109
|
+
};
|
|
110
|
+
case "plugins":
|
|
111
|
+
return {
|
|
112
|
+
...base,
|
|
113
|
+
artifacts: [...base.artifacts, ...pluginArtifacts()],
|
|
114
|
+
...(host === "codex"
|
|
115
|
+
? {
|
|
116
|
+
codexMarketplace: {
|
|
117
|
+
artifactRoot: "marketplace",
|
|
118
|
+
marketplaceName: "recipes",
|
|
119
|
+
pluginNames: ["startup"],
|
|
120
|
+
},
|
|
121
|
+
codexSkillInvocation: {
|
|
122
|
+
pluginName: "startup",
|
|
123
|
+
skillName: "startup-guide",
|
|
124
|
+
},
|
|
125
|
+
}
|
|
126
|
+
: {
|
|
127
|
+
claudePluginDirs: { artifactRoots: ["marketplace/plugin"] },
|
|
128
|
+
claudeSkillInvocation: {
|
|
129
|
+
pluginName: "startup",
|
|
130
|
+
skillName: "startup-guide",
|
|
131
|
+
},
|
|
132
|
+
}),
|
|
133
|
+
};
|
|
134
|
+
default:
|
|
135
|
+
return base;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function answerStatus(observation) {
|
|
139
|
+
if (observation.completeness !== "complete")
|
|
140
|
+
return "unavailable";
|
|
141
|
+
const text = record(observation.data).text;
|
|
142
|
+
return typeof text === "string" && /\b3000\b/.test(text)
|
|
143
|
+
? "passed"
|
|
144
|
+
: "failed";
|
|
145
|
+
}
|
|
146
|
+
export function evaluate(params) {
|
|
147
|
+
if (!Array.isArray(params.observations))
|
|
148
|
+
throw new Error("Missing observations");
|
|
149
|
+
const observations = params.observations;
|
|
150
|
+
const observation = observations
|
|
151
|
+
.map(record)
|
|
152
|
+
.find((item) => item.id === "sevro.observation.final-message");
|
|
153
|
+
if (!observation)
|
|
154
|
+
throw new Error("Missing final-message observation");
|
|
155
|
+
const status = answerStatus(observation);
|
|
156
|
+
return {
|
|
157
|
+
checks: [
|
|
158
|
+
{
|
|
159
|
+
id: "recipes.startup.answer",
|
|
160
|
+
status,
|
|
161
|
+
evidenceRefs: ["sevro.observation.final-message"],
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
metrics: [],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=extension-methods.js.map
|