@qingflow-tech/qingflow-app-user-mcp 1.0.0

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 (109) hide show
  1. package/README.md +37 -0
  2. package/docs/local-agent-install.md +332 -0
  3. package/entry_point.py +13 -0
  4. package/npm/bin/qingflow-app-user-mcp.mjs +7 -0
  5. package/npm/lib/runtime.mjs +339 -0
  6. package/npm/scripts/postinstall.mjs +16 -0
  7. package/package.json +34 -0
  8. package/pyproject.toml +67 -0
  9. package/qingflow-app-user-mcp +15 -0
  10. package/skills/qingflow-app-user/SKILL.md +79 -0
  11. package/skills/qingflow-app-user/agents/openai.yaml +4 -0
  12. package/skills/qingflow-app-user/references/data-gotchas.md +29 -0
  13. package/skills/qingflow-app-user/references/environments.md +63 -0
  14. package/skills/qingflow-app-user/references/record-patterns.md +48 -0
  15. package/skills/qingflow-app-user/references/workflow-usage.md +26 -0
  16. package/skills/qingflow-record-analysis/SKILL.md +158 -0
  17. package/skills/qingflow-record-analysis/agents/openai.yaml +4 -0
  18. package/skills/qingflow-record-analysis/references/analysis-gotchas.md +145 -0
  19. package/skills/qingflow-record-analysis/references/analysis-patterns.md +125 -0
  20. package/skills/qingflow-record-analysis/references/confidence-reporting.md +92 -0
  21. package/skills/qingflow-record-analysis/references/dsl-templates.md +93 -0
  22. package/skills/qingflow-record-delete/SKILL.md +29 -0
  23. package/skills/qingflow-record-import/SKILL.md +31 -0
  24. package/skills/qingflow-record-insert/SKILL.md +58 -0
  25. package/skills/qingflow-record-update/SKILL.md +42 -0
  26. package/skills/qingflow-task-ops/SKILL.md +123 -0
  27. package/skills/qingflow-task-ops/agents/openai.yaml +4 -0
  28. package/skills/qingflow-task-ops/references/environments.md +44 -0
  29. package/skills/qingflow-task-ops/references/workflow-usage.md +27 -0
  30. package/src/qingflow_mcp/__init__.py +5 -0
  31. package/src/qingflow_mcp/__main__.py +5 -0
  32. package/src/qingflow_mcp/backend_client.py +649 -0
  33. package/src/qingflow_mcp/builder_facade/__init__.py +3 -0
  34. package/src/qingflow_mcp/builder_facade/models.py +1836 -0
  35. package/src/qingflow_mcp/builder_facade/service.py +15044 -0
  36. package/src/qingflow_mcp/cli/__init__.py +1 -0
  37. package/src/qingflow_mcp/cli/commands/__init__.py +18 -0
  38. package/src/qingflow_mcp/cli/commands/app.py +40 -0
  39. package/src/qingflow_mcp/cli/commands/auth.py +44 -0
  40. package/src/qingflow_mcp/cli/commands/builder.py +538 -0
  41. package/src/qingflow_mcp/cli/commands/chart.py +18 -0
  42. package/src/qingflow_mcp/cli/commands/common.py +62 -0
  43. package/src/qingflow_mcp/cli/commands/imports.py +96 -0
  44. package/src/qingflow_mcp/cli/commands/portal.py +25 -0
  45. package/src/qingflow_mcp/cli/commands/record.py +331 -0
  46. package/src/qingflow_mcp/cli/commands/repo.py +80 -0
  47. package/src/qingflow_mcp/cli/commands/task.py +89 -0
  48. package/src/qingflow_mcp/cli/commands/view.py +18 -0
  49. package/src/qingflow_mcp/cli/commands/workspace.py +25 -0
  50. package/src/qingflow_mcp/cli/context.py +60 -0
  51. package/src/qingflow_mcp/cli/formatters.py +334 -0
  52. package/src/qingflow_mcp/cli/json_io.py +50 -0
  53. package/src/qingflow_mcp/cli/main.py +178 -0
  54. package/src/qingflow_mcp/config.py +513 -0
  55. package/src/qingflow_mcp/errors.py +66 -0
  56. package/src/qingflow_mcp/import_store.py +121 -0
  57. package/src/qingflow_mcp/json_types.py +18 -0
  58. package/src/qingflow_mcp/list_type_labels.py +76 -0
  59. package/src/qingflow_mcp/public_surface.py +233 -0
  60. package/src/qingflow_mcp/repository_store.py +71 -0
  61. package/src/qingflow_mcp/response_trim.py +470 -0
  62. package/src/qingflow_mcp/server.py +212 -0
  63. package/src/qingflow_mcp/server_app_builder.py +533 -0
  64. package/src/qingflow_mcp/server_app_user.py +362 -0
  65. package/src/qingflow_mcp/session_store.py +302 -0
  66. package/src/qingflow_mcp/solution/__init__.py +6 -0
  67. package/src/qingflow_mcp/solution/build_assembly_store.py +181 -0
  68. package/src/qingflow_mcp/solution/compiler/__init__.py +282 -0
  69. package/src/qingflow_mcp/solution/compiler/chart_compiler.py +96 -0
  70. package/src/qingflow_mcp/solution/compiler/form_compiler.py +495 -0
  71. package/src/qingflow_mcp/solution/compiler/icon_utils.py +187 -0
  72. package/src/qingflow_mcp/solution/compiler/navigation_compiler.py +57 -0
  73. package/src/qingflow_mcp/solution/compiler/package_compiler.py +19 -0
  74. package/src/qingflow_mcp/solution/compiler/portal_compiler.py +60 -0
  75. package/src/qingflow_mcp/solution/compiler/view_compiler.py +51 -0
  76. package/src/qingflow_mcp/solution/compiler/workflow_compiler.py +173 -0
  77. package/src/qingflow_mcp/solution/design_session.py +222 -0
  78. package/src/qingflow_mcp/solution/design_store.py +100 -0
  79. package/src/qingflow_mcp/solution/executor.py +2398 -0
  80. package/src/qingflow_mcp/solution/normalizer.py +23 -0
  81. package/src/qingflow_mcp/solution/requirements_builder.py +536 -0
  82. package/src/qingflow_mcp/solution/run_store.py +244 -0
  83. package/src/qingflow_mcp/solution/spec_models.py +855 -0
  84. package/src/qingflow_mcp/tools/__init__.py +1 -0
  85. package/src/qingflow_mcp/tools/ai_builder_tools.py +3419 -0
  86. package/src/qingflow_mcp/tools/app_tools.py +925 -0
  87. package/src/qingflow_mcp/tools/approval_tools.py +1062 -0
  88. package/src/qingflow_mcp/tools/auth_tools.py +875 -0
  89. package/src/qingflow_mcp/tools/base.py +388 -0
  90. package/src/qingflow_mcp/tools/code_block_tools.py +777 -0
  91. package/src/qingflow_mcp/tools/custom_button_tools.py +202 -0
  92. package/src/qingflow_mcp/tools/directory_tools.py +675 -0
  93. package/src/qingflow_mcp/tools/feedback_tools.py +238 -0
  94. package/src/qingflow_mcp/tools/file_tools.py +409 -0
  95. package/src/qingflow_mcp/tools/import_tools.py +2189 -0
  96. package/src/qingflow_mcp/tools/navigation_tools.py +210 -0
  97. package/src/qingflow_mcp/tools/package_tools.py +326 -0
  98. package/src/qingflow_mcp/tools/portal_tools.py +158 -0
  99. package/src/qingflow_mcp/tools/qingbi_report_tools.py +374 -0
  100. package/src/qingflow_mcp/tools/record_tools.py +14037 -0
  101. package/src/qingflow_mcp/tools/repository_dev_tools.py +552 -0
  102. package/src/qingflow_mcp/tools/resource_read_tools.py +421 -0
  103. package/src/qingflow_mcp/tools/role_tools.py +112 -0
  104. package/src/qingflow_mcp/tools/solution_tools.py +4054 -0
  105. package/src/qingflow_mcp/tools/task_context_tools.py +2228 -0
  106. package/src/qingflow_mcp/tools/task_tools.py +890 -0
  107. package/src/qingflow_mcp/tools/view_tools.py +335 -0
  108. package/src/qingflow_mcp/tools/workflow_tools.py +376 -0
  109. package/src/qingflow_mcp/tools/workspace_tools.py +125 -0
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: qingflow-record-delete
3
+ description: Delete Qingflow records safely after the MCP is already connected and authenticated.
4
+ metadata:
5
+ short-description: Qingflow record delete
6
+ ---
7
+
8
+ # Qingflow Record Delete
9
+
10
+ ## Default Path
11
+
12
+ `record_list / record_get -> record_delete`
13
+
14
+ ## Core Tools
15
+
16
+ - `record_list`
17
+ - `record_get`
18
+ - `record_delete`
19
+
20
+ ## Working Rules
21
+
22
+ 1. Resolve the exact target `record_id` first
23
+ 2. Prefer reading the current state before delete when the request is high risk
24
+ 3. Call `record_delete` with `record_id` or `record_ids`
25
+
26
+ ## Do Not
27
+
28
+ - Do not pass any `view_*` selector
29
+ - Do not infer the target record id from a vague title if `record_list` can disambiguate it
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: qingflow-record-import
3
+ description: Explain and operate Qingflow file-based bulk import after the MCP is already connected and authenticated.
4
+ metadata:
5
+ short-description: Qingflow bulk import workflow and troubleshooting
6
+ ---
7
+
8
+ # Qingflow Record Import
9
+
10
+ ## Default Path
11
+
12
+ `app_get -> record_import_schema_get -> record_import_template_get -> record_import_verify -> (optional authorized repair) -> record_import_start -> record_import_status_get`
13
+
14
+ ## Core Tools
15
+
16
+ - `app_get`
17
+ - `record_import_schema_get`
18
+ - `record_import_template_get`
19
+ - `record_import_verify`
20
+ - `record_import_repair_local`
21
+ - `record_import_start`
22
+ - `record_import_status_get`
23
+
24
+ ## Working Rules
25
+
26
+ 1. Inspect `app_get.data.import_capability` first
27
+ 2. Read `record_import_schema_get` before touching the file when column meaning is unclear
28
+ 3. Keep official headers unchanged
29
+ 4. Verify before start
30
+ 5. Only repair a file after explicit user authorization
31
+ 6. Read back one imported sample after success
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: qingflow-record-insert
3
+ description: Create Qingflow records with a schema-first insert workflow after the MCP is already connected and authenticated.
4
+ metadata:
5
+ short-description: Schema-first Qingflow record insert
6
+ ---
7
+
8
+ # Qingflow Record Insert
9
+
10
+ ## Default Path
11
+
12
+ `record_insert_schema_get -> (optional candidate lookup / confirmation) -> record_insert`
13
+
14
+ ## Core Tools
15
+
16
+ - `record_insert_schema_get`
17
+ - `record_insert`
18
+ - `record_member_candidates`
19
+ - `record_department_candidates`
20
+ - `file_upload_local`
21
+
22
+ ## Working Rules
23
+
24
+ 1. Start with `record_insert_schema_get`
25
+ 2. Read `required_fields`, `optional_fields`, `runtime_linked_required_fields`, and `payload_template`
26
+ 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
27
+ 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
28
+ 5. Build `fields` from the manually-supplied required/optional fields in that schema
29
+ 6. Treat `runtime_linked_required_fields` as required-but-not-directly-writable runtime/upstream dependencies, not as fields to hand-fill blindly
30
+ 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"
31
+ 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
32
+ 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
33
+ 10. If insert succeeds and readback shape matters, prefer `record_get(..., output_profile="normalized")` or `record_list(..., output_profile="normalized")`
34
+ 11. Keep subtable payloads under the parent field as a row array
35
+ 12. Member / department / relation fields may accept natural strings directly
36
+ 13. If the write returns `status="needs_confirmation"`, stop and surface the candidates
37
+ 14. Retry with explicit ids / objects only after the user confirms
38
+ 15. Keep `verify_write=true` for production inserts
39
+
40
+ ## Field Notes
41
+
42
+ - `searchable_fields` on relation fields defines the backend-native searchable columns
43
+ - `accepts_natural_input=true` means the field may accept a natural string before explicit id fallback
44
+ - `may_become_required=true` means the field is writable now, but may turn required after linked visibility or option rules activate
45
+ - `linkage.kind=logic_visibility` means the field is statically tied to linked visibility or option-driven rules
46
+ - `linkage.kind=reference_fill` means the field participates in reference-based auto fill or default matching logic
47
+ - `linkage.kind=formula_fill` means the field usually comes from formula/default auto-fill logic
48
+ - `linkage.sources` lists the upstream field titles that influence the current field
49
+ - `linkage.affects_fields` lists downstream field titles that may change when this field changes
50
+ - `linkage.role=auto_fill_only` means "normally do not hand-fill this unless the product explicitly requires it"
51
+ - `requires_upload=true` means upload the file first, then write the returned value
52
+
53
+ ## Do Not
54
+
55
+ - Do not skip `record_insert_schema_get`
56
+ - Do not invent missing required fields
57
+ - Do not flatten subtable leaf fields to the top level
58
+ - Do not silently guess member / department / relation ids
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: qingflow-record-update
3
+ description: Update Qingflow records with a schema-first record-specific workflow after the MCP is already connected and authenticated.
4
+ metadata:
5
+ short-description: Schema-first Qingflow record update
6
+ ---
7
+
8
+ # Qingflow Record Update
9
+
10
+ ## Default Path
11
+
12
+ `record_update_schema_get -> record_update`
13
+
14
+ ## Core Tools
15
+
16
+ - `record_update_schema_get`
17
+ - `record_update`
18
+ - `record_get`
19
+ - `record_list`
20
+
21
+ ## Working Rules
22
+
23
+ 1. Start with `record_update_schema_get(app_key, record_id)`
24
+ 2. Use only `writable_fields` and `payload_template` from that response
25
+ 3. Read field-level `linkage` before composing updates; it is the static hint for whether a field is a linked source, linked target, reference-driven auto fill field, or formula-driven field
26
+ 4. Build `fields` as a field-title keyed map
27
+ 5. Build `fields` only from that returned field set; MCP will choose the first matched accessible view that can execute the payload
28
+ 6. If a field has `linkage.affects_fields`, treat it as a source field; changing it may also change how other fields are interpreted or auto-filled
29
+ 7. If a field has `linkage.sources`, treat those titles as upstream dependencies that explain why the field matters or why its validation can change
30
+ 8. For `linkage.kind=reference_fill`, prefer updating the source reference field first and treat `role=auto_fill_preferred` or `auto_fill_only` targets as outputs of that reference relationship
31
+ 9. For `linkage.kind=formula_fill`, treat the field as formula/default-auto-fill driven unless the field is still clearly writable and the user explicitly wants to override it
32
+ 10. Keep `verify_write=true` for production updates
33
+ 11. If the write returns `status="needs_confirmation"`, stop and surface the candidates
34
+ 12. Do not assume any arbitrary combination of writable fields will succeed; one single matched accessible view still has to cover the payload
35
+ 13. Do not look for any extra context bucket in update schema; lookup behavior stays inline on the field definitions themselves
36
+
37
+ ## Do Not
38
+
39
+ - Do not pass any `view_*` selector
40
+ - Do not update fields missing from `writable_fields`
41
+ - Do not resolve lookup fields against a guessed record context
42
+ - Do not ignore `linkage.affects_fields` when changing source-like fields on complex forms
@@ -0,0 +1,123 @@
1
+ ---
2
+ name: qingflow-task-ops
3
+ description: Use Qingflow todo discovery, workflow task context, associated approval context, workflow logs, and unified task actions after the MCP is already connected and authenticated. Do not use this skill for record CRUD or final statistical analysis.
4
+ metadata:
5
+ short-description: Qingflow task workflow context and actions
6
+ ---
7
+
8
+ # Qingflow Task Ops
9
+
10
+ ## Overview
11
+
12
+ This skill is for task workflow operations only.
13
+ Assumes MCP is connected, authenticated, and on the correct workspace.
14
+
15
+ ## Default Paths
16
+
17
+ Use exactly one of these default paths:
18
+
19
+ 1. Find target todos
20
+ `task_list`
21
+
22
+ 2. Read one task context
23
+ `task_list -> exact target -> task_get`
24
+
25
+ 3. Read associated approval context
26
+ `task_get -> task_associated_report_detail_get` or `task_workflow_log_get`
27
+
28
+ 4. Execute workflow action
29
+ `task_list -> exact target -> task_get -> task_action_execute`
30
+
31
+ ## Core Tools
32
+
33
+ - `task_list`
34
+ - `task_get`
35
+ - `task_action_execute`
36
+ - `task_associated_report_detail_get`
37
+ - `task_workflow_log_get`
38
+
39
+ ## Supporting Tools
40
+
41
+ - `app_list`
42
+ - `app_search`
43
+
44
+ ## Standard Operating Order
45
+
46
+ 1. Ensure auth exists
47
+ 2. Ensure workspace is selected
48
+ 3. Discover the exact target with `task_list`
49
+ 4. Read node context with `task_get`
50
+ 5. Before giving any approval recommendation, read `task_workflow_log_get`
51
+ 6. If `task_get` returns any `associated_reports`, read every visible report through `task_associated_report_detail_get`
52
+ 7. Give an approval recommendation only after reviewing the node context, workflow log, and associated report details
53
+ 8. Wait for explicit user confirmation before `task_action_execute`
54
+ 9. Execute through `task_action_execute`
55
+ 10. After actions, report the exact `app_key`, `record_id`, `workflow_node_id`, and executed action
56
+
57
+ ## Task-Center Rules
58
+
59
+ - Use `task_list` for flat browsing
60
+ - `task_box` must be one of:
61
+ - `todo`
62
+ - `initiated`
63
+ - `cc`
64
+ - `done`
65
+ - `flow_status` must be one of:
66
+ - `all`
67
+ - `in_progress`
68
+ - `approved`
69
+ - `rejected`
70
+ - `pending_fix`
71
+ - `urged`
72
+ - `overdue`
73
+ - `due_soon`
74
+ - `unread`
75
+ - `ended`
76
+ - `task_list` is the only public task discovery path in this MCP surface
77
+ - Treat `task_id` as a locator only; the action primary key is `app_key + record_id + workflow_node_id`
78
+ - Default box usage:
79
+ - `todo`: `task_list -> task_get -> task_workflow_log_get / task_associated_report_detail_get -> recommendation -> explicit user confirmation -> task_action_execute`
80
+ - `initiated`: `task_list -> record_get`
81
+ - `done`: `task_list -> record_get`
82
+ - `cc`: `task_list -> record_get`
83
+ - Treat `initiated`, `done`, and `cc` primarily as list-plus-record-detail flows, not task action flows
84
+
85
+ ## Workflow Usage Actions
86
+
87
+ - `task_get.capabilities.available_actions` is the source of truth for v1 executable actions
88
+ - Current public actions are:
89
+ - `approve`
90
+ - `reject`
91
+ - `rollback`
92
+ - `transfer`
93
+ - `urge`
94
+ - Before any approve/reject/rollback/transfer recommendation, always review `task_workflow_log_get` when `task_get.visibility.audit_record_visible=true`
95
+ - If `task_get` returns visible `associated_reports`, review each one with `task_associated_report_detail_get`; do not rely on report summary alone
96
+ - Do not give an approval recommendation based only on `task_get`
97
+ - Do not execute `task_action_execute` until the user explicitly confirms the chosen action
98
+ - Avoid actions on ambiguous tasks or records
99
+ - Summarize the final action and the exact `app_key / record_id / workflow_node_id`
100
+ - `task_action_execute` now distinguishes action execution from workflow continuation. Read `verification.runtime_continuation_verified` before claiming the workflow actually moved on.
101
+ - If `task_action_execute` returns `partial_success` with `WORKFLOW_CONTINUATION_UNVERIFIED`, report the action as sent but the downstream continuation as unverified.
102
+ - 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.
103
+
104
+ ## Feedback Escalation
105
+
106
+ - If task capabilities, associated report detail, workflow log visibility, or action support still cannot satisfy the user's goal after reasonable use of this skill, summarize the exact gap in plain language.
107
+ - Ask whether the user wants you to submit product feedback.
108
+ - Only after explicit user confirmation, call `feedback_submit`.
109
+
110
+ ## Response Interpretation
111
+
112
+ - `task_list` returns normalized todo rows and is the only default discovery path
113
+ - `task_get` returns node context summary, not full historical report data
114
+ - `task_associated_report_detail_get` may return either:
115
+ - `result_type=view_list`
116
+ - `result_type=chart_data`
117
+ - `task_workflow_log_get` returns workflow log detail only when the node grants log visibility
118
+ - Treat `request_route` as the source of truth for live route debugging
119
+ - If only part of the requested work is completed, explicitly disclose which parts are done and which are not
120
+
121
+ ## Resources
122
+
123
+ - Workflow and task usage actions: [references/workflow-usage.md](references/workflow-usage.md)
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Qingflow Task Ops"
3
+ short_description: "Use Qingflow task center, comments, directory, and workflow actions"
4
+ default_prompt: "Use $qingflow-task-ops for Qingflow task-center browsing, workload facets, comments, directory lookup, and workflow usage actions. Locate the exact target first, then run the smallest explicit task or comment action."
@@ -0,0 +1,44 @@
1
+ # Environment Switching
2
+
3
+ Use this reference before any workflow usage action, comment, or task-center operation that might affect live work.
4
+
5
+ ## Step 1: Resolve the active environment
6
+
7
+ Decide explicitly whether the task targets:
8
+
9
+ - `test`: demo, mock data, smoke usage validation, training scenarios
10
+ - `prod`: real operational tasks, comments, and workflow actions
11
+
12
+ If the user did not specify an environment, default to `prod`.
13
+
14
+ ## Test Environment
15
+
16
+ Use test for:
17
+
18
+ - workflow walkthroughs
19
+ - user acceptance demos
20
+ - comment or transfer rehearsals
21
+
22
+ ## Production Environment
23
+
24
+ Use production for:
25
+
26
+ - live task-center operations
27
+ - live comments on real business records
28
+ - approve / reject / rollback / transfer / urge on real work
29
+
30
+ Production guardrails:
31
+
32
+ - never assume a task id, record id, or workflow node id
33
+ - find the exact target first
34
+ - if the task can be answered read-only, do not act
35
+
36
+ ## Reporting Rule
37
+
38
+ For task ops, always report:
39
+
40
+ - active environment
41
+ - target app or task box
42
+ - operation type: read, comment, approve, reject, rollback, transfer, urge, or mark_read
43
+ - affected task ids or record ids
44
+
@@ -0,0 +1,27 @@
1
+ # Workflow and Task Usage Actions
2
+
3
+ Use these when the user is operating inside an existing process, not redesigning it.
4
+
5
+ Examples:
6
+
7
+ - add a comment to a record
8
+ - approve or reject a workflow task
9
+ - transfer a task
10
+ - roll back a task
11
+ - list todo, initiated, done, or cc tasks
12
+ - inspect workload by worksheet or workflow node
13
+ - urge a pending task
14
+
15
+ Rules:
16
+
17
+ - if the user starts from inbox, todo, workload, cc, or bottleneck language, use `task_*` first
18
+ - use `task_summary` for headline counts
19
+ - use `task_list` for flat browsing
20
+ - use `task_facets` when worksheet or workflow-node buckets matter
21
+ - treat task counts as task-center counts, not record counts
22
+ - switch to `record_get` only after locating the exact business record behind a task
23
+ - identify the exact target first
24
+ - for approve or reject, identify the exact `workflow_node_id` first; prefer task-center results or current audit info, then use `task_approve` or `task_reject`
25
+ - avoid usage-side workflow actions on ambiguous records
26
+ - summarize the final action and target task ids or record ids
27
+
@@ -0,0 +1,5 @@
1
+ from __future__ import annotations
2
+
3
+ __all__ = ["__version__"]
4
+
5
+ __version__ = "0.2.0b87"
@@ -0,0 +1,5 @@
1
+ """Entry point for running qingflow_mcp as a module."""
2
+ from qingflow_mcp.server import main
3
+
4
+ if __name__ == "__main__":
5
+ main()