@jtf19/vibecoding-kit 0.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/AGENTS.md +84 -0
- package/CHANGELOG.md +28 -0
- package/CLAUDE.md +137 -0
- package/CODE_OF_CONDUCT.md +30 -0
- package/CONTRIBUTING.md +69 -0
- package/LICENSE +67 -0
- package/README.md +162 -0
- package/SECURITY.md +34 -0
- package/adapters/claude/install.md +70 -0
- package/adapters/claude/plugin.json +38 -0
- package/adapters/claude/settings.example.json +15 -0
- package/adapters/codex/hooks.example.json +15 -0
- package/adapters/codex/install.md +72 -0
- package/adapters/codex/plugin.json +58 -0
- package/adapters/cursor/hooks.example.json +17 -0
- package/adapters/cursor/install.md +72 -0
- package/adapters/cursor/plugin.json +42 -0
- package/adapters/opencode/install.md +95 -0
- package/adapters/opencode/plugin.js +56 -0
- package/adapters/opencode/plugin.json +58 -0
- package/adapters/pi/extension.ts +56 -0
- package/adapters/pi/install.md +95 -0
- package/adapters/pi/plugin.json +58 -0
- package/bin/vibe-cli-usage.mjs +43 -0
- package/bin/vibe.mjs +120 -0
- package/docs/acceptance-checklist.md +1226 -0
- package/docs/architecture-debt-burndown.md +537 -0
- package/docs/architecture.md +77 -0
- package/docs/ci-evidence-onboarding.md +143 -0
- package/docs/development.md +71 -0
- package/docs/evidence-authoring.md +188 -0
- package/docs/golden-path.md +179 -0
- package/docs/install-acceptance-checklist.md +90 -0
- package/docs/install-claude.md +41 -0
- package/docs/install-codex.md +41 -0
- package/docs/install-cursor.md +41 -0
- package/docs/install-experience-roadmap.md +394 -0
- package/docs/install.md +119 -0
- package/docs/maintainer-guide.md +197 -0
- package/docs/phase-1-implementation.md +848 -0
- package/docs/phase-2-roadmap.md +142 -0
- package/docs/quick-recipes.md +115 -0
- package/docs/readiness-interpretation.md +105 -0
- package/docs/readiness-troubleshooting.md +209 -0
- package/docs/release-check-reference.md +63 -0
- package/docs/release-guide.md +481 -0
- package/docs/release-notes.md +75 -0
- package/docs/runtime-contract.md +1010 -0
- package/docs/runtime-maintainer-validation.md +212 -0
- package/docs/runtime-roadmap.md +2265 -0
- package/docs/skill-authoring-guide.md +150 -0
- package/docs/submodule-guide.md +131 -0
- package/docs/team-adoption.md +113 -0
- package/docs/user-guide.md +108 -0
- package/docs/vibecoding-fork-analysis.md +398 -0
- package/docs/workflow-chaining.md +539 -0
- package/examples/ci/README.md +61 -0
- package/examples/ci/ci-evidence-input.example.json +56 -0
- package/examples/ci/generate-diff-coverage.mjs +90 -0
- package/examples/ci/generate-test-evidence.mjs +82 -0
- package/examples/ci/github-actions-readiness.yml +108 -0
- package/examples/claude-project/README.md +57 -0
- package/examples/codex-project/README.md +57 -0
- package/examples/cursor-project/README.md +57 -0
- package/examples/full-chain/README.md +63 -0
- package/examples/full-chain/architecture-design.md +128 -0
- package/examples/full-chain/commit-readiness.json +31 -0
- package/examples/full-chain/delivery-traceability.yaml +32 -0
- package/examples/full-chain/diff-coverage.json +73 -0
- package/examples/full-chain/evidence.json +20 -0
- package/examples/full-chain/implementation-plan.md +54 -0
- package/examples/full-chain/product-acceptance.md +86 -0
- package/examples/full-chain/product-discovery.md +84 -0
- package/examples/full-chain/product-spec.md +88 -0
- package/examples/full-chain/scenario-acceptance.yaml +32 -0
- package/examples/full-chain/test-evidence.json +29 -0
- package/examples/full-chain/ui-design-contract.md +87 -0
- package/examples/golden-path/README.md +84 -0
- package/examples/golden-path/diff-coverage.json +66 -0
- package/examples/golden-path/implementation-plan.md +62 -0
- package/examples/golden-path/product-spec.md +96 -0
- package/examples/golden-path/test-evidence.json +29 -0
- package/examples/runtime-fixtures/architecture-design.md +128 -0
- package/examples/runtime-fixtures/commit-readiness.json +31 -0
- package/examples/runtime-fixtures/delivery-traceability.yaml +32 -0
- package/examples/runtime-fixtures/diff-coverage.json +73 -0
- package/examples/runtime-fixtures/evidence.json +20 -0
- package/examples/runtime-fixtures/implementation-plan.md +54 -0
- package/examples/runtime-fixtures/negative/commit-readiness-boundary-escalated.json +27 -0
- package/examples/runtime-fixtures/negative/delivery-traceability-bad-ref.yaml +32 -0
- package/examples/runtime-fixtures/negative/diff-coverage-changed-file-without-task-ref.json +40 -0
- package/examples/runtime-fixtures/negative/diff-coverage-operation-mismatch.json +38 -0
- package/examples/runtime-fixtures/negative/diff-coverage-required-task-missing.json +24 -0
- package/examples/runtime-fixtures/negative/diff-coverage-unexpected-file.json +20 -0
- package/examples/runtime-fixtures/negative/test-evidence-missing-output-digest.json +23 -0
- package/examples/runtime-fixtures/negative/test-evidence-risky-task-missing.json +29 -0
- package/examples/runtime-fixtures/product-acceptance.md +86 -0
- package/examples/runtime-fixtures/product-discovery.md +84 -0
- package/examples/runtime-fixtures/product-spec.md +88 -0
- package/examples/runtime-fixtures/scenario-acceptance.yaml +32 -0
- package/examples/runtime-fixtures/test-evidence.json +29 -0
- package/examples/runtime-fixtures/ui-design-contract.md +87 -0
- package/hooks/post-tool-compact/README.md +47 -0
- package/hooks/session-start/README.md +112 -0
- package/hooks/session-start/session-start-state-boundary-contract.mjs +161 -0
- package/hooks/session-start/session-start.md +29 -0
- package/hooks/session-start/session-start.mjs +49 -0
- package/hooks/workflow-handoff/README.md +44 -0
- package/hooks/workflow-handoff/workflow-handoff.md +11 -0
- package/package.json +72 -0
- package/skills/using-vibecoding/SKILL.md +396 -0
- package/skills/vibe-brainstorming/SKILL.md +98 -0
- package/skills/vibe-context-compact/SKILL.md +95 -0
- package/skills/vibe-debugging/SKILL.md +87 -0
- package/skills/vibe-dispatching-parallel-work/SKILL.md +144 -0
- package/skills/vibe-executing-plans/SKILL.md +114 -0
- package/skills/vibe-finishing-a-development-branch/SKILL.md +110 -0
- package/skills/vibe-implementation/SKILL.md +84 -0
- package/skills/vibe-planning/SKILL.md +102 -0
- package/skills/vibe-product-acceptance/SKILL.md +106 -0
- package/skills/vibe-product-discovery/SKILL.md +107 -0
- package/skills/vibe-product-spec/SKILL.md +105 -0
- package/skills/vibe-receiving-code-review/SKILL.md +110 -0
- package/skills/vibe-requesting-code-review/SKILL.md +106 -0
- package/skills/vibe-review/SKILL.md +106 -0
- package/skills/vibe-subagent-driven-development/SKILL.md +198 -0
- package/skills/vibe-systematic-debugging/SKILL.md +106 -0
- package/skills/vibe-test-driven-development/SKILL.md +112 -0
- package/skills/vibe-ui-design/SKILL.md +107 -0
- package/skills/vibe-verification/SKILL.md +84 -0
- package/skills/vibe-verification-before-completion/SKILL.md +170 -0
- package/skills/vibe-workspace-isolation/SKILL.md +158 -0
- package/skills/vibe-writing-plans/SKILL.md +137 -0
- package/skills/vibe-writing-skills/SKILL.md +118 -0
- package/templates/AGENTS.md +88 -0
- package/templates/CLAUDE.md +88 -0
- package/templates/VIBE-CODING.md +157 -0
- package/templates/architecture-design.md +139 -0
- package/templates/delivery-traceability.yaml +52 -0
- package/templates/evidence/README.md +117 -0
- package/templates/evidence/diff-coverage.json +34 -0
- package/templates/evidence/test-evidence.json +29 -0
- package/templates/implementation-plan.md +73 -0
- package/templates/product-acceptance.md +84 -0
- package/templates/product-discovery.md +81 -0
- package/templates/product-spec.md +84 -0
- package/templates/scenario-acceptance.yaml +37 -0
- package/templates/ui-design-contract.md +86 -0
- package/tools/vibe-architecture-check/README.md +66 -0
- package/tools/vibe-architecture-check/index.mjs +691 -0
- package/tools/vibe-compact/README.md +65 -0
- package/tools/vibe-compact/compact-contract.mjs +63 -0
- package/tools/vibe-compact/index.mjs +111 -0
- package/tools/vibe-doctor/README.md +200 -0
- package/tools/vibe-doctor/index.mjs +1721 -0
- package/tools/vibe-init/README.md +231 -0
- package/tools/vibe-init/index.mjs +369 -0
- package/tools/vibe-init/init-cli-args.mjs +100 -0
- package/tools/vibe-init/init-entry-merge-model.mjs +33 -0
- package/tools/vibe-init/init-install-manifest-model.mjs +137 -0
- package/tools/vibe-init/init-installed-agent-experience-contract.mjs +172 -0
- package/tools/vibe-init/init-platform-model.mjs +11 -0
- package/tools/vibe-init/init-presentation.mjs +149 -0
- package/tools/vibe-lifecycle/README.md +37 -0
- package/tools/vibe-lifecycle/index.mjs +365 -0
- package/tools/vibe-lifecycle/lifecycle-cli-args.mjs +104 -0
- package/tools/vibe-lifecycle/lifecycle-summary-model.mjs +67 -0
- package/tools/vibe-lifecycle/lifecycle-uninstall-plan-model.mjs +11 -0
- package/tools/vibe-plugin-pack/README.md +105 -0
- package/tools/vibe-plugin-pack/index.mjs +302 -0
- package/tools/vibe-plugin-pack/plugin-pack-cli.mjs +39 -0
- package/tools/vibe-plugin-pack/plugin-pack-manifest.mjs +37 -0
- package/tools/vibe-profile/index.mjs +212 -0
- package/tools/vibe-release-check/README.md +123 -0
- package/tools/vibe-release-check/command-manifest/release-check-base-commands.mjs +23 -0
- package/tools/vibe-release-check/command-manifest/release-check-closeout-commands.mjs +16 -0
- package/tools/vibe-release-check/command-manifest/release-check-command-metadata.mjs +32 -0
- package/tools/vibe-release-check/command-manifest/release-check-completion-commands.mjs +41 -0
- package/tools/vibe-release-check/command-manifest/release-check-full-chain-commands.mjs +12 -0
- package/tools/vibe-release-check/command-manifest/release-check-golden-path-commands.mjs +12 -0
- package/tools/vibe-release-check/command-manifest/release-check-install-commands.mjs +26 -0
- package/tools/vibe-release-check/command-manifest/release-check-learning-smoke-commands.mjs +21 -0
- package/tools/vibe-release-check/command-manifest/release-check-methodology-commands.mjs +27 -0
- package/tools/vibe-release-check/command-manifest/release-check-runtime-smoke-commands.mjs +116 -0
- package/tools/vibe-release-check/command-manifest/release-check-token-smoke-commands.mjs +21 -0
- package/tools/vibe-release-check/index.mjs +223 -0
- package/tools/vibe-release-check/release-check-behavior-smoke.mjs +177 -0
- package/tools/vibe-release-check/release-check-cli.mjs +37 -0
- package/tools/vibe-release-check/release-check-command-manifest.mjs +49 -0
- package/tools/vibe-release-check/release-check-completion-fixtures.mjs +151 -0
- package/tools/vibe-release-check/release-check-completion-suite.mjs +110 -0
- package/tools/vibe-release-check/release-check-dispatch.mjs +116 -0
- package/tools/vibe-release-check/release-check-full-chain-suite.mjs +55 -0
- package/tools/vibe-release-check/release-check-golden-path-suite.mjs +85 -0
- package/tools/vibe-release-check/release-check-install-marker-specs.mjs +133 -0
- package/tools/vibe-release-check/release-check-install-suite.mjs +112 -0
- package/tools/vibe-release-check/release-check-json-assertion-helpers.mjs +157 -0
- package/tools/vibe-release-check/release-check-json-markers.mjs +33 -0
- package/tools/vibe-release-check/release-check-learning-fixture-specs.mjs +199 -0
- package/tools/vibe-release-check/release-check-learning-suite.mjs +249 -0
- package/tools/vibe-release-check/release-check-live-behavior-smoke-fixture.mjs +406 -0
- package/tools/vibe-release-check/release-check-methodology-suite.mjs +108 -0
- package/tools/vibe-release-check/release-check-package-boundary-smoke.mjs +111 -0
- package/tools/vibe-release-check/release-check-platform-transcript-smoke-fixture.mjs +150 -0
- package/tools/vibe-release-check/release-check-readonly-marker-data.mjs +1 -0
- package/tools/vibe-release-check/release-check-readonly-marker-smoke-specs.mjs +170 -0
- package/tools/vibe-release-check/release-check-run-summary.mjs +67 -0
- package/tools/vibe-release-check/release-check-runtime-automation-fixtures.mjs +1 -0
- package/tools/vibe-release-check/release-check-runtime-automation-governance-reply-trace-smoke-helpers.mjs +224 -0
- package/tools/vibe-release-check/release-check-runtime-automation-governance-smoke-specs.mjs +215 -0
- package/tools/vibe-release-check/release-check-runtime-automation-governance-suite.mjs +5 -0
- package/tools/vibe-release-check/release-check-runtime-automation-methodology-smoke-specs.mjs +157 -0
- package/tools/vibe-release-check/release-check-runtime-automation-methodology-suite.mjs +130 -0
- package/tools/vibe-release-check/release-check-runtime-automation-platform-smoke-helpers.mjs +306 -0
- package/tools/vibe-release-check/release-check-runtime-automation-platform-suite.mjs +30 -0
- package/tools/vibe-release-check/release-check-runtime-automation-smoke-fixtures.mjs +53 -0
- package/tools/vibe-release-check/release-check-runtime-automation-source-candidate-smoke-helpers.mjs +506 -0
- package/tools/vibe-release-check/release-check-runtime-automation-source-suite.mjs +5 -0
- package/tools/vibe-release-check/release-check-runtime-automation-subagents-lifecycle-smoke-helpers.mjs +305 -0
- package/tools/vibe-release-check/release-check-runtime-automation-subagents-suite.mjs +25 -0
- package/tools/vibe-release-check/release-check-runtime-automation-suite.mjs +25 -0
- package/tools/vibe-release-check/release-check-runtime-daemon-bounded-run-smoke-helpers.mjs +243 -0
- package/tools/vibe-release-check/release-check-runtime-daemon-suite.mjs +5 -0
- package/tools/vibe-release-check/release-check-runtime-dispatch-fixtures.mjs +129 -0
- package/tools/vibe-release-check/release-check-runtime-dispatch-suite.mjs +5 -0
- package/tools/vibe-release-check/release-check-runtime-execution-approval-smoke-helpers.mjs +274 -0
- package/tools/vibe-release-check/release-check-runtime-execution-approval-suite.mjs +5 -0
- package/tools/vibe-release-check/release-check-runtime-execution-base-suite.mjs +388 -0
- package/tools/vibe-release-check/release-check-runtime-execution-recovery-suite.mjs +412 -0
- package/tools/vibe-release-check/release-check-runtime-execution-scheduler-suite.mjs +261 -0
- package/tools/vibe-release-check/release-check-runtime-execution-suite.mjs +11 -0
- package/tools/vibe-release-check/release-check-runtime-flow-smoke.mjs +347 -0
- package/tools/vibe-release-check/release-check-runtime-handoff-fixture-specs.mjs +211 -0
- package/tools/vibe-release-check/release-check-runtime-handoff-fixtures.mjs +11 -0
- package/tools/vibe-release-check/release-check-runtime-handoff-smoke-specs.mjs +86 -0
- package/tools/vibe-release-check/release-check-runtime-handoff-suite.mjs +316 -0
- package/tools/vibe-release-check/release-check-runtime-ledger-fixture-specs.mjs +9 -0
- package/tools/vibe-release-check/release-check-runtime-ledger-fixtures.mjs +51 -0
- package/tools/vibe-release-check/release-check-runtime-ledger-suite.mjs +24 -0
- package/tools/vibe-release-check/release-check-runtime-scheduler-fixture-specs.mjs +129 -0
- package/tools/vibe-release-check/release-check-runtime-scheduler-fixtures.mjs +10 -0
- package/tools/vibe-release-check/release-check-runtime-sdd-suite.mjs +535 -0
- package/tools/vibe-release-check/release-check-runtime-smoke-harness.mjs +140 -0
- package/tools/vibe-release-check/release-check-runtime-surface-expectations.mjs +106 -0
- package/tools/vibe-release-check/release-check-runtime-surface-smoke.mjs +112 -0
- package/tools/vibe-release-check/release-check-runtime-task-artifact-suite.mjs +105 -0
- package/tools/vibe-release-check/release-check-runtime-task-fixture-specs.mjs +270 -0
- package/tools/vibe-release-check/release-check-runtime-task-fixtures.mjs +19 -0
- package/tools/vibe-release-check/release-check-runtime.mjs +53 -0
- package/tools/vibe-release-check/release-check-stage103-118-fixtures.mjs +214 -0
- package/tools/vibe-release-check/release-check-stage103-118-smoke-specs.mjs +97 -0
- package/tools/vibe-release-check/release-check-stage103-118-smoke.mjs +861 -0
- package/tools/vibe-release-check/release-check-stage11-smoke.mjs +66 -0
- package/tools/vibe-release-check/release-check-stage119-120-fixture-specs.mjs +119 -0
- package/tools/vibe-release-check/release-check-stage119-120-smoke.mjs +325 -0
- package/tools/vibe-release-check/release-check-stage12-smoke.mjs +59 -0
- package/tools/vibe-release-check/release-check-stage121-136-fixture-specs.mjs +26 -0
- package/tools/vibe-release-check/release-check-stage121-136-fixtures.mjs +591 -0
- package/tools/vibe-release-check/release-check-stage121-136-smoke.mjs +917 -0
- package/tools/vibe-release-check/release-check-stage13-smoke.mjs +78 -0
- package/tools/vibe-release-check/release-check-stage137-140-smoke.mjs +534 -0
- package/tools/vibe-release-check/release-check-stage14-smoke.mjs +101 -0
- package/tools/vibe-release-check/release-check-stage141-148-smoke.mjs +1143 -0
- package/tools/vibe-release-check/release-check-stage15-smoke.mjs +132 -0
- package/tools/vibe-release-check/release-check-stage50-53-smoke.mjs +429 -0
- package/tools/vibe-release-check/release-check-subagent-adapter-bridge-smoke.mjs +162 -0
- package/tools/vibe-release-check/release-check-suite-plan-smoke.mjs +86 -0
- package/tools/vibe-release-check/release-check-suites.mjs +164 -0
- package/tools/vibe-release-check/release-check-test-run-smoke.mjs +59 -0
- package/tools/vibe-release-check/release-check-timing.mjs +98 -0
- package/tools/vibe-release-check/release-check-token-suite.mjs +260 -0
- package/tools/vibe-release-check/release-check-workflow-entry-suite.mjs +195 -0
- package/tools/vibe-release-check/release-check-workflow-governance-fixtures.mjs +138 -0
- package/tools/vibe-release-check/release-check-workflow-governance-smoke-suite.mjs +768 -0
- package/tools/vibe-release-check/release-check-workflow-ux-smoke.mjs +456 -0
- package/tools/vibe-runtime/README.md +2637 -0
- package/tools/vibe-runtime/index.mjs +3117 -0
- package/tools/vibe-runtime/runtime-adapter-bootstrap-matrix.mjs +264 -0
- package/tools/vibe-runtime/runtime-adapter-entry-acceptance.mjs +310 -0
- package/tools/vibe-runtime/runtime-adapter-packaging-consistency-command.mjs +131 -0
- package/tools/vibe-runtime/runtime-adapter-packaging-consistency.mjs +253 -0
- package/tools/vibe-runtime/runtime-advice-hub-model.mjs +175 -0
- package/tools/vibe-runtime/runtime-agent-session-start-contract.mjs +138 -0
- package/tools/vibe-runtime/runtime-artifact-ref-validation.mjs +281 -0
- package/tools/vibe-runtime/runtime-automatic-verification-gate-contract.mjs +134 -0
- package/tools/vibe-runtime/runtime-automation-boundary-text.mjs +7 -0
- package/tools/vibe-runtime/runtime-automation-command.mjs +367 -0
- package/tools/vibe-runtime/runtime-automation-plan-model.mjs +239 -0
- package/tools/vibe-runtime/runtime-automation-policy-model.mjs +175 -0
- package/tools/vibe-runtime/runtime-automation-readiness.mjs +347 -0
- package/tools/vibe-runtime/runtime-autopilot-lab-profile-contract.mjs +223 -0
- package/tools/vibe-runtime/runtime-behavioral-evaluation-contract.mjs +529 -0
- package/tools/vibe-runtime/runtime-behavioral-negative-gate-matrix.mjs +274 -0
- package/tools/vibe-runtime/runtime-bounded-attempt-policy-model.mjs +13 -0
- package/tools/vibe-runtime/runtime-bounded-foreground-command-executor-contract.mjs +288 -0
- package/tools/vibe-runtime/runtime-capability-registry.mjs +250 -0
- package/tools/vibe-runtime/runtime-cli-args.mjs +550 -0
- package/tools/vibe-runtime/runtime-cli-command-specs.mjs +63 -0
- package/tools/vibe-runtime/runtime-cli-dispatch.mjs +21 -0
- package/tools/vibe-runtime/runtime-cli-evidence-option-specs.mjs +193 -0
- package/tools/vibe-runtime/runtime-cli-evidence-options.mjs +28 -0
- package/tools/vibe-runtime/runtime-cli-from-options.mjs +222 -0
- package/tools/vibe-runtime/runtime-cli-low-risk-option-specs.mjs +128 -0
- package/tools/vibe-runtime/runtime-cli-main.mjs +32 -0
- package/tools/vibe-runtime/runtime-cli-option-default-families.mjs +454 -0
- package/tools/vibe-runtime/runtime-cli-option-defaults.mjs +33 -0
- package/tools/vibe-runtime/runtime-cli-option-handlers.mjs +82 -0
- package/tools/vibe-runtime/runtime-cli-usage.mjs +316 -0
- package/tools/vibe-runtime/runtime-cli-value-options.mjs +74 -0
- package/tools/vibe-runtime/runtime-close-loop-dashboard.mjs +283 -0
- package/tools/vibe-runtime/runtime-closeout-parity-contract.mjs +214 -0
- package/tools/vibe-runtime/runtime-command-container.mjs +26 -0
- package/tools/vibe-runtime/runtime-command-surface-registry.mjs +383 -0
- package/tools/vibe-runtime/runtime-command-wrapper-deps.mjs +13 -0
- package/tools/vibe-runtime/runtime-commit-readiness-envelope.mjs +281 -0
- package/tools/vibe-runtime/runtime-completion-boundary-text.mjs +7 -0
- package/tools/vibe-runtime/runtime-completion-bundle-contract.mjs +71 -0
- package/tools/vibe-runtime/runtime-completion-chain-assembly.mjs +48 -0
- package/tools/vibe-runtime/runtime-completion-command.mjs +50 -0
- package/tools/vibe-runtime/runtime-completion-evidence-bundle.mjs +269 -0
- package/tools/vibe-runtime/runtime-completion-evidence-descriptors.mjs +156 -0
- package/tools/vibe-runtime/runtime-completion-local-evidence-gates.mjs +164 -0
- package/tools/vibe-runtime/runtime-completion-presentation.mjs +71 -0
- package/tools/vibe-runtime/runtime-completion-readiness-summary.mjs +159 -0
- package/tools/vibe-runtime/runtime-confirmed-one-shot-plan.mjs +300 -0
- package/tools/vibe-runtime/runtime-context-budget-entry-defaults-command.mjs +77 -0
- package/tools/vibe-runtime/runtime-context-budget-entry-defaults.mjs +341 -0
- package/tools/vibe-runtime/runtime-contract-marker-registry.mjs +13 -0
- package/tools/vibe-runtime/runtime-contributor-guardrail-command.mjs +78 -0
- package/tools/vibe-runtime/runtime-contributor-guardrail-evidence.mjs +319 -0
- package/tools/vibe-runtime/runtime-control-plane-command.mjs +237 -0
- package/tools/vibe-runtime/runtime-control-plane-evals-artifacts.mjs +123 -0
- package/tools/vibe-runtime/runtime-control-plane-evals-boundary-model.mjs +75 -0
- package/tools/vibe-runtime/runtime-control-plane-evals-cases.mjs +547 -0
- package/tools/vibe-runtime/runtime-control-plane-evals-command.mjs +527 -0
- package/tools/vibe-runtime/runtime-control-plane-evals-report-validation.mjs +209 -0
- package/tools/vibe-runtime/runtime-control-plane-planner-artifacts.mjs +457 -0
- package/tools/vibe-runtime/runtime-control-plane-planning-command.mjs +563 -0
- package/tools/vibe-runtime/runtime-control-plane-planning-input.mjs +99 -0
- package/tools/vibe-runtime/runtime-control-plane-planning-listing.mjs +48 -0
- package/tools/vibe-runtime/runtime-control-plane-planning-presentation.mjs +246 -0
- package/tools/vibe-runtime/runtime-control-plane-planning-validation.mjs +529 -0
- package/tools/vibe-runtime/runtime-control-plane-readonly-command.mjs +537 -0
- package/tools/vibe-runtime/runtime-control-plane-readonly-deps.mjs +146 -0
- package/tools/vibe-runtime/runtime-control-plane-release-evidence.mjs +525 -0
- package/tools/vibe-runtime/runtime-control-plane-release-gates.mjs +369 -0
- package/tools/vibe-runtime/runtime-control-plane-router-planning-model.mjs +152 -0
- package/tools/vibe-runtime/runtime-control-plane-routing-artifacts.mjs +588 -0
- package/tools/vibe-runtime/runtime-controlled-change-delivery-contract.mjs +165 -0
- package/tools/vibe-runtime/runtime-controlled-execution-gate-contract.mjs +141 -0
- package/tools/vibe-runtime/runtime-controlled-long-running-automation-contract.mjs +184 -0
- package/tools/vibe-runtime/runtime-controlled-subagent-orchestration-contract.mjs +169 -0
- package/tools/vibe-runtime/runtime-daemon-command.mjs +166 -0
- package/tools/vibe-runtime/runtime-daemon-state-lifecycle-model.mjs +359 -0
- package/tools/vibe-runtime/runtime-delivery-methodology-command.mjs +17 -0
- package/tools/vibe-runtime/runtime-delivery-methodology-gates.mjs +277 -0
- package/tools/vibe-runtime/runtime-diff-coverage-envelope.mjs +301 -0
- package/tools/vibe-runtime/runtime-dispatch-command.mjs +484 -0
- package/tools/vibe-runtime/runtime-dispatch-readonly-artifacts.mjs +406 -0
- package/tools/vibe-runtime/runtime-dispatch-state-lifecycle-model.mjs +199 -0
- package/tools/vibe-runtime/runtime-durable-state-recovery-contract.mjs +172 -0
- package/tools/vibe-runtime/runtime-entry-advice-model.mjs +201 -0
- package/tools/vibe-runtime/runtime-entry-deps-builder.mjs +54 -0
- package/tools/vibe-runtime/runtime-entry-presentation.mjs +82 -0
- package/tools/vibe-runtime/runtime-entry-summary-model.mjs +343 -0
- package/tools/vibe-runtime/runtime-entry-trigger-discipline.mjs +341 -0
- package/tools/vibe-runtime/runtime-entry-trigger-tightening-command.mjs +79 -0
- package/tools/vibe-runtime/runtime-entry-trigger-tightening.mjs +357 -0
- package/tools/vibe-runtime/runtime-eval-catalog-model.mjs +101 -0
- package/tools/vibe-runtime/runtime-eval-transcript-fixtures.mjs +218 -0
- package/tools/vibe-runtime/runtime-evidence-intake-envelope.mjs +278 -0
- package/tools/vibe-runtime/runtime-evidence-repair-model.mjs +180 -0
- package/tools/vibe-runtime/runtime-executable-plan-contract.mjs +428 -0
- package/tools/vibe-runtime/runtime-execution-approval-lifecycle-models.mjs +278 -0
- package/tools/vibe-runtime/runtime-execution-candidate-approval-artifacts.mjs +227 -0
- package/tools/vibe-runtime/runtime-execution-command.mjs +544 -0
- package/tools/vibe-runtime/runtime-execution-enabled-bridge-model.mjs +113 -0
- package/tools/vibe-runtime/runtime-execution-enabled-closeout-boundary.mjs +89 -0
- package/tools/vibe-runtime/runtime-execution-enabled-preflight-model.mjs +185 -0
- package/tools/vibe-runtime/runtime-execution-enabled-profile-contract.mjs +127 -0
- package/tools/vibe-runtime/runtime-execution-enabled-run-envelope.mjs +153 -0
- package/tools/vibe-runtime/runtime-execution-evidence-binder.mjs +537 -0
- package/tools/vibe-runtime/runtime-execution-plan-artifacts.mjs +136 -0
- package/tools/vibe-runtime/runtime-execution-policy-artifacts.mjs +377 -0
- package/tools/vibe-runtime/runtime-execution-presentation.mjs +174 -0
- package/tools/vibe-runtime/runtime-execution-readonly-artifacts.mjs +228 -0
- package/tools/vibe-runtime/runtime-execution-run-preflight-artifacts.mjs +265 -0
- package/tools/vibe-runtime/runtime-execution-safety-artifacts.mjs +131 -0
- package/tools/vibe-runtime/runtime-execution-state-write-lifecycle-model.mjs +99 -0
- package/tools/vibe-runtime/runtime-experience-friction-matrix.mjs +395 -0
- package/tools/vibe-runtime/runtime-experience-learning-pattern.mjs +354 -0
- package/tools/vibe-runtime/runtime-experience-regression-dashboard.mjs +398 -0
- package/tools/vibe-runtime/runtime-experience-upgrade-command.mjs +92 -0
- package/tools/vibe-runtime/runtime-experience-upgrade-prioritizer.mjs +451 -0
- package/tools/vibe-runtime/runtime-foreground-worker-plan.mjs +275 -0
- package/tools/vibe-runtime/runtime-git-diff-read-model.mjs +322 -0
- package/tools/vibe-runtime/runtime-governance-attestation.mjs +304 -0
- package/tools/vibe-runtime/runtime-governance-command.mjs +609 -0
- package/tools/vibe-runtime/runtime-governance-convergence-reports.mjs +601 -0
- package/tools/vibe-runtime/runtime-governance-pr-models.mjs +551 -0
- package/tools/vibe-runtime/runtime-governance-presentation.mjs +67 -0
- package/tools/vibe-runtime/runtime-governance-route-model.mjs +194 -0
- package/tools/vibe-runtime/runtime-governance-surface-reports.mjs +495 -0
- package/tools/vibe-runtime/runtime-hooks-boundary-model.mjs +356 -0
- package/tools/vibe-runtime/runtime-hooks-command.mjs +286 -0
- package/tools/vibe-runtime/runtime-human-completion-evidence-model.mjs +220 -0
- package/tools/vibe-runtime/runtime-human-friendly-aliases.mjs +250 -0
- package/tools/vibe-runtime/runtime-implementation-methodology-command.mjs +17 -0
- package/tools/vibe-runtime/runtime-implementation-methodology-gates.mjs +164 -0
- package/tools/vibe-runtime/runtime-implementation-task-registry.mjs +334 -0
- package/tools/vibe-runtime/runtime-install-experience-command.mjs +120 -0
- package/tools/vibe-runtime/runtime-install-experience-score.mjs +334 -0
- package/tools/vibe-runtime/runtime-installed-multiround-ux-acceptance.mjs +149 -0
- package/tools/vibe-runtime/runtime-interaction-command-domain-registry.mjs +46 -0
- package/tools/vibe-runtime/runtime-interaction-command.mjs +648 -0
- package/tools/vibe-runtime/runtime-interaction-completion-command.mjs +220 -0
- package/tools/vibe-runtime/runtime-interaction-entry-command.mjs +130 -0
- package/tools/vibe-runtime/runtime-interaction-workflow-envelopes.mjs +412 -0
- package/tools/vibe-runtime/runtime-learning-advice-model.mjs +157 -0
- package/tools/vibe-runtime/runtime-learning-artifact-model.mjs +509 -0
- package/tools/vibe-runtime/runtime-learning-audit-model.mjs +106 -0
- package/tools/vibe-runtime/runtime-learning-interaction-command.mjs +220 -0
- package/tools/vibe-runtime/runtime-learning-observation-model.mjs +124 -0
- package/tools/vibe-runtime/runtime-learning-presentation.mjs +84 -0
- package/tools/vibe-runtime/runtime-learning-run-preview-model.mjs +184 -0
- package/tools/vibe-runtime/runtime-lease-command.mjs +95 -0
- package/tools/vibe-runtime/runtime-lease-state-lifecycle-model.mjs +247 -0
- package/tools/vibe-runtime/runtime-list-presentation.mjs +7 -0
- package/tools/vibe-runtime/runtime-live-behavior-transcript-model.mjs +164 -0
- package/tools/vibe-runtime/runtime-local-behavior-eval-contracts-command.mjs +76 -0
- package/tools/vibe-runtime/runtime-local-behavior-eval-contracts.mjs +382 -0
- package/tools/vibe-runtime/runtime-local-commit-automation-gate.mjs +254 -0
- package/tools/vibe-runtime/runtime-local-json-input.mjs +32 -0
- package/tools/vibe-runtime/runtime-methodology-coverage-map.mjs +398 -0
- package/tools/vibe-runtime/runtime-methodology-coverage-marker-specs.mjs +61 -0
- package/tools/vibe-runtime/runtime-methodology-coverage-presentation.mjs +26 -0
- package/tools/vibe-runtime/runtime-methodology-gate-model.mjs +154 -0
- package/tools/vibe-runtime/runtime-methodology-gate-output-envelope.mjs +4 -0
- package/tools/vibe-runtime/runtime-methodology-interaction-command.mjs +147 -0
- package/tools/vibe-runtime/runtime-methodology-presentation.mjs +76 -0
- package/tools/vibe-runtime/runtime-methodology-route-model.mjs +93 -0
- package/tools/vibe-runtime/runtime-next-action-console.mjs +388 -0
- package/tools/vibe-runtime/runtime-next-action-evidence-prompts-command.mjs +84 -0
- package/tools/vibe-runtime/runtime-next-action-evidence-prompts.mjs +327 -0
- package/tools/vibe-runtime/runtime-observability-command.mjs +96 -0
- package/tools/vibe-runtime/runtime-observability-presentation.mjs +30 -0
- package/tools/vibe-runtime/runtime-observability-readiness-model.mjs +204 -0
- package/tools/vibe-runtime/runtime-patch-queue-contract.mjs +151 -0
- package/tools/vibe-runtime/runtime-plan-action-manifest.mjs +334 -0
- package/tools/vibe-runtime/runtime-planner-route-model.mjs +75 -0
- package/tools/vibe-runtime/runtime-platform-acceptance-command.mjs +216 -0
- package/tools/vibe-runtime/runtime-platform-capability-artifacts.mjs +156 -0
- package/tools/vibe-runtime/runtime-platform-capability-model.mjs +105 -0
- package/tools/vibe-runtime/runtime-platform-command.mjs +329 -0
- package/tools/vibe-runtime/runtime-platform-presentation.mjs +78 -0
- package/tools/vibe-runtime/runtime-platform-session-artifacts.mjs +857 -0
- package/tools/vibe-runtime/runtime-platform-transcript-example-pack.mjs +293 -0
- package/tools/vibe-runtime/runtime-platform-transcript-intake-model.mjs +247 -0
- package/tools/vibe-runtime/runtime-platform-transcript-replay-model.mjs +371 -0
- package/tools/vibe-runtime/runtime-policy-catalog.mjs +54 -0
- package/tools/vibe-runtime/runtime-product-methodology-command.mjs +17 -0
- package/tools/vibe-runtime/runtime-product-methodology-gates.mjs +316 -0
- package/tools/vibe-runtime/runtime-progressive-entry-ux.mjs +237 -0
- package/tools/vibe-runtime/runtime-queue-command.mjs +98 -0
- package/tools/vibe-runtime/runtime-queue-state-lifecycle-model.mjs +318 -0
- package/tools/vibe-runtime/runtime-readiness-gate-split.mjs +196 -0
- package/tools/vibe-runtime/runtime-readonly-local-json-output-envelope.mjs +24 -0
- package/tools/vibe-runtime/runtime-recovery-classification-models.mjs +412 -0
- package/tools/vibe-runtime/runtime-recovery-command.mjs +107 -0
- package/tools/vibe-runtime/runtime-recovery-presentation.mjs +65 -0
- package/tools/vibe-runtime/runtime-recovery-state-lifecycle-model.mjs +419 -0
- package/tools/vibe-runtime/runtime-release-command-deps.mjs +4 -0
- package/tools/vibe-runtime/runtime-release-command.mjs +225 -0
- package/tools/vibe-runtime/runtime-release-state-lifecycle-model.mjs +48 -0
- package/tools/vibe-runtime/runtime-reply-artifact-lifecycle-model.mjs +84 -0
- package/tools/vibe-runtime/runtime-reply-command.mjs +488 -0
- package/tools/vibe-runtime/runtime-retry-command.mjs +223 -0
- package/tools/vibe-runtime/runtime-retry-run-gate-model.mjs +151 -0
- package/tools/vibe-runtime/runtime-review-envelope.mjs +449 -0
- package/tools/vibe-runtime/runtime-review-feedback-gate.mjs +160 -0
- package/tools/vibe-runtime/runtime-runbook-executor-preview-contract.mjs +361 -0
- package/tools/vibe-runtime/runtime-scheduler-command.mjs +8 -0
- package/tools/vibe-runtime/runtime-scheduler-risk-artifacts.mjs +775 -0
- package/tools/vibe-runtime/runtime-scheduler-state-lifecycle-model.mjs +53 -0
- package/tools/vibe-runtime/runtime-sdd-consumption-command.mjs +386 -0
- package/tools/vibe-runtime/runtime-sdd-evidence-chain-model.mjs +200 -0
- package/tools/vibe-runtime/runtime-sdd-handoff-chain-model.mjs +168 -0
- package/tools/vibe-runtime/runtime-sdd-implementer-artifact-model.mjs +90 -0
- package/tools/vibe-runtime/runtime-sdd-loop-command.mjs +659 -0
- package/tools/vibe-runtime/runtime-sdd-plan-preflight-model.mjs +121 -0
- package/tools/vibe-runtime/runtime-sdd-review-package-command.mjs +197 -0
- package/tools/vibe-runtime/runtime-sdd-review-package-model.mjs +183 -0
- package/tools/vibe-runtime/runtime-sdd-task-brief-model.mjs +144 -0
- package/tools/vibe-runtime/runtime-self-test-gate-profile.mjs +225 -0
- package/tools/vibe-runtime/runtime-sequential-stage-runbook.mjs +406 -0
- package/tools/vibe-runtime/runtime-session-checkpoint-model.mjs +217 -0
- package/tools/vibe-runtime/runtime-session-skill-command.mjs +241 -0
- package/tools/vibe-runtime/runtime-session-start-example-command.mjs +122 -0
- package/tools/vibe-runtime/runtime-session-start-example-pack.mjs +290 -0
- package/tools/vibe-runtime/runtime-session-start-shape-acceptance.mjs +344 -0
- package/tools/vibe-runtime/runtime-skill-contract-schema.mjs +221 -0
- package/tools/vibe-runtime/runtime-skill-route-registry.mjs +47 -0
- package/tools/vibe-runtime/runtime-skill-runtime-traceability-map.mjs +268 -0
- package/tools/vibe-runtime/runtime-source-merge-apply-boundary-model.mjs +130 -0
- package/tools/vibe-runtime/runtime-source-merge-artifacts.mjs +920 -0
- package/tools/vibe-runtime/runtime-source-merge-command.mjs +160 -0
- package/tools/vibe-runtime/runtime-source-merge-entry-command.mjs +153 -0
- package/tools/vibe-runtime/runtime-source-patch-plan-model.mjs +119 -0
- package/tools/vibe-runtime/runtime-stage-scriptlet.mjs +430 -0
- package/tools/vibe-runtime/runtime-staged-commit-readiness.mjs +469 -0
- package/tools/vibe-runtime/runtime-state-directory-model.mjs +7 -0
- package/tools/vibe-runtime/runtime-state-io.mjs +41 -0
- package/tools/vibe-runtime/runtime-state-paths.mjs +231 -0
- package/tools/vibe-runtime/runtime-state-presence-model.mjs +6 -0
- package/tools/vibe-runtime/runtime-state-risk-paths.mjs +70 -0
- package/tools/vibe-runtime/runtime-subagent-adapter-dispatch-command.mjs +266 -0
- package/tools/vibe-runtime/runtime-subagent-boundary-contracts.mjs +118 -0
- package/tools/vibe-runtime/runtime-subagent-permission-command.mjs +78 -0
- package/tools/vibe-runtime/runtime-subagent-permission-gate-model.mjs +131 -0
- package/tools/vibe-runtime/runtime-subagent-permission-visibility.mjs +294 -0
- package/tools/vibe-runtime/runtime-subagents-artifact-specs.mjs +257 -0
- package/tools/vibe-runtime/runtime-subagents-command.mjs +10 -0
- package/tools/vibe-runtime/runtime-subagents-eligibility-model.mjs +340 -0
- package/tools/vibe-runtime/runtime-subagents-platform-session-proxies.mjs +54 -0
- package/tools/vibe-runtime/runtime-subagents-presentation.mjs +91 -0
- package/tools/vibe-runtime/runtime-subagents-risk-artifacts.mjs +853 -0
- package/tools/vibe-runtime/runtime-subagents-stage-artifact-model.mjs +538 -0
- package/tools/vibe-runtime/runtime-subagents-tail-routing-model.mjs +48 -0
- package/tools/vibe-runtime/runtime-suite-plan-model.mjs +194 -0
- package/tools/vibe-runtime/runtime-superpowers-comparison-matrix.mjs +399 -0
- package/tools/vibe-runtime/runtime-superpowers-gap-matrix.mjs +307 -0
- package/tools/vibe-runtime/runtime-superpowers-parity-command.mjs +102 -0
- package/tools/vibe-runtime/runtime-superpowers-parity-profile-contract.mjs +183 -0
- package/tools/vibe-runtime/runtime-superpowers-parity-scorecard.mjs +460 -0
- package/tools/vibe-runtime/runtime-superpowers-regression-guard.mjs +270 -0
- package/tools/vibe-runtime/runtime-superpowers-style-eval-pack.mjs +367 -0
- package/tools/vibe-runtime/runtime-task-commit-gates.mjs +62 -0
- package/tools/vibe-runtime/runtime-task-commit-readiness.mjs +66 -0
- package/tools/vibe-runtime/runtime-task-commit-sidecar.mjs +65 -0
- package/tools/vibe-runtime/runtime-tdd-trace-contract.mjs +277 -0
- package/tools/vibe-runtime/runtime-test-evidence-model.mjs +196 -0
- package/tools/vibe-runtime/runtime-test-run-command-deps.mjs +7 -0
- package/tools/vibe-runtime/runtime-test-run-command.mjs +108 -0
- package/tools/vibe-runtime/runtime-token-economy-model.mjs +336 -0
- package/tools/vibe-runtime/runtime-token-interaction-command.mjs +381 -0
- package/tools/vibe-runtime/runtime-token-savior-budget.mjs +370 -0
- package/tools/vibe-runtime/runtime-tokens-command-deps.mjs +17 -0
- package/tools/vibe-runtime/runtime-tokens-command.mjs +117 -0
- package/tools/vibe-runtime/runtime-tokens-presentation.mjs +45 -0
- package/tools/vibe-runtime/runtime-trace-command.mjs +283 -0
- package/tools/vibe-runtime/runtime-trace-source-registry.mjs +132 -0
- package/tools/vibe-runtime/runtime-verification-gate-chain-model.mjs +131 -0
- package/tools/vibe-runtime/runtime-verification-repair-loop-plan.mjs +188 -0
- package/tools/vibe-runtime/runtime-workflow-alias-boundary-text.mjs +7 -0
- package/tools/vibe-runtime/runtime-workflow-alias-interaction-command.mjs +145 -0
- package/tools/vibe-runtime/runtime-workflow-command-deps.mjs +41 -0
- package/tools/vibe-runtime/runtime-workflow-command.mjs +191 -0
- package/tools/vibe-runtime/runtime-workflow-discipline-summary.mjs +164 -0
- package/tools/vibe-runtime/runtime-workflow-entry-envelopes.mjs +156 -0
- package/tools/vibe-runtime/runtime-workflow-ledger-command.mjs +239 -0
- package/tools/vibe-runtime/runtime-workflow-ledger-state-lifecycle-model.mjs +46 -0
- package/tools/vibe-runtime/runtime-workflow-loop-contract.mjs +259 -0
- package/tools/vibe-runtime/runtime-workflow-next-step-gate-model.mjs +106 -0
- package/tools/vibe-runtime/runtime-workflow-presentation.mjs +355 -0
- package/tools/vibe-runtime/runtime-workflow-readiness-model.mjs +176 -0
- package/tools/vibe-runtime/runtime-workflow-run-plan-model.mjs +207 -0
- package/tools/vibe-runtime/runtime-workflow-start-model.mjs +229 -0
- package/tools/vibe-runtime/runtime-workflow-state-artifacts.mjs +381 -0
- package/tools/vibe-runtime/runtime-workflow-state-helpers.mjs +456 -0
- package/tools/vibe-runtime/runtime-workflow-state-summary.mjs +65 -0
- package/tools/vibe-runtime/runtime-workflow-state-validation.mjs +104 -0
- package/tools/vibe-runtime/runtime-workflow-ux-model.mjs +205 -0
- package/tools/vibe-runtime/runtime-workspace-boundary-text.mjs +7 -0
- package/tools/vibe-runtime/runtime-workspace-isolation-command.mjs +295 -0
- package/tools/vibe-runtime/state-core-paths.mjs +113 -0
- package/tools/vibe-runtime/state-extension-paths.mjs +198 -0
- package/tools/vibe-runtime/state-safe-paths.mjs +2 -0
- package/tools/vibe-runtime-check/README.md +110 -0
- package/tools/vibe-runtime-check/architecture-tool-contracts.mjs +150 -0
- package/tools/vibe-runtime-check/index.mjs +186 -0
- package/tools/vibe-runtime-check/install-summary-adoption-contracts.mjs +115 -0
- package/tools/vibe-runtime-check/marker-contract-core.mjs +20 -0
- package/tools/vibe-runtime-check/product-artifact-contracts.mjs +24 -0
- package/tools/vibe-runtime-check/release-check-install-placement-contracts.mjs +166 -0
- package/tools/vibe-runtime-check/release-runtime-suite-layer-contracts.mjs +137 -0
- package/tools/vibe-runtime-check/runtime-architecture-manifest-drift-contracts.mjs +128 -0
- package/tools/vibe-runtime-check/runtime-automation-readiness-contracts.mjs +404 -0
- package/tools/vibe-runtime-check/runtime-capability-registry-contracts.mjs +299 -0
- package/tools/vibe-runtime-check/runtime-check-diagnostics-presentation.mjs +71 -0
- package/tools/vibe-runtime-check/runtime-cli-surface-contracts.mjs +156 -0
- package/tools/vibe-runtime-check/runtime-close-loop-contracts.mjs +163 -0
- package/tools/vibe-runtime-check/runtime-contract-delivery-registry.mjs +19 -0
- package/tools/vibe-runtime-check/runtime-contract-implementation-registry.mjs +23 -0
- package/tools/vibe-runtime-check/runtime-contract-local-evidence-registry.mjs +43 -0
- package/tools/vibe-runtime-check/runtime-contract-product-registry.mjs +83 -0
- package/tools/vibe-runtime-check/runtime-contract-registry.mjs +19 -0
- package/tools/vibe-runtime-check/runtime-control-plane-contracts.mjs +14 -0
- package/tools/vibe-runtime-check/runtime-doc-contract-marker-specs.mjs +349 -0
- package/tools/vibe-runtime-check/runtime-doc-contracts.mjs +24 -0
- package/tools/vibe-runtime-check/runtime-doc-marker-contracts.mjs +25 -0
- package/tools/vibe-runtime-check/runtime-entry-size-contracts.mjs +477 -0
- package/tools/vibe-runtime-check/runtime-experience-cli-contract-specs.mjs +98 -0
- package/tools/vibe-runtime-check/runtime-experience-cli-contracts.mjs +12 -0
- package/tools/vibe-runtime-check/runtime-experience-contracts.mjs +187 -0
- package/tools/vibe-runtime-check/runtime-governance-learning-token-contract-specs.mjs +92 -0
- package/tools/vibe-runtime-check/runtime-governance-learning-token-contracts.mjs +12 -0
- package/tools/vibe-runtime-check/runtime-high-risk-boundary-contracts.mjs +35 -0
- package/tools/vibe-runtime-check/runtime-high-risk-boundary-matrix.mjs +75 -0
- package/tools/vibe-runtime-check/runtime-index-import-boundary-contracts.mjs +192 -0
- package/tools/vibe-runtime-check/runtime-optimization-boundary-contracts.mjs +49 -0
- package/tools/vibe-runtime-check/runtime-pure-model-boundary-contracts.mjs +176 -0
- package/tools/vibe-runtime-check/runtime-release-closeout-contracts.mjs +25 -0
- package/tools/vibe-runtime-check/runtime-roadmap-marker-specs.mjs +559 -0
- package/tools/vibe-runtime-check/runtime-source-bundle.mjs +119 -0
- package/tools/vibe-runtime-check/runtime-tool-readme-contracts.mjs +93 -0
- package/tools/vibe-runtime-check/runtime-tool-readme-marker-specs.mjs +952 -0
- package/tools/vibe-runtime-check/workflow-skill-contracts.mjs +129 -0
- package/tools/vibe-runtime-check/workflow-skill-route-registry-contracts.mjs +106 -0
- package/tools/vibe-runtime-check/workflow-ux-contracts.mjs +46 -0
|
@@ -0,0 +1,917 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW,
|
|
6
|
+
assertNoSmokeState,
|
|
7
|
+
cleanupSmokeTmpRoot,
|
|
8
|
+
prepareSmokeTmpRoot,
|
|
9
|
+
readonlySmokeMarkers,
|
|
10
|
+
runForbiddenFlagChecks,
|
|
11
|
+
writeSmokeJsonFixture,
|
|
12
|
+
} from './release-check-json-assertion-helpers.mjs';
|
|
13
|
+
import {
|
|
14
|
+
PLATFORM_ENTRY_ACCEPTANCE_FORBIDDEN_FLAGS,
|
|
15
|
+
RUNTIME_READ_ONLY_FORBIDDEN_FLAGS,
|
|
16
|
+
stage119BlockedEvidenceFixture,
|
|
17
|
+
stage126SessionEvidenceFixture,
|
|
18
|
+
stage127ConsoleFrictionFixture,
|
|
19
|
+
stage127RunbookFixture,
|
|
20
|
+
stage128TokenFrictionFixture,
|
|
21
|
+
stage129FrictionFixture,
|
|
22
|
+
stage129LearningEvidenceFixture,
|
|
23
|
+
stage131TranscriptFixture,
|
|
24
|
+
stage27InstalledMultiroundUxTranscriptFixture,
|
|
25
|
+
stage132ConsoleFixture,
|
|
26
|
+
stage132FrictionFixture,
|
|
27
|
+
stage132LearningPatternFixture,
|
|
28
|
+
stage132TokenBudgetFixture,
|
|
29
|
+
stage134BadSessionStartFixture,
|
|
30
|
+
stage134ClaudeSessionStartFixture,
|
|
31
|
+
stage134CodexSessionStartFixture,
|
|
32
|
+
stage134CursorSdkSessionStartFixture,
|
|
33
|
+
stage134CursorSessionStartFixture,
|
|
34
|
+
stage134FullSkillInjectionSessionStartFixture,
|
|
35
|
+
stage134HiddenExecutionSessionStartFixture,
|
|
36
|
+
stage134MissingSemanticFieldsSessionStartFixture,
|
|
37
|
+
stage135BadTranscriptFixture,
|
|
38
|
+
stage135GoodTranscriptFixture,
|
|
39
|
+
stringifySmokeFixture,
|
|
40
|
+
} from './release-check-stage121-136-fixtures.mjs';
|
|
41
|
+
|
|
42
|
+
import { runBehavioralEvaluationContractSmoke } from './release-check-behavior-smoke.mjs';
|
|
43
|
+
|
|
44
|
+
export { runBehavioralEvaluationContractSmoke };
|
|
45
|
+
|
|
46
|
+
export function runSuperpowersRegressionGuardSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
47
|
+
const unexpectedState = path.join(repoRoot, '.vibecoding-state');
|
|
48
|
+
|
|
49
|
+
const guardEnvelope = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-regression-guard', '--from-superpowers', 'fork/superpowers', '--json', '--root', '.'], {}, options), 'governance --superpowers-regression-guard --json');
|
|
50
|
+
const guard = guardEnvelope.superpowers_regression_guard || {};
|
|
51
|
+
assertJsonMarkers(readonlySmokeMarkers(guardEnvelope, 'superpowersRegressionGuard'), 'governance --superpowers-regression-guard --json');
|
|
52
|
+
if (!guard.regression_guard_digest) throw new Error('Superpowers regression guard missing regression_guard_digest');
|
|
53
|
+
if (!guard.source_bindings?.gap_matrix_digest || !guard.source_bindings?.registry_digest || !guard.source_bindings?.automation_readiness_digest || !guard.source_bindings?.traceability_digest) throw new Error('Superpowers regression guard missing source binding digest');
|
|
54
|
+
if (guard.protected_stage_sequence?.length !== 10) throw new Error('Superpowers regression guard protected stage sequence count mismatch');
|
|
55
|
+
for (const stage of ['Stage 115', 'Stage 116', 'Stage 117', 'Stage 118', 'Stage 119', 'Stage 120', 'Stage 121', 'Stage 122', 'Stage 123', 'Stage 124']) {
|
|
56
|
+
if (!guard.protected_stage_sequence?.includes(stage)) throw new Error(`Superpowers regression guard missing protected stage: ${stage}`);
|
|
57
|
+
}
|
|
58
|
+
for (const command of ['governance --superpowers-gap', 'workflow --entry-ux', 'planner --executable-plan', 'automation --stage-runbook', 'verification --execution-evidence', 'release --staged-commit-readiness', 'evals --behavior-contract', 'platforms --bootstrap-matrix', 'governance --traceability-map', 'completion --evidence-bundle']) {
|
|
59
|
+
const row = guard.protected_capabilities?.find((item) => item.command === command);
|
|
60
|
+
if (!row || row.pass !== true) throw new Error(`Superpowers regression guard protected capability failed: ${command}`);
|
|
61
|
+
}
|
|
62
|
+
if (guard.dimension_scorecard?.length !== 10) throw new Error('Superpowers regression guard dimension scorecard count mismatch');
|
|
63
|
+
if (!guard.dimension_scorecard?.every((row) => row.status === 'guarded')) throw new Error('Superpowers regression guard dimension scorecard must be guarded');
|
|
64
|
+
if (!guard.regression_gates?.every((gate) => gate.pass === true)) throw new Error('Superpowers regression guard gates must pass');
|
|
65
|
+
if (guard.blockers?.length !== 0) throw new Error('Superpowers regression guard should not have blockers');
|
|
66
|
+
if (fs.existsSync(unexpectedState)) throw new Error('governance --superpowers-regression-guard JSON output created unexpected state directory');
|
|
67
|
+
|
|
68
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-regression-guard', '--from-superpowers', 'fork/superpowers', '--root', '.'], {
|
|
69
|
+
expectOutput: ['Vibecoding Runtime Superpowers Regression Guard', 'Stage: Stage 125; Guard: superpowers-regression-guard; pass=true', 'Claim: guarded-superiority; Target: fork/superpowers', 'Registry: Stage 101; version=47', '- stage_115_gap_baseline_gate: pass=true', '- registry_inventory_regression_gate: pass=true', '- automation_readiness_regression_gate: pass=true', '- skill_runtime_traceability_regression_gate: pass=true', '- superiority_dimension_scorecard_gate: pass=true', 'Protected capabilities:', 'Dimension scorecard:', 'Boundary: writes=false; superpowers_regression_guard_artifact=false; superpowers_gap_artifact=false; traceability_map_artifact=false; automation_readiness_artifact=false; command_execution=false; check_execution=false; test_execution=false; git=false; git_write=false; pr=false; push=false; merge=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; business_source_write=false', 'Regression guard digest:', 'Manual next action:'],
|
|
70
|
+
}, options);
|
|
71
|
+
if (fs.existsSync(unexpectedState)) throw new Error('governance --superpowers-regression-guard text output created unexpected state directory');
|
|
72
|
+
|
|
73
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-regression-guard', '--from-superpowers', 'fork/superpowers'], ['--root', '.'], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'governance --superpowers-regression-guard is read-only', options);
|
|
74
|
+
|
|
75
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-regression-guard', '--root', '.'], {
|
|
76
|
+
allowFailure: true,
|
|
77
|
+
expectOutput: ['governance --superpowers-regression-guard requires --from-superpowers'],
|
|
78
|
+
}, options);
|
|
79
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-regression-guard', '--from-superpowers', '../superpowers', '--root', '.'], {
|
|
80
|
+
allowFailure: true,
|
|
81
|
+
expectOutput: ['governance --superpowers-gap --from-superpowers must stay within --root'],
|
|
82
|
+
}, options);
|
|
83
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-regression-guard', '--from-superpowers', 'missing-superpowers', '--root', '.'], {
|
|
84
|
+
allowFailure: true,
|
|
85
|
+
expectOutput: ['governance --superpowers-gap --from-superpowers directory not found'],
|
|
86
|
+
}, options);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function experienceFrictionUnsupportedCases({ target, evidenceFile }) {
|
|
90
|
+
return [
|
|
91
|
+
{
|
|
92
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--root', target],
|
|
93
|
+
expected: 'governance --experience-friction requires --from-file',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--from-file', '../outside.json', '--root', target],
|
|
97
|
+
expected: 'governance --experience-friction --from-file must stay within --root',
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--from-file', evidenceFile, '--from-superpowers', 'fork/superpowers', '--root', target],
|
|
101
|
+
expected: '--from-superpowers is only supported by governance --superpowers-gap, governance --superpowers-comparison, or governance --superpowers-regression-guard',
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function runExperienceFrictionUnsupportedCases(run, context, options) {
|
|
107
|
+
for (const { args, expected } of experienceFrictionUnsupportedCases(context)) {
|
|
108
|
+
run('node', args, {
|
|
109
|
+
allowFailure: true,
|
|
110
|
+
expectOutput: [expected],
|
|
111
|
+
}, options);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function runExperienceFrictionSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
116
|
+
const target = '.tmp/vibe-experience-friction';
|
|
117
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
118
|
+
const evidenceFile = path.join(target, 'stage126-session-evidence.json');
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
writeSmokeJsonFixture(repoRoot, evidenceFile, stage126SessionEvidenceFixture());
|
|
122
|
+
|
|
123
|
+
const friction = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--from-file', evidenceFile, '--json', '--root', target], {}, options), 'governance --experience-friction --json');
|
|
124
|
+
assertJsonMarkers(readonlySmokeMarkers(friction, 'experienceFriction'), 'governance --experience-friction --json');
|
|
125
|
+
if (!friction.experience_friction_matrix?.friction_digest) throw new Error('experience friction matrix missing friction_digest');
|
|
126
|
+
if (friction.experience_friction_matrix?.dimensions?.length !== 8) throw new Error('experience friction dimension count mismatch');
|
|
127
|
+
if (!friction.experience_friction_matrix?.priority_fixes?.some((fix) => fix.recommended_stage === 'Stage 127')) throw new Error('experience friction missing Stage 127 priority fix');
|
|
128
|
+
if (!friction.experience_friction_matrix?.priority_fixes?.some((fix) => fix.recommended_stage === 'Stage 128')) throw new Error('experience friction missing Stage 128 token priority fix');
|
|
129
|
+
if (!friction.experience_friction_matrix?.recommended_stage_sequence?.includes('Stage 130')) throw new Error('experience friction missing Stage 130 stage sequence');
|
|
130
|
+
if (friction.experience_friction_matrix?.friction_score <= 0) throw new Error('experience friction score should be positive');
|
|
131
|
+
assertNoSmokeState(repoRoot, target, 'governance --experience-friction JSON output');
|
|
132
|
+
|
|
133
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--from-file', evidenceFile, '--root', target], {
|
|
134
|
+
expectOutput: ['Vibecoding Runtime Experience Friction Matrix', 'Stage: Stage 126; Kind: experience-friction-matrix; pass=true', 'Friction score:', '- entry_confusion:', '- next_action_unclear:', 'Priority fixes:', 'Recommended stage sequence:', 'Boundary: writes=false; experience_friction_artifact=false; command_execution=false; check_execution=false; test_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; git=false; git_write=false; commit=false; pr=false; push=false; merge=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; business_source_write=false', 'Experience friction digest:', 'Manual next action:'],
|
|
135
|
+
}, options);
|
|
136
|
+
assertNoSmokeState(repoRoot, target, 'governance --experience-friction text output');
|
|
137
|
+
|
|
138
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--from-file', evidenceFile], ['--root', target], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'governance --experience-friction is read-only', options);
|
|
139
|
+
|
|
140
|
+
runExperienceFrictionUnsupportedCases(run, { target, evidenceFile }, options);
|
|
141
|
+
} finally {
|
|
142
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function nextActionConsoleFixtures({ frictionFile, runbookFile, evidenceFile }) {
|
|
147
|
+
return [
|
|
148
|
+
[frictionFile, stage127ConsoleFrictionFixture()],
|
|
149
|
+
[runbookFile, stage127RunbookFixture()],
|
|
150
|
+
[evidenceFile, stage119BlockedEvidenceFixture()],
|
|
151
|
+
];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function nextActionConsoleUnsupportedCases({ target, frictionFile }) {
|
|
155
|
+
return [
|
|
156
|
+
{
|
|
157
|
+
args: ['tools/vibe-runtime/index.mjs', 'workflow', '--next-action-console', '--root', target],
|
|
158
|
+
expected: 'workflow --next-action-console requires --from-friction',
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
args: ['tools/vibe-runtime/index.mjs', 'workflow', '--next-action-console', '--from-friction', '../outside.json', '--root', target],
|
|
162
|
+
expected: 'workflow --next-action-console --from-friction must stay within --root',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
args: ['tools/vibe-runtime/index.mjs', 'workflow', '--next-action-console', '--from-friction', frictionFile, '--from-file', frictionFile, '--root', target],
|
|
166
|
+
expected: 'workflow --next-action-console only accepts --from-friction',
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function runNextActionConsoleUnsupportedCases(run, context, options) {
|
|
172
|
+
for (const { args, expected } of nextActionConsoleUnsupportedCases(context)) {
|
|
173
|
+
run('node', args, {
|
|
174
|
+
allowFailure: true,
|
|
175
|
+
expectOutput: [expected],
|
|
176
|
+
}, options);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function runNextActionConsoleSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
181
|
+
const target = '.tmp/vibe-next-action-console';
|
|
182
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
183
|
+
const frictionFile = path.join(target, 'stage126-friction.json');
|
|
184
|
+
const runbookFile = path.join(target, 'stage118-runbook.json');
|
|
185
|
+
const evidenceFile = path.join(target, 'stage119-evidence.json');
|
|
186
|
+
|
|
187
|
+
try {
|
|
188
|
+
for (const [file, fixture] of nextActionConsoleFixtures({ frictionFile, runbookFile, evidenceFile })) {
|
|
189
|
+
writeSmokeJsonFixture(repoRoot, file, fixture);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const consoleEnvelope = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--next-action-console', '--from-friction', frictionFile, '--from-runbook', runbookFile, '--from-evidence', evidenceFile, '--json', '--root', target], {}, options), 'workflow --next-action-console --json');
|
|
193
|
+
assertJsonMarkers(readonlySmokeMarkers(consoleEnvelope, 'nextActionConsole'), 'workflow --next-action-console --json');
|
|
194
|
+
if (!consoleEnvelope.next_action_console?.console_digest) throw new Error('next action console missing console_digest');
|
|
195
|
+
if (!consoleEnvelope.next_action_console?.copy_ready_command_preview?.some((item) => item.id === 'refresh-console' && item.preview_only === true)) throw new Error('next action console missing refresh-console preview');
|
|
196
|
+
if (!consoleEnvelope.next_action_console?.evidence_needed_next?.some((item) => item.id === 'local-validation-evidence')) throw new Error('next action console missing local validation evidence need');
|
|
197
|
+
if (!consoleEnvelope.next_action_console?.do_not_do_yet?.some((item) => item.includes('git add'))) throw new Error('next action console missing git non-action boundary');
|
|
198
|
+
assertNoSmokeState(repoRoot, target, 'workflow --next-action-console JSON output');
|
|
199
|
+
|
|
200
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--next-action-console', '--from-friction', frictionFile, '--root', target], {
|
|
201
|
+
expectOutput: ['Vibecoding Runtime One-screen Next Action Console', 'Stage: Stage 127; Kind: one-screen-next-action-console; pass=true', 'Current position:', 'Recommended next action:', 'Copy-ready command preview:', 'Evidence needed next:', 'Do not do yet:', 'Boundary: writes=false; next_action_console_artifact=false; command_execution=false; check_execution=false; test_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; evidence_write=false; git=false; git_write=false; commit=false; pr=false; push=false; merge=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; business_source_write=false', 'Next action console digest:'],
|
|
202
|
+
}, options);
|
|
203
|
+
assertNoSmokeState(repoRoot, target, 'workflow --next-action-console text output');
|
|
204
|
+
|
|
205
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'workflow', '--next-action-console', '--from-friction', frictionFile], ['--root', target], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'workflow read-only modes do not accept execution', options);
|
|
206
|
+
|
|
207
|
+
runNextActionConsoleUnsupportedCases(run, { target, frictionFile }, options);
|
|
208
|
+
} finally {
|
|
209
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function runTokenSaviorBudgetSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
214
|
+
const target = '.tmp/vibe-token-savior-budget';
|
|
215
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
216
|
+
const frictionFile = path.join(target, 'stage126-friction.json');
|
|
217
|
+
|
|
218
|
+
try {
|
|
219
|
+
writeSmokeJsonFixture(repoRoot, frictionFile, stage128TokenFrictionFixture());
|
|
220
|
+
|
|
221
|
+
const budget = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'tokens', '--savior-budget', '--prompt', 'next-entry-with-token-pain', '--from-friction', frictionFile, '--json', '--root', target], {}, options), 'tokens --savior-budget --json');
|
|
222
|
+
assertJsonMarkers(readonlySmokeMarkers(budget, 'tokenSaviorBudget'), 'tokens --savior-budget --json');
|
|
223
|
+
if (!budget.token_savior_budget?.budget_digest) throw new Error('token savior budget missing budget_digest');
|
|
224
|
+
if (!budget.token_savior_budget?.skills_to_surface?.some((item) => item.skill === 'using-vibecoding')) throw new Error('token savior budget missing using-vibecoding surface skill');
|
|
225
|
+
if (!budget.token_savior_budget?.skills_to_defer?.some((item) => item.skill === 'vibe-writing-skills')) throw new Error('token savior budget missing deferred skill list');
|
|
226
|
+
if (!budget.token_savior_budget?.commands_to_surface?.every((item) => item.preview_only === true && item.execute === false)) throw new Error('token savior budget commands must be preview-only');
|
|
227
|
+
assertNoSmokeState(repoRoot, target, 'tokens --savior-budget JSON output');
|
|
228
|
+
|
|
229
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'tokens', '--savior-budget', '--prompt', 'release-review-needs-broader-context', '--root', target], {
|
|
230
|
+
expectOutput: ['Vibecoding Runtime Token Savior Entry Budget', 'Stage: Stage 128; Kind: token-savior-entry-budget-contract; pass=true', 'Recommended profile:', 'Skills to surface:', 'Skills to defer:', 'Commands to surface:', 'Token saving reasoning:', 'Boundary: writes=false; token_savior_budget_artifact=false; command_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; dynamic_tool_execution=false; embeddings=false; remote_config=false; shell_interception=false; command_mutation=false; git=false; git_write=false; commit=false; pr=false; push=false; merge=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; business_source_write=false', 'Token savior budget digest:'],
|
|
231
|
+
}, options);
|
|
232
|
+
assertNoSmokeState(repoRoot, target, 'tokens --savior-budget text output');
|
|
233
|
+
|
|
234
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'tokens', '--savior-budget', '--prompt', 'next-entry'], ['--root', target], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'tokens --savior-budget is read-only', options);
|
|
235
|
+
|
|
236
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'tokens', '--savior-budget', '--root', target], {
|
|
237
|
+
allowFailure: true,
|
|
238
|
+
expectOutput: ['tokens --savior-budget requires --prompt <text>'],
|
|
239
|
+
}, options);
|
|
240
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'tokens', '--savior-budget', '--prompt', 'next-entry', '--from-friction', '../outside.json', '--root', target], {
|
|
241
|
+
allowFailure: true,
|
|
242
|
+
expectOutput: ['tokens --savior-budget --from-friction must stay within --root'],
|
|
243
|
+
}, options);
|
|
244
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'tokens', '--advice', '--prompt', 'next-entry', '--root', target], {
|
|
245
|
+
allowFailure: true,
|
|
246
|
+
expectOutput: ['--prompt is only supported by tokens --savior-budget'],
|
|
247
|
+
}, options);
|
|
248
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--from-friction', frictionFile, '--root', target], {
|
|
249
|
+
allowFailure: true,
|
|
250
|
+
expectOutput: ['--from-friction, --from-console, --from-token-budget, and --from-learning-pattern are only supported by governance --experience-dashboard'],
|
|
251
|
+
}, options);
|
|
252
|
+
} finally {
|
|
253
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
export function runAdapterEntryAcceptanceSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
258
|
+
const target = '.tmp/vibe-adapter-entry-acceptance';
|
|
259
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
260
|
+
const transcriptFile = path.join(target, 'stage131-transcript.json');
|
|
261
|
+
|
|
262
|
+
try {
|
|
263
|
+
writeSmokeJsonFixture(repoRoot, transcriptFile, stage131TranscriptFixture());
|
|
264
|
+
|
|
265
|
+
const acceptance = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', transcriptFile, '--adapter', 'cursor', '--json', '--root', target], {}, options), 'platforms --entry-acceptance --json');
|
|
266
|
+
assertJsonMarkers(readonlySmokeMarkers(acceptance, 'adapterEntryAcceptance'), 'platforms --entry-acceptance --json');
|
|
267
|
+
if (!acceptance.adapter_entry_acceptance?.acceptance_digest) throw new Error('adapter entry acceptance missing acceptance_digest');
|
|
268
|
+
for (const gateName of ['using_vibecoding_first', 'lightweight_routing', 'visible_next_step', 'no_auto_execution', 'workflow_explained']) {
|
|
269
|
+
const gate = acceptance.adapter_entry_acceptance?.gate_results?.find((item) => item.gate === gateName);
|
|
270
|
+
if (!gate?.pass) throw new Error(`adapter entry acceptance gate did not pass: ${gateName}`);
|
|
271
|
+
}
|
|
272
|
+
assertNoSmokeState(repoRoot, target, 'platforms --entry-acceptance JSON output');
|
|
273
|
+
|
|
274
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', transcriptFile, '--adapter', 'cursor', '--root', target], {
|
|
275
|
+
expectOutput: ['Vibecoding Runtime Platform Capability', 'Mode: adapter-entry-acceptance-contract', 'Stage: Stage 131; Acceptance: adapter-entry-acceptance-contract; accepted=true', 'Adapter: cursor; Score: 100; Digest:', 'using_vibecoding_first: pass=true', 'lightweight_routing: pass=true', 'visible_next_step: pass=true', 'no_auto_execution: pass=true', 'workflow_explained: pass=true'],
|
|
276
|
+
}, options);
|
|
277
|
+
|
|
278
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', transcriptFile], ['--root', target], PLATFORM_ENTRY_ACCEPTANCE_FORBIDDEN_FLAGS, 'platforms --entry-acceptance is read-only', options);
|
|
279
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--root', target], {
|
|
280
|
+
allowFailure: true,
|
|
281
|
+
expectOutput: ['platforms --entry-acceptance requires --from-file <local-adapter-transcript-json>'],
|
|
282
|
+
}, options);
|
|
283
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', transcriptFile, '--adapter', 'unknown', '--root', target], {
|
|
284
|
+
allowFailure: true,
|
|
285
|
+
expectOutput: ['--adapter must be claude, cursor, or codex'],
|
|
286
|
+
}, options);
|
|
287
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', '../outside.json', '--root', target], {
|
|
288
|
+
allowFailure: true,
|
|
289
|
+
expectOutput: ['adapter entry transcript must be inside root'],
|
|
290
|
+
}, options);
|
|
291
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'tokens', '--savior-budget', '--prompt', 'entry check', '--from-file', transcriptFile, '--root', target], {
|
|
292
|
+
allowFailure: true,
|
|
293
|
+
expectOutput: ['Unknown argument'],
|
|
294
|
+
}, options);
|
|
295
|
+
} finally {
|
|
296
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
export function runInstalledMultiroundUxSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
301
|
+
const target = '.tmp/vibe-installed-multiround-ux';
|
|
302
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
303
|
+
const transcriptFile = path.join(target, 'stage27-installed-multiround.json');
|
|
304
|
+
const hiddenExecutionFile = path.join(target, 'stage27-hidden-execution.json');
|
|
305
|
+
const missingCloseoutFile = path.join(target, 'stage27-missing-closeout.json');
|
|
306
|
+
const ignoredReviewBlockerFile = path.join(target, 'stage27-ignored-review-blocker.json');
|
|
307
|
+
|
|
308
|
+
try {
|
|
309
|
+
writeSmokeJsonFixture(repoRoot, transcriptFile, stage27InstalledMultiroundUxTranscriptFixture());
|
|
310
|
+
writeSmokeJsonFixture(repoRoot, hiddenExecutionFile, stage27InstalledMultiroundUxTranscriptFixture({ unsafe: 'hidden-execution' }));
|
|
311
|
+
writeSmokeJsonFixture(repoRoot, missingCloseoutFile, stage27InstalledMultiroundUxTranscriptFixture({ unsafe: 'missing-closeout-evidence' }));
|
|
312
|
+
writeSmokeJsonFixture(repoRoot, ignoredReviewBlockerFile, stage27InstalledMultiroundUxTranscriptFixture({ unsafe: 'ignored-review-blocker' }));
|
|
313
|
+
|
|
314
|
+
const acceptance = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', transcriptFile, '--adapter', 'cursor', '--json', '--root', target], {}, options), 'platforms --entry-acceptance installed multiround --json');
|
|
315
|
+
if (acceptance.mode !== 'adapter-entry-acceptance-contract') throw new Error('installed multi-round UX acceptance used the wrong envelope mode');
|
|
316
|
+
if (acceptance.safety?.adapter_execution !== false || acceptance.safety?.subagent !== false || acceptance.safety?.git_write !== false) throw new Error('installed multi-round UX acceptance boundary must stay read-only');
|
|
317
|
+
const installed = acceptance.adapter_entry_acceptance?.installed_multiround_ux_acceptance || {};
|
|
318
|
+
if (installed.stage !== 'Stage 27') throw new Error('installed multi-round UX acceptance missing Stage 27 marker');
|
|
319
|
+
if (installed.acceptance_kind !== 'installed-multiround-ux-close-loop-acceptance') throw new Error('installed multi-round UX acceptance kind mismatch');
|
|
320
|
+
if (installed.accepted !== true || acceptance.ok !== true) throw new Error('installed multi-round UX acceptance should pass');
|
|
321
|
+
for (const turn of ['first_turn', 'continue_task', 'bug_debug', 'completion_closeout', 'review_feedback']) {
|
|
322
|
+
if (installed.prompt_turn_coverage?.[turn] !== true) throw new Error(`installed multi-round UX missing prompt turn ${turn}`);
|
|
323
|
+
}
|
|
324
|
+
for (const gateName of ['installed_multiround_prompt_coverage', 'visible_route_each_round', 'continue_task_plan_trace', 'bug_debug_reproduction_gate', 'completion_closeout_evidence_gate', 'review_feedback_gate_loop', 'session_continuity_close_loop', 'no_multiround_execution_claims']) {
|
|
325
|
+
const gate = installed.gate_results?.find((item) => item.gate === gateName);
|
|
326
|
+
if (!gate?.pass) throw new Error(`installed multi-round UX gate did not pass: ${gateName}`);
|
|
327
|
+
}
|
|
328
|
+
assertNoSmokeState(repoRoot, target, 'platforms --entry-acceptance installed multiround JSON output');
|
|
329
|
+
|
|
330
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', transcriptFile, '--adapter', 'cursor', '--root', target], {
|
|
331
|
+
expectOutput: ['Stage: Stage 131; Acceptance: adapter-entry-acceptance-contract; accepted=true', 'Installed multi-round: stage=Stage 27; kind=installed-multiround-ux-close-loop-acceptance; accepted=true', 'installed_multiround_prompt_coverage: pass=true', 'completion_closeout_evidence_gate: pass=true', 'review_feedback_gate_loop: pass=true', 'session_continuity_close_loop: pass=true'],
|
|
332
|
+
}, options);
|
|
333
|
+
assertNoSmokeState(repoRoot, target, 'platforms --entry-acceptance installed multiround text output');
|
|
334
|
+
|
|
335
|
+
const hiddenExecution = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', hiddenExecutionFile, '--adapter', 'cursor', '--json', '--root', target], {}, options), 'platforms --entry-acceptance installed multiround hidden execution --json');
|
|
336
|
+
if (hiddenExecution.ok !== false || !hiddenExecution.adapter_entry_acceptance?.blockers?.some((blocker) => blocker.includes('no_multiround_execution_claims'))) throw new Error('installed multi-round UX should reject hidden execution claims');
|
|
337
|
+
const missingCloseout = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', missingCloseoutFile, '--adapter', 'cursor', '--json', '--root', target], {}, options), 'platforms --entry-acceptance installed multiround missing closeout --json');
|
|
338
|
+
if (missingCloseout.ok !== false || !missingCloseout.adapter_entry_acceptance?.blockers?.some((blocker) => blocker.includes('completion_closeout_evidence_gate'))) throw new Error('installed multi-round UX should reject missing closeout evidence');
|
|
339
|
+
const ignoredReviewBlocker = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', ignoredReviewBlockerFile, '--adapter', 'cursor', '--json', '--root', target], {}, options), 'platforms --entry-acceptance installed multiround ignored review blocker --json');
|
|
340
|
+
if (ignoredReviewBlocker.ok !== false || !ignoredReviewBlocker.adapter_entry_acceptance?.blockers?.some((blocker) => blocker.includes('review_feedback_gate_loop'))) throw new Error('installed multi-round UX should reject ignored review blocker');
|
|
341
|
+
|
|
342
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'platforms', '--entry-acceptance', '--from-file', transcriptFile], ['--root', target], PLATFORM_ENTRY_ACCEPTANCE_FORBIDDEN_FLAGS, 'platforms --entry-acceptance is read-only', options);
|
|
343
|
+
} finally {
|
|
344
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
function experienceRegressionDashboardFixtures({ frictionFile, consoleFile, tokenBudgetFile, learningPatternFile }) {
|
|
349
|
+
return [
|
|
350
|
+
[frictionFile, stage132FrictionFixture()],
|
|
351
|
+
[consoleFile, stage132ConsoleFixture()],
|
|
352
|
+
[tokenBudgetFile, stage132TokenBudgetFixture()],
|
|
353
|
+
[learningPatternFile, stage132LearningPatternFixture()],
|
|
354
|
+
];
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function experienceRegressionDashboardUnsupportedCases({ target, frictionFile, tokenBudgetFile }) {
|
|
358
|
+
return [
|
|
359
|
+
{
|
|
360
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--experience-dashboard', '--root', target],
|
|
361
|
+
expected: 'governance --experience-dashboard requires --from-friction <local-friction-json>',
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--experience-dashboard', '--from-friction', '../outside.json', '--root', target],
|
|
365
|
+
expected: 'governance --experience-dashboard --from-friction must stay within --root',
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--experience-dashboard', '--from-friction', frictionFile, '--from-file', frictionFile, '--root', target],
|
|
369
|
+
expected: 'governance --experience-dashboard only accepts --from-friction, optional --from-console, optional --from-token-budget, optional --from-learning-pattern, optional --intent, --json, and --root',
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
args: ['tools/vibe-runtime/index.mjs', 'tokens', '--savior-budget', '--prompt', 'entry-check', '--from-token-budget', tokenBudgetFile, '--root', target],
|
|
373
|
+
expected: '--from-token-budget is only supported by governance --experience-dashboard',
|
|
374
|
+
},
|
|
375
|
+
];
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function runExperienceRegressionDashboardUnsupportedCases(run, context, options) {
|
|
379
|
+
for (const { args, expected } of experienceRegressionDashboardUnsupportedCases(context)) {
|
|
380
|
+
run('node', args, {
|
|
381
|
+
allowFailure: true,
|
|
382
|
+
expectOutput: [expected],
|
|
383
|
+
}, options);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export function runExperienceRegressionDashboardSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
388
|
+
const target = '.tmp/vibe-experience-regression-dashboard';
|
|
389
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
390
|
+
const frictionFile = path.join(target, 'stage126-friction.json');
|
|
391
|
+
const consoleFile = path.join(target, 'stage127-console.json');
|
|
392
|
+
const tokenBudgetFile = path.join(target, 'stage128-token-budget.json');
|
|
393
|
+
const learningPatternFile = path.join(target, 'stage129-learning-pattern.json');
|
|
394
|
+
|
|
395
|
+
try {
|
|
396
|
+
for (const [file, fixture] of experienceRegressionDashboardFixtures({ frictionFile, consoleFile, tokenBudgetFile, learningPatternFile })) {
|
|
397
|
+
writeSmokeJsonFixture(repoRoot, file, fixture);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const dashboard = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--experience-dashboard', '--from-friction', frictionFile, '--from-console', consoleFile, '--from-token-budget', tokenBudgetFile, '--from-learning-pattern', learningPatternFile, '--intent', 'implementation', '--json', '--root', target], {}, options), 'governance --experience-dashboard --json');
|
|
401
|
+
assertJsonMarkers(readonlySmokeMarkers(dashboard, 'experienceDashboard'), 'governance --experience-dashboard --json');
|
|
402
|
+
if (!dashboard.experience_regression_dashboard?.dashboard_digest) throw new Error('experience regression dashboard missing dashboard_digest');
|
|
403
|
+
if (!Array.isArray(dashboard.experience_regression_dashboard?.regression_blockers) || dashboard.experience_regression_dashboard.regression_blockers.length !== 0) throw new Error('experience regression dashboard expected no regression blockers in baseline fixture');
|
|
404
|
+
for (const section of ['experience_scorecard', 'superpowers_comparison_delta', 'token_savior_delta', 'learning_loop_delta', 'daily_user_friction_delta']) {
|
|
405
|
+
if (!dashboard.experience_regression_dashboard?.dashboard_sections?.includes(section)) throw new Error(`experience regression dashboard missing section ${section}`);
|
|
406
|
+
}
|
|
407
|
+
assertNoSmokeState(repoRoot, target, 'governance --experience-dashboard JSON output');
|
|
408
|
+
|
|
409
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--experience-dashboard', '--from-friction', frictionFile, '--from-console', consoleFile, '--from-token-budget', tokenBudgetFile, '--from-learning-pattern', learningPatternFile, '--root', target], {
|
|
410
|
+
expectOutput: ['Vibecoding Runtime Experience Regression Dashboard', 'Stage: Stage 132; Kind: experience-regression-dashboard; pass=true', 'Score: 90; rating=strong', 'Superpowers delta: status=parity-protected', 'Token Savior delta: status=budget-bound; profile=tiny_entry', 'Learning loop delta: status=candidate-only; candidates=1; promotion_required=true', 'Daily friction delta: status=reduced', 'Next bet: experience-loop-ready', 'Boundary: writes=false; experience_dashboard_artifact=false; regression_dashboard_artifact=false; sidecar_write=false; state_directory_created=false; source_write=false; command_execution=false; check_execution=false; smoke_execution=false; test_execution=false; verification_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; auto_execution=false; evidence_write=false; dashboard_write=false; dynamic_tool_execution=false; embeddings=false; remote_config=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; git=false; git_write=false; git_add=false; commit=false; pr=false; push=false; merge=false; business_source_write=false', 'Dashboard digest:'],
|
|
411
|
+
}, options);
|
|
412
|
+
assertNoSmokeState(repoRoot, target, 'governance --experience-dashboard text output');
|
|
413
|
+
|
|
414
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'governance', '--experience-dashboard', '--from-friction', frictionFile], ['--root', target], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'governance --experience-dashboard is read-only and report-only', options);
|
|
415
|
+
runExperienceRegressionDashboardUnsupportedCases(run, { target, frictionFile, tokenBudgetFile }, options);
|
|
416
|
+
} finally {
|
|
417
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
export function runSuperpowersComparisonSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
422
|
+
const unexpectedState = path.join(repoRoot, '.vibecoding-state');
|
|
423
|
+
|
|
424
|
+
const comparisonEnvelope = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--from-superpowers-root', 'fork/superpowers', '--json', '--root', '.'], {}, options), 'governance --superpowers-comparison --json');
|
|
425
|
+
const matrix = comparisonEnvelope.superpowers_comparison_matrix || {};
|
|
426
|
+
assertJsonMarkers(readonlySmokeMarkers(comparisonEnvelope, 'superpowersComparison'), 'governance --superpowers-comparison --json');
|
|
427
|
+
if (!matrix.comparison_digest) throw new Error('Superpowers comparison matrix missing comparison_digest');
|
|
428
|
+
if (!matrix.source_bindings?.source_digest || !matrix.source_bindings?.superpowers_root_digest) throw new Error('Superpowers comparison matrix missing source binding digest');
|
|
429
|
+
if (matrix.dimensions?.length !== 10) throw new Error('Superpowers comparison matrix dimension count mismatch');
|
|
430
|
+
for (const dimensionId of ['session_start_bootstrap', 'skill_trigger_discipline', 'methodology_coverage', 'hook_shape_coverage', 'adapter_packaging', 'eval_and_test_harness', 'subagent_boundary', 'contributor_guardrails', 'token_and_context_economy', 'daily_user_friction']) {
|
|
431
|
+
if (!matrix.dimensions?.some((dimension) => dimension.id === dimensionId)) throw new Error(`Superpowers comparison matrix missing dimension: ${dimensionId}`);
|
|
432
|
+
}
|
|
433
|
+
if (!Array.isArray(matrix.parity_gaps)) throw new Error('Superpowers comparison matrix parity_gaps must be a list');
|
|
434
|
+
if (!matrix.vibecoding_advantages?.some((item) => item.includes('local deterministic runtime contracts'))) throw new Error('Superpowers comparison matrix missing Vibecoding deterministic advantage');
|
|
435
|
+
if (!matrix.borrowable_patterns?.some((item) => item.target_stage === 'Stage 134')) throw new Error('Superpowers comparison matrix missing Stage 134 borrowable pattern');
|
|
436
|
+
if (!matrix.do_not_copy?.some((item) => item.includes('Do not inject the full using-vibecoding skill'))) throw new Error('Superpowers comparison matrix missing full-skill do-not-copy boundary');
|
|
437
|
+
if (!matrix.recommended_stage_sequence?.includes('Stage 140')) throw new Error('Superpowers comparison matrix missing Stage 140 recommendation');
|
|
438
|
+
if (!matrix.next_comparison_bet?.target_stage) throw new Error('Superpowers comparison matrix missing next comparison bet');
|
|
439
|
+
if (fs.existsSync(unexpectedState)) throw new Error('governance --superpowers-comparison JSON output created unexpected state directory');
|
|
440
|
+
|
|
441
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--from-superpowers-root', 'fork/superpowers', '--root', '.'], {
|
|
442
|
+
expectOutput: ['Vibecoding Runtime Superpowers Comparative Evidence Matrix', 'Stage: Stage 133; Kind: superpowers-comparative-evidence-matrix; pass=true', 'Target: fork/superpowers; root=fork/superpowers', '- session_start_bootstrap:', '- skill_trigger_discipline:', '- daily_user_friction:', 'Parity gaps:', 'Vibecoding advantages:', 'Borrowable patterns:', 'Do not copy:', 'Recommended stage sequence:', 'Next comparison bet:', 'Boundary: writes=false; superpowers_comparison_artifact=false; comparison_matrix_artifact=false; source_write=false; sidecar_write=false; state_directory_created=false; command_execution=false; check_execution=false; smoke_execution=false; test_execution=false; verification_execution=false; hook_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; auto_execution=false; repair_execution=false; prompt_mutation=false; hook_registration=false; dynamic_tool_execution=false; embeddings=false; remote_config=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; git=false; git_write=false; git_add=false; commit=false; pr=false; push=false; merge=false; business_source_write=false', 'Superpowers comparison digest:'],
|
|
443
|
+
}, options);
|
|
444
|
+
if (fs.existsSync(unexpectedState)) throw new Error('governance --superpowers-comparison text output created unexpected state directory');
|
|
445
|
+
|
|
446
|
+
const compatibilityEnvelope = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--from-superpowers', 'fork/superpowers', '--json', '--root', '.'], {}, options), 'governance --superpowers-comparison --from-superpowers --json');
|
|
447
|
+
if (compatibilityEnvelope.superpowers_comparison_matrix?.stage !== 'Stage 133') throw new Error('governance --superpowers-comparison should accept --from-superpowers compatibility input');
|
|
448
|
+
|
|
449
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--from-superpowers-root', 'fork/superpowers'], ['--root', '.'], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'governance --superpowers-comparison is read-only and report-only', options);
|
|
450
|
+
|
|
451
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--root', '.'], {
|
|
452
|
+
allowFailure: true,
|
|
453
|
+
expectOutput: ['governance --superpowers-comparison requires --from-superpowers-root <local-superpowers-root>'],
|
|
454
|
+
}, options);
|
|
455
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--from-superpowers-root', '../superpowers', '--root', '.'], {
|
|
456
|
+
allowFailure: true,
|
|
457
|
+
expectOutput: ['governance --superpowers-comparison --from-superpowers-root must stay within --root'],
|
|
458
|
+
}, options);
|
|
459
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--from-superpowers-root', 'missing-superpowers', '--root', '.'], {
|
|
460
|
+
allowFailure: true,
|
|
461
|
+
expectOutput: ['governance --superpowers-comparison --from-superpowers-root directory not found'],
|
|
462
|
+
}, options);
|
|
463
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-comparison', '--from-superpowers-root', 'fork/superpowers', '--from-file', 'README.md', '--root', '.'], {
|
|
464
|
+
allowFailure: true,
|
|
465
|
+
expectOutput: ['governance --superpowers-comparison only accepts --from-superpowers-root, --json, and --root'],
|
|
466
|
+
}, options);
|
|
467
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-superpowers-root', 'fork/superpowers', '--root', '.'], {
|
|
468
|
+
allowFailure: true,
|
|
469
|
+
expectOutput: ['governance --superpowers-gap requires --from-superpowers, not --from-superpowers-root'],
|
|
470
|
+
}, options);
|
|
471
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-regression-guard', '--from-superpowers-root', 'fork/superpowers', '--root', '.'], {
|
|
472
|
+
allowFailure: true,
|
|
473
|
+
expectOutput: ['governance --superpowers-regression-guard requires --from-superpowers, not --from-superpowers-root'],
|
|
474
|
+
}, options);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
export function runMethodologyCoverageMapSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
478
|
+
const unexpectedState = path.join(repoRoot, '.vibecoding-state');
|
|
479
|
+
|
|
480
|
+
const coverageEnvelope = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--from-superpowers-root', 'fork/superpowers', '--json', '--root', '.'], {}, options), 'methodology --coverage-map --json');
|
|
481
|
+
const coverage = coverageEnvelope.methodology_coverage_map || {};
|
|
482
|
+
assertJsonMarkers(readonlySmokeMarkers(coverageEnvelope, 'methodologyCoverage'), 'methodology --coverage-map --json');
|
|
483
|
+
if (!coverage.coverage_digest) throw new Error('methodology coverage map missing coverage_digest');
|
|
484
|
+
if (!coverage.source_bindings?.source_digest || !coverage.source_bindings?.superpowers_root_digest) throw new Error('methodology coverage map missing source binding digest');
|
|
485
|
+
if (coverage.methodology_coverage_map?.length !== 11) throw new Error('methodology coverage map pattern count mismatch');
|
|
486
|
+
for (const patternId of ['brainstorming', 'planning', 'writing_plans', 'tdd', 'debugging', 'review', 'completion', 'worktree_isolation', 'subagent_driven_development', 'writing_skills', 'contributor_pr_guardrails']) {
|
|
487
|
+
if (!coverage.methodology_coverage_map?.some((pattern) => pattern.id === patternId)) throw new Error(`methodology coverage map missing pattern: ${patternId}`);
|
|
488
|
+
}
|
|
489
|
+
if (!Array.isArray(coverage.covered_patterns)) throw new Error('methodology coverage covered_patterns must be a list');
|
|
490
|
+
if (!Array.isArray(coverage.partial_patterns)) throw new Error('methodology coverage partial_patterns must be a list');
|
|
491
|
+
if (!Array.isArray(coverage.missing_patterns)) throw new Error('methodology coverage missing_patterns must be a list');
|
|
492
|
+
if (!coverage.vibecoding_specific_patterns?.some((item) => item.id === 'local_runtime_contracts')) throw new Error('methodology coverage missing local runtime contract pattern');
|
|
493
|
+
if (!coverage.vibecoding_specific_patterns?.some((item) => item.id === 'token_savior_budget')) throw new Error('methodology coverage missing Token Savior pattern');
|
|
494
|
+
if (!coverage.vibecoding_specific_patterns?.some((item) => item.id === 'experience_dashboard')) throw new Error('methodology coverage missing experience dashboard pattern');
|
|
495
|
+
if (!coverage.coverage_summary || coverage.coverage_summary.total_patterns !== 11) throw new Error('methodology coverage summary mismatch');
|
|
496
|
+
if (!coverage.next_coverage_bet?.target_stage) throw new Error('methodology coverage missing next coverage bet');
|
|
497
|
+
if (fs.existsSync(unexpectedState)) throw new Error('methodology --coverage-map JSON output created unexpected state directory');
|
|
498
|
+
|
|
499
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--from-superpowers-root', 'fork/superpowers', '--root', '.'], {
|
|
500
|
+
expectOutput: ['Vibecoding Runtime Methodology Coverage Map', 'Stage: Stage 136; Kind: methodology-coverage-map; pass=true', 'Target: fork/superpowers; root=fork/superpowers', 'Coverage summary:', '- brainstorming:', '- writing_plans:', '- contributor_pr_guardrails:', 'Covered patterns:', 'Partial patterns:', 'Missing patterns:', 'Vibecoding-specific patterns:', 'Next coverage bet:', 'Boundary: writes=false; methodology_coverage_artifact=false; coverage_map_artifact=false; source_write=false; sidecar_write=false; state_directory_created=false; command_execution=false; check_execution=false; smoke_execution=false; test_execution=false; verification_execution=false; hook_execution=false; adapter_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; auto_execution=false; repair_execution=false; prompt_mutation=false; skill_mutation=false; hook_registration=false; dynamic_tool_execution=false; embeddings=false; remote_config=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; git=false; git_write=false; git_add=false; commit=false; pr=false; push=false; merge=false; business_source_write=false', 'Coverage digest:'],
|
|
501
|
+
}, options);
|
|
502
|
+
if (fs.existsSync(unexpectedState)) throw new Error('methodology --coverage-map text output created unexpected state directory');
|
|
503
|
+
|
|
504
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--from-superpowers-root', 'fork/superpowers'], ['--root', '.'], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'methodology --coverage-map is read-only and report-only', options);
|
|
505
|
+
|
|
506
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--root', '.'], {
|
|
507
|
+
allowFailure: true,
|
|
508
|
+
expectOutput: ['methodology --coverage-map requires --from-superpowers-root <local-superpowers-root>'],
|
|
509
|
+
}, options);
|
|
510
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--from-superpowers-root', '../superpowers', '--root', '.'], {
|
|
511
|
+
allowFailure: true,
|
|
512
|
+
expectOutput: ['methodology --coverage-map --from-superpowers-root must stay within --root'],
|
|
513
|
+
}, options);
|
|
514
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--from-superpowers-root', 'missing-superpowers', '--root', '.'], {
|
|
515
|
+
allowFailure: true,
|
|
516
|
+
expectOutput: ['methodology --coverage-map --from-superpowers-root directory not found'],
|
|
517
|
+
}, options);
|
|
518
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--from-superpowers-root', 'fork/superpowers', '--from-file', 'README.md', '--root', '.'], {
|
|
519
|
+
allowFailure: true,
|
|
520
|
+
expectOutput: ['methodology --coverage-map only accepts --from-superpowers-root, --json, and --root'],
|
|
521
|
+
}, options);
|
|
522
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'methodology', '--coverage-map', '--from-superpowers', 'fork/superpowers', '--root', '.'], {
|
|
523
|
+
allowFailure: true,
|
|
524
|
+
expectOutput: ['--from-superpowers is only supported by governance --superpowers-gap, governance --superpowers-comparison, or governance --superpowers-regression-guard'],
|
|
525
|
+
}, options);
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
export function runEntryTriggerDisciplineSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
529
|
+
const target = '.tmp/vibe-entry-trigger-discipline';
|
|
530
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
531
|
+
const goodFile = path.join(target, 'good-transcript.json');
|
|
532
|
+
const badFile = path.join(target, 'bad-transcript.json');
|
|
533
|
+
|
|
534
|
+
try {
|
|
535
|
+
writeSmokeJsonFixture(repoRoot, goodFile, stage135GoodTranscriptFixture());
|
|
536
|
+
writeSmokeJsonFixture(repoRoot, badFile, stage135BadTranscriptFixture());
|
|
537
|
+
|
|
538
|
+
const discipline = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-discipline', '--from-transcript', goodFile, '--intent', 'feature', '--json', '--root', target], {}, options), 'workflow --entry-discipline --json');
|
|
539
|
+
const entry = discipline.entry_trigger_discipline || {};
|
|
540
|
+
assertJsonMarkers(readonlySmokeMarkers(discipline, 'entryTriggerDiscipline'), 'workflow --entry-discipline --json');
|
|
541
|
+
if (!entry.discipline_digest) throw new Error('entry trigger discipline missing discipline_digest');
|
|
542
|
+
for (const gate of ['using_vibecoding_first', 'protocol_layers_declared', 'intent_route_match', 'no_direct_implementation_jump', 'no_blind_bug_fix', 'no_false_skill_claim', 'no_forbidden_trigger']) {
|
|
543
|
+
if (!entry.trigger_results?.some((result) => result.gate === gate && result.pass === true)) throw new Error(`entry trigger discipline missing passing gate ${gate}`);
|
|
544
|
+
}
|
|
545
|
+
assertNoSmokeState(repoRoot, target, 'workflow --entry-discipline JSON output');
|
|
546
|
+
|
|
547
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-discipline', '--from-transcript', goodFile, '--intent', 'feature', '--root', target], {
|
|
548
|
+
expectOutput: ['Vibecoding Runtime Entry Trigger Discipline Contract', 'Stage: Stage 135; Kind: entry-trigger-discipline-contract; pass=true', 'Intent: feature; Transcript: good-transcript.json', 'Expected route:', '- using_vibecoding_first: pass=true', '- protocol_layers_declared: pass=true', '- intent_route_match: pass=true', 'Boundary: writes=false; entry_discipline_artifact=false; transcript_write=false; source_write=false; sidecar_write=false; state_directory_created=false; command_execution=false; check_execution=false; test_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; auto_execution=false; git=false; git_write=false; git_add=false; commit=false; pr=false; push=false; merge=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; business_source_write=false', 'Entry discipline digest:'],
|
|
549
|
+
}, options);
|
|
550
|
+
assertNoSmokeState(repoRoot, target, 'workflow --entry-discipline text output');
|
|
551
|
+
|
|
552
|
+
const rejected = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-discipline', '--from-transcript', badFile, '--intent', 'debug', '--json', '--root', target], {}, options), 'workflow --entry-discipline rejected --json');
|
|
553
|
+
if (rejected.ok !== false) throw new Error('entry trigger discipline should reject blind bug fix transcript');
|
|
554
|
+
if (!rejected.entry_trigger_discipline?.missed_workflow_risks?.some((risk) => risk.includes('using_vibecoding_first') || risk.includes('no_blind_bug_fix'))) throw new Error('entry trigger discipline rejected transcript missing workflow risk');
|
|
555
|
+
|
|
556
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-discipline', '--from-transcript', goodFile, '--intent', 'feature'], ['--root', target], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'workflow read-only modes do not accept execution', options);
|
|
557
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-discipline', '--root', target], {
|
|
558
|
+
allowFailure: true,
|
|
559
|
+
expectOutput: ['workflow --entry-discipline requires --from-transcript'],
|
|
560
|
+
}, options);
|
|
561
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-discipline', '--from-transcript', 'package.json', '--root', target], {
|
|
562
|
+
allowFailure: true,
|
|
563
|
+
expectOutput: ['workflow --entry-discipline transcript must be inside root'],
|
|
564
|
+
}, options);
|
|
565
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-discipline', '--from-transcript', goodFile, '--from-file', goodFile, '--root', target], {
|
|
566
|
+
allowFailure: true,
|
|
567
|
+
expectOutput: ['workflow --entry-discipline only accepts --from-transcript'],
|
|
568
|
+
}, options);
|
|
569
|
+
} finally {
|
|
570
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
export function runSessionStartShapeSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
575
|
+
const target = '.tmp/vibe-session-start-shape';
|
|
576
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
577
|
+
const claudeFile = path.join(target, 'claude-session-start.json');
|
|
578
|
+
const cursorFile = path.join(target, 'cursor-session-start.json');
|
|
579
|
+
const codexFile = path.join(target, 'codex-session-start.json');
|
|
580
|
+
const cursorSdkFile = path.join(target, 'cursor-sdk-session-start.json');
|
|
581
|
+
const badFile = path.join(target, 'bad-session-start.json');
|
|
582
|
+
const missingSemanticFile = path.join(target, 'missing-semantic-session-start.json');
|
|
583
|
+
const fullSkillFile = path.join(target, 'full-skill-session-start.json');
|
|
584
|
+
const hiddenExecutionFile = path.join(target, 'hidden-execution-session-start.json');
|
|
585
|
+
|
|
586
|
+
try {
|
|
587
|
+
writeSmokeJsonFixture(repoRoot, claudeFile, stage134ClaudeSessionStartFixture());
|
|
588
|
+
writeSmokeJsonFixture(repoRoot, cursorFile, stage134CursorSessionStartFixture());
|
|
589
|
+
writeSmokeJsonFixture(repoRoot, codexFile, stage134CodexSessionStartFixture());
|
|
590
|
+
writeSmokeJsonFixture(repoRoot, cursorSdkFile, stage134CursorSdkSessionStartFixture());
|
|
591
|
+
writeSmokeJsonFixture(repoRoot, badFile, stage134BadSessionStartFixture());
|
|
592
|
+
writeSmokeJsonFixture(repoRoot, missingSemanticFile, stage134MissingSemanticFieldsSessionStartFixture());
|
|
593
|
+
writeSmokeJsonFixture(repoRoot, fullSkillFile, stage134FullSkillInjectionSessionStartFixture());
|
|
594
|
+
writeSmokeJsonFixture(repoRoot, hiddenExecutionFile, stage134HiddenExecutionSessionStartFixture());
|
|
595
|
+
|
|
596
|
+
const shape = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', claudeFile, '--adapter', 'claude', '--json', '--root', target], {}, options), 'platforms --session-start-shape --json');
|
|
597
|
+
const acceptance = shape.session_start_shape_acceptance || {};
|
|
598
|
+
assertJsonMarkers(readonlySmokeMarkers(shape, 'sessionStartShape'), 'platforms --session-start-shape --json');
|
|
599
|
+
if (!acceptance.shape_digest) throw new Error('session-start shape acceptance missing shape_digest');
|
|
600
|
+
for (const gate of ['adapter_output_shape', 'context_present', 'using_vibecoding_marker', 'lightweight_routing_marker', 'semantic_field_markers', 'context_policy_marker', 'boundary_declaration_marker', 'no_full_skill_injection', 'no_execution_claims', 'no_forbidden_trigger']) {
|
|
601
|
+
if (!acceptance.shape_results?.some((result) => result.gate === gate && result.pass === true)) throw new Error(`session-start shape acceptance missing passing gate ${gate}`);
|
|
602
|
+
}
|
|
603
|
+
assertNoSmokeState(repoRoot, target, 'platforms --session-start-shape JSON output');
|
|
604
|
+
|
|
605
|
+
const cursorShape = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', cursorFile, '--adapter', 'cursor', '--json', '--root', target], {}, options), 'platforms --session-start-shape cursor --json');
|
|
606
|
+
if (cursorShape.session_start_shape_acceptance?.output_summary?.context_path !== 'additional_context') throw new Error('cursor session-start shape should use additional_context');
|
|
607
|
+
const codexShape = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', codexFile, '--adapter', 'codex', '--json', '--root', target], {}, options), 'platforms --session-start-shape codex --json');
|
|
608
|
+
if (codexShape.session_start_shape_acceptance?.output_summary?.context_path !== 'additionalContext') throw new Error('codex session-start shape should use additionalContext');
|
|
609
|
+
const cursorSdkShape = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', cursorSdkFile, '--adapter', 'cursor-sdk', '--json', '--root', target], {}, options), 'platforms --session-start-shape cursor-sdk --json');
|
|
610
|
+
if (cursorSdkShape.session_start_shape_acceptance?.output_summary?.context_path !== 'additionalContext') throw new Error('cursor-sdk session-start shape should use additionalContext');
|
|
611
|
+
for (const [label, acceptedShape] of [['cursor', cursorShape], ['codex', codexShape], ['cursor-sdk', cursorSdkShape]]) {
|
|
612
|
+
const accepted = acceptedShape.session_start_shape_acceptance || {};
|
|
613
|
+
if (accepted.accepted !== true || accepted.ok !== true) throw new Error(`${label} session-start shape should be accepted`);
|
|
614
|
+
for (const marker of ['selected_skill', 'visible_route', 'next_manual_action', 'context_policy', 'no_execution_claims']) {
|
|
615
|
+
if (accepted.context_markers?.[marker] !== true) throw new Error(`${label} session-start shape missing ${marker}`);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', cursorFile, '--adapter', 'cursor', '--root', target], {
|
|
620
|
+
expectOutput: ['Stage: Stage 134; Acceptance: session-start-shape-acceptance; accepted=true', 'Adapter: cursor; Context path: additional_context', '- adapter_output_shape: pass=true', '- using_vibecoding_marker: pass=true', '- no_forbidden_trigger: pass=true'],
|
|
621
|
+
}, options);
|
|
622
|
+
assertNoSmokeState(repoRoot, target, 'platforms --session-start-shape text output');
|
|
623
|
+
|
|
624
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', claudeFile, '--adapter', 'claude'], ['--root', target], RUNTIME_READ_ONLY_FORBIDDEN_FLAGS, 'platforms --session-start-shape is read-only', options);
|
|
625
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--root', target], {
|
|
626
|
+
allowFailure: true,
|
|
627
|
+
expectOutput: ['platforms --session-start-shape requires --from-file'],
|
|
628
|
+
}, options);
|
|
629
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', claudeFile, '--root', target], {
|
|
630
|
+
allowFailure: true,
|
|
631
|
+
expectOutput: ['platforms --session-start-shape requires --adapter'],
|
|
632
|
+
}, options);
|
|
633
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', '../outside.json', '--adapter', 'claude', '--root', target], {
|
|
634
|
+
allowFailure: true,
|
|
635
|
+
expectOutput: ['session-start captured output must be inside root'],
|
|
636
|
+
}, options);
|
|
637
|
+
const rejected = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', badFile, '--adapter', 'cursor', '--json', '--root', target], {}, options), 'platforms --session-start-shape rejected markers --json');
|
|
638
|
+
if (rejected.ok !== false || !rejected.session_start_shape_acceptance?.blockers?.some((blocker) => blocker.includes('using_vibecoding_marker'))) throw new Error('session-start shape should reject missing using-vibecoding marker');
|
|
639
|
+
const missingSemantic = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', missingSemanticFile, '--adapter', 'codex', '--json', '--root', target], {}, options), 'platforms --session-start-shape missing semantic fields --json');
|
|
640
|
+
if (missingSemantic.ok !== false || !missingSemantic.session_start_shape_acceptance?.blockers?.some((blocker) => blocker.includes('semantic_field_markers'))) throw new Error('session-start shape should reject missing selected skill, visible route, or next manual action');
|
|
641
|
+
const fullSkill = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', fullSkillFile, '--adapter', 'cursor-sdk', '--json', '--root', target], {}, options), 'platforms --session-start-shape full skill injection --json');
|
|
642
|
+
if (fullSkill.ok !== false || !fullSkill.session_start_shape_acceptance?.blockers?.some((blocker) => blocker.includes('no_full_skill_injection'))) throw new Error('session-start shape should reject full skill injection');
|
|
643
|
+
const hiddenExecution = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--session-start-shape', '--from-file', hiddenExecutionFile, '--adapter', 'codex', '--json', '--root', target], {}, options), 'platforms --session-start-shape hidden execution --json');
|
|
644
|
+
if (hiddenExecution.ok !== false || !hiddenExecution.session_start_shape_acceptance?.blockers?.some((blocker) => blocker.includes('no_execution_claims') || blocker.includes('no_forbidden_trigger'))) throw new Error('session-start shape should reject hidden execution or command execution claims');
|
|
645
|
+
} finally {
|
|
646
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
export function runStageScriptletSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
651
|
+
const target = '.tmp/vibe-stage-scriptlet';
|
|
652
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
653
|
+
const runbookFile = path.join(target, 'stage118-runbook.json');
|
|
654
|
+
const consoleFile = path.join(target, 'stage127-console.json');
|
|
655
|
+
|
|
656
|
+
try {
|
|
657
|
+
fs.writeFileSync(path.join(repoRoot, runbookFile), `${JSON.stringify({
|
|
658
|
+
sequential_stage_runbook: {
|
|
659
|
+
stage: 'Stage 118',
|
|
660
|
+
runbook_kind: 'sequential-stage-runbook',
|
|
661
|
+
ready_for_evidence_binding: true,
|
|
662
|
+
blocked_reasons: [],
|
|
663
|
+
evidence_required: ['syntax check output', 'runtime-check Result: passed', '.vibecoding-state absent'],
|
|
664
|
+
stage_runbook_digest: 'fixture-stage118-runbook-digest',
|
|
665
|
+
stage_sequence: [
|
|
666
|
+
{
|
|
667
|
+
stage_id: 'stage130-fixture-01',
|
|
668
|
+
title: 'Stage 130 fixture implementation',
|
|
669
|
+
sequence_index: 1,
|
|
670
|
+
files_to_change: ['tools/vibe-runtime/runtime-stage-scriptlet.mjs', 'tools/vibe-runtime/index.mjs'],
|
|
671
|
+
validation_commands: [
|
|
672
|
+
'node --check tools/vibe-runtime/runtime-stage-scriptlet.mjs',
|
|
673
|
+
'node tools/vibe-runtime-check/index.mjs --root D:/workspace_mine/vibe-coading',
|
|
674
|
+
'powershell -NoProfile -Command "Test-Path .vibecoding-state"',
|
|
675
|
+
],
|
|
676
|
+
evidence_required: ['exit_code=0 for syntax check', 'Result: passed', 'False'],
|
|
677
|
+
stop_if: ['runtime-check fails', 'state directory appears'],
|
|
678
|
+
commit_subject: 'stage 130: add copy-ready stage scriptlet',
|
|
679
|
+
execution_authorized: false,
|
|
680
|
+
actions_executed: false,
|
|
681
|
+
command_execution_authorized: false,
|
|
682
|
+
git_write_authorized: false,
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
stage_id: 'stage130-fixture-02',
|
|
686
|
+
title: 'Stage 130 follow-up docs',
|
|
687
|
+
sequence_index: 2,
|
|
688
|
+
files_to_change: ['tools/vibe-runtime/README.md'],
|
|
689
|
+
validation_commands: ['git diff --check'],
|
|
690
|
+
evidence_required: ['exit_code=0'],
|
|
691
|
+
stop_if: ['whitespace check fails'],
|
|
692
|
+
commit_subject: 'stage 130 docs follow-up',
|
|
693
|
+
execution_authorized: false,
|
|
694
|
+
actions_executed: false,
|
|
695
|
+
command_execution_authorized: false,
|
|
696
|
+
git_write_authorized: false,
|
|
697
|
+
},
|
|
698
|
+
],
|
|
699
|
+
},
|
|
700
|
+
}, null, 2)}\n`, 'utf8');
|
|
701
|
+
fs.writeFileSync(path.join(repoRoot, consoleFile), `${JSON.stringify({
|
|
702
|
+
next_action_console: {
|
|
703
|
+
stage: 'Stage 127',
|
|
704
|
+
console_kind: 'one-screen-next-action-console',
|
|
705
|
+
console_digest: 'fixture-stage127-console-digest',
|
|
706
|
+
recommended_next_action: { id: 'prepare-copy-ready-scriptlet', action: 'Generate a copy-ready scriptlet preview.' },
|
|
707
|
+
copy_ready_command_preview: [
|
|
708
|
+
{ id: 'runtime-check-preview', command: 'node tools/vibe-runtime-check/index.mjs --root D:/workspace_mine/vibe-coading', preview_only: true },
|
|
709
|
+
],
|
|
710
|
+
evidence_needed_next: [{ id: 'runtime-check', reason: 'Result: passed marker required' }],
|
|
711
|
+
do_not_do_yet: ['do not git commit before Stage 119/120 evidence binding'],
|
|
712
|
+
},
|
|
713
|
+
}, null, 2)}\n`, 'utf8');
|
|
714
|
+
|
|
715
|
+
const scriptlet = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-scriptlet', '--from-runbook', runbookFile, '--from-console', consoleFile, '--stage', 'stage130-fixture-01', '--json', '--root', target], {}, options), 'automation --stage-scriptlet --json');
|
|
716
|
+
assertJsonMarkers(readonlySmokeMarkers(scriptlet, 'stageScriptlet'), 'automation --stage-scriptlet --json');
|
|
717
|
+
if (!scriptlet.stage_scriptlet?.scriptlet_digest) throw new Error('stage scriptlet missing scriptlet_digest');
|
|
718
|
+
if (!scriptlet.stage_scriptlet?.powershell_commands?.some((command) => command.includes('node --check tools/vibe-runtime/runtime-stage-scriptlet.mjs'))) throw new Error('stage scriptlet missing syntax check PowerShell command');
|
|
719
|
+
if (!scriptlet.stage_scriptlet?.expected_markers?.includes('Result: passed')) throw new Error('stage scriptlet missing runtime-check expected marker');
|
|
720
|
+
if (!scriptlet.stage_scriptlet?.evidence_capture_template?.evidence_items?.length) throw new Error('stage scriptlet missing evidence capture items');
|
|
721
|
+
if (scriptlet.stage_scriptlet?.scriptlet_steps?.some((step) => step.preview_only !== true || step.execution_authorized !== false || step.actions_executed !== false || step.evidence_written !== false)) throw new Error('stage scriptlet produced executable step');
|
|
722
|
+
assertNoSmokeState(repoRoot, target, 'automation --stage-scriptlet JSON output');
|
|
723
|
+
|
|
724
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-scriptlet', '--from-runbook', runbookFile, '--root', target], {
|
|
725
|
+
expectOutput: ['Vibecoding Runtime Copy-ready Stage Execution Scriptlet', 'Stage: Stage 130; Kind: copy-ready-stage-execution-scriptlet; pass=true', 'PowerShell commands', 'Expected markers', 'Stop if', 'Evidence template:', 'Boundary: writes=false; stage_scriptlet_artifact=false; scriptlet_artifact=false; evidence_write=false; sidecar_write=false; state_directory_created=false; command_execution=false; check_execution=false; smoke_execution=false; test_execution=false; validation_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; git=false; git_write=false; git_add=false; commit=false; pr=false; push=false; merge=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; business_source_write=false', 'Stage scriptlet digest:'],
|
|
726
|
+
}, options);
|
|
727
|
+
assertNoSmokeState(repoRoot, target, 'automation --stage-scriptlet text output');
|
|
728
|
+
|
|
729
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'automation', '--stage-scriptlet', '--from-runbook', runbookFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW, 'automation --stage-scriptlet is read-only', options);
|
|
730
|
+
|
|
731
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-scriptlet', '--root', target], {
|
|
732
|
+
allowFailure: true,
|
|
733
|
+
expectOutput: ['automation --stage-scriptlet requires --from-runbook <local-runbook-json>'],
|
|
734
|
+
}, options);
|
|
735
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-scriptlet', '--from-runbook', '../outside.json', '--root', target], {
|
|
736
|
+
allowFailure: true,
|
|
737
|
+
expectOutput: ['automation --stage-scriptlet --from-runbook must stay within --root'],
|
|
738
|
+
}, options);
|
|
739
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-scriptlet', '--from-runbook', runbookFile, '--from-console', '../outside.json', '--root', target], {
|
|
740
|
+
allowFailure: true,
|
|
741
|
+
expectOutput: ['automation --stage-scriptlet --from-console must stay within --root'],
|
|
742
|
+
}, options);
|
|
743
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-scriptlet', '--from-runbook', runbookFile, '--from-plan', runbookFile, '--root', target], {
|
|
744
|
+
allowFailure: true,
|
|
745
|
+
expectOutput: ['automation --stage-scriptlet only accepts one local runbook file'],
|
|
746
|
+
}, options);
|
|
747
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-runbook', '--from-plan', runbookFile, '--from-console', consoleFile, '--root', target], {
|
|
748
|
+
allowFailure: true,
|
|
749
|
+
expectOutput: ['automation --stage-runbook only accepts one local plan file'],
|
|
750
|
+
}, options);
|
|
751
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--next-action-console', '--from-runbook', runbookFile, '--root', target], {
|
|
752
|
+
allowFailure: true,
|
|
753
|
+
expectOutput: ['workflow --next-action-console requires --from-friction <local-friction-json>'],
|
|
754
|
+
}, options);
|
|
755
|
+
} finally {
|
|
756
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
function experienceLearningPatternUnsupportedCases({ target, frictionFile, observationFile }) {
|
|
761
|
+
return [
|
|
762
|
+
{
|
|
763
|
+
args: ['tools/vibe-runtime/index.mjs', 'learning', '--experience-pattern', '--root', target],
|
|
764
|
+
expected: 'learning --experience-pattern requires --from-friction <local-friction-json>',
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
args: ['tools/vibe-runtime/index.mjs', 'learning', '--experience-pattern', '--from-friction', '../outside.json', '--root', target],
|
|
768
|
+
expected: 'learning --experience-pattern --from-friction must stay within --root',
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
args: ['tools/vibe-runtime/index.mjs', 'learning', '--experience-pattern', '--from-friction', frictionFile, '--from-file', frictionFile, '--root', target],
|
|
772
|
+
expected: 'learning --experience-pattern only accepts --from-friction and optional --from-observations',
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
args: ['tools/vibe-runtime/index.mjs', 'learning', '--advice', '--from-friction', frictionFile, '--root', target],
|
|
776
|
+
expected: '--from-friction is only supported by learning --experience-pattern',
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--experience-friction', '--from-observations', observationFile, '--root', target],
|
|
780
|
+
expected: '--from-observations is only supported by learning --instincts, learning --advice, or learning --experience-pattern',
|
|
781
|
+
},
|
|
782
|
+
];
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
function runExperienceLearningPatternUnsupportedCases(run, context, options) {
|
|
786
|
+
for (const { args, expected } of experienceLearningPatternUnsupportedCases(context)) {
|
|
787
|
+
run('node', args, {
|
|
788
|
+
allowFailure: true,
|
|
789
|
+
expectOutput: [expected],
|
|
790
|
+
}, options);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
export function runExperienceLearningPatternSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
795
|
+
const target = '.tmp/vibe-experience-learning-pattern';
|
|
796
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
797
|
+
const frictionFile = path.join(target, 'stage126-friction.json');
|
|
798
|
+
const evidenceFile = path.join(target, 'stage61-session-evidence.json');
|
|
799
|
+
|
|
800
|
+
try {
|
|
801
|
+
writeSmokeJsonFixture(repoRoot, frictionFile, stage129FrictionFixture());
|
|
802
|
+
|
|
803
|
+
const pattern = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'learning', '--experience-pattern', '--from-friction', frictionFile, '--intent', 'workflow', '--json', '--root', target], {}, options), 'learning --experience-pattern --json');
|
|
804
|
+
assertJsonMarkers(readonlySmokeMarkers(pattern, 'experienceLearningPattern'), 'learning --experience-pattern --json');
|
|
805
|
+
if (!pattern.experience_learning_pattern?.experience_pattern_digest) throw new Error('experience learning pattern missing experience_pattern_digest');
|
|
806
|
+
if (!pattern.experience_learning_pattern?.candidate_experience_patterns?.some((item) => item.id === 'visible-next-action-instinct' && item.preview_only === true && item.auto_apply === false)) throw new Error('experience learning pattern missing visible next-action candidate');
|
|
807
|
+
for (const skill of ['vibe-writing-skills', 'vibe-writing-plans', 'vibe-test-driven-development']) {
|
|
808
|
+
if (!pattern.experience_learning_pattern?.required_workflow?.includes(skill)) throw new Error(`experience learning pattern missing required workflow ${skill}`);
|
|
809
|
+
}
|
|
810
|
+
assertNoSmokeState(repoRoot, target, 'learning --experience-pattern JSON output');
|
|
811
|
+
|
|
812
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'learning', '--experience-pattern', '--from-friction', frictionFile, '--root', target], {
|
|
813
|
+
expectOutput: ['Vibecoding Runtime Experience Learning Pattern Gate', 'Stage: Stage 129; Kind: ecc-learning-experience-pattern-gate; pass=true', 'Repeat signal:', 'Suggested trigger:', 'Suggested action:', 'Candidate experience patterns', 'Promotion required: true; workflow=vibe-writing-skills -> vibe-writing-plans -> vibe-test-driven-development', 'Boundary: writes=false; experience_pattern_artifact=false; learning_observation_write=false; candidate_instinct_write=false; learning_promotion_write=false; skill_write=false; writes_formal_skills=false; writes_agents_md=false; writes_claude_md=false; prompt_mutation=false; hook_registration=false; command_execution=false; workflow_execution=false; skill_execution=false; runtime_action=false; automatic_promotion=false; agent_first_delegation=false; git=false; git_write=false; commit=false; pr=false; push=false; merge=false; platform_api=false; external_network=false; model_invocation=false; subagent=false; mcp=false; business_source_write=false', 'Experience pattern digest:'],
|
|
814
|
+
}, options);
|
|
815
|
+
assertNoSmokeState(repoRoot, target, 'learning --experience-pattern text output');
|
|
816
|
+
|
|
817
|
+
writeSmokeJsonFixture(repoRoot, evidenceFile, stage129LearningEvidenceFixture());
|
|
818
|
+
const observation = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'learning', '--observe', '--from-file', evidenceFile, '--confirm', '--json', '--root', target], {}, options), 'learning --observe --confirm --json');
|
|
819
|
+
const observationFile = observation.learning_file;
|
|
820
|
+
if (!observationFile || !observationFile.endsWith('.learning-observation.json')) throw new Error('learning observation setup did not return learning_file');
|
|
821
|
+
const withObservation = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'learning', '--experience-pattern', '--from-friction', frictionFile, '--from-observations', observationFile, '--json', '--root', target], {}, options), 'learning --experience-pattern --from-observations --json');
|
|
822
|
+
assertJsonMarkers([
|
|
823
|
+
['experience_learning_pattern.observation_summary.provided', withObservation.experience_learning_pattern?.observation_summary?.provided, true],
|
|
824
|
+
['experience_learning_pattern.observation_summary.observation_count', withObservation.experience_learning_pattern?.observation_summary?.observation_count, 1],
|
|
825
|
+
['experience_learning_pattern.repeat_signal.repeated_workflow_count', withObservation.experience_learning_pattern?.repeat_signal?.repeated_workflow_count, 3],
|
|
826
|
+
['experience_learning_pattern.repeat_signal.correction_count', withObservation.experience_learning_pattern?.repeat_signal?.correction_count, 1],
|
|
827
|
+
], 'learning --experience-pattern --from-observations --json');
|
|
828
|
+
if (!withObservation.experience_learning_pattern?.candidate_experience_patterns?.some((item) => item.id === 'repeat-signal-learning-gate')) throw new Error('experience learning pattern missing repeat-signal candidate with observation input');
|
|
829
|
+
|
|
830
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'learning', '--experience-pattern', '--from-friction', frictionFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW, 'learning --experience-pattern is read-only', options);
|
|
831
|
+
runExperienceLearningPatternUnsupportedCases(run, { target, frictionFile, observationFile }, options);
|
|
832
|
+
} finally {
|
|
833
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
export function runAdapterBootstrapMatrixSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
838
|
+
const target = '.tmp/vibe-adapter-bootstrap-matrix';
|
|
839
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
840
|
+
|
|
841
|
+
try {
|
|
842
|
+
const matrix = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--bootstrap-matrix', '--json', '--root', repoRoot], {}, options), 'platforms --bootstrap-matrix --json');
|
|
843
|
+
assertJsonMarkers(readonlySmokeMarkers(matrix, 'adapterBootstrapMatrix'), 'platforms --bootstrap-matrix --json');
|
|
844
|
+
if (!matrix.adapter_bootstrap_matrix?.matrix_digest) throw new Error('adapter bootstrap matrix missing matrix_digest');
|
|
845
|
+
for (const adapter of ['claude', 'cursor', 'codex']) {
|
|
846
|
+
const row = matrix.adapter_bootstrap_matrix?.adapter_rows?.find((item) => item.adapter === adapter);
|
|
847
|
+
if (!row) throw new Error(`adapter bootstrap matrix missing ${adapter} row`);
|
|
848
|
+
if (row.pass !== true) throw new Error(`adapter bootstrap matrix ${adapter} row did not pass`);
|
|
849
|
+
if (row.bootstrap_policy?.injectsFullSkill !== false) throw new Error(`${adapter} row missing injectsFullSkill=false`);
|
|
850
|
+
if (row.bootstrap_policy?.writesRuntimeState !== false) throw new Error(`${adapter} row missing writesRuntimeState=false`);
|
|
851
|
+
if (row.bootstrap_policy?.autoRunsNextSkill !== false) throw new Error(`${adapter} row missing autoRunsNextSkill=false`);
|
|
852
|
+
if (row.runtime_bridge?.canAutoExecuteSkill !== false) throw new Error(`${adapter} row missing canAutoExecuteSkill=false`);
|
|
853
|
+
if (row.runtime_bridge?.canCallSubagent !== false) throw new Error(`${adapter} row missing canCallSubagent=false`);
|
|
854
|
+
if (row.runtime_bridge?.canTouchGit !== false) throw new Error(`${adapter} row missing canTouchGit=false`);
|
|
855
|
+
}
|
|
856
|
+
assertNoSmokeState(repoRoot, target, 'platforms --bootstrap-matrix JSON output');
|
|
857
|
+
|
|
858
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'platforms', '--bootstrap-matrix', '--root', repoRoot], {
|
|
859
|
+
expectOutput: ['Vibecoding Runtime Platform Capability', 'Mode: adapter-bootstrap-conformance-matrix', 'Stage: Stage 122; Matrix: adapter-bootstrap-conformance-matrix; pass=true', 'injectsFullSkill=false', 'writesRuntimeState=false'],
|
|
860
|
+
}, options);
|
|
861
|
+
assertNoSmokeState(repoRoot, target, 'platforms --bootstrap-matrix text output');
|
|
862
|
+
|
|
863
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'platforms', '--bootstrap-matrix'], ['--root', repoRoot], ['--confirm', '--write', '--dry-run'], 'platforms --bootstrap-matrix is read-only', options);
|
|
864
|
+
} finally {
|
|
865
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
export function runSkillRuntimeTraceabilitySmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
870
|
+
const target = '.tmp/vibe-skill-runtime-traceability';
|
|
871
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
872
|
+
|
|
873
|
+
try {
|
|
874
|
+
const traceability = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--traceability-map', '--json', '--root', repoRoot], {}, options), 'governance --traceability-map --json');
|
|
875
|
+
assertJsonMarkers(readonlySmokeMarkers(traceability, 'skillRuntimeTraceability'), 'governance --traceability-map --json');
|
|
876
|
+
if (!traceability.skill_runtime_traceability_map?.traceability_digest) throw new Error('skill runtime traceability map missing traceability_digest');
|
|
877
|
+
if (traceability.skill_runtime_traceability_map?.skill_rows?.length !== 24) throw new Error('skill runtime traceability map expected 24 skill rows');
|
|
878
|
+
if (traceability.skill_runtime_traceability_map?.traceability_rows?.length !== 24) throw new Error('skill runtime traceability map expected 24 traceability rows');
|
|
879
|
+
for (const skill of ['using-vibecoding', 'vibe-product-discovery', 'vibe-product-spec', 'vibe-ui-design', 'vibe-product-acceptance', 'vibe-writing-plans', 'vibe-finishing-a-development-branch', 'vibe-writing-skills']) {
|
|
880
|
+
const row = traceability.skill_runtime_traceability_map?.traceability_rows?.find((item) => item.skill === skill);
|
|
881
|
+
if (!row) throw new Error(`skill runtime traceability map missing ${skill} row`);
|
|
882
|
+
if (row.pass !== true) throw new Error(`skill runtime traceability ${skill} row did not pass`);
|
|
883
|
+
if (!row.runtime_commands?.length) throw new Error(`skill runtime traceability ${skill} row missing runtime commands`);
|
|
884
|
+
}
|
|
885
|
+
assertNoSmokeState(repoRoot, target, 'governance --traceability-map JSON output');
|
|
886
|
+
|
|
887
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--traceability-map', '--root', repoRoot], {
|
|
888
|
+
expectOutput: ['Vibecoding Runtime Governance', 'Mode: skill-to-runtime-traceability-map', 'Stage: Stage 123; Map: skill-to-runtime-traceability-map; pass=true', 'Skills: 24; Links: 24', 'governance --traceability-map'],
|
|
889
|
+
}, options);
|
|
890
|
+
assertNoSmokeState(repoRoot, target, 'governance --traceability-map text output');
|
|
891
|
+
|
|
892
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'governance', '--traceability-map'], ['--root', repoRoot], ['--confirm', '--write', '--dry-run', '--run', '--once', '--scan'], 'governance --traceability-map is read-only', options);
|
|
893
|
+
} finally {
|
|
894
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
export function releaseCheckStage121136SmokeHandlers(deps) {
|
|
899
|
+
return {
|
|
900
|
+
runSuperpowersRegressionGuardSmoke: (options) => runSuperpowersRegressionGuardSmoke(deps, options),
|
|
901
|
+
runExperienceFrictionSmoke: (options) => runExperienceFrictionSmoke(deps, options),
|
|
902
|
+
runNextActionConsoleSmoke: (options) => runNextActionConsoleSmoke(deps, options),
|
|
903
|
+
runTokenSaviorBudgetSmoke: (options) => runTokenSaviorBudgetSmoke(deps, options),
|
|
904
|
+
runAdapterEntryAcceptanceSmoke: (options) => runAdapterEntryAcceptanceSmoke(deps, options),
|
|
905
|
+
runInstalledMultiroundUxSmoke: (options) => runInstalledMultiroundUxSmoke(deps, options),
|
|
906
|
+
runExperienceRegressionDashboardSmoke: (options) => runExperienceRegressionDashboardSmoke(deps, options),
|
|
907
|
+
runSuperpowersComparisonSmoke: (options) => runSuperpowersComparisonSmoke(deps, options),
|
|
908
|
+
runMethodologyCoverageMapSmoke: (options) => runMethodologyCoverageMapSmoke(deps, options),
|
|
909
|
+
runEntryTriggerDisciplineSmoke: (options) => runEntryTriggerDisciplineSmoke(deps, options),
|
|
910
|
+
runSessionStartShapeSmoke: (options) => runSessionStartShapeSmoke(deps, options),
|
|
911
|
+
runStageScriptletSmoke: (options) => runStageScriptletSmoke(deps, options),
|
|
912
|
+
runExperienceLearningPatternSmoke: (options) => runExperienceLearningPatternSmoke(deps, options),
|
|
913
|
+
runBehavioralEvaluationContractSmoke: (options) => runBehavioralEvaluationContractSmoke(deps, options),
|
|
914
|
+
runAdapterBootstrapMatrixSmoke: (options) => runAdapterBootstrapMatrixSmoke(deps, options),
|
|
915
|
+
runSkillRuntimeTraceabilitySmoke: (options) => runSkillRuntimeTraceabilitySmoke(deps, options),
|
|
916
|
+
};
|
|
917
|
+
}
|