@1aboveio/skills 0.10.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/LICENSE +3 -0
- package/README.md +90 -0
- package/bin/1aboveio-skills.mjs +18 -0
- package/package.json +28 -0
- package/runtime/skills/distribution/generated/recipes.json +1189 -0
- package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
- package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/backend/airflow-dag-develop/LICENSE +3 -0
- package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
- package/skills/backend/app-debug/LICENSE +3 -0
- package/skills/backend/app-debug/SKILL.md +109 -0
- package/skills/backend/app-debug/references/common-errors.md +128 -0
- package/skills/backend/python-backend/LICENSE +3 -0
- package/skills/backend/python-backend/SKILL.md +326 -0
- package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
- package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
- package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
- package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
- package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
- package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
- package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
- package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
- package/skills/cicd-pipeline/docker/LICENSE +3 -0
- package/skills/cicd-pipeline/docker/SKILL.md +126 -0
- package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
- package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
- package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
- package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
- package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
- package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
- package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
- package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
- package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
- package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
- package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
- package/skills/cicd-pipeline/mergify/LICENSE +3 -0
- package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
- package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
- package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
- package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
- package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
- package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
- package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
- package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
- package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
- package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
- package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
- package/skills/cicd-pipeline/podman/LICENSE +3 -0
- package/skills/cicd-pipeline/podman/SKILL.md +70 -0
- package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
- package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
- package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
- package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
- package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
- package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
- package/skills/engineering/e2e-test/LICENSE +3 -0
- package/skills/engineering/e2e-test/SKILL.md +156 -0
- package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
- package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
- package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
- package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
- package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
- package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
- package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
- package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
- package/skills/engineering/e2e-test/references/debugging.md +36 -0
- package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
- package/skills/engineering/e2e-test/references/reviewing.md +39 -0
- package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
- package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
- package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
- package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
- package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
- package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
- package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
- package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
- package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
- package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
- package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
- package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
- package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
- package/skills/engineering/engineering-runtime/LICENSE +3 -0
- package/skills/engineering/engineering-runtime/SKILL.md +10 -0
- package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
- package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
- package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
- package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
- package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
- package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
- package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
- package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
- package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
- package/skills/engineering/ensure-coverage/LICENSE +3 -0
- package/skills/engineering/ensure-coverage/SKILL.md +136 -0
- package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
- package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
- package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
- package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
- package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
- package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
- package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
- package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
- package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
- package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
- package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
- package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
- package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
- package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
- package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
- package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
- package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
- package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
- package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
- package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
- package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
- package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
- package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
- package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
- package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
- package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
- package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
- package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
- package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
- package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
- package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
- package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
- package/skills/engineering/harness-runtime/LICENSE +3 -0
- package/skills/engineering/harness-runtime/SKILL.md +18 -0
- package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
- package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
- package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
- package/skills/engineering/harness-runtime/contracts.md +15 -0
- package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
- package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
- package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
- package/skills/engineering/harness-runtime/index.mjs +767 -0
- package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
- package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
- package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
- package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
- package/skills/engineering/implement-and-pr/LICENSE +3 -0
- package/skills/engineering/implement-and-pr/SKILL.md +176 -0
- package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
- package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
- package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
- package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
- package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
- package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
- package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
- package/skills/engineering/resolve-issues/LICENSE +3 -0
- package/skills/engineering/resolve-issues/SKILL.md +167 -0
- package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
- package/skills/engineering/resolve-issues/references/breaker.md +82 -0
- package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
- package/skills/engineering/resolve-issues/references/delivery.md +108 -0
- package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
- package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
- package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
- package/skills/engineering/resolve-issues/references/finalization.md +68 -0
- package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
- package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
- package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
- package/skills/engineering/resolve-issues/references/intake.md +86 -0
- package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
- package/skills/engineering/resolve-issues/references/interference.md +87 -0
- package/skills/engineering/resolve-issues/references/loop.md +134 -0
- package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
- package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
- package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
- package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
- package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
- package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
- package/skills/engineering/resolve-issues/references/run-state.md +288 -0
- package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
- package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
- package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
- package/skills/engineering/resolve-issues/references/why.md +653 -0
- package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
- package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
- package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
- package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
- package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
- package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
- package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
- package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
- package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
- package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
- package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
- package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
- package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
- package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
- package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
- package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
- package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
- package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
- package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
- package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
- package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
- package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
- package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
- package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
- package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
- package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
- package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
- package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
- package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
- package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
- package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
- package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
- package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
- package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
- package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
- package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
- package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
- package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
- package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
- package/skills/engineering/resolve-release/LICENSE +3 -0
- package/skills/engineering/resolve-release/SKILL.md +112 -0
- package/skills/engineering/resolve-release/references/assembly.md +137 -0
- package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
- package/skills/engineering/resolve-release/references/candidate.md +167 -0
- package/skills/engineering/resolve-release/references/exposure.md +178 -0
- package/skills/engineering/resolve-release/references/handoff.md +24 -0
- package/skills/engineering/resolve-release/references/postmortem.md +230 -0
- package/skills/engineering/resolve-release/references/preflight.md +207 -0
- package/skills/engineering/resolve-release/references/principles.md +94 -0
- package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
- package/skills/engineering/resolve-release/references/related-skills.md +12 -0
- package/skills/engineering/resolve-release/references/routing.md +149 -0
- package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
- package/skills/engineering/resolve-release/references/versioning.md +202 -0
- package/skills/engineering/resolve-release/references/why.md +53 -0
- package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
- package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
- package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
- package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
- package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
- package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
- package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
- package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
- package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
- package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
- package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
- package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
- package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
- package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
- package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
- package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
- package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
- package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
- package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
- package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
- package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
- package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
- package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
- package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
- package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
- package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
- package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
- package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
- package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
- package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
- package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
- package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/README.md +60 -0
- package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
- package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
- package/skills/engineering/review-pr/LICENSE +3 -0
- package/skills/engineering/review-pr/SKILL.md +123 -0
- package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
- package/skills/engineering/review-pr/references/code-correctness.md +5 -0
- package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
- package/skills/engineering/review-pr/references/coordination.md +18 -0
- package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
- package/skills/engineering/review-pr/references/finding-themes.md +7 -0
- package/skills/engineering/review-pr/references/github-posting.md +98 -0
- package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
- package/skills/engineering/review-pr/references/incremental-output.md +16 -0
- package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
- package/skills/engineering/review-pr/references/output-format.md +99 -0
- package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
- package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
- package/skills/engineering/review-pr/references/re-review.md +18 -0
- package/skills/engineering/review-pr/references/review-method.md +199 -0
- package/skills/engineering/review-pr/references/review-mode.md +30 -0
- package/skills/engineering/review-pr/references/review-posture.md +53 -0
- package/skills/engineering/review-pr/references/round1-depth.md +62 -0
- package/skills/engineering/review-pr/references/scripts.md +17 -0
- package/skills/engineering/review-pr/references/workflow.md +16 -0
- package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
- package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
- package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
- package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
- package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
- package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
- package/skills/engineering/smoke/LICENSE +3 -0
- package/skills/engineering/smoke/SKILL.md +131 -0
- package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
- package/skills/engineering/smoke/references/manifest.md +192 -0
- package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
- package/skills/fullstack/better-auth/LICENSE +3 -0
- package/skills/fullstack/better-auth/SKILL.md +601 -0
- package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
- package/skills/fullstack/monorepo/LICENSE +3 -0
- package/skills/fullstack/monorepo/SKILL.md +465 -0
- package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
- package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
- package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
- package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
- package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
- package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
- package/skills/fullstack/prisma-setup/LICENSE +3 -0
- package/skills/fullstack/prisma-setup/SKILL.md +180 -0
- package/skills/fullstack/prisma-setup/nextjs.md +258 -0
- package/skills/fullstack/prisma-setup/turborepo.md +301 -0
- package/skills/fullstack/shadcn/LICENSE +3 -0
- package/skills/fullstack/shadcn/SKILL.md +119 -0
- package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
- package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
- package/skills/fullstack/shadcn/cli.md +411 -0
- package/skills/fullstack/shadcn/customization.md +224 -0
- package/skills/fullstack/shadcn/evals/evals.json +90 -0
- package/skills/fullstack/shadcn/mcp.md +101 -0
- package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
- package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
- package/skills/fullstack/shadcn/rules/composition.md +195 -0
- package/skills/fullstack/shadcn/rules/data-table.md +201 -0
- package/skills/fullstack/shadcn/rules/forms.md +255 -0
- package/skills/fullstack/shadcn/rules/icons.md +103 -0
- package/skills/fullstack/shadcn/rules/styling.md +167 -0
- package/skills/fullstack/zod-v4/LICENSE +3 -0
- package/skills/fullstack/zod-v4/SKILL.md +287 -0
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// sandbox-selftest — MECHANIZES references/sandboxed-testing.md. Mutation testing
|
|
3
|
+
// (flip a predicate, delete a bound, revert a guard, then confirm the suite
|
|
4
|
+
// notices) must never run against this skill's live working tree — a corruption
|
|
5
|
+
// you forget to revert ships. (Named incident: during the #387 audit, a mutation
|
|
6
|
+
// test in place left `PRUNE_AFTER_DAYS = 6000` behind in an uncommitted tree; had
|
|
7
|
+
// it survived, catalog pruning would have shipped disabled for ~16 years.)
|
|
8
|
+
//
|
|
9
|
+
// The safe method is a scratch copy — but a bare copy of resolve-issues does not
|
|
10
|
+
// run clean: some tests import `../../review-pr/scripts/...` (a bare copy has no
|
|
11
|
+
// sibling `review-pr` beside it — the flat distribution model installs
|
|
12
|
+
// this skill AS a sibling of review-pr and engineering-runtime, not standalone), and some tests walk up
|
|
13
|
+
// to the repo root that a scratch copy has no parent for. So the recipe is: copy
|
|
14
|
+
// the skill to a temp dir, symlink the sibling skills beside it, run the suites,
|
|
15
|
+
// and confirm the ONLY failures are the KNOWN repo-root-dependent tests — the ones
|
|
16
|
+
// that read files above the copy (a repo-root fixture, or repo-root SKILL.md /
|
|
17
|
+
// CLAUDE.md) and therefore cannot pass in any isolated sandbox.
|
|
18
|
+
//
|
|
19
|
+
// The baseline is NOT a magic count ("total minus one"): the set of repo-root
|
|
20
|
+
// tests grows and shrinks as the suite evolves, so the check is set-based, matched
|
|
21
|
+
// by test name + file. Every non-baseline verdict NAMES which test moved:
|
|
22
|
+
// - a failure OUTSIDE the known set → a real regression;
|
|
23
|
+
// - a known-set test that unexpectedly PASSES → it no longer depends on repo
|
|
24
|
+
// root; the environment changed, and the fix is to remove it from the set.
|
|
25
|
+
//
|
|
26
|
+
// node sandbox-selftest.mjs # sandbox resolve-issues, run, verify
|
|
27
|
+
// node sandbox-selftest.mjs --skill review-pr # a different skill under test
|
|
28
|
+
// node sandbox-selftest.mjs --keep # leave the sandbox on disk for debugging
|
|
29
|
+
// node sandbox-selftest.mjs --help # usage + exit 0
|
|
30
|
+
//
|
|
31
|
+
// NEVER mutates the real skill tree: every file operation lands in an OS temp dir
|
|
32
|
+
// (`mkdtempSync`), the siblings are symlinked read-only-in-intent, and the sandbox
|
|
33
|
+
// is removed on exit unless `--keep`.
|
|
34
|
+
//
|
|
35
|
+
// EXIT CODES:
|
|
36
|
+
// 0 baseline held — exactly the known repo-root-dependent tests failed, nothing else
|
|
37
|
+
// 1 anomaly — a real regression, or a known-set test that moved (named either way)
|
|
38
|
+
// 2 usage error, or setup failure (skill not found, no tests ran)
|
|
39
|
+
|
|
40
|
+
import fs from 'node:fs'
|
|
41
|
+
import os from 'node:os'
|
|
42
|
+
import path from 'node:path'
|
|
43
|
+
import { fileURLToPath } from 'node:url'
|
|
44
|
+
import { execFileSync } from 'node:child_process'
|
|
45
|
+
import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
|
|
46
|
+
|
|
47
|
+
// The sibling skills symlinked beside the copy. `review-pr` is the one actually
|
|
48
|
+
// imported by the suite (`scripts/fix-rounds.mjs` → `../../review-pr/scripts/...`);
|
|
49
|
+
// the rest round out parity with the skills resolve-issues orchestrates
|
|
50
|
+
// (SKILL.md frontmatter `dependencies:`), in case a broader sandbox session
|
|
51
|
+
// touches them too.
|
|
52
|
+
export const SIBLINGS = ['review-pr', 'implement-and-pr', 'ensure-coverage', 'e2e-test', 'smoke']
|
|
53
|
+
|
|
54
|
+
// `engineering-runtime` is a support package and is NOT optional: every CLI script in this family
|
|
55
|
+
// imports `../../engineering-runtime/scripts/main-module.mjs` for its main-guard (#718/#446), so a
|
|
56
|
+
// sandbox without it fails at module load in every suite at once. Listed separately from SIBLINGS
|
|
57
|
+
// because it supplies runtime support rather than an orchestrated user workflow.
|
|
58
|
+
export const SHARED_RUNTIME = 'engineering-runtime'
|
|
59
|
+
|
|
60
|
+
// The tests that CANNOT pass in an isolated sandbox because they resolve paths
|
|
61
|
+
// ABOVE the copy — a repo-root fixture, or repo-root SKILL.md/CLAUDE.md/run-state.md.
|
|
62
|
+
// The baseline is "total minus this set", verified by FILE + a distinctive
|
|
63
|
+
// name fragment (`nameIncludes`), robust to reordering AND to a suffix tweak.
|
|
64
|
+
// Keyed by skill; a skill with no repo-root-dependent tests has an empty set (any
|
|
65
|
+
// failure is then a real regression). Adding/removing a repo-root test here is a
|
|
66
|
+
// one-line diff, and this script flags a member that stops failing so the set
|
|
67
|
+
// can't silently drift out of date (the drift that made "total minus one" wrong —
|
|
68
|
+
// see references/sandboxed-testing.md).
|
|
69
|
+
//
|
|
70
|
+
// The fragments deliberately omit the obsolete `units[].`-prefixed field token that
|
|
71
|
+
// some of these artifact-audit test names carry: this file is a real gate script,
|
|
72
|
+
// and artifact-audit's own delete-safety test asserts NO gate script references
|
|
73
|
+
// that deleted field. A fragment without that token is still distinctive enough to
|
|
74
|
+
// identify the test uniquely without re-introducing a false reader.
|
|
75
|
+
//
|
|
76
|
+
// resolve-issues, as of #406:
|
|
77
|
+
// - run-state-review6: cause 3 — reads ../../../../docs/evidence/809-runtime-smoke.json.
|
|
78
|
+
// - 5 × artifact-audit (#379/#397): cause 4 — walk ../../../.. to read repo-root
|
|
79
|
+
// skills/SKILL.md, CLAUDE.md, run-state.md, and to scan the whole skills/ tree.
|
|
80
|
+
export const KNOWN_FAILING_TESTS = {
|
|
81
|
+
'resolve-issues': [
|
|
82
|
+
{
|
|
83
|
+
file: 'run-state-review6.test.mjs',
|
|
84
|
+
nameIncludes: 'one public table-driven executor runs every literal 42-cell case',
|
|
85
|
+
},
|
|
86
|
+
{ file: 'artifact-audit.test.mjs', nameIncludes: 'has no machine reader anywhere in the real gate scripts' },
|
|
87
|
+
{ file: 'artifact-audit.test.mjs', nameIncludes: 'none of the three SKILL.md files mandate' },
|
|
88
|
+
{ file: 'artifact-audit.test.mjs', nameIncludes: 'run-state.md no longer documents' },
|
|
89
|
+
{ file: 'artifact-audit.test.mjs', nameIncludes: 'resolve-issues SKILL.md instructs only unit statuses the code accepts' },
|
|
90
|
+
{ file: 'artifact-audit.test.mjs', nameIncludes: 'CLAUDE.md records which CI machinery is unwired in this repo' },
|
|
91
|
+
],
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function knownFailingFor(skill) {
|
|
95
|
+
return KNOWN_FAILING_TESTS[skill] ?? []
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ---- setupSandbox: the copy + symlink layout (pure fs, unit-testable) ----
|
|
99
|
+
|
|
100
|
+
// Copy <repoRoot>/skills/engineering/<skill> into <parentDir>/<skill> as a REAL
|
|
101
|
+
// copy, then symlink each sibling skill beside it (skipping the skill under test
|
|
102
|
+
// itself, so a `--skill review-pr` run does not shadow its own copy) plus the shared
|
|
103
|
+
// runtime package. Returns the copy dir and the symlinks created. Throws (→ exit 2) if the
|
|
104
|
+
// skill is not found, or if engineering-runtime is missing — see SHARED_RUNTIME.
|
|
105
|
+
export function setupSandbox({ repoRoot, skill = 'resolve-issues', parentDir, siblings = SIBLINGS }) {
|
|
106
|
+
const engineeringDir = path.join(repoRoot, 'skills', 'engineering')
|
|
107
|
+
const src = path.join(engineeringDir, skill)
|
|
108
|
+
if (!fs.existsSync(src)) {
|
|
109
|
+
throw new Error(`sandbox-selftest: skill "${skill}" not found at ${src}`)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const skillCopyDir = path.join(parentDir, skill)
|
|
113
|
+
// cpSync recursive makes an independent copy — a mutation in the copy never
|
|
114
|
+
// reaches the source. (Symlinks inside the source, if any, are copied as links.)
|
|
115
|
+
fs.cpSync(src, skillCopyDir, { recursive: true })
|
|
116
|
+
|
|
117
|
+
const symlinks = []
|
|
118
|
+
for (const name of siblings) {
|
|
119
|
+
if (name === skill) continue // never symlink a sibling over the copy under test
|
|
120
|
+
const target = path.join(engineeringDir, name)
|
|
121
|
+
if (!fs.existsSync(target)) continue // a missing optional sibling is not fatal
|
|
122
|
+
const link = path.join(parentDir, name)
|
|
123
|
+
fs.symlinkSync(target, link)
|
|
124
|
+
symlinks.push({ name, target, link })
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Hard-failed rather than skipped like an optional sibling: without it EVERY suite dies at import
|
|
128
|
+
// and the run reports a meaningless zero.
|
|
129
|
+
const runtimeTarget = path.join(engineeringDir, SHARED_RUNTIME)
|
|
130
|
+
if (!fs.existsSync(runtimeTarget)) {
|
|
131
|
+
throw new Error(`sandbox-selftest: shared ${SHARED_RUNTIME} not found at ${runtimeTarget} — every main-guard imports it`)
|
|
132
|
+
}
|
|
133
|
+
const runtimeLink = path.join(parentDir, SHARED_RUNTIME)
|
|
134
|
+
fs.symlinkSync(runtimeTarget, runtimeLink)
|
|
135
|
+
symlinks.push({ name: SHARED_RUNTIME, target: runtimeTarget, link: runtimeLink })
|
|
136
|
+
|
|
137
|
+
return { skillCopyDir, symlinks }
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ---- parseTapSummary: pass/total/failing-test extraction (pure, unit-testable) ----
|
|
141
|
+
|
|
142
|
+
// Parse the tail of `node --test --test-reporter=tap` output into
|
|
143
|
+
// { tests, pass, fail, failingTests }. The summary block is the authoritative
|
|
144
|
+
// count (`# tests N`, `# pass N`, `# fail N`); each failing test is captured as
|
|
145
|
+
// { name, file } — the name from its `not ok N - <name>` line (TAP directive
|
|
146
|
+
// suffixes stripped), the file basename from the `location:` field of its YAML
|
|
147
|
+
// diagnostic block (null if absent). Throws if no summary block is present — a run
|
|
148
|
+
// that produced no counts is a setup failure, not a zero-pass result.
|
|
149
|
+
export function parseTapSummary(output) {
|
|
150
|
+
const num = (label) => {
|
|
151
|
+
const m = output.match(new RegExp(`^# ${label} (\\d+)$`, 'm'))
|
|
152
|
+
return m ? Number(m[1]) : null
|
|
153
|
+
}
|
|
154
|
+
const tests = num('tests')
|
|
155
|
+
const pass = num('pass')
|
|
156
|
+
const fail = num('fail')
|
|
157
|
+
if (tests === null || pass === null || fail === null) {
|
|
158
|
+
throw new Error('sandbox-selftest: no TAP summary (# tests/# pass/# fail) found in `node --test` output')
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const failingTests = []
|
|
162
|
+
let pending = null
|
|
163
|
+
const flush = () => {
|
|
164
|
+
if (pending) failingTests.push(pending)
|
|
165
|
+
pending = null
|
|
166
|
+
}
|
|
167
|
+
for (const line of output.split('\n')) {
|
|
168
|
+
const nok = /^not ok \d+ - (.+)$/.exec(line)
|
|
169
|
+
if (nok) {
|
|
170
|
+
flush()
|
|
171
|
+
pending = { name: nok[1].replace(/\s+#\s+(TODO|SKIP).*$/i, '').trim(), file: null }
|
|
172
|
+
continue
|
|
173
|
+
}
|
|
174
|
+
if (pending) {
|
|
175
|
+
// location: '/abs/path/to/file.test.mjs:LINE:COL' → take the basename.
|
|
176
|
+
const loc = /^\s*location:\s*'(.+):\d+:\d+'\s*$/.exec(line)
|
|
177
|
+
if (loc) {
|
|
178
|
+
pending.file = path.basename(loc[1])
|
|
179
|
+
flush()
|
|
180
|
+
continue
|
|
181
|
+
}
|
|
182
|
+
if (/^\s*\.\.\.\s*$/.test(line)) flush() // YAML block ended with no location
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
flush()
|
|
186
|
+
|
|
187
|
+
return { tests, pass, fail, failingTests }
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ---- evaluateBaseline: the set-based verdict (pure, unit-testable) ----
|
|
191
|
+
|
|
192
|
+
// A known member matches a failing test when the failing test's name contains the
|
|
193
|
+
// member's distinctive fragment and the files agree (or the failing test carried
|
|
194
|
+
// no parseable file).
|
|
195
|
+
function matches(known, failing) {
|
|
196
|
+
return failing.name.includes(known.nameIncludes) && (failing.file == null || known.file === failing.file)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Given combined { tests, pass, failingTests } and the skill's knownSet of
|
|
200
|
+
// repo-root-dependent tests, decide whether the sandbox baseline held: the ONLY
|
|
201
|
+
// failures are exactly the known set. Every non-baseline verdict names the
|
|
202
|
+
// offending test. kind ∈ 'baseline' | 'regression' | 'moved' | 'empty'.
|
|
203
|
+
export function evaluateBaseline({ tests, pass, failingTests = [], knownSet = [] }) {
|
|
204
|
+
if (tests === 0) {
|
|
205
|
+
return {
|
|
206
|
+
ok: false,
|
|
207
|
+
kind: 'empty',
|
|
208
|
+
message:
|
|
209
|
+
'no tests ran in the sandbox — the copy or the suites did not execute. This is a setup failure, not a baseline result.',
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const unexpected = failingTests.filter((f) => !knownSet.some((k) => matches(k, f)))
|
|
214
|
+
const missing = knownSet.filter((k) => !failingTests.some((f) => matches(k, f)))
|
|
215
|
+
|
|
216
|
+
if (unexpected.length > 0) {
|
|
217
|
+
let message =
|
|
218
|
+
`REGRESSION: ${pass}/${tests} passing, and ${unexpected.length} failure(s) are NOT in the known ` +
|
|
219
|
+
`repo-root-dependent set — a real regression, not a sandbox artifact:\n - ` +
|
|
220
|
+
unexpected.map((f) => `${f.name}${f.file ? ` (${f.file})` : ''}`).join('\n - ')
|
|
221
|
+
if (missing.length > 0) {
|
|
222
|
+
message +=
|
|
223
|
+
`\nAlso, ${missing.length} known-set test(s) unexpectedly PASSED — the known set is also out of date ` +
|
|
224
|
+
`(they no longer depend on repo root; remove them from KNOWN_FAILING_TESTS):\n - ` +
|
|
225
|
+
missing.map((k) => `${k.nameIncludes} (${k.file})`).join('\n - ')
|
|
226
|
+
}
|
|
227
|
+
return { ok: false, kind: 'regression', message }
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (missing.length > 0) {
|
|
231
|
+
return {
|
|
232
|
+
ok: false,
|
|
233
|
+
kind: 'moved',
|
|
234
|
+
message:
|
|
235
|
+
`A KNOWN TEST MOVED: ${pass}/${tests} passing, no unexpected failures, but ${missing.length} test(s) ` +
|
|
236
|
+
`that were expected to fail in a sandbox PASSED:\n - ` +
|
|
237
|
+
missing.map((k) => `${k.nameIncludes} (${k.file})`).join('\n - ') +
|
|
238
|
+
`\nThis test no longer depends on repo root — remove it from the known set ` +
|
|
239
|
+
`(KNOWN_FAILING_TESTS in sandbox-selftest.mjs). Until then the baseline can't be trusted.`,
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return {
|
|
244
|
+
ok: true,
|
|
245
|
+
kind: 'baseline',
|
|
246
|
+
message:
|
|
247
|
+
`baseline held: ${pass}/${tests} passing. Exactly the ${knownSet.length} known repo-root-dependent ` +
|
|
248
|
+
`test(s) failed, nothing else.`,
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ---- suite execution (the multi-minute part; not unit-tested) ----
|
|
253
|
+
|
|
254
|
+
// Enumerate the *.test.mjs files under scripts/ and workflows/ of the copy.
|
|
255
|
+
function discoverTestFiles(skillCopyDir) {
|
|
256
|
+
const files = []
|
|
257
|
+
for (const sub of ['scripts', 'workflows']) {
|
|
258
|
+
const dir = path.join(skillCopyDir, sub)
|
|
259
|
+
if (!fs.existsSync(dir)) continue
|
|
260
|
+
for (const f of fs.readdirSync(dir)) {
|
|
261
|
+
if (f.endsWith('.test.mjs')) files.push(path.join(dir, f))
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return files.sort()
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Run `node --test --test-reporter=tap <files>` from the copy dir and return the
|
|
268
|
+
// captured stdout (the suite is EXPECTED to exit non-zero: the known repo-root
|
|
269
|
+
// tests fail). cwd is the copy so repo-root-relative walks resolve — and fail —
|
|
270
|
+
// exactly as in a real sandbox.
|
|
271
|
+
function runSuites(skillCopyDir, testFiles) {
|
|
272
|
+
let stdout = ''
|
|
273
|
+
try {
|
|
274
|
+
stdout = execFileSync('node', ['--test', '--test-reporter=tap', ...testFiles], {
|
|
275
|
+
cwd: skillCopyDir,
|
|
276
|
+
encoding: 'utf8',
|
|
277
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
278
|
+
})
|
|
279
|
+
} catch (err) {
|
|
280
|
+
// node --test exits non-zero when any test fails — that is the expected path.
|
|
281
|
+
stdout = err.stdout ?? ''
|
|
282
|
+
}
|
|
283
|
+
return stdout
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// ---- CLI ----
|
|
287
|
+
|
|
288
|
+
const USAGE = `sandbox-selftest — mechanizes references/sandboxed-testing.md.
|
|
289
|
+
|
|
290
|
+
Copies a skill (default resolve-issues) into an OS temp dir, symlinks the sibling
|
|
291
|
+
skills beside it, runs its scripts/*.test.mjs + workflows/*.test.mjs suites, and
|
|
292
|
+
verifies the ONLY failures are the known repo-root-dependent tests — the ones that
|
|
293
|
+
read files above the copy (a repo-root fixture, or repo-root SKILL.md/CLAUDE.md)
|
|
294
|
+
and so cannot pass in any isolated sandbox. The baseline is the suite TOTAL MINUS
|
|
295
|
+
that named set (not a magic count): a failure outside the set is a real regression,
|
|
296
|
+
and a known-set test that starts passing is flagged so the set stays honest. On
|
|
297
|
+
any mismatch it names which test moved. The real skill tree is never mutated — all
|
|
298
|
+
work happens in the temp dir.
|
|
299
|
+
|
|
300
|
+
Usage:
|
|
301
|
+
node sandbox-selftest.mjs [--skill <name>] [--keep]
|
|
302
|
+
node sandbox-selftest.mjs --help
|
|
303
|
+
|
|
304
|
+
Options:
|
|
305
|
+
--skill <name> skill under test (default: resolve-issues)
|
|
306
|
+
--keep leave the temp sandbox on disk (prints its path) for debugging
|
|
307
|
+
--help, -h print this usage and exit 0
|
|
308
|
+
|
|
309
|
+
Exit codes:
|
|
310
|
+
0 baseline held: exactly the known repo-root-dependent tests failed, nothing else
|
|
311
|
+
1 anomaly: a real regression, or a known-set test that moved (named either way)
|
|
312
|
+
2 usage error, or setup failure (skill not found / no tests ran)`
|
|
313
|
+
|
|
314
|
+
export function parseArgs(argv) {
|
|
315
|
+
const f = { skill: 'resolve-issues' }
|
|
316
|
+
for (let i = 0; i < argv.length; i++) {
|
|
317
|
+
const a = argv[i]
|
|
318
|
+
if (a === '--help' || a === '-h' || a === 'help') f.help = true
|
|
319
|
+
else if (a === '--keep') f.keep = true
|
|
320
|
+
else if (a === '--skill') {
|
|
321
|
+
f.skill = argv[++i]
|
|
322
|
+
if (!f.skill) f.unknown = '--skill (missing value)'
|
|
323
|
+
} else if (a.startsWith('--skill=')) f.skill = a.slice('--skill='.length)
|
|
324
|
+
else f.unknown = a
|
|
325
|
+
}
|
|
326
|
+
return f
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// repoRoot is four levels up from this script: <root>/skills/engineering/resolve-issues/scripts.
|
|
330
|
+
export function repoRootFromScript(scriptPath) {
|
|
331
|
+
return path.resolve(path.dirname(scriptPath), '..', '..', '..', '..')
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
export function runCli(argv, { scriptPath } = {}) {
|
|
335
|
+
const f = parseArgs(argv)
|
|
336
|
+
if (f.help) {
|
|
337
|
+
console.log(USAGE)
|
|
338
|
+
return 0
|
|
339
|
+
}
|
|
340
|
+
if (f.unknown) {
|
|
341
|
+
console.error(`sandbox-selftest: unknown argument "${f.unknown}"\n\n${USAGE}`)
|
|
342
|
+
return 2
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const repoRoot = repoRootFromScript(scriptPath ?? fileURLToPath(import.meta.url))
|
|
346
|
+
const parentDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sandbox-selftest-'))
|
|
347
|
+
const cleanup = () => {
|
|
348
|
+
if (f.keep) console.error(`sandbox-selftest: --keep set, sandbox retained at ${parentDir}`)
|
|
349
|
+
else fs.rmSync(parentDir, { recursive: true, force: true })
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
let setup
|
|
353
|
+
try {
|
|
354
|
+
setup = setupSandbox({ repoRoot, skill: f.skill, parentDir })
|
|
355
|
+
} catch (err) {
|
|
356
|
+
console.error(err.message)
|
|
357
|
+
cleanup()
|
|
358
|
+
return 2
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
console.error(`sandbox-selftest: sandbox at ${setup.skillCopyDir}`)
|
|
362
|
+
console.error(`sandbox-selftest: symlinked siblings — ${setup.symlinks.map((s) => s.name).join(', ')}`)
|
|
363
|
+
|
|
364
|
+
const testFiles = discoverTestFiles(setup.skillCopyDir)
|
|
365
|
+
if (testFiles.length === 0) {
|
|
366
|
+
console.error(`sandbox-selftest: no *.test.mjs files found under ${f.skill}/{scripts,workflows}`)
|
|
367
|
+
cleanup()
|
|
368
|
+
return 2
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const output = runSuites(setup.skillCopyDir, testFiles)
|
|
372
|
+
|
|
373
|
+
let summary
|
|
374
|
+
try {
|
|
375
|
+
summary = parseTapSummary(output)
|
|
376
|
+
} catch (err) {
|
|
377
|
+
console.error(err.message)
|
|
378
|
+
cleanup()
|
|
379
|
+
return 2
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const verdict = evaluateBaseline({ ...summary, knownSet: knownFailingFor(f.skill) })
|
|
383
|
+
cleanup()
|
|
384
|
+
|
|
385
|
+
if (verdict.ok) {
|
|
386
|
+
console.error(`sandbox-selftest: ✓ ${verdict.message}`)
|
|
387
|
+
return 0
|
|
388
|
+
}
|
|
389
|
+
console.error(`sandbox-selftest: ✗ ${verdict.message}`)
|
|
390
|
+
return verdict.kind === 'empty' ? 2 : 1
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
if (isMainModule(import.meta.url)) {
|
|
394
|
+
process.exit(runCli(process.argv.slice(2), { scriptPath: fileURLToPath(import.meta.url) }))
|
|
395
|
+
}
|