@shundoo-ai/dsh-cosmic 1.0.19 → 1.0.20

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 (244) hide show
  1. package/package.json +1 -1
  2. package/skills/cosmic-build/CHANGELOG.md +4 -0
  3. package/skills/cosmic-build/LOCAL-PATCHES.md +76 -40
  4. package/skills/cosmic-build/SKILL.md +46 -13
  5. package/skills/cosmic-build/assets/platform-report-filters/TypedReportFilterFields.java +169 -0
  6. package/skills/cosmic-build/assets/platform-report-filters/platform.patch +98 -0
  7. package/skills/cosmic-build/assets/report-algo-benchmark/ReportAlgoBenchmark.java +48 -0
  8. package/skills/cosmic-build/assets/report-algo-benchmark/ReportBenchmarkLogFactory.java +7 -0
  9. package/skills/cosmic-build/examples/java-rules/CosmicEntryQuery.java +26 -0
  10. package/skills/cosmic-build/examples/java-rules/CosmicReportAggregation.java +35 -0
  11. package/skills/cosmic-build/examples/java-rules/CosmicReportFilters.java +77 -0
  12. package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapter.java +25 -0
  13. package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapterCheck.java +26 -0
  14. package/skills/cosmic-build/knowledge/cosmic/platform/api/algo/GroupbyDataSet.md +47 -0
  15. package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterInfo.md +12 -12
  16. package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterItemInfo.md +2 -0
  17. package/skills/cosmic-build/knowledge/cosmic/platform/form-plugin.md +2 -4
  18. package/skills/cosmic-build/knowledge/cosmic/platform/java-type-contracts.md +11 -2
  19. package/skills/cosmic-build/knowledge/cosmic/platform/list-plugin.md +18 -14
  20. package/skills/cosmic-build/knowledge/cosmic/platform/operation-plugin.md +4 -4
  21. package/skills/cosmic-build/knowledge/cosmic/platform/reportlistdata-plugin.md +17 -9
  22. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/cross-entity-aggregate-writeback.md +2 -0
  23. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/pre-post-operation.md +15 -7
  24. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-algo.md +24 -68
  25. package/skills/cosmic-build/knowledge/cosmic/platform/workflow-plugin.md +2 -7
  26. package/skills/cosmic-build/references/application-context.md +35 -1
  27. package/skills/cosmic-build/references/common-reference.md +1 -1
  28. package/skills/cosmic-build/references/compile-guide.md +55 -68
  29. package/skills/cosmic-build/references/delivery.md +59 -7
  30. package/skills/cosmic-build/references/execution-contract.md +38 -0
  31. package/skills/cosmic-build/references/form-discovery.md +7 -1
  32. package/skills/cosmic-build/references/java-plugin-delivery.md +32 -162
  33. package/skills/cosmic-build/references/operation-dispatch.md +17 -0
  34. package/skills/cosmic-build/references/plugin-handoff-input.md +131 -0
  35. package/skills/cosmic-build/references/plugin-runtime-routing.md +1 -1
  36. package/skills/cosmic-build/references/report-filter-contract.md +78 -0
  37. package/skills/cosmic-build/references/sdk-inspection.md +23 -0
  38. package/skills/cosmic-build/schemas/data-model-authoring.schema.json +2 -3
  39. package/skills/cosmic-build/scripts/_http_client.py +55 -55
  40. package/skills/cosmic-build/scripts/appconfig_load.py +2 -2
  41. package/skills/cosmic-build/scripts/apply_report_filter_extension.py +39 -0
  42. package/skills/cosmic-build/scripts/bootstrap_cosmic_context.py +37 -2
  43. package/skills/cosmic-build/scripts/compile_plugin_source.py +279 -156
  44. package/skills/cosmic-build/scripts/execution_binding.py +40 -0
  45. package/skills/cosmic-build/scripts/inspect_platform_sdk.py +169 -0
  46. package/skills/cosmic-build/scripts/kd_api.py +23 -22
  47. package/skills/cosmic-build/scripts/kd_auth.py +1 -1
  48. package/skills/cosmic-build/scripts/kd_env_loader.py +19 -10
  49. package/skills/cosmic-build/scripts/kd_token_cache.py +2 -2
  50. package/skills/cosmic-build/scripts/kingscript_sdk_sync.py +350 -0
  51. package/skills/cosmic-build/scripts/kingscript_source_gate.py +11 -8
  52. package/skills/cosmic-build/scripts/platform_api_contract.py +246 -11
  53. package/skills/cosmic-build/scripts/plugin_corpus/build_index.py +403 -0
  54. package/skills/cosmic-build/scripts/plugin_corpus/jvm_classfile.py +281 -0
  55. package/skills/cosmic-build/scripts/plugin_corpus/measure_api_usage.py +446 -0
  56. package/skills/cosmic-build/scripts/plugin_source_gate.py +48 -7
  57. package/skills/cosmic-build/scripts/plugin_target_sdk.py +45 -0
  58. package/skills/cosmic-build/scripts/prepare_plugin_handoff.py +493 -47
  59. package/skills/cosmic-build/scripts/preview_url.py +35 -6
  60. package/skills/cosmic-build/scripts/query_plugin_handoff.py +250 -0
  61. package/skills/cosmic-build/scripts/register_plugins.py +28 -2
  62. package/skills/cosmic-build/scripts/render_output_cards.py +42 -9
  63. package/skills/cosmic-build/scripts/report_algo_benchmark.py +46 -0
  64. package/skills/cosmic-build/scripts/run.py +2 -2
  65. package/skills/cosmic-build/scripts/sync_generated_locale_assets.py +43 -0
  66. package/skills/cosmic-build/scripts/test/fixtures/ReportSdkCheck.java +64 -0
  67. package/skills/cosmic-build/scripts/test/fixtures/java_context_booking_native.json +541 -0
  68. package/skills/cosmic-build/scripts/test/test_add_rule_business_contract.py +85 -14
  69. package/skills/cosmic-build/scripts/test/test_batch5_drift_governance.py +12 -3
  70. package/skills/cosmic-build/scripts/test/test_build_meta_order.py +0 -16
  71. package/skills/cosmic-build/scripts/test/test_cli_continuation.py +87 -0
  72. package/skills/cosmic-build/scripts/test/test_compile_plugin_source.py +224 -3
  73. package/skills/cosmic-build/scripts/test/test_control_authoring.py +123 -4
  74. package/skills/cosmic-build/scripts/test/test_cosmic_sdk_examples.py +141 -0
  75. package/skills/cosmic-build/scripts/test/test_data_model_contract.py +30 -5
  76. package/skills/cosmic-build/scripts/test/test_delivery_stage_boundary.py +2 -10
  77. package/skills/cosmic-build/scripts/test/test_dym_sync_background.py +11 -0
  78. package/skills/cosmic-build/scripts/test/test_dynamic_form_metadata_only_contract.py +59 -1
  79. package/skills/cosmic-build/scripts/test/test_guide_skeleton_contract.py +87 -43
  80. package/skills/cosmic-build/scripts/test/test_inspect_platform_sdk.py +71 -0
  81. package/skills/cosmic-build/scripts/test/test_kd_api.py +67 -19
  82. package/skills/cosmic-build/scripts/test/test_kingscript_sdk_sync.py +221 -0
  83. package/skills/cosmic-build/scripts/test/test_kingscript_source_gate.py +10 -0
  84. package/skills/cosmic-build/scripts/test/test_list_configuration_closure.py +18 -0
  85. package/skills/cosmic-build/scripts/test/test_long_session_regressions.py +116 -0
  86. package/skills/cosmic-build/scripts/test/test_mcp_cli.py +524 -0
  87. package/skills/cosmic-build/scripts/test/test_modeling_input_recovery.py +141 -0
  88. package/skills/cosmic-build/scripts/test/test_open_world_cli_catalog.py +36 -2
  89. package/skills/cosmic-build/scripts/test/test_platform_api_contract.py +161 -1
  90. package/skills/cosmic-build/scripts/test/test_plugin_business_contract.py +91 -0
  91. package/skills/cosmic-build/scripts/test/test_plugin_corpus.py +195 -0
  92. package/skills/cosmic-build/scripts/test/test_plugin_handoff.py +346 -1
  93. package/skills/cosmic-build/scripts/test/test_plugin_target_sdk.py +70 -0
  94. package/skills/cosmic-build/scripts/test/test_preview_url.py +44 -1
  95. package/skills/cosmic-build/scripts/test/test_property_batch.py +22 -0
  96. package/skills/cosmic-build/scripts/test/test_property_input_discovery.py +13 -11
  97. package/skills/cosmic-build/scripts/test/test_query_plugin_handoff.py +160 -0
  98. package/skills/cosmic-build/scripts/test/test_register_plugins.py +31 -1
  99. package/skills/cosmic-build/scripts/test/test_render_output_cards.py +50 -4
  100. package/skills/cosmic-build/scripts/test/test_report_business_contract.py +27 -0
  101. package/skills/cosmic-build/scripts/test/test_report_doc_contract_sync.py +5 -4
  102. package/skills/cosmic-build/scripts/test/test_report_sdk_optimization.py +36 -0
  103. package/skills/cosmic-build/scripts/test/test_rule_batch_evidence.py +1 -1
  104. package/skills/cosmic-build/scripts/test/test_rule_domain_contract.py +20 -0
  105. package/skills/cosmic-build/scripts/test/test_rule_function_formula.py +16 -6
  106. package/skills/cosmic-build/scripts/test/test_skill_entry_contract.py +1 -0
  107. package/skills/cosmic-build/scripts/test/test_test_environment.py +45 -0
  108. package/skills/cosmic-build/scripts/test/test_verify_plugin_loading.py +79 -0
  109. package/skills/cosmic-build/scripts/test_environment.py +49 -0
  110. package/skills/cosmic-build/scripts/verify_plugin_loading.py +71 -0
  111. package/skills/cosmic-build/skills/cosmic-coding-impl/SKILL.md +86 -162
  112. package/skills/cosmic-build/skills/cosmic-coding-script/ATTRIBUTION.md +1 -1
  113. package/skills/cosmic-build/skills/cosmic-coding-script/SKILL.md +45 -14
  114. package/skills/cosmic-build/skills/cosmic-coding-script/references/kwc-controller-authoring.md +6 -0
  115. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/README.md +29 -19
  116. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/docs//350/204/232/346/234/254SDK.md +3 -4
  117. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/indexes/package-index.md +1 -1
  118. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/strategy.md +27 -18
  119. package/skills/cosmic-build/skills/cosmic-meta-api/SKILL.md +11 -17
  120. package/skills/cosmic-build/skills/cosmic-meta-api/apis/ai_meta.md +1 -1
  121. package/skills/cosmic-build/skills/cosmic-meta-api/apis/app_menu.md +1 -1
  122. package/skills/cosmic-build/skills/cosmic-meta-api/apis/meta_log.md +1 -1
  123. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/control-authoring.json +45 -4
  124. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/form-control-traits.json +1 -1
  125. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/layout-ui.json +18 -0
  126. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/menu-publish.json +8 -2
  127. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-batch.json +7 -0
  128. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-input-index.json +3 -3
  129. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/report-write-contracts.json +1 -0
  130. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-domain.json +37 -5
  131. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-event-contract.json +24 -3
  132. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/run-build-meta.json +61 -12
  133. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/dropdown-menu.schema.json +69 -0
  134. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/report-write.schema.json +2 -1
  135. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-set.schema.json +1 -0
  136. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-write.schema.json +14 -7
  137. package/skills/cosmic-build/skills/cosmic-meta-api/docs/api-summary.md +2 -2
  138. package/skills/cosmic-build/skills/cosmic-meta-api/modules/app-action/SKILL.md +6 -3
  139. package/skills/cosmic-build/skills/cosmic-meta-api/modules/develop/SKILL.md +1 -2
  140. package/skills/cosmic-build/skills/cosmic-meta-api/modules/export/SKILL.md +5 -6
  141. package/skills/cosmic-build/skills/cosmic-meta-api/modules/init/SKILL.md +13 -36
  142. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/SKILL.md +8 -9
  143. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/config.json.example +5 -15
  144. package/skills/cosmic-build/skills/cosmic-meta-api/modules/reset/SKILL.md +6 -6
  145. package/skills/cosmic-build/skills/cosmic-meta-api/modules/usage/SKILL.md +20 -148
  146. package/skills/cosmic-build/skills/cosmic-meta-api/modules/verify/SKILL.md +1 -1
  147. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/build_receipts.py +171 -0
  148. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_apps.py +25 -6
  149. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_controls.py +55 -21
  150. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_fields.py +10 -3
  151. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_formactions.py +63 -6
  152. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_forms.py +59 -2
  153. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_listui.py +8 -0
  154. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_metaops.py +36 -1
  155. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_plugins.py +115 -90
  156. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_properties.py +666 -4
  157. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_rules.py +1415 -87
  158. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/commands.py +6 -1
  159. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/config.py +28 -15
  160. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/execution_errors.py +40 -0
  161. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/formatters.py +32 -5
  162. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/property_policy_contract.py +6 -0
  163. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/report_ops.py +113 -17
  164. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/reset.py +3 -3
  165. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/rule_contract.py +107 -26
  166. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/build_meta_order.py +50 -49
  167. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/cosmic_api.py +856 -150
  168. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/field_decorator.py +47 -14
  169. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_receipt_resume.py +374 -0
  170. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_cli_failure_contract.py +24 -0
  171. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_creation_identity_boundary.py +4 -2
  172. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_dropdown_menu_contract.py +382 -0
  173. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_existing_form_ui.py +0 -25
  174. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_field_decorator.py +50 -6
  175. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_functional_group_resolution.py +83 -16
  176. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_identity_template_resolution.py +103 -0
  177. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_plugin_contract.py +28 -2
  178. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_readback_derivation.py +22 -0
  179. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_typed_filters.py +65 -0
  180. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py +1041 -15
  181. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_post_build_recovery.py +65 -0
  182. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_verification_evidence.py +17 -0
  183. package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/api-param-checklist.md +1 -1
  184. package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/rule-modeling-guide.md +7 -4
  185. package/skills/cosmic-build/skills/cosmic-meta-modeling/SKILL.md +61 -13
  186. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/app-menu/SKILL.md +8 -0
  187. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/SKILL.md +5 -0
  188. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/dynamic-form-artifact-schema.md +5 -0
  189. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/SKILL.md +21 -9
  190. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-entity-graphs.md +1 -1
  191. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-storage-constraints.md +5 -3
  192. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-ui-composition.md +6 -3
  193. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/creation-recovery.md +13 -0
  194. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/parse-core.md +3 -0
  195. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_contract.py +6 -1
  196. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_emit.py +135 -87
  197. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/field_type_registry.py +11 -1
  198. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/isv_resolver.py +1 -3
  199. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/report_validator.py +29 -0
  200. package/skills/cosmic-build/skills/cosmic-meta-modifier/SKILL.md +4 -2
  201. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/context/SKILL.md +2 -2
  202. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/execute/SKILL.md +1 -1
  203. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/SKILL.md +5 -4
  204. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/operation-write.md +6 -2
  205. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/validation.md +2 -0
  206. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/SKILL.md +20 -5
  207. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/complex-apis.md +1 -1
  208. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/policy-grammar.md +4 -1
  209. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/report-op/SKILL.md +9 -0
  210. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/SKILL.md +61 -4
  211. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/raw-rule-authoring.md +3 -1
  212. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-actions.md +2 -2
  213. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-reference.md +6 -6
  214. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/state.md +1 -1
  215. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/unit/SKILL.md +6 -3
  216. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/verify/usage-guide.md +4 -4
  217. package/skills/cosmic-build/skills/cosmic-meta-modifier/references/list-filter-modification.md +4 -1
  218. package/skills/cosmic-build/skills/cosmic-meta-ui/SKILL.md +9 -1
  219. package/skills/cosmic-build/skills/cosmic-meta-ui/modules/button/SKILL.md +3 -0
  220. package/skills/cosmic-build/skills/mcp-server/SKILL.md +210 -0
  221. package/skills/cosmic-build/skills/mcp-server/scripts/mcp_cli.py +431 -0
  222. package/skills/cosmic-build/skills/openapi-gen/SKILL.md +3 -3
  223. package/skills/cosmic-build/skills/openapi-gen/scripts/api/gen_runner.py +2 -2
  224. package/skills/cosmic-dev-best-practices/references/bill-dev-convention.md +19 -9
  225. package/skills/cosmic-dev-best-practices/references/cosmic-meta-api.md +14 -11
  226. package/skills/cosmic-dev-best-practices/references/design-examples/basedata-design-example.md +1 -1
  227. package/skills/cosmic-dev-best-practices/references/design-examples/bill-design-example.md +1 -1
  228. package/skills/cosmic-dev-best-practices/references/elements/AssistantField.md +1 -1
  229. package/skills/cosmic-dev-best-practices/references/elements/BasedataField.md +2 -2
  230. package/skills/cosmic-dev-best-practices/references/elements/BasedataPropField.md +3 -3
  231. package/skills/cosmic-dev-best-practices/references/elements/CreaterField.md +2 -2
  232. package/skills/cosmic-dev-best-practices/references/elements/CurrencyField.md +2 -2
  233. package/skills/cosmic-dev-best-practices/references/elements/CustomerField.md +2 -2
  234. package/skills/cosmic-dev-best-practices/references/elements/FlexField.md +1 -1
  235. package/skills/cosmic-dev-best-practices/references/elements/MaterielField.md +2 -2
  236. package/skills/cosmic-dev-best-practices/references/elements/OrgField.md +2 -2
  237. package/skills/cosmic-dev-best-practices/references/elements/SupplierField.md +2 -2
  238. package/skills/cosmic-dev-best-practices/references/elements/UnitField.md +1 -1
  239. package/skills/cosmic-dev-best-practices/references/elements/UserField.md +3 -3
  240. package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md +16 -11
  241. package/skills/cosmic-dev-best-practices/references/layout-control-convention.md +5 -4
  242. package/skills/erp-analysis/references/delivery-contract.md +3 -2
  243. package/skills/erp-analysis/templates/AGENTS.template.md +1 -1
  244. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/.dsh/cosmic/.kd/config.json +0 -21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shundoo-ai/dsh-cosmic",
