@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,14 @@
1
+ {
2
+ "skill": "web-craft",
3
+ "cases": [
4
+ { "id": "pos-wedding", "prompt": "帮我开发一个婚礼邀请函H5,要好看,能发到微信里", "shouldTrigger": true },
5
+ { "id": "pos-landing", "prompt": "做一个有设计感的产品落地页网页", "shouldTrigger": true },
6
+ { "id": "pos-signup", "prompt": "给公司年会做一个活动报名页面", "shouldTrigger": true },
7
+ { "id": "pos-portfolio", "prompt": "做一个个人作品集网站,要高级一点", "shouldTrigger": true },
8
+ { "id": "pos-birthday", "prompt": "写一个生日请柬网页,发给朋友用", "shouldTrigger": true },
9
+ { "id": "neg-cwv", "prompt": "前端首屏慢,Core Web Vitals 怎么优化", "shouldTrigger": false },
10
+ { "id": "neg-slides", "prompt": "做一份发布会用的炫酷PPT", "shouldTrigger": false },
11
+ { "id": "neg-prd", "prompt": "帮我写一份产品需求文档PRD", "shouldTrigger": false },
12
+ { "id": "neg-vi", "prompt": "给品牌起个名字,做一套VI规范", "shouldTrigger": false }
13
+ ]
14
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "skill": "web-scraping",
3
+ "intentionalOverlap": [
4
+ "crawl-chain"
5
+ ],
6
+ "cases": [
7
+ {
8
+ "id": "pos-1",
9
+ "prompt": "从网站采集数据,翻页增量怎么做",
10
+ "shouldTrigger": true
11
+ },
12
+ {
13
+ "id": "pos-2",
14
+ "prompt": "深度爬取和 JS 渲染页怎么抓",
15
+ "shouldTrigger": true
16
+ },
17
+ {
18
+ "id": "pos-3",
19
+ "prompt": "提取网页字段后清洗入库",
20
+ "shouldTrigger": true
21
+ },
22
+ {
23
+ "id": "neg-1",
24
+ "prompt": "搜一下最新消息,找几个信源",
25
+ "shouldTrigger": false,
26
+ "lexical": false
27
+ },
28
+ {
29
+ "id": "neg-2",
30
+ "prompt": "对接一个需要签名的 API",
31
+ "shouldTrigger": false
32
+ }
33
+ ]
34
+ }
@@ -1,19 +1,20 @@
1
1
  ---
2
2
  name: web-search
3
3
  description: 网页搜索与信息检索(查询构造、多源交叉验证、结果甄别去重、网页内容分析与提炼、引用规范、搜索→抓取→分析闭环)。当用户说"搜一下/查资料/联网查/最新消息/找信源/调研某主题/分析这个网页/总结这篇文章"时使用。爬虫链之检索环。
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  ---
6
6
 
7
7
  # 网页搜索与内容分析(爬虫链 · 检索环;采集见 web-scraping,全链见 crawl-chain)
8
8
 
9
- ## 检索通道(按可用性择优)
9
+ ## 检索通道(只有一个:平台统一联网搜索)
10
10
 
11
- - **平台联网搜索**:所用智能体/模型开了联网搜索时优先用(结果带引用,最省事);
12
- - **企业/用户自备搜索 API**:有 Bing/Google/SerpAPI 等 key 时用 curl / fetch_url 直连其 REST 接口
13
- (key 走环境变量,勿硬编码勿回显;需签名的载入 api-integration);
14
- - **公开搜索页兜底**:fetch_url 抓轻量搜索页(如 `https://html.duckduckgo.com/html/?q=关键词`),
15
- 再 `links=true` 取结果链接——**频率克制(次数少、间隔≥2s),尊重对方 ToS**;被限流即停;
16
- - 定向检索常比通用搜索准:已知权威站直接站内查(官网/文档站/统计局/交易所/GitHub)。
11
+ - **`web_search` 工具**:联网检索的唯一入口。走平台统一联网搜索(提供商与密钥由管理员在管理后台统一配置),
12
+ 结果抬头会注明由哪个提供商返回——引用时如实带上;
13
+ - **不可用就如实说**:工具不在工具表里、或返回「已关闭 / 不可用」,说明本端联网搜索开关已关或平台未启用——
14
+ 直接告诉用户(可在设置里打开「联网搜索」,CLI 输入 `/websearch on`)。**禁止**用 curl / fetch_url 直连
15
+ Bing / Google / SerpAPI 等搜索接口,也**禁止**抓 DuckDuckGo / 百度等搜索结果页兜底——那是绕过开关,等同联网搜索;
16
+ - **定向抓取仍可用**:已知权威站点的具体页面(官网/文档站/统计局/交易所/GitHub)直接 fetch_url 抓,
17
+ 定向抓取常比通用搜索更准。
17
18
 
18
19
  ## 查询构造(一次搜不准是常态,会迭代才是能力)
19
20
 
@@ -47,7 +48,7 @@ version: 1.1.0
47
48
  ## 搜索 → 抓取 → 分析闭环
48
49
 
