@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,194 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Convert Markdown to WeChat-compatible HTML.
4
+
5
+ WeChat requirements:
6
+ - All styles must be INLINE (no <style> tags, no external CSS)
7
+ - Images must reference WeChat CDN URLs (not local paths)
8
+ - No <html>/<head>/<body> wrapper needed (WeChat wraps it)
9
+ - Default body block is <div>, not <p>, to avoid phantom editable blank lines in WeChat editor
10
+ - Keep output flat and avoid nested block wrappers where possible
11
+
12
+ Usage:
13
+ python3 md_to_wechat_html.py input.md > output.html
14
+ python3 md_to_wechat_html.py input.md --output output.html
15
+ """
16
+
17
+ import argparse
18
+ import re
19
+ import sys
20
+
21
+
22
+ # ---------------------------------------------------------------------------
23
+ # Inline style constants
24
+ # ---------------------------------------------------------------------------
25
+
26
+ STYLES = {
27
+ "h1": 'font-size:22px;font-weight:bold;color:#1a1a1a;margin:24px 0 12px;line-height:1.4;',
28
+ "h2": 'font-size:18px;font-weight:bold;color:#1a1a1a;margin:20px 0 10px;line-height:1.4;',
29
+ "h3": 'font-size:16px;font-weight:bold;color:#333;margin:16px 0 8px;line-height:1.4;',
30
+ "div": 'font-size:15px;color:#333;line-height:1.8;margin:0 0 12px;',
31
+ "li": 'font-size:15px;color:#333;line-height:1.8;margin:4px 0;',
32
+ "code_inline": (
33
+ 'background:#f5f5f5;border-radius:3px;padding:2px 5px;'
34
+ 'font-family:monospace;font-size:13px;color:#e83e8c;'
35
+ ),
36
+ "code_block": (
37
+ 'background:#f5f5f5;border-radius:6px;padding:14px 16px;margin:12px 0;'
38
+ 'font-family:monospace;font-size:13px;color:#333;'
39
+ 'white-space:pre-wrap;word-break:break-all;overflow-x:auto;display:block;'
40
+ ),
41
+ "hr": 'border:none;border-top:1px solid #e0e0e0;margin:24px 0;',
42
+ "strong": 'font-weight:bold;color:#1a1a1a;',
43
+ "em": 'font-style:italic;',
44
+ "img": 'max-width:100%;height:auto;display:block;margin:12px auto;border-radius:4px;',
45
+ }
46
+
47
+
48
+ # ---------------------------------------------------------------------------
49
+ # Converter
50
+ # ---------------------------------------------------------------------------
51
+
52
+ def md_to_html(md: str) -> str:
53
+ lines = md.split("\n")
54
+ html_parts = []
55
+ i = 0
56
+
57
+ while i < len(lines):
58
+ line = lines[i]
59
+
60
+ # --- Fenced code block ---
61
+ if line.startswith("```"):
62
+ code_lines = []
63
+ i += 1
64
+ while i < len(lines) and not lines[i].startswith("```"):
65
+ code_lines.append(lines[i])
66
+ i += 1
67
+ code = "\n".join(code_lines)
68
+ code = code.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
69
+ html_parts.append(f'<code style="{STYLES["code_block"]}">{code}</code>')
70
+ i += 1
71
+ continue
72
+
73
+ # --- Headings ---
74
+ m = re.match(r'^(#{1,3})\s+(.*)', line)
75
+ if m:
76
+ level = len(m.group(1))
77
+ text = inline(m.group(2))
78
+ tag = f"h{level}"
79
+ html_parts.append(f'<{tag} style="{STYLES[tag]}">{text}</{tag}>')
80
+ i += 1
81
+ continue
82
+
83
+ # --- Horizontal rule ---
84
+ if re.match(r'^[-*_]{3,}\s*$', line):
85
+ html_parts.append(f'<hr style="{STYLES["hr"]}">')
86
+ i += 1
87
+ continue
88
+
89
+ # --- Blockquote lines become normal body blocks ---
90
+ if line.startswith("> "):
91
+ bq_lines = []
92
+ while i < len(lines) and lines[i].startswith("> "):
93
+ bq_lines.append(lines[i][2:])
94
+ i += 1
95
+ content = inline(" ".join(bq_lines))
96
+ html_parts.append(f'<div style="{STYLES["div"]}">{content}</div>')
97
+ continue
98
+
99
+ # --- Unordered list: flatten into normal body blocks to avoid editor quirks ---
100
+ if re.match(r'^[-*+]\s+', line):
101
+ while i < len(lines) and re.match(r'^[-*+]\s+', lines[i]):
102
+ item = inline(re.sub(r'^[-*+]\s+', '', lines[i]))
103
+ html_parts.append(f'<div style="{STYLES["div"]}">• {item}</div>')
104
+ i += 1
105
+ continue
106
+
107
+ # --- Ordered list: flatten into normal body blocks to avoid editor quirks ---
108
+ if re.match(r'^\d+\.\s+', line):
109
+ n = 1
110
+ while i < len(lines) and re.match(r'^\d+\.\s+', lines[i]):
111
+ item = inline(re.sub(r'^\d+\.\s+', '', lines[i]))
112
+ html_parts.append(f'<div style="{STYLES["div"]}">{n}. {item}</div>')
113
+ i += 1
114
+ n += 1
115
+ continue
116
+
117
+ # --- Blank line ---
118
+ if line.strip() == "":
119
+ i += 1
120
+ continue
121
+
122
+ # --- Paragraph ---
123
+ para_lines = []
124
+ while i < len(lines) and lines[i].strip() != "" and not lines[i].startswith("#") \
125
+ and not lines[i].startswith("```") and not lines[i].startswith("> ") \
126
+ and not re.match(r'^[-*+]\s+', lines[i]) and not re.match(r'^\d+\.\s+', lines[i]) \
127
+ and not re.match(r'^[-*_]{3,}\s*$', lines[i]):
128
+ para_lines.append(lines[i])
129
+ i += 1
130
+ text = inline(" ".join(para_lines))
131
+ html_parts.append(f'<div style="{STYLES["div"]}">{text}</div>')
132
+
133
+ return "".join(html_parts)
134
+
135
+
136
+ def inline(text: str) -> str:
137
+ """Apply inline formatting: bold, italic, code, links, images."""
138
+ # Escape HTML first (preserve already-escaped entities)
139
+ text = text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
140
+
141
+ # Images: ![alt](url)
142
+ text = re.sub(
143
+ r'!\[([^\]]*)\]\(([^)]+)\)',
144
+ lambda m: f'<img src="{m.group(2)}" alt="{m.group(1)}" style="{STYLES["img"]}">',
145
+ text
146
+ )
147
+ # Links: [text](url)
148
+ text = re.sub(
149
+ r'\[([^\]]+)\]\(([^)]+)\)',
150
+ lambda m: f'<a href="{m.group(2)}" style="color:#07c160;">{m.group(1)}</a>',
151
+ text
152
+ )
153
+ # Bold: **text** or __text__
154
+ text = re.sub(
155
+ r'\*\*(.+?)\*\*|__(.+?)__',
156
+ lambda m: f'<strong style="{STYLES["strong"]}">{m.group(1) or m.group(2)}</strong>',
157
+ text
158
+ )
159
+ # Italic: *text* or _text_
160
+ text = re.sub(
161
+ r'\*(.+?)\*|_(.+?)_',
162
+ lambda m: f'<em style="{STYLES["em"]}">{m.group(1) or m.group(2)}</em>',
163
+ text
164
+ )
165
+ # Inline code: `code`
166
+ text = re.sub(
167
+ r'`([^`]+)`',
168
+ lambda m: f'<code style="{STYLES["code_inline"]}">{m.group(1)}</code>',
169
+ text
170
+ )
171
+ return text
172
+
173
+
174
+ def main():
175
+ parser = argparse.ArgumentParser()
176
+ parser.add_argument("input", help="Input Markdown file")
177
+ parser.add_argument("--output", "-o", help="Output HTML file (default: stdout)")
178
+ args = parser.parse_args()
179
+
180
+ with open(args.input, "r", encoding="utf-8") as f:
181
+ md = f.read()
182
+
183
+ html = md_to_html(md)
184
+
185
+ if args.output:
186
+ with open(args.output, "w", encoding="utf-8") as f:
187
+ f.write(html)
188
+ print(f"Written to {args.output}", file=sys.stderr)
189
+ else:
190
+ print(html)
191
+
192
+
193
+ if __name__ == "__main__":
194
+ main()
@@ -0,0 +1,239 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ WeChat Official Account Publisher
4
+ Publishes an article to a WeChat Official Account draft box (and optionally publishes it live).
5
+
6
+ Usage:
7
+ python3 publish.py \
8
+ --appid wx1234567890 \
9
+ --appsecret <secret> \
10
+ --title "文章标题" \
11
+ --html article.html \
12
+ --thumb-image cover.jpg \
13
+ [--author "作者"] \
14
+ [--digest "摘要(最多120字)"] \
15
+ [--publish] # push draft live immediately (skips manual review)
16
+
17
+ Outputs JSON: { "ok": true, "draft_media_id": "...", "publish_id": "..." }
18
+ """
19
+
20
+ import argparse
21
+ import json
22
+ import os
23
+ import sys
24
+ import time
25
+ import requests
26
+
27
+
28
+ # ---------------------------------------------------------------------------
29
+ # Token management (cached in /tmp to avoid hitting the 2000/day limit)
30
+ # ---------------------------------------------------------------------------
31
+
32
+ TOKEN_CACHE = "/tmp/wechat_access_token.json"
33
+
34
+
35
+ def get_access_token(appid: str, appsecret: str) -> str:
36
+ """Return a valid access_token, refreshing from cache if still valid.
37
+
38
+ Uses WeChat stable access token API (POST /cgi-bin/stable_token) instead of
39
+ the legacy GET /cgi-bin/token endpoint. This is required for Agentier and
40
+ newer WeChat Official Account integrations.
41
+ """
42
+ if os.path.exists(TOKEN_CACHE):
43
+ with open(TOKEN_CACHE) as f:
44
+ cached = json.load(f)
45
+ if cached.get("appid") == appid and cached.get("expires_at", 0) > time.time() + 60:
46
+ return cached["access_token"]
47
+
48
+ # Use stable token API (POST) instead of legacy GET endpoint
49
+ url = "https://api.weixin.qq.com/cgi-bin/stable_token"
50
+ payload = {
51
+ "grant_type": "client_credential",
52
+ "appid": appid,
53
+ "secret": appsecret,
54
+ "force_refresh": False
55
+ }
56
+ resp = requests.post(
57
+ url,
58
+ json=payload,
59
+ headers={"Content-Type": "application/json"},
60
+ timeout=10
61
+ )
62
+ resp.raise_for_status()
63
+ data = resp.json()
64
+
65
+ if "errcode" in data and data["errcode"] != 0:
66
+ raise RuntimeError(f"get_access_token failed: {data}")
67
+
68
+ token = data["access_token"]
69
+ expires_at = time.time() + data.get("expires_in", 7200) - 300 # 5-min buffer
70
+
71
+ with open(TOKEN_CACHE, "w") as f:
72
+ json.dump({"appid": appid, "access_token": token, "expires_at": expires_at}, f)
73
+
74
+ return token
75
+
76
+
77
+ # ---------------------------------------------------------------------------
78
+ # Media upload (cover image → permanent thumb material)
79
+ # ---------------------------------------------------------------------------
80
+
81
+ def upload_thumb(token: str, image_path: str) -> str:
82
+ """Upload a cover image as a permanent material and return media_id."""
83
+ url = f"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={token}&type=thumb"
84
+ with open(image_path, "rb") as f:
85
+ resp = requests.post(url, files={"media": f}, timeout=30)
86
+ resp.raise_for_status()
87
+ data = resp.json()
88
+ if data.get("errcode", 0) != 0:
89
+ raise RuntimeError(f"upload_thumb failed: {data}")
90
+ return data["media_id"]
91
+
92
+
93
+ def upload_article_image(token: str, image_path: str) -> str:
94
+ """Upload an image embedded inside an article and return its CDN URL."""
95
+ url = f"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token={token}"
96
+ with open(image_path, "rb") as f:
97
+ resp = requests.post(url, files={"media": f}, timeout=30)
98
+ resp.raise_for_status()
99
+ data = resp.json()
100
+ if "url" not in data:
101
+ raise RuntimeError(f"upload_article_image failed: {data}")
102
+ return data["url"]
103
+
104
+
105
+ # ---------------------------------------------------------------------------
106
+ # Draft creation
107
+ # ---------------------------------------------------------------------------
108
+
109
+ def add_draft(token: str, title: str, html_content: str, thumb_media_id: str,
110
+ author: str = "", digest: str = "") -> str:
111
+ """Create a draft and return its media_id."""
112
+ url = f"https://api.weixin.qq.com/cgi-bin/draft/add?access_token={token}"
113
+ payload = {
114
+ "articles": [
115
+ {
116
+ "title": title,
117
+ "author": author,
118
+ "digest": digest,
119
+ "content": html_content,
120
+ "thumb_media_id": thumb_media_id,
121
+ "need_open_comment": 0,
122
+ "only_fans_can_comment": 0,
123
+ }
124
+ ]
125
+ }
126
+ # Use ensure_ascii=False so Chinese characters are sent as UTF-8, not \uXXXX escapes.
127
+ # WeChat stores the raw JSON bytes; ensure_ascii=True causes it to show literal \\uXXXX.
128
+ body = json.dumps(payload, ensure_ascii=False).encode("utf-8")
129
+ resp = requests.post(url, data=body, headers={"Content-Type": "application/json; charset=utf-8"}, timeout=15)
130
+ resp.raise_for_status()
131
+ data = resp.json()
132
+ if data.get("errcode", 0) != 0:
133
+ raise RuntimeError(f"add_draft failed: {data}")
134
+ return data["media_id"]
135
+
136
+
137
+ # ---------------------------------------------------------------------------
138
+ # Free-publish (optional: push draft live without manual review)
139
+ # ---------------------------------------------------------------------------
140
+
141
+ def submit_publish(token: str, draft_media_id: str) -> str:
142
+ """Submit a draft for publishing and return publish_id."""
143
+ url = f"https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token={token}"
144
+ body = json.dumps({"media_id": draft_media_id}, ensure_ascii=False).encode("utf-8")
145
+ resp = requests.post(url, data=body, headers={"Content-Type": "application/json; charset=utf-8"}, timeout=15)
146
+ resp.raise_for_status()
147
+ data = resp.json()
148
+ if data.get("errcode", 0) != 0:
149
+ raise RuntimeError(f"submit_publish failed: {data}")
150
+ return str(data.get("publish_id", ""))
151
+
152
+
153
+ def poll_publish_status(token: str, publish_id: str, max_wait: int = 60) -> dict:
154
+ """Poll until publish completes or times out. Returns status dict."""
155
+ url = f"https://api.weixin.qq.com/cgi-bin/freepublish/get?access_token={token}"
156
+ deadline = time.time() + max_wait
157
+ while time.time() < deadline:
158
+ body = json.dumps({"publish_id": publish_id}, ensure_ascii=False).encode("utf-8")
159
+ resp = requests.post(url, data=body, headers={"Content-Type": "application/json; charset=utf-8"}, timeout=10)
160
+ resp.raise_for_status()
161
+ data = resp.json()
162
+ status = data.get("publish_status", -1)
163
+ # 0 = success, 1 = publishing, 2 = failed, 4 = deleted
164
+ if status == 0:
165
+ return {"status": "success", "article_id": data.get("article_id", "")}
166
+ if status in (2, 4):
167
+ return {"status": "failed", "detail": data}
168
+ time.sleep(3)
169
+ return {"status": "timeout"}
170
+
171
+
172
+ # ---------------------------------------------------------------------------
173
+ # Main
174
+ # ---------------------------------------------------------------------------
175
+
176
+ def main():
177
+ parser = argparse.ArgumentParser(description="WeChat Official Account Publisher")
178
+ parser.add_argument("--appid", required=True)
179
+ parser.add_argument("--appsecret", required=True)
180
+ parser.add_argument("--title", required=True)
181
+ parser.add_argument("--html", required=True, help="Path to HTML article body file")
182
+ parser.add_argument("--thumb-image", required=True, help="Path to cover image (JPEG/PNG, ≤64KB for thumb)")
183
+ parser.add_argument("--author", default="")
184
+ parser.add_argument("--digest", default="", help="Article summary (≤120 chars)")
185
+ parser.add_argument("--publish", action="store_true", help="Also submit draft for live publishing")
186
+ args = parser.parse_args()
187
+
188
+ result = {}
189
+
190
+ try:
191
+ # 1. Get token
192
+ token = get_access_token(args.appid, args.appsecret)
193
+
194
+ # 2. Upload cover image
195
+ print(f"Uploading cover image: {args.thumb_image}", file=sys.stderr)
196
+ thumb_media_id = upload_thumb(token, args.thumb_image)
197
+
198
+ # 3. Read HTML content
199
+ with open(args.html, "r", encoding="utf-8") as f:
200
+ html_content = f.read()
201
+
202
+ # 3b. Validate title and digest byte limits (WeChat uses UTF-8 byte count, not char count)
203
+ title_bytes = len(args.title.encode("utf-8"))
204
+ digest_bytes = len(args.digest.encode("utf-8"))
205
+ if title_bytes > 64:
206
+ raise ValueError(f"Title exceeds 64-byte limit ({title_bytes} bytes / ~{title_bytes//3} Chinese chars). Shorten the title.")
207
+ if digest_bytes > 120:
208
+ raise ValueError(f"Digest exceeds 120-byte limit ({digest_bytes} bytes / ~{digest_bytes//3} Chinese chars). Shorten the digest.")
209
+
210
+ # 4. Create draft
211
+ print(f"Creating draft: {args.title}", file=sys.stderr)
212
+ draft_media_id = add_draft(
213
+ token, args.title, html_content, thumb_media_id,
214
+ author=args.author, digest=args.digest
215
+ )
216
+ result["ok"] = True
217
+ result["draft_media_id"] = draft_media_id
218
+ print(f"Draft created: {draft_media_id}", file=sys.stderr)
219
+
220
+ # 5. Optionally publish live
221
+ if args.publish:
222
+ print("Submitting for publishing...", file=sys.stderr)
223
+ publish_id = submit_publish(token, draft_media_id)
224
+ result["publish_id"] = publish_id
225
+ status = poll_publish_status(token, publish_id)
226
+ result["publish_status"] = status
227
+ print(f"Publish status: {status}", file=sys.stderr)
228
+
229
+ except Exception as e:
230
+ result["ok"] = False
231
+ result["error"] = str(e)
232
+ print(json.dumps(result))
233
+ sys.exit(1)
234
+
235
+ print(json.dumps(result))
236
+
237
+
238
+ if __name__ == "__main__":
239
+ main()
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,211 @@
1
+ ---
2
+ name: wechat-search
3
+ description: "Search WeChat 公众号 articles via Sogou Weixin, or read/summarize an article from a mp.weixin.qq.com URL (读/分析/总结) — suggest proactively when such a URL appears. Use for Chinese WeChat content, industry reports, competitor or trending topics. Requires Chrome Browser Relay. NOT general web search (web_search)."
4
+ release-version: 0.36.0
5
+ ---
6
+ **Updates:** Once/session run `node <skill-base-dir>/release-check.mjs`.
7
+ # WeChat Article Search & Reader (搜狗微信搜索)
8
+
9
+ Two modes:
10
+ 1. **Search mode** — search 公众号 articles via Sogou WeChat Search
11
+ 2. **Read mode** — read a full article from a `mp.weixin.qq.com` URL
12
+
13
+ ## Step 0: Ensure Chrome is Running (MANDATORY — run before anything else)
14
+
15
+ **Every session must start here.** Do not skip this step.
16
+
17
+ ### Check if Chrome CDP is available
18
+
19
+ ```bash
20
+ curl -s --max-time 2 http://localhost:18801/json/version
21
+ ```
22
+
23
+ - **Returns JSON** → Chrome is ready, proceed to the workflow
24
+ - **Fails / empty** → Chrome is not running, start it now (see below)
25
+
26
+ ### Start Chrome (Linux)
27
+
28
+ Run the bundled script — it auto-detects the Chrome binary and waits until CDP is ready:
29
+
30
+ ```bash
31
+ bash {baseDir}/scripts/start-chrome.sh
32
+ ```
33
+
34
+ Expected output:
35
+ ```
36
+ 🚀 Starting Chrome...
37
+ ⏳ Waiting for CDP... ready!
38
+ ✅ Chrome CDP available at http://localhost:18801
39
+ ```
40
+
41
+ If the script errors with "Chrome not found", install Chrome:
42
+ ```bash
43
+ # Debian/Ubuntu
44
+ sudo apt install google-chrome-stable
45
+ # Fedora
46
+ sudo dnf install google-chrome-stable
47
+ # Snap
48
+ sudo snap install chromium
49
+ ```
50
+
51
+ ### Start Chrome (macOS / Windows)
52
+
53
+ **macOS:**
54
+ ```bash
55
+ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
56
+ --remote-debugging-port=18801 \
57
+ --user-data-dir=/tmp/chrome-cdp-profile \
58
+ --no-first-run &
59
+ ```
60
+
61
+ **Windows:**
62
+ ```bat
63
+ "C:\Program Files\Google\Chrome\Application\chrome.exe" ^
64
+ --remote-debugging-port=18801 ^
65
+ --user-data-dir=%TEMP%\chrome-cdp-profile ^
66
+ --no-first-run
67
+ ```
68
+
69
+ > **Tip:** Reuse the same `--user-data-dir` across sessions to preserve WeChat login state.
70
+
71
+ ### Get tab ID (required for all browser calls)
72
+
73
+ ```
74
+ browser action=tabs profile=chrome
75
+ ```
76
+
77
+ Use the first `targetId` from the response in all subsequent `browser` calls.
78
+
79
+ **Key parameters:**
80
+ ```
81
+ profile=chrome # CDP on localhost:18801 (real browser — avoids anti-bot)
82
+ targetId=<id> # from browser action=tabs
83
+ ```
84
+
85
+ ---
86
+
87
+ ## Mode 1: Read Article from URL
88
+
89
+ Triggered when user provides a `mp.weixin.qq.com` URL.
90
+
91
+ ### Step 1: Try web_fetch first
92
+
93
+ ```
94
+ web_fetch url="<mp.weixin.qq.com URL>"
95
+ ```
96
+
97
+ If successful, extract and present:
98
+ - **标题** — article title
99
+ - **公众号** — account name (author)
100
+ - **发布时间** — publish date
101
+ - **正文** — full body text
102
+
103
+ ### Step 2: If web_fetch blocked (requires login), use browser
104
+
105
+ ```
106
+ # Get attached tab ID
107
+ browser action=tabs profile=chrome
108
+ # → use the first targetId from the response
109
+
110
+ browser action=navigate profile=chrome targetId=<id> targetUrl="<mp.weixin.qq.com URL>"
111
+ # Wait ~2s for page to load
112
+ browser action=snapshot profile=chrome targetId=<id>
113
+ ```
114
+
115
+ Extract title, 公众号 name, date, and body text from the snapshot.
116
+
117
+ ### Output format (Read mode)
118
+
119
+ ```
120
+ 📄 **[标题]**
121
+ 公众号:[账号名] · [发布时间]
122
+
123
+ [正文内容,完整呈现或摘要视长度而定]
124
+ ```
125
+
126
+ ---
127
+
128
+ ## Mode 2: Search Articles
129
+
130
+ Triggered when user wants to search for WeChat content by keyword.
131
+
132
+ ### Step 1: Get tab ID
133
+
134
+ Complete **Step 0** first. Then get the tab ID:
135
+
136
+ ```
137
+ browser action=tabs profile=chrome
138
+ ```
139
+
140
+ Use the first `targetId` for all subsequent browser calls.
141
+
142
+ ### Step 2: Navigate to Sogou WeChat Search
143
+
144
+ ```
145
+ browser action=navigate profile=chrome targetId=<id> targetUrl="https://weixin.sogou.com/"
146
+ ```
147
+
148
+ ### Step 3: Snapshot to find search box
149
+
150
+ ```
151
+ browser action=snapshot profile=chrome targetId=<id>
152
+ ```
153
+
154
+ Look for the `textbox` element (search input).
155
+
156
+ ### Step 4: Type query and submit
157
+
158
+ ```
159
+ browser action=act profile=chrome targetId=<id>
160
+ request: { kind: "type", ref: "<search_box_ref>", text: "<query>", submit: true }
161
+ ```
162
+
163
+ Wait ~2 seconds for results to load, then snapshot.
164
+
165
+ ### Step 5: Parse results
166
+
167
+ ```
168
+ browser action=snapshot profile=chrome targetId=<id> compact=true
169
+ ```
170
+
171
+ If no results (empty list or "未找到相关结果"), report "未找到与「<query>」相关的公众号文章" and suggest refining the keyword.
172
+
173
+ Extract from snapshot:
174
+ - **Title**: from `heading` elements (h3)
175
+ - **Source** (公众号名): text after the article summary
176
+ - **Date**: text next to source name
177
+ - **Link**: the `/link?url=...` href (Sogou redirect URL)
178
+
179
+ ### Step 6: Pagination (optional)
180
+
181
+ Click page links to get more results. Max 10 pages.
182
+
183
+ ### Search Types
184
+
185
+ - **搜文章** (default): `https://weixin.sogou.com/` and search
186
+ - **搜公众号**: navigate to `https://weixin.sogou.com/weixin?type=1&query=<keyword>`
187
+
188
+ ### Output format (Search mode)
189
+
190
+ ```
191
+ 1. **<Title>** — <Source> (<Date>)
192
+ <Link>
193
+ 2. **<Title>** — <Source> (<Date>)
194
+ <Link>
195
+ ...
196
+ ```
197
+
198
+ ---
199
+
200
+ ## Limitations
201
+
202
+ - **Rate limiting**: Space out searches — no more than a few per minute
203
+ - **Captcha**: If triggered, screenshot and ask the user to solve it manually
204
+ - **Max 10 pages** per query (~100 results)
205
+ - **Sogou redirect URLs expire** — extract real `mp.weixin.qq.com` URLs promptly if needed
206
+
207
+ ## Anti-Detection Tips
208
+
209
+ - Use natural delays between actions
210
+ - Don't paginate through all 10 pages rapidly
211
+ - If captcha triggers, wait a few minutes before retrying