@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
|
@@ -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
|
|
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
|
|
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(
|
|
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": "
|
|
252
|
-
"fix": "end the file with: let
|
|
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
|
|
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 (
|
|
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()
|