@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,451 @@
|
|
|
1
|
+
# Coverage gates — GitHub Actions template (satisfies ensure-coverage references/enforcement/ci-contract.md).
|
|
2
|
+
#
|
|
3
|
+
# Each gate is its own BLOCKING job, none standing in for another. Two of the three
|
|
4
|
+
# lanes live in this file (the release lane lives in resolve-release):
|
|
5
|
+
# PR lane (every PR, fast): inventory, accounting, render sweep, no-over-mock, the
|
|
6
|
+
# Review-Contract checklist validate, the quarantine auto-resurface gate, and the
|
|
7
|
+
# curated E2E SMOKE golden-path liveness gate (gate 8) — the minimal valuable floor.
|
|
8
|
+
# Integration/nightly lane (heavy, before release): the broad functional + journey E2E
|
|
9
|
+
# suite (gate 4), demoted OFF the per-PR critical path via `if:` below — it runs on
|
|
10
|
+
# the integration-branch push and nightly, and is verified green before release.
|
|
11
|
+
# Plus the meta-gate that runs ci-audit against this file so the gates can't be silently
|
|
12
|
+
# dropped, and the `all-gates` UMBRELLA job branch protection points at. Copy to
|
|
13
|
+
# .github/workflows/coverage-gates.yml and replace <…>. Verify it stays wired with
|
|
14
|
+
# ensure-coverage's CI audit (see references/enforcement/ci-contract.md).
|
|
15
|
+
#
|
|
16
|
+
# Conventions this template encodes (see e2e-test references/ci-playwright-container.md
|
|
17
|
+
# and references/ci-integration.md):
|
|
18
|
+
# 1. DOCKER-PREFERRED: every browser job runs in the official pinned Playwright
|
|
19
|
+
# container (browsers + OS deps ship in the image — nothing to install per job).
|
|
20
|
+
# The plain-runner alternative (`npx playwright install --with-deps chromium` on
|
|
21
|
+
# ubuntu-latest) is documented but NOT the default. Keep every image pin in this
|
|
22
|
+
# file IDENTICAL and matching the repo's @playwright/test version.
|
|
23
|
+
# 2. SHARED DEPENDENCY INSTALL: one pnpm store cache (same key + restore-keys) is
|
|
24
|
+
# shared by every job and every run — after the first warm run, jobs restore
|
|
25
|
+
# instead of downloading, and a lockfile bump restores the previous store and
|
|
26
|
+
# only fetches the delta. (On the very first run after a bump, parallel jobs
|
|
27
|
+
# each miss and download — one save wins; steady-state is shared.)
|
|
28
|
+
# 3. TIME BUDGET: PR-lane jobs carry `timeout-minutes: 5` — the per-PR floor targets
|
|
29
|
+
# ≤5 min wall clock. Only the demoted integration-lane suite gets a longer leash.
|
|
30
|
+
# 4. UMBRELLA: branch protection requires ONLY the `all-gates` job (see bottom) — a
|
|
31
|
+
# renamed/added gate can never silently fall out of protection.
|
|
32
|
+
|
|
33
|
+
name: Coverage Gates
|
|
34
|
+
on:
|
|
35
|
+
pull_request:
|
|
36
|
+
push:
|
|
37
|
+
branches: [integration] # the resolve-issues epic integration branch — runs the heavy E2E lane (REQUIRED before release)
|
|
38
|
+
# OPTIONAL extra cadence — uncomment to also run the broad suite nightly. Not required:
|
|
39
|
+
# the integration-branch push above is the gate that blocks release. Nightly only adds
|
|
40
|
+
# a time-based catch for drift between integration pushes.
|
|
41
|
+
# schedule:
|
|
42
|
+
# - cron: '0 3 * * *'
|
|
43
|
+
|
|
44
|
+
# ONE pinned image for every browser job — keep the tag identical everywhere in this
|
|
45
|
+
# file and aligned with the repo's @playwright/test version (mismatch → either a
|
|
46
|
+
# network `playwright install` per run, or protocol failures). Bump both together.
|
|
47
|
+
# (GitHub Actions can't interpolate workflow env into `container.image`, so the tag is
|
|
48
|
+
# repeated below — this comment is the single place that says which tag is canonical.)
|
|
49
|
+
# Canonical pin: mcr.microsoft.com/playwright:v1.61.0-noble
|
|
50
|
+
|
|
51
|
+
jobs:
|
|
52
|
+
# Static test-lint gates — fails if this PR ADDS a banned pattern to a test file:
|
|
53
|
+
# a skip/focus/xfail (no-skip), a fixed sleep (no-fixed-timeout), an empty test
|
|
54
|
+
# (no-empty-test), or a mock of a first-party internal seam (mock-internal-seam,
|
|
55
|
+
# default-on). Decidable, deterministic, ~zero false positives. Inherited diff-mode
|
|
56
|
+
# violations are left alone; a PR may not introduce a new one. Add rules in lint-tests.mjs.
|
|
57
|
+
lint-tests:
|
|
58
|
+
runs-on: ubuntu-latest
|
|
59
|
+
timeout-minutes: 5
|
|
60
|
+
steps:
|
|
61
|
+
- uses: actions/checkout@v4
|
|
62
|
+
with: { fetch-depth: 0 } # need the base commit for the diff
|
|
63
|
+
- uses: actions/setup-node@v4
|
|
64
|
+
with: { node-version: 20 }
|
|
65
|
+
- run: node <ensure-coverage>/scripts/lint-tests.mjs --diff "origin/${{ github.base_ref }}"
|
|
66
|
+
# Gate 5 — no over-mock (depth axis), WHOLE-TREE lane: inherited first-party-seam
|
|
67
|
+
# mocks block until removed (the --diff run above already covers newly-added ones).
|
|
68
|
+
# Zero-tolerance, no waiver; ci-audit looks for `mock-internal-seam` by name.
|
|
69
|
+
- run: node <ensure-coverage>/scripts/lint-tests.mjs --rules mock-internal-seam
|
|
70
|
+
|
|
71
|
+
# Gate 1 — inventory freshness (a new route can't be silently uncovered).
|
|
72
|
+
inventory-freshness:
|
|
73
|
+
runs-on: ubuntu-latest
|
|
74
|
+
timeout-minutes: 5
|
|
75
|
+
steps:
|
|
76
|
+
- uses: actions/checkout@v4
|
|
77
|
+
- uses: actions/setup-node@v4
|
|
78
|
+
with: { node-version: 20 }
|
|
79
|
+
- run: node scripts/gen-inventory.mjs # INVENTORY-CONTRACT adapter → surface-inventory.json
|
|
80
|
+
- run: node <e2e-test>/scripts/project-route-manifest.mjs --inventory docs/tests/_generated/surface-inventory.json --overlay e2e/route-manifest.overlay.json --out e2e/route-manifest.json
|
|
81
|
+
- run: git diff --exit-code docs/tests/_generated/surface-inventory.json e2e/route-manifest.json
|
|
82
|
+
|
|
83
|
+
# Gate 2 — accounting (ledger). Static; proves a qualifying test was AUTHORED.
|
|
84
|
+
coverage-accounting:
|
|
85
|
+
runs-on: ubuntu-latest
|
|
86
|
+
timeout-minutes: 5
|
|
87
|
+
steps:
|
|
88
|
+
- uses: actions/checkout@v4
|
|
89
|
+
- uses: actions/setup-node@v4
|
|
90
|
+
with: { node-version: 20 }
|
|
91
|
+
- run: node <ensure-coverage>/scripts/coverage-ledger.mjs validate # fails on Missing/Over-mocked/Unverified
|
|
92
|
+
|
|
93
|
+
# Gate 6 — Review-Contract checklist validate. Static; the anti-ritual guard that
|
|
94
|
+
# every PASS/FAIL checklist row carries an evidence locator (file:line / `command` /
|
|
95
|
+
# #issue) and no gate row is left TODO. Doctrine: ensure-coverage hooks.md (CI tier) —
|
|
96
|
+
# it runs at the implement-and-pr gate step AND here. Point --target at the committed
|
|
97
|
+
# Review-Contract checklist doc (or the file the PR body's checklist is extracted to).
|
|
98
|
+
coverage-checklist:
|
|
99
|
+
runs-on: ubuntu-latest
|
|
100
|
+
timeout-minutes: 5
|
|
101
|
+
steps:
|
|
102
|
+
- uses: actions/checkout@v4
|
|
103
|
+
- uses: actions/setup-node@v4
|
|
104
|
+
with: { node-version: 20 }
|
|
105
|
+
- run: node <ensure-coverage>/scripts/coverage-checklist.mjs validate <docs/tests/CONTRACT-CHECKLIST.md>
|
|
106
|
+
|
|
107
|
+
# Gate 6b — Review-Contract evidence-block freshness. The block is stamped with the
|
|
108
|
+
# HEAD it describes and `validate` fails when the stamp isn't that HEAD.
|
|
109
|
+
# `implement-and-pr` already tells the producer to run it, but that is an instruction
|
|
110
|
+
# to do something last, and a fix round is exactly when a later commit appears. CI
|
|
111
|
+
# runs on the push that broke the stamp, so it can't be outrun. (Named incident: five
|
|
112
|
+
# docs-only "record round N evidence" commits on one PR, each invalidated by the next,
|
|
113
|
+
# generating evidence-fidelity findings for three consecutive rounds.)
|
|
114
|
+
#
|
|
115
|
+
# The `ref` below is load-bearing: actions/checkout defaults to the PR merge ref, so
|
|
116
|
+
# HEAD would be a synthetic merge commit, not the PR head the block was stamped at —
|
|
117
|
+
# without it this gate red-lights every correct PR, and a gate that cries wolf gets
|
|
118
|
+
# switched off within a day.
|
|
119
|
+
evidence-block:
|
|
120
|
+
runs-on: ubuntu-latest
|
|
121
|
+
timeout-minutes: 5
|
|
122
|
+
steps:
|
|
123
|
+
- uses: actions/checkout@v4
|
|
124
|
+
with:
|
|
125
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
126
|
+
fetch-depth: 0 # the block's base..head derivations need real history
|
|
127
|
+
- uses: actions/setup-node@v4
|
|
128
|
+
with: { node-version: 20 }
|
|
129
|
+
# validate resolves the current head with `git rev-parse HEAD`, so the checkout
|
|
130
|
+
# ref above is what makes the stamp comparison correct — no flag needed.
|
|
131
|
+
# --source is what lets it also re-derive the production-diff-emptiness claim.
|
|
132
|
+
- run: node <ensure-coverage>/scripts/evidence-block.mjs validate <docs/tests/evidence.json> --source <src,app,packages>
|
|
133
|
+
|
|
134
|
+
# Gate 7 — quarantine auto-resurface. BLOCKING (distinct from the non-blocking
|
|
135
|
+
# quarantine *lane* below): fails once any `@quarantine(until=…)` / `until=` exit
|
|
136
|
+
# date is in the past, so a deferred suppression can't rot green into a permanent
|
|
137
|
+
# skip. ci-audit looks for `check-quarantine-expiry` by name.
|
|
138
|
+
quarantine-expiry:
|
|
139
|
+
runs-on: ubuntu-latest
|
|
140
|
+
timeout-minutes: 5
|
|
141
|
+
steps:
|
|
142
|
+
- uses: actions/checkout@v4
|
|
143
|
+
- uses: actions/setup-node@v4
|
|
144
|
+
with: { node-version: 20 }
|
|
145
|
+
- run: node <ensure-coverage>/scripts/check-quarantine-expiry.mjs # exit 1 on any expired dated exit
|
|
146
|
+
|
|
147
|
+
# Gate 3 — render sweep. SEPARATE job: browser + seeded DB. Catches the crashing
|
|
148
|
+
# route a green functional suite sails past. NOT the functional suite.
|
|
149
|
+
# Runs in the pinned Playwright container (docker-preferred): browsers ship in the
|
|
150
|
+
# image, so there is no per-job `playwright install`. Inside a job container,
|
|
151
|
+
# services are reached by service label (postgres:5432), NOT localhost.
|
|
152
|
+
presentation-sweep:
|
|
153
|
+
runs-on: ubuntu-latest
|
|
154
|
+
timeout-minutes: 5
|
|
155
|
+
container:
|
|
156
|
+
image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
|
|
157
|
+
options: --ipc=host
|
|
158
|
+
services:
|
|
159
|
+
postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
|
|
160
|
+
env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
|
|
161
|
+
steps:
|
|
162
|
+
- uses: actions/checkout@v4
|
|
163
|
+
# Shared pnpm store — SAME cache key + restore-keys as every other job, so
|
|
164
|
+
# steady-state runs restore instead of downloading (see header convention 2).
|
|
165
|
+
- uses: actions/cache@v4
|
|
166
|
+
with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
|
|
167
|
+
- run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
|
|
168
|
+
- run: <seed + migrate>
|
|
169
|
+
- run: <boot app on $BASE_URL> &
|
|
170
|
+
- run: |
|
|
171
|
+
node <e2e-test>/scripts/presentation-sweep.mjs \
|
|
172
|
+
--manifest e2e/route-manifest.json --base-url "${BASE_URL:-http://127.0.0.1:3000}" \
|
|
173
|
+
--fixtures e2e/sweep-fixtures.mjs --out docs/tests/_generated/presentation-results.json
|
|
174
|
+
# NEVER add `continue-on-error: true` here — that turns the gate into theatre.
|
|
175
|
+
|
|
176
|
+
# Gate 8 — curated E2E smoke (golden-path liveness). PR-LANE FLOOR, blocking.
|
|
177
|
+
# Boots the REAL app and drives only the handful of do-not-ship journeys
|
|
178
|
+
# (sign in → core action → pay), writes smoke-results.json, then reduces those
|
|
179
|
+
# observations through smoke.mjs verdict. Any fail/blocked/missing path reds the
|
|
180
|
+
# build. This — NOT the broad functional suite below — is the per-PR liveness
|
|
181
|
+
# gate. It catches the integrated, render-time bug a green unit/functional suite
|
|
182
|
+
# sails past (#237: an invisible primary button, a crash on mount).
|
|
183
|
+
# ci-audit looks for `smoke … verdict` by name.
|
|
184
|
+
#
|
|
185
|
+
# PARALLEL BY DEFAULT: the golden paths run concurrently inside this job
|
|
186
|
+
# (E2E_WORKERS > 1 + fullyParallel — each @smoke journey is an independent spec),
|
|
187
|
+
# so wall clock ≈ the slowest single path, not the sum. If the curated set still
|
|
188
|
+
# can't fit the 5-minute budget in one job, fan the paths out across a matrix —
|
|
189
|
+
# see the commented `smoke-drive` variant below this job.
|
|
190
|
+
smoke:
|
|
191
|
+
runs-on: ubuntu-latest
|
|
192
|
+
timeout-minutes: 5
|
|
193
|
+
container:
|
|
194
|
+
image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
|
|
195
|
+
options: --ipc=host
|
|
196
|
+
services:
|
|
197
|
+
postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
|
|
198
|
+
env: { E2E_AUTH_BYPASS: '1', E2E_WORKERS: '4', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
|
|
199
|
+
steps:
|
|
200
|
+
- uses: actions/checkout@v4
|
|
201
|
+
- uses: actions/cache@v4
|
|
202
|
+
with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
|
|
203
|
+
- run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
|
|
204
|
+
- run: <seed + migrate>
|
|
205
|
+
- run: <boot app on $BASE_URL> &
|
|
206
|
+
# Validate + reconcile BEFORE gating: shape-checks the manifest and, via
|
|
207
|
+
# --journeys, verifies every browser path references a real @smoke-tagged
|
|
208
|
+
# journey AND every @smoke journey is in the manifest — a drift either way
|
|
209
|
+
# (esp. an @smoke journey missing from the manifest, a silent false-ALIVE)
|
|
210
|
+
# reds the build here instead of passing vacuously.
|
|
211
|
+
- run: node <smoke>/scripts/smoke.mjs validate --manifest smoke.manifest.json --journeys <e2e-journeys-dir>
|
|
212
|
+
- run: node <smoke>/scripts/smoke.mjs plan --manifest smoke.manifest.json --target local --json > smoke-plan.json
|
|
213
|
+
- run: <drive smoke-plan.json through Playwright/API/CLI (browser paths run in parallel via E2E_WORKERS) and write smoke-results.json>
|
|
214
|
+
- run: node <smoke>/scripts/smoke.mjs verdict --manifest smoke.manifest.json --target local --results smoke-results.json --out smoke-verdict.json
|
|
215
|
+
# NEVER add `continue-on-error: true` here — that turns the liveness floor into theatre.
|
|
216
|
+
|
|
217
|
+
# ── OPTIONAL smoke fan-out (only when in-job parallelism can't hit the 5-min budget):
|
|
218
|
+
# split the plan into a matrix so each golden path (or shard) gets its own job, then
|
|
219
|
+
# merge the per-path results and compute ONE verdict. The verdict job stays the single
|
|
220
|
+
# blocking reduction — the umbrella needs `smoke-verdict`, not the shards.
|
|
221
|
+
#
|
|
222
|
+
# smoke-plan:
|
|
223
|
+
# runs-on: ubuntu-latest
|
|
224
|
+
# timeout-minutes: 5
|
|
225
|
+
# outputs: { paths: '${{ steps.plan.outputs.paths }}' }
|
|
226
|
+
# steps:
|
|
227
|
+
# - uses: actions/checkout@v4
|
|
228
|
+
# - uses: actions/setup-node@v4
|
|
229
|
+
# with: { node-version: 20 }
|
|
230
|
+
# - run: node <smoke>/scripts/smoke.mjs validate --manifest smoke.manifest.json --journeys <e2e-journeys-dir>
|
|
231
|
+
# - id: plan
|
|
232
|
+
# run: |
|
|
233
|
+
# node <smoke>/scripts/smoke.mjs plan --manifest smoke.manifest.json --target local --json > smoke-plan.json
|
|
234
|
+
# echo "paths=$(node -e 'console.log(JSON.stringify(JSON.parse(require("fs").readFileSync("smoke-plan.json","utf8")).run.map(p=>p.id)))')" >> "$GITHUB_OUTPUT"
|
|
235
|
+
# smoke-drive:
|
|
236
|
+
# needs: smoke-plan
|
|
237
|
+
# strategy: { fail-fast: false, matrix: { path: '${{ fromJSON(needs.smoke-plan.outputs.paths) }}' } }
|
|
238
|
+
# runs-on: ubuntu-latest
|
|
239
|
+
# timeout-minutes: 5
|
|
240
|
+
# container: { image: 'mcr.microsoft.com/playwright:v1.61.0-noble', options: '--ipc=host' }
|
|
241
|
+
# services:
|
|
242
|
+
# postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
|
|
243
|
+
# env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
|
|
244
|
+
# steps:
|
|
245
|
+
# - uses: actions/checkout@v4
|
|
246
|
+
# - uses: actions/cache@v4
|
|
247
|
+
# with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
|
|
248
|
+
# - run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
|
|
249
|
+
# - run: <seed + migrate>
|
|
250
|
+
# - run: <boot app on $BASE_URL> &
|
|
251
|
+
# - run: <drive ONLY path "${{ matrix.path }}" and write smoke-results-${{ matrix.path }}.json>
|
|
252
|
+
# - uses: actions/upload-artifact@v4
|
|
253
|
+
# with: { name: 'smoke-results-${{ matrix.path }}', path: 'smoke-results-*.json' }
|
|
254
|
+
# smoke-verdict:
|
|
255
|
+
# needs: smoke-drive
|
|
256
|
+
# if: always() # a failed shard must still reach the verdict (→ DEAD), not vanish
|
|
257
|
+
# runs-on: ubuntu-latest
|
|
258
|
+
# timeout-minutes: 5
|
|
259
|
+
# steps:
|
|
260
|
+
# - uses: actions/checkout@v4
|
|
261
|
+
# - uses: actions/setup-node@v4
|
|
262
|
+
# with: { node-version: 20 }
|
|
263
|
+
# - uses: actions/download-artifact@v4
|
|
264
|
+
# with: { pattern: 'smoke-results-*', merge-multiple: true }
|
|
265
|
+
# - run: node -e 'const fs=require("fs");const all=fs.readdirSync(".").filter(f=>/^smoke-results-.*\.json$/.test(f)).flatMap(f=>JSON.parse(fs.readFileSync(f,"utf8")));fs.writeFileSync("smoke-results.json",JSON.stringify(all,null,2))'
|
|
266
|
+
# - run: node <smoke>/scripts/smoke.mjs verdict --manifest smoke.manifest.json --target local --results smoke-results.json --out smoke-verdict.json
|
|
267
|
+
|
|
268
|
+
# Gate 4 — broad functional + journey suite (distinct from gate 3 and gate 8).
|
|
269
|
+
# HEAVY/INTEGRATION LANE, blocking — but DEMOTED off the per-PR critical path: the
|
|
270
|
+
# `if:` runs it only on the integration-branch push and the nightly schedule, never
|
|
271
|
+
# on a PR. The per-PR floor is the curated E2E smoke gate above; the full behavioral
|
|
272
|
+
# suite (every form, error path, edge case) is verified before release, not on every
|
|
273
|
+
# PR. A journey-only regression is caught here, at integration — the accepted cost of
|
|
274
|
+
# the demotion. Excludes @quarantine-tagged tests, which run in the non-blocking lane.
|
|
275
|
+
e2e:
|
|
276
|
+
if: github.event_name != 'pull_request'
|
|
277
|
+
runs-on: ubuntu-latest
|
|
278
|
+
timeout-minutes: 30 # integration lane — the one lane allowed past the 5-min PR budget
|
|
279
|
+
container:
|
|
280
|
+
image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
|
|
281
|
+
options: --ipc=host
|
|
282
|
+
services:
|
|
283
|
+
postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
|
|
284
|
+
env: { E2E_AUTH_BYPASS: '1', E2E_WORKERS: '4', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
|
|
285
|
+
steps:
|
|
286
|
+
- uses: actions/checkout@v4
|
|
287
|
+
- uses: actions/cache@v4
|
|
288
|
+
with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
|
|
289
|
+
- run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
|
|
290
|
+
- run: <seed + migrate>
|
|
291
|
+
- run: pnpm playwright test --grep-invert "@quarantine"
|
|
292
|
+
|
|
293
|
+
# Quarantine lane — the ONLY sanctioned non-blocking path (tests are never skipped).
|
|
294
|
+
# Un-sandboxable externals or a genuine flake under active fix go HERE: the test
|
|
295
|
+
# still RUNS and REPORTS, it just doesn't block. Keep the surface graded `Unverified`
|
|
296
|
+
# in the ledger (never `verified: true`), with a dated exit. run+report ≠ stop running.
|
|
297
|
+
# Deliberately NOT in the all-gates umbrella below.
|
|
298
|
+
quarantine:
|
|
299
|
+
runs-on: ubuntu-latest
|
|
300
|
+
timeout-minutes: 10
|
|
301
|
+
continue-on-error: true # the whole point — must never hard-block a PR
|
|
302
|
+
container:
|
|
303
|
+
image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file
|
|
304
|
+
options: --ipc=host
|
|
305
|
+
services:
|
|
306
|
+
postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
|
|
307
|
+
env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
|
|
308
|
+
steps:
|
|
309
|
+
- uses: actions/checkout@v4
|
|
310
|
+
- uses: actions/cache@v4
|
|
311
|
+
with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
|
|
312
|
+
- run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
|
|
313
|
+
- run: <seed + migrate>
|
|
314
|
+
- run: pnpm playwright test --grep "@quarantine" --pass-with-no-tests # provider test keys via secrets, never live keys; green when nothing is quarantined
|
|
315
|
+
# On failure: post a PR annotation and keep the surface `Unverified` — surfaced + tracked, not a green skip.
|
|
316
|
+
|
|
317
|
+
# Visual regression GATE (presentation:visual) — OPT-IN, BLOCKING when present.
|
|
318
|
+
# Runs ONLY in the pinned Playwright container so baselines (minted by the regen job
|
|
319
|
+
# below) and this comparison share one rendering environment — a baseline minted on
|
|
320
|
+
# another OS reds on every glyph's anti-aliasing, which is how visual gates get
|
|
321
|
+
# disabled. Compares the rendered page against the COMMITTED baselines; it never
|
|
322
|
+
# writes them. Uploads the 3-up diff as an artifact on failure. Only needed when a
|
|
323
|
+
# surface declares `requiredLevels: [presentation:visual]`; harmless (no specs) if none.
|
|
324
|
+
visual-gate:
|
|
325
|
+
runs-on: ubuntu-latest
|
|
326
|
+
timeout-minutes: 10
|
|
327
|
+
container:
|
|
328
|
+
image: mcr.microsoft.com/playwright:v1.61.0-noble # keep identical to every other pin in this file — and to visual-baseline-regen
|
|
329
|
+
options: --ipc=host
|
|
330
|
+
services:
|
|
331
|
+
postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
|
|
332
|
+
env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test' }
|
|
333
|
+
steps:
|
|
334
|
+
- uses: actions/checkout@v4
|
|
335
|
+
- uses: actions/cache@v4
|
|
336
|
+
with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
|
|
337
|
+
- run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
|
|
338
|
+
- run: <seed + migrate>
|
|
339
|
+
- run: <boot app on $BASE_URL> &
|
|
340
|
+
# --pass-with-no-tests: a repo with no @visual specs must stay green — without it,
|
|
341
|
+
# Playwright exits 1 on "no tests found" and the all-gates umbrella bricks every PR.
|
|
342
|
+
- run: pnpm playwright test --grep "@visual" --pass-with-no-tests # toHaveScreenshot specs; fails on drift from committed baselines
|
|
343
|
+
# NEVER add `continue-on-error: true` here — that turns the gate into theatre.
|
|
344
|
+
- if: failure()
|
|
345
|
+
uses: actions/upload-artifact@v4
|
|
346
|
+
with: { name: visual-diff, path: 'test-results/**/*-diff.png', retention-days: 30 }
|
|
347
|
+
|
|
348
|
+
# Visual BASELINE-REGEN — ON-DEMAND only (PR label `update-visual-baselines`), the
|
|
349
|
+
# ONLY sanctioned writer of baselines. Same pinned image as the gate. Regenerates
|
|
350
|
+
# the PNGs, commits them back to the PR branch (a baseline change is reviewable
|
|
351
|
+
# evidence tied to a declared intended UI change — never a silent --update to green),
|
|
352
|
+
# then posts the durable baseline link + ephemeral diff URL to the issue AND PR and
|
|
353
|
+
# RETURNS both as a value (`--evidence-out`, plus stdout) for the resolve-issues
|
|
354
|
+
# orchestrator to record on the unit. This job never writes the run manifest itself —
|
|
355
|
+
# the orchestrator is its only writer (ADR 0001 decision 5). Never blocks; it's an
|
|
356
|
+
# explicit human/agent action.
|
|
357
|
+
visual-baseline-regen:
|
|
358
|
+
if: contains(github.event.pull_request.labels.*.name, 'update-visual-baselines')
|
|
359
|
+
runs-on: ubuntu-latest
|
|
360
|
+
timeout-minutes: 15
|
|
361
|
+
container:
|
|
362
|
+
image: mcr.microsoft.com/playwright:v1.61.0-noble # MUST match visual-gate's image (and every other pin in this file)
|
|
363
|
+
options: --ipc=host
|
|
364
|
+
permissions: { contents: write, issues: write, pull-requests: write }
|
|
365
|
+
services:
|
|
366
|
+
postgres: { image: postgres:16, env: { POSTGRES_PASSWORD: postgres } }
|
|
367
|
+
env: { E2E_AUTH_BYPASS: '1', DATABASE_URL: 'postgres://postgres:postgres@postgres:5432/test', GH_TOKEN: '${{ github.token }}' }
|
|
368
|
+
steps:
|
|
369
|
+
- uses: actions/checkout@v4
|
|
370
|
+
with: { ref: '${{ github.head_ref }}' }
|
|
371
|
+
- uses: actions/cache@v4
|
|
372
|
+
with: { path: ~/.pnpm-store, key: 'pnpm-store-${{ hashFiles(''pnpm-lock.yaml'') }}', restore-keys: pnpm-store- }
|
|
373
|
+
- run: corepack enable && pnpm config set store-dir ~/.pnpm-store && pnpm install --frozen-lockfile
|
|
374
|
+
- run: <seed + migrate>
|
|
375
|
+
- run: <boot app on $BASE_URL> &
|
|
376
|
+
- run: pnpm playwright test --grep "@visual" --update-snapshots
|
|
377
|
+
- run: |
|
|
378
|
+
git config user.name "github-actions[bot]"
|
|
379
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
380
|
+
git add '**/*-snapshots/**'
|
|
381
|
+
git diff --staged --quiet || git commit -m "chore(visual): regenerate baselines"
|
|
382
|
+
git push
|
|
383
|
+
- id: artifact
|
|
384
|
+
if: always()
|
|
385
|
+
uses: actions/upload-artifact@v4
|
|
386
|
+
with: { name: visual-preview, path: 'test-results/**', retention-days: 30 }
|
|
387
|
+
- run: |
|
|
388
|
+
node <e2e-test>/scripts/post-visual-evidence.mjs \
|
|
389
|
+
--unit "${{ github.event.pull_request.number }}" \
|
|
390
|
+
--repo "${{ github.repository }}" --sha "$(git rev-parse HEAD)" \
|
|
391
|
+
--issue "<linked issue #>" --pr "${{ github.event.pull_request.number }}" \
|
|
392
|
+
--diff-artifact "${{ steps.artifact.outputs.artifact-url }}" \
|
|
393
|
+
--results docs/tests/_generated/presentation-results.json \
|
|
394
|
+
--evidence-out visual-evidence.json
|
|
395
|
+
# The evidence is a RETURNED value, never a manifest write — resolve-issues'
|
|
396
|
+
# orchestrator records it (ADR 0001 decision 5). Upload it so the run can read it.
|
|
397
|
+
- if: always()
|
|
398
|
+
uses: actions/upload-artifact@v4
|
|
399
|
+
with: { name: visual-evidence, path: visual-evidence.json, retention-days: 30 }
|
|
400
|
+
|
|
401
|
+
# Meta-gate (bootstrap) — run ci-audit against THIS workflow so the gates above
|
|
402
|
+
# can't be silently deleted or weakened later. Without this job, nothing guards the
|
|
403
|
+
# gates; ci-audit's own META_GATE is exactly "is ci-audit run by CI?". Keep the
|
|
404
|
+
# --files list in sync with the gate files you actually ship.
|
|
405
|
+
gate-audit:
|
|
406
|
+
runs-on: ubuntu-latest
|
|
407
|
+
timeout-minutes: 5
|
|
408
|
+
steps:
|
|
409
|
+
- uses: actions/checkout@v4
|
|
410
|
+
- uses: actions/setup-node@v4
|
|
411
|
+
with: { node-version: 20 }
|
|
412
|
+
- run: node <ensure-coverage>/scripts/ci-audit.mjs --files .github/workflows/coverage-gates.yml
|
|
413
|
+
|
|
414
|
+
# UMBRELLA — the ONE status check branch protection requires. Protect the branch
|
|
415
|
+
# with only `all-gates`: every blocking gate is in `needs`, so adding or renaming a
|
|
416
|
+
# gate job (and adding it here) can never silently fall out of protection, and a
|
|
417
|
+
# protection config listing eight job names by hand is never needed. `skipped` is
|
|
418
|
+
# deliberately allowed (gate 4 is PR-skipped by design; a conditional job that
|
|
419
|
+
# branch protection required directly would otherwise pass vacuously — here the
|
|
420
|
+
# umbrella still fails on any failure/cancellation of what DID run).
|
|
421
|
+
# The quarantine lane is deliberately absent from `needs` — it is non-blocking.
|
|
422
|
+
all-gates:
|
|
423
|
+
if: always()
|
|
424
|
+
needs:
|
|
425
|
+
- lint-tests
|
|
426
|
+
- inventory-freshness
|
|
427
|
+
- coverage-accounting
|
|
428
|
+
- coverage-checklist
|
|
429
|
+
- evidence-block
|
|
430
|
+
- quarantine-expiry
|
|
431
|
+
- presentation-sweep
|
|
432
|
+
- smoke
|
|
433
|
+
- e2e
|
|
434
|
+
- visual-gate
|
|
435
|
+
- gate-audit
|
|
436
|
+
runs-on: ubuntu-latest
|
|
437
|
+
timeout-minutes: 5
|
|
438
|
+
steps:
|
|
439
|
+
# The check is an expression on needs.*.result — immune to a job OUTPUT that
|
|
440
|
+
# happens to contain the string "result": "failure" (toJSON(needs) includes
|
|
441
|
+
# outputs, so grepping it can false-fail).
|
|
442
|
+
- name: Fail if any required gate failed or was cancelled
|
|
443
|
+
if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')
|
|
444
|
+
env:
|
|
445
|
+
RESULTS: ${{ toJSON(needs) }}
|
|
446
|
+
run: |
|
|
447
|
+
echo "$RESULTS"
|
|
448
|
+
echo 'A required gate failed or was cancelled.'
|
|
449
|
+
exit 1
|
|
450
|
+
- name: All gates green
|
|
451
|
+
run: echo "All required gates passed (or were skipped by design)."
|