@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,95 @@
1
+ import { test } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdirSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+
7
+ import {
8
+ applyInvocationPolicy,
9
+ clearInvocationPolicy,
10
+ MANUAL_ONLY,
11
+ manualOnlyPolicyFindings,
12
+ reconcileInvocationPolicy,
13
+ reviewedSourceInjections,
14
+ } from './invocation-policy.mjs';
15
+
16
+ const UPSTREAM_SKILL = `---
17
+ name: tdd
18
+ description: Test-driven development.
19
+ ---
20
+
21
+ # TDD
22
+ `;
23
+ const UPSTREAM_OPENAI = `interface:
24
+ display_name: "TDD"
25
+ short_description: "Test-driven red-green-refactor"
26
+ `;
27
+
28
+ function fixture() {
29
+ const root = mkdtempSync(join(tmpdir(), 'invocation-policy-'));
30
+ const skill = join(root, 'tdd');
31
+ mkdirSync(join(skill, 'agents'), { recursive: true });
32
+ writeFileSync(join(skill, 'SKILL.md'), UPSTREAM_SKILL);
33
+ writeFileSync(join(skill, 'agents', 'openai.yaml'), UPSTREAM_OPENAI);
34
+ return { root, skill };
35
+ }
36
+
37
+ test('manual-only policy is idempotent and preserves explicit invocation metadata', () => {
38
+ const { root, skill } = fixture();
39
+ const first = applyInvocationPolicy({ installName: 'tdd', policy: MANUAL_ONLY, skillsRoot: root });
40
+ const skillOnce = readFileSync(join(skill, 'SKILL.md'), 'utf8');
41
+ const openaiOnce = readFileSync(join(skill, 'agents', 'openai.yaml'), 'utf8');
42
+ const second = applyInvocationPolicy({ installName: 'tdd', policy: MANUAL_ONLY, skillsRoot: root });
43
+
44
+ assert.equal(first.changed, true);
45
+ assert.equal(second.changed, false);
46
+ assert.match(skillOnce, /^disable-model-invocation: true$/m);
47
+ assert.match(openaiOnce, /^policy:\n allow_implicit_invocation: false$/m);
48
+ assert.deepEqual(manualOnlyPolicyFindings(skill), []);
49
+ assert.equal(readFileSync(join(skill, 'SKILL.md'), 'utf8'), skillOnce);
50
+ assert.equal(readFileSync(join(skill, 'agents', 'openai.yaml'), 'utf8'), openaiOnce);
51
+ });
52
+
53
+ test('reviewed source injections remove only the deterministic runtime policy overlay', () => {
54
+ const { root, skill } = fixture();
55
+ applyInvocationPolicy({ installName: 'tdd', policy: MANUAL_ONLY, skillsRoot: root });
56
+ const injected = Object.fromEntries(reviewedSourceInjections(skill, MANUAL_ONLY)
57
+ .map((entry) => [entry.relativePath, entry.contents]));
58
+ assert.equal(injected['SKILL.md'], UPSTREAM_SKILL);
59
+ assert.equal(injected['agents/openai.yaml'], UPSTREAM_OPENAI);
60
+
61
+ const cleared = clearInvocationPolicy({ installName: 'tdd', policy: MANUAL_ONLY, skillsRoot: root });
62
+ assert.equal(cleared.changed, true);
63
+ assert.equal(readFileSync(join(skill, 'SKILL.md'), 'utf8'), UPSTREAM_SKILL);
64
+ assert.equal(readFileSync(join(skill, 'agents', 'openai.yaml'), 'utf8'), UPSTREAM_OPENAI);
65
+ assert.equal(clearInvocationPolicy({ installName: 'tdd', policy: MANUAL_ONLY, skillsRoot: root }).changed, false);
66
+ });
67
+
68
+ test('a missing selection defaults TDD to implicit invocation', () => {
69
+ const { root, skill } = fixture();
70
+ applyInvocationPolicy({ installName: 'tdd', policy: MANUAL_ONLY, skillsRoot: root });
71
+ const home = mkdtempSync(join(tmpdir(), 'invocation-policy-home-'));
72
+ const result = reconcileInvocationPolicy({
73
+ installName: 'tdd',
74
+ policy: MANUAL_ONLY,
75
+ skillsRoot: root,
76
+ env: { HOME: home },
77
+ });
78
+ assert.equal(result.policy, 'implicit');
79
+ assert.equal(result.changed, true);
80
+ assert.equal(readFileSync(join(skill, 'SKILL.md'), 'utf8'), UPSTREAM_SKILL);
81
+ assert.equal(readFileSync(join(skill, 'agents', 'openai.yaml'), 'utf8'), UPSTREAM_OPENAI);
82
+ });
83
+
84
+ test('policy application fails closed on malformed or missing skill metadata', () => {
85
+ const { root, skill } = fixture();
86
+ writeFileSync(join(skill, 'SKILL.md'), 'not frontmatter\n');
87
+ assert.throws(
88
+ () => applyInvocationPolicy({ installName: 'tdd', policy: MANUAL_ONLY, skillsRoot: root }),
89
+ /must begin with YAML frontmatter/,
90
+ );
91
+ assert.throws(
92
+ () => applyInvocationPolicy({ installName: '../tdd', policy: MANUAL_ONLY, skillsRoot: root }),
93
+ /invalid installed skill name/,
94
+ );
95
+ });
@@ -0,0 +1,79 @@
1
+ // The one ESM main-module guard every skill script in this repo uses.
2
+ //
3
+ // Not a style preference — the hand-written versions of this three-line check had two opposite
4
+ // silent failure modes in production, and both shipped:
5
+ //
6
+ // #718 `import.meta.url === pathToFileURL(process.argv[1]).href`
7
+ // Node resolves `import.meta.url` to the REAL path; `argv[1]` keeps whatever the caller
8
+ // typed. A skills install is a symlink farm (`~/.claude/skills/<skill>` → the checkout),
9
+ // so through the install path the two never match: the CLI does not run and node exits 0.
10
+ // `coverage-ledger.mjs` shipped this and recorded a false pass in the wild
11
+ // (a consumer product repo: epic #352, unit #379, PR #384) on a gate whose only job is to
12
+ // say no. Fails OPEN, invisibly — "passed" and "never ran" are byte-identical evidence.
13
+ //
14
+ // #446 `fs.realpathSync(process.argv[1]) === …`, unguarded.
15
+ // `node -` sets `argv[1]` to the literal string `"-"` — truthy, so the usual
16
+ // `process.argv[1] &&` prefix does not save it — and realpath throws ENOENT at MODULE
17
+ // LOAD, before a line of the module's own code runs. The module cannot be imported by
18
+ // anything that does not launch it as a file. Fails CLOSED, at load.
19
+ //
20
+ // So the contract has exactly two obligations, one per failure mode:
21
+ // 1. realpath BOTH sides before comparing, so a symlinked invocation is still the main module;
22
+ // 2. degrade to `false` — "not the main module" — for anything that does not resolve, never throw.
23
+ //
24
+ // WHY IT IS SHARED RATHER THAN COPIED. PR #278 fixed twelve copies of failure mode #718 by hand and
25
+ // mechanized nothing. Five weeks later `mergify/scripts/audit.mjs` was written with the pre-#278
26
+ // form, and `coverage-ledger.mjs` survived the whole pass because it spelled the same bug a third
27
+ // way that #278's grep did not match. One module plus `main-guard-hygiene.test.mjs` is what stops
28
+ // the next copy: there is now no second place for this logic to drift to, and adding one fails CI.
29
+ //
30
+ // WHERE IT LIVES, AND WHY HERE. Native Skills CLI installation flattens selected packages into
31
+ // sibling directories under `~/.agents/skills`, while this repository nests them under
32
+ // `skills/engineering`. A Workflow consumer at `<skill>/scripts` therefore imports
33
+ // `../../engineering-runtime/scripts/main-module.mjs`: the same specifier reaches this package in
34
+ // both layouts. Claude Code launches through a per-skill symlink into the canonical store; node's
35
+ // realpath-aware module resolution and this predicate preserve that path as well.
36
+ //
37
+ // `engineering-runtime` owns the helper as an installable support package rather than a user
38
+ // capability. Every consumer imports this package directly.
39
+ import fs from 'node:fs';
40
+ import { fileURLToPath } from 'node:url';
41
+
42
+ /**
43
+ * Is the module identified by `importMetaUrl` the script node was launched with?
44
+ *
45
+ * Symlink-transparent, and total: any input that does not resolve to a real file answers `false`
46
+ * instead of throwing, so importing a CLI module is always safe.
47
+ *
48
+ * @param {string} importMetaUrl the caller's own `import.meta.url`
49
+ * @returns {boolean}
50
+ */
51
+ export function isMainModule(importMetaUrl) {
52
+ const entry = process.argv[1];
53
+ if (typeof entry !== 'string' || entry === '') return false; // imported, or an embedding harness
54
+
55
+ let entryPath;
56
+ try {
57
+ entryPath = fs.realpathSync(entry);
58
+ } catch {
59
+ return false; // #446: `node -` gives "-"; some harnesses give a path that is not on disk
60
+ }
61
+
62
+ let selfPath;
63
+ try {
64
+ selfPath = fileURLToPath(importMetaUrl);
65
+ } catch {
66
+ return false; // a data:/http: module has no path to compare, so it is never the launched script
67
+ }
68
+ try {
69
+ // #718: the launched side is resolved above, so this side must be too. Under Node's default
70
+ // resolution `import.meta.url` is already real and this is a no-op; under `--preserve-symlinks`
71
+ // it is the half that makes the comparison hold.
72
+ selfPath = fs.realpathSync(selfPath);
73
+ } catch {
74
+ // The module is executing, so it existed a moment ago. Compare what we have rather than
75
+ // claiming "not main" — a vanished file should not silently disable a running CLI.
76
+ }
77
+
78
+ return entryPath === selfPath;
79
+ }
@@ -0,0 +1,288 @@
1
+ // Behaviour gate for the shared ESM main-module guard (issues #718 and #446).
2
+ //
3
+ // The two failure modes this pins are opposite halves of one idiom, and both are silent:
4
+ //
5
+ // #718 — comparing `import.meta.url` against an un-realpathed `process.argv[1]`. Node resolves
6
+ // `import.meta.url` to the REAL file; `argv[1]` keeps whatever the caller typed. Invoked
7
+ // through a symlink — which is exactly how every skills install works — the two never
8
+ // match, the CLI never runs, and node exits 0 having done nothing. On a gate whose job is
9
+ // to say *no*, "passed" and "never ran" produce byte-identical evidence.
10
+ // #446 — calling `fs.realpathSync(process.argv[1])` unguarded. `node -` sets `argv[1]` to the
11
+ // literal string `"-"`, which is truthy and is not a file, so realpath throws ENOENT at
12
+ // MODULE LOAD — before any of the module's own code runs. The module becomes unimportable
13
+ // by any consumer that does not launch it as a file.
14
+ //
15
+ // So the in-process predicate tests below are necessary but not sufficient: #446 is a *load-time*
16
+ // throw, which an in-process test cannot observe at all. Every claim that matters here is also
17
+ // driven through a real child process — a real temp symlink, a real `node -` on stdin, and the
18
+ // real `coverage-ledger.mjs` that #718 was filed against.
19
+ //
20
+ // Discovered and run by .github/workflows/ci.yml (every skills/**/*.test.mjs).
21
+ import { test } from 'node:test';
22
+ import assert from 'node:assert/strict';
23
+ import { execFileSync, spawnSync } from 'node:child_process';
24
+ import { cpSync, mkdtempSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
25
+ import { tmpdir } from 'node:os';
26
+ import { dirname, join } from 'node:path';
27
+ import { fileURLToPath, pathToFileURL } from 'node:url';
28
+
29
+ import { isMainModule } from './main-module.mjs';
30
+
31
+ const HERE = dirname(fileURLToPath(import.meta.url)); // skills/engineering/engineering-runtime/scripts
32
+ const SKILLS_DIR = dirname(dirname(dirname(HERE))); // skills/
33
+ const REPO = dirname(SKILLS_DIR);
34
+ const HELPER_URL = pathToFileURL(join(HERE, 'main-module.mjs')).href;
35
+
36
+ // Every child-process case builds its own scratch dir and removes it, so a failing run leaves
37
+ // nothing behind and two runs never share a symlink.
38
+ function withTmp(fn) {
39
+ const dir = mkdtempSync(join(tmpdir(), 'main-module-'));
40
+ try {
41
+ return fn(dir);
42
+ } finally {
43
+ rmSync(dir, { recursive: true, force: true });
44
+ }
45
+ }
46
+
47
+ // A minimal CLI with the exact shape every converted site has: import the helper, run the CLI only
48
+ // when the guard says this module is main, and exit with a distinctive code so "ran" and "did not
49
+ // run" cannot be confused with each other.
50
+ const FIXTURE_CLI = `
51
+ import { isMainModule } from ${JSON.stringify(HELPER_URL)};
52
+ export const marker = 'imported-cleanly';
53
+ if (isMainModule(import.meta.url)) {
54
+ console.log('CLI RAN');
55
+ process.exit(7);
56
+ }
57
+ `;
58
+
59
+ function runNode(args, opts = {}) {
60
+ const r = spawnSync(process.execPath, args, { encoding: 'utf8', ...opts });
61
+ return { status: r.status, stdout: r.stdout ?? '', stderr: r.stderr ?? '' };
62
+ }
63
+
64
+ // --- the predicate itself -------------------------------------------------------------------
65
+ // Restoring argv[1] rather than assigning a saved copy back blindly: `node --test` needs it, and a
66
+ // test that corrupted it would poison every later file in the same process.
67
+
68
+ function withArgv1(value, fn) {
69
+ const saved = process.argv[1];
70
+ if (value === undefined) delete process.argv[1];
71
+ else process.argv[1] = value;
72
+ try {
73
+ return fn();
74
+ } finally {
75
+ process.argv[1] = saved;
76
+ }
77
+ }
78
+
79
+ test('argv[1] absent → not main, and no throw (#446)', () => {
80
+ withArgv1(undefined, () => {
81
+ assert.equal(isMainModule(import.meta.url), false);
82
+ });
83
+ });
84
+
85
+ test('argv[1] set to a path that is not a real file → not main, and no throw (#446)', () => {
86
+ // `"-"` is not a hypothetical: it is literally what `node -` puts in argv[1].
87
+ for (const value of ['-', '', '/definitely/not/a/real/path.mjs', '[eval]']) {
88
+ withArgv1(value, () => {
89
+ assert.equal(isMainModule(import.meta.url), false, `argv[1]=${JSON.stringify(value)}`);
90
+ });
91
+ }
92
+ });
93
+
94
+ test('argv[1] is this module → main (AC7: the true branch still fires)', () => {
95
+ const self = fileURLToPath(import.meta.url);
96
+ withArgv1(self, () => {
97
+ assert.equal(isMainModule(import.meta.url), true);
98
+ });
99
+ });
100
+
101
+ test('argv[1] is a SYMLINK to this module → still main (#718)', () => {
102
+ withTmp((dir) => {
103
+ const link = join(dir, 'aliased-name.mjs');
104
+ symlinkSync(fileURLToPath(import.meta.url), link);
105
+ withArgv1(link, () => {
106
+ assert.equal(isMainModule(import.meta.url), true, 'a symlinked invocation is the main module');
107
+ });
108
+ // The pre-fix predicate is what this must not degrade back into. Stated as an executable
109
+ // contrast so the assertion above cannot be satisfied by an implementation that happens to
110
+ // compare raw strings on a machine where nothing is symlinked.
111
+ assert.notEqual(pathToFileURL(link).href, import.meta.url, 'the naive comparison would be false here');
112
+ });
113
+ });
114
+
115
+ test('argv[1] is a different real file → not main', () => {
116
+ withArgv1(join(REPO, 'CLAUDE.md'), () => {
117
+ assert.equal(isMainModule(import.meta.url), false);
118
+ });
119
+ });
120
+
121
+ test('a non-file import.meta.url → not main, and no throw', () => {
122
+ withArgv1(fileURLToPath(import.meta.url), () => {
123
+ assert.equal(isMainModule('data:text/javascript,export{}'), false);
124
+ });
125
+ });
126
+
127
+ // --- real child processes -------------------------------------------------------------------
128
+
129
+ test('a CLI invoked through a symlink runs, byte-identically to a direct invocation (#718)', () => {
130
+ withTmp((dir) => {
131
+ const real = join(dir, 'real-cli.mjs');
132
+ const link = join(dir, 'installed-cli.mjs');
133
+ writeFileSync(real, FIXTURE_CLI);
134
+ symlinkSync(real, link);
135
+
136
+ const direct = runNode([real]);
137
+ const viaLink = runNode([link]);
138
+
139
+ assert.equal(direct.stdout.trim(), 'CLI RAN');
140
+ assert.equal(direct.status, 7);
141
+ assert.deepEqual(
142
+ { stdout: viaLink.stdout, status: viaLink.status },
143
+ { stdout: direct.stdout, status: direct.status },
144
+ `the symlinked invocation must produce the same output and exit code.\nstderr:\n${viaLink.stderr}`,
145
+ );
146
+ });
147
+ });
148
+
149
+ test('a directory symlink — the actual skills-install shape — resolves too (#718)', () => {
150
+ withTmp((dir) => {
151
+ // ~/.claude/skills/<skill> is a symlink to the skill DIRECTORY, not to each script, so the
152
+ // symlink sits in the middle of the path rather than at its end.
153
+ const skill = join(dir, 'real-skill');
154
+ mkdirSync(join(skill, 'scripts'), { recursive: true });
155
+ const script = join(skill, 'scripts', 'cli.mjs');
156
+ writeFileSync(script, FIXTURE_CLI);
157
+ const installed = join(dir, 'installed-skill');
158
+ symlinkSync(skill, installed);
159
+
160
+ const viaDir = runNode([join(installed, 'scripts', 'cli.mjs')]);
161
+ assert.equal(viaDir.stdout.trim(), 'CLI RAN', `stderr:\n${viaDir.stderr}`);
162
+ assert.equal(viaDir.status, 7);
163
+ });
164
+ });
165
+
166
+ test('`node -` can import a module that uses the guard, without throwing at load (#446, AC8)', () => {
167
+ withTmp((dir) => {
168
+ const mod = join(dir, 'cli.mjs');
169
+ writeFileSync(mod, FIXTURE_CLI);
170
+ // Reading the program from stdin is the case that sets argv[1] to the literal "-". This is the
171
+ // invocation that threw ENOENT at module load before the fix, so it is run as a real child
172
+ // process — an in-process test cannot observe a load-time throw.
173
+ const r = runNode(['-'], {
174
+ input: `const m = await import(${JSON.stringify(pathToFileURL(mod).href)});\nconsole.log(m.marker);\n`,
175
+ });
176
+ assert.equal(r.status, 0, `import under \`node -\` must not throw.\nstderr:\n${r.stderr}`);
177
+ assert.equal(r.stdout.trim(), 'imported-cleanly');
178
+ assert.ok(!r.stdout.includes('CLI RAN'), 'an imported module must not execute its CLI');
179
+ });
180
+ });
181
+
182
+ test('argv[1] set to a nonexistent path does not stop a module from loading (#446)', () => {
183
+ withTmp((dir) => {
184
+ const mod = join(dir, 'cli.mjs');
185
+ writeFileSync(mod, FIXTURE_CLI);
186
+ const driver = join(dir, 'driver.mjs');
187
+ writeFileSync(
188
+ driver,
189
+ `process.argv[1] = '/no/such/file.mjs';\n` +
190
+ `const m = await import(${JSON.stringify(pathToFileURL(mod).href)});\n` +
191
+ `console.log(m.marker);\n`,
192
+ );
193
+ const r = runNode([driver]);
194
+ assert.equal(r.status, 0, `stderr:\n${r.stderr}`);
195
+ assert.equal(r.stdout.trim(), 'imported-cleanly');
196
+ });
197
+ });
198
+
199
+ // --- the real script #718 was filed against ---------------------------------------------------
200
+
201
+ test('coverage-ledger.mjs: symlinked and direct invocations agree (#718 AC1)', () => {
202
+ withTmp((dir) => {
203
+ // A scratch cwd with no surface inventory, so the honest answer is a deterministic failure —
204
+ // exit 2 — rather than a pass. That is the whole point of the issue: before the fix the
205
+ // symlinked run printed nothing and exited 0, which is indistinguishable from success.
206
+ const cwd = join(dir, 'workdir');
207
+ mkdirSync(cwd);
208
+ const skill = join(SKILLS_DIR, 'engineering', 'ensure-coverage');
209
+ const installed = join(dir, 'ensure-coverage');
210
+ symlinkSync(skill, installed);
211
+
212
+ const argsFor = (root) => [join(root, 'scripts', 'coverage-ledger.mjs'), 'validate'];
213
+ const direct = runNode(argsFor(skill), { cwd });
214
+ const viaLink = runNode(argsFor(installed), { cwd });
215
+
216
+ assert.equal(direct.status, 2, `expected the honest failure, got:\n${direct.stdout}${direct.stderr}`);
217
+ assert.match(direct.stderr, /Inventory not found/);
218
+ assert.deepEqual(
219
+ { status: viaLink.status, stdout: viaLink.stdout, stderr: viaLink.stderr },
220
+ { status: direct.status, stdout: direct.stdout, stderr: direct.stderr },
221
+ 'a symlinked coverage-ledger must not silently no-op and exit 0',
222
+ );
223
+ });
224
+ });
225
+
226
+ test('flat installation and Claude skill symlink preserve direct launch and import behavior', () => {
227
+ withTmp((dir) => {
228
+ const canonical = join(dir, '.agents', 'skills');
229
+ const claude = join(dir, '.claude', 'skills');
230
+ const sourceEngineering = join(SKILLS_DIR, 'engineering');
231
+ mkdirSync(canonical, { recursive: true });
232
+ mkdirSync(claude, { recursive: true });
233
+ cpSync(join(sourceEngineering, 'ensure-coverage'), join(canonical, 'ensure-coverage'), { recursive: true });
234
+ cpSync(join(sourceEngineering, 'engineering-runtime'), join(canonical, 'engineering-runtime'), { recursive: true });
235
+ symlinkSync(join(canonical, 'ensure-coverage'), join(claude, 'ensure-coverage'));
236
+ symlinkSync(join(canonical, 'engineering-runtime'), join(claude, 'engineering-runtime'));
237
+
238
+ const cwd = join(dir, 'workdir');
239
+ mkdirSync(cwd);
240
+ const directScript = join(canonical, 'ensure-coverage', 'scripts', 'coverage-ledger.mjs');
241
+ const claudeScript = join(claude, 'ensure-coverage', 'scripts', 'coverage-ledger.mjs');
242
+ const direct = runNode([directScript, 'validate'], { cwd });
243
+ const viaClaude = runNode([claudeScript, 'validate'], { cwd });
244
+
245
+ assert.equal(direct.status, 2, `the installed CLI must reach its honest failure:\n${direct.stderr}`);
246
+ assert.match(direct.stderr, /Inventory not found/);
247
+ assert.deepEqual(
248
+ { status: viaClaude.status, stdout: viaClaude.stdout, stderr: viaClaude.stderr },
249
+ { status: direct.status, stdout: direct.stdout, stderr: direct.stderr },
250
+ 'Claude symlink launch must preserve installed CLI output and exit status',
251
+ );
252
+
253
+ const imported = runNode(['-'], {
254
+ cwd,
255
+ input: `await import(${JSON.stringify(pathToFileURL(directScript).href)});\nconsole.log('IMPORTED');\n`,
256
+ });
257
+ assert.equal(imported.status, 0, `a flat-installed Workflow module must import under non-file argv:\n${imported.stderr}`);
258
+ assert.equal(imported.stdout.trim(), 'IMPORTED');
259
+ });
260
+ });
261
+
262
+ // --- the whole converted class, not just the fixture -------------------------------------------
263
+
264
+ test('every script that adopted the guard is importable with argv[1] = "-" (#446 AC6/AC8)', () => {
265
+ // The class, executed. `grep` for the helper import, then import all of them in one child whose
266
+ // argv[1] is the literal "-": before the fix this is precisely the invocation that threw ENOENT
267
+ // at load, so a regression at ANY single site turns this red without anyone maintaining a list.
268
+ const listed = execFileSync(
269
+ 'git',
270
+ ['grep', '-l', '--', 'main-module.mjs', ':(exclude)skills/engineering/engineering-runtime', 'skills'],
271
+ { cwd: REPO, encoding: 'utf8' },
272
+ )
273
+ .split('\n')
274
+ .filter((p) => p.endsWith('.mjs') && !p.endsWith('.test.mjs'));
275
+
276
+ assert.ok(listed.length >= 30, `expected the converted class to be found, got ${listed.length}`);
277
+
278
+ const program = listed
279
+ .map((p) => `await import(${JSON.stringify(pathToFileURL(join(REPO, p)).href)});`)
280
+ .join('\n');
281
+ const r = runNode(['-'], { input: `${program}\nconsole.log('ALL IMPORTED');\n`, cwd: REPO });
282
+ assert.equal(
283
+ r.status,
284
+ 0,
285
+ `importing the converted scripts under \`node -\` must not throw.\nstderr:\n${r.stderr}`,
286
+ );
287
+ assert.match(r.stdout, /ALL IMPORTED/);
288
+ });
@@ -0,0 +1,11 @@
1
+ import { DEFAULT_SCHEMA, load } from "js-yaml"
2
+
3
+ export function parseMergifyYaml(yaml) {
4
+ try {
5
+ const value = load(String(yaml || ""), { schema: DEFAULT_SCHEMA, json: false })
6
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("Mergify YAML root must be a mapping")
7
+ return value
8
+ } catch (error) {
9
+ throw new Error(`Mergify YAML structural parse failed closed: ${String(error.message || error).trim()}`)
10
+ }
11
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "engineering-runtime",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "engineering-runtime",
9
+ "version": "1.0.0",
10
+ "dependencies": {
11
+ "js-yaml": "4.3.1"
12
+ }
13
+ },
14
+ "node_modules/argparse": {
15
+ "version": "2.0.1",
16
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
17
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
18
+ "license": "Python-2.0"
19
+ },
20
+ "node_modules/js-yaml": {
21
+ "version": "4.3.1",
22
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.3.1.tgz",
23
+ "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==",
24
+ "funding": [
25
+ {
26
+ "type": "github",
27
+ "url": "https://github.com/sponsors/puzrin"
28
+ },
29
+ {
30
+ "type": "github",
31
+ "url": "https://github.com/sponsors/nodeca"
32
+ }
33
+ ],
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "argparse": "^2.0.1"
37
+ },
38
+ "bin": {
39
+ "js-yaml": "bin/js-yaml.js"
40
+ }
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "engineering-runtime",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "description": "Engineering Workflow runtime dependency closure",
7
+ "dependencies": {
8
+ "js-yaml": "4.3.1"
9
+ }
10
+ }