3
- "version": "1.0.19",
3
+ "version": "1.0.20",
4
4
  "description": "苍穹助手:金蝶云苍穹ERP的开发与数据分析,涵盖表单元数据建模、插件开发与热部署、数据可视化报告。",
5
5
  "keywords": [
6
6
  "dsh",
@@ -1,3 +1,7 @@
1
+ 2026-10-13 第三批 bfy11 真实故障验收完成:修复 POST 响应丢失后的自动重放、创建前读取异常的未知误判、批次汇总写入边界、成功回执残留错误及引用错误分类;修订指纹覆盖根 payload schema。现场只影响隔离测试请求,保留原业务对象。
2
+
3
+ 2026-10-12 第三批执行优化:绑定技能来源/修订与 Python 入口;结构化 stdout 与结果文件一致;批量逐对象保存回执、按验证回执续跑、只读核对未知写入、创建前核对冲突;同步中文执行资产。真实环境故障演练尚待验收。
4
+
1
5
  2026-09-03 支持元数据样式属性批量修改,完善规则写入、产物卡片与验证测试
2
6
 
3
7
  2026-08-27 优化了一些问题
@@ -9,10 +9,11 @@
9
9
 
10
10
  | 项 | 值 |
11
11
  |---|---|
12
- | 本次对齐的上游版本 | **0.0.299**(`builtin-skills/.builtin-version`),文件日期 2026-09-29 |
13
- | 上一次拷贝的快照 | 2026-08-24(早于 0.0.277) |
14
- | 可用参照基线(更早) | `~/.lingeebuild/config/builtin-skills/app-build`(**0.0.277**,2026-08-28) |
15
- | 上游目录布局 | `builtin-skills/app-build/`(英文 canonical)+ `builtin-skills/app-build/.locales/zh/`(中文覆盖层) |
12
+ | 本次对齐的上游版本 | **0.0.326**(`builtin-skills/.builtin-version`),文件日期 2026-10-19(金蝶灵基 app **1.8.0**,build 2610172146,2026-10-17 安装) |
13
+ | 上一次对齐 | **0.0.299**(2026-09-29) |
14
+ | 更早的参照基线 | `~/.lingeebuild/config/builtin-skills/app-build`(**0.0.277**,2026-08-28,已过期) |
15
+ | 上游解压位置(已变) | **`~/.lingeebuild/profiles/v1/<hash>/config/builtin-skills/app-build`** —— 灵基 1.8.0 起 skill 按 profile 隔离解压;旧的全局 `~/.lingeebuild/config/builtin-skills` 不再更新 |
16
+ | 上游目录布局 | `app-build/`(英文 canonical)+ `app-build/.locales/zh/`(中文覆盖层) |
16
17
  | 本 preset 布局 | 单树:`skills/cosmic-build/`(= 上游 zh 覆盖层拍平,无 `.locales/`) |
17
18
 
18
19
  上游会把旧的 R/D/E 管线、`capabilities/`、`cosmic-{requirements,design,executor,testing,code-review}`、
@@ -31,46 +32,50 @@
31
32
  | `schemas/*` | ⚠️ **canonical** | `property-contract-fixture.schema.json` 只在 canonical |
32
33
  | `contracts/*` | zh 优先;缺则 canonical | `property-input-index.json`、`property-value-encoding.json`、`operation-rule-write-contracts.json` 只在 canonical,且**被 `cmd_properties.py` 运行时读取** |
33
34
 
34
- ### 1.1 必须用 canonical 覆盖的 33 个 `.py`
35
+ ### 1.1 必须用 canonical 覆盖的 `.py`(**2026-10-19 对 0.0.326 重算:35 个**)
35
36
 
36
- 判定方法:剥掉 docstring 与全部字符串常量后比对 AST,仍有差异者为"代码级滞后"。
37
- 其中 **16 个与替换前的 DSH 旧版逐字节相同**(= zh 根本没更新,拷了等于没升级):
37
+ 判定方法:剥掉 docstring 与全部字符串常量后比对 AST,仍有差异者为"代码级滞后"。每次上游更新都**重算**,不要照搬旧名单。
38
38
 
39
39
  ```
40
- 脚本/测试(16 个 zh==旧DSH):
41
- scripts/discovery_snapshot.py ← 坏档:仍 import 已删的 _shared.property_names
42
- scripts/meta_export.py
43
- scripts/test/test_appconfig_load.py
44
- scripts/test/test_build_meta_order.py
45
- scripts/test/test_http_client.py
46
- scripts/test/test_kd_token_cache.py
47
- scripts/test/test_run.py
48
- scripts/test/test_runtime_tool_opt_in.py
49
- skills/cosmic-meta-api/modules/pdm/scripts/pdm_auto.py
50
- skills/cosmic-meta-api/scripts/_core/markdown.py
51
- skills/cosmic-meta-api/scripts/test/test_field_decorator.py
52
- skills/cosmic-meta-api/scripts/test/test_formatters_output_isolation.py
53
- skills/cosmic-meta-modeling/scripts/post_build_ui.py
54
- skills/openapi-gen/scripts/api/constants.py
55
- skills/openapi-gen/scripts/metadata/fetcher.py
56
- skills/openapi-gen/scripts/metadata/parser.py
57
-
58
- 三者各不同(14 个,zh ≠ canonical ≠ 旧DSH):
59
- scripts/run.py ← 注意:本补丁 #1 的落点
60
- scripts/test/test_kd_auth.py
61
- scripts/test/test_register_plugins.py
62
- skills/cosmic-meta-api/scripts/_core/{config,cmd_properties,cmd_forms,cmd_metaops,cmd_workspace,formatters}.py
63
- skills/cosmic-meta-api/scripts/meta_verifier.py
64
- skills/cosmic-meta-api/scripts/test/test_form_extension_flow.py
65
- skills/cosmic-meta-modeling/scripts/{artifact_validator,dynamic_form_validator}.py
66
- skills/openapi-gen/scripts/api/gen_runner.py
67
-
68
- DSH 无、新版新增(3 个):
69
- scripts/test/test_bootstrap_cosmic_context.py
70
- skills/cosmic-meta-api/scripts/test/test_add_button_closure.py
71
- skills/cosmic-meta-api/scripts/test/test_existing_form_ui.py
40
+ scripts/run.py ← 补丁 #1 落点
41
+ scripts/discovery_snapshot.py ← zh 坏档(仍 import 已删的 _shared.property_names)
42
+ scripts/meta_export.py
43
+ scripts/test/test_appconfig_load.py
44
+ scripts/test/test_build_meta_order.py
45
+ scripts/test/test_guide_skeleton_contract.py
46
+ scripts/test/test_kd_auth.py
47
+ scripts/test/test_kd_token_cache.py
48
+ scripts/test/test_modeling_input_recovery.py
49
+ scripts/test/test_register_plugins.py
50
+ scripts/test/test_report_business_contract.py
51
+ scripts/test/test_report_doc_contract_sync.py
52
+ scripts/test/test_run.py
53
+ scripts/test/test_runtime_tool_opt_in.py
54
+ scripts/test/test_batch5_drift_governance.py
55
+ skills/cosmic-meta-api/modules/pdm/scripts/pdm_auto.py
56
+ skills/cosmic-meta-api/scripts/_core/cmd_forms.py
57
+ skills/cosmic-meta-api/scripts/_core/cmd_plugins.py
58
+ skills/cosmic-meta-api/scripts/_core/cmd_properties.py
59
+ skills/cosmic-meta-api/scripts/_core/cmd_workspace.py
60
+ skills/cosmic-meta-api/scripts/_core/config.py
61
+ skills/cosmic-meta-api/scripts/_core/markdown.py
62
+ skills/cosmic-meta-api/scripts/meta_verifier.py
63
+ skills/cosmic-meta-api/scripts/test/test_add_button_closure.py
64
+ skills/cosmic-meta-api/scripts/test/test_field_decorator.py
65
+ skills/cosmic-meta-api/scripts/test/test_form_extension_flow.py
66
+ skills/cosmic-meta-api/scripts/test/test_formatters_output_isolation.py
67
+ skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py
68
+ skills/cosmic-meta-modeling/scripts/artifact_validator.py
69
+ skills/cosmic-meta-modeling/scripts/dynamic_form_validator.py
70
+ skills/cosmic-meta-modeling/scripts/post_build_ui.py
71
+ skills/openapi-gen/scripts/api/constants.py
72
+ skills/openapi-gen/scripts/api/gen_runner.py
73
+ skills/openapi-gen/scripts/metadata/fetcher.py
74
+ skills/openapi-gen/scripts/metadata/parser.py
72
75
  ```
73
76
 
77
+ 另加 **`skills/cosmic-meta-api/scripts/cosmic_api.py`**(zh 与 canonical 仅字节级 drift,AST 比不出;§1.2 仍要求取 canonical)。
78
+
74
79
  ### 1.2 不要照抄的东西
75
80
 
76
81
  - `.locales/zh/scripts/discovery_snapshot.py` —— 上游 zh 的坏档,用 canonical 版。
@@ -161,7 +166,7 @@ rsync -a --ignore-existing --exclude '.locales/' "$SRC/." "$DST/"
161
166
  # 4) 重贴 §2 的 17 处补丁(先 config.py,再凭据三件套)
162
167
 
163
168
  # 5) 机械适配
164
- # a. {APP_BUILD_ROOT} → {ROOT_DIR}(md 与 py 中花括号 token 形态;
169
+ # a. {ROOT_DIR} → {ROOT_DIR}(md 与 py 中花括号 token 形态;
165
170
  # 注意 py 里还有同名 Python 变量,不要一起改)
166
171
  # b. md 链接标签里的 .locales/zh/ 前缀去掉
167
172
  # c. 确认根 SKILL.md 里 {ROOT_DIR} 与 {python} 的绑定说明仍在
@@ -232,6 +237,37 @@ cd <工作区> && $PY $D/skills/cosmic-meta-api/scripts/cosmic_api.py --stdout q
232
237
  `queryForms` 冒烟 `[auth] OK` 且命中 16 条表单、`describeCommand` 返回 15.5KB 契约、
233
238
  markdown 断链 60 条(与上游 KD zh 完全一致,无新增)。
234
239
 
240
+ **2026-10-19(0.0.326)同步结果**:补丁 11/11 检查点通过、`_API_PATH` 105 项(含 13 项本地补丁)、
241
+ 命令 **204** 个(197 上游 + 7 KSQL)、compileall 退出码 0、`queryForms` 冒烟 `[auth] OK`、
242
+ `exportKSQLByTable` 实调成功(返回 `scriptBase64`)、根 `SKILL.md` 断链 0。
243
+
244
+ ---
245
+
246
+ ## 5.1 2026-10-19 同步记录(0.0.299 → 0.0.326)
247
+
248
+ | 步骤 | 实际执行 |
249
+ |---|---|
250
+ | 备份 | `cp -a` → `/tmp/cosmic-build.bak-2026-10-19`(57M) |
251
+ | 清理 | 删 `skills/cosmic-meta-api/scripts/.dsh/cosmic/.kd/config.json`(**杂散凭据副本,曾入库——见下**)与上游孤儿 `scripts/test/test_bd_bindings.py` |
252
+ | 步骤1 | rsync `zh` 覆盖层 `--delete`,exclude:`erpdb/`、`skills/cosmic-vibe-coding/`、`skills/config.json`、`skills/tenant.json`、entity-download 工具链 3 文件、**`LOCAL-PATCHES.md`(新增)**、**`skills/cosmic-coding-script/references/sdk/manifests/`(新增)** |
253
+ | 步骤2 | rsync canonical `--ignore-existing --exclude .locales/` 补齐 |
254
+ | 步骤3 | canonical 覆盖 **36** 个 `.py`(§1.1 重算 35 + `cosmic_api.py`);覆盖后 `.py` 与 canonical **AST 差异 0** |
255
+ | 步骤4 | 重贴 17 处补丁。**注意 #14 有两部分**:`_core/config.py` 的 `_API_PATH` + `cosmic_api.py` 的 **7 个 argparse 子命令与 dispatch**(新版 `cosmic_api.py` 取 canonical 后这两块全丢,必须都补) |
256
+ | 步骤5 | a) `{APP_BUILD_ROOT}` → `{ROOT_DIR}`:md **72** 处 + py **6** 处(py 里 88 个同名 **Python 变量不动**);b) md 里 `.locales/zh/` 前缀清理 6 个文件(`LOCAL-PATCHES.md` 自身保留) |
257
+
258
+ **上游 0.0.326 的新东西(未拷贝的单列)**:新增兄弟技能 `cosmic-e2e-test` / `expert-team-build` /
259
+ `mcp-apps-builder` / `task-builder` / `yzj-cli` —— **不拷**;`app-build` 仅在
260
+ `scripts/verify_plugin_loading.py` 的 `--runtime-trace` help 里提到 `cosmic-e2e-test`(可选输入,无硬依赖)。
261
+
262
+ **新增命令(已在 204 个内)**:`renameElementKey`、`ensureConditionalFieldChange`、
263
+ `ensureTimeDifferenceCalculation`、`configureDropdownMenu`。
264
+
265
+ **待办**:`skills/cosmic-coding-script/references/sdk/manifests/` 是本地生成物(0.0.326 未带产物,
266
+ 但带了生成脚本 `scripts/kingscript_sdk_sync.py`)—— 若上游文档改为引用新字段,需重跑该脚本刷新。
267
+
268
+ > ⚠️ **安全**:`skills/cosmic-meta-api/scripts/.dsh/cosmic/.kd/config.json` 含明文凭据且**曾在 git 历史里**。
269
+ > 已从工作树删除;如果该仓库会外发,建议清理历史并轮换对应密钥。
270
+
235
271
  ---
