@huicai/cli 2026.714.0 → 2026.721.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 (335) hide show
  1. package/README.md +2 -1
  2. package/bin/huicai.js +83 -0
  3. package/package.json +2 -2
  4. package/skills/ab-testing/SKILL.md +58 -0
  5. package/skills/ab-testing/scripts/__pycache__/ab_test.cpython-312.pyc +0 -0
  6. package/skills/ab-testing/scripts/ab_test.py +71 -0
  7. package/skills/academic-writing/SKILL.md +54 -0
  8. package/skills/accounting-ops/SKILL.md +68 -0
  9. package/skills/accounting-ops/scripts/__pycache__/acct_tools.cpython-312.pyc +0 -0
  10. package/skills/accounting-ops/scripts/acct_tools.py +89 -0
  11. package/skills/ai-agent/SKILL.md +85 -0
  12. package/skills/ai-agent/references/tool-design-checklist.md +51 -0
  13. package/skills/ai-aiops/SKILL.md +73 -0
  14. package/skills/ai-aiops/references/aiops-rollout-checklist.md +36 -0
  15. package/skills/ai-coding/SKILL.md +89 -0
  16. package/skills/ai-coding/references/task-brief-template.md +48 -0
  17. package/skills/ai-compliance/SKILL.md +74 -0
  18. package/skills/ai-compliance/references/genai-compliance-checklist.md +40 -0
  19. package/skills/ai-eval/SKILL.md +80 -0
  20. package/skills/ai-eval/scripts/eval-runner.py +150 -0
  21. package/skills/ai-llm-app/SKILL.md +90 -0
  22. package/skills/ai-llm-app/references/llm-integration-checklist.md +39 -0
  23. package/skills/ai-mlops/SKILL.md +72 -0
  24. package/skills/ai-mlops/scripts/token-cost-calc.py +108 -0
  25. package/skills/ai-multimodal/SKILL.md +86 -0
  26. package/skills/ai-multimodal/scripts/field-validate.py +182 -0
  27. package/skills/ai-prompt/SKILL.md +75 -0
  28. package/skills/ai-prompt/references/prompt-template.md +46 -0
  29. package/skills/ai-rag/SKILL.md +76 -0
  30. package/skills/ai-rag/scripts/chunk-inspect.py +129 -0
  31. package/skills/anomaly-detection/SKILL.md +54 -0
  32. package/skills/anomaly-detection/scripts/__pycache__/anomaly.cpython-312.pyc +0 -0
  33. package/skills/anomaly-detection/scripts/anomaly.py +99 -0
  34. package/skills/api-integration/SKILL.md +74 -0
  35. package/skills/api-integration/references/signing-recipes.md +141 -0
  36. package/skills/arch-design/SKILL.md +57 -0
  37. package/skills/arch-distributed/SKILL.md +81 -0
  38. package/skills/arch-distributed/references/idempotency-review.md +43 -0
  39. package/skills/arch-multitenant/SKILL.md +73 -0
  40. package/skills/arch-multitenant/references/tenant-isolation-checklist.md +34 -0
  41. package/skills/audit-assist/SKILL.md +63 -0
  42. package/skills/audit-assist/scripts/__pycache__/audit_sampling.cpython-312.pyc +0 -0
  43. package/skills/audit-assist/scripts/audit_sampling.py +93 -0
  44. package/skills/audit-chain/SKILL.md +60 -0
  45. package/skills/banking-credit/SKILL.md +59 -0
  46. package/skills/banking-credit/scripts/__pycache__/credit_metrics.cpython-312.pyc +0 -0
  47. package/skills/banking-credit/scripts/credit_metrics.py +53 -0
  48. package/skills/brand-design/SKILL.md +56 -0
  49. package/skills/business-plan/SKILL.md +56 -0
  50. package/skills/capital-ops/SKILL.md +52 -0
  51. package/skills/cicd-pipeline/SKILL.md +85 -0
  52. package/skills/cicd-pipeline/references/pipeline-review-checklist.md +39 -0
  53. package/skills/content-creation/SKILL.md +56 -0
  54. package/skills/corporate-governance/SKILL.md +56 -0
  55. package/skills/crawl-chain/SKILL.md +61 -0
  56. package/skills/customer-service/SKILL.md +51 -0
  57. package/skills/data-analysis/SKILL.md +46 -0
  58. package/skills/data-analysis/scripts/cjk_font.py +56 -0
  59. package/skills/data-chain/SKILL.md +54 -0
  60. package/skills/data-governance/SKILL.md +54 -0
  61. package/skills/data-report-pro/SKILL.md +65 -0
  62. package/skills/data-report-pro/scripts/__pycache__/bigdata.cpython-312.pyc +0 -0
  63. package/skills/data-report-pro/scripts/bigdata.py +79 -0
  64. package/skills/data-streaming/SKILL.md +87 -0
  65. package/skills/data-streaming/references/job-checklist.md +36 -0
  66. package/skills/data-wrangling/SKILL.md +52 -0
  67. package/skills/data-wrangling/scripts/__pycache__/join_tools.cpython-312.pyc +0 -0
  68. package/skills/data-wrangling/scripts/join_tools.py +99 -0
  69. package/skills/db-es/SKILL.md +68 -0
  70. package/skills/db-es/scripts/es-health.sh +72 -0
  71. package/skills/db-migration/SKILL.md +72 -0
  72. package/skills/db-migration/scripts/checksum-mysql.sql +46 -0
  73. package/skills/db-migration/scripts/checksum-postgres.sql +39 -0
  74. package/skills/db-migration/scripts/compare-reports.py +98 -0
  75. package/skills/db-mysql/SKILL.md +78 -0
  76. package/skills/db-mysql/scripts/mysql-health.sql +80 -0
  77. package/skills/db-postgres/SKILL.md +86 -0
  78. package/skills/db-postgres/scripts/pg-health.sql +67 -0
  79. package/skills/db-redis/SKILL.md +83 -0
  80. package/skills/db-redis/scripts/redis-health.sh +92 -0
  81. package/skills/dev-cpp/SKILL.md +94 -0
  82. package/skills/dev-cpp/references/cmake-sanitizer-snippets.md +56 -0
  83. package/skills/dev-cross-platform/SKILL.md +73 -0
  84. package/skills/dev-cross-platform/references/capability-matrix-template.md +39 -0
  85. package/skills/dev-csharp/SKILL.md +96 -0
  86. package/skills/dev-csharp/references/review-checklist.md +37 -0
  87. package/skills/dev-frontend/SKILL.md +91 -0
  88. package/skills/dev-frontend/scripts/bundle-budget.py +106 -0
  89. package/skills/dev-go/SKILL.md +88 -0
  90. package/skills/dev-go/scripts/go-triage.sh +54 -0
  91. package/skills/dev-harmony/SKILL.md +64 -0
  92. package/skills/dev-harmony/references/harmony-checklist.md +40 -0
  93. package/skills/dev-java/SKILL.md +77 -0
  94. package/skills/dev-java/scripts/jvm-triage.sh +84 -0
  95. package/skills/dev-mobile/SKILL.md +82 -0
  96. package/skills/dev-mobile/references/store-compliance-checklist.md +33 -0
  97. package/skills/dev-node/SKILL.md +82 -0
  98. package/skills/dev-node/scripts/node-triage.sh +78 -0
  99. package/skills/dev-php/SKILL.md +86 -0
  100. package/skills/dev-php/scripts/fpm-calc.py +48 -0
  101. package/skills/dev-python/SKILL.md +81 -0
  102. package/skills/dev-python/scripts/venv-doctor.sh +75 -0
  103. package/skills/dev-rust/SKILL.md +84 -0
  104. package/skills/dev-rust/references/cargo-ci-snippets.md +50 -0
  105. package/skills/dev-toolchain/SKILL.md +78 -0
  106. package/skills/dev-toolchain/scripts/secret-scan.sh +83 -0
  107. package/skills/doc-chain/SKILL.md +58 -0
  108. package/skills/doc-compare/SKILL.md +44 -0
  109. package/skills/doc-compare/scripts/compare.py +93 -0
  110. package/skills/docx-author/SKILL.md +39 -0
  111. package/skills/docx-author/scripts/docx_doc.py +161 -0
  112. package/skills/ecommerce-ops/SKILL.md +54 -0
  113. package/skills/ecommerce-ops/scripts/__pycache__/gmv_decompose.cpython-312.pyc +0 -0
  114. package/skills/ecommerce-ops/scripts/gmv_decompose.py +61 -0
  115. package/skills/education-training/SKILL.md +53 -0
  116. package/skills/ehs-safety/SKILL.md +63 -0
  117. package/skills/email-writing/SKILL.md +52 -0
  118. package/skills/eng-ai/SKILL.md +74 -0
  119. package/skills/eng-ai/references/ai-feature-checklist.md +36 -0
  120. package/skills/eng-architecture/SKILL.md +85 -0
  121. package/skills/eng-architecture/scripts/capacity-calc.py +100 -0
  122. package/skills/eng-automation/SKILL.md +84 -0
  123. package/skills/eng-automation/references/automation-inventory.md +38 -0
  124. package/skills/eng-automation/references/routine-presets.md +73 -0
  125. package/skills/eng-collaboration/SKILL.md +76 -0
  126. package/skills/eng-collaboration/references/collab-templates.md +43 -0
  127. package/skills/eng-complex-env/SKILL.md +84 -0
  128. package/skills/eng-complex-env/references/env-dossier-template.md +52 -0
  129. package/skills/eng-complex-env/scripts/env-recon.sh +152 -0
  130. package/skills/eng-data-platform/SKILL.md +81 -0
  131. package/skills/eng-data-platform/references/table-spec-template.md +39 -0
  132. package/skills/eng-database/SKILL.md +79 -0
  133. package/skills/eng-database/references/schema-review-checklist.md +37 -0
  134. package/skills/eng-develop/SKILL.md +76 -0
  135. package/skills/eng-develop/references/dod-checklist.md +43 -0
  136. package/skills/eng-docs/SKILL.md +71 -0
  137. package/skills/eng-docs/references/runbook-template.md +57 -0
  138. package/skills/eng-efficiency/SKILL.md +75 -0
  139. package/skills/eng-efficiency/scripts/dora-calc.py +104 -0
  140. package/skills/eng-infra/SKILL.md +81 -0
  141. package/skills/eng-infra/references/production-readiness.md +46 -0
  142. package/skills/eng-integration/SKILL.md +82 -0
  143. package/skills/eng-integration/references/integration-dossier-template.md +38 -0
  144. package/skills/eng-legacy/SKILL.md +81 -0
  145. package/skills/eng-legacy/references/modernization-workbook.md +46 -0
  146. package/skills/eng-observability/SKILL.md +78 -0
  147. package/skills/eng-observability/scripts/slo-calc.py +82 -0
  148. package/skills/eng-ops/SKILL.md +74 -0
  149. package/skills/eng-ops/references/postmortem-template.md +67 -0
  150. package/skills/eng-performance/SKILL.md +73 -0
  151. package/skills/eng-performance/scripts/perf-baseline.py +110 -0
  152. package/skills/eng-planning/SKILL.md +79 -0
  153. package/skills/eng-planning/scripts/schedule-calc.py +101 -0
  154. package/skills/eng-quality/SKILL.md +74 -0
  155. package/skills/eng-quality/references/test-plan-templates.md +46 -0
  156. package/skills/eng-release/SKILL.md +78 -0
  157. package/skills/eng-release/references/release-plan-template.md +36 -0
  158. package/skills/eng-reliability/SKILL.md +72 -0
  159. package/skills/eng-reliability/references/resilience-review.md +43 -0
  160. package/skills/eng-requirements/SKILL.md +86 -0
  161. package/skills/eng-requirements/references/story-templates.md +47 -0
  162. package/skills/eng-research/SKILL.md +73 -0
  163. package/skills/eng-research/references/research-templates.md +42 -0
  164. package/skills/eng-security/SKILL.md +73 -0
  165. package/skills/eng-security/references/security-review-checklist.md +33 -0
  166. package/skills/eng-ux/SKILL.md +85 -0
  167. package/skills/eng-ux/references/ux-review-checklist.md +36 -0
  168. package/skills/engineering-chain/SKILL.md +101 -0
  169. package/skills/engineering-chain/references/eng-health-review.md +37 -0
  170. package/skills/env-offline/SKILL.md +81 -0
  171. package/skills/env-offline/scripts/bundle-manifest.sh +94 -0
  172. package/skills/env-private-deploy/SKILL.md +72 -0
  173. package/skills/env-private-deploy/references/delivery-templates.md +35 -0
  174. package/skills/env-xinchuang/SKILL.md +73 -0
  175. package/skills/env-xinchuang/references/adaptation-matrix-template.md +41 -0
  176. package/skills/equipment-tpm/SKILL.md +56 -0
  177. package/skills/equipment-tpm/scripts/oee.py +58 -0
  178. package/skills/esg-report/SKILL.md +58 -0
  179. package/skills/esg-report/scripts/carbon_calc.py +61 -0
  180. package/skills/event-management/SKILL.md +51 -0
  181. package/skills/excel-analysis-chain/SKILL.md +73 -0
  182. package/skills/file-ingest/SKILL.md +51 -0
  183. package/skills/file-ingest/scripts/__pycache__/file_toolkit.cpython-312.pyc +0 -0
  184. package/skills/file-ingest/scripts/file_toolkit.py +404 -0
  185. package/skills/finance-analysis/SKILL.md +60 -0
  186. package/skills/finance-analysis/references/ratios.md +54 -0
  187. package/skills/finance-analysis/scripts/fin_ratios.py +132 -0
  188. package/skills/finance-chain/SKILL.md +59 -0
  189. package/skills/financial-modeling/SKILL.md +58 -0
  190. package/skills/financial-modeling/scripts/fin_model.py +123 -0
  191. package/skills/foreign-trade/SKILL.md +54 -0
  192. package/skills/funnel-cohort/SKILL.md +53 -0
  193. package/skills/funnel-cohort/scripts/__pycache__/funnel.cpython-312.pyc +0 -0
  194. package/skills/funnel-cohort/scripts/funnel.py +105 -0
  195. package/skills/gov-document/SKILL.md +57 -0
  196. package/skills/hr-chain/SKILL.md +51 -0
  197. package/skills/hr-operations/SKILL.md +53 -0
  198. package/skills/info-disclosure/SKILL.md +56 -0
  199. package/skills/infra-gateway/SKILL.md +85 -0
  200. package/skills/infra-gateway/references/golive-checklist.md +36 -0
  201. package/skills/infra-k8s/SKILL.md +78 -0
  202. package/skills/infra-k8s/scripts/k8s-triage.sh +84 -0
  203. package/skills/infra-mq/SKILL.md +87 -0
  204. package/skills/infra-mq/references/mq-review-checklist.md +36 -0
  205. package/skills/insurance-advisory/SKILL.md +57 -0
  206. package/skills/internal-audit/SKILL.md +66 -0
  207. package/skills/ip-management/SKILL.md +54 -0
  208. package/skills/ipo-listing/SKILL.md +60 -0
  209. package/skills/it-audit/SKILL.md +56 -0
  210. package/skills/itsm-ops/SKILL.md +55 -0
  211. package/skills/knowledge-sop/SKILL.md +51 -0
  212. package/skills/legal-chain/SKILL.md +55 -0
  213. package/skills/legal-contract/SKILL.md +58 -0
  214. package/skills/legal-contract/references/contract-checklists.md +59 -0
  215. package/skills/litigation-support/SKILL.md +53 -0
  216. package/skills/logistics-warehouse/SKILL.md +53 -0
  217. package/skills/logistics-warehouse/scripts/freight_check.py +71 -0
  218. package/skills/long-doc-analysis/SKILL.md +52 -0
  219. package/skills/management-accounting/SKILL.md +57 -0
  220. package/skills/management-accounting/scripts/__pycache__/costing.cpython-312.pyc +0 -0
  221. package/skills/management-accounting/scripts/costing.py +90 -0
  222. package/skills/manufacturing-chain/SKILL.md +57 -0
  223. package/skills/manufacturing-quality/SKILL.md +57 -0
  224. package/skills/manufacturing-quality/scripts/__pycache__/spc.cpython-312.pyc +0 -0
  225. package/skills/manufacturing-quality/scripts/spc.py +86 -0
  226. package/skills/marketing-analytics/SKILL.md +59 -0
  227. package/skills/marketing-analytics/scripts/__pycache__/rfm.cpython-312.pyc +0 -0
  228. package/skills/marketing-analytics/scripts/rfm.py +60 -0
  229. package/skills/marketing-chain/SKILL.md +57 -0
  230. package/skills/meeting-minutes/SKILL.md +55 -0
  231. package/skills/metrics-system/SKILL.md +55 -0
  232. package/skills/negotiation-prep/SKILL.md +56 -0
  233. package/skills/obs-prometheus/SKILL.md +74 -0
  234. package/skills/obs-prometheus/references/promql-cheatsheet.md +78 -0
  235. package/skills/office-automation/SKILL.md +54 -0
  236. package/skills/okr-review/SKILL.md +44 -0
  237. package/skills/ops-fleet/SKILL.md +69 -0
  238. package/skills/ops-fleet/scripts/batch-exec-guard.sh +119 -0
  239. package/skills/ops-linux/SKILL.md +69 -0
  240. package/skills/ops-linux/scripts/quick-triage.sh +138 -0
  241. package/skills/optimization-solver/SKILL.md +53 -0
  242. package/skills/optimization-solver/scripts/__pycache__/solver.cpython-312.pyc +0 -0
  243. package/skills/optimization-solver/scripts/solver.py +107 -0
  244. package/skills/pdf-toolkit/SKILL.md +43 -0
  245. package/skills/pdf-toolkit/scripts/pdf_ops.py +137 -0
  246. package/skills/pivot-crosstab/SKILL.md +44 -0
  247. package/skills/pivot-crosstab/scripts/__pycache__/pivot_tools.cpython-312.pyc +0 -0
  248. package/skills/pivot-crosstab/scripts/pivot_tools.py +90 -0
  249. package/skills/policy-analysis/SKILL.md +47 -0
  250. package/skills/portfolio-analysis/SKILL.md +56 -0
  251. package/skills/portfolio-analysis/scripts/__pycache__/portfolio.cpython-312.pyc +0 -0
  252. package/skills/portfolio-analysis/scripts/portfolio.py +78 -0
  253. package/skills/ppt-chain/SKILL.md +61 -0
  254. package/skills/pptx-author/SKILL.md +48 -0
  255. package/skills/pptx-author/scripts/pptx_deck.py +193 -0
  256. package/skills/pr-comms/SKILL.md +58 -0
  257. package/skills/pr-comms/references/pr-templates.md +54 -0
  258. package/skills/procurement-supply/SKILL.md +47 -0
  259. package/skills/procurement-supply/scripts/__pycache__/supply.cpython-312.pyc +0 -0
  260. package/skills/procurement-supply/scripts/supply.py +71 -0
  261. package/skills/product-design/SKILL.md +66 -0
  262. package/skills/product-design/references/prd-framework.md +60 -0
  263. package/skills/production-planning/SKILL.md +56 -0
  264. package/skills/production-planning/scripts/__pycache__/mrp_capacity.cpython-312.pyc +0 -0
  265. package/skills/production-planning/scripts/mrp_capacity.py +70 -0
  266. package/skills/project-management/SKILL.md +53 -0
  267. package/skills/project-management/scripts/__pycache__/cpm.cpython-312.pyc +0 -0
  268. package/skills/project-management/scripts/cpm.py +84 -0
  269. package/skills/project-proposal/SKILL.md +54 -0
  270. package/skills/project-proposal/scripts/budget_sheet.py +90 -0
  271. package/skills/qa-api-automation/SKILL.md +67 -0
  272. package/skills/qa-api-automation/references/three-layer-skeleton.md +61 -0
  273. package/skills/qa-mobile-automation/SKILL.md +70 -0
  274. package/skills/qa-mobile-automation/references/device-matrix-template.md +34 -0
  275. package/skills/qa-ui-automation/SKILL.md +80 -0
  276. package/skills/qa-ui-automation/references/stability-conventions.md +41 -0
  277. package/skills/quant-analysis/SKILL.md +60 -0
  278. package/skills/quant-analysis/scripts/__pycache__/quant.cpython-312.pyc +0 -0
  279. package/skills/quant-analysis/scripts/quant.py +102 -0
  280. package/skills/real-estate-property/SKILL.md +51 -0
  281. package/skills/real-estate-property/scripts/__pycache__/property_calc.cpython-312.pyc +0 -0
  282. package/skills/real-estate-property/scripts/property_calc.py +106 -0
  283. package/skills/regression-forecast/SKILL.md +52 -0
  284. package/skills/regression-forecast/scripts/__pycache__/regress.cpython-312.pyc +0 -0
  285. package/skills/regression-forecast/scripts/regress.py +106 -0
  286. package/skills/retail-store-ops/SKILL.md +57 -0
  287. package/skills/retail-store-ops/scripts/store_ops.py +57 -0
  288. package/skills/risk-compliance/SKILL.md +51 -0
  289. package/skills/sec-auth/SKILL.md +89 -0
  290. package/skills/sec-auth/references/auth-review-checklist.md +38 -0
  291. package/skills/sec-compliance/SKILL.md +74 -0
  292. package/skills/sec-compliance/references/dengbao-checklist.md +43 -0
  293. package/skills/securities-chain/SKILL.md +69 -0
  294. package/skills/securities-research/SKILL.md +58 -0
  295. package/skills/securities-research/scripts/__pycache__/valuation.cpython-312.pyc +0 -0
  296. package/skills/securities-research/scripts/valuation.py +93 -0
  297. package/skills/slides-html/SKILL.md +50 -0
  298. package/skills/slides-html/scripts/template.html +117 -0
  299. package/skills/statistical-testing/SKILL.md +51 -0
  300. package/skills/statistical-testing/scripts/__pycache__/stat_tests.cpython-312.pyc +0 -0
  301. package/skills/statistical-testing/scripts/stat_tests.py +131 -0
  302. package/skills/strategy-planning/SKILL.md +53 -0
  303. package/skills/supply-chain/SKILL.md +53 -0
  304. package/skills/tax-compliance/SKILL.md +57 -0
  305. package/skills/tax-compliance/scripts/tax_calc.py +90 -0
  306. package/skills/tech-research/SKILL.md +55 -0
  307. package/skills/tech-research/references/research-framework.md +50 -0
  308. package/skills/tender-bidding/SKILL.md +65 -0
  309. package/skills/tender-bidding/references/bid-checklist.md +44 -0
  310. package/skills/translation-pro/SKILL.md +44 -0
  311. package/skills/treasury-mgmt/SKILL.md +56 -0
  312. package/skills/treasury-mgmt/scripts/__pycache__/cashflow_forecast.cpython-312.pyc +0 -0
  313. package/skills/treasury-mgmt/scripts/cashflow_forecast.py +51 -0
  314. package/skills/web-scraping/SKILL.md +81 -0
  315. package/skills/web-search/SKILL.md +67 -0
  316. package/skills/xlsx-analysis/SKILL.md +96 -0
  317. package/skills/xlsx-analysis/scripts/__pycache__/xlsx_toolkit.cpython-312.pyc +0 -0
  318. package/skills/xlsx-analysis/scripts/xlsx_style.py +71 -0
  319. package/skills/xlsx-analysis/scripts/xlsx_toolkit.py +335 -0
  320. package/src/agent.js +1 -1
  321. package/src/api.js +1 -1
  322. package/src/codeindex.js +1 -1
  323. package/src/commands.js +1 -1
  324. package/src/config.js +1 -1
  325. package/src/context.js +1 -1
  326. package/src/doccache.js +1 -0
  327. package/src/doctor.js +1 -1
  328. package/src/executors.js +1 -1
  329. package/src/input.js +1 -1
  330. package/src/permissions.js +1 -1
  331. package/src/pyruntime.js +1 -0
  332. package/src/repl.js +1 -1
  333. package/src/scan.js +1 -1
  334. package/src/tools.js +1 -1
  335. package/src/tui/app.js +1 -1
