@huicai/cli 2026.804.0 → 2026.1019.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 (486) hide show
  1. package/LICENSE +391 -32
  2. package/README.md +176 -10
  3. package/bin/huicai.js +166 -73
  4. package/package.json +27 -8
  5. package/skills/ab-testing/trigger-cases.json +30 -0
  6. package/skills/academic-writing/trigger-cases.json +30 -0
  7. package/skills/accounting-ops/trigger-cases.json +30 -0
  8. package/skills/ai-agent/trigger-cases.json +30 -0
  9. package/skills/ai-aiops/trigger-cases.json +30 -0
  10. package/skills/ai-coding/trigger-cases.json +30 -0
  11. package/skills/ai-compliance/trigger-cases.json +30 -0
  12. package/skills/ai-eval/trigger-cases.json +30 -0
  13. package/skills/ai-llm-app/trigger-cases.json +30 -0
  14. package/skills/ai-mlops/trigger-cases.json +30 -0
  15. package/skills/ai-multimodal/trigger-cases.json +30 -0
  16. package/skills/ai-prompt/trigger-cases.json +30 -0
  17. package/skills/ai-rag/trigger-cases.json +30 -0
  18. package/skills/anomaly-detection/trigger-cases.json +30 -0
  19. package/skills/api-design/trigger-cases.json +31 -0
  20. package/skills/api-integration/trigger-cases.json +31 -0
  21. package/skills/arch-design/trigger-cases.json +12 -0
  22. package/skills/arch-diagram/SKILL.md +118 -0
  23. package/skills/arch-diagram/trigger-cases.json +30 -0
  24. package/skills/arch-distributed/trigger-cases.json +30 -0
  25. package/skills/arch-multitenant/trigger-cases.json +30 -0
  26. package/skills/audio-brief/SKILL.md +65 -0
  27. package/skills/audio-brief/trigger-cases.json +30 -0
  28. package/skills/audit-assist/trigger-cases.json +30 -0
  29. package/skills/audit-chain/trigger-cases.json +31 -0
  30. package/skills/banking-credit/trigger-cases.json +30 -0
  31. package/skills/brand-design/trigger-cases.json +30 -0
  32. package/skills/business-plan/trigger-cases.json +30 -0
  33. package/skills/capital-ops/trigger-cases.json +30 -0
  34. package/skills/cicd-pipeline/trigger-cases.json +31 -0
  35. package/skills/code-archaeology/SKILL.md +55 -0
  36. package/skills/code-archaeology/trigger-cases.json +9 -0
  37. package/skills/code-quality/SKILL.md +138 -0
  38. package/skills/code-quality/references/languages.md +107 -0
  39. package/skills/code-quality/scripts/__pycache__/code_battery.cpython-312.pyc +0 -0
  40. package/skills/code-quality/scripts/__pycache__/code_check.cpython-312.pyc +0 -0
  41. package/skills/code-quality/scripts/__pycache__/code_check.cpython-313.pyc +0 -0
  42. package/skills/code-quality/scripts/__pycache__/code_csharp.cpython-312.pyc +0 -0
  43. package/skills/code-quality/scripts/__pycache__/code_csharp.cpython-313.pyc +0 -0
  44. package/skills/code-quality/scripts/__pycache__/code_fix.cpython-312.pyc +0 -0
  45. package/skills/code-quality/scripts/__pycache__/code_fix.cpython-313.pyc +0 -0
  46. package/skills/code-quality/scripts/__pycache__/code_java.cpython-312.pyc +0 -0
  47. package/skills/code-quality/scripts/__pycache__/code_java.cpython-313.pyc +0 -0
  48. package/skills/code-quality/scripts/__pycache__/code_jsts.cpython-312.pyc +0 -0
  49. package/skills/code-quality/scripts/__pycache__/code_jsts.cpython-313.pyc +0 -0
  50. package/skills/code-quality/scripts/__pycache__/code_lens.cpython-312.pyc +0 -0
  51. package/skills/code-quality/scripts/__pycache__/code_lens.cpython-313.pyc +0 -0
  52. package/skills/code-quality/scripts/__pycache__/code_python.cpython-312.pyc +0 -0
  53. package/skills/code-quality/scripts/__pycache__/code_python.cpython-313.pyc +0 -0
  54. package/skills/code-quality/scripts/__pycache__/code_testplan.cpython-312.pyc +0 -0
  55. package/skills/code-quality/scripts/code_battery.py +1072 -0
  56. package/skills/code-quality/scripts/code_check.py +1269 -0
  57. package/skills/code-quality/scripts/code_csharp.py +371 -0
  58. package/skills/code-quality/scripts/code_fix.py +201 -0
  59. package/skills/code-quality/scripts/code_java.py +695 -0
  60. package/skills/code-quality/scripts/code_jsts.py +313 -0
  61. package/skills/code-quality/scripts/code_lens.py +1079 -0
  62. package/skills/code-quality/scripts/code_python.py +536 -0
  63. package/skills/code-quality/scripts/code_testplan.py +239 -0
  64. package/skills/code-quality/trigger-cases.json +45 -0
  65. package/skills/code-review/SKILL.md +24 -0
  66. package/skills/code-review/trigger-cases.json +35 -0
  67. package/skills/commit-and-pr/trigger-cases.json +31 -0
  68. package/skills/content-creation/trigger-cases.json +30 -0
  69. package/skills/corporate-governance/trigger-cases.json +30 -0
  70. package/skills/crawl-chain/trigger-cases.json +31 -0
  71. package/skills/customer-service/trigger-cases.json +30 -0
  72. package/skills/data-analysis/trigger-cases.json +30 -0
  73. package/skills/data-chain/SKILL.md +1 -1
  74. package/skills/data-chain/trigger-cases.json +31 -0
  75. package/skills/data-governance/trigger-cases.json +30 -0
  76. package/skills/data-report-pro/trigger-cases.json +30 -0
  77. package/skills/data-streaming/trigger-cases.json +30 -0
  78. package/skills/data-wrangling/SKILL.md +1 -1
  79. package/skills/data-wrangling/trigger-cases.json +30 -0
  80. package/skills/db-es/trigger-cases.json +30 -0
  81. package/skills/db-migration/trigger-cases.json +30 -0
  82. package/skills/db-mysql/trigger-cases.json +30 -0
  83. package/skills/db-postgres/trigger-cases.json +30 -0
  84. package/skills/db-redis/trigger-cases.json +30 -0
  85. package/skills/debug-root-cause/trigger-cases.json +30 -0
  86. package/skills/dependency-audit/SKILL.md +56 -0
  87. package/skills/dependency-audit/trigger-cases.json +7 -0
  88. package/skills/dependency-upgrade/trigger-cases.json +31 -0
  89. package/skills/dev-cpp/trigger-cases.json +30 -0
  90. package/skills/dev-cross-platform/trigger-cases.json +30 -0
  91. package/skills/dev-csharp/SKILL.md +23 -0
  92. package/skills/dev-csharp/trigger-cases.json +30 -0
  93. package/skills/dev-frontend/SKILL.md +19 -0
  94. package/skills/dev-frontend/trigger-cases.json +30 -0
  95. package/skills/dev-go/trigger-cases.json +30 -0
  96. package/skills/dev-harmony/trigger-cases.json +30 -0
  97. package/skills/dev-java/SKILL.md +20 -0
  98. package/skills/dev-java/trigger-cases.json +30 -0
  99. package/skills/dev-mobile/trigger-cases.json +30 -0
  100. package/skills/dev-node/trigger-cases.json +30 -0
  101. package/skills/dev-php/trigger-cases.json +30 -0
  102. package/skills/dev-python/SKILL.md +21 -0
  103. package/skills/dev-python/trigger-cases.json +30 -0
  104. package/skills/dev-rust/trigger-cases.json +30 -0
  105. package/skills/dev-toolchain/trigger-cases.json +31 -0
  106. package/skills/doc-chain/trigger-cases.json +31 -0
  107. package/skills/doc-compare/trigger-cases.json +30 -0
  108. package/skills/docx-author/SKILL.md +127 -25
  109. package/skills/docx-author/scripts/__pycache__/docx_battery.cpython-312.pyc +0 -0
  110. package/skills/docx-author/scripts/__pycache__/docx_build.cpython-312.pyc +0 -0
  111. package/skills/docx-author/scripts/__pycache__/docx_check.cpython-312.pyc +0 -0
  112. package/skills/docx-author/scripts/__pycache__/docx_layout.cpython-312.pyc +0 -0
  113. package/skills/docx-author/scripts/__pycache__/zh_prose.cpython-312.pyc +0 -0
  114. package/skills/docx-author/scripts/docx_battery.py +586 -0
  115. package/skills/docx-author/scripts/docx_build.py +995 -0
  116. package/skills/docx-author/scripts/docx_check.py +1306 -0
  117. package/skills/docx-author/scripts/docx_doc.py +14 -154
  118. package/skills/docx-author/scripts/docx_layout.py +490 -0
  119. package/skills/docx-author/scripts/zh_prose.py +639 -0
  120. package/skills/docx-author/trigger-cases.json +58 -0
  121. package/skills/echo-brief/SKILL.md +84 -0
  122. package/skills/echo-brief/references/echo-format.md +68 -0
  123. package/skills/echo-brief/trigger-cases.json +40 -0
  124. package/skills/ecommerce-ops/trigger-cases.json +30 -0
  125. package/skills/education-training/trigger-cases.json +30 -0
  126. package/skills/ehs-safety/trigger-cases.json +30 -0
  127. package/skills/email-writing/trigger-cases.json +30 -0
  128. package/skills/eng-ai/trigger-cases.json +30 -0
  129. package/skills/eng-architecture/trigger-cases.json +31 -0
  130. package/skills/eng-automation/trigger-cases.json +31 -0
  131. package/skills/eng-collaboration/trigger-cases.json +30 -0
  132. package/skills/eng-complex-env/trigger-cases.json +30 -0
  133. package/skills/eng-data-platform/trigger-cases.json +31 -0
  134. package/skills/eng-database/trigger-cases.json +31 -0
  135. package/skills/eng-develop/trigger-cases.json +30 -0
  136. package/skills/eng-docs/SKILL.md +24 -0
  137. package/skills/eng-docs/trigger-cases.json +30 -0
  138. package/skills/eng-efficiency/trigger-cases.json +30 -0
  139. package/skills/eng-infra/trigger-cases.json +30 -0
  140. package/skills/eng-integration/trigger-cases.json +31 -0
  141. package/skills/eng-legacy/trigger-cases.json +31 -0
  142. package/skills/eng-observability/trigger-cases.json +31 -0
  143. package/skills/eng-ops/trigger-cases.json +31 -0
  144. package/skills/eng-performance/trigger-cases.json +31 -0
  145. package/skills/eng-planning/trigger-cases.json +31 -0
  146. package/skills/eng-quality/SKILL.md +8 -0
  147. package/skills/eng-quality/trigger-cases.json +31 -0
  148. package/skills/eng-release/trigger-cases.json +31 -0
  149. package/skills/eng-reliability/trigger-cases.json +31 -0
  150. package/skills/eng-requirements/trigger-cases.json +12 -0
  151. package/skills/eng-research/trigger-cases.json +30 -0
  152. package/skills/eng-security/trigger-cases.json +31 -0
  153. package/skills/eng-ux/trigger-cases.json +30 -0
  154. package/skills/engineering-chain/trigger-cases.json +30 -0
  155. package/skills/env-offline/trigger-cases.json +31 -0
  156. package/skills/env-private-deploy/trigger-cases.json +31 -0
  157. package/skills/env-xinchuang/trigger-cases.json +31 -0
  158. package/skills/equipment-tpm/trigger-cases.json +30 -0
  159. package/skills/esg-report/trigger-cases.json +30 -0
  160. package/skills/event-management/trigger-cases.json +30 -0
  161. package/skills/excel-analysis-chain/SKILL.md +17 -4
  162. package/skills/excel-analysis-chain/trigger-cases.json +31 -0
  163. package/skills/explain-codebase/trigger-cases.json +11 -0
  164. package/skills/file-ingest/trigger-cases.json +30 -0
  165. package/skills/finance-analysis/trigger-cases.json +31 -0
  166. package/skills/finance-chain/trigger-cases.json +31 -0
  167. package/skills/financial-modeling/trigger-cases.json +31 -0
  168. package/skills/find-simplifications/SKILL.md +43 -0
  169. package/skills/find-simplifications/trigger-cases.json +23 -0
  170. package/skills/foreign-trade/trigger-cases.json +30 -0
  171. package/skills/funnel-cohort/trigger-cases.json +30 -0
  172. package/skills/gov-document/trigger-cases.json +30 -0
  173. package/skills/gui-change-evidence/SKILL.md +47 -0
  174. package/skills/gui-change-evidence/trigger-cases.json +23 -0
  175. package/skills/hr-chain/trigger-cases.json +31 -0
  176. package/skills/hr-operations/trigger-cases.json +30 -0
  177. package/skills/info-disclosure/trigger-cases.json +31 -0
  178. package/skills/infra-gateway/trigger-cases.json +31 -0
  179. package/skills/infra-k8s/trigger-cases.json +31 -0
  180. package/skills/infra-mq/trigger-cases.json +30 -0
  181. package/skills/insurance-advisory/trigger-cases.json +30 -0
  182. package/skills/internal-audit/trigger-cases.json +30 -0
  183. package/skills/ip-management/trigger-cases.json +31 -0
  184. package/skills/ipo-listing/trigger-cases.json +31 -0
  185. package/skills/it-audit/trigger-cases.json +31 -0
  186. package/skills/itsm-ops/trigger-cases.json +31 -0
  187. package/skills/knowledge-sop/trigger-cases.json +31 -0
  188. package/skills/legal-chain/trigger-cases.json +31 -0
  189. package/skills/legal-contract/trigger-cases.json +30 -0
  190. package/skills/litigation-support/trigger-cases.json +31 -0
  191. package/skills/logistics-warehouse/trigger-cases.json +30 -0
  192. package/skills/long-doc-analysis/trigger-cases.json +31 -0
  193. package/skills/management-accounting/trigger-cases.json +30 -0
  194. package/skills/manufacturing-chain/trigger-cases.json +31 -0
  195. package/skills/manufacturing-quality/trigger-cases.json +30 -0
  196. package/skills/marketing-analytics/trigger-cases.json +31 -0
  197. package/skills/marketing-chain/trigger-cases.json +31 -0
  198. package/skills/meeting-minutes/trigger-cases.json +30 -0
  199. package/skills/metrics-system/trigger-cases.json +31 -0
  200. package/skills/negotiation-prep/trigger-cases.json +30 -0
  201. package/skills/obs-prometheus/trigger-cases.json +31 -0
  202. package/skills/office-automation/trigger-cases.json +31 -0
  203. package/skills/okr-review/trigger-cases.json +30 -0
  204. package/skills/ops-fleet/trigger-cases.json +31 -0
  205. package/skills/ops-linux/trigger-cases.json +31 -0
  206. package/skills/optimization-solver/trigger-cases.json +30 -0
  207. package/skills/patent-disclosure/SKILL.md +105 -0
  208. package/skills/patent-disclosure/references/figures.md +110 -0
  209. package/skills/patent-disclosure/references/outline.md +162 -0
  210. package/skills/patent-disclosure/scripts/patent_docx.py +230 -0
  211. package/skills/patent-disclosure/trigger-cases.json +31 -0
  212. package/skills/patent-drafting/SKILL.md +108 -0
  213. package/skills/patent-drafting/trigger-cases.json +31 -0
  214. package/skills/patent-portfolio/SKILL.md +81 -0
  215. package/skills/patent-portfolio/trigger-cases.json +31 -0
  216. package/skills/pdf-toolkit/trigger-cases.json +31 -0
  217. package/skills/perf-optimize/trigger-cases.json +31 -0
  218. package/skills/pivot-crosstab/trigger-cases.json +30 -0
  219. package/skills/policy-analysis/trigger-cases.json +31 -0
  220. package/skills/portfolio-analysis/trigger-cases.json +31 -0
  221. package/skills/ppt-chain/SKILL.md +14 -6
  222. package/skills/ppt-chain/trigger-cases.json +31 -0
  223. package/skills/pptx-author/SKILL.md +86 -33
  224. package/skills/pptx-author/scripts/__pycache__/pptx_check.cpython-312.pyc +0 -0
  225. package/skills/pptx-author/scripts/__pycache__/pptx_deck.cpython-312.pyc +0 -0
  226. package/skills/pptx-author/scripts/__pycache__/pptx_layout.cpython-312.pyc +0 -0
  227. package/skills/pptx-author/scripts/pptx_battery.py +178 -0
  228. package/skills/pptx-author/scripts/pptx_build.py +119 -0
  229. package/skills/pptx-author/scripts/pptx_check.py +1182 -0
  230. package/skills/pptx-author/scripts/pptx_deck.py +736 -145
  231. package/skills/pptx-author/scripts/pptx_layout.py +384 -0
  232. package/skills/pptx-author/trigger-cases.json +15 -0
  233. package/skills/pr-comms/trigger-cases.json +30 -0
  234. package/skills/procurement-supply/trigger-cases.json +31 -0
  235. package/skills/product-design/trigger-cases.json +31 -0
  236. package/skills/production-planning/trigger-cases.json +31 -0
  237. package/skills/project-management/trigger-cases.json +31 -0
  238. package/skills/project-proposal/trigger-cases.json +31 -0
  239. package/skills/prose-standard/SKILL.md +53 -0
  240. package/skills/prose-standard/trigger-cases.json +23 -0
  241. package/skills/qa-api-automation/trigger-cases.json +31 -0
  242. package/skills/qa-mobile-automation/trigger-cases.json +31 -0
  243. package/skills/qa-ui-automation/trigger-cases.json +31 -0
  244. package/skills/quant-analysis/trigger-cases.json +31 -0
  245. package/skills/rag-triage/SKILL.md +64 -0
  246. package/skills/rag-triage/evals.json +57 -0
  247. package/skills/rag-triage/references/triage-playbook.md +75 -0
  248. package/skills/rag-triage/trigger-cases.json +31 -0
  249. package/skills/real-estate-property/trigger-cases.json +30 -0
  250. package/skills/refactor-safely/SKILL.md +1 -1
  251. package/skills/refactor-safely/trigger-cases.json +30 -0
  252. package/skills/regression-forecast/trigger-cases.json +31 -0
  253. package/skills/release-checklist/trigger-cases.json +31 -0
  254. package/skills/report-craft/SKILL.md +76 -0
  255. package/skills/report-craft/references/feasibility.md +118 -0
  256. package/skills/report-craft/references/review-checklist.md +51 -0
  257. package/skills/report-craft/references/visuals.md +114 -0
  258. package/skills/report-craft/references/writing.md +80 -0
  259. package/skills/report-craft/scripts/__pycache__/chart_render.cpython-312.pyc +0 -0
  260. package/skills/report-craft/scripts/__pycache__/fin_model.cpython-312.pyc +0 -0
  261. package/skills/report-craft/scripts/__pycache__/project_facts.cpython-312.pyc +0 -0
  262. package/skills/report-craft/scripts/chart_render.py +1222 -0
  263. package/skills/report-craft/scripts/fin_model.py +602 -0
  264. package/skills/report-craft/scripts/project_facts.py +580 -0
  265. package/skills/report-craft/scripts/report_battery.py +349 -0
  266. package/skills/report-craft/trigger-cases.json +15 -0
  267. package/skills/retail-store-ops/trigger-cases.json +30 -0
  268. package/skills/risk-compliance/trigger-cases.json +31 -0
  269. package/skills/scope-creep/SKILL.md +45 -0
  270. package/skills/scope-creep/trigger-cases.json +7 -0
  271. package/skills/sec-auth/trigger-cases.json +31 -0
  272. package/skills/sec-compliance/trigger-cases.json +31 -0
  273. package/skills/securities-chain/trigger-cases.json +31 -0
  274. package/skills/securities-research/trigger-cases.json +31 -0
  275. package/skills/security-audit/trigger-cases.json +31 -0
  276. package/skills/slides-html/SKILL.md +25 -10
  277. package/skills/slides-html/trigger-cases.json +11 -0
  278. package/skills/sql-analysis/SKILL.md +110 -0
  279. package/skills/sql-analysis/trigger-cases.json +34 -0
  280. package/skills/sql-tuning/trigger-cases.json +31 -0
  281. package/skills/statistical-testing/trigger-cases.json +31 -0
  282. package/skills/strategy-planning/trigger-cases.json +30 -0
  283. package/skills/supply-chain/trigger-cases.json +31 -0
  284. package/skills/tax-compliance/trigger-cases.json +30 -0
  285. package/skills/tech-doc/SKILL.md +262 -0
  286. package/skills/tech-doc/scripts/__pycache__/archive_battery.cpython-312.pyc +0 -0
  287. package/skills/tech-doc/scripts/__pycache__/archive_build.cpython-312.pyc +0 -0
  288. package/skills/tech-doc/scripts/__pycache__/archive_check.cpython-312.pyc +0 -0
  289. package/skills/tech-doc/scripts/__pycache__/archive_spec.cpython-312.pyc +0 -0
  290. package/skills/tech-doc/scripts/__pycache__/doc_templates.cpython-312.pyc +0 -0
  291. package/skills/tech-doc/scripts/archive_battery.py +860 -0
  292. package/skills/tech-doc/scripts/archive_build.py +599 -0
  293. package/skills/tech-doc/scripts/archive_check.py +1307 -0
  294. package/skills/tech-doc/scripts/archive_spec.py +499 -0
  295. package/skills/tech-doc/scripts/doc_templates.py +624 -0
  296. package/skills/tech-doc/trigger-cases.json +57 -0
  297. package/skills/tech-research/trigger-cases.json +31 -0
  298. package/skills/tender-bidding/trigger-cases.json +31 -0
  299. package/skills/translation-pro/trigger-cases.json +30 -0
  300. package/skills/treasury-mgmt/trigger-cases.json +31 -0
  301. package/skills/trim-cot-leakage/SKILL.md +58 -0
  302. package/skills/trim-cot-leakage/trigger-cases.json +23 -0
  303. package/skills/web-craft/SKILL.md +103 -0
  304. package/skills/web-craft/references/craft-checklist.md +75 -0
  305. package/skills/web-craft/references/design-direction.md +122 -0
  306. package/skills/web-craft/references/h5-mobile.md +100 -0
  307. package/skills/web-craft/references/motion.md +136 -0
  308. package/skills/web-craft/references/recipes.md +74 -0
  309. package/skills/web-craft/templates/wedding-invitation.html +1180 -0
  310. package/skills/web-craft/trigger-cases.json +14 -0
  311. package/skills/web-scraping/trigger-cases.json +34 -0
  312. package/skills/web-search/SKILL.md +11 -10
  313. package/skills/web-search/trigger-cases.json +31 -0
  314. package/skills/weekly-report/SKILL.md +134 -0
  315. package/skills/weekly-report/trigger-cases.json +11 -0
  316. package/skills/write-tests/trigger-cases.json +31 -0
  317. package/skills/xlsx-analysis/SKILL.md +143 -77
  318. package/skills/xlsx-analysis/scripts/__pycache__/data_profile.cpython-312.pyc +0 -0
  319. package/skills/xlsx-analysis/scripts/__pycache__/xlsx_build.cpython-312.pyc +0 -0
  320. package/skills/xlsx-analysis/scripts/__pycache__/xlsx_check.cpython-312.pyc +0 -0
  321. package/skills/xlsx-analysis/scripts/__pycache__/xlsx_layout.cpython-312.pyc +0 -0
  322. package/skills/xlsx-analysis/scripts/__pycache__/xlsx_toolkit.cpython-312.pyc +0 -0
  323. package/skills/xlsx-analysis/scripts/data_profile.py +391 -0
  324. package/skills/xlsx-analysis/scripts/xlsx_battery.py +389 -0
  325. package/skills/xlsx-analysis/scripts/xlsx_build.py +522 -0
  326. package/skills/xlsx-analysis/scripts/xlsx_check.py +924 -0
  327. package/skills/xlsx-analysis/scripts/xlsx_layout.py +235 -0
  328. package/skills/xlsx-analysis/scripts/xlsx_style.py +28 -66
  329. package/skills/xlsx-analysis/scripts/xlsx_toolkit.py +61 -5
  330. package/skills/xlsx-analysis/trigger-cases.json +59 -0
  331. package/squads/hc-defense.md +47 -0
  332. package/squads/hc-rdarchive.md +110 -0
  333. package/squads/hc-redteam.md +50 -0
  334. package/squads/hc-weekly.md +125 -0
  335. package/src/account.js +1 -0
  336. package/src/acp.js +1 -0
  337. package/src/advisor.js +1 -1
  338. package/src/agent.js +1 -1
  339. package/src/api.js +1 -1
  340. package/src/archaeology.js +1 -0
  341. package/src/ask-ui.js +1 -0
  342. package/src/assets-import.js +1 -1
  343. package/src/autofix.js +1 -1
  344. package/src/automation-tools.js +1 -0
  345. package/src/automation.js +1 -1
  346. package/src/autorun.js +1 -1
  347. package/src/banner.js +1 -1
  348. package/src/capability-probe.js +1 -0
  349. package/src/checkpoints.js +1 -1
  350. package/src/code-tools.js +1 -0
  351. package/src/codeindex.js +1 -1
  352. package/src/codemode.js +1 -0
  353. package/src/command-bridge.js +1 -0
  354. package/src/command-ui.js +1 -0
  355. package/src/commands.js +1 -1
  356. package/src/compaction.js +1 -1
  357. package/src/computer.js +1 -0
  358. package/src/config.js +1 -1
  359. package/src/consult.js +1 -1
  360. package/src/context-report.js +1 -1
  361. package/src/context-window.js +1 -0
  362. package/src/context.js +1 -1
  363. package/src/crew.js +1 -0
  364. package/src/crush.js +1 -0
  365. package/src/daemon.js +1 -1
  366. package/src/decisions.js +1 -1
  367. package/src/depaudit.js +1 -0
  368. package/src/device.js +1 -1
  369. package/src/diagram-draw.js +1 -0
  370. package/src/diagram-layouts.js +1 -0
  371. package/src/diagram-raster.js +1 -0
  372. package/src/diagram.js +1 -0
  373. package/src/dictation.js +1 -0
  374. package/src/diffview.js +1 -1
  375. package/src/doctor.js +1 -1
  376. package/src/docx-tools.js +1 -0
  377. package/src/errkind.js +1 -0
  378. package/src/evidence.js +1 -0
  379. package/src/executors.js +1 -1
  380. package/src/expert-catalog.js +1 -1
  381. package/src/experts-store.js +1 -1
  382. package/src/experts.js +1 -1
  383. package/src/external-agents.js +1 -0
  384. package/src/forks.js +1 -1
  385. package/src/fs-observe.js +1 -0
  386. package/src/gitflow.js +1 -1
  387. package/src/goalround.js +1 -0
  388. package/src/hooks.js +1 -1
  389. package/src/input.js +1 -1
  390. package/src/insights.js +1 -1
  391. package/src/jobs.js +1 -0
  392. package/src/kbsync.js +1 -1
  393. package/src/lsp.js +1 -0
  394. package/src/mcp-apps.js +1 -0
  395. package/src/mcp.js +1 -1
  396. package/src/memory.js +1 -1
  397. package/src/notify.js +1 -0
  398. package/src/permissions.js +1 -1
  399. package/src/plan-limits.js +1 -0
  400. package/src/policy.js +1 -0
  401. package/src/pptx-tools.js +1 -0
  402. package/src/presence.js +1 -0
  403. package/src/privatedir.js +1 -0
  404. package/src/pyruntime.js +1 -1
  405. package/src/radar.js +1 -0
  406. package/src/render.js +1 -1
  407. package/src/repl.js +1 -1
  408. package/src/report-tools.js +1 -0
  409. package/src/routing.js +1 -0
  410. package/src/sandbox-probe.js +1 -0
  411. package/src/sandbox-win-launcher.mjs +156 -0
  412. package/src/sandbox.js +1 -0
  413. package/src/scan.js +1 -1
  414. package/src/schedule.js +1 -1
  415. package/src/scopecreep.js +1 -0
  416. package/src/sdk.js +1 -0
  417. package/src/selection.js +1 -0
  418. package/src/session-events.js +1 -0
  419. package/src/session.js +1 -1
  420. package/src/sessionindex.js +1 -0
  421. package/src/sessionlog.js +1 -0
  422. package/src/skill-catalog.js +1 -0
  423. package/src/skill-lint.js +1 -0
  424. package/src/skill-optimize.js +1 -0
  425. package/src/skill-scan.js +1 -0
  426. package/src/skills.js +1 -1
  427. package/src/spill.js +1 -0
  428. package/src/squad.js +1 -1
  429. package/src/subagent.js +1 -1
  430. package/src/surface-state.js +1 -0
  431. package/src/tapd.js +1 -0
  432. package/src/terminal-select.js +1 -0
  433. package/src/terminal.js +1 -0
  434. package/src/test-runner.js +1 -0
  435. package/src/todo.js +1 -1
  436. package/src/toolpipe.js +1 -0
  437. package/src/tools.js +1 -1
  438. package/src/toon.js +1 -0
  439. package/src/transcript.js +1 -1
  440. package/src/tui/app.js +1 -1
  441. package/src/tui/command-menu.js +1 -0
  442. package/src/tui/progress.js +1 -0
  443. package/src/tui/scroll.js +1 -0
  444. package/src/tui/welcome.js +1 -0
  445. package/src/tui/workbench.js +1 -0
  446. package/src/ui-spec.js +1 -0
  447. package/src/uitree.js +1 -0
  448. package/src/uninstall.js +1 -1
  449. package/src/vision.js +1 -0
  450. package/src/visual.js +1 -0
  451. package/src/voice-form.js +1 -0
  452. package/src/voice.js +1 -0
  453. package/src/watch.js +1 -1
  454. package/src/web-audit.js +1 -0
  455. package/src/web-cdp.js +1 -0
  456. package/src/web-inspect.js +1 -0
  457. package/src/websearch.js +1 -0
  458. package/src/weekly.js +1 -0
  459. package/src/workflow.js +1 -0
  460. package/src/worklog.js +1 -0
  461. package/src/xlsx-tools.js +1 -0
  462. package/ui/command-picker.js +79 -0
  463. package/skills/ab-testing/scripts/__pycache__/ab_test.cpython-312.pyc +0 -0
  464. package/skills/accounting-ops/scripts/__pycache__/acct_tools.cpython-312.pyc +0 -0
  465. package/skills/anomaly-detection/scripts/__pycache__/anomaly.cpython-312.pyc +0 -0
  466. package/skills/audit-assist/scripts/__pycache__/audit_sampling.cpython-312.pyc +0 -0
  467. package/skills/banking-credit/scripts/__pycache__/credit_metrics.cpython-312.pyc +0 -0
  468. package/skills/data-report-pro/scripts/__pycache__/bigdata.cpython-312.pyc +0 -0
  469. package/skills/data-wrangling/scripts/__pycache__/join_tools.cpython-312.pyc +0 -0
  470. package/skills/ecommerce-ops/scripts/__pycache__/gmv_decompose.cpython-312.pyc +0 -0
  471. package/skills/funnel-cohort/scripts/__pycache__/funnel.cpython-312.pyc +0 -0
  472. package/skills/management-accounting/scripts/__pycache__/costing.cpython-312.pyc +0 -0
  473. package/skills/manufacturing-quality/scripts/__pycache__/spc.cpython-312.pyc +0 -0
  474. package/skills/marketing-analytics/scripts/__pycache__/rfm.cpython-312.pyc +0 -0
  475. package/skills/optimization-solver/scripts/__pycache__/solver.cpython-312.pyc +0 -0
  476. package/skills/pivot-crosstab/scripts/__pycache__/pivot_tools.cpython-312.pyc +0 -0
  477. package/skills/portfolio-analysis/scripts/__pycache__/portfolio.cpython-312.pyc +0 -0
  478. package/skills/procurement-supply/scripts/__pycache__/supply.cpython-312.pyc +0 -0
  479. package/skills/production-planning/scripts/__pycache__/mrp_capacity.cpython-312.pyc +0 -0
  480. package/skills/project-management/scripts/__pycache__/cpm.cpython-312.pyc +0 -0
  481. package/skills/quant-analysis/scripts/__pycache__/quant.cpython-312.pyc +0 -0
  482. package/skills/real-estate-property/scripts/__pycache__/property_calc.cpython-312.pyc +0 -0
  483. package/skills/regression-forecast/scripts/__pycache__/regress.cpython-312.pyc +0 -0
  484. package/skills/securities-research/scripts/__pycache__/valuation.cpython-312.pyc +0 -0
  485. package/skills/statistical-testing/scripts/__pycache__/stat_tests.cpython-312.pyc +0 -0
  486. package/skills/treasury-mgmt/scripts/__pycache__/cashflow_forecast.cpython-312.pyc +0 -0
