@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,282 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "review-pr findings",
|
|
4
|
+
"description": "Canonical review document and finding contract. Generated from scripts/finding-contract.mjs and consumed by scripts/post-review.mjs.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"verdict",
|
|
9
|
+
"findings"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"verdict": {
|
|
13
|
+
"enum": [
|
|
14
|
+
"PASS",
|
|
15
|
+
"NEEDS_CHANGES",
|
|
16
|
+
"FAIL",
|
|
17
|
+
"BLOCKED"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"summary": {
|
|
21
|
+
"type": "string"
|
|
22
|
+
},
|
|
23
|
+
"overall_correctness": {
|
|
24
|
+
"enum": [
|
|
25
|
+
"correct",
|
|
26
|
+
"incorrect"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"findings": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"additionalProperties": false,
|
|
34
|
+
"required": [
|
|
35
|
+
"title",
|
|
36
|
+
"axis",
|
|
37
|
+
"file",
|
|
38
|
+
"line_start",
|
|
39
|
+
"confidence",
|
|
40
|
+
"why",
|
|
41
|
+
"priority"
|
|
42
|
+
],
|
|
43
|
+
"properties": {
|
|
44
|
+
"title": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"minLength": 1,
|
|
47
|
+
"pattern": "\\S",
|
|
48
|
+
"maxLength": 120
|
|
49
|
+
},
|
|
50
|
+
"axis": {
|
|
51
|
+
"type": "string",
|
|
52
|
+
"enum": [
|
|
53
|
+
"spec",
|
|
54
|
+
"coverage",
|
|
55
|
+
"correctness",
|
|
56
|
+
"standards"
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
"subject": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"description": "What the finding is about: the code under review ('code', the default) or the evidence describing it \u2014 Review Contract wording, coverage-checklist rows, evidence locators, test-level tags ('evidence'). Absent means 'code'. Callers use this to route a round whose production diff has not moved; misclassifying a code defect as evidence skips its adversarial re-review, so classify 'evidence' only when the fix touches no source file.",
|
|
62
|
+
"enum": [
|
|
63
|
+
"code",
|
|
64
|
+
"evidence"
|
|
65
|
+
],
|
|
66
|
+
"default": "code"
|
|
67
|
+
},
|
|
68
|
+
"in_scope": {
|
|
69
|
+
"type": "boolean",
|
|
70
|
+
"default": true
|
|
71
|
+
},
|
|
72
|
+
"priority": {
|
|
73
|
+
"type": "integer",
|
|
74
|
+
"minimum": 0,
|
|
75
|
+
"maximum": 3
|
|
76
|
+
},
|
|
77
|
+
"file": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"minLength": 1,
|
|
80
|
+
"pattern": "\\S"
|
|
81
|
+
},
|
|
82
|
+
"line_start": {
|
|
83
|
+
"type": "integer",
|
|
84
|
+
"minimum": 1
|
|
85
|
+
},
|
|
86
|
+
"line_count": {
|
|
87
|
+
"type": "integer",
|
|
88
|
+
"minimum": 1
|
|
89
|
+
},
|
|
90
|
+
"confidence": {
|
|
91
|
+
"type": "number",
|
|
92
|
+
"minimum": 0,
|
|
93
|
+
"maximum": 1
|
|
94
|
+
},
|
|
95
|
+
"why": {
|
|
96
|
+
"type": "string",
|
|
97
|
+
"minLength": 1,
|
|
98
|
+
"pattern": "\\S"
|
|
99
|
+
},
|
|
100
|
+
"consequence": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"minLength": 1,
|
|
103
|
+
"pattern": "\\S"
|
|
104
|
+
},
|
|
105
|
+
"recommendation": {
|
|
106
|
+
"type": "string",
|
|
107
|
+
"minLength": 1,
|
|
108
|
+
"pattern": "\\S"
|
|
109
|
+
},
|
|
110
|
+
"theme": {
|
|
111
|
+
"$ref": "#/$defs/theme"
|
|
112
|
+
},
|
|
113
|
+
"hazard_candidate": {
|
|
114
|
+
"$ref": "#/$defs/hazard_candidate"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"overMockFindings": {
|
|
120
|
+
"type": "array"
|
|
121
|
+
},
|
|
122
|
+
"previousFindingsResolution": {
|
|
123
|
+
"type": "array"
|
|
124
|
+
},
|
|
125
|
+
"reviewModel": {
|
|
126
|
+
"type": "string",
|
|
127
|
+
"minLength": 1,
|
|
128
|
+
"pattern": "\\S"
|
|
129
|
+
},
|
|
130
|
+
"independent": {
|
|
131
|
+
"type": "boolean"
|
|
132
|
+
},
|
|
133
|
+
"contractValidates": {
|
|
134
|
+
"type": "boolean"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"$defs": {
|
|
138
|
+
"theme": {
|
|
139
|
+
"type": "object",
|
|
140
|
+
"additionalProperties": false,
|
|
141
|
+
"required": [
|
|
142
|
+
"id",
|
|
143
|
+
"kind",
|
|
144
|
+
"contract"
|
|
145
|
+
],
|
|
146
|
+
"properties": {
|
|
147
|
+
"id": {
|
|
148
|
+
"type": "string",
|
|
149
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
150
|
+
},
|
|
151
|
+
"kind": {
|
|
152
|
+
"type": "string",
|
|
153
|
+
"enum": [
|
|
154
|
+
"other",
|
|
155
|
+
"state-machine",
|
|
156
|
+
"concurrency"
|
|
157
|
+
]
|
|
158
|
+
},
|
|
159
|
+
"contract": {
|
|
160
|
+
"type": "string",
|
|
161
|
+
"minLength": 1,
|
|
162
|
+
"pattern": "\\S"
|
|
163
|
+
},
|
|
164
|
+
"stateSpace": {
|
|
165
|
+
"type": "object",
|
|
166
|
+
"additionalProperties": false,
|
|
167
|
+
"required": [
|
|
168
|
+
"states",
|
|
169
|
+
"taskKinds"
|
|
170
|
+
],
|
|
171
|
+
"properties": {
|
|
172
|
+
"states": {
|
|
173
|
+
"type": "array",
|
|
174
|
+
"minItems": 1,
|
|
175
|
+
"uniqueItems": true,
|
|
176
|
+
"items": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"minLength": 1,
|
|
179
|
+
"pattern": "\\S"
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
"taskKinds": {
|
|
183
|
+
"type": "array",
|
|
184
|
+
"minItems": 1,
|
|
185
|
+
"uniqueItems": true,
|
|
186
|
+
"items": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"minLength": 1,
|
|
189
|
+
"pattern": "\\S"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"allOf": [
|
|
196
|
+
{
|
|
197
|
+
"if": {
|
|
198
|
+
"properties": {
|
|
199
|
+
"kind": {
|
|
200
|
+
"enum": [
|
|
201
|
+
"state-machine",
|
|
202
|
+
"concurrency"
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
"then": {
|
|
208
|
+
"required": [
|
|
209
|
+
"stateSpace"
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"if": {
|
|
215
|
+
"properties": {
|
|
216
|
+
"kind": {
|
|
217
|
+
"const": "other"
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
"then": {
|
|
222
|
+
"not": {
|
|
223
|
+
"required": [
|
|
224
|
+
"stateSpace"
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
"hazard_candidate": {
|
|
232
|
+
"type": "object",
|
|
233
|
+
"additionalProperties": false,
|
|
234
|
+
"anyOf": [
|
|
235
|
+
{
|
|
236
|
+
"required": [
|
|
237
|
+
"section",
|
|
238
|
+
"id",
|
|
239
|
+
"rule",
|
|
240
|
+
"prove"
|
|
241
|
+
]
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"required": [
|
|
245
|
+
"covered_by"
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
],
|
|
249
|
+
"properties": {
|
|
250
|
+
"section": {
|
|
251
|
+
"type": "string",
|
|
252
|
+
"enum": [
|
|
253
|
+
"auth",
|
|
254
|
+
"money",
|
|
255
|
+
"tenancy",
|
|
256
|
+
"migration",
|
|
257
|
+
"cross-cutting"
|
|
258
|
+
]
|
|
259
|
+
},
|
|
260
|
+
"id": {
|
|
261
|
+
"type": "string",
|
|
262
|
+
"pattern": "^[a-z][a-z0-9-]*$"
|
|
263
|
+
},
|
|
264
|
+
"rule": {
|
|
265
|
+
"type": "string",
|
|
266
|
+
"minLength": 1,
|
|
267
|
+
"pattern": "\\S"
|
|
268
|
+
},
|
|
269
|
+
"prove": {
|
|
270
|
+
"type": "string",
|
|
271
|
+
"minLength": 1,
|
|
272
|
+
"pattern": "\\S"
|
|
273
|
+
},
|
|
274
|
+
"covered_by": {
|
|
275
|
+
"type": "string",
|
|
276
|
+
"minLength": 1,
|
|
277
|
+
"pattern": "\\S"
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// Canonical review finding/document contract.
|
|
2
|
+
//
|
|
3
|
+
// This module is the executable source of truth for the review-pr JSON schema,
|
|
4
|
+
// post-review enforcement, and resolve-issues durable review history. The JSON
|
|
5
|
+
// schema and the import-free workflow schema are generated/kept in parity with
|
|
6
|
+
// these definitions; consumers must use the validators below for enforcement.
|
|
7
|
+
|
|
8
|
+
import { validateTheme, THEME_KINDS } from './theme-contract.mjs'
|
|
9
|
+
|
|
10
|
+
export const REVIEW_VERDICTS = ['PASS', 'NEEDS_CHANGES', 'FAIL', 'BLOCKED']
|
|
11
|
+
export const FINDING_AXES = ['spec', 'coverage', 'correctness', 'standards']
|
|
12
|
+
// What the finding is *about*, orthogonal to axis and to severity: the code under
|
|
13
|
+
// review, or the material describing it. Absent means 'code' — the overwhelming
|
|
14
|
+
// default — so existing producers stay valid. Callers route the evidence-only lane
|
|
15
|
+
// on this (resolve-issues § Fix); only the reviewer read the diff, so only the
|
|
16
|
+
// reviewer can set it.
|
|
17
|
+
export const FINDING_SUBJECTS = ['code', 'evidence']
|
|
18
|
+
export const FINDING_KEYS = [
|
|
19
|
+
'title', 'axis', 'subject', 'in_scope', 'priority', 'file', 'line_start', 'line_count',
|
|
20
|
+
'confidence', 'why', 'consequence', 'recommendation', 'theme', 'hazard_candidate',
|
|
21
|
+
]
|
|
22
|
+
// Fields the schema no longer defines but still *tolerates on read* — a finding
|
|
23
|
+
// carrying one does not hard-fail; it warns (findingWarnings) and the value is
|
|
24
|
+
// ignored. `blocking` was removed (#399): it is derived, never stored, as
|
|
25
|
+
// `in_scope && priority <= 1`, so a persisted `blocking` is at best redundant and
|
|
26
|
+
// at worst contradicts the derived value. Same removed-field posture as
|
|
27
|
+
// resolve-issues run-state's obsolete-slot warnings.
|
|
28
|
+
export const FINDING_OBSOLETE_KEYS = ['blocking']
|
|
29
|
+
// Lean core: what every finding owes — a located, confident, explained defect.
|
|
30
|
+
// consequence/recommendation/line_count are welcome but optional; `theme` is the
|
|
31
|
+
// deep lane's identity mechanism (resolve-issues/references/high-risk.md) and is
|
|
32
|
+
// validated only when present — forcing a taxonomy entry per lean-lane finding
|
|
33
|
+
// was pure ceremony and schema-retry surface.
|
|
34
|
+
export const FINDING_REQUIRED = [
|
|
35
|
+
'title', 'axis', 'file', 'line_start', 'confidence', 'why', 'priority',
|
|
36
|
+
]
|
|
37
|
+
export const FINDING_CONTRACT_VERSION = 2
|
|
38
|
+
|
|
39
|
+
const isObject = (value) => value != null && typeof value === 'object' && !Array.isArray(value)
|
|
40
|
+
const nonEmptyString = (value) => typeof value === 'string' && value.trim().length > 0
|
|
41
|
+
const hasOwn = (value, key) => Object.prototype.hasOwnProperty.call(value, key)
|
|
42
|
+
|
|
43
|
+
function unknownKeys(value, allowed, label) {
|
|
44
|
+
return Object.keys(value || {})
|
|
45
|
+
.filter((key) => !allowed.includes(key))
|
|
46
|
+
.map((key) => `${label} has unknown property: ${key}`)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function validateHazardCandidate(value, index) {
|
|
50
|
+
if (value === undefined) return []
|
|
51
|
+
if (!isObject(value)) return [`finding[${index}]: hazard_candidate must be an object`]
|
|
52
|
+
const errors = unknownKeys(value, ['section', 'id', 'rule', 'prove', 'covered_by'], `finding[${index}].hazard_candidate`)
|
|
53
|
+
const covered = nonEmptyString(value.covered_by)
|
|
54
|
+
const complete = ['section', 'id', 'rule', 'prove'].every((key) => nonEmptyString(value[key]))
|
|
55
|
+
if (!covered && !complete) {
|
|
56
|
+
errors.push(`finding[${index}]: hazard_candidate requires section/id/rule/prove or covered_by`)
|
|
57
|
+
}
|
|
58
|
+
if (value.section !== undefined && !['auth', 'money', 'tenancy', 'migration', 'cross-cutting'].includes(value.section)) {
|
|
59
|
+
errors.push(`finding[${index}]: hazard_candidate.section is invalid`)
|
|
60
|
+
}
|
|
61
|
+
if (value.id !== undefined && (!nonEmptyString(value.id) || !/^[a-z][a-z0-9-]*$/.test(value.id))) {
|
|
62
|
+
errors.push(`finding[${index}]: hazard_candidate.id must be kebab-case`)
|
|
63
|
+
}
|
|
64
|
+
for (const key of ['rule', 'prove', 'covered_by']) {
|
|
65
|
+
if (value[key] !== undefined && !nonEmptyString(value[key])) errors.push(`finding[${index}]: hazard_candidate.${key} is required`)
|
|
66
|
+
}
|
|
67
|
+
return errors
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function validateFinding(finding, index = 0) {
|
|
71
|
+
const prefix = `finding[${index}]`
|
|
72
|
+
if (!isObject(finding)) return [`${prefix}: finding must be an object`]
|
|
73
|
+
// Obsolete keys (e.g. removed `blocking`) are read-tolerated, not unknown: they
|
|
74
|
+
// never error — findingWarnings surfaces them and the value is ignored.
|
|
75
|
+
const errors = unknownKeys(finding, [...FINDING_KEYS, ...FINDING_OBSOLETE_KEYS], prefix)
|
|
76
|
+
for (const key of FINDING_REQUIRED) {
|
|
77
|
+
if (!hasOwn(finding, key)) errors.push(`${prefix}: missing ${key}`)
|
|
78
|
+
}
|
|
79
|
+
if (!nonEmptyString(finding.title) || (typeof finding.title === 'string' && finding.title.length > 120)) {
|
|
80
|
+
errors.push(`${prefix}: title must be a non-empty string of at most 120 characters`)
|
|
81
|
+
}
|
|
82
|
+
if (!FINDING_AXES.includes(finding.axis)) errors.push(`${prefix}: axis must be one of ${FINDING_AXES.join('|')}`)
|
|
83
|
+
if (!nonEmptyString(finding.file)) errors.push(`${prefix}: file is required (a finding must locate changed code)`)
|
|
84
|
+
if (!Number.isInteger(finding.line_start) || finding.line_start < 1) errors.push(`${prefix}: line_start must be a positive integer`)
|
|
85
|
+
if (finding.line_count !== undefined && (!Number.isInteger(finding.line_count) || finding.line_count < 1)) {
|
|
86
|
+
errors.push(`${prefix}: line_count must be a positive integer`)
|
|
87
|
+
}
|
|
88
|
+
if (typeof finding.confidence !== 'number' || !Number.isFinite(finding.confidence) || finding.confidence < 0 || finding.confidence > 1) {
|
|
89
|
+
errors.push(`${prefix}: confidence must be a number in 0..1`)
|
|
90
|
+
}
|
|
91
|
+
if (!nonEmptyString(finding.why)) errors.push(`${prefix}: why is required`)
|
|
92
|
+
for (const key of ['consequence', 'recommendation']) {
|
|
93
|
+
if (finding[key] !== undefined && !nonEmptyString(finding[key])) errors.push(`${prefix}: ${key} must be a non-empty string when present`)
|
|
94
|
+
}
|
|
95
|
+
if (finding.priority !== undefined && (!Number.isInteger(finding.priority) || finding.priority < 0 || finding.priority > 3)) {
|
|
96
|
+
errors.push(`${prefix}: priority must be an integer in 0..3`)
|
|
97
|
+
}
|
|
98
|
+
if (finding.in_scope !== undefined && typeof finding.in_scope !== 'boolean') errors.push(`${prefix}: in_scope must be boolean`)
|
|
99
|
+
if (finding.theme !== undefined) errors.push(...validateTheme(finding.theme).map((error) => `${prefix}: ${error}`))
|
|
100
|
+
errors.push(...validateHazardCandidate(finding.hazard_candidate, index))
|
|
101
|
+
return errors
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Read-tolerance for removed fields (#399): a finding still carrying an obsolete
|
|
105
|
+
// key is not rejected (validateFinding accepts it) but earns a warning so the
|
|
106
|
+
// producer drops it. The derived value is authoritative; the stored one is
|
|
107
|
+
// ignored. Callers print these; they never gate.
|
|
108
|
+
export function findingWarnings(finding, index = 0) {
|
|
109
|
+
if (!isObject(finding)) return []
|
|
110
|
+
const warnings = []
|
|
111
|
+
if (hasOwn(finding, 'blocking')) {
|
|
112
|
+
warnings.push(`finding[${index}]: blocking is obsolete — it was removed and is now derived as (in_scope && priority <= 1); the stored value is ignored, drop the field`)
|
|
113
|
+
}
|
|
114
|
+
return warnings
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function reviewDocumentWarnings(document) {
|
|
118
|
+
if (!isObject(document) || !Array.isArray(document.findings)) return []
|
|
119
|
+
return document.findings.flatMap((finding, index) => findingWarnings(finding, index))
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Derived severity/routing from the two canonical fields. `blocking` is NEVER a
|
|
123
|
+
// stored field — it is this function. `in_scope` defaults true (a finding is
|
|
124
|
+
// about the diff unless the reviewer says otherwise). priority<=1 is a blocker
|
|
125
|
+
// only when in scope; a p0/p1 out-of-scope finding is a dedicated critical issue,
|
|
126
|
+
// not a PR-holding blocker.
|
|
127
|
+
export function findingInScope(finding) {
|
|
128
|
+
return finding.in_scope !== false
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function isBlockingFinding(finding) {
|
|
132
|
+
return findingInScope(finding) && Number.isInteger(finding.priority) && finding.priority <= 1
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export function isOutOfScopeCritical(finding) {
|
|
136
|
+
return !findingInScope(finding) && Number.isInteger(finding.priority) && finding.priority <= 1
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Legacy range support is deliberately explicit. Normal validation never
|
|
140
|
+
// silently accepts or rewrites line_end.
|
|
141
|
+
export function migrateLegacyFinding(finding, { version } = {}) {
|
|
142
|
+
if (version !== 1) throw new Error('legacy finding migration requires version 1')
|
|
143
|
+
if (!isObject(finding)) throw new Error('legacy finding must be an object')
|
|
144
|
+
if (hasOwn(finding, 'line_count')) throw new Error('legacy finding must use line_end, not line_count')
|
|
145
|
+
// A real v1 finding predates the #399 field changes: it may carry an obsolete key
|
|
146
|
+
// (e.g. `blocking`, which landed 2026-07-16) and may lack `priority` (optional
|
|
147
|
+
// pre-#399). Mirror validateFinding's read-tolerance — allow obsolete keys through
|
|
148
|
+
// (findingWarnings surfaces them, drop them on write) instead of hard-failing, so a
|
|
149
|
+
// historically-real finding stays migratable rather than bricking the whole unit.
|
|
150
|
+
const errors = unknownKeys(finding, [...FINDING_KEYS.filter((key) => key !== 'line_count'), ...FINDING_OBSOLETE_KEYS, 'line_end'], 'legacy finding')
|
|
151
|
+
for (const key of ['line_start', 'line_end']) {
|
|
152
|
+
if (!Number.isInteger(finding[key]) || finding[key] < 1) errors.push(`legacy finding ${key} must be a positive integer`)
|
|
153
|
+
}
|
|
154
|
+
if (Number.isInteger(finding.line_start) && Number.isInteger(finding.line_end) && finding.line_end < finding.line_start) {
|
|
155
|
+
errors.push('legacy finding line_end < line_start (reversed range)')
|
|
156
|
+
}
|
|
157
|
+
if (errors.length) throw new Error(errors.join('; '))
|
|
158
|
+
const { line_end, ...withoutEnd } = structuredClone(finding)
|
|
159
|
+
// Drop every obsolete key: the derived value is authoritative, the stored one ignored.
|
|
160
|
+
for (const key of FINDING_OBSOLETE_KEYS) delete withoutEnd[key]
|
|
161
|
+
const migrated = { ...withoutEnd, line_count: line_end - finding.line_start + 1 }
|
|
162
|
+
// Backfill the now-required priority when a pre-#399 finding lacks it: a stored
|
|
163
|
+
// blocking:true was an in-scope blocker → priority 1; anything else is an
|
|
164
|
+
// un-prioritized legacy note → priority 2 (a sensible non-blocking severity).
|
|
165
|
+
if (!hasOwn(migrated, 'priority')) migrated.priority = finding.blocking === true ? 1 : 2
|
|
166
|
+
return migrated
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function migrateLegacyReviewDocument(document, { version } = {}) {
|
|
170
|
+
if (version !== 1) throw new Error('legacy review migration requires version 1')
|
|
171
|
+
if (!isObject(document) || !Array.isArray(document.findings)) throw new Error('legacy review document requires findings')
|
|
172
|
+
return { ...structuredClone(document), findings: document.findings.map((finding) => migrateLegacyFinding(finding, { version: 1 })) }
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const DOCUMENT_KEYS = [
|
|
176
|
+
'verdict', 'summary', 'overall_correctness', 'findings', 'overMockFindings',
|
|
177
|
+
'previousFindingsResolution', 'reviewModel', 'independent', 'contractValidates',
|
|
178
|
+
]
|
|
179
|
+
|
|
180
|
+
export function validateReviewDocument(document) {
|
|
181
|
+
if (!isObject(document)) return ['review document must be an object']
|
|
182
|
+
const errors = unknownKeys(document, DOCUMENT_KEYS, 'review document')
|
|
183
|
+
if (!REVIEW_VERDICTS.includes(document.verdict)) errors.push(`review document verdict must be one of ${REVIEW_VERDICTS.join('|')}`)
|
|
184
|
+
if (document.summary !== undefined && typeof document.summary !== 'string') errors.push('review document summary must be a string')
|
|
185
|
+
if (document.overall_correctness !== undefined && !['correct', 'incorrect'].includes(document.overall_correctness)) {
|
|
186
|
+
errors.push('review document overall_correctness must be correct|incorrect')
|
|
187
|
+
}
|
|
188
|
+
if (!Array.isArray(document.findings)) errors.push('review document findings is not an array')
|
|
189
|
+
else document.findings.forEach((finding, index) => errors.push(...validateFinding(finding, index)))
|
|
190
|
+
if (document.overMockFindings !== undefined && !Array.isArray(document.overMockFindings)) errors.push('review document overMockFindings must be an array')
|
|
191
|
+
if (document.previousFindingsResolution !== undefined && !Array.isArray(document.previousFindingsResolution)) errors.push('review document previousFindingsResolution must be an array')
|
|
192
|
+
if (document.reviewModel !== undefined && !nonEmptyString(document.reviewModel)) errors.push('review document reviewModel must be a non-empty string')
|
|
193
|
+
if (document.independent !== undefined && typeof document.independent !== 'boolean') errors.push('review document independent must be boolean')
|
|
194
|
+
if (document.contractValidates !== undefined && typeof document.contractValidates !== 'boolean') errors.push('review document contractValidates must be boolean')
|
|
195
|
+
return errors
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Canonical schema object used to generate schemas/findings.schema.json and to
|
|
199
|
+
// mechanically compare the import-free independent-review workflow contract.
|
|
200
|
+
export const FINDING_SCHEMA = {
|
|
201
|
+
type: 'object',
|
|
202
|
+
additionalProperties: false,
|
|
203
|
+
required: FINDING_REQUIRED,
|
|
204
|
+
properties: {
|
|
205
|
+
title: { type: 'string', minLength: 1, pattern: '\\S', maxLength: 120 },
|
|
206
|
+
axis: { type: 'string', enum: FINDING_AXES },
|
|
207
|
+
subject: { type: 'string', enum: FINDING_SUBJECTS, default: 'code' },
|
|
208
|
+
in_scope: { type: 'boolean', default: true },
|
|
209
|
+
priority: { type: 'integer', minimum: 0, maximum: 3 },
|
|
210
|
+
file: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
211
|
+
line_start: { type: 'integer', minimum: 1 },
|
|
212
|
+
line_count: { type: 'integer', minimum: 1 },
|
|
213
|
+
confidence: { type: 'number', minimum: 0, maximum: 1 },
|
|
214
|
+
why: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
215
|
+
consequence: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
216
|
+
recommendation: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
217
|
+
theme: { $ref: '#/$defs/theme' },
|
|
218
|
+
hazard_candidate: { $ref: '#/$defs/hazard_candidate' },
|
|
219
|
+
},
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
export const FINDING_SCHEMA_DEFS = {
|
|
223
|
+
theme: {
|
|
224
|
+
type: 'object',
|
|
225
|
+
additionalProperties: false,
|
|
226
|
+
required: ['id', 'kind', 'contract'],
|
|
227
|
+
properties: {
|
|
228
|
+
id: { type: 'string', pattern: '^[a-z][a-z0-9-]*$' },
|
|
229
|
+
kind: { type: 'string', enum: THEME_KINDS },
|
|
230
|
+
contract: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
231
|
+
stateSpace: {
|
|
232
|
+
type: 'object',
|
|
233
|
+
additionalProperties: false,
|
|
234
|
+
required: ['states', 'taskKinds'],
|
|
235
|
+
properties: {
|
|
236
|
+
states: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', minLength: 1, pattern: '\\S' } },
|
|
237
|
+
taskKinds: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', minLength: 1, pattern: '\\S' } },
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
allOf: [
|
|
242
|
+
{
|
|
243
|
+
if: { properties: { kind: { enum: ['state-machine', 'concurrency'] } } },
|
|
244
|
+
then: { required: ['stateSpace'] },
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
if: { properties: { kind: { const: 'other' } } },
|
|
248
|
+
then: { not: { required: ['stateSpace'] } },
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
},
|
|
252
|
+
hazard_candidate: {
|
|
253
|
+
type: 'object',
|
|
254
|
+
additionalProperties: false,
|
|
255
|
+
anyOf: [
|
|
256
|
+
{ required: ['section', 'id', 'rule', 'prove'] },
|
|
257
|
+
{ required: ['covered_by'] },
|
|
258
|
+
],
|
|
259
|
+
properties: {
|
|
260
|
+
section: { type: 'string', enum: ['auth', 'money', 'tenancy', 'migration', 'cross-cutting'] },
|
|
261
|
+
id: { type: 'string', pattern: '^[a-z][a-z0-9-]*$' },
|
|
262
|
+
rule: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
263
|
+
prove: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
264
|
+
covered_by: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export const REVIEW_DOCUMENT_SCHEMA = {
|
|
270
|
+
type: 'object',
|
|
271
|
+
additionalProperties: false,
|
|
272
|
+
required: ['verdict', 'findings'],
|
|
273
|
+
properties: {
|
|
274
|
+
verdict: { enum: REVIEW_VERDICTS },
|
|
275
|
+
summary: { type: 'string' },
|
|
276
|
+
overall_correctness: { enum: ['correct', 'incorrect'] },
|
|
277
|
+
findings: { type: 'array', items: FINDING_SCHEMA },
|
|
278
|
+
overMockFindings: { type: 'array' },
|
|
279
|
+
previousFindingsResolution: { type: 'array' },
|
|
280
|
+
reviewModel: { type: 'string', minLength: 1, pattern: '\\S' },
|
|
281
|
+
independent: { type: 'boolean' },
|
|
282
|
+
contractValidates: { type: 'boolean' },
|
|
283
|
+
},
|
|
284
|
+
$defs: FINDING_SCHEMA_DEFS,
|
|
285
|
+
}
|