@josephyan/qingflow-cli 0.2.0-beta.70 → 0.2.0-beta.72
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 +2 -2
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/qingflow_mcp/backend_client.py +1 -0
- package/src/qingflow_mcp/builder_facade/models.py +16 -8
- package/src/qingflow_mcp/builder_facade/service.py +208 -111
- package/src/qingflow_mcp/cli/commands/__init__.py +4 -1
- package/src/qingflow_mcp/cli/commands/builder.py +24 -64
- package/src/qingflow_mcp/cli/commands/chart.py +18 -0
- package/src/qingflow_mcp/cli/commands/portal.py +25 -0
- package/src/qingflow_mcp/cli/commands/view.py +18 -0
- package/src/qingflow_mcp/cli/context.py +3 -0
- package/src/qingflow_mcp/response_trim.py +211 -178
- package/src/qingflow_mcp/server_app_builder.py +18 -42
- package/src/qingflow_mcp/server_app_user.py +21 -1
- package/src/qingflow_mcp/tools/ai_builder_tools.py +165 -124
- package/src/qingflow_mcp/tools/app_tools.py +0 -4
- package/src/qingflow_mcp/tools/qingbi_report_tools.py +58 -7
- package/src/qingflow_mcp/tools/resource_read_tools.py +399 -0
|
@@ -2,13 +2,16 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import argparse
|
|
4
4
|
|
|
5
|
-
from . import app, auth, builder, imports, record, task, workspace
|
|
5
|
+
from . import app, auth, builder, chart, imports, portal, record, task, view, workspace
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
def register_all_commands(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
9
9
|
auth.register(subparsers)
|
|
10
10
|
workspace.register(subparsers)
|
|
11
11
|
app.register(subparsers)
|
|
12
|
+
portal.register(subparsers)
|
|
13
|
+
view.register(subparsers)
|
|
14
|
+
chart.register(subparsers)
|
|
12
15
|
record.register(subparsers)
|
|
13
16
|
imports.register(subparsers)
|
|
14
17
|
task.register(subparsers)
|
|
@@ -76,6 +76,16 @@ def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) ->
|
|
|
76
76
|
app_release_lock.add_argument("--lock-owner-name", required=True)
|
|
77
77
|
app_release_lock.set_defaults(handler=_handle_app_release_edit_lock_if_mine, format_hint="builder_summary")
|
|
78
78
|
|
|
79
|
+
app_get = app_subparsers.add_parser("get", help="读取应用配置")
|
|
80
|
+
app_get.add_argument(
|
|
81
|
+
"builder_app_get_section",
|
|
82
|
+
nargs="?",
|
|
83
|
+
choices=["summary", "fields", "layout", "views", "flow", "charts"],
|
|
84
|
+
default="summary",
|
|
85
|
+
)
|
|
86
|
+
app_get.add_argument("--app-key", required=True)
|
|
87
|
+
app_get.set_defaults(handler=_handle_app_get, format_hint="builder_summary")
|
|
88
|
+
|
|
79
89
|
button = builder_subparsers.add_parser("button", help="自定义按钮")
|
|
80
90
|
button_subparsers = button.add_subparsers(dest="builder_button_command", required=True)
|
|
81
91
|
|
|
@@ -104,18 +114,6 @@ def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) ->
|
|
|
104
114
|
button_delete.add_argument("--button-id", type=int, required=True)
|
|
105
115
|
button_delete.set_defaults(handler=_handle_button_delete, format_hint="builder_summary")
|
|
106
116
|
|
|
107
|
-
for name, help_text, handler in [
|
|
108
|
-
("read-summary", "读取应用摘要", _handle_app_read_summary),
|
|
109
|
-
("read-fields", "读取字段摘要", _handle_app_read_fields),
|
|
110
|
-
("read-layout", "读取布局摘要", _handle_app_read_layout),
|
|
111
|
-
("read-views", "读取视图摘要", _handle_app_read_views),
|
|
112
|
-
("read-flow", "读取流程摘要", _handle_app_read_flow),
|
|
113
|
-
("read-charts", "读取报表摘要", _handle_app_read_charts),
|
|
114
|
-
]:
|
|
115
|
-
sub = app_subparsers.add_parser(name, help=help_text)
|
|
116
|
-
sub.add_argument("--app-key", required=True)
|
|
117
|
-
sub.set_defaults(handler=handler, format_hint="builder_summary")
|
|
118
|
-
|
|
119
117
|
portal = builder_subparsers.add_parser("portal", help="门户")
|
|
120
118
|
portal_subparsers = portal.add_subparsers(dest="builder_portal_command", required=True)
|
|
121
119
|
portal_list = portal_subparsers.add_parser("list", help="列出可访问门户")
|
|
@@ -126,11 +124,6 @@ def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) ->
|
|
|
126
124
|
portal_get.add_argument("--being-draft", action=argparse.BooleanOptionalAction, default=True)
|
|
127
125
|
portal_get.set_defaults(handler=_handle_portal_get, format_hint="builder_summary")
|
|
128
126
|
|
|
129
|
-
portal_read = portal_subparsers.add_parser("read-summary", help="读取门户摘要")
|
|
130
|
-
portal_read.add_argument("--dash-key", required=True)
|
|
131
|
-
portal_read.add_argument("--being-draft", action=argparse.BooleanOptionalAction, default=True)
|
|
132
|
-
portal_read.set_defaults(handler=_handle_portal_read_summary, format_hint="builder_summary")
|
|
133
|
-
|
|
134
127
|
portal_apply = portal_subparsers.add_parser("apply", help="更新门户")
|
|
135
128
|
portal_apply.add_argument("--dash-key", default="")
|
|
136
129
|
portal_apply.add_argument("--dash-name", default="")
|
|
@@ -208,18 +201,13 @@ def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) ->
|
|
|
208
201
|
view = builder_subparsers.add_parser("view", help="视图详情")
|
|
209
202
|
view_subparsers = view.add_subparsers(dest="builder_view_command", required=True)
|
|
210
203
|
view_get = view_subparsers.add_parser("get", help="读取视图详情")
|
|
211
|
-
view_get.add_argument("--
|
|
204
|
+
view_get.add_argument("--view-key", required=True)
|
|
212
205
|
view_get.set_defaults(handler=_handle_view_get, format_hint="builder_summary")
|
|
213
206
|
|
|
214
207
|
chart = builder_subparsers.add_parser("chart", help="报表详情")
|
|
215
208
|
chart_subparsers = chart.add_subparsers(dest="builder_chart_command", required=True)
|
|
216
|
-
chart_get = chart_subparsers.add_parser("get", help="
|
|
209
|
+
chart_get = chart_subparsers.add_parser("get", help="读取报表配置详情")
|
|
217
210
|
chart_get.add_argument("--chart-id", required=True)
|
|
218
|
-
chart_get.add_argument("--data-payload-file")
|
|
219
|
-
chart_get.add_argument("--page-num", type=int)
|
|
220
|
-
chart_get.add_argument("--page-size", type=int)
|
|
221
|
-
chart_get.add_argument("--page-num-y", type=int)
|
|
222
|
-
chart_get.add_argument("--page-size-y", type=int)
|
|
223
211
|
chart_get.set_defaults(handler=_handle_chart_get, format_hint="builder_summary")
|
|
224
212
|
|
|
225
213
|
|
|
@@ -347,28 +335,16 @@ def _handle_button_delete(args: argparse.Namespace, context: CliContext) -> dict
|
|
|
347
335
|
return context.builder.app_custom_button_delete(profile=args.profile, app_key=args.app_key, button_id=args.button_id)
|
|
348
336
|
|
|
349
337
|
|
|
350
|
-
def
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
return
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
def _handle_app_read_views(args: argparse.Namespace, context: CliContext) -> dict:
|
|
363
|
-
return context.builder.app_read_views_summary(profile=args.profile, app_key=args.app_key)
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
def _handle_app_read_flow(args: argparse.Namespace, context: CliContext) -> dict:
|
|
367
|
-
return context.builder.app_read_flow_summary(profile=args.profile, app_key=args.app_key)
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
def _handle_app_read_charts(args: argparse.Namespace, context: CliContext) -> dict:
|
|
371
|
-
return context.builder.app_read_charts_summary(profile=args.profile, app_key=args.app_key)
|
|
338
|
+
def _handle_app_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
339
|
+
handlers = {
|
|
340
|
+
"summary": context.builder.app_get,
|
|
341
|
+
"fields": context.builder.app_get_fields,
|
|
342
|
+
"layout": context.builder.app_get_layout,
|
|
343
|
+
"views": context.builder.app_get_views,
|
|
344
|
+
"flow": context.builder.app_get_flow,
|
|
345
|
+
"charts": context.builder.app_get_charts,
|
|
346
|
+
}
|
|
347
|
+
return handlers[args.builder_app_get_section](profile=args.profile, app_key=args.app_key)
|
|
372
348
|
|
|
373
349
|
|
|
374
350
|
def _handle_portal_list(args: argparse.Namespace, context: CliContext) -> dict:
|
|
@@ -379,28 +355,12 @@ def _handle_portal_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
|
379
355
|
return context.builder.portal_get(profile=args.profile, dash_key=args.dash_key, being_draft=bool(args.being_draft))
|
|
380
356
|
|
|
381
357
|
|
|
382
|
-
def _handle_portal_read_summary(args: argparse.Namespace, context: CliContext) -> dict:
|
|
383
|
-
return context.builder.portal_read_summary(
|
|
384
|
-
profile=args.profile,
|
|
385
|
-
dash_key=args.dash_key,
|
|
386
|
-
being_draft=bool(args.being_draft),
|
|
387
|
-
)
|
|
388
|
-
|
|
389
|
-
|
|
390
358
|
def _handle_view_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
391
|
-
return context.builder.view_get(profile=args.profile,
|
|
359
|
+
return context.builder.view_get(profile=args.profile, view_key=args.view_key)
|
|
392
360
|
|
|
393
361
|
|
|
394
362
|
def _handle_chart_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
395
|
-
return context.builder.chart_get(
|
|
396
|
-
profile=args.profile,
|
|
397
|
-
chart_id=args.chart_id,
|
|
398
|
-
data_payload=load_object_arg(args.data_payload_file, option_name="--data-payload-file") if args.data_payload_file else {},
|
|
399
|
-
page_num=args.page_num,
|
|
400
|
-
page_size=args.page_size,
|
|
401
|
-
page_num_y=args.page_num_y,
|
|
402
|
-
page_size_y=args.page_size_y,
|
|
403
|
-
)
|
|
363
|
+
return context.builder.chart_get(profile=args.profile, chart_id=args.chart_id)
|
|
404
364
|
|
|
405
365
|
|
|
406
366
|
def _handle_schema_apply(args: argparse.Namespace, context: CliContext) -> dict:
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
|
|
5
|
+
from ..context import CliContext
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
9
|
+
parser = subparsers.add_parser("chart", help="报表访问")
|
|
10
|
+
chart_subparsers = parser.add_subparsers(dest="chart_command", required=True)
|
|
11
|
+
|
|
12
|
+
get_parser = chart_subparsers.add_parser("get", help="读取报表数据")
|
|
13
|
+
get_parser.add_argument("--chart-id", required=True)
|
|
14
|
+
get_parser.set_defaults(handler=_handle_get, format_hint="generic")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _handle_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
18
|
+
return context.resource.chart_get(profile=args.profile, chart_id=args.chart_id)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
|
|
5
|
+
from ..context import CliContext
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
9
|
+
parser = subparsers.add_parser("portal", help="门户访问")
|
|
10
|
+
portal_subparsers = parser.add_subparsers(dest="portal_command", required=True)
|
|
11
|
+
|
|
12
|
+
list_parser = portal_subparsers.add_parser("list", help="列出当前用户可访问的门户")
|
|
13
|
+
list_parser.set_defaults(handler=_handle_list, format_hint="generic")
|
|
14
|
+
|
|
15
|
+
get_parser = portal_subparsers.add_parser("get", help="读取门户内容清单")
|
|
16
|
+
get_parser.add_argument("--dash-key", required=True)
|
|
17
|
+
get_parser.set_defaults(handler=_handle_get, format_hint="generic")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _handle_list(args: argparse.Namespace, context: CliContext) -> dict:
|
|
21
|
+
return context.resource.portal_list(profile=args.profile)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _handle_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
25
|
+
return context.resource.portal_get(profile=args.profile, dash_key=args.dash_key)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
|
|
5
|
+
from ..context import CliContext
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
9
|
+
parser = subparsers.add_parser("view", help="视图访问")
|
|
10
|
+
view_subparsers = parser.add_subparsers(dest="view_command", required=True)
|
|
11
|
+
|
|
12
|
+
get_parser = view_subparsers.add_parser("get", help="读取视图资源描述")
|
|
13
|
+
get_parser.add_argument("--view-id", required=True)
|
|
14
|
+
get_parser.set_defaults(handler=_handle_get, format_hint="generic")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _handle_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
18
|
+
return context.resource.view_get(profile=args.profile, view_id=args.view_id)
|
|
@@ -10,6 +10,7 @@ from ..tools.auth_tools import AuthTools
|
|
|
10
10
|
from ..tools.code_block_tools import CodeBlockTools
|
|
11
11
|
from ..tools.import_tools import ImportTools
|
|
12
12
|
from ..tools.record_tools import RecordTools
|
|
13
|
+
from ..tools.resource_read_tools import ResourceReadTools
|
|
13
14
|
from ..tools.task_context_tools import TaskContextTools
|
|
14
15
|
from ..tools.workspace_tools import WorkspaceTools
|
|
15
16
|
|
|
@@ -21,6 +22,7 @@ class CliContext:
|
|
|
21
22
|
auth: AuthTools
|
|
22
23
|
workspace: WorkspaceTools
|
|
23
24
|
app: AppTools
|
|
25
|
+
resource: ResourceReadTools
|
|
24
26
|
record: RecordTools
|
|
25
27
|
code_block: CodeBlockTools
|
|
26
28
|
imports: ImportTools
|
|
@@ -40,6 +42,7 @@ def build_cli_context() -> CliContext:
|
|
|
40
42
|
auth=AuthTools(sessions, backend),
|
|
41
43
|
workspace=WorkspaceTools(sessions, backend),
|
|
42
44
|
app=AppTools(sessions, backend),
|
|
45
|
+
resource=ResourceReadTools(sessions, backend),
|
|
43
46
|
record=RecordTools(sessions, backend),
|
|
44
47
|
code_block=CodeBlockTools(sessions, backend),
|
|
45
48
|
imports=ImportTools(sessions, backend),
|