@@ -0,0 +1,239 @@
1
+ # 测试计划:先算清「该测什么」,再让人(或模型)去写「怎么测」。
2
+ #
3
+ # ── 为什么要有这一步 ──
4
+ # 直接说「给这个文件补单测」,产出通常是一堆「调一次、断言不为 null」的用例:
5
+ # 覆盖率数字上去了,缺陷一个也拦不住。原因是写的人(模型也一样)没有先回答
6
+ # **这个函数到底有几条路、每条路的边界在哪**,就开始写了。
7
+ #
8
+ # 这里把那部分算出来,交给写测试的人:
9
+ # · 哪些对外函数压根没被测试提到过(按圈复杂度排序——分支多的先补,性价比最高)
10
+ # · 每个函数有几条独立路径(圈复杂度就是下界)
11
+ # · 每个参数该试哪些边界(按名字与用法推断:空、零、负、超长、null)
12
+ # · 有没有异常路径、是不是异步(异步失败是最常漏的一类)
13
+ # · 这个项目的测试放哪、叫什么名、用什么框架——照着现有约定放,不要自创一套
14
+ #
15
+ # 这份计划不替人做判断,它只保证「该想到的都摆在桌面上了」。
16
+
17
+ import json
18
+ import os
19
+ import re
20
+ import sys
21
+
22
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
23
+ import code_check as C # noqa: E402
24
+ import code_lens as L # noqa: E402
25
+
26
+
27
+ # 按参数名推断该试的边界值。名字是最便宜也最可靠的线索——
28
+ # 叫 ids 的参数几乎一定要试空数组,叫 amount 的几乎一定要试负数和零。
29
+ # 顺序敏感:最具体的放前面,短词一律加锚定。
30
+ # 反面教材就在这张表自己的历史里——`ts` 不加边界会命中 opts / results / counts / hosts,
31
+ # 于是一个叫 opts 的参数被推荐去测「时区边界」。名字推断一旦开始乱猜,
32
+ # 整份计划的可信度就没了:人会把边界建议全部当噪声跳过。
33
+ _PARAM_HINTS = [
34
+ (r'(^|_)(opts?|options?|config|conf|params?|ctx|context|settings?)$',
35
+ ['空对象', '缺必填字段', '多余字段', '未传(走默认值)']),
36
+ # 只收**复数**:`item` 是一个元素,`items` 才是集合;`id` 是一个标识,`ids` 才是列表。
37
+ # 把 `ids?` 写成可选复数,`id` 就会被推荐去测「空数组」——一条明显不对的建议
38
+ # 足以让人开始怀疑整份计划。
39
+ (r'(^|_)(ids|list|items|rows|arr|array|elements|records|files|orders|entries|'
40
+ r'users|nodes|tasks|jobs|results|docs|paths|keys|values|batch|collection)$',
41
+ ['空数组', '单元素', '大量元素(看有没有 O(n²))', '含 null 的元素']),
42
+ (r'(^|_)(callback|cb|fn|handler|func|hook|listener)$',
43
+ ['正常返回', '抛异常', '返回 Promise 且 reject']),
44
+ (r'(^|_)(flag|enabled?|is[A-Z_]\w*|has[A-Z_]\w*|should\w*|dry_?run)$',
45
+ ['true', 'false', '未传(默认值)']),
46
+ (r'(amount|price|money|fee|cost|balance|金额|价格|salary|tax)',
47
+ ['0', '负数', '小数精度边界(0.1+0.2)', '极大值(溢出)']),
48
+ (r'(count|num|size|length|limit|offset|page|index|total|qty|max|min|depth|retries)',
49
+ ['0', '1', '负数', '超过上界的值']),
50
+ (r'(date|datetime|timestamp|deadline|expires?|expiry|created|updated|'
51
+ r'(^|_)(ts|time|start|end|since|until)$)',
52
+ ['过去的时间', '未来的时间', '时区边界', '非法格式']),
53
+ (r'(name|title|text|msg|message|content|desc|description|label|key|query|'
54
+ r'(^|_)(str|url|uri|path|dir|file)$)',
55
+ ['空串', '只有空白', '超长', '含特殊字符/中文/emoji']),
56
+ # 驼峰也要认:userId / orderNo / traceId 在真实代码里比 user_id 更常见
57
+ (r'(^|_)(id|uuid|code|no|sn|token|hash)$|[a-z](Id|ID|Uuid|UUID|Code|No|Sn|Token|Hash)$',
58
+ ['不存在的值', '空值', '类型不符(数字 vs 字符串)']),
59
+ (r'(rate|ratio|percent|factor|weight|score)',
60
+ ['0', '1', '负数', '大于 1 的比例(是不是当百分比传错了)']),
61
+ ]
62
+ _DEFAULT_HINTS = ['正常值', 'null / undefined', '类型不符的值']
63
+
64
+ _RE_THROW = re.compile(r'\b(throw|raise)\b')
65
+ _RE_EXTERNAL = re.compile(
66
+ r'\b(fetch|axios|request|http|db\.|query|execute|readFile|writeFile|exec|spawn|'
67
+ r'open\(|requests\.|session\.|repo\.|mapper\.|client\.)')
68
+
69
+
70
+ def _hints_for(param):
71
+ bare = param.lstrip('*').strip()
72
+ for pat, hints in _PARAM_HINTS:
73
+ if re.search(pat, bare, re.I):
74
+ return hints
75
+ return list(_DEFAULT_HINTS)
76
+
77
+
78
+ def detect_framework(root):
79
+ """探测这个项目已经在用什么测试框架、测试放在哪、叫什么名。
80
+
81
+ 照着现有约定放,比「按最佳实践新建一个 tests/ 目录」有用得多——
82
+ 后者会造出第二套约定,而两套约定意味着以后每个人都要问一次「放哪儿」。
83
+ """
84
+ info = {'framework': None, 'dirs': [], 'naming': None, 'runner': None}
85
+ pkg = os.path.join(root, 'package.json')
86
+ if os.path.exists(pkg):
87
+ try:
88
+ with open(pkg, encoding='utf-8') as f:
89
+ data = json.load(f)
90
+ deps = {**data.get('dependencies', {}), **data.get('devDependencies', {})}
91
+ for name in ('vitest', 'jest', 'mocha', 'ava', 'tap', 'jasmine'):
92
+ if name in deps:
93
+ info['framework'] = name
94
+ break
95
+ script = (data.get('scripts') or {}).get('test') or ''
96
+ info['runner'] = script or None
97
+ if not info['framework'] and 'node --test' in script:
98
+ info['framework'] = 'node:test(Node 内置)'
99
+ except (OSError, ValueError):
100
+ # package.json 读不到或格式坏了:探测不出框架而已,下面还有按文件存在性的兜底判断。
101
+ # 这里不该抛——测试计划是辅助信息,不能因为一个坏的清单文件就整份出不来。
102
+ pass
103
+ if not info['framework']:
104
+ if os.path.exists(os.path.join(root, 'pytest.ini')) or os.path.exists(os.path.join(root, 'pyproject.toml')):
105
+ info['framework'] = 'pytest'
106
+ elif os.path.exists(os.path.join(root, 'pom.xml')):
107
+ info['framework'] = 'JUnit'
108
+ elif os.path.exists(os.path.join(root, 'build.gradle')) or \
109
+ os.path.exists(os.path.join(root, 'build.gradle.kts')):
110
+ info['framework'] = 'JUnit(Gradle)'
111
+ # 现有测试文件在哪、怎么命名
112
+ samples = []
113
+ for p in L.walk_files(root, limit=2000):
114
+ if L.is_test_path(p):
115
+ samples.append(os.path.relpath(p, root))
116
+ if len(samples) >= 8:
117
+ break
118
+ info['dirs'] = sorted({os.path.dirname(s) or '.' for s in samples})[:5]
119
+ if samples:
120
+ base = os.path.basename(samples[0])
121
+ for pat, desc in ((r'\.test\.[cm]?[jt]sx?$', '<模块名>.test.js'),
122
+ (r'\.spec\.[cm]?[jt]sx?$', '<模块名>.spec.js'),
123
+ (r'^test_', 'test_<模块名>.py'),
124
+ (r'_test\.py$', '<模块名>_test.py'),
125
+ (r'Tests?\.java$', '<类名>Test.java')):
126
+ if re.search(pat, base):
127
+ info['naming'] = desc
128
+ break
129
+ info['naming'] = info['naming'] or base
130
+ info['examples'] = samples[:3]
131
+ return info
132
+
133
+
134
+ def plan_for_file(lens, tested_names):
135
+ """给一个文件算出测试计划。"""
136
+ items = []
137
+ for u in lens.functions():
138
+ if not u.is_public or u.name in ('(匿名)', 'constructor'):
139
+ continue
140
+ covered = u.name in tested_names
141
+ paths = max(1, u.complexity)
142
+ cases = []
143
+ for p in u.params:
144
+ if p in ('self', 'cls'):
145
+ continue
146
+ cases.append({'param': p, 'boundaries': _hints_for(p)})
147
+ risks = []
148
+ if _RE_THROW.search(u.body):
149
+ risks.append('有显式抛异常的分支 —— 要有一个用例断言它**确实抛了**,且抛的是预期类型')
150
+ if u.is_async:
151
+ risks.append('异步函数 —— 补一个「依赖方 reject / 超时」的失败路径,这是最常漏的一类')
152
+ if _RE_EXTERNAL.search(u.body):
153
+ risks.append('有外部依赖(网络/数据库/文件)—— 需要替身;替身要能模拟失败,不只是成功')
154
+ if u.depth >= 3:
155
+ risks.append(f'嵌套 {u.depth} 层 —— 最内层的分支很容易测不到,单独列一个用例走进去')
156
+ items.append({
157
+ 'name': u.label, 'line': u.start, 'covered': covered,
158
+ 'complexity': u.complexity, 'min_cases': paths, 'lines': u.lines,
159
+ 'params': cases, 'risks': risks,
160
+ })
161
+ items.sort(key=lambda x: (x['covered'], -x['complexity']))
162
+ return items
163
+
164
+
165
+ def build_plan(paths, root='.'):
166
+ paths = [p for p in paths if os.path.isfile(p)]
167
+ tested, has_tests = C._collect_tested_names(paths)
168
+ if not has_tests:
169
+ # 目标文件里没有测试,但项目别处可能有——扩大一圈再找一次,
170
+ # 否则会把「测试写在 test/ 目录下」的正常项目全部报成「零覆盖」。
171
+ wider = L.walk_files(root, limit=3000)
172
+ tested, has_tests = C._collect_tested_names(wider)
173
+ out = {'framework': detect_framework(root), 'files': [], 'has_tests': has_tests}
174
+ for p in paths:
175
+ if L.is_test_path(p):
176
+ continue
177
+ lens = L.read_lens(p)
178
+ items = plan_for_file(lens, tested)
179
+ if items:
180
+ out['files'].append({'path': os.path.relpath(p, root), 'lang': lens.lang, 'items': items})
181
+ return out
182
+
183
+
184
+ def render_plan(plan, max_funcs=12):
185
+ fw = plan['framework']
186
+ lines = ['【测试计划】']
187
+ lines.append(f'项目测试约定:框架 {fw["framework"] or "未探测到"}'
188
+ + (f' · 命令 `{fw["runner"]}`' if fw.get('runner') else '')
189
+ + (f' · 放在 {"、".join(fw["dirs"])}' if fw.get('dirs') else '')
190
+ + (f' · 命名 {fw["naming"]}' if fw.get('naming') else ''))
191
+ if fw.get('examples'):
192
+ lines.append(f'参照现有用例的写法:{"、".join(fw["examples"])}(照着它的风格写,不要自创一套约定)')
193
+ if not plan['has_tests']:
194
+ lines.append('⚠ 整个项目没有找到测试文件——这是从零开始,先建立约定(放哪、怎么命名、怎么跑)再写用例。')
195
+
196
+ total = sum(len(f['items']) for f in plan['files'])
197
+ uncovered = [(f, it) for f in plan['files'] for it in f['items'] if not it['covered']]
198
+ lines.append(f'对外函数 {total} 个,其中测试里从未出现过的 {len(uncovered)} 个'
199
+ '(口径是「名字在测试文件里出现过」,是覆盖的下界,不是精确覆盖率)。')
200
+ if not uncovered:
201
+ lines.append('结论:每个对外函数都至少被测试提到过。接下来该看的是**断言强度**而不是覆盖面。')
202
+ return '\n'.join(lines)
203
+
204
+ lines.append('\n按「分支最多的先补」排序:')
205
+ for i, (f, it) in enumerate(uncovered[:max_funcs], 1):
206
+ lines.append(f'\n{i}. `{it["name"]}` {f["path"]}:{it["line"]} '
207
+ f'({it["lines"]} 行,圈复杂度 {it["complexity"]} → **至少 {it["min_cases"]} 个用例**才能覆盖各分支)')
208
+ for risk in it['risks']:
209
+ lines.append(f' ⚠ {risk}')
210
+ if it['params']:
211
+ lines.append(' 参数边界:')
212
+ for p in it['params'][:6]:
213
+ lines.append(f' · {p["param"]}:{"、".join(p["boundaries"])}')
214
+ else:
215
+ lines.append(' 无参数 —— 测它的副作用与返回值,以及被调用两次时是否幂等。')
216
+ if len(uncovered) > max_funcs:
217
+ lines.append(f'\n…… 还有 {len(uncovered) - max_funcs} 个未展开(--json 取全量)。')
218
+ lines.append('\n写完用例后记得跑一遍 code_inspect:断言强度(恒真断言、没有断言的用例、'
219
+ '.only 残留)是另一组规则在管,写测试时最容易顺手留下这几样。')
220
+ return '\n'.join(lines)
221
+
222
+
223
+ def main(argv):
224
+ args = [a for a in argv if not a.startswith('--')]
225
+ flags = {a.split('=')[0]: (a.split('=', 1)[1] if '=' in a else True) for a in argv if a.startswith('--')}
226
+ target = args[0] if args else '.'
227
+ root = os.path.abspath(flags['--root']) if isinstance(flags.get('--root'), str) else (
228
+ target if os.path.isdir(target) else os.path.dirname(os.path.abspath(target)) or '.')
229
+ paths = L.walk_files(target) if os.path.isdir(target) else [target]
230
+ plan = build_plan(paths, root)
231
+ if flags.get('--json'):
232
+ print(json.dumps(plan, ensure_ascii=False))
233
+ else:
234
+ print(render_plan(plan))
235
+ return 0
236
+
237
+
238
+ if __name__ == '__main__':
239
+ sys.exit(main(sys.argv[1:]))
@@ -0,0 +1,45 @@
1
+ {
2
+ "skill": "code-quality",
3
+ "purpose": "触发行为规格。负样例分两类:**不同词汇**的近邻走词法层(CI 跑),**同词汇不同意图**的近邻标 lexical:false 归行为层——词法打分对后者天然无能为力,硬要它通过只会逼作者往描述里塞噪声词。",
4
+ "cases": [
5
+ {
6
+ "id": "self-check-after-writing",
7
+ "prompt": "刚写完的代码帮我体检一遍,看看有没有空捕获、注释和实现对不上",
8
+ "shouldTrigger": true
9
+ },
10
+ {
11
+ "id": "inspect-quality",
12
+ "prompt": "体检一下这个模块的代码质量,注释和单元测试都看看",
13
+ "shouldTrigger": true
14
+ },
15
+ {
16
+ "id": "add-unit-tests",
17
+ "prompt": "给这个文件补单元测试,先说说该测哪些边界",
18
+ "shouldTrigger": true
19
+ },
20
+ {
21
+ "id": "fix-code-smells",
22
+ "prompt": "把代码里残留的 console.log 和测试里的 .only 清理掉",
23
+ "shouldTrigger": true
24
+ },
25
+ {
26
+ "id": "near-miss-explain",
27
+ "prompt": "这段代码是干嘛的,讲讲实现逻辑",
28
+ "shouldTrigger": false,
29
+ "lexical": false,
30
+ "note": "与「自查代码逻辑」共用「代码/逻辑」——同词汇不同意图(讲解 vs 排查),词法层分不开,归行为层评测。"
31
+ },
32
+ {
33
+ "id": "near-miss-format",
34
+ "prompt": "帮我把这段代码按 prettier 格式化",
35
+ "shouldTrigger": false,
36
+ "lexical": false,
37
+ "note": "与「代码自查」共用「代码」——格式化是排版不是质量排查;词法层分不开,归行为层。"
38
+ },
39
+ {
40
+ "id": "near-miss-write-doc",
41
+ "prompt": "写一份项目的可行性研究报告",
42
+ "shouldTrigger": false
43
+ }
44
+ ]
45
+ }
@@ -19,6 +19,30 @@ version: 1.0.0
19
19
  - **测试**:关键路径与边界是否有测试覆盖?改动是否破坏既有测试?
