@huicai/cli 2026.714.0 → 2026.804.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 +13 -5
- 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/advisor.js +1 -1
- package/src/agent.js +1 -1
- package/src/api.js +1 -1
- package/src/assets-import.js +1 -0
- package/src/autofix.js +1 -1
- package/src/automation.js +1 -1
- package/src/codeindex.js +1 -1
- package/src/commands.js +1 -1
- package/src/compaction.js +1 -1
- package/src/config.js +1 -1
- package/src/context-report.js +1 -1
- package/src/context.js +1 -1
- package/src/decisions.js +1 -0
- package/src/doccache.js +1 -0
- package/src/doctor.js +1 -1
- package/src/executors.js +1 -1
- package/src/expert-catalog.js +1 -0
- package/src/experts-store.js +1 -0
- package/src/gitflow.js +1 -1
- package/src/input.js +1 -1
- package/src/mcp.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/schedule-freq.js +1 -0
- package/src/schedule.js +1 -1
- package/src/session.js +1 -1
- package/src/skills.js +1 -1
- package/src/squad.js +1 -1
- package/src/subagent.js +1 -1
- package/src/title.js +1 -0
- package/src/tools.js +1 -1
- package/src/transcript.js +1 -1
- package/src/tui/app.js +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dev-rust
|
|
3
|
+
description: Rust 技术开发链(所有权心智与借用斗争止损→错误处理 thiserror/anyhow 分工→枚举建模"非法状态不可表示"→trait 对象 vs 泛型判据→tokio 异步(spawn_blocking/持锁 await/取消安全)→unsafe 最小化纪律→cargo workspace 与 feature 门→clippy 门禁→LTO 发布优化与编译时间治理→FFI 边界)。Rust 服务/CLI/性能组件开发、借用检查斗争、异步疑难时载入。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Rust 技术开发链
|
|
8
|
+
|
|
9
|
+
eng-develop 的 Rust 孙链。通则承 eng-develop,此处只写 Rust 特有判据。
|
|
10
|
+
|
|
11
|
+
## 所有权心智与止损策略
|
|
12
|
+
|
|
13
|
+
移动语义默认;借用二选一:多个共享借用 xor 一个可变借用;生命周期先让编译器推,报错再显式标注;
|
|
14
|
+
**与借用检查器斗争超过 10 分钟=设计问题信号**,止损三招按序试:
|
|
15
|
+
① 先 `clone()` 跑通再优化(正确性优先,画像后再抠热点);② 拆结构体(自引用/整体借用冲突→字段分组或方法只取所需字段);③ 集合内互引改索引(id 代替引用);
|
|
16
|
+
共享所有权判据:单线程 `Rc<RefCell>`,跨线程 `Arc<Mutex/RwLock>`——用到就问一句"能不能重新设计所有权",大量出现=在用 Rust 写 Java。
|
|
17
|
+
|
|
18
|
+
## 错误处理分工
|
|
19
|
+
|
|
20
|
+
**库用 thiserror**(结构化枚举,调用方可 match);**应用用 anyhow**(`.context("read config")` 链路上下文);
|
|
21
|
+
`?` 传播为主;`unwrap` 库代码禁,应用代码只许在"逻辑上不可能失败"处且**用 `expect("为什么不可能失败")` 写明理由**;
|
|
22
|
+
`Option`/`Result` 组合子(map/and_then/ok_or)优先 if-let 嵌套;
|
|
23
|
+
main 返回 `anyhow::Result<()>`,错误链完整打印。
|
|
24
|
+
|
|
25
|
+
## 类型建模
|
|
26
|
+
|
|
27
|
+
**非法状态不可表示**:枚举替布尔组合(`enum State { Connecting, Connected(Conn), Closed }` 而非三个 bool);
|
|
28
|
+
newtype 封装约束(`UserId(u64)` 防参数窜位);
|
|
29
|
+
derive 默认全家桶:`Debug, Clone`,公共类型加 `PartialEq`,配置类加 `serde`;
|
|
30
|
+
trait 对象 vs 泛型判据:异构集合/插件式用 `dyn`(运行时开销小于编译膨胀),热路径/内联需求用泛型;公共 API 少暴露复杂泛型签名。
|
|
31
|
+
|
|
32
|
+
## 异步(tokio)
|
|
33
|
+
|
|
34
|
+
async 传染性认知:一处 async,调用链全 async(边界处 block_on 只许在最外层);
|
|
35
|
+
**两大红线**:async 里做重 CPU(独占 worker→`spawn_blocking`)/持 `std::sync::Mutex` 跨 `.await`(死锁与全 runtime 卡)——临界区缩到 await 之前,或换 `tokio::sync::Mutex`(慢,先考虑缩临界区);
|
|
36
|
+
取消安全:`select!` 分支被取消时未完成的 future 被丢弃——有副作用的操作(已发半个请求)要考虑取消后果;
|
|
37
|
+
结构化并发 `JoinSet`(统一收割,散养 spawn 的 panic 无人知);
|
|
38
|
+
每个外部 IO 带 timeout(`tokio::time::timeout`);运行时单例(嵌套 block_on=panic)。
|
|
39
|
+
|
|
40
|
+
## unsafe 纪律
|
|
41
|
+
|
|
42
|
+
能不用则不用(先找 safe 轮子);必用则:**最小化块范围**+`// SAFETY:` 注释写清依赖的不变量+封进 safe API(调用者无需 unsafe);
|
|
43
|
+
`unsafe` 块 PR **双人评审**(eng-develop 评审加严);miri 跑测试(UB 检测);
|
|
44
|
+
FFI 与性能是仅有的两个正当理由,"绕过借用检查器"不是理由。
|
|
45
|
+
|
|
46
|
+
## cargo 工程
|
|
47
|
+
|
|
48
|
+
workspace 统一依赖版本(`[workspace.dependencies]`)与 lint 配置;
|
|
49
|
+
feature 门:默认精简(`default` 最小集),可选功能显式开;**feature 组合爆炸**要 CI 抽查关键组合(`--no-default-features` 至少常跑);
|
|
50
|
+
依赖审计:`cargo audit`(漏洞,eng-security)+`cargo deny`(许可证/重复版本/来源白名单);
|
|
51
|
+
`cargo tree -d` 查重复版本(编译时间与体积双害)。
|
|
52
|
+
|
|
53
|
+
## clippy / fmt
|
|
54
|
+
|
|
55
|
+
`cargo clippy -- -D warnings` 入 CI 红灯不合入;pedantic 组选择性开(全开=噪音);
|
|
56
|
+
`#[allow]` 必须带理由注释(裸 allow 评审拦);rustfmt 默认配置少动(dev-toolchain 格式化零争论)。
|
|
57
|
+
|
|
58
|
+
## 测试
|
|
59
|
+
|
|
60
|
+
单测同文件 `#[cfg(test)] mod tests`(可测私有项);集成测试 `tests/`(只走公共 API);
|
|
61
|
+
**文档测试**:示例即测试(```rust 块会被跑,文档永不腐烂——库必写);
|
|
62
|
+
proptest/quickcheck 判据:解析器/编解码/不变量验证(roundtrip:encode(decode(x))==x);
|
|
63
|
+
异步测试 `#[tokio::test]`;时间用 `tokio::time::pause` 虚拟推进(不真睡)。
|
|
64
|
+
|
|
65
|
+
## 性能与编译
|
|
66
|
+
|
|
67
|
+
**性能结论只看 release**(debug 慢 10–100 倍,拿 debug 数据谈优化=闹笑话);
|
|
68
|
+
发布档:`lto = "thin"`(或 fat)+`codegen-units = 1`+`strip = true`;panic=abort 判据(体积敏感且无捕获需求);
|
|
69
|
+
画像:criterion 基准+flamegraph;分配热点:clone 滥用/`String` 拼接(`&str`/`Cow` 化)/collect 中间集合(迭代器链到底);
|
|
70
|
+
编译时间治理:增量开发档/mold-lld 链接器/大 crate 拆分/泛型改 dyn 减单态化膨胀——**编译慢也是债**(dev-toolchain 构建预算同拍)。
|
|
71
|
+
|
|
72
|
+
## FFI 边界
|
|
73
|
+
|
|
74
|
+
方向判据:导出给 C 用 cbindgen,绑定 C 库用 bindgen;
|
|
75
|
+
边界三原则:C ABI(`extern "C"` + `#[repr(C)]`)/所有权明确(谁分配谁释放,跨界指针写清约定)/**panic 不许穿越 FFI**(边界处 `catch_unwind` 转错误码);
|
|
76
|
+
字符串成本:CString/CStr 转换与生命周期(悬垂第一高发区)。
|
|
77
|
+
|
|
78
|
+
**作业包**:`references/cargo-ci-snippets.md`(发布档 profile/workspace 统一/CI 门禁序(clippy -D/audit/deny/特性组合抽查)复制即用)。
|
|
79
|
+
|
|
80
|
+
## 使用纪律
|
|
81
|
+
|
|
82
|
+
clippy 红灯不合入;unsafe 双人评审+SAFETY 注释;
|
|
83
|
+
性能数据必附 release+基准条件(eng-performance 基准纪律);
|
|
84
|
+
每次与借用检查器的"高价值斗争"回写止损案例(本链心智库)。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Rust 工程配置片段(dev-rust 落笔件:复制即用)
|
|
2
|
+
|
|
3
|
+
## 1. 发布档 profile(Cargo.toml)
|
|
4
|
+
|
|
5
|
+
```toml
|
|
6
|
+
[profile.release]
|
|
7
|
+
lto = "thin" # 或 "fat":更慢更小更快,基准后定
|
|
8
|
+
codegen-units = 1
|
|
9
|
+
strip = true
|
|
10
|
+
# panic = "abort" # 体积敏感且无捕获需求才开
|
|
11
|
+
|
|
12
|
+
[profile.dev]
|
|
13
|
+
# 开发档默认即可;编译慢先治依赖与拆 crate,别牺牲 debug 体验
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## 2. workspace 统一(根 Cargo.toml)
|
|
17
|
+
|
|
18
|
+
```toml
|
|
19
|
+
[workspace]
|
|
20
|
+
members = ["crates/*"]
|
|
21
|
+
resolver = "2"
|
|
22
|
+
|
|
23
|
+
[workspace.dependencies] # 版本统一声明,成员用 dep.workspace = true
|
|
24
|
+
serde = { version = "1", features = ["derive"] }
|
|
25
|
+
|
|
26
|
+
[workspace.lints.clippy]
|
|
27
|
+
unwrap_used = "warn" # 库代码禁 unwrap 的执行面
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 3. CI 门禁序(cicd-pipeline 快慢分离)
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
cargo fmt --check # 秒级
|
|
34
|
+
cargo clippy --all-targets -- -D warnings # 红灯不合入
|
|
35
|
+
cargo test --workspace
|
|
36
|
+
cargo doc --no-deps # 文档测试跟 test 跑;doc 链接坏也拦
|
|
37
|
+
cargo audit # 漏洞(eng-security SCA)
|
|
38
|
+
cargo deny check licenses bans # 许可证与重复版本
|
|
39
|
+
# 抽查特性组合(组合爆炸,至少常跑):
|
|
40
|
+
cargo check --no-default-features
|
|
41
|
+
cargo check --all-features
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 4. 评审速扫
|
|
45
|
+
|
|
46
|
+
- [ ] 库 thiserror/应用 anyhow;expect 带"为什么不可能失败"
|
|
47
|
+
- [ ] async 里无重 CPU(spawn_blocking)与持 std Mutex 跨 .await
|
|
48
|
+
- [ ] unsafe 块最小化+SAFETY 注释+双人评审;miri 跑过
|
|
49
|
+
- [ ] 枚举建模状态(非法状态不可表示);pub 面上无复杂泛型泄漏
|
|
50
|
+
- [ ] 热路径 clone/String 拼接审过(&str/Cow);性能结论只看 release
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dev-toolchain
|
|
3
|
+
description: 通用开发工具链(Git 进阶工作流与提交粒度→通用调试方法论(二分/最小复现)→构建可重现与缓存治理→包管理私服与国内镜像→Lint/Format 统一→pre-commit 秒级门禁→效率工具箱→AI 结对纪律)。开发子链的语言无关工具底座:配新环境、治理仓库工程化、构建慢、工具链混乱时载入。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 通用开发工具链
|
|
8
|
+
|
|
9
|
+
eng-develop 的工具底座孙链,语言无关;语言专属工具(mvn/uv/cargo…)见各语言链。
|
|
10
|
+
工程化及格线:**新人半天能跑通构建与测试**——超过半天,治理这条链。
|
|
11
|
+
|
|
12
|
+
## Git 进阶
|
|
13
|
+
|
|
14
|
+
- 提交粒度:一提交一意图,可独立构建、可独立回滚;禁"攒一周一把梭"与"WIP 直接进主干";
|
|
15
|
+
- 提交前整理:交互式 rebase 把过程碎提交压成"评审者视角的故事线"(**push 前整理,push 后禁改共享分支历史**;force push 只许在自己的分支且用 --force-with-lease);
|
|
16
|
+
- 定位回归:`git bisect` 二分嫌疑提交(配一个可脚本化的复现命令,几十个提交 7 步定位);
|
|
17
|
+
- 并行任务:`git worktree` 同仓多目录(改 A 分支时来了紧急 fix,不必 stash 大挪移);
|
|
18
|
+
- 后悔药:`git reflog` 找回"消失"的提交(reset --hard 后先别慌);
|
|
19
|
+
- .gitignore 分层:全局(IDE/系统文件)+项目(构建产物);**误提交的密钥按已泄露处置**(eng-security),不是删文件了事;
|
|
20
|
+
- 大文件:二进制资产走 LFS 或制品库,仓库里出现 >10MB 文件要拦(pre-commit)。
|
|
21
|
+
|
|
22
|
+
## 分支与保护
|
|
23
|
+
|
|
24
|
+
命名 `feature|fix|hotfix|chore/工单号-简述`;主干保护:必过 CI+至少一人评审+禁直推;
|
|
25
|
+
分支寿命目标 <3 天(长寿分支=合并地狱,eng-release 策略judgment)。
|
|
26
|
+
|
|
27
|
+
## 通用调试方法论(语言细则见各链画像节)
|
|
28
|
+
|
|
29
|
+
1. **最小复现优先**:能稳定复现的 bug 已解决一半;复现不了先加观测(eng-observability)别盲改;
|
|
30
|
+
2. **二分法三用**:版本二分(bisect)/代码二分(注释掉一半)/数据二分(半量输入)——嫌疑空间每次砍半;
|
|
31
|
+
3. 断点进阶:条件断点(循环第 1000 次才停)/日志断点(不停不重启打变量)——比改代码加 print 再重启快十倍;
|
|
32
|
+
4. 橡皮鸭法:向人(或 AI)完整复述问题,三成在复述中自愈;
|
|
33
|
+
5. **改一处验一处**:同时改三处修好了=什么都没学到,下次还犯;
|
|
34
|
+
6. 根因流程走 debug-root-cause(假设-验证法,变更嫌疑第一问)。
|
|
35
|
+
|
|
36
|
+
## 构建可重现与缓存
|
|
37
|
+
|
|
38
|
+
- 可重现三锁:锁依赖(lockfile 必提交)/锁工具链版本(Node/JDK/Python 版本声明进仓库:.nvmrc、.tool-versions 等)/锁构建环境(容器化构建)——"我机器上是好的"病根就是三锁缺一;
|
|
39
|
+
- 缓存分层:本地增量+CI 远端缓存(依赖缓存按 lockfile 哈希为键);
|
|
40
|
+
- **构建时间预算 10 分钟**:超了治理(并行化/模块拆分/缓存命中率先查),构建慢=所有人排队交税;
|
|
41
|
+
- 构建脚本入库(Makefile/justfile/npm scripts 统一入口:`make build test lint` 三件套人人一致)。
|
|
42
|
+
|
|
43
|
+
## 包管理与私服
|
|
44
|
+
|
|
45
|
+
- 统一私服代理(npm/PyPI/Maven/Go proxy 一站式):加速、审计、防投毒白名单(eng-security 供应链)、断网可用;
|
|
46
|
+
- 国内镜像要点:公司私服优先;个人环境配主流镜像源并**留意镜像同步延迟**(刚发布的包镜像可能还没有,报 404 先想到这一层);
|
|
47
|
+
- 版本策略:应用锁死(lockfile 精确)、库宽松(range 声明);升级集中走 dependency-upgrade 不零敲碎打。
|
|
48
|
+
|
|
49
|
+
## Lint / Format 统一
|
|
50
|
+
|
|
51
|
+
- 格式化交给工具零人工(prettier/gofmt/rustfmt/spotless…):**评审里争论空格=集体时薪浪费**,.editorconfig 全仓统一;
|
|
52
|
+
- lint 渐进纪律:新增代码严格(增量门禁)、存量分批清(一次性全量修=巨型 PR 灾难);
|
|
53
|
+
- 规则改动走评审与公示,不是个人偏好战场;禁用规则要写理由注释(裸 disable 门禁拦)。
|
|
54
|
+
|
|
55
|
+
## pre-commit 秒级门禁
|
|
56
|
+
|
|
57
|
+
本地钩子只放**秒级**检查:格式化、lint 增量、密钥扫描、大文件拦截、裸 TODO 拦截(要挂工单号);
|
|
58
|
+
**作业包**:`scripts/secret-scan.sh`(零依赖密钥扫描:私钥头/云 AK/JWT/连接串带密码/webhook 七类规则,默认扫 git 暂存区,`--install-hook` 一键装钩子;误报走 secretscan:allow 注释或 .secretscan-ignore);
|
|
59
|
+
分钟级(全量测试/构建)放 CI——**门禁快才有人遵守,慢门禁必被 --no-verify**;
|
|
60
|
+
钩子配置入库(团队一键安装),新人 clone 完即生效。
|
|
61
|
+
|
|
62
|
+
## 效率工具箱(按需配备)
|
|
63
|
+
|
|
64
|
+
终端复用(tmux)/模糊查找(fzf)/更快的搜索(ripgrep)/JSON 处理(jq)/HTTP 调试(curl/httpie+可入库的 .http 文件);
|
|
65
|
+
**三次法则**:同一手工操作干到第三遍就脚本化,脚本入库共享;周期性的进一步例程化(office-automation);
|
|
66
|
+
个人 dotfiles 与项目模板仓库化——环境是资产不是缘分。
|
|
67
|
+
|
|
68
|
+
## AI 结对纪律(与 eng-develop 总则同拍,此处为工具视角)
|
|
69
|
+
|
|
70
|
+
上下文喂足(相关文件/惯例/约束)再要产出;产出逐行读懂才提交;
|
|
71
|
+
测试先行让 AI 补实现;边界条件(空/极值/并发/权限)亲自过;
|
|
72
|
+
密钥与内部数据不出内网;**AI 是加速器不是责任主体——署你名的代码你负责**。
|
|
73
|
+
|
|
74
|
+
## 使用纪律
|
|
75
|
+
|
|
76
|
+
工具链配置一切入库(钩子/编辑器配置/脚本/模板),口头约定=没有约定;
|
|
77
|
+
每次"环境问题"浪费半天以上→回写:补进模板或文档,让下一个人 5 分钟绕过;
|
|
78
|
+
季度巡检:构建时长/缓存命中率/新人上手时长三个数,恶化即治理。
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# 敏感信息扫描(dev-toolchain pre-commit 秒级门禁件;eng-security"密钥不入库"的本地防线)。
|
|
3
|
+
# 零依赖(POSIX grep -E);离线可用。规则求准不求全——低误报才有人真用(门禁快才有人遵守)。
|
|
4
|
+
# 用法:
|
|
5
|
+
# sh secret-scan.sh # 扫 git 暂存区(pre-commit 姿势);非 git 目录则扫当前目录
|
|
6
|
+
# sh secret-scan.sh <路径...> # 扫指定文件/目录
|
|
7
|
+
# sh secret-scan.sh --install-hook # 安装为本仓库 pre-commit 钩子
|
|
8
|
+
# 豁免: 项目根放 .secretscan-ignore,每行一个 grep -E 正则(匹配"文件路径"即跳过);误报也可行内加注释 secretscan:allow
|
|
9
|
+
# 退出码: 0=干净 1=发现嫌疑(pre-commit 即阻断) 。发现真密钥的处置=已泄露流程(吊销重发),不是删了重提交!
|
|
10
|
+
|
|
11
|
+
PATTERNS='
|
|
12
|
+
私钥文件头:-----BEGIN (RSA |EC |OPENSSH |DSA )?PRIVATE KEY-----
|
|
13
|
+
云AK_阿里系:LTAI[A-Za-z0-9]{12,24}
|
|
14
|
+
云AK_AWS系:AKIA[0-9A-Z]{16}
|
|
15
|
+
云AK_腾讯系:AKID[A-Za-z0-9]{13,20}
|
|
16
|
+
JWT令牌:eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}
|
|
17
|
+
连接串带密码:(mysql|postgres(ql)?|redis|mongodb(\+srv)?|amqp)://[^/@ "'"'"']+:[^/@ "'"'"']{4,}@
|
|
18
|
+
通用赋值:(password|passwd|secret|api_?key|access_?key|private_?key|token)["'"'"']?[[:space:]]*[:=][[:space:]]*["'"'"'][A-Za-z0-9_/+.-]{12,}["'"'"']
|
|
19
|
+
钉钉企微webhook:(oapi\.dingtalk\.com/robot/send\?access_token=|qyapi\.weixin\.qq\.com/cgi-bin/webhook/send\?key=)[a-z0-9-]{20,}
|
|
20
|
+
'
|
|
21
|
+
EXCLUDE_PATH='(^|/)(node_modules|dist|build|target|vendor|\.git|__pycache__)(/|$)|\.(lock|min\.js|map|png|jpg|jpeg|gif|ico|pdf|zip|gz|jar|woff2?)$|package-lock\.json|pnpm-lock\.yaml'
|
|
22
|
+
|
|
23
|
+
if [ "$1" = "--install-hook" ]; then
|
|
24
|
+
[ -d .git ] || { echo "不在 git 仓库根目录"; exit 2; }
|
|
25
|
+
SELF=$(cd "$(dirname "$0")" && pwd)/$(basename "$0")
|
|
26
|
+
mkdir -p .git/hooks
|
|
27
|
+
printf '#!/bin/sh\nexec sh "%s"\n' "$SELF" > .git/hooks/pre-commit
|
|
28
|
+
chmod +x .git/hooks/pre-commit
|
|
29
|
+
echo "已安装 pre-commit 钩子 → .git/hooks/pre-commit(团队共享请入库钩子配置,dev-toolchain)"
|
|
30
|
+
exit 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# 组装待扫文件清单
|
|
34
|
+
LIST="/tmp/.sscan_$$"
|
|
35
|
+
if [ $# -gt 0 ]; then
|
|
36
|
+
for p in "$@"; do
|
|
37
|
+
if [ -d "$p" ]; then find "$p" -type f 2>/dev/null; else echo "$p"; fi
|
|
38
|
+
done > "$LIST"
|
|
39
|
+
elif command -v git >/dev/null 2>&1 && git rev-parse --git-dir >/dev/null 2>&1; then
|
|
40
|
+
git diff --cached --name-only --diff-filter=ACM 2>/dev/null > "$LIST"
|
|
41
|
+
[ -s "$LIST" ] || { echo "(暂存区为空,无可扫内容;扫全目录用: sh secret-scan.sh .)"; rm -f "$LIST"; exit 0; }
|
|
42
|
+
else
|
|
43
|
+
find . -type f 2>/dev/null > "$LIST"
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
IGN=".secretscan-ignore"
|
|
47
|
+
HITS=0
|
|
48
|
+
TMP_HIT="/tmp/.sscan_hit_$$"
|
|
49
|
+
: > "$TMP_HIT"
|
|
50
|
+
|
|
51
|
+
while IFS= read -r f; do
|
|
52
|
+
[ -f "$f" ] || continue
|
|
53
|
+
echo "$f" | grep -qE "$EXCLUDE_PATH" && continue
|
|
54
|
+
[ -f "$IGN" ] && grep -qE -f "$IGN" 2>/dev/null <<EOF && continue
|
|
55
|
+
$f
|
|
56
|
+
EOF
|
|
57
|
+
# 跳过二进制(grep -I);逐规则扫;行级豁免:显式 allow 注释 + 明显占位值(xxx/changeme/<host> 等,
|
|
58
|
+
# 实战回写 2026-07:文档示例密钥误报——占位值不报,但"真实格式的假密钥"仍会报,示例请用明显假值)
|
|
59
|
+
echo "$PATTERNS" | while IFS=: read -r name re; do
|
|
60
|
+
[ -z "$name" ] && continue
|
|
61
|
+
grep -nIE "$re" "$f" 2>/dev/null | grep -v 'secretscan:allow' \
|
|
62
|
+
| grep -viE 'xxx|changeme|placeholder|your[-_](key|secret|token)|<[^>]{1,30}>|示例|占位|\bexample\b' \
|
|
63
|
+
| head -3 | while IFS= read -r line; do
|
|
64
|
+
echo "[$name] $f:$(echo "$line" | cut -c1-160)" >> "$TMP_HIT"
|
|
65
|
+
done
|
|
66
|
+
done
|
|
67
|
+
done < "$LIST"
|
|
68
|
+
|
|
69
|
+
if [ -s "$TMP_HIT" ]; then
|
|
70
|
+
HITS=$(wc -l < "$TMP_HIT" | tr -d ' ')
|
|
71
|
+
echo "==== 发现 $HITS 处敏感信息嫌疑 ===="
|
|
72
|
+
cat "$TMP_HIT"
|
|
73
|
+
echo ""
|
|
74
|
+
echo "处置三选一:"
|
|
75
|
+
echo " 1) 真密钥 → 按已泄露处理:吊销重发+挪密钥服务(eng-security'入过历史=已泄露',删提交救不了);"
|
|
76
|
+
echo " 2) 误报 → 行尾加注释 secretscan:allow,或路径正则进 .secretscan-ignore(要评审);"
|
|
77
|
+
echo " 3) 示例值 → 改成明显假值(xxx/changeme),别用真实格式的假密钥(下次还报)。"
|
|
78
|
+
rm -f "$LIST" "$TMP_HIT"
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
rm -f "$LIST" "$TMP_HIT"
|
|
82
|
+
echo "扫描通过(规则求准不求全——全史扫描与 SCA 由 CI 层承接,cicd-pipeline/eng-security)"
|
|
83
|
+
exit 0
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doc-chain
|
|
3
|
+
description: Word 文档技能链总控(文体路由→模板→分章生产→合成→评审比对→定稿归档全链、长报告/多人协作/文档生命周期三条端到端工作流)。当用户要写"正式文档"而文体未定,或诉求跨环节("30 页报告从调研到定稿")时先载入。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Word 文档技能链总控
|
|
8
|
+
|
|
9
|
+
## 文体路由表(先定体裁再动笔)
|
|
10
|
+
|
|
11
|
+
| 文体 | 典型产出 | 技能 |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| 党政/企业公文 | 请示/报告/通知/函/纪要 | **gov-document** |
|
|
14
|
+
| 商务报告 | 分析报告/可研/白皮书 | docx-author + 领域技能供内容 |
|
|
15
|
+
| 会议文书 | 纪要/行动项跟踪 | meeting-minutes |
|
|
16
|
+
| 合同法律文书 | 合同/审查意见/诉讼文书 | legal-contract / litigation-support |
|
|
17
|
+
| 学术文书 | 论文/开题/rebuttal | academic-writing |
|
|
18
|
+
| 制度与 SOP | 管理制度/操作规程 | knowledge-sop / risk-compliance |
|
|
19
|
+
| 翻译件 | 双语对照/净版 | translation-pro |
|
|
20
|
+
| 邮件函件 | 商务往来/催办/声明 | email-writing / pr-comms |
|
|
21
|
+
| 申报材料 | 申报书/标书 | project-proposal / tender-bidding |
|
|
22
|
+
|
|
23
|
+
## 通用生产线(六步,30 页以上必须走全)
|
|
24
|
+
|
|
25
|
+
1. **大纲评审**:章节树+每章一句话要点+预估篇幅,**确认后再写**(返工最贵的是结构性返工);
|
|
26
|
+
2. **素材归集**:调研输入(长文档 long-doc-analysis 笔记法,带出处)、数据(data-chain 口径,
|
|
27
|
+
图表 data-analysis 规范)、引用清单(来源可核,academic 纪律通用);
|
|
28
|
+
3. **分章生产(防截断的关键)**:每章独立 `章节-NN.md`(write_file append 分段)——
|
|
29
|
+
Markdown 中转是本平台长文档的标准姿势;交叉引用先用占位符([见第X章]);
|
|
30
|
+
4. **合成**:md 合并 → docx-author 的 md_to_docx(封面/目录域/页码/中文字体一次到位);
|
|
31
|
+
合成后**交叉引用与编号核对**(占位符清零、图表编号连续、目录刷新提示);
|
|
32
|
+
5. **评审回合**:初稿 → 批注意见归一(冲突意见找定稿人裁决,brand-design 评审纪律同源)→
|
|
33
|
+
修订 → **doc-compare 出变更清单**给评审人复核(改了什么一目了然,别让人重读全文);
|
|
34
|
+
6. **定稿与归档**:版本命名规范(`文档名-vN.N-YYYYMMDD`,草稿/送审/定稿态标注);
|
|
35
|
+
定稿 PDF 化防误改;归档进知识库(knowledge-sop 元数据:负责人/评审日期)。
|
|
36
|
+
|
|
37
|
+
## 端到端工作流
|
|
38
|
+
|
|
39
|
+
### ① 长报告生产链(30–100 页级)
|
|
40
|
+
选题与大纲(领域技能供框架:可研=project-proposal 十章/研报=securities-research)→
|
|
41
|
+
调研(long-doc-analysis 多文档对照矩阵)→ 分章写作(todo_write 跟踪,每章过领域验收清单)→
|
|
42
|
+
数据与图表批量生成 → 合成与一致性核对(**全书数字一致性**:同一指标各处相同,
|
|
43
|
+
项目申报的数字核对纪律通用)→ 评审两轮 → 定稿三件套(docx+PDF+摘要版)。
|
|
44
|
+
|
|
45
|
+
### ② 多人协作文档链
|
|
46
|
+
模板与分工表(章节×负责人×截止,project-management 跟踪)→ 风格对齐页
|
|
47
|
+
(术语表+语调+格式约定,先发后写)→ 各自产出 md → 合稿(顺序合并+风格统一改写)→
|
|
48
|
+
**术语一致性扫描**(translation-pro 的扫描法内用)→ 评审定稿。
|
|
49
|
+
|
|
50
|
+
### ③ 文档生命周期链(制度/范本类)
|
|
51
|
+
起草(knowledge-sop 可执行标准)→ 会签(意见归一台账)→ 发布(版本 v1.0+生效日期)→
|
|
52
|
+
执行反馈收集 → 年度评审(过期文档巡检)→ 修订(**doc-compare 新旧对照表随修订稿发布**——
|
|
53
|
+
让执行者 30 秒看懂改了什么)→ 废止归档(保留历史版本可追溯)。
|
|
54
|
+
|
|
55
|
+
## 使用纪律
|
|
56
|
+
|
|
57
|
+
先大纲后正文;长文一律 md 中转分章;修订必附变更清单;数字与引用可溯源;
|
|
58
|
+
敏感文档外发前过脱敏确认(data-governance 清单)。
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doc-compare
|
|
3
|
+
description: 文档比对与红线(合同版本比对、范本偏离检查、多方案差异表)。当用户说"比对两份文档/看改了哪里/和范本差在哪/红线版"时使用。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 文档比对与红线(经 run_python,python-docx + difflib)
|
|
8
|
+
|
|
9
|
+
## 场景分派
|
|
10
|
+
|
|
11
|
+
| 场景 | 做法 |
|
|
12
|
+
|---|---|
|
|
13
|
+
| 两版 docx/文本改了哪 | `scripts/compare.py` 段落级 diff → 变更清单(新增/删除/修改 + 上下文) |
|
|
14
|
+
| 合同 vs 范本偏离 | 先比对出变更清单,再逐条按 legal-contract 的条款清单定性(有利/不利/中性) |
|
|
15
|
+
| 红线版交付 | 生成「变更清单.docx」(修改前/后对照表)——如实告知:这是**对照表式红线**,非 Word 修订模式 |
|
|
16
|
+
| 多方案对比(>2 份) | 不做全文 diff;按维度建对照矩阵(long-doc-analysis 的矩阵法) |
|
|
17
|
+
|
|
18
|
+
## 流程
|
|
19
|
+
|
|
20
|
+
1. **统一底稿**:docx 直接读段落;pdf 先 read_document 全文转存 txt(告知:pdf 排版差异可能造成伪 diff)。
|
|
21
|
+
2. **跑比对**:`read_skill_file` 读 `scripts/compare.py`,`compare_docx(a, b)` / `compare_text(a, b)` →
|
|
22
|
+
变更块列表(类型/位置/原文/新文),并 print 统计(N 处新增/M 处删除/K 处修改)。
|
|
23
|
+
3. **降噪**:空白/标点全半角差异默认忽略(`normalize=True`);页眉页脚编号类变更单独归组。
|
|
24
|
+
4. **定性**(合同/制度类必做):逐条标注影响——金额/期限/责任/权利义务变化优先级最高;
|
|
25
|
+
纯措辞变化归"编辑性修改"。
|
|
26
|
+
5. **交付**:`变更清单.xlsx`(序号/位置/变更类型/原文/新文/影响定性/风险级)+ 摘要段
|
|
27
|
+
(一句话说清这版改动的实质)。
|
|
28
|
+
|
|
29
|
+
## 边界与诚实
|
|
30
|
+
|
|
31
|
+
- 段落级 diff 对**表格内容**变化不敏感:合同价格表类变更需单独读表核对并注明方法;
|
|
32
|
+
- 扫描件 pdf 的 OCR 误差会制造伪差异——置信度低的差异标「待人工核对」;
|
|
33
|
+
- 无法生成 Word 原生「修订模式」文件(需 Word 本体),提供对照表并说明。
|
|
34
|
+
|
|
35
|
+
## 验收自查
|
|
36
|
+
|
|
37
|
+
- [ ] 变更统计数与清单条数一致,无遗漏块(compare.py 的守恒断言通过)
|
|
38
|
+
- [ ] 金额/日期/期限类变更全部人工复核过原文
|
|
39
|
+
- [ ] 每条重要变更有影响定性,不止"改了"
|
|
40
|
+
- [ ] 已说明比对方法与局限(尤其 pdf/表格)
|
|
41
|
+
|
|
42
|
+
## 附件
|
|
43
|
+
|
|
44
|
+
- `scripts/compare.py` — compare_docx / compare_text(归一化降噪、变更块合并、守恒断言)+ 清单落盘 to_xlsx;可直接执行自测
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# 文档比对(经 run_python 执行):docx/纯文本 段落级 diff → 变更块清单(新增/删除/修改)。
|
|
2
|
+
# 归一化降噪(空白/全半角标点);守恒断言(原文段数 = 保留+删除+修改)。
|
|
3
|
+
# 直接执行本文件 = 自测:现场造两版 docx 比对并断言。
|
|
4
|
+
import difflib
|
|
5
|
+
import re
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
_PUNCT = str.maketrans({',': ',', '。': '.', ';': ';', ':': ':', '!': '!', '?': '?',
|
|
9
|
+
'(': '(', ')': ')', '“': '"', '”': '"', '‘': "'", '’': "'"})
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _norm(s, normalize=True):
|
|
13
|
+
if not normalize:
|
|
14
|
+
return s
|
|
15
|
+
return re.sub(r'\s+', '', str(s)).translate(_PUNCT)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _paras_docx(path):
|
|
19
|
+
from docx import Document
|
|
20
|
+
doc = Document(path)
|
|
21
|
+
out = [p.text for p in doc.paragraphs if p.text.strip()]
|
|
22
|
+
for tb in doc.tables: # 表格降级为行文本参与比对(并在报告注明方法局限)
|
|
23
|
+
for row in tb.rows:
|
|
24
|
+
t = ' | '.join(c.text.strip() for c in row.cells)
|
|
25
|
+
if t.strip(' |'):
|
|
26
|
+
out.append('[表] ' + t)
|
|
27
|
+
return out
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def compare_text(a_lines, b_lines, normalize=True):
|
|
31
|
+
"""段落列表比对 → 变更块 [{type:'add'|'del'|'mod', pos, old, new}]。"""
|
|
32
|
+
na = [_norm(x, normalize) for x in a_lines]
|
|
33
|
+
nb = [_norm(x, normalize) for x in b_lines]
|
|
34
|
+
sm = difflib.SequenceMatcher(a=na, b=nb, autojunk=False)
|
|
35
|
+
changes = []
|
|
36
|
+
kept = 0
|
|
37
|
+
for tag, i1, i2, j1, j2 in sm.get_opcodes():
|
|
38
|
+
if tag == 'equal':
|
|
39
|
+
kept += i2 - i1
|
|
40
|
+
elif tag == 'delete':
|
|
41
|
+
for k in range(i1, i2):
|
|
42
|
+
changes.append({'type': 'del', 'pos': k + 1, 'old': a_lines[k], 'new': ''})
|
|
43
|
+
elif tag == 'insert':
|
|
44
|
+
for k in range(j1, j2):
|
|
45
|
+
changes.append({'type': 'add', 'pos': i1 + 1, 'old': '', 'new': b_lines[k]})
|
|
46
|
+
else: # replace:按行配对,多余部分归增/删
|
|
47
|
+
n = max(i2 - i1, j2 - j1)
|
|
48
|
+
for k in range(n):
|
|
49
|
+
o = a_lines[i1 + k] if i1 + k < i2 else ''
|
|
50
|
+
w = b_lines[j1 + k] if j1 + k < j2 else ''
|
|
51
|
+
changes.append({'type': 'mod' if o and w else ('del' if o else 'add'),
|
|
52
|
+
'pos': min(i1 + k, i2 - 1) + 1, 'old': o, 'new': w})
|
|
53
|
+
# 守恒断言:原文每段要么保留要么进了变更清单
|
|
54
|
+
covered = kept + sum(1 for c in changes if c['type'] in ('del', 'mod'))
|
|
55
|
+
assert covered == len(a_lines), f'守恒断言失败:{covered} != {len(a_lines)}'
|
|
56
|
+
stat = {t: sum(1 for c in changes if c['type'] == t) for t in ('add', 'del', 'mod')}
|
|
57
|
+
print(f"[compare] 原文 {len(a_lines)} 段 | 新增 {stat['add']} · 删除 {stat['del']} · 修改 {stat['mod']}")
|
|
58
|
+
return changes
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def compare_docx(a_path, b_path, normalize=True):
|
|
62
|
+
return compare_text(_paras_docx(a_path), _paras_docx(b_path), normalize)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def to_xlsx(changes, out_path):
|
|
66
|
+
"""变更清单落盘(配合 xlsx-analysis 的 write_styled 更佳;此处独立可用)。"""
|
|
67
|
+
import pandas as pd
|
|
68
|
+
label = {'add': '新增', 'del': '删除', 'mod': '修改'}
|
|
69
|
+
df = pd.DataFrame([{'序号': i + 1, '原文位置(段)': c['pos'], '类型': label[c['type']],
|
|
70
|
+
'原文': c['old'], '新文': c['new'], '影响定性': ''} for i, c in enumerate(changes)])
|
|
71
|
+
df.to_excel(out_path, index=False)
|
|
72
|
+
print(f'[compare] 清单已落盘 {out_path}({len(df)} 条,「影响定性」列待逐条填写)')
|
|
73
|
+
return out_path
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == '__main__':
|
|
77
|
+
from docx import Document
|
|
78
|
+
|
|
79
|
+
def mk(path, paras):
|
|
80
|
+
d = Document()
|
|
81
|
+
for p in paras:
|
|
82
|
+
d.add_paragraph(p)
|
|
83
|
+
d.save(path)
|
|
84
|
+
|
|
85
|
+
mk('cmp_a.docx', ['第一条 合同总价为人民币 100 万元。', '第二条 交付期为 30 日。', '第三条 保密期五年。'])
|
|
86
|
+
mk('cmp_b.docx', ['第一条 合同总价为人民币 120 万元。', '第二条 交付期为 30 日。',
|
|
87
|
+
'第三条 保密期五年。', '第四条 违约金按日千分之一。'])
|
|
88
|
+
ch = compare_docx('cmp_a.docx', 'cmp_b.docx')
|
|
89
|
+
kinds = sorted(c['type'] for c in ch)
|
|
90
|
+
assert kinds == ['add', 'mod'], kinds # 100→120 为修改;第四条为新增
|
|
91
|
+
assert '120' in [c for c in ch if c['type'] == 'mod'][0]['new']
|
|
92
|
+
to_xlsx(ch, 'cmp_变更清单.xlsx')
|
|
93
|
+
print('OK compare.py')
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docx-author
|
|
3
|
+
description: 编写/生成 Word 文档(报告、周报、方案、纪要、总结)。当用户说"写个文档/Word/docx/报告/方案/会议纪要"且期望文件产物时使用。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Word 文档生成(经 run_python 执行,python-docx 已随托管运行时就绪)
|
|
8
|
+
|
|
9
|
+
## 流程
|
|
10
|
+
|
|
11
|
+
1. **大纲先行**:先在回复里给出章节大纲(标题层级 + 每节要点),重要文档让用户确认再落盘。
|
|
12
|
+
2. **内容走 Markdown 中转(防截断的关键)**:
|
|
13
|
+
- 用 write_file(长文加 `append=true` 分段)把全文写成 `草稿.md`——结构约定:`#`/`##`/`###` 标题、`-` 列表、`1.` 有序列表、`|` 表格、`**粗体**`、普通行=正文段落;
|
|
14
|
+
- `read_skill_file` 读本技能 `scripts/docx_doc.py`,执行 `md_to_docx('草稿.md', '产物.docx', title=..., author=...)` 一次转出成品——封面、目录域、页眉页脚页码、中文字体、标题样式全自动。
|
|
15
|
+
- 内容不长(<200 行)可跳过中转,直接在代码里用 helper 逐节构建。
|
|
16
|
+
3. **验收(必做)**:`verify('产物.docx')` 重开打印标题树/段落数/表格数,并对照大纲检查无缺节。
|
|
17
|
+
|
|
18
|
+
## 样式约定(docx_doc.py 已内置,别再手搓)
|
|
19
|
+
|
|
20
|
+
- 中文字体:正文宋体、标题黑体(west=Calibri),经 `w:eastAsia` 正确设置——只设 `font.name` 中文不生效是最常见的坑。
|
|
21
|
+
- 目录:插入的是 TOC **域**,首次打开 Word 会提示按 F9 更新——在文末提示用户这一点,不要伪造静态目录。
|
|
22
|
+
- 页码:页脚"第 X 页 共 Y 页"域。
|
|
23
|
+
- 表格:默认 `Table Grid` 网格样式 + 表头加粗。
|
|
24
|
+
|
|
25
|
+
## 分析/总结既有文档
|
|
26
|
+
|
|
27
|
+
- 读别人给的 docx/pdf:优先 `read_document`(平台解析,支持超长分段通读);要精确到表格结构时再用 python-docx 遍历 `doc.tables`。
|
|
28
|
+
- "总结成周报/纪要"类任务:先通读原文并列要点(在回复中),确认口径后再生成 docx。
|
|
29
|
+
|
|
30
|
+
## 验收自查
|
|
31
|
+
|
|
32
|
+
- [ ] 大纲与成品章节一一对应(verify 输出的标题树 print 过)
|
|
33
|
+
- [ ] 目录域/页码已插入,且已提醒用户 Word 内按 F9 刷新目录
|
|
34
|
+
- [ ] 中文在 Word 中字体正确(用了 helper 而非裸 add_paragraph)
|
|
35
|
+
- [ ] 长文档没有因为单次工具参数过长被截断(走了 md 中转)
|
|
36
|
+
|
|
37
|
+
## 附件
|
|
38
|
+
|
|
39
|
+
- `scripts/docx_doc.py` — `md_to_docx()` Markdown→Word 转换(含封面/目录域/页脚页码/中文字体/表格)、`verify()` 重读校验;可直接执行自测
|