@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
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env python3
2
- """统一 HTTP 客户端 — 默认启用 TLS 证书校验。
2
+ """Unified HTTP client — TLS certificate verification enabled by default.
3
3
 
4
- TLS 配置来源,优先级从高到低:
5
- 1. 环境变量(临时排障用,覆盖一切):
6
- KD_INSECURE_TLS=1 禁用 TLS 校验(开发环境使用,启用时 stderr 打印告警)
7
- KD_CA_BUNDLE=/path 挂载私有 CA 证书包(自签/私有化环境)
8
- 2. appconfig.json 的 tls 段(常驻配置,由 appconfig_load.load_tls_config 读取):
4
+ TLS configuration sources, in descending priority:
5
+ 1. Environment variables (for temporary troubleshooting, overrides everything):
6
+ KD_INSECURE_TLS=1 Disable TLS verification (for dev environment use; prints warning to stderr when enabled)
7
+ KD_CA_BUNDLE=/path Mount private CA certificate bundle (self-signed/privatized environments)
8
+ 2. The ``tls`` block in appconfig.json (persistent config, read by appconfig_load.load_tls_config):
9
9
  {"tls": {"insecure": false, "caBundle": "/path/to/ca.pem"}}
10
- 3. 都没有 → 系统默认 CA 校验(安全兜底)。
10
+ 3. Neither → system default CA verification (secure fallback).
11
11
 
