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.
Files changed (479) hide show
  1. package/CHANGELOG.md +1516 -0
  2. package/LICENSE +26 -0
  3. package/README.en.md +204 -0
  4. package/README.md +521 -0
  5. package/SECURITY.md +39 -0
  6. package/bin/darwin-arm64/crwu +0 -0
  7. package/bin/darwin-arm64/dws +0 -0
  8. package/bin/darwin-arm64/ossutil +0 -0
  9. package/bin/manifest.json +82 -0
  10. package/bin/win32-x64/crwu.exe +0 -0
  11. package/bin/win32-x64/dws.exe +4 -0
  12. package/bin/win32-x64/ossutil.exe +0 -0
  13. package/common/skills/.synced.json +8 -0
  14. package/common/skills/crwu-dws/SKILL.md +208 -0
  15. package/common/skills/crwu-dws/references/00-/347/233/256/345/275/225/345/277/253/347/205/247schema.md +113 -0
  16. 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
  17. 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
  18. package/common/skills/crwu-dws/scripts/test_dws_source_contract.py +493 -0
  19. package/common/skills/crwu-h3yun-login/SKILL.md +130 -0
  20. package/common/skills/crwu-h3yun-query/SKILL.md +192 -0
  21. package/config/crwu-workbench.yml +26 -0
  22. package/cordis.patch.yml +46 -0
  23. package/lib/client.js +10346 -0
  24. package/lib/index.js +11584 -0
  25. package/package.json +119 -0
  26. package/scripts/prepare.mjs +59 -0
  27. package/skills/README.md +26 -0
  28. package/skills/crwu/crwu-audit/SKILL.md +152 -0
  29. package/skills/crwu/crwu-audit/references/00-input-and-route-profile.md +232 -0
  30. package/skills/crwu/crwu-audit/references/01-report-id-resolution.md +13 -0
  31. package/skills/crwu/crwu-audit/references/02-scope-classification.md +25 -0
  32. package/skills/crwu/crwu-audit/references/03-asset-classification.md +27 -0
  33. package/skills/crwu/crwu-audit/references/04-business-classification.md +63 -0
  34. package/skills/crwu/crwu-audit/references/05-method-classification.md +66 -0
  35. package/skills/crwu/crwu-audit/references/06-overlay-classification.md +42 -0
  36. package/skills/crwu/crwu-audit/references/07-skill-registry.md +57 -0
  37. package/skills/crwu/crwu-audit/references/08-union-dispatch-rules.md +142 -0
  38. package/skills/crwu/crwu-audit/references/09-review-risk-classification.md +85 -0
  39. package/skills/crwu/crwu-audit/references/10-capability-gap-proposal.md +68 -0
  40. package/skills/crwu/crwu-audit/references/11-html-delivery-spec.md +881 -0
  41. package/skills/crwu/crwu-audit/references/12-leaf-common-contract.md +202 -0
  42. package/skills/crwu/crwu-audit/references/13-dingtalk-result-publish.md +88 -0
  43. package/skills/crwu/crwu-audit/references/14-orchestration-workflow.md +52 -0
  44. package/skills/crwu/crwu-audit/references/99-maintenance.md +62 -0
  45. package/skills/crwu/crwu-audit/scripts/README.md +157 -0
  46. package/skills/crwu/crwu-audit/scripts/audit_delivery.py +2736 -0
  47. package/skills/crwu/crwu-audit/scripts/audit_result.schema.json +1659 -0
  48. package/skills/crwu/crwu-audit/scripts/examples/audit-result.sample.json +739 -0
  49. package/skills/crwu/crwu-audit/scripts/fetch_review_records.py +85 -0
  50. package/skills/crwu/crwu-audit/scripts/media_extract.py +513 -0
  51. package/skills/crwu/crwu-audit/scripts/prepare_materials.py +1252 -0
  52. package/skills/crwu/crwu-audit/scripts/test_audit_delivery.py +1678 -0
  53. package/skills/crwu/crwu-audit/scripts/test_audit_multiaxis_router.py +1339 -0
  54. package/skills/crwu/crwu-audit/scripts/test_fetch_review_records.py +77 -0
  55. package/skills/crwu/crwu-audit/scripts/test_media_extract.py +332 -0
  56. package/skills/crwu/crwu-audit/scripts/test_prepare_materials.py +1081 -0
  57. package/skills/crwu/crwu-audit/template/audit-report.html +435 -0
  58. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/SKILL.md +38 -0
  59. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/00-applicability.md +28 -0
  60. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/01-kb-assembly.md +31 -0
  61. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/02-review-focus.md +21 -0
  62. package/skills/crwu/crwu-audit-asset-asset-group-goodwill/references/03-common-contract.md +202 -0
  63. package/skills/crwu/crwu-audit-asset-debt/SKILL.md +38 -0
  64. package/skills/crwu/crwu-audit-asset-debt/references/00-applicability.md +40 -0
  65. package/skills/crwu/crwu-audit-asset-debt/references/01-kb-assembly.md +41 -0
  66. package/skills/crwu/crwu-audit-asset-debt/references/02-review-focus.md +54 -0
  67. package/skills/crwu/crwu-audit-asset-debt/references/03-common-contract.md +202 -0
  68. package/skills/crwu/crwu-audit-asset-enterprise-value/SKILL.md +38 -0
  69. package/skills/crwu/crwu-audit-asset-enterprise-value/references/00-applicability.md +31 -0
  70. package/skills/crwu/crwu-audit-asset-enterprise-value/references/01-kb-assembly.md +35 -0
  71. package/skills/crwu/crwu-audit-asset-enterprise-value/references/02-review-focus.md +33 -0
  72. package/skills/crwu/crwu-audit-asset-enterprise-value/references/03-common-contract.md +202 -0
  73. package/skills/crwu/crwu-audit-asset-equipment/SKILL.md +38 -0
  74. package/skills/crwu/crwu-audit-asset-equipment/references/00-applicability.md +40 -0
  75. package/skills/crwu/crwu-audit-asset-equipment/references/01-kb-assembly.md +39 -0
  76. package/skills/crwu/crwu-audit-asset-equipment/references/02-review-focus.md +52 -0
  77. package/skills/crwu/crwu-audit-asset-equipment/references/03-common-contract.md +202 -0
  78. package/skills/crwu/crwu-audit-asset-intangible/SKILL.md +38 -0
  79. package/skills/crwu/crwu-audit-asset-intangible/references/00-applicability.md +36 -0
  80. package/skills/crwu/crwu-audit-asset-intangible/references/01-kb-assembly.md +40 -0
  81. package/skills/crwu/crwu-audit-asset-intangible/references/02-review-focus.md +68 -0
  82. package/skills/crwu/crwu-audit-asset-intangible/references/03-common-contract.md +202 -0
  83. package/skills/crwu/crwu-audit-asset-inventory/SKILL.md +38 -0
  84. package/skills/crwu/crwu-audit-asset-inventory/references/00-applicability.md +28 -0
  85. package/skills/crwu/crwu-audit-asset-inventory/references/01-kb-assembly.md +31 -0
  86. package/skills/crwu/crwu-audit-asset-inventory/references/02-review-focus.md +21 -0
  87. package/skills/crwu/crwu-audit-asset-inventory/references/03-common-contract.md +202 -0
  88. package/skills/crwu/crwu-audit-asset-mining-right/SKILL.md +38 -0
  89. package/skills/crwu/crwu-audit-asset-mining-right/references/00-applicability.md +31 -0
  90. package/skills/crwu/crwu-audit-asset-mining-right/references/01-kb-assembly.md +35 -0
  91. package/skills/crwu/crwu-audit-asset-mining-right/references/02-review-focus.md +33 -0
  92. package/skills/crwu/crwu-audit-asset-mining-right/references/03-common-contract.md +202 -0
  93. package/skills/crwu/crwu-audit-asset-other/SKILL.md +38 -0
  94. package/skills/crwu/crwu-audit-asset-other/references/00-applicability.md +28 -0
  95. package/skills/crwu/crwu-audit-asset-other/references/01-kb-assembly.md +31 -0
  96. package/skills/crwu/crwu-audit-asset-other/references/02-review-focus.md +21 -0
  97. package/skills/crwu/crwu-audit-asset-other/references/03-common-contract.md +202 -0
  98. package/skills/crwu/crwu-audit-asset-portfolio/SKILL.md +38 -0
  99. package/skills/crwu/crwu-audit-asset-portfolio/references/00-applicability.md +28 -0
  100. package/skills/crwu/crwu-audit-asset-portfolio/references/01-kb-assembly.md +31 -0
  101. package/skills/crwu/crwu-audit-asset-portfolio/references/02-review-focus.md +21 -0
  102. package/skills/crwu/crwu-audit-asset-portfolio/references/03-common-contract.md +202 -0
  103. package/skills/crwu/crwu-audit-asset-realestate/SKILL.md +38 -0
  104. package/skills/crwu/crwu-audit-asset-realestate/references/00-applicability.md +43 -0
  105. package/skills/crwu/crwu-audit-asset-realestate/references/01-kb-assembly.md +75 -0
  106. package/skills/crwu/crwu-audit-asset-realestate/references/02-review-focus.md +93 -0
  107. package/skills/crwu/crwu-audit-asset-realestate/references/03-common-contract.md +202 -0
  108. package/skills/crwu/crwu-audit-asset-scrap-materials/SKILL.md +38 -0
  109. package/skills/crwu/crwu-audit-asset-scrap-materials/references/00-applicability.md +28 -0
  110. package/skills/crwu/crwu-audit-asset-scrap-materials/references/01-kb-assembly.md +31 -0
  111. package/skills/crwu/crwu-audit-asset-scrap-materials/references/02-review-focus.md +21 -0
  112. package/skills/crwu/crwu-audit-asset-scrap-materials/references/03-common-contract.md +202 -0
  113. package/skills/crwu/crwu-audit-asset-transport-equipment/SKILL.md +38 -0
  114. package/skills/crwu/crwu-audit-asset-transport-equipment/references/00-applicability.md +31 -0
  115. package/skills/crwu/crwu-audit-asset-transport-equipment/references/01-kb-assembly.md +35 -0
  116. package/skills/crwu/crwu-audit-asset-transport-equipment/references/02-review-focus.md +33 -0
  117. package/skills/crwu/crwu-audit-asset-transport-equipment/references/03-common-contract.md +202 -0
  118. package/skills/crwu/crwu-audit-biz-asset-operation/SKILL.md +38 -0
  119. package/skills/crwu/crwu-audit-biz-asset-operation/references/00-applicability.md +30 -0
  120. package/skills/crwu/crwu-audit-biz-asset-operation/references/01-kb-assembly.md +32 -0
  121. package/skills/crwu/crwu-audit-biz-asset-operation/references/02-review-focus.md +42 -0
  122. package/skills/crwu/crwu-audit-biz-asset-operation/references/03-common-contract.md +202 -0
  123. package/skills/crwu/crwu-audit-biz-consulting-review/SKILL.md +38 -0
  124. package/skills/crwu/crwu-audit-biz-consulting-review/references/00-applicability.md +30 -0
  125. package/skills/crwu/crwu-audit-biz-consulting-review/references/01-kb-assembly.md +32 -0
  126. package/skills/crwu/crwu-audit-biz-consulting-review/references/02-review-focus.md +40 -0
  127. package/skills/crwu/crwu-audit-biz-consulting-review/references/03-common-contract.md +202 -0
  128. package/skills/crwu/crwu-audit-biz-financial-reporting/SKILL.md +38 -0
  129. package/skills/crwu/crwu-audit-biz-financial-reporting/references/00-applicability.md +41 -0
  130. package/skills/crwu/crwu-audit-biz-financial-reporting/references/01-kb-assembly.md +40 -0
  131. package/skills/crwu/crwu-audit-biz-financial-reporting/references/02-review-focus.md +64 -0
  132. package/skills/crwu/crwu-audit-biz-financial-reporting/references/03-common-contract.md +202 -0
  133. package/skills/crwu/crwu-audit-biz-financing-debt/SKILL.md +38 -0
  134. package/skills/crwu/crwu-audit-biz-financing-debt/references/00-applicability.md +31 -0
  135. package/skills/crwu/crwu-audit-biz-financing-debt/references/01-kb-assembly.md +34 -0
  136. package/skills/crwu/crwu-audit-biz-financing-debt/references/02-review-focus.md +47 -0
  137. package/skills/crwu/crwu-audit-biz-financing-debt/references/03-common-contract.md +202 -0
  138. package/skills/crwu/crwu-audit-biz-investment-capital/SKILL.md +38 -0
  139. package/skills/crwu/crwu-audit-biz-investment-capital/references/00-applicability.md +31 -0
  140. package/skills/crwu/crwu-audit-biz-investment-capital/references/01-kb-assembly.md +34 -0
  141. package/skills/crwu/crwu-audit-biz-investment-capital/references/02-review-focus.md +47 -0
  142. package/skills/crwu/crwu-audit-biz-investment-capital/references/03-common-contract.md +202 -0
  143. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/SKILL.md +38 -0
  144. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/00-applicability.md +30 -0
  145. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/01-kb-assembly.md +32 -0
  146. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/02-review-focus.md +40 -0
  147. package/skills/crwu/crwu-audit-biz-judicial-liquidation-compensation/references/03-common-contract.md +202 -0
  148. package/skills/crwu/crwu-audit-biz-tax-history/SKILL.md +38 -0
  149. package/skills/crwu/crwu-audit-biz-tax-history/references/00-applicability.md +29 -0
  150. package/skills/crwu/crwu-audit-biz-tax-history/references/01-kb-assembly.md +30 -0
  151. package/skills/crwu/crwu-audit-biz-tax-history/references/02-review-focus.md +33 -0
  152. package/skills/crwu/crwu-audit-biz-tax-history/references/03-common-contract.md +202 -0
  153. package/skills/crwu/crwu-audit-biz-transaction-disposal/SKILL.md +38 -0
  154. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/00-applicability.md +31 -0
  155. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/01-kb-assembly.md +34 -0
  156. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/02-review-focus.md +47 -0
  157. package/skills/crwu/crwu-audit-biz-transaction-disposal/references/03-common-contract.md +202 -0
  158. package/skills/crwu/crwu-audit-datacheck/SKILL.md +59 -0
  159. package/skills/crwu/crwu-audit-datacheck/references/00-KB/350/243/205/351/205/215/350/241/250.md +25 -0
  160. package/skills/crwu/crwu-audit-datacheck/references/01-runtime-and-check-catalog.md +139 -0
  161. package/skills/crwu/crwu-audit-datacheck/scripts/recalc_check.py +521 -0
  162. package/skills/crwu/crwu-audit-datacheck/scripts/test_recalc_check.py +419 -0
  163. package/skills/crwu/crwu-audit-datacheck/scripts/test_skill_self_containment.py +44 -0
  164. package/skills/crwu/crwu-audit-external-data/SKILL.md +73 -0
  165. package/skills/crwu/crwu-audit-external-data/references/00-KB/350/243/205/351/205/215/350/241/250.md +38 -0
  166. package/skills/crwu/crwu-audit-external-data/references/01-connector-access.md +116 -0
  167. package/skills/crwu/crwu-audit-external-data/references/02-verification-workflow.md +78 -0
  168. package/skills/crwu/crwu-audit-external-data/scripts/connector_probe.py +374 -0
  169. package/skills/crwu/crwu-audit-external-data/scripts/test_connector_probe.py +264 -0
  170. package/skills/crwu/crwu-audit-output-filter/SKILL.md +34 -0
  171. package/skills/crwu/crwu-audit-output-filter/references/00-applicability.md +7 -0
  172. package/skills/crwu/crwu-audit-output-filter/references/01-kb-assembly.md +11 -0
  173. package/skills/crwu/crwu-audit-output-filter/references/02-review-focus.md +25 -0
  174. package/skills/crwu/crwu-audit-public-general-standards/SKILL.md +46 -0
  175. package/skills/crwu/crwu-audit-public-general-standards/references/00-applicability.md +41 -0
  176. package/skills/crwu/crwu-audit-public-general-standards/references/01-kb-assembly.md +66 -0
  177. package/skills/crwu/crwu-audit-public-general-standards/references/02-review-focus.md +111 -0
  178. package/skills/crwu/crwu-audit-public-general-standards/references/03-execution-contract.md +89 -0
  179. package/skills/crwu/crwu-dev-audit-optimize/SKILL.md +98 -0
  180. 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
  181. 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
  182. 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
  183. 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
  184. package/skills/crwu/crwu-dev-audit-optimize/scripts/examples/gap-analysis.sample.json +116 -0
  185. package/skills/crwu/crwu-dev-audit-optimize/scripts/gap_analysis.schema.json +33 -0
  186. package/skills/crwu/crwu-dev-audit-optimize/scripts/gap_analysis_delivery.py +475 -0
  187. package/skills/crwu/crwu-dev-audit-optimize/scripts/test_gap_analysis_delivery.py +855 -0
  188. package/skills/crwu/crwu-dev-audit-optimize/template/NOTICE.echarts.txt +7 -0
  189. package/skills/crwu/crwu-dev-audit-optimize/template/echarts.min.js +45 -0
  190. package/skills/crwu/crwu-dev-audit-optimize/template/gap-analysis-report.html +71 -0
  191. package/skills/crwu/crwu-dev-audit-skill-maintainer/SKILL.md +74 -0
  192. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/00-responsibility-and-modes.md +62 -0
  193. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/01-kb-source-discovery.md +89 -0
  194. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/02-child-skill-contract.md +99 -0
  195. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/03-review-item-execution-contract.md +51 -0
  196. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/04-registry-and-mapping-update.md +73 -0
  197. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/05-validation-and-delivery.md +127 -0
  198. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/06-live-routing-reconciliation.md +136 -0
  199. package/skills/crwu/crwu-dev-audit-skill-maintainer/references/07-kb-skill-map.md +411 -0
  200. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/README.md +200 -0
  201. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/check_audit_skill_mappings.py +2477 -0
  202. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/kb_tool.py +577 -0
  203. package/skills/crwu/crwu-dev-audit-skill-maintainer/scripts/test_audit_skill_maintainer.py +5097 -0
  204. package/skills/dws/LICENSE +178 -0
  205. package/skills/dws/NOTICE +17 -0
  206. package/skills/dws/dingtalk-aisearch/SKILL.md +83 -0
  207. package/skills/dws/dingtalk-aisearch/references/aisearch.md +249 -0
  208. package/skills/dws/dingtalk-aisearch/references/intent-guide.md +15 -0
  209. package/skills/dws/dingtalk-aisearch/references/lite-recipes.md +31 -0
  210. package/skills/dws/dingtalk-aitable/SKILL.md +139 -0
  211. package/skills/dws/dingtalk-aitable/references/06-data-analytics.md +11 -0
  212. package/skills/dws/dingtalk-aitable/references/aitable/aitable-advperm.md +251 -0
  213. package/skills/dws/dingtalk-aitable/references/aitable/aitable-attachment.md +49 -0
  214. package/skills/dws/dingtalk-aitable/references/aitable/aitable-best-practices.md +48 -0
  215. package/skills/dws/dingtalk-aitable/references/aitable/aitable-cell-value.md +346 -0
  216. package/skills/dws/dingtalk-aitable/references/aitable/aitable-dashboard-chart.md +46 -0
  217. package/skills/dws/dingtalk-aitable/references/aitable/aitable-data-analysis-sop.md +131 -0
  218. package/skills/dws/dingtalk-aitable/references/aitable/aitable-datasource.md +272 -0
  219. package/skills/dws/dingtalk-aitable/references/aitable/aitable-error-recovery.md +128 -0
  220. package/skills/dws/dingtalk-aitable/references/aitable/aitable-export-import.md +113 -0
  221. package/skills/dws/dingtalk-aitable/references/aitable/aitable-field-properties.md +238 -0
  222. package/skills/dws/dingtalk-aitable/references/aitable/aitable-field.md +186 -0
  223. package/skills/dws/dingtalk-aitable/references/aitable/aitable-filter-sort.md +135 -0
  224. package/skills/dws/dingtalk-aitable/references/aitable/aitable-form.md +130 -0
  225. package/skills/dws/dingtalk-aitable/references/aitable/aitable-formula-guide.md +224 -0
  226. package/skills/dws/dingtalk-aitable/references/aitable/aitable-primary-doc.md +58 -0
  227. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-create.md +52 -0
  228. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-delete.md +20 -0
  229. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-history.md +97 -0
  230. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-name-key.md +47 -0
  231. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-query.md +120 -0
  232. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-share.md +54 -0
  233. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-stats.md +59 -0
  234. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-update.md +66 -0
  235. package/skills/dws/dingtalk-aitable/references/aitable/aitable-record-upsert.md +89 -0
  236. package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-config.md +140 -0
  237. package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-extras.md +195 -0
  238. package/skills/dws/dingtalk-aitable/references/aitable/aitable-view-types.md +95 -0
  239. package/skills/dws/dingtalk-aitable/references/aitable/aitable-workflow.md +384 -0
  240. package/skills/dws/dingtalk-aitable/references/aitable-record-ops.md +80 -0
  241. package/skills/dws/dingtalk-aitable/references/aitable-section.md +30 -0
  242. package/skills/dws/dingtalk-aitable/references/aitable.md +59 -0
  243. package/skills/dws/dingtalk-aitable/references/field-rules.md +17 -0
  244. package/skills/dws/dingtalk-aitable/references/intent-guide.md +17 -0
  245. package/skills/dws/dingtalk-aitable/references/recipes/conventions.md +44 -0
  246. package/skills/dws/dingtalk-aitable/references/url-patterns.md +144 -0
  247. package/skills/dws/dingtalk-aitable/scripts/aitable_export_via_task.py +210 -0
  248. package/skills/dws/dingtalk-aitable/scripts/aitable_import_via_task.py +173 -0
  249. package/skills/dws/dingtalk-aitable/scripts/bulk_add_fields.py +273 -0
  250. package/skills/dws/dingtalk-aitable/scripts/import_records.py +333 -0
  251. package/skills/dws/dingtalk-aitable/scripts/upload_attachment.py +190 -0
  252. package/skills/dws/dingtalk-calendar/SKILL.md +137 -0
  253. package/skills/dws/dingtalk-calendar/references/03-meeting.md +56 -0
  254. package/skills/dws/dingtalk-calendar/references/calendar.md +760 -0
  255. package/skills/dws/dingtalk-calendar/references/intent-guide.md +9 -0
  256. package/skills/dws/dingtalk-calendar/references/lite-recipes.md +25 -0
  257. package/skills/dws/dingtalk-calendar/scripts/calendar_free_slot_finder.py +199 -0
  258. package/skills/dws/dingtalk-calendar/scripts/calendar_schedule_meeting.py +233 -0
  259. package/skills/dws/dingtalk-calendar/scripts/calendar_today_agenda.py +139 -0
  260. package/skills/dws/dingtalk-chat/SKILL.md +127 -0
  261. package/skills/dws/dingtalk-chat/references/01-messaging.md +103 -0
  262. package/skills/dws/dingtalk-chat/references/card/callback.md +10 -0
  263. package/skills/dws/dingtalk-chat/references/card/create.md +27 -0
  264. package/skills/dws/dingtalk-chat/references/card/schema.md +14 -0
  265. package/skills/dws/dingtalk-chat/references/card/update.md +13 -0
  266. package/skills/dws/dingtalk-chat/references/chat/chat-bot.md +187 -0
  267. package/skills/dws/dingtalk-chat/references/chat/chat-conversation.md +165 -0
  268. package/skills/dws/dingtalk-chat/references/chat/group-admin.md +144 -0
  269. package/skills/dws/dingtalk-chat/references/chat/group-discovery.md +121 -0
  270. package/skills/dws/dingtalk-chat/references/chat/message-actions.md +132 -0
  271. package/skills/dws/dingtalk-chat/references/chat/message-media.md +76 -0
  272. package/skills/dws/dingtalk-chat/references/chat/message-query.md +135 -0
  273. package/skills/dws/dingtalk-chat/references/chat/thread.md +46 -0
  274. package/skills/dws/dingtalk-chat/references/chat-emoji-list.md +216 -0
  275. package/skills/dws/dingtalk-chat/references/chat.md +140 -0
  276. package/skills/dws/dingtalk-chat/references/contracts.md +70 -0
  277. package/skills/dws/dingtalk-chat/references/intent-guide.md +56 -0
  278. package/skills/dws/dingtalk-contact/SKILL.md +122 -0
  279. package/skills/dws/dingtalk-contact/references/08-directory.md +51 -0
  280. package/skills/dws/dingtalk-contact/references/contact.md +595 -0
  281. package/skills/dws/dingtalk-contact/references/intent-guide.md +14 -0
  282. package/skills/dws/dingtalk-contact/references/lite-recipes.md +30 -0
  283. package/skills/dws/dingtalk-contact/references/recipes/conventions.md +44 -0
  284. package/skills/dws/dingtalk-contact/scripts/contact_dept_members.py +130 -0
  285. package/skills/dws/dingtalk-doc/SKILL.md +112 -0
  286. package/skills/dws/dingtalk-doc/references/04-document.md +57 -0
  287. package/skills/dws/dingtalk-doc/references/contracts.md +40 -0
  288. package/skills/dws/dingtalk-doc/references/doc/doc-block.md +39 -0
  289. package/skills/dws/dingtalk-doc/references/doc/doc-comment.md +29 -0
  290. package/skills/dws/dingtalk-doc/references/doc/doc-create.md +54 -0
  291. package/skills/dws/dingtalk-doc/references/doc/doc-export.md +30 -0
  292. package/skills/dws/dingtalk-doc/references/doc/doc-import.md +28 -0
  293. package/skills/dws/dingtalk-doc/references/doc/doc-info.md +12 -0
  294. package/skills/dws/dingtalk-doc/references/doc/doc-media.md +46 -0
  295. package/skills/dws/dingtalk-doc/references/doc/doc-read.md +56 -0
  296. package/skills/dws/dingtalk-doc/references/doc/doc-update.md +87 -0
  297. package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-cookbook.md +469 -0
  298. package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-schema.json +526 -0
  299. package/skills/dws/dingtalk-doc/references/doc/format/doc-jsonml-schema.md +711 -0
  300. package/skills/dws/dingtalk-doc/references/doc/style/doc-create-workflow.md +414 -0
  301. package/skills/dws/dingtalk-doc/references/doc/style/doc-style-guideline.md +404 -0
  302. package/skills/dws/dingtalk-doc/references/doc/style/doc-update-workflow.md +316 -0
  303. package/skills/dws/dingtalk-doc/references/doc.md +82 -0
  304. package/skills/dws/dingtalk-doc/references/intent-guide.md +20 -0
  305. package/skills/dws/dingtalk-drive/SKILL.md +128 -0
  306. package/skills/dws/dingtalk-drive/references/drive.md +126 -0
  307. package/skills/dws/dingtalk-drive/references/folder-sync.md +40 -0
  308. package/skills/dws/dingtalk-drive/references/intent-guide.md +22 -0
  309. package/skills/dws/dingtalk-drive/references/lite-recipes.md +39 -0
  310. package/skills/dws/dingtalk-event/SKILL.md +106 -0
  311. package/skills/dws/dingtalk-event/references/event-im-keys.md +54 -0
  312. package/skills/dws/dingtalk-event/references/event-im-lifecycle.md +35 -0
  313. package/skills/dws/dingtalk-event/references/event-im-operations.md +52 -0
  314. package/skills/dws/dingtalk-event/references/event-im-output.md +39 -0
  315. package/skills/dws/dingtalk-event/references/event-im.md +58 -0
  316. package/skills/dws/dingtalk-event/references/event-oa.md +155 -0
  317. package/skills/dws/dingtalk-event/references/event-todo.md +50 -0
  318. package/skills/dws/dingtalk-event/references/event-voip.md +69 -0
  319. package/skills/dws/dingtalk-mail/SKILL.md +113 -0
  320. package/skills/dws/dingtalk-mail/references/09-mail.md +45 -0
  321. package/skills/dws/dingtalk-mail/references/intent-guide.md +8 -0
  322. package/skills/dws/dingtalk-mail/references/lite-recipes.md +45 -0
  323. package/skills/dws/dingtalk-mail/references/mail.md +1889 -0
  324. package/skills/dws/dingtalk-mail/references/recipes/conventions.md +44 -0
  325. package/skills/dws/dingtalk-mail/scripts/mail_send_with_cc.py +122 -0
  326. package/skills/dws/dingtalk-mail/scripts/mail_unread_summary.py +114 -0
  327. package/skills/dws/dingtalk-minutes/SKILL.md +116 -0
  328. package/skills/dws/dingtalk-minutes/references/07-minutes.md +149 -0
  329. package/skills/dws/dingtalk-minutes/references/10-minutes-speaker-match.md +32 -0
  330. package/skills/dws/dingtalk-minutes/references/11-minutes-speaker-correct.md +40 -0
  331. package/skills/dws/dingtalk-minutes/references/intent-guide.md +79 -0
  332. package/skills/dws/dingtalk-minutes/references/lite-recipes.md +25 -0
  333. package/skills/dws/dingtalk-minutes/references/minutes.md +210 -0
  334. package/skills/dws/dingtalk-minutes/references/recipes/conventions.md +33 -0
  335. package/skills/dws/dingtalk-minutes/scripts/minutes_recent_summary.py +196 -0
  336. package/skills/dws/dingtalk-minutes/scripts/test_minutes_scripts.py +222 -0
  337. package/skills/dws/dingtalk-misc/SKILL.md +55 -0
  338. package/skills/dws/dingtalk-misc/references/05-reporting.md +29 -0
  339. package/skills/dws/dingtalk-misc/references/agoal.md +302 -0
  340. package/skills/dws/dingtalk-misc/references/attendance-intent-guide.md +7 -0
  341. package/skills/dws/dingtalk-misc/references/attendance-report.md +109 -0
  342. package/skills/dws/dingtalk-misc/references/attendance-schedule.md +115 -0
  343. package/skills/dws/dingtalk-misc/references/attendance-vacation.md +129 -0
  344. package/skills/dws/dingtalk-misc/references/attendance.md +149 -0
  345. package/skills/dws/dingtalk-misc/references/dev/app.md +42 -0
  346. package/skills/dws/dingtalk-misc/references/dev/connect.md +108 -0
  347. package/skills/dws/dingtalk-misc/references/dev/credentials.md +26 -0
  348. package/skills/dws/dingtalk-misc/references/dev/dev-index.md +13 -0
  349. package/skills/dws/dingtalk-misc/references/dev/event.md +47 -0
  350. package/skills/dws/dingtalk-misc/references/dev/mcp.md +106 -0
  351. package/skills/dws/dingtalk-misc/references/dev/member.md +19 -0
  352. package/skills/dws/dingtalk-misc/references/dev/permission.md +56 -0
  353. package/skills/dws/dingtalk-misc/references/dev/recipes.md +58 -0
  354. package/skills/dws/dingtalk-misc/references/dev/robot.md +74 -0
  355. package/skills/dws/dingtalk-misc/references/dev/security.md +21 -0
  356. package/skills/dws/dingtalk-misc/references/dev/version.md +99 -0
  357. package/skills/dws/dingtalk-misc/references/dev/webapp.md +22 -0
  358. package/skills/dws/dingtalk-misc/references/devapp.md +148 -0
  359. package/skills/dws/dingtalk-misc/references/devdoc-intent-guide.md +7 -0
  360. package/skills/dws/dingtalk-misc/references/devdoc.md +42 -0
  361. package/skills/dws/dingtalk-misc/references/ding.md +184 -0
  362. package/skills/dws/dingtalk-misc/references/hrbrain.md +67 -0
  363. package/skills/dws/dingtalk-misc/references/live.md +23 -0
  364. package/skills/dws/dingtalk-misc/references/markdown.md +167 -0
  365. package/skills/dws/dingtalk-misc/references/oa/oa-form-components.md +345 -0
  366. package/skills/dws/dingtalk-misc/references/oa/oa-process-nodes.md +374 -0
  367. package/skills/dws/dingtalk-misc/references/oa.md +1014 -0
  368. package/skills/dws/dingtalk-misc/references/openapi-explorer.md +47 -0
  369. package/skills/dws/dingtalk-misc/references/pat.md +52 -0
  370. package/skills/dws/dingtalk-misc/references/profile.md +41 -0
  371. package/skills/dws/dingtalk-misc/references/recruit.md +89 -0
  372. package/skills/dws/dingtalk-misc/references/report-conventions.md +44 -0
  373. package/skills/dws/dingtalk-misc/references/report-intent-guide.md +11 -0
  374. package/skills/dws/dingtalk-misc/references/report-lite-recipes.md +25 -0
  375. package/skills/dws/dingtalk-misc/references/report.md +109 -0
  376. package/skills/dws/dingtalk-misc/references/sheet/sheet-batch-operations.md +104 -0
  377. package/skills/dws/dingtalk-misc/references/sheet/sheet-chart.md +69 -0
  378. package/skills/dws/dingtalk-misc/references/sheet/sheet-comment.md +166 -0
  379. package/skills/dws/dingtalk-misc/references/sheet/sheet-conditional-format.md +59 -0
  380. package/skills/dws/dingtalk-misc/references/sheet/sheet-dimension-operations.md +60 -0
  381. package/skills/dws/dingtalk-misc/references/sheet/sheet-dropdown.md +103 -0
  382. package/skills/dws/dingtalk-misc/references/sheet/sheet-export.md +135 -0
  383. package/skills/dws/dingtalk-misc/references/sheet/sheet-filter-view.md +51 -0
  384. package/skills/dws/dingtalk-misc/references/sheet/sheet-filter.md +181 -0
  385. package/skills/dws/dingtalk-misc/references/sheet/sheet-formula.md +192 -0
  386. package/skills/dws/dingtalk-misc/references/sheet/sheet-import.md +76 -0
  387. package/skills/dws/dingtalk-misc/references/sheet/sheet-media-image.md +263 -0
  388. package/skills/dws/dingtalk-misc/references/sheet/sheet-pivot-table.md +292 -0
  389. package/skills/dws/dingtalk-misc/references/sheet/sheet-range-operations.md +161 -0
  390. package/skills/dws/dingtalk-misc/references/sheet/sheet-read-data.md +60 -0
  391. package/skills/dws/dingtalk-misc/references/sheet/sheet-revision-changeset.md +46 -0
  392. package/skills/dws/dingtalk-misc/references/sheet/sheet-search-replace.md +120 -0
  393. package/skills/dws/dingtalk-misc/references/sheet/sheet-style-format.md +71 -0
  394. package/skills/dws/dingtalk-misc/references/sheet/sheet-version.md +84 -0
  395. package/skills/dws/dingtalk-misc/references/sheet/sheet-workbook.md +59 -0
  396. package/skills/dws/dingtalk-misc/references/sheet/sheet-write-data.md +93 -0
  397. package/skills/dws/dingtalk-misc/references/sheet-conventions.md +44 -0
  398. package/skills/dws/dingtalk-misc/references/sheet-intent-guide.md +12 -0
  399. package/skills/dws/dingtalk-misc/references/sheet.md +166 -0
  400. package/skills/dws/dingtalk-misc/references/skill.md +98 -0
  401. package/skills/dws/dingtalk-misc/references/unsupported-scripts.md +49 -0
  402. package/skills/dws/dingtalk-misc/references/url-patterns.md +144 -0
  403. package/skills/dws/dingtalk-misc/references/whiteboard/compose.md +200 -0
  404. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/01-overview.md +57 -0
  405. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/02-query.md +288 -0
  406. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/03-update.md +249 -0
  407. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/04-text-style.md +395 -0
  408. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/05-shape-frame-group-connector.md +186 -0
  409. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/06-vector-icon-path.md +313 -0
  410. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/07-examples-errors-write-support.md +270 -0
  411. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1/08-catalogs.md +61 -0
  412. package/skills/dws/dingtalk-misc/references/whiteboard/open-nodes-v1.md +54 -0
  413. package/skills/dws/dingtalk-misc/references/whiteboard/replace.md +41 -0
  414. package/skills/dws/dingtalk-misc/references/whiteboard/vector.md +51 -0
  415. package/skills/dws/dingtalk-misc/references/whiteboard.md +115 -0
  416. package/skills/dws/dingtalk-misc/scripts/aiapp_create_and_poll.py +138 -0
  417. package/skills/dws/dingtalk-misc/scripts/attendance_my_record.py +91 -0
  418. package/skills/dws/dingtalk-misc/scripts/attendance_report_checkin.py +440 -0
  419. package/skills/dws/dingtalk-misc/scripts/attendance_report_common.py +1698 -0
  420. package/skills/dws/dingtalk-misc/scripts/attendance_report_daily.py +558 -0
  421. package/skills/dws/dingtalk-misc/scripts/attendance_report_detail.py +809 -0
  422. package/skills/dws/dingtalk-misc/scripts/attendance_report_monthly.py +758 -0
  423. package/skills/dws/dingtalk-misc/scripts/attendance_report_record.py +947 -0
  424. package/skills/dws/dingtalk-misc/scripts/attendance_schedule_export.py +344 -0
  425. package/skills/dws/dingtalk-misc/scripts/attendance_schedule_import.py +498 -0
  426. package/skills/dws/dingtalk-misc/scripts/attendance_team_shift.py +89 -0
  427. package/skills/dws/dingtalk-misc/scripts/attendance_vacation_balance.py +617 -0
  428. package/skills/dws/dingtalk-misc/scripts/finance_daily_cashflow.py +70 -0
  429. package/skills/dws/dingtalk-misc/scripts/finance_expense_flow.py +138 -0
  430. package/skills/dws/dingtalk-misc/scripts/oa_batch_approve.py +158 -0
  431. package/skills/dws/dingtalk-misc/scripts/oa_pending_review.py +132 -0
  432. package/skills/dws/dingtalk-misc/scripts/report_received_today.py +315 -0
  433. package/skills/dws/dingtalk-misc/scripts/yida_custom_page_update.py +401 -0
  434. package/skills/dws/dingtalk-misc/scripts/yida_form_builder.py +526 -0
  435. package/skills/dws/dingtalk-misc/scripts/yida_form_fields.py +315 -0
  436. package/skills/dws/dingtalk-misc/scripts/yida_form_inspector.py +311 -0
  437. package/skills/dws/dingtalk-misc/scripts/yida_form_update.py +185 -0
  438. package/skills/dws/dingtalk-misc/scripts/yida_jsx_pipeline.py +1588 -0
  439. package/skills/dws/dingtalk-misc/scripts/yida_page_compiler.py +1441 -0
  440. package/skills/dws/dingtalk-misc/scripts/yida_page_generate.py +514 -0
  441. package/skills/dws/dingtalk-misc/scripts/yida_page_schema.py +519 -0
  442. package/skills/dws/dingtalk-misc/scripts/yida_page_self_check.py +398 -0
  443. package/skills/dws/dingtalk-misc/scripts/yida_process_flow.py +1478 -0
  444. package/skills/dws/dingtalk-misc/scripts/yida_process_update.py +589 -0
  445. package/skills/dws/dingtalk-misc/scripts/yida_report_builder.py +494 -0
  446. package/skills/dws/dingtalk-misc/scripts/yida_report_charts.py +1434 -0
  447. package/skills/dws/dingtalk-misc/scripts/yida_report_update.py +244 -0
  448. package/skills/dws/dingtalk-misc/scripts/yida_schema_common.py +340 -0
  449. package/skills/dws/dingtalk-shared/SKILL.md +83 -0
  450. package/skills/dws/dingtalk-shared/references/capability-limits.md +31 -0
  451. package/skills/dws/dingtalk-shared/references/channel-login.md +26 -0
  452. package/skills/dws/dingtalk-shared/references/confirmation.md +59 -0
  453. package/skills/dws/dingtalk-shared/references/error-codes.md +155 -0
  454. package/skills/dws/dingtalk-shared/references/global-reference.md +122 -0
  455. package/skills/dws/dingtalk-shared/references/intent-guide.md +537 -0
  456. package/skills/dws/dingtalk-shared/references/recipes/conventions.md +45 -0
  457. package/skills/dws/dingtalk-shared/references/recipes/lite-catalog.md +275 -0
  458. package/skills/dws/dingtalk-shared/references/recipes/meta.md +67 -0
  459. package/skills/dws/dingtalk-shared/references/routing.md +52 -0
  460. package/skills/dws/dingtalk-shared/references/runtime-contract.md +11 -0
  461. package/skills/dws/dingtalk-shared/references/schema-usage.md +88 -0
  462. package/skills/dws/dingtalk-shared/references/url-patterns.md +144 -0
  463. package/skills/dws/dingtalk-shared/references/workflow-routing.md +45 -0
  464. package/skills/dws/dingtalk-todo/SKILL.md +119 -0
  465. package/skills/dws/dingtalk-todo/references/02-task.md +70 -0
  466. package/skills/dws/dingtalk-todo/references/intent-guide.md +15 -0
  467. package/skills/dws/dingtalk-todo/references/lite-recipes.md +68 -0
  468. package/skills/dws/dingtalk-todo/references/recipes/conventions.md +44 -0
  469. package/skills/dws/dingtalk-todo/references/todo.md +517 -0
  470. package/skills/dws/dingtalk-todo/scripts/todo_batch_create.py +354 -0
  471. package/skills/dws/dingtalk-todo/scripts/todo_daily_summary.py +153 -0
  472. package/skills/dws/dingtalk-todo/scripts/todo_overdue_check.py +101 -0
  473. package/skills/dws/dingtalk-wiki/SKILL.md +117 -0
  474. package/skills/dws/dingtalk-wiki/references/intent-guide.md +14 -0
  475. package/skills/dws/dingtalk-wiki/references/lite-recipes.md +44 -0
  476. package/skills/dws/dingtalk-wiki/references/wiki-members.md +32 -0
  477. package/skills/dws/dingtalk-wiki/references/wiki-node-ops.md +46 -0
  478. package/skills/dws/dingtalk-wiki/references/wiki.md +65 -0
  479. package/skills/dws/provenance.json +27 -0
