@qingflow-tech/qingflow-cli 1.1.43-beta.4 → 1.1.43-beta.5
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/README.md +3 -3
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/skills/qingflow-app-form/SKILL.md +7 -6
- package/skills/qingflow-cli/reference/builder/30-schema-fields.md +3 -2
- package/src/qingflow_mcp/app_form_validator.py +97 -0
- package/src/qingflow_mcp/builder_facade/app_form.py +15 -2
- package/src/qingflow_mcp/builder_facade/app_form_schema.py +50 -5
- package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +5 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +7 -12
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +6 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +6 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +7 -12
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +1 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/formula.json +1594 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +1 -1
- package/src/qingflow_mcp/cli/commands/builder.py +2 -0
- package/src/qingflow_mcp/server_app_builder.py +7 -2
- package/src/qingflow_mcp/tools/ai_builder_tools.py +13 -3
|
@@ -319,7 +319,7 @@
|
|
|
319
319
|
"type": "object"
|
|
320
320
|
},
|
|
321
321
|
"ScalarDefaultValue": {
|
|
322
|
-
"description": "后端 queDefaultValue 支持的普通字段默认值;非空值必须是字符串,显式 null
|
|
322
|
+
"description": "后端 queDefaultValue 支持的普通字段默认值;非空值必须是字符串,显式 null 表示清除默认值。数字和布尔值应先转换为字符串,对象和数组必须使用字段专用默认值配置。defaultType 为 3 时,通过 AppForm Schema 查询能力传入当前 schema_version 并设置 schema_kind=formula 获取公式语法、字段引用、运算符和全部函数说明;CLI 使用 builder app-form schema --schema-kind formula。需要配置结构化默认值时,传入当前 schema_version,并将字段的 questionType 作为 field_type 获取字段详细 Schema。",
|
|
323
323
|
"type": [
|
|
324
324
|
"null",
|
|
325
325
|
"string"
|
|
@@ -104,6 +104,7 @@ def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) ->
|
|
|
104
104
|
|
|
105
105
|
app_form_schema = app_form_subparsers.add_parser("schema", help="读取 AppForm Schema")
|
|
106
106
|
app_form_schema.add_argument("--schema-version")
|
|
107
|
+
app_form_schema.add_argument("--schema-kind", choices=("summary", "field", "formula"))
|
|
107
108
|
app_form_schema.add_argument("--field-type")
|
|
108
109
|
app_form_schema.set_defaults(handler=_handle_app_form_schema, format_hint="builder_summary", force_json_output=True)
|
|
109
110
|
|
|
@@ -335,6 +336,7 @@ def _handle_app_form_schema(args: argparse.Namespace, context: CliContext) -> di
|
|
|
335
336
|
return context.builder.app_form_schema(
|
|
336
337
|
schema_version=args.schema_version,
|
|
337
338
|
field_type=args.field_type,
|
|
339
|
+
schema_kind=args.schema_kind,
|
|
338
340
|
)
|
|
339
341
|
|
|
340
342
|
|
|
@@ -37,7 +37,7 @@ def build_builder_server() -> FastMCP:
|
|
|
37
37
|
"Use solution_install when the user explicitly wants to install a packaged solution/template by solution_key, optionally copying bundled demo data. "
|
|
38
38
|
"Use package_list to find visible app packages by keyword and package_get to read package detail before editing; if creating or updating an app package may be appropriate, use package_apply with explicit user intent; otherwise use app_resolve to locate app resources, "
|
|
39
39
|
"Use workspace_icon_catalog_get before creating app packages or portals when supported icon/color candidates are needed; those resources require explicit non-template icon + color. AppForm-created apps derive a stable default icon and color from spec.appName. "
|
|
40
|
-
"app_form_schema plus app_form_get for versioned form work,
|
|
40
|
+
"app_form_schema plus app_form_get for versioned form work; query app_form_schema with schema_kind=formula before writing defaultType=3 formulas, and use being_draft=true only for editing and the published default for relation or record consumers; use app_get as the default non-form app map read, then app_get_fields/app_repair_code_blocks/app_get_layout/app_get_views/app_get_flow/app_get_charts/portal_list/portal_get/view_get/chart_get for focused compatibility or non-form reads, "
|
|
41
41
|
"member_search/role_search/role_create when workflow assignees must come from the directory or role catalog, preferring roles over explicit members unless the user explicitly names members, "
|
|
42
42
|
"then app_form_apply for complete app form targets, explicit app_delete for application deletion, and app_flow_apply/app_views_apply/app_associated_resources_apply/app_charts_apply/portal_apply/portal_delete for non-form patches. app_custom_buttons_apply is maintenance-only for explicit standalone button work outside normal view design. These apply/delete tools perform validation, normalization, writes, and readback verification where applicable. AppForm publishes only after a draft change or when the published form lags behind; views noop requests skip publish, app_custom_buttons_apply and app_associated_resources_apply publish after at least one write succeeds and expose no draft-only parameter, charts are immediate-live without publish and resolve targets by chart_id first then exact unique chart name, portal updates use replace semantics only when sections are supplied and edit-mode base-info-only updates may omit sections, portal delete separates DELETE execution from readback verification, portal pc layout is a 24-column grid and mobile is a 6-column grid so omit position or use layout_preset when unsure, publish=false only guarantees draft/base-info updates for tools that still expose that parameter, and flow should use publish=false whenever you only want draft/precheck behavior. "
|
|
43
43
|
"Builder apply/write outputs include schema_version, operation, summary, and resources[]; use resources[].id/key/name/ids/parent as the stable UI and agent display entry, and keep legacy fields such as field_diff/views_diff/chart_results only for compatibility or troubleshooting. "
|
|
@@ -184,8 +184,13 @@ def build_builder_server() -> FastMCP:
|
|
|
184
184
|
def app_form_schema(
|
|
185
185
|
schema_version: str | None = None,
|
|
186
186
|
field_type: str | None = None,
|
|
187
|
+
schema_kind: str | None = None,
|
|
187
188
|
) -> dict:
|
|
188
|
-
return ai_builder.app_form_schema(
|
|
189
|
+
return ai_builder.app_form_schema(
|
|
190
|
+
schema_version=schema_version,
|
|
191
|
+
field_type=field_type,
|
|
192
|
+
schema_kind=schema_kind,
|
|
193
|
+
)
|
|
189
194
|
|
|
190
195
|
@server.tool()
|
|
191
196
|
def app_form_get(
|
|
@@ -384,8 +384,13 @@ class AiBuilderTools(ToolBase):
|
|
|
384
384
|
def app_form_schema(
|
|
385
385
|
schema_version: str | None = None,
|
|
386
386
|
field_type: str | None = None,
|
|
387
|
+
schema_kind: str | None = None,
|
|
387
388
|
) -> JSONObject:
|
|
388
|
-
return self.app_form_schema(
|
|
389
|
+
return self.app_form_schema(
|
|
390
|
+
schema_version=schema_version,
|
|
391
|
+
field_type=field_type,
|
|
392
|
+
schema_kind=schema_kind,
|
|
393
|
+
)
|
|
389
394
|
|
|
390
395
|
@mcp.tool()
|
|
391
396
|
def app_form_get(
|
|
@@ -818,9 +823,14 @@ class AiBuilderTools(ToolBase):
|
|
|
818
823
|
*,
|
|
819
824
|
schema_version: str | None = None,
|
|
820
825
|
field_type: str | None = None,
|
|
826
|
+
schema_kind: str | None = None,
|
|
821
827
|
) -> JSONObject:
|
|
822
|
-
"""Return
|
|
823
|
-
return self._app_form.schema(
|
|
828
|
+
"""Return a versioned AppForm summary, field, or formula schema."""
|
|
829
|
+
return self._app_form.schema(
|
|
830
|
+
schema_version=schema_version,
|
|
831
|
+
field_type=field_type,
|
|
832
|
+
schema_kind=schema_kind,
|
|
833
|
+
)
|
|
824
834
|
|
|
825
835
|
def app_form_get(
|
|
826
836
|
self,
|