@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.
Files changed (36) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/pyproject.toml +1 -1
  4. package/skills/qingflow-app-form/SKILL.md +7 -6
  5. package/skills/qingflow-cli/reference/builder/30-schema-fields.md +3 -2
  6. package/src/qingflow_mcp/app_form_validator.py +97 -0
  7. package/src/qingflow_mcp/builder_facade/app_form.py +15 -2
  8. package/src/qingflow_mcp/builder_facade/app_form_schema.py +50 -5
  9. package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +5 -0
  10. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +7 -12
  11. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +1 -1
  12. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +6 -4
  13. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +1 -1
  14. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +1 -1
  15. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +1 -1
  16. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +1 -1
  17. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +1 -1
  18. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +1 -1
  19. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +1 -1
  20. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +1 -1
  21. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +1 -1
  22. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +1 -1
  23. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +1 -1
  24. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +6 -4
  25. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +1 -1
  26. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +1 -1
  27. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +1 -1
  28. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +1 -1
  29. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +1 -1
  30. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +7 -12
  31. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +1 -1
  32. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/formula.json +1594 -0
  33. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +1 -1
  34. package/src/qingflow_mcp/cli/commands/builder.py +2 -0
  35. package/src/qingflow_mcp/server_app_builder.py +7 -2
  36. 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 表示清除默认值。数字和布尔值应先转换为字符串,对象和数组必须使用字段专用默认值配置。需要配置结构化默认值时,通过 AppForm Schema 查询能力传入当前 schema_version,并将字段的 questionType 作为 field_type 获取该字段类型的详细 Schema,再按其中的字段专用 config 定义填写。",
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, using 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, "
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(schema_version=schema_version, field_type=field_type)
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(schema_version=schema_version, field_type=field_type)
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 the versioned AppForm summary or one field-type schema."""
823
- return self._app_form.schema(schema_version=schema_version, field_type=field_type)
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,