@1aboveio/skills 0.0.0-stage → 1.0.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 (633) hide show
  1. package/README.md +30 -2
  2. package/bin/cli.mjs +14 -0
  3. package/bin/select-core.mjs +172 -0
  4. package/package.json +146 -4
  5. package/skills/app-dev/airflow/LICENSE +3 -0
  6. package/skills/app-dev/airflow/SKILL.md +199 -0
  7. package/skills/app-dev/airflow/release-check.mjs +93 -0
  8. package/skills/app-dev/android-foundation/LICENSE +3 -0
  9. package/skills/app-dev/android-foundation/SKILL.md +192 -0
  10. package/skills/app-dev/android-foundation/assets/android-ci-job.yml +217 -0
  11. package/skills/app-dev/android-foundation/references/ci.md +87 -0
  12. package/skills/app-dev/android-foundation/references/gotchas.md +221 -0
  13. package/skills/app-dev/android-foundation/references/setup.md +164 -0
  14. package/skills/app-dev/android-foundation/release-check.mjs +93 -0
  15. package/skills/app-dev/android-foundation/scripts/device-run.sh +176 -0
  16. package/skills/app-dev/android-foundation/scripts/device-run.test.mjs +172 -0
  17. package/skills/app-dev/app-debug/LICENSE +3 -0
  18. package/skills/app-dev/app-debug/SKILL.md +110 -0
  19. package/skills/app-dev/app-debug/references/common-errors.md +128 -0
  20. package/skills/app-dev/app-debug/release-check.mjs +93 -0
  21. package/skills/app-dev/better-auth/LICENSE +3 -0
  22. package/skills/app-dev/better-auth/SKILL.md +598 -0
  23. package/skills/app-dev/better-auth/references/feishu-api.md +270 -0
  24. package/skills/app-dev/better-auth/release-check.mjs +93 -0
  25. package/skills/app-dev/data-catalog/LICENSE +3 -0
  26. package/skills/app-dev/data-catalog/SKILL.md +204 -0
  27. package/skills/app-dev/data-catalog/agents/openai.yaml +3 -0
  28. package/skills/app-dev/data-catalog/references/data-catalog-conventions.md +75 -0
  29. package/skills/app-dev/data-catalog/references/field-definitions.md +116 -0
  30. package/skills/app-dev/data-catalog/references/format.md +121 -0
  31. package/skills/app-dev/data-catalog/release-check.mjs +93 -0
  32. package/skills/app-dev/data-catalog/scripts/data-catalog.test.mjs +36 -0
  33. package/skills/app-dev/data-catalog/scripts/data_catalog.py +1392 -0
  34. package/skills/app-dev/data-catalog/scripts/persist-conventions-core.mjs +117 -0
  35. package/skills/app-dev/data-catalog/scripts/persist-conventions.mjs +17 -0
  36. package/skills/app-dev/data-catalog/scripts/test_data_catalog.py +571 -0
  37. package/skills/app-dev/ios-foundation/LICENSE +3 -0
  38. package/skills/app-dev/ios-foundation/SKILL.md +184 -0
  39. package/skills/app-dev/ios-foundation/references/setup.md +243 -0
  40. package/skills/app-dev/ios-foundation/release-check.mjs +93 -0
  41. package/skills/app-dev/monorepo/LICENSE +3 -0
  42. package/skills/app-dev/monorepo/SKILL.md +462 -0
  43. package/skills/app-dev/monorepo/release-check.mjs +93 -0
  44. package/skills/app-dev/nextjs-fullstack/LICENSE +3 -0
  45. package/skills/app-dev/nextjs-fullstack/SKILL.md +211 -0
  46. package/skills/app-dev/nextjs-fullstack/conventions.md +318 -0
  47. package/skills/app-dev/nextjs-fullstack/frontend-conventions.md +61 -0
  48. package/skills/app-dev/nextjs-fullstack/nextjs16.md +287 -0
  49. package/skills/app-dev/nextjs-fullstack/release-check.mjs +93 -0
  50. package/skills/app-dev/nextjs-fullstack/server-actions.md +409 -0
  51. package/skills/app-dev/prisma-setup/LICENSE +3 -0
  52. package/skills/app-dev/prisma-setup/SKILL.md +181 -0
  53. package/skills/app-dev/prisma-setup/nextjs.md +258 -0
  54. package/skills/app-dev/prisma-setup/release-check.mjs +93 -0
  55. package/skills/app-dev/prisma-setup/turborepo.md +301 -0
  56. package/skills/app-dev/pyspark/LICENSE +3 -0
  57. package/skills/app-dev/pyspark/SKILL.md +127 -0
  58. package/skills/app-dev/pyspark/assets/templates/etl.py +748 -0
  59. package/skills/app-dev/pyspark/assets/templates/utils/__init__.py +1 -0
  60. package/skills/app-dev/pyspark/assets/templates/utils/hudi_metadata.py +14 -0
  61. package/skills/app-dev/pyspark/references/diagnosis-and-profiling.md +169 -0
  62. package/skills/app-dev/pyspark/references/etl-contract.md +129 -0
  63. package/skills/app-dev/pyspark/references/production-validation.md +131 -0
  64. package/skills/app-dev/pyspark/references/reconciliation.md +38 -0
  65. package/skills/app-dev/pyspark/references/transformation-design.md +190 -0
  66. package/skills/app-dev/pyspark/references/velocity-feature-calculation.md +193 -0
  67. package/skills/app-dev/pyspark/release-check.mjs +93 -0
  68. package/skills/app-dev/pyspark/scripts/spark_eventlog_summary.py +223 -0
  69. package/skills/app-dev/python-backend/LICENSE +3 -0
  70. package/skills/app-dev/python-backend/SKILL.md +325 -0
  71. package/skills/app-dev/python-backend/assets/uv-install.sh +48 -0
  72. package/skills/app-dev/python-backend/references/uv-installs.md +83 -0
  73. package/skills/app-dev/python-backend/release-check.mjs +93 -0
  74. package/skills/app-dev/shadcn/LICENSE +3 -0
  75. package/skills/app-dev/shadcn/SKILL.md +120 -0
  76. package/skills/app-dev/shadcn/assets/shadcn-small.png +0 -0
  77. package/skills/app-dev/shadcn/assets/shadcn.png +0 -0
  78. package/skills/app-dev/shadcn/cli.md +411 -0
  79. package/skills/app-dev/shadcn/customization.md +224 -0
  80. package/skills/app-dev/shadcn/mcp.md +101 -0
  81. package/skills/app-dev/shadcn/release-check.mjs +93 -0
  82. package/skills/app-dev/shadcn/rules/base-vs-radix.md +323 -0
  83. package/skills/app-dev/shadcn/rules/component-selection.md +67 -0
  84. package/skills/app-dev/shadcn/rules/composition.md +195 -0
  85. package/skills/app-dev/shadcn/rules/data-table.md +201 -0
  86. package/skills/app-dev/shadcn/rules/forms.md +255 -0
  87. package/skills/app-dev/shadcn/rules/icons.md +103 -0
  88. package/skills/app-dev/shadcn/rules/styling.md +167 -0
  89. package/skills/app-dev/zod-v4/LICENSE +3 -0
  90. package/skills/app-dev/zod-v4/SKILL.md +286 -0
  91. package/skills/app-dev/zod-v4/release-check.mjs +93 -0
  92. package/skills/cicd/cloud-build/LICENSE +3 -0
  93. package/skills/cicd/cloud-build/SKILL.md +707 -0
  94. package/skills/cicd/cloud-build/release-check.mjs +93 -0
  95. package/skills/cicd/cloud-debug/LICENSE +3 -0
  96. package/skills/cicd/cloud-debug/SKILL.md +315 -0
  97. package/skills/cicd/cloud-debug/references/build-failures.md +238 -0
  98. package/skills/cicd/cloud-debug/references/deploy-failures.md +376 -0
  99. package/skills/cicd/cloud-debug/references/pipeline-failures.md +378 -0
  100. package/skills/cicd/cloud-debug/release-check.mjs +93 -0
  101. package/skills/cicd/cloud-deploy/LICENSE +3 -0
  102. package/skills/cicd/cloud-deploy/SKILL.md +230 -0
  103. package/skills/cicd/cloud-deploy/references/config-templates.md +257 -0
  104. package/skills/cicd/cloud-deploy/release-check.mjs +93 -0
  105. package/skills/cicd/docker/LICENSE +3 -0
  106. package/skills/cicd/docker/SKILL.md +151 -0
  107. package/skills/cicd/docker/release-check.mjs +93 -0
  108. package/skills/cicd/github-actions/LICENSE +3 -0
  109. package/skills/cicd/github-actions/SKILL.md +111 -0
  110. package/skills/cicd/github-actions/references/audit-profile-optimize.md +150 -0
  111. package/skills/cicd/github-actions/references/ci-case-studies.md +141 -0
  112. package/skills/cicd/github-actions/references/conditional-ci.md +214 -0
  113. package/skills/cicd/github-actions/references/debugging.md +13 -0
  114. package/skills/cicd/github-actions/references/pipeline.md +87 -0
  115. package/skills/cicd/github-actions/references/post-deploy-and-publishing.md +33 -0
  116. package/skills/cicd/github-actions/references/runners.md +253 -0
  117. package/skills/cicd/github-actions/references/security.md +29 -0
  118. package/skills/cicd/github-actions/references/speed-and-audit.md +115 -0
  119. package/skills/cicd/github-actions/references/two-pass-reading.md +92 -0
  120. package/skills/cicd/github-actions/release-check.mjs +93 -0
  121. package/skills/cicd/github-actions/scripts/ci-run-audit-core.mjs +612 -0
  122. package/skills/cicd/github-actions/scripts/ci-run-audit.mjs +4 -0
  123. package/skills/cicd/github-actions/scripts/ci-run-audit.test.mjs +637 -0
  124. package/skills/cicd/github-flow/LICENSE +3 -0
  125. package/skills/cicd/github-flow/SKILL.md +123 -0
  126. package/skills/cicd/github-flow/references/ci-conventions.md +14 -0
  127. package/skills/cicd/github-flow/release-check.mjs +93 -0
  128. package/skills/cicd/github-flow/scripts/flow-core.mjs +105 -0
  129. package/skills/cicd/github-flow/scripts/flow.mjs +81 -0
  130. package/skills/cicd/github-flow/scripts/flow.test.mjs +114 -0
  131. package/skills/cicd/github-flow/scripts/persist-conventions-core.mjs +117 -0
  132. package/skills/cicd/github-flow/scripts/persist-conventions.mjs +49 -0
  133. package/skills/cicd/github-flow/scripts/persist-conventions.test.mjs +108 -0
  134. package/skills/cicd/google-cloud/LICENSE +3 -0
  135. package/skills/cicd/google-cloud/SKILL.md +119 -0
  136. package/skills/cicd/google-cloud/references/gcs.md +469 -0
  137. package/skills/cicd/google-cloud/references/iam.md +451 -0
  138. package/skills/cicd/google-cloud/references/project.md +349 -0
  139. package/skills/cicd/google-cloud/references/secrets.md +336 -0
  140. package/skills/cicd/google-cloud/references/vpc.md +312 -0
  141. package/skills/cicd/google-cloud/release-check.mjs +93 -0
  142. package/skills/cicd/google-cloud/scripts/create-sa.sh +36 -0
  143. package/skills/cicd/google-cloud/scripts/gcp-config.sh +31 -0
  144. package/skills/cicd/google-cloud/scripts/grant-iap.sh +41 -0
  145. package/skills/cicd/google-cloud/scripts/setup-secrets.sh +48 -0
  146. package/skills/cicd/mergify/LICENSE +3 -0
  147. package/skills/cicd/mergify/SKILL.md +102 -0
  148. package/skills/cicd/mergify/assets/templates/mergify.yml +215 -0
  149. package/skills/cicd/mergify/assets/templates/ruleset.json +46 -0
  150. package/skills/cicd/mergify/references/branch-protection.md +282 -0
  151. package/skills/cicd/mergify/references/configuration.md +274 -0
  152. package/skills/cicd/mergify/references/diagnosis.md +109 -0
  153. package/skills/cicd/mergify/references/stacks.md +84 -0
  154. package/skills/cicd/mergify/references/traps.md +119 -0
  155. package/skills/cicd/mergify/references/watch-contract.md +274 -0
  156. package/skills/cicd/mergify/release-check.mjs +93 -0
  157. package/skills/cicd/mergify/scripts/audit-core.mjs +208 -0
  158. package/skills/cicd/mergify/scripts/audit.mjs +4 -0
  159. package/skills/cicd/mergify/scripts/audit.test.mjs +201 -0
  160. package/skills/cicd/mergify/scripts/entrypoints.test.mjs +106 -0
  161. package/skills/cicd/mergify/scripts/pr-620-mergify-comments.fixture.json +30 -0
  162. package/skills/cicd/mergify/scripts/stack-push-core.mjs +258 -0
  163. package/skills/cicd/mergify/scripts/stack-push.mjs +4 -0
  164. package/skills/cicd/mergify/scripts/stack-push.test.mjs +233 -0
  165. package/skills/cicd/mergify/scripts/watch-pr-delivery-core.mjs +1065 -0
  166. package/skills/cicd/mergify/scripts/watch-pr-delivery.mjs +4 -0
  167. package/skills/cicd/mergify/scripts/watch-pr-delivery.test.mjs +1826 -0
  168. package/skills/cicd/podman/LICENSE +3 -0
  169. package/skills/cicd/podman/SKILL.md +71 -0
  170. package/skills/cicd/podman/agents/openai.yaml +4 -0
  171. package/skills/cicd/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  172. package/skills/cicd/podman/assets/templates/podman-service-override.conf +3 -0
  173. package/skills/cicd/podman/references/compose-compatibility.md +70 -0
  174. package/skills/cicd/podman/references/networking-and-ports.md +74 -0
  175. package/skills/cicd/podman/references/rootless-services-and-sockets.md +156 -0
  176. package/skills/cicd/podman/references/troubleshooting.md +98 -0
  177. package/skills/cicd/podman/release-check.mjs +93 -0
  178. package/skills/content/article-review/LICENSE +3 -0
  179. package/skills/content/article-review/SKILL.md +66 -0
  180. package/skills/content/article-review/references/report-format.md +68 -0
  181. package/skills/content/article-review/references/template-guide.md +79 -0
  182. package/skills/content/article-review/references/template-wechat-payments.md +125 -0
  183. package/skills/content/article-review/release-check.mjs +93 -0
  184. package/skills/content/article-to-image/LICENSE +3 -0
  185. package/skills/content/article-to-image/SKILL.md +91 -0
  186. package/skills/content/article-to-image/references/formats.md +53 -0
  187. package/skills/content/article-to-image/release-check.mjs +93 -0
  188. package/skills/content/flowchart-svg/LICENSE +3 -0
  189. package/skills/content/flowchart-svg/SKILL.md +43 -0
  190. package/skills/content/flowchart-svg/release-check.mjs +93 -0
  191. package/skills/content/flowchart-svg/scripts/export_png.sh +8 -0
  192. package/skills/content/image-gen/LICENSE +3 -0
  193. package/skills/content/image-gen/SKILL.md +192 -0
  194. package/skills/content/image-gen/release-check.mjs +93 -0
  195. package/skills/content/image-gen/scripts/credentials.mjs +217 -0
  196. package/skills/content/image-gen/scripts/credentials.test.mjs +212 -0
  197. package/skills/content/image-gen/scripts/generate.mjs +240 -0
  198. package/skills/content/image-gen/scripts/options.mjs +293 -0
  199. package/skills/content/image-gen/scripts/options.test.mjs +245 -0
  200. package/skills/content/mermaid/LICENSE +3 -0
  201. package/skills/content/mermaid/SKILL.md +635 -0
  202. package/skills/content/mermaid/release-check.mjs +93 -0
  203. package/skills/content/wechat-article-writer/LICENSE +3 -0
  204. package/skills/content/wechat-article-writer/SKILL.md +92 -0
  205. package/skills/content/wechat-article-writer/references/style-selector.md +133 -0
  206. package/skills/content/wechat-article-writer/references/writing-rules.md +152 -0
  207. package/skills/content/wechat-article-writer/release-check.mjs +93 -0
  208. package/skills/content/wechat-article-writer/templates/wechat-comparison.md +52 -0
  209. package/skills/content/wechat-article-writer/templates/wechat-howto.md +51 -0
  210. package/skills/content/wechat-article-writer/templates/wechat-insight.md +50 -0
  211. package/skills/content/wechat-article-writer/templates/wechat-pitfall.md +52 -0
  212. package/skills/content/wechat-publisher/LICENSE +3 -0
  213. package/skills/content/wechat-publisher/SKILL.md +171 -0
  214. package/skills/content/wechat-publisher/references/api.md +105 -0
  215. package/skills/content/wechat-publisher/references/layout-rules.md +57 -0
  216. package/skills/content/wechat-publisher/references/wechat-safe-template.html +86 -0
  217. package/skills/content/wechat-publisher/release-check.mjs +93 -0
  218. package/skills/content/wechat-publisher/scripts/md_to_wechat_html.py +194 -0
  219. package/skills/content/wechat-publisher/scripts/publish.py +239 -0
  220. package/skills/content/wechat-search/LICENSE +3 -0
  221. package/skills/content/wechat-search/SKILL.md +211 -0
  222. package/skills/content/wechat-search/release-check.mjs +93 -0
  223. package/skills/content/wechat-search/scripts/start-chrome.sh +83 -0
  224. package/skills/content/xai-search/LICENSE +3 -0
  225. package/skills/content/xai-search/SKILL.md +79 -0
  226. package/skills/content/xai-search/release-check.mjs +93 -0
  227. package/skills/content/xai-search/scripts/xai_search.sh +187 -0
  228. package/skills/content/xai-search/tests/smoke_test.sh +36 -0
  229. package/skills/core/distill-writing/LICENSE +3 -0
  230. package/skills/core/distill-writing/SKILL.md +74 -0
  231. package/skills/core/distill-writing/references/extraction.md +95 -0
  232. package/skills/core/distill-writing/references/updating.md +46 -0
  233. package/skills/core/distill-writing/release-check.mjs +93 -0
  234. package/skills/core/doc-to-md/LICENSE +3 -0
  235. package/skills/core/doc-to-md/SKILL.md +78 -0
  236. package/skills/core/doc-to-md/release-check.mjs +93 -0
  237. package/skills/core/doc-to-md/scripts/convert.py +157 -0
  238. package/skills/core/editorial-review/LICENSE +3 -0
  239. package/skills/core/editorial-review/SKILL.md +79 -0
  240. package/skills/core/editorial-review/references/checklist.md +94 -0
  241. package/skills/core/editorial-review/release-check.mjs +93 -0
  242. package/skills/core/house-style/LICENSE +3 -0
  243. package/skills/core/house-style/SKILL.md +33 -0
  244. package/skills/core/house-style/references/defaults.md +66 -0
  245. package/skills/core/house-style/references/rules.md +267 -0
  246. package/skills/core/house-style/references/sources.md +27 -0
  247. package/skills/core/house-style/references/style-en.md +131 -0
  248. package/skills/core/house-style/references/style-zh.md +141 -0
  249. package/skills/core/house-style/references/terminology-zh.md +223 -0
  250. package/skills/core/house-style/release-check.mjs +93 -0
  251. package/skills/core/house-style/templates/brd.md +103 -0
  252. package/skills/core/house-style/templates/commercial-proposal.md +93 -0
  253. package/skills/core/house-style/templates/compliance-policy.md +109 -0
  254. package/skills/core/house-style/templates/gap-analysis.md +105 -0
  255. package/skills/core/house-style/templates/general.md +63 -0
  256. package/skills/core/house-style/templates/integration-guide.md +98 -0
  257. package/skills/core/house-style/templates/prd.md +81 -0
  258. package/skills/core/house-style/templates/risk-operations-procedure.md +94 -0
  259. package/skills/core/house-style/templates/technical-spec.md +96 -0
  260. package/skills/core/polish-cn/LICENSE +3 -0
  261. package/skills/core/polish-cn/SKILL.md +102 -0
  262. package/skills/core/polish-cn/references/brief.md +93 -0
  263. package/skills/core/polish-cn/references/models.md +76 -0
  264. package/skills/core/polish-cn/release-check.mjs +93 -0
  265. package/skills/core/polish-cn/scripts/polish-cn.test.mjs +244 -0
  266. package/skills/core/polish-cn/scripts/polish_blocks.py +489 -0
  267. package/skills/core/reg-parser/LICENSE +3 -0
  268. package/skills/core/reg-parser/SKILL.md +212 -0
  269. package/skills/core/reg-parser/references/checklist-schema.md +223 -0
  270. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.json +1306 -0
  271. package/skills/core/reg-parser/references/checklists/hk-amlo-checklist.md +469 -0
  272. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.json +634 -0
  273. package/skills/core/reg-parser/references/checklists/hk-fi-corporate-onboarding-cdd-checklist.md +233 -0
  274. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.json +2194 -0
  275. package/skills/core/reg-parser/references/checklists/hk-mso-guideline-checklist.md +771 -0
  276. package/skills/core/reg-parser/references/checklists/kyc-aml-checklist.md +258 -0
  277. package/skills/core/reg-parser/references/checklists/visa-vars-checklist.md +1058 -0
  278. package/skills/core/reg-parser/references/mandates/hk-amlo-cap615.md +389 -0
  279. package/skills/core/reg-parser/references/mandates/visa-vars.md +205 -0
  280. package/skills/core/reg-parser/release-check.mjs +93 -0
  281. package/skills/core/reg-parser/scripts/compare_checklist.py +230 -0
  282. package/skills/core/reg-parser/scripts/dump_checklist.py +361 -0
  283. package/skills/core/reg-parser/scripts/preprocess-mandate.sh +187 -0
  284. package/skills/core/reg-parser/scripts/reg-parser.test.mjs +165 -0
  285. package/skills/core/reg-parser/scripts/test_quarantine.sh +105 -0
  286. package/skills/core/reg-parser/scripts/validate_checklist.py +563 -0
  287. package/skills/core/reg-parser/scripts/validate_mandate.py +273 -0
  288. package/skills/core/terminology/LICENSE +3 -0
  289. package/skills/core/terminology/SKILL.md +62 -0
  290. package/skills/core/terminology/references/format.md +50 -0
  291. package/skills/core/terminology/references/init.md +32 -0
  292. package/skills/core/terminology/release-check.mjs +93 -0
  293. package/skills/core/write-doc/LICENSE +3 -0
  294. package/skills/core/write-doc/SKILL.md +141 -0
  295. package/skills/core/write-doc/references/bilingual.md +60 -0
  296. package/skills/core/write-doc/release-check.mjs +93 -0
  297. package/skills/engineering/better-review/LICENSE +3 -0
  298. package/skills/engineering/better-review/SKILL.md +249 -0
  299. package/skills/engineering/better-review/agents/openai.yaml +9 -0
  300. package/skills/engineering/better-review/references/domain-hazards.md +53 -0
  301. package/skills/engineering/better-review/references/passes.md +147 -0
  302. package/skills/engineering/better-review/references/result.md +151 -0
  303. package/skills/engineering/better-review/release-check.mjs +93 -0
  304. package/skills/engineering/better-review/scripts/pr-context.mjs +212 -0
  305. package/skills/engineering/better-review/scripts/pr-context.test.mjs +168 -0
  306. package/skills/engineering/better-review/scripts/rereview-scope.mjs +503 -0
  307. package/skills/engineering/better-review/scripts/rereview-scope.test.mjs +587 -0
  308. package/skills/engineering/better-review/scripts/scan-diff.mjs +365 -0
  309. package/skills/engineering/better-review/scripts/scan-diff.test.mjs +414 -0
  310. package/skills/engineering/better-review/scripts/vendor-sync.test.mjs +96 -0
  311. package/skills/engineering/e2e-test/LICENSE +3 -0
  312. package/skills/engineering/e2e-test/SKILL.md +98 -0
  313. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +24 -0
  314. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  315. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +73 -0
  316. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +144 -0
  317. package/skills/engineering/e2e-test/references/ci-integration.md +25 -0
  318. package/skills/engineering/e2e-test/references/ci-playwright-container.md +290 -0
  319. package/skills/engineering/e2e-test/references/presentation-sweep.md +104 -0
  320. package/skills/engineering/e2e-test/references/reviewing.md +41 -0
  321. package/skills/engineering/e2e-test/references/route-manifest.md +51 -0
  322. package/skills/engineering/e2e-test/release-check.mjs +93 -0
  323. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  324. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  325. package/skills/engineering/e2e-test/scripts/presentation-checks.test.mjs +106 -0
  326. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  327. package/skills/engineering/e2e-test/scripts/presentation-perceivability.test.mjs +117 -0
  328. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  329. package/skills/engineering/e2e-test/scripts/presentation-reachability.test.mjs +69 -0
  330. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  331. package/skills/engineering/e2e-test/scripts/presentation-render-health.test.mjs +98 -0
  332. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +147 -0
  333. package/skills/engineering/e2e-test/scripts/presentation-sweep.test.mjs +71 -0
  334. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  335. package/skills/engineering/e2e-test/scripts/presentation-temporal.test.mjs +59 -0
  336. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +82 -0
  337. package/skills/engineering/e2e-test/scripts/project-route-manifest.test.mjs +76 -0
  338. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  339. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  340. package/skills/engineering/engineering-runtime/SKILL.md +11 -0
  341. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  342. package/skills/engineering/engineering-runtime/coherence/workflow.json +597 -0
  343. package/skills/engineering/engineering-runtime/engineering-runtime.test.mjs +68 -0
  344. package/skills/engineering/engineering-runtime/release-check.mjs +93 -0
  345. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  346. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  347. package/skills/engineering/engineering-runtime/scripts/invocation-policy.mjs +187 -0
  348. package/skills/engineering/engineering-runtime/scripts/invocation-policy.test.mjs +95 -0
  349. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +79 -0
  350. package/skills/engineering/engineering-runtime/scripts/main-module.test.mjs +288 -0
  351. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  352. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  353. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  354. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  355. package/skills/engineering/engineering-runtime/scripts/required-check-plan.test.mjs +96 -0
  356. package/skills/engineering/engineering-runtime/scripts/review-completion.mjs +56 -0
  357. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +595 -0
  358. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +189 -0
  359. package/skills/engineering/engineering-runtime/scripts/yaml-mapping.mjs +18 -0
  360. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  361. package/skills/engineering/ensure-coverage/SKILL.md +129 -0
  362. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +92 -0
  363. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +85 -0
  364. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  365. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  366. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  367. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +19 -0
  368. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  369. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +57 -0
  370. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +39 -0
  371. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +44 -0
  372. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +110 -0
  373. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +35 -0
  374. package/skills/engineering/ensure-coverage/references/presentation/axis.md +64 -0
  375. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +27 -0
  376. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  377. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +56 -0
  378. package/skills/engineering/ensure-coverage/release-check.mjs +93 -0
  379. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +67 -0
  380. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +140 -0
  381. package/skills/engineering/ensure-coverage/scripts/README.md +99 -0
  382. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +182 -0
  383. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.test.mjs +96 -0
  384. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +105 -0
  385. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.test.mjs +47 -0
  386. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +137 -0
  387. package/skills/engineering/ensure-coverage/scripts/ci-audit.test.mjs +86 -0
  388. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +674 -0
  389. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.test.mjs +447 -0
  390. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  391. package/skills/engineering/ensure-coverage/scripts/design-parity.test.mjs +552 -0
  392. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +282 -0
  393. package/skills/engineering/ensure-coverage/scripts/lint-tests.test.mjs +289 -0
  394. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  395. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.test.mjs +119 -0
  396. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  397. package/skills/engineering/golden-path/LICENSE +3 -0
  398. package/skills/engineering/golden-path/SKILL.md +230 -0
  399. package/skills/engineering/golden-path/agents/openai.yaml +3 -0
  400. package/skills/engineering/golden-path/assets/golden-paths.example.json +57 -0
  401. package/skills/engineering/golden-path/references/contract.md +239 -0
  402. package/skills/engineering/golden-path/references/migration.md +111 -0
  403. package/skills/engineering/golden-path/release-check.mjs +93 -0
  404. package/skills/engineering/golden-path/scripts/golden-path-core.mjs +1779 -0
  405. package/skills/engineering/golden-path/scripts/golden-path.mjs +6 -0
  406. package/skills/engineering/golden-path/scripts/golden-path.test.mjs +1457 -0
  407. package/skills/engineering/harness-runtime/LICENSE +3 -0
  408. package/skills/engineering/harness-runtime/SKILL.md +19 -0
  409. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  410. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  411. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  412. package/skills/engineering/harness-runtime/contracts.md +15 -0
  413. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  414. package/skills/engineering/harness-runtime/discover-models.test.mjs +363 -0
  415. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  416. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  417. package/skills/engineering/harness-runtime/harness-runtime.test.mjs +967 -0
  418. package/skills/engineering/harness-runtime/index.mjs +767 -0
  419. package/skills/engineering/harness-runtime/model-catalog-seed.test.mjs +829 -0
  420. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  421. package/skills/engineering/harness-runtime/model-catalog.test.mjs +366 -0
  422. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  423. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +408 -0
  424. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  425. package/skills/engineering/harness-runtime/release-check.mjs +93 -0
  426. package/skills/engineering/resolve-issues/LICENSE +3 -0
  427. package/skills/engineering/resolve-issues/SKILL.md +250 -0
  428. package/skills/engineering/resolve-issues/agents/openai.yaml +9 -0
  429. package/skills/engineering/resolve-issues/plugin-hooks.json +17 -0
  430. package/skills/engineering/resolve-issues/references/canary.md +28 -0
  431. package/skills/engineering/resolve-issues/references/ci.md +105 -0
  432. package/skills/engineering/resolve-issues/references/done.md +25 -0
  433. package/skills/engineering/resolve-issues/references/dropbox.md +90 -0
  434. package/skills/engineering/resolve-issues/references/expire.md +318 -0
  435. package/skills/engineering/resolve-issues/references/exploration.md +202 -0
  436. package/skills/engineering/resolve-issues/references/implementation.md +303 -0
  437. package/skills/engineering/resolve-issues/references/preflight.md +445 -0
  438. package/skills/engineering/resolve-issues/references/review.md +228 -0
  439. package/skills/engineering/resolve-issues/references/shared-modules.md +44 -0
  440. package/skills/engineering/resolve-issues/references/task-plan.md +264 -0
  441. package/skills/engineering/resolve-issues/release-check.mjs +93 -0
  442. package/skills/engineering/resolve-issues/scripts/cleanup-runs.mjs +364 -0
  443. package/skills/engineering/resolve-issues/scripts/cleanup-runs.test.mjs +280 -0
  444. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  445. package/skills/engineering/resolve-issues/scripts/dropbox.mjs +473 -0
  446. package/skills/engineering/resolve-issues/scripts/dropbox.test.mjs +346 -0
  447. package/skills/engineering/resolve-issues/scripts/findings-reuse.mjs +98 -0
  448. package/skills/engineering/resolve-issues/scripts/findings-reuse.test.mjs +88 -0
  449. package/skills/engineering/resolve-issues/scripts/github-reviews.mjs +384 -0
  450. package/skills/engineering/resolve-issues/scripts/github-reviews.test.mjs +264 -0
  451. package/skills/engineering/resolve-issues/scripts/install-hooks.mjs +135 -0
  452. package/skills/engineering/resolve-issues/scripts/install-hooks.test.mjs +79 -0
  453. package/skills/engineering/resolve-issues/scripts/issue-tree.mjs +162 -0
  454. package/skills/engineering/resolve-issues/scripts/issue-tree.test.mjs +107 -0
  455. package/skills/engineering/resolve-issues/scripts/manual-invocation.test.mjs +14 -0
  456. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  457. package/skills/engineering/resolve-issues/scripts/next-actions-capacity.test.mjs +149 -0
  458. package/skills/engineering/resolve-issues/scripts/next-actions.mjs +856 -0
  459. package/skills/engineering/resolve-issues/scripts/next-actions.test.mjs +915 -0
  460. package/skills/engineering/resolve-issues/scripts/plan-sync.mjs +269 -0
  461. package/skills/engineering/resolve-issues/scripts/plan-sync.test.mjs +156 -0
  462. package/skills/engineering/resolve-issues/scripts/preflight-models.mjs +736 -0
  463. package/skills/engineering/resolve-issues/scripts/preflight-models.test.mjs +448 -0
  464. package/skills/engineering/resolve-issues/scripts/ready-check.mjs +185 -0
  465. package/skills/engineering/resolve-issues/scripts/ready-check.test.mjs +217 -0
  466. package/skills/engineering/resolve-issues/scripts/rehydrate.mjs +98 -0
  467. package/skills/engineering/resolve-issues/scripts/rehydrate.test.mjs +91 -0
  468. package/skills/engineering/resolve-issues/scripts/review-verdict.mjs +509 -0
  469. package/skills/engineering/resolve-issues/scripts/review-verdict.test.mjs +1060 -0
  470. package/skills/engineering/resolve-issues/scripts/size-check.mjs +492 -0
  471. package/skills/engineering/resolve-issues/scripts/size-check.test.mjs +458 -0
  472. package/skills/engineering/resolve-release/LICENSE +3 -0
  473. package/skills/engineering/resolve-release/SKILL.md +215 -0
  474. package/skills/engineering/resolve-release/agents/openai.yaml +8 -0
  475. package/skills/engineering/resolve-release/flows/cloud-run-canary.md +13 -0
  476. package/skills/engineering/resolve-release/flows/cloud-run.md +7 -0
  477. package/skills/engineering/resolve-release/flows/root-tag-npm.md +13 -0
  478. package/skills/engineering/resolve-release/flows/workspace-npm.md +22 -0
  479. package/skills/engineering/resolve-release/references/canary.md +51 -0
  480. package/skills/engineering/resolve-release/references/candidate.md +41 -0
  481. package/skills/engineering/resolve-release/references/cut.md +131 -0
  482. package/skills/engineering/resolve-release/references/dark-launch.md +66 -0
  483. package/skills/engineering/resolve-release/references/flows.md +150 -0
  484. package/skills/engineering/resolve-release/references/preflight.md +154 -0
  485. package/skills/engineering/resolve-release/references/prepared-metadata.md +260 -0
  486. package/skills/engineering/resolve-release/references/promotion.md +82 -0
  487. package/skills/engineering/resolve-release/references/publish.md +232 -0
  488. package/skills/engineering/resolve-release/references/workspace-npm.md +103 -0
  489. package/skills/engineering/resolve-release/release-check.mjs +93 -0
  490. package/skills/engineering/resolve-release/scripts/apply.mjs +212 -0
  491. package/skills/engineering/resolve-release/scripts/apply.test.mjs +99 -0
  492. package/skills/engineering/resolve-release/scripts/dark-flags.mjs +134 -0
  493. package/skills/engineering/resolve-release/scripts/dark-flags.test.mjs +100 -0
  494. package/skills/engineering/resolve-release/scripts/flow.mjs +500 -0
  495. package/skills/engineering/resolve-release/scripts/flow.test.mjs +340 -0
  496. package/skills/engineering/resolve-release/scripts/green-head.mjs +231 -0
  497. package/skills/engineering/resolve-release/scripts/green-head.test.mjs +101 -0
  498. package/skills/engineering/resolve-release/scripts/npm-version-absence.mjs +138 -0
  499. package/skills/engineering/resolve-release/scripts/npm-version-absence.test.mjs +426 -0
  500. package/skills/engineering/resolve-release/scripts/plan-npm.test.mjs +659 -0
  501. package/skills/engineering/resolve-release/scripts/plan-toml-boundary.test.mjs +317 -0
  502. package/skills/engineering/resolve-release/scripts/plan-uv.test.mjs +291 -0
  503. package/skills/engineering/resolve-release/scripts/plan.mjs +806 -0
  504. package/skills/engineering/resolve-release/scripts/plan.test.mjs +428 -0
  505. package/skills/engineering/rush-issues/LICENSE +3 -0
  506. package/skills/engineering/rush-issues/SKILL.md +58 -0
  507. package/skills/engineering/rush-issues/agents/openai.yaml +8 -0
  508. package/skills/engineering/rush-issues/rehydrate.mjs +10 -0
  509. package/skills/engineering/rush-issues/release-check.mjs +93 -0
  510. package/skills/engineering/rush-release/LICENSE +3 -0
  511. package/skills/engineering/rush-release/SKILL.md +35 -0
  512. package/skills/engineering/rush-release/agents/openai.yaml +8 -0
  513. package/skills/engineering/rush-release/release-check.mjs +93 -0
  514. package/skills/engineering/test-quality/LICENSE +3 -0
  515. package/skills/engineering/test-quality/SKILL.md +79 -0
  516. package/skills/engineering/test-quality/references/audit.md +80 -0
  517. package/skills/engineering/test-quality/references/lint.md +24 -0
  518. package/skills/engineering/test-quality/references/principles.md +143 -0
  519. package/skills/engineering/test-quality/references/testing-conventions.md +9 -0
  520. package/skills/engineering/test-quality/release-check.mjs +93 -0
  521. package/skills/engineering/test-quality/scripts/lint-tests.mjs +574 -0
  522. package/skills/engineering/test-quality/scripts/lint-tests.test.mjs +591 -0
  523. package/skills/engineering/test-quality/scripts/mock-policy-config.mjs +176 -0
  524. package/skills/engineering/test-quality/scripts/mock-policy-config.test.mjs +119 -0
  525. package/skills/engineering/test-quality/scripts/persist-conventions-core.mjs +117 -0
  526. package/skills/engineering/test-quality/scripts/persist-conventions.mjs +17 -0
  527. package/skills/engineering/test-quality/scripts/persist-conventions.test.mjs +104 -0
  528. package/skills/risk-compliance/compliance-audit/LICENSE +3 -0
  529. package/skills/risk-compliance/compliance-audit/SKILL.md +439 -0
  530. package/skills/risk-compliance/compliance-audit/references/findings-schema.md +293 -0
  531. package/skills/risk-compliance/compliance-audit/references/normalization-rules.md +45 -0
  532. package/skills/risk-compliance/compliance-audit/references/vars-checklist.md +1068 -0
  533. package/skills/risk-compliance/compliance-audit/references/vars-findings-schema.md +398 -0
  534. package/skills/risk-compliance/compliance-audit/release-check.mjs +93 -0
  535. package/skills/risk-compliance/compliance-audit/scripts/compliance-audit.test.mjs +14 -0
  536. package/skills/risk-compliance/compliance-audit/scripts/export_tracker_xlsx.py +221 -0
  537. package/skills/risk-compliance/compliance-audit/scripts/reconcile_tracker.py +458 -0
  538. package/skills/risk-compliance/compliance-audit/scripts/test_export_tracker_xlsx.py +97 -0
  539. package/skills/risk-compliance/compliance-audit/scripts/test_validate_tracker.py +157 -0
  540. package/skills/risk-compliance/compliance-audit/scripts/validate_tracker.py +829 -0
  541. package/skills/risk-compliance/contract-compare/LICENSE +3 -0
  542. package/skills/risk-compliance/contract-compare/SKILL.md +199 -0
  543. package/skills/risk-compliance/contract-compare/references/comparison-dimensions.md +209 -0
  544. package/skills/risk-compliance/contract-compare/release-check.mjs +93 -0
  545. package/skills/risk-compliance/contract-review/LICENSE +3 -0
  546. package/skills/risk-compliance/contract-review/SKILL.md +240 -0
  547. package/skills/risk-compliance/contract-review/references/review-criteria.md +223 -0
  548. package/skills/risk-compliance/contract-review/release-check.mjs +93 -0
  549. package/skills/risk-compliance/doc-authenticity/LICENSE +3 -0
  550. package/skills/risk-compliance/doc-authenticity/SKILL.md +160 -0
  551. package/skills/risk-compliance/doc-authenticity/agents/openai.yaml +8 -0
  552. package/skills/risk-compliance/doc-authenticity/manual-invocation.test.mjs +12 -0
  553. package/skills/risk-compliance/doc-authenticity/references/agreement.md +66 -0
  554. package/skills/risk-compliance/doc-authenticity/references/bank-statement.md +150 -0
  555. package/skills/risk-compliance/doc-authenticity/references/forensic-signals.md +157 -0
  556. package/skills/risk-compliance/doc-authenticity/references/image-signals.md +114 -0
  557. package/skills/risk-compliance/doc-authenticity/references/invoice.md +66 -0
  558. package/skills/risk-compliance/doc-authenticity/references/issuer-profiles.md +86 -0
  559. package/skills/risk-compliance/doc-authenticity/references/verdict-and-report.md +95 -0
  560. package/skills/risk-compliance/doc-authenticity/references/verdict.schema.json +81 -0
  561. package/skills/risk-compliance/doc-authenticity/release-check.mjs +93 -0
  562. package/skills/risk-compliance/doc-authenticity/scripts/image_forensics.py +294 -0
  563. package/skills/risk-compliance/doc-authenticity/scripts/pdf_forensics.py +401 -0
  564. package/skills/risk-compliance/doc-authenticity/scripts/validate_codes.py +224 -0
  565. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.py +308 -0
  566. package/skills/risk-compliance/doc-authenticity/scripts/validate_verdict.test.mjs +212 -0
  567. package/skills/risk-compliance/fraud-analysis/LICENSE +3 -0
  568. package/skills/risk-compliance/fraud-analysis/SKILL.md +114 -0
  569. package/skills/risk-compliance/fraud-analysis/references/archetypes/authorized-payment-scam.md +41 -0
  570. package/skills/risk-compliance/fraud-analysis/references/archetypes/first-party-fraud.md +44 -0
  571. package/skills/risk-compliance/fraud-analysis/references/archetypes/third-party-fraud.md +27 -0
  572. package/skills/risk-compliance/fraud-analysis/references/contexts/bank-transfer.md +24 -0
  573. package/skills/risk-compliance/fraud-analysis/references/contexts/card-payment.md +30 -0
  574. package/skills/risk-compliance/fraud-analysis/references/contexts/payment-collection.md +20 -0
  575. package/skills/risk-compliance/fraud-analysis/references/contexts/payout.md +20 -0
  576. package/skills/risk-compliance/fraud-analysis/references/feature-engineering.md +158 -0
  577. package/skills/risk-compliance/fraud-analysis/references/mechanisms/account-takeover.md +36 -0
  578. package/skills/risk-compliance/fraud-analysis/references/report-rationale.md +45 -0
  579. package/skills/risk-compliance/fraud-analysis/references/report-template.md +190 -0
  580. package/skills/risk-compliance/fraud-analysis/references/review-checklist.md +175 -0
  581. package/skills/risk-compliance/fraud-analysis/references/taxonomy.md +79 -0
  582. package/skills/risk-compliance/fraud-analysis/references/terminology.md +108 -0
  583. package/skills/risk-compliance/fraud-analysis/references/workflow.md +175 -0
  584. package/skills/risk-compliance/fraud-analysis/release-check.mjs +93 -0
  585. package/skills/risk-compliance/payment-analysis/LICENSE +3 -0
  586. package/skills/risk-compliance/payment-analysis/SKILL.md +180 -0
  587. package/skills/risk-compliance/payment-analysis/references/auth-rate-actions.md +30 -0
  588. package/skills/risk-compliance/payment-analysis/references/chargebacks.md +208 -0
  589. package/skills/risk-compliance/payment-analysis/references/chinese-polish.md +51 -0
  590. package/skills/risk-compliance/payment-analysis/references/event-layers.md +127 -0
  591. package/skills/risk-compliance/payment-analysis/references/fx.md +59 -0
  592. package/skills/risk-compliance/payment-analysis/references/journey.md +79 -0
  593. package/skills/risk-compliance/payment-analysis/references/metrics.md +67 -0
  594. package/skills/risk-compliance/payment-analysis/references/report-template.md +119 -0
  595. package/skills/risk-compliance/payment-analysis/references/terminology.md +95 -0
  596. package/skills/risk-compliance/payment-analysis/references/visualization.md +56 -0
  597. package/skills/risk-compliance/payment-analysis/release-check.mjs +93 -0
  598. package/skills/risk-compliance/report-writing/LICENSE +3 -0
  599. package/skills/risk-compliance/report-writing/SKILL.md +220 -0
  600. package/skills/risk-compliance/report-writing/references/audit-report-template.md +121 -0
  601. package/skills/risk-compliance/report-writing/references/external-assessment-template.md +167 -0
  602. package/skills/risk-compliance/report-writing/references/management-report-template.md +145 -0
  603. package/skills/risk-compliance/report-writing/references/vars-report-template.md +224 -0
  604. package/skills/risk-compliance/report-writing/release-check.mjs +93 -0
  605. package/skills/risk-compliance/similar-domain/LICENSE +3 -0
  606. package/skills/risk-compliance/similar-domain/SKILL.md +203 -0
  607. package/skills/risk-compliance/similar-domain/references/entities.md +67 -0
  608. package/skills/risk-compliance/similar-domain/references/fingerprints.md +134 -0
  609. package/skills/risk-compliance/similar-domain/references/pivots.md +82 -0
  610. package/skills/risk-compliance/similar-domain/references/report-template.md +93 -0
  611. package/skills/risk-compliance/similar-domain/references/scoring.md +130 -0
  612. package/skills/risk-compliance/similar-domain/references/terminology.md +41 -0
  613. package/skills/risk-compliance/similar-domain/references/workflow.md +85 -0
  614. package/skills/risk-compliance/similar-domain/release-check.mjs +93 -0
  615. package/skills/risk-compliance/tld-detection/LICENSE +3 -0
  616. package/skills/risk-compliance/tld-detection/SKILL.md +245 -0
  617. package/skills/risk-compliance/tld-detection/agents/openai.yaml +9 -0
  618. package/skills/risk-compliance/tld-detection/references/chinese-polish.md +55 -0
  619. package/skills/risk-compliance/tld-detection/references/clean.md +51 -0
  620. package/skills/risk-compliance/tld-detection/references/clustering.md +235 -0
  621. package/skills/risk-compliance/tld-detection/references/decision.md +189 -0
  622. package/skills/risk-compliance/tld-detection/references/fx-conversion.md +232 -0
  623. package/skills/risk-compliance/tld-detection/references/report-template.md +272 -0
  624. package/skills/risk-compliance/tld-detection/references/streams.md +141 -0
  625. package/skills/risk-compliance/tld-detection/references/terminology.md +95 -0
  626. package/skills/risk-compliance/tld-detection/references/workflow.md +95 -0
  627. package/skills/risk-compliance/tld-detection/release-check.mjs +93 -0
  628. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.py +390 -0
  629. package/skills/risk-compliance/tld-detection/scripts/detect_ladders.test.mjs +14 -0
  630. package/skills/risk-compliance/tld-detection/scripts/detect_streams.py +650 -0
  631. package/skills/risk-compliance/tld-detection/scripts/detect_streams.test.mjs +14 -0
  632. package/skills/risk-compliance/tld-detection/tests/test_detect_ladders.py +134 -0
  633. package/skills/risk-compliance/tld-detection/tests/test_detect_streams.py +520 -0
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: harness-runtime
3
+ description: Internal import-only library shared by first-party engineering packages. Not a workflow skill; never select or invoke it as a user capability.
4
+ disable-model-invocation: true
5
+ user-invocable: false
6
+ release-version: 0.36.0
7
+ ---
8
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
9
+ # Harness Runtime
10
+
11
+ This support-only runtime package exposes shared programmatic contracts plus canonical model discovery and model-catalog utilities. It ships the team catalog baseline; per-harness user files carry only explicit confirmed overrides. It has no user or model-invocable workflow.
12
+
13
+ ## Package Map
14
+
15
+ - `contracts.md` defines the neutral values, planner boundary, discovery handoff, and topology rules.
16
+ - `native-question-contracts.md` pins the Pi, Codex, and Claude Code adapter schemas and response behavior.
17
+ - `index.mjs` exports neutral constructors plus pure question planning and response normalization.
18
+ - `discover-models.mjs` enumerates model evidence; `model-catalog.mjs` manages per-harness classifications.
19
+ - `references/model-catalog.md` documents catalog policy; `bin/` contains the installed command wrappers.
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "Harness Runtime"
3
+ short_description: "Internal harness-neutral support package"
4
+
5
+ policy:
6
+ allow_implicit_invocation: false
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from '../discover-models.mjs'
3
+
4
+ process.exit(runCli(process.argv.slice(2)))
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from '../model-catalog.mjs'
3
+
4
+ process.exit(runCli(process.argv.slice(2)))
@@ -0,0 +1,15 @@
1
+ # Harness runtime contracts
2
+
3
+ `index.mjs` exports four neutral constructors: `defineCurrentTurnCapabilities`, `defineQuestionSpec`, `defineQuestionAnswers`, and `defineModelAvailability`. It also exports the pure adapter layer, `planStructuredQuestions` and `normalizeQuestionResponses`. Model enumeration and persistence are separate entrypoints in `discover-models.mjs` and `model-catalog.mjs`; they are not re-exported from `index.mjs`.
4
+
5
+ The runtime accepts current-turn capabilities as explicit input. It never infers native tools or spawn-model ids from training data or static configuration.
6
+
7
+ Question and answer values are harness-neutral immutable data. `planStructuredQuestions` selects only an advertised Pi, Codex, or Claude Code question tool, validates its native limits, orders recommendations, and emits deterministic payload batches. After all adapter-specific label and response-format transformations, each native representation must identify exactly one neutral stable option id; collisions fail before emission with structured `invalid-question` details. `normalizeQuestionResponses` maps unique native labels and custom text back to frozen `{ questionId: answers[] }` values and rejects duplicate mappings instead of choosing one. See `native-question-contracts.md` for the pinned schemas, adapter rules, response fixtures, and cancellation behavior.
8
+
9
+ Model discovery unions explicit current-turn spawn ids and human-named runnable ids with configured or credentialed evidence. Its `{ discovered: [{ id, source }] }` output is evidence, not a neutral model-availability value: callers map each item to `{ id, sources: [source] }`, preserve `harness` and `completeness`, then pass that shape to `defineModelAvailability`; discovery `notes` remain operator diagnostics. Pi labels configuration discovery `full` even when it finds no runnable ids because its credential-aware configuration is the complete evidence class. Codex and Claude Code static configuration remains partial unless current-turn or runtime-enumeration evidence completes it. Catalog writes remain isolated to each harness's user directory, and the installation-relative team seed is read-only.
10
+
11
+ Shell code cannot invoke a native question tool inside the agent's current turn. It may validate and plan data; the agent performs each planned native tool call and passes the responses back for normalization.
12
+
13
+ When no supported native question tool is advertised, concise free-text input is permitted only for one optionless question. Textual multiple-choice emulation is forbidden. Unsupported multi-select and all secret input fail explicitly rather than degrading silently.
14
+
15
+ Model discovery and catalog persistence remain separate from question planning. Current-turn tool availability is never inferred from model or harness configuration. Source-tree imports outside `skills/engineering` are unsupported until an installation-aware adapter entrypoint exists; consumers must not copy the runtime to work around that boundary.
@@ -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
+ }