12
- 「跳过校验」(insecure) 只有在显式开启时才生效;缺配置一律走校验。
12
+ "Insecure" (skip verification) only takes effect when explicitly enabled; missing config always defaults to verification.
13
13
  """
14
14
 
15
15
  from __future__ import annotations
@@ -32,21 +32,34 @@ DEFAULT_USER_AGENT = (
32
32
 
33
33
 
34
34
  def with_default_user_agent(headers: dict | None = None) -> dict:
35
- """Return a headers dict with the repo-standard User-Agent enforced."""
35
+ """Return a headers dict with the repo-standard User-Agent enforced.
36
+
37
+ 本地补丁 #2:同时声明 ``Accept-Encoding: gzip``(响应解压见 ``_read_response``)。
38
+ """
36
39
  merged = dict(headers or {})
37
40
  merged['User-Agent'] = DEFAULT_USER_AGENT
41
+ merged.setdefault('Accept-Encoding', 'gzip')
38
42
  return merged
39
43
 
40
44
 
45
+ def _read_response(resp) -> bytes:
46
+ """读取响应体;服务端返回 gzip 压缩时自动解压(本地补丁 #2)。"""
47
+ raw = resp.read()
48
+ content_encoding = (resp.headers.get('Content-Encoding') or '').lower()
49
+ if content_encoding == 'gzip':
50
+ return gzip.decompress(raw)
51
+ return raw
52
+
53
+
41
54
  def _resolve_tls_settings() -> tuple[bool, str]:
42
- """合并 TLS 配置:环境变量优先,其次 appconfig.json,最后安全默认。
55
+ """Merge TLS config: env vars first, then appconfig.json, then secure default.
43
56
 
44
- 返回 ``(insecure, ca_bundle)``。
57
+ Returns ``(insecure, ca_bundle)``.
45
58
  """
46
59
  insecure = False
47
60
  ca_bundle = ""
48
61
 
49
- # 第 2 优先级:appconfig.json 的 tls 段(缺失 / 读取失败时安全默认)
62
+ # Priority 2: ``tls`` block in appconfig.json (secure default when missing / read fails)
50
63
  try:
51
64
  from appconfig_load import load_tls_config
52
65
 
@@ -56,7 +69,7 @@ def _resolve_tls_settings() -> tuple[bool, str]:
56
69
  except Exception:
57
70
  pass
58
71
 
59
- # 第 1 优先级:环境变量覆盖 appconfig
72
+ # Priority 1: env vars override appconfig
60
73
  env_insecure = os.environ.get('KD_INSECURE_TLS', '').strip()
61
74
  if env_insecure:
62
75
  insecure = env_insecure in ('1', 'true', 'yes', 'on')
@@ -68,17 +81,17 @@ def _resolve_tls_settings() -> tuple[bool, str]:
68
81
 
69
82
 
70
83
  def create_ssl_context() -> ssl.SSLContext:
71
- """创建 SSL 上下文,默认启用 TLS 证书校验。
84
+ """Create an SSL context with TLS certificate verification enabled by default.
72
85
 
73
- insecure=true 时跳过校验(开发态),打印 stderr 告警。
74
- ca_bundle 指向私有 CA 证书包。配置来源见模块 docstring。
86
+ When insecure=true, skip verification (dev mode), and print a warning to stderr.
87
+ ca_bundle points to a private CA certificate bundle. See module docstring for config sources.
75
88
  """
76
89
  insecure, ca_bundle = _resolve_tls_settings()
77
90
 
78
91
  if insecure:
79
92
  print(
80
- '[WARNING] TLS 证书校验已禁用 (insecure)。'
81
- '凭证可能被中间人攻击截获。',
93
+ '[WARNING] TLS certificate verification is DISABLED (insecure). '
94
+ 'Credentials may be intercepted via man-in-the-middle attack.',
82
95
  file=sys.stderr,
83
96
  )
84
97
  ctx = ssl.create_default_context()
@@ -89,8 +102,8 @@ def create_ssl_context() -> ssl.SSLContext:
89
102
  if ca_bundle:
90
103
  if not os.path.exists(ca_bundle):
91
104
  print(
92
- f'[WARNING] caBundle={ca_bundle} 文件不存在,'
93
- f'回退到系统默认 CA 证书。',
105
+ f'[WARNING] caBundle={ca_bundle} file does not exist, '
106
+ f'falling back to system default CA certificates.',
94
107
  file=sys.stderr,
95
108
  )
96
109
  else:
@@ -103,10 +116,10 @@ _ssl_context: ssl.SSLContext | None = None
103
116
 
104
117
 
105
118
  def get_ssl_context() -> ssl.SSLContext:
106
- """获取缓存的 SSL 上下文(单例)。
119
+ """Get the cached SSL context (singleton).
107
120
 
108
- 供直接使用 http.client 的调用方(run.py、search_form_by_token.py)引用;
109
- 调用方需自行判断 URL scheme 是否为 https 再传入。
121
+ For callers that use http.client directly (run.py, search_form_by_token.py);
122
+ callers must check whether the URL scheme is https before passing it in.
110
123
  """
111
124
  global _ssl_context
112
125
  if _ssl_context is None:
@@ -115,22 +128,22 @@ def get_ssl_context() -> ssl.SSLContext:
115
128
 
116
129
 
117
130
  def _ssl_context_for_url(url: str) -> ssl.SSLContext | None:
118
- """仅对 HTTPS URL 返回 TLS 校验上下文;HTTP URL 不需要 TLS,返回 None。"""
131
+ """Return TLS verification context only for HTTPS URLs; HTTP URLs do not need TLS, return None."""
119
132
  if url.startswith('https://'):
120
133
  return get_ssl_context()
121
134
  return None
122
135
 
123
136
 
124
137
  def _is_transient(exc: Exception) -> bool:
125
- """判断是否为瞬态网络错误,值得重试。"""
138
+ """Determine whether this is a transient network error worth retrying."""
126
139
  if isinstance(exc, ssl.SSLError):
127
140
  return True
128
141
  if isinstance(exc, ConnectionError):
129
142
  return True
130
- # 读超时抛出的是裸的 socket.timeout / TimeoutError,不会被包进 URLError,
131
- # 因此下面基于错误信息的分支永远命中不到。读取大型标准单据(例如带上百个
132
- # 分录字段的单据 schema)时第一次调用就会触发,过去会直接失败,而同样的
133
- # 请求重试一次却能成功。
143
+ # A read timeout arrives as a bare socket.timeout / TimeoutError, not wrapped in
144
+ # URLError, so the message-based branch below never saw it. Reading a large standard
145
+ # bill (for example the schema of a bill with hundreds of entry fields) hits this on the
146
+ # first call and used to fail outright even though an identical retry succeeds.
134
147
  if isinstance(exc, (socket.timeout, TimeoutError)):
135
148
  return True
136
149
  if isinstance(exc, urllib.error.URLError):
@@ -144,7 +157,7 @@ def _is_transient(exc: Exception) -> bool:
144
157
 
145
158
 
146
159
  def _is_tls_transient(exc: Exception) -> bool:
147
- """判断重试前是否需要创建新的 SSLContext。"""
160
+ """Return whether a retry should use a fresh SSLContext."""
148
161
  if isinstance(exc, ssl.SSLError):
149
162
  return True
150
163
  if isinstance(exc, urllib.error.URLError):
@@ -157,7 +170,7 @@ def _is_tls_transient(exc: Exception) -> bool:
157
170
 
158
171
 
159
172
  def _reset_tls_context_for_retry(exc: Exception) -> None:
160
- """SSL/EOF 失败后丢弃缓存的 TLS 会话状态。"""
173
+ """Drop cached TLS session state after an SSL/EOF failure."""
161
174
  global _ssl_context
162
175
  if _is_tls_transient(exc):
163
176
  _ssl_context = None
@@ -167,31 +180,23 @@ _RETRIES = 3
167
180
  _RETRY_DELAY = 1.0
168
181
 
169
182
 
170
- def retry_call(fn, *args, **kwargs):
171
- """对 fn(*args, **kwargs) 执行瞬态错误自动重试(指数退避)。"""
172
- for attempt in range(1, _RETRIES + 1):
183
+ def retry_call(fn, *args, retry_on_transient=True, **kwargs):
184
+ """Execute fn(*args, **kwargs) with automatic retries on transient errors (exponential backoff)."""
185
+ attempts = _RETRIES if retry_on_transient else 1
186
+ for attempt in range(1, attempts + 1):
173
187
  try:
174
188
  return fn(*args, **kwargs)
175
189
  except Exception as exc:
176
- if attempt < _RETRIES and _is_transient(exc):
190
+ if attempt < attempts and _is_transient(exc):
177
191
  _reset_tls_context_for_retry(exc)
178
192
  delay = _RETRY_DELAY * (2 ** (attempt - 1))
179
- print(f"[retry {attempt}/{_RETRIES}] {type(exc).__name__}: {exc} — {delay:.0f}s 后重试",
193
+ print(f"[retry {attempt}/{attempts}] {type(exc).__name__}: {exc} — retrying in {delay:.0f}s",
180
194
  file=sys.stderr)
181
195
  time.sleep(delay)
182
196
  else:
183
197
  raise
184
198
 
185
199
 
186
- def _read_response(resp) -> bytes:
187
- """读取响应体;服务端返回 gzip 压缩时自动解压。"""
188
- raw = resp.read()
189
- content_encoding = (resp.headers.get('Content-Encoding', '') or '').lower()
190
- if content_encoding == 'gzip':
191
- return gzip.decompress(raw)
192
- return raw
193
-
194
-
195
200
  def http_post_json(
196
201
  url: str,
197
202
  data: dict,
@@ -199,13 +204,12 @@ def http_post_json(
199
204
  headers: dict | None = None,
200
205
  timeout: int = 30,
201
206
  ) -> dict:
202
- """发送 POST JSON 请求。HTTPS 默认启用 TLS 校验,HTTP 不走 TLS。"""
207
+ """Send a POST JSON request. HTTPS enables TLS verification by default; HTTP does not use TLS."""
203
208
  body = json.dumps(data, ensure_ascii=False).encode('utf-8')
204
209
  all_headers = with_default_user_agent({'Content-Type': 'application/json'})
205
210
  if headers:
206
211
  all_headers.update(headers)
207
212
  all_headers['User-Agent'] = DEFAULT_USER_AGENT
208
- all_headers['Accept-Encoding'] = 'gzip'
209
213
  req = urllib.request.Request(
210
214
  url, data=body, headers=all_headers, method='POST',
211
215
  )
@@ -221,10 +225,8 @@ def http_get_json(
221
225
  headers: dict | None = None,
222
226
  timeout: int = 30,
223
227
  ) -> dict:
224
- """发送 GET JSON 请求。HTTPS 默认启用 TLS 校验,HTTP 不走 TLS。"""
225
- all_headers = with_default_user_agent(headers)
226
- all_headers['Accept-Encoding'] = 'gzip'
227
- req = urllib.request.Request(url, headers=all_headers)
228
+ """Send a GET JSON request. HTTPS enables TLS verification by default; HTTP does not use TLS."""
229
+ req = urllib.request.Request(url, headers=with_default_user_agent(headers))
228
230
  with urllib.request.urlopen(
229
231
  req, timeout=timeout, context=_ssl_context_for_url(url),
230
232
  ) as resp:
@@ -237,10 +239,8 @@ def http_get_text(
237
239
  headers: dict | None = None,
238
240
  timeout: int = 30,
239
241
  ) -> str:
240
- """发送 GET 请求。HTTPS 默认启用 TLS 校验,HTTP 不走 TLS。"""
241
- all_headers = with_default_user_agent(headers)
242
- all_headers['Accept-Encoding'] = 'gzip'
243
- req = urllib.request.Request(url, headers=all_headers)
242
+ """Send a GET request. HTTPS enables TLS verification by default; HTTP does not use TLS."""
243
+ req = urllib.request.Request(url, headers=with_default_user_agent(headers))
244
244
  with urllib.request.urlopen(
245
245
  req, timeout=timeout, context=_ssl_context_for_url(url),
246
246
  ) as resp:
@@ -5,7 +5,7 @@ Path priority:
5
5
  1. KD_APPCONFIG override, for tests or special environments.
6
6
  2. Walk upward from this script and stop at the first directory containing both
7
7
  config/ and preset-data/; use config/appconfig.json there.
8
- 3. Fallback to the user's home directory: ~/kd/appconfig.json.
8
+ 3. Fallback to the workspace: `<cwd>/app/config/appconfig.json`(本地补丁 #3)。
9
9
  """
10
10
 
11
11
  from __future__ import annotations
@@ -25,7 +25,7 @@ def appconfig_path() -> Path:
25
25
  config_root = _find_config_root(Path(__file__).resolve())
26
26
  if config_root:
27
27
  return config_root / "config" / "appconfig.json"
28
- # 回退:固定指向工作区 app/config(应用级配置,非 _runtime 运行时临时数据;
28
+ # 本地补丁 #3:回退固定指向工作区 app/config(应用级配置,非 _runtime 运行时临时数据;
29
29
  # 同 kd_env_loader._kd_config_path 的 ws_cfg 模式)
30
30
  return Path(os.getcwd()) / "app" / "config" / "appconfig.json"
31
31
 
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env python3
2
+ """Apply the versioned typed report filter extension to an explicitly selected platform module."""
3
+ import argparse
4
+ import json
5
+ import subprocess
6
+ from pathlib import Path
7
+
8
+
9
+ def main():
10
+ parser = argparse.ArgumentParser(description=__doc__)
11
+ parser.add_argument("--project-root", required=True)
12
+ parser.add_argument("--dry-run", action="store_true")
13
+ args = parser.parse_args()
14
+ project = Path(args.project_root).resolve()
15
+ asset = Path(__file__).resolve().parents[1] / "assets" / "platform-report-filters"
16
+ helper = project / "src" / "main" / "java" / "kd" / "bos" / "designer" / "property" / "setting" / "TypedReportFilterFields.java"
17
+ if helper.exists() and helper.read_bytes() != (asset / helper.name).read_bytes():
18
+ print(json.dumps({"status": False, "reason": "existing-helper-differs"})); return 2
19
+ repo = subprocess.run(["git", "rev-parse", "--show-toplevel"], cwd=project, capture_output=True, text=True, check=True).stdout.strip()
20
+ directory = project.relative_to(Path(repo).resolve()).as_posix()
21
+ command = ["git", "apply", "--ignore-whitespace", "--directory=" + directory, str(asset / "platform.patch")]
22
+ check = subprocess.run([*command[:2], "--check", *command[2:]], cwd=repo, capture_output=True, text=True)
23
+ if check.returncode:
24
+ reverse = subprocess.run([*command[:2], "--reverse", "--check", *command[2:]], cwd=repo, capture_output=True, text=True)
25
+ if reverse.returncode:
26
+ print(json.dumps({"status": False, "reason": "platform-source-version-mismatch", "diagnostics": check.stderr[-2000:]})); return 2
27
+ if not helper.exists() and not args.dry_run:
28
+ helper.write_bytes((asset / helper.name).read_bytes())
29
+ print(json.dumps({"status": True, "changed": False, "alreadyApplied": True, "dryRun": args.dry_run})); return 0
30
+ if not args.dry_run:
31
+ subprocess.run(command, cwd=repo, check=True)
32
+ helper.parent.mkdir(parents=True, exist_ok=True)
33
+ helper.write_bytes((asset / helper.name).read_bytes())
34
+ print(json.dumps({"status": True, "changed": not args.dry_run, "dryRun": args.dry_run, "projectRoot": str(project)}))
35
+ return 0
36
+
37
+
38
+ if __name__ == "__main__":
39
+ raise SystemExit(main())
@@ -4,6 +4,7 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  import argparse
7
+ import contextlib
7
8
  import json
8
9
  import sys
9
10
  from pathlib import Path
@@ -22,7 +23,13 @@ from project_paths import (
22
23
  write_runtime_context,
23
24
  )
24
25
 
25
- from kd_env_loader import get_locale
26
+ from kd_env_loader import get_locale, load_environment_identity
27
+ from execution_binding import execution_binding
28
+
29
+ if hasattr(sys.stdout, "reconfigure"):
30
+ sys.stdout.reconfigure(encoding="utf-8", errors="replace")
31
+ if hasattr(sys.stderr, "reconfigure"):
32
+ sys.stderr.reconfigure(encoding="utf-8", errors="replace")
26
33
 
27
34
  def _write_json(path: Path, data: dict[str, Any]) -> None:
28
35
  path.parent.mkdir(parents=True, exist_ok=True)
@@ -219,7 +226,7 @@ def _sync_locale_only(project_root: Path, output_root_name: str) -> int:
219
226
  return 0
220
227
 
221
228
 
222
- def main(argv: list[str] | None = None) -> int:
229
+ def _main_impl(argv: list[str] | None = None) -> int:
223
230
  parser = argparse.ArgumentParser(description="Bootstrap app-build runtime context")
224
231
  parser.add_argument("--project-root", required=True, help="Workspace root")
225
232
  parser.add_argument("--app-code", default="", help="Confirmed app code")
@@ -393,13 +400,16 @@ def main(argv: list[str] | None = None) -> int:
393
400
  "standard": bool(standard),
394
401
  "appIsv": app_isv,
395
402
  "appOwnershipEvidence": ownership_evidence,
403
+ "environment": load_environment_identity(),
396
404
  "rootDir": str(Path(__file__).resolve().parents[1]),
405
+ "executionBinding": execution_binding(),
397
406
  # locale is re-read from ~/.kd/config.json on every bootstrap,
398
407
  # ensuring the user's global language switch takes effect immediately
399
408
  # (not locked by a stale value in context.json).
400
409
  # get_locale() has a built-in fallback (returns 'zh_CN' on error or missing), so it never writes empty.
401
410
  "locale": get_locale(),
402
411
  }