236
272
 
237
273
  ## 6. 已知遗留(不影响运行)
@@ -8,6 +8,18 @@ description: 创建或修改金蝶云苍穹表单、字段、规则、操作、
8
8
  通过已发布的 CLI 交付用户要求的苍穹应用修改。选择下方最具体的入口,
9
9
  只加载当前问题需要的内容,并保留全部明确业务要求。
10
10
 
11
+ 表单及其当前设计保存在苍穹服务端。`appRoot` 是本地应用绑定和导出产物的目录,
12
+ 不是线上表单清单。修改已有表单时,读取下方对应领域入口,将已提供的 `appRoot`
13
+ 和用户使用的表单名称直接传给命令。本地文件或 archive 中没有记录,不证明线上表单不存在。
14
+
15
+ `{ROOT_DIR}` 是本入口附带的技能包目录(本地补丁:上游 0.0.326 用 `APP_BUILD_ROOT` 这一同名 token,本 preset 统一为 `{ROOT_DIR}`;历史文本中的 `APP_BUILD_ROOT` 与本变量同义)。选定命令的参数尚不明确时,读取其本地契约:
16
+
17
+ ```text
18
+ {python} {ROOT_DIR}/skills/cosmic-meta-api/scripts/cosmic_api.py --stdout describeCommand <已选命令>
19
+ ```
20
+
21
+ 返回的 schema 说明命令输入;目标查询由领域命令完成,不通过搜索应用目录完成。
22
+
11
23
  创建入口负责契约支持的初始状态,未覆盖属性或布局交给对应入口。写命令自行解析准确表单目标;