@@ -0,0 +1,116 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "reportId": "GAP-BG8169-20260915",
4
+ "generatedAt": "2026-09-15T16:00:00+08:00",
5
+ "project": {
6
+ "projectId": "BG8169",
7
+ "auditResult": "审核意见.BG8169.json",
8
+ "reviewFiles": ["人工复核意见.xlsx"],
9
+ "finalMaterials": ["评估报告-最终版.docx", "市场法测算.xlsx"]
10
+ },
11
+ "baselines": {
12
+ "auditSnapshot": {
13
+ "manifest": "knowledge/.crwu-manifest.jsonl",
14
+ "verifiedSameProject": true,
15
+ "exportedAt": "2026-09-15T09:00:00+08:00"
16
+ },
17
+ "currentKbSnapshot": {
18
+ "readOnly": true,
19
+ "checkedAt": "2026-09-15T15:00:00+08:00"
20
+ }
21
+ },
22
+ "comparison": {
23
+ "overlap": 6,
24
+ "aiOnly": 3,
25
+ "divergent": 1
26
+ },
27
+ "summary": {
28
+ "reviewerOnly": 3,
29
+ "actionableMisses": 2,
30
+ "resolved": 1,
31
+ "uncheckable": 0,
32
+ "questionable": 0,
33
+ "repairPlans": 2
34
+ },
35
+ "reviewerOnlyItems": [
36
+ {
37
+ "gapId": "L-01",
38
+ "title": "市场比较案例时间修正依据不足",
39
+ "status": "L-open",
40
+ "reviewerEvidence": {"file": "人工复核意见.xlsx", "location": "问题清单!B12", "excerpt": "时间修正依据不充分"},
41
+ "finalDocumentVerification": {"file": "市场法测算.xlsx", "location": "案例表!H8", "result": "仍存在"},
42
+ "executionTrace": [
43
+ {"stage": "input", "status": "passed", "evidence": "材料清单#2"},
44
+ {"stage": "profile", "status": "passed", "evidence": "route_profile.methods=市场法"},
45
+ {"stage": "routing", "status": "passed", "evidence": "已加载房地产与交易处置"},
46
+ {"stage": "assembly", "status": "passed", "evidence": "manifest 已下载清单-M-市场法"},
47
+ {"stage": "knowledge", "status": "failed", "evidence": "CHK-MKT-012 内容不足"}
48
+ ],
49
+ "rootCauses": [{"code": "K2", "role": "primary", "evidence": "历史与当前正文均缺判断标准"}],
50
+ "linkedFixIds": ["FIX-KB-01"]
51
+ },
52
+ {
53
+ "gapId": "L-02",
54
+ "title": "土地用途限制条件未核验",
55
+ "status": "L-open",
56
+ "reviewerEvidence": {"file": "人工复核意见.xlsx", "location": "问题清单!B18", "excerpt": "未核验规划用途限制"},
57
+ "finalDocumentVerification": {"file": "评估报告-最终版.docx", "location": "第45页", "result": "仍存在"},
58
+ "executionTrace": [
59
+ {"stage": "knowledge", "status": "passed", "evidence": "CHK-RE-021 已装载"},
60
+ {"stage": "skill", "status": "failed", "evidence": "未定义四端交叉核验"},
61
+ {"stage": "output", "status": "not_applicable", "evidence": "上游未形成 finding"}
62
+ ],
63
+ "rootCauses": [{"code": "S2", "role": "primary", "evidence": "知识已有但 Skill 未执行"}],
64
+ "linkedFixIds": ["FIX-SKILL-01"]
65
+ },
66
+ {
67
+ "gapId": "L-03",
68
+ "title": "报告未披露土地剩余年限",
69
+ "status": "L-resolved",
70
+ "reviewerEvidence": {"file": "人工复核意见.xlsx", "location": "问题清单!B21", "excerpt": "补充剩余年限"},
71
+ "finalDocumentVerification": {"file": "评估报告-最终版.docx", "location": "第31页", "result": "已整改"},
72
+ "executionTrace": [],
73
+ "rootCauses": [{"code": "H", "role": "primary", "evidence": "最终版已落实"}],
74
+ "linkedFixIds": []
75
+ }
76
+ ],
77
+ "repairPlans": [
78
+ {
79
+ "fixId": "FIX-KB-01",
80
+ "title": "补充时间修正依据充分性检查点",
81
+ "type": "kb_manual",
82
+ "executionMode": "manual_only",
83
+ "approvalState": "pending",
84
+ "sourceGapIds": ["L-01"],
85
+ "target": {"kbPath": "06-规则库/评估方法/市场法/清单-M-市场法", "anchor": "CHK-MKT-012"},
86
+ "changeSpec": {
87
+ "currentGap": "缺少时间修正依据充分性的证据、步骤、标准和例外",
88
+ "method": "扩写现有 CHK-MKT-012",
89
+ "contentOutline": ["适用条件", "必取证据", "检查步骤", "判断标准", "异常输出", "例外"]
90
+ },
91
+ "registrations": ["条目计数变化时更新批次 README"],
92
+ "completionEvidence": "用户确认 FIX-KB-01 已完成并允许只读复核",
93
+ "dependencies": [],
94
+ "validation": ["锚点唯一", "原漏检案例回归"]
95
+ },
96
+ {
97
+ "fixId": "FIX-SKILL-01",
98
+ "title": "补充土地用途限制四端交叉核验",
99
+ "type": "skill_ai",
100
+ "executionMode": "ai_after_approval",
101
+ "approvalState": "approved",
102
+ "sourceGapIds": ["L-02"],
103
+ "target": {"skillFile": "crwu-audit-asset-realestate/references/02-review-focus.md", "anchor": "CHK-RE-021"},
104
+ "changeSpec": {
105
+ "currentGap": "未定义权证、规划条件、报告披露、测算假设四端交叉核验",
106
+ "method": "补充执行步骤和证据要求",
107
+ "contentOutline": ["四端取证", "冲突判断", "输出证据"]
108
+ },
109
+ "registrations": ["源仓变更纪要"],
110
+ "completionEvidence": "相关测试和原漏检回归通过",
111
+ "dependencies": [],
112
+ "validation": ["quick_validate", "kb_tool validate", "原漏检案例回归"]
113
+ }
114
+ ],
115
+ "renderPolicy": {"offline": true, "printA4": true}
116
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://crwu.local/schema/gap-analysis/1.0.0",
4
+ "title": "GapAnalysis",
5
+ "type": "object",
6
+ "required": [
7
+ "schemaVersion",
8
+ "reportId",
9
+ "project",
10
+ "baselines",
11
+ "summary",
12
+ "reviewerOnlyItems",
13
+ "repairPlans",
14
+ "renderPolicy"
15
+ ],
16
+ "properties": {
17
+ "schemaVersion": {"type": "string", "pattern": "^1\\."},
18
+ "reportId": {"type": "string", "pattern": "^GAP-[A-Za-z0-9_-]+-[0-9]{8}$"},
19
+ "project": {"type": "object"},
20
+ "baselines": {"type": "object"},
21
+ "summary": {"type": "object"},
22
+ "reviewerOnlyItems": {"type": "array", "items": {"type": "object"}},
23
+ "repairPlans": {"type": "array", "items": {"type": "object"}},
24
+ "renderPolicy": {
25
+ "type": "object",
26
+ "required": ["offline", "printA4"],
27
+ "properties": {
28
+ "offline": {"const": true},
29
+ "printA4": {"const": true}
30
+ }
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,475 @@
1
+ #!/usr/bin/env python3
2
+ """GapAnalysis JSON validation and deterministic HTML delivery."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import argparse
7
+ import html
8
+ import json
9
+ import re
10
+ import sys
11
+ from pathlib import Path
12
+
13
+
14
+ ACTIONABLE = {"L-open", "L-unclosed"}
15
+ NON_ACTIONABLE = {"L-resolved", "L-uncheckable", "L-questionable"}
16
+ CAUSES = {"K1", "K2", "S1", "S2", "R", "I", "E", "O", "H"}
17
+ PLAN_TYPES = {"kb_manual", "skill_ai", "maintainer_handoff", "no_action"}
18
+ TRACE_STAGES = {"input", "profile", "routing", "assembly", "knowledge", "skill", "execution", "output"}
19
+ TRACE_STATUSES = {"passed", "failed", "unknown", "not_applicable"}
20
+ ABSOLUTE_PATH = re.compile(r"(?:^|\s)(?:/Users/|/home/|[A-Za-z]:\\\\)")
21
+ SKILL_ROOT = Path(__file__).resolve().parent.parent
22
+ TEMPLATE_PATH = SKILL_ROOT / "template" / "gap-analysis-report.html"
23
+ ECHARTS_PATH = SKILL_ROOT / "template" / "echarts.min.js"
24
+
25
+
26
+ def load_result(path: Path) -> dict:
27
+ with path.open("r", encoding="utf-8") as handle:
28
+ value = json.load(handle)
29
+ if not isinstance(value, dict):
30
+ raise ValueError("GapAnalysis 顶层必须是对象")
31
+ return value
32
+
33
+
34
+ def _unique_index(items: list, key: str, label: str, errors: list[str]) -> dict:
35
+ result = {}
36
+ for index, item in enumerate(items):
37
+ if not isinstance(item, dict):
38
+ errors.append(f"{label}[{index}] 必须是对象")
39
+ continue
40
+ value = item.get(key)
41
+ if not isinstance(value, str) or not value.strip():
42
+ errors.append(f"{label}[{index}].{key} 不得为空")
43
+ continue
44
+ if value in result:
45
+ errors.append(f"{label}.{key} 重复:{value}")
46
+ continue
47
+ result[value] = item
48
+ return result
49
+
50
+
51
+ def _iter_scalars(value):
52
+ if isinstance(value, dict):
53
+ for item in value.values():
54
+ yield from _iter_scalars(item)
55
+ elif isinstance(value, list):
56
+ for item in value:
57
+ yield from _iter_scalars(item)
58
+ elif isinstance(value, str):
59
+ yield value
60
+
61
+
62
+ def _scan_forbidden_content(result: dict) -> list[str]:
63
+ errors = []
64
+ for value in _iter_scalars(result):
65
+ if ABSOLUTE_PATH.search(value):
66
+ errors.append("报告不得包含个人绝对路径")
67
+ break
68
+ return errors
69
+
70
+
71
+ def _validate_summary(result: dict, gaps: list, plans: list) -> list[str]:
72
+ summary = result.get("summary") or {}
73
+ counts = {
74
+ "reviewerOnly": len(gaps),
75
+ "actionableMisses": sum(item.get("status") in ACTIONABLE for item in gaps if isinstance(item, dict)),
76
+ "resolved": sum(item.get("status") == "L-resolved" for item in gaps if isinstance(item, dict)),
77
+ "uncheckable": sum(item.get("status") == "L-uncheckable" for item in gaps if isinstance(item, dict)),
78
+ "questionable": sum(item.get("status") == "L-questionable" for item in gaps if isinstance(item, dict)),
79
+ "repairPlans": len(plans),
80
+ }
81
+ return [f"summary.{key} 必须可由明细重算" for key, expected in counts.items() if summary.get(key) != expected]
82
+
83
+
84
+ def validate(result: dict) -> list[str]:
85
+ errors: list[str] = []
86
+ if not isinstance(result, dict):
87
+ return ["GapAnalysis 顶层必须是对象"]
88
+ required = (
89
+ "schemaVersion", "reportId", "project", "baselines", "summary",
90
+ "reviewerOnlyItems", "repairPlans", "renderPolicy",
91
+ )
92
+ for key in required:
93
+ if key not in result:
94
+ errors.append(f"缺少顶层字段 {key}")
95
+
96
+ gaps = result.get("reviewerOnlyItems") or []
97
+ plans = result.get("repairPlans") or []
98
+ if not isinstance(gaps, list):
99
+ errors.append("reviewerOnlyItems 必须是数组")
100
+ gaps = []
101
+ if not isinstance(plans, list):
102
+ errors.append("repairPlans 必须是数组")
103
+ plans = []
104
+ gap_by_id = _unique_index(gaps, "gapId", "reviewerOnlyItems", errors)
105
+ plan_by_id = _unique_index(plans, "fixId", "repairPlans", errors)
106
+
107
+ for gap_id, gap in gap_by_id.items():
108
+ status = gap.get("status")
109
+ linked = gap.get("linkedFixIds") or []
110
+ if status in ACTIONABLE and not linked:
111
+ errors.append(f"{gap_id}.linkedFixIds:确认漏检必须关联修复计划")
112
+ for cause in gap.get("rootCauses") or []:
113
+ if not isinstance(cause, dict) or cause.get("code") not in CAUSES:
114
+ errors.append(f"{gap_id}.rootCauses 包含非法根因")
115
+ for trace in gap.get("executionTrace") or []:
116
+ if not isinstance(trace, dict) or trace.get("stage") not in TRACE_STAGES:
117
+ errors.append(f"{gap_id}.executionTrace 包含非法阶段")
118
+ elif trace.get("status") not in TRACE_STATUSES:
119
+ errors.append(f"{gap_id}.executionTrace 包含非法状态")
120
+ for fix_id in linked:
121
+ if fix_id not in plan_by_id:
122
+ errors.append(f"{gap_id}.linkedFixIds 引用未知计划 {fix_id}")
123
+ elif gap_id not in (plan_by_id[fix_id].get("sourceGapIds") or []):
124
+ errors.append(f"{gap_id} 与 {fix_id} 双向关系不一致")
125
+
126
+ for fix_id, plan in plan_by_id.items():
127
+ sources = plan.get("sourceGapIds") or []
128
+ if not sources:
129
+ errors.append(f"{fix_id}.sourceGapIds 不得为空")
130
+ if plan.get("type") not in PLAN_TYPES:
131
+ errors.append(f"{fix_id}.type 非法")
132
+ if plan.get("type") == "kb_manual" and plan.get("executionMode") != "manual_only":
133
+ errors.append(f"{fix_id} 知识库计划必须为 manual_only")
134
+ for gap_id in sources:
135
+ gap = gap_by_id.get(gap_id)
136
+ if not gap:
137
+ errors.append(f"{fix_id}.sourceGapIds 引用未知漏检 {gap_id}")
138
+ elif gap.get("status") in NON_ACTIONABLE:
139
+ errors.append(f"{fix_id} 不得包含 {gap.get('status')} 项 {gap_id}")
140
+ elif fix_id not in (gap.get("linkedFixIds") or []):
141
+ errors.append(f"{fix_id} 与 {gap_id} 双向关系不一致")
142
+
143
+ errors.extend(_validate_summary(result, gaps, plans))
144
+ errors.extend(_scan_forbidden_content(result))
145
+ policy = result.get("renderPolicy") or {}
146
+ if policy.get("offline") is not True or policy.get("printA4") is not True:
147
+ errors.append("renderPolicy 必须要求离线单文件和 A4 打印")
148
+ return errors
149
+
150
+
151
+ def _h(value) -> str:
152
+ return html.escape("" if value is None else str(value), quote=True)
153
+
154
+
155
+ def build_manual_kb_instruction(plan: dict) -> str:
156
+ if plan.get("type") != "kb_manual" or plan.get("executionMode") != "manual_only":
157
+ raise ValueError("仅 kb_manual/manual_only 可生成人工修复单")
158
+ target = plan.get("target") or {}
159
+ change = plan.get("changeSpec") or {}
160
+ return "\n".join(
161
+ [
162
+ f"知识库人工修复单 {plan.get('fixId', '')}(仅人工)",
163
+ f"对应人工独有事项:{'、'.join(plan.get('sourceGapIds') or [])}",
164
+ f"目标文档:{target.get('kbPath', '')}",
165
+ f"定位锚点:{target.get('anchor', '')}",
166
+ f"当前缺口:{change.get('currentGap', '')}",
167
+ f"修改方式:{change.get('method', '')}",
168
+ f"建议内容结构:{';'.join(change.get('contentOutline') or [])}",
169
+ f"联动登记:{';'.join(plan.get('registrations') or [])}",
170
+ f"完成凭证:{plan.get('completionEvidence', '')}",
171
+ ]
172
+ )
173
+
174
+
175
+ def build_skill_prompt(result: dict, approved_fix_ids: list[str]) -> str:
176
+ plan_by_id = {item.get("fixId"): item for item in result.get("repairPlans") or []}
177
+ if not approved_fix_ids:
178
+ raise ValueError("未批准任何 Skill 修复计划")
179
+ selected = []
180
+ for fix_id in approved_fix_ids:
181
+ plan = plan_by_id.get(fix_id)
182
+ if not plan:
183
+ raise ValueError(f"未知修复计划 {fix_id}")
184
+ if plan.get("type") != "skill_ai" or plan.get("approvalState") != "approved":
185
+ raise ValueError(f"计划 {fix_id} 未批准或不是 Skill AI 计划")
186
+ selected.append(plan)
187
+
188
+ lines = [
189
+ "我确认执行《AI—人工审核差距分析报告 {0}》中的 Skill 修复计划:{1}。".format(
190
+ result.get("reportId", ""), "、".join(approved_fix_ids)
191
+ ),
192
+ "",
193
+ "请使用 crwu-dev-audit-optimize 执行上述已批准计划。先核对报告证据、源仓当前状态和依赖;涉及知识库依赖时,只允许通过 crwu-dws 只读重新下载核验,不得对知识库执行任何写操作。",
194
+ "",
195
+ "执行要求:",
196
+ "1. 仅修改以下批准计划列明的源仓 Skill 文件,不修改运行时目录,不扩大范围。",
197
+ ]
198
+ for number, plan in enumerate(selected, 2):
199
+ target = plan.get("target") or {}
200
+ change = plan.get("changeSpec") or {}
201
+ lines.append(
202
+ f"{number}. {plan['fixId']}(对应 {'、'.join(plan.get('sourceGapIds') or [])}):"
203
+ f"在 {target.get('skillFile', '')} 的 {target.get('anchor', '')} 处{change.get('method', '')};"
204
+ f"目标内容为 {'、'.join(change.get('contentOutline') or [])}。"
205
+ )
206
+ next_number = len(selected) + 2
207
+ lines.extend(
208
+ [
209
+ f"{next_number}. 只写 RULE/CHK 编号和库内层级路径寻址键,不复制知识库正文。",
210
+ f"{next_number + 1}. 若最新状态冲突、目标路径变化、依赖未满足或需要修改清单外文件,立即停止并说明。",
211
+ f"{next_number + 2}. 完成后运行各计划 validation 中的校验,并按 sourceGapIds 逐条回归原人工漏检,汇报文件级改动、测试结果和剩余风险。",
212
+ ]
213
+ )
214
+ return "\n".join(lines)
215
+
216
+
217
+ def actionable_cause_counts(result: dict) -> dict[str, int]:
218
+ counts: dict[str, int] = {}
219
+ for gap in result.get("reviewerOnlyItems") or []:
220
+ if gap.get("status") not in ACTIONABLE:
221
+ continue
222
+ for cause in gap.get("rootCauses") or []:
223
+ code = cause.get("code")
224
+ if code:
225
+ counts[code] = counts.get(code, 0) + 1
226
+ return counts
227
+
228
+
229
+ def _badge(text: str) -> str:
230
+ return f'<span class="badge">{_h(text)}</span>'
231
+
232
+
233
+ def _render_summary(result: dict) -> str:
234
+ summary = result.get("summary") or {}
235
+ comparison = result.get("comparison") or {}
236
+ stats = [
237
+ ("双方共同发现", comparison.get("overlap", 0)),
238
+ ("AI 新增", comparison.get("aiOnly", 0)),
239
+ ("人工独有", summary.get("reviewerOnly", 0)),
240
+ ("确认 AI 漏检", summary.get("actionableMisses", 0)),
241
+ ("已整改", summary.get("resolved", 0)),
242
+ ("不可核验", summary.get("uncheckable", 0)),
243
+ ("人工意见存疑", summary.get("questionable", 0)),
244
+ ("修复计划", summary.get("repairPlans", 0)),
245
+ ]
246
+ cards = "".join(f'<div class="stat"><span>{_h(label)}</span><strong>{_h(value)}</strong></div>' for label, value in stats)
247
+ return f'<section id="gap-summary"><h2>差距摘要</h2><div class="stats">{cards}</div></section>'
248
+
249
+
250
+ def _render_gap_rows(result: dict) -> str:
251
+ rows = []
252
+ plans = {item.get("fixId"): item for item in result.get("repairPlans") or []}
253
+ for gap in result.get("reviewerOnlyItems") or []:
254
+ causes = "、".join(item.get("code", "") for item in gap.get("rootCauses") or [])
255
+ linked = gap.get("linkedFixIds") or []
256
+ targets = []
257
+ for fix_id in linked:
258
+ target = (plans.get(fix_id) or {}).get("target") or {}
259
+ targets.append(target.get("kbPath") or target.get("skillFile") or "")
260
+ verification = gap.get("finalDocumentVerification") or {}
261
+ rows.append(
262
+ '<tr data-gap-id="{gap_id}"><td><strong>{gap_id}</strong><br>{title}</td>'
263
+ '<td>{status}<br><span class="muted">{result}</span></td><td>{causes}</td>'
264
+ '<td>{fixes}</td><td>{targets}</td></tr>'.format(
265
+ gap_id=_h(gap.get("gapId")),
266
+ title=_h(gap.get("title")),
267
+ status=_badge(gap.get("status", "")),
268
+ result=_h(verification.get("result", "")),
269
+ causes=_h(causes),
270
+ fixes=" ".join(_badge(item) for item in linked) or "—",
271
+ targets="<br>".join(_h(item) for item in targets) or "—",
272
+ )
273
+ )
274
+ return "".join(rows)
275
+
276
+
277
+ def _render_traces(result: dict) -> str:
278
+ blocks = []
279
+ for gap in result.get("reviewerOnlyItems") or []:
280
+ if gap.get("status") not in ACTIONABLE:
281
+ continue
282
+ trace = []
283
+ for index, item in enumerate(gap.get("executionTrace") or []):
284
+ if index:
285
+ trace.append('<span class="trace-line" aria-hidden="true"></span>')
286
+ trace.append(
287
+ '<span class="trace-step {status}" title="{evidence}">{stage} · {status}</span>'.format(
288
+ status=_h(item.get("status")), stage=_h(item.get("stage")), evidence=_h(item.get("evidence"))
289
+ )
290
+ )
291
+ blocks.append(
292
+ '<div data-gap-id="{gap_id}"><h3>{gap_id} · {title}</h3><div class="trace">{trace}</div></div>'.format(
293
+ gap_id=_h(gap.get("gapId")), title=_h(gap.get("title")), trace="".join(trace) or "无执行链记录"
294
+ )
295
+ )
296
+ return "".join(blocks) or '<p class="muted">没有需要归因的真实漏检。</p>'
297
+
298
+
299
+ def _render_manual_plans(result: dict) -> str:
300
+ cards = []
301
+ for plan in result.get("repairPlans") or []:
302
+ if plan.get("type") != "kb_manual":
303
+ continue
304
+ fix_id = plan.get("fixId", "")
305
+ instruction = build_manual_kb_instruction(plan)
306
+ cards.append(
307
+ '<article class="plan"><h3>{fix_id} · {title}</h3><p class="manual-only">manual_only · 仅人工修改</p>'
308
+ '<pre id="manual-{fix_id}">{instruction}</pre><div class="copy-row">'
309
+ '<button type="button" data-copy-target="manual-{fix_id}">复制人工修复说明</button><span class="muted copy-status"></span>'
310
+ '</div></article>'.format(fix_id=_h(fix_id), title=_h(plan.get("title")), instruction=_h(instruction))
311
+ )
312
+ return "".join(cards) or '<p class="muted">本次没有知识库人工修复项。</p>'
313
+
314
+
315
+ def _render_skill_plans(result: dict) -> str:
316
+ approved = [item.get("fixId") for item in result.get("repairPlans") or [] if item.get("type") == "skill_ai" and item.get("approvalState") == "approved"]
317
+ cards = []
318
+ for plan in result.get("repairPlans") or []:
319
+ if plan.get("type") != "skill_ai":
320
+ continue
321
+ target = plan.get("target") or {}
322
+ cards.append(
323
+ '<article class="plan skill"><h3>{fix_id} · {title}</h3><dl>'
324
+ '<dt>对应漏检</dt><dd>{gaps}</dd><dt>源仓文件</dt><dd><code>{file}</code></dd>'
325
+ '<dt>修改方式</dt><dd>{method}</dd><dt>批准状态</dt><dd>{approval}</dd></dl></article>'.format(
326
+ fix_id=_h(plan.get("fixId")), title=_h(plan.get("title")), gaps=_h("、".join(plan.get("sourceGapIds") or [])),
327
+ file=_h(target.get("skillFile")), method=_h((plan.get("changeSpec") or {}).get("method")), approval=_h(plan.get("approvalState")),
328
+ )
329
+ )
330
+ prompt = build_skill_prompt(result, approved) if approved else "没有已批准的 Skill 修复计划。"
331
+ cards.append(
332
+ '<article class="plan skill"><h3>可复制给 AI 的执行 Prompt</h3>'
333
+ '<textarea id="skill-execution-prompt" readonly>{prompt}</textarea><div class="copy-row">'
334
+ '<button type="button" class="primary" data-copy-target="skill-execution-prompt">复制 Skill 执行 Prompt</button>'
335
+ '<span class="muted copy-status"></span></div></article>'.format(prompt=_h(prompt))
336
+ )
337
+ return "".join(cards)
338
+
339
+
340
+ def _render_validation(result: dict) -> str:
341
+ rows = []
342
+ for plan in result.get("repairPlans") or []:
343
+ rows.append(
344
+ "<tr><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>".format(
345
+ _h(plan.get("fixId")), _h("、".join(plan.get("sourceGapIds") or [])),
346
+ _h("、".join(plan.get("dependencies") or []) or "无"), _h(";".join(plan.get("validation") or [])),
347
+ )
348
+ )
349
+ return "".join(rows)
350
+
351
+
352
+ def _render_sections(result: dict) -> str:
353
+ project = result.get("project") or {}
354
+ return "".join(
355
+ [
356
+ '<header><h1>AI—人工审核差距分析</h1><p class="subtitle">项目 {project} · 报告 {report}</p>'
357
+ '<p>历史基线用于还原当时漏检原因;当前知识库仅通过 crwu-dws 只读核验缺口是否仍存在。</p></header>'.format(
358
+ project=_h(project.get("projectId")), report=_h(result.get("reportId"))
359
+ ),
360
+ _render_summary(result),
361
+ '<section id="gap-charts"><h2>差距构成与根因分布</h2><div class="charts">'
362
+ '<div id="composition-chart" class="chart" aria-label="差距构成图"></div>'
363
+ '<div id="cause-chart" class="chart" aria-label="根因分布图"></div></div></section>',
364
+ '<section id="reviewer-only-table"><h2>人工独有事项逐条归因</h2><div class="table-wrap"><table>'
365
+ '<thead><tr><th>人工独有事项</th><th>在件核验</th><th>根因</th><th>对应修复计划</th><th>修复目标</th></tr></thead>'
366
+ f'<tbody>{_render_gap_rows(result)}</tbody></table></div></section>',
367
+ f'<section id="execution-trace"><h2>真实漏检执行链</h2>{_render_traces(result)}</section>',
368
+ '<section id="gap-fix-map"><h2>人工独有事项 → 根因 → 修复计划</h2>'
369
+ '<div id="relation-chart" aria-label="漏检与修复计划关系图"></div></section>',
370
+ f'<section id="manual-kb-plans"><h2>知识库人工修复单</h2><p class="manual-only">知识库只能由用户人工修改,AI 不得写入。</p><div class="plan-grid">{_render_manual_plans(result)}</div></section>',
371
+ f'<section id="skill-repair-prompts"><h2>Skill 修复计划与执行 Prompt</h2><div class="plan-grid">{_render_skill_plans(result)}</div></section>',
372
+ '<section id="validation-plan"><h2>依赖与验证</h2><div class="table-wrap"><table><thead><tr>'
373
+ '<th>计划</th><th>对应漏检</th><th>依赖</th><th>验证</th></tr></thead>'
374
+ f'<tbody>{_render_validation(result)}</tbody></table></div></section>',
375
+ '<footer>由 crwu-dev-audit-optimize 差距分析模式生成 · 表格是证据主载体,图表仅用于汇总与导航</footer>',
376
+ ]
377
+ )
378
+
379
+
380
+ def _report_javascript() -> str:
381
+ return r"""
382
+ (function(){
383
+ const data = JSON.parse(document.getElementById('gap-analysis-data').textContent);
384
+ const colors = ['#356da8','#9a5b08','#7652a8','#a92d28','#39724f','#667085'];
385
+ const gaps = data.reviewerOnlyItems || [];
386
+ const plans = data.repairPlans || [];
387
+ const causeCounts = data.chartData.actionableCauseCounts;
388
+ const composition = echarts.init(document.getElementById('composition-chart'));
389
+ composition.setOption({animation:false,tooltip:{trigger:'axis'},grid:{left:100,right:25,top:20,bottom:30},
390
+ xAxis:{type:'value'},yAxis:{type:'category',data:['双方共同','AI 新增','结论分歧','人工独有','确认漏检']},
391
+ series:[{type:'bar',data:[data.comparison.overlap,data.comparison.aiOnly,data.comparison.divergent,data.summary.reviewerOnly,data.summary.actionableMisses],label:{show:true,position:'right'},itemStyle:{color:'#356da8'}}]});
392
+ const causes = echarts.init(document.getElementById('cause-chart'));
393
+ causes.setOption({animation:false,tooltip:{trigger:'item'},legend:{bottom:0},series:[{type:'pie',radius:['42%','68%'],data:Object.entries(causeCounts).map(([name,value],i)=>({name,value,itemStyle:{color:colors[i%colors.length]}}))}]});
394
+ const nodes = [], links = [], seen = new Set();
395
+ const addNode = (name, depth) => { const key=depth+':'+name; if(!seen.has(key)){seen.add(key);nodes.push({name:key,label:{formatter:name},depth});} return key; };
396
+ gaps.filter(g=>['L-open','L-unclosed'].includes(g.status)).forEach(g=>{
397
+ const left=addNode(g.gapId,0);
398
+ (g.rootCauses||[]).forEach(c=>{const middle=addNode(c.code,1);links.push({source:left,target:middle,value:1});
399
+ (g.linkedFixIds||[]).forEach(id=>{const right=addNode(id,2);if(!links.some(x=>x.source===middle&&x.target===right))links.push({source:middle,target:right,value:1});});
400
+ });
401
+ });
402
+ const relation = echarts.init(document.getElementById('relation-chart'));
403
+ relation.setOption({animation:false,tooltip:{trigger:'item'},series:[{type:'sankey',left:18,right:90,nodeWidth:15,nodeGap:13,draggable:false,data:nodes,links,lineStyle:{color:'gradient',opacity:.35}}]});
404
+ function focusGap(gapId){document.querySelectorAll('[data-gap-id]').forEach(el=>{el.style.opacity=!gapId||el.dataset.gapId===gapId?'1':'.28';});}
405
+ document.querySelectorAll('[data-gap-id]').forEach(el=>el.addEventListener('click',()=>focusGap(el.dataset.gapId)));
406
+ relation.on('click',p=>{const label=(p.data&&p.data.label&&p.data.label.formatter)||'';if(/^L-/.test(label))focusGap(label);});
407
+ document.querySelectorAll('[data-copy-target]').forEach(button=>button.addEventListener('click',async()=>{
408
+ const target=document.getElementById(button.dataset.copyTarget);const text='value' in target?target.value:target.textContent;const status=button.parentElement.querySelector('.copy-status');
409
+ try{await navigator.clipboard.writeText(text);status.textContent='已复制';}catch(_){if(target.select)target.select();status.textContent='请按 Ctrl/Cmd+C 复制';}
410
+ }));
411
+ window.addEventListener('resize',()=>{composition.resize();causes.resize();relation.resize();});
412
+ })();
413
+ """
414
+
415
+
416
+ def render(result: dict) -> str:
417
+ errors = validate(result)
418
+ if errors:
419
+ raise ValueError("GapAnalysis 校验失败:\n" + "\n".join(errors))
420
+ rendered_result = json.loads(json.dumps(result, ensure_ascii=False))
421
+ rendered_result["chartData"] = {"actionableCauseCounts": actionable_cause_counts(result)}
422
+ payload = json.dumps(rendered_result, ensure_ascii=False, sort_keys=True, separators=(",", ":"))
423
+ payload = payload.replace("<", "\\u003c").replace(">", "\\u003e").replace("&", "\\u0026")
424
+ template = TEMPLATE_PATH.read_text(encoding="utf-8")
425
+ values = {
426
+ "{{report_title}}": _h(f"AI—人工审核差距分析 · {(result.get('project') or {}).get('projectId', '')}"),
427
+ "{{report_content}}": _render_sections(result),
428
+ "{{report_payload}}": payload,
429
+ "{{echarts_bundle}}": ECHARTS_PATH.read_text(encoding="utf-8"),
430
+ "{{report_javascript}}": _report_javascript(),
431
+ }
432
+ for key, value in values.items():
433
+ template = template.replace(key, value)
434
+ if re.search(r"\{\{[a-z_]+\}\}", template):
435
+ raise ValueError("HTML 模板仍有未替换占位符")
436
+ return template
437
+
438
+
439
+ def _cmd_validate(args) -> int:
440
+ result = load_result(Path(args.input))
441
+ errors = validate(result)
442
+ if errors:
443
+ for error in errors:
444
+ print(f"ERROR: {error}", file=sys.stderr)
445
+ return 1
446
+ print("OK")
447
+ return 0
448
+
449
+
450
+ def _cmd_render(args) -> int:
451
+ result = load_result(Path(args.input))
452
+ document = render(result)
453
+ output = Path(args.output)
454
+ output.parent.mkdir(parents=True, exist_ok=True)
455
+ output.write_text(document, encoding="utf-8")
456
+ print(output)
457
+ return 0
458
+
459
+
460
+ def main(argv=None) -> int:
461
+ parser = argparse.ArgumentParser(description="CRWU AI—人工审核差距分析校验与单文件 HTML 渲染")
462
+ subparsers = parser.add_subparsers(dest="command", required=True)
463
+ validate_parser = subparsers.add_parser("validate", help="校验 GapAnalysis JSON")
464
+ validate_parser.add_argument("--input", required=True)
465
+ validate_parser.set_defaults(func=_cmd_validate)
466
+ render_parser = subparsers.add_parser("render", help="渲染自包含单文件 HTML")
467
+ render_parser.add_argument("--input", required=True)
468
+ render_parser.add_argument("--output", required=True)
469
+ render_parser.set_defaults(func=_cmd_render)
470
+ args = parser.parse_args(argv)
471
+ return args.func(args)
472
+
473
+
474
+ if __name__ == "__main__":
475
+ raise SystemExit(main())