@qingflow-tech/qingflow-cli 1.1.49 → 1.1.50-beta.2

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 (96) hide show
  1. package/README.md +4 -4
  2. package/npm/lib/runtime.mjs +29 -13
  3. package/package.json +1 -1
  4. package/pyproject.toml +2 -1
  5. package/skills/qingflow-cli/SKILL.md +92 -410
  6. package/skills/qingflow-cli/manifest.yaml +1 -1
  7. package/skills/qingflow-cli/reference/00-INDEX.md +4 -4
  8. package/skills/qingflow-cli/reference/QINGFLOW_CLI_ADMIN_CHEATSHEET.md +1 -1
  9. package/skills/qingflow-cli/reference/QINGFLOW_CLI_DATA_RETRIEVAL_WORKFLOW.md +3 -137
  10. package/skills/qingflow-cli/reference/QINGFLOW_CLI_EXPLORATION_REPORT.md +6 -4
  11. package/skills/qingflow-cli/reference/QINGFLOW_CLI_FIELD_DATA_TYPES.md +14 -14
  12. package/skills/qingflow-cli/reference/QINGFLOW_CLI_MEMBER_CHEATSHEET.md +20 -19
  13. package/skills/qingflow-cli/reference/QINGFLOW_CLI_ONE_SHOT_CHEATSHEET.md +18 -14
  14. package/skills/qingflow-cli/reference/QINGFLOW_CLI_RECORD_CREATE_WORKFLOW.md +7 -12
  15. package/skills/qingflow-cli/reference/QINGFLOW_CLI_RECORD_UPDATE_WORKFLOW.md +2 -1
  16. package/skills/qingflow-cli/reference/builder/20-build-complete-system.md +2 -2
  17. package/skills/qingflow-cli/reference/builder/30-schema-fields.md +9 -5
  18. package/skills/qingflow-cli/reference/builder/reference/app-delivery-sop.md +3 -3
  19. package/skills/qingflow-cli/reference/builder/workflow/03-flow-patterns.md +13 -5
  20. package/skills/qingflow-cli/reference/builder/workflow/07-stage4-validate-spec.md +5 -3
  21. package/skills/qingflow-cli/reference/builder/workflow/08-stage5-apply-verify.md +1 -1
  22. package/skills/qingflow-cli/reference/builder/workflow/11-troubleshooting.md +1 -1
  23. package/skills/qingflow-cli/reference/builder/workflow/workflow-schema.json +1665 -1738
  24. package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_ADMIN_CHEATSHEET.md +1 -1
  25. package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_DATA_RETRIEVAL_WORKFLOW.md +76 -95
  26. package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_EXPLORATION_REPORT.md +6 -4
  27. package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_FIELD_DATA_TYPES.md +13 -13
  28. package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_MEMBER_CHEATSHEET.md +20 -19
  29. package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_ONE_SHOT_CHEATSHEET.md +18 -14
  30. package/skills/qingflow-cli/reference/data/README.md +32 -0
  31. package/skills/qingflow-cli/reference/record/QINGFLOW_CLI_RECORD_SPECIALIZED_WORKFLOW.md +50 -0
  32. package/skills/qingflow-cli/reference/record/QINGFLOW_CLI_RECORD_UPDATE_WORKFLOW.md +2 -1
  33. package/skills/qingflow-cli/reference/record/analysis/README.md +21 -113
  34. package/skills/qingflow-cli/reference/record/analysis/analysis-gotchas.md +10 -10
  35. package/skills/qingflow-cli/reference/record/analysis/analysis-patterns.md +9 -9
  36. package/skills/qingflow-cli/reference/record/analysis/business-context.md +1 -1
  37. package/skills/qingflow-cli/reference/record/analysis/confidence-reporting.md +10 -10
  38. package/skills/qingflow-cli/reference/record/analysis/data-access-playbook.md +52 -80
  39. package/skills/qingflow-cli/reference/record/analysis/pandas-recipes.md +2 -2
  40. package/skills/qingflow-cli/scripts/workflow/validate_flow_spec.py +48 -46
  41. package/skills/qingflow-common/SKILL.md +10 -17
  42. package/src/qingflow_mcp/app_form_compat.py +3 -0
  43. package/src/qingflow_mcp/app_form_validator.py +16 -3
  44. package/src/qingflow_mcp/backend_client.py +142 -12
  45. package/src/qingflow_mcp/builder_facade/app_form.py +360 -68
  46. package/src/qingflow_mcp/builder_facade/flow_validation.py +569 -0
  47. package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +1 -0
  48. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +61 -27
  49. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +3 -7
  50. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +3 -7
  51. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +5 -9
  52. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +3 -7
  53. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +8 -15
  54. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +3 -7
  55. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +3 -7
  56. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +3 -7
  57. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +3 -7
  58. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +3 -7
  59. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +3 -7
  60. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +3 -7
  61. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +3 -7
  62. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +3 -7
  63. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +3 -7
  64. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +3 -7
  65. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +43 -12
  66. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/rich_text.json +146 -0
  67. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +3 -7
  68. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +3 -7
  69. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +58 -24
  70. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +3 -7
  71. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/formula.json +8 -0
  72. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +5 -10
  73. package/src/qingflow_mcp/builder_facade/service.py +749 -6
  74. package/src/qingflow_mcp/builder_facade/workflow_spec.py +154 -2
  75. package/src/qingflow_mcp/cli/commands/__init__.py +2 -1
  76. package/src/qingflow_mcp/cli/commands/auth.py +1 -1
  77. package/src/qingflow_mcp/cli/commands/builder.py +57 -41
  78. package/src/qingflow_mcp/cli/commands/data.py +134 -0
  79. package/src/qingflow_mcp/cli/commands/record.py +1 -1
  80. package/src/qingflow_mcp/cli/context.py +4 -1
  81. package/src/qingflow_mcp/cli/formatters.py +159 -4
  82. package/src/qingflow_mcp/cli/main.py +4 -1
  83. package/src/qingflow_mcp/config.py +60 -0
  84. package/src/qingflow_mcp/public_surface.py +9 -0
  85. package/src/qingflow_mcp/resource_uri.py +241 -0
  86. package/src/qingflow_mcp/response_trim.py +53 -5
  87. package/src/qingflow_mcp/server.py +2 -0
  88. package/src/qingflow_mcp/server_app_builder.py +57 -2
  89. package/src/qingflow_mcp/server_app_user.py +10 -3
  90. package/src/qingflow_mcp/tools/ai_builder_tools.py +374 -41
  91. package/src/qingflow_mcp/tools/app_tools.py +52 -13
  92. package/src/qingflow_mcp/tools/csv_export.py +168 -0
  93. package/src/qingflow_mcp/tools/data_tools.py +284 -0
  94. package/src/qingflow_mcp/tools/login_link_tools.py +34 -6
  95. package/src/qingflow_mcp/tools/record_tools.py +11 -46
  96. package/src/qingflow_mcp/tools/resource_read_tools.py +13 -0
