@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,239 @@
|
|
|
1
|
+
# 测试计划:先算清「该测什么」,再让人(或模型)去写「怎么测」。
|
|
2
|
+
#
|
|
3
|
+
# ── 为什么要有这一步 ──
|
|
4
|
+
# 直接说「给这个文件补单测」,产出通常是一堆「调一次、断言不为 null」的用例:
|
|
5
|
+
# 覆盖率数字上去了,缺陷一个也拦不住。原因是写的人(模型也一样)没有先回答
|
|
6
|
+
# **这个函数到底有几条路、每条路的边界在哪**,就开始写了。
|
|
7
|
+
#
|
|
8
|
+
# 这里把那部分算出来,交给写测试的人:
|
|
9
|
+
# · 哪些对外函数压根没被测试提到过(按圈复杂度排序——分支多的先补,性价比最高)
|
|
10
|
+
# · 每个函数有几条独立路径(圈复杂度就是下界)
|
|
11
|
+
# · 每个参数该试哪些边界(按名字与用法推断:空、零、负、超长、null)
|
|
12
|
+
# · 有没有异常路径、是不是异步(异步失败是最常漏的一类)
|
|
13
|
+
# · 这个项目的测试放哪、叫什么名、用什么框架——照着现有约定放,不要自创一套
|
|
14
|
+
#
|
|
15
|
+
# 这份计划不替人做判断,它只保证「该想到的都摆在桌面上了」。
|
|
16
|
+
|
|
17
|
+
import json
|
|
18
|
+
import os
|
|
19
|
+
import re
|
|
20
|
+
import sys
|
|
21
|
+
|
|
22
|
+
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
23
|
+
import code_check as C # noqa: E402
|
|
24
|
+
import code_lens as L # noqa: E402
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# 按参数名推断该试的边界值。名字是最便宜也最可靠的线索——
|
|
28
|
+
# 叫 ids 的参数几乎一定要试空数组,叫 amount 的几乎一定要试负数和零。
|
|
29
|
+
# 顺序敏感:最具体的放前面,短词一律加锚定。
|
|
30
|
+
# 反面教材就在这张表自己的历史里——`ts` 不加边界会命中 opts / results / counts / hosts,
|
|
31
|
+
# 于是一个叫 opts 的参数被推荐去测「时区边界」。名字推断一旦开始乱猜,
|
|
32
|
+
# 整份计划的可信度就没了:人会把边界建议全部当噪声跳过。
|
|
33
|
+
_PARAM_HINTS = [
|
|
34
|
+
(r'(^|_)(opts?|options?|config|conf|params?|ctx|context|settings?)$',
|
|
35
|
+
['空对象', '缺必填字段', '多余字段', '未传(走默认值)']),
|
|
36
|
+
# 只收**复数**:`item` 是一个元素,`items` 才是集合;`id` 是一个标识,`ids` 才是列表。
|
|
37
|
+
# 把 `ids?` 写成可选复数,`id` 就会被推荐去测「空数组」——一条明显不对的建议
|
|
38
|
+
# 足以让人开始怀疑整份计划。
|
|
39
|
+
(r'(^|_)(ids|list|items|rows|arr|array|elements|records|files|orders|entries|'
|
|
40
|
+
r'users|nodes|tasks|jobs|results|docs|paths|keys|values|batch|collection)$',
|
|
41
|
+
['空数组', '单元素', '大量元素(看有没有 O(n²))', '含 null 的元素']),
|
|
42
|
+
(r'(^|_)(callback|cb|fn|handler|func|hook|listener)$',
|
|
43
|
+
['正常返回', '抛异常', '返回 Promise 且 reject']),
|
|
44
|
+
(r'(^|_)(flag|enabled?|is[A-Z_]\w*|has[A-Z_]\w*|should\w*|dry_?run)$',
|
|
45
|
+
['true', 'false', '未传(默认值)']),
|
|
46
|
+
(r'(amount|price|money|fee|cost|balance|金额|价格|salary|tax)',
|
|
47
|
+
['0', '负数', '小数精度边界(0.1+0.2)', '极大值(溢出)']),
|
|
48
|
+
(r'(count|num|size|length|limit|offset|page|index|total|qty|max|min|depth|retries)',
|
|
49
|
+
['0', '1', '负数', '超过上界的值']),
|
|
50
|
+
(r'(date|datetime|timestamp|deadline|expires?|expiry|created|updated|'
|
|
51
|
+
r'(^|_)(ts|time|start|end|since|until)$)',
|
|
52
|
+
['过去的时间', '未来的时间', '时区边界', '非法格式']),
|
|
53
|
+
(r'(name|title|text|msg|message|content|desc|description|label|key|query|'
|
|
54
|
+
r'(^|_)(str|url|uri|path|dir|file)$)',
|
|
55
|
+
['空串', '只有空白', '超长', '含特殊字符/中文/emoji']),
|
|
56
|
+
# 驼峰也要认:userId / orderNo / traceId 在真实代码里比 user_id 更常见
|
|
57
|
+
(r'(^|_)(id|uuid|code|no|sn|token|hash)$|[a-z](Id|ID|Uuid|UUID|Code|No|Sn|Token|Hash)$',
|
|
58
|
+
['不存在的值', '空值', '类型不符(数字 vs 字符串)']),
|
|
59
|
+
(r'(rate|ratio|percent|factor|weight|score)',
|
|
60
|
+
['0', '1', '负数', '大于 1 的比例(是不是当百分比传错了)']),
|
|
61
|
+
]
|
|
62
|
+
_DEFAULT_HINTS = ['正常值', 'null / undefined', '类型不符的值']
|
|
63
|
+
|
|
64
|
+
_RE_THROW = re.compile(r'\b(throw|raise)\b')
|
|
65
|
+
_RE_EXTERNAL = re.compile(
|
|
66
|
+
r'\b(fetch|axios|request|http|db\.|query|execute|readFile|writeFile|exec|spawn|'
|
|
67
|
+
r'open\(|requests\.|session\.|repo\.|mapper\.|client\.)')
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _hints_for(param):
|
|
71
|
+
bare = param.lstrip('*').strip()
|
|
72
|
+
for pat, hints in _PARAM_HINTS:
|
|
73
|
+
if re.search(pat, bare, re.I):
|
|
74
|
+
return hints
|
|
75
|
+
return list(_DEFAULT_HINTS)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def detect_framework(root):
|
|
79
|
+
"""探测这个项目已经在用什么测试框架、测试放在哪、叫什么名。
|
|
80
|
+
|
|
81
|
+
照着现有约定放,比「按最佳实践新建一个 tests/ 目录」有用得多——
|
|
82
|
+
后者会造出第二套约定,而两套约定意味着以后每个人都要问一次「放哪儿」。
|
|
83
|
+
"""
|
|
84
|
+
info = {'framework': None, 'dirs': [], 'naming': None, 'runner': None}
|
|
85
|
+
pkg = os.path.join(root, 'package.json')
|
|
86
|
+
if os.path.exists(pkg):
|
|
87
|
+
try:
|
|
88
|
+
with open(pkg, encoding='utf-8') as f:
|
|
89
|
+
data = json.load(f)
|
|
90
|
+
deps = {**data.get('dependencies', {}), **data.get('devDependencies', {})}
|
|
91
|
+
for name in ('vitest', 'jest', 'mocha', 'ava', 'tap', 'jasmine'):
|
|
92
|
+
if name in deps:
|
|
93
|
+
info['framework'] = name
|
|
94
|
+
break
|
|
95
|
+
script = (data.get('scripts') or {}).get('test') or ''
|
|
96
|
+
info['runner'] = script or None
|
|
97
|
+
if not info['framework'] and 'node --test' in script:
|
|
98
|
+
info['framework'] = 'node:test(Node 内置)'
|
|
99
|
+
except (OSError, ValueError):
|
|
100
|
+
# package.json 读不到或格式坏了:探测不出框架而已,下面还有按文件存在性的兜底判断。
|
|
101
|
+
# 这里不该抛——测试计划是辅助信息,不能因为一个坏的清单文件就整份出不来。
|
|
102
|
+
pass
|
|
103
|
+
if not info['framework']:
|
|
104
|
+
if os.path.exists(os.path.join(root, 'pytest.ini')) or os.path.exists(os.path.join(root, 'pyproject.toml')):
|
|
105
|
+
info['framework'] = 'pytest'
|
|
106
|
+
elif os.path.exists(os.path.join(root, 'pom.xml')):
|
|
107
|
+
info['framework'] = 'JUnit'
|
|
108
|
+
elif os.path.exists(os.path.join(root, 'build.gradle')) or \
|
|
109
|
+
os.path.exists(os.path.join(root, 'build.gradle.kts')):
|
|
110
|
+
info['framework'] = 'JUnit(Gradle)'
|
|
111
|
+
# 现有测试文件在哪、怎么命名
|
|
112
|
+
samples = []
|
|
113
|
+
for p in L.walk_files(root, limit=2000):
|
|
114
|
+
if L.is_test_path(p):
|
|
115
|
+
samples.append(os.path.relpath(p, root))
|
|
116
|
+
if len(samples) >= 8:
|
|
117
|
+
break
|
|
118
|
+
info['dirs'] = sorted({os.path.dirname(s) or '.' for s in samples})[:5]
|
|
119
|
+
if samples:
|
|
120
|
+
base = os.path.basename(samples[0])
|
|
121
|
+
for pat, desc in ((r'\.test\.[cm]?[jt]sx?$', '<模块名>.test.js'),
|
|
122
|
+
(r'\.spec\.[cm]?[jt]sx?$', '<模块名>.spec.js'),
|
|
123
|
+
(r'^test_', 'test_<模块名>.py'),
|
|
124
|
+
(r'_test\.py$', '<模块名>_test.py'),
|
|
125
|
+
(r'Tests?\.java$', '<类名>Test.java')):
|
|
126
|
+
if re.search(pat, base):
|
|
127
|
+
info['naming'] = desc
|
|
128
|
+
break
|
|
129
|
+
info['naming'] = info['naming'] or base
|
|
130
|
+
info['examples'] = samples[:3]
|
|
131
|
+
return info
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def plan_for_file(lens, tested_names):
|
|
135
|
+
"""给一个文件算出测试计划。"""
|
|
136
|
+
items = []
|
|
137
|
+
for u in lens.functions():
|
|
138
|
+
if not u.is_public or u.name in ('(匿名)', 'constructor'):
|
|
139
|
+
continue
|
|
140
|
+
covered = u.name in tested_names
|
|
141
|
+
paths = max(1, u.complexity)
|
|
142
|
+
cases = []
|
|
143
|
+
for p in u.params:
|
|
144
|
+
if p in ('self', 'cls'):
|
|
145
|
+
continue
|
|
146
|
+
cases.append({'param': p, 'boundaries': _hints_for(p)})
|
|
147
|
+
risks = []
|
|
148
|
+
if _RE_THROW.search(u.body):
|
|
149
|
+
risks.append('有显式抛异常的分支 —— 要有一个用例断言它**确实抛了**,且抛的是预期类型')
|
|
150
|
+
if u.is_async:
|
|
151
|
+
risks.append('异步函数 —— 补一个「依赖方 reject / 超时」的失败路径,这是最常漏的一类')
|
|
152
|
+
if _RE_EXTERNAL.search(u.body):
|
|
153
|
+
risks.append('有外部依赖(网络/数据库/文件)—— 需要替身;替身要能模拟失败,不只是成功')
|
|
154
|
+
if u.depth >= 3:
|
|
155
|
+
risks.append(f'嵌套 {u.depth} 层 —— 最内层的分支很容易测不到,单独列一个用例走进去')
|
|
156
|
+
items.append({
|
|
157
|
+
'name': u.label, 'line': u.start, 'covered': covered,
|
|
158
|
+
'complexity': u.complexity, 'min_cases': paths, 'lines': u.lines,
|
|
159
|
+
'params': cases, 'risks': risks,
|
|
160
|
+
})
|
|
161
|
+
items.sort(key=lambda x: (x['covered'], -x['complexity']))
|
|
162
|
+
return items
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def build_plan(paths, root='.'):
|
|
166
|
+
paths = [p for p in paths if os.path.isfile(p)]
|
|
167
|
+
tested, has_tests = C._collect_tested_names(paths)
|
|
168
|
+
if not has_tests:
|
|
169
|
+
# 目标文件里没有测试,但项目别处可能有——扩大一圈再找一次,
|
|
170
|
+
# 否则会把「测试写在 test/ 目录下」的正常项目全部报成「零覆盖」。
|
|
171
|
+
wider = L.walk_files(root, limit=3000)
|
|
172
|
+
tested, has_tests = C._collect_tested_names(wider)
|
|
173
|
+
out = {'framework': detect_framework(root), 'files': [], 'has_tests': has_tests}
|
|
174
|
+
for p in paths:
|
|
175
|
+
if L.is_test_path(p):
|
|
176
|
+
continue
|
|
177
|
+
lens = L.read_lens(p)
|
|
178
|
+
items = plan_for_file(lens, tested)
|
|
179
|
+
if items:
|
|
180
|
+
out['files'].append({'path': os.path.relpath(p, root), 'lang': lens.lang, 'items': items})
|
|
181
|
+
return out
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def render_plan(plan, max_funcs=12):
|
|
185
|
+
fw = plan['framework']
|
|
186
|
+
lines = ['【测试计划】']
|
|
187
|
+
lines.append(f'项目测试约定:框架 {fw["framework"] or "未探测到"}'
|
|
188
|
+
+ (f' · 命令 `{fw["runner"]}`' if fw.get('runner') else '')
|
|
189
|
+
+ (f' · 放在 {"、".join(fw["dirs"])}' if fw.get('dirs') else '')
|
|
190
|
+
+ (f' · 命名 {fw["naming"]}' if fw.get('naming') else ''))
|
|
191
|
+
if fw.get('examples'):
|
|
192
|
+
lines.append(f'参照现有用例的写法:{"、".join(fw["examples"])}(照着它的风格写,不要自创一套约定)')
|
|
193
|
+
if not plan['has_tests']:
|
|
194
|
+
lines.append('⚠ 整个项目没有找到测试文件——这是从零开始,先建立约定(放哪、怎么命名、怎么跑)再写用例。')
|
|
195
|
+
|
|
196
|
+
total = sum(len(f['items']) for f in plan['files'])
|
|
197
|
+
uncovered = [(f, it) for f in plan['files'] for it in f['items'] if not it['covered']]
|
|
198
|
+
lines.append(f'对外函数 {total} 个,其中测试里从未出现过的 {len(uncovered)} 个'
|
|
199
|
+
'(口径是「名字在测试文件里出现过」,是覆盖的下界,不是精确覆盖率)。')
|
|
200
|
+
if not uncovered:
|
|
201
|
+
lines.append('结论:每个对外函数都至少被测试提到过。接下来该看的是**断言强度**而不是覆盖面。')
|
|
202
|
+
return '\n'.join(lines)
|
|
203
|
+
|
|
204
|
+
lines.append('\n按「分支最多的先补」排序:')
|
|
205
|
+
for i, (f, it) in enumerate(uncovered[:max_funcs], 1):
|
|
206
|
+
lines.append(f'\n{i}. `{it["name"]}` {f["path"]}:{it["line"]} '
|
|
207
|
+
f'({it["lines"]} 行,圈复杂度 {it["complexity"]} → **至少 {it["min_cases"]} 个用例**才能覆盖各分支)')
|
|
208
|
+
for risk in it['risks']:
|
|
209
|
+
lines.append(f' ⚠ {risk}')
|
|
210
|
+
if it['params']:
|
|
211
|
+
lines.append(' 参数边界:')
|
|
212
|
+
for p in it['params'][:6]:
|
|
213
|
+
lines.append(f' · {p["param"]}:{"、".join(p["boundaries"])}')
|
|
214
|
+
else:
|
|
215
|
+
lines.append(' 无参数 —— 测它的副作用与返回值,以及被调用两次时是否幂等。')
|
|
216
|
+
if len(uncovered) > max_funcs:
|
|
217
|
+
lines.append(f'\n…… 还有 {len(uncovered) - max_funcs} 个未展开(--json 取全量)。')
|
|
218
|
+
lines.append('\n写完用例后记得跑一遍 code_inspect:断言强度(恒真断言、没有断言的用例、'
|
|
219
|
+
'.only 残留)是另一组规则在管,写测试时最容易顺手留下这几样。')
|
|
220
|
+
return '\n'.join(lines)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def main(argv):
|
|
224
|
+
args = [a for a in argv if not a.startswith('--')]
|
|
225
|
+
flags = {a.split('=')[0]: (a.split('=', 1)[1] if '=' in a else True) for a in argv if a.startswith('--')}
|
|
226
|
+
target = args[0] if args else '.'
|
|
227
|
+
root = os.path.abspath(flags['--root']) if isinstance(flags.get('--root'), str) else (
|
|
228
|
+
target if os.path.isdir(target) else os.path.dirname(os.path.abspath(target)) or '.')
|
|
229
|
+
paths = L.walk_files(target) if os.path.isdir(target) else [target]
|
|
230
|
+
plan = build_plan(paths, root)
|
|
231
|
+
if flags.get('--json'):
|
|
232
|
+
print(json.dumps(plan, ensure_ascii=False))
|
|
233
|
+
else:
|
|
234
|
+
print(render_plan(plan))
|
|
235
|
+
return 0
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
if __name__ == '__main__':
|
|
239
|
+
sys.exit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "code-quality",
|
|
3
|
+
"purpose": "触发行为规格。负样例分两类:**不同词汇**的近邻走词法层(CI 跑),**同词汇不同意图**的近邻标 lexical:false 归行为层——词法打分对后者天然无能为力,硬要它通过只会逼作者往描述里塞噪声词。",
|
|
4
|
+
"cases": [
|
|
5
|
+
{
|
|
6
|
+
"id": "self-check-after-writing",
|
|
7
|
+
"prompt": "刚写完的代码帮我体检一遍,看看有没有空捕获、注释和实现对不上",
|
|
8
|
+
"shouldTrigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "inspect-quality",
|
|
12
|
+
"prompt": "体检一下这个模块的代码质量,注释和单元测试都看看",
|
|
13
|
+
"shouldTrigger": true
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "add-unit-tests",
|
|
17
|
+
"prompt": "给这个文件补单元测试,先说说该测哪些边界",
|
|
18
|
+
"shouldTrigger": true
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "fix-code-smells",
|
|
22
|
+
"prompt": "把代码里残留的 console.log 和测试里的 .only 清理掉",
|
|
23
|
+
"shouldTrigger": true
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "near-miss-explain",
|
|
27
|
+
"prompt": "这段代码是干嘛的,讲讲实现逻辑",
|
|
28
|
+
"shouldTrigger": false,
|
|
29
|
+
"lexical": false,
|
|
30
|
+
"note": "与「自查代码逻辑」共用「代码/逻辑」——同词汇不同意图(讲解 vs 排查),词法层分不开,归行为层评测。"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "near-miss-format",
|
|
34
|
+
"prompt": "帮我把这段代码按 prettier 格式化",
|
|
35
|
+
"shouldTrigger": false,
|
|
36
|
+
"lexical": false,
|
|
37
|
+
"note": "与「代码自查」共用「代码」——格式化是排版不是质量排查;词法层分不开,归行为层。"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "near-miss-write-doc",
|
|
41
|
+
"prompt": "写一份项目的可行性研究报告",
|
|
42
|
+
"shouldTrigger": false
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
@@ -19,6 +19,30 @@ version: 1.0.0
|
|
|
19
19
|
- **测试**:关键路径与边界是否有测试覆盖?改动是否破坏既有测试?
|
|
20
20
|
3. **验证**:能跑测试/编译就跑(run_bash),用事实说话,别只靠推理。
|
|
21
21
|
|
|
22
|
+
## 阻断项(这几条不满足就不是"建议",是不能合)
|
|
23
|
+
|
|
24
|
+
前面的维度检查按严重度排序输出;下面这几条不排序——**任何一条不满足,结论就是"改完再合"**。
|
|
25
|
+
把它们单列,是因为它们都属于「代码本身读起来没问题、但漏了就会出事」的一类,
|
|
26
|
+
逐条问一遍比指望在通读里想起来可靠。
|
|
27
|
+
|
|
28
|
+
1. **四端同源**。改了 `huicai-cli/src` 下的任何模块,同一次改动里必须把三个宿主副本同步过去
|
|
29
|
+
(desktop / vscode / idea 各跑一次 `scripts/sync-core.cjs`)。漏了不会编译失败,
|
|
30
|
+
只会让某一端悄悄跑着上个版本的行为。
|
|
31
|
+
2. **删除必有确认**。任何删除/清空路径(单条、批量、清空全部)都要先弹确认框,不得静默执行。
|
|
32
|
+
3. **新增能力要进清单**。新增写文件的工具必须登记进 `FILE_WRITE_TOOLS`;
|
|
33
|
+
新增出网工具必须登记进入站扫描的名单;新增需审批的动作必须进 `AUTOMATION_TOOLS`。
|
|
34
|
+
这类"登记表"漏登不会报错,只会让那一层保护对新东西静默失效。
|
|
35
|
+
4. **注册了就要能注销**。新增的监听、定时器、子进程、缓存条目,要有对应的清理路径,
|
|
36
|
+
且会话结束/切换时真的会被调用。
|
|
37
|
+
5. **新增散文经过语义评审**。新加的注释、文档、工具描述、报错文案,
|
|
38
|
+
按 [prose-standard](../prose-standard/SKILL.md) 过一遍:契约写全了没有、废话删干净没有。
|
|
39
|
+
自动检查证明不了这一点。
|
|
40
|
+
6. **界面改动带证据**。改了用户看得见的行为,要按
|
|
41
|
+
[gui-change-evidence](../gui-change-evidence/SKILL.md) 附上真实环境的截图或录屏;
|
|
42
|
+
单测绿和界面能用是两件事。
|
|
43
|
+
7. **证据真的跑过**。作者声称跑过的检查,要么有输出可看,要么自己复跑一遍。
|
|
44
|
+
"应该没问题"不是证据。
|
|
45
|
+
|
|
22
46
|
## 输出格式
|
|
23
47
|
- 按 `严重(必须改) / 建议 / 可选` 三档分组;
|
|
24
48
|
- 每条:`文件:行 — 问题一句话 → 具体改法`;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "code-review",
|
|
3
|
+
"purpose": "触发行为规格。负样例分两类:**不同词汇**的近邻走词法层(CI 跑),**同词汇不同意图**的近邻标 lexical:false 归行为层——词法打分对后者天然无能为力,硬要它通过只会逼作者往描述里塞噪声词。",
|
|
4
|
+
"cases": [
|
|
5
|
+
{
|
|
6
|
+
"id": "direct-review",
|
|
7
|
+
"prompt": "帮我审查一下这段代码有没有问题",
|
|
8
|
+
"shouldTrigger": true
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "english-review",
|
|
12
|
+
"prompt": "review 一下我这次的改动",
|
|
13
|
+
"shouldTrigger": true
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "pre-commit",
|
|
17
|
+
"prompt": "提交前自查一下质量,重点看边界和安全",
|
|
18
|
+
"shouldTrigger": true
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "near-miss-format",
|
|
22
|
+
"prompt": "把这段代码格式化一下",
|
|
23
|
+
"shouldTrigger": false,
|
|
24
|
+
"lexical": false,
|
|
25
|
+
"note": "与「审查代码」共用「代码/这段」——同词汇不同意图,词法层分不开;路由层已验证它不会落到 code-review。"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "near-miss-explain",
|
|
29
|
+
"prompt": "这段代码是干嘛的,讲讲逻辑",
|
|
30
|
+
"shouldTrigger": false,
|
|
31
|
+
"lexical": false,
|
|
32
|
+
"note": "与「审查代码」共用「代码/这段」等词,词法层分不开——这是语义近邻,归行为层评测;此处只保留意图记录。"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "commit-and-pr",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "帮我写个规范的提交信息",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "总结本次改动,开个 PR 写描述",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "commit message 按 Conventional Commits 怎么写",
|
|
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": "评审一下这段代码有没有 bug",
|
|
28
|
+
"shouldTrigger": false
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "content-creation",
|
|
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": "corporate-governance",
|
|
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": "crawl-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": "customer-service",
|
|
3
|
+
"cases": [
|
|
4
|
+
{
|
|
5
|
+
"id": "pos-1",
|
|
6
|
+
"prompt": "客诉升级了,话术怎么说",
|
|
7
|
+
"shouldTrigger": true
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"id": "pos-2",
|
|
11
|
+
"prompt": "工单数据分析和 NPS 满意度怎么做",
|
|
12
|
+
"shouldTrigger": true
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "pos-3",
|
|
16
|
+
"prompt": "客户反馈整理成 VOC 报告,顺便生成 FAQ",
|
|
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": "data-analysis",
|
|
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": "这个 csv 统计一下",
|
|
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
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: data-chain
|
|
3
|
-
description:
|
|
3
|
+
description: 数据技能链总控(口径治理→加工分析→指标看板→汇报自动化全链→技能路由与端到端工作流)。当诉求落在指标口径与数据治理层面("新指标从定义到上线""两个报表口径对不齐""指标体系怎么搭""数据质量谁负责")或不确定用哪个数据技能时先载入。
|
|
4
4
|
version: 1.0.0
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "data-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": "data-governance",
|
|
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": "data-report-pro",
|
|
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
|
+
}
|