49
50
  1. 明确要回答的问题(拆成 2-5 个可检索的子问题);
50
- 2. 逐子问题检索,收集候选信源(URL + 标题 + 日期);
51
+ 2. 逐子问题用 web_search 检索,收集候选信源(URL + 标题 + 日期 + 提供商);
51
52
  3. fetch_url/curl 抓正文,按上节「内容分析」降噪+提炼(web-scraping 处理批量/深爬);
52
53
  4. 汇总输出:**每个关键结论标注来源(URL + 访问日期)**,冲突信息并列呈现并说明取舍;
53
54
  5. 信息不足时如实说"没查到/存疑",绝不编造——宁缺毋滥。
@@ -64,4 +65,4 @@ version: 1.1.0
64
65
  - [ ] 关键事实 ≥2 独立信源印证;冲突已并列说明
65
66
  - [ ] 内容分析先降噪再提炼、先事实后观点;长文分块不丢尾
66
67
  - [ ] 信源分级意识:结论不建立在社区/自媒体单源上
67
- - [ ] 搜索页兜底通道频率克制;没查到的如实说明
68
+ - [ ] 检索只经 web_search(不可用时如实告知,未绕道直连搜索接口或抓搜索结果页);没查到的如实说明
@@ -0,0 +1,31 @@
1
+ {
2
+ "skill": "web-search",
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,134 @@
1
+ ---
2
+ name: weekly-report
3
+ description: 周报自动取数与成稿——扫本机多仓库 Git 提交、拉 TAPD 需求/缺陷/迭代/发布计划、扫版本库外的文档痕迹,按公司模板出片并体检。当用户说"写本周周报/生成周报/我这周干了啥/汇总我的工作"时使用。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 周报(先把事实摆齐,再谈怎么写)
8
+
9
+ 周报写不好,九成不是文笔问题,是**手上没有事实**:凭印象回忆一周做了什么,
10
+ 写出来的必然是"持续推进平台建设"这类没法被追问的句子。所以顺序永远是
11
+ **取证 → 归并 → 出片体检**,不能跳。
12
+
13
+ ## 一、取证(一次取齐,三个来源共用同一个汇报周期)
14
+
15
+ 调 **`work_evidence`** 一次拿全,不要分开调三次——三次各带一份 since/until,
16
+ 少写一个参数或把 `days:7` 和 `week:"this"` 混着用,拼出来的周报就会「提交数来自这一周、
17
+ 需求数来自另一周」,而每一份材料自己都是对的,没人发现得了。合成一件之后周期算一次、传给所有来源。
18
+
19
+ | 来源 | 取什么 | 证据强度 | 最常见的坑 |
20
+ |---|---|---|---|
21
+ | Git 提交 | 多仓库、多身份合并 | **强**(有作者/时间/行数) | 身份配漏→工作量凭空少一半,且无声无息 |
22
+ | TAPD 工作项 | 需求/缺陷/发布计划 | **强**(有单号可核) | 「动过」≠「已交付」,写交付只引用「本周完成/解决」那部分 |
23
+ | 版本库外文档 | Word/Excel/PPT/PDF | **弱**(只有 mtime) | 拷贝/解压/网盘同步都会刷新,必须逐条认领 |
24
+
25
+ - **先问清楚汇报周期**:默认「最近 7 天含今天」(周报多半周四五写,按自然周算会把上周四五漏在
26
+ 两份周报的缝里);用户明确说自然周就传 `week:"this"`;
27
+ - 未配 roots 时只扫当前工作目录——**这几乎一定是漏的**。第一次用就问清项目都放在哪,
28
+ 然后建议写进 `.huicai/weekly.json`,别每次重问;
29
+ - 结果里的「同期其它作者」是给用户看的:若有他自己的另一套 name/email,加进 `identities` 重跑;
30
+ - 要别的 TAPD 口径(按 `created` 查新增、按状态过滤、指定空间)再用 `tapd_fetch` 单独查;
31
+ - **团队层面的数据不按人筛**:`tapd_fetch` 不传 person 就是全空间口径,那才是"团队完成了多少";
32
+ - **状态用各空间自己的说法**:接口里是 `status_2` 这种自定义代号,工具已翻成中文
33
+ ("已实现,转测试""测试通过,待发布")。
34
+
35
+ > **别为取证单开一轮子智能体。** 工具输出自带可信度标注与缺口提示(弱证据声明、
36
+ > 超大提交的「剔除后」第二个数字、同期其它作者提醒、TAPD 取空时的排查顺序)。
37
+ > 派一个成员去"读一遍再整理成清单",读的是你已经拿在手里的东西——那一轮白花。
38
+
39
+ ## 二、归并(把过程量变成成果)
40
+
41
+ - **提交数和行数是过程量,不是成果**。"本周 23 次提交、+4120 行"没有任何汇报价值;
42
+ "把出片缺陷率从 17% 降到 2%"才有。行数只在一种情况下能写:它本身就是结论(如"清理了 8000 行死代码");
43
+ - 工具会标出**超大提交**并给出"剔除后"的第二个数。两个数差得越远,越说明行数不代表手写工作量——
44
+ 这种时候周报里干脆别写行数;
45
+ - 把十几条 commit 按**项目/功能**归并成 **3~5 件事**,每件事一条。多于 6 条领导记不住,少于 3 条像没干活;
46
+ - **个人层面 vs 团队层面要真的分开**:个人写"我决策了什么、我推动了什么"(第一人称的动作),
47
+ 团队写"整体完成率、重点交付、人才与机制"(组织口径的结果)。
48
+ 把团队成果搬到个人栏里,是述职最容易被当场问穿的地方;
49
+ - 范本的四类个人进展可以直接当骨架:**核心事项推进 / 跨部门与外部协同 / 管理动作落地 / 行业认知沉淀**;
50
+ 团队四类:**本周目标完成概览 / 重点项目交付 / 团队效能与人才进展 / 流程与机制优化**。
51
+
52
+ > **别为取证单开一轮子智能体。** 三件工具的输出自带可信度标注与缺口提示
53
+ > (弱证据声明、超大提交的「剔除后」第二个数字、同期其它作者提醒、TAPD 取空时的排查顺序)。
54
+ > 派一个成员去"读一遍再整理成清单",读的是你已经拿在手里的东西,产出的是同一批事实换个排版——
55
+ > 那一轮的时间和 token 都白花。分诊自己做,判不了的直接问用户。
56
+
57
+ ## 三、出片(`weekly_report` 渲染,不要自己拼模板)
58
+
59
+ - 骨架固定:汇报周期 / 汇报人 →【个人层面核心进展】【团队层面核心成果】【存在问题及分析】【下周工作计划】。
60
+ 自己拼模板的结果是小节名、编号符号、周期写法每周变一点,读的人每次都要重新找落点;
61
+ - **每次都把 `work_evidence` 的完整输出传进 `evidence`**。它会拿取证包末尾的【对账锚点】
62
+ 回头核对正文里的原始计数——写「本周 23 次提交」而取证只有 12 次,当场判必修。
63
+ 这是全流程唯一能机检数字真伪的地方,不传就等于没查;
64
+ - **有上一期周报就传 `prev`**(路径或全文)。它会检查上周计划的事这周有没有交代——
65
+ 上周承诺、这周只字不提,是周报最伤信用的写法,也最容易被漏掉;
66
+ - 每条用 **加粗引导词 + 正文**:`{lead:"核心事项推进", text:"完成…"}`。引导词 4~6 字,
67
+ 是这一条的**性质**不是标题,正文紧接其后不加标点;
68
+ - 一条里用分号串 2~3 个子事项(范本就是这么写的),每个子事项自带数字;
69
+ - **【存在问题及分析】必须有"具体问题"和"根因分析"两条**(模板硬要求),建议再加"影响预判":
70
+ 问题写现象与差距,根因写机制,影响写"若几号前不解决会怎样"。写"暂无问题"等于把问题推迟到月报爆炸;
71
+ - **【下周工作计划】每条都要有日期与责任人**。没有时间点的计划下周无法复盘;
72
+ - 需要向上要资源的放 `asks`(【需上级决策/支持事项】):写清**要什么、多少、解决哪个已陈述的问题**。
73
+
74
+ ## 四、红线
75
+
76
+ - **不编数字、不编单号**。取不到就说取不到——编出来的需求号同事一眼认得出,比少写一段严重得多;
77
+ - `work_scan` 的结果是**弱证据**,转述时要说"这些文件本周有改动,请确认哪些是你的工作",
78
+ 不能直接写成"我完成了 X 文档";
79
+ - 每个数字都要能指回来源(哪个仓库的哪几次提交、哪个 TAPD 单号)。用户问"这个 92% 哪来的"要答得上。
80
+ **原始计数**(提交次数/需求条数/缺陷解决数/文档份数)由对账机检;
81
+ **推算值**(完成率、耗时、百分比)工具判不了,得你自己核算法——它也不假装能判;
82
+ - **必修清零才算能发**。`weekly_report` 出片后自动体检,必修项没清就改了再渲染一遍;
83
+ - 体检**不判断数字真假**——它只保证你写了可被追问的数字。对不对,仍要人核。
84
+
85
+ ## 五、配置(第一次用时帮用户配好,之后就不必问了)
86
+
87
+ **TAPD 只需要一个个人访问令牌**(TAPD 里「个人设置 → 访问令牌」自助生成):
88
+
89
+ ```bash
90
+ export TAPD_ACCESS_TOKEN=<你的令牌>
91
+ ```
92
+
93
+ 令牌**自带身份**——工具由它问出你是谁(昵称)和你参与了哪些项目,
94
+ 所以 `workspace_id` 与 `nickname` 都不用配。第一次先跑 `tapd_fetch({kind:"projects"})`
95
+ 验证凭据并看清有哪些空间。也支持公司 API 账号(`TAPD_API_USER`/`TAPD_API_PASSWORD`,Basic),
96
+ 但那种问不出身份,**必须自己配 workspace_id**。私有部署设 `TAPD_BASE_URL`。
97
+
98
+ Git 与文档扫描的设置放 `.huicai/weekly.json`——**项目级**(工作目录下,跟着项目走)
99
+ 覆盖**用户级**(`~/.huicai/weekly.json`):
100
+
101
+ ```json
102
+ {
103
+ "roots": ["~/Projects", "~/work"],
104
+ "identities": ["张三", "zhangsan@corp.com", "zhangsan@users.noreply.github.com"],
105
+ "reporter": "技术中心 张三",
106
+ "tapd": { "workspace_id": ["12345678"] }
107
+ }
108
+ ```
109
+
110
+ 项目级那份在工作区内,可以直接帮用户写;用户级那份在主目录,**请把内容给用户让他自己存**。
111
+ 令牌也能写进 `tapd.access_token`,但落盘就有被备份/同步带走的风险,能用环境变量就别写进文件。
112
+
113
+ > 周报这条链路**不读**平台配置与任何密钥文件——设置单独一个文件,与 API Key 井水不犯河水。
114
+
115
+ ## 六、要 Word 版
116
+
117
+ 先用 `weekly_report(format:"word")` 渲染,再把正文交给 `create_doc` 的 `spec.markdown`。
118
+
119
+ **别拿默认的 md 版直接去出 Word**——实测那样生成的 docx **一个标题都没有**(28 段全是正文样式),
120
+ 目录域和导航窗格全是空的,docx 体检会当场报「全文没有使用标题样式」。
121
+ `format:"word"` 把 `【小节名】` 转成 `## 小节名`,Word 里就是四个二级标题,目录立刻生成得出来。
122
+
123
+ 两点如实告知用户:加粗引导词**会**保留;但条目编号会被 Word 的有序列表样式渲染成 `1.`,
124
+ 而不是模板的 `1、`——那是 Word 惯例不是错误,只是发出去的 .md 与 Word 版在这里不一致。
125
+ 月报/季度述职/年终总结的**方法论**(OKR 对齐、STAR-I 叙事、晋升自证)走 `okr-review` 技能,
126
+ 本技能只管"把这一周的事实取回来并按模板落地"。
127
+
128
+ ## 验收自查
129
+
130
+ - 三个来源用的是同一个汇报周期,且与正文抬头那行一致;
131
+ - 个人栏每条都是"我"的动作,团队栏每条都是组织口径的结果,没有互串;
132
+ - 每条都有至少一个数字;下周计划每条都有日期;
133
+ - 【存在问题及分析】有具体问题 + 根因分析,不是"暂无";
134
+ - 体检必修 0 条;每个数字都能说出来源。
@@ -0,0 +1,11 @@
1
+ {
2
+ "skill": "weekly-report",
3
+ "cases": [
4
+ { "id": "pos-1", "prompt": "帮我生成本周周报,扫一下我这几个项目的 git 提交", "shouldTrigger": true },
5
+ { "id": "pos-2", "prompt": "从 TAPD 拉一下我本周解决的缺陷和发布计划,汇总成周报", "shouldTrigger": true },
6
+ { "id": "pos-3", "prompt": "我这周到底干了啥,把工作情况汇总一下", "shouldTrigger": true },
7
+ { "id": "neg-1", "prompt": "帮我定下个季度的 OKR 并做对齐检查", "shouldTrigger": false },
8
+ { "id": "neg-2", "prompt": "把这个仓库的提交历史分析一下,看这段代码为什么存在", "shouldTrigger": false },
9
+ { "id": "neg-3", "prompt": "写一份晋升答辩材料,对照职级标准逐条自证", "shouldTrigger": false, "lexical": false }
10
+ ]
11
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "skill": "write-tests",
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": "按 TDD 补集成测试",
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
+ }
@@ -1,96 +1,162 @@
1
1
  ---
2
2
  name: xlsx-analysis
3
- description: 复杂 Excel 表格分析、透视、对账与格式化回写。当用户说"Excel/表格/xlsx/透视/汇总/对账/核对/多 Sheet"或给出 .xlsx/.xls 文件时使用。
4
- version: 1.1.0
3
+ description: Excel 表格分析、透视、对账与报表产出,并对工作簿做体检与校正(数值存成文本、合计写死不是公式、求和范围漏行、合并单元格、列宽显示井号)。当用户说"Excel/表格/xlsx/透视/汇总/对账/核对/多 Sheet/做报表"或给出 .xlsx/.xls 文件,或说"表格数字对不上/合计不对/检查这份表"时使用。
4
+ version: 2.0.0
5
5
  ---
6
6
 
7
- # Excel 分析与回写(经 run_python 执行,pandas/openpyxl/xlrd 已随托管运行时就绪)
7
+ # Excel 分析、报表产出与表格体检
8
8
 
9
- 要点:**用 run_python 直接开原始表格文件**做精确分析——附件的纯文本摘要只够"大概看看"(公式/多 Sheet/合并单元格全丢),
10
- **绝不据摘要作答对账/透视类问题**。附件原件已落盘会话工作区 `attachments/`(提问上下文里会指明路径),直接读它。
11
- `.xls` 旧格式已随核心装了 xlrd,和 `.xlsx` 一样开箱即读,无需再补装。
9
+ **Excel 的事故不改变外观,只改变数字。** PPT 出事一眼看得见,Word 出事翻页能发现,
10
+ Excel 出事什么都看不出来——金额存成文本让 SUM 得 0;合计行是上周算好的常量,改了明细纹丝不动;
11
+ `SUM(B2:B100)` 但数据长到了 B180,少算 80 行;明细里混着「合计」行,一汇总就翻倍。
12
+ 这些全都不报错、不变色,只是安静地给出一个错的数,**而错的数和对的数长得一模一样**。
12
13
 
13
- ## 首选:先载工具箱(治真实办公表的脏——表头不在首行/文本金额/杂乱日期/合计行混入)
14
+ 所以三条纪律:**读之前先体检、算之后要勾稽、产出不由你摆格式。**
14
15
 
15
- 真实表格 90% 的坑(表头在第 2~5 行、合并单元格留 NaN、金额是带千分位的文本、日期五花八门、夹着「合计」行)
16
- 本技能的 `scripts/xlsx_toolkit.py` 已封装。**除非表格极简单,一律先用它**:
16
+ ## 一、拿到别人的表:先体检,再动手算
17
+
18
+ ```
19
+ xlsx_inspect(path='attachments/收款单202602.xlsx', profile=true)
20
+ ```
21
+
22
+ **这一步不能跳。** 它先告诉你「读进来的东西是不是你以为的东西」:哪列的数值其实是文本、
23
+ 哪列编号被读成了数字(前导零已经没了)、哪里有合并单元格会让排序错位、
24
+ 明细里混了几行「合计」、哪两个「北京」其实差一个空格。跳过它,后面所有数字都不可信。
25
+
26
+ 体检完再用工具箱稳读(真实办公表 90% 的坑它已经治了):
17
27
 
18
28
  ```python
19
- # 1) read_skill_file(skill="xlsx-analysis", path="scripts/xlsx_toolkit.py") 取源码
20
- # 2) 连同下面的调用一起交给 run_python 执行(把源码内联在最前,或 exec 之)
21
- sheet_map('attachments/收款单202602.xlsx') # 摸清每个 Sheet:满形状/表头行/列清单/金额·日期列
22
- df = smart_read('attachments/收款单202602.xlsx', '凌川峰应收账款') # 稳读:自动表头+去spacer+剔合计+金额救成float
23
- ar = sum_by_period(df, value_col='贷方金额', date_col='记账日期') # 按月汇总贷方 → {'2026-01':30000, ...}
29
+ # read_skill_file(skill="xlsx-analysis", path="scripts/xlsx_toolkit.py") 取源码,连同调用一起交给 run_python
30
+ sheet_map('attachments/收款单202602.xlsx') # 摸清每个 Sheet:表头行/列清单/金额·日期列
31
+ df = smart_read('attachments/收款单202602.xlsx', '凌川峰应收账款') # 稳读:自动表头+去 spacer+剔合计+金额救成 float
32
+ ar = sum_by_period(df, value_col='贷方金额', date_col='记账日期') # 按月汇总 → {'2026-01': 30000, …}
24
33
  ```
25
34
 
26
- 工具箱清单(函数名即用途,全部可直接调):
27
- - `sheet_map(path)` — **分析第 0 步**,一次打印整本工作簿结构(表头行、列名、疑似金额/日期列)。
28
- - `smart_read(path, sheet, header=None, drop_subtotal=True)` — 稳读单个 Sheet,返回干净 DataFrame。表头识别不准时手动传 `header=N`。
29
- - `to_amount(series)` / `to_period(series, freq='M')` — 金额(清千分位/货币符/括号负数)、日期(含 `2026.3`/excel 序列号/`2026-02-03 0`)稳健转换。
30
- - `sum_by_period(df, value_col, date_col, freq='M')` — 明细按期汇总 → Series。
31
- - `reconcile(left, right, left_name, right_name, tol=0.01)` — **按期对账**,逐期算差额并判「✅对平/❌差异」,打印对账表 + 结论。
35
+ `smart_read` 的表头定位对**标题横幅、「标签:值」标注行、整句话**都会避让——真实语料 95 张 sheet 里曾有 28 张把这三类当成了表头(如把「月份:XX年XX月」当列名,读出 `列2/列3/列4`)。同一工作簿里**填了数据的表和空模板必须判成同一表头行**:
36
+ 表格稀疏时天真的打分会让横幅反超真表头,而它不报错,下游分析全建在垃圾列名上。
37
+
38
+ **绝不据附件的纯文本摘要作答对账/透视类问题**——摘要把公式、多 Sheet、合并单元格全丢了。
39
+ 原件已落盘会话工作区 `attachments/`,直接读它。`.xls` 随核心装了 xlrd,开箱即读。
40
+
41
+ ### 对账范式(多 Sheet 勾稽,用户最常问的一类)
32
42
 
33
- ### 对账任务范式(多 Shet 勾稽,用户最常问的一类)
34
- > 「把 A 明细、B 明细按月汇总贷方金额,分别和汇总表里某组织的两列按月核对」——标准三步:
35
43
  ```python
36
- ar = sum_by_period(smart_read(F, '凌川峰应收账款'), '贷方金额', '记账日期')
37
- adv = sum_by_period(smart_read(F, '凌川峰预收'), '贷方金额', '记账日期')
44
+ ar = sum_by_period(smart_read(F, '凌川峰应收账款'), '贷方金额', '记账日期')
45
+ adv = sum_by_period(smart_read(F, '凌川峰预收'), '贷方金额', '记账日期')
38
46
  summ = smart_read(F, '收款单汇总')
39
47
  mine = summ[summ['收款组织'].astype(str).str.contains('凌川峰')] # 先按组织过滤
40
- sum_ar = pd.Series(to_amount(mine['应收账款-贷方']).values, index=to_period(mine['月份']).values)
41
- sum_adv = pd.Series(to_amount(mine['预收账款-贷方']).values, index=to_period(mine['月份']).values)
42
- reconcile(ar, sum_ar, '应收明细', '汇总应收-贷方') # 逐月对平/差异一目了然
43
- reconcile(adv, sum_adv, '预收明细', '汇总预收-贷方')
48
+ sum_ar = pd.Series(to_amount(mine['应收账款-贷方']).values, index=to_period(mine['月份']).values)
49
+ reconcile(ar, sum_ar, '应收明细', '汇总应收-贷方') # 逐月对平/差异一目了然
50
+ ```
51
+
52
+ 对不平时**先查三件事再怀疑业务**:dtypes(金额是不是文本)、有没有把「合计」行也汇总进去、
53
+ 两边的期间口径是不是同一个(`to_period` 已统一,手写的容易不一致)。
54
+
55
+ ## 二、产出报表:用 `create_sheet`,不要自己写 openpyxl
56
+
57
+ `create_sheet(path, spec)` 是首选路径。你只给「哪张表放什么」,格式由引擎算:
58
+
59
+ ```jsonc
60
+ { "profile": "report",
61
+ "cover": { "title": "2026 年 8 月经营报表",
62
+ "fields": [["编制单位","数据一部"], ["口径","含税,截至 2026-08-31"], ["来源","ERP 销售出库单"]] },
63
+ "sheets": [{
64
+ "name": "分区域明细", "title": "2026 年 8 月分区域销售明细", "note": "口径:含税,单位万元",
65
+ "columns": [{"key":"region","header":"大区"}, {"key":"prov","header":"省份"},
66
+ {"key":"amt","header":"销售额","format":"amount"},
67
+ {"key":"rate","header":"毛利率","format":"percent"}],
68
+ "rows": [["华东","上海",12000.0,0.224], ["华南","广东",15300.0,0.168]],
69
+ "group_by": "region", "total": {"label":"总计"},
70
+ "conditional": [{"col":"amt","type":"data_bar"}],
71
+ "chart": {"type":"bar","cat":"prov","values":["amt"],"title":"各省销售额"}
72
+ }]}
73
+ ```
74
+
75
+ 引擎替你做对这几件最容易翻车的事,**不要再手工做一遍**:
76
+
77
+ - **合计一律写 `SUBTOTAL(9,…)` 公式,不是算好的常量**——常量合计在你改明细后不会更新,
78
+ 而且不报错。这是 Excel 交付件最经典的事故,也是本引擎存在的首要理由;
79
+ - 分组小计与总计都用 SUBTOTAL,**总计不会把小计再加一遍**(SUBTOTAL 会忽略嵌套的 SUBTOTAL,
80
+ 这正是这个函数存在的意义,用 SUM 就会翻倍);
81
+ - 列宽按内容量(数字列不够宽会显示成 ####,打印出来一片井号);
82
+ - 编号/身份证/单号类列强制 `text` 格式,防前导零消失与科学计数法;
83
+ - 冻结首行 + 自动筛选 + 打印缩放到一页宽 + 跨页重复标题行 + 页脚页码。
84
+
85
+ **三档规范** `profile`:`report` 业务报表(默认)/ `plain` 素表(便于再加工)/
86
+ `finance` 财务(会计格式、负数红括号)。**四套配色** `theme`:navy / green / mono / warm。
87
+
88
+ 已经有 DataFrame 时也可以走引擎(`xlsx_style.write_styled` 已改为它的薄封装):
89
+
90
+ ```python
91
+ import os, sys; sys.path.insert(0, os.path.join(os.environ['HUICAI_SKILLS_DIR'], 'xlsx-analysis', 'scripts'))
92
+ from xlsx_build import from_frames
93
+ from_frames({'明细': df, '汇总': pv}, '经营报表.xlsx', total=True, title='2026 年 8 月经营报表')
44
94
  ```
45
95
 
46
- ## 底层手法(工具箱不够用、或需自定义时)
47
-
48
- 1. **先摸结构再分析**(跳过这步 = 错误答案的头号来源):`sheet_map(path)`;或手写
49
- ```python
50
- import pandas as pd
51
- xf = pd.ExcelFile('文件.xlsx')
52
- for s in xf.sheet_names:
53
- print(s, xf.parse(s, header=None, nrows=8).to_markdown()) # header=None 看清表头到底在第几行
54
- ```
55
- 看清:表头在第几行?有没有合并单元格产生的 NaN?哪些列是日期/金额?
56
- 2. **正确读取**:表头不在首行用 `header=N` 或 `skiprows`;读全部 Sheet 用 `sheet_name=None`(返回 dict);大表先 `usecols` 挑列。
57
- 3. **清洗**:合并单元格读出的 NaN 用 `df[col] = df[col].ffill()`(仅对确认是合并单元格的列);金额千分位/文本用 `to_amount()`;日期用 `to_period()` 或 `pd.to_datetime(df[col])`。
58
- 4. **分析/透视**:
59
- ```python
60
- pv = df.pivot_table(index='地区', columns='季度', values='销售额', aggfunc='sum', margins=True, margins_name='合计')
61
- ```
62
- 多层透视 index=['大区','省份'];同时多个聚合 aggfunc={'销售额':'sum','订单':'count'}。
63
- 5. **格式化回写**:`read_skill_file` 读本技能 `scripts/xlsx_style.py`,把 `write_styled()` 连同代码一起执行——表头样式/冻结首行/自动列宽/数字格式/斑马纹一步到位。需要图表另出 png(画图先 load_skill('data-analysis') 用其字体脚本)。
64
- 6. **验收(必做)**:回写后**重新打开**校验并 print:
65
- ```python
66
- chk = pd.read_excel('产物.xlsx', sheet_name=None)
67
- for s, d in chk.items():
68
- print(s, d.shape, '| 首行:', d.iloc[0].tolist() if len(d) else '空', '| 末行:', d.iloc[-1].tolist() if len(d) else '空')
69
- ```
70
-
71
- ## 公式与格式的边界
72
-
73
- - pandas 读到的是**值**;要读**公式本身**用 `openpyxl.load_workbook(f)`(不带 data_only),要读**公式算出的值**用 `data_only=True`(前提:文件被 Excel 保存过,否则缓存值为 None——此时用 pandas 自己算)。
74
- - 回写公式:openpyxl `ws['D2'] = '=SUM(B2:C2)'`;写完的公式值要等用户用 Excel 打开才计算,验收时校验公式字符串而非值。
75
- - `.xls` 老格式:xlrd 已随核心装好,`pd.read_excel('x.xls')` 直接可读(pandas 按扩展名自动选引擎),无需补装。
76
-
77
- ## 常见坑
78
-
79
- - 「合计」行混在数据里:分析前剔除(`df[df['地区']!='合计']`),透视用 margins 自己生成。
80
- - 数字被读成文本(前导零/空格):对账合不上先查 dtypes。
81
- - 单元格里的换行与不可见空格:`str.strip()`。
82
- - 超大表(几十万行):pandas 正常处理;不要逐单元格 openpyxl 循环(慢百倍)。
83
-
84
- ## 验收自查
85
-
86
- - [ ] 第一步结构探查的输出在结果里(Sheets/形状/表头)
87
- - [ ] 每个产物 xlsx 都重读校验过(形状+首末行已 print)
88
- - [ ] 金额/日期列类型正确(对账类任务 print 过 dtypes)
89
- - [ ] 用户口径的"合计"与你算的合计对得上(差异要指出原因)
90
-
91
- ## 附件
92
-
93
- - `scripts/xlsx_toolkit.py` — **分析工具箱(首选先载)**:`sheet_map` 摸结构、`smart_read` 稳读脏表、`to_amount`/`to_period` 稳健转换、`sum_by_period` 按期汇总、`reconcile` 按期对账;`python xlsx_toolkit.py` 可直接跑自测
94
- - `scripts/xlsx_style.py` — 格式化回写助手:`write_styled(df_dict, path, ...)` 表头样式/冻结/列宽/数字格式/斑马纹;可直接执行自测
96
+ ## 三、验收:`xlsx_inspect` 必修项清零才算做完
97
+
98
+ `create_sheet` 已自动体检;**自己写 openpyxl/pandas 导出的更要手动跑一遍**。六类问题分三档:
99
+
100
+ | 必修(数字是错的) | 建议(能用,但不专业) | 提示 |
101
+ |---|---|---|
102
+ | 数值被存成文本(SUM 得 0) | 一列里数字与文本混杂 | 日期存成文本 |
103
+ | 合计是写死的常量而不是公式 | 一列里公式与手打常量混杂 | 易失函数过多 |
104
+ | 合计对不上明细之和 | 占比列合计不等于 100% | 断月 |
105
+ | 求和范围没覆盖到数据末行 | 外部工作簿链接 | 默认表名 Sheet1 |
106
+ | 错误值 #REF!/#DIV/0!/#N/A | 隐藏行列(会被 SUM 计入却看不见) | — |
107
+ | 数据区内的合并单元格 | 「合计」行混在明细中 | 表头不在首行 |
108
+ | 引用了不存在的工作表 | 完全重复行、首尾空白与不可见字符 | 极端值 |
109
+ | 编号列超 15 位已丢精度 | 编号列被存成数字(前导零消失) | — |
110
+ | 列宽不足会显示 #### | 同列数字格式不统一、金额缺千分位 | 缺筛选 |
111
+ | 重名列 | 缺冻结窗格、打印横跨多页 | 缺重复标题行 |
112
+
113
+ **旧版 `.xls`**(真实归档里常占一半:评审报告、预算表往往还是 .xls):体检会自动降级——
114
+ 用 xlrd 把**值**读进来做数据层与勾稽层判断,并明说公式、列宽、合并、冻结、打印这几类
115
+ **读不到、本次没查**(不是「没问题」)。`fix` 对 .xls 直接拒绝:读入时只剩值,
116
+ 另存会把原件的公式与格式一次性丢光,而输出文件看起来完全正常。先用 Excel 另存为 .xlsx 再修。
117
+
118
+ `xlsx_inspect(path, fix=true)` 自动修可确定性修的那几类(文本转数字、编号列转文本、清空白、
119
+ 拆数据区合并并填充、**写死的合计改成 SUBTOTAL 公式**、补齐求和范围、列宽自适应、格式归一、
120
+ 补千分位、冻结与筛选、打印一页宽),**另存 `-已校正.xlsx` 不覆盖原件**。
121
+ 救不回来的会如实说——比如编号已超 15 位、精度在导出那一刻就丢了,**任何工具都救不回来,
122
+ 只能让对方按文本重新导出**。别假装修好了。
123
+
124
+ ## 四、公式与格式的边界
125
+
126
+ - pandas 读到的是**值**;要读**公式本身**用 `openpyxl.load_workbook(f)`(不带 data_only),
127
+ 要读**公式算出的值**用 `data_only=True`——前提是文件被 Excel 保存过,否则缓存值为 None,
128
+ 此时用 pandas 自己算。
129
+ - 回写公式:`ws['D2'] = '=SUM(B2:C2)'`;公式值要等用户用 Excel 打开才计算,
130
+ 验收时校验公式字符串而非值(`xlsx_inspect` 就是这么查的)。
131
+ - 超大表(几十万行):pandas 正常处理;**不要逐单元格 openpyxl 循环**(慢百倍)。
132
+ 多表关联 / 跨表勾稽 / 内存吃紧改走 `sql-analysis`(DuckDB 直接对文件跑 SQL,不落库)——
133
+ 多步 merge→groupby→pivot→再 merge 是最容易写错也最难自查的一类代码,一句 SQL 说得清。
134
+
135
+ ## 五、交付自查
136
+
137
+ - [ ] 动手算之前跑过 `xlsx_inspect(profile=true)`,读进来的类型确认无误
138
+ - [ ] `xlsx_inspect` 必修 = 0(做不到就如实说明哪几项需要用户决定)
139
+ - [ ] 合计是公式不是常量(改一行明细,合计会跟着变)
140
+ - [ ] 用户口径的「合计」与你算的合计对得上,差异指出了原因
141
+ - [ ] 每个产物 xlsx 都重读校验过(形状 + 首末行已 print)
142
+ - [ ] 文件名是中文描述性名称,已 print 产物清单
143
+
144
+ ## 附件(日常用 `create_sheet` / `xlsx_inspect` 工具即可,不必读源码)
145
+
146
+ - `scripts/xlsx_toolkit.py` — **读脏表工具箱(分析第一步)**:`sheet_map` 摸结构、
147
+ `smart_read` 稳读、`to_amount`/`to_period` 稳健转换、`sum_by_period` 按期汇总、
148
+ `reconcile` 按期对账;可直接执行自测。
149
+ - `scripts/data_profile.py` — 数据体检:推断真实类型、找唯一标识列、重复行、同物异名、
150
+ 缺失率、极端值、断月。`profile(df)` / `report_file(path)`;也是 `xlsx_inspect(profile=true)` 的那一层。
151
+ - `scripts/xlsx_layout.py` — 呈现度量内核:列宽计算(中文按 2 宽)、数字格式档位、
152
+ 主题配色、打印页宽估算。**建表与体检共用同一把尺**。
153
+ - `scripts/xlsx_build.py` — 建表引擎:多表、标题、分组小计、合计公式、条件格式、
154
+ 数据验证、图表、打印设置;`from_frames()` 直接吃 DataFrame;`--demo` 可自测。
155
+ - `scripts/xlsx_check.py` — 体检与自动校正:`inspect()` / `report()` / `fix()`;
156
+ CLI `python xlsx_check.py 报表.xlsx --fix`。
157
+ - `scripts/xlsx_style.py` — 老接口 `write_styled()` 的兼容垫片(已改走新引擎)。
158
+ - `scripts/xlsx_battery.py` — 压力测试:随机内容 × 三档规范跑几百份断言零事故,
159
+ **反向造 29 类缺陷验证体检不是瞎子**,再跑 9 项反误报与校正闭环。
160
+ 改了上面任何一个引擎文件,**必须重跑**:`python xlsx_battery.py 300`。
95
161
 
96
162
  > 本技能属 **Excel 与数据分析链**——19 项数据能力路由与端到端工作流见 `excel-analysis-chain`。