@huicai/cli 2026.804.0 → 2026.1019.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +391 -32
- package/README.md +176 -10
- package/bin/huicai.js +166 -73
- package/package.json +27 -8
- package/skills/ab-testing/trigger-cases.json +30 -0
- package/skills/academic-writing/trigger-cases.json +30 -0
- package/skills/accounting-ops/trigger-cases.json +30 -0
- package/skills/ai-agent/trigger-cases.json +30 -0
- package/skills/ai-aiops/trigger-cases.json +30 -0
- package/skills/ai-coding/trigger-cases.json +30 -0
- package/skills/ai-compliance/trigger-cases.json +30 -0
- package/skills/ai-eval/trigger-cases.json +30 -0
- package/skills/ai-llm-app/trigger-cases.json +30 -0
- package/skills/ai-mlops/trigger-cases.json +30 -0
- package/skills/ai-multimodal/trigger-cases.json +30 -0
- package/skills/ai-prompt/trigger-cases.json +30 -0
- package/skills/ai-rag/trigger-cases.json +30 -0
- package/skills/anomaly-detection/trigger-cases.json +30 -0
- package/skills/api-design/trigger-cases.json +31 -0
- package/skills/api-integration/trigger-cases.json +31 -0
- package/skills/arch-design/trigger-cases.json +12 -0
- package/skills/arch-diagram/SKILL.md +118 -0
- package/skills/arch-diagram/trigger-cases.json +30 -0
- package/skills/arch-distributed/trigger-cases.json +30 -0
- package/skills/arch-multitenant/trigger-cases.json +30 -0
- package/skills/audio-brief/SKILL.md +65 -0
- package/skills/audio-brief/trigger-cases.json +30 -0
- package/skills/audit-assist/trigger-cases.json +30 -0
- package/skills/audit-chain/trigger-cases.json +31 -0
- package/skills/banking-credit/trigger-cases.json +30 -0
- package/skills/brand-design/trigger-cases.json +30 -0
- package/skills/business-plan/trigger-cases.json +30 -0
- package/skills/capital-ops/trigger-cases.json +30 -0
- package/skills/cicd-pipeline/trigger-cases.json +31 -0
- package/skills/code-archaeology/SKILL.md +55 -0
- package/skills/code-archaeology/trigger-cases.json +9 -0
- package/skills/code-quality/SKILL.md +138 -0
- package/skills/code-quality/references/languages.md +107 -0
- package/skills/code-quality/scripts/__pycache__/code_battery.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_check.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_check.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_csharp.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_csharp.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_fix.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_fix.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_java.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_java.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_jsts.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_jsts.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_lens.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_lens.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_python.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_python.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_testplan.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/code_battery.py +1072 -0
- package/skills/code-quality/scripts/code_check.py +1269 -0
- package/skills/code-quality/scripts/code_csharp.py +371 -0
- package/skills/code-quality/scripts/code_fix.py +201 -0
- package/skills/code-quality/scripts/code_java.py +695 -0
- package/skills/code-quality/scripts/code_jsts.py +313 -0
- package/skills/code-quality/scripts/code_lens.py +1079 -0
- package/skills/code-quality/scripts/code_python.py +536 -0
- package/skills/code-quality/scripts/code_testplan.py +239 -0
- package/skills/code-quality/trigger-cases.json +45 -0
- package/skills/code-review/SKILL.md +24 -0
- package/skills/code-review/trigger-cases.json +35 -0
- package/skills/commit-and-pr/trigger-cases.json +31 -0
- package/skills/content-creation/trigger-cases.json +30 -0
- package/skills/corporate-governance/trigger-cases.json +30 -0
- package/skills/crawl-chain/trigger-cases.json +31 -0
- package/skills/customer-service/trigger-cases.json +30 -0
- package/skills/data-analysis/trigger-cases.json +30 -0
- package/skills/data-chain/SKILL.md +1 -1
- package/skills/data-chain/trigger-cases.json +31 -0
- package/skills/data-governance/trigger-cases.json +30 -0
- package/skills/data-report-pro/trigger-cases.json +30 -0
- package/skills/data-streaming/trigger-cases.json +30 -0
- package/skills/data-wrangling/SKILL.md +1 -1
- package/skills/data-wrangling/trigger-cases.json +30 -0
- package/skills/db-es/trigger-cases.json +30 -0
- package/skills/db-migration/trigger-cases.json +30 -0
- package/skills/db-mysql/trigger-cases.json +30 -0
- package/skills/db-postgres/trigger-cases.json +30 -0
- package/skills/db-redis/trigger-cases.json +30 -0
- package/skills/debug-root-cause/trigger-cases.json +30 -0
- package/skills/dependency-audit/SKILL.md +56 -0
- package/skills/dependency-audit/trigger-cases.json +7 -0
- package/skills/dependency-upgrade/trigger-cases.json +31 -0
- package/skills/dev-cpp/trigger-cases.json +30 -0
- package/skills/dev-cross-platform/trigger-cases.json +30 -0
- package/skills/dev-csharp/SKILL.md +23 -0
- package/skills/dev-csharp/trigger-cases.json +30 -0
- package/skills/dev-frontend/SKILL.md +19 -0
- package/skills/dev-frontend/trigger-cases.json +30 -0
- package/skills/dev-go/trigger-cases.json +30 -0
- package/skills/dev-harmony/trigger-cases.json +30 -0
- package/skills/dev-java/SKILL.md +20 -0
- package/skills/dev-java/trigger-cases.json +30 -0
- package/skills/dev-mobile/trigger-cases.json +30 -0
- package/skills/dev-node/trigger-cases.json +30 -0
- package/skills/dev-php/trigger-cases.json +30 -0
- package/skills/dev-python/SKILL.md +21 -0
- package/skills/dev-python/trigger-cases.json +30 -0
- package/skills/dev-rust/trigger-cases.json +30 -0
- package/skills/dev-toolchain/trigger-cases.json +31 -0
- package/skills/doc-chain/trigger-cases.json +31 -0
- package/skills/doc-compare/trigger-cases.json +30 -0
- package/skills/docx-author/SKILL.md +127 -25
- package/skills/docx-author/scripts/__pycache__/docx_battery.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/docx_build.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/docx_check.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/docx_layout.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/zh_prose.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/docx_battery.py +586 -0
- package/skills/docx-author/scripts/docx_build.py +995 -0
- package/skills/docx-author/scripts/docx_check.py +1306 -0
- package/skills/docx-author/scripts/docx_doc.py +14 -154
- package/skills/docx-author/scripts/docx_layout.py +490 -0
- package/skills/docx-author/scripts/zh_prose.py +639 -0
- package/skills/docx-author/trigger-cases.json +58 -0
- package/skills/echo-brief/SKILL.md +84 -0
- package/skills/echo-brief/references/echo-format.md +68 -0
- package/skills/echo-brief/trigger-cases.json +40 -0
- package/skills/ecommerce-ops/trigger-cases.json +30 -0
- package/skills/education-training/trigger-cases.json +30 -0
- package/skills/ehs-safety/trigger-cases.json +30 -0
- package/skills/email-writing/trigger-cases.json +30 -0
- package/skills/eng-ai/trigger-cases.json +30 -0
- package/skills/eng-architecture/trigger-cases.json +31 -0
- package/skills/eng-automation/trigger-cases.json +31 -0
- package/skills/eng-collaboration/trigger-cases.json +30 -0
- package/skills/eng-complex-env/trigger-cases.json +30 -0
- package/skills/eng-data-platform/trigger-cases.json +31 -0
- package/skills/eng-database/trigger-cases.json +31 -0
- package/skills/eng-develop/trigger-cases.json +30 -0
- package/skills/eng-docs/SKILL.md +24 -0
- package/skills/eng-docs/trigger-cases.json +30 -0
- package/skills/eng-efficiency/trigger-cases.json +30 -0
- package/skills/eng-infra/trigger-cases.json +30 -0
- package/skills/eng-integration/trigger-cases.json +31 -0
- package/skills/eng-legacy/trigger-cases.json +31 -0
- package/skills/eng-observability/trigger-cases.json +31 -0
- package/skills/eng-ops/trigger-cases.json +31 -0
- package/skills/eng-performance/trigger-cases.json +31 -0
- package/skills/eng-planning/trigger-cases.json +31 -0
- package/skills/eng-quality/SKILL.md +8 -0
- package/skills/eng-quality/trigger-cases.json +31 -0
- package/skills/eng-release/trigger-cases.json +31 -0
- package/skills/eng-reliability/trigger-cases.json +31 -0
- package/skills/eng-requirements/trigger-cases.json +12 -0
- package/skills/eng-research/trigger-cases.json +30 -0
- package/skills/eng-security/trigger-cases.json +31 -0
- package/skills/eng-ux/trigger-cases.json +30 -0
- package/skills/engineering-chain/trigger-cases.json +30 -0
- package/skills/env-offline/trigger-cases.json +31 -0
- package/skills/env-private-deploy/trigger-cases.json +31 -0
- package/skills/env-xinchuang/trigger-cases.json +31 -0
- package/skills/equipment-tpm/trigger-cases.json +30 -0
- package/skills/esg-report/trigger-cases.json +30 -0
- package/skills/event-management/trigger-cases.json +30 -0
- package/skills/excel-analysis-chain/SKILL.md +17 -4
- package/skills/excel-analysis-chain/trigger-cases.json +31 -0
- package/skills/explain-codebase/trigger-cases.json +11 -0
- package/skills/file-ingest/trigger-cases.json +30 -0
- package/skills/finance-analysis/trigger-cases.json +31 -0
- package/skills/finance-chain/trigger-cases.json +31 -0
- package/skills/financial-modeling/trigger-cases.json +31 -0
- package/skills/find-simplifications/SKILL.md +43 -0
- package/skills/find-simplifications/trigger-cases.json +23 -0
- package/skills/foreign-trade/trigger-cases.json +30 -0
- package/skills/funnel-cohort/trigger-cases.json +30 -0
- package/skills/gov-document/trigger-cases.json +30 -0
- package/skills/gui-change-evidence/SKILL.md +47 -0
- package/skills/gui-change-evidence/trigger-cases.json +23 -0
- package/skills/hr-chain/trigger-cases.json +31 -0
- package/skills/hr-operations/trigger-cases.json +30 -0
- package/skills/info-disclosure/trigger-cases.json +31 -0
- package/skills/infra-gateway/trigger-cases.json +31 -0
- package/skills/infra-k8s/trigger-cases.json +31 -0
- package/skills/infra-mq/trigger-cases.json +30 -0
- package/skills/insurance-advisory/trigger-cases.json +30 -0
- package/skills/internal-audit/trigger-cases.json +30 -0
- package/skills/ip-management/trigger-cases.json +31 -0
- package/skills/ipo-listing/trigger-cases.json +31 -0
- package/skills/it-audit/trigger-cases.json +31 -0
- package/skills/itsm-ops/trigger-cases.json +31 -0
- package/skills/knowledge-sop/trigger-cases.json +31 -0
- package/skills/legal-chain/trigger-cases.json +31 -0
- package/skills/legal-contract/trigger-cases.json +30 -0
- package/skills/litigation-support/trigger-cases.json +31 -0
- package/skills/logistics-warehouse/trigger-cases.json +30 -0
- package/skills/long-doc-analysis/trigger-cases.json +31 -0
- package/skills/management-accounting/trigger-cases.json +30 -0
- package/skills/manufacturing-chain/trigger-cases.json +31 -0
- package/skills/manufacturing-quality/trigger-cases.json +30 -0
- package/skills/marketing-analytics/trigger-cases.json +31 -0
- package/skills/marketing-chain/trigger-cases.json +31 -0
- package/skills/meeting-minutes/trigger-cases.json +30 -0
- package/skills/metrics-system/trigger-cases.json +31 -0
- package/skills/negotiation-prep/trigger-cases.json +30 -0
- package/skills/obs-prometheus/trigger-cases.json +31 -0
- package/skills/office-automation/trigger-cases.json +31 -0
- package/skills/okr-review/trigger-cases.json +30 -0
- package/skills/ops-fleet/trigger-cases.json +31 -0
- package/skills/ops-linux/trigger-cases.json +31 -0
- package/skills/optimization-solver/trigger-cases.json +30 -0
- package/skills/patent-disclosure/SKILL.md +105 -0
- package/skills/patent-disclosure/references/figures.md +110 -0
- package/skills/patent-disclosure/references/outline.md +162 -0
- package/skills/patent-disclosure/scripts/patent_docx.py +230 -0
- package/skills/patent-disclosure/trigger-cases.json +31 -0
- package/skills/patent-drafting/SKILL.md +108 -0
- package/skills/patent-drafting/trigger-cases.json +31 -0
- package/skills/patent-portfolio/SKILL.md +81 -0
- package/skills/patent-portfolio/trigger-cases.json +31 -0
- package/skills/pdf-toolkit/trigger-cases.json +31 -0
- package/skills/perf-optimize/trigger-cases.json +31 -0
- package/skills/pivot-crosstab/trigger-cases.json +30 -0
- package/skills/policy-analysis/trigger-cases.json +31 -0
- package/skills/portfolio-analysis/trigger-cases.json +31 -0
- package/skills/ppt-chain/SKILL.md +14 -6
- package/skills/ppt-chain/trigger-cases.json +31 -0
- package/skills/pptx-author/SKILL.md +86 -33
- package/skills/pptx-author/scripts/__pycache__/pptx_check.cpython-312.pyc +0 -0
- package/skills/pptx-author/scripts/__pycache__/pptx_deck.cpython-312.pyc +0 -0
- package/skills/pptx-author/scripts/__pycache__/pptx_layout.cpython-312.pyc +0 -0
- package/skills/pptx-author/scripts/pptx_battery.py +178 -0
- package/skills/pptx-author/scripts/pptx_build.py +119 -0
- package/skills/pptx-author/scripts/pptx_check.py +1182 -0
- package/skills/pptx-author/scripts/pptx_deck.py +736 -145
- package/skills/pptx-author/scripts/pptx_layout.py +384 -0
- package/skills/pptx-author/trigger-cases.json +15 -0
- package/skills/pr-comms/trigger-cases.json +30 -0
- package/skills/procurement-supply/trigger-cases.json +31 -0
- package/skills/product-design/trigger-cases.json +31 -0
- package/skills/production-planning/trigger-cases.json +31 -0
- package/skills/project-management/trigger-cases.json +31 -0
- package/skills/project-proposal/trigger-cases.json +31 -0
- package/skills/prose-standard/SKILL.md +53 -0
- package/skills/prose-standard/trigger-cases.json +23 -0
- package/skills/qa-api-automation/trigger-cases.json +31 -0
- package/skills/qa-mobile-automation/trigger-cases.json +31 -0
- package/skills/qa-ui-automation/trigger-cases.json +31 -0
- package/skills/quant-analysis/trigger-cases.json +31 -0
- package/skills/rag-triage/SKILL.md +64 -0
- package/skills/rag-triage/evals.json +57 -0
- package/skills/rag-triage/references/triage-playbook.md +75 -0
- package/skills/rag-triage/trigger-cases.json +31 -0
- package/skills/real-estate-property/trigger-cases.json +30 -0
- package/skills/refactor-safely/SKILL.md +1 -1
- package/skills/refactor-safely/trigger-cases.json +30 -0
- package/skills/regression-forecast/trigger-cases.json +31 -0
- package/skills/release-checklist/trigger-cases.json +31 -0
- package/skills/report-craft/SKILL.md +76 -0
- package/skills/report-craft/references/feasibility.md +118 -0
- package/skills/report-craft/references/review-checklist.md +51 -0
- package/skills/report-craft/references/visuals.md +114 -0
- package/skills/report-craft/references/writing.md +80 -0
- package/skills/report-craft/scripts/__pycache__/chart_render.cpython-312.pyc +0 -0
- package/skills/report-craft/scripts/__pycache__/fin_model.cpython-312.pyc +0 -0
- package/skills/report-craft/scripts/__pycache__/project_facts.cpython-312.pyc +0 -0
- package/skills/report-craft/scripts/chart_render.py +1222 -0
- package/skills/report-craft/scripts/fin_model.py +602 -0
- package/skills/report-craft/scripts/project_facts.py +580 -0
- package/skills/report-craft/scripts/report_battery.py +349 -0
- package/skills/report-craft/trigger-cases.json +15 -0
- package/skills/retail-store-ops/trigger-cases.json +30 -0
- package/skills/risk-compliance/trigger-cases.json +31 -0
- package/skills/scope-creep/SKILL.md +45 -0
- package/skills/scope-creep/trigger-cases.json +7 -0
- package/skills/sec-auth/trigger-cases.json +31 -0
- package/skills/sec-compliance/trigger-cases.json +31 -0
- package/skills/securities-chain/trigger-cases.json +31 -0
- package/skills/securities-research/trigger-cases.json +31 -0
- package/skills/security-audit/trigger-cases.json +31 -0
- package/skills/slides-html/SKILL.md +25 -10
- package/skills/slides-html/trigger-cases.json +11 -0
- package/skills/sql-analysis/SKILL.md +110 -0
- package/skills/sql-analysis/trigger-cases.json +34 -0
- package/skills/sql-tuning/trigger-cases.json +31 -0
- package/skills/statistical-testing/trigger-cases.json +31 -0
- package/skills/strategy-planning/trigger-cases.json +30 -0
- package/skills/supply-chain/trigger-cases.json +31 -0
- package/skills/tax-compliance/trigger-cases.json +30 -0
- package/skills/tech-doc/SKILL.md +262 -0
- package/skills/tech-doc/scripts/__pycache__/archive_battery.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/archive_build.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/archive_check.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/archive_spec.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/doc_templates.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/archive_battery.py +860 -0
- package/skills/tech-doc/scripts/archive_build.py +599 -0
- package/skills/tech-doc/scripts/archive_check.py +1307 -0
- package/skills/tech-doc/scripts/archive_spec.py +499 -0
- package/skills/tech-doc/scripts/doc_templates.py +624 -0
- package/skills/tech-doc/trigger-cases.json +57 -0
- package/skills/tech-research/trigger-cases.json +31 -0
- package/skills/tender-bidding/trigger-cases.json +31 -0
- package/skills/translation-pro/trigger-cases.json +30 -0
- package/skills/treasury-mgmt/trigger-cases.json +31 -0
- package/skills/trim-cot-leakage/SKILL.md +58 -0
- package/skills/trim-cot-leakage/trigger-cases.json +23 -0
- package/skills/web-craft/SKILL.md +103 -0
- package/skills/web-craft/references/craft-checklist.md +75 -0
- package/skills/web-craft/references/design-direction.md +122 -0
- package/skills/web-craft/references/h5-mobile.md +100 -0
- package/skills/web-craft/references/motion.md +136 -0
- package/skills/web-craft/references/recipes.md +74 -0
- package/skills/web-craft/templates/wedding-invitation.html +1180 -0
- package/skills/web-craft/trigger-cases.json +14 -0
- package/skills/web-scraping/trigger-cases.json +34 -0
- package/skills/web-search/SKILL.md +11 -10
- package/skills/web-search/trigger-cases.json +31 -0
- package/skills/weekly-report/SKILL.md +134 -0
- package/skills/weekly-report/trigger-cases.json +11 -0
- package/skills/write-tests/trigger-cases.json +31 -0
- package/skills/xlsx-analysis/SKILL.md +143 -77
- package/skills/xlsx-analysis/scripts/__pycache__/data_profile.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_build.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_check.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_layout.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_toolkit.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/data_profile.py +391 -0
- package/skills/xlsx-analysis/scripts/xlsx_battery.py +389 -0
- package/skills/xlsx-analysis/scripts/xlsx_build.py +522 -0
- package/skills/xlsx-analysis/scripts/xlsx_check.py +924 -0
- package/skills/xlsx-analysis/scripts/xlsx_layout.py +235 -0
- package/skills/xlsx-analysis/scripts/xlsx_style.py +28 -66
- package/skills/xlsx-analysis/scripts/xlsx_toolkit.py +61 -5
- package/skills/xlsx-analysis/trigger-cases.json +59 -0
- package/squads/hc-defense.md +47 -0
- package/squads/hc-rdarchive.md +110 -0
- package/squads/hc-redteam.md +50 -0
- package/squads/hc-weekly.md +125 -0
- package/src/account.js +1 -0
- package/src/acp.js +1 -0
- package/src/advisor.js +1 -1
- package/src/agent.js +1 -1
- package/src/api.js +1 -1
- package/src/archaeology.js +1 -0
- package/src/ask-ui.js +1 -0
- package/src/assets-import.js +1 -1
- package/src/autofix.js +1 -1
- package/src/automation-tools.js +1 -0
- package/src/automation.js +1 -1
- package/src/autorun.js +1 -1
- package/src/banner.js +1 -1
- package/src/capability-probe.js +1 -0
- package/src/checkpoints.js +1 -1
- package/src/code-tools.js +1 -0
- package/src/codeindex.js +1 -1
- package/src/codemode.js +1 -0
- package/src/command-bridge.js +1 -0
- package/src/command-ui.js +1 -0
- package/src/commands.js +1 -1
- package/src/compaction.js +1 -1
- package/src/computer.js +1 -0
- package/src/config.js +1 -1
- package/src/consult.js +1 -1
- package/src/context-report.js +1 -1
- package/src/context-window.js +1 -0
- package/src/context.js +1 -1
- package/src/crew.js +1 -0
- package/src/crush.js +1 -0
- package/src/daemon.js +1 -1
- package/src/decisions.js +1 -1
- package/src/depaudit.js +1 -0
- package/src/device.js +1 -1
- package/src/diagram-draw.js +1 -0
- package/src/diagram-layouts.js +1 -0
- package/src/diagram-raster.js +1 -0
- package/src/diagram.js +1 -0
- package/src/dictation.js +1 -0
- package/src/diffview.js +1 -1
- package/src/doctor.js +1 -1
- package/src/docx-tools.js +1 -0
- package/src/errkind.js +1 -0
- package/src/evidence.js +1 -0
- package/src/executors.js +1 -1
- package/src/expert-catalog.js +1 -1
- package/src/experts-store.js +1 -1
- package/src/experts.js +1 -1
- package/src/external-agents.js +1 -0
- package/src/forks.js +1 -1
- package/src/fs-observe.js +1 -0
- package/src/gitflow.js +1 -1
- package/src/goalround.js +1 -0
- package/src/hooks.js +1 -1
- package/src/input.js +1 -1
- package/src/insights.js +1 -1
- package/src/jobs.js +1 -0
- package/src/kbsync.js +1 -1
- package/src/lsp.js +1 -0
- package/src/mcp-apps.js +1 -0
- package/src/mcp.js +1 -1
- package/src/memory.js +1 -1
- package/src/notify.js +1 -0
- package/src/permissions.js +1 -1
- package/src/plan-limits.js +1 -0
- package/src/policy.js +1 -0
- package/src/pptx-tools.js +1 -0
- package/src/presence.js +1 -0
- package/src/privatedir.js +1 -0
- package/src/pyruntime.js +1 -1
- package/src/radar.js +1 -0
- package/src/render.js +1 -1
- package/src/repl.js +1 -1
- package/src/report-tools.js +1 -0
- package/src/routing.js +1 -0
- package/src/sandbox-probe.js +1 -0
- package/src/sandbox-win-launcher.mjs +156 -0
- package/src/sandbox.js +1 -0
- package/src/scan.js +1 -1
- package/src/schedule.js +1 -1
- package/src/scopecreep.js +1 -0
- package/src/sdk.js +1 -0
- package/src/selection.js +1 -0
- package/src/session-events.js +1 -0
- package/src/session.js +1 -1
- package/src/sessionindex.js +1 -0
- package/src/sessionlog.js +1 -0
- package/src/skill-catalog.js +1 -0
- package/src/skill-lint.js +1 -0
- package/src/skill-optimize.js +1 -0
- package/src/skill-scan.js +1 -0
- package/src/skills.js +1 -1
- package/src/spill.js +1 -0
- package/src/squad.js +1 -1
- package/src/subagent.js +1 -1
- package/src/surface-state.js +1 -0
- package/src/tapd.js +1 -0
- package/src/terminal-select.js +1 -0
- package/src/terminal.js +1 -0
- package/src/test-runner.js +1 -0
- package/src/todo.js +1 -1
- package/src/toolpipe.js +1 -0
- package/src/tools.js +1 -1
- package/src/toon.js +1 -0
- package/src/transcript.js +1 -1
- package/src/tui/app.js +1 -1
- package/src/tui/command-menu.js +1 -0
- package/src/tui/progress.js +1 -0
- package/src/tui/scroll.js +1 -0
- package/src/tui/welcome.js +1 -0
- package/src/tui/workbench.js +1 -0
- package/src/ui-spec.js +1 -0
- package/src/uitree.js +1 -0
- package/src/uninstall.js +1 -1
- package/src/vision.js +1 -0
- package/src/visual.js +1 -0
- package/src/voice-form.js +1 -0
- package/src/voice.js +1 -0
- package/src/watch.js +1 -1
- package/src/web-audit.js +1 -0
- package/src/web-cdp.js +1 -0
- package/src/web-inspect.js +1 -0
- package/src/websearch.js +1 -0
- package/src/weekly.js +1 -0
- package/src/workflow.js +1 -0
- package/src/worklog.js +1 -0
- package/src/xlsx-tools.js +1 -0
- package/ui/command-picker.js +79 -0
- package/skills/ab-testing/scripts/__pycache__/ab_test.cpython-312.pyc +0 -0
- package/skills/accounting-ops/scripts/__pycache__/acct_tools.cpython-312.pyc +0 -0
- package/skills/anomaly-detection/scripts/__pycache__/anomaly.cpython-312.pyc +0 -0
- package/skills/audit-assist/scripts/__pycache__/audit_sampling.cpython-312.pyc +0 -0
- package/skills/banking-credit/scripts/__pycache__/credit_metrics.cpython-312.pyc +0 -0
- package/skills/data-report-pro/scripts/__pycache__/bigdata.cpython-312.pyc +0 -0
- package/skills/data-wrangling/scripts/__pycache__/join_tools.cpython-312.pyc +0 -0
- package/skills/ecommerce-ops/scripts/__pycache__/gmv_decompose.cpython-312.pyc +0 -0
- package/skills/funnel-cohort/scripts/__pycache__/funnel.cpython-312.pyc +0 -0
- package/skills/management-accounting/scripts/__pycache__/costing.cpython-312.pyc +0 -0
- package/skills/manufacturing-quality/scripts/__pycache__/spc.cpython-312.pyc +0 -0
- package/skills/marketing-analytics/scripts/__pycache__/rfm.cpython-312.pyc +0 -0
- package/skills/optimization-solver/scripts/__pycache__/solver.cpython-312.pyc +0 -0
- package/skills/pivot-crosstab/scripts/__pycache__/pivot_tools.cpython-312.pyc +0 -0
- package/skills/portfolio-analysis/scripts/__pycache__/portfolio.cpython-312.pyc +0 -0
- package/skills/procurement-supply/scripts/__pycache__/supply.cpython-312.pyc +0 -0
- package/skills/production-planning/scripts/__pycache__/mrp_capacity.cpython-312.pyc +0 -0
- package/skills/project-management/scripts/__pycache__/cpm.cpython-312.pyc +0 -0
- package/skills/quant-analysis/scripts/__pycache__/quant.cpython-312.pyc +0 -0
- package/skills/real-estate-property/scripts/__pycache__/property_calc.cpython-312.pyc +0 -0
- package/skills/regression-forecast/scripts/__pycache__/regress.cpython-312.pyc +0 -0
- package/skills/securities-research/scripts/__pycache__/valuation.cpython-312.pyc +0 -0
- package/skills/statistical-testing/scripts/__pycache__/stat_tests.cpython-312.pyc +0 -0
- package/skills/treasury-mgmt/scripts/__pycache__/cashflow_forecast.cpython-312.pyc +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audio-brief
|
|
3
|
+
description: 把文稿改写成口播稿并合成音频简报(日报/周报/监视简报转成能在路上听的音频)。当用户说"念给我听/做成音频/语音播报/路上听/生成播客/口播稿",或要求定时任务的产出附一份音频时使用。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 音频简报:把要看的东西变成能听的东西
|
|
8
|
+
|
|
9
|
+
自动化任务每天产出日报、周报、监视简报,而这些东西的阅读场景恰恰是**上班路上、会议间隙**——
|
|
10
|
+
两个不方便看屏幕的场景。这个技能把已有的文字产出加一路音频输出。
|
|
11
|
+
|
|
12
|
+
**它是文字简报的附加物,不是替代物。**音频不可检索、不可引用、不能跳读,
|
|
13
|
+
文字版必须照旧产出。
|
|
14
|
+
|
|
15
|
+
## 两步走,分工不能混
|
|
16
|
+
|
|
17
|
+
| 步骤 | 谁做 | 为什么 |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| ① 把文稿改写成**口播稿** | **你(模型)** | 需要判断哪些能省、数字怎么读、段落怎么过渡 |
|
|
20
|
+
| ② 切分 → 逐段合成 → 拼接 | **内核工具** | 纯确定性工作,交给模型编排只会每次做法都不一样 |
|
|
21
|
+
|
|
22
|
+
不要自己写循环去调 TTS,也不要让用户手动拼音频。
|
|
23
|
+
|
|
24
|
+
## 第一步:改写口播稿
|
|
25
|
+
|
|
26
|
+
**直接把 Markdown 丢进 TTS 是不行的**——听众会听到「井号井号 三 本周概况」「星号星号 重点 星号星号」。
|
|
27
|
+
清理标记内核会做,但**语体**要你改。六条规则:
|
|
28
|
+
|
|
29
|
+
1. **短句**。书面语一句能套三个从句,听觉一次只能装一个意思。见到长句就断开。
|
|
30
|
+
2. **数字读法**。`23.5%` 写成「百分之二十三点五」;`2026-08-20` 写成「八月二十号」;
|
|
31
|
+
`¥1,234,567` 写成「一百二十三万四千多」——**听众记不住精确到个位的大数**,播报要给量级。
|
|
32
|
+
3. **去掉纯视觉元素**。表格改叙述(「三个部门里销售部涨得最多」),图表引用改结论,
|
|
33
|
+
链接直接删(念一串 URL 是灾难)。
|
|
34
|
+
4. **补过渡**。文字靠标题分节,语音没有标题。段落之间要有「先说第一件事」「接下来是本周的异常」
|
|
35
|
+
这类路标,否则听众三十秒后就不知道听到哪了。
|
|
36
|
+
5. **开头一句话说清这是什么**。「这是八月二十号的经营日报,一共三件事。」
|
|
37
|
+
听众按下播放时没有屏幕给他上下文。
|
|
38
|
+
6. **结尾给行动**。「需要你今天确认的是第二件事。」听完不知道要干嘛的播报等于没听。
|
|
39
|
+
|
|
40
|
+
**长度纪律**:口播稿控制在原文的三到五成。一份两千字的日报,口播稿六百到一千字(约三到五分钟)。
|
|
41
|
+
超过五分钟的播报没人听得完——宁可只播「今天最要紧的三件事」,也不要把全文念一遍。
|
|
42
|
+
|
|
43
|
+
## 第二步:合成
|
|
44
|
+
|
|
45
|
+
改写完的口播稿交给内核工具合成。工具会:按句切分(默认每段 400 字)→ 逐段调 TTS →
|
|
46
|
+
按序拼接成一个音频文件。三条内建纪律:
|
|
47
|
+
|
|
48
|
+
- **超上限直接拒绝**,不静默截断(默认 120 段,约四万八千字)。
|
|
49
|
+
用户以为整份都念了、实际只念了三分之一,比明确报错糟得多——他不会去核对音频长度。
|
|
50
|
+
- **任一段失败即整体失败**,不返回半截音频。一段没合成上的播报听起来只是「跳了一句」,
|
|
51
|
+
听的人根本不知道自己漏了什么。
|
|
52
|
+
- **不支持 wav / pcm**:每段自带文件头,裸拼只有开头能播,故直接拒绝而不是给一个坏文件。
|
|
53
|
+
|
|
54
|
+
## 什么时候不要用
|
|
55
|
+
|
|
56
|
+
- **需要引用、需要检索、需要跳着看的内容**——那是文字的活。
|
|
57
|
+
- **一次性的短回答**(几十个字):交互式朗读就够了,不必走这条链路。
|
|
58
|
+
- **默认给所有定时任务加音频**:一份日报要几十次 TTS 调用,按次计费。
|
|
59
|
+
应当由用户对**特定任务**显式开启。
|
|
60
|
+
|
|
61
|
+
## 与其它技能的接力
|
|
62
|
+
|
|
63
|
+
- 上游:`office-automation`(定时产出日报/周报)、`meeting-minutes`(纪要)、
|
|
64
|
+
`data-report-pro`(数据简报)——它们出文字,本技能出音频。
|
|
65
|
+
- 投递:音频作为交付物落盘;要发给别人走通知中心的邮件渠道(附链接,不要附几 MB 的音频体)。
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "audio-brief",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "把这份日报念给我听,路上听",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "做成音频简报,生成口播稿",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "定时任务的产出附一份语音播报",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "把这段文字翻译成英文",
|
|
22
|
+
"shouldTrigger": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "neg-2",
|
|
26
|
+
"prompt": "写一份会议纪要",
|
|
27
|
+
"shouldTrigger": false
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "audit-assist",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "帮我做审计抽凭和穿行测试",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "年审底稿和函证怎么管理",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "内控测试的实质性程序怎么设计",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "做一次税务汇算清缴",
|
|
22
|
+
"shouldTrigger": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "neg-2",
|
|
26
|
+
"prompt": "写一份投资尽调报告",
|
|
27
|
+
"shouldTrigger": false
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "audit-chain",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "年审从头配合到出报告,整条链怎么走",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "外部检查要应对,整条审计链怎么排",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "这条舞弊线索要查到底,流程怎么排",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "帮我做审计抽凭和穿行测试",
|
|
22
|
+
"shouldTrigger": false,
|
|
23
|
+
"lexical": false
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "neg-2",
|
|
27
|
+
"prompt": "写一份税务申报说明",
|
|
28
|
+
"shouldTrigger": false
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "banking-credit",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "写一份授信调查报告",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "这家借款企业的偿债能力和现金流覆盖怎么测算",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "贷后检查要看哪些,担保怎么分析",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "做一份上市辅导材料",
|
|
22
|
+
"shouldTrigger": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "neg-2",
|
|
26
|
+
"prompt": "设计一个风控规则引擎",
|
|
27
|
+
"shouldTrigger": false
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "brand-design",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "帮我写一份设计需求 Brief",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "品牌起名怎么评估,VI 规范怎么定",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "品牌设计稿评审要看哪些点",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "画一张系统架构图",
|
|
22
|
+
"shouldTrigger": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "neg-2",
|
|
26
|
+
"prompt": "写一份新媒体内容日历",
|
|
27
|
+
"shouldTrigger": false
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "business-plan",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "帮我写一份商业计划书",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "路演给投资人讲的故事怎么组织",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "市场规模怎么测算,商业模式画布怎么填",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "写一份项目立项申请",
|
|
22
|
+
"shouldTrigger": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "neg-2",
|
|
26
|
+
"prompt": "做一次财务报表分析",
|
|
27
|
+
"shouldTrigger": false
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "capital-ops",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "做一次投资测算和融资尽调准备",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "增资减资流程,ESOP 股权激励怎么落地",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "公司要注销清算,流程是什么",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "写一份授信调查报告",
|
|
22
|
+
"shouldTrigger": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "neg-2",
|
|
26
|
+
"prompt": "做一次月度结账",
|
|
27
|
+
"shouldTrigger": false
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "cicd-pipeline",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "CI 老红,构建慢,流水线缓存怎么优化",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "流水线怎么 as code,密钥怎么不裸奔",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "runner 排队严重,矩阵并行和测试分片怎么配",
|
|
17
|
+
"shouldTrigger": true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "neg-1",
|
|
21
|
+
"prompt": "写一份发布检查清单",
|
|
22
|
+
"shouldTrigger": false,
|
|
23
|
+
"lexical": false
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "neg-2",
|
|
27
|
+
"prompt": "写一份 SQL 慢查询优化方案",
|
|
28
|
+
"shouldTrigger": false
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-archaeology
|
|
3
|
+
description: 代码考古——翻 git 历史重建「这段代码当初为什么被加进来」:引入提交、历次改动性质、常一起改的文件、当前归属、以及提交信息里的意图线索(工单、事故、性能、安全、兼容)。当用户问"这为什么在这儿/当初为什么这么写/这段历史遗留还需要吗/能不能删掉/这个兼容分支的来历/谁最清楚这块"时使用。注意:问「这段代码在做什么」是讲解现状,不归本技能。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 代码考古
|
|
8
|
+
|
|
9
|
+
看到一段看不懂的判断、一个没人解释过的魔数、一段标着「临时」却活了三年的兼容代码——
|
|
10
|
+
最常见的两种处置都是错的:照着现状硬猜一个理由,或者干脆删掉试试。
|
|
11
|
+
|
|
12
|
+
答案通常一直躺在 git 历史里。这个技能负责把史料翻出来。
|
|
13
|
+
|
|
14
|
+
## 何时使用
|
|
15
|
+
|
|
16
|
+
- 看到一段看不懂的代码、兼容分支、魔数
|
|
17
|
+
- 要决定「这段历史遗留还能不能删」
|
|
18
|
+
- 接手陌生模块,想知道该问谁
|
|
19
|
+
- 用户问「这为什么在这儿」「这还需要吗」
|
|
20
|
+
|
|
21
|
+
## 怎么用
|
|
22
|
+
|
|
23
|
+
1. 调 `code_archaeology`,给文件路径;只关心某一段就带上 `from`/`to` 行号。
|
|
24
|
+
2. **先读史料,再下结论**。看四样东西:
|
|
25
|
+
- **引入提交**:当初是为了什么加的
|
|
26
|
+
- **改动性质分布**:全是 fix 说明这块一直在出问题;全是 refactor 说明形态还没稳定
|
|
27
|
+
- **意图线索**:工单号、事故、性能、安全、兼容——这些是「当时确实有个具体缘由」的证据,值得顺藤摸瓜
|
|
28
|
+
- **伴生文件**:反复同改意味着隐式耦合,改这个多半也得看它们
|
|
29
|
+
3. 给结论时**必须把推断的部分标出来**(见下)。
|
|
30
|
+
|
|
31
|
+
## 一条不可让步的纪律:史料 ≠ 推测
|
|
32
|
+
|
|
33
|
+
git 给的是**事实**:谁、何时、改了什么、提交信息怎么写的。
|
|
34
|
+
「为什么」几乎总要靠推断。两者必须在你的回答里分开:
|
|
35
|
+
|
|
36
|
+
- ✅「引入提交写的是『修复 #77 的越界』,**据此推测**这个边界判断是为了防越界」
|
|
37
|
+
- ❌「这个边界判断是为了防越界」
|
|
38
|
+
|
|
39
|
+
把推测写成事实,是考古这类工作最容易造成的伤害——后来的人会拿着一个编出来的理由去做决定,
|
|
40
|
+
而那比不知道更糟。**线索不足时就如实说「历史里看不出来,建议问 XXX」**,不要硬编一个说法。
|
|
41
|
+
|
|
42
|
+
同理,`当前归属` 回答的是「现在谁的代码最多」,**不等于「谁最懂」**——
|
|
43
|
+
一次格式化就能让某人变成全仓最大归属者。它是问人的起点,不是结论。
|
|
44
|
+
|
|
45
|
+
## 与决策图谱合流
|
|
46
|
+
|
|
47
|
+
考古得出的结论可以写进决策图谱(`record_decision`),让时间线向前延伸到工具启用之前。
|
|
48
|
+
写入时**必须**标明它是事后推断而非当时记录(工具已自动置 `origin: archaeology` 并降低置信度)——
|
|
49
|
+
「当时真的记下来的」与「事后从历史里推出来的」混在一起,图谱的可信度就毁了。
|
|
50
|
+
|
|
51
|
+
## 边界
|
|
52
|
+
|
|
53
|
+
- 只读 git 历史,不改任何文件。
|
|
54
|
+
- 历史被压扁过(squash / 仓库迁移)时线索会很薄,此时如实说明,不要拿三条提交硬编一个故事。
|
|
55
|
+
- 它不审代码质量(那是 `code-review`),也不判断改动范围(那是 `scope-creep`)。
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cases": [
|
|
3
|
+
{ "id": "why-here", "prompt": "这个边界判断为什么在这儿,当初是为了解决什么", "shouldTrigger": true },
|
|
4
|
+
{ "id": "legacy-removable", "prompt": "这段历史遗留的兼容代码还需要吗,能不能删掉", "shouldTrigger": true },
|
|
5
|
+
{ "id": "who-knows", "prompt": "这块谁最清楚,我想问问它的来历", "shouldTrigger": true },
|
|
6
|
+
{ "id": "explain-what", "prompt": "这段代码是干嘛的,帮我理解一下逻辑", "shouldTrigger": false },
|
|
7
|
+
{ "id": "review-quality", "prompt": "帮我审查一下这段代码有没有问题", "shouldTrigger": false }
|
|
8
|
+
]
|
|
9
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-quality
|
|
3
|
+
description: 代码体检与自查自修:code_inspect 机器排查代码质量——空捕获吞异常、注释与实现对不上、Java 事务失效与代理陷阱(@Transactional 落私有方法/同类自调用/吞异常不回滚)、BigDecimal 精度、圈复杂度与函数过长、重复代码块、console.log 调试残留、测试 .only 残留与断言恒真、缺单元测试覆盖、硬编码密钥与 SQL 拼接;五类可自动修,逻辑与安全类报给人改;test_plan 在补单元测试前算清该测几条路、哪些边界、用什么框架。刚写完或改完代码后自查逻辑与注释、清理调试残留、补单测、交付前把关时载入。
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 代码自查自检自修
|
|
8
|
+
|
|
9
|
+
**代码的事故和文档的事故不一样**:文档出问题是看得见的(文字出框、编号跳号),
|
|
10
|
+
代码出问题是**看起来很对**——注释写着 `@param userId`,函数三个月前已经改叫 `id`;
|
|
11
|
+
`catch` 里空着,线上故障被静默吞掉;测试里留了个 `.only`,CI 从此只跑一个用例还一直是绿的。
|
|
12
|
+
|
|
13
|
+
这些东西不会在保存时报错,评审时一眼扫过去也像对的。
|
|
14
|
+
**AI 生成的代码尤其如此**:流畅、成体系、命名漂亮,那种"顺滑感"会让评审的人放松警惕。
|
|
15
|
+
所以自查不能靠"再读一遍感觉没问题",要靠机器过一遍。
|
|
16
|
+
|
|
17
|
+
## 用法
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
code_inspect(path) # 体检(不给 path 则整个工作目录)
|
|
21
|
+
code_inspect(path, only="logic,security") # 只看某几类
|
|
22
|
+
code_inspect(path, fix=true) # 顺带自动修那五类
|
|
23
|
+
code_inspect(path, strict=true) # 交付前把关:建议项也提升为必修
|
|
24
|
+
test_plan(path) # 写单测之前:先算清该测什么
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
规则全表随时可查(从实现里现取,不会与文档漂移):
|
|
28
|
+
`python3 skills/code-quality/scripts/code_check.py --rules`
|
|
29
|
+
|
|
30
|
+
**改完代码就跑一次**,别等用户问。回合收尾时系统会对你改过的源码自动体检一遍,
|
|
31
|
+
有必修项会打回来要求修完——与其被打回,不如自己先查。
|
|
32
|
+
|
|
33
|
+
## 七类规则怎么读
|
|
34
|
+
|
|
35
|
+
| 类 | 抓什么 | 为什么它值得一条规则 |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| **logic** 逻辑 | 空捕获、恒真条件、条件里写了 `=`、自我比较、死代码、可变默认参数、循环内 await、Java 用 `==` 比字符串、浮点比相等 | 这些是**会出事**的,不是风格问题 |
|
|
38
|
+
| **comment** 注释 | 文档写的形参函数里没有、说有返回值却从不返回、文档名字是从别的函数抄来的、被注释掉的死代码、无主 TODO | **过期的注释比没注释危害大**:它让下一个读者基于错误前提改代码 |
|
|
39
|
+
| **readability** 可读性 | 函数过长、嵌套过深、圈复杂度、参数过多、魔法数字 | 阈值是"该停下来看一眼"的信号,不是"必须拆"的判决 |
|
|
40
|
+
| **structure** 结构 | 重复代码块、硬编码本机路径、调试输出残留 | 重复=改的时候要记得改两处,而人总会忘一处 |
|
|
41
|
+
| **test** 测试 | `.only` 残留、恒真断言、没有断言的测试、公共函数无覆盖 | 一个恒真断言让整个用例变成装饰品 |
|
|
42
|
+
| **security** 安全 | 硬编码密钥、SQL 拼接、命令注入、eval、弱随机做令牌 | 误报代价高,所以每条都带排除;报出来的基本都值得看一眼 |
|
|
43
|
+
| **consistency** 一致性 | 同名函数在多处签名漂移 | 单文件看不见,它只有把多个文件放一起才成立 |
|
|
44
|
+
|
|
45
|
+
严重度三档:**必修(error)** 会出事或会骗人 · **建议(warn)** 该改但不拦交付 · **提示(info)** 风格偏好。
|
|
46
|
+
|
|
47
|
+
**必修项清零之前不要说「已完成」。**
|
|
48
|
+
|
|
49
|
+
## 分语言专属规则(Java 33 · Python 30 · JS/TS/Vue 20 · C# 20)
|
|
50
|
+
|
|
51
|
+
通用七类对所有语言都跑,此外每种主力语言另有一组**专属规则**——
|
|
52
|
+
它们的共同点是通用规则一条也看不见,却恰恰是各自语言里最会出事的地方:
|
|
53
|
+
|
|
54
|
+
- **Java**:@Transactional 落私有方法/未配 rollbackFor/吞异常/事务内起线程、
|
|
55
|
+
**同类自调用 @Transactional·@Async**(走 this 不走代理,注解等于没写)、
|
|
56
|
+
BigDecimal 双坑、static SimpleDateFormat、MyBatis `${}`;
|
|
57
|
+
- **Python**(走真 AST,判得最准):类属性共享可变、闭包捕获循环变量、
|
|
58
|
+
**`except` 顺序错致子类分支永不执行**、生产代码用 assert、`open()` 无 encoding、
|
|
59
|
+
pandas 链式赋值与读表不指定 dtype(**事故不改外观、只改数字**);
|
|
60
|
+
- **JS/TS/Vue**:`.forEach(async …)`、`a?.b.c` 只防了第一层、`x === NaN`、
|
|
61
|
+
`as any` 与 `@ts-ignore`、**v-for 无 :key / v-if 与 v-for 同元素 / v-html**、
|
|
62
|
+
直接改 props、解构 reactive;
|
|
63
|
+
- **C#**:**`async void`**(异常无人能接)、**`.Result`/`.Wait()`**(必然死锁,本地却测不出)、
|
|
64
|
+
**`throw ex;`**(重置堆栈,正确写法 `throw;` 反而更短)、`DateTime.Now`、`double` 算钱、
|
|
65
|
+
`lock(this)`、LINQ 多次枚举、DbContext 注册成 Singleton、`async void` 测试方法。
|
|
66
|
+
|
|
67
|
+
细表见 `references/languages.md`;完整清单随时从实现里现取:
|
|
68
|
+
`code_check.py --rules`(规则文件是动态发现的,不会与文档漂移)。
|
|
69
|
+
|
|
70
|
+
## 能自动修的只有五类——其余为什么不能
|
|
71
|
+
|
|
72
|
+
`fix=true` 只动这五样:`.only` 残留、行尾空白、被注释掉的死代码、调试输出、空 `finally`。
|
|
73
|
+
共同点是**改完行为要么不变、要么是恢复本该有的行为**。
|
|
74
|
+
|
|
75
|
+
两条看着能自动修、但**刻意不修**的:
|
|
76
|
+
|
|
77
|
+
- `a == b` → `a === b`:**会改变行为**。`"1" == 1` 为真,`"1" === 1` 为假。
|
|
78
|
+
代码若正依赖松散比较,一键修完当场出故障。
|
|
79
|
+
- `count = count;` 删掉:看着无害,但它多半是**漏写了 `this.`** 的现场证据。
|
|
80
|
+
删掉等于把线索抹了,bug 还在,只是再也查不到。
|
|
81
|
+
|
|
82
|
+
逻辑、注释与实现不符、缺测试、安全——这几类工具一律不碰,报给你,**你来判断怎么改**。
|
|
83
|
+
一个会自动改坏代码的修复器比没有修复器危险,因为人会停止复核它的改动。
|
|
84
|
+
|
|
85
|
+
## 注释是怎么骗人的
|
|
86
|
+
|
|
87
|
+
体检里最有价值的一条是 `comment.param-mismatch`:文档里写的形参,函数签名里根本没有。
|
|
88
|
+
它几乎总是同一个故事——**形参改过名,注释没跟着改**。
|
|
89
|
+
|
|
90
|
+
写注释时记住分工:
|
|
91
|
+
- **代码写「做什么」,注释写「为什么」**。把代码念一遍的注释(`// 设置 name` 配 `user.name = x`)等于噪声,体检会报。
|
|
92
|
+
- 在每个**转折处**写一句:为什么选了这个方案而不是那个、绕开了哪个坑、这段的前提是什么。
|
|
93
|
+
- 改了签名就改文档,两者是一份东西的两半。
|
|
94
|
+
|
|
95
|
+
## 写单测:先算清该测什么
|
|
96
|
+
|
|
97
|
+
直接开写的产出通常是一堆"调一次、断言不为 null"——覆盖率上去了,缺陷一个也拦不住。
|
|
98
|
+
原因是没先回答"这个函数到底有几条路、边界在哪"。
|
|
99
|
+
|
|
100
|
+
`test_plan(path)` 把这部分算出来给你:
|
|
101
|
+
|
|
102
|
+
- 哪些对外函数测试里从没出现过(按圈复杂度排序,**分支多的先补**)
|
|
103
|
+
- 每个函数至少需要几个用例才能覆盖各分支
|
|
104
|
+
- 每个参数该试哪些边界(按名字推断:`orders` 试空数组、`amount` 试负数与零、`deadline` 试时区边界)
|
|
105
|
+
- 有没有异常路径 / 异步失败路径 / 需要替身的外部依赖
|
|
106
|
+
- **这个项目的框架、测试目录、命名约定、参照文件**——照着既有约定写,不要自创一套
|
|
107
|
+
|
|
108
|
+
写完再跑一次 `code_inspect`:恒真断言、没有断言的用例、`.only` 残留归那边管,
|
|
109
|
+
而这三样正是写测试时最容易顺手留下的。
|
|
110
|
+
|
|
111
|
+
**警惕自证循环**:你同时写实现和测试时,测试会"验证"你的实现——包括错的部分。
|
|
112
|
+
正路是先定验收用例(或让人审你起草的用例),再写实现。
|
|
113
|
+
|
|
114
|
+
## 误报怎么办
|
|
115
|
+
|
|
116
|
+
确认某一条确实是误报,就地豁免:
|
|
117
|
+
|
|
118
|
+
```js
|
|
119
|
+
// code-inspect-ignore: security.command-injection cmd 来自内部白名单,已核实
|
|
120
|
+
return execSync(`command -v ${cmd}`);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
不写规则名则豁免该行全部规则。**顺手写下理由**——豁免是一条决定,
|
|
124
|
+
下一个读到它的人(和下一次的你)需要知道这个决定的依据。
|
|
125
|
+
|
|
126
|
+
但先想清楚:这一条真的是误报,还是你不想改?把真问题豁免掉,这个工具就白装了。
|
|
127
|
+
|
|
128
|
+
## 自己写的代码怎么过自己这一关
|
|
129
|
+
|
|
130
|
+
1. 写完就 `code_inspect(改过的文件)`,别等被打回;
|
|
131
|
+
2. 必修项逐条改,改完**复检确认清零**——"应该修好了"不算;
|
|
132
|
+
3. 建议项看一眼:函数超过 80 行、圈复杂度过 15,多半真的该拆;
|
|
133
|
+
4. 新增对外函数就 `test_plan` 一遍,至少补正常路径 + 一个边界;
|
|
134
|
+
5. 交付前 `strict=true` 再过一次。
|
|
135
|
+
|
|
136
|
+
**引擎改了必须重跑压测台**:`python3 scripts/code_battery.py 300`
|
|
137
|
+
(反向造缺陷覆盖全部 46 条规则 + 反误报 + 修复闭环 + 正向跑批)。
|
|
138
|
+
只会说"未发现问题"的体检器比没有体检器更糟——它给人一个虚假的"已检查"印象。
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# 分语言规则详解
|
|
2
|
+
|
|
3
|
+
`code_inspect` 的通用七类对所有语言都跑;下面这三组是**语言专属**的,
|
|
4
|
+
共同点是:通用规则一条也看不见,而它们恰恰是各自语言里最会出事的地方。
|
|
5
|
+
|
|
6
|
+
随时可以从实现里现取完整清单(不会与本文漂移):
|
|
7
|
+
`python3 skills/code-quality/scripts/code_check.py --rules`
|
|
8
|
+
|
|
9
|
+
## Java:另有 33 条专属规则
|
|
10
|
+
|
|
11
|
+
Java 真正会出事的地方,通用规则几乎一条都看不见——它们的共同点是
|
|
12
|
+
**编译通过、运行不报错、出事时离现场很远**:
|
|
13
|
+
|
|
14
|
+
| 分组 | 抓什么 |
|
|
15
|
+
|---|---|
|
|
16
|
+
| 事务(`framework.tx-*`) | @Transactional 落在 private/final/static(代理包不住,**注解完全不生效**)· 抛受检异常却没写 rollbackFor(Spring 默认只回滚 RuntimeException)· 方法内 catch 住异常不再抛(异常不出方法,事务不回滚)· 事务内起新线程(事务绑在当前线程上) |
|
|
17
|
+
| 代理(`framework.self-invocation`) | 同类内直接调用 @Transactional / @Async / @Cacheable 方法——走的是 this 不是代理,注解等于没写 |
|
|
18
|
+
| 注入与 Bean | @Autowired 字段注入 · @Value 无默认值 · 单例 Bean 的可变实例字段 |
|
|
19
|
+
| 精度与拆箱 | `new BigDecimal(double)`(0.1 会变成 0.1000000000000000055…)· BigDecimal 用 equals(2.0 ≠ 2.00)· 装箱类型用 `==`(128 以内因缓存"碰巧正确") |
|
|
20
|
+
| 并发与资源 | static SimpleDateFormat(非线程安全)· ThreadLocal.set 无 remove(线程池串数据)· Executors 快捷工厂(无界队列/无限线程都是 OOM)· 资源不在 try-with-resources |
|
|
21
|
+
| 集合与语法 | Arrays.asList 后 add · for-each 里增删 · 循环内 String `+=` · 整数除法赋给 double · switch 无 default · finally 里 return · equals/hashCode 不成对 · `YYYY`(周年,跨年那周错一整年) |
|
|
22
|
+
| 持久层 | MyBatis `${}` 拼接(字符串替换,注入入口) |
|
|
23
|
+
| 文档与测试 | Javadoc @throws 写了但方法不抛 · assertEquals 参数顺序反了 · try/fail 断言异常 |
|
|
24
|
+
|
|
25
|
+
这一组与 `dev-java` 技能里的「事务失效八景」「常见坑 TOP」是**同一件事的两面**:
|
|
26
|
+
那边是评审时人要记住的,这边是每次改完代码机器都查一遍的。方法论会忘,机器不会。
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
code_inspect(path, only="framework") # 只看 Spring/MyBatis 用法
|
|
30
|
+
code_inspect(path, only="logic") # 含 Java 语言陷阱
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Python:另有 30 条专属规则(走真 AST,判得最准)
|
|
34
|
+
|
|
35
|
+
JS 与 Java 走的是「掩码 + 括号配对」,而 Python 有标准库 `ast`——引擎早就把整棵语法树
|
|
36
|
+
解析好了。所以这一组能做**正则根本无从下手**的判断:类型层级、作用域、名字绑定。
|
|
37
|
+
|
|
38
|
+
| 分组 | 抓什么 |
|
|
39
|
+
|---|---|
|
|
40
|
+
| 共享可变 | 类属性是 list/dict(**所有实例共享同一个**)· dataclass 可变默认 · 可变默认参数 |
|
|
41
|
+
| 闭包与迭代 | 循环里定义的函数捕获循环变量(全都拿到最后一次的值)· 遍历时增删同一个容器(会跳过元素) |
|
|
42
|
+
| 异常 | **`except` 顺序错**(父类在前,子类分支永远执行不到)· 宽捕获直接 pass · 窄捕获无说明 · `raise` 不带 `from`(丢原始堆栈)· finally 里 return |
|
|
43
|
+
| 语义陷阱 | `is` 比较字面量(靠对象缓存,时对时错)· `== None/True` · `type(x) == T` · 遮蔽内置名 · 生产代码用 `assert`(`-O` 会整行删掉) |
|
|
44
|
+
| 环境相关 | `open()` 不写 encoding(**Windows 默认 GBK**,开发机永远复现不了)· `datetime.now()` 不带时区 · `Decimal(0.1)` 浮点构造 · `os.path.join` 后段绝对路径会吞掉前缀 |
|
|
45
|
+
| 异步 | async 函数里 `time.sleep`/`requests`/`open` —— 事件循环整个卡住,同循环的协程一起停 |
|
|
46
|
+
| pandas | **链式赋值 `df[a][b]=x`**(改到副本,只给个 warning)· 读表不指定 dtype(前导零丢失、长编号变科学计数法且精度已丢)· `df.append`(2.0 已移除)· `iterrows` · `inplace=True` |
|
|
47
|
+
| 安全 | `subprocess(shell=True)` · `yaml.load` 无 Loader · `pickle.loads` |
|
|
48
|
+
|
|
49
|
+
pandas 这一组的事故形态特别值得留意:**不改变外观、只改变数字**。
|
|
50
|
+
表格看上去一切正常,只是数对不上——而人盯着屏幕是看不出来的。
|
|
51
|
+
|
|
52
|
+
这一组同样与 `dev-python` 技能的「常见坑 TOP」对齐:那边是评审时人要记住的,这边是机器每次都查。
|
|
53
|
+
|
|
54
|
+
## JS / TS / Vue:另有 20 条专属规则
|
|
55
|
+
|
|
56
|
+
JS 这边只有「掩码 + 括号配对」,没有真 AST(托管 Python 里没有可靠的 JS 解析器,
|
|
57
|
+
为体检去装一个等于让它在最需要时先卡几分钟)。所以判据一律取**确定形态,拿不准不报**。
|
|
58
|
+
|
|
59
|
+
| 分组 | 抓什么 |
|
|
60
|
+
|---|---|
|
|
61
|
+
| 异步 | **`.forEach(async …)`**(forEach 不等 Promise,循环"瞬间跑完")· 循环内 await 串行 |
|
|
62
|
+
| 空值 | **`a?.b.c`**——可选链只保护了第一层,后半段照样抛 TypeError(最常见的误用:它给人"已经防过空"的错觉) |
|
|
63
|
+
| 经典陷阱 | `x === NaN`(永远 false)· `for...in` 遍历数组(拿到字符串下标 + 原型链属性)· 排数字忘了比较函数 · `delete arr[i]`(留空洞、length 不变)· `JSON.parse` 无防护 · `parseInt` 无基数 · 松散比较 |
|
|
64
|
+
| TS 类型逃逸 | `as any`(这一行之后类型检查全失效)· `@ts-ignore` 无理由 · 函数返回 `any`(顺着调用链扩散) |
|
|
65
|
+
| **Vue 模板** | `v-for` 无 `:key`(列表变动时输入框内容、勾选状态串到别的行)· `:key="index"`(等于没给 key)· **`v-if` 与 `v-for` 同元素**(Vue 3 里 v-if 优先级更高,循环变量还不存在)· `v-html`(XSS) |
|
|
66
|
+
| Vue 脚本 | 直接改 props(单向数据流,父组件重渲染会覆盖回去)· 解构 `reactive`(响应性当场断掉) |
|
|
67
|
+
|
|
68
|
+
Vue 的一半问题在 `<template>` 里。改造前解析器只抠 `<script>`,template 被整个丢弃——
|
|
69
|
+
那时 `v-for` 少了 `:key` 这类最常见的问题**一条也查不到,而报告照样显示「已体检」**。
|
|
70
|
+
|
|
71
|
+
这一组与 `dev-frontend` 技能对齐:那边写着「`as any` 评审必问」「列表 key 用稳定 id 禁 index」,
|
|
72
|
+
这边是每次改完代码机器都查一遍。
|
|
73
|
+
|
|
74
|
+
## C#:另有 20 条专属规则
|
|
75
|
+
|
|
76
|
+
与 Java 同走「掩码 + 括号配对」,但坑不一样——而且好几个属于**写错了反而更像对的**:
|
|
77
|
+
|
|
78
|
+
| 分组 | 抓什么 |
|
|
79
|
+
|---|---|
|
|
80
|
+
| 异步 | **`async void`**(异常无人能接,直接终结进程;比 `async Task` 还短)· **`.Result` / `.Wait()`**(有同步上下文时必然死锁,而控制台和单测里一切正常)· `async` 却没有 `await` |
|
|
81
|
+
| 异常 | **`throw ex;`**(堆栈从这一行重新开始,原始位置丢失;正确写法 `throw;` 反而更短) |
|
|
82
|
+
| 时间与精度 | `DateTime.Now`(换时区/夏令时全错)· `double` 算金额(应 `decimal`)· `Parse` 不带 IFormatProvider(德法区域小数点是逗号) |
|
|
83
|
+
| 并发 | `lock(this)` / `lock(typeof(X))` / `lock("串")`(锁对象公开,外部也能锁)· `static Random`(非线程安全,并发下一起返回 0)· 事件订阅无退订 |
|
|
84
|
+
| LINQ | **延迟查询被多次枚举**(每次都重跑,EF 上就是重复发 SQL)· `.Count() > 0`(应 `.Any()`) |
|
|
85
|
+
| 资源 | `FileStream`/`SqlConnection` 等不走 `using` |
|
|
86
|
+
| EF / DI | 循环里查库(N+1)· **DbContext 注册成 Singleton**(非线程安全 + 变更跟踪只增不减)· `FromSqlRaw` 拼接 · 手 `new HttpClient()` |
|
|
87
|
+
| 测试 | **`async void` 测试方法**(框架不等它,断言没跑用例就绿了) |
|
|
88
|
+
|
|
89
|
+
与 `dev-csharp` 技能的「常见坑 TOP / DI 生命周期 / async 全链」对齐。
|
|
90
|
+
|
|
91
|
+
> **一条必须说明的局限**:本仓库没有 C# 代码。
|
|
92
|
+
> 前四轮的误报都是在真实项目上治出来的(Java 在 836 个文件上从 237 条假必修降到个位数,
|
|
93
|
+
> Python 在 94 个文件上从 136 条降到 19 条),这一组只经过压测台的合规样本验证。
|
|
94
|
+
> 判据因此刻意取得比 Java 那组更保守——拿不准一律不报。
|
|
95
|
+
> 接到真实 C# 项目后建议先跑一遍 `code_inspect`,按前几轮的方式治一次误报。
|
|
96
|
+
|
|
97
|
+
## 为什么各套的"深度"不一样
|
|
98
|
+
|
|
99
|
+
| 语言 | 解析方式 | 因此敢做的判断 |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| Python | 标准库 `ast`,真语法树 | 类型层级(`ValueError ⊂ Exception`)、作用域、名字绑定 |
|
|
102
|
+
| Java | 掩码 + 括号配对 + 注解/字段/throws 提取 | 注解落在哪个修饰符上、字段类型、方法声明抛什么 |
|
|
103
|
+
| JS/TS/Vue | 掩码 + 括号配对 | 只取**确定形态**(`.forEach(async`、`?.b.c`、`=== NaN`),拿不准不报 |
|
|
104
|
+
| C# | 掩码 + 括号配对 + `[Attribute]`/字段提取 | 同 Java 的形态,但判据更保守(无真实语料验证误报) |
|
|
105
|
+
|
|
106
|
+
托管 Python 里没有可靠的 JS/Java 解析器,而为了体检去装一个,
|
|
107
|
+
等于让体检在最需要它的时候先卡几分钟——那样就不会有人真的去用它。
|
|
Binary file
|
|
Binary file
|