@josephyan/qingflow-cli 0.2.0-beta.1000
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 +31 -0
- package/docs/local-agent-install.md +309 -0
- package/entry_point.py +13 -0
- package/npm/bin/qingflow.mjs +5 -0
- package/npm/lib/runtime.mjs +346 -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 +37 -0
- package/src/qingflow_mcp/__main__.py +5 -0
- package/src/qingflow_mcp/backend_client.py +649 -0
- package/src/qingflow_mcp/builder_facade/__init__.py +3 -0
- package/src/qingflow_mcp/builder_facade/models.py +1846 -0
- package/src/qingflow_mcp/builder_facade/service.py +16502 -0
- package/src/qingflow_mcp/cli/__init__.py +1 -0
- package/src/qingflow_mcp/cli/commands/__init__.py +18 -0
- package/src/qingflow_mcp/cli/commands/app.py +40 -0
- package/src/qingflow_mcp/cli/commands/auth.py +112 -0
- package/src/qingflow_mcp/cli/commands/builder.py +539 -0
- package/src/qingflow_mcp/cli/commands/chart.py +18 -0
- package/src/qingflow_mcp/cli/commands/common.py +62 -0
- package/src/qingflow_mcp/cli/commands/imports.py +96 -0
- package/src/qingflow_mcp/cli/commands/portal.py +25 -0
- package/src/qingflow_mcp/cli/commands/record.py +331 -0
- package/src/qingflow_mcp/cli/commands/repo.py +80 -0
- package/src/qingflow_mcp/cli/commands/task.py +141 -0
- package/src/qingflow_mcp/cli/commands/view.py +18 -0
- package/src/qingflow_mcp/cli/commands/workspace.py +110 -0
- package/src/qingflow_mcp/cli/context.py +60 -0
- package/src/qingflow_mcp/cli/formatters.py +573 -0
- package/src/qingflow_mcp/cli/json_io.py +50 -0
- package/src/qingflow_mcp/cli/main.py +186 -0
- package/src/qingflow_mcp/cli/qingflow_login.py +116 -0
- package/src/qingflow_mcp/cli/terminal_ui.py +173 -0
- package/src/qingflow_mcp/config.py +407 -0
- package/src/qingflow_mcp/errors.py +66 -0
- package/src/qingflow_mcp/id_utils.py +49 -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/public_surface.py +243 -0
- package/src/qingflow_mcp/repository_store.py +71 -0
- package/src/qingflow_mcp/response_trim.py +841 -0
- package/src/qingflow_mcp/server.py +216 -0
- package/src/qingflow_mcp/server_app_builder.py +543 -0
- package/src/qingflow_mcp/server_app_user.py +386 -0
- package/src/qingflow_mcp/session_store.py +369 -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 +495 -0
- package/src/qingflow_mcp/solution/compiler/icon_utils.py +187 -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 +2398 -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 +855 -0
- package/src/qingflow_mcp/tools/__init__.py +1 -0
- package/src/qingflow_mcp/tools/ai_builder_tools.py +3449 -0
- package/src/qingflow_mcp/tools/app_tools.py +926 -0
- package/src/qingflow_mcp/tools/approval_tools.py +1062 -0
- package/src/qingflow_mcp/tools/auth_tools.py +1133 -0
- package/src/qingflow_mcp/tools/base.py +281 -0
- package/src/qingflow_mcp/tools/code_block_tools.py +777 -0
- package/src/qingflow_mcp/tools/custom_button_tools.py +202 -0
- package/src/qingflow_mcp/tools/directory_tools.py +675 -0
- package/src/qingflow_mcp/tools/feedback_tools.py +238 -0
- package/src/qingflow_mcp/tools/file_tools.py +409 -0
- package/src/qingflow_mcp/tools/import_tools.py +2223 -0
- package/src/qingflow_mcp/tools/navigation_tools.py +210 -0
- package/src/qingflow_mcp/tools/package_tools.py +326 -0
- package/src/qingflow_mcp/tools/portal_tools.py +158 -0
- package/src/qingflow_mcp/tools/qingbi_report_tools.py +374 -0
- package/src/qingflow_mcp/tools/record_tools.py +14291 -0
- package/src/qingflow_mcp/tools/repository_dev_tools.py +552 -0
- package/src/qingflow_mcp/tools/resource_read_tools.py +503 -0
- package/src/qingflow_mcp/tools/role_tools.py +112 -0
- package/src/qingflow_mcp/tools/solution_tools.py +4054 -0
- package/src/qingflow_mcp/tools/task_context_tools.py +2986 -0
- package/src/qingflow_mcp/tools/task_tools.py +889 -0
- package/src/qingflow_mcp/tools/view_tools.py +335 -0
- package/src/qingflow_mcp/tools/workflow_tools.py +376 -0
- package/src/qingflow_mcp/tools/workspace_tools.py +266 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__all__: list[str] = []
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
|
|
5
|
+
from . import app, auth, builder, chart, imports, portal, record, task, view, workspace
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def register_all_commands(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
9
|
+
auth.register(subparsers)
|
|
10
|
+
workspace.register(subparsers)
|
|
11
|
+
app.register(subparsers)
|
|
12
|
+
portal.register(subparsers)
|
|
13
|
+
view.register(subparsers)
|
|
14
|
+
chart.register(subparsers)
|
|
15
|
+
record.register(subparsers)
|
|
16
|
+
imports.register(subparsers)
|
|
17
|
+
task.register(subparsers)
|
|
18
|
+
builder.register(subparsers)
|
|
@@ -0,0 +1,40 @@
|
|
|
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("app", help="应用发现")
|
|
10
|
+
app_subparsers = parser.add_subparsers(dest="app_command", required=True)
|
|
11
|
+
|
|
12
|
+
list_parser = app_subparsers.add_parser("list", help="列出可见应用")
|
|
13
|
+
list_parser.set_defaults(handler=_handle_list, format_hint="app_list")
|
|
14
|
+
|
|
15
|
+
search = app_subparsers.add_parser("search", help="搜索应用")
|
|
16
|
+
search.add_argument("--keyword", default="")
|
|
17
|
+
search.add_argument("--page", type=int, default=1)
|
|
18
|
+
search.add_argument("--page-size", type=int, default=50)
|
|
19
|
+
search.set_defaults(handler=_handle_search, format_hint="app_search")
|
|
20
|
+
|
|
21
|
+
get = app_subparsers.add_parser("get", help="读取应用可访问视图与导入能力")
|
|
22
|
+
get.add_argument("--app-key", required=True)
|
|
23
|
+
get.set_defaults(handler=_handle_get, format_hint="app_get")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _handle_list(args: argparse.Namespace, context: CliContext) -> dict:
|
|
27
|
+
return context.app.app_list(profile=args.profile)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _handle_search(args: argparse.Namespace, context: CliContext) -> dict:
|
|
31
|
+
return context.app.app_search(
|
|
32
|
+
profile=args.profile,
|
|
33
|
+
keyword=args.keyword,
|
|
34
|
+
page_num=args.page,
|
|
35
|
+
page_size=args.page_size,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _handle_get(args: argparse.Namespace, context: CliContext) -> dict:
|
|
40
|
+
return context.app.app_get(profile=args.profile, app_key=args.app_key)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import getpass
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
from ...errors import QingflowApiError
|
|
8
|
+
from ..context import CliContext
|
|
9
|
+
from ..qingflow_login import login_with_qingflow_password
|
|
10
|
+
from .common import read_secret_arg
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
14
|
+
parser = subparsers.add_parser("auth", help="认证与会话")
|
|
15
|
+
auth_subparsers = parser.add_subparsers(dest="auth_command", required=True)
|
|
16
|
+
|
|
17
|
+
login = auth_subparsers.add_parser("login", help="登录 CLI:轻流账号密码交互")
|
|
18
|
+
login.add_argument("--base-url")
|
|
19
|
+
login.add_argument("--qf-version")
|
|
20
|
+
login.add_argument("--email", help="轻流账号邮箱;不传时在交互终端提示输入")
|
|
21
|
+
login.add_argument("--password", help="轻流账号密码;建议仅用于本地调试,脚本请优先使用 --password-stdin")
|
|
22
|
+
login.add_argument("--password-stdin", action="store_true", help="从标准输入读取轻流账号密码")
|
|
23
|
+
login.add_argument("--persist", action=argparse.BooleanOptionalAction, default=True)
|
|
24
|
+
login.set_defaults(handler=_handle_login, format_hint="auth_whoami")
|
|
25
|
+
|
|
26
|
+
use_credential = auth_subparsers.add_parser("use-credential", help="直接注入 credential")
|
|
27
|
+
use_credential.add_argument("--base-url")
|
|
28
|
+
use_credential.add_argument("--qf-version")
|
|
29
|
+
use_credential.add_argument("--credential")
|
|
30
|
+
use_credential.add_argument("--credential-stdin", action="store_true")
|
|
31
|
+
use_credential.add_argument("--persist", action=argparse.BooleanOptionalAction, default=False)
|
|
32
|
+
use_credential.set_defaults(handler=_handle_use_credential, format_hint="auth_whoami")
|
|
33
|
+
|
|
34
|
+
whoami = auth_subparsers.add_parser("whoami", help="查看当前登录态")
|
|
35
|
+
whoami.set_defaults(handler=_handle_whoami, format_hint="auth_whoami")
|
|
36
|
+
|
|
37
|
+
logout = auth_subparsers.add_parser("logout", help="退出登录")
|
|
38
|
+
logout.add_argument("--forget-persisted", action="store_true")
|
|
39
|
+
logout.set_defaults(handler=_handle_logout, format_hint="")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _handle_login(args: argparse.Namespace, context: CliContext) -> dict:
|
|
43
|
+
email = _resolve_login_email(args)
|
|
44
|
+
password = _resolve_login_password(args)
|
|
45
|
+
login_result = login_with_qingflow_password(
|
|
46
|
+
base_url=args.base_url,
|
|
47
|
+
email=email,
|
|
48
|
+
password=password,
|
|
49
|
+
)
|
|
50
|
+
result = context.auth.auth_use_token(
|
|
51
|
+
profile=args.profile,
|
|
52
|
+
base_url=args.base_url,
|
|
53
|
+
qf_version=args.qf_version,
|
|
54
|
+
token=login_result.token,
|
|
55
|
+
login_token=login_result.login_token,
|
|
56
|
+
user_info=login_result.user_info,
|
|
57
|
+
persist=bool(args.persist),
|
|
58
|
+
)
|
|
59
|
+
warnings = list(result.get("warnings") or []) if isinstance(result, dict) else []
|
|
60
|
+
if isinstance(result, dict):
|
|
61
|
+
result["cli_auth"] = {"flow": login_result.flow}
|
|
62
|
+
if warnings:
|
|
63
|
+
result["warnings"] = warnings
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _resolve_login_email(args: argparse.Namespace) -> str:
|
|
68
|
+
email = str(args.email or "").strip()
|
|
69
|
+
if email:
|
|
70
|
+
return email
|
|
71
|
+
if sys.stdin.isatty():
|
|
72
|
+
return input("Qingflow email: ").strip()
|
|
73
|
+
raise QingflowApiError.config_error(
|
|
74
|
+
"qingflow auth login needs an interactive terminal, or pass --email with --password-stdin."
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _resolve_login_password(args: argparse.Namespace) -> str:
|
|
79
|
+
if args.password or bool(args.password_stdin):
|
|
80
|
+
return read_secret_arg(
|
|
81
|
+
args.password,
|
|
82
|
+
stdin_enabled=bool(args.password_stdin),
|
|
83
|
+
label="password",
|
|
84
|
+
)
|
|
85
|
+
if sys.stdin.isatty():
|
|
86
|
+
return getpass.getpass("Qingflow password: ")
|
|
87
|
+
raise QingflowApiError.config_error(
|
|
88
|
+
"qingflow auth login needs an interactive terminal or --password-stdin."
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _handle_use_credential(args: argparse.Namespace, context: CliContext) -> dict:
|
|
93
|
+
credential = (
|
|
94
|
+
read_secret_arg(args.credential, stdin_enabled=bool(args.credential_stdin), label="credential")
|
|
95
|
+
if args.credential or bool(args.credential_stdin)
|
|
96
|
+
else ""
|
|
97
|
+
)
|
|
98
|
+
return context.auth.auth_use_credential(
|
|
99
|
+
profile=args.profile,
|
|
100
|
+
base_url=args.base_url,
|
|
101
|
+
qf_version=args.qf_version,
|
|
102
|
+
credential=credential,
|
|
103
|
+
persist=bool(args.persist),
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _handle_whoami(args: argparse.Namespace, context: CliContext) -> dict:
|
|
108
|
+
return context.auth.auth_whoami(profile=args.profile)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _handle_logout(args: argparse.Namespace, context: CliContext) -> dict:
|
|
112
|
+
return context.auth.auth_logout(profile=args.profile, forget_persisted=bool(args.forget_persisted))
|