@qingflow-tech/qingflow-app-builder-mcp 1.0.32 → 1.0.33

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 @qingflow-tech/qingflow-app-builder-mcp@1.0.32
6
+ npm install @qingflow-tech/qingflow-app-builder-mcp@1.0.33
7
7
  ```
8
8
 
9
9
  Run:
10
10
 
11
11
  ```bash
12
- npx -y -p @qingflow-tech/qingflow-app-builder-mcp@1.0.32 qingflow-app-builder-mcp
12
+ npx -y -p @qingflow-tech/qingflow-app-builder-mcp@1.0.33 qingflow-app-builder-mcp
13
13
  ```
14
14
 
15
15
  Environment:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qingflow-tech/qingflow-app-builder-mcp",
3
- "version": "1.0.32",
3
+ "version": "1.0.33",
4
4
  "description": "Builder MCP for Qingflow app/package/system design and staged solution workflows.",
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 = "1.0.32"
7
+ version = "1.0.33"
8
8
  description = "User-authenticated MCP server for Qingflow"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -9,6 +9,7 @@ from ..errors import QingflowApiError, backend_code_value_int, message_looks_lik
9
9
  from ..public_surface import cli_public_tool_spec_from_namespace
10
10
  from ..response_trim import resolve_cli_tool_name, trim_error_response, trim_public_response
11
11
  from ..tools.ai_builder_tools import _attach_builder_apply_envelope
12
+ from ..version import get_cli_version
12
13
  from .context import CliContext, build_cli_context
13
14
  from .formatters import emit_json_result, emit_text_result
14
15
  from .commands import register_all_commands
@@ -34,7 +35,10 @@ def build_parser() -> argparse.ArgumentParser:
34
35
  parser = _QingflowArgumentParser(prog="qingflow", description="Qingflow CLI")
35
36
  parser.add_argument("--profile", default="default", help="会话 profile,默认 default")
36
37
  parser.add_argument("--json", action="store_true", help="输出 JSON")
38
+ parser.add_argument("--version", action="store_true", help="输出 Qingflow CLI 版本")
37
39
  subparsers = parser.add_subparsers(dest="command", required=True)
40
+ version_parser = subparsers.add_parser("version", help="输出 Qingflow CLI 版本")
41
+ version_parser.set_defaults(handler=_handle_version, format_hint="version")
38
42
  register_all_commands(subparsers)
39
43
  return parser
40
44
 
@@ -54,6 +58,8 @@ def run(
54
58
  err = stderr or sys.stderr
55
59
  parser = build_parser()
56
60
  normalized_argv = _normalize_global_args(list(argv) if argv is not None else sys.argv[1:])
61
+ if "--version" in normalized_argv:
62
+ return _emit_version(json_mode=_should_force_json_output_argv_for_version(normalized_argv), stdout=out)
57
63
  try:
58
64
  args = parser.parse_args(normalized_argv)
59
65
  except _CliArgumentError as exc:
@@ -76,6 +82,8 @@ def run(
76
82
  setattr(args, "_stdin", sys.stdin)
77
83
  setattr(args, "_stdout_stream", out)
78
84
  setattr(args, "_stderr_stream", err)
85
+ if getattr(args, "command", "") == "version":
86
+ return _emit_version(json_mode=bool(args.json), stdout=out)
79
87
  handler = getattr(args, "handler", None)
80
88
  if handler is None:
81
89
  parser.print_help(out)
@@ -111,6 +119,37 @@ def run(
111
119
  return exit_code
112
120
 
113
121
 
122
+ def _handle_version(_args: argparse.Namespace, _context: CliContext) -> dict[str, Any]:
123
+ version = get_cli_version()
124
+ return {
125
+ "ok": True,
126
+ "status": "success",
127
+ "version": version,
128
+ "package": "@qingflow-tech/qingflow-cli",
129
+ }
130
+
131
+
132
+ def _emit_version(*, json_mode: bool, stdout: TextIO) -> int:
133
+ version = get_cli_version()
134
+ if json_mode:
135
+ emit_json_result(
136
+ {
137
+ "ok": True,
138
+ "status": "success",
139
+ "version": version,
140
+ "package": "@qingflow-tech/qingflow-cli",
141
+ },
142
+ stream=stdout,
143
+ )
144
+ else:
145
+ stdout.write(f"{version}\n")
146
+ return 0
147
+
148
+
149
+ def _should_force_json_output_argv_for_version(argv: list[str]) -> bool:
150
+ return "--json" in argv
151
+
152
+
114
153
  def _normalize_global_args(argv: list[str]) -> list[str]:
115
154
  global_args: list[str] = []
116
155
  remaining: list[str] = []
@@ -121,6 +160,10 @@ def _normalize_global_args(argv: list[str]) -> list[str]:
121
160
  global_args.append(token)
122
161
  index += 1
123
162
  continue
163
+ if token == "--version":
164
+ global_args.append(token)
165
+ index += 1
166
+ continue
124
167
  if token == "--profile":
125
168
  global_args.append(token)
126
169
  if index + 1 >= len(argv):
@@ -0,0 +1,40 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from importlib import metadata
5
+ from pathlib import Path
6
+
7
+
8
+ def get_cli_version() -> str:
9
+ package_json_version = _find_package_json_version()
10
+ if package_json_version:
11
+ return package_json_version
12
+ try:
13
+ return metadata.version("qingflow-mcp")
14
+ except metadata.PackageNotFoundError:
15
+ return "0+local"
16
+
17
+
18
+ def _find_package_json_version() -> str | None:
19
+ current = Path(__file__).resolve()
20
+ for parent in current.parents:
21
+ package_json = parent / "package.json"
22
+ if not package_json.exists():
23
+ continue
24
+ try:
25
+ payload = json.loads(package_json.read_text(encoding="utf-8"))
26
+ except (OSError, json.JSONDecodeError):
27
+ continue
28
+ name = str(payload.get("name") or "")
29
+ version = str(payload.get("version") or "")
30
+ if version and name in {
31
+ "qingflow-mcp-workspace",
32
+ "@qingflow-tech/qingflow-cli",
33
+ "@qingflow-tech/qingflow-app-user-mcp",
34
+ "@qingflow-tech/qingflow-app-builder-mcp",
35
+ "@josephyan/qingflow-cli",
36
+ "@josephyan/qingflow-app-user-mcp",
37
+ "@josephyan/qingflow-app-builder-mcp",
38
+ }:
39
+ return version
40
+ return None