@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.
- package/README.md +2 -1
- package/bin/huicai.js +83 -0
- package/package.json +2 -2
- package/skills/ab-testing/SKILL.md +58 -0
- package/skills/ab-testing/scripts/__pycache__/ab_test.cpython-312.pyc +0 -0
- package/skills/ab-testing/scripts/ab_test.py +71 -0
- package/skills/academic-writing/SKILL.md +54 -0
- package/skills/accounting-ops/SKILL.md +68 -0
- package/skills/accounting-ops/scripts/__pycache__/acct_tools.cpython-312.pyc +0 -0
- package/skills/accounting-ops/scripts/acct_tools.py +89 -0
- package/skills/ai-agent/SKILL.md +85 -0
- package/skills/ai-agent/references/tool-design-checklist.md +51 -0
- package/skills/ai-aiops/SKILL.md +73 -0
- package/skills/ai-aiops/references/aiops-rollout-checklist.md +36 -0
- package/skills/ai-coding/SKILL.md +89 -0
- package/skills/ai-coding/references/task-brief-template.md +48 -0
- package/skills/ai-compliance/SKILL.md +74 -0
- package/skills/ai-compliance/references/genai-compliance-checklist.md +40 -0
- package/skills/ai-eval/SKILL.md +80 -0
- package/skills/ai-eval/scripts/eval-runner.py +150 -0
- package/skills/ai-llm-app/SKILL.md +90 -0
- package/skills/ai-llm-app/references/llm-integration-checklist.md +39 -0
- package/skills/ai-mlops/SKILL.md +72 -0
- package/skills/ai-mlops/scripts/token-cost-calc.py +108 -0
- package/skills/ai-multimodal/SKILL.md +86 -0
- package/skills/ai-multimodal/scripts/field-validate.py +182 -0
- package/skills/ai-prompt/SKILL.md +75 -0
- package/skills/ai-prompt/references/prompt-template.md +46 -0
- package/skills/ai-rag/SKILL.md +76 -0
- package/skills/ai-rag/scripts/chunk-inspect.py +129 -0
- package/skills/anomaly-detection/SKILL.md +54 -0
- package/skills/anomaly-detection/scripts/__pycache__/anomaly.cpython-312.pyc +0 -0
- package/skills/anomaly-detection/scripts/anomaly.py +99 -0
- package/skills/api-integration/SKILL.md +74 -0
- package/skills/api-integration/references/signing-recipes.md +141 -0
- package/skills/arch-design/SKILL.md +57 -0
- package/skills/arch-distributed/SKILL.md +81 -0
- package/skills/arch-distributed/references/idempotency-review.md +43 -0
- package/skills/arch-multitenant/SKILL.md +73 -0
- package/skills/arch-multitenant/references/tenant-isolation-checklist.md +34 -0
- package/skills/audit-assist/SKILL.md +63 -0
- package/skills/audit-assist/scripts/__pycache__/audit_sampling.cpython-312.pyc +0 -0
- package/skills/audit-assist/scripts/audit_sampling.py +93 -0
- package/skills/audit-chain/SKILL.md +60 -0
- package/skills/banking-credit/SKILL.md +59 -0
- package/skills/banking-credit/scripts/__pycache__/credit_metrics.cpython-312.pyc +0 -0
- package/skills/banking-credit/scripts/credit_metrics.py +53 -0
- package/skills/brand-design/SKILL.md +56 -0
- package/skills/business-plan/SKILL.md +56 -0
- package/skills/capital-ops/SKILL.md +52 -0
- package/skills/cicd-pipeline/SKILL.md +85 -0
- package/skills/cicd-pipeline/references/pipeline-review-checklist.md +39 -0
- package/skills/content-creation/SKILL.md +56 -0
- package/skills/corporate-governance/SKILL.md +56 -0
- package/skills/crawl-chain/SKILL.md +61 -0
- package/skills/customer-service/SKILL.md +51 -0
- package/skills/data-analysis/SKILL.md +46 -0
- package/skills/data-analysis/scripts/cjk_font.py +56 -0
- package/skills/data-chain/SKILL.md +54 -0
- package/skills/data-governance/SKILL.md +54 -0
- package/skills/data-report-pro/SKILL.md +65 -0
- package/skills/data-report-pro/scripts/__pycache__/bigdata.cpython-312.pyc +0 -0
- package/skills/data-report-pro/scripts/bigdata.py +79 -0
- package/skills/data-streaming/SKILL.md +87 -0
- package/skills/data-streaming/references/job-checklist.md +36 -0
- package/skills/data-wrangling/SKILL.md +52 -0
- package/skills/data-wrangling/scripts/__pycache__/join_tools.cpython-312.pyc +0 -0
- package/skills/data-wrangling/scripts/join_tools.py +99 -0
- package/skills/db-es/SKILL.md +68 -0
- package/skills/db-es/scripts/es-health.sh +72 -0
- package/skills/db-migration/SKILL.md +72 -0
- package/skills/db-migration/scripts/checksum-mysql.sql +46 -0
- package/skills/db-migration/scripts/checksum-postgres.sql +39 -0
- package/skills/db-migration/scripts/compare-reports.py +98 -0
- package/skills/db-mysql/SKILL.md +78 -0
- package/skills/db-mysql/scripts/mysql-health.sql +80 -0
- package/skills/db-postgres/SKILL.md +86 -0
- package/skills/db-postgres/scripts/pg-health.sql +67 -0
- package/skills/db-redis/SKILL.md +83 -0
- package/skills/db-redis/scripts/redis-health.sh +92 -0
- package/skills/dev-cpp/SKILL.md +94 -0
- package/skills/dev-cpp/references/cmake-sanitizer-snippets.md +56 -0
- package/skills/dev-cross-platform/SKILL.md +73 -0
- package/skills/dev-cross-platform/references/capability-matrix-template.md +39 -0
- package/skills/dev-csharp/SKILL.md +96 -0
- package/skills/dev-csharp/references/review-checklist.md +37 -0
- package/skills/dev-frontend/SKILL.md +91 -0
- package/skills/dev-frontend/scripts/bundle-budget.py +106 -0
- package/skills/dev-go/SKILL.md +88 -0
- package/skills/dev-go/scripts/go-triage.sh +54 -0
- package/skills/dev-harmony/SKILL.md +64 -0
- package/skills/dev-harmony/references/harmony-checklist.md +40 -0
- package/skills/dev-java/SKILL.md +77 -0
- package/skills/dev-java/scripts/jvm-triage.sh +84 -0
- package/skills/dev-mobile/SKILL.md +82 -0
- package/skills/dev-mobile/references/store-compliance-checklist.md +33 -0
- package/skills/dev-node/SKILL.md +82 -0
- package/skills/dev-node/scripts/node-triage.sh +78 -0
- package/skills/dev-php/SKILL.md +86 -0
- package/skills/dev-php/scripts/fpm-calc.py +48 -0
- package/skills/dev-python/SKILL.md +81 -0
- package/skills/dev-python/scripts/venv-doctor.sh +75 -0
- package/skills/dev-rust/SKILL.md +84 -0
- package/skills/dev-rust/references/cargo-ci-snippets.md +50 -0
- package/skills/dev-toolchain/SKILL.md +78 -0
- package/skills/dev-toolchain/scripts/secret-scan.sh +83 -0
- package/skills/doc-chain/SKILL.md +58 -0
- package/skills/doc-compare/SKILL.md +44 -0
- package/skills/doc-compare/scripts/compare.py +93 -0
- package/skills/docx-author/SKILL.md +39 -0
- package/skills/docx-author/scripts/docx_doc.py +161 -0
- package/skills/ecommerce-ops/SKILL.md +54 -0
- package/skills/ecommerce-ops/scripts/__pycache__/gmv_decompose.cpython-312.pyc +0 -0
- package/skills/ecommerce-ops/scripts/gmv_decompose.py +61 -0
- package/skills/education-training/SKILL.md +53 -0
- package/skills/ehs-safety/SKILL.md +63 -0
- package/skills/email-writing/SKILL.md +52 -0
- package/skills/eng-ai/SKILL.md +74 -0
- package/skills/eng-ai/references/ai-feature-checklist.md +36 -0
- package/skills/eng-architecture/SKILL.md +85 -0
- package/skills/eng-architecture/scripts/capacity-calc.py +100 -0
- package/skills/eng-automation/SKILL.md +84 -0
- package/skills/eng-automation/references/automation-inventory.md +38 -0
- package/skills/eng-automation/references/routine-presets.md +73 -0
- package/skills/eng-collaboration/SKILL.md +76 -0
- package/skills/eng-collaboration/references/collab-templates.md +43 -0
- package/skills/eng-complex-env/SKILL.md +84 -0
- package/skills/eng-complex-env/references/env-dossier-template.md +52 -0
- package/skills/eng-complex-env/scripts/env-recon.sh +152 -0
- package/skills/eng-data-platform/SKILL.md +81 -0
- package/skills/eng-data-platform/references/table-spec-template.md +39 -0
- package/skills/eng-database/SKILL.md +79 -0
- package/skills/eng-database/references/schema-review-checklist.md +37 -0
- package/skills/eng-develop/SKILL.md +76 -0
- package/skills/eng-develop/references/dod-checklist.md +43 -0
- package/skills/eng-docs/SKILL.md +71 -0
- package/skills/eng-docs/references/runbook-template.md +57 -0
- package/skills/eng-efficiency/SKILL.md +75 -0
- package/skills/eng-efficiency/scripts/dora-calc.py +104 -0
- package/skills/eng-infra/SKILL.md +81 -0
- package/skills/eng-infra/references/production-readiness.md +46 -0
- package/skills/eng-integration/SKILL.md +82 -0
- package/skills/eng-integration/references/integration-dossier-template.md +38 -0
- package/skills/eng-legacy/SKILL.md +81 -0
- package/skills/eng-legacy/references/modernization-workbook.md +46 -0
- package/skills/eng-observability/SKILL.md +78 -0
- package/skills/eng-observability/scripts/slo-calc.py +82 -0
- package/skills/eng-ops/SKILL.md +74 -0
- package/skills/eng-ops/references/postmortem-template.md +67 -0
- package/skills/eng-performance/SKILL.md +73 -0
- package/skills/eng-performance/scripts/perf-baseline.py +110 -0
- package/skills/eng-planning/SKILL.md +79 -0
- package/skills/eng-planning/scripts/schedule-calc.py +101 -0
- package/skills/eng-quality/SKILL.md +74 -0
- package/skills/eng-quality/references/test-plan-templates.md +46 -0
- package/skills/eng-release/SKILL.md +78 -0
- package/skills/eng-release/references/release-plan-template.md +36 -0
- package/skills/eng-reliability/SKILL.md +72 -0
- package/skills/eng-reliability/references/resilience-review.md +43 -0
- package/skills/eng-requirements/SKILL.md +86 -0
- package/skills/eng-requirements/references/story-templates.md +47 -0
- package/skills/eng-research/SKILL.md +73 -0
- package/skills/eng-research/references/research-templates.md +42 -0
- package/skills/eng-security/SKILL.md +73 -0
- package/skills/eng-security/references/security-review-checklist.md +33 -0
- package/skills/eng-ux/SKILL.md +85 -0
- package/skills/eng-ux/references/ux-review-checklist.md +36 -0
- package/skills/engineering-chain/SKILL.md +101 -0
- package/skills/engineering-chain/references/eng-health-review.md +37 -0
- package/skills/env-offline/SKILL.md +81 -0
- package/skills/env-offline/scripts/bundle-manifest.sh +94 -0
- package/skills/env-private-deploy/SKILL.md +72 -0
- package/skills/env-private-deploy/references/delivery-templates.md +35 -0
- package/skills/env-xinchuang/SKILL.md +73 -0
- package/skills/env-xinchuang/references/adaptation-matrix-template.md +41 -0
- package/skills/equipment-tpm/SKILL.md +56 -0
- package/skills/equipment-tpm/scripts/oee.py +58 -0
- package/skills/esg-report/SKILL.md +58 -0
- package/skills/esg-report/scripts/carbon_calc.py +61 -0
- package/skills/event-management/SKILL.md +51 -0
- package/skills/excel-analysis-chain/SKILL.md +73 -0
- package/skills/file-ingest/SKILL.md +51 -0
- package/skills/file-ingest/scripts/__pycache__/file_toolkit.cpython-312.pyc +0 -0
- package/skills/file-ingest/scripts/file_toolkit.py +404 -0
- package/skills/finance-analysis/SKILL.md +60 -0
- package/skills/finance-analysis/references/ratios.md +54 -0
- package/skills/finance-analysis/scripts/fin_ratios.py +132 -0
- package/skills/finance-chain/SKILL.md +59 -0
- package/skills/financial-modeling/SKILL.md +58 -0
- package/skills/financial-modeling/scripts/fin_model.py +123 -0
- package/skills/foreign-trade/SKILL.md +54 -0
- package/skills/funnel-cohort/SKILL.md +53 -0
- package/skills/funnel-cohort/scripts/__pycache__/funnel.cpython-312.pyc +0 -0
- package/skills/funnel-cohort/scripts/funnel.py +105 -0
- package/skills/gov-document/SKILL.md +57 -0
- package/skills/hr-chain/SKILL.md +51 -0
- package/skills/hr-operations/SKILL.md +53 -0
- package/skills/info-disclosure/SKILL.md +56 -0
- package/skills/infra-gateway/SKILL.md +85 -0
- package/skills/infra-gateway/references/golive-checklist.md +36 -0
- package/skills/infra-k8s/SKILL.md +78 -0
- package/skills/infra-k8s/scripts/k8s-triage.sh +84 -0
- package/skills/infra-mq/SKILL.md +87 -0
- package/skills/infra-mq/references/mq-review-checklist.md +36 -0
- package/skills/insurance-advisory/SKILL.md +57 -0
- package/skills/internal-audit/SKILL.md +66 -0
- package/skills/ip-management/SKILL.md +54 -0
- package/skills/ipo-listing/SKILL.md +60 -0
- package/skills/it-audit/SKILL.md +56 -0
- package/skills/itsm-ops/SKILL.md +55 -0
- package/skills/knowledge-sop/SKILL.md +51 -0
- package/skills/legal-chain/SKILL.md +55 -0
- package/skills/legal-contract/SKILL.md +58 -0
- package/skills/legal-contract/references/contract-checklists.md +59 -0
- package/skills/litigation-support/SKILL.md +53 -0
- package/skills/logistics-warehouse/SKILL.md +53 -0
- package/skills/logistics-warehouse/scripts/freight_check.py +71 -0
- package/skills/long-doc-analysis/SKILL.md +52 -0
- package/skills/management-accounting/SKILL.md +57 -0
- package/skills/management-accounting/scripts/__pycache__/costing.cpython-312.pyc +0 -0
- package/skills/management-accounting/scripts/costing.py +90 -0
- package/skills/manufacturing-chain/SKILL.md +57 -0
- package/skills/manufacturing-quality/SKILL.md +57 -0
- package/skills/manufacturing-quality/scripts/__pycache__/spc.cpython-312.pyc +0 -0
- package/skills/manufacturing-quality/scripts/spc.py +86 -0
- package/skills/marketing-analytics/SKILL.md +59 -0
- package/skills/marketing-analytics/scripts/__pycache__/rfm.cpython-312.pyc +0 -0
- package/skills/marketing-analytics/scripts/rfm.py +60 -0
- package/skills/marketing-chain/SKILL.md +57 -0
- package/skills/meeting-minutes/SKILL.md +55 -0
- package/skills/metrics-system/SKILL.md +55 -0
- package/skills/negotiation-prep/SKILL.md +56 -0
- package/skills/obs-prometheus/SKILL.md +74 -0
- package/skills/obs-prometheus/references/promql-cheatsheet.md +78 -0
- package/skills/office-automation/SKILL.md +54 -0
- package/skills/okr-review/SKILL.md +44 -0
- package/skills/ops-fleet/SKILL.md +69 -0
- package/skills/ops-fleet/scripts/batch-exec-guard.sh +119 -0
- package/skills/ops-linux/SKILL.md +69 -0
- package/skills/ops-linux/scripts/quick-triage.sh +138 -0
- package/skills/optimization-solver/SKILL.md +53 -0
- package/skills/optimization-solver/scripts/__pycache__/solver.cpython-312.pyc +0 -0
- package/skills/optimization-solver/scripts/solver.py +107 -0
- package/skills/pdf-toolkit/SKILL.md +43 -0
- package/skills/pdf-toolkit/scripts/pdf_ops.py +137 -0
- package/skills/pivot-crosstab/SKILL.md +44 -0
- package/skills/pivot-crosstab/scripts/__pycache__/pivot_tools.cpython-312.pyc +0 -0
- package/skills/pivot-crosstab/scripts/pivot_tools.py +90 -0
- package/skills/policy-analysis/SKILL.md +47 -0
- package/skills/portfolio-analysis/SKILL.md +56 -0
- package/skills/portfolio-analysis/scripts/__pycache__/portfolio.cpython-312.pyc +0 -0
- package/skills/portfolio-analysis/scripts/portfolio.py +78 -0
- package/skills/ppt-chain/SKILL.md +61 -0
- package/skills/pptx-author/SKILL.md +48 -0
- package/skills/pptx-author/scripts/pptx_deck.py +193 -0
- package/skills/pr-comms/SKILL.md +58 -0
- package/skills/pr-comms/references/pr-templates.md +54 -0
- package/skills/procurement-supply/SKILL.md +47 -0
- package/skills/procurement-supply/scripts/__pycache__/supply.cpython-312.pyc +0 -0
- package/skills/procurement-supply/scripts/supply.py +71 -0
- package/skills/product-design/SKILL.md +66 -0
- package/skills/product-design/references/prd-framework.md +60 -0
- package/skills/production-planning/SKILL.md +56 -0
- package/skills/production-planning/scripts/__pycache__/mrp_capacity.cpython-312.pyc +0 -0
- package/skills/production-planning/scripts/mrp_capacity.py +70 -0
- package/skills/project-management/SKILL.md +53 -0
- package/skills/project-management/scripts/__pycache__/cpm.cpython-312.pyc +0 -0
- package/skills/project-management/scripts/cpm.py +84 -0
- package/skills/project-proposal/SKILL.md +54 -0
- package/skills/project-proposal/scripts/budget_sheet.py +90 -0
- package/skills/qa-api-automation/SKILL.md +67 -0
- package/skills/qa-api-automation/references/three-layer-skeleton.md +61 -0
- package/skills/qa-mobile-automation/SKILL.md +70 -0
- package/skills/qa-mobile-automation/references/device-matrix-template.md +34 -0
- package/skills/qa-ui-automation/SKILL.md +80 -0
- package/skills/qa-ui-automation/references/stability-conventions.md +41 -0
- package/skills/quant-analysis/SKILL.md +60 -0
- package/skills/quant-analysis/scripts/__pycache__/quant.cpython-312.pyc +0 -0
- package/skills/quant-analysis/scripts/quant.py +102 -0
- package/skills/real-estate-property/SKILL.md +51 -0
- package/skills/real-estate-property/scripts/__pycache__/property_calc.cpython-312.pyc +0 -0
- package/skills/real-estate-property/scripts/property_calc.py +106 -0
- package/skills/regression-forecast/SKILL.md +52 -0
- package/skills/regression-forecast/scripts/__pycache__/regress.cpython-312.pyc +0 -0
- package/skills/regression-forecast/scripts/regress.py +106 -0
- package/skills/retail-store-ops/SKILL.md +57 -0
- package/skills/retail-store-ops/scripts/store_ops.py +57 -0
- package/skills/risk-compliance/SKILL.md +51 -0
- package/skills/sec-auth/SKILL.md +89 -0
- package/skills/sec-auth/references/auth-review-checklist.md +38 -0
- package/skills/sec-compliance/SKILL.md +74 -0
- package/skills/sec-compliance/references/dengbao-checklist.md +43 -0
- package/skills/securities-chain/SKILL.md +69 -0
- package/skills/securities-research/SKILL.md +58 -0
- package/skills/securities-research/scripts/__pycache__/valuation.cpython-312.pyc +0 -0
- package/skills/securities-research/scripts/valuation.py +93 -0
- package/skills/slides-html/SKILL.md +50 -0
- package/skills/slides-html/scripts/template.html +117 -0
- package/skills/statistical-testing/SKILL.md +51 -0
- package/skills/statistical-testing/scripts/__pycache__/stat_tests.cpython-312.pyc +0 -0
- package/skills/statistical-testing/scripts/stat_tests.py +131 -0
- package/skills/strategy-planning/SKILL.md +53 -0
- package/skills/supply-chain/SKILL.md +53 -0
- package/skills/tax-compliance/SKILL.md +57 -0
- package/skills/tax-compliance/scripts/tax_calc.py +90 -0
- package/skills/tech-research/SKILL.md +55 -0
- package/skills/tech-research/references/research-framework.md +50 -0
- package/skills/tender-bidding/SKILL.md +65 -0
- package/skills/tender-bidding/references/bid-checklist.md +44 -0
- package/skills/translation-pro/SKILL.md +44 -0
- package/skills/treasury-mgmt/SKILL.md +56 -0
- package/skills/treasury-mgmt/scripts/__pycache__/cashflow_forecast.cpython-312.pyc +0 -0
- package/skills/treasury-mgmt/scripts/cashflow_forecast.py +51 -0
- package/skills/web-scraping/SKILL.md +81 -0
- package/skills/web-search/SKILL.md +67 -0
- package/skills/xlsx-analysis/SKILL.md +96 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_toolkit.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/xlsx_style.py +71 -0
- package/skills/xlsx-analysis/scripts/xlsx_toolkit.py +335 -0
- package/src/agent.js +1 -1
- package/src/api.js +1 -1
- package/src/codeindex.js +1 -1
- package/src/commands.js +1 -1
- package/src/config.js +1 -1
- package/src/context.js +1 -1
- package/src/doccache.js +1 -0
- package/src/doctor.js +1 -1
- package/src/executors.js +1 -1
- package/src/input.js +1 -1
- package/src/permissions.js +1 -1
- package/src/pyruntime.js +1 -0
- package/src/repl.js +1 -1
- package/src/scan.js +1 -1
- package/src/tools.js +1 -1
- package/src/tui/app.js +1 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: policy-analysis
|
|
3
|
+
description: 政策解读与企业适配(政策文件拆解、适用性判定、企业行动清单、政策对比、申报窗口台账)。当用户给出政府政策/规划/办法/细则说"解读一下/对我们有什么影响/能享受什么"时使用。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 政策解读(从红头文件到企业行动清单)
|
|
8
|
+
|
|
9
|
+
## 解读流程(长文件走 long-doc-analysis 打底)
|
|
10
|
+
|
|
11
|
+
1. **文件定位**:发文机关层级(中央/部委/省/市——决定效力与落地时差)、文件性质
|
|
12
|
+
(法律法规/规章/规范性文件/规划纲要——**规划是方向,细则才有真金白银**)、
|
|
13
|
+
生效与有效期、是否有配套细则("另行制定"=先别急着行动,盯细则);
|
|
14
|
+
2. **五要素拆解表**(逐条过正文):
|
|
15
|
+
支持/限制什么(事项)| 谁适用(条件,逐条可判定化)| 给什么/罚什么(金额/比例/资质/额度)|
|
|
16
|
+
怎么申请/怎么合规(程序/材料/窗口期)| 找谁(主管部门与层级);
|
|
17
|
+
3. **企业适配判定**:适用条件 × 企业现状对照表(满足/不满足/可创造条件满足——第三类给
|
|
18
|
+
达标路径与成本,如"研发费占比差 0.8pct,约需调整 X");
|
|
19
|
+
4. **行动清单**(解读的唯一交付标准):每条=动作+负责人建议+窗口期+所需材料+预期收益/风险,
|
|
20
|
+
按「立即办/规划办/持续跟踪」三档;
|
|
21
|
+
5. **不确定性标注**:条文模糊处如实标注("'原则上'表述存在弹性,建议向 X 部门书面咨询"),
|
|
22
|
+
**不替政府解释政策**——引用原文+我方理解+核实建议三段式。
|
|
23
|
+
|
|
24
|
+
## 政策对比场景
|
|
25
|
+
|
|
26
|
+
- 新旧版本对比(doc-compare 打底):变化点 → 对企业的边际影响(收紧/放宽/新增义务);
|
|
27
|
+
- 多地政策对比(选址/迁移决策):同维度矩阵(税收/补贴/人才/用地/门槛),
|
|
28
|
+
口径统一后再比("最高补贴 500 万"要看兑现条件与分期);
|
|
29
|
+
- 同主题政策族谱:中央 → 省 → 市逐级细化脉络图,找市级执行口径。
|
|
30
|
+
|
|
31
|
+
## 政策红利盘点(年度动作)
|
|
32
|
+
|
|
33
|
+
企业画像(行业/规模/资质/研发/用工/区域)× 政策库扫描 → 可享清单
|
|
34
|
+
(每项:依据文件/条件核对/申报窗口/材料/主管部门)→ 台账化跟踪
|
|
35
|
+
(office-automation 例程:窗口期前 30 天提醒);与 project-proposal 衔接(要申报书的转过去)。
|
|
36
|
+
|
|
37
|
+
## 风险侧解读(合规义务)
|
|
38
|
+
|
|
39
|
+
新政带来的**义务**清单(禁止性/限制性/程序性义务,过渡期截止日)→ 现状差距 →
|
|
40
|
+
整改计划(转 risk-compliance 落内控);处罚条款单独列表(violation→后果,量化的写量化)。
|
|
41
|
+
|
|
42
|
+
## 验收自查
|
|
43
|
+
|
|
44
|
+
- [ ] 五要素表覆盖全部条款;适用条件可判定化
|
|
45
|
+
- [ ] 行动清单三档分类,每条有窗口期与材料
|
|
46
|
+
- [ ] 模糊条文标注核实建议,无越权解释
|
|
47
|
+
- [ ] 义务与红利两侧都盘了
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: portfolio-analysis
|
|
3
|
+
description: 投资组合分析(持仓贡献分解、Brinson 业绩归因、再平衡偏离、集中度与相关性风险)。当用户给出持仓/组合数据说"组合表现怎么样/收益从哪来/该不该再平衡/风险在哪"时使用。研究工具,不构成投资建议。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 投资组合分析(证券技能链 · 组合环;全景见 securities-chain)
|
|
8
|
+
|
|
9
|
+
合规声明同 quant-analysis:研究工具、不构成投资建议、历史不代表未来——每份产出末尾必带。
|
|
10
|
+
|
|
11
|
+
## 1. 贡献分解(`read_skill_file` 读 `scripts/portfolio.py`)
|
|
12
|
+
|
|
13
|
+
`contribution()`:各持仓 贡献 = 权重 × 收益,**加总≡组合收益**(恒等校验内置)——
|
|
14
|
+
"组合涨 3% 谁贡献的"一表看清;正负贡献分列,**头部贡献集中度**
|
|
15
|
+
(前 3 大贡献占比,过高=组合表现系于个别持仓)。
|
|
16
|
+
|
|
17
|
+
## 2. Brinson 业绩归因(对基准的超额从哪来)
|
|
18
|
+
|
|
19
|
+
`brinson()` 两因素+交互(BF 模型):
|
|
20
|
+
- **配置效应** =(w_p−w_b)×(r_b−R_b):超配了跑赢基准的板块吗;
|
|
21
|
+
- **选择效应** = w_b×(r_p−r_b):板块内选的标的比板块基准强吗;
|
|
22
|
+
- 交互效应 =(w_p−w_b)×(r_p−r_b);
|
|
23
|
+
- **恒等校验**:三效应之和 ≡ 组合收益 − 基准收益(脚本内置断言);
|
|
24
|
+
- 解读纪律:单期归因噪声大,**连续多期同向才是能力**(配置一直为正=真会配,
|
|
25
|
+
单月为正=可能是运气);基准选择要匹配(成长组合对沪深300 归因意义有限,注明基准)。
|
|
26
|
+
|
|
27
|
+
## 3. 再平衡与偏离
|
|
28
|
+
|
|
29
|
+
`weights_drift()`:目标权重 vs 当前权重 → 偏离表+触发建议(阈值法:偏离 >±20% 相对
|
|
30
|
+
或 ±5pct 绝对提示再平衡,**阈值参数化**);
|
|
31
|
+
再平衡的权衡如实呈现:纪律性收割波动 vs 交易成本与税费——给"偏离度+成本估算"两个数,
|
|
32
|
+
决策留给用户;定投/现金流再平衡(用新增资金纠偏,免卖出成本)优先提示。
|
|
33
|
+
|
|
34
|
+
## 4. 风险透视
|
|
35
|
+
|
|
36
|
+
集中度:单一持仓/前五占比、行业与风格集中(**分散的是相关性不是数量**——
|
|
37
|
+
10 只高相关≈1 只);相关性矩阵(quant-analysis 承接,危机相关性趋同提示);
|
|
38
|
+
流动性分层(极端情形几天能变现,大额持仓对成交量占比);
|
|
39
|
+
回撤压力:组合历史最大回撤 + 假设情景(重仓板块 -20% 时组合回撤,给算式)。
|
|
40
|
+
|
|
41
|
+
## 5. 定期组合报告模板
|
|
42
|
+
|
|
43
|
+
期间表现(组合 vs 基准,quant perf_stats 四件套)→ 贡献分解 → Brinson 归因
|
|
44
|
+
(多期滚动表)→ 偏离与再平衡建议 → 风险透视 → 附录(数据口径/复权/基准定义/声明)。
|
|
45
|
+
data-analysis 出图(净值对比/贡献瀑布/归因柱状)。
|
|
46
|
+
|
|
47
|
+
## 验收自查
|
|
48
|
+
|
|
49
|
+
- [ ] 贡献加总恒等;归因三效应恒等
|
|
50
|
+
- [ ] 基准匹配性已说明;单期归因未下能力结论
|
|
51
|
+
- [ ] 再平衡给偏离+成本两个数,不替用户拍板
|
|
52
|
+
- [ ] 集中度与相关性并报;末尾声明在
|
|
53
|
+
|
|
54
|
+
## 附件
|
|
55
|
+
|
|
56
|
+
- `scripts/portfolio.py` — contribution(恒等校验)/ brinson(三效应恒等)/ weights_drift(阈值参数化);可直接执行自测
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# 组合分析计算件(经 run_python 执行):贡献分解(恒等)/ Brinson 两因素+交互归因(恒等)/ 再平衡偏离。
|
|
2
|
+
# ⚠ 研究工具,不构成投资建议。直接执行本文件 = 自测。
|
|
3
|
+
import pandas as pd
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def contribution(df, name_col='持仓', w_col='权重', r_col='收益率'):
|
|
7
|
+
"""贡献 = 权重×收益,加总 ≡ 组合收益(权重和须=1)。"""
|
|
8
|
+
d = df.copy()
|
|
9
|
+
wsum = d[w_col].sum()
|
|
10
|
+
if abs(wsum - 1) > 1e-6: # 权重未归一:明确报错(ValueError 而非 assert——-O 下 assert 会被跳过)
|
|
11
|
+
raise ValueError(f'权重和={wsum:.4f}≠1,请先归一化(每项权重/权重合计)再算')
|
|
12
|
+
raw = d[w_col] * d[r_col] # 组合收益用**未取整**求和保精度;四舍五入只用于展示列
|
|
13
|
+
port = float(raw.sum())
|
|
14
|
+
d['贡献'] = raw.round(6)
|
|
15
|
+
d = d.sort_values('贡献', ascending=False)
|
|
16
|
+
top3 = d['贡献'].head(3).sum() / port if port else float('nan')
|
|
17
|
+
print(f'[贡献] 组合收益 {port:+.2%} · 前3大贡献占比 {top3:.0%}' if port else f'[贡献] 组合收益 {port:+.2%}')
|
|
18
|
+
print(d.to_markdown(index=False))
|
|
19
|
+
return d, round(port, 6)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def brinson(df, seg_col='板块', wp='组合权重', rp='组合收益', wb='基准权重', rb='基准收益'):
|
|
23
|
+
"""Brinson-Fachler:配置=(wp-wb)(rb-Rb);选择=wb(rp-rb);交互=(wp-wb)(rp-rb)。
|
|
24
|
+
三效应之和 ≡ 组合收益 − 基准收益(恒等断言)。"""
|
|
25
|
+
d = df.copy()
|
|
26
|
+
for c in (wp, wb):
|
|
27
|
+
assert abs(d[c].sum() - 1) < 1e-6, f'{c} 和须为 1'
|
|
28
|
+
Rb = float((d[wb] * d[rb]).sum())
|
|
29
|
+
Rp = float((d[wp] * d[rp]).sum())
|
|
30
|
+
d['配置效应'] = ((d[wp] - d[wb]) * (d[rb] - Rb)).round(6)
|
|
31
|
+
d['选择效应'] = (d[wb] * (d[rp] - d[rb])).round(6)
|
|
32
|
+
d['交互效应'] = ((d[wp] - d[wb]) * (d[rp] - d[rb])).round(6)
|
|
33
|
+
total = d[['配置效应', '选择效应', '交互效应']].sum().sum()
|
|
34
|
+
excess = Rp - Rb
|
|
35
|
+
assert abs(total - excess) < 1e-9, f'归因恒等校验失败:{total} vs {excess}'
|
|
36
|
+
print(f'[Brinson] 组合 {Rp:+.2%} − 基准 {Rb:+.2%} = 超额 {excess:+.2%} '
|
|
37
|
+
f'(配置 {d["配置效应"].sum():+.2%} + 选择 {d["选择效应"].sum():+.2%} + 交互 {d["交互效应"].sum():+.2%})')
|
|
38
|
+
print(d.to_markdown(index=False))
|
|
39
|
+
return d, {'Rp': Rp, 'Rb': Rb, 'excess': round(excess, 6)}
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def weights_drift(df, name_col='持仓', target_col='目标权重', cur_col='当前权重',
|
|
43
|
+
abs_th=0.05, rel_th=0.20):
|
|
44
|
+
"""再平衡偏离:绝对偏离>abs_th 或相对偏离>rel_th 触发提示(阈值参数化,决策留给用户)。"""
|
|
45
|
+
d = df.copy()
|
|
46
|
+
d['绝对偏离'] = (d[cur_col] - d[target_col]).round(4)
|
|
47
|
+
d['相对偏离'] = ((d[cur_col] / d[target_col] - 1)).round(4)
|
|
48
|
+
d['触发'] = (d['绝对偏离'].abs() > abs_th) | (d['相对偏离'].abs() > rel_th)
|
|
49
|
+
n = int(d['触发'].sum())
|
|
50
|
+
print(f'[偏离] 触发再平衡提示 {n} 项(阈值:绝对 ±{abs_th:.0%} 或相对 ±{rel_th:.0%})')
|
|
51
|
+
print(d.to_markdown(index=False))
|
|
52
|
+
return d
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if __name__ == '__main__':
|
|
56
|
+
hold = pd.DataFrame({'持仓': ['A', 'B', 'C'], '权重': [0.5, 0.3, 0.2],
|
|
57
|
+
'收益率': [0.10, -0.05, 0.02]})
|
|
58
|
+
d, port = contribution(hold)
|
|
59
|
+
assert abs(port - (0.05 - 0.015 + 0.004)) < 1e-9
|
|
60
|
+
br = pd.DataFrame({'板块': ['科技', '消费', '金融'],
|
|
61
|
+
'组合权重': [0.5, 0.3, 0.2], '组合收益': [0.12, 0.02, -0.01],
|
|
62
|
+
'基准权重': [0.4, 0.4, 0.2], '基准收益': [0.10, 0.03, 0.00]})
|
|
63
|
+
bd, meta = brinson(br)
|
|
64
|
+
assert abs((bd['配置效应'] + bd['选择效应'] + bd['交互效应']).sum() - meta['excess']) < 1e-9
|
|
65
|
+
assert meta['excess'] > 0 # 超配跑赢板块+选股占优 → 应为正超额
|
|
66
|
+
wd = weights_drift(pd.DataFrame({'持仓': ['A', 'B'], '目标权重': [0.6, 0.4],
|
|
67
|
+
'当前权重': [0.68, 0.32]}))
|
|
68
|
+
assert bool(wd.loc[0, '触发']) and bool(wd.loc[1, '触发']) # 相对偏离 ±20% 触发
|
|
69
|
+
# 任意精度权重/收益(归一化后含长尾小数)不得崩——曾因"取整和 vs 未取整和"的错误断言在真实浮点上炸
|
|
70
|
+
_raw = [0.37, 0.29, 0.34]; _tot = sum(_raw); _w = [x / _tot for x in _raw]; _r = [0.137, -0.021, 0.0913]
|
|
71
|
+
_df2, _port = contribution(pd.DataFrame({'持仓': list('ABC'), '权重': _w, '收益率': _r}))
|
|
72
|
+
assert abs(_port - sum(wi * ri for wi, ri in zip(_w, _r))) < 1e-9 # 组合收益取未取整和,精确对得上
|
|
73
|
+
try:
|
|
74
|
+
contribution(pd.DataFrame({'持仓': ['X'], '权重': [0.5], '收益率': [0.1]}))
|
|
75
|
+
raise SystemExit('权重未归一应报错')
|
|
76
|
+
except ValueError:
|
|
77
|
+
pass
|
|
78
|
+
print('OK portfolio.py')
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-chain
|
|
3
|
+
description: PPT 制作技能链总控(需求→大纲→素材→引擎选择→生成自检→导出→演讲全链、经营月报/方案书/发布会三条端到端工作流)。当用户要"做个 PPT"而场景/引擎/素材未定,或诉求跨环节("从数据到汇报")时先载入。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PPT 制作技能链总控
|
|
8
|
+
|
|
9
|
+
一份 PPT 的失败极少在排版,几乎都在**前置**:不知道讲给谁、一页塞三个观点、数字来路不明。
|
|
10
|
+
本链把功夫花在生成之前。
|
|
11
|
+
|
|
12
|
+
## 需求四问(任何 PPT 开工前)
|
|
13
|
+
|
|
14
|
+
听众是谁(决策者要结论/专家要论证/大众要故事)→ 场合与时长(8 分钟路演 ≤12 页;
|
|
15
|
+
被打断式汇报每页要能独立成立)→ 目的一句话(听完希望对方做什么)→
|
|
16
|
+
**交付形态**(现场讲/发出去自读——自读版信息要自足,现场版要留白给讲)。
|
|
17
|
+
|
|
18
|
+
## 引擎决策表(双引擎,按需选)
|
|
19
|
+
|
|
20
|
+
| 维度 | pptx-author(python-pptx) | slides-html(渲染管线,桌面端) |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| 可编辑性 | ✅ 原生可改 | ❌ 贴图(如实告知) |
|
|
23
|
+
| 设计表现力 | 常规版式 | ✅ 渐变/精细排版/发布会级 |
|
|
24
|
+
| 适用 | 日常汇报/需二次编辑/模板合规 | 对外发布/路演/交付 PDF |
|
|
25
|
+
| 自检 | verify 页数标题 | ✅ 截图注入逐页自检闭环 |
|
|
26
|
+
|
|
27
|
+
品牌规范(色/字/logo)从 brand-design 的 VI 取;两引擎主题色系同源。
|
|
28
|
+
|
|
29
|
+
## 通用生产线(六步)
|
|
30
|
+
|
|
31
|
+
1. **大纲**(一页一论点,每页=标题(结论式)+支撑要点,先出大纲**必须确认再生成**);
|
|
32
|
+
2. **数据与图表**:数字全部可溯源(data-chain 口径);图表按 data-analysis 规范生成 png
|
|
33
|
+
(中文字体!);一页一图;
|
|
34
|
+
3. **素材**:图片版权可用性;图标用 Emoji/内联 SVG(slides-html 禁外链);
|
|
35
|
+
4. **生成**:按引擎决策表;结构页型(封面/目录/章节/要点/图文/KPI/引用/结尾)套用;
|
|
36
|
+
5. **自检**:验收清单(无溢出/无缺字/主题一致/页码/数字与来源核对——**讲错一个数,
|
|
37
|
+
整场信用清零**,同述职纪律);
|
|
38
|
+
6. **导出与演讲**:PDF(通用)/PPTX/放映页;讲稿按 260 字/分钟配时(okr-review 口径),
|
|
39
|
+
QA 预演(pr-comms 攻防表)。
|
|
40
|
+
|
|
41
|
+
## 端到端工作流
|
|
42
|
+
|
|
43
|
+
### ① 经营月报链(每月)
|
|
44
|
+
finance-chain 月结产物(报表+差异+比率)→ 要点提炼(结论卡三件事,management-accounting
|
|
45
|
+
"所以呢"纪律)→ 图表组(趋势/瀑布/KPI)→ pptx-author 常规版式(管理层要能改)→
|
|
46
|
+
自检数字核对 → 呈报归档(`财务/YYYY-MM/` 同目录,链上同源)。例程化:月度 5 日自动出初稿。
|
|
47
|
+
|
|
48
|
+
### ② 方案书/标书演示链(按单)
|
|
49
|
+
内容源(business-plan 或 tender-bidding 的定稿文档——**PPT 是文档的浓缩,不是另写一份**)→
|
|
50
|
+
逐页大纲对齐评分点/投资人质疑清单 → 数据页(估值敏感性/报价构成)→
|
|
51
|
+
slides-html 设计版(对外形象)→ 现场备份 PDF+PPTX 双格式(客户环境不可控)。
|
|
52
|
+
|
|
53
|
+
### ③ 发布会链(大场)
|
|
54
|
+
marketing-chain 新品上市链的发布环节 → SMP 一句话贯穿全 deck(brand-design)→
|
|
55
|
+
slides-html 四主题选型+定制封面 → 逐页截图自检至无溢出 → 放映页现场演示
|
|
56
|
+
(键盘翻页,内置浏览器全屏)→ 讲稿与彩排(event-management Run Sheet 挂接)。
|
|
57
|
+
|
|
58
|
+
## 使用纪律
|
|
59
|
+
|
|
60
|
+
大纲未确认不生成;数字未溯源不上页;PPTX 贴图版的不可编辑性**必须**提前告知;
|
|
61
|
+
模板资产沉淀(好版式回写团队模板,knowledge-sop 管理)。
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pptx-author
|
|
3
|
+
description: 生成 PPT 演示文稿。当用户说"做个 PPT/幻灯片/汇报材料/演示文稿/pptx"时使用。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PPT 生成(经 run_python 执行,python-pptx 已随托管运行时就绪)
|
|
8
|
+
|
|
9
|
+
## 流程
|
|
10
|
+
|
|
11
|
+
1. **大纲先行**:先在回复里给出逐页大纲(每页=标题 + ≤5 条要点 + 可选备注),页数建议 8–15;重要汇报让用户确认再生成。
|
|
12
|
+
2. **选主题**:`read_skill_file` 读本技能 `scripts/pptx_deck.py`,内置四套配色主题——`navy`(深蓝商务,默认)/ `tech`(科技紫)/ `mono`(极简灰) / `warm`(活力橙)。用户有品牌色时改 `THEMES` 传自定义。
|
|
13
|
+
3. **逐页构建**(16:9,helper 已处理版式/配色/字体):
|
|
14
|
+
```python
|
|
15
|
+
d = Deck(theme='navy')
|
|
16
|
+
d.add_cover('2026 上半年经营分析', '数据一部 · 2026-07')
|
|
17
|
+
d.add_agenda(['经营概览', '分区域表现', '问题与对策', '下半年计划'])
|
|
18
|
+
d.add_section('一、经营概览')
|
|
19
|
+
d.add_bullets('核心指标', ['营收 3.6 亿,同比 +18%', '毛利率 32.5%,环比 +1.2pct'], notes='强调同比口径')
|
|
20
|
+
d.add_image('分区域销售', '销售图.png', caption='华东领先,西南承压')
|
|
21
|
+
d.add_table('明细数据', [['地区','销售额','同比'], ['华东','1.2亿','+21%']])
|
|
22
|
+
d.add_end('谢谢,欢迎讨论')
|
|
23
|
+
d.save('经营分析.pptx')
|
|
24
|
+
```
|
|
25
|
+
4. **图表页**:先按 data-analysis 技能出 png(务必先设中文字体),再 `add_image` 插入——比 pptx 原生图表稳定且好看。
|
|
26
|
+
5. **验收(必做)**:`verify('产物.pptx')` 重开打印页数与每页标题,对照大纲无缺页。
|
|
27
|
+
|
|
28
|
+
## 设计约束(避免"惨不忍睹"的 PPT)
|
|
29
|
+
|
|
30
|
+
- 一页一个观点;要点每条 ≤20 字;超了就拆页或进备注。
|
|
31
|
+
- 数字是主角:关键数字用 `add_kpi`(大数字卡片页)而非藏在句子里。
|
|
32
|
+
- 不堆图:一页一图;表格 ≤7 行,更多的放 xlsx 附件并在页脚注明。
|
|
33
|
+
- 中文字体 helper 已设(微软雅黑/苹方由播放机器渲染,不嵌字体)。
|
|
34
|
+
|
|
35
|
+
## 桌面端「炫酷版」提示
|
|
36
|
+
|
|
37
|
+
python-pptx 走的是标准版式,追求设计感/动效的发布会级 PPT 属 M5-⑤ HTML 幻灯片管线(桌面端渲染导出)。用户明确要"炫酷/设计感"时:先用本技能出**结构定稿**,并说明设计版能力的边界。
|
|
38
|
+
|
|
39
|
+
## 验收自查
|
|
40
|
+
|
|
41
|
+
- [ ] verify 输出的页数与标题和大纲一致
|
|
42
|
+
- [ ] 每页要点 ≤5 条、每条 ≤20 字(超限已拆页/进备注)
|
|
43
|
+
- [ ] 插图的 png 中文显示正常(画图前设了字体)
|
|
44
|
+
- [ ] 文件名是中文描述性名称,已 print 产物清单
|
|
45
|
+
|
|
46
|
+
## 附件
|
|
47
|
+
|
|
48
|
+
- `scripts/pptx_deck.py` — Deck 构建器:四主题配色、cover/agenda/section/bullets/kpi/image/table/end 八种版式、`verify()` 重读校验;可直接执行自测
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# PPT 构建器(经 run_python 执行)。16:9 空白版式全手绘(不依赖模板文件),四套主题配色,
|
|
2
|
+
# 八种版式:cover / agenda / section / bullets / kpi / image / table / end;notes 进演讲备注。
|
|
3
|
+
# 直接执行本文件 = 自测:产出 pptx_deck_check.pptx 并重读校验。
|
|
4
|
+
import base64
|
|
5
|
+
|
|
6
|
+
from pptx import Presentation
|
|
7
|
+
from pptx.dml.color import RGBColor
|
|
8
|
+
from pptx.enum.text import PP_ALIGN
|
|
9
|
+
from pptx.oxml.ns import qn
|
|
10
|
+
from pptx.util import Emu, Inches, Pt
|
|
11
|
+
|
|
12
|
+
THEMES = {
|
|
13
|
+
'navy': dict(primary='1F4E79', accent='2E75B6', light='DEEBF7', text='333333'), # 深蓝商务(默认)
|
|
14
|
+
'tech': dict(primary='5B2D90', accent='9A66CC', light='EDE4F7', text='333333'), # 科技紫
|
|
15
|
+
'mono': dict(primary='404040', accent='7F7F7F', light='F2F2F2', text='333333'), # 极简灰
|
|
16
|
+
'warm': dict(primary='C55A11', accent='ED7D31', light='FBE5D6', text='3B3B3B'), # 活力橙
|
|
17
|
+
}
|
|
18
|
+
FONT = '微软雅黑' # 播放端渲染(mac 自动回退苹方),不嵌字体
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _style(run, size=18, bold=False, color='333333', font=FONT):
|
|
22
|
+
f = run.font
|
|
23
|
+
f.name = font
|
|
24
|
+
f.size = Pt(size)
|
|
25
|
+
f.bold = bold
|
|
26
|
+
f.color.rgb = RGBColor.from_string(color)
|
|
27
|
+
# 中文字体需另设 <a:ea>(run.font.name 只设拉丁 <a:latin>);用 lxml 直建,兼容各版本 python-pptx
|
|
28
|
+
from lxml import etree
|
|
29
|
+
rPr = run._r.get_or_add_rPr()
|
|
30
|
+
ea = rPr.find(qn('a:ea'))
|
|
31
|
+
if ea is None:
|
|
32
|
+
ea = etree.SubElement(rPr, qn('a:ea'))
|
|
33
|
+
ea.set('typeface', font)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class Deck:
|
|
37
|
+
def __init__(self, theme='navy'):
|
|
38
|
+
self.t = THEMES.get(theme, THEMES['navy'])
|
|
39
|
+
self.prs = Presentation()
|
|
40
|
+
self.prs.slide_width = Inches(13.333)
|
|
41
|
+
self.prs.slide_height = Inches(7.5)
|
|
42
|
+
|
|
43
|
+
# ── 内部小件 ──────────────────────────────────────────────
|
|
44
|
+
def _slide(self, notes=None):
|
|
45
|
+
s = self.prs.slides.add_slide(self.prs.slide_layouts[6]) # 空白版式
|
|
46
|
+
if notes:
|
|
47
|
+
s.notes_slide.notes_text_frame.text = notes
|
|
48
|
+
return s
|
|
49
|
+
|
|
50
|
+
def _rect(self, s, x, y, w, h, color):
|
|
51
|
+
from pptx.enum.shapes import MSO_SHAPE
|
|
52
|
+
r = s.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, w, h)
|
|
53
|
+
r.fill.solid()
|
|
54
|
+
r.fill.fore_color.rgb = RGBColor.from_string(color)
|
|
55
|
+
r.line.fill.background()
|
|
56
|
+
return r
|
|
57
|
+
|
|
58
|
+
def _text(self, s, x, y, w, h, text, size=18, bold=False, color=None, align=PP_ALIGN.LEFT):
|
|
59
|
+
tb = s.shapes.add_textbox(x, y, w, h)
|
|
60
|
+
tf = tb.text_frame
|
|
61
|
+
tf.word_wrap = True
|
|
62
|
+
p = tf.paragraphs[0]
|
|
63
|
+
p.alignment = align
|
|
64
|
+
_style(p.add_run(), size, bold, color or self.t['text'])
|
|
65
|
+
p.runs[0].text = text
|
|
66
|
+
return tf
|
|
67
|
+
|
|
68
|
+
def _title(self, s, text):
|
|
69
|
+
self._rect(s, 0, 0, self.prs.slide_width, Inches(0.12), self.t['accent'])
|
|
70
|
+
self._text(s, Inches(0.6), Inches(0.35), Inches(12), Inches(0.9), text, size=28, bold=True, color=self.t['primary'])
|
|
71
|
+
|
|
72
|
+
# ── 八种版式 ──────────────────────────────────────────────
|
|
73
|
+
def add_cover(self, title, subtitle='', notes=None):
|
|
74
|
+
s = self._slide(notes)
|
|
75
|
+
self._rect(s, 0, 0, self.prs.slide_width, self.prs.slide_height, self.t['primary'])
|
|
76
|
+
self._text(s, Inches(1), Inches(2.6), Inches(11.3), Inches(1.4), title, size=44, bold=True, color='FFFFFF', align=PP_ALIGN.CENTER)
|
|
77
|
+
if subtitle:
|
|
78
|
+
self._text(s, Inches(1), Inches(4.2), Inches(11.3), Inches(0.8), subtitle, size=18, color='DDE7F3', align=PP_ALIGN.CENTER)
|
|
79
|
+
return s
|
|
80
|
+
|
|
81
|
+
def add_agenda(self, items, title='目录', notes=None):
|
|
82
|
+
s = self._slide(notes)
|
|
83
|
+
self._title(s, title)
|
|
84
|
+
tb = s.shapes.add_textbox(Inches(1.2), Inches(1.7), Inches(10.5), Inches(5))
|
|
85
|
+
tf = tb.text_frame
|
|
86
|
+
tf.word_wrap = True
|
|
87
|
+
for i, it in enumerate(items):
|
|
88
|
+
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
|
|
89
|
+
p.space_after = Pt(14)
|
|
90
|
+
_style(p.add_run(), 22, False, self.t['text'])
|
|
91
|
+
p.runs[0].text = f'{i + 1} {it}'
|
|
92
|
+
return s
|
|
93
|
+
|
|
94
|
+
def add_section(self, title, notes=None):
|
|
95
|
+
s = self._slide(notes)
|
|
96
|
+
self._rect(s, 0, Inches(3.2), self.prs.slide_width, Inches(1.2), self.t['light'])
|
|
97
|
+
self._text(s, Inches(1), Inches(3.35), Inches(11.3), Inches(0.9), title, size=32, bold=True, color=self.t['primary'], align=PP_ALIGN.CENTER)
|
|
98
|
+
return s
|
|
99
|
+
|
|
100
|
+
def add_bullets(self, title, bullets, notes=None):
|
|
101
|
+
s = self._slide(notes)
|
|
102
|
+
self._title(s, title)
|
|
103
|
+
tb = s.shapes.add_textbox(Inches(0.9), Inches(1.6), Inches(11.5), Inches(5.3))
|
|
104
|
+
tf = tb.text_frame
|
|
105
|
+
tf.word_wrap = True
|
|
106
|
+
for i, b in enumerate(bullets):
|
|
107
|
+
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
|
|
108
|
+
p.space_after = Pt(12)
|
|
109
|
+
_style(p.add_run(), 20, False, self.t['text'])
|
|
110
|
+
p.runs[0].text = '• ' + str(b)
|
|
111
|
+
return s
|
|
112
|
+
|
|
113
|
+
def add_kpi(self, title, kpis, notes=None):
|
|
114
|
+
"""kpis: [(大数字, 说明)],最多 4 个卡片。"""
|
|
115
|
+
s = self._slide(notes)
|
|
116
|
+
self._title(s, title)
|
|
117
|
+
n = min(len(kpis), 4)
|
|
118
|
+
w = Inches(2.7)
|
|
119
|
+
gap = (self.prs.slide_width - n * w) / (n + 1)
|
|
120
|
+
for i, (num, label) in enumerate(kpis[:4]):
|
|
121
|
+
x = gap * (i + 1) + w * i
|
|
122
|
+
self._rect(s, x, Inches(2.4), w, Inches(2.2), self.t['light'])
|
|
123
|
+
self._text(s, x, Inches(2.7), w, Inches(1), str(num), size=36, bold=True, color=self.t['primary'], align=PP_ALIGN.CENTER)
|
|
124
|
+
self._text(s, x, Inches(3.8), w, Inches(0.6), str(label), size=14, color=self.t['text'], align=PP_ALIGN.CENTER)
|
|
125
|
+
return s
|
|
126
|
+
|
|
127
|
+
def add_image(self, title, image_path, caption='', notes=None):
|
|
128
|
+
s = self._slide(notes)
|
|
129
|
+
self._title(s, title)
|
|
130
|
+
pic = s.shapes.add_picture(image_path, Inches(1), Inches(1.6), height=Inches(4.6))
|
|
131
|
+
if pic.width > self.prs.slide_width - Inches(1): # 超宽图改按宽度适配
|
|
132
|
+
s.shapes._spTree.remove(pic._element)
|
|
133
|
+
pic = s.shapes.add_picture(image_path, Inches(1), Inches(1.6), width=self.prs.slide_width - Inches(2))
|
|
134
|
+
pic.left = int((self.prs.slide_width - pic.width) / 2)
|
|
135
|
+
if caption:
|
|
136
|
+
self._text(s, Inches(1), Inches(6.4), Inches(11.3), Inches(0.6), caption, size=14, color='777777', align=PP_ALIGN.CENTER)
|
|
137
|
+
return s
|
|
138
|
+
|
|
139
|
+
def add_table(self, title, rows, notes=None):
|
|
140
|
+
s = self._slide(notes)
|
|
141
|
+
self._title(s, title)
|
|
142
|
+
nr, nc = len(rows), len(rows[0])
|
|
143
|
+
tb = s.shapes.add_table(nr, nc, Inches(0.9), Inches(1.7), Inches(11.5), Inches(0.5) * nr).table
|
|
144
|
+
for i, row in enumerate(rows):
|
|
145
|
+
for j, val in enumerate(row):
|
|
146
|
+
cell = tb.cell(i, j)
|
|
147
|
+
cell.text = str(val)
|
|
148
|
+
p = cell.text_frame.paragraphs[0]
|
|
149
|
+
_style(p.runs[0] if p.runs else p.add_run(), 14, i == 0, 'FFFFFF' if i == 0 else self.t['text'])
|
|
150
|
+
if i == 0:
|
|
151
|
+
cell.fill.solid()
|
|
152
|
+
cell.fill.fore_color.rgb = RGBColor.from_string(self.t['primary'])
|
|
153
|
+
return s
|
|
154
|
+
|
|
155
|
+
def add_end(self, text='谢谢', notes=None):
|
|
156
|
+
s = self._slide(notes)
|
|
157
|
+
self._rect(s, 0, 0, self.prs.slide_width, self.prs.slide_height, self.t['primary'])
|
|
158
|
+
self._text(s, Inches(1), Inches(3.1), Inches(11.3), Inches(1.2), text, size=40, bold=True, color='FFFFFF', align=PP_ALIGN.CENTER)
|
|
159
|
+
return s
|
|
160
|
+
|
|
161
|
+
def save(self, path):
|
|
162
|
+
self.prs.save(path)
|
|
163
|
+
return path
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def verify(path):
|
|
167
|
+
"""重读校验(验收步骤用):打印页数与每页首个文本。"""
|
|
168
|
+
prs = Presentation(path)
|
|
169
|
+
n = len(prs.slides)
|
|
170
|
+
print(f'[verify] 共 {n} 页')
|
|
171
|
+
for i, s in enumerate(prs.slides, 1):
|
|
172
|
+
first = next((sh.text_frame.text.split('\n')[0] for sh in s.shapes
|
|
173
|
+
if sh.has_text_frame and sh.text_frame.text.strip()), '(无文本)')
|
|
174
|
+
print(f' p{i}: {first[:40]}')
|
|
175
|
+
return n
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
if __name__ == '__main__':
|
|
179
|
+
png = 'pptx_deck_check.png' # 1x1 红点 png,占位自测(真实场景用 matplotlib 产图)
|
|
180
|
+
open(png, 'wb').write(base64.b64decode(
|
|
181
|
+
'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=='))
|
|
182
|
+
d = Deck('navy')
|
|
183
|
+
d.add_cover('自测演示', 'pptx_deck.py 冒烟', notes='备注示例')
|
|
184
|
+
d.add_agenda(['概览', '数据', '结论'])
|
|
185
|
+
d.add_section('一、概览')
|
|
186
|
+
d.add_bullets('要点', ['要点甲', '要点乙', '要点丙'])
|
|
187
|
+
d.add_kpi('核心指标', [('3.6亿', '营收'), ('+18%', '同比'), ('32.5%', '毛利率')])
|
|
188
|
+
d.add_image('示意图', png, caption='占位图')
|
|
189
|
+
d.add_table('明细', [['地区', '销售额'], ['华东', '1200'], ['华南', '950']])
|
|
190
|
+
d.add_end()
|
|
191
|
+
p = d.save('pptx_deck_check.pptx')
|
|
192
|
+
verify(p)
|
|
193
|
+
print('OK', p)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pr-comms
|
|
3
|
+
description: 公共关系与企业传播(新闻稿、危机公关分级响应、媒体 Q&A、高管演讲稿、舆情分析报表)。当用户说"新闻稿/官方声明/危机公关/媒体问答/发言稿/舆情"时使用。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 公共关系(新闻稿范式 + 危机分级 SOP + Q&A 攻防 + 舆情报表)
|
|
8
|
+
|
|
9
|
+
## 新闻稿(倒金字塔,别写成散文)
|
|
10
|
+
|
|
11
|
+
结构:标题(事实+亮点,≤25 字,禁自嗨形容词堆叠)→ 导语(5W1H 一段说完,最重要的排最前)→
|
|
12
|
+
主体(重要性递减:核心事实 → 数据支撑 → 高管引语 → 背景)→ 公司介绍(boilerplate) → 媒体联系人。
|
|
13
|
+
硬规则:
|
|
14
|
+
- 每个数据有出处;没授权的客户名/合作方名不出现;
|
|
15
|
+
- 高管引语要"像人话且只有他能说"(战略判断/取舍/情感),不复述正文;
|
|
16
|
+
- 首发时间与禁运期(embargo)标注;
|
|
17
|
+
- 产出双版本:完整版 + 300 字通稿版(给转载)。
|
|
18
|
+
|
|
19
|
+
## 危机公关(先定级,再按 SOP 走)
|
|
20
|
+
|
|
21
|
+
| 级别 | 特征 | 响应时限 | 动作 |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| L1 轻微 | 个别投诉/小范围误读 | 24h | 客服口径统一,不上升 |
|
|
24
|
+
| L2 中度 | 媒体点名/话题发酵中 | 4h | 事实核查→口径三件套→定向沟通关键媒体 |
|
|
25
|
+
| L3 重大 | 全网热议/监管关注/安全事故 | 1h 内首响 | 声明+发布会准备+专项组+法务同步 |
|
|
26
|
+
|
|
27
|
+
**首响声明五要素**(L2/L3):确认知悉 → 已采取的行动 → 核查态度(不甩锅不定责)→
|
|
28
|
+
后续通报时间承诺 → 反馈渠道。**红线**:未核实先否认、删帖式应对、攻击爆料方、
|
|
29
|
+
"临时工"话术、承诺做不到的时限。
|
|
30
|
+
声明措辞三稿制:事实版(法务视角,只说确定的事)→ 温度版(加同理与歉意)→ 终版(两者平衡)。
|
|
31
|
+
|
|
32
|
+
## 媒体 Q&A(攻防手册)
|
|
33
|
+
|
|
34
|
+
按「必问题/敏感题/陷阱题」三档准备,每题给:核心口径(一句)+ 支撑点(≤3)+ 桥接话术
|
|
35
|
+
("这个问题的关键其实是…")+ **禁区**(绝不能说的词句)。
|
|
36
|
+
陷阱题应对:二选一陷阱不接前提;假设性问题回到事实;引用匿名信源要求具体化。
|
|
37
|
+
|
|
38
|
+
## 舆情分析报表(数据侧走 data-analysis)
|
|
39
|
+
|
|
40
|
+
声量趋势(事件标注)/ 情感分布(正负中,口径注明是模型判定)/ 渠道分布 / TOP 传播节点 /
|
|
41
|
+
高频负面关键词——结论落到「风险点 + 建议动作 + 监测阈值」。日报一页,周报带对比。
|
|
42
|
+
|
|
43
|
+
## 高管演讲稿
|
|
44
|
+
|
|
45
|
+
先要三件事:场合与听众/时长(≈260字/分钟)/一句话核心观点。
|
|
46
|
+
结构:钩子(数据/故事/反常识)→ 观点 → 三个支撑(各带案例)→ 呼应收尾。
|
|
47
|
+
口语化改写:短句、有停顿标记、去书面语("进行了"→"做了")。
|
|
48
|
+
|
|
49
|
+
## 验收自查
|
|
50
|
+
|
|
51
|
+
- [ ] 新闻稿导语 5W1H 完整,数据有出处,双版本齐
|
|
52
|
+
- [ ] 危机响应先定级,声明含五要素,无红线话术
|
|
53
|
+
- [ ] Q&A 覆盖敏感题与陷阱题,每题有禁区
|
|
54
|
+
- [ ] 舆情结论落到动作与阈值,情感口径已注明
|
|
55
|
+
|
|
56
|
+
## 附件
|
|
57
|
+
|
|
58
|
+
- `references/pr-templates.md` — 新闻稿骨架 / 三级声明模板 / Q&A 表结构 / 舆情日报模板
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# PR 模板库(按需取用,填空处以【】标注)
|
|
2
|
+
|
|
3
|
+
## 新闻稿骨架
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
【公司】发布【产品/事件】,【最有新闻价值的一点】
|
|
7
|
+
|
|
8
|
+
【城市】【日期】——【公司全称】今日宣布【核心事实】。【最关键数据/影响一句】。
|
|
9
|
+
|
|
10
|
+
【主体段1:核心事实展开,含可验证数据与出处】
|
|
11
|
+
【主体段2:数据/客户/场景支撑】
|
|
12
|
+
|
|
13
|
+
【公司职务】【姓名】表示:"【战略判断/取舍/愿景,一段像人话的引语】"
|
|
14
|
+
|
|
15
|
+
【背景段:行业背景/此前进展】
|
|
16
|
+
|
|
17
|
+
关于【公司】
|
|
18
|
+
【boilerplate,100 字内,全公司统一版本】
|
|
19
|
+
|
|
20
|
+
媒体联系人:【姓名】|【邮箱】|【电话】
|
|
21
|
+
(如有禁运期:EMBARGO until 【时间】)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 危机声明模板(按级取用)
|
|
25
|
+
|
|
26
|
+
**L2 中度(4 小时内)**
|
|
27
|
+
```
|
|
28
|
+
关于【事件】的说明
|
|
29
|
+
我们已关注到【渠道】关于【事件】的反馈。【已确认的事实一句,未确认的不写】。
|
|
30
|
+
我们已【已采取的动作:成立核查/暂停相关服务/联系当事人】。
|
|
31
|
+
对由此给【对象】带来的困扰,我们深表歉意。核查结果将于【时间】前通过【渠道】通报。
|
|
32
|
+
反馈渠道:【电话/邮箱】。
|
|
33
|
+
【公司】 【日期】
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**L3 重大(1 小时内首响,宁短勿错)**
|
|
37
|
+
```
|
|
38
|
+
我们已知悉【事件】,并第一时间【动作:启动应急预案/配合有关部门/救治安置】。
|
|
39
|
+
目前【仅写已核实事实】。我们将持续通报进展,下次通报不晚于【时间】。
|
|
40
|
+
```
|
|
41
|
+
> L3 首响禁止:定责、猜测原因、承诺赔偿数额、"个别员工行为"。
|
|
42
|
+
|
|
43
|
+
## 媒体 Q&A 表结构
|
|
44
|
+
|
|
45
|
+
| # | 类型(必问/敏感/陷阱) | 问题 | 核心口径(一句) | 支撑点 | 桥接话术 | 禁区 |
|
|
46
|
+
|---|---|---|---|---|---|---|
|
|
47
|
+
|
|
48
|
+
## 舆情日报模板(一页)
|
|
49
|
+
|
|
50
|
+
- 总声量:N(环比 ±%),负面占比 %(口径:模型判定/人工抽核 n 条准确率 %)
|
|
51
|
+
- 趋势图(事件标注)|渠道 TOP3 | 传播关键节点(账号/阅读量)
|
|
52
|
+
- 负面高频词:…(各附典型原文 1 条)
|
|
53
|
+
- 风险研判:【级别 + 依据】
|
|
54
|
+
- 建议动作:【谁/何时/做什么】|监测阈值:负面占比 >【】% 或单帖互动 >【】即升级
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: procurement-supply
|
|
3
|
+
description: 采购与供应链(询比价分析、供应商评估评分卡、ABC 库存分析、周转与呆滞、采购降本报告)。当用户说"比价/供应商评估/库存分析/呆滞料/采购分析/降本"时使用。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 采购与供应链(比价可复算 + 评分卡制度化 + 库存分层治理)
|
|
8
|
+
|
|
9
|
+
## 询比价分析
|
|
10
|
+
|
|
11
|
+
- 报价对齐口径先行:**总拥有成本 TCO** 而非裸单价——含税/运费/付款条件(账期折现)/
|
|
12
|
+
最小起订/模具分摊/质保;不同币种统一并注明汇率与日期;
|
|
13
|
+
- 比价表:物料×供应商矩阵,TCO 分解列 + 资质硬门槛列(不满足直接置灰不参与比价);
|
|
14
|
+
- 议价筹码清单:量的承诺/付款条件互换/竞对报价(合规使用)/长协锁价;
|
|
15
|
+
- 结论给「推荐+理由+风险」而非只给最低价(最低价+单一来源=风险敞口)。
|
|
16
|
+
|
|
17
|
+
## 供应商评估(`read_skill_file` 读 `scripts/supply.py`)
|
|
18
|
+
|
|
19
|
+
- `supplier_scorecard()`:维度权重制评分卡(质量 30/交付 25/成本 20/服务 15/合规与财务 10 为
|
|
20
|
+
缺省,可调)——每维给数据口径(质量=批次合格率/PPM,交付=OTD 准时率),输出总分排名 +
|
|
21
|
+
雷达数据 + 分级(A 战略/B 优选/C 观察/D 退出);
|
|
22
|
+
- 评审节奏:季度评分卡+年度现场审核;C/D 级触发改进函(含指标/期限/复评安排);
|
|
23
|
+
- 新供应商准入清单:三证资质/样品验证/小批量试产/账期与廉洁协议(合同细节转 legal-contract)。
|
|
24
|
+
|
|
25
|
+
## 库存分析(`supply.py`)
|
|
26
|
+
|
|
27
|
+
- `abc_analysis()`:按金额累计占比分 A(70%)/B(20%)/C(10%)——A 类精细管理(安全库存+周盘点),
|
|
28
|
+
C 类简化(双箱法/季度盘);可叠加 XYZ(需求波动)成九宫格策略;
|
|
29
|
+
- `turnover_days()`:周转天数=平均库存/日均出库;**呆滞判定**:N 天无动销且库存>阈值 →
|
|
30
|
+
呆滞清单(金额排序)+ 处置建议阶梯(调拨→促销→折价→报废,报废走审批);
|
|
31
|
+
- 缺货与超储同表呈现(安全库存对比),只报呆滞不报缺货是半份报告。
|
|
32
|
+
|
|
33
|
+
## 采购降本报告
|
|
34
|
+
|
|
35
|
+
降本口径要诚实:**价格降幅 ≠ 降本金额**(量变化要剥离);年化口径注明;
|
|
36
|
+
降本五路径归类呈现(谈判/替代料/集采/流程/付款条件),每项给证据(合同/订单前后对比)。
|
|
37
|
+
|
|
38
|
+
## 验收自查
|
|
39
|
+
|
|
40
|
+
- [ ] 比价用 TCO 口径且汇率/税注明
|
|
41
|
+
- [ ] 评分卡每维有数据口径,分级有动作
|
|
42
|
+
- [ ] 呆滞清单带处置阶梯;缺货风险同报
|
|
43
|
+
- [ ] 降本剥离了量因素
|
|
44
|
+
|
|
45
|
+
## 附件
|
|
46
|
+
|
|
47
|
+
- `scripts/supply.py` — supplier_scorecard / abc_analysis / turnover_days(含呆滞判定);可直接执行自测
|