@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,392 @@
|
|
|
1
|
+
// discover-models — canonical harness-runtime model availability discovery.
|
|
2
|
+
// It unions explicit current-turn and human-named runnable ids with configured or
|
|
3
|
+
// credentialed evidence without overstating the completeness of static config.
|
|
4
|
+
// The discovered id set fed to `model-catalog.mjs tiers --seen` stops being produced
|
|
5
|
+
// by an agent reading prose (which drifts into proposing models that don't exist,
|
|
6
|
+
// or expanding a built-in registry into training-data noise).
|
|
7
|
+
//
|
|
8
|
+
// Why a script and not prose: pre-flight step 1 forbids proposing any model that
|
|
9
|
+
// didn't appear in a discovery source. Described as prose, "discover the available
|
|
10
|
+
// models" degrades to the agent listing plausible names from memory — the exact
|
|
11
|
+
// failure the no-silent-fallback guard exists to catch (a confirmed-but-unrunnable
|
|
12
|
+
// model resurfaces mid-run). Mechanized, discovery is a deterministic read of the
|
|
13
|
+
// user's real config plus explicit active-turn evidence, and the never-a-source
|
|
14
|
+
// rule is enforced by construction: no known-model registry is an input.
|
|
15
|
+
//
|
|
16
|
+
// node bin/discover-models.mjs --harness pi
|
|
17
|
+
// node bin/discover-models.mjs --harness codex --available gpt-a,gpt-b
|
|
18
|
+
// node bin/discover-models.mjs --harness claude-code --available opus,sonnet
|
|
19
|
+
// node discover-models.mjs # auto-detect the sole present harness
|
|
20
|
+
// node discover-models.mjs --help # usage + exit 0
|
|
21
|
+
//
|
|
22
|
+
// OUTPUT (stdout, always JSON):
|
|
23
|
+
// { harness, completeness, discovered: [{ id, source }], notes: [<string>...] }
|
|
24
|
+
// Feed the ids to `model-catalog.mjs tiers --seen <id,id,...> --harness <h>`.
|
|
25
|
+
//
|
|
26
|
+
// EXIT CODES:
|
|
27
|
+
// 0 discovery ran (JSON emitted) — including an empty set with an explanatory
|
|
28
|
+
// note (missing config, or an honest-partial harness). Empty-but-honest is a
|
|
29
|
+
// correct outcome, not a failure.
|
|
30
|
+
// 2 usage error: unknown flag, unknown --harness value, or no --harness given
|
|
31
|
+
// and the present harness could not be disambiguated.
|
|
32
|
+
//
|
|
33
|
+
// HARNESS COMPLETENESS (honesty over false coverage):
|
|
34
|
+
// - pi — FULL from credential-aware ~/.pi/agent/{settings,models,auth}.json.
|
|
35
|
+
// - codex — PARTIAL from config.toml defaults; FULL with current-turn spawn ids.
|
|
36
|
+
// - claude-code — PARTIAL from settings.json; FULL with current-turn Agent ids.
|
|
37
|
+
// Neither Codex nor Claude Code reads model-catalog.json for availability. The
|
|
38
|
+
// catalog is a cache of classification confirmations, never a runnable inventory.
|
|
39
|
+
//
|
|
40
|
+
// THE NEVER-A-SOURCE RULE, encoded as behavior: this script never shells out to a
|
|
41
|
+
// model registry / `pi --models` expansion / a models-API dump, and never reads a
|
|
42
|
+
// harness's full known-model catalog. A model the config "knows a definition for"
|
|
43
|
+
// but that the user has neither enabled nor holds resolving credentials for is NOT
|
|
44
|
+
// emitted — see the credential gate in discoverPi and its test.
|
|
45
|
+
|
|
46
|
+
import fs from 'node:fs'
|
|
47
|
+
import path from 'node:path'
|
|
48
|
+
|
|
49
|
+
const HARNESSES = ['pi', 'codex', 'claude-code']
|
|
50
|
+
|
|
51
|
+
// Resolve HOME from the environment first so a test can point discovery at a
|
|
52
|
+
// fixture tree via `HOME=<tmp>` — os.homedir() honors $HOME on POSIX, but reading
|
|
53
|
+
// it explicitly makes the test contract obvious and the injection unambiguous.
|
|
54
|
+
function homeDir(env) {
|
|
55
|
+
return env.HOME || env.USERPROFILE || ''
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Read + JSON.parse a file, returning null when it is missing and throwing only on
|
|
59
|
+
// a genuinely malformed file (a corrupt config should be loud, not silently empty).
|
|
60
|
+
function readJson(file) {
|
|
61
|
+
if (!fs.existsSync(file)) return null
|
|
62
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function readText(file) {
|
|
66
|
+
if (!fs.existsSync(file)) return null
|
|
67
|
+
return fs.readFileSync(file, 'utf8')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function validIds(ids) {
|
|
71
|
+
return Array.isArray(ids) ? ids.filter((id) => typeof id === 'string' && id.length > 0) : []
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function composeEvidence(configured, { spawnModelIds = [], humanNamedModelIds = [] } = {}) {
|
|
75
|
+
const discovered = []
|
|
76
|
+
const seen = new Set()
|
|
77
|
+
const emit = (id, source) => {
|
|
78
|
+
if (seen.has(id)) return
|
|
79
|
+
seen.add(id)
|
|
80
|
+
discovered.push({ id, source })
|
|
81
|
+
}
|
|
82
|
+
for (const id of validIds(spawnModelIds)) emit(id, 'current-turn')
|
|
83
|
+
for (const id of validIds(humanNamedModelIds)) emit(id, 'human-named')
|
|
84
|
+
for (const model of configured) emit(model.id, model.source)
|
|
85
|
+
return discovered
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// ---- pure, unit-testable cores (no filesystem; env passed in) ----
|
|
89
|
+
|
|
90
|
+
// Does a provider's apiKey field resolve to a usable credential?
|
|
91
|
+
// - a literal non-empty string → resolves (how: "literal apiKey")
|
|
92
|
+
// - "$VAR" → resolves iff env[VAR] is non-empty
|
|
93
|
+
// - missing/empty → does not resolve
|
|
94
|
+
// This is the credential gate that makes the never-a-source rule real: a custom
|
|
95
|
+
// model whose provider key does not resolve is a definition the config knows but
|
|
96
|
+
// the user cannot run, so it is never emitted.
|
|
97
|
+
export function apiKeyResolves(apiKey, env) {
|
|
98
|
+
if (!apiKey || typeof apiKey !== 'string') return { resolved: false, how: 'no apiKey' }
|
|
99
|
+
if (apiKey.startsWith('$')) {
|
|
100
|
+
const varName = apiKey.slice(1)
|
|
101
|
+
const val = env[varName]
|
|
102
|
+
return { resolved: !!val, how: `${varName} ${val ? 'set' : 'unset'}` }
|
|
103
|
+
}
|
|
104
|
+
return { resolved: true, how: 'literal apiKey' }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Pi discovery from already-parsed config objects. Sources, in emission order:
|
|
108
|
+
// 1. settings.json enabledModels[] (the curated picker set)
|
|
109
|
+
// 2. settings.json default{Provider,Model} (the active default, if not already listed)
|
|
110
|
+
// 3. models.json custom models[] whose provider apiKey resolves (credentialed remainder)
|
|
111
|
+
// 4. credentialed providers with NO enabledModels entry and no per-model detail,
|
|
112
|
+
// listed at PROVIDER level only (`provider/*`) — you name a model to use it.
|
|
113
|
+
// Dedupe by id (first source wins). Uncredentialed custom models and the built-in
|
|
114
|
+
// registry are never emitted.
|
|
115
|
+
export function discoverPi({ settings, models, auth, env }) {
|
|
116
|
+
const discovered = []
|
|
117
|
+
const notes = []
|
|
118
|
+
const seen = new Set()
|
|
119
|
+
const emit = (id, source) => {
|
|
120
|
+
if (seen.has(id)) return
|
|
121
|
+
seen.add(id)
|
|
122
|
+
discovered.push({ id, source })
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (!settings && !models) {
|
|
126
|
+
notes.push('~/.pi/agent/settings.json and models.json not found — nothing to discover for pi')
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const enabled = Array.isArray(settings?.enabledModels) ? settings.enabledModels : []
|
|
130
|
+
for (const id of enabled) {
|
|
131
|
+
if (typeof id === 'string' && id.length) emit(id, 'settings.json:enabledModels')
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The active default is a runnable model even if it were somehow absent from
|
|
135
|
+
// enabledModels; emit it (deduped) so the default can never be dropped.
|
|
136
|
+
if (settings?.defaultProvider && settings?.defaultModel) {
|
|
137
|
+
emit(`${settings.defaultProvider}/${settings.defaultModel}`, 'settings.json:default')
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// The credentialed-but-uncurated remainder from models.json + auth.json.
|
|
141
|
+
const providers = (models && typeof models.providers === 'object' && models.providers) || {}
|
|
142
|
+
const authMap = (auth && typeof auth === 'object' && auth) || {}
|
|
143
|
+
const providerNames = new Set([...Object.keys(providers), ...Object.keys(authMap)])
|
|
144
|
+
|
|
145
|
+
for (const provider of providerNames) {
|
|
146
|
+
const cfg = providers[provider] || {}
|
|
147
|
+
const key = apiKeyResolves(cfg.apiKey, env)
|
|
148
|
+
const authCredentialed = !!authMap[provider]
|
|
149
|
+
const credentialed = key.resolved || authCredentialed
|
|
150
|
+
if (!credentialed) continue // credential gate: never emit an unrunnable definition
|
|
151
|
+
|
|
152
|
+
const credHow = key.resolved ? key.how : 'auth.json entry'
|
|
153
|
+
const custom = Array.isArray(cfg.models) ? cfg.models : []
|
|
154
|
+
const hasEnabledEntry = enabled.some((e) => typeof e === 'string' && e.split('/')[0] === provider)
|
|
155
|
+
|
|
156
|
+
if (custom.length) {
|
|
157
|
+
// Per-model detail available: emit each custom model (deduped against enabled).
|
|
158
|
+
for (const m of custom) {
|
|
159
|
+
if (m && typeof m.id === 'string' && m.id.length) {
|
|
160
|
+
emit(`${provider}/${m.id}`, `models.json:custom (${credHow})`)
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
} else if (!hasEnabledEntry) {
|
|
164
|
+
// Credentialed provider with no curated entry and no per-model detail: you can
|
|
165
|
+
// run it, but only by naming a model. List at PROVIDER level only — NEVER
|
|
166
|
+
// expand the provider's registry.
|
|
167
|
+
emit(`${provider}/*`, `credentialed provider, no enabledModels entry (${credHow})`)
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
notes.push(
|
|
172
|
+
'Pi\'s built-in model registry / `pi --models` expansion is never a discovery source — ' +
|
|
173
|
+
'only enabledModels, the default, credentialed models.json custom entries, and credentialed ' +
|
|
174
|
+
'providers are read. A model the config defines but the user has not enabled or credentialed is omitted.',
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
return { discovered, notes }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Codex discovery unions current-turn spawn ids with the `model = "..."` defaults
|
|
181
|
+
// in config.toml. Config alone is partial: it does not enumerate every model the
|
|
182
|
+
// current runtime can launch. Human-named runnable ids are evidence but likewise
|
|
183
|
+
// cannot prove that the resulting set is complete.
|
|
184
|
+
export function discoverCodex({ configText, spawnModelIds = [], humanNamedModelIds = [] }) {
|
|
185
|
+
const discovered = []
|
|
186
|
+
const notes = []
|
|
187
|
+
const seen = new Set()
|
|
188
|
+
|
|
189
|
+
if (configText == null) {
|
|
190
|
+
notes.push('~/.codex/config.toml not found — no configured Codex defaults to add')
|
|
191
|
+
if (spawnModelIds.length === 0) {
|
|
192
|
+
notes.push('Codex discovery is partial without current-turn spawn model ids or runtime enumeration.')
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
discovered: composeEvidence(discovered, { spawnModelIds, humanNamedModelIds }),
|
|
196
|
+
notes,
|
|
197
|
+
completeness: spawnModelIds.length > 0 ? 'full' : 'partial',
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
let table = ''
|
|
202
|
+
for (const rawLine of configText.split('\n')) {
|
|
203
|
+
const line = rawLine.replace(/#.*$/, '') // strip trailing comments
|
|
204
|
+
const header = /^\s*\[([^\]]+)\]/.exec(line)
|
|
205
|
+
if (header) {
|
|
206
|
+
table = header[1]
|
|
207
|
+
continue
|
|
208
|
+
}
|
|
209
|
+
// Match the `model` key exactly — `model_reasoning_effort`, `model_context_window`
|
|
210
|
+
// etc. have an underscore before `=` and are excluded by the `\s*=`.
|
|
211
|
+
const m = /^\s*model\s*=\s*["']([^"']+)["']/.exec(line)
|
|
212
|
+
if (m) {
|
|
213
|
+
const id = m[1]
|
|
214
|
+
if (!seen.has(id)) {
|
|
215
|
+
seen.add(id)
|
|
216
|
+
discovered.push({ id, source: table ? `config.toml:[${table}]` : 'config.toml:model' })
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (discovered.length === 0) {
|
|
222
|
+
notes.push('~/.codex/config.toml has no `model = "..."` key — no configured Codex defaults to add')
|
|
223
|
+
}
|
|
224
|
+
if (spawnModelIds.length === 0) {
|
|
225
|
+
notes.push('Codex discovery is partial without current-turn spawn model ids or runtime enumeration.')
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
discovered: composeEvidence(discovered, { spawnModelIds, humanNamedModelIds }),
|
|
229
|
+
notes,
|
|
230
|
+
completeness: spawnModelIds.length > 0 ? 'full' : 'partial',
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Claude Code discovery — HONEST-PARTIAL. settings.json carries no enumerable
|
|
235
|
+
// model list; the runnable set is the harness's built-in Agent-tool model enum,
|
|
236
|
+
// which is not a file a script can read. Emit the settings `model` field only if
|
|
237
|
+
// one is somehow present, and always record the honest note.
|
|
238
|
+
export function discoverClaudeCode({ settings }) {
|
|
239
|
+
const discovered = []
|
|
240
|
+
const notes = []
|
|
241
|
+
|
|
242
|
+
if (settings && typeof settings.model === 'string' && settings.model.length) {
|
|
243
|
+
discovered.push({ id: settings.model, source: 'settings.json:model' })
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
notes.push(
|
|
247
|
+
'Claude Code\'s runnable model set is the harness\'s built-in Agent-tool model enum, which is ' +
|
|
248
|
+
'not a file this script can read — discovery for this harness stays manual: enumerate the Agent ' +
|
|
249
|
+
'tool\'s model options in-session. ~/.claude/model-catalog.json is the banked catalog (a cache of ' +
|
|
250
|
+
'confirmations), never an availability source, so it is deliberately not read here.',
|
|
251
|
+
)
|
|
252
|
+
return { discovered, notes }
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ---- filesystem layer (reads real config under home; calls the pure cores) ----
|
|
256
|
+
|
|
257
|
+
export function discover(harness, env, options = {}) {
|
|
258
|
+
const home = homeDir(env)
|
|
259
|
+
if (harness === 'pi') {
|
|
260
|
+
const settings = readJson(path.join(home, '.pi', 'agent', 'settings.json'))
|
|
261
|
+
const models = readJson(path.join(home, '.pi', 'agent', 'models.json'))
|
|
262
|
+
const auth = readJson(path.join(home, '.pi', 'agent', 'auth.json'))
|
|
263
|
+
const configured = discoverPi({ settings, models, auth, env })
|
|
264
|
+
return {
|
|
265
|
+
harness,
|
|
266
|
+
completeness: 'full',
|
|
267
|
+
discovered: composeEvidence(configured.discovered, options),
|
|
268
|
+
notes: configured.notes,
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (harness === 'codex') {
|
|
272
|
+
const configText = readText(path.join(home, '.codex', 'config.toml'))
|
|
273
|
+
const result = discoverCodex({ configText, ...options })
|
|
274
|
+
return { harness, ...result }
|
|
275
|
+
}
|
|
276
|
+
if (harness === 'claude-code') {
|
|
277
|
+
const settings = readJson(path.join(home, '.claude', 'settings.json'))
|
|
278
|
+
const configured = discoverClaudeCode({ settings })
|
|
279
|
+
const spawnModelIds = validIds(options.spawnModelIds)
|
|
280
|
+
return {
|
|
281
|
+
harness,
|
|
282
|
+
completeness: spawnModelIds.length > 0 ? 'full' : 'partial',
|
|
283
|
+
discovered: composeEvidence(configured.discovered, options),
|
|
284
|
+
notes: configured.notes,
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
throw new Error(`unknown harness "${harness}"`)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Auto-detect the harness from which config files exist under home. Returns the
|
|
291
|
+
// sole present harness, or null when zero or more than one are present (the caller
|
|
292
|
+
// then requires an explicit --harness rather than guessing).
|
|
293
|
+
export function detectHarness(env) {
|
|
294
|
+
const home = homeDir(env)
|
|
295
|
+
const present = []
|
|
296
|
+
if (fs.existsSync(path.join(home, '.pi', 'agent', 'settings.json')) ||
|
|
297
|
+
fs.existsSync(path.join(home, '.pi', 'agent', 'models.json'))) present.push('pi')
|
|
298
|
+
if (fs.existsSync(path.join(home, '.codex', 'config.toml'))) present.push('codex')
|
|
299
|
+
if (fs.existsSync(path.join(home, '.claude', 'settings.json'))) present.push('claude-code')
|
|
300
|
+
return present.length === 1 ? present[0] : null
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// ---- CLI ----
|
|
304
|
+
|
|
305
|
+
const USAGE = `discover-models — enumerate runnable model evidence without overstating completeness.
|
|
306
|
+
Usage:
|
|
307
|
+
discover-models --harness <pi|codex|claude-code> [--available <ids>] [--human-named <ids>]
|
|
308
|
+
discover-models (auto-detect when exactly one harness config is present)
|
|
309
|
+
Options:
|
|
310
|
+
--harness <h> which harness to read: pi | codex | claude-code
|
|
311
|
+
--available <ids> comma-separated ids advertised by the current-turn spawn primitive
|
|
312
|
+
(alias: --spawn-model-ids)
|
|
313
|
+
--human-named <ids> comma-separated ids a human explicitly identified as runnable
|
|
314
|
+
--help, -h show this help and exit 0
|
|
315
|
+
Output: JSON on stdout — { harness, completeness, discovered: [{id, source}], notes }.
|
|
316
|
+
Feed the ids to \`model-catalog.mjs tiers --seen <id,id,...> --harness <h>\`.
|
|
317
|
+
Exit codes: 0 = discovery ran (JSON emitted, possibly an empty set with a note),
|
|
318
|
+
2 = usage error (unknown flag, unknown --harness, or ambiguous auto-detect).
|
|
319
|
+
Mechanization: Pi's credential-aware config is full. Codex and Claude Code config is partial;
|
|
320
|
+
current-turn advertised ids make their discovery full. Human-named ids remain valid evidence
|
|
321
|
+
without claiming completeness. No registry / \`pi --models\` / models-API dump is read.`
|
|
322
|
+
|
|
323
|
+
function parseArgs(argv) {
|
|
324
|
+
const f = {}
|
|
325
|
+
for (let i = 0; i < argv.length; i++) {
|
|
326
|
+
const a = argv[i]
|
|
327
|
+
if (a === '--help' || a === '-h' || a === 'help') f.help = true
|
|
328
|
+
else if (a === '--harness') f.harness = argv[++i]
|
|
329
|
+
else if (a.startsWith('--harness=')) f.harness = a.slice('--harness='.length)
|
|
330
|
+
else if (a === '--available' || a === '--spawn-model-ids') f.available = argv[++i]
|
|
331
|
+
else if (a.startsWith('--available=')) f.available = a.slice('--available='.length)
|
|
332
|
+
else if (a.startsWith('--spawn-model-ids=')) f.available = a.slice('--spawn-model-ids='.length)
|
|
333
|
+
else if (a === '--human-named') f.humanNamed = argv[++i]
|
|
334
|
+
else if (a.startsWith('--human-named=')) f.humanNamed = a.slice('--human-named='.length)
|
|
335
|
+
else f.unknown = a
|
|
336
|
+
}
|
|
337
|
+
return f
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
export function runCli(argv, env = process.env) {
|
|
341
|
+
const f = parseArgs(argv)
|
|
342
|
+
if (f.help) {
|
|
343
|
+
console.log(USAGE)
|
|
344
|
+
return 0
|
|
345
|
+
}
|
|
346
|
+
if (f.unknown) {
|
|
347
|
+
console.error(`discover-models: unknown argument "${f.unknown}"\n${USAGE}`)
|
|
348
|
+
return 2
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
let harness = f.harness
|
|
352
|
+
if (harness === undefined) {
|
|
353
|
+
harness = detectHarness(env)
|
|
354
|
+
if (!harness) {
|
|
355
|
+
console.error(
|
|
356
|
+
'discover-models: no --harness given and could not auto-detect a single harness ' +
|
|
357
|
+
`(present configs are ambiguous or absent). Pass --harness <${HARNESSES.join('|')}>.\n${USAGE}`,
|
|
358
|
+
)
|
|
359
|
+
return 2
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (!HARNESSES.includes(harness)) {
|
|
363
|
+
console.error(`discover-models: unknown --harness "${harness}" (expected ${HARNESSES.join(' | ')})\n${USAGE}`)
|
|
364
|
+
return 2
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const parseIds = (flag, raw) => {
|
|
368
|
+
if (raw === undefined) return []
|
|
369
|
+
const ids = raw.split(',').map((id) => id.trim()).filter(Boolean)
|
|
370
|
+
if (ids.length === 0) throw new Error(`${flag} requires at least one model id`)
|
|
371
|
+
return [...new Set(ids)]
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
let spawnModelIds
|
|
375
|
+
let humanNamedModelIds
|
|
376
|
+
try {
|
|
377
|
+
spawnModelIds = parseIds('--available', f.available)
|
|
378
|
+
humanNamedModelIds = parseIds('--human-named', f.humanNamed)
|
|
379
|
+
} catch (error) {
|
|
380
|
+
console.error(`discover-models: ${error.message}\n${USAGE}`)
|
|
381
|
+
return 2
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const result = discover(harness, env, { spawnModelIds, humanNamedModelIds })
|
|
385
|
+
console.log(JSON.stringify(result, null, 2))
|
|
386
|
+
// A one-line human cue on stderr for someone running it by hand.
|
|
387
|
+
console.error(
|
|
388
|
+
`discover-models: ${harness} — ${result.discovered.length} model(s) discovered; ` +
|
|
389
|
+
'feed the ids to `model-catalog.mjs tiers --seen`.',
|
|
390
|
+
)
|
|
391
|
+
return 0
|
|
392
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"pi": {
|
|
3
|
+
"toolName": "ask_user_question",
|
|
4
|
+
"source": "@juicesharp/rpiv-ask-user-question@2.4.0 tool/types.ts and docs/tool-schema.md",
|
|
5
|
+
"questions": { "minimum": 1, "maximum": 4 },
|
|
6
|
+
"headerMaximum": 16,
|
|
7
|
+
"options": { "minimum": 2, "maximum": 4 },
|
|
8
|
+
"optionLabelMaximum": 60,
|
|
9
|
+
"multiSelect": true,
|
|
10
|
+
"secret": false,
|
|
11
|
+
"reservedLabels": ["Other", "Type something.", "Next"]
|
|
12
|
+
},
|
|
13
|
+
"codex": {
|
|
14
|
+
"toolName": "request_user_input",
|
|
15
|
+
"source": "openai/codex@3d4d253f8f4a812c595cd59e2c114c2c3696c293 codex-rs/core/src/tools/handlers/request_user_input_spec.rs",
|
|
16
|
+
"questions": { "minimum": 1, "maximum": 3 },
|
|
17
|
+
"headerMaximum": 12,
|
|
18
|
+
"options": { "minimum": 2, "maximum": 3 },
|
|
19
|
+
"questionIdFormat": "snake_case",
|
|
20
|
+
"recommendationLabelSuffix": " (Recommended)",
|
|
21
|
+
"multiSelect": false,
|
|
22
|
+
"secret": false
|
|
23
|
+
},
|
|
24
|
+
"claude-code": {
|
|
25
|
+
"toolName": "AskUserQuestion",
|
|
26
|
+
"source": "anthropics/claude-code@54cc51a08a5d3900e5abd02ad75a2ce46f3f008c plugins/plugin-dev/skills/command-development/references/interactive-commands.md",
|
|
27
|
+
"questions": { "minimum": 1, "maximum": 4 },
|
|
28
|
+
"headerMaximum": 12,
|
|
29
|
+
"options": { "minimum": 2, "maximum": 4 },
|
|
30
|
+
"multiSelect": true,
|
|
31
|
+
"secret": false
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"pi": {
|
|
3
|
+
"success": {
|
|
4
|
+
"content": [{ "type": "text", "text": "User has answered your questions." }],
|
|
5
|
+
"details": {
|
|
6
|
+
"answers": [
|
|
7
|
+
{ "questionIndex": 0, "question": "How should delivery proceed?", "kind": "option", "answer": "Queue" },
|
|
8
|
+
{ "questionIndex": 1, "question": "How should context proceed?", "kind": "custom", "answer": "After lunch" }
|
|
9
|
+
],
|
|
10
|
+
"cancelled": false
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"multi": {
|
|
14
|
+
"content": [{ "type": "text", "text": "User has answered your questions." }],
|
|
15
|
+
"details": {
|
|
16
|
+
"answers": [
|
|
17
|
+
{ "questionIndex": 0, "question": "How should features proceed?", "kind": "multi", "answer": null, "selected": ["Queue", "Direct"] }
|
|
18
|
+
],
|
|
19
|
+
"cancelled": false
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"cancelled": {
|
|
23
|
+
"content": [{ "type": "text", "text": "User declined to answer questions" }],
|
|
24
|
+
"details": { "answers": [], "cancelled": true }
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"codex": {
|
|
28
|
+
"success": {
|
|
29
|
+
"answers": {
|
|
30
|
+
"delivery": { "answers": ["Queue (Recommended)"] },
|
|
31
|
+
"context": { "answers": ["After lunch"] }
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"cancelled": { "cancelled": true }
|
|
35
|
+
},
|
|
36
|
+
"claude-code": {
|
|
37
|
+
"success": {
|
|
38
|
+
"questions": [],
|
|
39
|
+
"answers": {
|
|
40
|
+
"How should delivery proceed?": "Queue",
|
|
41
|
+
"How should context proceed?": "After lunch"
|
|
42
|
+
},
|
|
43
|
+
"annotations": {}
|
|
44
|
+
},
|
|
45
|
+
"multi": {
|
|
46
|
+
"questions": [],
|
|
47
|
+
"answers": {
|
|
48
|
+
"How should features proceed?": "Queue, Direct"
|
|
49
|
+
},
|
|
50
|
+
"annotations": {}
|
|
51
|
+
},
|
|
52
|
+
"cancelled": { "cancelled": true }
|
|
53
|
+
}
|
|
54
|
+
}
|