@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,280 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
5
|
+
import { emitKeypressEvents } from 'node:readline';
|
|
6
|
+
import { dirname, join, resolve } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
|
|
9
|
+
import { isMainModule } from '../../engineering/engineering-runtime/scripts/main-module.mjs';
|
|
10
|
+
|
|
11
|
+
// The coordinator is one command rendered into two transports: the private checkout and the
|
|
12
|
+
// unpacked @1aboveio/skills package. Both defaults below are anchored on this file's own location,
|
|
13
|
+
// so neither the private repository root nor the process working directory is ever assumed. A
|
|
14
|
+
// caller that lays the payload out differently injects both paths instead (see runCli's flags).
|
|
15
|
+
const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
const DISTRIBUTION_DIR = resolve(SCRIPT_DIR, '..');
|
|
17
|
+
const DEFAULT_RECIPES_PATH = join(DISTRIBUTION_DIR, 'generated', 'recipes.json');
|
|
18
|
+
const DEFAULT_LOCAL_ROOT = resolve(DISTRIBUTION_DIR, '../..');
|
|
19
|
+
const NATIVE_ADD_SOURCE = /^(npx skills@\S+ add )(\S+)(?= )/;
|
|
20
|
+
// Which generated command form to execute, most specific first. The private-checkout render emits the
|
|
21
|
+
// Git transports (`https`/`ssh`); the public-npm render emits a single `local` command because the
|
|
22
|
+
// first-party payload ships inside the package and is never fetched. The enum is not overloaded to
|
|
23
|
+
// carry the channel — a `local` command means a local path source, which is what it is.
|
|
24
|
+
const COMMAND_TRANSPORTS = ['local', 'https'];
|
|
25
|
+
// Groups that exist only as an implementation dependency of the selectable ones. Exported because it
|
|
26
|
+
// is the single source of truth for the rule that spans every public-facing surface: a support group
|
|
27
|
+
// is never presented as something a user picks. The picker, `list`, the plan and the generated
|
|
28
|
+
// package README all derive their answer from here rather than each re-listing the ids.
|
|
29
|
+
export const SUPPORT_GROUPS = new Set(['harness-runtime']);
|
|
30
|
+
const ACTIONS = new Set(['install', 'update']);
|
|
31
|
+
|
|
32
|
+
export const selectorTerminalControl = Object.freeze({
|
|
33
|
+
enter: '\x1b[?1049h\x1b[?25l',
|
|
34
|
+
redraw: '\x1b[2J\x1b[H',
|
|
35
|
+
exit: '\x1b[?25h\x1b[?1049l',
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export function resolveBundleTransport({ recipesPath, localRoot } = {}) {
|
|
39
|
+
return {
|
|
40
|
+
recipesPath: recipesPath ? resolve(recipesPath) : DEFAULT_RECIPES_PATH,
|
|
41
|
+
localRoot: localRoot ? resolve(localRoot) : DEFAULT_LOCAL_ROOT,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function readRecipes(recipesPath) {
|
|
46
|
+
let contents;
|
|
47
|
+
try {
|
|
48
|
+
contents = readFileSync(recipesPath, 'utf8');
|
|
49
|
+
} catch {
|
|
50
|
+
throw new Error(`Bundle recipes not found: ${recipesPath}`);
|
|
51
|
+
}
|
|
52
|
+
return JSON.parse(contents);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function assertLocalRoot(localRoot) {
|
|
56
|
+
if (!statSync(localRoot, { throwIfNoEntry: false })?.isDirectory()) {
|
|
57
|
+
throw new Error(`Bundle local source root is not a directory: ${localRoot}`);
|
|
58
|
+
}
|
|
59
|
+
return localRoot;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function bundleCatalog(transport = {}) {
|
|
63
|
+
return readRecipes(resolveBundleTransport(transport).recipesPath).groups
|
|
64
|
+
.filter((group) => !SUPPORT_GROUPS.has(group.id))
|
|
65
|
+
.map((group) => ({
|
|
66
|
+
id: group.id,
|
|
67
|
+
displayName: group.displayName,
|
|
68
|
+
members: group.install.steps.flatMap((step) => step.members),
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function shellArgument(value) {
|
|
73
|
+
return `'${value.replaceAll("'", String.raw`'\''`)}'`;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Point the recipe's native `add` step at the local first-party payload, whatever source the
|
|
77
|
+
// generated recipe declares. Matching the native step rather than the private repository name is
|
|
78
|
+
// what makes one planning implementation serve both transports: a public recipe that never mentions
|
|
79
|
+
// the private repository relocates the same way, and no reachable path can leave a private fetch in
|
|
80
|
+
// the plan. (This file ships inside the public package, so it must not name that repository either.)
|
|
81
|
+
function localFirstPartyCommand(command, localRoot, groupId) {
|
|
82
|
+
if (!NATIVE_ADD_SOURCE.test(command)) {
|
|
83
|
+
throw new Error(`Bundle ${groupId} source first-party has no native add step to relocate: ${command}`);
|
|
84
|
+
}
|
|
85
|
+
return command.replace(NATIVE_ADD_SOURCE, (_match, prefix) => `${prefix}${shellArgument(localRoot)}`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function planBundleCommands(action, groupIds, { yes = false, ...transport } = {}) {
|
|
89
|
+
if (!ACTIONS.has(action)) throw new Error(`Unsupported bundle action: ${action}`);
|
|
90
|
+
const { recipesPath, localRoot } = resolveBundleTransport(transport);
|
|
91
|
+
const recipes = readRecipes(recipesPath);
|
|
92
|
+
assertLocalRoot(localRoot);
|
|
93
|
+
const groups = new Map(recipes.groups.map((group) => [group.id, group]));
|
|
94
|
+
const commands = [];
|
|
95
|
+
const seen = new Set();
|
|
96
|
+
|
|
97
|
+
for (const groupId of groupIds) {
|
|
98
|
+
const group = groups.get(groupId);
|
|
99
|
+
if (!group || SUPPORT_GROUPS.has(groupId)) throw new Error(`Unknown bundle: ${groupId}`);
|
|
100
|
+
for (const step of group[action].steps) {
|
|
101
|
+
const generated = COMMAND_TRANSPORTS
|
|
102
|
+
.map((transport) => step.commands.find((candidate) => candidate.transport === transport))
|
|
103
|
+
.find(Boolean);
|
|
104
|
+
if (!generated) throw new Error(`Bundle ${groupId} has no supported command for source ${step.sourceId}`);
|
|
105
|
+
let command = step.sourceId === 'first-party'
|
|
106
|
+
? localFirstPartyCommand(generated.command, localRoot, groupId)
|
|
107
|
+
: generated.command;
|
|
108
|
+
if (yes) command += ' --yes';
|
|
109
|
+
if (seen.has(command)) continue;
|
|
110
|
+
seen.add(command);
|
|
111
|
+
commands.push({
|
|
112
|
+
groupId,
|
|
113
|
+
groupName: group.displayName,
|
|
114
|
+
sourceId: step.sourceId,
|
|
115
|
+
command,
|
|
116
|
+
cwd: localRoot,
|
|
117
|
+
failureMessage: step.onFailure.message,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return commands;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function runBundleCommands(commands, {
|
|
125
|
+
execute = (command, cwd) => spawnSync('/bin/bash', ['-lc', command], { cwd, stdio: 'inherit' }),
|
|
126
|
+
stdout = process.stdout,
|
|
127
|
+
stderr = process.stderr,
|
|
128
|
+
} = {}) {
|
|
129
|
+
for (const planned of commands) {
|
|
130
|
+
stdout.write(`\nInstalling ${planned.groupName} (${planned.sourceId})...\n`);
|
|
131
|
+
const result = execute(planned.command, planned.cwd);
|
|
132
|
+
if (result.status !== 0) {
|
|
133
|
+
stderr.write(`${planned.failureMessage}\n`);
|
|
134
|
+
return Number.isInteger(result.status) ? result.status : 1;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return 0;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function usage() {
|
|
141
|
+
return `Usage:
|
|
142
|
+
node skills/distribution/scripts/bundles.mjs list [--recipes <path>]
|
|
143
|
+
node skills/distribution/scripts/bundles.mjs <install|update> [--group <id> ... | --all] [--dry-run] [--yes] [--recipes <path>] [--local-root <path>]
|
|
144
|
+
`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function parseArgs(args) {
|
|
148
|
+
const [action = 'install', ...options] = args;
|
|
149
|
+
const parsed = { action, groupIds: [], all: false, dryRun: false, yes: false };
|
|
150
|
+
for (let index = 0; index < options.length; index += 1) {
|
|
151
|
+
const option = options[index];
|
|
152
|
+
if (option === '--group') {
|
|
153
|
+
const value = options[index + 1];
|
|
154
|
+
if (!value) throw new Error('--group requires a bundle id');
|
|
155
|
+
parsed.groupIds.push(...value.split(',').map((id) => id.trim()).filter(Boolean));
|
|
156
|
+
index += 1;
|
|
157
|
+
} else if (option === '--recipes' || option === '--local-root') {
|
|
158
|
+
const value = options[index + 1];
|
|
159
|
+
if (!value) throw new Error(`${option} requires a path`);
|
|
160
|
+
parsed[option === '--recipes' ? 'recipesPath' : 'localRoot'] = value;
|
|
161
|
+
index += 1;
|
|
162
|
+
} else if (option === '--all') parsed.all = true;
|
|
163
|
+
else if (option === '--dry-run') parsed.dryRun = true;
|
|
164
|
+
else if (option === '--yes') parsed.yes = true;
|
|
165
|
+
else throw new Error(`Unknown option: ${option}`);
|
|
166
|
+
}
|
|
167
|
+
if (parsed.all && parsed.groupIds.length > 0) throw new Error('Use either --all or --group, not both');
|
|
168
|
+
return parsed;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function printCatalog(stdout = process.stdout, catalog = bundleCatalog()) {
|
|
172
|
+
for (const bundle of catalog) {
|
|
173
|
+
stdout.write(`${bundle.displayName} (${bundle.id})\n`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function updateSelection(state, key, itemCount) {
|
|
178
|
+
const selected = new Set(state.selected);
|
|
179
|
+
if (key === 'up') return { cursor: (state.cursor - 1 + itemCount) % itemCount, selected };
|
|
180
|
+
if (key === 'down') return { cursor: (state.cursor + 1) % itemCount, selected };
|
|
181
|
+
if (key === 'space') {
|
|
182
|
+
if (selected.has(state.cursor)) selected.delete(state.cursor);
|
|
183
|
+
else selected.add(state.cursor);
|
|
184
|
+
}
|
|
185
|
+
return { cursor: state.cursor, selected };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export function renderSelector(catalog, state) {
|
|
189
|
+
const rows = catalog.map((bundle, index) => {
|
|
190
|
+
const pointer = index === state.cursor ? '>' : ' ';
|
|
191
|
+
const mark = state.selected.has(index) ? '[x]' : '[ ]';
|
|
192
|
+
const count = bundle.members.length;
|
|
193
|
+
return `${pointer} ${mark} ${bundle.displayName} ${count} skill${count === 1 ? '' : 's'}`;
|
|
194
|
+
});
|
|
195
|
+
const focused = catalog[state.cursor];
|
|
196
|
+
return [
|
|
197
|
+
'Select skill bundles',
|
|
198
|
+
...rows,
|
|
199
|
+
'',
|
|
200
|
+
`Includes: ${focused.members.join(', ')}`,
|
|
201
|
+
'',
|
|
202
|
+
'up/down move space select enter confirm',
|
|
203
|
+
].join('\n');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
async function promptForGroups(catalog, { stdin = process.stdin, stdout = process.stdout } = {}) {
|
|
207
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
208
|
+
throw new Error('Choose bundles with --group <id> or --all when no interactive terminal is available');
|
|
209
|
+
}
|
|
210
|
+
emitKeypressEvents(stdin);
|
|
211
|
+
stdin.setRawMode(true);
|
|
212
|
+
stdin.resume();
|
|
213
|
+
let state = { cursor: 0, selected: new Set() };
|
|
214
|
+
|
|
215
|
+
const draw = () => {
|
|
216
|
+
stdout.write(`${selectorTerminalControl.redraw}${renderSelector(catalog, state)}\n`);
|
|
217
|
+
};
|
|
218
|
+
stdout.write(selectorTerminalControl.enter);
|
|
219
|
+
draw();
|
|
220
|
+
|
|
221
|
+
return new Promise((resolveSelection, rejectSelection) => {
|
|
222
|
+
const finish = (error) => {
|
|
223
|
+
stdin.off('keypress', onKeypress);
|
|
224
|
+
stdin.setRawMode(false);
|
|
225
|
+
stdin.pause();
|
|
226
|
+
stdout.write(selectorTerminalControl.exit);
|
|
227
|
+
if (error) rejectSelection(error);
|
|
228
|
+
else resolveSelection([...state.selected]
|
|
229
|
+
.sort((left, right) => left - right)
|
|
230
|
+
.map((index) => catalog[index].id));
|
|
231
|
+
};
|
|
232
|
+
const onKeypress = (_input, key = {}) => {
|
|
233
|
+
if (key.ctrl && key.name === 'c') return finish(new Error('Bundle selection cancelled'));
|
|
234
|
+
if (key.name === 'return' || key.name === 'enter') return finish();
|
|
235
|
+
const name = key.name === 'space' ? 'space' : key.name;
|
|
236
|
+
if (!['up', 'down', 'space'].includes(name)) return undefined;
|
|
237
|
+
state = updateSelection(state, name, catalog.length);
|
|
238
|
+
draw();
|
|
239
|
+
return undefined;
|
|
240
|
+
};
|
|
241
|
+
stdin.on('keypress', onKeypress);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export async function runCli(args) {
|
|
246
|
+
try {
|
|
247
|
+
const parsed = parseArgs(args);
|
|
248
|
+
const transport = { recipesPath: parsed.recipesPath, localRoot: parsed.localRoot };
|
|
249
|
+
if (parsed.action === 'list') {
|
|
250
|
+
printCatalog(process.stdout, bundleCatalog(transport));
|
|
251
|
+
return 0;
|
|
252
|
+
}
|
|
253
|
+
if (!ACTIONS.has(parsed.action)) {
|
|
254
|
+
process.stderr.write(usage());
|
|
255
|
+
return 2;
|
|
256
|
+
}
|
|
257
|
+
const catalog = bundleCatalog(transport);
|
|
258
|
+
const groupIds = parsed.all
|
|
259
|
+
? catalog.map((bundle) => bundle.id)
|
|
260
|
+
: parsed.groupIds.length > 0
|
|
261
|
+
? parsed.groupIds
|
|
262
|
+
: await promptForGroups(catalog);
|
|
263
|
+
if (groupIds.length === 0) throw new Error('Select at least one bundle');
|
|
264
|
+
const commands = planBundleCommands(parsed.action, groupIds, { ...transport, yes: parsed.yes });
|
|
265
|
+
if (parsed.dryRun) {
|
|
266
|
+
for (const planned of commands) {
|
|
267
|
+
process.stdout.write(`\n${planned.groupName} / ${planned.sourceId}\n${planned.command}\n`);
|
|
268
|
+
}
|
|
269
|
+
return 0;
|
|
270
|
+
}
|
|
271
|
+
return runBundleCommands(commands);
|
|
272
|
+
} catch (error) {
|
|
273
|
+
process.stderr.write(`${error.message}\n`);
|
|
274
|
+
return 2;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (isMainModule(import.meta.url)) {
|
|
279
|
+
process.exitCode = await runCli(process.argv.slice(2));
|
|
280
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// The one ESM main-module guard every skill script in this repo uses.
|
|
2
|
+
//
|
|
3
|
+
// Not a style preference — the hand-written versions of this three-line check had two opposite
|
|
4
|
+
// silent failure modes in production, and both shipped:
|
|
5
|
+
//
|
|
6
|
+
// #718 `import.meta.url === pathToFileURL(process.argv[1]).href`
|
|
7
|
+
// Node resolves `import.meta.url` to the REAL path; `argv[1]` keeps whatever the caller
|
|
8
|
+
// typed. A skills install is a symlink farm (`~/.claude/skills/<skill>` → the checkout),
|
|
9
|
+
// so through the install path the two never match: the CLI does not run and node exits 0.
|
|
10
|
+
// `coverage-ledger.mjs` shipped this and recorded a false pass in the wild
|
|
11
|
+
// (a consumer product repo: epic #352, unit #379, PR #384) on a gate whose only job is to
|
|
12
|
+
// say no. Fails OPEN, invisibly — "passed" and "never ran" are byte-identical evidence.
|
|
13
|
+
//
|
|
14
|
+
// #446 `fs.realpathSync(process.argv[1]) === …`, unguarded.
|
|
15
|
+
// `node -` sets `argv[1]` to the literal string `"-"` — truthy, so the usual
|
|
16
|
+
// `process.argv[1] &&` prefix does not save it — and realpath throws ENOENT at MODULE
|
|
17
|
+
// LOAD, before a line of the module's own code runs. The module cannot be imported by
|
|
18
|
+
// anything that does not launch it as a file. Fails CLOSED, at load.
|
|
19
|
+
//
|
|
20
|
+
// So the contract has exactly two obligations, one per failure mode:
|
|
21
|
+
// 1. realpath BOTH sides before comparing, so a symlinked invocation is still the main module;
|
|
22
|
+
// 2. degrade to `false` — "not the main module" — for anything that does not resolve, never throw.
|
|
23
|
+
//
|
|
24
|
+
// WHY IT IS SHARED RATHER THAN COPIED. PR #278 fixed twelve copies of failure mode #718 by hand and
|
|
25
|
+
// mechanized nothing. Five weeks later `mergify/scripts/audit.mjs` was written with the pre-#278
|
|
26
|
+
// form, and `coverage-ledger.mjs` survived the whole pass because it spelled the same bug a third
|
|
27
|
+
// way that #278's grep did not match. One module plus `main-guard-hygiene.test.mjs` is what stops
|
|
28
|
+
// the next copy: there is now no second place for this logic to drift to, and adding one fails CI.
|
|
29
|
+
//
|
|
30
|
+
// WHERE IT LIVES, AND WHY HERE. Native Skills CLI installation flattens selected packages into
|
|
31
|
+
// sibling directories under `~/.agents/skills`, while this repository nests them under
|
|
32
|
+
// `skills/engineering`. A Workflow consumer at `<skill>/scripts` therefore imports
|
|
33
|
+
// `../../engineering-runtime/scripts/main-module.mjs`: the same specifier reaches this package in
|
|
34
|
+
// both layouts. Claude Code launches through a per-skill symlink into the canonical store; node's
|
|
35
|
+
// realpath-aware module resolution and this predicate preserve that path as well.
|
|
36
|
+
//
|
|
37
|
+
// `engineering-runtime` owns the helper as an installable support package rather than a user
|
|
38
|
+
// capability. `resolve-issues/scripts/sandbox-selftest.mjs` reconstructs the same sibling layout and
|
|
39
|
+
// links this package beside the skill under test. Every consumer imports this package directly.
|
|
40
|
+
import fs from 'node:fs';
|
|
41
|
+
import { fileURLToPath } from 'node:url';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Is the module identified by `importMetaUrl` the script node was launched with?
|
|
45
|
+
*
|
|
46
|
+
* Symlink-transparent, and total: any input that does not resolve to a real file answers `false`
|
|
47
|
+
* instead of throwing, so importing a CLI module is always safe.
|
|
48
|
+
*
|
|
49
|
+
* @param {string} importMetaUrl the caller's own `import.meta.url`
|
|
50
|
+
* @returns {boolean}
|
|
51
|
+
*/
|
|
52
|
+
export function isMainModule(importMetaUrl) {
|
|
53
|
+
const entry = process.argv[1];
|
|
54
|
+
if (typeof entry !== 'string' || entry === '') return false; // imported, or an embedding harness
|
|
55
|
+
|
|
56
|
+
let entryPath;
|
|
57
|
+
try {
|
|
58
|
+
entryPath = fs.realpathSync(entry);
|
|
59
|
+
} catch {
|
|
60
|
+
return false; // #446: `node -` gives "-"; some harnesses give a path that is not on disk
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let selfPath;
|
|
64
|
+
try {
|
|
65
|
+
selfPath = fileURLToPath(importMetaUrl);
|
|
66
|
+
} catch {
|
|
67
|
+
return false; // a data:/http: module has no path to compare, so it is never the launched script
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
// #718: the launched side is resolved above, so this side must be too. Under Node's default
|
|
71
|
+
// resolution `import.meta.url` is already real and this is a no-op; under `--preserve-symlinks`
|
|
72
|
+
// it is the half that makes the comparison hold.
|
|
73
|
+
selfPath = fs.realpathSync(selfPath);
|
|
74
|
+
} catch {
|
|
75
|
+
// The module is executing, so it existed a moment ago. Compare what we have rather than
|
|
76
|
+
// claiming "not main" — a vanished file should not silently disable a running CLI.
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return entryPath === selfPath;
|
|
80
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: airflow-dag-develop
|
|
3
|
+
description: Airflow DAG architecture and conventions. Read when designing, creating, or debugging DAGs — covers CLI validation, environment-based scheduling, and pytest integrity tests.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Airflow DAG Development Patterns
|
|
8
|
+
|
|
9
|
+
## 1. Quick DAG Validation with Airflow CLI
|
|
10
|
+
|
|
11
|
+
Use these commands for fast feedback during development:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# List import errors (fastest check - catches syntax and import issues)
|
|
15
|
+
airflow dags list-import-errors
|
|
16
|
+
|
|
17
|
+
# Full lint check (comprehensive - catches best practice violations)
|
|
18
|
+
airflow dags lint
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**When to use:**
|
|
22
|
+
- `list-import-errors`: During active development for quick syntax/import validation
|
|
23
|
+
- `lint`: Before commits to catch style and best practice issues
|
|
24
|
+
|
|
25
|
+
## 2. Environment-Based Schedule Override
|
|
26
|
+
|
|
27
|
+
Disable schedules in local development to prevent accidental runs:
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
import os
|
|
31
|
+
from datetime import datetime
|
|
32
|
+
from airflow import DAG
|
|
33
|
+
|
|
34
|
+
def get_schedule(production_schedule: str) -> str | None:
|
|
35
|
+
"""Return None for local dev, actual schedule for deployed environments.
|
|
36
|
+
|
|
37
|
+
Set AIRFLOW_ENV=local in .env for local development.
|
|
38
|
+
Cloud Run deployments set AIRFLOW_ENV=dev|staging|prod.
|
|
39
|
+
"""
|
|
40
|
+
env = os.getenv("AIRFLOW_ENV", "local")
|
|
41
|
+
if env == "local":
|
|
42
|
+
return None
|
|
43
|
+
return production_schedule
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Usage in DAG:**
|
|
47
|
+
```python
|
|
48
|
+
with DAG(
|
|
49
|
+
dag_id="my_dag",
|
|
50
|
+
schedule=get_schedule("0 4 * * *"), # Daily 4 AM in prod, None locally
|
|
51
|
+
start_date=datetime(2024, 1, 1),
|
|
52
|
+
catchup=False,
|
|
53
|
+
) as dag:
|
|
54
|
+
...
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Environment setup:**
|
|
58
|
+
- **Local:** Add `AIRFLOW_ENV=local` to `.env`
|
|
59
|
+
- **Cloud Run:** Set via cloudbuild.yaml substitutions (`_AIRFLOW_ENV: dev|staging|prod`)
|
|
60
|
+
|
|
61
|
+
## 3. Pytest DAG Integrity Tests
|
|
62
|
+
|
|
63
|
+
Standard pytest patterns for validating DAG quality:
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
# tests/test_dag_integrity.py
|
|
67
|
+
import pytest
|
|
68
|
+
from airflow.models import DagBag
|
|
69
|
+
|
|
70
|
+
@pytest.fixture(scope="session")
|
|
71
|
+
def dagbag():
|
|
72
|
+
return DagBag(dag_folder="dags/", include_examples=False)
|
|
73
|
+
|
|
74
|
+
def test_no_import_errors(dagbag):
|
|
75
|
+
"""Verify all DAGs load without import errors."""
|
|
76
|
+
assert not dagbag.import_errors, f"DAG import errors: {dagbag.import_errors}"
|
|
77
|
+
|
|
78
|
+
def test_dags_have_tags(dagbag):
|
|
79
|
+
"""Verify all DAGs have at least one tag for organization."""
|
|
80
|
+
for dag_id, dag in dagbag.dags.items():
|
|
81
|
+
assert dag.tags, f"DAG {dag_id} has no tags"
|
|
82
|
+
|
|
83
|
+
def test_dags_have_owner(dagbag):
|
|
84
|
+
"""Verify all DAGs have an owner in default_args."""
|
|
85
|
+
for dag_id, dag in dagbag.dags.items():
|
|
86
|
+
assert dag.default_args.get("owner"), f"DAG {dag_id} missing owner"
|
|
87
|
+
|
|
88
|
+
def test_no_cycles(dagbag):
|
|
89
|
+
"""Verify DAGs don't have circular dependencies."""
|
|
90
|
+
for dag_id, dag in dagbag.dags.items():
|
|
91
|
+
# DagBag already validates this, but explicit test for clarity
|
|
92
|
+
assert dag.topo_sort(), f"DAG {dag_id} has cycles"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Run tests:**
|
|
96
|
+
```bash
|
|
97
|
+
# Run all DAG tests
|
|
98
|
+
pytest tests/test_dag_integrity.py -v
|
|
99
|
+
|
|
100
|
+
# Run specific test
|
|
101
|
+
pytest tests/test_dag_integrity.py::test_no_import_errors -v
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Quick Reference
|
|
105
|
+
|
|
106
|
+
| Task | Command |
|
|
107
|
+
|------|---------|
|
|
108
|
+
| Check import errors | `airflow dags list-import-errors` |
|
|
109
|
+
| Lint DAGs | `airflow dags lint` |
|
|
110
|
+
| Run integrity tests | `pytest tests/test_dag_integrity.py -v` |
|
|
111
|
+
| Trigger manual run | `airflow dags trigger <dag_id>` |
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: app-debug
|
|
3
|
+
description: "Diagnose runtime failures in deployed Cloud Run services — 5xx/422 errors, tracebacks, Next.js SSR/hydration or Server Action failures, DB/Secret Manager connection errors, cold-start timeouts, container OOM. NOT for build or deploy failures (cloud-debug)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# App Debug
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Step 1: Gather Context
|
|
11
|
+
|
|
12
|
+
Collect before touching logs:
|
|
13
|
+
|
|
14
|
+
- **Service name** — which service? (`a1-engine`, `a1-portal`, `a1-admin`, `a1-engine-query`, `a1-forex`)
|
|
15
|
+
- **Environment** — `dev` or `prod`
|
|
16
|
+
- **Error description** — what is the symptom? (HTTP status, error message, UI behavior)
|
|
17
|
+
- **Timestamp** — when did it start? (approximate is fine)
|
|
18
|
+
- **Recent deploy?** — did a new revision go out recently?
|
|
19
|
+
|
|
20
|
+
Full service names follow the pattern: `{service}-{env}` (e.g. `a1-engine-dev`, `a1-portal-prod`).
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Step 2: Fetch Log Tail
|
|
25
|
+
|
|
26
|
+
**Always start with errors only.** Broaden only if errors return nothing useful.
|
|
27
|
+
|
|
28
|
+
### Errors-only (start here)
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
gcloud logging read \
|
|
32
|
+
'resource.type="cloud_run_revision" AND resource.labels.service_name="a1-engine-dev" AND severity>=ERROR' \
|
|
33
|
+
--project cosmic-heaven-479306-v5 \
|
|
34
|
+
--limit 20 \
|
|
35
|
+
--format="value(timestamp,textPayload)"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Replace `a1-engine-dev` with the target service name.
|
|
39
|
+
|
|
40
|
+
### Broader log tail (if errors-only is empty)
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
gcloud run services logs read a1-engine-dev \
|
|
44
|
+
--region us-central1 \
|
|
45
|
+
--project cosmic-heaven-479306-v5 \
|
|
46
|
+
--limit 50
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Check current revision and env vars
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
gcloud run services describe a1-engine-dev \
|
|
53
|
+
--region us-central1 \
|
|
54
|
+
--project cosmic-heaven-479306-v5 \
|
|
55
|
+
--format="yaml(spec.template.spec.containers[0].env, spec.template.spec.containers[0].resources, status.latestReadyRevisionName)"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Check secret versions (if secret errors suspected)
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
gcloud secrets versions list database-url-a1-dev \
|
|
62
|
+
--project cosmic-heaven-479306-v5
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Step 3: Classify the Error
|
|
68
|
+
|
|
69
|
+
Map what you found in logs to one error class:
|
|
70
|
+
|
|
71
|
+
- **App Error** — Python traceback, unhandled exception, 500 from FastAPI, Next.js render crash
|
|
72
|
+
- **DB Error** — connection refused, auth failure, Tortoise config error, Cloud SQL proxy issue
|
|
73
|
+
- **Secret Error** — permission denied on Secret Manager, secret not found, wrong version
|
|
74
|
+
- **Config Error** — missing env var, wrong PORT, wrong Cloud SQL instance name, bad DB URL format
|
|
75
|
+
- **Resource Error** — OOM kill, DEADLINE_EXCEEDED, cold start timeout, container exit code 137
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Step 4: Form Hypotheses
|
|
80
|
+
|
|
81
|
+
Read `references/common-errors.md` now. Match the log output against the known patterns to confirm your hypothesis before proceeding.
|
|
82
|
+
|
|
83
|
+
Then pick the top 3 causes ranked by probability based on what the logs actually show. Example:
|
|
84
|
+
|
|
85
|
+
1. **(Most likely)** Wrong secret version for `database-url-a1-dev` — password mismatch after DB rotation
|
|
86
|
+
2. Cloud SQL proxy not receiving connections — `CLOUD_SQL_INSTANCE` env var missing or wrong format
|
|
87
|
+
3. Cold start OOM — memory limit too low, service hitting 256Mi default under load
|
|
88
|
+
|
|
89
|
+
Do not list more than 3.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Step 5: Targeted Fix
|
|
94
|
+
|
|
95
|
+
For each hypothesis, apply the verify + resolve steps from `references/common-errors.md`.
|
|
96
|
+
|
|
97
|
+
If the error class is **App Error** (Python traceback, Next.js render crash, unhandled exception):
|
|
98
|
+
- Check the first line of the traceback — unhandled import errors appear here at startup
|
|
99
|
+
- Look for `ConfigurationError` or `OperationalError` near the top — indicates Tortoise/DB init failure during lifespan startup
|
|
100
|
+
- If traceback points to a specific route handler file — it's a runtime exception, not a startup issue
|
|
101
|
+
- Route to Cory (backend tracebacks) or Suzzy (Next.js/frontend) with the exact traceback and file location
|
|
102
|
+
|
|
103
|
+
For all other error classes (DB, Secret, Config, Resource): follow the matching pattern in `references/common-errors.md` for the exact `gcloud` commands to verify and resolve.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Reference
|
|
108
|
+
|
|
109
|
+
`references/common-errors.md` — full catalogue of known error patterns, symptoms, causes, and fix commands for this stack. Read it in Step 4; refer back in Step 5.
|