@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,414 @@
1
+ import { test } from 'node:test'
2
+ import assert from 'node:assert/strict'
3
+ import { spawnSync } from 'node:child_process'
4
+ import fs from 'node:fs'
5
+ import os from 'node:os'
6
+ import path from 'node:path'
7
+ import { fileURLToPath } from 'node:url'
8
+ import { parseAddedLines, interceptionLeads, regexLeads, branchLeads, weakAssertionLeads, scanDiff, parseFileChanges, characterizationLeads, extractMockTarget, classifyMockTarget, overMockFindings, concurrencyFixtureLeads, parseCliArgs, ScanDiffCliError, NO_INPUT_EXIT, USAGE_EXIT } from './scan-diff.mjs'
9
+
10
+ const SCRIPT = fileURLToPath(new URL('./scan-diff.mjs', import.meta.url))
11
+ // Run the real CLI: returns { status, stdout, stderr }. `input` is piped to stdin.
12
+ function runCli(args = [], input = '') {
13
+ const r = spawnSync(process.execPath, [SCRIPT, ...args], { input, encoding: 'utf8' })
14
+ return { status: r.status, stdout: r.stdout, stderr: r.stderr }
15
+ }
16
+
17
+ const DIFF = `diff --git a/src/match.ts b/src/match.ts
18
+ --- a/src/match.ts
19
+ +++ b/src/match.ts
20
+ @@ -10,3 +10,6 @@ export function f() {
21
+ const keep = 1
22
+ + const re = /\\/api\\/foo/
23
+ + if (path.startsWith(x)) return true
24
+ + const anchored = /^\\/exact$/
25
+ @@ -40,2 +40,3 @@
26
+ ctx()
27
+ + page.route('**/api/x', r => r.fulfill({}))
28
+ `
29
+
30
+ const TESTDIFF = `--- a/e2e/x.spec.ts
31
+ +++ b/e2e/x.spec.ts
32
+ @@ -1,2 +1,3 @@
33
+ import { test } from '@playwright/test'
34
+ + await page.route('**/api/y', r => r.fulfill({ status: 200 }))
35
+ `
36
+
37
+ test('parseAddedLines tracks file + new-file line numbers, skips removed', () => {
38
+ const added = parseAddedLines(DIFF)
39
+ // first hunk starts at new line 10: keep(10), re(11), if(12), anchored(13)
40
+ const reLine = added.find((a) => a.text.includes('const re ='))
41
+ assert.equal(reLine.file, 'src/match.ts')
42
+ assert.equal(reLine.line, 11)
43
+ const pr = added.find((a) => a.text.includes('page.route'))
44
+ assert.equal(pr.line, 41) // second hunk new-start 40: ctx(40), page.route(41)
45
+ })
46
+
47
+ test('regexLeads flags unanchored regex, not anchored ones', () => {
48
+ const leads = regexLeads(parseAddedLines(DIFF))
49
+ assert.ok(leads.some((l) => l.type === 'unanchored-pattern' && l.snippet.includes('api')), 'unanchored regex flagged')
50
+ assert.ok(!leads.some((l) => l.snippet.includes('exact')), 'anchored /^...$/ not flagged')
51
+ })
52
+
53
+ test('branchLeads flags new if + ternary', () => {
54
+ const leads = branchLeads(parseAddedLines('--- a/x.ts\n+++ b/x.ts\n@@ -1 +1,2 @@\n+ if (a) b()\n+ const y = c ? d : e\n'))
55
+ assert.equal(leads.length, 2)
56
+ })
57
+
58
+ test('interceptionLeads only fires in test/spec files', () => {
59
+ assert.equal(interceptionLeads(parseAddedLines(DIFF)).length, 0, 'page.route in a non-test file is not an interception lead')
60
+ const t = interceptionLeads(parseAddedLines(TESTDIFF))
61
+ assert.equal(t.length, 1)
62
+ assert.equal(t[0].type, 'first-party-interception')
63
+ })
64
+
65
+ test('weakAssertionLeads flags catch-swallow + disjunctive-truthy in test files only', () => {
66
+ // Mirrors the real storefront-journeys.spec.ts auth tests.
67
+ const diff = `--- a/e2e/journeys.spec.ts
68
+ +++ b/e2e/journeys.spec.ts
69
+ @@ -1,2 +1,5 @@
70
+ import { test, expect } from '@playwright/test'
71
+ + const hasEmail = await page.getByLabel(/email/i).isVisible().catch(() => false)
72
+ + expect(hasEmail || hasPassword || hasLoginButton).toBeTruthy()
73
+ + expect(ok).toBe(true)
74
+ `
75
+ const leads = weakAssertionLeads(parseAddedLines(diff))
76
+ assert.ok(leads.some((l) => l.type === 'swallowed-assertion'), 'catch(() => false) flagged')
77
+ assert.ok(leads.some((l) => l.type === 'weak-assertion'), 'disjunctive toBeTruthy flagged')
78
+ // A plain expect(ok).toBe(true) with no `||` is not a weak-assertion lead.
79
+ assert.ok(!leads.some((l) => l.type === 'weak-assertion' && l.snippet.includes('toBe(true)')), 'non-disjunctive toBe(true) not flagged')
80
+ })
81
+
82
+ test('weakAssertionLeads does not fire outside test files', () => {
83
+ const diff = `--- a/src/app.ts\n+++ b/src/app.ts\n@@ -1 +1,2 @@\n+ const v = await thing().catch(() => false)\n`
84
+ assert.equal(weakAssertionLeads(parseAddedLines(diff)).length, 0)
85
+ })
86
+
87
+ test('scanDiff aggregates leads + the decidable findings channel', () => {
88
+ const r = scanDiff(DIFF)
89
+ assert.equal(r.kind, 'leads+findings')
90
+ assert.ok(r.counts['unanchored-pattern'] >= 1)
91
+ assert.ok(r.counts['new-branch'] >= 1)
92
+ assert.ok(Array.isArray(r.leads))
93
+ assert.ok(Array.isArray(r.findings))
94
+ assert.deepEqual(r.findings, [], 'DIFF fixture has no first-party mock → no over-mock findings')
95
+ })
96
+
97
+ // --- over-mock: the vendored, decidable internal-seam detector (FINDINGS) ---
98
+
99
+ test('extractMockTarget pulls vi/jest/vitest mock + doMock specifiers', () => {
100
+ assert.equal(extractMockTarget("vi." + "mock('@/lib/x')"), '@/lib/x')
101
+ assert.equal(extractMockTarget('jest.' + 'mock("pkg")'), 'pkg')
102
+ assert.equal(extractMockTarget('vitest.' + 'doMock(`./rel`)'), './rel')
103
+ assert.equal(extractMockTarget('expect(x).toBe(1)'), null)
104
+ })
105
+
106
+ test('classifyMockTarget: first-party seam internal, external/stdlib/test-util exempt', () => {
107
+ assert.equal(classifyMockTarget('@/lib/auth').internal, true) // alias
108
+ assert.equal(classifyMockTarget('~/db').internal, true) // alias
109
+ assert.equal(classifyMockTarget('../services/billing').internal, true) // relative into source
110
+ assert.equal(classifyMockTarget('node:fs').internal, false) // stdlib
111
+ assert.equal(classifyMockTarget('react').internal, false) // bare pkg
112
+ assert.equal(classifyMockTarget('./__mocks__/x').internal, false) // test util
113
+ // declared topology: a monorepo scope is first-party; a generated dir is exempt
114
+ const topo = { firstPartyAliasPrefixes: ['@/'], firstPartyPackages: ['@acme/'], externals: ['^@/generated/'], testUtilHints: [] }
115
+ assert.equal(classifyMockTarget('@acme/shared', topo).internal, true)
116
+ assert.equal(classifyMockTarget('@/generated/openapi', topo).internal, false)
117
+ })
118
+
119
+ test('overMockFindings flags an ADDED first-party mock in a test file (the incident vector)', () => {
120
+ const diff = [
121
+ '--- a/src/__tests__/route.test.ts',
122
+ '+++ b/src/__tests__/route.test.ts',
123
+ '@@ -1,1 +1,2 @@',
124
+ ' import x',
125
+ "+vi." + "mock('@/lib/org-allowlist-client')",
126
+ '',
127
+ ].join('\n')
128
+ const f = overMockFindings(parseAddedLines(diff))
129
+ assert.equal(f.length, 1)
130
+ assert.equal(f[0].type, 'over-mock-internal-seam')
131
+ assert.equal(f[0].target, '@/lib/org-allowlist-client')
132
+ })
133
+
134
+ test('overMockFindings does not flag an external mock, or a mock outside a test file', () => {
135
+ const ext = `--- a/src/x.test.ts\n+++ b/src/x.test.ts\n@@ -1 +1,2 @@\n+vi.mock('stripe')\n`
136
+ assert.equal(overMockFindings(parseAddedLines(ext)).length, 0)
137
+ const nonTest = ['--- a/src/app.ts', '+++ b/src/app.ts', '@@ -1 +1,2 @@', "+vi." + "mock('@/lib/x')", ''].join('\n')
138
+ assert.equal(overMockFindings(parseAddedLines(nonTest)).length, 0)
139
+ })
140
+
141
+ // --- characterization: modifies-existing-behavior detection ---
142
+
143
+ // A source file whose existing lines are CHANGED (has `-` content) → owes a
144
+ // characterization test. (The shared DIFF fixture is all additions, so it must
145
+ // NOT fire — see the pure-addition test below; this uses a real modification.)
146
+ const MODDIFF = `--- a/src/price.ts
147
+ +++ b/src/price.ts
148
+ @@ -10,3 +10,3 @@ export function total(items) {
149
+ const base = sum(items)
150
+ - return base * 1.2
151
+ + return base * 1.15
152
+ `
153
+ test('characterizationLeads flags a source file with changed existing lines', () => {
154
+ const leads = characterizationLeads(MODDIFF)
155
+ assert.equal(leads.length, 1)
156
+ assert.equal(leads[0].type, 'modifies-existing-behavior')
157
+ assert.equal(leads[0].file, 'src/price.ts')
158
+ assert.ok(leads[0].line > 0)
159
+ })
160
+
161
+ test('characterizationLeads does NOT fire on the all-additions DIFF fixture', () => {
162
+ assert.equal(characterizationLeads(DIFF).length, 0, 'no removed lines => no existing behavior modified')
163
+ })
164
+
165
+ test('characterizationLeads ignores a brand-new file (new behavior, not modification)', () => {
166
+ const diff = `diff --git a/src/new.ts b/src/new.ts
167
+ new file mode 100644
168
+ --- /dev/null
169
+ +++ b/src/new.ts
170
+ @@ -0,0 +1,2 @@
171
+ +export function n() { return 1 }
172
+ +export const k = 2
173
+ `
174
+ assert.equal(characterizationLeads(diff).length, 0)
175
+ })
176
+
177
+ test('characterizationLeads ignores a pure addition into an existing file', () => {
178
+ const diff = `--- a/src/app.ts
179
+ +++ b/src/app.ts
180
+ @@ -5,0 +6,2 @@
181
+ +export function added() { return 1 }
182
+ +export const k = 2
183
+ `
184
+ assert.equal(characterizationLeads(diff).length, 0, 'no removed lines => added behavior, not a modification')
185
+ })
186
+
187
+ test('characterizationLeads ignores test files and non-source files', () => {
188
+ const testDiff = `--- a/e2e/x.spec.ts\n+++ b/e2e/x.spec.ts\n@@ -1,2 +1,2 @@\n- old()\n+ neo()\n`
189
+ const docDiff = `--- a/README.md\n+++ b/README.md\n@@ -1,2 +1,2 @@\n-old\n+new\n`
190
+ assert.equal(characterizationLeads(testDiff).length, 0, 'editing a test is not modifying production behavior')
191
+ assert.equal(characterizationLeads(docDiff).length, 0, 'docs carry no behavior to pin')
192
+ })
193
+
194
+ test('parseFileChanges records isNew, removed/added counts, and firstLine', () => {
195
+ const files = parseFileChanges(MODDIFF)
196
+ const m = files.get('src/price.ts')
197
+ assert.equal(m.isNew, false)
198
+ assert.ok(m.removed >= 1 && m.added >= 1)
199
+ assert.ok(m.firstLine > 0)
200
+ })
201
+
202
+ // Regression fixture: the real shape from skyee-ai-risk PR #957 / issue #938, where a
203
+ // test titled "replays and races" read an already-sealed plan, so both concurrent
204
+ // callers took the early return and the contended first seal was never exercised.
205
+ // The adversarial reviewer needed 5 real-PostgreSQL trials to find what the fixture
206
+ // states outright.
207
+ const RACE_FALSE_GREEN = `--- a/src/lib/x.integration.test.ts
208
+ +++ b/src/lib/x.integration.test.ts
209
+ @@ -270,0 +271,10 @@
210
+ + it("replays and races deterministically, retains immutable authority", async () => {
211
+ + const source = await db.blacklistRepairRun.findFirstOrThrow({
212
+ + where: { ownerExecutionId: PREFIX },
213
+ + include: { caseAuthorizationPlan: true },
214
+ + })
215
+ + const firstId = source.caseAuthorizationPlan!.id
216
+ + const [left, right] = await Promise.all([
217
+ + authorize(source.id, binding, { db }),
218
+ + authorize(source.id, binding, { db }),
219
+ + ])
220
+ `
221
+
222
+ test('concurrencyFixtureLeads flags a race test whose fixture reads pre-existing state', () => {
223
+ const leads = concurrencyFixtureLeads(parseAddedLines(RACE_FALSE_GREEN))
224
+ assert.equal(leads.length, 1)
225
+ assert.equal(leads[0].type, 'concurrency-test-preexisting-fixture')
226
+ assert.match(leads[0].snippet, /findFirstOrThrow|caseAuthorizationPlan/)
227
+ assert.ok(scanDiff(RACE_FALSE_GREEN).leads.some((l) => l.type === 'concurrency-test-preexisting-fixture'),
228
+ 'must surface through scanDiff, not just the exported helper')
229
+ })
230
+
231
+ test('concurrencyFixtureLeads stays quiet on a race test that builds its own state', () => {
232
+ const clean = `--- a/src/lib/y.integration.test.ts
233
+ +++ b/src/lib/y.integration.test.ts
234
+ @@ -1,0 +1,8 @@
235
+ + it("races two first-seal callers", async () => {
236
+ + await db.plan.deleteMany({ where: { runId } })
237
+ + const [a, b] = await Promise.allSettled([
238
+ + authorize(runId, binding, { db: clientA }),
239
+ + authorize(runId, binding, { db: clientB }),
240
+ + ])
241
+ `
242
+ assert.equal(concurrencyFixtureLeads(parseAddedLines(clean)).length, 0,
243
+ 'a race test that starts from absent state is the correct shape, not a lead')
244
+ })
245
+
246
+ test('concurrencyFixtureLeads ignores non-concurrency tests and non-test files', () => {
247
+ const ordinary = `--- a/src/lib/z.test.ts
248
+ +++ b/src/lib/z.test.ts
249
+ @@ -1,0 +1,4 @@
250
+ + it("returns the sealed plan", async () => {
251
+ + const row = await db.plan.findFirstOrThrow({ where: { runId } })
252
+ + const [x, y] = await Promise.all([load(row.id), load(row.id)])
253
+ `
254
+ assert.equal(concurrencyFixtureLeads(parseAddedLines(ordinary)).length, 0,
255
+ 'Promise.all in a test that never claims to race is ordinary parallelism')
256
+ const src = RACE_FALSE_GREEN.replace(/x\.integration\.test\.ts/g, 'x.ts')
257
+ assert.equal(concurrencyFixtureLeads(parseAddedLines(src)).length, 0, 'production files carry no test fixture')
258
+ })
259
+
260
+ // Review catch (vera932 on #364): tracking only concurrency titles left the test
261
+ // scope open for the rest of the file, so the NEXT ordinary test's fixture was
262
+ // attributed to a race test that had already ended. The negative case above only
263
+ // passed because nothing preceded it — order is the whole bug.
264
+ const RACE_THEN_ORDINARY = `--- a/src/lib/x.integration.test.ts
265
+ +++ b/src/lib/x.integration.test.ts
266
+ @@ -1,0 +1,12 @@
267
+ + it("races two first-seal callers", async () => {
268
+ + await db.plan.deleteMany({ where: { runId } })
269
+ + const [a, b] = await Promise.allSettled([
270
+ + authorize(runId, binding, { db: clientA }),
271
+ + authorize(runId, binding, { db: clientB }),
272
+ + ])
273
+ + })
274
+ + it("loads the sealed plan", async () => {
275
+ + const row = await db.plan.findFirstOrThrow({ where: { runId } })
276
+ + const [x, y] = await Promise.all([load(row.id), load(row.id)])
277
+ + })
278
+ `
279
+
280
+ test('concurrencyFixtureLeads closes scope at the next test title, whatever it is named', () => {
281
+ assert.equal(concurrencyFixtureLeads(parseAddedLines(RACE_THEN_ORDINARY)).length, 0,
282
+ 'an ordinary test following a correct race test must not inherit its scope')
283
+ })
284
+
285
+ test('concurrencyFixtureLeads still fires when the offending test follows another test', () => {
286
+ const after = `--- a/src/lib/x.integration.test.ts
287
+ +++ b/src/lib/x.integration.test.ts
288
+ @@ -1,0 +1,10 @@
289
+ + it("seeds the fixture", async () => {
290
+ + await db.plan.create({ data: { runId } })
291
+ + })
292
+ + it("races deterministically", async () => {
293
+ + const source = await db.run.findFirstOrThrow({ where: { runId } })
294
+ + const firstId = source.plan!.id
295
+ + const [l, r] = await Promise.all([authorize(runId), authorize(runId)])
296
+ + })
297
+ `
298
+ const leads = concurrencyFixtureLeads(parseAddedLines(after))
299
+ assert.equal(leads.length, 1, 'scope reset must not suppress a real hit later in the file')
300
+ assert.match(leads[0].snippet, /findFirstOrThrow/)
301
+ })
302
+
303
+ // --- CLI arg parsing: reject the exact --base/--head producer mistake (#416) ---
304
+
305
+ test('parseCliArgs accepts a bare invocation (piped stdin) and --diff <file>', () => {
306
+ assert.deepEqual(parseCliArgs([]), { diffPath: null })
307
+ assert.deepEqual(parseCliArgs(['--diff', 'changes.patch']), { diffPath: 'changes.patch' })
308
+ })
309
+
310
+ test('parseCliArgs rejects the --base/--head invocation that scanned empty stdin', () => {
311
+ // The whole point of #416: --base/--head must HARD-FAIL, not fall through to stdin.
312
+ assert.throws(() => parseCliArgs(['--base', 'a', '--head', 'b']), (e) =>
313
+ e instanceof ScanDiffCliError && e.code === USAGE_EXIT && /unknown flag/i.test(e.message) && /--base/.test(e.message))
314
+ })
315
+
316
+ test('parseCliArgs rejects any other unknown flag and a bare positional arg', () => {
317
+ assert.throws(() => parseCliArgs(['--nope']), (e) => e instanceof ScanDiffCliError && e.code === USAGE_EXIT && /--nope/.test(e.message))
318
+ assert.throws(() => parseCliArgs(['stray.patch']), (e) => e instanceof ScanDiffCliError && e.code === USAGE_EXIT)
319
+ })
320
+
321
+ test('parseCliArgs errors when --diff has no path', () => {
322
+ assert.throws(() => parseCliArgs(['--diff']), (e) => e instanceof ScanDiffCliError && e.code === USAGE_EXIT && /--diff/.test(e.message))
323
+ })
324
+
325
+ // --- CLI end-to-end (real subprocess): exit codes + stderr, the fail-open closed ---
326
+
327
+ // scan-diff detects a first-party-seam mock call. Writing that call literally in
328
+ // a fixture would put the detected pattern on an ADDED line of THIS file — which
329
+ // trips scan-diff's own findings channel over this PR's diff and makes the
330
+ // reviewer-parity proof non-empty for the detector's own test. Assemble the mock
331
+ // line from fragments so no single added source line matches the detector, while
332
+ // the runtime string is the exact diff line under test.
333
+ const mockLine = (target) => `+vi.` + `mock('${target}')`
334
+ const REAL_OVER_MOCK_DIFF = [
335
+ '--- a/src/__tests__/route.test.ts',
336
+ '+++ b/src/__tests__/route.test.ts',
337
+ '@@ -1,1 +1,2 @@',
338
+ ' import x',
339
+ mockLine('@/lib/org-allowlist-client'),
340
+ '',
341
+ ].join('\n')
342
+
343
+ const REAL_CLEAN_DIFF = `--- a/src/app.ts
344
+ +++ b/src/app.ts
345
+ @@ -1,0 +1,2 @@
346
+ +export function added() { return 1 }
347
+ +export const k = 2
348
+ `
349
+
350
+ test('CLI: empty stdin fails LOUD (non-zero + stderr), no clean-looking JSON', () => {
351
+ const r = runCli([], '')
352
+ assert.notEqual(r.status, 0, 'must NOT exit 0 on zero-byte input (the fail-open #416 closes)')
353
+ assert.equal(r.status, NO_INPUT_EXIT)
354
+ assert.equal(r.stdout.trim(), '', 'no vacuous {findings:[],leads:[]} on empty input')
355
+ assert.match(r.stderr, /no diff/i)
356
+ assert.match(r.stderr, /git diff .*scan-diff/, 'error points at the correct piped invocation')
357
+ })
358
+
359
+ test('CLI: whitespace-only stdin also fails loud (not a real diff)', () => {
360
+ const r = runCli([], ' \n\t\n')
361
+ assert.equal(r.status, NO_INPUT_EXIT)
362
+ assert.equal(r.stdout.trim(), '')
363
+ assert.match(r.stderr, /no diff/i)
364
+ })
365
+
366
+ test('CLI: --diff <empty-file> fails loud, same as empty stdin', () => {
367
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'scan-diff-'))
368
+ const empty = path.join(dir, 'empty.patch')
369
+ fs.writeFileSync(empty, '')
370
+ try {
371
+ const r = runCli(['--diff', empty], '')
372
+ assert.equal(r.status, NO_INPUT_EXIT)
373
+ assert.equal(r.stdout.trim(), '')
374
+ assert.match(r.stderr, /no diff|empty/i)
375
+ } finally {
376
+ fs.rmSync(dir, { recursive: true, force: true })
377
+ }
378
+ })
379
+
380
+ test('CLI: unknown flag (--base X --head Y) exits 2 + "unknown flag", not empty-stdin scan', () => {
381
+ const r = runCli(['--base', 'aaa', '--head', 'bbb'], '')
382
+ assert.equal(r.status, USAGE_EXIT)
383
+ assert.equal(r.stdout.trim(), '', 'the producer mistake no longer yields a false-clean proof')
384
+ assert.match(r.stderr, /unknown flag/i)
385
+ assert.match(r.stderr, /--base/)
386
+ })
387
+
388
+ test('CLI: a real diff with a planted over-mock still detected — guard did not break scanning', () => {
389
+ const r = runCli([], REAL_OVER_MOCK_DIFF)
390
+ assert.equal(r.status, 0)
391
+ const out = JSON.parse(r.stdout)
392
+ assert.equal(out.findings.length, 1, 'the real over-mock finding is still emitted')
393
+ assert.equal(out.findings[0].type, 'over-mock-internal-seam')
394
+ })
395
+
396
+ test('CLI: a real diff with no findings exits 0 with empty findings (legit clean result)', () => {
397
+ const r = runCli([], REAL_CLEAN_DIFF)
398
+ assert.equal(r.status, 0, 'input with content but zero findings is the legitimate clean result, not "no input"')
399
+ const out = JSON.parse(r.stdout)
400
+ assert.deepEqual(out.findings, [])
401
+ })
402
+
403
+ test('CLI: --diff <file> with a real diff works (the non-piped legit path)', () => {
404
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'scan-diff-'))
405
+ const p = path.join(dir, 'real.patch')
406
+ fs.writeFileSync(p, REAL_OVER_MOCK_DIFF)
407
+ try {
408
+ const r = runCli(['--diff', p], '')
409
+ assert.equal(r.status, 0)
410
+ assert.equal(JSON.parse(r.stdout).findings.length, 1)
411
+ } finally {
412
+ fs.rmSync(dir, { recursive: true, force: true })
413
+ }
414
+ })
@@ -0,0 +1,96 @@
1
+ // Drift check for the VENDORED over-mock classifier in scan-diff.mjs.
2
+ //
3
+ // scan-diff.mjs carries a self-contained copy of ensure-coverage's
4
+ // `mock-internal-seam` classifier so better-review enforces no-over-mock with zero
5
+ // dependency on ensure-coverage being installed. ensure-coverage stays CANONICAL
6
+ // ("if the two diverge, ensure-coverage wins and this copy is stale → resync").
7
+ // That resync rule used to be prose; this test mechanizes it: it runs the full
8
+ // classification decision tree through BOTH copies and fails on any divergence
9
+ // in verdict or reason, plus compares the default topology field-for-field.
10
+ //
11
+ // When the canonical module is absent (better-review installed standalone), the
12
+ // whole suite skips — there is nothing to be out of sync with.
13
+
14
+ import { test } from 'node:test'
15
+ import assert from 'node:assert/strict'
16
+ import fs from 'node:fs'
17
+ import path from 'node:path'
18
+ import { fileURLToPath } from 'node:url'
19
+
20
+ const here = path.dirname(fileURLToPath(import.meta.url))
21
+ const CANONICAL = path.resolve(here, '../../ensure-coverage/scripts/mock-policy-config.mjs')
22
+ const standalone = !fs.existsSync(CANONICAL)
23
+
24
+ const vendored = await import('./scan-diff.mjs')
25
+ const canonical = standalone ? null : await import(CANONICAL)
26
+
27
+ // One topology per declared-config shape we support; classifyMockTarget takes
28
+ // the same plain object in both copies (canonical compiles externals lazily).
29
+ const TOPOLOGIES = {
30
+ defaults: undefined, // both sides fall back to their own DEFAULT_*
31
+ declared: {
32
+ firstPartyAliasPrefixes: ['@/', '~/', '#app/'],
33
+ firstPartyPackages: ['@acme/', 'our-lib'],
34
+ externals: ['^@acme/generated-', '^virtual:'],
35
+ testUtilHints: ['__mocks__', 'fixtures', 'test-utils'],
36
+ },
37
+ badExternalRegex: {
38
+ firstPartyAliasPrefixes: ['@/'],
39
+ firstPartyPackages: [],
40
+ externals: ['[unclosed'], // must be ignored identically, never thrown
41
+ testUtilHints: ['mocks'],
42
+ },
43
+ }
44
+
45
+ // Targets covering every branch of the precedence chain:
46
+ // declared externals > stdlib > relative(util vs source) > alias > first-party
47
+ // package (exact / subpath / trailing-slash config) > bare package > no target.
48
+ const TARGETS = [
49
+ null, '', 'node:fs', 'node:path',
50
+ './db', '../services/payment', './__mocks__/db', '../fixtures/user', './test-utils/render',
51
+ '../mocks/server', './helpers/seed', '@/lib/db', '@/server/auth', '~/utils/format',
52
+ '#app/db', '@acme/core', '@acme/core/client', '@acme/generated-client', 'our-lib',
53
+ 'our-lib/deep', 'our-library', 'virtual:module', 'react', 'msw', '@tanstack/react-query',
54
+ 'lodash/merge',
55
+ ]
56
+
57
+ test('vendored classifier tracks ensure-coverage (canonical)', { skip: standalone && 'ensure-coverage not installed — standalone better-review, nothing to sync against' }, async (t) => {
58
+ await t.test('default topology fields match DEFAULT_MOCK_POLICY', () => {
59
+ const want = canonical.DEFAULT_MOCK_POLICY
60
+ const got = vendored.DEFAULT_MOCK_TOPOLOGY
61
+ for (const field of ['firstPartyAliasPrefixes', 'firstPartyPackages', 'externals', 'testUtilHints']) {
62
+ assert.deepEqual(got[field], want[field], `DEFAULT_MOCK_TOPOLOGY.${field} drifted from canonical DEFAULT_MOCK_POLICY.${field}`)
63
+ }
64
+ })
65
+
66
+ await t.test('extractMockTarget agrees on a line corpus', () => {
67
+ const LINES = [
68
+ `vi.${'mock'}('@/lib/db')`,
69
+ `jest.${'mock'}("../services/payment", () => ({}))`,
70
+ `vitest.${'mock'}(\`~/utils/format\`)`,
71
+ `vi.${'doMock'}('./db')`,
72
+ `jest.${'doMock'}('react')`,
73
+ `vi . mock ( '@acme/core' )`,
74
+ `vi.mock(someVariable)`, // non-literal → null
75
+ `expect(page).toBeTruthy()`,
76
+ '', null,
77
+ ]
78
+ for (const line of LINES) {
79
+ assert.equal(vendored.extractMockTarget(line), canonical.extractMockTarget(line), `extractMockTarget diverged on: ${JSON.stringify(line)}`)
80
+ }
81
+ })
82
+
83
+ await t.test('classifyMockTarget agrees across the full precedence tree', () => {
84
+ for (const [name, topo] of Object.entries(TOPOLOGIES)) {
85
+ for (const target of TARGETS) {
86
+ const got = topo === undefined ? vendored.classifyMockTarget(target) : vendored.classifyMockTarget(target, topo)
87
+ const want = topo === undefined ? canonical.classifyMockTarget(target) : canonical.classifyMockTarget(target, topo)
88
+ assert.deepEqual(
89
+ { internal: got.internal, reason: got.reason },
90
+ { internal: want.internal, reason: want.reason },
91
+ `classifyMockTarget diverged on target=${JSON.stringify(target)} topology=${name}`
92
+ )
93
+ }
94
+ }
95
+ })
96
+ })
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: e2e-test
3
+ description: "Playwright end-to-end standard: the 3-tier suite (render-health / functional / journey), generated route manifest, and presentation sweep. Use when browser routes or user flows ship or change, or a Playwright test flakes. NOT for non-browser tests, defining what to test (ensure-coverage), the curated ALIVE/DEAD golden-path gate (golden-path), or CI workflow YAML (github-actions)."
4
+ release-version: 0.36.0
5
+ ---
6
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
+ # E2E Testing Standard
8
+
9
+ The executable browser layer for `ensure-coverage`'s doctrine. ensure-coverage says *what must be proven* (required levels, the ledger, the presentation floor, the golden-path-only CI contract). This skill is *how* browser and journey surfaces get proven. `resolve-issues` implementers author the tests and run the sweep; `better-review` checks them against [reviewing.md](references/reviewing.md); `golden-path` selects the `@golden-path` subset of Tier 3 as the sole per-PR liveness gate.
10
+
11
+ ## Test tiers
12
+
13
+ | Tier | Name | What to test | Required when |
14
+ |---|---|---|---|
15
+ | 1 | **Render-health** | Route loads, no crash, heading visible, no console errors (the `presentation:render-health` spine) | Every route not already proven by a Tier 2/3 test that calls `assertRenderHealthy` |
16
+ | 2 | **Functional** | Forms, filters, auth, API responses, error states | Routes with user interaction |
17
+ | 3 | **Journey** | Multi-step flows crossing pages and APIs; the golden paths whose failure means do-not-ship | Core business flows |
18
+
19
+ Tier 3 is where the golden paths live. `golden-path` authors nothing new: it selects the curated `@golden-path`-tagged subset and gates it ALIVE/DEAD. A tagged spec holds one journey, named by one `@covers <journey-id>` beside its surface `@covers`.
20
+
21
+ ## Directory layout
22
+
23
+ ```
24
+ e2e/
25
+ ├── route-manifest.json # generated projection of the surface inventory
26
+ ├── route-manifest.overlay.json # curated tier / ignore deviations
27
+ ├── render/ # Tier 1
28
+ ├── functional/ # Tier 2, subdirs by feature
29
+ ├── journeys/ # Tier 3; do-not-ship subset tagged @golden-path
30
+ ├── fixtures/ # shared auth, seeded data
31
+ └── utils/
32
+ ```
33
+
34
+ ## Writing tests
35
+
36
+ 1. Every new route needs render-health proof: a Tier 1 test, or a Tier 2/3 test on that route that calls `assertRenderHealthy`. Interactive routes need Tier 2 with success, error, and edge cases. Core flows need a Tier 3 journey; tag the do-not-ship subset `@golden-path`.
37
+ 2. One test per page and behavior. Never add a Tier 1 test for a route a Tier 2/3 test already proves, and never repeat an assertion another test on the same page makes.
38
+ 3. The manifest is generated, never hand-edited. Regenerate it and put curation in the overlay ([route-manifest.md](references/route-manifest.md)).
39
+ 4. Tag every spec `// @covers <surface-id>` and `// @level <level>` so the ledger resolves it. Untagged specs are invisible to the accounting gate.
40
+ 5. `getByRole` / `getByLabel` / `getByText`, never CSS selectors. Wait for real state, never `waitForTimeout()`.
41
+ 6. Auth lives in shared fixtures. Seeded accounts and tenants carry the `e2e-` prefix with a run-scoped suffix ([auth-flows.md](references/authoring/auth-flows.md)).
42
+ 7. Journeys drive real APIs. Mock only external third-party boundaries; a first-party `page.route` in a journey grades `Over-mocked`.
43
+ 8. **Never skip a test** (the one exception: a platform or optional-dependency skip that CI still runs elsewhere). Seed the missing state, route by Playwright project, quarantine an un-sandboxable external with a dated exit (`@quarantine(until=YYYY-MM-DD, issue=#nnn)`), or delete an obsolete test. Policy and the full solutions map: `ensure-coverage/references/process/test-strategy.md`. `lint-tests.mjs --diff <base>` flags a skip or fixed timeout added in the change.
44
+ 9. Bug-fix PRs carry a regression test that fails on the unfixed code.
45
+
46
+ Patterns and tier examples: [playwright-patterns.md](references/authoring/playwright-patterns.md). Config and the AGENTS.md snippet: [playwright-config.md](references/authoring/playwright-config.md).
47
+
48
+ ## The two commands every browser change owes
49
+
50
+ Regenerate the manifest from the inventory:
51
+
52
+ ```bash
53
+ node "$SKILL_DIR/scripts/project-route-manifest.mjs" \
54
+ --inventory docs/tests/_generated/surface-inventory.json \
55
+ --overlay e2e/route-manifest.overlay.json --out e2e/route-manifest.json
56
+ ```
57
+
58
+ Run the presentation sweep over every manifest route against the real render path:
59
+
60
+ ```bash
61
+ E2E_AUTH_BYPASS=1 node "$SKILL_DIR/scripts/presentation-sweep.mjs" \
62
+ --manifest e2e/route-manifest.json --base-url http://127.0.0.1:3000 \
63
+ --out docs/tests/_generated/presentation-results.json [--fixtures e2e/sweep-fixtures.mjs]
64
+ ```
65
+
66
+ `SKILL_DIR` is this skill's own directory, the path you read this file from. Never resolve a script against your CWD, and never locate one with `find` over `$HOME`.
67
+
68
+ The sweep is separate evidence from the functional suite. A green functional run is not presentation proof: a spec that intercepts its own API never exercises the render path that crashes. Instruments, fixtures, mutate-health, and the result shape the ledger reads: [presentation-sweep.md](references/presentation-sweep.md). A route with no in-app link is still reachable by URL; "no way to view it" is never `blocked`.
69
+
70
+ ## Verify locally before the queue
71
+
72
+ A merge queue re-runs the browser matrix on the merged candidate, so one regression resets every PR in the batch. Before relying on that: probe the environment instead of assuming it can't run (`docker info`, `pg_isready`, the Playwright browser cache), run the affected specs with `--grep`, not the whole suite, and unit-test your own helper changes where a mocked page object suffices.
73
+
74
+ ## Lead with the verdict
75
+
76
+ Whether you added tests, wrote notes, or reviewed a PR, the first line answers "is this surface covered and ship-ready?" Then what the new tests prove and deliberately do not, then concrete follow-ups for anything uncovered.
77
+
78
+ ## CI
79
+
80
+ Curated golden-path smoke is the sole CI gate (`ensure-coverage/references/enforcement/ci-contract.md`). On GitHub Actions, `golden-path init --write` generates the workflow from the repo's contract; on Cloud Build, copy [`assets/ci-gates.cloudbuild.yaml`](assets/ci-gates.cloudbuild.yaml). Verify either with `ci-audit.mjs`. Wiring notes: [ci-integration.md](references/ci-integration.md). Running Playwright in a pinned container on self-hosted runners: [ci-playwright-container.md](references/ci-playwright-container.md).
81
+
82
+ ## Reviewing
83
+
84
+ Checklist and comment template: [reviewing.md](references/reviewing.md). Block on: a new route without a manifest entry, an interactive route without Tier 2, a browser-route change with no sweep run, any skipped or guarded test, or an assertion that would pass on a 404 or empty page.
85
+
86
+ ## Scripts
87
+
88
+ | script | does |
89
+ |---|---|
90
+ | `detect-routes-nextjs.mjs` | enumerate Next.js App Router pages and route handlers into the surface inventory |
91
+ | `project-route-manifest.mjs` | project `kind: route` surfaces plus the overlay into `route-manifest.json` |
92
+ | `validate-manifest.mjs` | shape-check the manifest and its entries |
93
+ | `presentation-sweep.mjs` | open every manifest route, assert the presentation floor, write the results the ledger reads |
94
+ | `presentation-render-health.mjs` | `assertRenderHealthy` / `assertHealthyThrough` (the spine, and mutate-health) |
95
+ | `presentation-checks.mjs` | `assertNoHorizontalOverflow` / `assertNoOverlap` (`presentation:spatial`) |
96
+ | `presentation-perceivability.mjs` | `assertContrast` / `assertHiddenFromWrongRole` / `assertRemovedAfterMutation` |
97
+ | `presentation-reachability.mjs` | `assertNoNavOrphans` / `assertTargetSizes` / `assertFocusVisible` |
98
+ | `presentation-temporal.mjs` | `assertNoFirstPartyShift` / `assertNoThirdPartyShift` / `assertNoDynamicViewportShift` |
@@ -0,0 +1,24 @@
1
+ # Golden-path smoke - Cloud Build template.
2
+ # The sole CI gate in ensure-coverage's CI contract. It calls the engine copy that
3
+ # `golden-path init` writes into the repo. Replace <...> and audit with:
4
+ # node <ensure-coverage>/scripts/ci-audit.mjs --files cloudbuild.gates.yaml
5
+
6
+ steps:
7
+ - id: golden-paths
8
+ name: mcr.microsoft.com/playwright:v1.61.0-noble
9
+ timeout: 600s
10
+ entrypoint: bash
11
+ env: ['DATABASE_URL=${_DATABASE_URL}']
12
+ args:
13
+ - -c
14
+ - |
15
+ set -euo pipefail
16
+ <install dependencies>
17
+ node scripts/golden-paths/golden-path.mjs check
18
+ <build the app (setup.build): --boot runs only setup.seed and setup.boot>
19
+ node scripts/golden-paths/golden-path.mjs run --profile queue-local --boot
20
+ node scripts/golden-paths/golden-path.mjs verdict --profile queue-local
21
+
22
+ timeout: 600s
23
+ substitutions:
24
+ _DATABASE_URL: ''