@@ -201,8 +201,8 @@ qingflow builder schema apply \
201
201
  - 如果返回 `MULTI_APP_STATIC_VALIDATION_FAILED`,读取 `details.issues[]` 的 `path/error_code/fix_hint` 修 payload;这是写入前失败,通常可以修正后重试,不需要 readback。
202
202
  - 多应用 schema apply 不做事务回滚;如果部分失败,只补失败的 `apps[].row_number`,不要整批重复提交。
203
203
  - 这个模式只负责应用壳与字段;视图、按钮、关联资源、报表仍拿返回的 `app_key` 继续走各自 apply 工具。
204
- - `target_app_ref`、`as_data_title`、`display_field` 等只属于旧载荷。迁移时将关系改写为 AppForm `config.targetAppKey`、`config.displayField`、`config.visibleFields`,并使用已确认的真实 app key。
205
- - 历史 schema adapter 写入后可读 `details.relation_readback_matrix[]`:逐项核对旧 `target_app_key`、`relation_mode`、`display_field`、`visible_fields`。迁移到当前 AppForm 后,改为读取 draft/published form 的 `config.targetAppKey`、`config.relationMode`、`config.displayField`、`config.visibleFields`,不要提交旧 `update_fields` patch。
204
+ - `target_app_ref`、`as_data_title`、`display_field` 等只属于旧载荷。迁移时将关系改写为 AppForm `config.targetAppKey`、`config.displayFields[]`(含 `auth`)、`config.twoWayBoundField`,并使用已确认的真实 app key。
205
+ - 历史 schema adapter 写入后可读 `details.relation_readback_matrix[]`:逐项核对旧 `target_app_key`、`relation_mode`、`display_field`、`visible_fields`。迁移到当前 AppForm 后,改为读取 draft/published form 的 `config.targetAppKey`、`config.relationMode`、`config.twoWayBoundField`、`config.displayFields[]`,不要提交旧 `update_fields` patch。
206
206
  - 一个应用可以包含多个 `relation` 字段;不要因为 relation 数量超过 1 就降级成文本。若真实写入失败或 relation readback mismatch,只按实际错误和 `details.relation_repair_plan[]` 做最小修复。