@@ -0,0 +1,71 @@
1
+ # 采购供应链计算件(经 run_python 执行):供应商评分卡 / ABC 分析 / 周转与呆滞。
2
+ # 直接执行本文件 = 自测。
3
+ import numpy as np
4
+ import pandas as pd
5
+
6
+ DEFAULT_WEIGHTS = {'质量': 30, '交付': 25, '成本': 20, '服务': 15, '合规财务': 10}
7
+ GRADES = [(85, 'A-战略'), (75, 'B-优选'), (60, 'C-观察'), (0, 'D-退出')]
8
+
9
+
10
+ def supplier_scorecard(scores, weights=None):
11
+ """scores: DataFrame(行=供应商,列=维度,0–100 分)。返回带加权总分/排名/分级的表。"""
12
+ w = weights or DEFAULT_WEIGHTS
13
+ assert abs(sum(w.values()) - 100) < 1e-6, '权重和须为 100'
14
+ miss = [c for c in w if c not in scores.columns]
15
+ assert not miss, f'缺维度列:{miss}'
16
+ out = scores.copy()
17
+ out['总分'] = sum(out[c] * p / 100 for c, p in w.items()).round(1)
18
+ out['排名'] = out['总分'].rank(ascending=False, method='min').astype(int)
19
+ out['分级'] = out['总分'].map(lambda s: next(g for th, g in GRADES if s >= th))
20
+ out = out.sort_values('总分', ascending=False)
21
+ print(f'[评分卡] 权重={w}')
22
+ print(out.to_markdown())
23
+ return out
24
+
25
+
26
+ def abc_analysis(df, item_col, amount_col, a=0.7, b=0.9):
27
+ """按金额累计占比分级:A≤70%、B≤90%、其余 C。返回带累计占比与级别的表。"""
28
+ g = df.groupby(item_col, as_index=False, observed=True)[amount_col].sum() \
29
+ .sort_values(amount_col, ascending=False).reset_index(drop=True)
30
+ g['累计占比'] = (g[amount_col].cumsum() / g[amount_col].sum()).round(4)
31
+ g['级别'] = np.where(g['累计占比'] <= a, 'A', np.where(g['累计占比'] <= b, 'B', 'C'))
32
+ stat = g.groupby('级别', observed=True).agg(品项数=(item_col, 'size'),
33
+ 金额=(amount_col, 'sum')).round(1)
34
+ print('[ABC]\n' + stat.to_markdown())
35
+ return g
36
+
37
+
38
+ def turnover_days(inv_df, out_df, item_col, qty_col, days=90, stagnant_days=60, stagnant_min=0):
39
+ """周转天数与呆滞:inv=当前库存(品项,数量);out=期间出库明细(品项,数量,可含日期)。
40
+ 周转天数=库存/日均出库;期间出库=0 且库存>stagnant_min → 呆滞。"""
41
+ o = out_df.groupby(item_col, observed=True)[qty_col].sum().rename('期间出库')
42
+ m = inv_df.set_index(item_col).join(o).fillna({'期间出库': 0}).reset_index()
43
+ m['日均出库'] = m['期间出库'] / days
44
+ m['周转天数'] = np.where(m['日均出库'] > 0, m[qty_col] / m['日均出库'], np.inf).round(1)
45
+ m['呆滞'] = (m['期间出库'] == 0) & (m[qty_col] > stagnant_min)
46
+ n_stag = int(m['呆滞'].sum())
47
+ print(f'[周转] 品项 {len(m)} · 呆滞 {n_stag} · 周转天数中位 '
48
+ f"{m.loc[np.isfinite(m['周转天数']), '周转天数'].median():.0f} 天(观察期 {days} 天口径)")
49
+ return m
50
+
51
+
52
+ if __name__ == '__main__':
53
+ sc = pd.DataFrame({'质量': [92, 78, 65], '交付': [88, 82, 70], '成本': [70, 85, 90],
54
+ '服务': [85, 75, 60], '合规财务': [90, 80, 55]},
55
+ index=['甲供', '乙供', '丙供'])
56
+ card = supplier_scorecard(sc)
57
+ assert card.iloc[0].name == '甲供' and card.loc['丙供', '分级'].startswith(('C', 'D'))
58
+
59
+ rng = np.random.default_rng(3)
60
+ items = pd.DataFrame({'物料': [f'M{i:03d}' for i in range(100)],
61
+ '金额': np.sort(rng.pareto(1.5, 100) * 1000)[::-1].round(0)})
62
+ abc = abc_analysis(items, '物料', '金额')
63
+ assert (abc[abc['级别'] == 'A']['金额'].sum() / abc['金额'].sum()) <= 0.72
64
+ assert set(abc['级别']) == {'A', 'B', 'C'}
65
+
66
+ inv = pd.DataFrame({'物料': ['M001', 'M002', 'M003'], '数量': [900, 50, 300]})
67
+ out = pd.DataFrame({'物料': ['M001'] * 3 + ['M002'], '数量': [30, 30, 30, 5]})
68
+ t = turnover_days(inv, out, '物料', '数量', days=90)
69
+ assert bool(t.loc[t['物料'] == 'M003', '呆滞'].iloc[0]) is True
70
+ assert abs(t.loc[t['物料'] == 'M001', '周转天数'].iloc[0] - 900) < 1
71
+ print('OK supply.py')
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: product-design
3
+ description: 产品设计与需求文档(PRD、用户故事与验收标准、竞品拆解、埋点方案、需求评审)。当用户说"写 PRD/需求文档/用户故事/竞品拆解/埋点/产品方案"时使用。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 产品设计(PRD 范式 + 可验收的需求 + 竞品拆解 + 埋点)
8
+
9
+ ## PRD(`read_skill_file` 读 `references/prd-framework.md` 取完整骨架)
10
+
11
+ 七段结构:背景与问题(数据佐证的痛点,不是"为了体验更好")→ 目标与非目标
12
+ (**非目标必须写**,砍范围的依据)→ 用户与场景(画像+触发场景)→ 方案总览(流程图文字版/信息架构)→
13
+ 功能详述(逐功能:交互规则+边界条件+异常态)→ 数据与埋点 → 发布计划(灰度/回滚条件)。
14
+
15
+ **功能详述的深度标准**(区别于"简单实现"的关键):
16
+ - 每个输入给:类型/长度/校验规则/默认值/为空时;
17
+ - 每个列表给:排序规则/分页/空态文案/加载失败态;
18
+ - 每个操作给:权限/二次确认与否/操作后去向/可撤销否;
19
+ - 状态机类(订单/审核)给状态迁移表:状态×动作→新状态+触发通知。
20
+
21
+ ## 用户故事与验收标准
22
+
23
+ 故事:As a【角色】I want【能力】so that【价值】——价值写不出=伪需求。
24
+ 验收用 Gherkin:
25
+ ```
26
+ Given 已登录的普通用户且购物车为空
27
+ When 点击「立即购买」
28
+ Then 跳转确认页且默认地址为最近使用地址
29
+ ```
30
+ 每个故事 ≥3 条场景(正常/边界/异常);验收标准是给 QA 直接执行的,不许有"体验良好"类不可判定项。
31
+
32
+ ## 竞品拆解
33
+
34
+ 拆解不是截图汇总:选 2–4 个竞品,按「核心流程逐步拆(步数/必填项/打断点)→
35
+ 功能矩阵(有无+完成度打分+证据)→ 策略推断(它为什么这么做)→ 借鉴与差异化结论」。
36
+ 体验类结论要走查真实流程后再写,注明版本与日期。
37
+
38
+ ## 埋点方案
39
+
40
+ 事件表:事件名(动宾式 `page_view`/`order_submit_click`)/触发时机(精确到交互)/
41
+ 属性(名/类型/取值枚举)/平台/负责人。
42
+ 指标先行:先写「要回答什么问题→需要什么指标→需要什么事件」,反向推导,禁止"先埋了再说"。
43
+ 核心漏斗事件必须成对检查(曝光有点击、发起有结果)。
44
+
45
+ ## 需求评审与优先级
46
+
47
+ - 优先级用 RICE(Reach×Impact×Confidence÷Effort)或 KANO 定性,给打分过程;
48
+ - 评审前自查:与现有功能冲突?数据兼容(老数据怎么办)?多端一致性?权限矩阵?
49
+ - 砍需求话术要给替代("本期不做 X,用 Y 过渡,数据达到 Z 再启动")。
50
+
51
+ ## 产出物组合
52
+
53
+ PRD(docx-author,含修订记录表)/ 评审 PPT(slides-html:问题-方案-数据-计划)/
54
+ 埋点表与功能矩阵(xlsx-analysis 样式)/ 状态迁移表。
55
+
56
+ ## 验收自查
57
+
58
+ - [ ] 非目标已写;每个功能有边界与异常态
59
+ - [ ] 验收标准全部可判定(能写成测试用例)
60
+ - [ ] 埋点由指标反向推导且漏斗成对
61
+ - [ ] 状态机类需求有迁移表
62
+ - [ ] 竞品结论有版本/日期/证据
63
+
64
+ ## 附件
65
+
66
+ - `references/prd-framework.md` — PRD 完整骨架 + 状态迁移表/埋点表/功能矩阵模板 + RICE 表
@@ -0,0 +1,60 @@
1
+ # PRD 骨架与配套模板
2
+
3
+ ## PRD 完整骨架(章节可增不可减)
4
+
5
+ ```
6
+ # 【产品/功能名】PRD
7
+ 版本记录:| 版本 | 日期 | 作者 | 变更摘要 |
8
+
9
+ ## 1. 背景与问题
10
+ - 现状数据:【指标现值与趋势,来源】
11
+ - 用户痛点:【谁在什么场景遇到什么问题,佐证(调研/客诉/数据)】
12
+ - 机会判断:【为什么现在做】
13
+
14
+ ## 2. 目标与非目标
15
+ - 目标:【上线后 N 周内,指标 X 从 A → B】(可量化,有时限)
16
+ - 非目标:【明确不做什么及原因】——评审时防蔓延的锚
17
+
18
+ ## 3. 用户与场景
19
+ | 画像 | 触发场景 | 当前解法 | 期望 |
20
+
21
+ ## 4. 方案总览
22
+ - 核心流程:【步骤 1 → 2 → 3,每步谁做什么】
23
+ - 信息架构变化:【新增/调整的页面与入口】
24
+ - 方案取舍:【备选方案与放弃原因】
25
+
26
+ ## 5. 功能详述(逐功能)
27
+ ### 5.x 【功能名】
28
+ - 入口与权限:
29
+ - 交互规则:【含输入校验/排序分页/空态/失败态/撤销】
30
+ - 边界条件:【并发/极值/网络异常/数据不存在】
31
+ - 状态迁移表(如适用):| 当前状态 | 动作 | 条件 | 新状态 | 通知 |
32
+ - 文案清单:【标题/按钮/空态/报错,中英一致性】
33
+
34
+ ## 6. 数据与埋点
35
+ - 要回答的问题 → 指标 → 事件(反向推导表)
36
+ - 事件表:| 事件名 | 触发时机 | 属性(名/类型/枚举) | 平台 |
37
+
38
+ ## 7. 发布计划
39
+ - 灰度策略:【比例/人群/观察指标与阈值】
40
+ - 回滚条件:【指标恶化到什么程度回滚,怎么回滚】
41
+ - 依赖与风险:【上下游/审核/合规】
42
+ ```
43
+
44
+ ## RICE 优先级表
45
+
46
+ | 需求 | Reach(人/期) | Impact(0.25–3) | Confidence(%) | Effort(人周) | 分数=R×I×C/E |
47
+ |---|---|---|---|---|---|
48
+
49
+ ## 功能矩阵(竞品)
50
+
51
+ | 能力项 | 我方 | 竞品A | 竞品B | 证据(版本/截图说明) | 结论 |
52
+ |---|---|---|---|---|---|
53
+ (完成度:✗无 / ▲基础 / ●完整 / ★标杆)
54
+
55
+ ## 状态迁移表示例(订单)
56
+
57
+ | 当前状态 | 动作 | 前置条件 | 新状态 | 触达 |
58
+ |---|---|---|---|---|
59
+ | 待支付 | 支付成功回调 | 金额校验通过 | 待发货 | 短信+站内信 |
60
+ | 待支付 | 超时30min | — | 已取消 | 站内信;库存回补 |
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: production-planning
3
+ description: 生产计划与排程(订单交期评审、MPS 主计划、MRP 净需求运算、产能负荷分析、插单评估、缺料管理)。当用户说"排产/交期能不能接/物料需求/产能够不够/插单/缺料"时使用。制造技能链之计划环。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 生产计划与排程(制造技能链 · 计划环;全景见 manufacturing-chain)
8
+
9
+ 计划的本职是**说真话的交期**:接单前双核(产能+物料),接了的单守住,守不住的提前预警。
10
+
11
+ ## 1. 订单评审(交期承诺前的双核)
12
+
13
+ - **产能核**:订单工时需求 × 瓶颈工序负荷(见 §3)——瓶颈说了算,非瓶颈富余没有意义(TOC);
14
+ - **物料核**:长周期物料(采购提前期 > 客户交期的料)现有+在途够不够,不够则交期=物料到期+生产周期;
15
+ - 输出评审单:可承诺交期(CTP)+ 依据(瓶颈负荷 %/关键料到期)+ 风险(单一供应商/新工艺)——
16
+ **销售拍的交期不算数,评审单算数**。
17
+
18
+ ## 2. MPS 与 MRP(`read_skill_file` 读 `scripts/mrp_capacity.py`)
19
+
20
+ - MPS 主生产计划:按周排产品级计划(需求=订单+预测,冻结期内不许改,变更走插单流程);
21
+ - **MRP 净需求**:`net_requirements()` —— 逐期:净需求 = 毛需求 − 可用库存 − 在途 + 安全库存,
22
+ BOM 逐层展开(父项净需求 × 单耗 = 子项毛需求),输出分期采购/生产建议(考虑提前期回推下单期);
23
+ - 数据纪律:BOM 准确率与库存准确率(logistics-warehouse 口径)是 MRP 的命——
24
+ **垃圾进垃圾出,先治数据再信系统**;呆滞与安全库存联动 procurement-supply。
25
+
26
+ ## 3. 产能负荷分析
27
+
28
+ `capacity_load()`:分工序 负荷% = 需求工时 ÷ 可用工时(可用=班次×时长×设备数×稼动率,
29
+ 稼动率用 equipment-tpm 的实际 OEE,别用铭牌值);
30
+ 超载(>100%)三选给决策表:**加班**(成本+疲劳质量风险)/ **外协**(费用+质量管控,
31
+ supply-chain 准入)/ **改期**(客户沟通话术+违约条款核查 legal)——与 project-management
32
+ 延期三案同构;瓶颈工序单独盯(缓冲与优先派工)。
33
+
34
+ ## 4. 排产与执行
35
+
36
+ 排产规则显式化(交期优先 EDD/瓶颈利用率优先/换型最小化——规则冲突时的优先级写死);
37
+ 日计划-日报工-差异闭环(计划达成率 = 按时完工工单/总工单,连续 <85% 查根因:
38
+ 缺料/设备/品质/计划本身虚);缺料管理:缺料表(料号/需求日/在途/差口/责任采购/催料动作)
39
+ 每日刷新,**缺料预警要早于停线**(提前期倒推的预警点)。
40
+
41
+ ## 5. 插单评估(老板的单也要算完再接)
42
+
43
+ 插单影响三算:挤掉谁(被延误订单清单与客户等级)/ 换型损失(次数×时长)/
44
+ 加急成本(空运/加班费)→ 影响面报告给决策者选,**不算就接单=计划失效的开始**;
45
+ 插单留白策略:产能预留 5–10% 弹性(旺季调高)。
46
+
47
+ ## 验收自查
48
+
49
+ - [ ] 交期承诺有评审单(产能+物料双核依据)
50
+ - [ ] MRP 用了实际库存/在途/提前期,BOM 版本正确
51
+ - [ ] 超载给了三案决策表而非硬压
52
+ - [ ] 插单有影响面报告;缺料预警早于需求日
53
+
54
+ ## 附件
55
+
56
+ - `scripts/mrp_capacity.py` — net_requirements 分期净需求(BOM 展开+提前期回推)/ capacity_load 工序负荷与超载三案;可直接执行自测
@@ -0,0 +1,70 @@
1
+ # 计划计算件(经 run_python 执行):MRP 分期净需求(单层 BOM 展开+提前期回推下单期)/ 工序产能负荷。
2
+ # 直接执行本文件 = 自测。
3
+ import pandas as pd
4
+
5
+
6
+ def net_requirements(gross, on_hand, on_order=None, safety=0.0, lead_weeks=0, item='物料'):
7
+ """分期净需求:净需求_t = max(毛需求_t + 安全库存 − 期初可用_t − 在途_t, 0);
8
+ 可用滚动:期末可用 = 期初 + 在途 + 计划到货(=净需求) − 毛需求。
9
+ gross: {周: 数量};on_order: {周: 在途到货}。返回计划表(含回推下单周)。"""
10
+ weeks = sorted(gross)
11
+ oo = on_order or {}
12
+ rows, avail = [], float(on_hand)
13
+ for w in weeks:
14
+ g = float(gross[w])
15
+ rec = float(oo.get(w, 0.0))
16
+ need = max(g + safety - avail - rec, 0.0)
17
+ end = avail + rec + need - g
18
+ rows.append({'周': w, '毛需求': g, '期初可用': round(avail, 1), '在途': rec,
19
+ '净需求': round(need, 1), '下单周': w - lead_weeks if need > 0 else None,
20
+ '期末可用': round(end, 1)})
21
+ avail = end
22
+ df = pd.DataFrame(rows)
23
+ late = df[(df['净需求'] > 0) & (df['下单周'].notna()) & (df['下单周'] < weeks[0])]
24
+ print(f"[MRP:{item}] 净需求合计 {df['净需求'].sum():,.0f}(提前期 {lead_weeks} 周)")
25
+ if len(late):
26
+ print(f" ⚠ {len(late)} 期下单周已过(应在第 {late['下单周'].min():.0f} 周下单):交期不可守,走缺料预警/改期评估")
27
+ print(df.to_markdown(index=False))
28
+ return df
29
+
30
+
31
+ def explode_bom(parent_net, bom):
32
+ """单层 BOM 展开:父项净需求 × 单耗 →各子件毛需求。bom: DataFrame[子件, 单耗]。"""
33
+ out = {}
34
+ for _, r in bom.iterrows():
35
+ out[r['子件']] = {w: v * r['单耗'] for w, v in parent_net.items()}
36
+ print(f'[BOM] 展开 {len(out)} 个子件')
37
+ return out
38
+
39
+
40
+ def capacity_load(demand_hours, available_hours):
41
+ """工序负荷:负荷% = 需求工时/可用工时;>100% 给三案提示。两 dict 以工序为键。"""
42
+ rows = []
43
+ for ws, need in demand_hours.items():
44
+ avail = available_hours.get(ws, 0.0)
45
+ load = need / avail if avail else float('inf')
46
+ rows.append({'工序': ws, '需求工时': need, '可用工时': avail, '负荷%': round(load * 100, 1),
47
+ '状态': '⚠超载' if load > 1 else ('▲偏紧' if load > 0.85 else '')})
48
+ df = pd.DataFrame(rows).sort_values('负荷%', ascending=False)
49
+ print(df.to_markdown(index=False))
50
+ over = df[df['负荷%'] > 100]
51
+ if len(over):
52
+ print(f" ⚠ 瓶颈:{'、'.join(over['工序'])} —— 三案评估:加班(成本+质量风险)/ 外协(准入+管控)/ 改期(客户沟通+条款核查)")
53
+ return df
54
+
55
+
56
+ if __name__ == '__main__':
57
+ plan = net_requirements(gross={1: 100, 2: 150, 3: 80, 4: 120}, on_hand=120,
58
+ on_order={2: 50}, safety=20, lead_weeks=2, item='成品A')
59
+ assert plan.loc[0, '净需求'] == 0 and plan.loc[1, '净需求'] > 0
60
+ # 可用滚动守恒:期末 = 期初+在途+净需求-毛需求
61
+ r1 = plan.iloc[1]
62
+ assert abs(r1['期末可用'] - (r1['期初可用'] + r1['在途'] + r1['净需求'] - r1['毛需求'])) < 0.01
63
+ assert (plan['下单周'].dropna() < plan.loc[plan['下单周'].notna(), '周']).all() # 回推早于需求周
64
+ kids = explode_bom({2: 130.0, 4: 100.0}, pd.DataFrame({'子件': ['外壳', '螺丝'], '单耗': [1, 8]}))
65
+ assert kids['螺丝'][2] == 1040
66
+ load = capacity_load({'注塑': 500, '装配': 300, '包装': 120},
67
+ {'注塑': 400, '装配': 360, '包装': 200})
68
+ assert load.iloc[0]['工序'] == '注塑' and load.iloc[0]['负荷%'] == 125.0
69
+ assert load.set_index('工序').loc['装配', '状态'] == ''
70
+ print('OK mrp_capacity.py')
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: project-management
3
+ description: 项目管理(WBS 分解、关键路径与排期、风险登记册、项目章程/周报/复盘、资源与变更管理)。当用户说"做项目计划/排期/甘特图/项目风险/项目周报/延期了怎么办"时使用。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 项目管理(计划可算 + 风险有账 + 状态透明)
8
+
9
+ ## 启动:项目章程一页纸
10
+
11
+ 目标(SMART+验收标准)/ 范围(**含"不做什么"**)/ 里程碑 / 干系人矩阵(权力×利益四象限,
12
+ 高权高利者的诉求逐个写)/ 关键假设与约束(预算/人力/截止硬约束标注)——没有章程的项目,
13
+ 后期每次争论都要重新对齐一遍。
14
+
15
+ ## 计划:WBS → 排期(`read_skill_file` 读 `scripts/cpm.py`)
16
+
17
+ - **WBS 分解**:交付物导向(名词,不是动作清单),100% 规则(子项之和=父项全部),
18
+ 末级工作包 8–80 小时粒度,每包唯一负责人;
19
+ - **关键路径**:`critical_path(tasks)` —— 输入任务(工期+依赖),输出 ES/EF/LS/LF/总浮动、
20
+ **关键路径链**与项目总工期,甘特数据(起止偏移)可直接出图(data-analysis);
21
+ - 排期纪律:估时用三点法((乐观+4×最可能+悲观)/6);**缓冲显式化**(项目级缓冲,而不是每人
22
+ 偷偷加 20%);里程碑倒排检查(关键路径工期 > 可用工期 → 当场谈判范围/资源,不做"纸面可行"计划);
23
+ - 资源平衡:同一人并行任务叠加图,超载即调序(浮动时间大的让路)。
24
+
25
+ ## 执行:状态透明三件套
26
+
27
+ - **项目周报**:红黄绿状态(**变黄变红必须写触发原因与恢复计划**,不许悄悄变红)/
28
+ 里程碑燃尽 / 本周完成 vs 计划 / 下周关键 / 需决策事项(给选项);
29
+ - **风险登记册**(活文档,周会必过):风险描述("如果 X 则 Y 影响 Z"格式)/概率×影响打分/
30
+ 应对策略(规避/转移/减轻/接受,写到动作与负责人)/触发信号/状态——**发生了的风险转问题清单**;
31
+ - **变更管理**:变更单(内容/原因/对工期成本范围的量化影响/审批人)——口头变更=范围蔓延之源,
32
+ 一律书面。
33
+
34
+ ## 延期应对(被问"来不及了怎么办"的标准解法)
35
+
36
+ 先算再谈:关键路径上的活动才影响工期 → 压缩三选(赶工=加资源算成本增量/快速跟进=并行算风险/
37
+ 减范围=砍非关键需求)→ 给决策表(三案的工期-成本-风险对比),不空谈"加班解决"。
38
+
39
+ ## 收尾:复盘
40
+
41
+ 计划 vs 实际(工期/成本/范围偏差与根因)/ 估时准确度分析(哪类任务总被低估,校准系数入库)/
42
+ 风险登记册回看(预测命中率)/ 可复用资产归档(模板/清单/教训——写进团队 SOP,knowledge-sop 承接)。
43
+
44
+ ## 验收自查
45
+
46
+ - [ ] WBS 满足 100% 规则,工作包有唯一负责人
47
+ - [ ] 关键路径算过,缓冲显式,倒排冲突已处理
48
+ - [ ] 周报红黄绿如实,风险册每条有应对与触发信号
49
+ - [ ] 延期给的是三案决策表而非口号
50
+
51
+ ## 附件
52
+
53
+ - `scripts/cpm.py` — 关键路径法(ES/EF/LS/LF/浮动/关键链)+ 甘特数据 + 三点估时;可直接执行自测
@@ -0,0 +1,84 @@
1
+ # 关键路径法 CPM(经 run_python 执行):前向/后向遍历求 ES/EF/LS/LF/总浮动,输出关键路径与甘特数据。
2
+ # 任务格式:{'id':'A','name':'需求','dur':5,'deps':['X','Y']}。直接执行本文件 = 自测(经典网络断言)。
3
+ import pandas as pd
4
+
5
+
6
+ def three_point(optimistic, likely, pessimistic):
7
+ """三点估时(PERT):(乐观+4×最可能+悲观)/6,返回 (期望, 标准差)。"""
8
+ e = (optimistic + 4 * likely + pessimistic) / 6
9
+ sd = (pessimistic - optimistic) / 6
10
+ print(f'[三点] O={optimistic} M={likely} P={pessimistic} → 期望 {e:.1f},σ={sd:.1f}')
11
+ return round(e, 1), round(sd, 1)
12
+
13
+
14
+ def critical_path(tasks):
15
+ """返回 (明细表 DataFrame, 关键路径 id 列表, 总工期)。依赖成环/缺失会报错。"""
16
+ t = {x['id']: dict(x) for x in tasks}
17
+ for x in t.values():
18
+ for d in x.get('deps', []):
19
+ if d not in t:
20
+ raise ValueError(f"任务 {x['id']} 依赖了不存在的 {d}")
21
+ # 拓扑排序(Kahn)
22
+ indeg = {k: len(v.get('deps', [])) for k, v in t.items()}
23
+ order, queue = [], [k for k, v in indeg.items() if v == 0]
24
+ succ = {k: [] for k in t}
25
+ for k, v in t.items():
26
+ for d in v.get('deps', []):
27
+ succ[d].append(k)
28
+ while queue:
29
+ n = queue.pop(0)
30
+ order.append(n)
31
+ for s in succ[n]:
32
+ indeg[s] -= 1
33
+ if indeg[s] == 0:
34
+ queue.append(s)
35
+ if len(order) != len(t):
36
+ raise ValueError('依赖成环:' + ','.join(set(t) - set(order)))
37
+ # 前向:ES/EF
38
+ for k in order:
39
+ x = t[k]
40
+ x['ES'] = max((t[d]['EF'] for d in x.get('deps', [])), default=0)
41
+ x['EF'] = x['ES'] + x['dur']
42
+ total = max(x['EF'] for x in t.values())
43
+ # 后向:LS/LF
44
+ for k in reversed(order):
45
+ x = t[k]
46
+ x['LF'] = min((t[s]['LS'] for s in succ[k]), default=total)
47
+ x['LS'] = x['LF'] - x['dur']
48
+ x['float'] = x['LS'] - x['ES']
49
+ crit = [k for k in order if t[k]['float'] == 0]
50
+ df = pd.DataFrame([{**{'id': k}, **{c: t[k][c] for c in ('name', 'dur', 'ES', 'EF', 'LS', 'LF', 'float')},
51
+ '关键': '★' if t[k]['float'] == 0 else ''} for k in order])
52
+ print(f'[CPM] 总工期 {total} · 关键路径:{" → ".join(crit)}')
53
+ print(df.to_markdown(index=False))
54
+ return df, crit, total
55
+
56
+
57
+ def gantt_data(df):
58
+ """甘特数据源:id/name/start(=ES)/dur —— data-analysis 的 barh 出图即可。"""
59
+ return df[['id', 'name', 'ES', 'dur']].rename(columns={'ES': 'start'})
60
+
61
+
62
+ if __name__ == '__main__':
63
+ e, sd = three_point(3, 5, 13)
64
+ assert e == 6.0 and abs(sd - 1.7) < 0.1
65
+ tasks = [
66
+ {'id': 'A', 'name': '需求', 'dur': 3, 'deps': []},
67
+ {'id': 'B', 'name': '设计', 'dur': 4, 'deps': ['A']},
68
+ {'id': 'C', 'name': '文案', 'dur': 2, 'deps': ['A']},
69
+ {'id': 'D', 'name': '开发', 'dur': 6, 'deps': ['B']},
70
+ {'id': 'E', 'name': '素材', 'dur': 3, 'deps': ['C']},
71
+ {'id': 'F', 'name': '联调上线', 'dur': 2, 'deps': ['D', 'E']},
72
+ ]
73
+ df, crit, total = critical_path(tasks)
74
+ assert total == 15 and crit == ['A', 'B', 'D', 'F']
75
+ assert int(df.loc[df['id'] == 'C', 'float'].iloc[0]) == 5 # 非关键链浮动
76
+ g = gantt_data(df)
77
+ assert list(g.columns) == ['id', 'name', 'start', 'dur']
78
+ try:
79
+ critical_path([{'id': 'X', 'name': 'x', 'dur': 1, 'deps': ['Y']},
80
+ {'id': 'Y', 'name': 'y', 'dur': 1, 'deps': ['X']}])
81
+ raise AssertionError('成环应报错')
82
+ except ValueError as err:
83
+ assert '成环' in str(err)
84
+ print('OK cpm.py')
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: project-proposal
3
+ description: 项目申报与可研(政府专项/科研课题/高新认定类申报书、可行性研究报告、预算编制、评审自查)。当用户说"项目申报/申报书/可研报告/课题申请/预算编制"时使用。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 项目申报(对指南写作 + 预算勾稽 + 评审人视角自查)
8
+
9
+ ## 第一步永远是「解构申报指南」
10
+
11
+ 拿到指南先产出**对标表**(这一步跳过=盲写):
12
+ | 指南要求 | 原文摘录 | 我方现状 | 差距与补救 | 材料清单 |
13
+ 支持方向/申报条件(硬门槛逐条判定:注册年限/资质/知识产权数/研发费占比)/
14
+ 考核指标(写进任务书就是军令状,虚高会死在验收)/ 预算科目与开支范围 / 截止时间倒排。
15
+ 硬门槛不满足→如实告知别硬报;可补救的给时间表。
16
+
17
+ ## 申报书写作(评审人视角)
18
+
19
+ 评审人平均一份看 15–20 分钟,写作三原则:
20
+ 1. **对着评分细则写**:有评分表就按分值分配篇幅,每个得分点有明确承接段落;
21
+ 2. **必要性=痛点+数据+政策呼应**:引用指南原文的关键词(原词,别同义替换);
22
+ 3. **创新点可证伪**:「首次/领先」必须给对比对象与证据(查新/专利/检测报告),给不出就降格为"特色"。
23
+
24
+ 章节骨架(通用,具体以指南模板为准):立项依据(背景/必要性/国内外现状——现状综述走
25
+ tech-research 的矩阵法)→ 目标与考核指标(定量,与预算联动)→ 研究/建设内容(与目标一一映射,
26
+ 用 WBS 分解)→ 技术路线(图+文字,关键节点里程碑)→ 现有基础(团队/平台/前期成果)→
27
+ 预算 → 风险与保障 → 进度安排(甘特文字版)。
28
+
29
+ ## 预算编制(`read_skill_file` 读 `scripts/budget_sheet.py`)
30
+
31
+ - `budget_workbook()` 生成三级科目预算簿(xlsx 带公式):设备/材料/测试化验加工/燃料动力/
32
+ 差旅/会议/国际合作/劳务费/专家咨询/间接费用——**总表由明细表公式汇总**,改明细自动更新;
33
+ - 内置勾稽校验:明细加总=总表、分年度加总=总额、自筹+申请=总投资、劳务费/间接费比例上限提示
34
+ (比例限额各类指南不同,以指南为准并在表头注明取值);
35
+ - 每笔支出给测算依据(单价×数量×次数),"打包估"过不了财务评审。
36
+
37
+ ## 可研报告(投资类)
38
+
39
+ 十章骨架:总论/需求分析与建设规模/技术方案/建设条件与选址/节能环保/组织与人力/
40
+ 实施进度/投资估算与资金筹措/财务与社会效益评价(财务测算走 finance-analysis 口径:
41
+ NPV/IRR/回收期给假设表)/风险分析。数字全书一致(总投资在每处出现都相同——成稿后专项核对)。
42
+
43
+ ## 评审自查清单(提交前过一遍)
44
+
45
+ - [ ] 硬门槛逐条满足且有证明材料对应
46
+ - [ ] 考核指标可考核(第三方可验证)且与内容/预算三方一致
47
+ - [ ] 预算勾稽全过,每笔有测算依据
48
+ - [ ] 指南关键词在正文有原词呼应
49
+ - [ ] 附件清单齐(营业执照/审计报告/知识产权/推荐信…按指南列)
50
+ - [ ] 全书数字一致性核对完成(总投资/人数/指标值)
51
+
52
+ ## 附件
53
+
54
+ - `scripts/budget_sheet.py` — 三级科目预算簿生成(带公式与勾稽校验);可直接执行自测
@@ -0,0 +1,90 @@
1
+ # 预算编制簿(经 run_python 执行):生成 总表+分年度+明细 三层 xlsx(总表用公式引用明细,改明细自动更新),
2
+ # 并做勾稽校验(明细=总表、分年=总额、申请+自筹=总投资)。直接执行本文件 = 自测(生成并重读校验)。
3
+ import openpyxl
4
+ from openpyxl.styles import Font, PatternFill
5
+ from openpyxl.utils import get_column_letter
6
+
7
+ CATEGORIES = ['设备费', '材料费', '测试化验加工费', '燃料动力费', '差旅费', '会议费',
8
+ '国际合作与交流费', '劳务费', '专家咨询费', '间接费用']
9
+ HEAD_FILL = PatternFill('solid', fgColor='1F4E79')
10
+
11
+
12
+ def _head(ws, row, cols):
13
+ for j, t in enumerate(cols, 1):
14
+ c = ws.cell(row=row, column=j, value=t)
15
+ c.font = Font(bold=True, color='FFFFFF')
16
+ c.fill = HEAD_FILL
17
+
18
+
19
+ def budget_workbook(path, years=(2026, 2027, 2028), items_per_cat=3, apply_ratio=0.7):
20
+ """生成预算簿:明细 Sheet(科目×条目×年度)→ 总表/分年度全部公式引用。
21
+ apply_ratio=申请财政资金占比(其余自筹),示例值,按指南调整。"""
22
+ wb = openpyxl.Workbook()
23
+ det = wb.active
24
+ det.title = '明细'
25
+ cols = ['科目', '支出内容', '测算依据(单价×数量×次数)'] + [f'{y}年' for y in years] + ['小计']
26
+ _head(det, 1, cols)
27
+ r = 2
28
+ for cat in CATEGORIES:
29
+ for i in range(1, items_per_cat + 1):
30
+ det.cell(row=r, column=1, value=cat)
31
+ det.cell(row=r, column=2, value=f'{cat}-条目{i}(替换为实际内容)')
32
+ det.cell(row=r, column=3, value='【单价】×【数量】×【次数】')
33
+ for k in range(len(years)):
34
+ det.cell(row=r, column=4 + k, value=0)
35
+ first = get_column_letter(4)
36
+ last = get_column_letter(3 + len(years))
37
+ det.cell(row=r, column=4 + len(years), value=f'=SUM({first}{r}:{last}{r})')
38
+ r += 1
39
+ last_det = r - 1
40
+
41
+ tot = wb.create_sheet('总表')
42
+ _head(tot, 1, ['科目'] + [f'{y}年' for y in years] + ['合计', '占比%'])
43
+ for i, cat in enumerate(CATEGORIES, start=2):
44
+ tot.cell(row=i, column=1, value=cat)
45
+ for k in range(len(years)):
46
+ col = get_column_letter(4 + k)
47
+ tot.cell(row=i, column=2 + k,
48
+ value=f'=SUMIF(明细!A2:A{last_det},A{i},明细!{col}2:{col}{last_det})')
49
+ f, l = get_column_letter(2), get_column_letter(1 + len(years))
50
+ tot.cell(row=i, column=2 + len(years), value=f'=SUM({f}{i}:{l}{i})')
51
+ total_row = len(CATEGORIES) + 2
52
+ tot.cell(row=total_row, column=1, value='合计').font = Font(bold=True)
53
+ for k in range(len(years) + 1):
54
+ col = get_column_letter(2 + k)
55
+ tot.cell(row=total_row, column=2 + k, value=f'=SUM({col}2:{col}{total_row - 1})')
56
+ sumc = get_column_letter(2 + len(years))
57
+ for i in range(2, total_row):
58
+ tot.cell(row=i, column=3 + len(years), value=f'=IF({sumc}{total_row}=0,0,{sumc}{i}/{sumc}{total_row}*100)')
59
+
60
+ src = wb.create_sheet('资金来源')
61
+ _head(src, 1, ['来源', '金额', '说明'])
62
+ src['A2'] = '申请财政资金'
63
+ src['B2'] = f'=总表!{sumc}{total_row}*{apply_ratio}'
64
+ src['C2'] = f'占总投资 {apply_ratio:.0%}(示例比例,按指南调整)'
65
+ src['A3'] = '单位自筹'
66
+ src['B3'] = f'=总表!{sumc}{total_row}*{1 - apply_ratio}'
67
+ src['A4'] = '总投资'
68
+ src['B4'] = '=B2+B3'
69
+ wb.save(path)
70
+ print(f'[预算簿] 已生成 {path}:明细 {last_det - 1} 行 × {len(years)} 年,总表/来源全公式联动')
71
+ return path
72
+
73
+
74
+ def verify(path, years_n=3):
75
+ """重读勾稽(用值重算公式逻辑):明细小计=横向和;总表=SUMIF 语义(按科目聚合)。"""
76
+ wb = openpyxl.load_workbook(path) # 公式态:校验公式存在性与结构
77
+ det, tot = wb['明细'], wb['总表']
78
+ assert det.max_row > len(CATEGORIES), '明细行数异常'
79
+ assert str(tot.cell(row=2, column=2).value).startswith('=SUMIF'), '总表应公式引用明细'
80
+ assert str(det.cell(row=2, column=4 + years_n).value).startswith('=SUM'), '明细小计应为公式'
81
+ src = wb['资金来源']
82
+ assert str(src['B4'].value) == '=B2+B3', '总投资应=申请+自筹'
83
+ print('[预算簿] 勾稽结构校验通过(公式联动齐备)')
84
+ return True
85
+
86
+
87
+ if __name__ == '__main__':
88
+ p = budget_workbook('预算簿_check.xlsx')
89
+ verify(p)
90
+ print('OK budget_sheet.py')