@shundoo-ai/dsh-cosmic 1.0.19 → 1.0.21

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 (245) hide show
  1. package/cordis.patch.yml +5 -5
  2. package/package.json +1 -1
  3. package/skills/cosmic-build/CHANGELOG.md +4 -0
  4. package/skills/cosmic-build/LOCAL-PATCHES.md +91 -40
  5. package/skills/cosmic-build/SKILL.md +46 -13
  6. package/skills/cosmic-build/assets/platform-report-filters/TypedReportFilterFields.java +169 -0
  7. package/skills/cosmic-build/assets/platform-report-filters/platform.patch +98 -0
  8. package/skills/cosmic-build/assets/report-algo-benchmark/ReportAlgoBenchmark.java +48 -0
  9. package/skills/cosmic-build/assets/report-algo-benchmark/ReportBenchmarkLogFactory.java +7 -0
  10. package/skills/cosmic-build/examples/java-rules/CosmicEntryQuery.java +26 -0
  11. package/skills/cosmic-build/examples/java-rules/CosmicReportAggregation.java +35 -0
  12. package/skills/cosmic-build/examples/java-rules/CosmicReportFilters.java +77 -0
  13. package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapter.java +25 -0
  14. package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapterCheck.java +26 -0
  15. package/skills/cosmic-build/knowledge/cosmic/platform/api/algo/GroupbyDataSet.md +47 -0
  16. package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterInfo.md +12 -12
  17. package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterItemInfo.md +2 -0
  18. package/skills/cosmic-build/knowledge/cosmic/platform/form-plugin.md +2 -4
  19. package/skills/cosmic-build/knowledge/cosmic/platform/java-type-contracts.md +11 -2
  20. package/skills/cosmic-build/knowledge/cosmic/platform/list-plugin.md +18 -14
  21. package/skills/cosmic-build/knowledge/cosmic/platform/operation-plugin.md +4 -4
  22. package/skills/cosmic-build/knowledge/cosmic/platform/reportlistdata-plugin.md +17 -9
  23. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/cross-entity-aggregate-writeback.md +2 -0
  24. package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/pre-post-operation.md +15 -7
  25. package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-algo.md +24 -68
  26. package/skills/cosmic-build/knowledge/cosmic/platform/workflow-plugin.md +2 -7
  27. package/skills/cosmic-build/references/application-context.md +35 -1
  28. package/skills/cosmic-build/references/common-reference.md +1 -1
  29. package/skills/cosmic-build/references/compile-guide.md +55 -68
  30. package/skills/cosmic-build/references/delivery.md +59 -7
  31. package/skills/cosmic-build/references/execution-contract.md +38 -0
  32. package/skills/cosmic-build/references/form-discovery.md +7 -1
  33. package/skills/cosmic-build/references/java-plugin-delivery.md +32 -162
  34. package/skills/cosmic-build/references/operation-dispatch.md +17 -0
  35. package/skills/cosmic-build/references/plugin-handoff-input.md +131 -0
  36. package/skills/cosmic-build/references/plugin-runtime-routing.md +1 -1
  37. package/skills/cosmic-build/references/report-filter-contract.md +78 -0
  38. package/skills/cosmic-build/references/sdk-inspection.md +23 -0
  39. package/skills/cosmic-build/schemas/data-model-authoring.schema.json +2 -3
  40. package/skills/cosmic-build/scripts/_http_client.py +55 -55
  41. package/skills/cosmic-build/scripts/appconfig_load.py +2 -2
  42. package/skills/cosmic-build/scripts/apply_report_filter_extension.py +39 -0
  43. package/skills/cosmic-build/scripts/bootstrap_cosmic_context.py +37 -2
  44. package/skills/cosmic-build/scripts/compile_plugin_source.py +279 -156
  45. package/skills/cosmic-build/scripts/execution_binding.py +40 -0
  46. package/skills/cosmic-build/scripts/inspect_platform_sdk.py +169 -0
  47. package/skills/cosmic-build/scripts/kd_api.py +23 -22
  48. package/skills/cosmic-build/scripts/kd_auth.py +1 -1
  49. package/skills/cosmic-build/scripts/kd_env_loader.py +19 -10
  50. package/skills/cosmic-build/scripts/kd_token_cache.py +2 -2
  51. package/skills/cosmic-build/scripts/kingscript_sdk_sync.py +350 -0
  52. package/skills/cosmic-build/scripts/kingscript_source_gate.py +11 -8
  53. package/skills/cosmic-build/scripts/platform_api_contract.py +246 -11
  54. package/skills/cosmic-build/scripts/plugin_corpus/build_index.py +403 -0
  55. package/skills/cosmic-build/scripts/plugin_corpus/jvm_classfile.py +281 -0
  56. package/skills/cosmic-build/scripts/plugin_corpus/measure_api_usage.py +446 -0
  57. package/skills/cosmic-build/scripts/plugin_source_gate.py +48 -7
  58. package/skills/cosmic-build/scripts/plugin_target_sdk.py +45 -0
  59. package/skills/cosmic-build/scripts/prepare_plugin_handoff.py +493 -47
  60. package/skills/cosmic-build/scripts/preview_url.py +35 -6
  61. package/skills/cosmic-build/scripts/query_plugin_handoff.py +250 -0
  62. package/skills/cosmic-build/scripts/register_plugins.py +28 -2
  63. package/skills/cosmic-build/scripts/render_output_cards.py +42 -9
  64. package/skills/cosmic-build/scripts/report_algo_benchmark.py +46 -0
  65. package/skills/cosmic-build/scripts/run.py +2 -2
  66. package/skills/cosmic-build/scripts/sync_generated_locale_assets.py +43 -0
  67. package/skills/cosmic-build/scripts/test/fixtures/ReportSdkCheck.java +64 -0
  68. package/skills/cosmic-build/scripts/test/fixtures/java_context_booking_native.json +541 -0
  69. package/skills/cosmic-build/scripts/test/test_add_rule_business_contract.py +85 -14
  70. package/skills/cosmic-build/scripts/test/test_batch5_drift_governance.py +12 -3
  71. package/skills/cosmic-build/scripts/test/test_build_meta_order.py +0 -16
  72. package/skills/cosmic-build/scripts/test/test_cli_continuation.py +87 -0
  73. package/skills/cosmic-build/scripts/test/test_compile_plugin_source.py +224 -3
  74. package/skills/cosmic-build/scripts/test/test_control_authoring.py +123 -4
  75. package/skills/cosmic-build/scripts/test/test_cosmic_sdk_examples.py +141 -0
  76. package/skills/cosmic-build/scripts/test/test_data_model_contract.py +30 -5
  77. package/skills/cosmic-build/scripts/test/test_delivery_stage_boundary.py +2 -10
  78. package/skills/cosmic-build/scripts/test/test_dym_sync_background.py +11 -0
  79. package/skills/cosmic-build/scripts/test/test_dynamic_form_metadata_only_contract.py +59 -1
  80. package/skills/cosmic-build/scripts/test/test_guide_skeleton_contract.py +87 -43
  81. package/skills/cosmic-build/scripts/test/test_inspect_platform_sdk.py +71 -0
  82. package/skills/cosmic-build/scripts/test/test_kd_api.py +67 -19
  83. package/skills/cosmic-build/scripts/test/test_kingscript_sdk_sync.py +221 -0
  84. package/skills/cosmic-build/scripts/test/test_kingscript_source_gate.py +10 -0
  85. package/skills/cosmic-build/scripts/test/test_list_configuration_closure.py +18 -0
  86. package/skills/cosmic-build/scripts/test/test_long_session_regressions.py +116 -0
  87. package/skills/cosmic-build/scripts/test/test_mcp_cli.py +524 -0
  88. package/skills/cosmic-build/scripts/test/test_modeling_input_recovery.py +141 -0
  89. package/skills/cosmic-build/scripts/test/test_open_world_cli_catalog.py +36 -2
  90. package/skills/cosmic-build/scripts/test/test_platform_api_contract.py +161 -1
  91. package/skills/cosmic-build/scripts/test/test_plugin_business_contract.py +91 -0
  92. package/skills/cosmic-build/scripts/test/test_plugin_corpus.py +195 -0
  93. package/skills/cosmic-build/scripts/test/test_plugin_handoff.py +346 -1
  94. package/skills/cosmic-build/scripts/test/test_plugin_target_sdk.py +70 -0
  95. package/skills/cosmic-build/scripts/test/test_preview_url.py +44 -1
  96. package/skills/cosmic-build/scripts/test/test_property_batch.py +22 -0
  97. package/skills/cosmic-build/scripts/test/test_property_input_discovery.py +13 -11
  98. package/skills/cosmic-build/scripts/test/test_query_plugin_handoff.py +160 -0
  99. package/skills/cosmic-build/scripts/test/test_register_plugins.py +31 -1
  100. package/skills/cosmic-build/scripts/test/test_render_output_cards.py +50 -4
  101. package/skills/cosmic-build/scripts/test/test_report_business_contract.py +27 -0
  102. package/skills/cosmic-build/scripts/test/test_report_doc_contract_sync.py +5 -4
  103. package/skills/cosmic-build/scripts/test/test_report_sdk_optimization.py +36 -0
  104. package/skills/cosmic-build/scripts/test/test_rule_batch_evidence.py +1 -1
  105. package/skills/cosmic-build/scripts/test/test_rule_domain_contract.py +20 -0
  106. package/skills/cosmic-build/scripts/test/test_rule_function_formula.py +16 -6
  107. package/skills/cosmic-build/scripts/test/test_skill_entry_contract.py +1 -0
  108. package/skills/cosmic-build/scripts/test/test_test_environment.py +45 -0
  109. package/skills/cosmic-build/scripts/test/test_verify_plugin_loading.py +79 -0
  110. package/skills/cosmic-build/scripts/test_environment.py +49 -0
  111. package/skills/cosmic-build/scripts/verify_plugin_loading.py +71 -0
  112. package/skills/cosmic-build/skills/cosmic-coding-impl/SKILL.md +86 -162
  113. package/skills/cosmic-build/skills/cosmic-coding-script/ATTRIBUTION.md +1 -1
  114. package/skills/cosmic-build/skills/cosmic-coding-script/SKILL.md +45 -14
  115. package/skills/cosmic-build/skills/cosmic-coding-script/references/kwc-controller-authoring.md +6 -0
  116. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/README.md +29 -19
  117. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/docs//350/204/232/346/234/254SDK.md +3 -4
  118. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/indexes/package-index.md +1 -1
  119. package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/strategy.md +27 -18
  120. package/skills/cosmic-build/skills/cosmic-meta-api/SKILL.md +11 -17
  121. package/skills/cosmic-build/skills/cosmic-meta-api/apis/ai_meta.md +1 -1
  122. package/skills/cosmic-build/skills/cosmic-meta-api/apis/app_menu.md +1 -1
  123. package/skills/cosmic-build/skills/cosmic-meta-api/apis/meta_log.md +1 -1
  124. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/control-authoring.json +45 -4
  125. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/form-control-traits.json +1 -1
  126. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/layout-ui.json +18 -0
  127. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/menu-publish.json +8 -2
  128. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-batch.json +7 -0
  129. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-input-index.json +3 -3
  130. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/report-write-contracts.json +1 -0
  131. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-domain.json +37 -5
  132. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-event-contract.json +24 -3
  133. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/run-build-meta.json +61 -12
  134. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/dropdown-menu.schema.json +69 -0
  135. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/report-write.schema.json +2 -1
  136. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-set.schema.json +1 -0
  137. package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-write.schema.json +14 -7
  138. package/skills/cosmic-build/skills/cosmic-meta-api/docs/api-summary.md +2 -2
  139. package/skills/cosmic-build/skills/cosmic-meta-api/modules/app-action/SKILL.md +6 -3
  140. package/skills/cosmic-build/skills/cosmic-meta-api/modules/develop/SKILL.md +1 -2
  141. package/skills/cosmic-build/skills/cosmic-meta-api/modules/export/SKILL.md +5 -6
  142. package/skills/cosmic-build/skills/cosmic-meta-api/modules/init/SKILL.md +13 -36
  143. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/SKILL.md +8 -9
  144. package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/config.json.example +5 -15
  145. package/skills/cosmic-build/skills/cosmic-meta-api/modules/reset/SKILL.md +6 -6
  146. package/skills/cosmic-build/skills/cosmic-meta-api/modules/usage/SKILL.md +20 -148
  147. package/skills/cosmic-build/skills/cosmic-meta-api/modules/verify/SKILL.md +1 -1
  148. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/build_receipts.py +171 -0
  149. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_apps.py +25 -6
  150. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_controls.py +55 -21
  151. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_fields.py +10 -3
  152. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_formactions.py +63 -6
  153. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_forms.py +59 -2
  154. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_listui.py +8 -0
  155. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_metaops.py +36 -1
  156. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_plugins.py +115 -90
  157. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_properties.py +666 -4
  158. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_rules.py +1415 -87
  159. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/commands.py +6 -1
  160. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/config.py +28 -15
  161. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/execution_errors.py +40 -0
  162. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/formatters.py +32 -5
  163. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/property_policy_contract.py +6 -0
  164. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/report_ops.py +113 -17
  165. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/reset.py +3 -3
  166. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/rule_contract.py +107 -26
  167. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/build_meta_order.py +50 -49
  168. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/cosmic_api.py +856 -150
  169. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/field_decorator.py +47 -14
  170. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_receipt_resume.py +374 -0
  171. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_cli_failure_contract.py +24 -0
  172. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_creation_identity_boundary.py +4 -2
  173. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_dropdown_menu_contract.py +382 -0
  174. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_existing_form_ui.py +0 -25
  175. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_field_decorator.py +50 -6
  176. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_functional_group_resolution.py +83 -16
  177. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_identity_template_resolution.py +103 -0
  178. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_plugin_contract.py +28 -2
  179. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_readback_derivation.py +22 -0
  180. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_typed_filters.py +65 -0
  181. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py +1041 -15
  182. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_post_build_recovery.py +65 -0
  183. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_verification_evidence.py +17 -0
  184. package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/api-param-checklist.md +1 -1
  185. package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/rule-modeling-guide.md +7 -4
  186. package/skills/cosmic-build/skills/cosmic-meta-modeling/SKILL.md +61 -13
  187. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/app-menu/SKILL.md +8 -0
  188. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/SKILL.md +5 -0
  189. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/dynamic-form-artifact-schema.md +5 -0
  190. package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/SKILL.md +21 -9
  191. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-entity-graphs.md +1 -1
  192. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-storage-constraints.md +5 -3
  193. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-ui-composition.md +6 -3
  194. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/creation-recovery.md +13 -0
  195. package/skills/cosmic-build/skills/cosmic-meta-modeling/references/parse-core.md +3 -0
  196. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_contract.py +6 -1
  197. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_emit.py +135 -87
  198. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/field_type_registry.py +11 -1
  199. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/isv_resolver.py +1 -3
  200. package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/report_validator.py +29 -0
  201. package/skills/cosmic-build/skills/cosmic-meta-modifier/SKILL.md +4 -2
  202. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/context/SKILL.md +2 -2
  203. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/execute/SKILL.md +1 -1
  204. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/SKILL.md +5 -4
  205. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/operation-write.md +6 -2
  206. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/validation.md +2 -0
  207. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/SKILL.md +20 -5
  208. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/complex-apis.md +1 -1
  209. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/policy-grammar.md +4 -1
  210. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/report-op/SKILL.md +9 -0
  211. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/SKILL.md +61 -4
  212. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/raw-rule-authoring.md +3 -1
  213. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-actions.md +2 -2
  214. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-reference.md +6 -6
  215. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/state.md +1 -1
  216. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/unit/SKILL.md +6 -3
  217. package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/verify/usage-guide.md +4 -4
  218. package/skills/cosmic-build/skills/cosmic-meta-modifier/references/list-filter-modification.md +4 -1
  219. package/skills/cosmic-build/skills/cosmic-meta-ui/SKILL.md +9 -1
  220. package/skills/cosmic-build/skills/cosmic-meta-ui/modules/button/SKILL.md +3 -0
  221. package/skills/cosmic-build/skills/mcp-server/SKILL.md +210 -0
  222. package/skills/cosmic-build/skills/mcp-server/scripts/mcp_cli.py +431 -0
  223. package/skills/cosmic-build/skills/openapi-gen/SKILL.md +3 -3
  224. package/skills/cosmic-build/skills/openapi-gen/scripts/api/gen_runner.py +2 -2
  225. package/skills/cosmic-dev-best-practices/references/bill-dev-convention.md +19 -9
  226. package/skills/cosmic-dev-best-practices/references/cosmic-meta-api.md +14 -11
  227. package/skills/cosmic-dev-best-practices/references/design-examples/basedata-design-example.md +1 -1
  228. package/skills/cosmic-dev-best-practices/references/design-examples/bill-design-example.md +1 -1
  229. package/skills/cosmic-dev-best-practices/references/elements/AssistantField.md +1 -1
  230. package/skills/cosmic-dev-best-practices/references/elements/BasedataField.md +2 -2
  231. package/skills/cosmic-dev-best-practices/references/elements/BasedataPropField.md +3 -3
  232. package/skills/cosmic-dev-best-practices/references/elements/CreaterField.md +2 -2
  233. package/skills/cosmic-dev-best-practices/references/elements/CurrencyField.md +2 -2
  234. package/skills/cosmic-dev-best-practices/references/elements/CustomerField.md +2 -2
  235. package/skills/cosmic-dev-best-practices/references/elements/FlexField.md +1 -1
  236. package/skills/cosmic-dev-best-practices/references/elements/MaterielField.md +2 -2
  237. package/skills/cosmic-dev-best-practices/references/elements/OrgField.md +2 -2
  238. package/skills/cosmic-dev-best-practices/references/elements/SupplierField.md +2 -2
  239. package/skills/cosmic-dev-best-practices/references/elements/UnitField.md +1 -1
  240. package/skills/cosmic-dev-best-practices/references/elements/UserField.md +3 -3
  241. package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md +16 -11
  242. package/skills/cosmic-dev-best-practices/references/layout-control-convention.md +5 -4
  243. package/skills/erp-analysis/references/delivery-contract.md +4 -2
  244. package/skills/erp-analysis/templates/AGENTS.template.md +1 -1
  245. package/skills/cosmic-build/skills/cosmic-meta-api/scripts/.dsh/cosmic/.kd/config.json +0 -21
