@josephyan/qingflow-app-user-mcp 1.1.4 → 1.1.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 +7 -7
- package/docs/local-agent-install.md +57 -6
- package/entry_point.py +1 -1
- package/npm/bin/qingflow-app-user-mcp.mjs +2 -33
- package/npm/bin/qingflow-skills.mjs +5 -0
- package/npm/lib/runtime.mjs +21 -101
- package/npm/scripts/postinstall.mjs +1 -10
- package/package.json +3 -2
- package/pyproject.toml +1 -1
- package/skills/qingflow-app-user/SKILL.md +17 -14
- package/skills/qingflow-app-user/references/data-gotchas.md +2 -2
- package/skills/qingflow-app-user/references/public-surface-sync.md +3 -3
- package/skills/qingflow-app-user/references/record-patterns.md +5 -5
- package/skills/qingflow-app-user/references/workflow-usage.md +4 -5
- package/skills/qingflow-mcp-setup/SKILL.md +13 -9
- package/skills/qingflow-mcp-setup/references/claude-desktop.md +1 -1
- package/skills/qingflow-mcp-setup/references/environments.md +2 -1
- package/skills/qingflow-mcp-setup/references/generic-stdio.md +6 -5
- package/skills/qingflow-record-analysis/SKILL.md +9 -8
- package/skills/qingflow-record-analysis/manifest.yaml +10 -0
- package/skills/qingflow-record-delete/SKILL.md +7 -3
- package/skills/qingflow-record-import/SKILL.md +35 -2
- package/skills/qingflow-record-insert/SKILL.md +78 -6
- package/skills/qingflow-record-insert/manifest.yaml +6 -0
- package/skills/qingflow-record-update/SKILL.md +39 -24
- package/skills/qingflow-task-ops/SKILL.md +30 -27
- package/skills/qingflow-task-ops/references/environments.md +0 -1
- package/skills/qingflow-task-ops/references/workflow-usage.md +4 -6
- package/src/qingflow_mcp/__init__.py +1 -1
- package/src/qingflow_mcp/__main__.py +6 -2
- package/src/qingflow_mcp/builder_facade/models.py +282 -102
- package/src/qingflow_mcp/builder_facade/service.py +4166 -929
- package/src/qingflow_mcp/cli/commands/builder.py +316 -298
- package/src/qingflow_mcp/cli/commands/chart.py +1 -1
- package/src/qingflow_mcp/cli/commands/common.py +12 -3
- package/src/qingflow_mcp/cli/commands/exports.py +2 -2
- package/src/qingflow_mcp/cli/commands/imports.py +3 -3
- package/src/qingflow_mcp/cli/commands/portal.py +2 -2
- package/src/qingflow_mcp/cli/commands/record.py +101 -27
- package/src/qingflow_mcp/cli/commands/task.py +28 -47
- package/src/qingflow_mcp/cli/commands/view.py +1 -1
- package/src/qingflow_mcp/cli/context.py +0 -3
- package/src/qingflow_mcp/cli/formatters.py +784 -16
- package/src/qingflow_mcp/cli/main.py +117 -33
- package/src/qingflow_mcp/errors.py +43 -2
- package/src/qingflow_mcp/public_surface.py +26 -17
- package/src/qingflow_mcp/response_trim.py +81 -17
- package/src/qingflow_mcp/server.py +14 -12
- package/src/qingflow_mcp/server_app_builder.py +65 -21
- package/src/qingflow_mcp/server_app_user.py +22 -16
- package/src/qingflow_mcp/session_store.py +11 -7
- package/src/qingflow_mcp/solution/compiler/__init__.py +3 -1
- package/src/qingflow_mcp/solution/compiler/workflow_compiler.py +173 -0
- package/src/qingflow_mcp/solution/executor.py +245 -18
- package/src/qingflow_mcp/tools/ai_builder_tools.py +1780 -406
- package/src/qingflow_mcp/tools/app_tools.py +184 -43
- package/src/qingflow_mcp/tools/approval_tools.py +197 -35
- package/src/qingflow_mcp/tools/auth_tools.py +92 -16
- package/src/qingflow_mcp/tools/code_block_tools.py +298 -40
- package/src/qingflow_mcp/tools/custom_button_tools.py +64 -10
- package/src/qingflow_mcp/tools/directory_tools.py +236 -72
- package/src/qingflow_mcp/tools/export_tools.py +244 -34
- package/src/qingflow_mcp/tools/feedback_tools.py +9 -0
- package/src/qingflow_mcp/tools/file_tools.py +9 -3
- package/src/qingflow_mcp/tools/import_tools.py +336 -49
- package/src/qingflow_mcp/tools/navigation_tools.py +91 -12
- package/src/qingflow_mcp/tools/package_tools.py +118 -6
- package/src/qingflow_mcp/tools/portal_tools.py +39 -3
- package/src/qingflow_mcp/tools/qingbi_report_tools.py +116 -7
- package/src/qingflow_mcp/tools/record_tools.py +1141 -356
- package/src/qingflow_mcp/tools/resource_read_tools.py +188 -39
- package/src/qingflow_mcp/tools/role_tools.py +80 -9
- package/src/qingflow_mcp/tools/solution_tools.py +59 -45
- package/src/qingflow_mcp/tools/task_context_tools.py +662 -158
- package/src/qingflow_mcp/tools/task_tools.py +113 -29
- package/src/qingflow_mcp/tools/view_tools.py +106 -3
- package/src/qingflow_mcp/tools/workflow_tools.py +48 -4
- package/src/qingflow_mcp/tools/workspace_tools.py +71 -3
- package/skills/qingflow-app-builder/SKILL.md +0 -277
- package/skills/qingflow-app-builder/agents/openai.yaml +0 -4
- package/skills/qingflow-app-builder/references/build-complete-system.md +0 -428
- package/skills/qingflow-app-builder/references/build-single-app.md +0 -530
- package/skills/qingflow-app-builder/references/create-app.md +0 -149
- package/skills/qingflow-app-builder/references/environments.md +0 -63
- package/skills/qingflow-app-builder/references/flow-actors-and-permissions.md +0 -123
- package/skills/qingflow-app-builder/references/gotchas.md +0 -108
- package/skills/qingflow-app-builder/references/match-rules.md +0 -114
- package/skills/qingflow-app-builder/references/public-surface-sync.md +0 -75
- package/skills/qingflow-app-builder/references/solution-playbooks.md +0 -52
- package/skills/qingflow-app-builder/references/tool-selection.md +0 -107
- package/skills/qingflow-app-builder/references/update-flow.md +0 -186
- package/skills/qingflow-app-builder/references/update-layout.md +0 -68
- package/skills/qingflow-app-builder/references/update-schema.md +0 -72
- package/skills/qingflow-app-builder/references/update-views.md +0 -291
- package/skills/qingflow-app-builder-code-integrations/SKILL.md +0 -137
- package/skills/qingflow-app-builder-code-integrations/agents/openai.yaml +0 -4
- package/skills/qingflow-app-builder-code-integrations/references/code-block.md +0 -66
- package/skills/qingflow-app-builder-code-integrations/references/q-linker.md +0 -77
- package/skills/qingflow-workflow-builder/SKILL.md +0 -96
- package/skills/qingflow-workflow-builder/manifest.yaml +0 -8
- package/skills/qingflow-workflow-builder/references/01-overview.md +0 -45
- package/skills/qingflow-workflow-builder/references/02-update-mode.md +0 -53
- package/skills/qingflow-workflow-builder/references/03-flow-patterns.md +0 -57
- package/skills/qingflow-workflow-builder/references/04-stage1-business-modeling.md +0 -131
- package/skills/qingflow-workflow-builder/references/05-stage2-members-roles.md +0 -29
- package/skills/qingflow-workflow-builder/references/06-stage3-build-spec.md +0 -165
- package/skills/qingflow-workflow-builder/references/07-stage4-validate-spec.md +0 -33
- package/skills/qingflow-workflow-builder/references/08-stage5-apply-verify.md +0 -51
- package/skills/qingflow-workflow-builder/references/09-stage6-summary.md +0 -88
- package/skills/qingflow-workflow-builder/references/10-node-config-reference.md +0 -93
- package/skills/qingflow-workflow-builder/references/11-troubleshooting.md +0 -15
- package/skills/qingflow-workflow-builder/scripts/diff_flow_spec.py +0 -275
- package/skills/qingflow-workflow-builder/scripts/validate_flow_spec.py +0 -605
|
@@ -31,4 +31,4 @@ Keep separate snippets for `test` and `prod` so switching environments does not
|
|
|
31
31
|
- Replace `<ABSOLUTE_PATH_TO_REPO>` with the real checkout path on the current machine
|
|
32
32
|
- If the server path changes, update the `command` field
|
|
33
33
|
- The server is local stdio MCP, so no remote URL is required
|
|
34
|
-
- Do not store Qingflow
|
|
34
|
+
- Do not store Qingflow credentials in Claude Desktop config; pass the createClaw credential through `auth_use_credential` inside the chat, or use `auth_login` when credential exchange is unavailable
|
|
@@ -28,7 +28,8 @@ Known values in the current workspace:
|
|
|
28
28
|
Setup behavior:
|
|
29
29
|
|
|
30
30
|
- prefer this environment for Claude Desktop or local MCP client onboarding
|
|
31
|
-
- use
|
|
31
|
+
- for Wingent Momo runtime, use the injected session and skip auth/workspace preflight
|
|
32
|
+
- for standalone MCP client setup, use `auth_use_credential` or `auth_login`, then `workspace_list`, then `workspace_select`
|
|
32
33
|
- if the user asks to verify installation, a real read-only smoke path is acceptable
|
|
33
34
|
|
|
34
35
|
## Production Environment
|
|
@@ -19,13 +19,14 @@ Keep separate client entries or separate config snippets for `test` and `prod`.
|
|
|
19
19
|
|
|
20
20
|
1. Start the client
|
|
21
21
|
2. Confirm the `qingflow` MCP server is visible
|
|
22
|
-
3.
|
|
23
|
-
4.
|
|
24
|
-
5.
|
|
25
|
-
6.
|
|
22
|
+
3. In Wingent Momo runtime, skip auth/workspace preflight and run a read-only tool such as `app_list`
|
|
23
|
+
4. In a standalone client without injected credentials, run `auth_use_credential` or `auth_login`
|
|
24
|
+
5. Then run `workspace_list`
|
|
25
|
+
6. Then run `workspace_select`
|
|
26
|
+
7. Run a read-only tool such as `app_list`
|
|
26
27
|
|
|
27
28
|
## Common failures
|
|
28
29
|
|
|
29
30
|
- Launch failure: bad `command` path or missing `.venv`
|
|
30
|
-
- Auth failure: invalid or expired token
|
|
31
|
+
- Auth failure: invalid or expired credential/token
|
|
31
32
|
- Business tool failure before setup: workspace not selected
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qingflow-record-analysis
|
|
3
|
-
description: Analyze Qingflow record data safely
|
|
3
|
+
description: Analyze Qingflow record data safely. Use when the user wants grouped distributions, ratios, averages, rankings, trends, insights, comparisons, or any final statistical conclusion across an existing app's data. Default to schema-first record_access CSV retrieval plus local Python/pandas; do not use export tools unless the user explicitly asks for a file download.
|
|
4
4
|
metadata:
|
|
5
5
|
short-description: Analyze Qingflow record data with record_access CSV and Python
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Qingflow Record Analysis
|
|
9
9
|
|
|
10
|
+
> **Skill 版本**:`qingflow-skills-2026.06.24.2`(入口文档版本;如需确认 CLI 包版本,使用 `qingflow --version` 或 `qingflow --json version`)。
|
|
11
|
+
|
|
10
12
|
Use this skill only for final statistical conclusions: counts, distributions, ratios, averages, rankings, trends, comparisons, and analysis reports.
|
|
11
13
|
|
|
12
14
|
Default path, every time:
|
|
@@ -20,7 +22,7 @@ app_get -> record_browse_schema_get(view_id=...) -> record_access -> Python/pand
|
|
|
20
22
|
```bash
|
|
21
23
|
qingflow record --help
|
|
22
24
|
qingflow record access --help
|
|
23
|
-
qingflow record access --app-key APP_KEY --view-id VIEW_ID --columns-file columns.json --where-file where.json --order-by-file order_by.json
|
|
25
|
+
qingflow --json record access --app-key APP_KEY --view-id VIEW_ID --columns-file columns.json --where-file where.json --order-by-file order_by.json
|
|
24
26
|
```
|
|
25
27
|
|
|
26
28
|
The CLI command is under the `record` command group, so the discovery path is: first inspect `qingflow record --help`, then inspect `qingflow record access --help`.
|
|
@@ -37,10 +39,10 @@ The CLI command is under the `record` command group, so the discovery path is: f
|
|
|
37
39
|
- Before final analysis, run a field-quality profile in pandas: row count, null rate, distinct count, and period coverage for candidate grouping fields.
|
|
38
40
|
- Do not use a high-missing field as the main conclusion dimension. If a candidate dimension is sparse, downgrade it to an `已填写样本观察` and choose a cleaner semantic fallback when available.
|
|
39
41
|
- Full final conclusions require `record_access.complete=true` and `record_access.safe_for_final_conclusion=true`.
|
|
40
|
-
- `record_list` is only for sample inspection after the aggregate result is understood.
|
|
42
|
+
- `record_list` is only for sample inspection after the aggregate result is understood; its `data.items[]` rows are flat field-title keyed objects, not nested `fields[]`.
|
|
41
43
|
- `record_get` is only for single-record detail verification, logs, references, images, or readable attachments. Read images from `media_assets.items[].local_path`; read documents/tables from `file_assets.items[].local_path` and `extraction.text_path`.
|
|
42
44
|
- `record_export_direct` is only for explicit export/download/Excel requests.
|
|
43
|
-
- `chart_get` / QingBI is only for user-provided report URLs or chart ids.
|
|
45
|
+
- `chart_get` / QingBI is only for user-provided report URLs or chart ids. If it reports `CHART_BASE_INFO_UNAVAILABLE` but `chart_data_loaded=true`, treat the chart data as readable and only the metadata/base info as degraded.
|
|
44
46
|
|
|
45
47
|
## Tool Selection
|
|
46
48
|
|
|
@@ -49,7 +51,7 @@ The CLI command is under the `record` command group, so the discovery path is: f
|
|
|
49
51
|
| Batch analysis, statistics, comparison, report | `record_access -> Python` |
|
|
50
52
|
| Browse a few example rows | `record_list` |
|
|
51
53
|
| Inspect one record, logs, references, images, attachments | `record_get` |
|
|
52
|
-
| User asks to export/download/Excel | `record_export_direct` |
|
|
54
|
+
| User asks to export/download/Excel | `record_export_direct` with explicit `view_id` |
|
|
53
55
|
| User gives report URL or chart id | `chart_get` |
|
|
54
56
|
| Todo/workflow task actions | `$qingflow-task-ops` |
|
|
55
57
|
|
|
@@ -84,13 +86,12 @@ CSV columns are already readable and field-id anchored, for example `项目状
|
|
|
84
86
|
For CLI use, write JSON argument files instead of embedding large JSON in shell text:
|
|
85
87
|
|
|
86
88
|
```bash
|
|
87
|
-
qingflow record access \
|
|
89
|
+
qingflow --json record access \
|
|
88
90
|
--app-key APP_KEY \
|
|
89
91
|
--view-id system:all \
|
|
90
92
|
--columns-file columns.json \
|
|
91
93
|
--where-file where.json \
|
|
92
|
-
--order-by-file order_by.json
|
|
93
|
-
--json
|
|
94
|
+
--order-by-file order_by.json
|
|
94
95
|
```
|
|
95
96
|
|
|
96
97
|
## Status Handling
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
identity: qingflow-record-analysis
|
|
2
|
+
type: skill
|
|
3
|
+
description: Analyze Qingflow record data safely. Use when the user wants grouped distributions, ratios, averages, rankings, trends, insights, comparisons, or any final statistical conclusion across an existing app's data. Default to schema-first record_access CSV retrieval plus local Python/pandas; do not use export tools unless the user explicitly asks for a file download.
|
|
4
|
+
tags:
|
|
5
|
+
- cli
|
|
6
|
+
- qingflow
|
|
7
|
+
- task-management
|
|
8
|
+
- data-analysis
|
|
9
|
+
- security
|
|
10
|
+
- validated
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qingflow-record-delete
|
|
3
|
-
description: Delete Qingflow records safely
|
|
3
|
+
description: Delete Qingflow records safely using the current Wingent Momo runtime MCP session; recover auth/workspace only after a tool error.
|
|
4
4
|
metadata:
|
|
5
5
|
short-description: Qingflow record delete
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Qingflow Record Delete
|
|
9
9
|
|
|
10
|
+
> **Skill 版本**:`qingflow-skills-2026.06.24.2`(入口文档版本;如需确认 CLI 包版本,使用 `qingflow --version` 或 `qingflow --json version`)。
|
|
11
|
+
|
|
10
12
|
## Default Path
|
|
11
13
|
|
|
12
14
|
`record_list / record_get -> record_delete`
|
|
@@ -21,9 +23,11 @@ metadata:
|
|
|
21
23
|
|
|
22
24
|
1. Resolve the exact target `record_id` first
|
|
23
25
|
2. Prefer reading the current state before delete when the request is high risk
|
|
24
|
-
3.
|
|
26
|
+
3. Choose an accessible system `view_id` from `app_get.accessible_views`; custom views can locate records but cannot be used as the delete route
|
|
27
|
+
4. Call `record_delete` with `record_id` or `record_ids` and the system `view_id` so the backend uses the matching listType delete route
|
|
25
28
|
|
|
26
29
|
## Do Not
|
|
27
30
|
|
|
28
|
-
- Do not pass
|
|
31
|
+
- Do not pass `custom:*` view selectors to `record_delete`; custom views can locate records, but delete currently supports only system listType routes
|
|
32
|
+
- Do not omit `view_id`; a delete without frontend list context is ambiguous and should return `RECORD_DELETE_VIEW_REQUIRED`
|
|
29
33
|
- Do not infer the target record id from a vague title if `record_list` can disambiguate it
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qingflow-record-import
|
|
3
|
-
description: Explain and operate Qingflow file-based bulk import
|
|
3
|
+
description: Explain and operate Qingflow file-based bulk import using the current Wingent Momo runtime MCP session; recover auth/workspace only after a tool error.
|
|
4
4
|
metadata:
|
|
5
5
|
short-description: Qingflow bulk import workflow and troubleshooting
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Qingflow Record Import
|
|
9
9
|
|
|
10
|
+
> **Skill 版本**:`qingflow-skills-2026.06.24.2`(入口文档版本;如需确认 CLI 包版本,使用 `qingflow --version` 或 `qingflow --json version`)。
|
|
11
|
+
|
|
10
12
|
## Default Path
|
|
11
13
|
|
|
12
14
|
`app_get -> record_import_schema_get -> record_import_template_get -> record_import_verify -> (optional authorized repair) -> record_import_start -> record_import_status_get`
|
|
@@ -21,6 +23,33 @@ metadata:
|
|
|
21
23
|
- `record_import_start`
|
|
22
24
|
- `record_import_status_get`
|
|
23
25
|
|
|
26
|
+
## File Shape And Field Mapping
|
|
27
|
+
|
|
28
|
+
- Official template headers are the target contract. Do not rename them in the import file.
|
|
29
|
+
- CSV can be used as a source format for planning or local transformation, but the current verify/start path expects the official Excel template (`.xlsx` / `.xls`).
|
|
30
|
+
- When the user gives CSV-like data, map each source column to the official template header first, then write the mapped rows into a copy of the template after explicit user authorization.
|
|
31
|
+
- Relation fields: prefer stable target `record_id` or another unique searchable value already accepted by the import schema. Do not rely on duplicated display names.
|
|
32
|
+
- Member / department fields: use values inside the schema/candidate scope; do not invent departments or names that are not resolvable.
|
|
33
|
+
- Select fields: use option labels from the schema/template; option ids are acceptable only when the import schema or prior readback proves they are supported.
|
|
34
|
+
|
|
35
|
+
Example source CSV for planning only:
|
|
36
|
+
|
|
37
|
+
```csv
|
|
38
|
+
客户名称,关联客户,状态,负责人
|
|
39
|
+
上海示例客户,CUST_RECORD_ID_001,有效,张三
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Mapped template row concept:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"客户名称": "上海示例客户",
|
|
47
|
+
"关联客户": "CUST_RECORD_ID_001",
|
|
48
|
+
"状态": "有效",
|
|
49
|
+
"负责人": "张三"
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
24
53
|
## Working Rules
|
|
25
54
|
|
|
26
55
|
1. Inspect `app_get.data.import_capability` first
|
|
@@ -28,4 +57,8 @@ metadata:
|
|
|
28
57
|
3. Keep official headers unchanged
|
|
29
58
|
4. Verify before start
|
|
30
59
|
5. Only repair a file after explicit user authorization
|
|
31
|
-
6.
|
|
60
|
+
6. After success, report the import status and tracking identifiers; read back one imported sample only when the user asks for row-level confirmation or when the import result does not already prove completion
|
|
61
|
+
|
|
62
|
+
## Template Fallback
|
|
63
|
+
|
|
64
|
+
`record_import_template_get` may return `status: partial_success` with a locally generated applicant template when the official template endpoint is permission-restricted but applicant fields are readable. If the warning is `IMPORT_TEMPLATE_LOCAL_FALLBACK_AUTH_UNKNOWN` or `verification.import_auth_prechecked` is false, treat the result only as "template file prepared"; actual import permission is still decided by `record_import_verify` and `record_import_start`.
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qingflow-record-insert
|
|
3
|
-
description: Create Qingflow records with a schema-first insert workflow
|
|
3
|
+
description: Create Qingflow records with a schema-first insert workflow.
|
|
4
4
|
metadata:
|
|
5
5
|
short-description: Schema-first Qingflow record insert
|
|
6
|
+
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
# Qingflow Record Insert
|
|
9
10
|
|
|
11
|
+
> **Skill 版本**:`qingflow-skills-2026.06.24.2`(入口文档版本;如需确认 CLI 包版本,使用 `qingflow --version` 或 `qingflow --json version`)。
|
|
12
|
+
|
|
10
13
|
## Default Path
|
|
11
14
|
|
|
12
15
|
`record_insert_schema_get -> record_insert(items) -> optional record_get/readback`
|
|
@@ -21,10 +24,67 @@ Default to batch-shaped insert. A single new record is `items` with one row.
|
|
|
21
24
|
- `record_department_candidates`
|
|
22
25
|
- `file_upload_local`
|
|
23
26
|
|
|
27
|
+
## Special Field Write Cheatsheet
|
|
28
|
+
|
|
29
|
+
Always read the insert schema first, then use field titles as `items[].fields` keys. For special fields:
|
|
30
|
+
|
|
31
|
+
- `member`: write a unique name, email, or resolved member id. If candidates are duplicated or the tool returns `needs_confirmation`, stop and surface candidates.
|
|
32
|
+
- `department`: do not invent department names. Use a value inside the schema/candidate scope: unique department name, returned id/key, or returned object shape such as `{"key":"DEPT_ID","label":"部门名"}` / `{"id":"DEPT_ID","value":"部门名"}`.
|
|
33
|
+
- `relation`: known target record id is most stable for batch inserts. Natural display text is allowed only when it uniquely resolves through the field's `searchable_fields`; duplicates require confirmation.
|
|
34
|
+
- `single_select` / `multi_select`: option label and option id are both acceptable when present in schema/options. Prefer labels for readability; let the tool compile to the path-specific value.
|
|
35
|
+
- `attachment`: upload the local file first with `file_upload_local`, then write the returned file value. Do not write only a filename or arbitrary URL.
|
|
36
|
+
- System fields are read-only: `数据ID`, `编号`, `申请人`, `申请时间`, `创建人`, `创建时间`, `提交人`, `提交时间`, `更新时间`, `更新人`, `当前流程状态`, `当前处理人`, `当前处理节点`, `流程标题`.
|
|
37
|
+
|
|
38
|
+
## Failure Repair Contract
|
|
39
|
+
|
|
40
|
+
When insert returns `blocked`, `partial_success`, or `needs_confirmation`, do not retry the whole batch blindly.
|
|
41
|
+
|
|
42
|
+
- Read `items[].failed_fields[]` first.
|
|
43
|
+
- Each failed field exposes `error_code`, `expected_format`, `example_value`, and `next_action`.
|
|
44
|
+
- For `member`, `department`, `relation`, `attachment`, and `select` fields, `next_action` is field-type specific: candidate lookup, upload first, use record/apply id, or use schema option label/id.
|
|
45
|
+
- Retry only the failed `row_number` with corrected values. If any row has `write_executed=true` or `created_record_ids` is non-empty, never replay the original batch.
|
|
46
|
+
|
|
47
|
+
## Candidate Lookup
|
|
48
|
+
|
|
49
|
+
Do not pre-query member or department ids by default. Use candidate commands only when:
|
|
50
|
+
|
|
51
|
+
- the user explicitly asks to see candidates
|
|
52
|
+
- insert returns `needs_confirmation`
|
|
53
|
+
- member / department names are likely duplicated
|
|
54
|
+
- a natural value is outside the field's candidate scope
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
qingflow --json record member-candidates \
|
|
58
|
+
--app-key APP_KEY \
|
|
59
|
+
--field-id FIELD_ID \
|
|
60
|
+
--keyword "张三"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
qingflow --json record department-candidates \
|
|
65
|
+
--app-key APP_KEY \
|
|
66
|
+
--field-id FIELD_ID \
|
|
67
|
+
--keyword "直销部"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
If the candidate scope must match an existing runtime context, pass the current record or pending fields:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
qingflow --json record member-candidates \
|
|
74
|
+
--app-key APP_KEY \
|
|
75
|
+
--field-id FIELD_ID \
|
|
76
|
+
--record-id RECORD_ID \
|
|
77
|
+
--workflow-node-id WORKFLOW_NODE_ID \
|
|
78
|
+
--fields-file pending_fields.json \
|
|
79
|
+
--keyword "张三"
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Without `record_id` / `workflow_node_id` / `fields-file`, the result is a static applicant-node preview. It is useful for explicit browsing, but not proof that every candidate is valid in a later workflow-specific write.
|
|
83
|
+
|
|
24
84
|
## Working Rules
|
|
25
85
|
|
|
26
86
|
1. Start with `record_insert_schema_get`
|
|
27
|
-
2. Read `required_fields`, `optional_fields`, `runtime_linked_required_fields`, and `
|
|
87
|
+
2. Read `required_fields`, `optional_fields`, `runtime_linked_required_fields`, `payload_template`, field-level `expected_format`, `example_value`, and `options`
|
|
28
88
|
3. Inside every field bucket, read field-level `linkage` first when present; it is the canonical static hint for linked visibility, reference-driven auto fill, or formula-driven fields
|
|
29
89
|
4. Inside `optional_fields`, pay special attention to any field with `may_become_required=true`; these are writable fields that can become required when linked visibility or option-driven rules activate
|
|
30
90
|
5. Build `items` as `[{"fields": {...}}]`, where each `fields` map uses field titles from the insert schema
|
|
@@ -32,15 +92,18 @@ Default to batch-shaped insert. A single new record is `items` with one row.
|
|
|
32
92
|
7. For `linkage.kind=logic_visibility`, read `sources` as upstream trigger fields and treat `role=manual_input_after_activation` as "fill this only after the upstream condition is satisfied"
|
|
33
93
|
8. For `linkage.kind=reference_fill`, prefer filling the source field first; treat target fields with `role=auto_fill_preferred` or `auto_fill_only` as reference-driven outputs rather than blind manual inputs
|
|
34
94
|
9. For `linkage.kind=formula_fill`, treat the field as formula/default-auto-fill driven unless the user explicitly asks to override it and the field is still writable
|
|
35
|
-
10. If insert succeeds and single-record detail/readback matters, prefer `record_get`; use `
|
|
95
|
+
10. If insert succeeds and single-record detail/readback matters, prefer `record_get`; for batch verification, rely on returned `created_record_ids` first, then use `record_get` for selected rows or `record_access -> Python` when a row-shaped bulk check is truly needed
|
|
36
96
|
11. Keep subtable payloads under the parent field as a row array
|
|
37
|
-
12.
|
|
97
|
+
12. Follow the Special Field Write Cheatsheet for member, department, relation, select, and attachment values; do not pre-query ids by default when a natural value is unique enough
|
|
38
98
|
13. If the write returns `status="needs_confirmation"`, stop and surface the candidates
|
|
39
99
|
14. Retry failed rows only with explicit ids / objects after the user confirms
|
|
40
100
|
15. Keep `verify_write=true` for production inserts
|
|
41
|
-
16. If post-write detail context matters, read `record_get.fields[]`, `media_assets.items[].local_path`, `file_assets.items[].local_path`, `file_assets.items[].extraction.text_path`, and `semantic_context`; `record_get` follows the frontend storage cookie redirect path for Qingflow attachments, so prefer local paths over remote URLs and do not expect legacy
|
|
101
|
+
16. If post-write detail context matters, read `record_get.fields[]`, `media_assets.items[].local_path`, `file_assets.items[].local_path`, `file_assets.items[].extraction.text_path`, and `semantic_context`; `record_get` follows the frontend storage cookie redirect path for Qingflow attachments, so prefer local paths over remote URLs and do not expect legacy flat record shapes
|
|
42
102
|
17. Treat nested schema shape as guidance, not a brittle contract; do not hard-code transient implementation details like optional nested `field_id` shape when composing inserts
|
|
43
103
|
18. For `partial_success`, read `created_record_ids`, then repair only the failed `items[].row_number` using `failed_fields`; never retry the whole batch after any row has `write_executed=true`
|
|
104
|
+
19. Do not put Qingflow system fields in `fields`: `数据ID`, `编号`, `申请人`, `申请时间`, `创建人`, `创建时间`, `提交人`, `提交时间`, `更新时间`, `更新人`, `当前流程状态`, `当前处理人`, `当前处理节点`, `流程标题`. They are generated by the platform and can be read after creation, not manually inserted.
|
|
105
|
+
20. When the user asks to add sample records after system setup, still generate values from schema: required fields first, select values from `options`, scalar/date/amount values from `expected_format` and `example_value`; do not invent values outside the insert schema.
|
|
106
|
+
21. For ratio, completion-rate, score, and percentage-like fields, obey the schema's `expected_format/example_value`. If the field was modeled as money/amount or otherwise only accepts integers, do not invent decimal percentages; either use an integer value that matches the schema or report that the field should be modeled as `number` for decimal ratios.
|
|
44
107
|
|
|
45
108
|
## Field Notes
|
|
46
109
|
|
|
@@ -58,10 +121,16 @@ Default to batch-shaped insert. A single new record is `items` with one row.
|
|
|
58
121
|
|
|
59
122
|
## CLI Pattern
|
|
60
123
|
|
|
124
|
+
CLI fallback for the schema step:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
qingflow --json record schema insert --app-key APP_KEY > tmp/qingflow_insert_schema.json
|
|
128
|
+
```
|
|
129
|
+
|
|
61
130
|
Use a JSON array file:
|
|
62
131
|
|
|
63
132
|
```bash
|
|
64
|
-
qingflow record insert --app-key APP_KEY --items-file records.json
|
|
133
|
+
qingflow --json record insert --app-key APP_KEY --items-file records.json
|
|
65
134
|
```
|
|
66
135
|
|
|
67
136
|
`records.json`:
|
|
@@ -76,7 +145,10 @@ qingflow record insert --app-key APP_KEY --items-file records.json --json
|
|
|
76
145
|
|
|
77
146
|
- Do not skip `record_insert_schema_get`
|
|
78
147
|
- Do not invent missing required fields
|
|
148
|
+
- Do not fill platform system fields such as `数据ID`, `编号`, `申请人`, `创建时间`, or `更新时间`
|
|
79
149
|
- Do not flatten subtable leaf fields to the top level
|
|
150
|
+
- Do not invent member / department / relation candidates outside schema or candidate scope
|
|
151
|
+
- Do not invent select option labels outside schema `options`
|
|
80
152
|
- Do not pre-query or silently guess member / department / relation ids when a natural string is enough
|
|
81
153
|
- Do not retry a whole batch after `created_record_ids` is non-empty
|
|
82
154
|
- Do not bind logic to a transient nested schema serialization detail when the field title and parent table already identify the legal payload shape
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
identity: qingflow-record-insert
|
|
2
|
+
type: skill
|
|
3
|
+
description: Create Qingflow records. Default to record_insert_schema_get -> record_insert(items); one row is still an items array. Member, department, and relation fields prefer natural language, and failures are recovered from created_record_ids plus failed_fields.
|
|
4
|
+
tags:
|
|
5
|
+
- cli
|
|
6
|
+
- qingflow
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qingflow-record-update
|
|
3
|
-
description: Update Qingflow records
|
|
3
|
+
description: Update Qingflow records through the current record detail context using the Wingent Momo runtime MCP session; recover auth/workspace only after a tool error.
|
|
4
4
|
metadata:
|
|
5
|
-
short-description:
|
|
5
|
+
short-description: Detail-first Qingflow record update
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Qingflow Record Update
|
|
9
9
|
|
|
10
|
+
> **Skill 版本**:`qingflow-skills-2026.06.24.2`(入口文档版本;如需确认 CLI 包版本,使用 `qingflow --version` 或 `qingflow --json version`)。
|
|
11
|
+
|
|
10
12
|
## Default Path
|
|
11
13
|
|
|
12
|
-
`
|
|
14
|
+
`record_get -> record_update`
|
|
13
15
|
|
|
14
16
|
## Core Tools
|
|
15
17
|
|
|
@@ -20,28 +22,41 @@ metadata:
|
|
|
20
22
|
|
|
21
23
|
## Working Rules
|
|
22
24
|
|
|
23
|
-
1. Start with `
|
|
24
|
-
2. Use
|
|
25
|
-
3.
|
|
26
|
-
4.
|
|
27
|
-
5.
|
|
28
|
-
6. If
|
|
29
|
-
7.
|
|
30
|
-
8.
|
|
31
|
-
9.
|
|
32
|
-
10.
|
|
33
|
-
11. If the write
|
|
34
|
-
12.
|
|
35
|
-
13.
|
|
36
|
-
14.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
25
|
+
1. Start with `record_get(app_key, record_id, view_id when known)` to read the current detail-page context; if the frontend/custom view is known, keep that same `view_id` through the update
|
|
26
|
+
2. Use `record_get.fields[]` for field titles, `field_id`, `kind`, and current values
|
|
27
|
+
3. Build `fields` as a field-title keyed map containing only the user-requested changes
|
|
28
|
+
4. Run `record_update` directly with that key/value map; pass the same `view_id` when it is known so the tool tries that frontend view first, then let the tool fall back to other executable routes if needed
|
|
29
|
+
5. Keep `verify_write=true` for production updates
|
|
30
|
+
6. If the write returns `status="needs_confirmation"`, stop and surface the candidates
|
|
31
|
+
7. On success, read only the final status, `update_route`, `write_executed`, and verification result; do not surface intermediate route failures as the outcome
|
|
32
|
+
8. On failure, surface the failed reason and field/path diagnostics returned by `record_update`
|
|
33
|
+
9. Use `record_update_schema_get` only after an update failure, field ambiguity, or explicit request to diagnose writable fields/routes
|
|
34
|
+
10. Treat app-level `viewList` or applicant/insert schema 40002 as auxiliary-context loss, not as final record permission denial, when `record_get` or `record_update` succeeds through the selected `custom:*` view or `system:all`/type=8 route
|
|
35
|
+
11. If single-record readback matters, prefer `record_get` after the write and read top-level `fields[]`, `media_assets.items[].local_path`, `file_assets.items[].local_path`, `file_assets.items[].extraction.text_path`, and `semantic_context`; `record_get` follows the frontend storage cookie redirect path for Qingflow attachments, so prefer local paths over remote URLs; use `record_list(..., output_profile="normalized")` only for batch row-shaped normalized readback
|
|
36
|
+
12. For batch updates, read top-level `mode`, `dry_run`, `total`, `succeeded`, `failed`, `needs_confirmation`, `updated_record_ids`, `write_executed`, `safe_to_retry`, `verification_status`, and `items[].row_number/status/record_id`
|
|
37
|
+
13. If `write_executed=true`, do not blindly retry the whole batch; use `items[]` and `updated_record_ids` to decide whether only failed rows need repair
|
|
38
|
+
14. If you use `record_list` to locate candidates, parse `data.items[]` as flat row objects such as `row["客户名称"]` + `row["record_id"]`; do not expect a nested `fields[]` array in list rows
|
|
39
|
+
|
|
40
|
+
## Special Field Values
|
|
41
|
+
|
|
42
|
+
Use the field `kind` from `record_get.fields[]` when shaping values:
|
|
43
|
+
|
|
44
|
+
- `member`: start with a natural-language name such as `"周颖"`. If `record_update` returns `status="needs_confirmation"`, no write happened; retry with one candidate object, for example `{"uid":1048599,"name":"沈嘉慧Seth","email":"shenjiahui@exiao.tech"}`.
|
|
45
|
+
- `department`: start with a department name such as `"客户成功部"`. The record tool resolves names through the member-visible directory path first; do not pre-query ContactAuth-only contact management APIs for ids. On `needs_confirmation`, retry with the explicit candidate object/id returned by the tool.
|
|
46
|
+
- `relation`: prefer a unique human-readable target value or `{"apply_id":"..."}`. On multiple matches, stop and retry only after choosing one `confirmation_requests[].candidates[]` item.
|
|
47
|
+
- `select`: single select uses one option string; multi select uses an array of option strings.
|
|
48
|
+
- `attachment`: use a supported uploaded/file object from the returned format hints; do not invent remote URLs when the tool asks for upload.
|
|
49
|
+
- Reference, formula, auto-fill, readonly, and system fields are not independent writable kinds. Do not force-write the filled target field; update the upstream driving field instead, or surface the blocker.
|
|
50
|
+
|
|
51
|
+
`needs_confirmation` means `write_executed=false`: the tool found candidates but did not have enough certainty to write. Do not report it as success or failure. Surface the candidate list if user choice is needed; if the intended candidate is obvious from the user request or prior context, retry with the explicit object and then verify the final value.
|
|
52
|
+
|
|
53
|
+
For member or department ambiguity, use the record candidate tools (`record_member_candidates` / `record_department_candidates`, or CLI `qingflow record member-candidates` / `department-candidates`). These follow the same field-scope candidate route as the frontend selector; do not replace them with contact-directory management queries.
|
|
40
54
|
|
|
41
55
|
## Do Not
|
|
42
56
|
|
|
43
|
-
- Do not pass
|
|
44
|
-
- Do not
|
|
57
|
+
- Do not pass legacy `view_key` / `view_name` selectors; use `view_id` only when the frontend/detail view is known
|
|
58
|
+
- Do not call `record_update_schema_get` as the normal pre-step for every update
|
|
59
|
+
- Do not use applicant/insert schema to decide record update fields
|
|
60
|
+
- Do not update fields that were absent from `record_get.fields[]` unless the user explicitly provided a raw field id and you can justify it
|
|
45
61
|
- Do not resolve lookup fields against a guessed record context
|
|
46
|
-
- Do not
|
|
47
|
-
- Do not fall back to guessed browse scopes when `record_update_schema_get` already tells you which matched route can or cannot execute the payload
|
|
62
|
+
- Do not treat a denied intermediate route as final failure when `record_update` later succeeds through another route
|
|
@@ -1,32 +1,34 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: qingflow-task-ops
|
|
3
|
-
description: Use Qingflow todo discovery, workflow task context, associated approval context, workflow logs, and unified task actions
|
|
3
|
+
description: Use Qingflow todo discovery, workflow task context, associated approval context, workflow logs, and unified task actions with the current Wingent Momo runtime MCP session. Do not use this skill for record CRUD or final statistical analysis.
|
|
4
4
|
metadata:
|
|
5
5
|
short-description: Qingflow task workflow context and actions
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Qingflow Task Ops
|
|
9
9
|
|
|
10
|
+
> **Skill 版本**:`qingflow-skills-2026.06.24.2`(入口文档版本;如需确认 CLI 包版本,使用 `qingflow --version` 或 `qingflow --json version`)。
|
|
11
|
+
|
|
10
12
|
## Overview
|
|
11
13
|
|
|
12
14
|
This skill is for task workflow operations only.
|
|
13
|
-
|
|
15
|
+
In Wingent Momo runtime, trust injected MCP credentials, workspace, and route context until a business tool explicitly reports otherwise.
|
|
14
16
|
Before executing, skim the shared maintenance baseline: [public-surface-sync.md](../qingflow-app-user/references/public-surface-sync.md).
|
|
15
17
|
|
|
16
18
|
## Default Paths
|
|
17
19
|
|
|
18
20
|
Use exactly one of these default paths:
|
|
19
21
|
|
|
20
|
-
1. Find target todos
|
|
22
|
+
1. Find target todos
|
|
21
23
|
`task_list`
|
|
22
24
|
|
|
23
|
-
2. Read one task context
|
|
25
|
+
2. Read one task context
|
|
24
26
|
`task_list -> exact target -> task_get`
|
|
25
27
|
|
|
26
|
-
3. Read associated approval context
|
|
27
|
-
`task_get ->
|
|
28
|
+
3. Read associated approval context when material to a high-impact recommendation
|
|
29
|
+
`task_get -> task_workflow_log_get` and/or material `task_associated_report_detail_get`
|
|
28
30
|
|
|
29
|
-
4. Execute workflow action
|
|
31
|
+
4. Execute workflow action
|
|
30
32
|
`task_list -> exact target -> task_get -> task_action_execute`
|
|
31
33
|
|
|
32
34
|
5. Execute a user-specified action on an already-clear target
|
|
@@ -43,29 +45,26 @@ Use exactly one of these default paths:
|
|
|
43
45
|
## Supporting Tools
|
|
44
46
|
|
|
45
47
|
- `app_list`
|
|
46
|
-
- `app_search`
|
|
47
48
|
|
|
48
49
|
## Standard Operating Order
|
|
49
50
|
|
|
50
51
|
Use one of these two modes:
|
|
51
52
|
|
|
52
53
|
1. Recommendation mode
|
|
53
|
-
1.
|
|
54
|
-
2.
|
|
55
|
-
3.
|
|
56
|
-
4.
|
|
57
|
-
5.
|
|
58
|
-
6.
|
|
59
|
-
7.
|
|
60
|
-
8. Wait for explicit user confirmation before `task_action_execute`
|
|
54
|
+
1. Trust the current MCP/session when the runtime has already injected credentials; recover auth/workspace only after an actual tool error
|
|
55
|
+
2. Discover the exact target with `task_list`
|
|
56
|
+
3. Read node context with `task_get`
|
|
57
|
+
4. Before giving a high-impact approve/reject/rollback/transfer recommendation, read `task_workflow_log_get`
|
|
58
|
+
5. If `task_get` returns visible `associated_reports`, read the reports that are material to the decision; if a report cannot be read, disclose the gap instead of blocking indefinitely
|
|
59
|
+
6. Give a recommendation only after reviewing the available node context, workflow log when visible, and material associated reports
|
|
60
|
+
7. Wait for explicit user confirmation before `task_action_execute`
|
|
61
61
|
|
|
62
62
|
2. User-directed execution mode
|
|
63
|
-
1.
|
|
64
|
-
2.
|
|
65
|
-
3.
|
|
66
|
-
4.
|
|
67
|
-
5.
|
|
68
|
-
6. After actions, report the exact `app_key`, `record_id`, `workflow_node_id`, executed action, and any warnings
|
|
63
|
+
1. Trust the current MCP/session when the runtime has already injected credentials; recover auth/workspace only after an actual tool error
|
|
64
|
+
2. Discover the exact target with `task_list`
|
|
65
|
+
3. If the target or action requirements are ambiguous, read `task_get`; otherwise go straight to `task_action_execute`
|
|
66
|
+
4. Execute through `task_action_execute`
|
|
67
|
+
5. After actions, report whether it succeeded, the `task_id`, the executed action, the final route/status, and any warnings
|
|
69
68
|
|
|
70
69
|
## Task-Center Rules
|
|
71
70
|
|
|
@@ -88,7 +87,8 @@ Use one of these two modes:
|
|
|
88
87
|
- `ended`
|
|
89
88
|
- `task_list` is the only public task discovery path in this MCP surface
|
|
90
89
|
- `task_list --query` uses backend `searchKey` first; only when backend returns zero rows does MCP apply a local fallback match on normalized `app_name / workflow_node_name / app_key / record_id`
|
|
91
|
-
-
|
|
90
|
+
- `task_id` must be copied from `task_list.data.items[].task_id`; it is not a row number, list index, record id, or workflow node id
|
|
91
|
+
- Use `task_id` directly with `task_get`, `task_workflow_log_get`, `task_associated_report_detail_get`, and `task_action_execute`; do not reconstruct actions from `app_key + record_id + workflow_node_id` unless the user explicitly provided that full locator for troubleshooting
|
|
92
92
|
- Default box usage:
|
|
93
93
|
- `todo`: `task_list -> task_get -> task_workflow_log_get / task_associated_report_detail_get -> recommendation -> explicit user confirmation -> task_action_execute`
|
|
94
94
|
- `initiated`: `task_list -> record_get`
|
|
@@ -106,15 +106,18 @@ Use one of these two modes:
|
|
|
106
106
|
- `transfer`
|
|
107
107
|
- `urge`
|
|
108
108
|
- `save_only`
|
|
109
|
-
- Before
|
|
110
|
-
- If `task_get` returns visible `associated_reports`, review
|
|
111
|
-
-
|
|
109
|
+
- Before high-impact approve/reject/rollback/transfer recommendations, review `task_workflow_log_get` when `task_get.visibility.audit_record_visible=true`
|
|
110
|
+
- If `task_get` returns visible `associated_reports`, review material reports with `task_associated_report_detail_get`; for unreadable or irrelevant reports, disclose the limitation instead of blocking the whole task
|
|
111
|
+
- QingBI associated report detail follows the frontend/qflow visible chart-data route first; a middle `CHART_SEE` / `40002` from legacy BI data reads is not by itself proof that the task-associated report is invisible.
|
|
112
|
+
- Do not give a high-impact approval recommendation based only on `task_get` unless workflow log/report visibility is unavailable and you explicitly state that limitation
|
|
112
113
|
- Do not execute `task_action_execute` until the user explicitly confirms the chosen action
|
|
113
114
|
- Exception: if the user has already explicitly authorized a concrete action on exact targets, you may execute directly after exact target resolution
|
|
114
115
|
- Avoid actions on ambiguous tasks or records
|
|
115
|
-
- Summarize the final action
|
|
116
|
+
- Summarize the final action by `task_id`; include `app_key`, `record_id`, or `workflow_node_id` only as read-only context when the tool returns them, not as the action locator
|
|
116
117
|
- `reject` requires `payload.audit_feedback`
|
|
118
|
+
- For approve/reject, trust the current task detail or an explicit frontend-provided `formId`; app baseInfo is only a fallback. A baseInfo `40002` is not final task-action denial when `formId` is already known.
|
|
117
119
|
- `save_only` requires non-empty `fields` and is only available when the backend exposes editable fields for the current node
|
|
120
|
+
- For `save_only`, trust `task_get.editable_fields` / `editableQueIds` from the current task node. An app applicant-schema `40002` is not final task denial when the task detail already exposes the editable field.
|
|
118
121
|
- `task_action_execute` now distinguishes action execution from workflow continuation. Read `verification.runtime_continuation_verified` before claiming the workflow actually moved on.
|
|
119
122
|
- If `task_action_execute` returns `partial_success` with `WORKFLOW_CONTINUATION_UNVERIFIED`, report the action as sent but the downstream continuation as unverified.
|
|
120
123
|
- If `task_action_execute` returns `TASK_CONTEXT_VISIBILITY_UNVERIFIED` after a `46001`-style context loss, do not claim the task was already processed unless the workflow log or record state proves it.
|
|
@@ -14,14 +14,12 @@ Examples:
|
|
|
14
14
|
|
|
15
15
|
Rules:
|
|
16
16
|
|
|
17
|
-
- if the user starts from inbox, todo, workload, cc, or bottleneck language, use
|
|
18
|
-
- use `
|
|
19
|
-
- use `
|
|
20
|
-
- use `task_facets` when worksheet or workflow-node buckets matter
|
|
17
|
+
- if the user starts from inbox, todo, workload, cc, or bottleneck language, use the public task tools first
|
|
18
|
+
- use `task_list` for headline counts and flat browsing; group locally by app or workflow node when buckets matter
|
|
19
|
+
- use `task_get`, `task_workflow_log_get`, and `task_associated_report_detail_get` only after locating the exact task
|
|
21
20
|
- treat task counts as task-center counts, not record counts
|
|
22
21
|
- switch to `record_get` only after locating the exact business record behind a task
|
|
23
22
|
- identify the exact target first
|
|
24
|
-
- for approve or reject, identify the exact
|
|
23
|
+
- for approve or reject, identify the exact target first; prefer `task_id` from task-center results, then use `task_action_execute` with action `approve` or `reject`
|
|
25
24
|
- avoid usage-side workflow actions on ambiguous records
|
|
26
25
|
- summarize the final action and target task ids or record ids
|
|
27
|
-
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
"""Entry point for running qingflow_mcp as a module.
|
|
2
|
-
|
|
1
|
+
"""Entry point for running qingflow_mcp as a module.
|
|
2
|
+
|
|
3
|
+
Default to the curated user-facing MCP surface. Split package and console
|
|
4
|
+
entrypoints can still start the builder server explicitly.
|
|
5
|
+
"""
|
|
6
|
+
from qingflow_mcp.server_app_user import main
|
|
3
7
|
|
|
4
8
|
if __name__ == "__main__":
|
|
5
9
|
main()
|