@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
|
@@ -97,6 +97,7 @@ from isv_resolver import resolve_developer_identity, resolve_isv # noqa: E402
|
|
|
97
97
|
from project_paths import ensure_app_runtime_ignore # noqa: E402
|
|
98
98
|
|
|
99
99
|
_ENTITY_BIZNAME_RE = re.compile(r"^[A-Za-z][A-Za-z0-9_]*$")
|
|
100
|
+
_DEFAULT_ENTITY_TEMPLATES = {"BillEntity": "bos_billtpl", "BaseEntity": "bos_basetpl"}
|
|
100
101
|
|
|
101
102
|
try:
|
|
102
103
|
from kd_env_loader import get_locale, resolve_locale # noqa: E402
|
|
@@ -190,6 +191,8 @@ def _run_cosmic_api(
|
|
|
190
191
|
timeout=60,
|
|
191
192
|
)
|
|
192
193
|
if proc.returncode != 0:
|
|
194
|
+
detail = (proc.stdout or proc.stderr or "").strip()
|
|
195
|
+
print(f"[cosmic-api] {command} failed (exit={proc.returncode}): {detail}", file=sys.stderr)
|
|
193
196
|
return None
|
|
194
197
|
output = (proc.stdout or "").strip()
|
|
195
198
|
if not output:
|
|
@@ -568,7 +571,7 @@ def _apply_direct_authoring_constraints(
|
|
|
568
571
|
for entity in entities:
|
|
569
572
|
if not isinstance(entity, dict) or "templateKey" in entity:
|
|
570
573
|
continue
|
|
571
|
-
default =
|
|
574
|
+
default = _DEFAULT_ENTITY_TEMPLATES.get(str(entity.get("type") or ""))
|
|
572
575
|
if default:
|
|
573
576
|
entity["templateKey"] = default
|
|
574
577
|
for entity in entities:
|
|
@@ -1196,7 +1199,8 @@ def _extract_resolver_field_writes(dm_section: dict[str, Any]) -> dict[str, dict
|
|
|
1196
1199
|
def shape_check(dm_section: dict[str, Any], logs: _Logs) -> bool:
|
|
1197
1200
|
"""artifact + assumptions structural compliance validation.
|
|
1198
1201
|
|
|
1199
|
-
- artifact.entities[]: required non-empty array; each item
|
|
1202
|
+
- artifact.entities[]: required non-empty array; each item has bizName/displayName/type/fields[];
|
|
1203
|
+
BillEntity/BaseEntity receive a standard template when templateKey is omitted
|
|
1200
1204
|
- assumptions[]: array (can be empty)
|
|
1201
1205
|
|
|
1202
1206
|
Returns True for pass; False for SHAPE_INVALID errors.
|
|
@@ -2167,77 +2171,60 @@ def _extend_platform_carry_field_keys(
|
|
|
2167
2171
|
return True
|
|
2168
2172
|
|
|
2169
2173
|
|
|
2170
|
-
def _validate_template_keys(
|
|
2174
|
+
def _validate_template_keys(
|
|
2175
|
+
dm_section: dict[str, Any], logs: _Logs, cosmic_api_path: str, *, app_root: Path,
|
|
2176
|
+
) -> bool:
|
|
2171
2177
|
"""Validate each entity's templateKey legality.
|
|
2172
2178
|
|
|
2173
|
-
|
|
2174
|
-
|
|
2179
|
+
Read the applicable public and app template catalogs before emission. A
|
|
2180
|
+
failed catalog call is not an empty catalog, and an exact template can also
|
|
2181
|
+
be proved by its preset-field readback when a server omits it from lists.
|
|
2175
2182
|
"""
|
|
2176
2183
|
artifact = dm_section.get("artifact") or {}
|
|
2177
2184
|
entities = artifact.get("entities") or []
|
|
2178
2185
|
|
|
2179
2186
|
biz_app_number = ""
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
if app_root:
|
|
2183
|
-
ctx_file = Path(app_root) / "_runtime" / "context.json"
|
|
2184
|
-
if ctx_file.exists():
|
|
2185
|
-
try:
|
|
2186
|
-
ctx = json.loads(ctx_file.read_text(encoding="utf-8"))
|
|
2187
|
-
biz_app_number = str(ctx.get("appCode") or "").strip()
|
|
2188
|
-
except Exception:
|
|
2189
|
-
pass
|
|
2190
|
-
|
|
2191
|
-
available_templates: dict[str, dict] = {}
|
|
2192
|
-
model_types = ["BillFormModel", "BaseFormModel"]
|
|
2193
|
-
for mt in model_types:
|
|
2187
|
+
ctx_file = app_root / "_runtime" / "context.json"
|
|
2188
|
+
if ctx_file.exists():
|
|
2194
2189
|
try:
|
|
2195
|
-
|
|
2196
|
-
|
|
2197
|
-
if biz_app_number:
|
|
2198
|
-
pub_cmd.extend(["--bizAppNumber", biz_app_number])
|
|
2199
|
-
proc = subprocess.run(pub_cmd, capture_output=True, text=True,
|
|
2200
|
-
encoding="utf-8", errors="replace", timeout=60)
|
|
2201
|
-
if proc.returncode == 0 and (proc.stdout or "").strip():
|
|
2202
|
-
result = json.loads(proc.stdout.strip())
|
|
2203
|
-
templates = (result.get("data") or {}).get("templates") or []
|
|
2204
|
-
if isinstance(templates, list):
|
|
2205
|
-
for t in templates:
|
|
2206
|
-
if isinstance(t, dict):
|
|
2207
|
-
num = str(t.get("number") or "").strip()
|
|
2208
|
-
if num:
|
|
2209
|
-
available_templates[num] = {
|
|
2210
|
-
"name": str(t.get("name") or ""),
|
|
2211
|
-
"modelType": str(t.get("modelType") or mt),
|
|
2212
|
-
"source": "public",
|
|
2213
|
-
}
|
|
2190
|
+
ctx = json.loads(ctx_file.read_text(encoding="utf-8"))
|
|
2191
|
+
biz_app_number = str(ctx.get("appCode") or "").strip()
|
|
2214
2192
|
except Exception:
|
|
2215
|
-
|
|
2216
|
-
en=f"queryPublicTemplates({mt}) call failed")
|
|
2193
|
+
pass
|
|
2217
2194
|
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2195
|
+
available_templates: list[dict[str, str]] = []
|
|
2196
|
+
successful_types: set[str] = set()
|
|
2197
|
+
failed_sources: dict[str, set[str]] = {}
|
|
2198
|
+
model_type_by_entity = {"BillEntity": "BillFormModel", "BaseEntity": "BaseFormModel"}
|
|
2199
|
+
model_types = sorted({
|
|
2200
|
+
model_type_by_entity[ent.get("type")]
|
|
2201
|
+
for ent in entities if isinstance(ent, dict) and ent.get("type") in model_type_by_entity
|
|
2202
|
+
})
|
|
2203
|
+
bound_root = app_root.resolve()
|
|
2204
|
+
for mt in model_types:
|
|
2205
|
+
queries = [("queryPublicTemplates", {"modelType": mt}, "public")]
|
|
2206
|
+
if biz_app_number:
|
|
2207
|
+
queries.append(("queryBizTemplates", {
|
|
2208
|
+
"modelType": mt, "bizAppNumber": biz_app_number,
|
|
2209
|
+
}, "biz"))
|
|
2210
|
+
for command, arguments, source in queries:
|
|
2211
|
+
result = _run_cosmic_api(
|
|
2212
|
+
cosmic_api_path, command, arguments, app_root=bound_root,
|
|
2213
|
+
)
|
|
2214
|
+
data = result.get("data") if isinstance(result, dict) else None
|
|
2215
|
+
templates = data.get("templates") if isinstance(data, dict) else None
|
|
2216
|
+
if (not isinstance(result, dict) or result.get("status") is not True
|
|
2217
|
+
or not isinstance(data, dict) or data.get("success") is False
|
|
2218
|
+
or not isinstance(templates, list)):
|
|
2219
|
+
failed_sources.setdefault(mt, set()).add(source)
|
|
2220
|
+
continue
|
|
2221
|
+
successful_types.add(mt)
|
|
2222
|
+
available_templates.extend({
|
|
2223
|
+
"number": str(row.get("number") or "").strip(),
|
|
2224
|
+
"name": str(row.get("name") or ""),
|
|
2225
|
+
"modelType": mt,
|
|
2226
|
+
"source": source,
|
|
2227
|
+
} for row in templates if isinstance(row, dict) and row.get("number"))
|
|
2241
2228
|
|
|
2242
2229
|
ok = True
|
|
2243
2230
|
for ent in entities:
|
|
@@ -2253,21 +2240,42 @@ def _validate_template_keys(dm_section: dict[str, Any], logs: _Logs, cosmic_api_
|
|
|
2253
2240
|
en=f"Entity '{ent.get('bizName')}' (type={etype}) missing templateKey, please specify")
|
|
2254
2241
|
ok = False
|
|
2255
2242
|
continue
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2243
|
+
expected_model = model_type_by_entity.get(etype)
|
|
2244
|
+
if not expected_model:
|
|
2245
|
+
continue
|
|
2246
|
+
_ensure_field_decorator_on_path()
|
|
2247
|
+
from _core.cmd_forms import resolve_template_selector
|
|
2248
|
+
try:
|
|
2249
|
+
resolved_template = resolve_template_selector(tk, available_templates, expected_model)
|
|
2250
|
+
except ValueError:
|
|
2251
|
+
resolved_template = None
|
|
2252
|
+
if resolved_template:
|
|
2253
|
+
ent["templateKey"] = resolved_template
|
|
2254
|
+
if tk != resolved_template:
|
|
2255
|
+
logs.info("TEMPLATE-NAME-RESOLVED", f"{tk} -> {resolved_template}")
|
|
2256
|
+
continue
|
|
2257
|
+
detail = _run_cosmic_api(cosmic_api_path, "getEntityFields", {
|
|
2258
|
+
"formNumber": tk,
|
|
2259
|
+
}, app_root=bound_root) if tk != "blankPage" else None
|
|
2260
|
+
detail_data = detail.get("data") if isinstance(detail, dict) else None
|
|
2261
|
+
header = detail_data.get("headerFields") if isinstance(detail_data, dict) else None
|
|
2262
|
+
if isinstance(header, dict) and header.get("headerKey") == tk:
|
|
2263
|
+
logs.warn("TEMPLATE-NOT-LISTED", f"{tk} exists but was absent from template lists",
|
|
2264
|
+
en=f"{tk} exists but was absent from template lists")
|
|
2265
|
+
continue
|
|
2266
|
+
candidates = [
|
|
2267
|
+
f"{row['number']} ({row['name']}) [{row['source']}]"
|
|
2268
|
+
for row in available_templates if row["modelType"] == expected_model
|
|
2269
|
+
]
|
|
2270
|
+
lookup_incomplete = (expected_model not in successful_types
|
|
2271
|
+
or "biz" in failed_sources.get(expected_model, set()))
|
|
2272
|
+
error_code = "TEMPLATE-LOOKUP-UNAVAILABLE" if lookup_incomplete else "INVALID-TEMPLATEKEY"
|
|
2273
|
+
logs.err(error_code,
|
|
2274
|
+
f"Entity '{ent.get('bizName')}' templateKey='{tk}' could not be verified. "
|
|
2275
|
+
f"Available: {candidates[:10]}",
|
|
2276
|
+
en=f"Entity '{ent.get('bizName')}' templateKey='{tk}' could not be verified. "
|
|
2277
|
+
f"Available: {candidates[:10]}")
|
|
2278
|
+
ok = False
|
|
2271
2279
|
return ok
|
|
2272
2280
|
|
|
2273
2281
|
|
|
@@ -3389,7 +3397,8 @@ def _normalize_ui_composition_contract(value: Any) -> Any:
|
|
|
3389
3397
|
if not isinstance(row, dict) or set(row) != {"fields"}:
|
|
3390
3398
|
raise ValueError(
|
|
3391
3399
|
f"uiComposition.{collection_name}[{block_index}].rows"
|
|
3392
|
-
f"[{row_index}] must contain only fields"
|
|
3400
|
+
f"[{row_index}] must contain only fields; put fullLine "
|
|
3401
|
+
'inside a fields[] item, e.g. {"fields":[{"field":"Description","fullLine":true}]}'
|
|
3393
3402
|
)
|
|
3394
3403
|
fields = row.get("fields")
|
|
3395
3404
|
if not isinstance(fields, list) or not fields:
|
|
@@ -3648,8 +3657,8 @@ def assemble_artifact_emit(
|
|
|
3648
3657
|
continue
|
|
3649
3658
|
field_biz = str(field.get("bizWord") or "")
|
|
3650
3659
|
if entity_biz and field_biz:
|
|
3651
|
-
field_key =
|
|
3652
|
-
field_biz, isv, standard=standard
|
|
3660
|
+
field_key = make_field_key(
|
|
3661
|
+
str(field.get("logicalName") or "").strip() or field_biz, isv, standard=standard
|
|
3653
3662
|
)
|
|
3654
3663
|
source_field_keys[(entity_biz, field_biz)] = field_key
|
|
3655
3664
|
source_field_keys[(entity_key, field_biz)] = field_key
|
|
@@ -4688,8 +4697,8 @@ def _print_repair_report(logs: _Logs, exit_code: int) -> None:
|
|
|
4688
4697
|
if is_en:
|
|
4689
4698
|
print("==== REPAIR HINT: templateKey error ====", file=sys.stderr)
|
|
4690
4699
|
print(
|
|
4691
|
-
"Entity has
|
|
4692
|
-
" ->
|
|
4700
|
+
"Entity has an empty or invalid templateKey.\n"
|
|
4701
|
+
" -> Omit templateKey to use the standard BillEntity/BaseEntity default.\n"
|
|
4693
4702
|
" -> Standard templates: bos_billtpl, bos_billorgtpl, bos_basetpl, etc.\n"
|
|
4694
4703
|
" -> If user specified a custom template, provide the exact template number.",
|
|
4695
4704
|
file=sys.stderr,
|
|
@@ -4697,8 +4706,8 @@ def _print_repair_report(logs: _Logs, exit_code: int) -> None:
|
|
|
4697
4706
|
else:
|
|
4698
4707
|
print("==== REPAIR HINT: templateKey error ====", file=sys.stderr)
|
|
4699
4708
|
print(
|
|
4700
|
-
"Entity has
|
|
4701
|
-
" →
|
|
4709
|
+
"Entity has an empty or invalid templateKey.\n"
|
|
4710
|
+
" → Omit templateKey to use the standard BillEntity/BaseEntity default.\n"
|
|
4702
4711
|
" → Standard templates: bos_billtpl, bos_billorgtpl, bos_basetpl, etc.\n"
|
|
4703
4712
|
" → If user specified a custom template, provide the exact template number.",
|
|
4704
4713
|
file=sys.stderr,
|
|
@@ -4843,7 +4852,40 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
4843
4852
|
help="Artifact output directory; default is metadata/_emit/<run-id>.",
|
|
4844
4853
|
)
|
|
4845
4854
|
parser.add_argument("--quiet", action="store_true", help="only output on errors")
|
|
4846
|
-
|
|
4855
|
+
parser.add_argument("--describe", action="store_true", help="Return the existing authoring schema and executable contract without platform access")
|
|
4856
|
+
arguments = list(argv) if argv is not None else sys.argv[1:]
|
|
4857
|
+
if "--describe" in arguments:
|
|
4858
|
+
if arguments != ["--describe"]:
|
|
4859
|
+
parser.error("--describe is read-only and takes no execution arguments")
|
|
4860
|
+
root = Path(__file__).resolve().parents[3]
|
|
4861
|
+
schema_file = root / "schemas" / "data-model-authoring.schema.json"
|
|
4862
|
+
schema = json.loads(schema_file.read_text(encoding="utf-8"))
|
|
4863
|
+
authoring_contract = {
|
|
4864
|
+
"callerFieldInputs": schema["definitions"]["field"]["required"],
|
|
4865
|
+
"compilerGeneratedIdentifiers": ["formNumber", "entityKey", "tableName", "fieldKey", "columnName"],
|
|
4866
|
+
"explicitIdentifierOverrides": ["--root-form-number", "logicalName", "physicalName"],
|
|
4867
|
+
"defaultTemplates": _DEFAULT_ENTITY_TEMPLATES,
|
|
4868
|
+
"guidance": {
|
|
4869
|
+
"en": "Define business fields using semantic bizWord, displayName and dataType. Omit templateKey unless a specific template is requested. The compiler resolves templates, fetches live header/entry preset fields, reuses exact-key overlaps, and generates identifiers with naming/collision rules. Do not reproduce these algorithms or inspect source before authoring; the schema and returned validation errors own the contract. Explicit user identifiers remain constraints. Query template fields separately only when business behavior needs an exact preset-field identity; unknown field types use fieldTypesCommand, known types need no catalog lookup.",
|
|
4870
|
+
"zh": "按业务语义填写 bizWord、displayName、dataType;未指定模板时省略 templateKey。编译器负责模板解析、动态读取表头/分录预置字段、按准确键复用重叠字段,以及标识生成和命名冲突处理。编写输入前无需复刻算法或读源码,以 Schema 和返回的校验错误为准;用户明确指定的标识仍是约束。仅当业务行为需要准确预置字段身份时,单独查询模板字段;未知类型用 fieldTypesCommand,已知类型不查目录。",
|
|
4871
|
+
},
|
|
4872
|
+
"templateFieldInspection": {
|
|
4873
|
+
"argv": [sys.executable, str(root / "skills/cosmic-meta-api/scripts/cosmic_api.py"),
|
|
4874
|
+
"--stdout", "getEntityFields", "--app-root", "<verified-app-root>",
|
|
4875
|
+
"--formNumber", "<template-key>"],
|
|
4876
|
+
"templateKeySource": "explicit templateKey or defaultTemplates[entity.type]",
|
|
4877
|
+
"responsePaths": ["data.headerFields.fields", "data.entryFields.fields"],
|
|
4878
|
+
},
|
|
4879
|
+
}
|
|
4880
|
+
print(json.dumps({"command": "data_model_emit", "execution": {"argvPrefix": [sys.executable, str(Path(__file__).resolve())]},
|
|
4881
|
+
"authoringContract": authoring_contract,
|
|
4882
|
+
"arguments": [{"flags": action.option_strings, "required": action.required,
|
|
4883
|
+
"help": action.help} for action in parser._actions if action.dest not in {"help", "describe"}],
|
|
4884
|
+
"schemaPath": str(schema_file), "inputSchema": schema,
|
|
4885
|
+
"fieldTypesCommand": [sys.executable, str(Path(__file__).resolve().with_name("field_type_registry.py")), "--catalog", "--compact"]},
|
|
4886
|
+
ensure_ascii=False, separators=(",", ":")))
|
|
4887
|
+
return EXIT_SUCCESS
|
|
4888
|
+
args = parser.parse_args(arguments)
|
|
4847
4889
|
|
|
4848
4890
|
app_root = Path(args.app_root).resolve()
|
|
4849
4891
|
if not app_root.exists():
|
|
@@ -5024,7 +5066,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
5024
5066
|
cosmic_api_path = str(
|
|
5025
5067
|
Path(__file__).resolve().parents[2] / "cosmic-meta-api" / "scripts" / "cosmic_api.py"
|
|
5026
5068
|
)
|
|
5027
|
-
if not _validate_template_keys(dm_section, logs, cosmic_api_path):
|
|
5069
|
+
if not _validate_template_keys(dm_section, logs, cosmic_api_path, app_root=app_root):
|
|
5028
5070
|
_persist_data_model_section(section_io, dm_section, logs)
|
|
5029
5071
|
_print_repair_report(logs, EXIT_IR_INVALID)
|
|
5030
5072
|
return EXIT_IR_INVALID
|
|
@@ -5106,6 +5148,12 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
5106
5148
|
|
|
5107
5149
|
logs.clear_error_report()
|
|
5108
5150
|
|
|
5151
|
+
# The compiler already knows the manifest. Pass it onward without another
|
|
5152
|
+
# filesystem read or model-authored command reconstruction.
|
|
5153
|
+
root = Path(__file__).resolve().parents[3]
|
|
5154
|
+
next_argv = [sys.executable, str(root / "skills" / "cosmic-meta-api" / "scripts" / "cosmic_api.py"),
|
|
5155
|
+
"runBatch", "--app-root", str(app_root), "--emit-manifest", str(output_dir / "_emit_manifest.json"), "--verify"]
|
|
5156
|
+
print("NEXT_COMMAND=" + json.dumps(next_argv, ensure_ascii=False))
|
|
5109
5157
|
print(f"EMIT_SUCCESS: {len(written)} artifact written to {output_dir}")
|
|
5110
5158
|
return EXIT_SUCCESS
|
|
5111
5159
|
|
|
@@ -117,10 +117,20 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
117
117
|
action="store_true",
|
|
118
118
|
help="print the complete document-backed field-type catalog as JSON",
|
|
119
119
|
)
|
|
120
|
+
parser.add_argument("--types", nargs="+", help="Exact FieldDataType names to describe; no semantic guessing")
|
|
121
|
+
parser.add_argument("--compact", action="store_true", help="Return the semantic index only, without full constraints")
|
|
120
122
|
args = parser.parse_args(argv)
|
|
121
123
|
if not args.catalog:
|
|
122
124
|
parser.error("--catalog is required")
|
|
123
|
-
|
|
125
|
+
catalog = build_field_type_catalog()
|
|
126
|
+
if args.types:
|
|
127
|
+
missing = sorted(set(args.types) - {item["name"] for item in catalog["fieldTypes"]})
|
|
128
|
+
if missing:
|
|
129
|
+
parser.error("Unknown FieldDataType: " + ", ".join(missing))
|
|
130
|
+
catalog["fieldTypes"] = [item for item in catalog["fieldTypes"] if item["name"] in args.types]
|
|
131
|
+
if args.compact:
|
|
132
|
+
catalog["fieldTypes"] = [{key: item[key] for key in ("name", "semantics", "manualForbidden")} for item in catalog["fieldTypes"]]
|
|
133
|
+
print(json.dumps(catalog, ensure_ascii=False, separators=(",", ":")))
|
|
124
134
|
return 0
|
|
125
135
|
|
|
126
136
|
|
|
@@ -88,9 +88,7 @@ def _fetch_isv_via_get_dev_info(app_root: Path) -> tuple[str, Any]:
|
|
|
88
88
|
except Exception as exc:
|
|
89
89
|
raise IsvResolveError(f"Unable to load cosmic-meta-api._core: {exc}") from exc
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
target.mkdir(parents=True, exist_ok=True)
|
|
93
|
-
_cfg._init_paths(temp_dir=str(target))
|
|
91
|
+
_cfg._init_paths(app_root=app_root)
|
|
94
92
|
|
|
95
93
|
try:
|
|
96
94
|
cfg = _cfg.load_config()
|
|
@@ -509,11 +509,36 @@ def validate_report_artifact(artifact):
|
|
|
509
509
|
# CLI
|
|
510
510
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
511
511
|
|
|
512
|
+
def report_artifact_schema():
|
|
513
|
+
"""Publish the artifact and its payload definitions as one local schema."""
|
|
514
|
+
schema = json.loads((Path(__file__).resolve().parents[1] / "modules/report/report-artifact-schema.json").read_text(encoding="utf-8"))
|
|
515
|
+
contract = json.loads((API_SCRIPTS.parent / "contracts/schema/report-write.schema.json").read_text(encoding="utf-8"))
|
|
516
|
+
|
|
517
|
+
def rewrite(value, external=False):
|
|
518
|
+
if isinstance(value, list):
|
|
519
|
+
return [rewrite(item, external) for item in value]
|
|
520
|
+
if not isinstance(value, dict):
|
|
521
|
+
return value
|
|
522
|
+
result = {key: rewrite(item, external) for key, item in value.items()}
|
|
523
|
+
reference = result.get("$ref", "")
|
|
524
|
+
prefix = "#/$defs/" if external else "app-build://cosmic-meta-api/report-write.schema.json#/$defs/"
|
|
525
|
+
if reference.startswith(prefix):
|
|
526
|
+
result["$ref"] = "#/$defs/reportWrite_" + reference[len(prefix):]
|
|
527
|
+
return result
|
|
528
|
+
|
|
529
|
+
bundled = rewrite(schema)
|
|
530
|
+
bundled.setdefault("$defs", {}).update({
|
|
531
|
+
"reportWrite_" + key: rewrite(value, True) for key, value in contract["$defs"].items()
|
|
532
|
+
})
|
|
533
|
+
return bundled
|
|
534
|
+
|
|
535
|
+
|
|
512
536
|
def _build_parser():
|
|
513
537
|
parser = argparse.ArgumentParser(
|
|
514
538
|
description="Validate report-specific sections of a Cosmic Artifact."
|
|
515
539
|
)
|
|
516
540
|
group = parser.add_mutually_exclusive_group(required=True)
|
|
541
|
+
group.add_argument("--schema", action="store_true", help="Print the complete report artifact schema without platform access.")
|
|
517
542
|
group.add_argument(
|
|
518
543
|
"--artifact",
|
|
519
544
|
metavar="PATH",
|
|
@@ -572,6 +597,10 @@ def main():
|
|
|
572
597
|
parser = _build_parser()
|
|
573
598
|
args = parser.parse_args()
|
|
574
599
|
|
|
600
|
+
if args.schema:
|
|
601
|
+
print(json.dumps(report_artifact_schema(), ensure_ascii=False, indent=2))
|
|
602
|
+
return
|
|
603
|
+
|
|
575
604
|
artifact = _load_artifact(args)
|
|
576
605
|
result = validate_report_artifact(artifact)
|
|
577
606
|
|
|
@@ -6,7 +6,7 @@ description: app-build 内部执行技能,用确定性 CLI 修改已有苍穹
|
|
|
6
6
|
# 已有表单元数据修改
|
|
7
7
|
|
|
8
8
|
使用原始意图和准确目标,执行最小可验证 CLI 闭环。
|
|
9
|
-
`ROOT_DIR` 是已加载的 app-build 根 `SKILL.md` 所在目录;直接使用下方准确发布路径。
|
|
9
|
+
`{ROOT_DIR}` 是已加载的 app-build 根 `SKILL.md` 所在目录;直接使用下方准确发布路径。
|
|
10
10
|
|
|
11
11
|
只有用户明确提供的准确应用目录,或成功绑定命令返回的目录,才是可信 `appRoot`;不得把
|
|
12
12
|
项目根或其 `app/` 目录提升为 `appRoot`。用户明确删除一个准确元数据元素时可原子删除,
|
|
@@ -135,6 +135,7 @@ MetaOps 或再次确认。
|
|
|
135
135
|
常用规则意图直达小型 rule-domain 命令:
|
|
136
136
|
|
|
137
137
|
- `ensureFieldCalculation --entity`
|
|
138
|
+
- `ensureTimeDifferenceCalculation --entity`
|
|
138
139
|
- `ensureConditionalCalculation --entity`
|
|
139
140
|
- `setSummaryToField --element`
|
|
140
141
|
- `ensureConditionalFieldState --entity`
|
|
@@ -176,7 +177,8 @@ MetaOps 或再次确认。
|
|
|
176
177
|
|
|
177
178
|
完成已验证写入后,modifier 执行完成,但 app-build 请求可能还有其他明确工作。返回已验证的
|
|
178
179
|
`appRoot` 和准确 `formNumber`;通过 `--form-name` 调用时使用返回身份,不再解析 schema。
|
|
179
|
-
|
|
180
|
+
完整或部分交付遵循 `{ROOT_DIR}/references/delivery.md`。写后结果无法确认时,先查明
|
|
181
|
+
受影响表单的状态再继续修改或交付该表单;其他独立验证通过的表单仍需完成交付。
|
|
180
182
|
|
|
181
183
|
## 新增分录实体
|
|
182
184
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
## modifier 特有说明
|
|
18
18
|
|
|
19
19
|
在执行元数据修改前,确认应用身份已经初始化:
|
|
20
|
-
1.
|
|
20
|
+
1. 确认环境凭据可从 `~/.kd/config.json` 解析(见下方 init 入口)
|
|
21
21
|
2. 确认 workspace.json 中 appNumber、bizCloudName、isv 已填充
|
|
22
22
|
3. 若未初始化,按 `cosmic-meta-api/modules/init/SKILL.md` 引导用户补全
|
|
23
23
|
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|------|---------------------------|
|
|
30
30
|
| `python` | Windows: `python` / Linux·macOS: `python3` |
|
|
31
31
|
| `cosmic_api` | `SKILL_DIR/../../../cosmic-meta-api/scripts/cosmic_api.py` |
|
|
32
|
-
| `config` |
|
|
32
|
+
| `config` | `~/.kd/config.json`(平台级配置,由脚本自行解析) |
|
|
33
33
|
| `field_type_reference` | `SKILL_DIR/../../../cosmic-meta-knowledge/domain-model/field-types.md` |
|
|
34
34
|
| `field_naming_rules` | `SKILL_DIR/../../../cosmic-meta-knowledge/conventions/naming-rules.md` |
|
|
35
35
|
| `basedata_lookup_guide` | `SKILL_DIR/../../../cosmic-meta-knowledge/reference-data/basedata-catalog.md` |
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
| `cosmic_api` | `SKILL_DIR/../../../cosmic-meta-api/scripts/cosmic_api.py` |
|
|
11
11
|
| `ops_manager` | `SKILL_DIR/../../../cosmic-meta-api/scripts/ops_manager.py` |
|
|
12
12
|
| `pdm_skill` | `SKILL_DIR/../../../cosmic-meta-api/modules/pdm/SKILL.md` |
|
|
13
|
-
| `config` |
|
|
13
|
+
| `config` | `~/.kd/config.json`(平台级配置,由脚本自行解析) |
|
|
14
14
|
|
|
15
15
|
---
|
|
16
16
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
静态字段属性归[属性入口](../property/SKILL.md),字段变化计算和条件界面行为归
|
|
5
5
|
[规则入口](../rule/SKILL.md)。字段必填标记本身不能证明保存或提交时已执行必填检查。
|
|
6
6
|
|
|
7
|
-
`ROOT_DIR` 是 app-build 提供的 Skill package directory。
|
|
7
|
+
`{ROOT_DIR}` 是 app-build 提供的 Skill package directory。
|
|
8
8
|
|
|
9
9
|
## 按当前要求选择契约
|
|
10
10
|
|
|
@@ -19,9 +19,8 @@
|
|
|
19
19
|
必填/条件必填检查时才使用 `ensureMustInputValidation`,不要为每条自定义条件自动
|
|
20
20
|
追加它。一条提示涉及多个条件时使用一个复合输入;独立要求的多条提示可分别配置。
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
声称按钮已经存在。
|
|
22
|
+
平台或内部操作元数据不创建按钮。面向表单用户手动执行的具名自定义动作直接进入 UI
|
|
23
|
+
`addButton` 闭环,由它创建/复用操作并完成可见绑定。
|
|
25
24
|
|
|
26
25
|
## 常用校验
|
|
27
26
|
|
|
@@ -45,6 +44,8 @@ writer 自行绑定目标、检查条件并独立验证写入。只有输入超
|
|
|
45
44
|
|
|
46
45
|
复用返回的表单身份与验证结果。全部要求完成后使用根入口统一交付;写入、渲染、
|
|
47
46
|
输出检查按依赖顺序等待。设计态验证与运行态验收分开判断。
|
|
47
|
+
操作定义和可见按钮只证明绑定完成。如果行为依赖尚未实现的插件(包括 `donothing` 操作),
|
|
48
|
+
即使元数据回读通过,业务行为仍应标记待实现。
|
|
48
49
|
|
|
49
50
|
已有校验通过自身的 `validationId` 定位,不使用规则 ID。
|
|
50
51
|
`extension_required` 不代表授权创建扩展。
|
package/skills/cosmic-build/skills/cosmic-meta-modifier/modules/operation/operation-write.md
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
## 边界
|
|
2
2
|
|
|
3
|
+
菜单项名称、说明属于界面显示对象,不等于操作定义的名称。只修改显示文字时使用
|
|
4
|
+
UI 的 configureDropdownMenu,保留绑定的操作定义。
|
|
5
|
+
|
|
3
6
|
- 使用调用方已经明确的操作类型。只有平台精确类型未知时,才调用一次
|
|
4
7
|
`listOperationTypes`,由模型选择一个类型;不得把请求识别成 CRUD、审批、
|
|
5
8
|
下推或导航工作流。
|
|
6
9
|
- 一个请求效果只执行一次 `addOperation`、`updateOperation` 或
|
|
7
10
|
`deleteOperation`。用户明确要求多个操作时,执行多个各自独立验证的 CLI;
|
|
8
11
|
不得生成 batch manifest 或执行计划。
|
|
9
|
-
-
|
|
10
|
-
|
|
12
|
+
- 表单用户手动执行的具名自定义业务动作属于可见操作,除非请求明确说明它仅供内部或其他流程调用。
|
|
13
|
+
此类请求直接进入 UI 的 `addButton` 闭环,由一个命令创建/复用操作并验证可见绑定。
|
|
14
|
+
平台内置操作和明确的内部操作元数据仍只处理操作本身。
|
|
11
15
|
- 本目录下的 scenarios 和 guides 仅是参考示例,不定义运行时控制流;已知命令
|
|
12
16
|
不读取它们。
|
|
13
17
|
|
|
@@ -69,3 +69,5 @@
|
|
|
69
69
|
命令启用已有
|
|
70
70
|
`MustInputValidation`(包括清除 `SkipMustInput=true`),不存在时才补建,同时保留其他校验。
|
|
71
71
|
只有字段红星而操作校验未启用,不能作为运行态验收证据。
|
|
72
|
+
|
|
73
|
+
分录最少行数与逐行必填是不同约束。`MustInputValidation` 只校验已有行的必填字段,零行时没有字段可检查,不能证明“至少一行”。已发布操作校验命令没有行数契约时,进入根入口的 Java 操作插件路线,在单据根实体读取准确分录集合并添加提交校验;保持用户指定的操作范围,不把“提交时至少一行”扩大到保存。
|
|
@@ -7,11 +7,16 @@ modifier 阶段。
|
|
|
7
7
|
就是完整必需参数,字段 key 不是前置条件。把这些选择器直接传入命令;只有在线表单中仍存在
|
|
8
8
|
歧义时,命令才返回结构化候选。
|
|
9
9
|
|
|
10
|
+
`entries` 选择所有非表头实体,包含嵌套子分录。只修改某一个分录,或不同分录中有同名字段时,
|
|
11
|
+
保留准确实体显示名/键,或用限定字段选择器,例如
|
|
12
|
+
`targets.fields:[{entity:"订场明细",field:"单价"}]`。不能用批量别名代替单一分录,
|
|
13
|
+
也不能把“子单据体”等结构类型当作实际实体名称。
|
|
14
|
+
|
|
10
15
|
用户同时给出准确表单编码和显示名称时,第一次调用就把编码原样传给 `--form-name`,
|
|
11
16
|
不得用显示名称替换或重新解析表单。用户点名表头或分录位置时,在同一次调用的 policy
|
|
12
17
|
目标中保留该位置。
|
|
13
18
|
|
|
14
|
-
本入口就是 `setProperties` 面向模型的完整公开合同。沿用根交接提供的 `ROOT_DIR`,根据
|
|
19
|
+
本入口就是 `setProperties` 面向模型的完整公开合同。沿用根交接提供的 `{ROOT_DIR}`,根据
|
|
15
20
|
用户给出的字段名和位置编译 policy,并把调用已发布命令作为下一动作;命令自行负责可执行实现
|
|
16
21
|
和在线目标检查。
|
|
17
22
|
|
|
@@ -36,6 +41,11 @@ Windows PowerShell 下需要把内层双引号转义才能到达命令(`'{"A":
|
|
|
36
41
|
|
|
37
42
|
## 高频直达
|
|
38
43
|
|
|
44
|
+
修改已有字段、控件或分录标识,使用一条
|
|
45
|
+
`renameElementKey --element "<当前名称/Key>" --new-key "<新标识>"`,配合上方表单绑定。
|
|
46
|
+
命令统一补一次开发商前缀,迁移可观察的规则条件/触发字段引用,并验证名称、类型、父级和位置。
|
|
47
|
+
引用清单无法读取时不写入;规则迁移失败时尝试回滚。数据库列名、表名仍是独立标识。
|
|
48
|
+
|
|
39
49
|
必填、为空提示、静态/设计默认值、显隐、锁定、长度、精度、小数位、标题、布局/样式标量及分录默认行数,
|
|
40
50
|
直接把用户给出的准确字段名和位置编译进对应属性命令。该命令是第一条平台动作,并自行完成
|
|
41
51
|
目标解析、校验和回读;只有结构化未解析结果会给出唯一后续动作。
|
|
@@ -69,6 +79,7 @@ archive、表单 Schema 或本地目录。
|
|
|
69
79
|
| 准确元素的其他高级样式 | 只读一次 `../../../cosmic-meta-knowledge/property-guides/style-properties.md`,再用 `setComplexProperty --complexType style` |
|
|
70
80
|
| 页签上显示的“页签操作” | `ensureTabPageOperations --input '{"tab":"<页签>","items":[{"title":"<显示名称>","operationCode":"<操作编码>","operationType":"<需要新建时的操作类型>","operationName":"<操作名称>"}]}'`;页签项编码 `itemCode` 可省略,命令保留其他页签操作,它不是按钮 |
|
|
71
81
|
| 附件面板行为 | 只读一次 `attachment-panel-properties.md`,再用一次 `setProperties` |
|
|
82
|
+
| 实体权限控制元数据 | `setPermissionControl`,按所需控制查看输入契约;该能力不等同于角色授权或权限项新建 |
|
|
72
83
|
| 其他陌生且已发布的属性 | 只调用一次 `describePropertyInput --propertyNames <名称>`,再执行其返回路由 |
|
|
73
84
|
|
|
74
85
|
设计器多选字段普通值放 `set`;`MustInputCondition`、`Features`、`CtlTips`、`Style`
|
|
@@ -83,12 +94,16 @@ archive、表单 Schema 或本地目录。
|
|
|
83
94
|
|
|
84
95
|
实时设计器 Schema 声明只读的 `_Type_`/字段类型和元素类型继续只读。`Key` 不进入批量写入,
|
|
85
96
|
因为批次内改变元素寻址会使后续操作失效。
|
|
97
|
+
字段类型调整属于迁移。任何破坏性替换前,先明确完整目标定义,以及已有数据、字段身份、
|
|
98
|
+
规则、布局和列表引用的保留方式;分别删除和新增成功不能证明迁移完成。
|
|
99
|
+
没有满足这些要求的受支持路径时,保留原字段并报告该项边界,不能先删再试参数。
|
|
86
100
|
`BasedataPropField` 本身只读,不得把这句描述转换成 `Lock:true`。明确设置 `Lock` 时使用
|
|
87
101
|
实时状态(如 `new`/`edit`),不能用布尔值;非法值在认证前拒绝。
|
|
88
|
-
`Lock` 是 FieldAp
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
Schema
|
|
102
|
+
`Lock` 是 FieldAp 表单控件属性。单个表头字段不可编辑时,直接用
|
|
103
|
+
`{"targets":{"fields":["<字段>"],"entities":["header"]},"set":{"Lock":"new,edit,submit,audit"}}`。
|
|
104
|
+
`Lock` 属于 `set`,不能放入 `complex`。紧凑 policy 自行完成表单树写入和回读,即使设计器
|
|
105
|
+
Property Schema 显示只读也不先查询它。混合属性会在写前统一校验;部分失败返回已完成与
|
|
106
|
+
待处理项,按回执恢复,不重放整个 policy。“不可编辑”表示单据全部状态:
|
|
92
107
|
`new,edit,submit,audit`。禁止先查 Schema,也不得改用 `applyFormUi` 或手写 `modifyMeta`。
|
|
93
108
|
|
|
94
109
|
字段属性(含静态显隐、可编辑性、外观)由本入口处理,属性存储在表单树也不改变归属。
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
| `mustInputCondition` | setMustInputCondition | 字段级 |
|
|
37
37
|
| `comboItems` | ⛔ ~~setComboItems~~ 已废弃;使用 `quickfield --add-option` / `--remove-option` | 字段级 |
|
|
38
38
|
| `splitTables` | setSplitTables | 实体级 |
|
|
39
|
-
| `dropdownItems` |
|
|
39
|
+
| `dropdownItems` | configureDropdownMenu(保留原身份的定向编辑) | 控件级 |
|
|
40
40
|
| `style` | setStyle | 控件级 |
|
|
41
41
|
|
|
42
42
|
> **使用建议**:上表列出常用的有快捷命令的类型。无快捷命令的类型(如 `userOption`、`billTypePara`、`formVariable`、`freezeList`、`networkControl` 等)使用 `setComplexProperty` 统一入口,完整列表见 `property-reference.md §12`。
|
|
@@ -59,7 +59,10 @@ policy 会对两个范围内的所有准确同名字段应用同一结果。未
|
|
|
59
59
|
`FuncType`/`FuncParameter`;当前日期是
|
|
60
60
|
`{"FuncType":"getToday","FuncParameter":"#CurrentDate#"}`,当前日期时间是
|
|
61
61
|
`{"FuncType":"getNow","FuncParameter":"#CurrentDatetime#"}`,当前登录人是
|
|
62
|
-
`{"FuncType":"getCurrentUser","FuncParameter":"#CurrentUser#"}`,只作用于准确点名的 `UserField
|
|
62
|
+
`{"FuncType":"getCurrentUser","FuncParameter":"#CurrentUser#"}`,只作用于准确点名的 `UserField`。这是设计默认值函数的字段类型边界,不是平台整体能力边界。确认需求要求在 `TextField` 中
|
|
63
|
+
填写当前用户或部门文本时,保留该类型;核对元数据入口后沿原生 Java 表单插件入口继续实现。
|
|
64
|
+
未实施插件属于剩余开发,不能据此宣称无法实现,或仅因 `getCurrentUser` 不适配就建议删表重建。
|
|
65
|
+
policy 中的引用记录使用
|
|
63
66
|
`{"kind":"record","value":"<名称或编码>"}` 或
|
|
64
67
|
`{"kind":"multi-record","values":["<记录>"]}`,统一通过同一 policy。
|
|
65
68
|
`setBasedataDefault` 保留为兼容适配器,新请求使用 policy。城市名称是记录选择器,
|
|
@@ -145,6 +145,15 @@ artifact 的列差异,绑定到这张报表的每一条菜单,以及有序
|
|
|
145
145
|
|
|
146
146
|
## 直接路径
|
|
147
147
|
|
|
148
|
+
过滤编辑控件类型与查询比较符是两项能力。当前 `setReportFilters` 输入没有 `fieldType` 或
|
|
149
|
+
`controlType` 选择器。本地核对的平台源码将 `compare=between` 创建为绑定 `DateRangeField` 的
|
|
150
|
+
`FieldAp`,其余为 `TextField`;旧部署可能不同,必须回读实际目标。单日期 `DateField`、
|
|
151
|
+
F7 多选 `MulBaseDataField` 和下拉框 `ComboListField` 需要平台接口扩展。不要声称重建、
|
|
152
|
+
只读类型属性、隐藏列或 Java 查询逻辑能提供这些控件;保留用户要求的界面行为为未解决边界,
|
|
153
|
+
不静默降级为文本框。`getReportSchema` 在证据存在时返回实际 `FieldAp` 与实体 `fieldType`,
|
|
154
|
+
缺少类型证据表示未知,不能推断为 `TextField`。
|
|
155
|
+
|
|
156
|
+
|
|
148
157
|
`registerReportPlugin` 直接调用对应命令。CLI 自行解析当前应用内的报表、校验载荷、写入、独立
|
|
149
158
|
读回报表投影并比较请求值。
|
|
150
159
|
|