@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,270 @@
1
+ # Feishu OAuth API Reference
2
+
3
+ Load this file when implementing Feishu OAuth or troubleshooting auth issues.
4
+
5
+ ## OAuth Flow Endpoints
6
+
7
+ ### Authorization
8
+
9
+ ```
10
+ GET https://accounts.feishu.cn/open-apis/authen/v1/authorize
11
+ ```
12
+
13
+ | Parameter | Required | Description |
14
+ |-----------|----------|-------------|
15
+ | `client_id` | Yes | Feishu App ID (`cli_xxx`) |
16
+ | `redirect_uri` | Yes | Must match registered URI exactly |
17
+ | `response_type` | Yes | Always `code` |
18
+ | `state` | Yes | CSRF token (managed by Better Auth) |
19
+ | `scope` | No | Space-separated scopes |
20
+
21
+ ### Token Exchange
22
+
23
+ ```
24
+ POST https://open.feishu.cn/open-apis/authen/v2/oauth/token
25
+ Content-Type: application/json
26
+ ```
27
+
28
+ **Request body:**
29
+ ```json
30
+ {
31
+ "grant_type": "authorization_code",
32
+ "code": "<auth_code>",
33
+ "client_id": "cli_xxx",
34
+ "client_secret": "xxx"
35
+ }
36
+ ```
37
+
38
+ **Response:**
39
+ ```json
40
+ {
41
+ "access_token": "u-xxxxxxxx",
42
+ "token_type": "Bearer",
43
+ "expires_in": 7200,
44
+ "refresh_token": "ur-xxxxxxxx",
45
+ "refresh_expires_in": 2592000
46
+ }
47
+ ```
48
+
49
+ > Note: v2 token endpoint returns flat JSON (no `data` wrapper). v1 used `data` wrapper.
50
+
51
+ ### User Info
52
+
53
+ ```
54
+ GET https://open.feishu.cn/open-apis/authen/v1/user_info
55
+ Authorization: Bearer <access_token>
56
+ ```
57
+
58
+ **Response:**
59
+ ```json
60
+ {
61
+ "code": 0,
62
+ "msg": "success",
63
+ "data": {
64
+ "open_id": "ou_xxxxxxxxxxxxxxxxxxxxxxxx",
65
+ "union_id": "on_xxxxxxxxxxxxxxxxxxxxxxxx",
66
+ "name": "张三",
67
+ "en_name": "John Zhang",
68
+ "email": "john@company.com",
69
+ "avatar_url": "https://internal-api-lark-file.feishu.cn/...",
70
+ "tenant_key": "xxxxxxxx",
71
+ "employee_no": ""
72
+ }
73
+ }
74
+ ```
75
+
76
+ > ⚠️ User data is nested under `data` — must unwrap once. Do NOT double-unwrap.
77
+
78
+ ### 1. Authorization (redirect user)
79
+
80
+ ```
81
+ GET https://accounts.feishu.cn/open-apis/authen/v1/authorize
82
+ ```
83
+
84
+ | Parameter | Required | Description |
85
+ |-----------|----------|-------------|
86
+ | `client_id` | Yes | Feishu App ID (`cli_xxx`) |
87
+ | `redirect_uri` | Yes | Must match registered URI exactly |
88
+ | `response_type` | Yes | Always `code` |
89
+ | `state` | Yes | CSRF token (managed by Better Auth) |
90
+ | `scope` | No | Space-separated scopes |
91
+
92
+ ### 2. Token Exchange
93
+
94
+ ```
95
+ POST https://open.feishu.cn/open-apis/authen/v2/oauth/token
96
+ Content-Type: application/json
97
+ ```
98
+
99
+ **Request body:**
100
+ ```json
101
+ {
102
+ "grant_type": "authorization_code",
103
+ "code": "<auth_code>",
104
+ "client_id": "cli_xxx",
105
+ "client_secret": "xxx"
106
+ }
107
+ ```
108
+
109
+ **Response:**
110
+ ```json
111
+ {
112
+ "access_token": "u-xxxxxxxx",
113
+ "token_type": "Bearer",
114
+ "expires_in": 7200,
115
+ "refresh_token": "ur-xxxxxxxx",
116
+ "refresh_expires_in": 2592000
117
+ }
118
+ ```
119
+
120
+ > Note: v2 token endpoint returns flat JSON (no `data` wrapper). v1 used `data` wrapper.
121
+
122
+ ### 3. User Info
123
+
124
+ ```
125
+ GET https://open.feishu.cn/open-apis/authen/v1/user_info
126
+ Authorization: Bearer <access_token>
127
+ ```
128
+
129
+ **Response:**
130
+ ```json
131
+ {
132
+ "code": 0,
133
+ "msg": "success",
134
+ "data": {
135
+ "open_id": "ou_xxxxxxxxxxxxxxxxxxxxxxxx",
136
+ "union_id": "on_xxxxxxxxxxxxxxxxxxxxxxxx",
137
+ "name": "张三",
138
+ "en_name": "John Zhang",
139
+ "email": "john@company.com",
140
+ "avatar_url": "https://internal-api-lark-file.feishu.cn/...",
141
+ "tenant_key": "xxxxxxxx",
142
+ "employee_no": ""
143
+ }
144
+ }
145
+ ```
146
+
147
+ > ⚠️ User data is nested under `data` — must unwrap once. Do NOT double-unwrap.
148
+
149
+ ## User Info Fields
150
+
151
+ | Field | Type | Notes |
152
+ |-------|------|-------|
153
+ | `open_id` | string | Unique per user per app — changes if app changes |
154
+ | `union_id` | string | Unique per user across same developer's apps |
155
+ | `name` | string | Display name (often Chinese) |
156
+ | `en_name` | string | English name (may be empty) |
157
+ | `email` | string | **Empty string if scope not approved** (not null, not omitted) |
158
+ | `avatar_url` | string | Profile picture |
159
+ | `tenant_key` | string | Organization identifier |
160
+ | `employee_no` | string | Employee number (if configured) |
161
+
162
+ ## Scopes & Permissions
163
+
164
+ | Scope | Level | Admin Approval |
165
+ |-------|-------|----------------|
166
+ | (none — basic profile) | Basic | Auto |
167
+ | `contact:user.email:readonly` | Advanced (高级权限) | **Required** |
168
+ | `contact:user.phone:readonly` | Advanced | **Required** |
169
+ | `contact:user.employee_id:readonly` | Advanced | **Required** |
170
+
171
+ ### Activating Advanced Permissions
172
+
173
+ 1. Open app in [Feishu Dev Console](https://open.feishu.cn/app)
174
+ 2. Permissions → find the scope → **Enable**
175
+ 3. App Release → **Create Version** → **Submit for Review**
176
+ 4. Admin approves in Admin Console
177
+ 5. Permission status changes to **Active**
178
+
179
+ Until approved: the field returns empty string `""`.
180
+
181
+ ## Error Codes
182
+
183
+ | Code | Meaning | Fix |
184
+ |------|---------|-----|
185
+ | 0 | Success | — |
186
+ | 10003 | Invalid app_id | Check credentials |
187
+ | 10012 | App not released | Publish a version |
188
+ | 10014 | Scope not approved | Request admin approval |
189
+ | 20028 | Invalid code / expired | Code was reused or expired (10 min TTL) |
190
+ | 20029 | Redirect URI mismatch | Add exact URL in Feishu app settings |
191
+
192
+ ## Prisma Schema
193
+
194
+ Better Auth with genericOAuth requires these models:
195
+
196
+ ```prisma
197
+ model User {
198
+ id String @id @default(cuid())
199
+ name String?
200
+ email String? @unique
201
+ emailVerified Boolean @default(false) @map("email_verified")
202
+ image String?
203
+ createdAt DateTime @default(now()) @map("created_at")
204
+ updatedAt DateTime @updatedAt @map("updated_at")
205
+ sessions Session[]
206
+ accounts Account[]
207
+ @@map("users")
208
+ }
209
+
210
+ model Session {
211
+ id String @id @default(cuid())
212
+ expiresAt DateTime @map("expires_at")
213
+ token String @unique @default(cuid())
214
+ ipAddress String? @map("ip_address")
215
+ userAgent String? @map("user_agent")
216
+ userId String @map("user_id")
217
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
218
+ createdAt DateTime @default(now()) @map("created_at")
219
+ updatedAt DateTime @updatedAt @map("updated_at")
220
+ @@map("sessions")
221
+ }
222
+
223
+ model Account {
224
+ id String @id @default(cuid())
225
+ userId String @map("user_id")
226
+ accountId String @map("account_id")
227
+ providerId String @map("provider_id")
228
+ accessToken String? @map("access_token")
229
+ refreshToken String? @map("refresh_token")
230
+ idToken String? @map("id_token")
231
+ accessTokenExpiresAt DateTime? @map("access_token_expires_at")
232
+ refreshTokenExpiresAt DateTime? @map("refresh_token_expires_at")
233
+ scope String?
234
+ password String?
235
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
236
+ createdAt DateTime @default(now()) @map("created_at")
237
+ updatedAt DateTime @updatedAt @map("updated_at")
238
+ @@unique([providerId, accountId])
239
+ @@map("accounts")
240
+ }
241
+
242
+ // Required by genericOAuth plugin for CSRF state
243
+ model Verification {
244
+ id String @id @default(cuid())
245
+ identifier String
246
+ value String
247
+ expiresAt DateTime @map("expires_at")
248
+ createdAt DateTime @default(now()) @map("created_at")
249
+ updatedAt DateTime @updatedAt @map("updated_at")
250
+ @@map("verification")
251
+ }
252
+ ```
253
+
254
+ ### Schema Gotchas
255
+
256
+ - **`emailVerified` must be `Boolean`**, not `DateTime` — Better Auth writes `true`/`false`, not timestamps
257
+ - **Account columns need `At` suffix** — `accessTokenExpiresAt` / `refreshTokenExpiresAt` (Prisma adapter uses camelCase field names)
258
+ - **`@map()` for snake_case columns** — Prisma field names are camelCase; use `@map` for DB column names
259
+ - **`verification` table is mandatory** — genericOAuth stores OAuth state here; missing table = 500 on sign-in
260
+
261
+ ## International (Lark) vs China (Feishu)
262
+
263
+ | | China | International |
264
+ |---|-------|---------------|
265
+ | Base domain | `feishu.cn` | `larksuite.com` |
266
+ | Auth URL | `accounts.feishu.cn` | `accounts.larksuite.com` |
267
+ | API URL | `open.feishu.cn` | `open.larksuite.com` |
268
+ | Dev Console | `open.feishu.cn/app` | `open.larksuite.com/app` |
269
+
270
+ Use `FEISHU_BASE_URL` env var to switch between them.
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import { spawnSync } from 'node:child_process';
3
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import { dirname, join } from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+
8
+ const DAY_MS = 24 * 60 * 60 * 1000;
9
+ const WEEK_MS = 7 * DAY_MS;
10
+ const here = dirname(fileURLToPath(import.meta.url));
11
+
12
+ function readJson(path, fallback = {}) {
13
+ try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return fallback; }
14
+ }
15
+
16
+ function frontmatterValue(text, key) {
17
+ const frontmatter = /^---\n([\s\S]*?)\n---/.exec(text)?.[1] ?? '';
18
+ const match = new RegExp('^' + key + ':\\s*([^\\n]+)$', 'm').exec(frontmatter);
19
+ return match?.[1].trim().replace(/^['"]|['"]$/g, '') ?? null;
20
+ }
21
+
22
+ function repositoryOf(source) {
23
+ const value = String(source ?? '').trim();
24
+ const match = /^(?:git@github\.com:|https:\/\/github\.com\/)?([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:\.git)?$/.exec(value);
25
+ return match?.[1] ?? null;
26
+ }
27
+
28
+ function stableVersion(value) {
29
+ const match = /^v?(\d+)\.(\d+)\.(\d+)$/.exec(String(value ?? '').trim());
30
+ return match ? match.slice(1).map(Number) : null;
31
+ }
32
+
33
+ function newer(left, right) {
34
+ for (let index = 0; index < 3; index += 1) {
35
+ if (left[index] !== right[index]) return left[index] > right[index];
36
+ }
37
+ return false;
38
+ }
39
+
40
+ function writeCache(path, value) {
41
+ try {
42
+ mkdirSync(dirname(path), { recursive: true });
43
+ writeFileSync(path, JSON.stringify(value));
44
+ } catch { /* A read-only cache must not block skill use. */ }
45
+ }
46
+
47
+ function main(now = Date.now()) {
48
+ if (process.env.ONEABOVEIO_NO_UPDATE_CHECK) return;
49
+ const skill = readFileSync(join(here, 'SKILL.md'), 'utf8');
50
+ const name = frontmatterValue(skill, 'name');
51
+ const localVersion = stableVersion(frontmatterValue(skill, 'release-version'));
52
+ if (!name || !localVersion) return;
53
+
54
+ const lock = readJson(join(process.env.HOME || homedir(), '.agents', '.skill-lock.json'));
55
+ const entry = lock.skills?.[name];
56
+ const repository = repositoryOf(entry?.sourceUrl || entry?.source);
57
+ if (!repository) return;
58
+
59
+ const cacheRoot = process.env.XDG_CACHE_HOME || join(process.env.HOME || homedir(), '.cache');
60
+ const cachePath = join(cacheRoot, '1aboveio-skills', 'release-check.json');
61
+ const all = readJson(cachePath);
62
+ const cache = all[repository] && typeof all[repository] === 'object' ? all[repository] : {};
63
+
64
+ if (!cache.lastCheck || now - cache.lastCheck >= DAY_MS) {
65
+ const result = spawnSync('gh', ['api', 'repos/' + repository + '/releases/latest', '--jq', '.tag_name'], {
66
+ encoding: 'utf8',
67
+ stdio: ['ignore', 'pipe', 'ignore'],
68
+ timeout: 1500,
69
+ });
70
+ cache.lastCheck = now;
71
+ if (result.status === 0 && stableVersion(result.stdout)) cache.latestTag = result.stdout.trim();
72
+ else delete cache.latestTag;
73
+ all[repository] = cache;
74
+ writeCache(cachePath, all);
75
+ }
76
+
77
+ const latestVersion = stableVersion(cache.latestTag);
78
+ if (!latestVersion || !newer(latestVersion, localVersion)) return;
79
+ if (cache.notifiedTag === cache.latestTag && cache.notifiedAt && now - cache.notifiedAt < WEEK_MS) return;
80
+
81
+ cache.notifiedTag = cache.latestTag;
82
+ cache.notifiedAt = now;
83
+ all[repository] = cache;
84
+ writeCache(cachePath, all);
85
+ const command = `npx skills@1.5.23 add '${repository}#${cache.latestTag}' --global --agent universal claude-code --skill ${name} --yes`;
86
+ process.stdout.write(
87
+ `UPDATE_AVAILABLE: A newer 1AboveIO skills release (${cache.latestTag}) is available; this skill is `
88
+ + `v${localVersion.join('.')}. Ask once whether to refresh ${name}. On approval run \`${command}\`. `
89
+ + 'The refreshed instructions apply next session. Either way, continue the current task and do not ask again this session.\n',
90
+ );
91
+ }
92
+
93
+ try { main(); } catch { /* Update checks are advisory and always fail silent. */ }
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,204 @@
1
+ ---
2
+ name: data-catalog
3
+ description: "Column definitions for warehouse tables, written inside the Spark/PySpark or SQL script that builds each table (CATALOG_TABLE / CATALOG_FIELDS, or a `-- @field` comment block), with a generated markdown catalog in docs/catalog/ and a CI check that fails a PR whose catalog is stale. Use when writing or changing a table script that adds, renames, removes, or changes the meaning of an output column or feature; when asked what a warehouse column or feature means; to set a repo up ('init the data catalog', 'generate the data dictionary', '字段字典', 'add catalog CI'); or to audit existing SQL or Spark scripts for undocumented columns. NOT for implementing or tuning the Spark job itself (pyspark), DAG wiring (airflow), or general workflow YAML (github-actions)."
4
+ release-version: 0.36.0
5
+ ---
6
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
+ # Data catalog
8
+
9
+ Every output column of a warehouse table gets its definition written next to the
10
+ code that computes it. A script turns those definitions into `docs/catalog/*.md`,
11
+ and CI fails a pull request when the pages and the scripts disagree.
12
+
13
+ ## First use in a repo
14
+
15
+ In a git repo with no `data-catalog.json`, set the repo up **before** the task you
16
+ were asked to do, whatever it is: an audit, a new column, or a question. Setting up
17
+ puts the engine, the CI check, and the conventions in the repo itself, so agents
18
+ and people without this skill follow them from then on.
19
+
20
+ 1. `python3 <skill-base-dir>/scripts/data_catalog.py audit '<globs>'` to find the
21
+ table scripts; choose `--scripts` globs that cover them and nothing else.
22
+ 2. Pick `--languages` from the repo's existing docs (Chinese docs: `zh,en`;
23
+ otherwise `en`). Run `init` with them and `--write` ([Init](#init)).
24
+ 3. `node <skill-base-dir>/scripts/persist-conventions.mjs --repo-root <repo> --write`
25
+ writes the `## Data catalog conventions` section of `CONTRIBUTING.md` and points
26
+ `AGENTS.md` at it.
27
+ 4. Then do the task. In the reply, list what setup added, and say the Data catalog
28
+ check runs on PRs but is not required.
29
+
30
+ Skip setup outside a git repo, or when the user says not to change the repo.
31
+ Never document tables during setup unless the task asks for it.
32
+
33
+ ## Find your task
34
+
35
+ | Task | Do |
36
+ |---|---|
37
+ | Writing or changing a table script | [While coding](#while-coding), then [references/field-definitions.md](references/field-definitions.md) |
38
+ | "What does column X mean?" | Read `docs/catalog/<table>.md`; with no page, read the script's `CATALOG_FIELDS`, then its SQL |
39
+ | The repo has no `data-catalog.json` | [First use in a repo](#first-use-in-a-repo) |
40
+ | Find scripts with missing or weak definitions | [Audit](#audit) |
41
+ | Document an existing table | [Backfill one table](#backfill-one-table) |
42
+ | CI says the catalog is stale | `python3 <engine> generate`, commit the pages |
43
+ | Before committing a table-script change, or reviewing one | `python3 <engine> drift` (`--base origin/main` for a whole branch) |
44
+ | `Field`/`Table` arguments, the SQL block, config keys, exit codes | [references/format.md](references/format.md) |
45
+
46
+ `<engine>` is `scripts/data-catalog/data_catalog.py` in the repo, or
47
+ `<skill-base-dir>/scripts/data_catalog.py` before the repo has a copy. When
48
+ `python3 <engine> version` differs from the skill's copy, refresh with
49
+ `init --write`.
50
+
51
+ ## The files
52
+
53
+ | File | Owner | Edit it? |
54
+ |---|---|---|
55
+ | `CATALOG_TABLE` / `CATALOG_FIELDS` in each `.py` table script | the definitions | yes |
56
+ | `-- @table` / `-- @field` block at the top of each `.sql` table script | the definitions | yes |
57
+ | `data-catalog.json` | which scripts, languages, output dir | yes, then rerun `init --write` |
58
+ | `docs/catalog/*.md` | generated pages | never |
59
+ | `catalog_fields.py` (path in `fieldsModule`) | generated `Field`/`Table` types | never |
60
+ | `scripts/data-catalog/data_catalog.py` | engine copied from this skill | never; refresh with init |
61
+ | `.github/workflows/data-catalog.yml` | generated CI check | never; rerun init |
62
+ | `CONTRIBUTING.md` section between `conventions:data-catalog` markers | the conventions, for agents without this skill | never; rerun `persist-conventions.mjs --write`; the rest is yours |
63
+ | `AGENTS.md` `## Contributing` pointer | points at `CONTRIBUTING.md` | written once by `persist-conventions.mjs` |
64
+
65
+ ## Rules
66
+
67
+ 1. **Define a column in the same change that creates or changes it.**
68
+ Example: adding `refund_cnt_30d` to the SELECT means adding its `Field` in the
69
+ same commit, then running `generate`.
70
+ 2. **Each row says only what is particular to its column, in business words.**
71
+ Shared filters, window anchor and currency go once in the table notes; the row
72
+ gives what one value measures, its unit, and 0/null meaning; `source` gives
73
+ lineage in one line. Follow the eleven principles in
74
+ [references/field-definitions.md](references/field-definitions.md).
75
+ Example: not `"Posted COLLECTION_IN rows where cust_type <> 'TEST', [dt-30d, dt), count distinct payer_bank via dim.forex join"`
76
+ but `"Number of different paying banks in the last 30 days. It is 0 if there were no collections."`
77
+ 3. **Write what the code does, read from the code.** Take the source table, filters,
78
+ and window from the SQL you read. When the code and the intended meaning
79
+ disagree, ask; never document the intent as fact.
80
+ Example: the SQL filters `status = 'POSTED'`, so the source says "posted
81
+ collections", even if the ticket said "all collections".
82
+ 4. **Edit the script, never a generated page.** `generate --check` fails while they
83
+ disagree, and when an output column has no definition: the contract tuple or, in
84
+ SQL, the SELECT writing the table, is checked against the `Field`s or `-- @field`s
85
+ ([references/format.md](references/format.md#what-ci-checks-against-the-code)).
86
+ Example: to fix a typo on a page, fix the `Field` text and run `generate`.
87
+ 5. **Derive the column contract only after every column has a `Field`.**
88
+ `PUBLISHED_COLUMNS = tuple(f.name for f in CATALOG_FIELDS)` publishes exactly the
89
+ documented columns, in `Field` order. Before switching, compare the derived tuple
90
+ with the old one: same names, same order.
91
+ Example: a 169-column table with 154 Fields would silently stop writing 15
92
+ columns. Keep the literal tuple; `generate` names the 15 until they are written.
93
+ 6. **Metadata is plain literals.** The engine reads the file without running it:
94
+ strings, implicit concatenation, `+`, module-level string constants, and
95
+ `*OTHER_FIELDS` from the same module. No f-strings, calls, or imported lists.
96
+ Example: share key columns with `KEYS = (Field(...),)` and `(*KEYS, Field(...))`
97
+ in the same file.
98
+ 7. **Audit reports; it never edits.** Fix one table per change, in the script that
99
+ builds the table, not its backfill or migration twins.
100
+ 8. **Adding the workflow adds a check, not a required one.** Make it required in
101
+ the merge rules only when the user asks.
102
+ Example: after `init --write`, report "the Data catalog check now runs on PRs
103
+ that touch table scripts; it is not required".
104
+
105
+ ## While coding
106
+
107
+ 1. Before changing a table script, read its page in `docs/catalog/`.
108
+ 2. Change the SQL or DataFrame code.
109
+ 3. Add, edit, or remove the matching `Field`. Write it with
110
+ [references/field-definitions.md](references/field-definitions.md).
111
+ 4. Run `python3 <engine> generate` and the repo's schema or contract tests.
112
+ 5. Run `python3 <engine> drift`. It lists columns whose code changed while their
113
+ definition did not, and filter or join changes with no definition touched. CI
114
+ only checks that every column has a definition; `drift` is the check that the
115
+ definitions still match the code. Update each listed definition, or say in the
116
+ PR why it still holds.
117
+ 6. Commit the script and the regenerated pages together.
118
+
119
+ Example: changing `WHERE status = 'POSTED'` to `status IN ('POSTED', 'SETTLED')`
120
+ passes CI, and `drift` reports "filters, joins or CTEs changed; no definition
121
+ changed" until the affected sources say "posted or settled".
122
+
123
+ A renamed column is a new `Field` and a removed one. Say in the new definition what
124
+ it replaced when consumers must migrate.
125
+
126
+ ## Init
127
+
128
+ ```bash
129
+ python3 <skill-base-dir>/scripts/data_catalog.py init \
130
+ --scripts 'dags/**/dwd_*.py' --scripts 'sql/**/*.sql' \
131
+ --exclude '**/*_legacy.py' --languages zh,en # dry run: prints the plan
132
+ python3 <skill-base-dir>/scripts/data_catalog.py init ... --write
133
+ ```
134
+
135
+ Scope `--scripts` to warehouse table scripts. A broad `**/*.sql` also picks up app
136
+ database migrations. `init` writes the config, the engine copy, `catalog_fields.py`
137
+ beside the scripts, the workflow, and the first catalog. Rerunning is safe, and edits
138
+ to `data-catalog.json` take effect on the next `init --write`. After a skill update,
139
+ rerun both `init --write` and `persist-conventions.mjs --write` so the repo's copies
140
+ match.
141
+
142
+ The scripts import `from catalog_fields import Field, Table` at run time, so the
143
+ module must ship with them like any sibling module (for example `--py-files` on
144
+ `spark-submit`). Check that before merging.
145
+
146
+ ## Audit
147
+
148
+ ```bash
149
+ python3 <engine> audit # scripts from data-catalog.json
150
+ python3 <engine> audit 'dags/**/*.py' '**/*.sql' # before init
151
+ python3 <engine> audit --json # for a worklist
152
+ ```
153
+
154
+ The audit finds the table each script writes: `TARGET_TABLE`-style constants,
155
+ `dst_db`/`dst_tbl`-style attributes, `saveAsTable`/`insertInto`, Hudi
156
+ `hoodie.table.name`, and `INSERT`/`CREATE TABLE AS`/`MERGE` in SQL text. It reads
157
+ output columns from a contract tuple (`PUBLISHED_COLUMNS`) or from the outermost
158
+ SELECT. A repo with its own naming adds `--table-name NAME`/`--schema-name NAME`,
159
+ or `tableNames`/`schemaNames` in the config.
160
+
161
+ | Finding | Means | Fix |
162
+ |---|---|---|
163
+ | `no-catalog` | writes a table, carries no metadata | [Backfill](#backfill-one-table) in the builder script |
164
+ | `undocumented` | output columns without a `Field` | write them |
165
+ | `not-in-output` | `Field`s the SELECT no longer produces | remove or rename them |
166
+ | `table-mismatch` | metadata names a table the script does not write | fix the name |
167
+ | `contract-not-derived` | contract is a literal list next to complete metadata | derive it (rule 5) |
168
+ | `relative-definition` | "same as above" text | write the row in full (rule 2) |
169
+ | `repeated-text` | most rows share a phrase | move the shared fact to the table notes |
170
+ | `code-in-description` | table names, operators or SQL functions in the meaning text | move lineage to `source` |
171
+ | `long-definition` | over 30 words or 60 Chinese characters | cut to the column's own meaning |
172
+ | `thin-definition` | text or source only restates the column name | say what it measures and where it comes from |
173
+ | `columns-unknown` | DataFrame code the audit cannot read | compare the `Field`s with `DESCRIBE <table>` by hand |
174
+ | `invalid-metadata` | the engine cannot read the metadata | the message names the line |
175
+
176
+ Report the summary line and the findings for the tables in scope. Never claim a
177
+ script is clean when its columns were `unknown`.
178
+
179
+ ## Backfill one table
180
+
181
+ 1. Pick the script that builds the table from the audit. Its backfill, migrate, and
182
+ isolated twins share the definitions and need none of their own.
183
+ 2. Read the SQL or DataFrame code for every output column. Reuse an existing
184
+ hand-written dictionary as a draft, and check every row against the code.
185
+ 3. Add `CATALOG_TABLE` and `CATALOG_FIELDS` in contract order. Keep the literal
186
+ contract while you write.
187
+ 4. Run `generate` until it passes, then derive the contract and run the repo's
188
+ schema tests (rule 5).
189
+ 5. Rerun the audit for that script, and fix `relative-definition` and
190
+ `thin-definition` findings.
191
+ 6. Commit the script and pages together. Replace the old hand-written dictionary
192
+ with a link to the generated page.
193
+
194
+ Uncertain rows: write what the code shows and list the open questions in the PR
195
+ description for the user. Never leave a placeholder `Field`; `generate` refuses
196
+ empty text.
197
+
198
+ ## Done when
199
+
200
+ - `python3 <engine> generate --check` exits 0.
201
+ - `python3 <engine> drift` exits 0, or you said in the PR why each listed definition
202
+ still holds.
203
+ - `python3 <engine> audit` has no findings for the tables you touched, or you
204
+ reported the ones left and why.
@@ -0,0 +1,3 @@
1
+ interface:
2
+ display_name: "Data catalog"
3
+ short_description: "Column definitions in table scripts, a generated markdown catalog with a staleness CI check, and an audit of SQL and Spark scripts"
@@ -0,0 +1,75 @@
1
+ ## Data catalog conventions
2
+ <!-- skill-script-path: consumer-copy -->
3
+
4
+ Every output column of a warehouse table is defined in the script that builds the
5
+ table. `docs/catalog/` is generated from those definitions; never edit it by hand.
6
+ `data-catalog.json` lists the table scripts and the languages each definition carries.
7
+
8
+ **Where definitions live**
9
+
10
+ - Python: `CATALOG_TABLE = Table("schema.table", grain=..., <language>=...)` and
11
+ `CATALOG_FIELDS = (Field("column", <language>=..., source=..., window=..., unit=...), ...)`,
12
+ imported `from catalog_fields import Field, Table`. Use plain string literals.
13
+ - SQL: a comment block above the first statement: `-- @table schema.table`, then one
14
+ `-- @field column` per column, each followed by `-- key: value` lines
15
+ (`en:`, `zh:`, `source:`, `window:`, `unit:`).
16
+ - Backfill and migration scripts that write the same table carry no definitions of
17
+ their own.
18
+
19
+ **When you change a table script**
20
+
21
+ 1. Read the table's page in `docs/catalog/` first.
22
+ 2. Add, change, or remove the column's definition in the same change as the code.
23
+ 3. Run `python3 scripts/data-catalog/data_catalog.py generate`, and commit the script
24
+ and the regenerated pages together.
25
+ 4. Run `python3 scripts/data-catalog/data_catalog.py drift`. It lists columns whose
26
+ code changed while their definition did not. Update each, or say in the PR why
27
+ it still holds.
28
+
29
+ **How to write a definition**
30
+
31
+ 1. Say each fact once, at the widest level where it is true. Filters, the window
32
+ anchor, currency, time zone, terms many columns use ("personal", "platform") and
33
+ list cleaning rules go in the table's `grain` or `notes`; a row says only what
34
+ differs for that column.
35
+ 2. The description is meaning in business words: what one value measures, its unit
36
+ and form (a ratio says 0–1 or percent; a time says date or timestamp and its
37
+ time zone), and what 0 or null means when not obvious. No table names, joins, operators or
38
+ SQL functions there.
39
+ 3. Lead with the measure in one sentence: "Number of …", "Total …", "近 30 天…笔数".
40
+ Aim for 20 English words or 40 Chinese characters.
41
+ 4. `source` is lineage in one line: upstream `table.column`, the aggregation, and only
42
+ the filters this column adds. Example: "count distinct dwd.transaction.payer_bank".
43
+ Never copy the SQL into prose.
44
+ 5. Keep caveats that change how the value is used ("names compared as exact text");
45
+ leave out mechanics that don't.
46
+ 6. The exact interval goes in `window` and the unit code in `unit`; the text says
47
+ "last 7 days" and "USD".
48
+ 7. Every language says the same thing, written naturally in that language.
49
+ 8. Write sentences, not shorthand: keep the words that carry the logic (若…则, 当…时,
50
+ if, when, because). "若窗口内无收款,则为 0", not "无收款为 0"; "It is 0 if there were no
51
+ collections.", not "0 when none".
52
+ 9. Never restate the column name or write "same as above".
53
+ 10. Cover every case: what the column holds for each kind of row, including when it
54
+ is empty; list an enumerated column's values; say so if it is always empty today.
55
+ 11. Write related columns as a set: a count and its amount, a value and its missing
56
+ flag, a legacy column and its replacement use the same scope and wording, and any
57
+ difference is stated in both rows.
58
+
59
+ Example row: `Field("payer_bank_cnt_30d", en="Number of different paying banks in the
60
+ last 30 days. It is 0 if there were no collections.", zh="近 30 天不同付款银行数;若无收款,则为 0。", source="count
61
+ distinct dwd.transaction.payer_bank", window="[dt-30d, dt)", unit="count")`
62
+
63
+ **Contracts and CI**
64
+
65
+ - A column contract (`PUBLISHED_COLUMNS`) is derived as
66
+ `tuple(f.name for f in CATALOG_FIELDS)` only once every column has a `Field`.
67
+ Before switching, check that the names and their order are unchanged.
68
+ - The `Data catalog` workflow runs `generate --check` on PRs. It fails when a page is
69
+ stale, or when an output column has no definition. The column list comes from the
70
+ contract tuple or, in SQL, from the SELECT that writes the table. `drift` is not
71
+ run in CI.
72
+ - `python3 scripts/data-catalog/data_catalog.py audit` lists scripts whose tables lack
73
+ definitions, and rows that break the writing rules (`repeated-text`,
74
+ `code-in-description`, `long-definition`, `thin-definition`, `relative-definition`).
75
+ It reports and never edits.