20
20
  3. **验证**:能跑测试/编译就跑(run_bash),用事实说话,别只靠推理。
21
21
 
22
+ ## 阻断项(这几条不满足就不是"建议",是不能合)
23
+
24
+ 前面的维度检查按严重度排序输出;下面这几条不排序——**任何一条不满足,结论就是"改完再合"**。
25
+ 把它们单列,是因为它们都属于「代码本身读起来没问题、但漏了就会出事」的一类,
26
+ 逐条问一遍比指望在通读里想起来可靠。
27
+
28
+ 1. **四端同源**。改了 `huicai-cli/src` 下的任何模块,同一次改动里必须把三个宿主副本同步过去
29
+ (desktop / vscode / idea 各跑一次 `scripts/sync-core.cjs`)。漏了不会编译失败,
30
+ 只会让某一端悄悄跑着上个版本的行为。
31
+ 2. **删除必有确认**。任何删除/清空路径(单条、批量、清空全部)都要先弹确认框,不得静默执行。
32
+ 3. **新增能力要进清单**。新增写文件的工具必须登记进 `FILE_WRITE_TOOLS`;
33
+ 新增出网工具必须登记进入站扫描的名单;新增需审批的动作必须进 `AUTOMATION_TOOLS`。
34
+ 这类"登记表"漏登不会报错,只会让那一层保护对新东西静默失效。
35
+ 4. **注册了就要能注销**。新增的监听、定时器、子进程、缓存条目,要有对应的清理路径,
36
+ 且会话结束/切换时真的会被调用。
37
+ 5. **新增散文经过语义评审**。新加的注释、文档、工具描述、报错文案,
38
+ 按 [prose-standard](../prose-standard/SKILL.md) 过一遍:契约写全了没有、废话删干净没有。
39
+ 自动检查证明不了这一点。
40
+ 6. **界面改动带证据**。改了用户看得见的行为,要按
41
+ [gui-change-evidence](../gui-change-evidence/SKILL.md) 附上真实环境的截图或录屏;
42
+ 单测绿和界面能用是两件事。
43
+ 7. **证据真的跑过**。作者声称跑过的检查,要么有输出可看,要么自己复跑一遍。
44
+ "应该没问题"不是证据。
45
+
22
46
  ## 输出格式
