@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,576 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { isAbsolute, join, normalize, relative } from 'node:path';
|
|
4
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
5
|
+
|
|
6
|
+
import { isMainModule } from './main-module.mjs';
|
|
7
|
+
import {
|
|
8
|
+
HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
|
|
9
|
+
MATT_DEPENDENCY_MEMBERS,
|
|
10
|
+
WORKFLOW_OWNED_MEMBERS,
|
|
11
|
+
WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES,
|
|
12
|
+
WORKFLOW_TRUSTED_REPAIR_RECIPE,
|
|
13
|
+
WORKFLOW_TRUSTED_SOURCES,
|
|
14
|
+
} from './workflow-policy.mjs';
|
|
15
|
+
|
|
16
|
+
export {
|
|
17
|
+
HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
|
|
18
|
+
MATT_DEPENDENCY_MEMBERS,
|
|
19
|
+
WORKFLOW_OWNED_MEMBERS,
|
|
20
|
+
WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES,
|
|
21
|
+
WORKFLOW_TRUSTED_REPAIR_RECIPE,
|
|
22
|
+
} from './workflow-policy.mjs';
|
|
23
|
+
|
|
24
|
+
// v2 (#996): a first-party member digests its PUBLISHED content — the file set the release ships on
|
|
25
|
+
// every render target — while an external member still digests its reviewed upstream tree exactly.
|
|
26
|
+
// v1 digested the exact tree for both, which made the same first-party release digest differently in
|
|
27
|
+
// a private checkout and in the npm package and reported every correctly installed member modified.
|
|
28
|
+
export const WORKFLOW_DIGEST_ALGORITHM = 'sha256-path-content-v2';
|
|
29
|
+
export const WORKFLOW_COHERENCE_PATH = 'skills/engineering/engineering-runtime/coherence/workflow.json';
|
|
30
|
+
const DIGEST = /^[0-9a-f]{64}$/;
|
|
31
|
+
|
|
32
|
+
function deepFreeze(value) {
|
|
33
|
+
if (value && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
34
|
+
for (const child of Object.values(value)) deepFreeze(child);
|
|
35
|
+
Object.freeze(value);
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const FIRST_PARTY_SOURCE = WORKFLOW_TRUSTED_SOURCES.firstParty;
|
|
41
|
+
const MATT_SOURCE = WORKFLOW_TRUSTED_SOURCES.matt;
|
|
42
|
+
const MATT_MEMBER_PATHS = Object.freeze({
|
|
43
|
+
'batch-grill-me': 'skills/in-progress/batch-grill-me',
|
|
44
|
+
'code-review': 'skills/engineering/code-review',
|
|
45
|
+
'codebase-design': 'skills/engineering/codebase-design',
|
|
46
|
+
'diagnosing-bugs': 'skills/engineering/diagnosing-bugs',
|
|
47
|
+
'domain-modeling': 'skills/engineering/domain-modeling',
|
|
48
|
+
'grill-me': 'skills/productivity/grill-me',
|
|
49
|
+
'grill-with-docs': 'skills/engineering/grill-with-docs',
|
|
50
|
+
grilling: 'skills/productivity/grilling',
|
|
51
|
+
handoff: 'skills/productivity/handoff',
|
|
52
|
+
'improve-codebase-architecture': 'skills/engineering/improve-codebase-architecture',
|
|
53
|
+
prototype: 'skills/engineering/prototype',
|
|
54
|
+
research: 'skills/engineering/research',
|
|
55
|
+
'resolving-merge-conflicts': 'skills/engineering/resolving-merge-conflicts',
|
|
56
|
+
'setup-matt-pocock-skills': 'skills/engineering/setup-matt-pocock-skills',
|
|
57
|
+
tdd: 'skills/engineering/tdd',
|
|
58
|
+
'to-spec': 'skills/engineering/to-spec',
|
|
59
|
+
'to-tickets': 'skills/engineering/to-tickets',
|
|
60
|
+
triage: 'skills/engineering/triage',
|
|
61
|
+
wayfinder: 'skills/engineering/wayfinder',
|
|
62
|
+
});
|
|
63
|
+
export const WORKFLOW_TRUSTED_POLICY = deepFreeze({
|
|
64
|
+
members: [
|
|
65
|
+
...MATT_DEPENDENCY_MEMBERS.map((installName) => ({
|
|
66
|
+
installName,
|
|
67
|
+
ownership: 'dependency',
|
|
68
|
+
sourcePath: MATT_MEMBER_PATHS[installName],
|
|
69
|
+
expectedSource: MATT_SOURCE,
|
|
70
|
+
})),
|
|
71
|
+
...HARNESS_RUNTIME_DEPENDENCY_MEMBERS.map((installName) => ({
|
|
72
|
+
installName,
|
|
73
|
+
ownership: 'dependency',
|
|
74
|
+
sourcePath: 'skills/engineering/harness-runtime',
|
|
75
|
+
expectedSource: FIRST_PARTY_SOURCE,
|
|
76
|
+
})),
|
|
77
|
+
...WORKFLOW_OWNED_MEMBERS.map((installName) => ({
|
|
78
|
+
installName,
|
|
79
|
+
ownership: 'owned',
|
|
80
|
+
sourcePath: `skills/engineering/${installName}`,
|
|
81
|
+
expectedSource: FIRST_PARTY_SOURCE,
|
|
82
|
+
})),
|
|
83
|
+
],
|
|
84
|
+
dependencyClosures: WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES,
|
|
85
|
+
repairRecipe: WORKFLOW_TRUSTED_REPAIR_RECIPE,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const TRUSTED_MEMBER_BY_NAME = new Map(
|
|
89
|
+
WORKFLOW_TRUSTED_POLICY.members.map((member) => [member.installName, member]),
|
|
90
|
+
);
|
|
91
|
+
const REPAIR_RECIPE_REFERENCE = deepFreeze({
|
|
92
|
+
id: WORKFLOW_TRUSTED_REPAIR_RECIPE.id,
|
|
93
|
+
generatedFrom: WORKFLOW_TRUSTED_REPAIR_RECIPE.generatedFrom,
|
|
94
|
+
groupId: WORKFLOW_TRUSTED_REPAIR_RECIPE.groupId,
|
|
95
|
+
lifecycle: WORKFLOW_TRUSTED_REPAIR_RECIPE.lifecycle,
|
|
96
|
+
});
|
|
97
|
+
const FALLBACK_SOURCE = FIRST_PARTY_SOURCE;
|
|
98
|
+
|
|
99
|
+
// Install / OS debris that must never enter a member content digest. Same names
|
|
100
|
+
// distribution.mjs skips when walking trees for census/generate. Without this,
|
|
101
|
+
// a local `npm install` that drops package-lock.json or node_modules (gitignored)
|
|
102
|
+
// silently changes digests and CI (which has a clean checkout) reports
|
|
103
|
+
// member-content-modified / committed drift — residual of #791/#792 digest chores.
|
|
104
|
+
const DIGEST_SKIP_NAMES = new Set([
|
|
105
|
+
'node_modules',
|
|
106
|
+
'package-lock.json',
|
|
107
|
+
'.DS_Store',
|
|
108
|
+
'.git',
|
|
109
|
+
'.unit-git',
|
|
110
|
+
'.system',
|
|
111
|
+
]);
|
|
112
|
+
|
|
113
|
+
// `<name>.fixture.<ext>` / `<name>.fixtures.<ext>` — this repository's convention for a recorded
|
|
114
|
+
// payload that exists only so a `*.test.mjs` can replay it. Anchored on a FILE extension, which is
|
|
115
|
+
// what keeps fixture DIRECTORIES included: `harness-runtime/fixtures/` is cited by a shipped
|
|
116
|
+
// reference document as its machine-readable schema summary, so it is genuine payload and its name
|
|
117
|
+
// (`fixtures`, no extension) cannot match.
|
|
118
|
+
const TEST_FIXTURE = /\.fixtures?\.[^.]+$/;
|
|
119
|
+
|
|
120
|
+
// What a first-party member's PUBLISHED content is NOT. This is the packaging rule — the same
|
|
121
|
+
// predicate `skills/distribution/scripts/package-build.mjs` stages the public package with, imported
|
|
122
|
+
// from here so the two cannot drift. A file the package does not carry must not enter a first-party
|
|
123
|
+
// member's digest: otherwise one release digests differently on its two render targets, and the
|
|
124
|
+
// checkout digest committed into workflow.json condemns every correct npm installation as modified.
|
|
125
|
+
// Deliberately NOT a way to hide runtime content — everything the release ships is still digested.
|
|
126
|
+
//
|
|
127
|
+
// The clauses, and why each is here rather than only in one of the two callers:
|
|
128
|
+
//
|
|
129
|
+
// `.`-prefixed — `.git`, `.DS_Store` and any local tooling dotfile.
|
|
130
|
+
// node_modules — installed dependencies, never authored payload.
|
|
131
|
+
// `*-workspace` — this repository's gitignored eval fixture convention.
|
|
132
|
+
// `*.test.mjs` — tests are not runtime payload.
|
|
133
|
+
// TEST_FIXTURE — dropping the test while keeping the recording it replays publishes a test
|
|
134
|
+
// artifact, which the distribution boundary excludes on its own terms and which in
|
|
135
|
+
// practice carries material a public tarball must not: the Mergify comment fixture
|
|
136
|
+
// is a verbatim capture of a private-repository pull request, private repository
|
|
137
|
+
// name included, and it was staged into the tarball for exactly as long as the two
|
|
138
|
+
// rules disagreed (#995).
|
|
139
|
+
//
|
|
140
|
+
// Accepted consequence, stated rather than implied (#999): under a private-checkout install, a
|
|
141
|
+
// modified `*.test.mjs` — or a modified recorded fixture — inside an installed member is no longer
|
|
142
|
+
// detected by coherence, and neither reaches the public channel at all. Tests are not runtime and
|
|
143
|
+
// `walkRuntimeModules` (distribution.mjs) skips them by name. The recorded fixtures in this tree are
|
|
144
|
+
// all `*.fixture.json`, which that walk skips only because it collects `.mjs` alone — so a
|
|
145
|
+
// `*.fixture.mjs` would be the one shape where the release scope and the dependency-closure walk
|
|
146
|
+
// disagree, with the closure reaching a module the package does not ship. None exists; this note is
|
|
147
|
+
// here so that the first one is a decision rather than a discovery.
|
|
148
|
+
export function publishedContentExcluded(name) {
|
|
149
|
+
return name.startsWith('.')
|
|
150
|
+
|| name === 'node_modules'
|
|
151
|
+
|| name.endsWith('-workspace')
|
|
152
|
+
|| name.endsWith('.test.mjs')
|
|
153
|
+
|| TEST_FIXTURE.test(name);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Whether a member's expected source identity is the first-party release — the ONE place that
|
|
157
|
+
// question is answered, for the generator that computes a digest and the validator that checks it.
|
|
158
|
+
//
|
|
159
|
+
// It exists because the two ends used to read different fields of the same object: the generator
|
|
160
|
+
// tested `expectedSource.id`, the runtime digest scope tested `expectedSource.type`. Those agree
|
|
161
|
+
// today only because the manifest's first-party source happens to be NAMED `first-party`. Rename
|
|
162
|
+
// that source id and the generator would digest the whole checkout tree while the validator digested
|
|
163
|
+
// published content only, so every first-party member of a correct installation would report as
|
|
164
|
+
// modified — on both transports, which is the exact failure the published scope exists to prevent.
|
|
165
|
+
// `type` is the field carrying the meaning (`expectedSourceIdentity` branches on `source.type`, and
|
|
166
|
+
// `first-party`/`external` is the source TAXONOMY); `id` is a name and may change.
|
|
167
|
+
export function firstPartySource(expectedSource) {
|
|
168
|
+
return expectedSource?.type === 'first-party';
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function collectFiles(baseDir, currentDir, excludedPaths, files, published) {
|
|
172
|
+
for (const entry of readdirSync(currentDir, { withFileTypes: true })) {
|
|
173
|
+
if (DIGEST_SKIP_NAMES.has(entry.name) || entry.name.endsWith('-workspace')) continue;
|
|
174
|
+
if (published && publishedContentExcluded(entry.name)) continue;
|
|
175
|
+
const path = join(currentDir, entry.name);
|
|
176
|
+
const relativePath = relative(baseDir, path).replaceAll('\\', '/');
|
|
177
|
+
if (excludedPaths.has(relativePath)) continue;
|
|
178
|
+
if (entry.isDirectory()) collectFiles(baseDir, path, excludedPaths, files, published);
|
|
179
|
+
else if (entry.isFile()) files.push({ path, relativePath });
|
|
180
|
+
else throw new Error(`Unsupported member content entry: ${relativePath}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* @param {object} [options]
|
|
186
|
+
* @param {string[]} [options.exclude] member-relative paths to omit
|
|
187
|
+
* @param {object[]} [options.injected] generated content to digest instead of reading from disk
|
|
188
|
+
* @param {boolean} [options.published] digest the member's published content — the file set the
|
|
189
|
+
* release ships — rather than its exact tree. Set for first-party members, whose authority is the
|
|
190
|
+
* published release; left off for external members, whose authority is the reviewed upstream tree
|
|
191
|
+
* byte for byte. See {@link publishedContentExcluded}.
|
|
192
|
+
*/
|
|
193
|
+
export function contentDigest(directory, { exclude = [], injected = [], published = false } = {}) {
|
|
194
|
+
const files = [];
|
|
195
|
+
const excluded = new Set(exclude);
|
|
196
|
+
for (const file of injected) excluded.add(file.relativePath);
|
|
197
|
+
collectFiles(directory, directory, excluded, files, published);
|
|
198
|
+
for (const file of injected) files.push({ relativePath: file.relativePath, contents: file.contents });
|
|
199
|
+
files.sort((left, right) => left.relativePath.localeCompare(right.relativePath));
|
|
200
|
+
const hash = createHash('sha256');
|
|
201
|
+
for (const file of files) {
|
|
202
|
+
hash.update(file.relativePath);
|
|
203
|
+
hash.update(file.contents ?? readFileSync(file.path));
|
|
204
|
+
}
|
|
205
|
+
return hash.digest('hex');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export function workflowReleaseIdentity(releaseData) {
|
|
209
|
+
return createHash('sha256').update(JSON.stringify(releaseData)).digest('hex');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function validRelativePath(path) {
|
|
213
|
+
return typeof path === 'string'
|
|
214
|
+
&& path.length > 0
|
|
215
|
+
&& !isAbsolute(path)
|
|
216
|
+
&& !path.split('/').includes('..')
|
|
217
|
+
&& normalize(path).replaceAll('\\', '/') === path;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function releaseData(manifest) {
|
|
221
|
+
return {
|
|
222
|
+
schemaVersion: manifest.schemaVersion,
|
|
223
|
+
groupId: manifest.groupId,
|
|
224
|
+
ownedMembers: manifest.ownedMembers,
|
|
225
|
+
dependencies: manifest.dependencies,
|
|
226
|
+
dependencyClosures: manifest.dependencyClosures,
|
|
227
|
+
digestAlgorithm: manifest.digestAlgorithm,
|
|
228
|
+
members: manifest.members,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function repairRecipeReference() {
|
|
233
|
+
return REPAIR_RECIPE_REFERENCE;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function finding({ state, code, member, ownership, expectedSource, manifest, expectedDigest, actualDigest, detail }) {
|
|
237
|
+
return {
|
|
238
|
+
state,
|
|
239
|
+
code,
|
|
240
|
+
member,
|
|
241
|
+
ownership,
|
|
242
|
+
expectedSource,
|
|
243
|
+
...(expectedDigest ? { expectedDigest } : {}),
|
|
244
|
+
...(actualDigest ? { actualDigest } : {}),
|
|
245
|
+
detail,
|
|
246
|
+
repairRecipe: repairRecipeReference(manifest),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function exactContract(actual, expected) {
|
|
251
|
+
return isDeepStrictEqual(actual, expected);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function validateManifest(manifest) {
|
|
255
|
+
const findings = [];
|
|
256
|
+
const memberByName = new Map(Array.isArray(manifest?.members)
|
|
257
|
+
? manifest.members.map((member) => [member?.installName, member])
|
|
258
|
+
: []);
|
|
259
|
+
const add = (code, memberName, detail) => {
|
|
260
|
+
const expectedMember = TRUSTED_MEMBER_BY_NAME.get(memberName);
|
|
261
|
+
const ownership = expectedMember?.ownership
|
|
262
|
+
?? (WORKFLOW_OWNED_MEMBERS.includes(memberName) ? 'owned' : 'dependency');
|
|
263
|
+
findings.push(finding({
|
|
264
|
+
state: 'missing-manifest',
|
|
265
|
+
code,
|
|
266
|
+
member: memberName,
|
|
267
|
+
ownership,
|
|
268
|
+
expectedSource: expectedMember?.expectedSource ?? FALLBACK_SOURCE,
|
|
269
|
+
manifest,
|
|
270
|
+
detail,
|
|
271
|
+
}));
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
if (!manifest || manifest.schemaVersion !== 1 || manifest.groupId !== 'engineering-workflow') {
|
|
275
|
+
add('manifest-identity-invalid', 'engineering-runtime', 'The coherence schema or group identity is missing or malformed.');
|
|
276
|
+
return findings;
|
|
277
|
+
}
|
|
278
|
+
if (manifest.lifecycleAuthority !== 'native-skills-cli') {
|
|
279
|
+
add('lifecycle-authority-invalid', 'engineering-runtime', 'The coherence data must point to the native Skills CLI lifecycle authority.');
|
|
280
|
+
}
|
|
281
|
+
if (manifest.digestAlgorithm !== WORKFLOW_DIGEST_ALGORITHM) {
|
|
282
|
+
add('digest-algorithm-invalid', 'engineering-runtime', 'The coherence digest algorithm is missing or unsupported.');
|
|
283
|
+
}
|
|
284
|
+
if (JSON.stringify(manifest.ownedMembers) !== JSON.stringify(WORKFLOW_OWNED_MEMBERS)) {
|
|
285
|
+
add('owned-census-invalid', 'engineering-runtime', 'The exact eight-member Workflow ownership census is missing or malformed.');
|
|
286
|
+
}
|
|
287
|
+
if (JSON.stringify(manifest.dependencies) !== JSON.stringify([
|
|
288
|
+
{ groupId: 'matt-pocock-toolkit', members: MATT_DEPENDENCY_MEMBERS },
|
|
289
|
+
{ groupId: 'harness-runtime', members: HARNESS_RUNTIME_DEPENDENCY_MEMBERS },
|
|
290
|
+
])) {
|
|
291
|
+
add('dependency-census-invalid', 'engineering-runtime', 'The exact Matt and harness runtime dependency census is missing or malformed.');
|
|
292
|
+
}
|
|
293
|
+
if (!exactContract(manifest.dependencyClosures, WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES)) {
|
|
294
|
+
const names = new Set(Array.isArray(manifest.dependencyClosures)
|
|
295
|
+
? manifest.dependencyClosures.map((closure) => closure?.invokedSkill)
|
|
296
|
+
: []);
|
|
297
|
+
const member = WORKFLOW_TRUSTED_DEPENDENCY_CLOSURES.find((closure) => !names.has(closure.invokedSkill))?.invokedSkill
|
|
298
|
+
?? 'resolve-issues';
|
|
299
|
+
add('dependency-closure-invalid', member, 'The invoked-skill dependency closure is missing, weakened, reordered or malformed.');
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const expectedOrder = [
|
|
303
|
+
...MATT_DEPENDENCY_MEMBERS,
|
|
304
|
+
...HARNESS_RUNTIME_DEPENDENCY_MEMBERS,
|
|
305
|
+
...WORKFLOW_OWNED_MEMBERS,
|
|
306
|
+
];
|
|
307
|
+
if (!Array.isArray(manifest.members)
|
|
308
|
+
|| JSON.stringify(manifest.members.map((member) => member?.installName)) !== JSON.stringify(expectedOrder)) {
|
|
309
|
+
add('member-census-invalid', 'engineering-runtime', 'The dependency-first member records are missing, reordered or malformed.');
|
|
310
|
+
} else {
|
|
311
|
+
for (const memberName of expectedOrder) {
|
|
312
|
+
const member = memberByName.get(memberName);
|
|
313
|
+
const expectedMember = TRUSTED_MEMBER_BY_NAME.get(memberName);
|
|
314
|
+
const firstParty = firstPartySource(expectedMember.expectedSource);
|
|
315
|
+
if (member.ownership !== expectedMember.ownership) {
|
|
316
|
+
add('member-ownership-invalid', memberName, 'The member ownership identity is missing or malformed.');
|
|
317
|
+
}
|
|
318
|
+
if (!validRelativePath(member.sourcePath) || member.sourcePath !== expectedMember.sourcePath) {
|
|
319
|
+
add('member-source-path-invalid', memberName, 'The expected source-relative member path is missing or malformed.');
|
|
320
|
+
}
|
|
321
|
+
if (!DIGEST.test(member.contentDigest ?? '')) {
|
|
322
|
+
add('member-digest-invalid', memberName, 'The expected member content digest is missing or malformed.');
|
|
323
|
+
}
|
|
324
|
+
if (!exactContract(member.expectedSource, expectedMember.expectedSource)) {
|
|
325
|
+
add('member-source-identity-invalid', memberName, 'The expected member source identity is missing or malformed.');
|
|
326
|
+
}
|
|
327
|
+
const expectedExcludes = firstParty && memberName === 'engineering-runtime'
|
|
328
|
+
? ['coherence/workflow.json']
|
|
329
|
+
: [];
|
|
330
|
+
if (Object.hasOwn(member, 'releaseMarker')
|
|
331
|
+
|| JSON.stringify(member.digestExcludes) !== JSON.stringify(expectedExcludes)) {
|
|
332
|
+
add('member-digest-contract-invalid', memberName, 'The member digest exclusion contract is missing or malformed.');
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
if (!exactContract(manifest.repairRecipe, WORKFLOW_TRUSTED_REPAIR_RECIPE)) {
|
|
338
|
+
add('repair-recipe-invalid', 'engineering-runtime', 'The generated dependency-first repair recipe is missing or malformed.');
|
|
339
|
+
}
|
|
340
|
+
if (!DIGEST.test(manifest.releaseIdentity ?? '')
|
|
341
|
+
|| workflowReleaseIdentity(releaseData(manifest)) !== manifest.releaseIdentity) {
|
|
342
|
+
add('release-identity-invalid', 'engineering-runtime', 'The release identity is missing, malformed or inconsistent with member data.');
|
|
343
|
+
}
|
|
344
|
+
return findings;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function memberDirectory(member, options) {
|
|
348
|
+
if (options.layout === 'installed') return join(options.skillsRoot, member.installName);
|
|
349
|
+
const sourceRoot = options.sourceRoots?.[member.expectedSource.id];
|
|
350
|
+
return sourceRoot ? join(sourceRoot, member.sourcePath) : null;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function missingManifestResult(layout, code, detail, invokedSkills) {
|
|
354
|
+
return {
|
|
355
|
+
schemaVersion: 1,
|
|
356
|
+
groupId: 'engineering-workflow',
|
|
357
|
+
layout,
|
|
358
|
+
releaseIdentity: null,
|
|
359
|
+
...(Array.isArray(invokedSkills) ? { scope: { invokedSkills: [...invokedSkills], members: [], generatedIdentities: [] } } : {}),
|
|
360
|
+
coherent: false,
|
|
361
|
+
findings: [finding({
|
|
362
|
+
state: 'missing-manifest',
|
|
363
|
+
code,
|
|
364
|
+
member: 'engineering-runtime',
|
|
365
|
+
ownership: 'owned',
|
|
366
|
+
expectedSource: FALLBACK_SOURCE,
|
|
367
|
+
detail,
|
|
368
|
+
})],
|
|
369
|
+
repairRecipe: WORKFLOW_TRUSTED_REPAIR_RECIPE,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
export function verifyWorkflowCoherence(options = {}) {
|
|
374
|
+
const layout = options.layout ?? 'installed';
|
|
375
|
+
if (!['installed', 'source'].includes(layout)) {
|
|
376
|
+
return missingManifestResult(layout, 'layout-invalid', 'The requested installation layout is unsupported.', options.invokedSkills);
|
|
377
|
+
}
|
|
378
|
+
const manifestPath = options.manifestPath ?? (layout === 'installed'
|
|
379
|
+
? join(options.skillsRoot ?? '', 'engineering-runtime', 'coherence', 'workflow.json')
|
|
380
|
+
: join(options.sourceRoots?.['first-party'] ?? '', WORKFLOW_COHERENCE_PATH));
|
|
381
|
+
if (!manifestPath || !existsSync(manifestPath)) {
|
|
382
|
+
return missingManifestResult(layout, 'manifest-missing', 'The Workflow coherence manifest is missing.', options.invokedSkills);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
let manifest;
|
|
386
|
+
try {
|
|
387
|
+
manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
|
|
388
|
+
} catch {
|
|
389
|
+
return missingManifestResult(layout, 'manifest-malformed', 'The Workflow coherence manifest is not valid JSON.', options.invokedSkills);
|
|
390
|
+
}
|
|
391
|
+
const manifestFindings = validateManifest(manifest);
|
|
392
|
+
if (manifestFindings.length > 0) {
|
|
393
|
+
return {
|
|
394
|
+
schemaVersion: 1,
|
|
395
|
+
groupId: 'engineering-workflow',
|
|
396
|
+
layout,
|
|
397
|
+
releaseIdentity: DIGEST.test(manifest.releaseIdentity ?? '') ? manifest.releaseIdentity : null,
|
|
398
|
+
...(Array.isArray(options.invokedSkills) ? { scope: { invokedSkills: [...options.invokedSkills], members: [], generatedIdentities: [] } } : {}),
|
|
399
|
+
coherent: false,
|
|
400
|
+
findings: manifestFindings,
|
|
401
|
+
repairRecipe: manifestFindings.some((candidate) => candidate.code === 'repair-recipe-invalid')
|
|
402
|
+
? WORKFLOW_TRUSTED_REPAIR_RECIPE
|
|
403
|
+
: manifest.repairRecipe,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const findings = [];
|
|
408
|
+
const requested = options.invokedSkills;
|
|
409
|
+
const invokedSkills = requested === undefined ? [] : requested;
|
|
410
|
+
const closureBySkill = new Map(manifest.dependencyClosures.map((closure) => [closure.invokedSkill, closure]));
|
|
411
|
+
const selectedNames = new Set();
|
|
412
|
+
const selectedGenerated = new Map();
|
|
413
|
+
if (!Array.isArray(invokedSkills) || invokedSkills.length === 0 && requested !== undefined
|
|
414
|
+
|| invokedSkills.some((skill) => typeof skill !== 'string' || !skill.trim())
|
|
415
|
+
|| new Set(invokedSkills).size !== invokedSkills.length) {
|
|
416
|
+
findings.push(finding({
|
|
417
|
+
state: 'missing-manifest', code: 'invoked-skill-invalid', member: 'engineering-runtime', ownership: 'owned',
|
|
418
|
+
expectedSource: FALLBACK_SOURCE, manifest,
|
|
419
|
+
detail: 'invokedSkills must be a non-empty array of unique installed skill names when scoped verification is requested.',
|
|
420
|
+
}));
|
|
421
|
+
} else if (requested === undefined) {
|
|
422
|
+
for (const member of manifest.members) selectedNames.add(member.installName);
|
|
423
|
+
for (const closure of manifest.dependencyClosures) {
|
|
424
|
+
for (const identity of closure.generatedIdentities) selectedGenerated.set(`${identity.member}:${identity.path}`, identity);
|
|
425
|
+
}
|
|
426
|
+
} else {
|
|
427
|
+
for (const invokedSkill of invokedSkills) {
|
|
428
|
+
const closure = closureBySkill.get(invokedSkill);
|
|
429
|
+
if (!closure) {
|
|
430
|
+
const expected = TRUSTED_MEMBER_BY_NAME.get(invokedSkill);
|
|
431
|
+
findings.push(finding({
|
|
432
|
+
state: 'missing-manifest', code: 'invoked-skill-unknown', member: invokedSkill,
|
|
433
|
+
ownership: expected?.ownership ?? 'owned', expectedSource: expected?.expectedSource ?? FALLBACK_SOURCE,
|
|
434
|
+
manifest, detail: `No trusted dependency closure exists for invoked skill ${JSON.stringify(invokedSkill)}.`,
|
|
435
|
+
}));
|
|
436
|
+
continue;
|
|
437
|
+
}
|
|
438
|
+
for (const memberName of closure.members) selectedNames.add(memberName);
|
|
439
|
+
for (const identity of closure.generatedIdentities) selectedGenerated.set(`${identity.member}:${identity.path}`, identity);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
const selectedMembers = manifest.members.filter((member) => selectedNames.has(member.installName));
|
|
444
|
+
for (const member of selectedMembers) {
|
|
445
|
+
const directory = memberDirectory(member, { ...options, layout });
|
|
446
|
+
if (!directory || !existsSync(directory)) {
|
|
447
|
+
findings.push(finding({
|
|
448
|
+
state: 'missing',
|
|
449
|
+
code: 'member-missing',
|
|
450
|
+
member: member.installName,
|
|
451
|
+
ownership: member.ownership,
|
|
452
|
+
expectedSource: member.expectedSource,
|
|
453
|
+
expectedDigest: member.contentDigest,
|
|
454
|
+
manifest,
|
|
455
|
+
detail: 'The expected member directory is missing.',
|
|
456
|
+
}));
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
let actualDigest;
|
|
461
|
+
try {
|
|
462
|
+
// First-party members are digested over the release's file set on BOTH transports (ADR 0004
|
|
463
|
+
// decision 4), so a correct npm installation is not reported as modified. The scope is derived
|
|
464
|
+
// from the member's declared source rather than carried as a second field, so there is no way
|
|
465
|
+
// for a member to claim a scope its source does not have — and `validateManifest` has already
|
|
466
|
+
// proved `expectedSource` deep-equal to the trusted policy above (`member-source-identity-
|
|
467
|
+
// invalid` returns before this loop), so the derivation reads trusted data, not manifest claims.
|
|
468
|
+
actualDigest = contentDigest(directory, {
|
|
469
|
+
exclude: member.digestExcludes,
|
|
470
|
+
published: firstPartySource(member.expectedSource),
|
|
471
|
+
});
|
|
472
|
+
} catch (error) {
|
|
473
|
+
findings.push(finding({
|
|
474
|
+
state: 'modified',
|
|
475
|
+
code: 'member-content-unreadable',
|
|
476
|
+
member: member.installName,
|
|
477
|
+
ownership: member.ownership,
|
|
478
|
+
expectedSource: member.expectedSource,
|
|
479
|
+
expectedDigest: member.contentDigest,
|
|
480
|
+
manifest,
|
|
481
|
+
detail: error.message,
|
|
482
|
+
}));
|
|
483
|
+
continue;
|
|
484
|
+
}
|
|
485
|
+
if (actualDigest !== member.contentDigest) {
|
|
486
|
+
findings.push(finding({
|
|
487
|
+
state: 'modified',
|
|
488
|
+
code: 'member-content-modified',
|
|
489
|
+
member: member.installName,
|
|
490
|
+
ownership: member.ownership,
|
|
491
|
+
expectedSource: member.expectedSource,
|
|
492
|
+
expectedDigest: member.contentDigest,
|
|
493
|
+
actualDigest,
|
|
494
|
+
manifest,
|
|
495
|
+
detail: 'The installed member content does not match its deterministic digest.',
|
|
496
|
+
}));
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
const generatedIdentities = [];
|
|
501
|
+
const memberByName = new Map(manifest.members.map((member) => [member.installName, member]));
|
|
502
|
+
for (const identity of selectedGenerated.values()) {
|
|
503
|
+
const member = memberByName.get(identity.member);
|
|
504
|
+
const directory = member ? memberDirectory(member, { ...options, layout }) : null;
|
|
505
|
+
const generatedPath = directory ? join(directory, identity.path) : null;
|
|
506
|
+
let actualDigest = null;
|
|
507
|
+
if (generatedPath && existsSync(generatedPath)) {
|
|
508
|
+
try { actualDigest = createHash('sha256').update(readFileSync(generatedPath)).digest('hex'); } catch {}
|
|
509
|
+
}
|
|
510
|
+
generatedIdentities.push({ ...identity, digestAlgorithm: 'sha256', actualDigest });
|
|
511
|
+
if (actualDigest === null) {
|
|
512
|
+
findings.push(finding({
|
|
513
|
+
state: 'missing', code: 'generated-identity-missing', member: identity.member,
|
|
514
|
+
ownership: member?.ownership ?? 'owned', expectedSource: member?.expectedSource ?? FALLBACK_SOURCE,
|
|
515
|
+
manifest, detail: `Generated identity ${identity.path} is missing or unreadable.`,
|
|
516
|
+
}));
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
return {
|
|
521
|
+
schemaVersion: 1,
|
|
522
|
+
groupId: manifest.groupId,
|
|
523
|
+
layout,
|
|
524
|
+
releaseIdentity: manifest.releaseIdentity,
|
|
525
|
+
scope: {
|
|
526
|
+
invokedSkills: [...invokedSkills],
|
|
527
|
+
members: selectedMembers.map((member) => member.installName),
|
|
528
|
+
generatedIdentities,
|
|
529
|
+
},
|
|
530
|
+
coherent: findings.length === 0,
|
|
531
|
+
findings,
|
|
532
|
+
repairRecipe: manifest.repairRecipe,
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
export function runWorkflowCoherenceCli(args) {
|
|
537
|
+
if (args[0] !== 'verify') {
|
|
538
|
+
process.stderr.write(
|
|
539
|
+
'Usage: workflow-coherence.mjs verify --layout installed --skills-root <path> [--manifest <path>] [--invoked-skill <name>]...\n'
|
|
540
|
+
+ ' or: workflow-coherence.mjs verify --layout source --source-root <id=path>... [--manifest <path>] [--invoked-skill <name>]...\n',
|
|
541
|
+
);
|
|
542
|
+
return 2;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const options = { sourceRoots: {} };
|
|
546
|
+
for (let index = 1; index < args.length; index += 1) {
|
|
547
|
+
const argument = args[index];
|
|
548
|
+
const value = args[index + 1];
|
|
549
|
+
if (argument === '--layout' || argument === '--skills-root' || argument === '--manifest') {
|
|
550
|
+
if (!value) return 2;
|
|
551
|
+
const key = argument === '--layout' ? 'layout' : argument === '--skills-root' ? 'skillsRoot' : 'manifestPath';
|
|
552
|
+
options[key] = value;
|
|
553
|
+
index += 1;
|
|
554
|
+
} else if (argument === '--source-root') {
|
|
555
|
+
const separator = value?.indexOf('=') ?? -1;
|
|
556
|
+
if (separator < 1 || separator === value.length - 1) return 2;
|
|
557
|
+
options.sourceRoots[value.slice(0, separator)] = value.slice(separator + 1);
|
|
558
|
+
index += 1;
|
|
559
|
+
} else if (argument === '--invoked-skill') {
|
|
560
|
+
if (!value) return 2;
|
|
561
|
+
if (!options.invokedSkills) options.invokedSkills = [];
|
|
562
|
+
options.invokedSkills.push(value);
|
|
563
|
+
index += 1;
|
|
564
|
+
} else {
|
|
565
|
+
return 2;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
const result = verifyWorkflowCoherence(options);
|
|
570
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
571
|
+
return result.coherent ? 0 : 1;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
if (isMainModule(import.meta.url)) {
|
|
575
|
+
process.exitCode = runWorkflowCoherenceCli(process.argv.slice(2));
|
|
576
|
+
}
|