12
24
  只有用户要求发现,或没有表单目标时才进入发现入口。
13
25
 
@@ -15,48 +27,69 @@ description: 创建或修改金蝶云苍穹表单、字段、规则、操作、
15
27
 
16
28
  | 当前请求 | 入口 |
17
29
  |---|---|
30
+ | 修改下拉菜单项,包括显示名称、说明及顺序 | [skills/cosmic-meta-ui/SKILL.md](skills/cosmic-meta-ui/SKILL.md):`configureDropdownMenu` 根据菜单项或明确按钮定位菜单,保留绑定的操作定义 |
18
31
  | 查找表单或确认所属应用 | [references/form-discovery.md](references/form-discovery.md) |
32
+ | 查询或新建功能分组(BizUnit),包括新建表单明确要求的分组;功能分组不是应用菜单 | [skills/cosmic-meta-modifier/modules/unit/SKILL.md](skills/cosmic-meta-modifier/modules/unit/SKILL.md) |
33
+ | 将表单移动到其他功能分组(不是应用菜单) | [skills/cosmic-meta-modifier/SKILL.md](skills/cosmic-meta-modifier/SKILL.md) |
19
34
  | 创建表单、实体、基础资料或应用菜单(不是功能分组) | [skills/cosmic-meta-modeling/SKILL.md](skills/cosmic-meta-modeling/SKILL.md) |
