@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,503 @@
|
|
|
1
|
+
// Build a bounded, content-free evidence packet for an independent review of a
|
|
2
|
+
// combined release. The packet contains paths and hunk coordinates, never patch
|
|
3
|
+
// lines, so a large release does not consume the reviewer's context before the
|
|
4
|
+
// targeted inspection starts.
|
|
5
|
+
|
|
6
|
+
import fs from 'node:fs'
|
|
7
|
+
import path from 'node:path'
|
|
8
|
+
import { execFileSync } from 'node:child_process'
|
|
9
|
+
import { isMainModule } from '../../engineering-runtime/scripts/main-module.mjs'
|
|
10
|
+
|
|
11
|
+
export const PACKET_VERSION = 2
|
|
12
|
+
export const DEFAULT_MAX_BYTES = 64 * 1024
|
|
13
|
+
|
|
14
|
+
const RISK_GROUPS = [
|
|
15
|
+
{ id: 'auth', pattern: /(^|\/)(auth|authn|authz|oauth|session|token|identity|iam|policy)(\/|[._-]|$)/i },
|
|
16
|
+
{ id: 'money', pattern: /(^|\/)(billing|money|payment|pricing|price|tax|invoice|refund)(\/|[._-]|$)/i },
|
|
17
|
+
{ id: 'tenancy', pattern: /(^|\/)(tenant|tenancy|organization|organisation|org-scope|workspace)(\/|[._-]|$)/i },
|
|
18
|
+
{ id: 'migration', pattern: /(^|\/)(migrations?|schema|ddl)(\/|[._-]|$)|\.(sql|prisma)$/i },
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
function git(args, cwd) {
|
|
22
|
+
return execFileSync('git', args, { cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, stdio: ['ignore', 'pipe', 'pipe'] }).trim()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function exactSha(rev, cwd) {
|
|
26
|
+
return git(['rev-parse', '--verify', `${rev}^{commit}`], cwd)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function exactRevisionSha(revision, label, cwd) {
|
|
30
|
+
try {
|
|
31
|
+
return exactSha(revision, cwd)
|
|
32
|
+
} catch {
|
|
33
|
+
throw new Error(`${label} does not resolve to an exact commit`)
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function exactRefSha(ref, label, cwd) {
|
|
38
|
+
try {
|
|
39
|
+
git(['check-ref-format', ref], cwd)
|
|
40
|
+
return git(['show-ref', '--verify', '--hash', ref], cwd)
|
|
41
|
+
} catch {
|
|
42
|
+
throw new Error(`${label} does not resolve as an exact ref`)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function pinnedSha(value, label, cwd) {
|
|
47
|
+
if (!/^[0-9a-f]{40}$/.test(value || '')) throw new Error(`${label} must be a full 40-character lowercase commit SHA`)
|
|
48
|
+
let resolved
|
|
49
|
+
try {
|
|
50
|
+
resolved = exactSha(value, cwd)
|
|
51
|
+
} catch {
|
|
52
|
+
throw new Error(`${label} ${value} does not resolve to a commit in this repository`)
|
|
53
|
+
}
|
|
54
|
+
if (resolved !== value) throw new Error(`${label} ${value} does not resolve exactly`)
|
|
55
|
+
return resolved
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function repositoryIdentity(remoteUrl) {
|
|
59
|
+
let host
|
|
60
|
+
let repoPath
|
|
61
|
+
try {
|
|
62
|
+
const parsed = new URL(remoteUrl)
|
|
63
|
+
host = parsed.hostname.toLowerCase()
|
|
64
|
+
repoPath = parsed.pathname
|
|
65
|
+
} catch {
|
|
66
|
+
const scp = /^(?:[^@]+@)?([^:]+):(.+)$/.exec(remoteUrl || '')
|
|
67
|
+
if (!scp) throw new Error('target remote URL has no recognizable repository identity')
|
|
68
|
+
host = scp[1].toLowerCase()
|
|
69
|
+
repoPath = scp[2]
|
|
70
|
+
}
|
|
71
|
+
repoPath = repoPath.replace(/^\/+|\/+$/g, '').replace(/\.git$/, '')
|
|
72
|
+
if (!/^[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)+$/.test(repoPath) || repoPath.split('/').includes('..')) {
|
|
73
|
+
throw new Error('target remote URL has no safe repository path')
|
|
74
|
+
}
|
|
75
|
+
return `${host}/${repoPath}`
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function authoritativeTarget({ targetRef, targetHeadRev, targetRepository, head, suppliedBase, cwd }) {
|
|
79
|
+
const match = `${targetRef || ''}`.match(/^refs\/remotes\/([^/]+)\/(.+)$/)
|
|
80
|
+
if (!match) throw new Error('target ref must be a fully qualified remote-tracking ref (refs/remotes/<remote>/<branch>)')
|
|
81
|
+
if (match[2] === 'HEAD') throw new Error('target ref must identify an explicit remote branch, not symbolic HEAD')
|
|
82
|
+
const [, remote] = match
|
|
83
|
+
let configuredUrl
|
|
84
|
+
try {
|
|
85
|
+
configuredUrl = git(['remote', 'get-url', '--', remote], cwd)
|
|
86
|
+
} catch {
|
|
87
|
+
throw new Error('target ref remote is not configured in this repository')
|
|
88
|
+
}
|
|
89
|
+
if (repositoryIdentity(configuredUrl) !== targetRepository) throw new Error('target repository mismatch for configured target remote')
|
|
90
|
+
|
|
91
|
+
const refHead = exactRefSha(targetRef, 'target ref', cwd)
|
|
92
|
+
const targetHead = pinnedSha(targetHeadRev, 'target head', cwd)
|
|
93
|
+
if (refHead !== targetHead) throw new Error(`target ref drifted from pinned target head ${targetHead}; resolved ${refHead}`)
|
|
94
|
+
|
|
95
|
+
let actualBase
|
|
96
|
+
try {
|
|
97
|
+
actualBase = git(['merge-base', targetHead, head], cwd)
|
|
98
|
+
} catch {
|
|
99
|
+
throw new Error(`authoritative target and exact head ${head} have no merge-base in this repository`)
|
|
100
|
+
}
|
|
101
|
+
if (actualBase !== suppliedBase) {
|
|
102
|
+
throw new Error(`supplied base ${suppliedBase} does not equal authoritative merge-base ${actualBase} of pinned target and head ${head}`)
|
|
103
|
+
}
|
|
104
|
+
return { targetRef, targetHead, targetRepository }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function safeRepoPath(value) {
|
|
108
|
+
if (typeof value !== 'string' || !value || path.isAbsolute(value)) return false
|
|
109
|
+
const parts = value.replaceAll('\\', '/').split('/')
|
|
110
|
+
return !parts.includes('..') && !parts.includes('.') && !parts.includes('') && !value.includes('\0')
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function parseNameStatusZ(raw) {
|
|
114
|
+
const fields = raw.split('\0')
|
|
115
|
+
if (fields.at(-1) === '') fields.pop()
|
|
116
|
+
const entries = []
|
|
117
|
+
for (let i = 0; i < fields.length;) {
|
|
118
|
+
const status = fields[i++]
|
|
119
|
+
if (!/^[ACDMRTUXB][0-9]*$/.test(status || '')) throw new Error(`unparseable name-status record ${JSON.stringify(status)}`)
|
|
120
|
+
if (status.startsWith('R') || status.startsWith('C')) {
|
|
121
|
+
const oldPath = fields[i++]
|
|
122
|
+
const newPath = fields[i++]
|
|
123
|
+
if (!safeRepoPath(oldPath) || !safeRepoPath(newPath)) throw new Error('unsafe changed path in rename/copy record')
|
|
124
|
+
entries.push({ status, oldPath, newPath })
|
|
125
|
+
} else {
|
|
126
|
+
const changedPath = fields[i++]
|
|
127
|
+
if (!safeRepoPath(changedPath)) throw new Error('unsafe changed path in name-status record')
|
|
128
|
+
entries.push({ status, path: changedPath })
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return entries
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function pathSides(entry) {
|
|
135
|
+
if (entry.oldPath) return [
|
|
136
|
+
{ path: entry.oldPath, side: 'preimage', status: entry.status },
|
|
137
|
+
{ path: entry.newPath, side: 'postimage', status: entry.status },
|
|
138
|
+
]
|
|
139
|
+
return [{ path: entry.path, side: entry.status.startsWith('D') ? 'preimage' : 'postimage', status: entry.status }]
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function riskIds(changedPath) {
|
|
143
|
+
const ids = RISK_GROUPS.filter((group) => group.pattern.test(changedPath)).map((group) => group.id)
|
|
144
|
+
return ids.length ? ids : []
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function hunkLocators(base, head, changedPath, side, cwd) {
|
|
148
|
+
const output = git(['diff', '--no-color', '--no-ext-diff', '--no-renames', '--unified=0', `${base}..${head}`, '--', changedPath], cwd)
|
|
149
|
+
const hunks = []
|
|
150
|
+
for (const line of output.split(/\r?\n/)) {
|
|
151
|
+
const match = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/.exec(line)
|
|
152
|
+
if (match) {
|
|
153
|
+
hunks.push({
|
|
154
|
+
oldStart: Number(match[1]), oldLines: Number(match[2] ?? 1),
|
|
155
|
+
newStart: Number(match[3]), newLines: Number(match[4] ?? 1),
|
|
156
|
+
})
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (hunks.length) return hunks
|
|
160
|
+
const revision = side === 'preimage' ? base : head
|
|
161
|
+
try {
|
|
162
|
+
const lines = git(['show', `${revision}:${changedPath}`], cwd).split(/\r?\n/).length
|
|
163
|
+
return side === 'preimage'
|
|
164
|
+
? [{ oldStart: 1, oldLines: lines, newStart: 0, newLines: 0 }]
|
|
165
|
+
: [{ oldStart: 0, oldLines: 0, newStart: 1, newLines: lines }]
|
|
166
|
+
} catch { return [] }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function validateLocator(locator) {
|
|
170
|
+
if (typeof locator !== 'string' || !locator.trim()) return false
|
|
171
|
+
const value = locator.trim()
|
|
172
|
+
if (/^https:\/\/[^\s]+$/.test(value) || /^#\d+$/.test(value) || /^`[^`]+`$/.test(value)) return true
|
|
173
|
+
if (!/^([^:\s]+\.[A-Za-z][\w-]{0,9})(?::\d+(?:-\d+)?)?$/.test(value)) return false
|
|
174
|
+
return safeRepoPath(value.split(':')[0])
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function readJsonFile(relative, cwd, label) {
|
|
178
|
+
if (!safeRepoPath(relative)) throw new Error(`${label} path must be a repository-relative file without traversal`)
|
|
179
|
+
let root
|
|
180
|
+
let resolved
|
|
181
|
+
try {
|
|
182
|
+
root = fs.realpathSync(cwd)
|
|
183
|
+
resolved = fs.realpathSync(path.resolve(root, relative))
|
|
184
|
+
} catch {
|
|
185
|
+
throw new Error(`${label} file is unavailable`)
|
|
186
|
+
}
|
|
187
|
+
if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) throw new Error(`${label} path escapes the repository`)
|
|
188
|
+
try {
|
|
189
|
+
return JSON.parse(fs.readFileSync(resolved, 'utf8'))
|
|
190
|
+
} catch {
|
|
191
|
+
throw new Error(`${label} file must contain valid JSON`)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function relevantEvidence(input, base, head, cwd) {
|
|
196
|
+
if (!input || input.headSha !== head || !Array.isArray(input.pullRequests)) {
|
|
197
|
+
throw new Error(`evidence headSha must match exact head ${head}`)
|
|
198
|
+
}
|
|
199
|
+
const output = []
|
|
200
|
+
for (const pr of input.pullRequests) {
|
|
201
|
+
if (pr.headSha === base) continue
|
|
202
|
+
let inRange = false
|
|
203
|
+
try {
|
|
204
|
+
inRange = exactSha(pr.headSha, cwd) === pr.headSha
|
|
205
|
+
git(['merge-base', '--is-ancestor', base, pr.headSha], cwd)
|
|
206
|
+
git(['merge-base', '--is-ancestor', pr.headSha, head], cwd)
|
|
207
|
+
} catch {
|
|
208
|
+
inRange = false
|
|
209
|
+
}
|
|
210
|
+
if (!inRange) throw new Error(`PR #${pr.number ?? '?'} evidence headSha is outside the exact range`)
|
|
211
|
+
if (!Number.isInteger(pr.number) || !/^https:\/\/[^\s]+$/.test(pr.url || '') || !Array.isArray(pr.evidence)) {
|
|
212
|
+
throw new Error('malformed per-PR evidence record')
|
|
213
|
+
}
|
|
214
|
+
for (const item of pr.evidence) {
|
|
215
|
+
if (!item || typeof item.kind !== 'string' || typeof item.status !== 'string' || !validateLocator(item.locator)) {
|
|
216
|
+
throw new Error(`unsafe evidence locator for PR #${pr.number}`)
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
output.push({
|
|
220
|
+
number: pr.number,
|
|
221
|
+
url: pr.url,
|
|
222
|
+
headSha: pr.headSha,
|
|
223
|
+
})
|
|
224
|
+
}
|
|
225
|
+
return output.sort((a, b) => a.number - b.number)
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function validateCi(input, head) {
|
|
229
|
+
if (!input || input.headSha !== head) throw new Error(`CI headSha does not match exact head ${head}`)
|
|
230
|
+
if (!Array.isArray(input.jobs)) throw new Error('CI jobs must be an array')
|
|
231
|
+
if (input.jobs.some((job) => !job || typeof job.name !== 'string' || typeof job.status !== 'string')) throw new Error('each CI job requires string name and status fields')
|
|
232
|
+
return { headSha: input.headSha, jobs: input.jobs.map((job) => ({ name: job.name, status: job.status, ...(typeof job.url === 'string' && /^https:\/\/[^\s]+$/.test(job.url) ? { url: job.url } : {}) })) }
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function packetBytes(packet) {
|
|
236
|
+
return Buffer.byteLength(`${JSON.stringify(packet, null, 2)}\n`)
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function syncOutputBytes(packet) {
|
|
240
|
+
let previousBytes = -1
|
|
241
|
+
while (packet.truncation.outputBytes !== previousBytes) {
|
|
242
|
+
previousBytes = packet.truncation.outputBytes
|
|
243
|
+
packet.truncation.outputBytes = packetBytes(packet)
|
|
244
|
+
}
|
|
245
|
+
return packet.truncation.outputBytes
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export function collectPacket({ baseRev, headRev, headRef, targetRef, targetHeadRev, targetRepository, evidence, ci, maxBytes, cwd = process.cwd() }) {
|
|
249
|
+
const base = pinnedSha(baseRev, 'base', cwd)
|
|
250
|
+
const head = pinnedSha(headRev, 'head', cwd)
|
|
251
|
+
const target = authoritativeTarget({ targetRef, targetHeadRev, targetRepository, head, suppliedBase: base, cwd })
|
|
252
|
+
if (headRef && exactRevisionSha(headRef, 'head ref', cwd) !== head) throw new Error(`head ref drifted from requested head ${head}`)
|
|
253
|
+
|
|
254
|
+
const rawNameStatus = execFileSync('git', ['diff', '--name-status', '-z', '-M', '-C', '--find-copies-harder', `${base}..${head}`], {
|
|
255
|
+
cwd, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024,
|
|
256
|
+
})
|
|
257
|
+
const nameStatus = parseNameStatusZ(rawNameStatus)
|
|
258
|
+
const highRisk = new Map(RISK_GROUPS.map((group) => [group.id, []]))
|
|
259
|
+
const highRiskEntryIndexes = new Set()
|
|
260
|
+
nameStatus.forEach((entry, index) => {
|
|
261
|
+
for (const side of pathSides(entry)) {
|
|
262
|
+
for (const id of riskIds(side.path)) {
|
|
263
|
+
highRiskEntryIndexes.add(index)
|
|
264
|
+
highRisk.get(id).push({ ...side, hunks: hunkLocators(base, head, side.path, side.side, cwd) })
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
const packet = {
|
|
270
|
+
version: PACKET_VERSION,
|
|
271
|
+
range: {
|
|
272
|
+
base,
|
|
273
|
+
head,
|
|
274
|
+
expression: `${base}..${head}`,
|
|
275
|
+
targetRef: target.targetRef,
|
|
276
|
+
targetHead: target.targetHead,
|
|
277
|
+
targetRepository: target.targetRepository,
|
|
278
|
+
},
|
|
279
|
+
diff: {
|
|
280
|
+
stat: git(['diff', '--shortstat', `${base}..${head}`], cwd),
|
|
281
|
+
nameStatus: [...nameStatus],
|
|
282
|
+
},
|
|
283
|
+
highRiskGroups: [...highRisk.entries()].filter(([, paths]) => paths.length).map(([id, paths]) => ({ id, paths })),
|
|
284
|
+
pullRequests: relevantEvidence(evidence, base, head, cwd),
|
|
285
|
+
ci: validateCi(ci, head),
|
|
286
|
+
reviewInstructions: [
|
|
287
|
+
'Inspect every high-risk path through the targeted hunk coordinates before sampling ordinary paths.',
|
|
288
|
+
'Check cross-PR interaction at shared modules, changed-and-consumed contracts, migrations, and ordering boundaries.',
|
|
289
|
+
'Return one bounded complete verdict covering every high-risk group and every relevant PR; do not request or reproduce a full patch dump.',
|
|
290
|
+
],
|
|
291
|
+
truncation: {
|
|
292
|
+
maxBytes,
|
|
293
|
+
totalChangedFiles: nameStatus.length,
|
|
294
|
+
includedNameStatus: nameStatus.length,
|
|
295
|
+
omittedNameStatus: 0,
|
|
296
|
+
omittedHighRiskPaths: 0,
|
|
297
|
+
},
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
packet.truncation.outputBytes = 0
|
|
301
|
+
if (syncOutputBytes(packet) > maxBytes) {
|
|
302
|
+
for (let index = packet.diff.nameStatus.length - 1; index >= 0 && syncOutputBytes(packet) > maxBytes; index--) {
|
|
303
|
+
if (highRiskEntryIndexes.has(index)) continue
|
|
304
|
+
packet.diff.nameStatus.splice(index, 1)
|
|
305
|
+
packet.truncation.omittedNameStatus++
|
|
306
|
+
packet.truncation.includedNameStatus--
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
if (syncOutputBytes(packet) > maxBytes) {
|
|
310
|
+
throw new Error(`required metadata exceeds byte bound ${maxBytes}; omittedHighRiskPaths=0, omittedNameStatus=${packet.truncation.omittedNameStatus}`)
|
|
311
|
+
}
|
|
312
|
+
authoritativeTarget({ ...target, targetHeadRev: target.targetHead, head, suppliedBase: base, cwd })
|
|
313
|
+
if (headRef && exactRevisionSha(headRef, 'head ref', cwd) !== head) throw new Error(`head ref drifted from requested head ${head}`)
|
|
314
|
+
return packet
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const FULL_SHA = /^[0-9a-f]{40}$/
|
|
318
|
+
const SAFE_HOST = /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/
|
|
319
|
+
const SAFE_REPOSITORY_SEGMENT = /^[A-Za-z0-9._-]+$/
|
|
320
|
+
const MAX_PACKET_BYTES = 16 * 1024 * 1024
|
|
321
|
+
|
|
322
|
+
function displayArgument(value) {
|
|
323
|
+
return JSON.stringify(`${value}`)
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
function safeExactRef(value, prefixes) {
|
|
327
|
+
const prefix = prefixes.find((candidate) => value.startsWith(candidate))
|
|
328
|
+
if (!prefix) return false
|
|
329
|
+
const remainder = value.slice(prefix.length)
|
|
330
|
+
const parts = remainder.split('/')
|
|
331
|
+
return remainder !== '@'
|
|
332
|
+
&& !value.includes('..')
|
|
333
|
+
&& !value.includes('@{')
|
|
334
|
+
&& !value.endsWith('.')
|
|
335
|
+
&& !/[\x00-\x20\x7f~^:?*\[\\]/.test(value)
|
|
336
|
+
&& parts.every((part) => part && !part.startsWith('.') && !part.endsWith('.lock'))
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function typedValue(option, value) {
|
|
340
|
+
const fail = (contract) => { throw new Error(`--${option.name} must ${contract}`) }
|
|
341
|
+
if (option.type === 'sha') {
|
|
342
|
+
if (!FULL_SHA.test(value)) fail('be a full 40-character lowercase commit SHA')
|
|
343
|
+
return value
|
|
344
|
+
}
|
|
345
|
+
if (option.type === 'target-ref') {
|
|
346
|
+
if (!safeExactRef(value, ['refs/remotes/'])) fail('be a fully-qualified non-symbolic remote-tracking branch ref')
|
|
347
|
+
const parts = value.slice('refs/remotes/'.length).split('/')
|
|
348
|
+
if (parts.length < 2 || parts.at(-1) === 'HEAD') fail('be a fully-qualified non-symbolic remote-tracking branch ref')
|
|
349
|
+
return value
|
|
350
|
+
}
|
|
351
|
+
if (option.type === 'head-ref') {
|
|
352
|
+
if (FULL_SHA.test(value)) return value
|
|
353
|
+
if (!safeExactRef(value, ['refs/heads/', 'refs/tags/', 'refs/remotes/'])) {
|
|
354
|
+
fail('be a full lowercase SHA or fully-qualified exact refs/heads, refs/tags, or non-symbolic refs/remotes revision')
|
|
355
|
+
}
|
|
356
|
+
if (value.startsWith('refs/remotes/') && value.endsWith('/HEAD')) {
|
|
357
|
+
fail('be a full lowercase SHA or fully-qualified exact refs/heads, refs/tags, or non-symbolic refs/remotes revision')
|
|
358
|
+
}
|
|
359
|
+
return value
|
|
360
|
+
}
|
|
361
|
+
if (option.type === 'repository') {
|
|
362
|
+
const [host, ...repoParts] = value.split('/')
|
|
363
|
+
if (!SAFE_HOST.test(host) || repoParts.length < 2 || repoParts.some((part) => !SAFE_REPOSITORY_SEGMENT.test(part) || part === '.' || part === '..') || /[\x00-\x20\x7f]/.test(value)) {
|
|
364
|
+
fail('be a safe lowercase-host/owner/repository identity')
|
|
365
|
+
}
|
|
366
|
+
return value
|
|
367
|
+
}
|
|
368
|
+
if (option.type === 'repo-path') {
|
|
369
|
+
if (!safeRepoPath(value) || /^[A-Za-z]:[\\/]/.test(value) || /[\x00-\x1f\x7f]/.test(value)) {
|
|
370
|
+
fail('be a repository-relative file path without absolute, traversal, dot, empty, or control segments')
|
|
371
|
+
}
|
|
372
|
+
return value
|
|
373
|
+
}
|
|
374
|
+
if (option.type === 'bytes') {
|
|
375
|
+
if (!/^[1-9][0-9]*$/.test(value)) fail('be a decimal integer from 1 through 16777216')
|
|
376
|
+
const parsed = Number(value)
|
|
377
|
+
if (!Number.isSafeInteger(parsed) || parsed > MAX_PACKET_BYTES) fail('be a decimal integer from 1 through 16777216')
|
|
378
|
+
return parsed
|
|
379
|
+
}
|
|
380
|
+
throw new Error(`internal schema error for --${option.name}`)
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const COLLECT_OPTIONS = Object.freeze([
|
|
384
|
+
{ name: 'base', required: true, metavar: 'sha', type: 'sha', note: 'full lowercase exact commit SHA' },
|
|
385
|
+
{ name: 'head', required: true, metavar: 'sha', type: 'sha', note: 'full lowercase exact commit SHA' },
|
|
386
|
+
{ name: 'head-ref', required: false, metavar: 'exact-ref-or-sha', type: 'head-ref', note: 'omitting --head-ref disables named-head drift detection; exact head/target/CI/merge-base checks remain' },
|
|
387
|
+
{ name: 'target-ref', required: true, metavar: 'refs/remotes/remote/branch', type: 'target-ref', note: 'fully-qualified explicit remote-tracking branch' },
|
|
388
|
+
{ name: 'target-head', required: true, metavar: 'sha', type: 'sha', note: 'full lowercase exact commit SHA' },
|
|
389
|
+
{ name: 'target-repository', required: true, metavar: 'host/owner/repo', type: 'repository', note: 'normalized safe repository identity' },
|
|
390
|
+
{ name: 'evidence', required: true, metavar: 'file', type: 'repo-path', dashValueWithEquals: true, note: "--evidence=<file> is required for a value beginning '-'" },
|
|
391
|
+
{ name: 'ci', required: true, metavar: 'file', type: 'repo-path', dashValueWithEquals: true, note: "--ci=<file> is required for a value beginning '-'" },
|
|
392
|
+
{ name: 'max-bytes', required: false, metavar: '1..16777216', type: 'bytes', defaultValue: DEFAULT_MAX_BYTES, note: 'bounded decimal integer' },
|
|
393
|
+
])
|
|
394
|
+
|
|
395
|
+
const COMMAND_SCHEMA = Object.freeze({
|
|
396
|
+
collect: Object.freeze({
|
|
397
|
+
description: 'Emits bounded exact-range JSON metadata for an independent combined-release review.',
|
|
398
|
+
options: COLLECT_OPTIONS,
|
|
399
|
+
}),
|
|
400
|
+
})
|
|
401
|
+
|
|
402
|
+
function usage() {
|
|
403
|
+
const command = COMMAND_SCHEMA.collect
|
|
404
|
+
const synopsis = command.options.map((option) => {
|
|
405
|
+
const token = `--${option.name} <${option.metavar}>`
|
|
406
|
+
return option.required ? token : `[${token}]`
|
|
407
|
+
}).join(' ')
|
|
408
|
+
const rows = command.options.map((option) => {
|
|
409
|
+
const requirement = option.required ? 'required' : `optional; default ${option.defaultValue ?? 'none'}`
|
|
410
|
+
return ` --${option.name} <${option.metavar}> ${requirement}; accepts --${option.name}=<value>; ${option.note}`
|
|
411
|
+
})
|
|
412
|
+
return [
|
|
413
|
+
`review-packet collect ${synopsis}`,
|
|
414
|
+
'',
|
|
415
|
+
command.description,
|
|
416
|
+
...rows,
|
|
417
|
+
'When --head-ref is present it must be an exact fully-qualified ref or full lowercase SHA; omitting --head-ref disables named-head drift detection while exact head, target, CI, and merge-base checks remain.',
|
|
418
|
+
'The packet includes stat/name-status, targeted high-risk hunk coordinates, relevant PR evidence, and exact-head CI. It never emits patch lines.',
|
|
419
|
+
].join('\n')
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
function optionToken(arg) {
|
|
423
|
+
if (arg === '--') throw new Error('empty option name "--"')
|
|
424
|
+
if (!arg.startsWith('--')) {
|
|
425
|
+
if (arg.startsWith('-') || /^[\u2010-\u2015\u2212]/u.test(arg)) throw new Error('malformed option syntax')
|
|
426
|
+
throw new Error('unexpected positional argument')
|
|
427
|
+
}
|
|
428
|
+
const equals = arg.indexOf('=')
|
|
429
|
+
const name = arg.slice(2, equals === -1 ? undefined : equals)
|
|
430
|
+
if (!/^[a-z][a-z0-9-]*$/.test(name)) throw new Error('malformed option name')
|
|
431
|
+
return { name, inline: equals !== -1, value: equals === -1 ? undefined : arg.slice(equals + 1) }
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function parseArgs(argv) {
|
|
435
|
+
const [commandName, ...rest] = argv
|
|
436
|
+
const command = COMMAND_SCHEMA[commandName]
|
|
437
|
+
if (!command) throw new Error('unsupported command (expected "collect")')
|
|
438
|
+
const byName = new Map(command.options.map((option) => [option.name, option]))
|
|
439
|
+
const raw = new Map()
|
|
440
|
+
|
|
441
|
+
for (let index = 0; index < rest.length; index++) {
|
|
442
|
+
const token = optionToken(rest[index])
|
|
443
|
+
const option = byName.get(token.name)
|
|
444
|
+
if (!option) throw new Error(`unknown option for command ${displayArgument(commandName)}`)
|
|
445
|
+
if (raw.has(option.name)) throw new Error(`--${option.name} may be supplied only once`)
|
|
446
|
+
let value = token.value
|
|
447
|
+
if (!token.inline) {
|
|
448
|
+
value = rest[index + 1]
|
|
449
|
+
if (typeof value !== 'string' || value === '' || value.startsWith('-')) {
|
|
450
|
+
if (option.dashValueWithEquals && typeof value === 'string' && value.startsWith('-') && !value.startsWith('--')) {
|
|
451
|
+
throw new Error(`--${option.name} requires --${option.name}=<value> for a value beginning '-'`)
|
|
452
|
+
}
|
|
453
|
+
throw new Error(`--${option.name} requires a value`)
|
|
454
|
+
}
|
|
455
|
+
index++
|
|
456
|
+
} else if (value === '') {
|
|
457
|
+
throw new Error(`--${option.name} requires a non-empty value`)
|
|
458
|
+
}
|
|
459
|
+
raw.set(option.name, value)
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
const options = {}
|
|
463
|
+
for (const option of command.options) {
|
|
464
|
+
if (!raw.has(option.name)) {
|
|
465
|
+
if (option.required) throw new Error(`--${option.name} is required`)
|
|
466
|
+
if (option.defaultValue !== undefined) options[option.name] = option.defaultValue
|
|
467
|
+
continue
|
|
468
|
+
}
|
|
469
|
+
options[option.name] = typedValue(option, raw.get(option.name))
|
|
470
|
+
}
|
|
471
|
+
return { command: commandName, options }
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
const USAGE = usage()
|
|
475
|
+
|
|
476
|
+
export function main(argv, cwd = process.cwd()) {
|
|
477
|
+
try {
|
|
478
|
+
if (argv.length === 1 && ['--help', '-h', 'help'].includes(argv[0])) {
|
|
479
|
+
console.log(USAGE)
|
|
480
|
+
return 0
|
|
481
|
+
}
|
|
482
|
+
const { command, options } = parseArgs(argv)
|
|
483
|
+
const packet = collectPacket({
|
|
484
|
+
baseRev: options.base,
|
|
485
|
+
headRev: options.head,
|
|
486
|
+
headRef: options['head-ref'],
|
|
487
|
+
targetRef: options['target-ref'],
|
|
488
|
+
targetHeadRev: options['target-head'],
|
|
489
|
+
targetRepository: options['target-repository'],
|
|
490
|
+
evidence: readJsonFile(options.evidence, cwd, 'evidence'),
|
|
491
|
+
ci: readJsonFile(options.ci, cwd, 'CI'),
|
|
492
|
+
maxBytes: options['max-bytes'],
|
|
493
|
+
cwd,
|
|
494
|
+
})
|
|
495
|
+
console.log(JSON.stringify(packet, null, 2))
|
|
496
|
+
return 0
|
|
497
|
+
} catch (error) {
|
|
498
|
+
console.error(`review-packet: ${error.message}`)
|
|
499
|
+
return 1
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
if (isMainModule(import.meta.url)) process.exit(main(process.argv.slice(2)))
|