@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
@@ -0,0 +1,350 @@
1
+ #!/usr/bin/env python3
2
+ """KingScript SDK sync: poll the target environment for its real SDK surface.
3
+
4
+ The shipped SDK indexes under skills/cosmic-coding-script/references/sdk/ are
5
+ a build-time snapshot and silently drift from the running Cosmic release
6
+ (older environments lack newer types; newer business modules such as
7
+ @constellation/* never appear in the snapshot). The platform now exposes
8
+ ``POST /kapi/v2/sysext/kingscript/dev/poll/sdk`` which returns a one-shot
9
+ tempfile URL to a ZIP of the environment's actual ``@cosmic/*`` .d.ts
10
+ declarations. This script turns that ZIP into a local, grep-friendly cache:
11
+
12
+ ~/.kd/kingscript-sdk/<envName>/
13
+ sdk-meta.json generated_at / baseUrl / counts / zip sha256
14
+ type-index.tsv <type>\t<module>\t<pkg slash>\t<pkg dot> (D4 lookup)
15
+ dts/ the extracted .d.ts tree (method signatures)
16
+
17
+ Cache is environment-level (not per-appRoot): the SDK surface depends on the
18
+ Cosmic release, and every app-build command targets the default kd env.
19
+
20
+ Commands:
21
+ ensure sync only when the cache is missing or older than --ttl-hours
22
+ sync force a fresh poll + download + index rebuild
23
+ status report cache state without network access
24
+ lookup resolve one type name against the cache (convenience for D4)
25
+
26
+ Exit codes: 0 = cache ready (ensure/sync/lookup succeeded), 2 = sync failed
27
+ or lookup miss. All output is a single JSON object on stdout.
28
+ """
29
+
30
+ from __future__ import annotations
31
+
32
+ import argparse
33
+ import hashlib
34
+ import json
35
+ import os
36
+ import re
37
+ import shutil
38
+ import sys
39
+ import tempfile
40
+ import time
41
+ import urllib.error
42
+ import urllib.request
43
+ import zipfile
44
+ from pathlib import Path
45
+
46
+ _SCRIPTS_DIR = Path(__file__).resolve().parent
47
+ if str(_SCRIPTS_DIR) not in sys.path:
48
+ sys.path.insert(0, str(_SCRIPTS_DIR))
49
+
50
+ SDK_ROOT = Path.home() / ".kd" / "kingscript-sdk"
51
+ POLL_SDK_PATH = "/kapi/v2/sysext/kingscript/dev/poll/sdk"
52
+ DEFAULT_TTL_HOURS = 168 # one week; SDK moves with platform releases, not daily
53
+ DOWNLOAD_TIMEOUT_SEC = 600
54
+ # Package-level export file: "<module>/<pkg path>.d.ts" whose body lists the
55
+ # environment's importable names in three shapes:
56
+ # export declare type X = $.<pkg>.X; (type alias — the common case)
57
+ # export declare const X: $.<pkg>.X_C; (value export; often pairs
58
+ # with the same-name type, but
59
+ # HttpClient-style const-only
60
+ # exports exist too)
61
+ # export declare interface X { ... } (direct interface declaration)
62
+ # `export declare const enum X` is rejected by the (?!enum...) guard so the
63
+ # keyword "enum" is never captured as a name. The module-root aggregate files
64
+ # (declare global { namespace $ ... }) match none of these shapes and are
65
+ # naturally excluded from the index.
66
+ _EXPORT_LINE_RE = re.compile(
67
+ r"^export declare (?:type|const|interface) (?!enum\b)(\w+)",
68
+ re.MULTILINE)
69
+
70
+
71
+ def _emit(payload: dict) -> None:
72
+ print(json.dumps(payload, ensure_ascii=False))
73
+
74
+
75
+ def _fail(error_code: str, message: str, **extra) -> int:
76
+ _emit({"status": "failed", "errorCode": error_code, "message": message, **extra})
77
+ return 2
78
+
79
+
80
+ def _load_env():
81
+ """Load the default kd environment (baseUrl + credentials)."""
82
+ from kd_env_loader import load_default_kd_env
83
+
84
+ env = load_default_kd_env()
85
+ if not env.get("baseUrl"):
86
+ raise RuntimeError("kd default environment has no baseUrl")
87
+ return env
88
+
89
+
90
+ def _cache_dir(env_name: str) -> Path:
91
+ safe = re.sub(r"[^A-Za-z0-9_.-]", "_", env_name) or "default"
92
+ return SDK_ROOT / safe
93
+
94
+
95
+ def _read_meta(cache: Path) -> dict:
96
+ meta_path = cache / "sdk-meta.json"
97
+ if not meta_path.is_file():
98
+ return {}
99
+ try:
100
+ return json.loads(meta_path.read_text(encoding="utf-8"))
101
+ except (json.JSONDecodeError, OSError):
102
+ return {}
103
+
104
+
105
+ def _cache_state(cache: Path, ttl_hours: float) -> dict:
106
+ meta = _read_meta(cache)
107
+ if not meta:
108
+ return {"state": "missing", "cacheDir": str(cache)}
109
+ age_hours = max(0.0, (time.time() - float(meta.get("generatedAt") or 0)) / 3600)
110
+ state = "fresh" if age_hours <= ttl_hours else "stale"
111
+ return {
112
+ "state": state,
113
+ "cacheDir": str(cache),
114
+ "envName": meta.get("envName"),
115
+ "baseUrl": meta.get("baseUrl"),
116
+ "generatedAt": meta.get("generatedAt"),
117
+ "ageHours": round(age_hours, 1),
118
+ "modules": meta.get("modules"),
119
+ "dtsFiles": meta.get("dtsFiles"),
120
+ "types": meta.get("types"),
121
+ "zipSha256": meta.get("zipSha256"),
122
+ "typeIndexPath": str(cache / "type-index.tsv"),
123
+ "dtsDir": str(cache / "dts"),
124
+ }
125
+
126
+
127
+ def _poll_sdk_url(server: dict) -> str:
128
+ """POST poll/sdk and return the one-shot tempfile download URL."""
129
+ import kd_api
130
+
131
+ base = (server.get("baseUrl") or "").rstrip("/")
132
+ resp = kd_api.post(base, POLL_SDK_PATH, server, {"appId": ""})
133
+ if resp.get("status") is not True:
134
+ raise RuntimeError(
135
+ f"poll/sdk failed: {resp.get('errorCode')} {resp.get('message') or ''}".strip())
136
+ data = str(resp.get("data") or "").strip()
137
+ if not data:
138
+ raise RuntimeError("poll/sdk returned no download url in data")
139
+ return base + "/" + data.lstrip("/")
140
+
141
+
142
+ def _download(url: str, dest: Path, attempts: int = 3) -> str:
143
+ """Stream the tempfile ZIP to dest (with retry) and return its sha256.
144
+
145
+ The tempfile endpoint occasionally resets idle connections; mirror
146
+ _http_client's bounded retry so a flaky link does not fail the sync.
147
+ """
148
+ last_error: Exception | None = None
149
+ for attempt in range(1, attempts + 1):
150
+ digest = hashlib.sha256()
151
+ try:
152
+ request = urllib.request.Request(url, headers={"User-Agent": "kingscript-sdk-sync"})
153
+ with urllib.request.urlopen(request, timeout=DOWNLOAD_TIMEOUT_SEC) as resp, \
154
+ open(dest, "wb") as stream:
155
+ while True:
156
+ chunk = resp.read(1 << 20)
157
+ if not chunk:
158
+ break
159
+ digest.update(chunk)
160
+ stream.write(chunk)
161
+ return digest.hexdigest()
162
+ except (OSError, urllib.error.URLError) as exc:
163
+ last_error = exc
164
+ if attempt < attempts:
165
+ time.sleep(attempt)
166
+ raise RuntimeError(f"download failed after {attempts} attempts: {last_error}")
167
+
168
+
169
+ def _safe_member_name(name: str) -> str:
170
+ """Reject absolute paths, drive letters, and .. traversal (zip slip)."""
171
+ normalized = name.replace("\\", "/")
172
+ if normalized.startswith("/") or ":" in normalized.split("/", 1)[0]:
173
+ raise RuntimeError(f"unsafe zip entry: {name!r}")
174
+ parts = [p for p in normalized.split("/") if p not in ("", ".")]
175
+ if any(p == ".." for p in parts):
176
+ raise RuntimeError(f"unsafe zip entry: {name!r}")
177
+ return "/".join(parts)
178
+
179
+
180
+ def build_type_index(zip_path: Path) -> tuple[list[str], int]:
181
+ """Extract (type, module, pkg_slash, pkg_dot) rows from package-level .d.ts.
182
+
183
+ Returns (sorted rows, dts_file_count). A module-root aggregate file lives
184
+ directly under "<module>/" with no package segment and only contains
185
+ ``declare global`` blocks, so it never yields index rows.
186
+ """
187
+ rows: list[str] = []
188
+ dts_count = 0
189
+ with zipfile.ZipFile(zip_path) as bundle:
190
+ for info in bundle.infolist():
191
+ name = _safe_member_name(info.filename)
192
+ if not name.endswith(".d.ts"):
193
+ continue
194
+ dts_count += 1
195
+ segments = name[: -len(".d.ts")].split("/")
196
+ if len(segments) < 3:
197
+ continue # module-root aggregate (module/file.d.ts): no export rows
198
+ module = "/".join(segments[:2])
199
+ pkg_slash = "/".join(segments[2:])
200
+ try:
201
+ text = bundle.read(info).decode("utf-8", errors="replace")
202
+ except (OSError, zipfile.BadZipFile):
203
+ continue
204
+ names = set() # per-file: a same-name type + const pair is one row
205
+ for match in _EXPORT_LINE_RE.finditer(text):
206
+ names.add(match.group(1))
207
+ for name in sorted(names):
208
+ rows.append(
209
+ f"{name}\t{module}\t{pkg_slash}\t{pkg_slash.replace('/', '.')}")
210
+ rows.sort()
211
+ return rows, dts_count
212
+
213
+
214
+ def _write_cache(cache: Path, zip_path: Path, env: dict, server: dict,
215
+ zip_sha: str) -> dict:
216
+ """Atomically (re)build the cache directory from the downloaded ZIP."""
217
+ rows, dts_count = build_type_index(zip_path)
218
+ modules = sorted({row.split("\t")[1] for row in rows})
219
+ tmp = Path(tempfile.mkdtemp(prefix=".tmp-", dir=str(cache.parent)))
220
+ try:
221
+ dts_dir = tmp / "dts"
222
+ dts_dir.mkdir()
223
+ with zipfile.ZipFile(zip_path) as bundle:
224
+ for info in bundle.infolist():
225
+ name = _safe_member_name(info.filename)
226
+ if not name:
227
+ continue
228
+ target = dts_dir / name
229
+ if info.is_dir():
230
+ target.mkdir(parents=True, exist_ok=True)
231
+ continue
232
+ target.parent.mkdir(parents=True, exist_ok=True)
233
+ with bundle.open(info) as src, open(target, "wb") as dst:
234
+ shutil.copyfileobj(src, dst)
235
+ (tmp / "type-index.tsv").write_text("\n".join(rows) + ("\n" if rows else ""),
236
+ encoding="utf-8")
237
+ meta = {
238
+ "generatedAt": int(time.time()),
239
+ "envName": env.get("envName") or "",
240
+ "baseUrl": server.get("baseUrl") or "",
241
+ "modules": len(modules),
242
+ "moduleList": modules,
243
+ "dtsFiles": dts_count,
244
+ "types": len(rows),
245
+ "zipSha256": zip_sha,
246
+ "apiPath": POLL_SDK_PATH,
247
+ }
248
+ (tmp / "sdk-meta.json").write_text(
249
+ json.dumps(meta, ensure_ascii=False, indent=2), encoding="utf-8")
250
+ backup = cache.with_name(cache.name + ".old")
251
+ shutil.rmtree(backup, ignore_errors=True)
252
+ if cache.is_dir():
253
+ cache.rename(backup)
254
+ tmp.rename(cache)
255
+ shutil.rmtree(backup, ignore_errors=True)
256
+ finally:
257
+ shutil.rmtree(tmp, ignore_errors=True)
258
+ return meta
259
+
260
+
261
+ def do_sync(server: dict, env: dict) -> int:
262
+ cache = _cache_dir(str(env.get("envName") or "default"))
263
+ cache.parent.mkdir(parents=True, exist_ok=True)
264
+ try:
265
+ url = _poll_sdk_url(server)
266
+ with tempfile.NamedTemporaryFile(prefix="ks-sdk-", suffix=".zip",
267
+ dir=str(cache.parent), delete=False) as tmp_zip:
268
+ zip_path = Path(tmp_zip.name)
269
+ try:
270
+ zip_sha = _download(url, zip_path)
271
+ meta = _write_cache(cache, zip_path, env, server, zip_sha)
272
+ finally:
273
+ zip_path.unlink(missing_ok=True)
274
+ except Exception as exc: # noqa: BLE001 - surface any sync failure as JSON
275
+ return _fail("KINGSCRIPT_SDK_SYNC_FAILED", str(exc),
276
+ cacheDir=str(cache), baseUrl=server.get("baseUrl"))
277
+ state = _cache_state(cache, 0)
278
+ _emit({"status": "synced", **state, "moduleList": meta.get("moduleList")})
279
+ return 0
280
+
281
+
282
+ def do_ensure(server: dict, env: dict, ttl_hours: float) -> int:
283
+ cache = _cache_dir(str(env.get("envName") or "default"))
284
+ state = _cache_state(cache, ttl_hours)
285
+ if state.get("state") == "fresh":
286
+ _emit({"status": "ready", "ttlHours": ttl_hours, **state})
287
+ return 0
288
+ return do_sync(server, env)
289
+
290
+
291
+ def do_lookup(env_name: str, type_name: str) -> int:
292
+ cache = _cache_dir(env_name)
293
+ index = cache / "type-index.tsv"
294
+ if not index.is_file():
295
+ return _fail("KINGSCRIPT_SDK_CACHE_MISSING",
296
+ f"no SDK cache for env {env_name!r}; run ensure first",
297
+ cacheDir=str(cache))
298
+ pattern = re.compile(rf"^{re.escape(type_name)}\t")
299
+ hits = [line.rstrip("\n") for line in
300
+ index.read_text(encoding="utf-8").splitlines() if pattern.match(line)]
301
+ if not hits:
302
+ _emit({"status": "miss", "type": type_name, "cacheDir": str(cache)})
303
+ return 2
304
+ columns = ("type", "module", "packageSlash", "packageDot")
305
+ _emit({"status": "found", "type": type_name, "cacheDir": str(cache),
306
+ "matches": [dict(zip(columns, hit.split("\t"))) for hit in hits]})
307
+ return 0
308
+
309
+
310
+ def main() -> int:
311
+ parser = argparse.ArgumentParser(
312
+ description="Poll the target Cosmic environment for its KingScript SDK")
313
+ sub = parser.add_subparsers(dest="command", required=True)
314
+ for name in ("ensure", "sync"):
315
+ cmd = sub.add_parser(name)
316
+ cmd.add_argument("--ttl-hours", type=float, default=DEFAULT_TTL_HOURS,
317
+ help=f"cache freshness window (default {DEFAULT_TTL_HOURS}h; "
318
+ "only used by ensure)")
319
+ sub.add_parser("status")
320
+ lookup = sub.add_parser("lookup")
321
+ lookup.add_argument("--type", required=True, help="exact type name, e.g. AbstractFormPlugin")
322
+ lookup.add_argument("--env", default="", help="kd env name (default: current default env)")
323
+ args = parser.parse_args()
324
+
325
+ if args.command == "lookup":
326
+ env_name = args.env or os.environ.get("KD_DEFAULT_ENV")
327
+ if not env_name:
328
+ try:
329
+ env_name = _load_env().get("envName")
330
+ except Exception as exc: # noqa: BLE001 - config problems must not traceback
331
+ return _fail("KINGSCRIPT_SDK_ENV_UNAVAILABLE", str(exc))
332
+ return do_lookup(str(env_name or "default"), args.type)
333
+
334
+ try:
335
+ env = _load_env()
336
+ except Exception as exc: # noqa: BLE001 - config problems must not traceback
337
+ return _fail("KINGSCRIPT_SDK_ENV_UNAVAILABLE", str(exc))
338
+
339
+ if args.command == "status":
340
+ state = _cache_state(_cache_dir(str(env.get("envName") or "default")),
341
+ DEFAULT_TTL_HOURS)
342
+ _emit({"status": state.get("state"), **state})
343
+ return 0
344
+ if args.command == "sync":
345
+ return do_sync(env, env)
346
+ return do_ensure(env, env, args.ttl_hours)
347
+
348
+
349
+ if __name__ == "__main__":
350
+ sys.exit(main())
@@ -10,7 +10,7 @@ createScript write. This gate is that place.
10
10
  It mirrors compile_plugin_source.py's philosophy for the Java path:
11
11
 
12
12
  * A set of static source rules derived from the authoritative KingScript P0
13
- constraints (rule/p0-group-*.md in kingscript-code-generator). The unambiguous
13
+ constraints (rule/p0-group-*.md in cosmic-coding-script). The unambiguous
14
14
  "always illegal in KingScript" constructs are hard ERRORS that block the
15
15
  write; the context-dependent runtime traps are WARNINGS that are reported with
16
16
  a fix hint but do not block (the gate cannot know a value is a BigDecimal, so
@@ -238,18 +238,19 @@ def _scan(rules, view: str) -> list[dict[str, Any]]:
238
238
 
239
239
 
240
240
  def _export_contract_issue(text: str, target_type: str) -> Optional[dict[str, Any]]:
241
- if target_type.upper() not in PLUGIN_TARGET_TYPES:
241
+ if target_type.upper() not in PLUGIN_TARGET_TYPES and target_type.upper() != "KWC_CONTROLLER":
242
242
  return None
243
- if re.search(r"export\s*\{[^}]*\bplugin\b[^}]*\}", text):
243
+ binding = "kwcController" if target_type.upper() == "KWC_CONTROLLER" else "plugin"
244
+ if re.search(rf"export\s*\{{[^}}]*\b{binding}\b[^}}]*\}}", text):
244
245
  return None
245
- if re.search(r"export\s+(?:const|let|var)\s+plugin\b", text):
246
+ if re.search(rf"export\s+(?:const|let|var)\s+{binding}\b", text):
246
247
  return None
247
248
  return {
248
249
  "rule": "KS-EXPORT-CONTRACT",
249
250
  "line": 1,
250
251
  "column": 1,
251
- "message": "plugin script does not export the required `plugin` binding",
252
- "fix": "end the file with: let plugin = new MyPlugin(); export { plugin };",
252
+ "message": f"script does not export the required `{binding}` binding",
253
+ "fix": f"end the file with: let {binding} = new MyClass(); export {{ {binding} }};",
253
254
  }
254
255
 
255
256
 
@@ -344,7 +345,9 @@ def gate_source(
344
345
  phase = "syntax" if syntax.get("status") == "failed" else "static"
345
346
  message = (
346
347
  f"KingScript gate blocked the write: {len(errors)} error(s) violate the "
347
- "P0 constraints; fix them before createScript (the write is irreversible)"
348
+ "P0 constraints; fix them before "
349
+ + ("KWC Controller deployment" if target_type.upper() == "KWC_CONTROLLER"
350
+ else "createScript (the write is irreversible)")
348
351
  )
349
352
  errorCode = "KINGSCRIPT_GATE_FAILED"
350
353
  return {
@@ -369,7 +372,7 @@ def main() -> int:
369
372
  parser.add_argument("--source-path", help="Path to a .ts KingScript source file")
370
373
  parser.add_argument("--content", help="Inline KingScript source")
371
374
  parser.add_argument("--content-file", help="Path to a file containing KingScript source")
372
- parser.add_argument("--target-type", default="", help="Plugin target type (enforces export contract)")
375
+ parser.add_argument("--target-type", default="", help="Plugin target type or KWC_CONTROLLER (checks export contract)")
373
376
  parser.add_argument("--skip-syntax", action="store_true", help="Skip the tsc syntax layer (static only)")
374
377
  parser.add_argument("--timeout-sec", type=int, default=120)
375
378
  args = parser.parse_args()