20
35
  | 新增/删除字段或分录;继承、复制、扩展或移动已有表单 | [skills/cosmic-meta-modifier/SKILL.md](skills/cosmic-meta-modifier/SKILL.md) |
21
- | 修改字段属性、必填、默认值、拆分表或页签操作 | [skills/cosmic-meta-modifier/modules/property/SKILL.md](skills/cosmic-meta-modifier/modules/property/SKILL.md) |
36
+ | 修改字段/控件/分录标识或属性、必填、默认值、拆分表或页签操作 | [skills/cosmic-meta-modifier/modules/property/SKILL.md](skills/cosmic-meta-modifier/modules/property/SKILL.md) |
22
37
  | 配置计算或条件字段行为 | [skills/cosmic-meta-modifier/modules/rule/SKILL.md](skills/cosmic-meta-modifier/modules/rule/SKILL.md) |
23
38
  | 配置保存、提交或其他操作校验 | [skills/cosmic-meta-modifier/modules/operation/SKILL.md](skills/cosmic-meta-modifier/modules/operation/SKILL.md) |
24
39
  | 新增可见控件或面板;修改布局、位置或容器外观 | [skills/cosmic-meta-ui/SKILL.md](skills/cosmic-meta-ui/SKILL.md);明确交互的操作先使用操作入口 |
25
- | 修改列表列、搜索、过滤或排序 | [skills/cosmic-meta-modifier/references/list-filter-modification.md](skills/cosmic-meta-modifier/references/list-filter-modification.md) |
26
- | 修改报表、插件、脚本或其他已有元数据 | [skills/cosmic-meta-modifier/SKILL.md](skills/cosmic-meta-modifier/SKILL.md) |
40
+ | 配置列表视图的列、搜索字段、过滤条件或排序 | [skills/cosmic-meta-modifier/references/list-filter-modification.md](skills/cosmic-meta-modifier/references/list-filter-modification.md) |
41
+ | 修改报表元数据、插件注册、元数据脚本或其他已有元数据 | [skills/cosmic-meta-modifier/SKILL.md](skills/cosmic-meta-modifier/SKILL.md) |
27
42
  | 查看、比较或还原元数据版本 | [skills/cosmic-meta-api/apis/meta_log.md](skills/cosmic-meta-api/apis/meta_log.md) |
28
- | 交付元数据无法表达的后端行为 | [references/java-plugin-delivery.md](references/java-plugin-delivery.md) |
43
+ | 编写或修改 Java 插件源码,包括元数据无法表达的后端行为 | [references/java-plugin-delivery.md](references/java-plugin-delivery.md) |
29
44
  | 将已有操作发布为 OpenAPI | [skills/openapi-gen/SKILL.md](skills/openapi-gen/SKILL.md) |
45
+ | 注册、查询或管理 MCP 服务(open_mcp_ext) | [skills/mcp-server/SKILL.md](skills/mcp-server/SKILL.md) |
30
46
 
31
47
  自定义苍穹前端页面使用 kd-frontend-development;非苍穹应用使用对应的
32
48
  standalone 或 site 技能。
33
49
 
34
50
  ## 共享约束
35
51
 
36
- - `{ROOT_DIR}` 是本 `SKILL.md` 所在目录(技能包根);下文所有脚本、参考与子技能路径都相对
37
- 它解析。历史文本中的 `APP_BUILD_ROOT` 与本变量同义。
38
- - `{python}` 在本 preset 中固定为苍穹专用运行时,与工作区 `AGENTS.md` 的
39
- 「Python 运行时(统一约定)」一致:macOS/Linux `$DSH_HOME/cache/cosmic/venv/bin/python`,
40
- Windows `$DSH_HOME/cache/cosmic/venv/Scripts/python.exe`。
41
- 首次执行 Python CLI 前只绑定一次 `{python}`:候选命令必须通过
52
+ - 首次执行 Python CLI 前只绑定一次 `{python}`:Windows 依次探测 `python`、`py -3`、
53
+ `python3`,macOS/Linux 依次探测 `python3`、`python`。候选命令必须通过
42
54
  `-c "print('APP_BUILD_PYTHON_OK')"`,退出成功且准确输出该标记;本轮持续复用该命令。
43
55
  空输出或探测失败属于运行环境故障,不能解释成“应用不存在”等业务结果。
44
56
  - 新建表单前,目标应用必须来自用户选择或宿主明确选中的应用。项目目录、本地应用清单和
45
57
  archive 不代表用户选择;缺少两者时先询问“要建在哪个应用下?”并等待,再读取应用文件或准备新建输入。
46
58
  - 保持用户范围。字段名称不隐含必填、布局、样式、规则或菜单发布。
47
59
  - 只有用户明确要求发布到菜单或修改菜单时才配置应用菜单;其他表单修改不隐含菜单新建或发布。
60
+ - 明确要求发布菜单后,交付前按菜单入口核对并启用同一个已验证应用。
48
61
  - 使用已验证的应用和表单身份。需要绑定、处理归属冲突或路径语义时,读取
49
62
  [references/application-context.md](references/application-context.md)。
50
63
  - CLI 回执、写入验证、未知状态、删除和本地运行状态遵循
51
64
  [references/execution-contract.md](references/execution-contract.md)。
52
65
  - 只有所选元数据入口无法表达剩余行为时才进入 Java。
53
- - 只有用户明确要求运行态验收,并点名可用工具或集成时才调用外部运行工具。
66
+ - 用户要求运行态验证,或诊断/修复运行报错时调用外部运行工具;优先使用可用的 `agent_browser`。
54
67
  - 只询问会实质改变业务结果的决定。
55
68
 
69
+ ## 保持执行路线连续
70
+
71
+ 先按选定入口实施。prepare 给出的完成输入路径是实施后要创建的文件,开始时不存在是正常状态。`TEST_ENVIRONMENT_HANDOFF` 由写入后的原生收口器生成,不在实施前到其他任务或工作树中寻找。
72
+
73
+ 消费已绑定的需求/前阶段产物一次,按“结构、静态属性、规则、操作校验、无法用元数据表达的行为”整理尚未完成的效果。选择每个效果的最小已发布 writer,输入完整时直接执行;仅加载命中的专题,独立读取可并行。同一表单的规则用已发布批量命令,属性批量保持其原生契约,避免逐项重新发现身份。
74
+
75
+ 复用 writer 返回的准确身份和验证回执;成功写入后不再查询无关候选、不重读同一说明、不为交付重做验证。参数错误按返回的准确形状修复;类型/能力边界错误直接切换该行为所属路线,避免在多个命令间摇摆。回执只证明它实际检查的内容:逐行必填不等于最少行数,设计态规则保存不等于浏览器运行通过。有运行验证请求时使用可用的 `agent_browser`;一次打开表单与检查默认值属于该行为的冒烟验证,不能冒充范围外测试阶段。
76
+
56
77
  ## 完成条件
