@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.
- package/cordis.patch.yml +5 -5
- package/package.json +1 -1
- package/skills/cosmic-build/CHANGELOG.md +4 -0
- package/skills/cosmic-build/LOCAL-PATCHES.md +91 -40
- package/skills/cosmic-build/SKILL.md +46 -13
- package/skills/cosmic-build/assets/platform-report-filters/TypedReportFilterFields.java +169 -0
- package/skills/cosmic-build/assets/platform-report-filters/platform.patch +98 -0
- package/skills/cosmic-build/assets/report-algo-benchmark/ReportAlgoBenchmark.java +48 -0
- package/skills/cosmic-build/assets/report-algo-benchmark/ReportBenchmarkLogFactory.java +7 -0
- package/skills/cosmic-build/examples/java-rules/CosmicEntryQuery.java +26 -0
- package/skills/cosmic-build/examples/java-rules/CosmicReportAggregation.java +35 -0
- package/skills/cosmic-build/examples/java-rules/CosmicReportFilters.java +77 -0
- package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapter.java +25 -0
- package/skills/cosmic-build/examples/java-rules/CosmicTimeAdapterCheck.java +26 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/api/algo/GroupbyDataSet.md +47 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterInfo.md +12 -12
- package/skills/cosmic-build/knowledge/cosmic/platform/api/entity/report/FilterItemInfo.md +2 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/form-plugin.md +2 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/java-type-contracts.md +11 -2
- package/skills/cosmic-build/knowledge/cosmic/platform/list-plugin.md +18 -14
- package/skills/cosmic-build/knowledge/cosmic/platform/operation-plugin.md +4 -4
- package/skills/cosmic-build/knowledge/cosmic/platform/reportlistdata-plugin.md +17 -9
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/cross-entity-aggregate-writeback.md +2 -0
- package/skills/cosmic-build/knowledge/cosmic/platform/scenes/operation/pre-post-operation.md +15 -7
- package/skills/cosmic-build/knowledge/cosmic/platform/sdk/sdk-algo.md +24 -68
- package/skills/cosmic-build/knowledge/cosmic/platform/workflow-plugin.md +2 -7
- package/skills/cosmic-build/references/application-context.md +35 -1
- package/skills/cosmic-build/references/common-reference.md +1 -1
- package/skills/cosmic-build/references/compile-guide.md +55 -68
- package/skills/cosmic-build/references/delivery.md +59 -7
- package/skills/cosmic-build/references/execution-contract.md +38 -0
- package/skills/cosmic-build/references/form-discovery.md +7 -1
- package/skills/cosmic-build/references/java-plugin-delivery.md +32 -162
- package/skills/cosmic-build/references/operation-dispatch.md +17 -0
- package/skills/cosmic-build/references/plugin-handoff-input.md +131 -0
- package/skills/cosmic-build/references/plugin-runtime-routing.md +1 -1
- package/skills/cosmic-build/references/report-filter-contract.md +78 -0
- package/skills/cosmic-build/references/sdk-inspection.md +23 -0
- package/skills/cosmic-build/schemas/data-model-authoring.schema.json +2 -3
- package/skills/cosmic-build/scripts/_http_client.py +55 -55
- package/skills/cosmic-build/scripts/appconfig_load.py +2 -2
- package/skills/cosmic-build/scripts/apply_report_filter_extension.py +39 -0
- package/skills/cosmic-build/scripts/bootstrap_cosmic_context.py +37 -2
- package/skills/cosmic-build/scripts/compile_plugin_source.py +279 -156
- package/skills/cosmic-build/scripts/execution_binding.py +40 -0
- package/skills/cosmic-build/scripts/inspect_platform_sdk.py +169 -0
- package/skills/cosmic-build/scripts/kd_api.py +23 -22
- package/skills/cosmic-build/scripts/kd_auth.py +1 -1
- package/skills/cosmic-build/scripts/kd_env_loader.py +19 -10
- package/skills/cosmic-build/scripts/kd_token_cache.py +2 -2
- package/skills/cosmic-build/scripts/kingscript_sdk_sync.py +350 -0
- package/skills/cosmic-build/scripts/kingscript_source_gate.py +11 -8
- package/skills/cosmic-build/scripts/platform_api_contract.py +246 -11
- package/skills/cosmic-build/scripts/plugin_corpus/build_index.py +403 -0
- package/skills/cosmic-build/scripts/plugin_corpus/jvm_classfile.py +281 -0
- package/skills/cosmic-build/scripts/plugin_corpus/measure_api_usage.py +446 -0
- package/skills/cosmic-build/scripts/plugin_source_gate.py +48 -7
- package/skills/cosmic-build/scripts/plugin_target_sdk.py +45 -0
- package/skills/cosmic-build/scripts/prepare_plugin_handoff.py +493 -47
- package/skills/cosmic-build/scripts/preview_url.py +35 -6
- package/skills/cosmic-build/scripts/query_plugin_handoff.py +250 -0
- package/skills/cosmic-build/scripts/register_plugins.py +28 -2
- package/skills/cosmic-build/scripts/render_output_cards.py +42 -9
- package/skills/cosmic-build/scripts/report_algo_benchmark.py +46 -0
- package/skills/cosmic-build/scripts/run.py +2 -2
- package/skills/cosmic-build/scripts/sync_generated_locale_assets.py +43 -0
- package/skills/cosmic-build/scripts/test/fixtures/ReportSdkCheck.java +64 -0
- package/skills/cosmic-build/scripts/test/fixtures/java_context_booking_native.json +541 -0
- package/skills/cosmic-build/scripts/test/test_add_rule_business_contract.py +85 -14
- package/skills/cosmic-build/scripts/test/test_batch5_drift_governance.py +12 -3
- package/skills/cosmic-build/scripts/test/test_build_meta_order.py +0 -16
- package/skills/cosmic-build/scripts/test/test_cli_continuation.py +87 -0
- package/skills/cosmic-build/scripts/test/test_compile_plugin_source.py +224 -3
- package/skills/cosmic-build/scripts/test/test_control_authoring.py +123 -4
- package/skills/cosmic-build/scripts/test/test_cosmic_sdk_examples.py +141 -0
- package/skills/cosmic-build/scripts/test/test_data_model_contract.py +30 -5
- package/skills/cosmic-build/scripts/test/test_delivery_stage_boundary.py +2 -10
- package/skills/cosmic-build/scripts/test/test_dym_sync_background.py +11 -0
- package/skills/cosmic-build/scripts/test/test_dynamic_form_metadata_only_contract.py +59 -1
- package/skills/cosmic-build/scripts/test/test_guide_skeleton_contract.py +87 -43
- package/skills/cosmic-build/scripts/test/test_inspect_platform_sdk.py +71 -0
- package/skills/cosmic-build/scripts/test/test_kd_api.py +67 -19
- package/skills/cosmic-build/scripts/test/test_kingscript_sdk_sync.py +221 -0
- package/skills/cosmic-build/scripts/test/test_kingscript_source_gate.py +10 -0
- package/skills/cosmic-build/scripts/test/test_list_configuration_closure.py +18 -0
- package/skills/cosmic-build/scripts/test/test_long_session_regressions.py +116 -0
- package/skills/cosmic-build/scripts/test/test_mcp_cli.py +524 -0
- package/skills/cosmic-build/scripts/test/test_modeling_input_recovery.py +141 -0
- package/skills/cosmic-build/scripts/test/test_open_world_cli_catalog.py +36 -2
- package/skills/cosmic-build/scripts/test/test_platform_api_contract.py +161 -1
- package/skills/cosmic-build/scripts/test/test_plugin_business_contract.py +91 -0
- package/skills/cosmic-build/scripts/test/test_plugin_corpus.py +195 -0
- package/skills/cosmic-build/scripts/test/test_plugin_handoff.py +346 -1
- package/skills/cosmic-build/scripts/test/test_plugin_target_sdk.py +70 -0
- package/skills/cosmic-build/scripts/test/test_preview_url.py +44 -1
- package/skills/cosmic-build/scripts/test/test_property_batch.py +22 -0
- package/skills/cosmic-build/scripts/test/test_property_input_discovery.py +13 -11
- package/skills/cosmic-build/scripts/test/test_query_plugin_handoff.py +160 -0
- package/skills/cosmic-build/scripts/test/test_register_plugins.py +31 -1
- package/skills/cosmic-build/scripts/test/test_render_output_cards.py +50 -4
- package/skills/cosmic-build/scripts/test/test_report_business_contract.py +27 -0
- package/skills/cosmic-build/scripts/test/test_report_doc_contract_sync.py +5 -4
- package/skills/cosmic-build/scripts/test/test_report_sdk_optimization.py +36 -0
- package/skills/cosmic-build/scripts/test/test_rule_batch_evidence.py +1 -1
- package/skills/cosmic-build/scripts/test/test_rule_domain_contract.py +20 -0
- package/skills/cosmic-build/scripts/test/test_rule_function_formula.py +16 -6
- package/skills/cosmic-build/scripts/test/test_skill_entry_contract.py +1 -0
- package/skills/cosmic-build/scripts/test/test_test_environment.py +45 -0
- package/skills/cosmic-build/scripts/test/test_verify_plugin_loading.py +79 -0
- package/skills/cosmic-build/scripts/test_environment.py +49 -0
- package/skills/cosmic-build/scripts/verify_plugin_loading.py +71 -0
- package/skills/cosmic-build/skills/cosmic-coding-impl/SKILL.md +86 -162
- package/skills/cosmic-build/skills/cosmic-coding-script/ATTRIBUTION.md +1 -1
- package/skills/cosmic-build/skills/cosmic-coding-script/SKILL.md +45 -14
- package/skills/cosmic-build/skills/cosmic-coding-script/references/kwc-controller-authoring.md +6 -0
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/README.md +29 -19
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/docs//350/204/232/346/234/254SDK.md +3 -4
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/indexes/package-index.md +1 -1
- package/skills/cosmic-build/skills/cosmic-coding-script/references/sdk/strategy.md +27 -18
- package/skills/cosmic-build/skills/cosmic-meta-api/SKILL.md +11 -17
- package/skills/cosmic-build/skills/cosmic-meta-api/apis/ai_meta.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/apis/app_menu.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/apis/meta_log.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/control-authoring.json +45 -4
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/form-control-traits.json +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/layout-ui.json +18 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/menu-publish.json +8 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-batch.json +7 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/property-input-index.json +3 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/report-write-contracts.json +1 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-domain.json +37 -5
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/rule-event-contract.json +24 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/cli/run-build-meta.json +61 -12
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/dropdown-menu.schema.json +69 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/report-write.schema.json +2 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-set.schema.json +1 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/contracts/schema/rule-write.schema.json +14 -7
- package/skills/cosmic-build/skills/cosmic-meta-api/docs/api-summary.md +2 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/app-action/SKILL.md +6 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/develop/SKILL.md +1 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/export/SKILL.md +5 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/init/SKILL.md +13 -36
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/SKILL.md +8 -9
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/pdm/scripts/config.json.example +5 -15
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/reset/SKILL.md +6 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/usage/SKILL.md +20 -148
- package/skills/cosmic-build/skills/cosmic-meta-api/modules/verify/SKILL.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/build_receipts.py +171 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_apps.py +25 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_controls.py +55 -21
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_fields.py +10 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_formactions.py +63 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_forms.py +59 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_listui.py +8 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_metaops.py +36 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_plugins.py +115 -90
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_properties.py +666 -4
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/cmd_rules.py +1415 -87
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/commands.py +6 -1
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/config.py +28 -15
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/execution_errors.py +40 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/formatters.py +32 -5
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/property_policy_contract.py +6 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/report_ops.py +113 -17
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/reset.py +3 -3
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/_core/rule_contract.py +107 -26
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/build_meta_order.py +50 -49
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/cosmic_api.py +856 -150
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/field_decorator.py +47 -14
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_build_receipt_resume.py +374 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_cli_failure_contract.py +24 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_creation_identity_boundary.py +4 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_dropdown_menu_contract.py +382 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_existing_form_ui.py +0 -25
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_field_decorator.py +50 -6
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_functional_group_resolution.py +83 -16
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_identity_template_resolution.py +103 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_plugin_contract.py +28 -2
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_readback_derivation.py +22 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_report_typed_filters.py +65 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_rule_write_closure.py +1041 -15
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_post_build_recovery.py +65 -0
- package/skills/cosmic-build/skills/cosmic-meta-api/scripts/test/test_run_batch_verification_evidence.py +17 -0
- package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/api-param-checklist.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-knowledge/generation/rule-modeling-guide.md +7 -4
- package/skills/cosmic-build/skills/cosmic-meta-modeling/SKILL.md +61 -13
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/app-menu/SKILL.md +8 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/SKILL.md +5 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/formtemplate/dynamic-form-artifact-schema.md +5 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/modules/report/SKILL.md +21 -9
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-entity-graphs.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-storage-constraints.md +5 -3
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/authoring-ui-composition.md +6 -3
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/creation-recovery.md +13 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/references/parse-core.md +3 -0
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_contract.py +6 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/data_model_emit.py +135 -87
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/field_type_registry.py +11 -1
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/isv_resolver.py +1 -3
- package/skills/cosmic-build/skills/cosmic-meta-modeling/scripts/report_validator.py +29 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/SKILL.md +4 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/context/SKILL.md +2 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/execute/SKILL.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/SKILL.md +5 -4
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/operation-write.md +6 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/validation.md +2 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/SKILL.md +20 -5
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/complex-apis.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/property/policy-grammar.md +4 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/report-op/SKILL.md +9 -0
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/SKILL.md +61 -4
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/raw-rule-authoring.md +3 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-actions.md +2 -2
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/rule-reference.md +6 -6
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/rule/state.md +1 -1
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/unit/SKILL.md +6 -3
- package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/verify/usage-guide.md +4 -4
- package/skills/cosmic-build/skills/cosmic-meta-modifier/references/list-filter-modification.md +4 -1
- package/skills/cosmic-build/skills/cosmic-meta-ui/SKILL.md +9 -1
- package/skills/cosmic-build/skills/cosmic-meta-ui/modules/button/SKILL.md +3 -0
- package/skills/cosmic-build/skills/mcp-server/SKILL.md +210 -0
- package/skills/cosmic-build/skills/mcp-server/scripts/mcp_cli.py +431 -0
- package/skills/cosmic-build/skills/openapi-gen/SKILL.md +3 -3
- package/skills/cosmic-build/skills/openapi-gen/scripts/api/gen_runner.py +2 -2
- package/skills/cosmic-dev-best-practices/references/bill-dev-convention.md +19 -9
- package/skills/cosmic-dev-best-practices/references/cosmic-meta-api.md +14 -11
- package/skills/cosmic-dev-best-practices/references/design-examples/basedata-design-example.md +1 -1
- package/skills/cosmic-dev-best-practices/references/design-examples/bill-design-example.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/AssistantField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/BasedataField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/BasedataPropField.md +3 -3
- package/skills/cosmic-dev-best-practices/references/elements/CreaterField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/CurrencyField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/CustomerField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/FlexField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/MaterielField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/OrgField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/SupplierField.md +2 -2
- package/skills/cosmic-dev-best-practices/references/elements/UnitField.md +1 -1
- package/skills/cosmic-dev-best-practices/references/elements/UserField.md +3 -3
- package/skills/cosmic-dev-best-practices/references/elements/common-field-property-conventions.md +16 -11
- package/skills/cosmic-dev-best-practices/references/layout-control-convention.md +5 -4
- package/skills/erp-analysis/references/delivery-contract.md +4 -2
- package/skills/erp-analysis/templates/AGENTS.template.md +1 -1
- 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
|
-
"""
|
|
2
|
+
"""Unified HTTP client — TLS certificate verification enabled by default.
|
|
3
3
|
|
|
4
|
-
TLS
|
|
5
|
-
1.
|
|
6
|
-
KD_INSECURE_TLS=1
|
|
7
|
-
KD_CA_BUNDLE=/path
|
|
8
|
-
2. appconfig.json
|
|
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.
|
|
10
|
+
3. Neither → system default CA verification (secure fallback).
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
"""
|
|
55
|
+
"""Merge TLS config: env vars first, then appconfig.json, then secure default.
|
|
43
56
|
|
|
44
|
-
|
|
57
|
+
Returns ``(insecure, ca_bundle)``.
|
|
45
58
|
"""
|
|
46
59
|
insecure = False
|
|
47
60
|
ca_bundle = ""
|
|
48
61
|
|
|
49
|
-
#
|
|
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
|
-
#
|
|
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
|
-
"""
|
|
84
|
+
"""Create an SSL context with TLS certificate verification enabled by default.
|
|
72
85
|
|
|
73
|
-
insecure=true
|
|
74
|
-
ca_bundle
|
|
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
|
|
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'
|
|
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
|
-
"""
|
|
119
|
+
"""Get the cached SSL context (singleton).
|
|
107
120
|
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
"""
|
|
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
|
-
#
|
|
131
|
-
#
|
|
132
|
-
#
|
|
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
|
-
"""
|
|
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
|
|
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
|
-
"""
|
|
172
|
-
|
|
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 <
|
|
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}/{
|
|
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
|
-
"""
|
|
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
|
-
"""
|
|
225
|
-
|
|
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
|
-
"""
|
|
241
|
-
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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())
|