dsh-crwu-workbench 0.0.10
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/CHANGELOG.md +1516 -0
- package/LICENSE +26 -0
- package/README.en.md +204 -0
- package/README.md +521 -0
- package/SECURITY.md +39 -0
- package/bin/darwin-arm64/crwu +0 -0
- package/bin/darwin-arm64/dws +0 -0
- package/bin/darwin-arm64/ossutil +0 -0
- package/bin/manifest.json +82 -0
- package/bin/win32-x64/crwu.exe +0 -0
- package/bin/win32-x64/dws.exe +4 -0
- package/bin/win32-x64/ossutil.exe +0 -0
- package/common/skills/.synced.json +8 -0
- package/common/skills/crwu-dws/SKILL.md +208 -0
- package/common/skills/crwu-dws/references/00-/347/233/256/345/275/225/345/277/253/347/205/247schema.md +113 -0
- package/common/skills/crwu-dws/references/01-/345/256/241/346/240/270/344/270/213/350/275/275/344/270/216manifest/350/247/204/350/214/203.md +115 -0
- package/common/skills/crwu-dws/references/02-/347/274/223/345/255/230/344/270/216/345/205/234/345/272/225/346/237/245/346/211/276/350/247/204/350/214/203.md +119 -0
- package/common/skills/crwu-dws/scripts/test_dws_source_contract.py +493 -0
- package/common/skills/crwu-h3yun-login/SKILL.md +130 -0
- package/common/skills/crwu-h3yun-query/SKILL.md +192 -0
- package/config/crwu-workbench.yml +26 -0
- package/cordis.patch.yml +46 -0
- package/lib/client.js +10346 -0
- package/lib/index.js +11584 -0
- package/package.json +119 -0
- package/scripts/prepare.mjs +59 -0
- package/skills/README.md +26 -0
- package/skills/crwu/crwu-audit/SKILL.md +152 -0
- package/skills/crwu/crwu-audit/references/00-input-and-route-profile.md +232 -0
- package/skills/crwu/crwu-audit/references/01-report-id-resolution.md +13 -0
- package/skills/crwu/crwu-audit/references/02-scope-classification.md +25 -0
- package/skills/crwu/crwu-audit/references/03-asset-classification.md +27 -0
- package/skills/crwu/crwu-audit/references/04-business-classification.md +63 -0
- package/skills/crwu/crwu-audit/references/05-method-classification.md +66 -0
- package/skills/crwu/crwu-audit/references/06-overlay-classification.md +42 -0
- package/skills/crwu/crwu-audit/references/07-skill-registry.md +57 -0
- package/skills/crwu/crwu-audit/references/08-union-dispatch-rules.md +142 -0
- package/skills/crwu/crwu-audit/references/09-review-risk-classification.md +85 -0
- package/skills/crwu/crwu-audit/references/10-capability-gap-proposal.md +68 -0
- package/skills/crwu/crwu-audit/references/11-html-delivery-spec.md +881 -0
- package/skills/crwu/crwu-audit/references/12-leaf-common-contract.md +202 -0
- package/skills/crwu/crwu-audit/references/13-dingtalk-result-publish.md +88 -0
- package/skills/crwu/crwu-audit/references/14-orchestration-workflow.md +52 -0
- package/skills/crwu/crwu-audit/references/99-maintenance.md +62 -0
- package/skills/crwu/crwu-audit/scripts/README.md +157 -0
- package/skills/crwu/crwu-audit/scripts/audit_delivery.py +2736 -0
- package/skills/crwu/crwu-audit/scripts/audit_result.schema.json +1659 -0
- package/skills/crwu/crwu-audit/scripts/examples/audit-result.sample.json +739 -0
- package/skills/crwu/crwu-audit/scripts/fetch_review_records.py +85 -0
- package/skills/crwu/crwu-audit/scripts/media_extract.py +513 -0
- package/skills/crwu/crwu-audit/scripts/prepare_materials.py +1252 -0
- package/skills/crwu/crwu-audit/scripts/test_audit_delivery.py +1678 -0
- package/skills/crwu/crwu-audit/scripts/test_audit_multiaxis_router.py +1339 -0
- package/skills/crwu/crwu-audit/scripts/test_fetch_review_records.py +77 -0
- package/skills/crwu/crwu-audit/scripts/test_media_extract.py +332 -0
- package/skills/crwu/crwu-audit/scripts/test_prepare_materials.py +1081 -0
- package/skills/crwu/crwu-audit/template/audit-report.html +435 -0
- package/skills/crwu/crwu-audit-asset-asset-group-goodwill/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/00-applicability.md +28 -0
- package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/01-kb-assembly.md +31 -0
- package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/02-review-focus.md +21 -0
- package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-debt/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-debt/references/00-applicability.md +40 -0
- package/skills/crwu/crwu-audit-asset-debt/references/01-kb-assembly.md +41 -0
- package/skills/crwu/crwu-audit-asset-debt/references/02-review-focus.md +54 -0
- package/skills/crwu/crwu-audit-asset-debt/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-enterprise-value/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-enterprise-value/references/00-applicability.md +31 -0
- package/skills/crwu/crwu-audit-asset-enterprise-value/references/01-kb-assembly.md +35 -0
- package/skills/crwu/crwu-audit-asset-enterprise-value/references/02-review-focus.md +33 -0
- package/skills/crwu/crwu-audit-asset-enterprise-value/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-equipment/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-equipment/references/00-applicability.md +40 -0
- package/skills/crwu/crwu-audit-asset-equipment/references/01-kb-assembly.md +39 -0
- package/skills/crwu/crwu-audit-asset-equipment/references/02-review-focus.md +52 -0
- package/skills/crwu/crwu-audit-asset-equipment/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-intangible/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-intangible/references/00-applicability.md +36 -0
- package/skills/crwu/crwu-audit-asset-intangible/references/01-kb-assembly.md +40 -0
- package/skills/crwu/crwu-audit-asset-intangible/references/02-review-focus.md +68 -0
- package/skills/crwu/crwu-audit-asset-intangible/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-inventory/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-inventory/references/00-applicability.md +28 -0
- package/skills/crwu/crwu-audit-asset-inventory/references/01-kb-assembly.md +31 -0
- package/skills/crwu/crwu-audit-asset-inventory/references/02-review-focus.md +21 -0
- package/skills/crwu/crwu-audit-asset-inventory/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-mining-right/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-mining-right/references/00-applicability.md +31 -0
- package/skills/crwu/crwu-audit-asset-mining-right/references/01-kb-assembly.md +35 -0
- package/skills/crwu/crwu-audit-asset-mining-right/references/02-review-focus.md +33 -0
- package/skills/crwu/crwu-audit-asset-mining-right/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-other/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-other/references/00-applicability.md +28 -0
- package/skills/crwu/crwu-audit-asset-other/references/01-kb-assembly.md +31 -0
- package/skills/crwu/crwu-audit-asset-other/references/02-review-focus.md +21 -0
- package/skills/crwu/crwu-audit-asset-other/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-portfolio/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-portfolio/references/00-applicability.md +28 -0
- package/skills/crwu/crwu-audit-asset-portfolio/references/01-kb-assembly.md +31 -0
- package/skills/crwu/crwu-audit-asset-portfolio/references/02-review-focus.md +21 -0
- package/skills/crwu/crwu-audit-asset-portfolio/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-realestate/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-realestate/references/00-applicability.md +43 -0
- package/skills/crwu/crwu-audit-asset-realestate/references/01-kb-assembly.md +75 -0
- package/skills/crwu/crwu-audit-asset-realestate/references/02-review-focus.md +93 -0
- package/skills/crwu/crwu-audit-asset-realestate/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-scrap-materials/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-scrap-materials/references/00-applicability.md +28 -0
- package/skills/crwu/crwu-audit-asset-scrap-materials/references/01-kb-assembly.md +31 -0
- package/skills/crwu/crwu-audit-asset-scrap-materials/references/02-review-focus.md +21 -0
- package/skills/crwu/crwu-audit-asset-scrap-materials/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-asset-transport-equipment/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-asset-transport-equipment/references/00-applicability.md +31 -0
- package/skills/crwu/crwu-audit-asset-transport-equipment/references/01-kb-assembly.md +35 -0
- package/skills/crwu/crwu-audit-asset-transport-equipment/references/02-review-focus.md +33 -0
- package/skills/crwu/crwu-audit-asset-transport-equipment/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-asset-operation/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-asset-operation/references/00-applicability.md +30 -0
- package/skills/crwu/crwu-audit-biz-asset-operation/references/01-kb-assembly.md +32 -0
- package/skills/crwu/crwu-audit-biz-asset-operation/references/02-review-focus.md +42 -0
- package/skills/crwu/crwu-audit-biz-asset-operation/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-consulting-review/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-consulting-review/references/00-applicability.md +30 -0
- package/skills/crwu/crwu-audit-biz-consulting-review/references/01-kb-assembly.md +32 -0
- package/skills/crwu/crwu-audit-biz-consulting-review/references/02-review-focus.md +40 -0
- package/skills/crwu/crwu-audit-biz-consulting-review/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-financial-reporting/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-financial-reporting/references/00-applicability.md +41 -0
- package/skills/crwu/crwu-audit-biz-financial-reporting/references/01-kb-assembly.md +40 -0
- package/skills/crwu/crwu-audit-biz-financial-reporting/references/02-review-focus.md +64 -0
- package/skills/crwu/crwu-audit-biz-financial-reporting/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-financing-debt/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-financing-debt/references/00-applicability.md +31 -0
- package/skills/crwu/crwu-audit-biz-financing-debt/references/01-kb-assembly.md +34 -0
- package/skills/crwu/crwu-audit-biz-financing-debt/references/02-review-focus.md +47 -0
- package/skills/crwu/crwu-audit-biz-financing-debt/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-investment-capital/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-investment-capital/references/00-applicability.md +31 -0
- package/skills/crwu/crwu-audit-biz-investment-capital/references/01-kb-assembly.md +34 -0
- package/skills/crwu/crwu-audit-biz-investment-capital/references/02-review-focus.md +47 -0
- package/skills/crwu/crwu-audit-biz-investment-capital/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/00-applicability.md +30 -0
- package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/01-kb-assembly.md +32 -0
- package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/02-review-focus.md +40 -0
- package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-tax-history/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-tax-history/references/00-applicability.md +29 -0
- package/skills/crwu/crwu-audit-biz-tax-history/references/01-kb-assembly.md +30 -0
- package/skills/crwu/crwu-audit-biz-tax-history/references/02-review-focus.md +33 -0
- package/skills/crwu/crwu-audit-biz-tax-history/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-biz-transaction-disposal/SKILL.md +38 -0
- package/skills/crwu/crwu-audit-biz-transaction-disposal/references/00-applicability.md +31 -0
- package/skills/crwu/crwu-audit-biz-transaction-disposal/references/01-kb-assembly.md +34 -0
- package/skills/crwu/crwu-audit-biz-transaction-disposal/references/02-review-focus.md +47 -0
- package/skills/crwu/crwu-audit-biz-transaction-disposal/references/03-common-contract.md +202 -0
- package/skills/crwu/crwu-audit-datacheck/SKILL.md +59 -0
- package/skills/crwu/crwu-audit-datacheck/references/00-KB/350/243/205/351/205/215/350/241/250.md +25 -0
- package/skills/crwu/crwu-audit-datacheck/references/01-runtime-and-check-catalog.md +139 -0
- package/skills/crwu/crwu-audit-datacheck/scripts/recalc_check.py +521 -0
- package/skills/crwu/crwu-audit-datacheck/scripts/test_recalc_check.py +419 -0
- package/skills/crwu/crwu-audit-datacheck/scripts/test_skill_self_containment.py +44 -0
- package/skills/crwu/crwu-audit-external-data/SKILL.md +73 -0
- package/skills/crwu/crwu-audit-external-data/references/00-KB/350/243/205/351/205/215/350/241/250.md +38 -0
- package/skills/crwu/crwu-audit-external-data/references/01-connector-access.md +116 -0
- package/skills/crwu/crwu-audit-external-data/references/02-verification-workflow.md +78 -0
- package/skills/crwu/crwu-audit-external-data/scripts/connector_probe.py +374 -0
- package/skills/crwu/crwu-audit-external-data/scripts/test_connector_probe.py +264 -0
- package/skills/crwu/crwu-audit-output-filter/SKILL.md +34 -0
- package/skills/crwu/crwu-audit-output-filter/references/00-applicability.md +7 -0
- package/skills/crwu/crwu-audit-output-filter/references/01-kb-assembly.md +11 -0
- package/skills/crwu/crwu-audit-output-filter/references/02-review-focus.md +25 -0
- package/skills/crwu/crwu-audit-public-general-standards/SKILL.md +46 -0
- package/skills/crwu/crwu-audit-public-general-standards/references/00-applicability.md +41 -0
- package/skills/crwu/crwu-audit-public-general-standards/references/01-kb-assembly.md +66 -0
- package/skills/crwu/crwu-audit-public-general-standards/references/02-review-focus.md +111 -0
- package/skills/crwu/crwu-audit-public-general-standards/references/03-execution-contract.md +89 -0
- package/skills/crwu/crwu-dev-audit-optimize/SKILL.md +98 -0
- package/skills/crwu/crwu-dev-audit-optimize/references/00-/344/274/230/345/214/226/350/247/204/350/214/203/344/270/216/346/226/207/344/273/266/350/220/275/347/202/271.md +132 -0
- package/skills/crwu/crwu-dev-audit-optimize/references/01-/345/217/215/351/246/210/345/256/232/344/275/215/344/270/216/347/224/273/345/203/217/346/265/201/347/250/213.md +108 -0
- package/skills/crwu/crwu-dev-audit-optimize/references/02-/346/226/271/346/241/210/346/250/241/346/235/277/344/270/216/347/241/256/350/256/244/351/227/250/347/246/201.md +92 -0
- package/skills/crwu/crwu-dev-audit-optimize/references/03-AI/344/272/272/345/267/245/345/267/256/350/267/235/345/210/206/346/236/220/346/265/201/347/250/213.md +95 -0
- package/skills/crwu/crwu-dev-audit-optimize/scripts/examples/gap-analysis.sample.json +116 -0
- package/skills/crwu/crwu-dev-audit-optimize/scripts/gap_analysis.schema.json +33 -0
- package/skills/crwu/crwu-dev-audit-optimize/scripts/gap_analysis_delivery.py +475 -0
- package/skills/crwu/crwu-dev-audit-optimize/scripts/test_gap_analysis_delivery.py +855 -0
- package/skills/crwu/crwu-dev-audit-optimize/template/NOTICE.echarts.txt +7 -0
- package/skills/crwu/crwu-dev-audit-optimize/template/echarts.min.js +45 -0
- package/skills/crwu/crwu-dev-audit-optimize/template/gap-analysis-report.html +71 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/SKILL.md +74 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/00-responsibility-and-modes.md +62 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/01-kb-source-discovery.md +89 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/02-child-skill-contract.md +99 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/03-review-item-execution-contract.md +51 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/04-registry-and-mapping-update.md +73 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/05-validation-and-delivery.md +127 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/06-live-routing-reconciliation.md +136 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/references/07-kb-skill-map.md +411 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/README.md +200 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/check_audit_skill_mappings.py +2477 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/kb_tool.py +577 -0
- package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/test_audit_skill_maintainer.py +5097 -0
- package/skills/dws/LICENSE +178 -0
- package/skills/dws/NOTICE +17 -0
- package/skills/dws/dingtalk-aisearch/SKILL.md +83 -0
- package/skills/dws/dingtalk-aisearch/references/aisearch.md +249 -0
- package/skills/dws/dingtalk-aisearch/references/intent-guide.md +15 -0
- package/skills/dws/dingtalk-aisearch/references/lite-recipes.md +31 -0
- package/skills/dws/dingtalk-aitable/SKILL.md +139 -0
- package/skills/dws/dingtalk-aitable/references/06-data-analytics.md +11 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-advperm.md +251 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-attachment.md +49 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-best-practices.md +48 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-cell-value.md +346 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-dashboard-chart.md +46 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-data-analysis-sop.md +131 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-datasource.md +272 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-error-recovery.md +128 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-export-import.md +113 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-field-properties.md +238 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-field.md +186 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-filter-sort.md +135 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-form.md +130 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-formula-guide.md +224 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-primary-doc.md +58 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-create.md +52 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-delete.md +20 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-history.md +97 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-name-key.md +47 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-query.md +120 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-share.md +54 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-stats.md +59 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-update.md +66 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-upsert.md +89 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-config.md +140 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-extras.md +195 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-types.md +95 -0
- package/skills/dws/dingtalk-aitable/references/aitable/aitable-workflow.md +384 -0
- package/skills/dws/dingtalk-aitable/references/aitable-record-ops.md +80 -0
- package/skills/dws/dingtalk-aitable/references/aitable-section.md +30 -0
- package/skills/dws/dingtalk-aitable/references/aitable.md +59 -0
- package/skills/dws/dingtalk-aitable/references/field-rules.md +17 -0
- package/skills/dws/dingtalk-aitable/references/intent-guide.md +17 -0
- package/skills/dws/dingtalk-aitable/references/recipes/conventions.md +44 -0
- package/skills/dws/dingtalk-aitable/references/url-patterns.md +144 -0
- package/skills/dws/dingtalk-aitable/scripts/aitable_export_via_task.py +210 -0
- package/skills/dws/dingtalk-aitable/scripts/aitable_import_via_task.py +173 -0
- package/skills/dws/dingtalk-aitable/scripts/bulk_add_fields.py +273 -0
- package/skills/dws/dingtalk-aitable/scripts/import_records.py +333 -0
- package/skills/dws/dingtalk-aitable/scripts/upload_attachment.py +190 -0
- package/skills/dws/dingtalk-calendar/SKILL.md +137 -0
- package/skills/dws/dingtalk-calendar/references/03-meeting.md +56 -0
- package/skills/dws/dingtalk-calendar/references/calendar.md +760 -0
- package/skills/dws/dingtalk-calendar/references/intent-guide.md +9 -0
- package/skills/dws/dingtalk-calendar/references/lite-recipes.md +25 -0
- package/skills/dws/dingtalk-calendar/scripts/calendar_free_slot_finder.py +199 -0
- package/skills/dws/dingtalk-calendar/scripts/calendar_schedule_meeting.py +233 -0
- package/skills/dws/dingtalk-calendar/scripts/calendar_today_agenda.py +139 -0
- package/skills/dws/dingtalk-chat/SKILL.md +127 -0
- package/skills/dws/dingtalk-chat/references/01-messaging.md +103 -0
- package/skills/dws/dingtalk-chat/references/card/callback.md +10 -0
- package/skills/dws/dingtalk-chat/references/card/create.md +27 -0
- package/skills/dws/dingtalk-chat/references/card/schema.md +14 -0
- package/skills/dws/dingtalk-chat/references/card/update.md +13 -0
- package/skills/dws/dingtalk-chat/references/chat/chat-bot.md +187 -0
- package/skills/dws/dingtalk-chat/references/chat/chat-conversation.md +165 -0
- package/skills/dws/dingtalk-chat/references/chat/group-admin.md +144 -0
- package/skills/dws/dingtalk-chat/references/chat/group-discovery.md +121 -0
- package/skills/dws/dingtalk-chat/references/chat/message-actions.md +132 -0
- package/skills/dws/dingtalk-chat/references/chat/message-media.md +76 -0
- package/skills/dws/dingtalk-chat/references/chat/message-query.md +135 -0
- package/skills/dws/dingtalk-chat/references/chat/thread.md +46 -0
- package/skills/dws/dingtalk-chat/references/chat-emoji-list.md +216 -0
- package/skills/dws/dingtalk-chat/references/chat.md +140 -0
- package/skills/dws/dingtalk-chat/references/contracts.md +70 -0
- package/skills/dws/dingtalk-chat/references/intent-guide.md +56 -0
- package/skills/dws/dingtalk-contact/SKILL.md +122 -0
- package/skills/dws/dingtalk-contact/references/08-directory.md +51 -0
- package/skills/dws/dingtalk-contact/references/contact.md +595 -0
- package/skills/dws/dingtalk-contact/references/intent-guide.md +14 -0
- package/skills/dws/dingtalk-contact/references/lite-recipes.md +30 -0
- package/skills/dws/dingtalk-contact/references/recipes/conventions.md +44 -0
- package/skills/dws/dingtalk-contact/scripts/contact_dept_members.py +130 -0
- package/skills/dws/dingtalk-doc/SKILL.md +112 -0
- package/skills/dws/dingtalk-doc/references/04-document.md +57 -0
- package/skills/dws/dingtalk-doc/references/contracts.md +40 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-block.md +39 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-comment.md +29 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-create.md +54 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-export.md +30 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-import.md +28 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-info.md +12 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-media.md +46 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-read.md +56 -0
- package/skills/dws/dingtalk-doc/references/doc/doc-update.md +87 -0
- package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-cookbook.md +469 -0
- package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-schema.json +526 -0
- package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-schema.md +711 -0
- package/skills/dws/dingtalk-doc/references/doc/style/doc-create-workflow.md +414 -0
- package/skills/dws/dingtalk-doc/references/doc/style/doc-style-guideline.md +404 -0
- package/skills/dws/dingtalk-doc/references/doc/style/doc-update-workflow.md +316 -0
- package/skills/dws/dingtalk-doc/references/doc.md +82 -0
- package/skills/dws/dingtalk-doc/references/intent-guide.md +20 -0
- package/skills/dws/dingtalk-drive/SKILL.md +128 -0
- package/skills/dws/dingtalk-drive/references/drive.md +126 -0
- package/skills/dws/dingtalk-drive/references/folder-sync.md +40 -0
- package/skills/dws/dingtalk-drive/references/intent-guide.md +22 -0
- package/skills/dws/dingtalk-drive/references/lite-recipes.md +39 -0
- package/skills/dws/dingtalk-event/SKILL.md +106 -0
- package/skills/dws/dingtalk-event/references/event-im-keys.md +54 -0
- package/skills/dws/dingtalk-event/references/event-im-lifecycle.md +35 -0
- package/skills/dws/dingtalk-event/references/event-im-operations.md +52 -0
- package/skills/dws/dingtalk-event/references/event-im-output.md +39 -0
- package/skills/dws/dingtalk-event/references/event-im.md +58 -0
- package/skills/dws/dingtalk-event/references/event-oa.md +155 -0
- package/skills/dws/dingtalk-event/references/event-todo.md +50 -0
- package/skills/dws/dingtalk-event/references/event-voip.md +69 -0
- package/skills/dws/dingtalk-mail/SKILL.md +113 -0
- package/skills/dws/dingtalk-mail/references/09-mail.md +45 -0
- package/skills/dws/dingtalk-mail/references/intent-guide.md +8 -0
- package/skills/dws/dingtalk-mail/references/lite-recipes.md +45 -0
- package/skills/dws/dingtalk-mail/references/mail.md +1889 -0
- package/skills/dws/dingtalk-mail/references/recipes/conventions.md +44 -0
- package/skills/dws/dingtalk-mail/scripts/mail_send_with_cc.py +122 -0
- package/skills/dws/dingtalk-mail/scripts/mail_unread_summary.py +114 -0
- package/skills/dws/dingtalk-minutes/SKILL.md +116 -0
- package/skills/dws/dingtalk-minutes/references/07-minutes.md +149 -0
- package/skills/dws/dingtalk-minutes/references/10-minutes-speaker-match.md +32 -0
- package/skills/dws/dingtalk-minutes/references/11-minutes-speaker-correct.md +40 -0
- package/skills/dws/dingtalk-minutes/references/intent-guide.md +79 -0
- package/skills/dws/dingtalk-minutes/references/lite-recipes.md +25 -0
- package/skills/dws/dingtalk-minutes/references/minutes.md +210 -0
- package/skills/dws/dingtalk-minutes/references/recipes/conventions.md +33 -0
- package/skills/dws/dingtalk-minutes/scripts/minutes_recent_summary.py +196 -0
- package/skills/dws/dingtalk-minutes/scripts/test_minutes_scripts.py +222 -0
- package/skills/dws/dingtalk-misc/SKILL.md +55 -0
- package/skills/dws/dingtalk-misc/references/05-reporting.md +29 -0
- package/skills/dws/dingtalk-misc/references/agoal.md +302 -0
- package/skills/dws/dingtalk-misc/references/attendance-intent-guide.md +7 -0
- package/skills/dws/dingtalk-misc/references/attendance-report.md +109 -0
- package/skills/dws/dingtalk-misc/references/attendance-schedule.md +115 -0
- package/skills/dws/dingtalk-misc/references/attendance-vacation.md +129 -0
- package/skills/dws/dingtalk-misc/references/attendance.md +149 -0
- package/skills/dws/dingtalk-misc/references/dev/app.md +42 -0
- package/skills/dws/dingtalk-misc/references/dev/connect.md +108 -0
- package/skills/dws/dingtalk-misc/references/dev/credentials.md +26 -0
- package/skills/dws/dingtalk-misc/references/dev/dev-index.md +13 -0
- package/skills/dws/dingtalk-misc/references/dev/event.md +47 -0
- package/skills/dws/dingtalk-misc/references/dev/mcp.md +106 -0
- package/skills/dws/dingtalk-misc/references/dev/member.md +19 -0
- package/skills/dws/dingtalk-misc/references/dev/permission.md +56 -0
- package/skills/dws/dingtalk-misc/references/dev/recipes.md +58 -0
- package/skills/dws/dingtalk-misc/references/dev/robot.md +74 -0
- package/skills/dws/dingtalk-misc/references/dev/security.md +21 -0
- package/skills/dws/dingtalk-misc/references/dev/version.md +99 -0
- package/skills/dws/dingtalk-misc/references/dev/webapp.md +22 -0
- package/skills/dws/dingtalk-misc/references/devapp.md +148 -0
- package/skills/dws/dingtalk-misc/references/devdoc-intent-guide.md +7 -0
- package/skills/dws/dingtalk-misc/references/devdoc.md +42 -0
- package/skills/dws/dingtalk-misc/references/ding.md +184 -0
- package/skills/dws/dingtalk-misc/references/hrbrain.md +67 -0
- package/skills/dws/dingtalk-misc/references/live.md +23 -0
- package/skills/dws/dingtalk-misc/references/markdown.md +167 -0
- package/skills/dws/dingtalk-misc/references/oa/oa-form-components.md +345 -0
- package/skills/dws/dingtalk-misc/references/oa/oa-process-nodes.md +374 -0
- package/skills/dws/dingtalk-misc/references/oa.md +1014 -0
- package/skills/dws/dingtalk-misc/references/openapi-explorer.md +47 -0
- package/skills/dws/dingtalk-misc/references/pat.md +52 -0
- package/skills/dws/dingtalk-misc/references/profile.md +41 -0
- package/skills/dws/dingtalk-misc/references/recruit.md +89 -0
- package/skills/dws/dingtalk-misc/references/report-conventions.md +44 -0
- package/skills/dws/dingtalk-misc/references/report-intent-guide.md +11 -0
- package/skills/dws/dingtalk-misc/references/report-lite-recipes.md +25 -0
- package/skills/dws/dingtalk-misc/references/report.md +109 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-batch-operations.md +104 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-chart.md +69 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-comment.md +166 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-conditional-format.md +59 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-dimension-operations.md +60 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-dropdown.md +103 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-export.md +135 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-filter-view.md +51 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-filter.md +181 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-formula.md +192 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-import.md +76 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-media-image.md +263 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-pivot-table.md +292 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-range-operations.md +161 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-read-data.md +60 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-revision-changeset.md +46 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-search-replace.md +120 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-style-format.md +71 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-version.md +84 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-workbook.md +59 -0
- package/skills/dws/dingtalk-misc/references/sheet/sheet-write-data.md +93 -0
- package/skills/dws/dingtalk-misc/references/sheet-conventions.md +44 -0
- package/skills/dws/dingtalk-misc/references/sheet-intent-guide.md +12 -0
- package/skills/dws/dingtalk-misc/references/sheet.md +166 -0
- package/skills/dws/dingtalk-misc/references/skill.md +98 -0
- package/skills/dws/dingtalk-misc/references/unsupported-scripts.md +49 -0
- package/skills/dws/dingtalk-misc/references/url-patterns.md +144 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/compose.md +200 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/01-overview.md +57 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/02-query.md +288 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/03-update.md +249 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/04-text-style.md +395 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/05-shape-frame-group-connector.md +186 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/06-vector-icon-path.md +313 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/07-examples-errors-write-support.md +270 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/08-catalogs.md +61 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1.md +54 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/replace.md +41 -0
- package/skills/dws/dingtalk-misc/references/whiteboard/vector.md +51 -0
- package/skills/dws/dingtalk-misc/references/whiteboard.md +115 -0
- package/skills/dws/dingtalk-misc/scripts/aiapp_create_and_poll.py +138 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_my_record.py +91 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_report_checkin.py +440 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_report_common.py +1698 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_report_daily.py +558 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_report_detail.py +809 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_report_monthly.py +758 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_report_record.py +947 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_schedule_export.py +344 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_schedule_import.py +498 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_team_shift.py +89 -0
- package/skills/dws/dingtalk-misc/scripts/attendance_vacation_balance.py +617 -0
- package/skills/dws/dingtalk-misc/scripts/finance_daily_cashflow.py +70 -0
- package/skills/dws/dingtalk-misc/scripts/finance_expense_flow.py +138 -0
- package/skills/dws/dingtalk-misc/scripts/oa_batch_approve.py +158 -0
- package/skills/dws/dingtalk-misc/scripts/oa_pending_review.py +132 -0
- package/skills/dws/dingtalk-misc/scripts/report_received_today.py +315 -0
- package/skills/dws/dingtalk-misc/scripts/yida_custom_page_update.py +401 -0
- package/skills/dws/dingtalk-misc/scripts/yida_form_builder.py +526 -0
- package/skills/dws/dingtalk-misc/scripts/yida_form_fields.py +315 -0
- package/skills/dws/dingtalk-misc/scripts/yida_form_inspector.py +311 -0
- package/skills/dws/dingtalk-misc/scripts/yida_form_update.py +185 -0
- package/skills/dws/dingtalk-misc/scripts/yida_jsx_pipeline.py +1588 -0
- package/skills/dws/dingtalk-misc/scripts/yida_page_compiler.py +1441 -0
- package/skills/dws/dingtalk-misc/scripts/yida_page_generate.py +514 -0
- package/skills/dws/dingtalk-misc/scripts/yida_page_schema.py +519 -0
- package/skills/dws/dingtalk-misc/scripts/yida_page_self_check.py +398 -0
- package/skills/dws/dingtalk-misc/scripts/yida_process_flow.py +1478 -0
- package/skills/dws/dingtalk-misc/scripts/yida_process_update.py +589 -0
- package/skills/dws/dingtalk-misc/scripts/yida_report_builder.py +494 -0
- package/skills/dws/dingtalk-misc/scripts/yida_report_charts.py +1434 -0
- package/skills/dws/dingtalk-misc/scripts/yida_report_update.py +244 -0
- package/skills/dws/dingtalk-misc/scripts/yida_schema_common.py +340 -0
- package/skills/dws/dingtalk-shared/SKILL.md +83 -0
- package/skills/dws/dingtalk-shared/references/capability-limits.md +31 -0
- package/skills/dws/dingtalk-shared/references/channel-login.md +26 -0
- package/skills/dws/dingtalk-shared/references/confirmation.md +59 -0
- package/skills/dws/dingtalk-shared/references/error-codes.md +155 -0
- package/skills/dws/dingtalk-shared/references/global-reference.md +122 -0
- package/skills/dws/dingtalk-shared/references/intent-guide.md +537 -0
- package/skills/dws/dingtalk-shared/references/recipes/conventions.md +45 -0
- package/skills/dws/dingtalk-shared/references/recipes/lite-catalog.md +275 -0
- package/skills/dws/dingtalk-shared/references/recipes/meta.md +67 -0
- package/skills/dws/dingtalk-shared/references/routing.md +52 -0
- package/skills/dws/dingtalk-shared/references/runtime-contract.md +11 -0
- package/skills/dws/dingtalk-shared/references/schema-usage.md +88 -0
- package/skills/dws/dingtalk-shared/references/url-patterns.md +144 -0
- package/skills/dws/dingtalk-shared/references/workflow-routing.md +45 -0
- package/skills/dws/dingtalk-todo/SKILL.md +119 -0
- package/skills/dws/dingtalk-todo/references/02-task.md +70 -0
- package/skills/dws/dingtalk-todo/references/intent-guide.md +15 -0
- package/skills/dws/dingtalk-todo/references/lite-recipes.md +68 -0
- package/skills/dws/dingtalk-todo/references/recipes/conventions.md +44 -0
- package/skills/dws/dingtalk-todo/references/todo.md +517 -0
- package/skills/dws/dingtalk-todo/scripts/todo_batch_create.py +354 -0
- package/skills/dws/dingtalk-todo/scripts/todo_daily_summary.py +153 -0
- package/skills/dws/dingtalk-todo/scripts/todo_overdue_check.py +101 -0
- package/skills/dws/dingtalk-wiki/SKILL.md +117 -0
- package/skills/dws/dingtalk-wiki/references/intent-guide.md +14 -0
- package/skills/dws/dingtalk-wiki/references/lite-recipes.md +44 -0
- package/skills/dws/dingtalk-wiki/references/wiki-members.md +32 -0
- package/skills/dws/dingtalk-wiki/references/wiki-node-ops.md +46 -0
- package/skills/dws/dingtalk-wiki/references/wiki.md +65 -0
- package/skills/dws/provenance.json +27 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""`recalc_check.py` 契约测试(C7 计算链重算验证)。
|
|
4
|
+
|
|
5
|
+
自洽:只用 openpyxl 造临时 fixture,可随技能安装运行。每条对应真实/风险场景。
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import importlib.util
|
|
10
|
+
import json
|
|
11
|
+
import os
|
|
12
|
+
import re
|
|
13
|
+
import subprocess
|
|
14
|
+
import sys
|
|
15
|
+
import tempfile
|
|
16
|
+
import unittest
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
SCRIPTS_DIR = Path(__file__).resolve().parent
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _load():
|
|
23
|
+
spec = importlib.util.spec_from_file_location("recalc_check_for_test",
|
|
24
|
+
SCRIPTS_DIR / "recalc_check.py")
|
|
25
|
+
module = importlib.util.module_from_spec(spec)
|
|
26
|
+
spec.loader.exec_module(module)
|
|
27
|
+
return module
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _inject_cell(data, coord, val):
|
|
31
|
+
"""给指定公式格注入缓存值 `<v>`(字符串结果加 `t="str"`),模拟真实 Excel 已计算文件。"""
|
|
32
|
+
# openpyxl 写公式格为 `<c r=".."><f>..</f><v /></c>`(空缓存);把 `<v />` 替换为真实缓存值。
|
|
33
|
+
pat = re.compile(rb'(<c r="%s"[^>]*?>)(<f>.*?</f>).*?(</c>)' % coord.encode())
|
|
34
|
+
|
|
35
|
+
def repl(m):
|
|
36
|
+
c = m.group(1)
|
|
37
|
+
if isinstance(val, str):
|
|
38
|
+
c = c[:-1] + b' t="str">'
|
|
39
|
+
v = ("<v>%s</v>" % val).encode("utf-8")
|
|
40
|
+
return c + m.group(2) + v + m.group(3)
|
|
41
|
+
|
|
42
|
+
return pat.sub(repl, data, count=1)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _inject_cached(path, cached):
|
|
46
|
+
"""`cached`: {(sheet_title, coord): value}。openpyxl 不写缓存值,故手术注入。"""
|
|
47
|
+
import shutil
|
|
48
|
+
import zipfile
|
|
49
|
+
tmp = path.with_suffix(path.suffix + ".tmp")
|
|
50
|
+
with zipfile.ZipFile(path) as z:
|
|
51
|
+
wbxml = z.read("xl/workbook.xml").decode("utf-8")
|
|
52
|
+
rels = z.read("xl/_rels/workbook.xml.rels").decode("utf-8")
|
|
53
|
+
name_rid = {}
|
|
54
|
+
for m in re.finditer(r"<sheet\b([^>]*?)/>", wbxml):
|
|
55
|
+
attrs = m.group(1)
|
|
56
|
+
nm = re.search(r'name="([^"]+)"', attrs)
|
|
57
|
+
rid = re.search(r'r:id="([^"]+)"', attrs)
|
|
58
|
+
if nm and rid:
|
|
59
|
+
name_rid[nm.group(1)] = rid.group(1)
|
|
60
|
+
rid_target = {}
|
|
61
|
+
for m in re.finditer(r"<Relationship\b([^>]*?)/>", rels):
|
|
62
|
+
attrs = m.group(1)
|
|
63
|
+
rid = re.search(r'Id="([^"]+)"', attrs)
|
|
64
|
+
tgt = re.search(r'Target="([^"]+)"', attrs)
|
|
65
|
+
if rid and tgt:
|
|
66
|
+
rid_target[rid.group(1)] = tgt.group(1)
|
|
67
|
+
sheet_file = {n: rid_target[r].lstrip("/") for n, r in name_rid.items()}
|
|
68
|
+
with zipfile.ZipFile(path) as z, zipfile.ZipFile(tmp, "w") as out:
|
|
69
|
+
for item in z.infolist():
|
|
70
|
+
data = z.read(item.filename)
|
|
71
|
+
if item.filename in sheet_file.values():
|
|
72
|
+
sheet = next(n for n, f in sheet_file.items() if f == item.filename)
|
|
73
|
+
for (s, coord), val in cached.items():
|
|
74
|
+
if s == sheet:
|
|
75
|
+
data = _inject_cell(data, coord, val)
|
|
76
|
+
out.writestr(item, data)
|
|
77
|
+
shutil.move(str(tmp), str(path))
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
class RecalcCheckContractTest(unittest.TestCase):
|
|
81
|
+
def setUp(self):
|
|
82
|
+
import openpyxl # noqa: F401
|
|
83
|
+
self.module = _load()
|
|
84
|
+
self.tmp = tempfile.TemporaryDirectory()
|
|
85
|
+
self.dir = Path(self.tmp.name)
|
|
86
|
+
|
|
87
|
+
def tearDown(self):
|
|
88
|
+
self.tmp.cleanup()
|
|
89
|
+
|
|
90
|
+
def _run(self, wb, name="t.xlsx"):
|
|
91
|
+
import openpyxl
|
|
92
|
+
p = self.dir / name
|
|
93
|
+
wb.save(p)
|
|
94
|
+
return self.module.run(str(p))
|
|
95
|
+
|
|
96
|
+
def _run_cached(self, wb, cached, name="t.xlsx"):
|
|
97
|
+
p = self.dir / name
|
|
98
|
+
wb.save(p)
|
|
99
|
+
_inject_cached(p, cached)
|
|
100
|
+
return self.module.run(str(p))
|
|
101
|
+
|
|
102
|
+
def test_arithmetic_and_absolute_ref_match(self):
|
|
103
|
+
import openpyxl
|
|
104
|
+
wb = openpyxl.Workbook()
|
|
105
|
+
wb.active["A1"], wb.active["B1"], wb.active["C1"] = 3, 4, "=$A$1*B1"
|
|
106
|
+
r = self._run_cached(wb, {("Sheet", "C1"): 12})
|
|
107
|
+
self.assertEqual(1, r["summary"]["matched"], r["differences"])
|
|
108
|
+
self.assertEqual([], r["differences"])
|
|
109
|
+
|
|
110
|
+
def test_mismatch_is_reported(self):
|
|
111
|
+
import openpyxl
|
|
112
|
+
wb = openpyxl.Workbook()
|
|
113
|
+
wb.active["A1"], wb.active["A2"] = 2, 3
|
|
114
|
+
wb.active["A3"] = "=A1+A2" # 公式=5,但缓存值故意写成 6
|
|
115
|
+
wb.active["A3"].value = "=A1+A2"
|
|
116
|
+
# 用 zip 手术注入缓存值 6
|
|
117
|
+
import zipfile
|
|
118
|
+
p = self.dir / "m.xlsx"
|
|
119
|
+
wb.save(p)
|
|
120
|
+
with zipfile.ZipFile(p) as z, zipfile.ZipFile(p.with_suffix(".tmp"), "w") as out:
|
|
121
|
+
for item in z.infolist():
|
|
122
|
+
data = z.read(item.filename)
|
|
123
|
+
if item.filename.startswith("xl/worksheets/sheet") and b"<f>A1+A2</f>" in data:
|
|
124
|
+
data = data.replace(b"<f>A1+A2</f>", b"<f>A1+A2</f><v>6</v>", 1)
|
|
125
|
+
out.writestr(item, data)
|
|
126
|
+
import shutil
|
|
127
|
+
shutil.move(str(p.with_suffix(".tmp")), str(p))
|
|
128
|
+
r = self.module.run(str(p))
|
|
129
|
+
self.assertEqual(1, r["summary"]["mismatched"], r)
|
|
130
|
+
self.assertEqual(5, r["differences"][0]["recalculated"])
|
|
131
|
+
|
|
132
|
+
def test_sum_and_product_and_round(self):
|
|
133
|
+
import openpyxl
|
|
134
|
+
wb = openpyxl.Workbook()
|
|
135
|
+
wb.active["A1"], wb.active["A2"], wb.active["A3"] = 2, 3, 4
|
|
136
|
+
wb.active["A4"] = "=SUM(A1:A3)"
|
|
137
|
+
wb.active["A5"] = "=PRODUCT(A1:A3)"
|
|
138
|
+
wb.active["A6"] = "=ROUND(1.235,2)"
|
|
139
|
+
r = self._run_cached(wb, {("Sheet", "A4"): 9, ("Sheet", "A5"): 24, ("Sheet", "A6"): 1.24})
|
|
140
|
+
self.assertEqual(3, r["summary"]["matched"], r)
|
|
141
|
+
self.assertEqual([], r["differences"])
|
|
142
|
+
|
|
143
|
+
def test_if_chain_reproduces_real_case(self):
|
|
144
|
+
"""真实场景:描述词匹配 IF 链——匹配词错误时算 0(重算应复现该 0)。"""
|
|
145
|
+
import openpyxl
|
|
146
|
+
wb = openpyxl.Workbook()
|
|
147
|
+
ws = wb.active
|
|
148
|
+
ws["D22"] = "较完善"
|
|
149
|
+
ws["V22"] = '=IF(D22="完善",5,IF(D22="较完善",4,IF(D22="一般",3,0)))' # 应为 4
|
|
150
|
+
ws["V23"] = '=IF(D23="方便",5,IF(D23="较方便",4,0))' # D23 空 → 0
|
|
151
|
+
r = self._run_cached(wb, {("Sheet", "V22"): 4, ("Sheet", "V23"): 0})
|
|
152
|
+
self.assertEqual(2, r["summary"]["matched"], r)
|
|
153
|
+
self.assertEqual([], r["differences"])
|
|
154
|
+
|
|
155
|
+
def test_if_returns_correct_branch_and_lazy(self):
|
|
156
|
+
import openpyxl
|
|
157
|
+
wb = openpyxl.Workbook()
|
|
158
|
+
ws = wb.active
|
|
159
|
+
ws["A1"] = 10
|
|
160
|
+
ws["B1"] = '=IF(A1>5, "高", "低")'
|
|
161
|
+
ws["A2"] = 3
|
|
162
|
+
ws["B2"] = '=IF(A2>5, "高", "低")'
|
|
163
|
+
r = self._run_cached(wb, {("Sheet", "B1"): "高", ("Sheet", "B2"): "低"})
|
|
164
|
+
self.assertEqual(2, r["summary"]["matched"], r)
|
|
165
|
+
|
|
166
|
+
def test_hidden_dependency_is_not_recomputable(self):
|
|
167
|
+
"""引用隐藏列 → 标「未重算」,绝不读隐藏值。"""
|
|
168
|
+
import openpyxl
|
|
169
|
+
wb = openpyxl.Workbook()
|
|
170
|
+
ws = wb.active
|
|
171
|
+
ws["A1"] = "=N10*2"
|
|
172
|
+
ws["N10"] = 999999
|
|
173
|
+
ws.column_dimensions["N"].hidden = True
|
|
174
|
+
r = self._run(wb)
|
|
175
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
176
|
+
self.assertIn("隐藏", r["notRecomputable"][0]["reason"])
|
|
177
|
+
|
|
178
|
+
def test_cross_sheet_reference(self):
|
|
179
|
+
import openpyxl
|
|
180
|
+
wb = openpyxl.Workbook()
|
|
181
|
+
wb.active["A1"] = 5
|
|
182
|
+
s2 = wb.create_sheet("表2")
|
|
183
|
+
s2["B2"] = "=Sheet!A1*2" # 用工作表名(默认表名是 Sheet)
|
|
184
|
+
r = self._run_cached(wb, {("表2", "B2"): 10})
|
|
185
|
+
self.assertEqual(1, r["summary"]["matched"], r["differences"])
|
|
186
|
+
|
|
187
|
+
def test_unsupported_function_is_not_recomputable(self):
|
|
188
|
+
import openpyxl
|
|
189
|
+
wb = openpyxl.Workbook()
|
|
190
|
+
wb.active["A1"] = "=VLOOKUP(B1,C1:D5,2,FALSE)"
|
|
191
|
+
r = self._run(wb)
|
|
192
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
193
|
+
self.assertIn("不支持的函数", r["notRecomputable"][0]["reason"])
|
|
194
|
+
|
|
195
|
+
def test_external_workbook_reference_is_not_recomputable(self):
|
|
196
|
+
import openpyxl
|
|
197
|
+
wb = openpyxl.Workbook()
|
|
198
|
+
wb.active["A1"] = "='[29]投资性房地产-房屋公允模式'!W31"
|
|
199
|
+
r = self._run(wb)
|
|
200
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
201
|
+
self.assertIn("外部工作簿", r["notRecomputable"][0]["reason"])
|
|
202
|
+
|
|
203
|
+
def test_division_by_zero_is_not_recomputable(self):
|
|
204
|
+
import openpyxl
|
|
205
|
+
wb = openpyxl.Workbook()
|
|
206
|
+
wb.active["A1"] = "=1/0"
|
|
207
|
+
r = self._run(wb)
|
|
208
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
209
|
+
self.assertIn("除零", r["notRecomputable"][0]["reason"])
|
|
210
|
+
|
|
211
|
+
def test_unsupported_operator_inside_function_arg_is_not_silently_dropped(self):
|
|
212
|
+
"""函数参数里的未实现运算符(`&`)必须报「未重算」,**不得被静默丢弃后猜值**。
|
|
213
|
+
|
|
214
|
+
真实失效(2026-302150-LX9757-BG8677):`ev()` 丢弃了 `_expr` 返回的消费位置,
|
|
215
|
+
于是 `IF(A1&B1="x", 111, 222)` 只解析 `A1` 就返回,条件走错分支、给出 222。
|
|
216
|
+
隐患不止假阳性——若该错误值恰好等于缓存值,就会被记成"已核"(假阴性)。
|
|
217
|
+
"""
|
|
218
|
+
import openpyxl
|
|
219
|
+
wb = openpyxl.Workbook()
|
|
220
|
+
wb.active["A1"] = '=IF(""&"x"="x",111,222)'
|
|
221
|
+
r = self._run(wb)
|
|
222
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
223
|
+
self.assertIn("未消费的片段", r["notRecomputable"][0]["reason"])
|
|
224
|
+
self.assertEqual(0, r["summary"]["mismatched"], "不得拿猜出来的值参与比对")
|
|
225
|
+
self.assertEqual(0, r["summary"]["matched"], "更不得把猜出来的值记成已核")
|
|
226
|
+
|
|
227
|
+
def test_percent_operator_inside_function_arg_is_not_recomputable(self):
|
|
228
|
+
"""`%` 同样未实现,出现在函数参数里也必须报「未重算」。"""
|
|
229
|
+
import openpyxl
|
|
230
|
+
wb = openpyxl.Workbook()
|
|
231
|
+
wb.active["A1"] = "=SUM(50%,10%)"
|
|
232
|
+
r = self._run(wb)
|
|
233
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
234
|
+
self.assertIn("未消费的片段", r["notRecomputable"][0]["reason"])
|
|
235
|
+
|
|
236
|
+
def test_type_mismatch_is_not_recomputable_and_does_not_crash(self):
|
|
237
|
+
"""类型不匹配(日期 − 文本)→ 标「未重算(类型不匹配)」,**不得打穿整表**。
|
|
238
|
+
|
|
239
|
+
真实失效(2026-302135-LX9619-BG8634 的 3-资产基础法.xlsx):
|
|
240
|
+
`_arith` 抛裸 `TypeError: unsupported operand type(s) for -: 'datetime.datetime'
|
|
241
|
+
and 'str'`,而 `run()` 只捕获 `Unavailable` → 整个 datacheck 崩溃、该表完全不可用。
|
|
242
|
+
Excel 对同式报 `#VALUE!`,故这属"该格不可重算",不是引擎缺陷。
|
|
243
|
+
"""
|
|
244
|
+
import datetime
|
|
245
|
+
import openpyxl
|
|
246
|
+
wb = openpyxl.Workbook()
|
|
247
|
+
ws = wb.active
|
|
248
|
+
ws["A1"] = datetime.datetime(2024, 1, 1)
|
|
249
|
+
ws["B1"] = "文本"
|
|
250
|
+
ws["C1"] = "=A1-B1"
|
|
251
|
+
r = self._run(wb)
|
|
252
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
253
|
+
self.assertIn("类型不匹配", r["notRecomputable"][0]["reason"])
|
|
254
|
+
self.assertEqual(0, r["summary"]["engineErrors"], "类型问题是该格不可重算,不该计成引擎异常")
|
|
255
|
+
self.assertEqual(0, r["summary"]["mismatched"], "不得猜值比对")
|
|
256
|
+
|
|
257
|
+
def test_sum_over_non_numeric_is_not_recomputable_and_does_not_crash(self):
|
|
258
|
+
"""SUM 聚合到非数值(文本/日期)→ 标「未重算」,不得崩溃(`float()` 转换路径)。"""
|
|
259
|
+
import openpyxl
|
|
260
|
+
wb = openpyxl.Workbook()
|
|
261
|
+
ws = wb.active
|
|
262
|
+
ws["A1"] = "文本"
|
|
263
|
+
ws["A2"] = 1
|
|
264
|
+
ws["B1"] = "=SUM(A1:A2)"
|
|
265
|
+
r = self._run(wb)
|
|
266
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
267
|
+
self.assertIn("类型不匹配", r["notRecomputable"][0]["reason"])
|
|
268
|
+
|
|
269
|
+
def test_unexpected_engine_error_is_counted_and_never_swallowed(self):
|
|
270
|
+
"""非预期异常 → 记 engineError 并入摘要 engineErrors,**不伪装成普通未重算**。
|
|
271
|
+
|
|
272
|
+
这是防"兜底把代码缺陷静默化"的反向断言:既有可见的计数,也有逐格标记。
|
|
273
|
+
"""
|
|
274
|
+
import openpyxl
|
|
275
|
+
wb = openpyxl.Workbook()
|
|
276
|
+
wb.active["A1"] = "=1+1"
|
|
277
|
+
p = self.dir / "boom.xlsx"
|
|
278
|
+
wb.save(p)
|
|
279
|
+
|
|
280
|
+
original = self.module.Evaluator.eval
|
|
281
|
+
self.module.Evaluator.eval = lambda self, f: (_ for _ in ()).throw(
|
|
282
|
+
RuntimeError("模拟引擎缺陷"))
|
|
283
|
+
try:
|
|
284
|
+
r = self.module.run(str(p))
|
|
285
|
+
finally:
|
|
286
|
+
self.module.Evaluator.eval = original
|
|
287
|
+
|
|
288
|
+
self.assertEqual(1, r["summary"]["notRecomputable"], r)
|
|
289
|
+
self.assertEqual(1, r["summary"]["engineErrors"], "非预期引擎异常必须计数暴露")
|
|
290
|
+
entry = r["notRecomputable"][0]
|
|
291
|
+
self.assertTrue(entry.get("engineError"))
|
|
292
|
+
self.assertIn("引擎异常 RuntimeError", entry["reason"])
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
_RUNNER_TEMPLATE = """\
|
|
296
|
+
import importlib.abc
|
|
297
|
+
import importlib.util
|
|
298
|
+
import pathlib
|
|
299
|
+
import runpy
|
|
300
|
+
import sys
|
|
301
|
+
|
|
302
|
+
PRUNE = set({prune!r})
|
|
303
|
+
PROBE = set({probe!r})
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def _prune(names):
|
|
307
|
+
dropped = []
|
|
308
|
+
for entry in list(sys.path):
|
|
309
|
+
if not entry:
|
|
310
|
+
continue
|
|
311
|
+
base = pathlib.Path(entry)
|
|
312
|
+
if any((base / n).is_dir() or (base / (n + ".py")).is_file() for n in names):
|
|
313
|
+
dropped.append(entry)
|
|
314
|
+
sys.path[:] = [e for e in sys.path if e not in dropped]
|
|
315
|
+
for name in names:
|
|
316
|
+
sys.modules.pop(name, None)
|
|
317
|
+
importlib.invalidate_caches()
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
class _ProbeRaiser(importlib.abc.MetaPathFinder):
|
|
321
|
+
def find_spec(self, fullname, path=None, target=None):
|
|
322
|
+
if fullname.split(".")[0] in PROBE:
|
|
323
|
+
raise ModuleNotFoundError("No module named " + repr(fullname), name=fullname)
|
|
324
|
+
return None
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
_prune(PRUNE)
|
|
328
|
+
sys.meta_path.insert(0, _ProbeRaiser())
|
|
329
|
+
sys.argv = {argv!r}
|
|
330
|
+
runpy.run_path({script!r}, run_name="__main__")
|
|
331
|
+
"""
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
class MissingOpenpyxlBehaviorTest(unittest.TestCase):
|
|
335
|
+
"""OPT-005-R1/-R2:`recalc_check.py` 对 openpyxl 也要区分三态,且都 fail closed。
|
|
336
|
+
|
|
337
|
+
- `missing`:`find_spec` 返回 None(`prune`)
|
|
338
|
+
- `import_failed`:spec 在、import 抛错(`shadow`)
|
|
339
|
+
- `probe_failed`:`find_spec` 自身抛异常(`probe`)
|
|
340
|
+
|
|
341
|
+
三者都必须 exit=3、不读值、不重算、**不产出差异文件**,错误文本必须准确。
|
|
342
|
+
模拟都在**子进程**里做,不动本机包。
|
|
343
|
+
"""
|
|
344
|
+
|
|
345
|
+
def _run(self, case: Path, workbook: Path, out: Path, *, prune=(), probe=(), shadow=None):
|
|
346
|
+
runner = case / "_runner.py"
|
|
347
|
+
runner.write_text(
|
|
348
|
+
_RUNNER_TEMPLATE.format(
|
|
349
|
+
prune=tuple(prune),
|
|
350
|
+
probe=tuple(probe),
|
|
351
|
+
argv=[str(SCRIPTS_DIR / "recalc_check.py"), "--workbook", str(workbook),
|
|
352
|
+
"--out", str(out)],
|
|
353
|
+
script=str(SCRIPTS_DIR / "recalc_check.py"),
|
|
354
|
+
),
|
|
355
|
+
encoding="utf-8",
|
|
356
|
+
)
|
|
357
|
+
env = dict(os.environ)
|
|
358
|
+
paths = []
|
|
359
|
+
if shadow:
|
|
360
|
+
shadow_dir = case / "_shadow"
|
|
361
|
+
shadow_dir.mkdir(exist_ok=True)
|
|
362
|
+
for module, body in shadow.items():
|
|
363
|
+
(shadow_dir / f"{module}.py").write_text(body, encoding="utf-8")
|
|
364
|
+
paths.append(str(shadow_dir))
|
|
365
|
+
if env.get("PYTHONPATH"):
|
|
366
|
+
paths.append(env["PYTHONPATH"])
|
|
367
|
+
if paths:
|
|
368
|
+
env["PYTHONPATH"] = os.pathsep.join(paths)
|
|
369
|
+
env["PYTHONDONTWRITEBYTECODE"] = "1"
|
|
370
|
+
proc = subprocess.run(
|
|
371
|
+
[sys.executable, str(runner)], capture_output=True, text=True, env=env, cwd=str(case)
|
|
372
|
+
)
|
|
373
|
+
return proc, (proc.stdout or "") + (proc.stderr or "")
|
|
374
|
+
|
|
375
|
+
def _workbook(self, name: str = "表.xlsx"):
|
|
376
|
+
temp = tempfile.TemporaryDirectory()
|
|
377
|
+
self.addCleanup(temp.cleanup)
|
|
378
|
+
case = Path(temp.name)
|
|
379
|
+
book = case / name
|
|
380
|
+
book.write_bytes(b"PK\x03\x04") # 内容无关:依赖问题在 import 阶段就暴露
|
|
381
|
+
return case, book
|
|
382
|
+
|
|
383
|
+
def test_missing_openpyxl_fails_loudly_without_writing_a_diff(self):
|
|
384
|
+
case, book = self._workbook()
|
|
385
|
+
out = case / "差异.json"
|
|
386
|
+
proc, combined = self._run(case, book, out, prune=("openpyxl",))
|
|
387
|
+
self.assertEqual(3, proc.returncode, f"缺包必须 exit=3:{combined[:200]}")
|
|
388
|
+
self.assertIn("openpyxl", combined)
|
|
389
|
+
self.assertIn("缺少第三方运行时依赖", combined)
|
|
390
|
+
self.assertNotIn("Traceback", combined, "不得以裸 traceback 代替明确错误")
|
|
391
|
+
self.assertFalse(out.exists(), "缺包时不得产生伪差异结果文件")
|
|
392
|
+
|
|
393
|
+
def test_import_failed_openpyxl_says_import_failure_not_missing(self):
|
|
394
|
+
case, book = self._workbook()
|
|
395
|
+
out = case / "差异.json"
|
|
396
|
+
proc, combined = self._run(
|
|
397
|
+
case, book, out, shadow={"openpyxl": 'raise ImportError("模拟:openpyxl 已损坏")\n'}
|
|
398
|
+
)
|
|
399
|
+
self.assertEqual(3, proc.returncode, f"导入失败也必须 exit=3:{combined[:200]}")
|
|
400
|
+
self.assertIn("openpyxl", combined)
|
|
401
|
+
self.assertIn("导入失败", combined)
|
|
402
|
+
self.assertNotIn("缺少", combined, f"import_failed 不得说成缺少:{combined[:200]}")
|
|
403
|
+
self.assertNotIn("Traceback", combined)
|
|
404
|
+
self.assertFalse(out.exists())
|
|
405
|
+
|
|
406
|
+
def test_probe_failed_openpyxl_says_probe_failure_not_missing(self):
|
|
407
|
+
case, book = self._workbook()
|
|
408
|
+
out = case / "差异.json"
|
|
409
|
+
proc, combined = self._run(case, book, out, probe=("openpyxl",))
|
|
410
|
+
self.assertEqual(3, proc.returncode, f"探测失败也必须 exit=3:{combined[:200]}")
|
|
411
|
+
self.assertIn("openpyxl", combined)
|
|
412
|
+
self.assertIn("探测失败", combined)
|
|
413
|
+
self.assertNotIn("缺少", combined, f"probe_failed 不得伪装成缺少:{combined[:200]}")
|
|
414
|
+
self.assertNotIn("Traceback", combined)
|
|
415
|
+
self.assertFalse(out.exists())
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
if __name__ == "__main__":
|
|
419
|
+
unittest.main(verbosity=2)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Source contract test: this Skill must not depend on sibling Skill internals."""
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
import re
|
|
6
|
+
import unittest
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
SKILL_ROOT = Path(__file__).resolve().parents[1]
|
|
10
|
+
SKILL_NAME = SKILL_ROOT.name
|
|
11
|
+
|
|
12
|
+
# Match private paths written directly (``name/references/...``) or with a
|
|
13
|
+
# short prose bridge (``name 技能的 `scripts/...```) while allowing references
|
|
14
|
+
# to this Skill itself.
|
|
15
|
+
PRIVATE_SKILL_PATH = re.compile(
|
|
16
|
+
r"(?P<skill>crwu-[a-z0-9-]+)(?:/|[^\n]{0,40}?)"
|
|
17
|
+
r"(?:SKILL\.md|references/|scripts/)"
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class SkillSelfContainmentTests(unittest.TestCase):
|
|
22
|
+
def test_markdown_does_not_reference_sibling_skill_internals(self):
|
|
23
|
+
violations = []
|
|
24
|
+
for path in sorted(SKILL_ROOT.rglob("*.md")):
|
|
25
|
+
for line_number, line in enumerate(
|
|
26
|
+
path.read_text(encoding="utf-8").splitlines(), start=1
|
|
27
|
+
):
|
|
28
|
+
for match in PRIVATE_SKILL_PATH.finditer(line):
|
|
29
|
+
if match.group("skill") != SKILL_NAME:
|
|
30
|
+
violations.append(
|
|
31
|
+
f"{path.relative_to(SKILL_ROOT)}:{line_number}: "
|
|
32
|
+
f"{match.group(0)}"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
self.assertEqual(
|
|
36
|
+
[],
|
|
37
|
+
violations,
|
|
38
|
+
"Skill runtime documentation references sibling private files:\n"
|
|
39
|
+
+ "\n".join(violations),
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
if __name__ == "__main__":
|
|
44
|
+
unittest.main()
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crwu-audit-external-data
|
|
3
|
+
description: Use when crwu-audit routes a report whose methods[] includes 收益法 or 市场法 and its external public-data claims may require iFinD verification.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# crwu-audit-external-data(外部数据核验 · 能力型)
|
|
7
|
+
|
|
8
|
+
> **单一事实源分工**
|
|
9
|
+
> **知识库 = 口径**:表 A 触发范围、表 B 数据项触及、表 C 组合映射、结论档位、
|
|
10
|
+
> 数据留痕要求、未检查项与缺口记录、员工补录机制——全部在库内正文,本技能不复制。
|
|
11
|
+
> 库内表 D(取数失败与降级)按**单源**执行:本技能只以同花顺 iFinD 取数,不作双源复核
|
|
12
|
+
> (见「数据源与两条取数路径」)。
|
|
13
|
+
> **本技能 = 能力**:数据项抽取、取数入口发现与调用、口径标准化、比对留痕、交付字段产出。
|
|
14
|
+
|
|
15
|
+
> **KB 逻辑装配表**:本技能 `references/00-KB装配表.md` = 库内层级路径寻址键表(命中本技能 →
|
|
16
|
+
> 该表路径并入本次审核下载清单 → 经 crwu-dws 实时下载正文、只读引用、出处 = 本次下载文件:行号 +
|
|
17
|
+
> exportedAt;每次审核重新下载、零正文缓存;改知识库内容不动技能)。
|
|
18
|
+
|
|
19
|
+
## ⚠️ 调用前置条件
|
|
20
|
+
|
|
21
|
+
本技能是跨方向**能力型**技能:**仅经 `crwu-audit` router 编排调用,禁止单独调用**——默认由总路由
|
|
22
|
+
在 `methods[]` 命中 **收益法 / 市场法** 时叠加调用,**禁止 Agent 脱离编排直接调用并据其输出下审核判断**。
|
|
23
|
+
例外:用户明确只要「外部数据核验结果」且不做审核判断时,可独立执行——输出仅限核验结果,并注明
|
|
24
|
+
"仅外部数据核验,未做审核判断,待方法轴技能/人工判读"。
|
|
25
|
+
|
|
26
|
+
## 定位与触发
|
|
27
|
+
|
|
28
|
+
- 何时用:`route_profile.methods[]` 含 `收益法` 或 `市场法`;是否真正取数仍按库内 **表 A** 三条
|
|
29
|
+
(业务线 × 资产线 × 方法线)同时成立判定,缺一即不核验、记"不在本模块范围"。
|
|
30
|
+
- 与知识库口径:全部核验口径、数据项取舍与结论档位以库内 `M-外部数据核验` 模块规程为准;
|
|
31
|
+
本技能只提供能力与执行规程,并叠加"单源(同花顺 iFinD)、不启用万得"这一环境事实。
|
|
32
|
+
- 与非本技能职责的边界:报告内部与跨表数字勾稽 → `crwu-audit-datacheck`;披露完整性通用检查 →
|
|
33
|
+
`crwu-audit-public-general-standards`;参数合理性与方法判断 → 方法轴技能与人工。
|
|
34
|
+
|
|
35
|
+
## 必读 references
|
|
36
|
+
|
|
37
|
+
按下列分工理解所有权;运行时只读对应文件:
|
|
38
|
+
|
|
39
|
+
1. [00-KB装配表.md](references/00-KB装配表.md):本技能装配的库内层级路径寻址键表(见上方 KB 逻辑装配表说明)。
|
|
40
|
+
2. [01-connector-access.md](references/01-connector-access.md):**取数入口发现与调用**——宿主边界、发现顺序、降级与留痕契约;两宿主入口的判定结论一律以它为准。
|
|
41
|
+
3. [02-verification-workflow.md](references/02-verification-workflow.md):**执行前必读**——前置适用性门禁、基准日锚定三档、核验步骤 0–7、口径标准化与结论边界、`externalDataVerification` 字段契约与详细禁止事项。
|
|
42
|
+
|
|
43
|
+
## 数据源与两条取数路径(同花顺 iFinD)
|
|
44
|
+
|
|
45
|
+
本技能的唯一外部数据源是**同花顺 iFinD**,但宿主不同,取数入口不同——**不要假定另一个宿主的入口存在**:
|
|
46
|
+
|
|
47
|
+
- 两条宿主入口取的是**同一上游 iFinD 服务**,但调用方式与凭据来源不同:不要拿 WorkBuddy 的连接器声明
|
|
48
|
+
去推断 DSH 可用,也不要在 DSH 里去找 WorkBuddy 的连接器目录。
|
|
49
|
+
- **取数入口发现与调用细则**(发现顺序、降级、留痕契约、各宿主入口的判定结论)统一见
|
|
50
|
+
`references/01-connector-access.md`。
|
|
51
|
+
- `scripts/connector_probe.py` 是 **WorkBuddy 专用**的只读预检:只在 WorkBuddy 会话未直接暴露
|
|
52
|
+
iFinD MCP 工具时读宿主连接器声明,**不是**两宿主通用的可用性探测器。运行口径:
|
|
53
|
+
`<WorkBuddy 宿主可用的绝对 Python 路径> scripts/connector_probe.py --format json`
|
|
54
|
+
(只读,不读凭据值)。**禁止**裸 `python3` 名字、任何解释器查找,以及静默降级到系统解释器
|
|
55
|
+
(缺包就记 capability gap 并停下)。
|
|
56
|
+
- **DeepSeek Harness 不运行 `connector_probe.py` 判断可用性**,也没有可读的宿主声明:DSH 侧入口
|
|
57
|
+
就是结构化 Tool `crwu_audit_ifind_query` 对当前 Agent 的可见性;可见后以一次真实的
|
|
58
|
+
`operation=list_tools` 成功返回为准(详见 `references/01-connector-access.md` §4)。
|
|
59
|
+
- **万得不参与本技能的取数**:库内表 B/C 的源统一为同花顺 iFinD;表 D 的双源复核条件不适用,
|
|
60
|
+
按单源(D1–D4)降级执行。
|
|
61
|
+
|
|
62
|
+
## 输入
|
|
63
|
+
|
|
64
|
+
1. router 冻结的 `route_profile`(须含 `methods[]`,以及 `record_context.base_date`——**所有取数的基准日锚点**);
|
|
65
|
+
2. router 已准备并隔离的报告、评估说明、测算明细表等材料路径;
|
|
66
|
+
3. router 已验证的本次 DWS manifest,至少含 `references/00-KB装配表.md` 的路径键对应正文。
|
|
67
|
+
|
|
68
|
+
缺少任一项即记录 capability gap,不自行补取、不沿用上一轮材料。不得接收复核记录。
|
|
69
|
+
|
|
70
|
+
## 输出与边界门禁
|
|
71
|
+
|
|
72
|
+
- 输出交付层 `externalDataVerification`(供 HTML《外部数据核验》区渲染);字段契约与逐项核验要求见 [02-verification-workflow.md](references/02-verification-workflow.md),意见条目结构以本次实时下载的库内正文为准。
|
|
73
|
+
- **门禁**(详细规则见 01 / 02):不得跨宿主推断取数入口;不得把外部数据用作规则依据;不得声称双源复核;**口径无法统一时不得作数值判定**;需要核验而取数路径不可用时,按库内降级口径降级并在交付件中显式声明,不得静默跳过。
|
package/skills/crwu/crwu-audit-external-data/references/00-KB/350/243/205/351/205/215/350/241/250.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# references/00 · KB 逻辑装配表(crwu-audit-external-data)
|
|
2
|
+
|
|
3
|
+
> 本表 = 库内层级路径寻址键表(路径 = crwu-dws 查询到的知识库内路径;不写知识库名称 / 本地根路径 / 节点 nodeId)。
|
|
4
|
+
> 使用:命中本技能 → 本表路径并入本次审核下载清单 → 经 crwu-dws 按路径实时下载正文(下载时刻即最新)→
|
|
5
|
+
> 只读引用,出处 = 本次下载文件:行号 + exportedAt。文件零缓存:每次审核重新下载,不做任何正文缓存。
|
|
6
|
+
> 分工(单一事实源):**本技能 = 能力**——数据项抽取、连接器发现与调用、口径标准化、比对留痕;
|
|
7
|
+
> **知识库 = 口径**——表 A 触发范围、表 B 数据项触及、表 C 组合映射、表 D 源启用条件与降级、结论档位、
|
|
8
|
+
> 留痕要求、未检查项、员工补录机制;正文经 crwu-dws 实时下载获得,技能与知识库互不复制正文。
|
|
9
|
+
> 本环境的取数路径与"不启用万得"的落地方式见本技能 `references/01-connector-access.md`。
|
|
10
|
+
> 索引/校验工具:`crwu-dev-audit-skill-maintainer` 技能的 `scripts/kb_tool.py`(随该技能安装)。
|
|
11
|
+
> 路径键写法:逐字使用库内节点名(`by_path` 键 = 原样精确名,不折叠大小写/全半角);**单文件路径不带 `.md`**;
|
|
12
|
+
> 目录路径以 `/` 结尾并递归下载。清单外零下载。
|
|
13
|
+
> 知识库文件名 / 结构 / 装配范围变更 → 同步本表路径键并跑 `crwu-dev-audit-skill-maintainer` 技能的
|
|
14
|
+
> `scripts/kb_tool.py validate`。
|
|
15
|
+
|
|
16
|
+
| 需要 | 库内层级路径(寻址键;经 crwu-dws 实时下载后只读引用) |
|
|
17
|
+
| --- | --- |
|
|
18
|
+
| 外部数据核验模块规程(表 A 触发范围 / 表 B 数据项触及 / 表 C 组合映射 / 表 D 源启用条件与降级 / 结论档位 / 留痕 / 未检查项 / 员工补录机制) | `06-规则库/M-外部数据核验/01-模块-外部数据核验` |
|
|
19
|
+
| 模块标签登记(`modules` 词表,供装配筛选与校验) | `00-总纲/治理/标签词典` |
|
|
20
|
+
| 防幻觉与证据纪律 | `00-总纲/执行契约/02-防幻觉协议执行细则` |
|
|
21
|
+
| 统计口径与台账(未检查项、数据核验条目的统计口径) | `00-总纲/执行契约/03-审核统计与台账规范` |
|
|
22
|
+
| 术语一致性(口径、主源/副源等) | `00-总纲/治理/同义术语表` |
|
|
23
|
+
|
|
24
|
+
## 不由本表登记的内容
|
|
25
|
+
|
|
26
|
+
- **方法准则与对象/业务规则**:属 method / asset / business 轴,由 router 按各轴叶子装配;
|
|
27
|
+
本技能只在其被加载时叠加外部数据核验,不复制其他轴的根映射。
|
|
28
|
+
- **交付/送达层规范**:`crwu-audit/references/11-html-delivery-spec.md` 为本技能族内正式规范,
|
|
29
|
+
不经知识库下载(《外部数据核验》区定义见该文件)。
|
|
30
|
+
- **数据源连接与凭据**:属宿主连接器、Harness 技能与部署配置,见本技能
|
|
31
|
+
`references/01-connector-access.md`;知识库只规定"哪个数据项用什么源",不规定技术调用方式。
|
|
32
|
+
本环境不启用万得;库内表 D 为取数失败与降级口径,按单源(D1–D4)执行。
|
|
33
|
+
|
|
34
|
+
## 失败与出处
|
|
35
|
+
|
|
36
|
+
下载零命中、多命中、类型不符、跳过或失败时,以 manifest 状态记录对应 gap,不猜测近似路径,
|
|
37
|
+
也不凭缓存补正文。最终出处由 manifest 与本次下载物共同形成:本次下载文件、实际行号、库内路径、
|
|
38
|
+
运行时 `nodeId` 与 `exportedAt`;运行时值不得写回本文件。
|