@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,861 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
READ_ONLY_RUNTIME_CONTROL_FLAGS,
|
|
6
|
+
READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN,
|
|
7
|
+
READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN_SECOND,
|
|
8
|
+
READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW,
|
|
9
|
+
assertNoSmokeState,
|
|
10
|
+
cleanupSmokeTmpRoot,
|
|
11
|
+
prepareSmokeTmpRoot,
|
|
12
|
+
readonlySmokeMarkers,
|
|
13
|
+
runForbiddenFlagChecks,
|
|
14
|
+
writeSmokeJsonFixture,
|
|
15
|
+
} from './release-check-json-assertion-helpers.mjs';
|
|
16
|
+
import {
|
|
17
|
+
assertAutomationReadinessCatalog,
|
|
18
|
+
stage105PlanFixtureText,
|
|
19
|
+
stage106PlanFixtureText,
|
|
20
|
+
stage107PlanFixtureText,
|
|
21
|
+
stage108PlanFixtureText,
|
|
22
|
+
stage109CloseLoopDashboardPlanFixtureText,
|
|
23
|
+
stage110EvidenceIntakeFixture,
|
|
24
|
+
stage110EvidenceIntakePlanFixtureText,
|
|
25
|
+
stage111DiffCoverageExpectedFiles,
|
|
26
|
+
stage112ResolutionEvidenceFixture,
|
|
27
|
+
stage112ReviewFixture,
|
|
28
|
+
stage112ReviewPlanFixtureText,
|
|
29
|
+
stage113TddTraceFixture,
|
|
30
|
+
stage113TddTracePlanFixtureText,
|
|
31
|
+
stage114HumanFriendlyAliasPlanFixtureText,
|
|
32
|
+
stage115ProgressiveEntryUxGapFixture,
|
|
33
|
+
} from './release-check-stage103-118-fixtures.mjs';
|
|
34
|
+
import {
|
|
35
|
+
stage112ReviewIntakeJsonMarkers,
|
|
36
|
+
stage112ReviewIntakeTextExpectations,
|
|
37
|
+
stage112ReviewResolutionJsonMarkers,
|
|
38
|
+
stage112ReviewResolutionTextExpectations,
|
|
39
|
+
} from './release-check-stage103-118-smoke-specs.mjs';
|
|
40
|
+
|
|
41
|
+
export function runAutomationReadinessSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
42
|
+
const target = '.tmp/vibe-automation-readiness';
|
|
43
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const readiness = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--readiness', '--json', '--root', target], {}, options), 'automation --readiness --json');
|
|
47
|
+
assertJsonMarkers(readonlySmokeMarkers(readiness, 'automationReadiness'), 'automation --readiness --json');
|
|
48
|
+
if (!readiness.runtime_automation_readiness?.registry_digest) throw new Error('automation readiness missing registry_digest');
|
|
49
|
+
if (!readiness.runtime_automation_readiness?.readiness_digest) throw new Error('automation readiness missing readiness_digest');
|
|
50
|
+
assertAutomationReadinessCatalog(readiness.runtime_automation_readiness);
|
|
51
|
+
assertNoSmokeState(repoRoot, target, 'automation --readiness JSON output');
|
|
52
|
+
|
|
53
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--readiness', '--root', target], {
|
|
54
|
+
expectOutput: ['Vibecoding Runtime Automation Readiness Matrix', 'Stage: Stage 103; Kind: runtime-automation-readiness-matrix; pass=true', 'auto_safe:', 'confirm_required:', 'advice_only:', 'forbidden:', 'Transition: automation_readiness_only=true; automation_plan_created=false; one_shot_execution_created=false', 'Boundary: writes=false; automation_readiness_artifact=false; automation_plan_artifact=false; one_shot_execution_artifact=false', 'Readiness digest:'],
|
|
55
|
+
}, options);
|
|
56
|
+
assertNoSmokeState(repoRoot, target, 'automation --readiness text output');
|
|
57
|
+
|
|
58
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'automation', '--readiness'], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW, 'automation --readiness is read-only', options);
|
|
59
|
+
} finally {
|
|
60
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function runWorkflowLoopContractSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
65
|
+
const target = '.tmp/vibe-workflow-loop-contract';
|
|
66
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
const contract = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--loop-contract', '--intent', 'implementation', '--json', '--root', target], {}, options), 'workflow --loop-contract --intent implementation --json');
|
|
70
|
+
assertJsonMarkers(readonlySmokeMarkers(contract, 'workflowLoopContract'), 'workflow --loop-contract --intent implementation --json');
|
|
71
|
+
if (!contract.workflow_loop_contract?.loop_contract_digest) throw new Error('workflow loop contract missing loop_contract_digest');
|
|
72
|
+
if (!contract.workflow_loop_contract?.source_bindings?.workflow_start_digest) throw new Error('workflow loop contract missing workflow_start_digest');
|
|
73
|
+
if (!contract.workflow_loop_contract?.source_bindings?.workflow_sequence_digest) throw new Error('workflow loop contract missing workflow_sequence_digest');
|
|
74
|
+
if (!contract.workflow_loop_contract?.source_bindings?.automation_readiness_digest) throw new Error('workflow loop contract missing automation_readiness_digest');
|
|
75
|
+
if (!contract.workflow_loop_contract?.source_bindings?.registry_digest) throw new Error('workflow loop contract missing registry_digest');
|
|
76
|
+
assertNoSmokeState(repoRoot, target, 'workflow --loop-contract JSON output');
|
|
77
|
+
|
|
78
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--loop-contract', '--intent', 'implementation', '--root', target], {
|
|
79
|
+
expectOutput: ['Vibecoding Runtime Workflow Loop Contract', 'Stage: Stage 104; Kind: workflow-loop-contract; pass=true', 'Loop phases', 'plan', 'docs', 'code', 'self_test', 'commit_readiness', 'Boundary: writes=false; workflow_loop_contract_artifact=false; automation_plan_artifact=false', 'Loop contract digest:'],
|
|
80
|
+
}, options);
|
|
81
|
+
assertNoSmokeState(repoRoot, target, 'workflow --loop-contract text output');
|
|
82
|
+
|
|
83
|
+
const promptContract = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--loop-contract', '--prompt', '实现一个运行时闭环合同', '--json', '--root', target], {}, options), 'workflow --loop-contract --prompt --json');
|
|
84
|
+
assertJsonMarkers([
|
|
85
|
+
['mode', promptContract.mode, 'workflow-loop-contract'],
|
|
86
|
+
['workflow_loop_contract.stage', promptContract.workflow_loop_contract?.stage, 'Stage 104'],
|
|
87
|
+
['workflow_loop_contract.contract_kind', promptContract.workflow_loop_contract?.contract_kind, 'workflow-loop-contract'],
|
|
88
|
+
], 'workflow --loop-contract --prompt --json');
|
|
89
|
+
if (!promptContract.workflow_loop_contract?.loop_contract_digest) throw new Error('workflow loop contract prompt output missing digest');
|
|
90
|
+
|
|
91
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'workflow', '--loop-contract', '--intent', 'implementation'], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS, 'workflow read-only modes do not accept execution', options);
|
|
92
|
+
} finally {
|
|
93
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function runPlanActionManifestSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
98
|
+
const target = '.tmp/vibe-plan-action-manifest';
|
|
99
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
100
|
+
const planFile = path.join(target, 'stage105-plan.md');
|
|
101
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
fs.writeFileSync(absolutePlanFile, stage105PlanFixtureText());
|
|
105
|
+
|
|
106
|
+
const manifest = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--action-manifest', '--from-file', planFile, '--intent', 'implementation', '--json', '--root', target], {}, options), 'planner --action-manifest --json');
|
|
107
|
+
assertJsonMarkers(readonlySmokeMarkers(manifest, 'planActionManifest'), 'planner --action-manifest --json');
|
|
108
|
+
if (!manifest.plan_action_manifest?.plan_action_manifest_digest) throw new Error('plan action manifest missing plan_action_manifest_digest');
|
|
109
|
+
if (!manifest.plan_action_manifest?.source_bindings?.plan_lint_digest) throw new Error('plan action manifest missing plan_lint_digest');
|
|
110
|
+
if (!manifest.plan_action_manifest?.source_bindings?.workflow_loop_contract_digest) throw new Error('plan action manifest missing workflow_loop_contract_digest');
|
|
111
|
+
if (!manifest.plan_action_manifest?.source_bindings?.automation_readiness_digest) throw new Error('plan action manifest missing automation_readiness_digest');
|
|
112
|
+
if (!manifest.plan_action_manifest?.source_bindings?.registry_digest) throw new Error('plan action manifest missing registry_digest');
|
|
113
|
+
assertNoSmokeState(repoRoot, target, 'planner --action-manifest JSON output');
|
|
114
|
+
|
|
115
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--action-manifest', '--from-file', planFile, '--root', target], {
|
|
116
|
+
expectOutput: ['Vibecoding Runtime Plan-to-Action Manifest', 'Stage: Stage 105; Kind: plan-to-action-manifest; pass=true', 'Action items:', 'execution_authorized=false', 'Boundary: writes=false; plan_action_manifest_artifact=false; automation_plan_artifact=false', 'Plan action manifest digest:'],
|
|
117
|
+
}, options);
|
|
118
|
+
assertNoSmokeState(repoRoot, target, 'planner --action-manifest text output');
|
|
119
|
+
|
|
120
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'planner', '--action-manifest', '--from-file', planFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS, 'planner --action-manifest is read-only', options);
|
|
121
|
+
} finally {
|
|
122
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function runSelfTestProfileSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
127
|
+
const target = '.tmp/vibe-self-test-profile';
|
|
128
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
129
|
+
const planFile = path.join(target, 'stage106-plan.md');
|
|
130
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
fs.writeFileSync(absolutePlanFile, stage106PlanFixtureText());
|
|
134
|
+
|
|
135
|
+
const profile = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--self-test-profile', '--from-file', planFile, '--intent', 'implementation', '--json', '--root', target], {}, options), 'verification --self-test-profile --json');
|
|
136
|
+
assertJsonMarkers(readonlySmokeMarkers(profile, 'selfTestProfile'), 'verification --self-test-profile --json');
|
|
137
|
+
if (!profile.self_test_gate_profile?.self_test_gate_profile_digest) throw new Error('self-test gate profile missing self_test_gate_profile_digest');
|
|
138
|
+
if (!profile.self_test_gate_profile?.source_bindings?.plan_action_manifest_digest) throw new Error('self-test gate profile missing plan_action_manifest_digest binding');
|
|
139
|
+
if (!profile.self_test_gate_profile?.source_bindings?.registry_digest) throw new Error('self-test gate profile missing registry_digest binding');
|
|
140
|
+
if (!profile.self_test_gate_profile?.recommended_order?.length) throw new Error('self-test gate profile missing recommended_order');
|
|
141
|
+
assertNoSmokeState(repoRoot, target, 'verification --self-test-profile JSON output');
|
|
142
|
+
|
|
143
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--self-test-profile', '--from-file', planFile, '--root', target], {
|
|
144
|
+
expectOutput: ['Vibecoding Runtime Self-test Gate Profile', 'Stage: Stage 106; Kind: self-test-gate-profile; pass=true', 'Gate items:', 'status=planned_not_run', 'execution_authorized=false', 'Boundary: writes=false; self_test_gate_profile_artifact=false', 'Self-test gate profile digest:'],
|
|
145
|
+
}, options);
|
|
146
|
+
assertNoSmokeState(repoRoot, target, 'verification --self-test-profile text output');
|
|
147
|
+
|
|
148
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'verification', '--self-test-profile', '--from-file', planFile], ['--root', '.'], READ_ONLY_RUNTIME_CONTROL_FLAGS, 'verification --self-test-profile is read-only', options);
|
|
149
|
+
} finally {
|
|
150
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function runCommitReadinessSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
155
|
+
const target = '.tmp/vibe-commit-readiness';
|
|
156
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
157
|
+
const planFile = path.join(target, 'stage107-plan.md');
|
|
158
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
fs.writeFileSync(absolutePlanFile, stage107PlanFixtureText(), 'utf8');
|
|
162
|
+
|
|
163
|
+
const readiness = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'release', '--commit-readiness', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 107 commit readiness envelope', '--intent', 'implementation', '--json', '--root', target], {}, options), 'release --commit-readiness --json');
|
|
164
|
+
assertJsonMarkers(readonlySmokeMarkers(readiness, 'commitReadiness'), 'release --commit-readiness --json');
|
|
165
|
+
if (!readiness.commit_readiness?.commit_readiness_digest) throw new Error('commit readiness missing commit_readiness_digest');
|
|
166
|
+
if (!readiness.commit_readiness?.source_bindings?.plan_action_manifest_digest) throw new Error('commit readiness missing plan_action_manifest_digest binding');
|
|
167
|
+
if (!readiness.commit_readiness?.source_bindings?.self_test_gate_profile_digest) throw new Error('commit readiness missing self_test_gate_profile_digest binding');
|
|
168
|
+
if (!readiness.commit_readiness?.source_bindings?.commit_guard_digest) throw new Error('commit readiness missing commit_guard_digest binding');
|
|
169
|
+
if (!readiness.commit_readiness?.source_bindings?.registry_digest) throw new Error('commit readiness missing registry_digest binding');
|
|
170
|
+
if (!readiness.commit_readiness?.readiness_order?.length) throw new Error('commit readiness missing readiness_order');
|
|
171
|
+
assertNoSmokeState(repoRoot, target, 'release --commit-readiness JSON output');
|
|
172
|
+
|
|
173
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'release', '--commit-readiness', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 107 commit readiness envelope', '--root', target], {
|
|
174
|
+
expectOutput: ['Vibecoding Runtime Commit Readiness Envelope', 'Stage: Stage 107; Kind: commit-readiness-envelope; pass=true', 'Readiness: envelope_valid=true; commit_ready=false; manual_evidence_required=true; commit_execution_authorized=false', 'execution_authorized=false; commit_execution_authorized=false', 'Boundary: writes=false; commit_readiness_artifact=false; commit_artifact=false; command_execution=false; test_execution=false; git=false; git_write=false; commit=false', 'Commit readiness digest:'],
|
|
175
|
+
}, options);
|
|
176
|
+
assertNoSmokeState(repoRoot, target, 'release --commit-readiness text output');
|
|
177
|
+
|
|
178
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'release', '--commit-readiness', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 107 commit readiness envelope'], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW, 'release --commit-readiness is read-only', options);
|
|
179
|
+
|
|
180
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'release', '--commit-readiness', '--from-file', planFile, '--root', target], {
|
|
181
|
+
allowFailure: true,
|
|
182
|
+
expectOutput: ['release --commit-readiness requires --subject'],
|
|
183
|
+
}, options);
|
|
184
|
+
} finally {
|
|
185
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function runConfirmedOneShotPlanSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
190
|
+
const target = '.tmp/vibe-confirmed-one-shot-plan';
|
|
191
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
192
|
+
const planFile = path.join(target, 'stage108-plan.md');
|
|
193
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
fs.writeFileSync(absolutePlanFile, stage108PlanFixtureText(), 'utf8');
|
|
197
|
+
|
|
198
|
+
const plan = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--one-shot-plan', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 108 confirmed one-shot plan', '--confirm-plan', 'confirm-stage-108-plan-only', '--intent', 'implementation', '--json', '--root', target], {}, options), 'automation --one-shot-plan --json');
|
|
199
|
+
assertJsonMarkers(readonlySmokeMarkers(plan, 'confirmedOneShotPlan'), 'automation --one-shot-plan --json');
|
|
200
|
+
if (!plan.confirmed_one_shot_plan?.confirmed_one_shot_plan_digest) throw new Error('confirmed one-shot plan missing confirmed_one_shot_plan_digest');
|
|
201
|
+
if (!plan.confirmed_one_shot_plan?.source_bindings?.commit_readiness_digest) throw new Error('confirmed one-shot plan missing commit_readiness_digest binding');
|
|
202
|
+
if (!plan.confirmed_one_shot_plan?.source_bindings?.automation_readiness_digest) throw new Error('confirmed one-shot plan missing automation_readiness_digest binding');
|
|
203
|
+
if (!plan.confirmed_one_shot_plan?.source_bindings?.registry_digest) throw new Error('confirmed one-shot plan missing registry_digest binding');
|
|
204
|
+
if (!plan.confirmed_one_shot_plan?.execution_order?.length) throw new Error('confirmed one-shot plan missing execution_order');
|
|
205
|
+
if (!plan.confirmed_one_shot_plan?.recovery_notes?.length) throw new Error('confirmed one-shot plan missing recovery_notes');
|
|
206
|
+
assertNoSmokeState(repoRoot, target, 'automation --one-shot-plan JSON output');
|
|
207
|
+
|
|
208
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--one-shot-plan', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 108 confirmed one-shot plan', '--confirm-plan', 'confirm-stage-108-plan-only', '--root', target], {
|
|
209
|
+
expectOutput: ['Vibecoding Runtime Confirmed One-shot Execution Plan', 'Stage: Stage 108; Kind: confirmed-one-shot-execution-plan; pass=true', 'Confirmation: plan_confirmed=true; actions_executed=false; execution_authorized=false', 'ready_for_runtime_execution=false', 'status=planned_not_executed; actions_executed=false; execution_authorized=false', 'Boundary: writes=false; confirmed_one_shot_plan_artifact=false; one_shot_execution_plan_artifact=false; one_shot_execution_artifact=false; command_execution=false; test_execution=false; git=false; git_write=false; commit=false', 'Confirmed one-shot plan digest:'],
|
|
210
|
+
}, options);
|
|
211
|
+
assertNoSmokeState(repoRoot, target, 'automation --one-shot-plan text output');
|
|
212
|
+
|
|
213
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'automation', '--one-shot-plan', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 108 confirmed one-shot plan', '--confirm-plan', 'confirm-stage-108-plan-only'], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW, 'automation --one-shot-plan is read-only', options);
|
|
214
|
+
|
|
215
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--one-shot-plan', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 108 confirmed one-shot plan', '--root', target], {
|
|
216
|
+
allowFailure: true,
|
|
217
|
+
expectOutput: ['automation --one-shot-plan requires --confirm-plan'],
|
|
218
|
+
}, options);
|
|
219
|
+
|
|
220
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--one-shot-plan', '--from-file', planFile, '--confirm-plan', 'confirm-stage-108-plan-only', '--root', target], {
|
|
221
|
+
allowFailure: true,
|
|
222
|
+
expectOutput: ['automation --one-shot-plan requires --subject'],
|
|
223
|
+
}, options);
|
|
224
|
+
} finally {
|
|
225
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function runCloseLoopDashboardSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
230
|
+
const target = '.tmp/vibe-close-loop-dashboard';
|
|
231
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
232
|
+
const planFile = path.join(target, 'stage109-plan.md');
|
|
233
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
234
|
+
|
|
235
|
+
try {
|
|
236
|
+
fs.writeFileSync(absolutePlanFile, stage109CloseLoopDashboardPlanFixtureText(), 'utf8');
|
|
237
|
+
|
|
238
|
+
const dashboard = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--close-loop-dashboard', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 109 close-loop dashboard', '--confirm-plan', 'confirm-stage-109-dashboard-only', '--intent', 'implementation', '--json', '--root', target], {}, options), 'workflow --close-loop-dashboard --json');
|
|
239
|
+
assertJsonMarkers(readonlySmokeMarkers(dashboard, 'closeLoopDashboard'), 'workflow --close-loop-dashboard --json');
|
|
240
|
+
if (!dashboard.close_loop_dashboard?.close_loop_dashboard_digest) throw new Error('close-loop dashboard missing close_loop_dashboard_digest');
|
|
241
|
+
if (!dashboard.close_loop_dashboard?.source_bindings?.plan_action_manifest_digest) throw new Error('close-loop dashboard missing plan_action_manifest_digest binding');
|
|
242
|
+
if (!dashboard.close_loop_dashboard?.source_bindings?.self_test_gate_profile_digest) throw new Error('close-loop dashboard missing self_test_gate_profile_digest binding');
|
|
243
|
+
if (!dashboard.close_loop_dashboard?.source_bindings?.commit_readiness_digest) throw new Error('close-loop dashboard missing commit_readiness_digest binding');
|
|
244
|
+
if (!dashboard.close_loop_dashboard?.source_bindings?.confirmed_one_shot_plan_digest) throw new Error('close-loop dashboard missing confirmed_one_shot_plan_digest binding');
|
|
245
|
+
if (!dashboard.close_loop_dashboard?.source_bindings?.automation_readiness_digest) throw new Error('close-loop dashboard missing automation_readiness_digest binding');
|
|
246
|
+
if (!dashboard.close_loop_dashboard?.source_bindings?.registry_digest) throw new Error('close-loop dashboard missing registry_digest binding');
|
|
247
|
+
assertNoSmokeState(repoRoot, target, 'workflow --close-loop-dashboard JSON output');
|
|
248
|
+
|
|
249
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--close-loop-dashboard', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 109 close-loop dashboard', '--root', target], {
|
|
250
|
+
expectOutput: ['Vibecoding Runtime Close-loop Dashboard', 'Stage: Stage 109; Kind: close-loop-dashboard; pass=true', 'Plan: pass=true', 'Self-test: gates=', 'Commit: gates=', 'One-shot: confirmation_provided=false', 'ready_for_runtime_execution=false; actions_executed=false; execution_authorized=false', 'Boundary: writes=false; close_loop_dashboard_artifact=false; command_execution=false; test_execution=false; check_execution=false; git=false; git_write=false; commit=false', 'Close-loop dashboard digest:'],
|
|
251
|
+
}, options);
|
|
252
|
+
assertNoSmokeState(repoRoot, target, 'workflow --close-loop-dashboard text output');
|
|
253
|
+
|
|
254
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'workflow', '--close-loop-dashboard', '--from-file', planFile, '--subject', 'feat(runtime): add Stage 109 close-loop dashboard'], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_PREVIEW, 'workflow read-only modes do not accept execution', options);
|
|
255
|
+
|
|
256
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--close-loop-dashboard', '--from-file', planFile, '--root', target], {
|
|
257
|
+
allowFailure: true,
|
|
258
|
+
expectOutput: ['workflow --close-loop-dashboard requires --subject'],
|
|
259
|
+
}, options);
|
|
260
|
+
} finally {
|
|
261
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export function runEvidenceIntakeSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
266
|
+
const target = '.tmp/vibe-evidence-intake';
|
|
267
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
268
|
+
const planFile = path.join(target, 'stage110-plan.md');
|
|
269
|
+
const evidenceFile = path.join(target, 'stage110-evidence.json');
|
|
270
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
271
|
+
|
|
272
|
+
try {
|
|
273
|
+
fs.writeFileSync(absolutePlanFile, stage110EvidenceIntakePlanFixtureText(), 'utf8');
|
|
274
|
+
writeSmokeJsonFixture(repoRoot, evidenceFile, stage110EvidenceIntakeFixture());
|
|
275
|
+
|
|
276
|
+
const intake = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--evidence-intake', '--from-file', evidenceFile, '--from-plan', planFile, '--json', '--root', target], {}, options), 'verification --evidence-intake --json');
|
|
277
|
+
assertJsonMarkers(readonlySmokeMarkers(intake, 'evidenceIntake'), 'verification --evidence-intake --json');
|
|
278
|
+
if (!intake.evidence_intake?.evidence_intake_digest) throw new Error('evidence intake missing evidence_intake_digest');
|
|
279
|
+
if (!intake.evidence_intake?.source_bindings?.plan_action_manifest_digest) throw new Error('evidence intake missing plan_action_manifest_digest binding');
|
|
280
|
+
if (!intake.evidence_intake?.source_bindings?.self_test_gate_profile_digest) throw new Error('evidence intake missing self_test_gate_profile_digest binding');
|
|
281
|
+
if (!intake.evidence_intake?.source_bindings?.registry_digest) throw new Error('evidence intake missing registry_digest binding');
|
|
282
|
+
assertNoSmokeState(repoRoot, target, 'verification --evidence-intake JSON output');
|
|
283
|
+
|
|
284
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--evidence-intake', '--from-file', evidenceFile, '--from-plan', planFile, '--root', target], {
|
|
285
|
+
expectOutput: ['Vibecoding Runtime Evidence Intake Envelope', 'Stage: Stage 110; Kind: evidence-intake-envelope; pass=true', 'Evidence: checks=4; structure_valid=true; freshness_valid=true; gate_coverage_complete=true', 'command_executed_by_stage_110=false; execution_authorized=false', 'Boundary: writes=false; evidence_intake_artifact=false; evidence_artifact_write=false; command_execution=false; check_execution=false; test_execution=false; git=false; git_write=false; commit=false', 'Evidence intake digest:'],
|
|
286
|
+
}, options);
|
|
287
|
+
assertNoSmokeState(repoRoot, target, 'verification --evidence-intake text output');
|
|
288
|
+
|
|
289
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'verification', '--evidence-intake', '--from-file', evidenceFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN, 'verification read-only modes do not accept execution', options);
|
|
290
|
+
|
|
291
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--evidence-intake', '--from-plan', planFile, '--root', target], {
|
|
292
|
+
allowFailure: true,
|
|
293
|
+
expectOutput: ['verification --evidence-intake requires --from-file'],
|
|
294
|
+
}, options);
|
|
295
|
+
} finally {
|
|
296
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function assertGitDiffReadSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, { target, planFile, diffFile }, options) {
|
|
301
|
+
const diffRead = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'release', '--diff-read', '--from-plan', planFile, '--json', '--root', target], {}, options), 'release --diff-read --json');
|
|
302
|
+
assertJsonMarkers([
|
|
303
|
+
['command', diffRead.command, 'release'],
|
|
304
|
+
['mode', diffRead.mode, 'git-diff-read-evidence'],
|
|
305
|
+
['artifact_kind', diffRead.artifact_kind, 'diff-coverage-evidence'],
|
|
306
|
+
['runtime_read_git_diff', diffRead.runtime_read_git_diff, true],
|
|
307
|
+
['git_read', diffRead.git_read, true],
|
|
308
|
+
['git_write', diffRead.git_write, false],
|
|
309
|
+
['worktree_write', diffRead.worktree_write, false],
|
|
310
|
+
['git_diff_read.stage', diffRead.git_diff_read?.stage, 'P3'],
|
|
311
|
+
['git_diff_read.read_kind', diffRead.git_diff_read?.read_kind, 'git-diff-read-evidence'],
|
|
312
|
+
['git_diff_read.git_diff_read.command_count', diffRead.git_diff_read?.git_diff_read?.command_count, 6],
|
|
313
|
+
['git_diff_read.git_diff_read.allowed_command_count', diffRead.git_diff_read?.git_diff_read?.allowed_command_count, 6],
|
|
314
|
+
['git_diff_read.git_diff_read.git_write', diffRead.git_diff_read?.git_diff_read?.git_write, false],
|
|
315
|
+
['git_diff_read.git_diff_read.worktree_write', diffRead.git_diff_read?.git_diff_read?.worktree_write, false],
|
|
316
|
+
['git_diff_read.diff_coverage_evidence.artifact_kind', diffRead.git_diff_read?.diff_coverage_evidence?.artifact_kind, 'diff-coverage-evidence'],
|
|
317
|
+
['git_diff_read.diff_coverage_evidence.runtime_read_git_diff', diffRead.git_diff_read?.diff_coverage_evidence?.runtime_read_git_diff, true],
|
|
318
|
+
['git_diff_read.boundary_assertions.git_read', diffRead.git_diff_read?.boundary_assertions?.git_read, true],
|
|
319
|
+
['git_diff_read.boundary_assertions.git_write', diffRead.git_diff_read?.boundary_assertions?.git_write, false],
|
|
320
|
+
['git_diff_read.boundary_assertions.worktree_write', diffRead.git_diff_read?.boundary_assertions?.worktree_write, false],
|
|
321
|
+
['safety.stage', diffRead.safety?.stage, 'P3'],
|
|
322
|
+
['safety.git_write', diffRead.safety?.git_write, false],
|
|
323
|
+
['safety.worktree_write', diffRead.safety?.worktree_write, false],
|
|
324
|
+
], 'release --diff-read --json');
|
|
325
|
+
if (!diffRead.git_diff_read?.diff_read_digest) throw new Error('git diff read missing diff_read_digest');
|
|
326
|
+
if (!diffRead.git_diff_read?.source_bindings?.plan_action_manifest_digest) throw new Error('git diff read missing plan_action_manifest_digest binding');
|
|
327
|
+
if (!diffRead.git_diff_read?.source_bindings?.registry_digest) throw new Error('git diff read missing registry_digest binding');
|
|
328
|
+
assertNoSmokeState(repoRoot, target, 'release --diff-read JSON output');
|
|
329
|
+
|
|
330
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'release', '--diff-read', '--from-plan', planFile, '--root', target], {
|
|
331
|
+
expectOutput: ['Vibecoding Runtime Git Diff Read Evidence', 'Kind: git-diff-read-evidence', 'Commands: total=6; allowed=6', 'git_read=true; git_write=false; worktree_write=false', 'Boundary: writes=false; diff_coverage_artifact=false; sidecar_write=false; runtime_read_git_diff=true; git_read=true; git_write=false; worktree_write=false', 'Git diff read digest:'],
|
|
332
|
+
}, options);
|
|
333
|
+
assertNoSmokeState(repoRoot, target, 'release --diff-read text output');
|
|
334
|
+
|
|
335
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'release', '--diff-read', '--from-plan', planFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN, 'release --diff-read is read-only', options);
|
|
336
|
+
|
|
337
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'release', '--diff-read', '--root', target], {
|
|
338
|
+
allowFailure: true,
|
|
339
|
+
expectOutput: ['release --diff-read requires --from-plan'],
|
|
340
|
+
}, options);
|
|
341
|
+
|
|
342
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'release', '--diff-read', '--from-plan', planFile, '--from-file', diffFile, '--root', target], {
|
|
343
|
+
allowFailure: true,
|
|
344
|
+
expectOutput: ['release --diff-read only accepts one local plan file'],
|
|
345
|
+
}, options);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export function runDiffCoverageSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
349
|
+
const target = '.tmp/vibe-diff-coverage';
|
|
350
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
351
|
+
const planFile = path.join(target, 'stage111-plan.md');
|
|
352
|
+
const diffFile = path.join(target, 'stage111-diff.txt');
|
|
353
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
354
|
+
const absoluteDiffFile = path.join(repoRoot, diffFile);
|
|
355
|
+
const expectedFiles = stage111DiffCoverageExpectedFiles();
|
|
356
|
+
|
|
357
|
+
try {
|
|
358
|
+
fs.writeFileSync(absolutePlanFile, [
|
|
359
|
+
'# Stage 111 fixture plan',
|
|
360
|
+
'',
|
|
361
|
+
'## Task 1',
|
|
362
|
+
'- [ ] Add `tools/vibe-runtime/runtime-diff-coverage-envelope.mjs` pure diff coverage envelope fields.',
|
|
363
|
+
'- [ ] Update `tools/vibe-runtime/index.mjs` CLI release --diff-coverage dispatch.',
|
|
364
|
+
'- [ ] Sync `tools/vibe-runtime/runtime-capability-registry.mjs` and `tools/vibe-runtime/runtime-automation-readiness.mjs`.',
|
|
365
|
+
'- [ ] Sync `tools/vibe-runtime-check/index.mjs` and `tools/vibe-release-check/index.mjs` validation markers.',
|
|
366
|
+
'- [ ] Document `tools/vibe-runtime/README.md` and `docs/runtime-roadmap.md`.',
|
|
367
|
+
'',
|
|
368
|
+
'Interfaces: diff_coverage, changed_files, expected_files, covered_expected_files, missing_expected_files, unexpected_files, docs_coverage, code_coverage, diff_coverage_invariants, diff_coverage_digest.',
|
|
369
|
+
'Verification: node --check changed runtime files, runtime-check, release-check, and git diff --check evidence captured manually outside Stage 111.',
|
|
370
|
+
'Acceptance: all expected files are covered, unexpected_files is empty, git_executed_by_stage_111=false, execution_authorized=false, and diff_coverage_digest is present.',
|
|
371
|
+
'Review: local boundary review confirms no git, no command execution, no state write, no network, no model, no MCP, no subagent.',
|
|
372
|
+
'Completion boundary: Stage 111 only reads a local diff file and a local plan file.',
|
|
373
|
+
].join('\n'), 'utf8');
|
|
374
|
+
fs.writeFileSync(absoluteDiffFile, expectedFiles.join('\n'), 'utf8');
|
|
375
|
+
|
|
376
|
+
const coverage = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'release', '--diff-coverage', '--from-file', diffFile, '--from-plan', planFile, '--json', '--root', target], {}, options), 'release --diff-coverage --json');
|
|
377
|
+
assertJsonMarkers([
|
|
378
|
+
...readonlySmokeMarkers(coverage, 'diffCoverage'),
|
|
379
|
+
['diff_coverage.diff_coverage.changed_file_count', coverage.diff_coverage?.diff_coverage?.changed_file_count, expectedFiles.length],
|
|
380
|
+
], 'release --diff-coverage --json');
|
|
381
|
+
if (!coverage.diff_coverage?.diff_coverage_digest) throw new Error('diff coverage missing diff_coverage_digest');
|
|
382
|
+
if (!coverage.diff_coverage?.source_bindings?.plan_action_manifest_digest) throw new Error('diff coverage missing plan_action_manifest_digest binding');
|
|
383
|
+
if (!coverage.diff_coverage?.source_bindings?.registry_digest) throw new Error('diff coverage missing registry_digest binding');
|
|
384
|
+
assertNoSmokeState(repoRoot, target, 'release --diff-coverage JSON output');
|
|
385
|
+
|
|
386
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'release', '--diff-coverage', '--from-file', diffFile, '--from-plan', planFile, '--root', target], {
|
|
387
|
+
expectOutput: ['Vibecoding Runtime Diff Coverage Envelope', 'Stage: Stage 111; Kind: diff-coverage-envelope; pass=true', 'Diff: changed=8; expected=8; covered=8; missing=0; unexpected=0; git_executed_by_stage_111=false; diff_generated_by_stage_111=false', 'Boundary: writes=false; diff_coverage_artifact=false; diff_artifact_write=false; command_execution=false; git=false; git_write=false; commit=false', 'Diff coverage digest:'],
|
|
388
|
+
}, options);
|
|
389
|
+
assertNoSmokeState(repoRoot, target, 'release --diff-coverage text output');
|
|
390
|
+
|
|
391
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'release', '--diff-coverage', '--from-file', diffFile, '--from-plan', planFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN, 'release --diff-coverage is read-only', options);
|
|
392
|
+
|
|
393
|
+
assertGitDiffReadSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, { target, planFile, diffFile }, options);
|
|
394
|
+
|
|
395
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'release', '--diff-coverage', '--from-file', diffFile, '--root', target], {
|
|
396
|
+
allowFailure: true,
|
|
397
|
+
expectOutput: ['release --diff-coverage requires --from-plan'],
|
|
398
|
+
}, options);
|
|
399
|
+
} finally {
|
|
400
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
export function runReviewEnvelopeSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
405
|
+
const target = '.tmp/vibe-review-envelope';
|
|
406
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
407
|
+
const planFile = path.join(target, 'stage112-plan.md');
|
|
408
|
+
const reviewFile = path.join(target, 'review.json');
|
|
409
|
+
const resolutionEvidenceFile = path.join(target, 'resolution-evidence.json');
|
|
410
|
+
const blindRepairFile = path.join(target, 'blind-repair-review.json');
|
|
411
|
+
const intakeFile = path.join(target, 'review-intake-output.json');
|
|
412
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
413
|
+
const absoluteIntakeFile = path.join(repoRoot, intakeFile);
|
|
414
|
+
|
|
415
|
+
try {
|
|
416
|
+
fs.writeFileSync(absolutePlanFile, stage112ReviewPlanFixtureText(), 'utf8');
|
|
417
|
+
writeSmokeJsonFixture(repoRoot, reviewFile, stage112ReviewFixture());
|
|
418
|
+
writeSmokeJsonFixture(repoRoot, resolutionEvidenceFile, stage112ResolutionEvidenceFixture());
|
|
419
|
+
writeSmokeJsonFixture(repoRoot, blindRepairFile, {
|
|
420
|
+
created_at: '2026-07-18T00:05:00.000Z',
|
|
421
|
+
claim: 'Automatically repaired review feedback and ran tests without binding source evidence.',
|
|
422
|
+
review_items: [{
|
|
423
|
+
id: 'review-blind-repair',
|
|
424
|
+
severity: 'important',
|
|
425
|
+
category: 'test_gap',
|
|
426
|
+
comment: 'Add explicit verification for the review feedback gate before continuing.',
|
|
427
|
+
impacted_files: ['tools/vibe-runtime/runtime-review-envelope.mjs'],
|
|
428
|
+
required_change: 'Bind review feedback to a verification plan before any repair claim.',
|
|
429
|
+
required_evidence: ['review feedback gate reports no blind repair claim'],
|
|
430
|
+
}],
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
const intake = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'review', '--intake', '--from-file', reviewFile, '--from-plan', planFile, '--json', '--root', target], {}, options), 'review --intake --json');
|
|
434
|
+
assertJsonMarkers(stage112ReviewIntakeJsonMarkers(intake), 'review --intake --json');
|
|
435
|
+
if (!intake.review_intake?.review_intake_digest) throw new Error('review intake missing review_intake_digest');
|
|
436
|
+
if (!intake.review_intake?.source_bindings?.registry_digest) throw new Error('review intake missing registry_digest binding');
|
|
437
|
+
assertNoSmokeState(repoRoot, target, 'review --intake JSON output');
|
|
438
|
+
|
|
439
|
+
fs.writeFileSync(absoluteIntakeFile, JSON.stringify(intake, null, 2), 'utf8');
|
|
440
|
+
const resolution = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'review', '--resolution', '--from-file', intakeFile, '--from-evidence', resolutionEvidenceFile, '--json', '--root', target], {}, options), 'review --resolution --json');
|
|
441
|
+
assertJsonMarkers(stage112ReviewResolutionJsonMarkers(resolution), 'review --resolution --json');
|
|
442
|
+
if (!resolution.review_resolution?.review_resolution_digest) throw new Error('review resolution missing review_resolution_digest');
|
|
443
|
+
if (!resolution.review_resolution?.source_bindings?.registry_digest) throw new Error('review resolution missing registry_digest binding');
|
|
444
|
+
assertNoSmokeState(repoRoot, target, 'review --resolution JSON output');
|
|
445
|
+
|
|
446
|
+
const blindRepair = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'review', '--intake', '--from-file', blindRepairFile, '--json', '--root', target], {}, options), 'review --intake blind repair --json');
|
|
447
|
+
if (blindRepair.review_intake?.review_feedback_gate?.gate_kind !== 'skill-driven-review-feedback-gate') throw new Error('review feedback gate missing for blind repair fixture');
|
|
448
|
+
if (blindRepair.review_intake?.next_task_gate?.blocked !== true) throw new Error('blind repair review feedback must block next task');
|
|
449
|
+
if (!blindRepair.review_intake?.review_feedback_gate?.forbidden_claim_scan?.includes('blind or automatic repair claim')) throw new Error('review feedback gate must flag automatic repair claim');
|
|
450
|
+
if (!blindRepair.review_intake?.review_feedback_gate?.forbidden_claim_scan?.includes('verification execution claim')) throw new Error('review feedback gate must flag unverified verification claim');
|
|
451
|
+
assertNoSmokeState(repoRoot, target, 'review --intake blind repair JSON output');
|
|
452
|
+
|
|
453
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'review', '--intake', '--from-file', reviewFile, '--from-plan', planFile, '--root', target], {
|
|
454
|
+
expectOutput: stage112ReviewIntakeTextExpectations(),
|
|
455
|
+
}, options);
|
|
456
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'review', '--resolution', '--from-file', intakeFile, '--from-evidence', resolutionEvidenceFile, '--root', target], {
|
|
457
|
+
expectOutput: stage112ReviewResolutionTextExpectations(),
|
|
458
|
+
}, options);
|
|
459
|
+
assertNoSmokeState(repoRoot, target, 'review text output');
|
|
460
|
+
|
|
461
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'review', '--intake', '--from-file', reviewFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN, 'review read-only modes do not accept execution', options);
|
|
462
|
+
|
|
463
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'review', '--resolution', '--from-file', intakeFile, '--root', target], {
|
|
464
|
+
allowFailure: true,
|
|
465
|
+
expectOutput: ['review --resolution requires --from-evidence'],
|
|
466
|
+
}, options);
|
|
467
|
+
} finally {
|
|
468
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export function runTddTraceSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
473
|
+
const target = '.tmp/vibe-tdd-trace';
|
|
474
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
475
|
+
const planFile = path.join(target, 'stage113-plan.md');
|
|
476
|
+
const traceFile = path.join(target, 'tdd-trace.json');
|
|
477
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
478
|
+
|
|
479
|
+
try {
|
|
480
|
+
fs.writeFileSync(absolutePlanFile, stage113TddTracePlanFixtureText(), 'utf8');
|
|
481
|
+
writeSmokeJsonFixture(repoRoot, traceFile, stage113TddTraceFixture());
|
|
482
|
+
|
|
483
|
+
const trace = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--tdd-trace', '--from-file', traceFile, '--from-plan', planFile, '--json', '--root', target], {}, options), 'verification --tdd-trace --json');
|
|
484
|
+
assertJsonMarkers(readonlySmokeMarkers(trace, 'tddTrace'), 'verification --tdd-trace --json');
|
|
485
|
+
if (!trace.tdd_trace_contract?.tdd_trace_digest) throw new Error('TDD trace contract missing tdd_trace_digest');
|
|
486
|
+
if (!trace.tdd_trace_contract?.source_bindings?.registry_digest) throw new Error('TDD trace contract missing registry_digest binding');
|
|
487
|
+
assertNoSmokeState(repoRoot, target, 'verification --tdd-trace JSON output');
|
|
488
|
+
|
|
489
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--tdd-trace', '--from-file', traceFile, '--from-plan', planFile, '--root', target], {
|
|
490
|
+
expectOutput: ['Vibecoding Runtime TDD Trace Contract', 'Stage: Stage 113; Kind: tdd-trace-contract; pass=true', 'Cycle: RED -> GREEN -> REFACTOR; valid=true; test_execution_by_stage_113=false; command_execution_by_stage_113=false', 'RED: verified=true; exit_status=1; expected_failure=true; execution_authorized=false', 'GREEN: verified=true; exit_status=0; execution_authorized=false', 'REFACTOR: verified=true; exit_status=0; skipped=false; execution_authorized=false', 'Boundary: writes=false; tdd_trace_artifact=false; test_result_artifact=false; command_execution=false; check_execution=false; test_execution=false; repair_execution=false; git=false; git_write=false; commit=false', 'TDD trace digest:'],
|
|
491
|
+
}, options);
|
|
492
|
+
assertNoSmokeState(repoRoot, target, 'verification --tdd-trace text output');
|
|
493
|
+
|
|
494
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'verification', '--tdd-trace', '--from-file', traceFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN, 'verification --tdd-trace is read-only', options);
|
|
495
|
+
|
|
496
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'verification', '--tdd-trace', '--from-file', traceFile, '--intent', 'implementation', '--root', target], {
|
|
497
|
+
allowFailure: true,
|
|
498
|
+
expectOutput: ['--intent is only supported by verification --self-test-profile'],
|
|
499
|
+
}, options);
|
|
500
|
+
} finally {
|
|
501
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
export function runHumanFriendlyAliasSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
506
|
+
const target = '.tmp/vibe-human-friendly-alias';
|
|
507
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
508
|
+
const planFile = `${target}/plan.md`;
|
|
509
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
510
|
+
|
|
511
|
+
try {
|
|
512
|
+
fs.writeFileSync(absolutePlanFile, stage114HumanFriendlyAliasPlanFixtureText(), 'utf8');
|
|
513
|
+
|
|
514
|
+
const closeLoop = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--close-loop', '--from-file', planFile, '--subject', 'feat(runtime): add aliases', '--json', '--root', target], {}, options), 'workflow --close-loop --json');
|
|
515
|
+
assertJsonMarkers([
|
|
516
|
+
['command', closeLoop.command, 'workflow'],
|
|
517
|
+
['mode', closeLoop.mode, 'human-friendly-close-loop-alias'],
|
|
518
|
+
['ok', closeLoop.ok, true],
|
|
519
|
+
['human_friendly_alias.stage', closeLoop.human_friendly_alias?.stage, 'Stage 114'],
|
|
520
|
+
['human_friendly_alias.alias_kind', closeLoop.human_friendly_alias?.alias_kind, 'human-friendly-close-loop-alias'],
|
|
521
|
+
['human_friendly_alias.source_bindings.close_loop_dashboard_stage', closeLoop.human_friendly_alias?.source_bindings?.close_loop_dashboard_stage, 'Stage 109'],
|
|
522
|
+
['human_friendly_alias.source_bindings.registry_version', closeLoop.human_friendly_alias?.source_bindings?.registry_version, 47],
|
|
523
|
+
['human_friendly_alias.sections.Plan.execution_authorized', closeLoop.human_friendly_alias?.sections?.Plan?.execution_authorized, false],
|
|
524
|
+
['human_friendly_alias.sections.Next evidence.execution_authorized', closeLoop.human_friendly_alias?.sections?.['Next evidence']?.execution_authorized, false],
|
|
525
|
+
['human_friendly_alias.boundary_assertions.human_friendly_alias_artifact', closeLoop.human_friendly_alias?.boundary_assertions?.human_friendly_alias_artifact, false],
|
|
526
|
+
['human_friendly_alias.boundary_assertions.command_execution', closeLoop.human_friendly_alias?.boundary_assertions?.command_execution, false],
|
|
527
|
+
['human_friendly_alias.boundary_assertions.git_write', closeLoop.human_friendly_alias?.boundary_assertions?.git_write, false],
|
|
528
|
+
['human_friendly_alias.boundary_assertions.commit', closeLoop.human_friendly_alias?.boundary_assertions?.commit, false],
|
|
529
|
+
['safety.stage', closeLoop.safety?.stage, 'Stage 114'],
|
|
530
|
+
], 'workflow --close-loop --json');
|
|
531
|
+
if (!closeLoop.human_friendly_alias?.human_friendly_alias_digest) throw new Error('close-loop alias missing human_friendly_alias_digest');
|
|
532
|
+
if (!closeLoop.human_friendly_alias?.labels?.includes('Next evidence')) throw new Error('close-loop alias missing Next evidence label');
|
|
533
|
+
assertNoSmokeState(repoRoot, target, 'workflow --close-loop JSON output');
|
|
534
|
+
|
|
535
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--close-loop', '--from-file', planFile, '--subject', 'feat(runtime): add aliases', '--root', target], {
|
|
536
|
+
expectOutput: ['Vibecoding Runtime Human-friendly Alias', 'Kind: human-friendly-close-loop-alias; pass=true', 'Plan:', 'Docs:', 'Code:', 'Self-test:', 'Diff:', 'Review:', 'TDD:', 'Commit:', 'Next evidence:', 'Boundary: writes=false; human_friendly_alias_artifact=false; command_execution=false; check_execution=false; test_execution=false; repair_execution=false; git=false; git_write=false; commit=false', 'Human-friendly alias digest:'],
|
|
537
|
+
}, options);
|
|
538
|
+
assertNoSmokeState(repoRoot, target, 'workflow --close-loop text output');
|
|
539
|
+
|
|
540
|
+
const nextEvidence = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--next-evidence', '--from-file', planFile, '--json', '--root', target], {}, options), 'workflow --next-evidence --json');
|
|
541
|
+
assertJsonMarkers([
|
|
542
|
+
['command', nextEvidence.command, 'workflow'],
|
|
543
|
+
['mode', nextEvidence.mode, 'human-friendly-next-evidence-alias'],
|
|
544
|
+
['ok', nextEvidence.ok, true],
|
|
545
|
+
['human_friendly_alias.stage', nextEvidence.human_friendly_alias?.stage, 'Stage 114'],
|
|
546
|
+
['human_friendly_alias.alias_kind', nextEvidence.human_friendly_alias?.alias_kind, 'human-friendly-next-evidence-alias'],
|
|
547
|
+
['human_friendly_alias.source_bindings.plan_action_manifest_stage', nextEvidence.human_friendly_alias?.source_bindings?.plan_action_manifest_stage, 'Stage 105'],
|
|
548
|
+
['human_friendly_alias.source_bindings.registry_version', nextEvidence.human_friendly_alias?.source_bindings?.registry_version, 47],
|
|
549
|
+
['human_friendly_alias.evidence_inputs.evidence.status', nextEvidence.human_friendly_alias?.evidence_inputs?.evidence?.status, 'missing'],
|
|
550
|
+
['human_friendly_alias.next_evidence.kind', nextEvidence.human_friendly_alias?.next_evidence?.kind, 'Self-test evidence'],
|
|
551
|
+
['human_friendly_alias.sections.Commit.execution_authorized', nextEvidence.human_friendly_alias?.sections?.Commit?.execution_authorized, false],
|
|
552
|
+
['human_friendly_alias.boundary_assertions.next_evidence_alias_artifact', nextEvidence.human_friendly_alias?.boundary_assertions?.next_evidence_alias_artifact, false],
|
|
553
|
+
['human_friendly_alias.boundary_assertions.check_execution', nextEvidence.human_friendly_alias?.boundary_assertions?.check_execution, false],
|
|
554
|
+
['human_friendly_alias.boundary_assertions.test_execution', nextEvidence.human_friendly_alias?.boundary_assertions?.test_execution, false],
|
|
555
|
+
['human_friendly_alias.boundary_assertions.git_write', nextEvidence.human_friendly_alias?.boundary_assertions?.git_write, false],
|
|
556
|
+
['safety.stage', nextEvidence.safety?.stage, 'Stage 114'],
|
|
557
|
+
], 'workflow --next-evidence --json');
|
|
558
|
+
if (!nextEvidence.human_friendly_alias?.human_friendly_alias_digest) throw new Error('next-evidence alias missing human_friendly_alias_digest');
|
|
559
|
+
if (!nextEvidence.human_friendly_alias?.evidence_gaps?.some((gap) => gap.kind === 'Self-test evidence')) throw new Error('next-evidence alias missing self-test evidence gap');
|
|
560
|
+
assertNoSmokeState(repoRoot, target, 'workflow --next-evidence JSON output');
|
|
561
|
+
|
|
562
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--next-evidence', '--from-file', planFile, '--root', target], {
|
|
563
|
+
expectOutput: ['Vibecoding Runtime Human-friendly Alias', 'Kind: human-friendly-next-evidence-alias; pass=true', 'Plan:', 'Self-test:', 'Diff:', 'Review:', 'TDD:', 'Commit:', 'Next evidence: Self-test evidence; Provide --evidence-file with local check output JSON.', 'Evidence gaps:', 'Boundary: writes=false; human_friendly_alias_artifact=false; command_execution=false; check_execution=false; test_execution=false; repair_execution=false; git=false; git_write=false; commit=false', 'Human-friendly alias digest:'],
|
|
564
|
+
}, options);
|
|
565
|
+
assertNoSmokeState(repoRoot, target, 'workflow --next-evidence text output');
|
|
566
|
+
|
|
567
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'workflow', '--next-evidence', '--from-file', planFile], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN, 'workflow read-only modes do not accept execution', options);
|
|
568
|
+
|
|
569
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--next-evidence', '--from-file', planFile, '--subject', 'feat(runtime): add aliases', '--root', target], {
|
|
570
|
+
allowFailure: true,
|
|
571
|
+
expectOutput: ['workflow --next-evidence only accepts one local plan file'],
|
|
572
|
+
}, options);
|
|
573
|
+
} finally {
|
|
574
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
export function runSuperpowersGapSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
579
|
+
const unexpectedState = path.join(repoRoot, '.vibecoding-state');
|
|
580
|
+
|
|
581
|
+
const gap = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-superpowers', 'fork/superpowers', '--json', '--root', '.'], {}, options), 'governance --superpowers-gap --json');
|
|
582
|
+
assertJsonMarkers(readonlySmokeMarkers(gap, 'superpowersGap'), 'governance --superpowers-gap --json');
|
|
583
|
+
if (!gap.superpowers_gap_matrix?.gap_matrix_digest) throw new Error('Superpowers gap matrix missing gap_matrix_digest');
|
|
584
|
+
if (gap.superpowers_gap_matrix?.dimensions?.length !== 10) throw new Error('Superpowers gap matrix dimension count mismatch');
|
|
585
|
+
if (!gap.superpowers_gap_matrix?.dimensions?.some((dimension) => dimension.id === 'execution_loop' && dimension.recommended_stage === 'Stage 118')) throw new Error('Superpowers gap matrix missing execution_loop Stage 118 recommendation');
|
|
586
|
+
if (!gap.superpowers_gap_matrix?.recommended_stage_sequence?.includes('Stage 120')) throw new Error('Superpowers gap matrix missing Stage 120 recommendation');
|
|
587
|
+
if (!gap.superpowers_gap_matrix?.dimensions?.some((dimension) => dimension.id === 'entry_ux' && dimension.recommended_stage === 'Stage 116')) throw new Error('Superpowers gap matrix missing entry UX Stage 116 dimension');
|
|
588
|
+
if (fs.existsSync(unexpectedState)) throw new Error('governance --superpowers-gap JSON output created unexpected state directory');
|
|
589
|
+
|
|
590
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-superpowers', 'fork/superpowers', '--root', '.'], {
|
|
591
|
+
expectOutput: ['Vibecoding Runtime Superpowers Gap Matrix', 'Stage: Stage 115; Kind: superpowers-gap-matrix; pass=true', 'Sources: superpowers=', '- entry_ux: priority=low; superpowers=100; vibecoding=100; stage=Stage 116', '- planning_quality: priority=low; superpowers=100; vibecoding=100; stage=Stage 117', '- commit_closeout: priority=low; superpowers=100; vibecoding=100; stage=Stage 120', 'Recommended stage sequence:', 'Boundary: writes=false; superpowers_gap_artifact=false; command_execution=false; skill_execution=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', 'Superpowers gap digest:'],
|
|
592
|
+
}, options);
|
|
593
|
+
if (fs.existsSync(unexpectedState)) throw new Error('governance --superpowers-gap text output created unexpected state directory');
|
|
594
|
+
|
|
595
|
+
runForbiddenFlagChecks(
|
|
596
|
+
run,
|
|
597
|
+
['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-superpowers', 'fork/superpowers'],
|
|
598
|
+
['--root', '.'],
|
|
599
|
+
['--confirm', '--dry-run', '--preflight', '--dispatch', '--dispatch-intent'],
|
|
600
|
+
'governance --superpowers-gap is read-only',
|
|
601
|
+
options,
|
|
602
|
+
);
|
|
603
|
+
runForbiddenFlagChecks(
|
|
604
|
+
run,
|
|
605
|
+
['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-superpowers', 'fork/superpowers'],
|
|
606
|
+
['--root', '.'],
|
|
607
|
+
['--write', '--run', '--once', '--scan', '--auto-run'],
|
|
608
|
+
'governance supports local attest, PR readiness, compatibility report, convergence report, and read-only audit only',
|
|
609
|
+
options,
|
|
610
|
+
);
|
|
611
|
+
|
|
612
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--root', '.'], {
|
|
613
|
+
allowFailure: true,
|
|
614
|
+
expectOutput: ['governance --superpowers-gap requires --from-superpowers'],
|
|
615
|
+
}, options);
|
|
616
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-superpowers', '../superpowers', '--root', '.'], {
|
|
617
|
+
allowFailure: true,
|
|
618
|
+
expectOutput: ['governance --superpowers-gap --from-superpowers must stay within --root'],
|
|
619
|
+
}, options);
|
|
620
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-superpowers', 'missing-superpowers', '--root', '.'], {
|
|
621
|
+
allowFailure: true,
|
|
622
|
+
expectOutput: ['governance --superpowers-gap --from-superpowers directory not found'],
|
|
623
|
+
}, options);
|
|
624
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'governance', '--advice', '--from-superpowers', 'fork/superpowers', '--root', '.'], {
|
|
625
|
+
allowFailure: true,
|
|
626
|
+
expectOutput: ['--from-superpowers is only supported by governance --superpowers-gap, governance --superpowers-comparison, or governance --superpowers-regression-guard'],
|
|
627
|
+
}, options);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
function progressiveEntryUxUnsupportedCases({ target, gapFile }) {
|
|
631
|
+
return [
|
|
632
|
+
{
|
|
633
|
+
args: ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-ux', '--root', target],
|
|
634
|
+
expected: 'workflow --entry-ux requires --prompt <text>',
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
args: ['tools/vibe-runtime/index.mjs', 'workflow', '--start', '--prompt', 'start-here', '--from-gap', gapFile, '--root', target],
|
|
638
|
+
expected: '--from-gap is only supported by workflow --entry-ux',
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
args: ['tools/vibe-runtime/index.mjs', 'governance', '--superpowers-gap', '--from-gap', gapFile, '--root', target],
|
|
642
|
+
expected: '--from-gap is only supported by workflow --entry-ux',
|
|
643
|
+
},
|
|
644
|
+
];
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
function runProgressiveEntryUxUnsupportedCases(run, context, options) {
|
|
648
|
+
for (const { args, expected } of progressiveEntryUxUnsupportedCases(context)) {
|
|
649
|
+
run('node', args, {
|
|
650
|
+
allowFailure: true,
|
|
651
|
+
expectOutput: [expected],
|
|
652
|
+
}, options);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
export function runProgressiveEntryUxSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
657
|
+
const target = '.tmp/vibe-progressive-entry-ux';
|
|
658
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
659
|
+
const gapFile = path.join(target, 'stage115-gap.json');
|
|
660
|
+
|
|
661
|
+
try {
|
|
662
|
+
writeSmokeJsonFixture(repoRoot, gapFile, stage115ProgressiveEntryUxGapFixture());
|
|
663
|
+
|
|
664
|
+
const entryUx = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-ux', '--prompt', 'implement-next-stage', '--json', '--root', target], {}, options), 'workflow --entry-ux --json');
|
|
665
|
+
assertJsonMarkers(readonlySmokeMarkers(entryUx, 'progressiveEntryUx'), 'workflow --entry-ux --json');
|
|
666
|
+
if (!entryUx.progressive_entry_ux?.contract_digest) throw new Error('progressive entry UX missing contract_digest');
|
|
667
|
+
if (!entryUx.progressive_entry_ux?.visible_sentence) throw new Error('progressive entry UX missing visible_sentence');
|
|
668
|
+
if (!entryUx.progressive_entry_ux?.do_not_do_yet?.some((item) => item.includes('不要运行命令'))) throw new Error('progressive entry UX missing command prohibition guidance');
|
|
669
|
+
assertNoSmokeState(repoRoot, target, 'workflow --entry-ux JSON output');
|
|
670
|
+
|
|
671
|
+
const withGap = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-ux', '--prompt', 'review-branch', '--from-gap', gapFile, '--json', '--root', target], {}, options), 'workflow --entry-ux --from-gap --json');
|
|
672
|
+
assertJsonMarkers([
|
|
673
|
+
['progressive_entry_ux.normalized_intent', withGap.progressive_entry_ux?.normalized_intent, 'review'],
|
|
674
|
+
['progressive_entry_ux.source_bindings.gap_matrix_provided', withGap.progressive_entry_ux?.source_bindings?.gap_matrix_provided, true],
|
|
675
|
+
['progressive_entry_ux.source_bindings.stage116_gap_found', withGap.progressive_entry_ux?.source_bindings?.stage116_gap_found, true],
|
|
676
|
+
['progressive_entry_ux.source_bindings.gap_file_status', withGap.progressive_entry_ux?.source_bindings?.gap_file_status, 'provided'],
|
|
677
|
+
['progressive_entry_ux.source_bindings.gap_matrix_digest', withGap.progressive_entry_ux?.source_bindings?.gap_matrix_digest, 'fixture-stage115-gap-digest'],
|
|
678
|
+
], 'workflow --entry-ux --from-gap --json');
|
|
679
|
+
if (!withGap.progressive_entry_ux?.source_bindings?.gap_file_digest) throw new Error('progressive entry UX missing local gap file digest');
|
|
680
|
+
assertNoSmokeState(repoRoot, target, 'workflow --entry-ux --from-gap JSON output');
|
|
681
|
+
|
|
682
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-ux', '--prompt', 'finish-and-commit-safely', '--from-gap', gapFile, '--root', target], {
|
|
683
|
+
expectOutput: ['Vibecoding Runtime Progressive Entry UX', 'Stage: Stage 116; Kind: progressive-entry-ux-contract; pass=true', 'Recommended workflow:', 'Minimum next action:', 'Visible sentence:', 'Bootstrap policy: injectsFullSkill=false; session_create=false; skill_execution_claimed=false', 'Gap binding: provided=true', 'Boundary: writes=false; progressive_entry_ux_artifact=false; command_execution=false; skill_execution=false; workflow_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', 'Entry UX digest:'],
|
|
684
|
+
}, options);
|
|
685
|
+
assertNoSmokeState(repoRoot, target, 'workflow --entry-ux text output');
|
|
686
|
+
|
|
687
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'workflow', '--entry-ux', '--prompt', 'implement-next-stage'], ['--root', target], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN_SECOND, 'workflow read-only modes do not accept execution', options);
|
|
688
|
+
runProgressiveEntryUxUnsupportedCases(run, { target, gapFile }, options);
|
|
689
|
+
} finally {
|
|
690
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
export function runExecutablePlanSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
695
|
+
const target = '.tmp/vibe-executable-plan-contract';
|
|
696
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
697
|
+
const planFile = path.join(target, 'stage117-plan.md');
|
|
698
|
+
const weakPlanFile = path.join(target, 'weak-plan.md');
|
|
699
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
700
|
+
const absoluteWeakPlanFile = path.join(repoRoot, weakPlanFile);
|
|
701
|
+
|
|
702
|
+
try {
|
|
703
|
+
fs.writeFileSync(absolutePlanFile, `# Stage 117 executable plan fixture
|
|
704
|
+
|
|
705
|
+
## Stage 117 boundary
|
|
706
|
+
|
|
707
|
+
- Stage 117: Implement executable plan contract in tools/vibe-runtime/runtime-executable-plan-contract.mjs and tools/vibe-runtime/index.mjs.
|
|
708
|
+
- Update docs/runtime-roadmap.md and tools/vibe-runtime/README.md with Stage 117 docs expectations.
|
|
709
|
+
- Validate tools/vibe-runtime-check/index.mjs and tools/vibe-release-check/index.mjs marker expectations.
|
|
710
|
+
- Stop if runtime-check fails or plan_quality_score is below threshold.
|
|
711
|
+
- Rollback / stop conditions: stop if command would write outside .tmp or if any git push/PR/merge is required.
|
|
712
|
+
|
|
713
|
+
Expected output marker: Result: PASS
|
|
714
|
+
Expected output marker: executable_plan_contract
|
|
715
|
+
|
|
716
|
+
Verification commands:
|
|
717
|
+
- node --check tools/vibe-runtime/runtime-executable-plan-contract.mjs
|
|
718
|
+
- node tools/vibe-runtime-check/index.mjs --root D:/workspace_mine/vibe-coading
|
|
719
|
+
- node tools/vibe-release-check/index.mjs --quiet
|
|
720
|
+
- git diff --check
|
|
721
|
+
|
|
722
|
+
Commit subject: feat(runtime): 添加 Stage 117 可执行计划质量合同
|
|
723
|
+
`, 'utf8');
|
|
724
|
+
fs.writeFileSync(absoluteWeakPlanFile, `# weak plan\n\n- TODO later\n`, 'utf8');
|
|
725
|
+
|
|
726
|
+
const executable = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--executable-plan', '--from-file', planFile, '--json', '--root', repoRoot], {}, options), 'planner --executable-plan --json');
|
|
727
|
+
assertJsonMarkers(readonlySmokeMarkers(executable, 'executablePlan'), 'planner --executable-plan --json');
|
|
728
|
+
if (!executable.executable_plan_contract?.executable_plan_digest) throw new Error('executable plan missing executable_plan_digest');
|
|
729
|
+
if (!executable.executable_plan_contract?.task_readiness?.some((item) => item.readiness_status === 'ready_for_runbook')) throw new Error('executable plan missing ready_for_runbook task readiness');
|
|
730
|
+
if (!executable.executable_plan_contract?.task_quality_contract?.per_task_gates?.every((item) => item.pass === true && item.execution_authorized === false && item.auto_repair === false)) throw new Error('executable plan task quality gates must pass without execution or auto repair');
|
|
731
|
+
if (!executable.executable_plan_contract?.task_readiness?.every((item) => item.files_to_change?.length > 0 && item.verification_commands?.length > 0 && item.expected_output_markers?.length > 0 && item.stop_conditions?.length > 0)) throw new Error('executable plan task readiness must bind files, verification, output markers, and stop conditions per task');
|
|
732
|
+
if (!executable.executable_plan_contract?.requirement_checks?.every((item) => item.execution_authorized === false)) throw new Error('executable plan requirement checks must keep execution_authorized=false');
|
|
733
|
+
assertNoSmokeState(repoRoot, target, 'planner --executable-plan JSON output');
|
|
734
|
+
|
|
735
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--executable-plan', '--from-file', planFile, '--root', repoRoot], {
|
|
736
|
+
expectOutput: ['Vibecoding Runtime Executable Plan Quality Contract', 'Stage: Stage 117; Kind: executable-plan-quality-contract; pass=true', 'Plan quality score: 100/80; pass=true', 'Task quality: pass=true; per_task_gates=', 'Failure mode: blocking_gaps_only=true; auto_repair=false; plan_mutation=false', 'Tasks:', 'Boundary: writes=false; executable_plan_artifact=false; plan_repair_artifact=false; source_write=false; sidecar_write=false; state_directory_created=false; command_execution=false; check_execution=false; test_execution=false; repair_execution=false; action_item_execution=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', 'Executable plan digest:'],
|
|
737
|
+
}, options);
|
|
738
|
+
assertNoSmokeState(repoRoot, target, 'planner --executable-plan text output');
|
|
739
|
+
|
|
740
|
+
const weak = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--executable-plan', '--from-file', weakPlanFile, '--json', '--root', repoRoot], {}, options), 'planner --executable-plan weak --json');
|
|
741
|
+
if (weak.executable_plan_contract?.plan_quality_pass !== false) throw new Error('weak executable plan should not pass quality gate');
|
|
742
|
+
if (weak.executable_plan_contract?.task_quality_contract?.pass !== false) throw new Error('weak executable plan should fail task quality contract');
|
|
743
|
+
if (weak.executable_plan_contract?.task_quality_contract?.blocking_gaps_only !== true) throw new Error('weak executable plan should only expose blocking gaps');
|
|
744
|
+
if (weak.executable_plan_contract?.task_quality_contract?.auto_repair !== false) throw new Error('weak executable plan must not auto repair');
|
|
745
|
+
if (weak.executable_plan_contract?.failure_mode?.plan_mutation !== false) throw new Error('weak executable plan failure mode must not mutate plan');
|
|
746
|
+
if (!weak.executable_plan_contract?.missing_requirements?.includes('exact_file_paths')) throw new Error('weak executable plan should report exact_file_paths gap');
|
|
747
|
+
if (!weak.executable_plan_contract?.blocked_reasons?.some((item) => item.includes('missing exact file paths'))) throw new Error('weak executable plan should report blocked reason');
|
|
748
|
+
|
|
749
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'planner', '--executable-plan', '--from-file', planFile], ['--root', repoRoot], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN_SECOND, 'planner --executable-plan is read-only', options);
|
|
750
|
+
|
|
751
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--executable-plan', '--root', repoRoot], {
|
|
752
|
+
allowFailure: true,
|
|
753
|
+
expectOutput: ['planner --executable-plan requires --from-file <local-plan-file>'],
|
|
754
|
+
}, options);
|
|
755
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--executable-plan', '--from-file', planFile, '--intent', 'implementation', '--root', repoRoot], {
|
|
756
|
+
allowFailure: true,
|
|
757
|
+
expectOutput: ['--intent is only supported by planner --action-manifest'],
|
|
758
|
+
}, options);
|
|
759
|
+
} finally {
|
|
760
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
export function runStageRunbookSmoke({ repoRoot, run, parseJsonOutput, assertJsonMarkers }, options) {
|
|
765
|
+
const target = '.tmp/vibe-stage-runbook';
|
|
766
|
+
const absoluteTarget = prepareSmokeTmpRoot(repoRoot, target);
|
|
767
|
+
const planFile = path.join(target, 'stage118-plan.md');
|
|
768
|
+
const weakPlanFile = path.join(target, 'weak-runbook-plan.md');
|
|
769
|
+
const executablePlanFile = path.join(target, 'stage117-executable-plan.json');
|
|
770
|
+
const absolutePlanFile = path.join(repoRoot, planFile);
|
|
771
|
+
const absoluteWeakPlanFile = path.join(repoRoot, weakPlanFile);
|
|
772
|
+
const absoluteExecutablePlanFile = path.join(repoRoot, executablePlanFile);
|
|
773
|
+
|
|
774
|
+
try {
|
|
775
|
+
fs.writeFileSync(absolutePlanFile, `# Stage 118 sequential stage runbook fixture
|
|
776
|
+
|
|
777
|
+
## Stage 118 boundary
|
|
778
|
+
|
|
779
|
+
- Stage 118: Implement sequential stage runbook in tools/vibe-runtime/runtime-sequential-stage-runbook.mjs and tools/vibe-runtime/index.mjs.
|
|
780
|
+
- Update docs/runtime-roadmap.md and tools/vibe-runtime/README.md with Stage 118 docs expectations.
|
|
781
|
+
- Validate tools/vibe-runtime-check/index.mjs and tools/vibe-release-check/index.mjs marker expectations.
|
|
782
|
+
- Stop if runtime-check fails or if the runbook would execute commands automatically.
|
|
783
|
+
- Rollback / stop conditions: stop if command would write outside .tmp or if any git push/PR/merge is required.
|
|
784
|
+
|
|
785
|
+
Expected output marker: Result: PASS
|
|
786
|
+
Expected output marker: sequential_stage_runbook
|
|
787
|
+
|
|
788
|
+
Verification commands:
|
|
789
|
+
- node --check tools/vibe-runtime/runtime-sequential-stage-runbook.mjs
|
|
790
|
+
- node --check tools/vibe-runtime/index.mjs
|
|
791
|
+
- node tools/vibe-runtime-check/index.mjs --root D:/workspace_mine/vibe-coading
|
|
792
|
+
- node tools/vibe-release-check/index.mjs --quiet
|
|
793
|
+
- git diff --check
|
|
794
|
+
|
|
795
|
+
Commit subject: feat(runtime): 添加 Stage 118 顺序阶段运行手册合同
|
|
796
|
+
`, 'utf8');
|
|
797
|
+
fs.writeFileSync(absoluteWeakPlanFile, `# weak runbook plan\n\n- TODO later\n`, 'utf8');
|
|
798
|
+
|
|
799
|
+
const executable = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'planner', '--executable-plan', '--from-file', planFile, '--json', '--root', repoRoot], {}, options), 'planner --executable-plan fixture --json');
|
|
800
|
+
fs.writeFileSync(absoluteExecutablePlanFile, `${JSON.stringify(executable, null, 2)}\n`, 'utf8');
|
|
801
|
+
|
|
802
|
+
const runbook = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-runbook', '--from-plan', planFile, '--from-executable-plan', executablePlanFile, '--json', '--root', repoRoot], {}, options), 'automation --stage-runbook --json');
|
|
803
|
+
assertJsonMarkers(readonlySmokeMarkers(runbook, 'stageRunbook'), 'automation --stage-runbook --json');
|
|
804
|
+
if (!runbook.sequential_stage_runbook?.stage_runbook_digest) throw new Error('stage runbook missing stage_runbook_digest');
|
|
805
|
+
if (!runbook.sequential_stage_runbook?.source_bindings?.executable_plan_digest) throw new Error('stage runbook missing executable plan digest binding');
|
|
806
|
+
if (!runbook.sequential_stage_runbook?.source_bindings?.registry_digest) throw new Error('stage runbook missing registry digest binding');
|
|
807
|
+
if (!runbook.sequential_stage_runbook?.stage_sequence?.some((item) => item.execution_authorized === false && item.actions_executed === false && item.command_execution_authorized === false && item.git_write_authorized === false)) throw new Error('stage runbook stage items must keep execution_authorized/actions_executed=false');
|
|
808
|
+
if (!runbook.sequential_stage_runbook?.stage_order_gate?.per_stage_gates?.every((item) => item.input_required?.length > 0 && item.commit_condition?.commit_execution_authorized === false && item.execution_authorized === false && item.command_execution_authorized === false && item.git_write_authorized === false && Array.isArray(item.mutex_conflicts))) throw new Error('stage runbook order gates must bind inputs, commit conditions, mutex conflicts, and no execution authorization');
|
|
809
|
+
if (!runbook.sequential_stage_runbook?.stage_order_gate?.per_stage_gates?.some((item) => item.dependency_gate === 'previous_stage_must_pass_evidence_and_commit_readiness')) throw new Error('stage runbook order gate missing previous-stage dependency gate');
|
|
810
|
+
assertNoSmokeState(repoRoot, target, 'automation --stage-runbook JSON output');
|
|
811
|
+
|
|
812
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-runbook', '--from-plan', planFile, '--from-executable-plan', executablePlanFile, '--root', repoRoot], {
|
|
813
|
+
expectOutput: ['Vibecoding Runtime Sequential Stage Runbook', 'Stage: Stage 118; Kind: sequential-stage-runbook; pass=true', 'Stages:', 'ready_for_evidence_binding=true', 'Stage order gate: pass=true; per_stage_gates=', 'auto_execution=false; command_execution=false; git_write=false', 'Execution order:', 'Evidence required:', 'Boundary: writes=false; stage_runbook_artifact=false; runbook_artifact=false; source_write=false; plan_mutation=false; sidecar_write=false; state_directory_created=false; command_execution=false; check_execution=false; test_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', 'Stage runbook digest:'],
|
|
814
|
+
}, options);
|
|
815
|
+
assertNoSmokeState(repoRoot, target, 'automation --stage-runbook text output');
|
|
816
|
+
|
|
817
|
+
const weak = parseJsonOutput(run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-runbook', '--from-plan', weakPlanFile, '--json', '--root', repoRoot], {}, options), 'automation --stage-runbook weak --json');
|
|
818
|
+
if (weak.sequential_stage_runbook?.ready_for_evidence_binding !== false) throw new Error('weak stage runbook should not be ready for evidence binding');
|
|
819
|
+
if (weak.sequential_stage_runbook?.stage_order_gate?.pass !== false) throw new Error('weak stage runbook should fail stage_order_gate');
|
|
820
|
+
if (weak.sequential_stage_runbook?.stage_order_gate?.auto_execution !== false) throw new Error('weak stage runbook must not authorize auto execution');
|
|
821
|
+
if (!weak.sequential_stage_runbook?.blocked_reasons?.includes('missing stage_sequence')) throw new Error('weak stage runbook should report missing stage_sequence');
|
|
822
|
+
|
|
823
|
+
runForbiddenFlagChecks(run, ['tools/vibe-runtime/index.mjs', 'automation', '--stage-runbook', '--from-plan', planFile], ['--root', repoRoot], READ_ONLY_RUNTIME_CONTROL_FLAGS_WITH_DRY_RUN_SECOND, 'automation --stage-runbook is read-only', options);
|
|
824
|
+
|
|
825
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--stage-runbook', '--root', repoRoot], {
|
|
826
|
+
allowFailure: true,
|
|
827
|
+
expectOutput: ['automation --stage-runbook requires --from-plan <local-plan-file>'],
|
|
828
|
+
}, options);
|
|
829
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--readiness', '--from-executable-plan', executablePlanFile, '--root', repoRoot], {
|
|
830
|
+
allowFailure: true,
|
|
831
|
+
expectOutput: ['automation --readiness does not accept workflow'],
|
|
832
|
+
}, options);
|
|
833
|
+
run('node', ['tools/vibe-runtime/index.mjs', 'automation', '--one-shot-plan', '--from-file', planFile, '--subject', 'feat(runtime): stage 118 fixture', '--confirm-plan', 'CONFIRM_PLAN_ONLY', '--from-executable-plan', executablePlanFile, '--root', repoRoot], {
|
|
834
|
+
allowFailure: true,
|
|
835
|
+
expectOutput: ['automation --one-shot-plan only accepts one local plan file'],
|
|
836
|
+
}, options);
|
|
837
|
+
} finally {
|
|
838
|
+
cleanupSmokeTmpRoot(absoluteTarget, options);
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
export function releaseCheckStage103118SmokeHandlers(deps) {
|
|
843
|
+
return {
|
|
844
|
+
runAutomationReadinessSmoke: (options) => runAutomationReadinessSmoke(deps, options),
|
|
845
|
+
runWorkflowLoopContractSmoke: (options) => runWorkflowLoopContractSmoke(deps, options),
|
|
846
|
+
runPlanActionManifestSmoke: (options) => runPlanActionManifestSmoke(deps, options),
|
|
847
|
+
runSelfTestProfileSmoke: (options) => runSelfTestProfileSmoke(deps, options),
|
|
848
|
+
runCommitReadinessSmoke: (options) => runCommitReadinessSmoke(deps, options),
|
|
849
|
+
runConfirmedOneShotPlanSmoke: (options) => runConfirmedOneShotPlanSmoke(deps, options),
|
|
850
|
+
runCloseLoopDashboardSmoke: (options) => runCloseLoopDashboardSmoke(deps, options),
|
|
851
|
+
runEvidenceIntakeSmoke: (options) => runEvidenceIntakeSmoke(deps, options),
|
|
852
|
+
runDiffCoverageSmoke: (options) => runDiffCoverageSmoke(deps, options),
|
|
853
|
+
runReviewEnvelopeSmoke: (options) => runReviewEnvelopeSmoke(deps, options),
|
|
854
|
+
runTddTraceSmoke: (options) => runTddTraceSmoke(deps, options),
|
|
855
|
+
runHumanFriendlyAliasSmoke: (options) => runHumanFriendlyAliasSmoke(deps, options),
|
|
856
|
+
runSuperpowersGapSmoke: (options) => runSuperpowersGapSmoke(deps, options),
|
|
857
|
+
runProgressiveEntryUxSmoke: (options) => runProgressiveEntryUxSmoke(deps, options),
|
|
858
|
+
runExecutablePlanSmoke: (options) => runExecutablePlanSmoke(deps, options),
|
|
859
|
+
runStageRunbookSmoke: (options) => runStageRunbookSmoke(deps, options),
|
|
860
|
+
};
|
|
861
|
+
}
|