23
47
  - 按 `严重(必须改) / 建议 / 可选` 三档分组;
24
48
  - 每条:`文件:行 — 问题一句话 → 具体改法`;
@@ -0,0 +1,35 @@
1
+ {
2
+ "skill": "code-review",
3
+ "purpose": "触发行为规格。负样例分两类:**不同词汇**的近邻走词法层(CI 跑),**同词汇不同意图**的近邻标 lexical:false 归行为层——词法打分对后者天然无能为力,硬要它通过只会逼作者往描述里塞噪声词。",
4
+ "cases": [
5
+ {
6
+ "id": "direct-review",
7
+ "prompt": "帮我审查一下这段代码有没有问题",
8
+ "shouldTrigger": true
9
+ },
10
+ {
11
+ "id": "english-review",
12
+ "prompt": "review 一下我这次的改动",
13
+ "shouldTrigger": true
14
+ },
15
+ {
16
+ "id": "pre-commit",
17
+ "prompt": "提交前自查一下质量,重点看边界和安全",
18
+ "shouldTrigger": true
19
+ },
20
+ {
21
+ "id": "near-miss-format",
22
+ "prompt": "把这段代码格式化一下",
23
+ "shouldTrigger": false,
24
+ "lexical": false,
25
+ "note": "与「审查代码」共用「代码/这段」——同词汇不同意图,词法层分不开;路由层已验证它不会落到 code-review。"
26
+ },
27
+ {
28
+ "id": "near-miss-explain",
29
+ "prompt": "这段代码是干嘛的,讲讲逻辑",
30
+ "shouldTrigger": false,
31
+ "lexical": false,
32
+ "note": "与「审查代码」共用「代码/这段」等词,词法层分不开——这是语义近邻,归行为层评测;此处只保留意图记录。"
33
+ }
34
+ ]
35
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "skill": "commit-and-pr",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "帮我写个规范的提交信息",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "总结本次改动,开个 PR 写描述",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "commit message 按 Conventional Commits 怎么写",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "这次是不是改多了,帮我看看范围",
22
+ "shouldTrigger": false,
23
+ "lexical": false
24
+ },
25
+ {
26
+ "id": "neg-2",
27
+ "prompt": "评审一下这段代码有没有 bug",
28
+ "shouldTrigger": false
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "skill": "content-creation",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "写篇公众号长文",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "短视频脚本和小红书笔记怎么写",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "帮我做内容规划,起几个标题",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "写一份学术论文摘要",
22
+ "shouldTrigger": false
23
+ },
24
+ {
25
+ "id": "neg-2",
26
+ "prompt": "做一份对外发布的新闻通稿",
27
+ "shouldTrigger": false
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "skill": "corporate-governance",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "起草一份董事会决议",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "公司章程和议事规则怎么设计",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "股权架构和代持有什么风险",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "写一份劳动合同",
22
+ "shouldTrigger": false
23
+ },
24
+ {
25
+ "id": "neg-2",
26
+ "prompt": "做一次并购交易的估值",
27
+ "shouldTrigger": false
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "skill": "crawl-chain",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "帮我把某网站的数据整成分析报告",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "持续监控竞品价格,从采集到呈现",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "调研某个主题,抓数据然后出结论",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "设计一个爬虫的反爬对抗策略",
22
+ "shouldTrigger": false,
23
+ "lexical": false
24
+ },
25
+ {
26
+ "id": "neg-2",
27
+ "prompt": "写一份数据治理规范",
28
+ "shouldTrigger": false
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "skill": "customer-service",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "客诉升级了,话术怎么说",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "工单数据分析和 NPS 满意度怎么做",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "客户反馈整理成 VOC 报告,顺便生成 FAQ",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "写一封商务催办邮件",
22
+ "shouldTrigger": false
23
+ },
24
+ {
25
+ "id": "neg-2",
26
+ "prompt": "做一次电商大促复盘",
27
+ "shouldTrigger": false
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "skill": "data-analysis",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "帮我分析一下这份数据的趋势和分布",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "画个图看看相关性",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "这个 csv 统计一下",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "做一次数据口径治理",
22
+ "shouldTrigger": false
23
+ },
24
+ {
25
+ "id": "neg-2",
26
+ "prompt": "写一段数据库查询优化",
27
+ "shouldTrigger": false
28
+ }
29
+ ]
30
+ }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: data-chain
3
- description: 数据技能链总控(口径治理→加工分析→指标看板→汇报自动化全链→技能路由与端到端工作流)。当数据诉求跨环节("从原始表到月度经营看板""新指标从定义到上线")或不确定用哪个技能时先载入。
3
+ description: 数据技能链总控(口径治理→加工分析→指标看板→汇报自动化全链→技能路由与端到端工作流)。当诉求落在指标口径与数据治理层面("新指标从定义到上线""两个报表口径对不齐""指标体系怎么搭""数据质量谁负责")或不确定用哪个数据技能时先载入。
4
4
  version: 1.0.0