207
207
  - 完整系统遇到超时、`partial_success`、`write_executed=true`、`safe_to_retry=false` 或 readback 不完整时,先按 §3.4 读回,不要直接拆成单应用创建。
208
208
 
@@ -349,7 +349,7 @@ qingflow builder flow apply \
349
349
  | **`address`** | 地址复合字段。 |
350
350
  | **`attachment`** | 附件。 |
351
351
  | **`boolean`** | 是否。 |
352
- | **`relation`** | 旧载荷使用 `target_app_key` / `target_app_ref`;当前 AppForm 使用 `config.targetAppKey`、`config.relationMode`、`config.displayField`、`config.visibleFields`。 |
352
+ | **`relation`** | 旧载荷使用 `target_app_key` / `target_app_ref`;当前 AppForm 使用 `config.targetAppKey`、`config.relationMode`、`config.twoWayBoundField`、`config.displayFields[]`。 |
353
353
  | **`subtable`** | 当前 AppForm 使用 `subfields[]` 及 Schema 返回的 camelCase 配置;旧 `subfield_updates` 只作迁移线索。 |
354
354
  | **`q_linker`** | 当前 AppForm 使用 `config.qLinkerBinding`,其 `outputs[].targetField` 必须按字段 Schema 配置。 |
355
355
  | **`code_block`** | 当前 AppForm 使用 `config.codeBlockBinding`,其 `outputs[].targetField` 必须按字段 Schema 配置。 |