@@ -97,6 +97,7 @@ from isv_resolver import resolve_developer_identity, resolve_isv # noqa: E402
97
97
  from project_paths import ensure_app_runtime_ignore # noqa: E402
98
98
 
99
99
  _ENTITY_BIZNAME_RE = re.compile(r"^[A-Za-z][A-Za-z0-9_]*$")
100
+ _DEFAULT_ENTITY_TEMPLATES = {"BillEntity": "bos_billtpl", "BaseEntity": "bos_basetpl"}
100
101
 
101
102
  try:
102
103
  from kd_env_loader import get_locale, resolve_locale # noqa: E402
@@ -190,6 +191,8 @@ def _run_cosmic_api(
190
191
  timeout=60,
191
192
  )
192
193
  if proc.returncode != 0:
194
+ detail = (proc.stdout or proc.stderr or "").strip()
195
+ print(f"[cosmic-api] {command} failed (exit={proc.returncode}): {detail}", file=sys.stderr)
193
196
  return None
194
197
  output = (proc.stdout or "").strip()
195
198
  if not output:
@@ -568,7 +571,7 @@ def _apply_direct_authoring_constraints(
568
571
  for entity in entities:
569
572
  if not isinstance(entity, dict) or "templateKey" in entity:
570
573
  continue
571
- default = {"BillEntity": "bos_billtpl", "BaseEntity": "bos_basetpl"}.get(str(entity.get("type") or ""))
574
+ default = _DEFAULT_ENTITY_TEMPLATES.get(str(entity.get("type") or ""))
572
575
  if default:
573
576
  entity["templateKey"] = default
574
577
  for entity in entities:
@@ -1196,7 +1199,8 @@ def _extract_resolver_field_writes(dm_section: dict[str, Any]) -> dict[str, dict
1196
1199
  def shape_check(dm_section: dict[str, Any], logs: _Logs) -> bool:
1197
1200
  """artifact + assumptions structural compliance validation.
1198
1201
 
1199
- - artifact.entities[]: required non-empty array; each item must have bizName/displayName/type/templateKey/fields[]
1202
+ - artifact.entities[]: required non-empty array; each item has bizName/displayName/type/fields[];
1203
+ BillEntity/BaseEntity receive a standard template when templateKey is omitted
1200
1204
  - assumptions[]: array (can be empty)
1201
1205
 
1202
1206
  Returns True for pass; False for SHAPE_INVALID errors.
@@ -2167,77 +2171,60 @@ def _extend_platform_carry_field_keys(
2167
2171
  return True
2168
2172
 
2169
2173
 
2170
- def _validate_template_keys(dm_section: dict[str, Any], logs: _Logs, cosmic_api_path: str) -> bool:
2174
+ def _validate_template_keys(
2175
+ dm_section: dict[str, Any], logs: _Logs, cosmic_api_path: str, *, app_root: Path,
2176
+ ) -> bool:
2171
2177
  """Validate each entity's templateKey legality.
2172
2178
 
2173
- Call getTemplateList to get public + business template list (with source annotation),
2174
- stop emit if templateKey is not in the list, requiring user selection.
2179
+ Read the applicable public and app template catalogs before emission. A
2180
+ failed catalog call is not an empty catalog, and an exact template can also
2181
+ be proved by its preset-field readback when a server omits it from lists.
2175
2182
  """
2176
2183
  artifact = dm_section.get("artifact") or {}
2177
2184
  entities = artifact.get("entities") or []
2178
2185
 
2179
2186
  biz_app_number = ""
2180
- ctx_path = dm_section.get("_section_io") or {}
2181
- app_root = ctx_path.get("app_root") or ""
2182
- if app_root:
2183
- ctx_file = Path(app_root) / "_runtime" / "context.json"
2184
- if ctx_file.exists():
2185
- try:
2186
- ctx = json.loads(ctx_file.read_text(encoding="utf-8"))
2187
- biz_app_number = str(ctx.get("appCode") or "").strip()
2188
- except Exception:
2189
- pass
2190
-
2191
- available_templates: dict[str, dict] = {}
2192
- model_types = ["BillFormModel", "BaseFormModel"]
2193
- for mt in model_types:
2187
+ ctx_file = app_root / "_runtime" / "context.json"
2188
+ if ctx_file.exists():
2194
2189
  try:
2195
- pub_cmd = [sys.executable, cosmic_api_path, "--json",
2196
- "queryPublicTemplates", "--modelType", mt]
2197
- if biz_app_number:
2198
- pub_cmd.extend(["--bizAppNumber", biz_app_number])
2199
- proc = subprocess.run(pub_cmd, capture_output=True, text=True,
2200
- encoding="utf-8", errors="replace", timeout=60)
2201
- if proc.returncode == 0 and (proc.stdout or "").strip():
2202
- result = json.loads(proc.stdout.strip())
2203
- templates = (result.get("data") or {}).get("templates") or []
2204
- if isinstance(templates, list):
2205
- for t in templates:
2206
- if isinstance(t, dict):
2207
- num = str(t.get("number") or "").strip()
2208
- if num:
2209
- available_templates[num] = {
2210
- "name": str(t.get("name") or ""),
2211
- "modelType": str(t.get("modelType") or mt),
2212
- "source": "public",
2213
- }
2190
+ ctx = json.loads(ctx_file.read_text(encoding="utf-8"))
2191
+ biz_app_number = str(ctx.get("appCode") or "").strip()
2214
2192
  except Exception:
2215
- logs.warn("API-UNAVAILABLE", f"queryPublicTemplates({mt}) call failed",
2216
- en=f"queryPublicTemplates({mt}) call failed")
2193
+ pass
2217
2194
 
2218
- try:
2219
- biz_cmd = [sys.executable, cosmic_api_path, "--json",
2220
- "queryBizTemplates", "--modelType", mt]
2221
- if biz_app_number:
2222
- biz_cmd.extend(["--bizAppNumber", biz_app_number])
2223
- proc = subprocess.run(biz_cmd, capture_output=True, text=True,
2224
- encoding="utf-8", errors="replace", timeout=60)
2225
- if proc.returncode == 0 and (proc.stdout or "").strip():
2226
- result = json.loads(proc.stdout.strip())
2227
- templates = (result.get("data") or {}).get("templates") or []
2228
- if isinstance(templates, list):
2229
- for t in templates:
2230
- if isinstance(t, dict):
2231
- num = str(t.get("number") or "").strip()
2232
- if num:
2233
- available_templates[num] = {
2234
- "name": str(t.get("name") or ""),
2235
- "modelType": str(t.get("modelType") or mt),
2236
- "source": "biz",
2237
- }
2238
- except Exception:
2239
- logs.warn("API-UNAVAILABLE", f"queryBizTemplates({mt}) call failed",
2240
- en=f"queryBizTemplates({mt}) call failed")
2195
+ available_templates: list[dict[str, str]] = []
2196
+ successful_types: set[str] = set()
2197
+ failed_sources: dict[str, set[str]] = {}
2198
+ model_type_by_entity = {"BillEntity": "BillFormModel", "BaseEntity": "BaseFormModel"}
2199
+ model_types = sorted({
2200
+ model_type_by_entity[ent.get("type")]
2201
+ for ent in entities if isinstance(ent, dict) and ent.get("type") in model_type_by_entity
2202
+ })
2203
+ bound_root = app_root.resolve()
2204
+ for mt in model_types:
2205
+ queries = [("queryPublicTemplates", {"modelType": mt}, "public")]
2206
+ if biz_app_number:
2207
+ queries.append(("queryBizTemplates", {
2208
+ "modelType": mt, "bizAppNumber": biz_app_number,
2209
+ }, "biz"))
2210
+ for command, arguments, source in queries:
2211
+ result = _run_cosmic_api(
2212
+ cosmic_api_path, command, arguments, app_root=bound_root,
2213
+ )
2214
+ data = result.get("data") if isinstance(result, dict) else None
2215
+ templates = data.get("templates") if isinstance(data, dict) else None
2216
+ if (not isinstance(result, dict) or result.get("status") is not True
2217
+ or not isinstance(data, dict) or data.get("success") is False
2218
+ or not isinstance(templates, list)):
2219
+ failed_sources.setdefault(mt, set()).add(source)
2220
+ continue
2221
+ successful_types.add(mt)
2222
+ available_templates.extend({
2223
+ "number": str(row.get("number") or "").strip(),
2224
+ "name": str(row.get("name") or ""),
2225
+ "modelType": mt,
2226
+ "source": source,
2227
+ } for row in templates if isinstance(row, dict) and row.get("number"))
2241
2228
 
2242
2229
  ok = True
2243
2230
  for ent in entities:
@@ -2253,21 +2240,42 @@ def _validate_template_keys(dm_section: dict[str, Any], logs: _Logs, cosmic_api_
2253
2240
  en=f"Entity '{ent.get('bizName')}' (type={etype}) missing templateKey, please specify")
2254
2241
  ok = False
2255
2242
  continue
2256
- if available_templates and tk not in available_templates:
2257
- matching_by_name = [
2258
- f"{num} ({info['name']}) [{info['source']}]"
2259
- for num, info in available_templates.items()
2260
- if info.get("modelType", "").startswith(
2261
- "Bill" if etype == "BillEntity" else "Base"
2262
- )
2263
- ]
2264
- logs.err("INVALID-TEMPLATEKEY",
2265
- f"Entity '{ent.get('bizName')}' templateKey='{tk}' not in available templates. "
2266
- f"Please provide the correct template code or let the user choose."
2267
- f"Available: {matching_by_name[:10]}",
2268
- en=f"Entity '{ent.get('bizName')}' templateKey='{tk}' not in available templates. "
2269
- f"Available: {matching_by_name[:10]}")
2270
- ok = False
2243
+ expected_model = model_type_by_entity.get(etype)
2244
+ if not expected_model:
2245
+ continue
2246
+ _ensure_field_decorator_on_path()
2247
+ from _core.cmd_forms import resolve_template_selector
2248
+ try:
2249
+ resolved_template = resolve_template_selector(tk, available_templates, expected_model)
2250
+ except ValueError:
2251
+ resolved_template = None
2252
+ if resolved_template:
2253
+ ent["templateKey"] = resolved_template
2254
+ if tk != resolved_template:
2255
+ logs.info("TEMPLATE-NAME-RESOLVED", f"{tk} -> {resolved_template}")
2256
+ continue
2257
+ detail = _run_cosmic_api(cosmic_api_path, "getEntityFields", {
2258
+ "formNumber": tk,
2259
+ }, app_root=bound_root) if tk != "blankPage" else None
2260
+ detail_data = detail.get("data") if isinstance(detail, dict) else None
2261
+ header = detail_data.get("headerFields") if isinstance(detail_data, dict) else None
2262
+ if isinstance(header, dict) and header.get("headerKey") == tk:
2263
+ logs.warn("TEMPLATE-NOT-LISTED", f"{tk} exists but was absent from template lists",
2264
+ en=f"{tk} exists but was absent from template lists")
2265
+ continue
2266
+ candidates = [
2267
+ f"{row['number']} ({row['name']}) [{row['source']}]"
2268
+ for row in available_templates if row["modelType"] == expected_model
2269
+ ]
2270
+ lookup_incomplete = (expected_model not in successful_types
2271
+ or "biz" in failed_sources.get(expected_model, set()))
2272
+ error_code = "TEMPLATE-LOOKUP-UNAVAILABLE" if lookup_incomplete else "INVALID-TEMPLATEKEY"
2273
+ logs.err(error_code,
2274
+ f"Entity '{ent.get('bizName')}' templateKey='{tk}' could not be verified. "
2275
+ f"Available: {candidates[:10]}",
2276
+ en=f"Entity '{ent.get('bizName')}' templateKey='{tk}' could not be verified. "
2277
+ f"Available: {candidates[:10]}")
2278
+ ok = False
2271
2279
  return ok
2272
2280
 
2273
2281
 
@@ -3389,7 +3397,8 @@ def _normalize_ui_composition_contract(value: Any) -> Any:
3389
3397
  if not isinstance(row, dict) or set(row) != {"fields"}:
3390
3398
  raise ValueError(
3391
3399
  f"uiComposition.{collection_name}[{block_index}].rows"
3392
- f"[{row_index}] must contain only fields"
3400
+ f"[{row_index}] must contain only fields; put fullLine "
3401
+ 'inside a fields[] item, e.g. {"fields":[{"field":"Description","fullLine":true}]}'
3393
3402
  )
3394
3403
  fields = row.get("fields")
3395
3404
  if not isinstance(fields, list) or not fields:
@@ -3648,8 +3657,8 @@ def assemble_artifact_emit(
3648
3657
  continue
3649
3658
  field_biz = str(field.get("bizWord") or "")
3650
3659
  if entity_biz and field_biz:
3651
- field_key = str(field.get("logicalName") or "").strip() or make_field_key(
3652
- field_biz, isv, standard=standard
3660
+ field_key = make_field_key(
3661
+ str(field.get("logicalName") or "").strip() or field_biz, isv, standard=standard
3653
3662
  )
3654
3663
  source_field_keys[(entity_biz, field_biz)] = field_key
3655
3664
  source_field_keys[(entity_key, field_biz)] = field_key
@@ -4688,8 +4697,8 @@ def _print_repair_report(logs: _Logs, exit_code: int) -> None:
4688
4697
  if is_en:
4689
4698
  print("==== REPAIR HINT: templateKey error ====", file=sys.stderr)
4690
4699
  print(
4691
- "Entity has missing or invalid templateKey.\n"
4692
- " -> Each BillEntity/BaseEntity MUST have a templateKey field.\n"
4700
+ "Entity has an empty or invalid templateKey.\n"
4701
+ " -> Omit templateKey to use the standard BillEntity/BaseEntity default.\n"
4693
4702
  " -> Standard templates: bos_billtpl, bos_billorgtpl, bos_basetpl, etc.\n"
4694
4703
  " -> If user specified a custom template, provide the exact template number.",
4695
4704
  file=sys.stderr,
@@ -4697,8 +4706,8 @@ def _print_repair_report(logs: _Logs, exit_code: int) -> None:
4697
4706
  else:
4698
4707
  print("==== REPAIR HINT: templateKey error ====", file=sys.stderr)
4699
4708
  print(
4700
- "Entity has missing or invalid templateKey.\n"
4701
- " → Each BillEntity/BaseEntity MUST have a templateKey field.\n"
4709
+ "Entity has an empty or invalid templateKey.\n"
4710
+ " → Omit templateKey to use the standard BillEntity/BaseEntity default.\n"
4702
4711
  " → Standard templates: bos_billtpl, bos_billorgtpl, bos_basetpl, etc.\n"
4703
4712
  " → If user specified a custom template, provide the exact template number.",
4704
4713
  file=sys.stderr,
@@ -4843,7 +4852,40 @@ def main(argv: list[str] | None = None) -> int:
4843
4852
  help="Artifact output directory; default is metadata/_emit/<run-id>.",
4844
4853
  )
4845
4854
  parser.add_argument("--quiet", action="store_true", help="only output on errors")
4846
- args = parser.parse_args(argv)
4855
+ parser.add_argument("--describe", action="store_true", help="Return the existing authoring schema and executable contract without platform access")
4856
+ arguments = list(argv) if argv is not None else sys.argv[1:]
4857
+ if "--describe" in arguments:
4858
+ if arguments != ["--describe"]:
4859
+ parser.error("--describe is read-only and takes no execution arguments")
4860
+ root = Path(__file__).resolve().parents[3]
4861
+ schema_file = root / "schemas" / "data-model-authoring.schema.json"
4862
+ schema = json.loads(schema_file.read_text(encoding="utf-8"))
4863
+ authoring_contract = {
4864
+ "callerFieldInputs": schema["definitions"]["field"]["required"],
4865
+ "compilerGeneratedIdentifiers": ["formNumber", "entityKey", "tableName", "fieldKey", "columnName"],
4866
+ "explicitIdentifierOverrides": ["--root-form-number", "logicalName", "physicalName"],
4867
+ "defaultTemplates": _DEFAULT_ENTITY_TEMPLATES,
4868
+ "guidance": {
4869
+ "en": "Define business fields using semantic bizWord, displayName and dataType. Omit templateKey unless a specific template is requested. The compiler resolves templates, fetches live header/entry preset fields, reuses exact-key overlaps, and generates identifiers with naming/collision rules. Do not reproduce these algorithms or inspect source before authoring; the schema and returned validation errors own the contract. Explicit user identifiers remain constraints. Query template fields separately only when business behavior needs an exact preset-field identity; unknown field types use fieldTypesCommand, known types need no catalog lookup.",
4870
+ "zh": "按业务语义填写 bizWord、displayName、dataType;未指定模板时省略 templateKey。编译器负责模板解析、动态读取表头/分录预置字段、按准确键复用重叠字段,以及标识生成和命名冲突处理。编写输入前无需复刻算法或读源码,以 Schema 和返回的校验错误为准;用户明确指定的标识仍是约束。仅当业务行为需要准确预置字段身份时,单独查询模板字段;未知类型用 fieldTypesCommand,已知类型不查目录。",
4871
+ },
4872
+ "templateFieldInspection": {
4873
+ "argv": [sys.executable, str(root / "skills/cosmic-meta-api/scripts/cosmic_api.py"),
4874
+ "--stdout", "getEntityFields", "--app-root", "<verified-app-root>",
4875
+ "--formNumber", "<template-key>"],
4876
+ "templateKeySource": "explicit templateKey or defaultTemplates[entity.type]",
4877
+ "responsePaths": ["data.headerFields.fields", "data.entryFields.fields"],
4878
+ },
4879
+ }
4880
+ print(json.dumps({"command": "data_model_emit", "execution": {"argvPrefix": [sys.executable, str(Path(__file__).resolve())]},
4881
+ "authoringContract": authoring_contract,
4882
+ "arguments": [{"flags": action.option_strings, "required": action.required,
4883
+ "help": action.help} for action in parser._actions if action.dest not in {"help", "describe"}],
4884
+ "schemaPath": str(schema_file), "inputSchema": schema,
4885
+ "fieldTypesCommand": [sys.executable, str(Path(__file__).resolve().with_name("field_type_registry.py")), "--catalog", "--compact"]},
4886
+ ensure_ascii=False, separators=(",", ":")))
4887
+ return EXIT_SUCCESS
4888
+ args = parser.parse_args(arguments)
4847
4889
 
4848
4890
  app_root = Path(args.app_root).resolve()
4849
4891
  if not app_root.exists():
@@ -5024,7 +5066,7 @@ def main(argv: list[str] | None = None) -> int:
5024
5066
  cosmic_api_path = str(
5025
5067
  Path(__file__).resolve().parents[2] / "cosmic-meta-api" / "scripts" / "cosmic_api.py"
5026
5068
  )
5027
- if not _validate_template_keys(dm_section, logs, cosmic_api_path):
5069
+ if not _validate_template_keys(dm_section, logs, cosmic_api_path, app_root=app_root):
5028
5070
  _persist_data_model_section(section_io, dm_section, logs)
5029
5071
  _print_repair_report(logs, EXIT_IR_INVALID)
5030
5072
  return EXIT_IR_INVALID
@@ -5106,6 +5148,12 @@ def main(argv: list[str] | None = None) -> int:
5106
5148
 
5107
5149
  logs.clear_error_report()
5108
5150
 
5151
+ # The compiler already knows the manifest. Pass it onward without another
5152
+ # filesystem read or model-authored command reconstruction.
5153
+ root = Path(__file__).resolve().parents[3]
5154
+ next_argv = [sys.executable, str(root / "skills" / "cosmic-meta-api" / "scripts" / "cosmic_api.py"),
5155
+ "runBatch", "--app-root", str(app_root), "--emit-manifest", str(output_dir / "_emit_manifest.json"), "--verify"]
5156
+ print("NEXT_COMMAND=" + json.dumps(next_argv, ensure_ascii=False))
5109
5157
  print(f"EMIT_SUCCESS: {len(written)} artifact written to {output_dir}")
5110
5158
  return EXIT_SUCCESS
5111
5159
 
@@ -117,10 +117,20 @@ def main(argv: list[str] | None = None) -> int:
117
117
  action="store_true",
118
118
  help="print the complete document-backed field-type catalog as JSON",
119
119
  )
120
+ parser.add_argument("--types", nargs="+", help="Exact FieldDataType names to describe; no semantic guessing")
121
+ parser.add_argument("--compact", action="store_true", help="Return the semantic index only, without full constraints")
120
122
  args = parser.parse_args(argv)
121
123
  if not args.catalog:
122
124
  parser.error("--catalog is required")
123
- print(json.dumps(build_field_type_catalog(), ensure_ascii=False, indent=2))
125
+ catalog = build_field_type_catalog()
126
+ if args.types:
127
+ missing = sorted(set(args.types) - {item["name"] for item in catalog["fieldTypes"]})
128
+ if missing:
129
+ parser.error("Unknown FieldDataType: " + ", ".join(missing))
130
+ catalog["fieldTypes"] = [item for item in catalog["fieldTypes"] if item["name"] in args.types]
131
+ if args.compact:
132
+ catalog["fieldTypes"] = [{key: item[key] for key in ("name", "semantics", "manualForbidden")} for item in catalog["fieldTypes"]]
133
+ print(json.dumps(catalog, ensure_ascii=False, separators=(",", ":")))
124
134
  return 0
125
135
 
126
136
 
@@ -88,9 +88,7 @@ def _fetch_isv_via_get_dev_info(app_root: Path) -> tuple[str, Any]:
88
88
  except Exception as exc:
89
89
  raise IsvResolveError(f"Unable to load cosmic-meta-api._core: {exc}") from exc
90
90
 
91
- target = app_root / "_runtime" / "cosmic-metadata"
92
- target.mkdir(parents=True, exist_ok=True)
93
- _cfg._init_paths(temp_dir=str(target))
91
+ _cfg._init_paths(app_root=app_root)
94
92
 
95
93
  try:
96
94
  cfg = _cfg.load_config()
@@ -509,11 +509,36 @@ def validate_report_artifact(artifact):
509
509
  # CLI
510
510
  # ═══════════════════════════════════════════════════════════════════════════════
511
511
 
512
+ def report_artifact_schema():
513
+ """Publish the artifact and its payload definitions as one local schema."""
514
+ schema = json.loads((Path(__file__).resolve().parents[1] / "modules/report/report-artifact-schema.json").read_text(encoding="utf-8"))
515
+ contract = json.loads((API_SCRIPTS.parent / "contracts/schema/report-write.schema.json").read_text(encoding="utf-8"))
516
+
517
+ def rewrite(value, external=False):
518
+ if isinstance(value, list):
519
+ return [rewrite(item, external) for item in value]
520
+ if not isinstance(value, dict):
521
+ return value
522
+ result = {key: rewrite(item, external) for key, item in value.items()}
523
+ reference = result.get("$ref", "")
524
+ prefix = "#/$defs/" if external else "app-build://cosmic-meta-api/report-write.schema.json#/$defs/"
525
+ if reference.startswith(prefix):
526
+ result["$ref"] = "#/$defs/reportWrite_" + reference[len(prefix):]
527
+ return result
528
+
529
+ bundled = rewrite(schema)
530
+ bundled.setdefault("$defs", {}).update({
531
+ "reportWrite_" + key: rewrite(value, True) for key, value in contract["$defs"].items()
532
+ })
533
+ return bundled
534
+
535
+
512
536
  def _build_parser():
513
537
  parser = argparse.ArgumentParser(
514
538
  description="Validate report-specific sections of a Cosmic Artifact."
515
539
  )
516
540
  group = parser.add_mutually_exclusive_group(required=True)
541
+ group.add_argument("--schema", action="store_true", help="Print the complete report artifact schema without platform access.")
517
542
  group.add_argument(
518
543
  "--artifact",
519
544
  metavar="PATH",
@@ -572,6 +597,10 @@ def main():
572
597
  parser = _build_parser()
573
598
  args = parser.parse_args()
574
599
 
600
+ if args.schema:
601
+ print(json.dumps(report_artifact_schema(), ensure_ascii=False, indent=2))
602
+ return
603
+
575
604
  artifact = _load_artifact(args)
576
605
  result = validate_report_artifact(artifact)
577
606
 
@@ -6,7 +6,7 @@ description: app-build 内部执行技能,用确定性 CLI 修改已有苍穹
6
6
  # 已有表单元数据修改
7
7
 
8
8
  使用原始意图和准确目标,执行最小可验证 CLI 闭环。
9
- `ROOT_DIR` 是已加载的 app-build 根 `SKILL.md` 所在目录;直接使用下方准确发布路径。
9
+ `{ROOT_DIR}` 是已加载的 app-build 根 `SKILL.md` 所在目录;直接使用下方准确发布路径。
10
10
 
11
11
  只有用户明确提供的准确应用目录,或成功绑定命令返回的目录,才是可信 `appRoot`;不得把
12
12
  项目根或其 `app/` 目录提升为 `appRoot`。用户明确删除一个准确元数据元素时可原子删除,
@@ -135,6 +135,7 @@ MetaOps 或再次确认。
135
135
  常用规则意图直达小型 rule-domain 命令:
136
136
 
137
137
  - `ensureFieldCalculation --entity`
138
+ - `ensureTimeDifferenceCalculation --entity`
138
139
  - `ensureConditionalCalculation --entity`
139
140
  - `setSummaryToField --element`
140
141
  - `ensureConditionalFieldState --entity`
@@ -176,7 +177,8 @@ MetaOps 或再次确认。
176
177
 
177
178
  完成已验证写入后,modifier 执行完成,但 app-build 请求可能还有其他明确工作。返回已验证的
178
179
  `appRoot` 和准确 `formNumber`;通过 `--form-name` 调用时使用返回身份,不再解析 schema。
179
- 完整请求结束后遵循 `{ROOT_DIR}/references/delivery.md`。写后结果无法确认时停止。
180
+ 完整或部分交付遵循 `{ROOT_DIR}/references/delivery.md`。写后结果无法确认时,先查明
181
+ 受影响表单的状态再继续修改或交付该表单;其他独立验证通过的表单仍需完成交付。
180
182
 
181
183
  ## 新增分录实体
182
184
 
@@ -17,7 +17,7 @@
17
17
  ## modifier 特有说明
18
18
 
19
19
  在执行元数据修改前,确认应用身份已经初始化:
20
- 1. 确认 config.json 中 `_initialized` 为 true
20
+ 1. 确认环境凭据可从 `~/.kd/config.json` 解析(见下方 init 入口)
21
21
  2. 确认 workspace.json 中 appNumber、bizCloudName、isv 已填充
22
22
  3. 若未初始化,按 `cosmic-meta-api/modules/init/SKILL.md` 引导用户补全
23
23
 
@@ -29,7 +29,7 @@
29
29
  |------|---------------------------|
30
30
  | `python` | Windows: `python` / Linux·macOS: `python3` |
31
31
  | `cosmic_api` | `SKILL_DIR/../../../cosmic-meta-api/scripts/cosmic_api.py` |
32
- | `config` | `SKILL_DIR/../../../config.json`(= `skills/config.json`) |
32
+ | `config` | `~/.kd/config.json`(平台级配置,由脚本自行解析) |
33
33
  | `field_type_reference` | `SKILL_DIR/../../../cosmic-meta-knowledge/domain-model/field-types.md` |
34
34
  | `field_naming_rules` | `SKILL_DIR/../../../cosmic-meta-knowledge/conventions/naming-rules.md` |
35
35
  | `basedata_lookup_guide` | `SKILL_DIR/../../../cosmic-meta-knowledge/reference-data/basedata-catalog.md` |
@@ -10,7 +10,7 @@
10
10
  | `cosmic_api` | `SKILL_DIR/../../../cosmic-meta-api/scripts/cosmic_api.py` |
11
11
  | `ops_manager` | `SKILL_DIR/../../../cosmic-meta-api/scripts/ops_manager.py` |
12
12
  | `pdm_skill` | `SKILL_DIR/../../../cosmic-meta-api/modules/pdm/SKILL.md` |
13
- | `config` | `SKILL_DIR/../../../config.json`(= `skills/config.json`) |
13
+ | `config` | `~/.kd/config.json`(平台级配置,由脚本自行解析) |
14
14
 
15
15
  ---
16
16
 
@@ -4,7 +4,7 @@
4
4
  静态字段属性归[属性入口](../property/SKILL.md),字段变化计算和条件界面行为归
5
5
  [规则入口](../rule/SKILL.md)。字段必填标记本身不能证明保存或提交时已执行必填检查。
6
6
 
7
- `ROOT_DIR` 是 app-build 提供的 Skill package directory。
7
+ `{ROOT_DIR}` 是 app-build 提供的 Skill package directory。
8
8
 
9
9
  ## 按当前要求选择契约
10
10
 
@@ -19,9 +19,8 @@
19
19
  必填/条件必填检查时才使用 `ensureMustInputValidation`,不要为每条自定义条件自动
20
20
  追加它。一条提示涉及多个条件时使用一个复合输入;独立要求的多条提示可分别配置。
21
21
 
22
- 只要求操作元数据时不创建按钮。需求明确描述用户可见触发入口或交互时,同时包含 UI 事项;
23
- 操作验证后加载界面入口,用返回的 operation key 绑定一个可见控件。仅有操作元数据时不得
24
- 声称按钮已经存在。
22
+ 平台或内部操作元数据不创建按钮。面向表单用户手动执行的具名自定义动作直接进入 UI
23
+ `addButton` 闭环,由它创建/复用操作并完成可见绑定。
25
24
 
26
25
  ## 常用校验
27
26
 
@@ -45,6 +44,8 @@ writer 自行绑定目标、检查条件并独立验证写入。只有输入超
45
44
 
46
45
  复用返回的表单身份与验证结果。全部要求完成后使用根入口统一交付;写入、渲染、
47
46
  输出检查按依赖顺序等待。设计态验证与运行态验收分开判断。
47
+ 操作定义和可见按钮只证明绑定完成。如果行为依赖尚未实现的插件(包括 `donothing` 操作),
48
+ 即使元数据回读通过,业务行为仍应标记待实现。
48
49
 
49
50
  已有校验通过自身的 `validationId` 定位,不使用规则 ID。
50
51
  `extension_required` 不代表授权创建扩展。
@@ -1,13 +1,17 @@
1
1
  ## 边界
2
2
 
3
+ 菜单项名称、说明属于界面显示对象,不等于操作定义的名称。只修改显示文字时使用
4
+ UI 的 configureDropdownMenu,保留绑定的操作定义。
5
+
3
6
  - 使用调用方已经明确的操作类型。只有平台精确类型未知时,才调用一次
4
7
  `listOperationTypes`,由模型选择一个类型;不得把请求识别成 CRUD、审批、
5
8
  下推或导航工作流。
6
9
  - 一个请求效果只执行一次 `addOperation`、`updateOperation` 或
7
10
  `deleteOperation`。用户明确要求多个操作时,执行多个各自独立验证的 CLI;
8
11
  不得生成 batch manifest 或执行计划。
9
- - 只要求操作元数据时不推断按钮、插件或规则。用户明确描述可见触发入口或点击交互时,
10
- 先完成本操作写入,再复用返回的表单身份与 operation key,进入 UI 的已有操作按钮闭环。
12
+ - 表单用户手动执行的具名自定义业务动作属于可见操作,除非请求明确说明它仅供内部或其他流程调用。
13
+ 此类请求直接进入 UI 的 `addButton` 闭环,由一个命令创建/复用操作并验证可见绑定。
14
+ 平台内置操作和明确的内部操作元数据仍只处理操作本身。
11
15
  - 本目录下的 scenarios 和 guides 仅是参考示例,不定义运行时控制流;已知命令
12
16
  不读取它们。
13
17
 
@@ -69,3 +69,5 @@
69
69
  命令启用已有
70
70
  `MustInputValidation`(包括清除 `SkipMustInput=true`),不存在时才补建,同时保留其他校验。
71
71
  只有字段红星而操作校验未启用,不能作为运行态验收证据。
72
+
73
+ 分录最少行数与逐行必填是不同约束。`MustInputValidation` 只校验已有行的必填字段,零行时没有字段可检查,不能证明“至少一行”。已发布操作校验命令没有行数契约时,进入根入口的 Java 操作插件路线,在单据根实体读取准确分录集合并添加提交校验;保持用户指定的操作范围,不把“提交时至少一行”扩大到保存。
@@ -7,11 +7,16 @@ modifier 阶段。
7
7
  就是完整必需参数,字段 key 不是前置条件。把这些选择器直接传入命令;只有在线表单中仍存在
8
8
  歧义时,命令才返回结构化候选。
9
9
 
10
+ `entries` 选择所有非表头实体,包含嵌套子分录。只修改某一个分录,或不同分录中有同名字段时,
11
+ 保留准确实体显示名/键,或用限定字段选择器,例如
12
+ `targets.fields:[{entity:"订场明细",field:"单价"}]`。不能用批量别名代替单一分录,
13
+ 也不能把“子单据体”等结构类型当作实际实体名称。
14
+
10
15
  用户同时给出准确表单编码和显示名称时,第一次调用就把编码原样传给 `--form-name`,
11
16
  不得用显示名称替换或重新解析表单。用户点名表头或分录位置时,在同一次调用的 policy
12
17
  目标中保留该位置。
13
18
 
14
- 本入口就是 `setProperties` 面向模型的完整公开合同。沿用根交接提供的 `ROOT_DIR`,根据
19
+ 本入口就是 `setProperties` 面向模型的完整公开合同。沿用根交接提供的 `{ROOT_DIR}`,根据
15
20
  用户给出的字段名和位置编译 policy,并把调用已发布命令作为下一动作;命令自行负责可执行实现
16
21
  和在线目标检查。
17
22
 
@@ -36,6 +41,11 @@ Windows PowerShell 下需要把内层双引号转义才能到达命令(`'{"A":
36
41
 
37
42
  ## 高频直达
38
43
 
44
+ 修改已有字段、控件或分录标识,使用一条
45
+ `renameElementKey --element "<当前名称/Key>" --new-key "<新标识>"`,配合上方表单绑定。
46
+ 命令统一补一次开发商前缀,迁移可观察的规则条件/触发字段引用,并验证名称、类型、父级和位置。
47
+ 引用清单无法读取时不写入;规则迁移失败时尝试回滚。数据库列名、表名仍是独立标识。
48
+
39
49
  必填、为空提示、静态/设计默认值、显隐、锁定、长度、精度、小数位、标题、布局/样式标量及分录默认行数,
40
50
  直接把用户给出的准确字段名和位置编译进对应属性命令。该命令是第一条平台动作,并自行完成
41
51
  目标解析、校验和回读;只有结构化未解析结果会给出唯一后续动作。
@@ -69,6 +79,7 @@ archive、表单 Schema 或本地目录。
69
79
  | 准确元素的其他高级样式 | 只读一次 `../../../cosmic-meta-knowledge/property-guides/style-properties.md`,再用 `setComplexProperty --complexType style` |
70
80
  | 页签上显示的“页签操作” | `ensureTabPageOperations --input '{"tab":"<页签>","items":[{"title":"<显示名称>","operationCode":"<操作编码>","operationType":"<需要新建时的操作类型>","operationName":"<操作名称>"}]}'`;页签项编码 `itemCode` 可省略,命令保留其他页签操作,它不是按钮 |
71
81
  | 附件面板行为 | 只读一次 `attachment-panel-properties.md`,再用一次 `setProperties` |
82
+ | 实体权限控制元数据 | `setPermissionControl`,按所需控制查看输入契约;该能力不等同于角色授权或权限项新建 |
72
83
  | 其他陌生且已发布的属性 | 只调用一次 `describePropertyInput --propertyNames <名称>`,再执行其返回路由 |
73
84
 
74
85
  设计器多选字段普通值放 `set`;`MustInputCondition`、`Features`、`CtlTips`、`Style`
@@ -83,12 +94,16 @@ archive、表单 Schema 或本地目录。
83
94
 
84
95
  实时设计器 Schema 声明只读的 `_Type_`/字段类型和元素类型继续只读。`Key` 不进入批量写入,
85
96
  因为批次内改变元素寻址会使后续操作失效。
97
+ 字段类型调整属于迁移。任何破坏性替换前,先明确完整目标定义,以及已有数据、字段身份、
98
+ 规则、布局和列表引用的保留方式;分别删除和新增成功不能证明迁移完成。
99
+ 没有满足这些要求的受支持路径时,保留原字段并报告该项边界,不能先删再试参数。
86
100
  `BasedataPropField` 本身只读,不得把这句描述转换成 `Lock:true`。明确设置 `Lock` 时使用
87
101
  实时状态(如 `new`/`edit`),不能用布尔值;非法值在认证前拒绝。
88
- `Lock` 是 FieldAp 表单控件属性。紧凑 policy 自行完成表单树写入和回读,也支持 Lock 与
89
- 其他属性组合;混合写入前先校验全部属性,部分失败返回已完成与待处理项,按回执恢复,
90
- 不重放整个 policy。即使 Property
91
- Schema 投影显示只读也不需要另找入口。“不可编辑”表示单据全部状态:
102
+ `Lock` 是 FieldAp 表单控件属性。单个表头字段不可编辑时,直接用
103
+ `{"targets":{"fields":["<字段>"],"entities":["header"]},"set":{"Lock":"new,edit,submit,audit"}}`。
104
+ `Lock` 属于 `set`,不能放入 `complex`。紧凑 policy 自行完成表单树写入和回读,即使设计器
105
+ Property Schema 显示只读也不先查询它。混合属性会在写前统一校验;部分失败返回已完成与
106
+ 待处理项,按回执恢复,不重放整个 policy。“不可编辑”表示单据全部状态:
92
107
  `new,edit,submit,audit`。禁止先查 Schema,也不得改用 `applyFormUi` 或手写 `modifyMeta`。
93
108
 
94
109
  字段属性(含静态显隐、可编辑性、外观)由本入口处理,属性存储在表单树也不改变归属。
@@ -36,7 +36,7 @@
36
36
  | `mustInputCondition` | setMustInputCondition | 字段级 |
37
37
  | `comboItems` | ⛔ ~~setComboItems~~ 已废弃;使用 `quickfield --add-option` / `--remove-option` | 字段级 |
38
38
  | `splitTables` | setSplitTables | 实体级 |
39
- | `dropdownItems` | setDropdownItems | 控件级 |
39
+ | `dropdownItems` | configureDropdownMenu(保留原身份的定向编辑) | 控件级 |
40
40
  | `style` | setStyle | 控件级 |
41
41
 
42
42
  > **使用建议**:上表列出常用的有快捷命令的类型。无快捷命令的类型(如 `userOption`、`billTypePara`、`formVariable`、`freezeList`、`networkControl` 等)使用 `setComplexProperty` 统一入口,完整列表见 `property-reference.md §12`。
@@ -59,7 +59,10 @@ policy 会对两个范围内的所有准确同名字段应用同一结果。未
59
59
  `FuncType`/`FuncParameter`;当前日期是
60
60
  `{"FuncType":"getToday","FuncParameter":"#CurrentDate#"}`,当前日期时间是
61
61
  `{"FuncType":"getNow","FuncParameter":"#CurrentDatetime#"}`,当前登录人是
62
- `{"FuncType":"getCurrentUser","FuncParameter":"#CurrentUser#"}`,只作用于准确点名的 `UserField`。policy 中的引用记录使用
62
+ `{"FuncType":"getCurrentUser","FuncParameter":"#CurrentUser#"}`,只作用于准确点名的 `UserField`。这是设计默认值函数的字段类型边界,不是平台整体能力边界。确认需求要求在 `TextField` 中
63
+ 填写当前用户或部门文本时,保留该类型;核对元数据入口后沿原生 Java 表单插件入口继续实现。
64
+ 未实施插件属于剩余开发,不能据此宣称无法实现,或仅因 `getCurrentUser` 不适配就建议删表重建。
65
+ policy 中的引用记录使用
63
66
  `{"kind":"record","value":"<名称或编码>"}` 或
64
67
  `{"kind":"multi-record","values":["<记录>"]}`,统一通过同一 policy。
65
68
  `setBasedataDefault` 保留为兼容适配器,新请求使用 policy。城市名称是记录选择器,
@@ -145,6 +145,15 @@ artifact 的列差异,绑定到这张报表的每一条菜单,以及有序
145
145
 
146
146
  ## 直接路径
147
147
 
148
+ 过滤编辑控件类型与查询比较符是两项能力。当前 `setReportFilters` 输入没有 `fieldType` 或
149
+ `controlType` 选择器。本地核对的平台源码将 `compare=between` 创建为绑定 `DateRangeField` 的
150
+ `FieldAp`,其余为 `TextField`;旧部署可能不同,必须回读实际目标。单日期 `DateField`、
151
+ F7 多选 `MulBaseDataField` 和下拉框 `ComboListField` 需要平台接口扩展。不要声称重建、
152
+ 只读类型属性、隐藏列或 Java 查询逻辑能提供这些控件;保留用户要求的界面行为为未解决边界,
153
+ 不静默降级为文本框。`getReportSchema` 在证据存在时返回实际 `FieldAp` 与实体 `fieldType`,
154
+ 缺少类型证据表示未知,不能推断为 `TextField`。
155
+
156
+
148
157
  `registerReportPlugin` 直接调用对应命令。CLI 自行解析当前应用内的报表、校验载荷、写入、独立
149
158
  读回报表投影并比较请求值。
150
159