@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,106 @@
1
+ # 物业投资与租赁计算件(经 run_python 执行):IRR(牛顿法+二分兜底)/ 资本化率 / 有效租金 / 租约到期瀑布。
2
+ # 直接执行本文件 = 自测。
3
+ import numpy as np
4
+ import pandas as pd
5
+
6
+
7
+ def npv(rate, cashflows):
8
+ """cashflows[0]=期初(通常为负)。"""
9
+ return float(sum(cf / (1 + rate) ** i for i, cf in enumerate(cashflows)))
10
+
11
+
12
+ def irr(cashflows, guess=0.1):
13
+ """内部收益率:牛顿法,失败回退二分(要求现金流有正有负)。"""
14
+ cf = list(map(float, cashflows))
15
+ if not (min(cf) < 0 < max(cf)):
16
+ raise ValueError('现金流须有正有负才存在 IRR')
17
+ r = guess
18
+ for _ in range(80): # 牛顿法
19
+ f = npv(r, cf)
20
+ d = sum(-i * c / (1 + r) ** (i + 1) for i, c in enumerate(cf))
21
+ if abs(d) < 1e-12:
22
+ break
23
+ r2 = r - f / d
24
+ if abs(r2 - r) < 1e-9 and r2 > -0.999:
25
+ print(f'[IRR] {r2:.2%}(牛顿法收敛)')
26
+ return r2 # 不取整:保留全精度供 NPV 复核(展示时再格式化)
27
+ r = r2 if r2 > -0.999 else (r - 0.999) / 2
28
+ lo, hi = -0.99, 10.0 # 二分兜底
29
+ flo = npv(lo, cf)
30
+ for _ in range(200):
31
+ mid = (lo + hi) / 2
32
+ fm = npv(mid, cf)
33
+ if abs(fm) < 1e-9:
34
+ break
35
+ if (flo < 0) == (fm < 0):
36
+ lo, flo = mid, fm
37
+ else:
38
+ hi = mid
39
+ print(f'[IRR] {mid:.2%}(二分兜底)')
40
+ return mid
41
+
42
+
43
+ def payback_years(cashflows):
44
+ """静态回收期(线性插值到小数年);收不回返回 None。"""
45
+ cum = 0.0
46
+ for i, cf in enumerate(cashflows):
47
+ prev = cum
48
+ cum += cf
49
+ if i > 0 and prev < 0 <= cum:
50
+ yrs = i - 1 + (-prev) / cf
51
+ print(f'[回收期] {yrs:.1f} 年')
52
+ return round(yrs, 1)
53
+ print('[回收期] 期内未收回')
54
+ return None
55
+
56
+
57
+ def cap_rate(noi, value):
58
+ """资本化率 = NOI / 资产价值(NOI 不含折旧与财务费用)。"""
59
+ v = noi / value
60
+ print(f'[CapRate] {noi:,.0f}/{value:,.0f} = {v:.2%}')
61
+ return round(v, 4)
62
+
63
+
64
+ def effective_rent(face_rent_monthly, term_months, rent_free_months=0, agency_fee=0.0):
65
+ """有效租金(月):((面租金×(租期−免租)) − 中介费) / 租期——免租与中介摊销后才可比。"""
66
+ er = (face_rent_monthly * (term_months - rent_free_months) - agency_fee) / term_months
67
+ print(f'[有效租金] 面租 {face_rent_monthly}×({term_months}-{rent_free_months})−中介 {agency_fee} '
68
+ f'→ {er:,.2f}/月(折扣 {(1 - er / face_rent_monthly) * 100:.1f}%)')
69
+ return round(er, 2)
70
+
71
+
72
+ def lease_expiry_waterfall(leases, area_col='面积', rent_col='月租金', end_col='到期日', warn=0.30):
73
+ """租约到期瀑布:按年汇总到期面积/租金及占比;单年占比>warn 预警。"""
74
+ df = leases.copy()
75
+ df['到期年'] = pd.to_datetime(df[end_col]).dt.year
76
+ g = df.groupby('到期年').agg(到期面积=(area_col, 'sum'), 到期月租金=(rent_col, 'sum'),
77
+ 租约数=(end_col, 'size')).reset_index()
78
+ g['面积占比'] = (g['到期面积'] / df[area_col].sum()).round(4)
79
+ g['租金占比'] = (g['到期月租金'] / df[rent_col].sum()).round(4)
80
+ print('[到期瀑布]\n' + g.to_markdown(index=False))
81
+ for _, r in g.iterrows():
82
+ if r['面积占比'] > warn:
83
+ print(f" ⚠ {int(r['到期年'])} 年到期面积占比 {r['面积占比']:.0%} > {warn:.0%}:提前 6–12 个月启动续谈")
84
+ return g
85
+
86
+
87
+ if __name__ == '__main__':
88
+ # 投入 1000,5 年 NOI 60/63/66/69/72,第 5 年退出 72/5.5% 减成本 40
89
+ cf = [-1000, 60, 63, 66, 69, 72 + 72 / 0.055 - 40]
90
+ r = irr(cf)
91
+ assert 0.09 < r < 0.13, r
92
+ assert abs(npv(r, cf)) < 1e-3
93
+ assert payback_years([-100, 30, 40, 50]) == 2.6 # -100→-70→-30→+20,第 3 年内 30/50 处回正
94
+ assert cap_rate(66, 1200) == round(66 / 1200, 4)
95
+ er = effective_rent(100, 36, rent_free_months=3, agency_fee=100)
96
+ assert abs(er - (100 * 33 - 100) / 36) < 0.01
97
+ leases = pd.DataFrame({'面积': [1000, 800, 1200, 500], '月租金': [80, 70, 96, 45],
98
+ '到期日': ['2026-06-30', '2026-11-30', '2027-05-31', '2028-03-31']})
99
+ g = lease_expiry_waterfall(leases)
100
+ assert g.loc[g['到期年'] == 2026, '面积占比'].iloc[0] > 0.30 # 应触发预警
101
+ try:
102
+ irr([-100, -50])
103
+ raise AssertionError('全负现金流应报错')
104
+ except ValueError:
105
+ pass
106
+ print('OK property_calc.py')
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: regression-forecast
3
+ description: 回归预测与关系建模(多元线性回归、相关vs因果、时间序列预测、预测区间与驱动因子)。当用户说"预测/预估/影响因素/回归/建个模型看什么影响它/未来几个月"时使用。Excel 分析链之预测环。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 回归预测与关系建模(Excel 分析链 · 预测环;全景见 excel-analysis-chain)
8
+
9
+ 回归的两个用途别混:**解释**(哪些因素影响 Y、影响多大)与**预测**(Y 未来是多少)——
10
+ 前者重系数与显著性,后者重预测精度与区间。
11
+
12
+ ## 多元回归(`read_skill_file` 读 `scripts/regress.py`,解释用途)
13
+
14
+ - `ols()`:普通最小二乘——系数/标准误/t/p/R²/调整 R² + **标准化系数**(比较不同量纲变量的
15
+ 影响力);
16
+ - **诊断三查**(不查诊断的回归是耍流氓):多重共线性(VIF>10 的变量系数不可信,提示剔除)/
17
+ 残差(是否随机,有模式=模型设定错)/ 异常点(高杠杆点影响);
18
+ - 解读纪律:系数是"**其他变量不变时**"的边际影响;**回归不证明因果**(遗漏变量/反向因果/
19
+ 选择偏差——观察数据的回归系数一律附此警告);R² 高 ≠ 预测准(可能过拟合)。
20
+
21
+ ## 时间序列预测(预测用途)
22
+
23
+ - 分解先行:趋势/季节/残差目视(用 pivot-crosstab 的 trend 看形态);
24
+ - 方法阶梯(**先简单后复杂**,别一上来上神经网络):移动平均/指数平滑(有趋势用 Holt、
25
+ 有季节用 Holt-Winters)/ 简单线性趋势外推——`forecast_ts()` 给点预测 + **预测区间**
26
+ (只给点值的预测是误导,区间才诚实);
27
+ - **回测验证**:留出最后 N 期做样本外验证(MAPE/RMSE),不验证的预测不可信
28
+ (同 quant-analysis 样本外纪律);
29
+ - 局限声明:外推假设"历史模式延续",结构突变(政策/疫情/大促)会失效——
30
+ **预测区间外的大事件要人工干预**。
31
+
32
+ ## 分类预测(是/否类)
33
+
34
+ 逻辑回归概念(转化/流失/违约预测)——系数的 odds ratio 解读;
35
+ **类别不平衡**提示(1% 正样本时准确率 99% 毫无意义,看召回/精确/AUC);
36
+ 需要机器学习时(随机森林/GBDT)转 data-science-toolkit 或 packages 装 sklearn。
37
+
38
+ ## 产出
39
+
40
+ 解释类:系数表(含标准化系数与显著性)+ 诊断结论 + 驱动因子排序 + 因果局限声明;
41
+ 预测类:预测曲线+区间图(data-analysis)+ 回测精度 + 假设与失效条件。
42
+
43
+ ## 验收自查
44
+
45
+ - [ ] 解释/预测用途分清
46
+ - [ ] 回归做了共线性/残差诊断;系数附因果局限
47
+ - [ ] 预测给了区间与样本外回测精度
48
+ - [ ] 时序先分解先简单方法;失效条件已列
49
+
50
+ ## 附件
51
+
52
+ - `scripts/regress.py` — ols(系数+标准化+VIF+R²)/forecast_ts(趋势季节+预测区间+MAPE 回测);可直接执行自测
@@ -0,0 +1,106 @@
1
+ # 回归预测件(经 run_python 执行):多元 OLS(系数/标准化/VIF/R²)+ 时间序列趋势季节预测(含区间+MAPE 回测)。
2
+ # 纯 numpy 实现(正规方程),不依赖 statsmodels/sklearn。直接执行本文件 = 自测。
3
+ import math
4
+ import numpy as np
5
+ import pandas as pd
6
+
7
+
8
+ def ols(X, y, feature_names=None):
9
+ """多元最小二乘。X: (n,k) 数组/DataFrame;返回系数表(含标准误/t/标准化系数)、R²、VIF。"""
10
+ if isinstance(X, pd.DataFrame):
11
+ feature_names = feature_names or list(X.columns)
12
+ X = X.values.astype(float)
13
+ X = np.asarray(X, float)
14
+ y = np.asarray(y, float)
15
+ n, k = X.shape
16
+ feature_names = feature_names or [f'x{i+1}' for i in range(k)]
17
+ Xd = np.column_stack([np.ones(n), X]) # 加截距
18
+ beta, *_ = np.linalg.lstsq(Xd, y, rcond=None)
19
+ resid = y - Xd @ beta
20
+ rss = (resid ** 2).sum()
21
+ tss = ((y - y.mean()) ** 2).sum()
22
+ r2 = 1 - rss / tss
23
+ adj_r2 = 1 - (1 - r2) * (n - 1) / (n - k - 1)
24
+ sigma2 = rss / (n - k - 1)
25
+ cov = sigma2 * np.linalg.pinv(Xd.T @ Xd) # pinv 而非 inv:共线/秩亏设计矩阵不崩(标准误退化为大值,符合预期)
26
+ se = np.sqrt(np.diag(cov))
27
+ tvals = beta / se
28
+ sx, sy = X.std(0, ddof=1), y.std(ddof=1)
29
+ std_beta = [np.nan] + [beta[i + 1] * sx[i] / sy for i in range(k)] # 标准化系数
30
+ # VIF:各自变量对其余的 R²
31
+ vif = [np.nan]
32
+ for i in range(k):
33
+ others = np.delete(X, i, axis=1)
34
+ if others.shape[1] == 0:
35
+ vif.append(1.0)
36
+ continue
37
+ Xo = np.column_stack([np.ones(n), others])
38
+ bi, *_ = np.linalg.lstsq(Xo, X[:, i], rcond=None)
39
+ ri2 = 1 - ((X[:, i] - Xo @ bi) ** 2).sum() / ((X[:, i] - X[:, i].mean()) ** 2).sum()
40
+ vif.append(1 / (1 - ri2) if ri2 < 1 else float('inf'))
41
+ tab = pd.DataFrame({'变量': ['截距'] + feature_names, '系数': beta.round(4),
42
+ '标准误': se.round(4), 't值': tvals.round(3),
43
+ '标准化系数': np.round(std_beta, 4), 'VIF': np.round(vif, 2)})
44
+ print(f'[OLS] n={n} k={k} · R²={r2:.4f} 调整R²={adj_r2:.4f}')
45
+ print(tab.to_markdown(index=False))
46
+ hi_vif = [feature_names[i] for i in range(k) if vif[i + 1] > 10]
47
+ if hi_vif:
48
+ print(f' ⚠ 多重共线性(VIF>10):{hi_vif} 系数不可单独解读')
49
+ print(' ⚠ 观察数据回归≠因果:遗漏变量/反向因果/选择偏差仍可能存在')
50
+ return {'coef': beta, 'r2': round(r2, 4), 'adj_r2': round(adj_r2, 4), 'table': tab}
51
+
52
+
53
+ def forecast_ts(series, periods=3, season=None, holdout=3):
54
+ """时间序列预测:线性趋势(+可选季节因子) + 预测区间 + 样本外 MAPE 回测。
55
+ series: pd.Series(按时间排序);season: 季节周期(如 12),None 则纯趋势。"""
56
+ s = pd.Series(series).astype(float).reset_index(drop=True)
57
+ n = len(s)
58
+ t = np.arange(n)
59
+
60
+ def fit_predict(train, h):
61
+ tt = np.arange(len(train))
62
+ b1, b0 = np.polyfit(tt, train.values, 1)
63
+ base = b0 + b1 * np.arange(len(train), len(train) + h)
64
+ if season and len(train) >= 2 * season:
65
+ detr = train.values - (b0 + b1 * tt)
66
+ sidx = [np.mean([detr[i] for i in range(len(train)) if i % season == (len(train) + j) % season])
67
+ for j in range(h)]
68
+ base = base + np.array(sidx)
69
+ return base
70
+
71
+ # 样本外回测
72
+ train = s.iloc[:-holdout]
73
+ pred_oos = fit_predict(train, holdout)
74
+ actual = s.iloc[-holdout:].values
75
+ mape = float(np.mean(np.abs((actual - pred_oos) / actual)) * 100)
76
+ # 全样本拟合残差 → 预测区间
77
+ b1, b0 = np.polyfit(t, s.values, 1)
78
+ resid = s.values - (b0 + b1 * t)
79
+ sd = resid.std(ddof=1)
80
+ fc = fit_predict(s, periods)
81
+ lo, hi = fc - 1.96 * sd, fc + 1.96 * sd
82
+ out = pd.DataFrame({'期': range(n + 1, n + periods + 1), '预测': np.round(fc, 2),
83
+ '下限95%': np.round(lo, 2), '上限95%': np.round(hi, 2)})
84
+ print(f'[时序] 趋势斜率 {b1:.3f}/期 · 样本外 MAPE {mape:.1f}%(holdout={holdout})'
85
+ + (f' · 季节周期 {season}' if season else ''))
86
+ print(out.to_markdown(index=False))
87
+ print(' ⚠ 假设历史模式延续;结构突变(政策/大促)需人工干预')
88
+ return {'forecast': out, 'mape': round(mape, 2), 'slope': round(b1, 4)}
89
+
90
+
91
+ if __name__ == '__main__':
92
+ rng = np.random.default_rng(6)
93
+ n = 120
94
+ x1 = rng.normal(50, 10, n)
95
+ x2 = rng.normal(20, 5, n)
96
+ y = 3 + 1.5 * x1 - 0.8 * x2 + rng.normal(0, 5, n)
97
+ r = ols(pd.DataFrame({'广告': x1, '价格': x2}), y)
98
+ assert r['r2'] > 0.8
99
+ assert abs(r['table'].set_index('变量').loc['广告', '系数'] - 1.5) < 0.3 # 系数还原
100
+ # 带趋势+季节的序列
101
+ base = 100 + np.arange(48) * 2 + 15 * np.sin(np.arange(48) * 2 * np.pi / 12) + rng.normal(0, 3, 48)
102
+ f = forecast_ts(pd.Series(base), periods=6, season=12, holdout=6)
103
+ assert f['slope'] > 0 and f['mape'] < 30 and len(f['forecast']) == 6
104
+ assert (f['forecast']['上限95%'] > f['forecast']['预测']).all()
105
+ assert ols(np.array([[1.0], [1.0], [1.0]]), np.array([1.0, 2.0, 3.0]))['r2'] is not None # 共线/秩亏不崩(pinv)
106
+ print('OK regress.py')
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: retail-store-ops
3
+ description: 门店与连锁经营(门店 P&L、坪效人效、菜单工程、损耗盘点、选址评分、店长日报周会)。当用户说"门店分析/坪效/翻台率/菜单优化/损耗/选址/单店模型"时使用。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 门店经营(单店模型看透,连锁靠可复制)
8
+
9
+ ## 门店 P&L 与核心比率(`read_skill_file` 读 `scripts/store_ops.py`)
10
+
11
+ - 单店损益结构:营收(堂食/外卖/零售分渠道)→ 毛利 → 四大刚性费用
12
+ **房租/人力/能耗/损耗**(占营收比是生死线:餐饮房租参考 ≤15%、人力 ≤22%,业态不同要校准,
13
+ 作为参数别当真理)→ 门店贡献利润(**不摊总部费用**的口径,考核店长用这层);
14
+ - `floor_efficiency()`:坪效(营收/营业面积,分楼层/时段)与人效(营收/总工时,
15
+ **用工时不用人头**——兼职占比高时人头口径失真);
16
+ - 盈亏平衡:保本营收 = 固定费用/毛利率,给"日均需 X 单/桌"的直觉化换算。
17
+
18
+ ## 菜单工程(餐饮/SKU 结构优化)
19
+
20
+ `menu_quadrant()`:毛利额 × 销量双中位数分四象限——
21
+ **明星**(双高:保护,菜单黄金位)/ **耕牛**(高销低毛利:提价测试或降本,别轻易下)/
22
+ **谜题**(高毛利低销量:改名/推荐位/套餐带动)/ **瘦狗**(双低:下架候选,先查是否引流品);
23
+ 配套动作表(每 SKU 一行:象限/动作/负责人/复测日期)——菜单调整是实验,**改完必须复测**。
24
+
25
+ ## 损耗与盘点
26
+
27
+ 损耗率口径(损耗额/营收 或 /进货额,写死一个);原因分类(过期报废/操作损耗/盘差——
28
+ **盘差单列**,持续盘差=流程或诚信问题,处理路径不同);
29
+ 高损耗品 TOP 表 + 措施(订货模型调整/效期管理/加工标准化);盘点纪律(循环盘点表+复盘双人制)。
30
+
31
+ ## 时段与翻台(餐饮)
32
+
33
+ 时段营收热力(日×小时)→ 闲时策略(下午茶/团购券定向);翻台率=接待桌次/桌数
34
+ (口径:营业时段内),与**桌均时长、等位流失**一起看——翻台低先分清是没人还是坐太久。
35
+
36
+ ## 选址评分卡
37
+
38
+ 维度权重(人流量与质量 30/客群匹配 25/竞争密度 15/租金压力测试 15/可视性可达性 10/物业条件 5),
39
+ 每维打分要**实地数据**(分时段人流实数、竞店试吃小票、租金对标),
40
+ 输出:评分 + 保本测算(该址租金下需日均营收 X,达成概率判断)——**评分高但保本线离谱的照样否**。
41
+
42
+ ## 连锁复制
43
+
44
+ 单店模型标准化(面积/人员/设备/菜单的标准配置表)→ 新店爬坡曲线(开业 1/2/3 月达成基准店 %)→
45
+ 督导检查表(QSC:品质/服务/清洁,可量化项);店长日报(营收/客流/客单/异常一屏)与
46
+ 周会议程模板(对着数据讲,office-automation 可做自动汇总例程)。
47
+
48
+ ## 验收自查
49
+
50
+ - [ ] P&L 分层口径明确(贡献利润不摊总部)
51
+ - [ ] 人效用工时口径;保本给了直觉化换算
52
+ - [ ] 菜单四象限每 SKU 有动作与复测日期
53
+ - [ ] 选址评分配了保本压力测试
54
+
55
+ ## 附件
56
+
57
+ - `scripts/store_ops.py` — floor_efficiency(坪效人效/保本) + menu_quadrant(菜单工程四象限+动作建议);可直接执行自测
@@ -0,0 +1,57 @@
1
+ # 门店经营计算件(经 run_python 执行):坪效/人效/保本点 + 菜单工程四象限。
2
+ # 直接执行本文件 = 自测。
3
+ import pandas as pd
4
+
5
+
6
+ def floor_efficiency(revenue, area_sqm, labor_hours, fixed_cost=None, gross_margin=None):
7
+ """坪效(元/㎡)与人效(元/工时);给固定费用与毛利率则算保本营收。"""
8
+ fe = revenue / area_sqm
9
+ le = revenue / labor_hours
10
+ print(f'[效率] 坪效 {fe:,.0f} 元/㎡ · 人效 {le:,.0f} 元/工时')
11
+ out = {'floor_eff': round(fe, 1), 'labor_eff': round(le, 1)}
12
+ if fixed_cost and gross_margin:
13
+ be = fixed_cost / gross_margin
14
+ out['breakeven_revenue'] = round(be, 0)
15
+ print(f'[保本] 固定费用 {fixed_cost:,.0f} ÷ 毛利率 {gross_margin:.0%} = 保本营收 {be:,.0f}'
16
+ f'(当前达成 {revenue / be:.0%})')
17
+ return out
18
+
19
+
20
+ def menu_quadrant(df, item_col='品名', qty_col='销量', profit_col='单份毛利'):
21
+ """菜单工程:毛利额×销量 双中位数分象限(明星/耕牛/谜题/瘦狗)+ 动作建议。"""
22
+ d = df.copy()
23
+ d['毛利额'] = d[qty_col] * d[profit_col]
24
+ q_med, p_med = d[qty_col].median(), d[profit_col].median()
25
+
26
+ def quad(r):
27
+ hi_q, hi_p = r[qty_col] >= q_med, r[profit_col] >= p_med
28
+ if hi_q and hi_p:
29
+ return '明星', '保护:菜单黄金位,保供稳质'
30
+ if hi_q:
31
+ return '耕牛', '提价测试或降本;谨慎下架(可能是引流品)'
32
+ if hi_p:
33
+ return '谜题', '推广:改名/推荐位/套餐带动,复测销量'
34
+ return '瘦狗', '下架候选:先确认非引流/结构性菜品'
35
+ d[['象限', '动作建议']] = d.apply(lambda r: pd.Series(quad(r)), axis=1)
36
+ d = d.sort_values('毛利额', ascending=False)
37
+ stat = d.groupby('象限', observed=True).agg(SKU数=(item_col, 'size'), 毛利额=('毛利额', 'sum'))
38
+ print(f'[菜单工程] 销量中位 {q_med:.0f} · 单份毛利中位 {p_med:.1f}')
39
+ print(stat.to_markdown())
40
+ print(d[[item_col, qty_col, profit_col, '毛利额', '象限']].to_markdown(index=False))
41
+ return d
42
+
43
+
44
+ if __name__ == '__main__':
45
+ r = floor_efficiency(revenue=600_000, area_sqm=200, labor_hours=2600,
46
+ fixed_cost=180_000, gross_margin=0.6)
47
+ assert r['floor_eff'] == 3000.0 and r['breakeven_revenue'] == 300_000
48
+ menu = pd.DataFrame({
49
+ '品名': ['招牌牛肉面', '酸辣粉', '黑松露拌面', '素凉菜'],
50
+ '销量': [3000, 2800, 400, 300],
51
+ '单份毛利': [12.0, 5.0, 22.0, 4.0],
52
+ })
53
+ q = menu_quadrant(menu)
54
+ get = lambda n: q.loc[q['品名'] == n, '象限'].iloc[0]
55
+ assert get('招牌牛肉面') == '明星' and get('酸辣粉') == '耕牛'
56
+ assert get('黑松露拌面') == '谜题' and get('素凉菜') == '瘦狗'
57
+ print('OK store_ops.py')
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: risk-compliance
3
+ description: 企业风控与合规(风险登记册、内控流程矩阵、合规体系文件、应急预案、反舞弊/数据合规要点)。当用户说"风险评估/内控/合规检查/应急预案/廉洁/数据合规"时使用。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 企业风控合规(风险有账、控制有点、预案能演)
8
+
9
+ ## 风险登记册(企业级,与 project-management 的项目级同构不同层)
10
+
11
+ - 风险识别按域扫:战略/市场/财务(汇率利率信用流动性)/运营(供应链单点/关键人依赖/IT)/
12
+ 合规法律/声誉——每域用"如果 X 则 Y 影响 Z"句式,拒绝"市场风险"这种词条式登记;
13
+ - 评估:概率×影响五级矩阵(影响锚定到金额/停摆时长/监管后果的具体标尺,先定标尺再打分);
14
+ - 应对四策(规避/转移/减轻/接受)落到**动作+负责人+完成期限+剩余风险**;
15
+ - 治理节奏:季度刷新,新增/升级/关闭有记录;TOP 风险进管理层议程。
16
+
17
+ ## 内控矩阵(流程视角)
18
+
19
+ 按流程建:流程步骤 → 风险点 → 控制活动(**预防型/发现型**标注)→ 控制属性
20
+ (人工/自动、频率)→ 证据留痕 → 测试方法;
21
+ 关键流程优先:采购到付款 P2P(供应商准入/比价/三单匹配/付款审批)、订单到收款 O2C
22
+ (信用额度/发货审批/对账)、费用报销(预算/标准/审批链/发票查验)、资金(**不相容职务分离**:
23
+ 出纳不碰账、审批不经办、印章分管——这条是内控的地基);
24
+ 缺陷分级(一般/重要/重大)+ 整改闭环表。
25
+
26
+ ## 合规体系文件(三层)
27
+
28
+ 制度层(合规管理办法:组织/职责/举报与调查程序)→ 专项层(按风险敞口选:反商业贿赂
29
+ (礼品招待标准/第三方尽调/经销商协议条款)、数据合规(个人信息处理清单/最小必要/委托处理协议/
30
+ 出境评估提示——**具体法规适用建议咨询专业律师**)、贸易合规(受制裁方筛查提示,转 foreign-trade))
31
+ → 执行层(培训签收/年度合规承诺/检查计划)。
32
+
33
+ ## 应急预案(能演练的才是预案)
34
+
35
+ 场景化编写(数据泄露/生产事故/舆情危机/资金异常/关键系统宕机),每案五要素:
36
+ 触发条件(可判定)/ 响应组织(指挥+成员+7×24 联系表)/ 处置步骤(前 1 小时逐分钟,后续按阶段)/
37
+ 对外口径(衔接 pr-comms 危机分级)/ 恢复与复盘;
38
+ **桌面演练脚本**随预案交付(注入情景→各角色动作→计时→复盘差距),没演练过的预案按未验收对待。
39
+
40
+ ## 反舞弊要点
41
+
42
+ 高风险场景清单(采购回扣/销售飞单/报销造假/库存监守)+ 数据筛查线索
43
+ (供应商与员工信息重合/整数金额高频/拆分审批/休假零天员工——data-report-pro 跑筛查);
44
+ 调查程序合规红线(证据保全/访谈两人在场/推定无罪措辞)。
45
+
46
+ ## 验收自查
47
+
48
+ - [ ] 风险条目"如果-则-影响"格式,打分有标尺
49
+ - [ ] 内控矩阵覆盖关键流程,职务分离检查过
50
+ - [ ] 预案有可判定触发条件与演练脚本
51
+ - [ ] 涉法条目标注咨询专业意见
@@ -0,0 +1,89 @@
1
+ ---
2
+ name: sec-auth
3
+ description: 认证授权链(认证/授权/审计三分→协议判据表(OIDC/SAML/授权码+PKCE/client_credentials)→OAuth2 落地要点(state/nonce/redirect_uri 白名单)→JWT 陷阱清单与吊销策略→会话 vs token 判据→权限模型 RBAC/ABAC/ReBAC 与数据范围权限→多租户身份贯穿→MFA 与扫码登录安全→服务间认证 mTLS→token 泄漏应急)。eng-security 的认证授权孙链:接 SSO、设计权限模型、JWT 方案评审、越权与登录安全整改时载入。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 认证授权链
8
+
9
+ eng-security 的认证授权孙链。概念三分先钉死:**认证**(你是谁)/**授权**(你能干嘛)/**审计**(你干了啥)——
10
+ 三者混谈的设计必乱(用"登录了"当"有权限"=越权温床)。
11
+
12
+ ## 协议判据表(别自研,选对再落地)
13
+
14
+ | 场景 | 方案 | 要点 |
15
+ |---|---|---|
16
+ | 企业内 SSO | **OIDC 默认**(OAuth2+身份层) | 新系统一律 OIDC;拿到的是身份(id_token),不只是授权 |
17
+ | 遗留/外企对接 | SAML | 老 IdP 生态;XML 签名验证库要新(历史漏洞多) |
18
+ | 第三方应用授权 | OAuth2 授权码+**PKCE** | 隐式流已弃用;PKCE 移动端与 SPA 必配 |
19
+ | 机器对机器 | client_credentials | 服务账号+最小 scope;凭证进密钥服务(eng-infra) |
20
+ | 智能终端/CLI | 设备码流 | 平台 CLI 登录的正路 |
21
+ | 企业微信/钉钉码登 | 各家 OAuth 变体 | 回调域白名单+state 照配(国内 IdP 不豁免基本功) |
22
+
23
+ **自研认证协议=红线**(eng-security);自建账号体系也用标准协议件(IdP 开源件/云服务)承载。
24
+
25
+ ## OAuth2/OIDC 落地要点(漏一个=一类攻击)
26
+
27
+ state 参数必配且校验(防 CSRF 绑定攻击);nonce 防 id_token 重放;
28
+ **redirect_uri 精确匹配白名单**(通配/前缀匹配=授权码劫持面,子域也不放宽);
29
+ 授权码一次性+短时效(标准件默认,自组装时别丢);
30
+ token 传输只走 TLS+Authorization 头(URL 带 token=日志与 Referer 泄漏);
31
+ 前端存储判据:access token 内存持有,refresh token httpOnly cookie(+SameSite/CSRF 防护)——**localStorage 存长期凭证=XSS 即失守**(风险要书面认账才许用);
32
+ 登出三层:前端清态+服务端吊销+IdP 单点登出(只做第一层=假登出)。
33
+
34
+ ## JWT 陷阱清单(用 JWT 前逐条过)
35
+
36
+ - 算法混淆:服务端**固定验签算法白名单**(拒收 alg:none;RS256 公钥被当 HS256 密钥的经典攻击=库配置错);
37
+ - **吊销难题正面答**:JWT 无状态=天然难吊销——标准解:短时效 access(5–15min)+可吊销 refresh(服务端存态);高敏场景加黑名单(jti 进缓存,db-redis)或干脆用有状态会话;**"JWT 无法登出"不是特性是设计债**;
38
+ - payload 只签名不加密:敏感信息(手机号/权限细节)不进 payload(base64 谁都能读);
39
+ - 时钟偏移:验 exp/nbf 留 30–60s 容忍(arch-distributed 时钟不可信);
40
+ - 密钥轮换:kid 头+JWKS 端点(轮换不断服),**验签密钥硬编码=轮换即事故**;
41
+ - 会话 vs JWT 判据:单体/低复杂度=服务端会话(简单可吊销,别赶时髦);多服务/多端=短 JWT+网关统一验;混合形态(网关验外部 token 换发内部身份头)是大型系统常态。
42
+
43
+ ## 权限模型判据
44
+
45
+ | 模型 | 适用 | 要点 |
46
+ |---|---|---|
47
+ | RBAC(默认) | 岗位驱动的企业系统 | 角色爆炸治理:角色继承+按职能不按人建角色("张三专用角色"=失控信号) |
48
+ | ABAC | 动态条件(时间/部门/密级) | 策略引擎复杂度先认;审计"为什么他能看"变难 |
49
+ | ReBAC | 资源关系型(文档协作/网盘分享) | "所有者/协作者/链接可见"关系图;实现走成熟件思路 |
50
+
51
+ **数据范围权限单列设计**(国内企业刚需):功能权限(能不能进这页)与数据权限(能看谁的数据:本人/本部门/全公司)分离建模——
52
+ 数据范围落到查询层强制注入过滤条件(与 arch-multitenant 租户过滤同机制),**靠前端传范围参数=裸奔**;
53
+ 权限判定收口:统一鉴权切面/中间件,散落在业务 if 里=必漏(eng-security 越权双查的工程化)。
54
+
55
+ ## 多租户身份贯穿
56
+
57
+ 租户 ID 进 token 声明→上下文贯穿→数据层强制过滤(arch-multitenant 详述);
58
+ **跨租户=P0 红线**:测试用例必含跨租户访问(qa-api-automation 越权用例);
59
+ 租户管理员与平台管理员权限边界画清(平台运营误入客户数据=合规事故,审计全留痕)。
60
+
61
+ ## 登录安全专项
62
+
63
+ 密码基线承 eng-security(bcrypt/argon2+限速+撞库监测);
64
+ **MFA 判据**:管理后台与高危操作必上(TOTP 默认;短信验证码认清 SIM 劫持风险,作为便利因子不作唯一强因子);
65
+ 验证码防刷:图形/行为验证+频控(短信轰炸=资损+骚扰投诉);
66
+ 扫码登录安全:二维码一次性+短时效+**确认页显示登录环境**(防"截图钓鱼让人扫");轮询接口防劫持(凭证绑定发起会话);
67
+ 异地/异常登录:风控信号(新设备/新地)→二次验证+通知用户;
68
+ 账号生命周期:离职/转岗当日回收(eng-security 季度复核的实时面),服务账号定期轮换与盘点。
69
+
70
+ ## 服务间认证
71
+
72
+ 内部服务默认不裸奔(eng-infra 内网不出公网≠内网免认证):mTLS(服务网格承载)或内部 token(短时效服务身份);
73
+ 最小权限 scope(A 服务只能调它需要的接口);
74
+ **降权凭证纪律**:代理用户操作的服务(含 AI Agent,ai-agent 呼应)用受限凭证,不透传用户全权;
75
+ 凭证下发走密钥服务,禁配置文件明文(eng-infra 四不)。
76
+
77
+ ## token 泄漏应急(预案先写好)
78
+
79
+ 判定泄漏(日志/异常使用告警)→**吊销半径执行**(该用户全端登出/该客户端全量 refresh 吊销/涉签名密钥则轮换密钥+全量失效,代价大小预案里排好)→
80
+ 溯源(泄漏路径:日志?前端存储?中间人?)→修复路径→通知义务评估(合规,legal-chain);
81
+ 演练判据:密钥轮换与全量登出要演练过(eng-reliability 预案纪律)——**没演练过的"大不了全登出"会在深夜变成六小时事故**。
82
+
83
+ **作业包**:`references/auth-review-checklist.md`(协议流程/JWT 陷阱逐条/授权模型与数据范围分离/登录安全/泄漏预案)。
84
+
85
+ ## 使用纪律
86
+
87
+ 认证一律标准协议+成熟件;鉴权判定统一收口;权限变更留审计;
88
+ 新接口评审三问:谁能调(认证)/凭什么(授权)/查得到吗(审计);
89
+ 每次越权/泄漏事故回写陷阱清单(与 eng-security 红线联动)。
@@ -0,0 +1,38 @@
1
+ # 认证授权评审单(sec-auth 落笔件:接 SSO/发 token/设计权限必过)
2
+
3
+ ## 1. 协议与流程
4
+
5
+ - [ ] 标准协议承载(OIDC 默认/SAML 遗留/授权码+PKCE/client_credentials/设备码),**无自研协议**
6
+ - [ ] state 防 CSRF+校验;nonce 防重放;授权码一次性短时效
7
+ - [ ] **redirect_uri 精确白名单**(无通配/前缀放宽);回调域清单:__
8
+ - [ ] token 只走 TLS+Authorization 头(不进 URL/日志)
9
+
10
+ ## 2. JWT 陷阱逐条过(用 JWT 才填)
11
+
12
+ - [ ] 验签算法白名单固定(拒 alg:none;RS/HS 混淆已防——库配置确认:__)
13
+ - [ ] 时效:access __ 分钟(短)+refresh __ 可吊销;**吊销方案**:□短时效自然过期 □jti 黑名单 □会话版本号(“JWT 无法登出”不是特性是债)
14
+ - [ ] payload 无敏感信息(base64 谁都能读);时钟偏移容忍 __s
15
+ - [ ] 密钥轮换:kid+JWKS(不断服);验签密钥非硬编码
16
+ - [ ] 或者:低复杂度场景已考虑服务端会话(简单可吊销,别赶时髦)
17
+
18
+ ## 3. 授权模型
19
+
20
+ - 模型:□RBAC(角色清单 __;无"张三专用角色") □ABAC(策略:__) □ReBAC(关系:__)
21
+ - [ ] **功能权限与数据范围权限分离**:数据范围(本人/本部门/全公司)在查询层强制注入(机制:__;禁前端传范围参数)
22
+ - [ ] 鉴权判定统一收口(切面/中间件:__;无散落业务 if)
23
+ - [ ] 越权用例进回归:水平(他人资源)+垂直(低角色高接口)+批量逐条+跨租户(qa-api-automation)
24
+
25
+ ## 4. 登录安全
26
+
27
+ - [ ] 密码 bcrypt/argon2;登录限速+撞库监测;MFA(管理后台/高危操作):__
28
+ - [ ] 验证码防刷(短信轰炸=资损);扫码登录:码一次性+确认页显示登录环境
29
+ - [ ] 会话:登录后换会话 ID;登出三层(前端清态+服务端吊销+IdP 单点登出)
30
+ - [ ] 异地/新设备风控信号→二次验证+通知:__
31
+
32
+ ## 5. 服务间与应急
33
+
34
+ - [ ] 内部服务间认证(mTLS/服务 token,最小 scope);Agent/代办类用降权凭证
35
+ - [ ] **token 泄漏预案**:吊销半径清单(用户级/客户端级/密钥级各多大代价)__;全量登出演练日期 __
36
+ - [ ] 审计:登录/授权变更/敏感操作留痕可查
37
+
38
+ > 结论: □通过 □带条件 □打回。新接口三问:谁能调/凭什么/查得到吗。
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: sec-compliance
3
+ description: 等保与合规工程链(合规全景与定级判据(二级 vs 三级成本量级)→等保三级高频技术要求工程清单(双因素/审计留存/最小权限/备份加密)→测评配合与证据工程→密评国密改造落点→开源 License 合规治理→软著材料配合→合规进日常门禁)。eng-security 的合规工程孙链:等保测评临近、密评改造、开源合规整改、客户问"你们过等保没"时载入。法规与标准以当日文本为准,本链管工程落点。
4
+ version: 1.0.0
5
+ ---
6
+
7
+ # 等保与合规工程链
8
+
9
+ eng-security 的合规工程孙链。分工一句话:**eng-security 管"真安全",本链管"证明安全且合规"**——
10
+ 两者重叠七成但不相同,都要做;合规是下限不是天花板,过了测评不等于安全。
11
+
12
+ ## 合规全景(工程视角的地图)
13
+
14
+ 等保 2.0(定级→备案→建设整改→测评→监督检查,三级每年测评)/密评(商用密码应用安全性评估,关基与重要系统)/
15
+ 三法落点(网络安全法:日志留存≥6 个月;数据安全法:分类分级;个保法:个人信息处理——eng-security 数据分级承接)/
16
+ 行业叠加(金融证券医疗另有行业规范,按客户所属行业查);
17
+ **私有化交付场景"过等保没"是客户必问**(env-private-deploy 档案里记客户的等保等级与到期日)。
18
+
19
+ ## 定级判据(别自愿拔高)
20
+
21
+ 二级(一般系统,自主定级备案,测评非强制年检)vs 三级(重要系统,**每年测评**+技术要求陡增)——
22
+ 定级决定长期成本量级;定级依据是业务影响(受侵害客体与程度)不是"显得重视";
23
+ 新系统立项时就问定级预期(合规要求进需求验收,eng-requirements),上线前抱佛脚=整改地狱。
24
+
25
+ ## 三级高频技术要求工程清单(测评被扣分的常客,逐项落)
26
+
27
+ | 要求 | 工程落点 | 常见失分 |
28
+ |---|---|---|
29
+ | 身份鉴别:双因素 | 管理后台/运维入口 MFA(sec-auth) | 只有密码;堡垒机没开双因素 |
30
+ | 审计:日志留存 ≥6 个月且防篡改 | 集中日志+保留策略(eng-observability 分层存储)+完整性保护 | 本机日志滚动 7 天就没了 |
31
+ | 密码策略 | 复杂度+定期更换+失败锁定(sec-auth 登录安全) | 测试账号弱口令;默认口令未改 |
32
+ | 访问控制:最小权限 | 账号季度清理/权限矩阵/离职即禁(eng-security) | 共享账号;万能 root 满天飞 |
33
+ | 剩余信息保护 | 退租/删除的存储清除(arch-multitenant 删除证明同拍) | 说不清删没删干净 |
34
+ | 入侵防范与恶意代码 | 边界防护(infra-gateway WAF)/主机防护/漏洞修复 SLA 记录 | 高危漏洞超期未修且无记录 |
35
+ | 通信与存储加密 | TLS 全站+敏感字段加密(密评场景国密,见下) | 内网明文传输"因为是内网" |
36
+ | 数据备份 | 异地备份+恢复演练记录(eng-ops 3-2-1) | 有备份无演练记录 |
37
+ | 安全区域边界 | 网络分区/访问控制策略表(eng-infra NetworkPolicy 落点) | 平面网络一马平川 |
38
+
39
+ **证据先行心智**:测评看的是证据(配置截图/策略导出/制度文档/演练记录)——平时不留痕,测评两周全员补作业。
40
+
41
+ ## 测评配合工程
42
+
43
+ 测评前自查(对照本清单+上次整改项复核)→ 差距整改分级(高风险项阻塞/中低风险带整改计划)→
44
+ 证据包准备(按测评项组织:拓扑图/配置导出/日志样例/制度文件/演练与培训记录,**目录化管理别临时翻**)→
45
+ 测评中配合(工程接口人+环境访问审批走 eng-ops 变更)→ 整改闭环(报告风险项→工单→复测证据);
46
+ 整改项进安全例外台账(有期限有接受人,eng-security)——**测评报告的"部分符合"堆积=下次测评的雷**。
47
+
48
+ ## 密评与国密改造落点
49
+
50
+ 触发判据:关基/重要信息系统(客户合同或行业要求)——先问真触发没,国密改造是大工程;
51
+ 改造落点:传输(TLS 国密套件/网关卸载判据 infra-gateway)/存储(敏感字段 SM4)/签名认证(SM2/SM3:登录、重要操作、时间戳)/
52
+ 密钥管理(密码机/密码服务平台对接,eng-infra 密钥服务的国密版);
53
+ **兼容双轨**:国密与国际算法并存期的协商与降级策略(老客户端不支持国密套件);
54
+ 密码应用方案先行评审(建设前评估,别建完再改)。
55
+
56
+ ## 开源合规治理(License 的合规面,eng-security SCA 的姊妹篇)
57
+
58
+ License 扫描进 CI(SCA 工具的 license 面,cicd-pipeline);
59
+ 传染性处置表:GPL 系进产品分发场景的隔离策略(动态链接/服务化隔离/替换)——**私有化交付=分发**,SaaS 不分发的豁免逻辑要分清;
60
+ 义务履行:声明文件(NOTICE/第三方清单随发行包)/源码提供义务评估;
61
+ 商用限制条款排查(近年多个开源项目改协议,eng-research 许可证关的持续面:**升级依赖时 license 变更也要看**,dependency-upgrade)。
62
+
63
+ ## 软著与材料配合
64
+
65
+ 工程侧配合项:源码材料(前后各 30 页惯例,含版本信息)/操作手册(eng-docs 用户文档复用)/
66
+ 版本与著作权人信息一致性——材料从仓库脚本化导出(eng-automation),别每次手工攒。
67
+
68
+ ## 使用纪律
69
+
70
+ 合规要求进需求与门禁(日志留存/双因素/密码策略是配置基线,production-readiness 联动),不做测评前突击;
71
+ 证据留痕日常化(演练/培训/清理各有记录);合规台账(等级/测评到期日/整改项/例外)有 Owner;
72
+ **法规与标准以当日文本和测评机构口径为准**——本链管"工程怎么落",不替代合规顾问(risk-compliance/legal-chain 衔接)。
73
+
74
+ **作业包**:`references/dengbao-checklist.md`(三级高频技术核查表(要求→落点→证据)/测评准备与证据包目录/整改分级登记)。