@@ -27,14 +27,22 @@ n1 → n2 → g1 ──┤
27
27
  ```
28
28
 
29
29
  **关键点**:
30
- - 分支起点必须是 `gateway`(`mode: parallel`),终点必须是 `gateway`(`mode: join`)
31
- - 每条分支边都需要配置 `condition`,其中至少一条为 `kind: rules` 带 `autoJudges`
32
- - 没有条件的边使用 `kind: default` 作为兜底
33
- - 所有分支并行进入,条件只决定分支内逻辑是否执行,不存在"条件匹配就跳过其他分支"的互斥语义
30
+ - 分支起点必须是 `gateway`(`mode: parallel`);需要汇合时使用 `gateway`(`mode: join`)。
31
+ - join 必须有至少 2 条入边、恰好 1 条出边。`GET` 根据 legacy 路径终点共享目标的拓扑合成 `id=join_<目标id>`;`apply` 将其折叠回拓扑,不生成独立 legacy 节点。
32
+ - join 出边目标节点的 `sync` 表达等待语义;并行路径汇合通常应设 `sync: true`,写面按 spec 原值保真。
33
+ - join 的 `name` / `role` / `enabled` / `sync` 不持久化;规范值为 `name: "Join"`, `enabled: true`, `sync: false`。
34
+ - 每条分支边都需要配置 `condition`,其中至少一条为 `kind: rules` 带 `autoJudges`。
35
+ - 没有条件的边使用 `kind: default` 作为兜底。
36
+ - 所有分支并行进入,条件只决定分支内逻辑是否执行,不存在"条件匹配就跳过其他分支"的互斥语义。
34
37
 
35
38
  ## 循环/回退
36
39
 
37
- **轻流工作流引擎不支持循环结构**。不要通过 gateway 或其他方式构建回到前序节点的环。
40
+ **轻流工作流引擎的环判定口径**(与后端 apply 校验一致):
41
+
42
+ - **禁止自环**:任何节点不得有指向自身的边(A→A),会被后端 `INVALID_FLOW_TOPOLOGY`(G2)拒绝。
43
+ - **无根纯环拒绝**:不经 gateway 的纯环(如 A→B→A)映射后无根节点,被 G1 拒绝。
44
+ - **经 gateway 回指的驳回环合法**:approval→gateway→approval 形态(分叉回退边)是引擎合法形态,离线与后端均不做通用 DAG 无环检查。
45
+ - **单节点流程合法**:仅 applicant 节点 + 空边(`edges.edges=[]`)是新建表单的自然形态,提交即结束。
38
46
 
39
47
  如需回退到前序节点重新处理,应使用审批节点的回退开关:
40
48
 
@@ -17,13 +17,15 @@ python3 scripts/workflow/validate_flow_spec.py \
17
17
  ## 验证内容
18
18
 
19
19
  1. JSON Schema 结构校验(基于 `qingflow builder flow schema` 的官方 schema)
20
- 2. DAG 无环检查
20
+ 2. 边结构检查:边端点存在于 nodes、禁止自环(与后端 G2/G4 口径镜像;经 gateway 回指的驳回环合法,不做通用无环检查)
21
21
  3. 单 applicant 节点检查
22
22
  4. Gateway 出边条件完整性检查(rules 边必须有 autoJudges)
23
- 5. 审批/填写/抄送节点必要字段检查
23
+ 5. 审批/填写/抄送节点必要字段检查(含 responsible/receivers 非空)
24
24
  6. 自动化节点配置检查
25
25
  7. 孤立节点检查
26
- 8. 入口节点和需要继续路由的节点显式 `sync: true`
26
+ 8. 入口节点和需要继续路由的节点显式 `sync: true`(单节点流程——仅 applicant 无出边——合法,降为警告:提交即结束)
27
+
28
+ 注:单节点流程(仅 applicant + 空边数组)是新建表单的自然形态,结构与语义检查均放行;多节点流程要求 edges 非空。
27
29
 
28
30
  ## 验证不通过时的处理
29
31
 
@@ -26,7 +26,7 @@ qingflow --json builder flow apply \
26
26
 
27
27
  - `status: success` → 进入验证
28
28
  - `status: failed` → 查看 `error_code` / `message` / `blocking_issues`,修正后重试
29
- - `missing_input_node_ids` 警告(新建时常见)→ 可忽略,是正常现象
29
+ - `status: partial_success` + `MISSING_INPUT_NODE` 警告(新建时常见,`missing_input_node_ids` 非空)→ 属预期:首次 apply 节点 id 由后端重分配,**不要忽略**,执行 5.2 的 `builder flow get` 回读确认节点已落库后即可继续
30
30
  - 成功写入应读取 `write_executed=true`、`write_succeeded=true`、`safe_to_retry=false`;不要因中间读回 pending 立刻重放。
31
31
 
32
32
  ## 5.2 验证部署结果
@@ -6,7 +6,7 @@
6
6
  |------|------|------|
7
7
  | `autoJudges` apply 后为空 | 使用了一维数组 `[{...}]` 格式 | 改为二维 `[[{...}]]` |
8
8
  | 条件分支不生效 | `autoJudges` 中的 `values` 与表单选项 label 不一致 | 核对字段选项文本,确保完全一致 |
9
- | apply 返回 `missing_input_node_ids` | 新建 flow 首次 apply 的正常提示 | 可忽略,再次 get 验证即可 |
9
+ | apply 返回 `partial_success` + `MISSING_INPUT_NODE`(`missing_input_node_ids` 非空) | 提交节点未出现在 appliedSpec:新建 flow 首次 apply 节点 id 会被后端重分配,属预期 | **不要忽略**;`builder flow get` 回读 spec 确认节点已落库(拓扑完整)即可视为成功,无需重试 |
10
10
  | 录入数据后只留下“提交申请”日志,不进入下一节点 | WorkflowSpec 入口节点没有出边,或入口/路由节点缺少 `sync: true` | `builder flow get` 读回 spec,确认 applicant 出边和节点 `sync`,修正后用 `--spec-file` 发布 |
11
11
  | 回退边(gateway → 前序节点)不生效 | 引擎不支持通过 gateway 实现回退 | 改用审批节点 `revert: true` |
12
12
  | 审批节点无审批人 | `responsible` 中的 UID/角色 ID 无效或缺失 | 使用 `builder member search` / `role search` 确认 |