@josephyan/qingflow-cli 0.2.0-beta.75 → 0.2.0-beta.76

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 CHANGED
@@ -3,13 +3,13 @@
3
3
  Install:
4
4
 
5
5
  ```bash
6
- npm install @josephyan/qingflow-cli@0.2.0-beta.75
6
+ npm install @josephyan/qingflow-cli@0.2.0-beta.76
7
7
  ```
8
8
 
9
9
  Run:
10
10
 
11
11
  ```bash
12
- npx -y -p @josephyan/qingflow-cli@0.2.0-beta.75 qingflow
12
+ npx -y -p @josephyan/qingflow-cli@0.2.0-beta.76 qingflow
13
13
  ```
14
14
 
15
15
  Environment:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@josephyan/qingflow-cli",
3
- "version": "0.2.0-beta.75",
3
+ "version": "0.2.0-beta.76",
4
4
  "description": "Human-friendly Qingflow command line interface for auth, record operations, import, tasks, and stable builder flows.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "qingflow-mcp"
7
- version = "0.2.0b75"
7
+ version = "0.2.0b76"
8
8
  description = "User-authenticated MCP server for Qingflow"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -37,13 +37,6 @@ def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) ->
37
37
  action.add_argument("--fields-file")
38
38
  action.set_defaults(handler=_handle_action, format_hint="")
39
39
 
40
- save_only = task_subparsers.add_parser("save-only", help="仅保存当前待办字段,不提交流程")
41
- save_only.add_argument("--app-key", required=True)
42
- save_only.add_argument("--record-id", required=True, type=int)
43
- save_only.add_argument("--workflow-node-id", required=True, type=int)
44
- save_only.add_argument("--fields-file", required=True)
45
- save_only.set_defaults(handler=_handle_save_only, format_hint="")
46
-
47
40
  log = task_subparsers.add_parser("log", help="读取流程日志")
48
41
  log.add_argument("--app-key", required=True)
49
42
  log.add_argument("--record-id", required=True, type=int)
@@ -87,16 +80,6 @@ def _handle_action(args: argparse.Namespace, context: CliContext) -> dict:
87
80
  )
88
81
 
89
82
 
90
- def _handle_save_only(args: argparse.Namespace, context: CliContext) -> dict:
91
- return context.task.task_save_only(
92
- profile=args.profile,
93
- app_key=args.app_key,
94
- record_id=args.record_id,
95
- workflow_node_id=args.workflow_node_id,
96
- fields=load_object_arg(args.fields_file, option_name="--fields-file") or {},
97
- )
98
-
99
-
100
83
  def _handle_log(args: argparse.Namespace, context: CliContext) -> dict:
101
84
  return context.task.task_workflow_log_get(
102
85
  profile=args.profile,
@@ -91,7 +91,6 @@ USER_PUBLIC_TOOL_SPECS: tuple[PublicToolSpec, ...] = (
91
91
  PublicToolSpec(USER_DOMAIN, "record_code_block_run", ("record_code_block_run",), ("record", "code-block-run")),
92
92
  PublicToolSpec(USER_DOMAIN, "task_list", ("task_list",), ("task", "list")),
93
93
  PublicToolSpec(USER_DOMAIN, "task_get", ("task_get",), ("task", "get")),
94
- PublicToolSpec(USER_DOMAIN, "task_save_only", ("task_save_only",), ("task", "save-only")),
95
94
  PublicToolSpec(USER_DOMAIN, "task_action_execute", ("task_action_execute",), ("task", "action")),
96
95
  PublicToolSpec(USER_DOMAIN, "task_associated_report_detail_get", ("task_associated_report_detail_get",), cli_public=False),
97
96
  PublicToolSpec(USER_DOMAIN, "task_workflow_log_get", ("task_workflow_log_get",), ("task", "log")),
@@ -413,7 +413,6 @@ _register_policy(
413
413
  (USER_DOMAIN,),
414
414
  (
415
415
  "task_get",
416
- "task_save_only",
417
416
  "task_action_execute",
418
417
  "task_associated_report_detail_get",
419
418
  "task_workflow_log_get",
@@ -144,13 +144,13 @@ Use `record_code_block_run` when the user wants to execute a form code-block fie
144
144
 
145
145
  ## Task Workflow Path
146
146
 
147
- `task_list -> task_get -> task_save_only / task_action_execute`
147
+ `task_list -> task_get -> task_action_execute`
148
148
 
149
149
  - Use `task_associated_report_detail_get` for associated view or report details.
150
150
  - Use `task_workflow_log_get` for full workflow log history.
151
151
  - Task actions operate on `app_key + record_id + workflow_node_id`, not `task_id`.
152
152
  - Treat `task_action_execute` as the tool-level action enum surface; the current task's real actions are only the ones listed in `task_get.capabilities.available_actions`.
153
- - Use `task_save_only` when the user wants to save editable field changes on the current node without advancing the workflow.
153
+ - Use `task_action_execute(action="save_only", fields=...)` when the user wants to save editable field changes on the current node without advancing the workflow.
154
154
  - `save_only` is exposed only when the backend current-node `editableQueIds` signal returns a non-empty result; MCP no longer infers `save_only` from local schema reconstruction.
155
155
 
156
156
  ## Time Handling
@@ -117,22 +117,6 @@ class ApprovalTools(ToolBase):
117
117
  ) -> dict[str, Any]:
118
118
  return self.task_transfer(profile=profile, app_key=app_key, record_id=record_id, payload=payload or {}, fields=fields or {})
119
119
 
120
- @mcp.tool(description=self._high_risk_tool_description(operation="save", target="workflow task fields without advancing the workflow"))
121
- def task_save_only(
122
- profile: str = DEFAULT_PROFILE,
123
- app_key: str = "",
124
- record_id: int = 0,
125
- workflow_node_id: int = 0,
126
- fields: dict[str, Any] | None = None,
127
- ) -> dict[str, Any]:
128
- return self.task_save_only(
129
- profile=profile,
130
- app_key=app_key,
131
- record_id=record_id,
132
- workflow_node_id=workflow_node_id,
133
- fields=fields or {},
134
- )
135
-
136
120
  @mcp.tool()
137
121
  def task_transfer_candidates(
138
122
  profile: str = DEFAULT_PROFILE,
@@ -104,22 +104,6 @@ class TaskContextTools(ToolBase):
104
104
  fields=fields or {},
105
105
  )
106
106
 
107
- @mcp.tool()
108
- def task_save_only(
109
- profile: str = DEFAULT_PROFILE,
110
- app_key: str = "",
111
- record_id: int = 0,
112
- workflow_node_id: int = 0,
113
- fields: dict[str, Any] | None = None,
114
- ) -> dict[str, Any]:
115
- return self.task_save_only(
116
- profile=profile,
117
- app_key=app_key,
118
- record_id=record_id,
119
- workflow_node_id=workflow_node_id,
120
- fields=fields or {},
121
- )
122
-
123
107
  @mcp.tool()
124
108
  def task_associated_report_detail_get(
125
109
  profile: str = DEFAULT_PROFILE,