@josephyan/qingflow-cli 0.2.0-beta.55
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 +30 -0
- package/docs/local-agent-install.md +235 -0
- package/entry_point.py +13 -0
- package/npm/bin/qingflow.mjs +5 -0
- package/npm/lib/runtime.mjs +204 -0
- package/npm/scripts/postinstall.mjs +16 -0
- package/package.json +34 -0
- package/pyproject.toml +67 -0
- package/qingflow +15 -0
- package/src/qingflow_mcp/__init__.py +5 -0
- package/src/qingflow_mcp/__main__.py +5 -0
- package/src/qingflow_mcp/backend_client.py +547 -0
- package/src/qingflow_mcp/builder_facade/__init__.py +3 -0
- package/src/qingflow_mcp/builder_facade/models.py +985 -0
- package/src/qingflow_mcp/builder_facade/service.py +8243 -0
- package/src/qingflow_mcp/cli/__init__.py +1 -0
- package/src/qingflow_mcp/cli/commands/__init__.py +15 -0
- package/src/qingflow_mcp/cli/commands/app.py +40 -0
- package/src/qingflow_mcp/cli/commands/auth.py +78 -0
- package/src/qingflow_mcp/cli/commands/builder.py +184 -0
- package/src/qingflow_mcp/cli/commands/common.py +47 -0
- package/src/qingflow_mcp/cli/commands/imports.py +86 -0
- package/src/qingflow_mcp/cli/commands/record.py +202 -0
- package/src/qingflow_mcp/cli/commands/task.py +87 -0
- package/src/qingflow_mcp/cli/commands/workspace.py +33 -0
- package/src/qingflow_mcp/cli/context.py +48 -0
- package/src/qingflow_mcp/cli/formatters.py +269 -0
- package/src/qingflow_mcp/cli/json_io.py +50 -0
- package/src/qingflow_mcp/cli/main.py +147 -0
- package/src/qingflow_mcp/config.py +221 -0
- package/src/qingflow_mcp/errors.py +66 -0
- package/src/qingflow_mcp/import_store.py +121 -0
- package/src/qingflow_mcp/json_types.py +18 -0
- package/src/qingflow_mcp/list_type_labels.py +76 -0
- package/src/qingflow_mcp/server.py +211 -0
- package/src/qingflow_mcp/server_app_builder.py +387 -0
- package/src/qingflow_mcp/server_app_user.py +317 -0
- package/src/qingflow_mcp/session_store.py +289 -0
- package/src/qingflow_mcp/solution/__init__.py +6 -0
- package/src/qingflow_mcp/solution/build_assembly_store.py +181 -0
- package/src/qingflow_mcp/solution/compiler/__init__.py +282 -0
- package/src/qingflow_mcp/solution/compiler/chart_compiler.py +96 -0
- package/src/qingflow_mcp/solution/compiler/form_compiler.py +466 -0
- package/src/qingflow_mcp/solution/compiler/icon_utils.py +113 -0
- package/src/qingflow_mcp/solution/compiler/navigation_compiler.py +57 -0
- package/src/qingflow_mcp/solution/compiler/package_compiler.py +19 -0
- package/src/qingflow_mcp/solution/compiler/portal_compiler.py +60 -0
- package/src/qingflow_mcp/solution/compiler/view_compiler.py +51 -0
- package/src/qingflow_mcp/solution/compiler/workflow_compiler.py +173 -0
- package/src/qingflow_mcp/solution/design_session.py +222 -0
- package/src/qingflow_mcp/solution/design_store.py +100 -0
- package/src/qingflow_mcp/solution/executor.py +2339 -0
- package/src/qingflow_mcp/solution/normalizer.py +23 -0
- package/src/qingflow_mcp/solution/requirements_builder.py +536 -0
- package/src/qingflow_mcp/solution/run_store.py +244 -0
- package/src/qingflow_mcp/solution/spec_models.py +853 -0
- package/src/qingflow_mcp/tools/__init__.py +1 -0
- package/src/qingflow_mcp/tools/ai_builder_tools.py +2063 -0
- package/src/qingflow_mcp/tools/app_tools.py +850 -0
- package/src/qingflow_mcp/tools/approval_tools.py +833 -0
- package/src/qingflow_mcp/tools/auth_tools.py +697 -0
- package/src/qingflow_mcp/tools/base.py +81 -0
- package/src/qingflow_mcp/tools/code_block_tools.py +679 -0
- package/src/qingflow_mcp/tools/directory_tools.py +648 -0
- package/src/qingflow_mcp/tools/feedback_tools.py +230 -0
- package/src/qingflow_mcp/tools/file_tools.py +385 -0
- package/src/qingflow_mcp/tools/import_tools.py +1971 -0
- package/src/qingflow_mcp/tools/navigation_tools.py +177 -0
- package/src/qingflow_mcp/tools/package_tools.py +240 -0
- package/src/qingflow_mcp/tools/portal_tools.py +131 -0
- package/src/qingflow_mcp/tools/qingbi_report_tools.py +269 -0
- package/src/qingflow_mcp/tools/record_tools.py +12739 -0
- package/src/qingflow_mcp/tools/role_tools.py +94 -0
- package/src/qingflow_mcp/tools/solution_tools.py +3887 -0
- package/src/qingflow_mcp/tools/task_context_tools.py +1423 -0
- package/src/qingflow_mcp/tools/task_tools.py +843 -0
- package/src/qingflow_mcp/tools/view_tools.py +280 -0
- package/src/qingflow_mcp/tools/workflow_tools.py +312 -0
- package/src/qingflow_mcp/tools/workspace_tools.py +219 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from mcp.server.fastmcp import FastMCP
|
|
4
|
+
|
|
5
|
+
from ..config import DEFAULT_PROFILE
|
|
6
|
+
from ..errors import QingflowApiError, raise_tool_error
|
|
7
|
+
from ..json_types import JSONObject
|
|
8
|
+
from .base import ToolBase
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RoleTools(ToolBase):
|
|
12
|
+
def register(self, mcp: FastMCP) -> None:
|
|
13
|
+
@mcp.tool()
|
|
14
|
+
def role_search(
|
|
15
|
+
profile: str = DEFAULT_PROFILE,
|
|
16
|
+
keyword: str = "",
|
|
17
|
+
page_num: int = 1,
|
|
18
|
+
page_size: int = 50,
|
|
19
|
+
) -> JSONObject:
|
|
20
|
+
return self.role_search(profile=profile, keyword=keyword, page_num=page_num, page_size=page_size)
|
|
21
|
+
|
|
22
|
+
@mcp.tool()
|
|
23
|
+
def role_create(profile: str = DEFAULT_PROFILE, payload: JSONObject | None = None) -> JSONObject:
|
|
24
|
+
return self.role_create(profile=profile, payload=payload or {})
|
|
25
|
+
|
|
26
|
+
@mcp.tool(description=self._high_risk_tool_description(operation="update", target="role configuration"))
|
|
27
|
+
def role_update(
|
|
28
|
+
profile: str = DEFAULT_PROFILE,
|
|
29
|
+
role_id: int = 0,
|
|
30
|
+
payload: JSONObject | None = None,
|
|
31
|
+
) -> JSONObject:
|
|
32
|
+
return self.role_update(profile=profile, role_id=role_id, payload=payload or {})
|
|
33
|
+
|
|
34
|
+
@mcp.tool(description=self._high_risk_tool_description(operation="delete", target="roles and assignments"))
|
|
35
|
+
def role_delete(profile: str = DEFAULT_PROFILE, role_ids: list[int] | None = None) -> JSONObject:
|
|
36
|
+
return self.role_delete(profile=profile, role_ids=role_ids or [])
|
|
37
|
+
|
|
38
|
+
def role_search(self, *, profile: str, keyword: str, page_num: int, page_size: int) -> JSONObject:
|
|
39
|
+
if page_num <= 0 or page_size <= 0:
|
|
40
|
+
raise_tool_error(QingflowApiError.config_error("page_num and page_size must be positive"))
|
|
41
|
+
|
|
42
|
+
def runner(session_profile, context):
|
|
43
|
+
result = self.backend.request(
|
|
44
|
+
"GET",
|
|
45
|
+
context,
|
|
46
|
+
"/contact/roleByPage",
|
|
47
|
+
params={"keyword": keyword, "pageNum": page_num, "pageSize": page_size},
|
|
48
|
+
)
|
|
49
|
+
return {
|
|
50
|
+
"profile": profile,
|
|
51
|
+
"ws_id": session_profile.selected_ws_id,
|
|
52
|
+
"keyword": keyword,
|
|
53
|
+
"page": result,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return self._run(profile, runner)
|
|
57
|
+
|
|
58
|
+
def role_create(self, *, profile: str, payload: JSONObject) -> JSONObject:
|
|
59
|
+
body = self._require_dict(payload)
|
|
60
|
+
|
|
61
|
+
def runner(session_profile, context):
|
|
62
|
+
result = self.backend.request("POST", context, "/contact/role", json_body=body)
|
|
63
|
+
return {"profile": profile, "ws_id": session_profile.selected_ws_id, "result": result}
|
|
64
|
+
|
|
65
|
+
return self._run(profile, runner)
|
|
66
|
+
|
|
67
|
+
def role_update(self, *, profile: str, role_id: int, payload: JSONObject) -> JSONObject:
|
|
68
|
+
if role_id <= 0:
|
|
69
|
+
raise_tool_error(QingflowApiError.config_error("role_id must be positive"))
|
|
70
|
+
body = self._require_dict(payload)
|
|
71
|
+
|
|
72
|
+
def runner(session_profile, context):
|
|
73
|
+
result = self.backend.request("POST", context, f"/contact/role/{role_id}", json_body=body)
|
|
74
|
+
return self._attach_human_review_notice(
|
|
75
|
+
{"profile": profile, "ws_id": session_profile.selected_ws_id, "role_id": role_id, "result": result},
|
|
76
|
+
operation="update",
|
|
77
|
+
target="role configuration",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
return self._run(profile, runner)
|
|
81
|
+
|
|
82
|
+
def role_delete(self, *, profile: str, role_ids: list[int]) -> JSONObject:
|
|
83
|
+
if not role_ids or any(role_id <= 0 for role_id in role_ids):
|
|
84
|
+
raise_tool_error(QingflowApiError.config_error("role_ids must be a non-empty array of positive integers"))
|
|
85
|
+
|
|
86
|
+
def runner(session_profile, context):
|
|
87
|
+
result = self.backend.request("DELETE", context, "/contact/role", json_body=role_ids)
|
|
88
|
+
return self._attach_human_review_notice(
|
|
89
|
+
{"profile": profile, "ws_id": session_profile.selected_ws_id, "role_ids": role_ids, "result": result},
|
|
90
|
+
operation="delete",
|
|
91
|
+
target="roles and assignments",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
return self._run(profile, runner)
|