@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
@@ -59,6 +59,8 @@ _FORM_ACTION_KEY_MAP = {
59
59
  "visible": "Visible",
60
60
  "expression": "Expression",
61
61
  "ret": "RET",
62
+ "events": "events",
63
+ "addevents": "addEvents",
62
64
  "seq": "Seq",
63
65
  "fieldname": "FieldName",
64
66
  "displaystyles": "DisplayStyles",
@@ -70,6 +72,7 @@ _BIZ_ACTION_KEY_MAP = {
70
72
  "actiontype": "ActionType", "description": "Description",
71
73
  "expression": "Expression", "fieldname": "FieldName",
72
74
  "ret": "RET", "seq": "Seq",
75
+ "events": "events", "addevents": "addEvents",
73
76
  }
74
77
 
75
78
  _ADVANCED_TAKE_VALUE_ACTIONS = frozenset({
@@ -86,35 +89,41 @@ def _single_casefold_value(source: dict, name: str):
86
89
 
87
90
 
88
91
  def _normalize_take_value_list(value, *, path, resolve_target=None):
89
- if not isinstance(value, list) or len(value) != 1 or not isinstance(value[0], dict):
92
+ if not isinstance(value, list) or not value or not all(isinstance(item, dict) for item in value):
90
93
  raise ValueError(
91
- f"RULE_ACTION_TAKE_VALUE_INVALID: {path} must contain exactly one mapping object"
94
+ f"RULE_ACTION_TAKE_VALUE_INVALID: {path} must contain one or more mapping objects"
92
95
  )
93
96
  key_map = {
94
97
  "targetfield": "TargetField", "srcfield": "SrcField",
95
98
  "targetfieldname": "TargetFieldName", "srcfieldname": "SrcFieldName",
96
99
  "onlyemptyrow": "OnlyEmptyRow",
97
100
  }
98
- item = {"_Type_": "TakeValueId"}
99
- for key, raw in value[0].items():
100
- canonical = key_map.get(str(key).casefold(), key)
101
- if canonical == "_Type_":
102
- continue
103
- compiled = copy.deepcopy(raw)
104
- if resolve_target and isinstance(compiled, str):
105
- compiled = resolve_target(compiled)
106
- item[canonical] = compiled
107
101
  required = (
108
102
  ("TargetField", "SrcField")
109
103
  if path == "Expression"
110
104
  else ("TargetFieldName", "SrcFieldName")
111
105
  )
112
- missing = [key for key in required if not str(item.get(key) or "").strip()]
113
- if missing:
114
- raise ValueError(
115
- f"RULE_ACTION_TAKE_VALUE_INVALID: {path} missing {missing}"
116
- )
117
- return [item]
106
+ normalized = []
107
+ targets = set()
108
+ for index, mapping in enumerate(value):
109
+ item = {"_Type_": "TakeValueId"}
110
+ for key, raw in mapping.items():
111
+ canonical = key_map.get(str(key).casefold(), key)
112
+ if canonical == "_Type_":
113
+ continue
114
+ compiled = copy.deepcopy(raw)
115
+ if resolve_target and isinstance(compiled, str):
116
+ compiled = resolve_target(compiled)
117
+ item[canonical] = compiled
118
+ missing = [key for key in required if not str(item.get(key) or "").strip()]
119
+ if missing:
120
+ raise ValueError(f"RULE_ACTION_TAKE_VALUE_INVALID: {path}[{index}] missing {missing}")
121
+ target = str(item[required[0]]).strip()
122
+ if target in targets:
123
+ raise ValueError(f"RULE_ACTION_TAKE_VALUE_DUPLICATE_TARGET: {path}[{index}] {target!r}")
124
+ targets.add(target)
125
+ normalized.append(item)
126
+ return normalized
118
127
 
119
128
 
120
129
  def normalize_biz_rule_action(
@@ -137,6 +146,14 @@ def normalize_biz_rule_action(
137
146
  if not action_type:
138
147
  raise ValueError("RULE_ACTION_TYPE_REQUIRED: bizRule ActionType is required")
139
148
  _validate_action_type(action_type)
149
+ events = normalized.pop("events", None)
150
+ add_events = normalized.pop("addEvents", None)
151
+ if events is not None and add_events is not None:
152
+ raise ValueError("RULE_EVENTS_CONFLICT: choose events or addEvents")
153
+ if events is not None and "RET" in normalized:
154
+ raise ValueError("RULE_EVENTS_CONFLICT: choose events or RET")
155
+ if add_events is not None and "RET" not in normalized:
156
+ raise ValueError(f"RULE_EVENT_BASE_RET_REQUIRED: {action_type} needs the current RET with addEvents")
140
157
  if action_type in _ADVANCED_TAKE_VALUE_ACTIONS:
141
158
  normalized["Expression"] = _normalize_take_value_list(
142
159
  normalized.get("Expression"), path="Expression", resolve_target=resolve_target
@@ -144,6 +161,8 @@ def normalize_biz_rule_action(
144
161
  normalized["FieldName"] = _normalize_take_value_list(
145
162
  normalized.get("FieldName"), path="FieldName", resolve_target=resolve_target
146
163
  )
164
+ if len(normalized["Expression"]) != len(normalized["FieldName"]):
165
+ raise ValueError("RULE_ACTION_TAKE_VALUE_LENGTH_MISMATCH: Expression and FieldName must align")
147
166
  if action_type == "TakeBaseProAction":
148
167
  normalized["_Type_"] = "TakeBasePropertyAction"
149
168
  elif action_type in {"FormulaAction", "ClearValueAction", "CallFieldChangeAction"}:
@@ -164,11 +183,16 @@ def normalize_biz_rule_action(
164
183
  normalized["Expression"] = expression.strip()
165
184
  default_ret = {
166
185
  "FormulaAction": 253, "ClearValueAction": 253,
186
+ "CallFieldChangeAction": 773,
167
187
  "TakeBaseProAction": 253, "SetEqutionAction": 1021,
168
188
  "FillQtyAction": 249,
169
189
  }.get(action_type)
170
190
  if default_ret is not None:
171
191
  normalized.setdefault("RET", default_ret)
192
+ if events is not None:
193
+ normalized["RET"] = select_action_events(action_type, events)
194
+ if add_events is not None:
195
+ normalized["RET"] = merge_action_events(action_type, normalized["RET"], add_events)
172
196
  normalized.setdefault("Seq", default_seq)
173
197
  if "RET" in normalized:
174
198
  validate_action_ret(action_type, normalized["RET"])
@@ -204,6 +228,14 @@ def normalize_form_rule_action(
204
228
  )
205
229
  normalized[canonical] = copy.deepcopy(value)
206
230
  normalized["ActionType"] = action_type
231
+ events = normalized.pop("events", None)
232
+ add_events = normalized.pop("addEvents", None)
233
+ if events is not None and add_events is not None:
234
+ raise ValueError("RULE_EVENTS_CONFLICT: choose events or addEvents")
235
+ if events is not None and "RET" in normalized:
236
+ raise ValueError("RULE_EVENTS_CONFLICT: choose events or RET")
237
+ if add_events is not None and "RET" not in normalized:
238
+ raise ValueError(f"RULE_EVENT_BASE_RET_REQUIRED: {action_type} needs the current RET with addEvents")
207
239
 
208
240
  raw_targets = normalized.pop("FieldKey", None)
209
241
  if raw_targets is not None:
@@ -431,12 +463,16 @@ def normalize_form_rule_action(
431
463
 
432
464
  if action_type in _TARGETED_FORM_ACTIONS:
433
465
  normalized.pop("FieldName", None)
434
- if action_type == "SetRowStyleAction" and "RET" not in normalized:
466
+ if action_type == "SetRowStyleAction" and "RET" not in normalized and events is None:
435
467
  raise ValueError(
436
468
  "RULE_ACTION_RET_REQUIRED: SetRowStyleAction has report-specific event "
437
469
  "masks; pass the exact verified RET for the target report"
438
470
  )
439
471
  normalized.setdefault("RET", FORM_RULE_DEFAULT_RET)
472
+ if events is not None:
473
+ normalized["RET"] = select_action_events(action_type, events)
474
+ if add_events is not None:
475
+ normalized["RET"] = merge_action_events(action_type, normalized["RET"], add_events)
440
476
  normalized.setdefault("Seq", default_seq)
441
477
  validate_action_ret(action_type, normalized["RET"])
442
478
  return normalized
@@ -455,6 +491,22 @@ def _validate_action_type(action_type: str) -> None:
455
491
  )
456
492
 
457
493
 
494
+ def runtime_action_warnings(rule_config: dict) -> list[dict]:
495
+ warnings = _EVENT_CONTRACT.get("runtimeWarnings") or {}
496
+ actions = normalize_rule_config(rule_config)
497
+ kinds = {
498
+ action.get("ActionType")
499
+ for branch in ("trueActions", "falseActions")
500
+ for action in (actions.get(branch) or [])
501
+ if isinstance(action, dict)
502
+ }
503
+ return [
504
+ {"actionType": kind, "message": warnings[kind]}
505
+ for kind in sorted(kinds)
506
+ if kind in warnings
507
+ ]
508
+
509
+
458
510
  def validate_action_ret(action_type: str, requested) -> None:
459
511
  if isinstance(requested, bool) or not isinstance(requested, int) or requested < 1:
460
512
  raise ValueError(
@@ -468,14 +520,43 @@ def validate_action_ret(action_type: str, requested) -> None:
468
520
  f"unknown bits {unknown_bits} outside legal union {legal_union}"
469
521
  )
470
522
  _validate_action_type(action_type)
471
- masks = _EVENT_CONTRACT.get("actionMasks") or {}
472
- support_mask = int(masks[action_type])
473
- unsupported_bits = requested & ~support_mask
474
- if unsupported_bits:
475
- raise ValueError(
476
- f"RULE_RET_UNSUPPORTED: {action_type}.RET={requested} includes bits "
477
- f"{unsupported_bits} outside action support mask {support_mask}"
478
- )
523
+
524
+
525
+ def _event_mask(events) -> int:
526
+ if not isinstance(events, (list, tuple)) or not events:
527
+ raise ValueError("RULE_EVENTS_INVALID: provide a non-empty array of event names")
528
+ bits = {name: int(bit) for bit, name in _EVENT_CONTRACT["eventBits"].items()}
529
+ aliases = _EVENT_CONTRACT.get("eventAliases") or {}
530
+ aliases_by_casefold = {key.casefold(): value for key, value in aliases.items()}
531
+ canonical_by_casefold = {key.casefold(): key for key in bits}
532
+ selected = 0
533
+ for name in events:
534
+ if not isinstance(name, str):
535
+ raise ValueError("RULE_EVENTS_INVALID: event names must be strings")
536
+ supplied = name.strip()
537
+ canonical = (aliases.get(supplied)
538
+ or aliases_by_casefold.get(supplied.casefold())
539
+ or canonical_by_casefold.get(supplied.casefold())
540
+ or supplied)
541
+ if canonical not in bits:
542
+ raise ValueError(f"RULE_EVENT_UNKNOWN: {name!r}; expected {sorted(bits)}")
543
+ selected |= bits[canonical]
544
+ return selected
545
+
546
+
547
+ def select_action_events(action_type: str, events) -> int:
548
+ """Compile exactly the requested event timings for a new action."""
549
+ selected = _event_mask(events)
550
+ validate_action_ret(action_type, selected)
551
+ return selected
552
+
553
+
554
+ def merge_action_events(action_type: str, current: int, events) -> int:
555
+ """Append named events without clearing existing or non-checkbox bits."""
556
+ validate_action_ret(action_type, current)
557
+ merged = current | _event_mask(events)
558
+ validate_action_ret(action_type, merged)
559
+ return merged
479
560
 
480
561
 
481
562
  def trigger_field_selectors(rule_config: dict) -> list[str]:
@@ -93,6 +93,20 @@ def collect_ref_bill_targets(data: dict[str, Any]) -> set[str]:
93
93
  return targets
94
94
 
95
95
 
96
+ def validate_ref_bill_owner(data):
97
+ """Reject the unsupported Base-form deferred writer before creating its shell."""
98
+ entities = data.get("entities") or []
99
+ if not any(entity.get("type") == "BaseEntity" for entity in entities if isinstance(entity, dict)):
100
+ return []
101
+ return [
102
+ "REF_BILL_OWNER_UNSUPPORTED: the current RefBillField writer requires a bill form; "
103
+ "resolve model/reference semantics before creating this BaseEntity (no automatic type substitution)"
104
+ for entity in entities if isinstance(entity, dict)
105
+ for field in entity.get("fields") or []
106
+ if isinstance(field, dict) and field.get("dataType") == "RefBillField"
107
+ ]
108
+
109
+
96
110
  def bind_ref_bill_ids(
97
111
  data: dict[str, Any],
98
112
  form_ids: dict[str, str],
@@ -330,23 +344,13 @@ def _infer_form_number(data: dict[str, Any], path: str, isv: str) -> str:
330
344
  return os.path.splitext(os.path.basename(path))[0].lower()
331
345
 
332
346
 
333
- def plan_build_waves(
347
+ def collect_build_dependencies(
334
348
  artifact_files: list[str],
335
349
  *,
336
350
  manifest: dict[str, Any] | None = None,
337
351
  isv: str = "",
338
- ) -> list[list[str]]:
339
- """Return ordered waves of artifact paths; each wave can run concurrently.
340
-
341
- Dependencies: artifact A depends on B when A references B's formNumber and
342
- B is also in this batch. References to forms outside the batch are ignored
343
- (assumed already on platform).
344
- """
345
- if not artifact_files:
346
- return []
347
- if len(artifact_files) == 1:
348
- return [list(artifact_files)]
349
-
352
+ ) -> dict[str, set[str]]:
353
+ """Exact prerequisites within this batch, keyed by normalized artifact path."""
350
354
  norm_paths = [os.path.normpath(os.path.abspath(p)) for p in artifact_files]
351
355
  path_set = set(norm_paths)
352
356
  m_map = _manifest_path_to_form(manifest)
@@ -365,10 +369,7 @@ def plan_build_waves(
365
369
  form_to_path[fn] = p
366
370
  path_refs[p] = _collect_form_refs(data)
367
371
 
368
- # in-degree among batch artifacts only
369
- in_deg: dict[str, int] = {p: 0 for p in norm_paths}
370
- dependents: dict[str, list[str]] = {p: [] for p in norm_paths}
371
-
372
+ dependencies = {p: set() for p in norm_paths}
372
373
  for p in norm_paths:
373
374
  own = path_form.get(p, "")
374
375
  for ref in path_refs.get(p) or set():
@@ -376,8 +377,20 @@ def plan_build_waves(
376
377
  continue
377
378
  dep_path = form_to_path.get(ref)
378
379
  if dep_path and dep_path in path_set and dep_path != p:
379
- in_deg[p] += 1
380
- dependents[dep_path].append(p)
380
+ dependencies[p].add(dep_path)
381
+ return dependencies
382
+
383
+
384
+ def plan_build_waves(artifact_files, *, manifest=None, isv="", dependencies=None):
385
+ """Topological waves; external references are resolved by the writer."""
386
+ graph = dependencies if dependencies is not None else collect_build_dependencies(
387
+ artifact_files, manifest=manifest, isv=isv)
388
+ norm_paths = list(graph)
389
+ in_deg = {path: len(parents) for path, parents in graph.items()}
390
+ dependents = {path: [] for path in graph}
391
+ for path, parents in graph.items():
392
+ for parent in parents:
393
+ dependents[parent].append(path)
381
394
 
382
395
  waves: list[list[str]] = []
383
396
  q = deque([p for p in norm_paths if in_deg[p] == 0])
@@ -406,6 +419,24 @@ def plan_build_waves(
406
419
  return waves
407
420
 
408
421
 
422
+ def partition_build_wave(wave, dependencies, succeeded):
423
+ """Schedule only artifacts whose actual prerequisites verified successfully."""
424
+ ready, blocked = [], []
425
+ for path in wave:
426
+ missing = sorted(dependencies.get(path, set()) - succeeded)
427
+ if not missing:
428
+ ready.append(path)
429
+ continue
430
+ blocked.append({
431
+ "artifact": os.path.basename(path), "artifactPath": path,
432
+ "ok": False, "phase": "dependency", "writeAttempted": False,
433
+ "errorCode": "DEPENDENCY_FAILED", "blockedByArtifacts": missing,
434
+ "errors": ["Required artifacts did not verify successfully; this artifact was not written"],
435
+ "elapsed_sec": 0.0,
436
+ })
437
+ return ready, blocked
438
+
439
+
409
440
  def describe_build_plan(
410
441
  waves: list[list[str]],
411
442
  *,
@@ -425,33 +456,3 @@ def describe_build_plan(
425
456
  for p in wave]
426
457
  lines.append(f" wave {i}: {', '.join(names)}")
427
458
  return "\n".join(lines)
428
-
429
-
430
- def dependency_blocked_results(
431
- waves: list[list[str]],
432
- *,
433
- failed_wave_index: int,
434
- ) -> list[dict[str, Any]]:
435
- """Return stable machine results for waves blocked by a failed prerequisite.
436
-
437
- ``failed_wave_index`` is one-based, matching the CLI's wave labels.
438
- """
439
- blocked: list[dict[str, Any]] = []
440
- for wave_index, wave in enumerate(waves, 1):
441
- if wave_index <= failed_wave_index:
442
- continue
443
- for path in wave:
444
- blocked.append(
445
- {
446
- "artifact": os.path.basename(path),
447
- "ok": False,
448
- "phase": "dependency",
449
- "errorCode": "DEPENDENCY_WAVE_FAILED",
450
- "blockedByWave": failed_wave_index,
451
- "errors": [
452
- f"prerequisite wave {failed_wave_index} failed; artifact was not written"
453
- ],
454
- "elapsed_sec": 0.0,
455
- }
456
- )
457
- return blocked