5
5
  ---
6
6
 
@@ -0,0 +1,31 @@
1
+ {
2
+ "skill": "data-chain",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "新指标从定义到上线,整条链怎么走",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "两个报表口径对不齐,谁负责",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "指标体系怎么搭,数据质量归谁管",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "帮我画一张趋势图",
22
+ "shouldTrigger": false,
23
+ "lexical": false
24
+ },
25
+ {
26
+ "id": "neg-2",
27
+ "prompt": "做一次实时作业的反压定位",
28
+ "shouldTrigger": false
29
+ }
30
+ ]
31
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "skill": "data-governance",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "口径打架,指标对不上怎么治理",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "主数据和数据标准怎么建",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "做一次数据资产盘点和分级分类",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "分析一下这批数据的分布",
22
+ "shouldTrigger": false
23
+ },
24
+ {
25
+ "id": "neg-2",
26
+ "prompt": "设计一个数据仓库的分层",
27
+ "shouldTrigger": false
28
+ }
29
+ ]
30
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "skill": "data-report-pro",
3
+ "cases": [
4
+ {
5
+ "id": "pos-1",
6
+ "prompt": "几十万行多表关联,帮我做对账找差异",
7
+ "shouldTrigger": true
8
+ },
9
+ {
10
+ "id": "pos-2",
11
+ "prompt": "跨表勾稽对不上,怎么定位",
12
+ "shouldTrigger": true
13
+ },
14
+ {
15
+ "id": "pos-3",
16
+ "prompt": "这几份关联报表合并一下并建数据字典",
17
+ "shouldTrigger": true
18
+ },
19
+ {
20
+ "id": "neg-1",
21
+ "prompt": "帮我画个饼图",
22
+ "shouldTrigger": false
23
+ },
24
+ {
25
+ "id": "neg-2",
26
+ "prompt": "清洗一下这张表的重复值",
27
+ "shouldTrigger": false
28
+ }
29
+ ]
30
+ }