@1aboveio/skills 0.0.0-stage → 1.0.1

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 +207 -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 +76 -0
  29. package/skills/app-dev/data-catalog/references/field-definitions.md +123 -0
  30. package/skills/app-dev/data-catalog/references/format.md +130 -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 +1435 -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 +603 -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,207 @@
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.38.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, in every
72
+ language; the row
73
+ gives what one value measures, its unit, and 0/null meaning; `source` gives
74
+ lineage in one line. Follow the eleven principles in
75
+ [references/field-definitions.md](references/field-definitions.md).
76
+ Example: not `"Posted COLLECTION_IN rows where cust_type <> 'TEST', [dt-30d, dt), count distinct payer_bank via dim.forex join"`
77
+ but `"Number of different paying banks in the last 30 days. It is 0 if there were no collections."`
78
+ 3. **Write what the code does, read from the code.** Take the source table, filters,
79
+ and window from the SQL you read. When the code and the intended meaning
80
+ disagree, ask; never document the intent as fact.
81
+ Example: the SQL filters `status = 'POSTED'`, so the source says "posted
82
+ collections", even if the ticket said "all collections".
83
+ 4. **Edit the script, never a generated page.** `generate --check` fails while they
84
+ disagree, and when an output column has no definition: the contract tuple or, in
85
+ SQL, the SELECT writing the table, is checked against the `Field`s or `-- @field`s
86
+ ([references/format.md](references/format.md#what-ci-checks-against-the-code)).
87
+ Example: to fix a typo on a page, fix the `Field` text and run `generate`.
88
+ 5. **Derive the column contract only after every column has a `Field`.**
89
+ `PUBLISHED_COLUMNS = tuple(f.name for f in CATALOG_FIELDS)` publishes exactly the
90
+ documented columns, in `Field` order. Before switching, compare the derived tuple
91
+ with the old one: same names, same order.
92
+ Example: a 169-column table with 154 Fields would silently stop writing 15
93
+ columns. Keep the literal tuple; `generate` names the 15 until they are written.
94
+ 6. **Metadata is plain literals.** The engine reads the file without running it:
95
+ strings, implicit concatenation, `+`, module-level string constants, and
96
+ `*OTHER_FIELDS` from the same module. No f-strings, calls, or imported lists.
97
+ Example: share key columns with `KEYS = (Field(...),)` and `(*KEYS, Field(...))`
98
+ in the same file.
99
+ 7. **Audit reports; it never edits.** Fix one table per change, in the script that
100
+ builds the table, not its backfill or migration twins.
101
+ 8. **Adding the workflow adds a check, not a required one.** Make it required in
102
+ the merge rules only when the user asks.
103
+ Example: after `init --write`, report "the Data catalog check now runs on PRs
104
+ that touch table scripts; it is not required".
105
+
106
+ ## While coding
107
+
108
+ 1. Before changing a table script, read its page in `docs/catalog/`.
109
+ 2. Change the SQL or DataFrame code.
110
+ 3. Add, edit, or remove the matching `Field`. Write it with
111
+ [references/field-definitions.md](references/field-definitions.md).
112
+ 4. Run `python3 <engine> generate` and the repo's schema or contract tests.
113
+ 5. Run `python3 <engine> drift`. It lists columns whose code changed while their
114
+ definition did not, and filter or join changes with no definition touched. CI
115
+ only checks that every column has a definition; `drift` is the check that the
116
+ definitions still match the code. Update each listed definition, or say in the
117
+ PR why it still holds.
118
+ 6. Commit the script and the regenerated pages together.
119
+
120
+ Example: changing `WHERE status = 'POSTED'` to `status IN ('POSTED', 'SETTLED')`
121
+ passes CI, and `drift` reports "filters, joins or CTEs changed; no definition
122
+ changed" until the affected sources say "posted or settled".
123
+
124
+ A renamed column is a new `Field` and a removed one. Say in the new definition what
125
+ it replaced when consumers must migrate.
126
+
127
+ ## Init
128
+
129
+ ```bash
130
+ python3 <skill-base-dir>/scripts/data_catalog.py init \
131
+ --scripts 'dags/**/dwd_*.py' --scripts 'sql/**/*.sql' \
132
+ --exclude '**/*_legacy.py' --languages zh,en # dry run: prints the plan
133
+ python3 <skill-base-dir>/scripts/data_catalog.py init ... --write
134
+ ```
135
+
136
+ Scope `--scripts` to warehouse table scripts. A broad `**/*.sql` also picks up app
137
+ database migrations. `init` writes the config, the engine copy, `catalog_fields.py`
138
+ beside the scripts, the workflow, and the first catalog. Rerunning is safe, and edits
139
+ to `data-catalog.json` take effect on the next `init --write`. After a skill update,
140
+ rerun both `init --write` and `persist-conventions.mjs --write` so the repo's copies
141
+ match.
142
+
143
+ The scripts import `from catalog_fields import Field, Table` at run time, so the
144
+ module must ship with them like any sibling module (for example `--py-files` on
145
+ `spark-submit`). Check that before merging.
146
+
147
+ ## Audit
148
+
149
+ ```bash
150
+ python3 <engine> audit # scripts from data-catalog.json
151
+ python3 <engine> audit 'dags/**/*.py' '**/*.sql' # before init
152
+ python3 <engine> audit --json # for a worklist
153
+ ```
154
+
155
+ The audit finds the table each script writes: `TARGET_TABLE`-style constants,
156
+ `dst_db`/`dst_tbl`-style attributes, `saveAsTable`/`insertInto`, Hudi
157
+ `hoodie.table.name`, and `INSERT`/`CREATE TABLE AS`/`MERGE` in SQL text. It reads
158
+ output columns from a contract tuple (`PUBLISHED_COLUMNS`) or from the outermost
159
+ SELECT. A repo with its own naming adds `--table-name NAME`/`--schema-name NAME`,
160
+ or `tableNames`/`schemaNames` in the config.
161
+
162
+ | Finding | Means | Fix |
163
+ |---|---|---|
164
+ | `no-catalog` | writes a table, carries no metadata | [Backfill](#backfill-one-table) in the builder script |
165
+ | `undocumented` | output columns without a `Field` | write them |
166
+ | `not-in-output` | `Field`s the SELECT no longer produces | remove or rename them |
167
+ | `table-mismatch` | metadata names a table the script does not write | fix the name |
168
+ | `contract-not-derived` | contract is a literal list next to complete metadata | derive it (rule 5) |
169
+ | `relative-definition` | "same as above" text | write the row in full (rule 2) |
170
+ | `repeated-text` | most rows share a phrase | move the shared fact to the table notes |
171
+ | `code-in-description` | table names, operators or SQL functions in the meaning text | move lineage to `source` |
172
+ | `long-definition` | over 30 words or 60 Chinese characters | cut to the column's own meaning |
173
+ | `thin-definition` | text or source only restates the column name | say what it measures and where it comes from |
174
+ | `columns-unknown` | DataFrame code the audit cannot read | compare the `Field`s with `DESCRIBE <table>` by hand |
175
+ | `invalid-metadata` | the engine cannot read the metadata | the message names the line |
176
+
177
+ Report the summary line and the findings for the tables in scope. Never claim a
178
+ script is clean when its columns were `unknown`.
179
+
180
+ ## Backfill one table
181
+
182
+ 1. Pick the script that builds the table from the audit. Backfill, migration, and
183
+ copy scripts that write the same table share its definitions and need none of
184
+ their own.
185
+ 2. Read the SQL or DataFrame code for every output column. Reuse an existing
186
+ hand-written dictionary as a draft, and check every row against the code.
187
+ 3. Add `CATALOG_TABLE` and `CATALOG_FIELDS` in contract order. Keep the literal
188
+ contract while you write.
189
+ 4. Run `generate` until it passes, then derive the contract and run the repo's
190
+ schema tests (rule 5).
191
+ 5. Rerun the audit for that script and fix its writing findings (`repeated-text`,
192
+ `code-in-description`, `long-definition`, `thin-definition`,
193
+ `relative-definition`), or leave one only when the text really belongs in that row.
194
+ 6. Commit the script and pages together. Replace the old hand-written dictionary
195
+ with a link to the generated page.
196
+
197
+ Uncertain rows: write what the code shows and list the open questions in the PR
198
+ description for the user. Never leave a placeholder `Field`; `generate` refuses
199
+ empty text.
200
+
201
+ ## Done when
202
+
203
+ - `python3 <engine> generate --check` exits 0.
204
+ - `python3 <engine> drift` exits 0, or you said in the PR why each listed definition
205
+ still holds.
206
+ - `python3 <engine> audit` has no findings for the tables you touched, or you
207
+ 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,76 @@
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", <language>=..., grain_<language>=...,
11
+ notes_<language>=(...))` (grain and notes in every language) and
12
+ `CATALOG_FIELDS = (Field("column", <language>=..., source=..., window=..., unit=...), ...)`,
13
+ imported `from catalog_fields import Field, Table`. Use plain string literals.
14
+ - SQL: a comment block above the first statement: `-- @table schema.table`, then one
15
+ `-- @field column` per column, each followed by `-- key: value` lines
16
+ (`en:`, `zh:`, `source:`, `window:`, `unit:`).
17
+ - Backfill and migration scripts that write the same table carry no definitions of
18
+ their own.
19
+
20
+ **When you change a table script**
21
+
22
+ 1. Read the table's page in `docs/catalog/` first.
23
+ 2. Add, change, or remove the column's definition in the same change as the code.
24
+ 3. Run `python3 scripts/data-catalog/data_catalog.py generate`, and commit the script
25
+ and the regenerated pages together.
26
+ 4. Run `python3 scripts/data-catalog/data_catalog.py drift`. It lists columns whose
27
+ code changed while their definition did not. Update each, or say in the PR why
28
+ it still holds.
29
+
30
+ **How to write a definition**
31
+
32
+ 1. Say each fact once, at the widest level where it is true. Filters, the window
33
+ anchor, currency, time zone, terms many columns use ("personal", "platform") and
34
+ list cleaning rules go in the table's grain or notes; a row says only what
35
+ differs for that column.
36
+ 2. The description is meaning in business words: what one value measures, its unit
37
+ and form (a ratio says 0–1 or percent; a time says date or timestamp and its
38
+ time zone), and what 0 or null means when not obvious. No table names, joins, operators or
39
+ SQL functions there.
40
+ 3. Lead with the measure in one sentence: "Number of …", "Total …", "近 30 天…笔数".
41
+ Aim for 20 English words or 40 Chinese characters.
42
+ 4. `source` is lineage in one line: upstream `table.column`, the aggregation, and only
43
+ the filters this column adds. Example: "count distinct dwd.transaction.payer_bank".
44
+ Never copy the SQL into prose.
45
+ 5. Keep caveats that change how the value is used ("names compared as exact text");
46
+ leave out mechanics that don't.
47
+ 6. The exact interval goes in `window` and the unit code in `unit`; the text says
48
+ "last 7 days" and "USD".
49
+ 7. Every language says the same thing, written naturally in that language.
50
+ 8. Write sentences, not shorthand: keep the words that carry the logic (若…则, 当…时,
51
+ if, when, because). "若窗口内无收款,则为 0", not "无收款为 0"; "It is 0 if there were no
52
+ collections.", not "0 when none".
53
+ 9. Never restate the column name or write "same as above".
54
+ 10. Cover every case: what the column holds for each kind of row, including when it
55
+ is empty; list an enumerated column's values; say so if it is always empty today.
56
+ 11. Write related columns as a set: a count and its amount, a value and its missing
57
+ flag, a legacy column and its replacement use the same scope and wording, and any
58
+ difference is stated in both rows.
59
+
60
+ Example row: `Field("payer_bank_cnt_30d", en="Number of different paying banks in the
61
+ last 30 days. It is 0 if there were no collections.", zh="近 30 天不同付款银行数;若无收款,则为 0。", source="count
62
+ distinct dwd.transaction.payer_bank", window="[dt-30d, dt)", unit="count")`
63
+
64
+ **Contracts and CI**
65
+
66
+ - A column contract (`PUBLISHED_COLUMNS`) is derived as
67
+ `tuple(f.name for f in CATALOG_FIELDS)` only once every column has a `Field`.
68
+ Before switching, check that the names and their order are unchanged.
69
+ - The `Data catalog` workflow runs `generate --check` on PRs. It fails when a page is
70
+ stale, or when an output column has no definition. The column list comes from the
71
+ contract tuple or, in SQL, from the SELECT that writes the table. `drift` is not
72
+ run in CI.
73
+ - `python3 scripts/data-catalog/data_catalog.py audit` lists scripts whose tables lack
74
+ definitions, and rows that break the writing rules (`repeated-text`,
75
+ `code-in-description`, `long-definition`, `thin-definition`, `relative-definition`).
76
+ It reports and never edits.