57
78
 
58
- 全部表单修改完成后,按 [references/delivery.md](references/delivery.md) 完成本轮交付。该文档统一
59
- 负责目标分组、单次卡片收口、`deleteForm` 处理、`output_check` 和卡片输出。
79
+ 沿需求基线继续实施时,使用当前确认要求、用户约束和范围变更;建议不升级为必测承诺,已取消
80
+ 条件不沿用。现有基线交接见[应用上下文](references/application-context.md),选择 Java 前先核对
81
+ 受影响的能力事实与约束冲突。
82
+
83
+ 会话进度和最终答复用用户熟悉的业务名称,先说明完成了什么、实际检查结果及具体未完成项。
84
+ 表单编码、字段键、状态字母、布尔标记、回执字段、命令和哈希保留在技术产物中,不逐次播报工具、定位、重试、同步和阶段收口。
85
+ 遇到问题说明业务影响和下一步;用户明确要求技术诊断时再补必要的准确细节。
86
+ 工具参数、交接文件及渲染卡片的协议字段仍严格按原格式保存和调用。
87
+
88
+ 按用户要求的范围说明已完成的修改、检查结果和未验证项。
89
+ 配置回读只能确认配置写入结果,不能证明业务在运行环境中正常工作。
90
+
91
+ 全部要求的实现完成后,按 [references/delivery.md](references/delivery.md) 处理交付。该文档统一
92
+ 负责实现完成核对、目标分组、单次卡片收口、`deleteForm` 处理、`output_check`,以及在约定终点输出卡片。
60
93
 
61
94
  所有明确要求都有验证证据或明确未完成边界,且不存在写后未知状态时任务完成。
62
95
  已验证无变化时可以直接说明现状,不重复写入。仍可执行的实现工作不属于“未完成边界”;
