@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.
Files changed (397) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +90 -0
  3. package/bin/1aboveio-skills.mjs +18 -0
  4. package/package.json +28 -0
  5. package/runtime/skills/distribution/generated/recipes.json +1189 -0
  6. package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
  7. package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  8. package/skills/backend/airflow-dag-develop/LICENSE +3 -0
  9. package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
  10. package/skills/backend/app-debug/LICENSE +3 -0
  11. package/skills/backend/app-debug/SKILL.md +109 -0
  12. package/skills/backend/app-debug/references/common-errors.md +128 -0
  13. package/skills/backend/python-backend/LICENSE +3 -0
  14. package/skills/backend/python-backend/SKILL.md +326 -0
  15. package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
  16. package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
  17. package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
  18. package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
  19. package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
  20. package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
  21. package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
  22. package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
  23. package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
  24. package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
  25. package/skills/cicd-pipeline/docker/LICENSE +3 -0
  26. package/skills/cicd-pipeline/docker/SKILL.md +126 -0
  27. package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
  28. package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
  29. package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
  30. package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
  31. package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
  32. package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
  33. package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
  34. package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
  35. package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
  36. package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
  37. package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
  38. package/skills/cicd-pipeline/mergify/LICENSE +3 -0
  39. package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
  40. package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
  41. package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
  42. package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
  43. package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
  44. package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
  45. package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
  46. package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
  47. package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
  48. package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
  49. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
  50. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
  51. package/skills/cicd-pipeline/podman/LICENSE +3 -0
  52. package/skills/cicd-pipeline/podman/SKILL.md +70 -0
  53. package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
  54. package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  55. package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
  56. package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
  57. package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
  58. package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
  59. package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
  60. package/skills/engineering/e2e-test/LICENSE +3 -0
  61. package/skills/engineering/e2e-test/SKILL.md +156 -0
  62. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
  63. package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
  64. package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
  65. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  66. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
  67. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
  68. package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
  69. package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
  70. package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
  71. package/skills/engineering/e2e-test/references/debugging.md +36 -0
  72. package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
  73. package/skills/engineering/e2e-test/references/reviewing.md +39 -0
  74. package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
  75. package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
  76. package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
  77. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  78. package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
  79. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  80. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  81. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  82. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  83. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
  84. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  85. package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
  86. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
  87. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  88. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  89. package/skills/engineering/engineering-runtime/SKILL.md +10 -0
  90. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  91. package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
  92. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  93. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  94. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  95. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  96. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  97. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  98. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  99. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
  100. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
  101. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  102. package/skills/engineering/ensure-coverage/SKILL.md +136 -0
  103. package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
  104. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
  105. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
  106. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  107. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  108. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  109. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
  110. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  111. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
  112. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
  113. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
  114. package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
  115. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
  116. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
  117. package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
  118. package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
  119. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
  120. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  121. package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
  122. package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
  123. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
  124. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
  125. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
  126. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
  127. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
  128. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
  129. package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
  130. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
  131. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  132. package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
  133. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
  134. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  135. package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
  136. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  137. package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
  138. package/skills/engineering/harness-runtime/LICENSE +3 -0
  139. package/skills/engineering/harness-runtime/SKILL.md +18 -0
  140. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  141. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  142. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  143. package/skills/engineering/harness-runtime/contracts.md +15 -0
  144. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  145. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  146. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  147. package/skills/engineering/harness-runtime/index.mjs +767 -0
  148. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  149. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  150. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
  151. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  152. package/skills/engineering/implement-and-pr/LICENSE +3 -0
  153. package/skills/engineering/implement-and-pr/SKILL.md +176 -0
  154. package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
  155. package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
  156. package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
  157. package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
  158. package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
  159. package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
  160. package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
  161. package/skills/engineering/resolve-issues/LICENSE +3 -0
  162. package/skills/engineering/resolve-issues/SKILL.md +167 -0
  163. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
  164. package/skills/engineering/resolve-issues/references/breaker.md +82 -0
  165. package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
  166. package/skills/engineering/resolve-issues/references/delivery.md +108 -0
  167. package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
  168. package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
  169. package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
  170. package/skills/engineering/resolve-issues/references/finalization.md +68 -0
  171. package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
  172. package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
  173. package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
  174. package/skills/engineering/resolve-issues/references/intake.md +86 -0
  175. package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
  176. package/skills/engineering/resolve-issues/references/interference.md +87 -0
  177. package/skills/engineering/resolve-issues/references/loop.md +134 -0
  178. package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
  179. package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
  180. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
  181. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
  182. package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
  183. package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
  184. package/skills/engineering/resolve-issues/references/run-state.md +288 -0
  185. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
  186. package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
  187. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
  188. package/skills/engineering/resolve-issues/references/why.md +653 -0
  189. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
  190. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
  191. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
  192. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
  193. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
  194. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
  195. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
  196. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  197. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
  198. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
  199. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
  200. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
  201. package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
  202. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
  203. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
  204. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
  205. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
  206. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
  207. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
  208. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
  209. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
  210. package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
  211. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  212. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
  213. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
  214. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
  215. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
  216. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
  217. package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
  218. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
  219. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
  220. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
  221. package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
  222. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
  223. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
  224. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
  225. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
  226. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
  227. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
  228. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
  229. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
  230. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
  231. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
  232. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
  233. package/skills/engineering/resolve-release/LICENSE +3 -0
  234. package/skills/engineering/resolve-release/SKILL.md +112 -0
  235. package/skills/engineering/resolve-release/references/assembly.md +137 -0
  236. package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
  237. package/skills/engineering/resolve-release/references/candidate.md +167 -0
  238. package/skills/engineering/resolve-release/references/exposure.md +178 -0
  239. package/skills/engineering/resolve-release/references/handoff.md +24 -0
  240. package/skills/engineering/resolve-release/references/postmortem.md +230 -0
  241. package/skills/engineering/resolve-release/references/preflight.md +207 -0
  242. package/skills/engineering/resolve-release/references/principles.md +94 -0
  243. package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
  244. package/skills/engineering/resolve-release/references/related-skills.md +12 -0
  245. package/skills/engineering/resolve-release/references/routing.md +149 -0
  246. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
  247. package/skills/engineering/resolve-release/references/versioning.md +202 -0
  248. package/skills/engineering/resolve-release/references/why.md +53 -0
  249. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
  250. package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
  251. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
  252. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
  253. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
  254. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
  255. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
  256. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
  257. package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
  258. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
  259. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
  260. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
  261. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
  262. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
  263. package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
  264. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
  265. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
  266. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
  267. package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
  268. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
  269. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
  270. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
  271. package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
  272. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
  273. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
  274. package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
  275. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
  276. package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
  277. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
  278. package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
  279. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
  280. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
  281. package/skills/engineering/resolve-release/vendor/README.md +60 -0
  282. package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
  283. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
  284. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
  285. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
  286. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
  287. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
  288. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
  289. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
  290. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
  291. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
  292. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
  293. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
  294. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
  295. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
  296. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
  297. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
  298. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
  299. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
  300. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
  301. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
  302. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
  303. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
  304. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
  305. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
  306. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
  307. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
  308. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
  309. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
  310. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
  311. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
  312. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
  313. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
  314. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
  315. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
  316. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
  317. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
  318. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
  319. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  320. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
  321. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
  322. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
  323. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
  324. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
  325. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
  326. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
  327. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
  328. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
  329. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
  330. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
  331. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
  332. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
  333. package/skills/engineering/review-pr/LICENSE +3 -0
  334. package/skills/engineering/review-pr/SKILL.md +123 -0
  335. package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
  336. package/skills/engineering/review-pr/references/code-correctness.md +5 -0
  337. package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
  338. package/skills/engineering/review-pr/references/coordination.md +18 -0
  339. package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
  340. package/skills/engineering/review-pr/references/finding-themes.md +7 -0
  341. package/skills/engineering/review-pr/references/github-posting.md +98 -0
  342. package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
  343. package/skills/engineering/review-pr/references/incremental-output.md +16 -0
  344. package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
  345. package/skills/engineering/review-pr/references/output-format.md +99 -0
  346. package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
  347. package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
  348. package/skills/engineering/review-pr/references/re-review.md +18 -0
  349. package/skills/engineering/review-pr/references/review-method.md +199 -0
  350. package/skills/engineering/review-pr/references/review-mode.md +30 -0
  351. package/skills/engineering/review-pr/references/review-posture.md +53 -0
  352. package/skills/engineering/review-pr/references/round1-depth.md +62 -0
  353. package/skills/engineering/review-pr/references/scripts.md +17 -0
  354. package/skills/engineering/review-pr/references/workflow.md +16 -0
  355. package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
  356. package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
  357. package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
  358. package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
  359. package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
  360. package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
  361. package/skills/engineering/smoke/LICENSE +3 -0
  362. package/skills/engineering/smoke/SKILL.md +131 -0
  363. package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
  364. package/skills/engineering/smoke/references/manifest.md +192 -0
  365. package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
  366. package/skills/fullstack/better-auth/LICENSE +3 -0
  367. package/skills/fullstack/better-auth/SKILL.md +601 -0
  368. package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
  369. package/skills/fullstack/monorepo/LICENSE +3 -0
  370. package/skills/fullstack/monorepo/SKILL.md +465 -0
  371. package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
  372. package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
  373. package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
  374. package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
  375. package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
  376. package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
  377. package/skills/fullstack/prisma-setup/LICENSE +3 -0
  378. package/skills/fullstack/prisma-setup/SKILL.md +180 -0
  379. package/skills/fullstack/prisma-setup/nextjs.md +258 -0
  380. package/skills/fullstack/prisma-setup/turborepo.md +301 -0
  381. package/skills/fullstack/shadcn/LICENSE +3 -0
  382. package/skills/fullstack/shadcn/SKILL.md +119 -0
  383. package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
  384. package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
  385. package/skills/fullstack/shadcn/cli.md +411 -0
  386. package/skills/fullstack/shadcn/customization.md +224 -0
  387. package/skills/fullstack/shadcn/evals/evals.json +90 -0
  388. package/skills/fullstack/shadcn/mcp.md +101 -0
  389. package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
  390. package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
  391. package/skills/fullstack/shadcn/rules/composition.md +195 -0
  392. package/skills/fullstack/shadcn/rules/data-table.md +201 -0
  393. package/skills/fullstack/shadcn/rules/forms.md +255 -0
  394. package/skills/fullstack/shadcn/rules/icons.md +103 -0
  395. package/skills/fullstack/shadcn/rules/styling.md +167 -0
  396. package/skills/fullstack/zod-v4/LICENSE +3 -0
  397. 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
+ }