412
+ global _BOOTSTRAP_RESULT
403
413
  runtime_path = write_runtime_context(project_root, context, output_root_name)
404
414
 
405
415
  biz_cloud_id = biz_cloud_id_arg
@@ -432,6 +442,9 @@ def main(argv: list[str] | None = None) -> int:
432
442
  app_description=str(archive.get("appDescription") or app_description),
433
443
  )
434
444
 
445
+ _BOOTSTRAP_RESULT = {"context": str(runtime_path), "archive": str(archive_path),
446
+ "workspace": str(workspace_path), "appRoot": str(workspace_path.parents[2]),
447
+ "appCode": app_code, "appId": app_id, "executionBinding": execution_binding()}
435
448
  print("[OK] bootstrap complete")
436
449
  print(f"context={runtime_path}")
437
450
  print(f"archive={archive_path}")
@@ -464,11 +477,33 @@ def _print_paths_block(project_root: Path, app_code: str, output_root_name: str,
464
477
  runtime_dir = Path(app_root) / "_runtime"
465
478
 
466
479
  print("[paths]")
480
+ print(f"revision={execution_binding()['revision']}")
467
481
  print(f"python={sys.executable}")
468
482
  print(f"cosmic_api={cosmic_api}")
469
483
  if ui_api.exists():
470
484
  print(f"ui_api={ui_api}")
471
485
  print(f"appRoot={app_root}")
472
486
  print(f"runtimeDir={runtime_dir}")
487
+ _BOOTSTRAP_RESULT = None
488
+
489
+
490
+ def main(argv: list[str] | None = None) -> int:
491
+ global _BOOTSTRAP_RESULT
492
+ _BOOTSTRAP_RESULT = None
493
+ arguments = list(sys.argv[1:] if argv is None else argv)
494
+ if "--stdout" not in arguments:
495
+ return _main_impl(arguments)
496
+ arguments.remove("--stdout")
497
+ try:
498
+ with contextlib.redirect_stdout(sys.stderr):
499
+ code = _main_impl(arguments)
500
+ except (SystemExit, Exception) as exc:
501
+ print(json.dumps({"status": False, "errorCategory": "environment",
502
+ "message": str(exc), "data": None, "executionBinding": execution_binding()}, ensure_ascii=False))
503
+ return 2
504
+ print(json.dumps({"status": code == 0, "data": _BOOTSTRAP_RESULT or {"locale": get_locale()}}, ensure_ascii=False))
505
+ return code
506
+
507
+
473
508
  if __name__ == "__main__":
474
509
  raise SystemExit(main())