@@ -0,0 +1,169 @@
1
+ package kd.bos.designer.property.setting;
2
+
3
+ import kd.bos.metadata.entity.commonfield.DecimalField;
4
+ import kd.bos.metadata.entity.commonfield.TextField;
5
+ import kd.bos.metadata.entity.commonfield.Field;
6
+ import kd.bos.metadata.entity.commonfield.DateTimeField;
7
+ import kd.bos.metadata.entity.commonfield.DateRangeField;
8
+ import kd.bos.metadata.entity.commonfield.ComboField;
9
+ import kd.bos.metadata.entity.commonfield.ComboItem;
10
+ import kd.bos.metadata.entity.businessfield.AbstractBasedataField;
11
+ import kd.bos.metadata.entity.EntityMetadata;
12
+ import kd.bos.metadata.form.FormMetadata;
13
+ import kd.bos.metadata.form.ControlAp;
14
+ import kd.bos.metadata.form.control.FieldAp;
15
+
16
+ import java.util.ArrayList;
17
+ import java.util.LinkedHashMap;
18
+ import java.util.List;
19
+ import java.util.Map;
20
+ import java.io.ByteArrayInputStream;
21
+ import java.io.ByteArrayOutputStream;
22
+ import java.io.ObjectInputStream;
23
+ import java.io.ObjectOutputStream;
24
+
25
+ /** Platform extension for ReportFilters.typed; no service writes or identity lookup here. */
26
+ public final class TypedReportFilterFields {
27
+ private TypedReportFilterFields() { }
28
+
29
+ public static Field<?> create(Field<?> source, String compare) {
30
+ if (source == null) throw new IllegalArgumentException("REPORT_FILTER_SOURCE_FIELD_NOT_FOUND");
31
+ if (!java.util.Arrays.asList("TextField", "DateField", "DateTimeField", "DateRangeField", "ComboField",
32
+ "MulComboField", "BasedataField", "MulBasedataField", "DecimalField").contains(source.getClass().getSimpleName()))
33
+ throw new IllegalArgumentException("REPORT_FILTER_SOURCE_TYPE_UNSUPPORTED: " + source.getClass().getSimpleName());
34
+ Field<?> result;
35
+ if ("13".equals(compare) && !(source instanceof DateRangeField)) {
36
+ if (!(source instanceof DateTimeField)) {
37
+ throw new IllegalArgumentException("REPORT_FILTER_RANGE_TYPE_UNSUPPORTED: " + source.getClass().getSimpleName());
38
+ }
39
+ DateRangeField range = new DateRangeField();
40
+ range.setRegionType(((DateTimeField) source).getRegionType());
41
+ range.setTimeZoneTransType(((DateTimeField) source).getTimeZoneTransType());
42
+ result = range;
43
+ } else {
44
+ try {
45
+ result = source.getClass().getDeclaredConstructor().newInstance();
46
+ } catch (ReflectiveOperationException error) {
47
+ throw new IllegalArgumentException("REPORT_FILTER_SOURCE_TYPE_UNSUPPORTED", error);
48
+ }
49
+ if (source instanceof AbstractBasedataField) {
50
+ AbstractBasedataField<?> from = (AbstractBasedataField<?>) source;
51
+ AbstractBasedataField<?> to = (AbstractBasedataField<?>) result;
52
+ to.setBaseEntityId(from.getBaseEntityId());
53
+ to.setDisplayProp(from.getDisplayProp());
54
+ to.setNumberProp(from.getNumberProp());
55
+ to.setEditSearchProp(from.getEditSearchProp());
56
+ to.setLayoutId(from.getLayoutId());
57
+ to.setDisplayStyle(from.getDisplayStyle());
58
+ to.setOrgFieldId(from.getOrgFieldId());
59
+ to.setFilter(copy(from.getFilter()));
60
+ if (from.getRefProps() != null && !from.getRefProps().isEmpty()) to.getRefProps().addAll(copy(from.getRefProps()));
61
+ if (from.getConditionalFilterRule() != null && !from.getConditionalFilterRule().isEmpty()) {
62
+ throw new IllegalArgumentException("REPORT_FILTER_CONDITIONAL_REFERENCE_UNSUPPORTED");
63
+ }
64
+ }
65
+ if (source instanceof ComboField) ((ComboField) result).setItems(copy(((ComboField) source).getItems()));
66
+ if (source instanceof DateTimeField) {
67
+ DateTimeField from = (DateTimeField) source, to = (DateTimeField) result;
68
+ to.setRegionType(from.getRegionType());
69
+ to.setTimeZoneTransType(from.getTimeZoneTransType());
70
+ to.setMinDate(from.getMinDate());
71
+ to.setMaxDate(from.getMaxDate());
72
+ }
73
+ if (source instanceof DateRangeField) {
74
+ ((DateRangeField) result).setTimeZoneTransType(((DateRangeField) source).getTimeZoneTransType());
75
+ ((DateRangeField) result).setRegionType(((DateRangeField) source).getRegionType());
76
+ ((DateRangeField) result).setQuickOptions(((DateRangeField) source).getQuickOptions());
77
+ }
78
+ if (source instanceof DecimalField) {
79
+ ((DecimalField) result).setPrecision(((DecimalField) source).getPrecision());
80
+ ((DecimalField) result).setScale(((DecimalField) source).getScale());
81
+ }
82
+ if (source instanceof TextField) ((TextField) result).setMaxLength(((TextField) source).getMaxLength());
83
+ }
84
+ if (result == source || result == null) throw new IllegalArgumentException("REPORT_FILTER_SOURCE_CLONE_FAILED");
85
+ if (result instanceof AbstractBasedataField) {
86
+ AbstractBasedataField<?> basedata = (AbstractBasedataField<?>) result;
87
+ // Source form field IDs are not report field IDs. Keep this dependency explicit.
88
+ if (basedata.getOrgFieldId() != null && !basedata.getOrgFieldId().isEmpty()) {
89
+ throw new IllegalArgumentException("REPORT_FILTER_ORG_BINDING_REQUIRED: " + source.getKey());
90
+ }
91
+ }
92
+ result.setInherit(false);
93
+ result.setExt(false);
94
+ result.setFeatures(null);
95
+ result.setMustInputCondition(null);
96
+ if (result instanceof ComboField) ((ComboField) result).setChangeListeners(null);
97
+ return result;
98
+ }
99
+
100
+ private static <T> T copy(T value) {
101
+ if (value == null) return null;
102
+ try {
103
+ ByteArrayOutputStream bytes = new ByteArrayOutputStream();
104
+ try (ObjectOutputStream output = new ObjectOutputStream(bytes)) { output.writeObject(value); }
105
+ try (ObjectInputStream input = new ObjectInputStream(new ByteArrayInputStream(bytes.toByteArray()))) {
106
+ return (T) input.readObject();
107
+ }
108
+ } catch (Exception error) {
109
+ throw new IllegalArgumentException("REPORT_FILTER_OPTION_COPY_FAILED", error);
110
+ }
111
+ }
112
+
113
+ public static Map<String, Object> describe(Field<?> field) {
114
+ Map<String, Object> result = new LinkedHashMap<>();
115
+ result.put("fieldPath", field.getKey());
116
+ result.put("displayName", field.getName() == null ? "" : field.getName().toString());
117
+ result.put("fieldType", field.getClass().getSimpleName());
118
+ result.put("mustInput", field.isMustInput());
119
+ if (field instanceof AbstractBasedataField) {
120
+ AbstractBasedataField<?> basedata = (AbstractBasedataField<?>) field;
121
+ result.put("referenceEntityId", basedata.getBaseEntityId());
122
+ result.put("displayProp", basedata.getDisplayProp());
123
+ result.put("numberProp", basedata.getNumberProp());
124
+ result.put("editSearchProp", basedata.getEditSearchProp());
125
+ result.put("layoutId", basedata.getLayoutId());
126
+ result.put("displayStyle", basedata.getDisplayStyle());
127
+ }
128
+ if (field instanceof ComboField) {
129
+ List<Map<String, Object>> items = new ArrayList<>();
130
+ for (ComboItem item : ((ComboField) field).getItems()) {
131
+ Map<String, Object> option = new LinkedHashMap<>();
132
+ option.put("value", item.getValue());
133
+ option.put("caption", item.getCaption() == null ? "" : item.getCaption().toString());
134
+ items.add(option);
135
+ }
136
+ result.put("comboOptions", items);
137
+ }
138
+ if (field instanceof DateTimeField) result.put("timeZoneTransType", ((DateTimeField) field).getTimeZoneTransType());
139
+ if (field instanceof DateRangeField) result.put("timeZoneTransType", ((DateRangeField) field).getTimeZoneTransType());
140
+ if (field instanceof DecimalField) {
141
+ result.put("precision", ((DecimalField) field).getPrecision());
142
+ result.put("scale", ((DecimalField) field).getScale());
143
+ }
144
+ if (field instanceof TextField) result.put("maxLength", ((TextField)field).getMaxLength());
145
+ return result;
146
+ }
147
+
148
+ public static Map<String, Object> read(FormMetadata form, EntityMetadata entity, String panelId) {
149
+ List<Map<String, Object>> filters = new ArrayList<>();
150
+ for (ControlAp<?> control : form.getItems()) {
151
+ if (!(control instanceof FieldAp) || !panelId.equals(control.getParentId())) continue;
152
+ Field<?> field = entity.getFieldById(((FieldAp) control).getFieldId());
153
+ if (field == null) throw new IllegalArgumentException("REPORT_FILTER_FIELD_BINDING_MISSING: " + control.getKey());
154
+ filters.add(describe(field));
155
+ }
156
+ Map<String, Object> result = new LinkedHashMap<>();
157
+ result.put("schemaVersion", "app-build-typed-report-filters/v1");
158
+ result.put("reportFilters", filters);
159
+ return result;
160
+ }
161
+
162
+ public static List<Map<String, Object>> fields(EntityMetadata entity) {
163
+ List<Map<String, Object>> fields = new ArrayList<>();
164
+ for (kd.bos.metadata.entity.EntityItem<?> item : entity.getItems()) {
165
+ if (item instanceof Field) fields.add(describe((Field<?>) item));
166
+ }
167
+ return fields;
168
+ }
169
+ }
@@ -0,0 +1,98 @@
1
+ --- a/src/main/java/kd/bos/designer/property/setting/ReportPropertyService.java
2
+ +++ b/src/main/java/kd/bos/designer/property/setting/ReportPropertyService.java
3
+ @@ -705,6 +705,29 @@
4
+ */
5
+ @SuppressWarnings("unchecked")
6
+ public static PropertyResult setReportFilters(String formNumber, Map<String, Object> data) {
7
+ + return setReportFilters(formNumber, data, false);
8
+ + }
9
+ +
10
+ + public static List<Map<String, Object>> readFieldSchemas(String formNumber) throws Exception {
11
+ + MetaPropertyService.MetaContext ctx = MetaPropertyService.loadMetaContext(formNumber, null);
12
+ + if (ctx == null || ctx.entityMetadata == null) throw new IllegalArgumentException("REPORT_FILTER_METADATA_UNAVAILABLE");
13
+ + return TypedReportFilterFields.fields(ctx.entityMetadata);
14
+ + }
15
+ +
16
+ + /** Independent typed configuration read-back from persisted form/entity metadata. */
17
+ + public static Map<String, Object> readTypedReportFilters(String formNumber) throws Exception {
18
+ + MetaPropertyService.MetaContext ctx = MetaPropertyService.loadMetaContext(formNumber, null);
19
+ + if (ctx == null || ctx.entityMetadata == null) throw new IllegalArgumentException("REPORT_FILTER_METADATA_UNAVAILABLE");
20
+ + String panel = findControlIdByKey(ctx.formMetadata, "reportcommfilterpanelap");
21
+ + if (StringUtils.isBlank(panel)) throw new IllegalArgumentException("REPORT_FILTER_PANEL_NOT_FOUND");
22
+ + return TypedReportFilterFields.read(ctx.formMetadata, ctx.entityMetadata, panel);
23
+ + }
24
+ +
25
+ + public static PropertyResult setTypedReportFilters(String formNumber, Map<String, Object> data) {
26
+ + return setReportFilters(formNumber, data, true);
27
+ + }
28
+ +
29
+ + private static PropertyResult setReportFilters(String formNumber, Map<String, Object> data, boolean typed) {
30
+ return withFormMetadata(formNumber, "ReportFilters", (ctx, formMetadata) -> {
31
+ ReportFilterAp filterAp = findReportFilterAp(formMetadata);
32
+ if (filterAp == null) {
33
+ @@ -717,6 +740,23 @@
34
+ "ReportPropertyService_FLT_1", BOS_DESIGNER_AI);
35
+ }
36
+ List<Map<String, Object>> filters = (List<Map<String, Object>>) filtersObj;
37
+ + // Resolve every source and option before replacing any existing panel state.
38
+ + Map<String, Field<?>> typedFields = new LinkedHashMap<>();
39
+ + if (typed) {
40
+ + if (StringUtils.isBlank(findControlIdByKey(formMetadata, "reportcommfilterpanelap")))
41
+ + return "REPORT_FILTER_PANEL_NOT_FOUND";
42
+ + for (Map<String, Object> filter : filters) {
43
+ + if (!(filter.get("source") instanceof Map)) continue;
44
+ + Map<String, Object> binding = (Map<String, Object>) filter.get("source");
45
+ + MetaPropertyService.MetaContext source = MetaPropertyService.loadMetaContext(toStr(binding.get("formNumber")), null);
46
+ + Field<?> field = source == null ? null : findEntityFieldByKey(source.entityMetadata, toStr(binding.get("fieldKey")));
47
+ + typedFields.put(toStr(filter.get("fieldPath")), TypedReportFilterFields.create(field, toStr(filter.get("compare"))));
48
+ + }
49
+ + for (ControlAp<?> control : formMetadata.getItems()) {
50
+ + if (typedFields.containsKey(control.getKey()) && !findControlIdByKey(formMetadata, "reportcommfilterpanelap").equals(control.getParentId()))
51
+ + return "REPORT_FILTER_KEY_SHARED_OUTSIDE_PANEL: " + control.getKey();
52
+ + }
53
+ + }
54
+
55
+ // 面板级:显示字段列表。
56
+ // 必须序列化为 JSON 数组串(如 ["flt_a","flt_b"]):运行时
57
+ @@ -853,7 +893,15 @@
58
+ // 强建新 Field 会造成实体层 key 重复,代价更大。
59
+ Field<?> existing = findEntityFieldByKey(ctx.entityMetadata, fp);
60
+ Field<?> field;
61
+ - if (existing != null) {
62
+ + if (typedFields.containsKey(fp)) {
63
+ + field = typedFields.get(fp);
64
+ + if (existing != null) {
65
+ + String existingId = existing.getId();
66
+ + ctx.entityMetadata.getItems().remove(existing);
67
+ + field.setId(existingId);
68
+ + }
69
+ + if (rootEntity != null) field.setIsv(rootEntity.getIsv());
70
+ + } else if (existing != null) {
71
+ field = existing;
72
+ if ("13".equals(compare) && !(existing instanceof DateRangeField)) {
73
+ warnLog("[setReportFilters] field [{}] compare=13(between) expects DateRangeField "
74
+ --- a/src/main/java/kd/bos/designer/property/setting/ComplexPropertyRouter.java
75
+ +++ b/src/main/java/kd/bos/designer/property/setting/ComplexPropertyRouter.java
76
+ @@ -413,6 +413,8 @@
77
+ return ReportPropertyService.replaceReportColumns(formNumber, toMap(data));
78
+ case "ReportFilters":
79
+ return ReportPropertyService.setReportFilters(formNumber, toMap(data));
80
+ + case "ReportFilters.typed":
81
+ + return ReportPropertyService.setTypedReportFilters(formNumber, toMap(data));
82
+ case "ReportSorts":
83
+ return ReportPropertyService.setReportSorts(formNumber, toMap(data));
84
+ case "ReportPlugin":
85
+ --- a/src/main/java/kd/bos/designer/ai/webapi/AIMetaBuilder.java
86
+ +++ b/src/main/java/kd/bos/designer/ai/webapi/AIMetaBuilder.java
87
+ @@ -766,9 +766,11 @@
88
+ if (formMeta != null && formMeta.getRootAp() != null) {
89
+ String formNumber = formMeta.getRootAp().getKey();
90
+ result.put("formNumber", formNumber);
91
+ + result.put("fieldSchemas", kd.bos.designer.property.setting.ReportPropertyService.readFieldSchemas(formNumber));
92
+ String rootType = formMeta.getRootAp().getClass().getSimpleName();
93
+ if ("ReportFormAp".equals(rootType)) {
94
+ result.put("modelType", "ReportFormModel");
95
+ + result.put("reportFilterSchema", kd.bos.designer.property.setting.ReportPropertyService.readTypedReportFilters(formNumber));
96
+ }
97
+ }
98
+ } catch (Exception e) {
@@ -0,0 +1,48 @@
1
+ import kd.bos.algo.*;
2
+ import java.util.*;
3
+ import java.util.concurrent.*;
4
+
5
+ public class ReportAlgoBenchmark {
6
+ static Map<String, String> read(DataSet data) {
7
+ Map<String, String> result=new TreeMap<>();
8
+ while(data.hasNext()) { Row row=data.next();result.put(row.getString("supplier"),row.getDate("first_date").getTime()+":"+row.getDate("last_date").getTime()); }
9
+ data.close();return result;
10
+ }
11
+ static Map<String, String> baseline(DataSet data) {
12
+ Map<String, String> result=new TreeMap<>();
13
+ for(DataSet group:data.splitByGroup(new String[]{"supplier"})) {
14
+ DataSet first=group.copy().topBy(1,new String[]{"bill_date asc"});
15
+ DataSet last=group.topBy(1,new String[]{"bill_date desc"});
16
+ if(!first.hasNext() || !last.hasNext()) throw new AssertionError("empty group");
17
+ Row firstRow=first.next();String key=firstRow.getString("supplier");long start=firstRow.getDate("bill_date").getTime();
18
+ long end=last.next().getDate("bill_date").getTime();result.put(key,start+":"+end);first.close();last.close();
19
+ }
20
+ return result;
21
+ }
22
+ static void run(int rows, int groups, int iterations) {
23
+ List<Object[]> input=new ArrayList<>();Map<String,String> expected=new TreeMap<>();
24
+ for(int i=0;i<rows;i++) input.add(new Object[]{"S"+(i%groups),new Date(i*1000L)});
25
+ for(int i=0;i<groups;i++) expected.put("S"+i,(i*1000L)+":"+((i+((rows-1-i)/groups)*groups)*1000L));
26
+ RowMeta meta=new RowMeta(new Field("supplier",DataType.StringType),new Field("bill_date",DataType.DateType));
27
+ Algo algo=Algo.create("report-benchmark");
28
+ List<Long> oldTimes=new ArrayList<>(),newTimes=new ArrayList<>();
29
+ for(int i=-1;i<iterations;i++) {
30
+ long start=System.nanoTime();Map<String,String> old=baseline(algo.createDataSet(input,meta));long oldTime=System.nanoTime()-start;
31
+ start=System.nanoTime();Map<String,String> optimized=read(CosmicReportAggregation.dateBounds(algo.createDataSet(input,meta)));long newTime=System.nanoTime()-start;
32
+ if(!expected.equals(old) || !expected.equals(optimized)) throw new AssertionError("business result differs");
33
+ if(i>=0) { oldTimes.add(oldTime);newTimes.add(newTime); }
34
+ }
35
+ Collections.sort(oldTimes);Collections.sort(newTimes);
36
+ int p95=(int)Math.ceil(iterations*.95)-1;
37
+ System.out.println("{\"rows\":"+rows+",\"groups\":"+groups+",\"iterations\":"+iterations+",\"resultsEqual\":true,\"baselineP50Ms\":"+oldTimes.get(iterations/2)/1e6+",\"baselineP95Ms\":"+oldTimes.get(p95)/1e6+",\"optimizedP50Ms\":"+newTimes.get(iterations/2)/1e6+",\"optimizedP95Ms\":"+newTimes.get(p95)/1e6+",\"databaseQueries\":0}");
38
+ }
39
+ public static void main(String[] args) throws Exception {
40
+ ExecutorService executor=kd.bos.threads.ThreadPools.newExecutorService("report-benchmark",1);
41
+ java.util.concurrent.atomic.AtomicBoolean completed=new java.util.concurrent.atomic.AtomicBoolean();
42
+ try {
43
+ executor.submit(()->{try(AlgoContext context=Algo.newContext()) {run(Integer.parseInt(args[0]),Integer.parseInt(args[1]),Integer.parseInt(args[2]));completed.set(true);}}).get(60,TimeUnit.SECONDS);
44
+ if(!completed.get()) throw new AssertionError("managed task did not run");
45
+ executor.shutdownNow();System.exit(0);
46
+ } catch(Exception error) { error.printStackTrace();System.exit(2); }
47
+ }
48
+ }
@@ -0,0 +1,7 @@
1
+ /** Isolates application logging/configuration only; computation uses the actual target SDK. */
2
+ public class ReportBenchmarkLogFactory extends kd.bos.logging.LogFactory {
3
+ protected kd.bos.logging.Log _getLog(String name) {
4
+ return (kd.bos.logging.Log) java.lang.reflect.Proxy.newProxyInstance(kd.bos.logging.Log.class.getClassLoader(),
5
+ new Class[]{kd.bos.logging.Log.class}, (proxy, method, args) -> method.getReturnType()==boolean.class ? false : null);
6
+ }
7
+ }
@@ -0,0 +1,26 @@
1
+ import java.util.Arrays;
2
+ import java.util.stream.Collectors;
3
+ import kd.bos.dataentity.entity.DynamicObject;
4
+ import kd.bos.dataentity.entity.DynamicObjectCollection;
5
+ import kd.bos.orm.query.QFilter;
6
+ import kd.bos.servicehelper.BusinessDataServiceHelper;
7
+ import kd.bos.servicehelper.QueryServiceHelper;
8
+
9
+ /** Compile-checked against the 8.0 SDK. Runtime identities and results need target validation. */
10
+ public final class CosmicEntryQuery {
11
+ private CosmicEntryQuery() {}
12
+
13
+ /** Query the verified form root; the result is flat and must not be saved. */
14
+ public static DynamicObjectCollection queryHeaderIds(String formNumber, QFilter[] filters) {
15
+ return QueryServiceHelper.query(formNumber, "id", filters);
16
+ }
17
+
18
+ /** Load a structured object by its queried header ID, then read its collection property. */
19
+ public static DynamicObjectCollection loadEntries(Object headerId, String formNumber,
20
+ String collectionProperty, String... entryFields) {
21
+ String selectFields = "id," + Arrays.stream(entryFields)
22
+ .map(field -> collectionProperty + "." + field).collect(Collectors.joining(","));
23
+ DynamicObject header = BusinessDataServiceHelper.loadSingle(headerId, formNumber, selectFields);
24
+ return header == null ? null : header.getDynamicObjectCollection(collectionProperty);
25
+ }
26
+ }