@qingflow-tech/qingflow-app-builder-mcp 1.0.17 → 1.0.18

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.17
6
+ npm install @qingflow-tech/qingflow-app-builder-mcp@1.0.18
7
7
  ```
8
8
 
9
9
  Run:
10
10
 
11
11
  ```bash
12
- npx -y -p @qingflow-tech/qingflow-app-builder-mcp@1.0.17 qingflow-app-builder-mcp
12
+ npx -y -p @qingflow-tech/qingflow-app-builder-mcp@1.0.18 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.17",
3
+ "version": "1.0.18",
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.17"
7
+ version = "1.0.18"
8
8
  description = "User-authenticated MCP server for Qingflow"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -25,14 +25,14 @@ def register(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) ->
25
25
  repair.add_argument("--authorized-file-modification", action="store_true")
26
26
  repair.add_argument("--output-path")
27
27
  repair.add_argument("--repair", dest="selected_repairs", action="append", default=[])
28
- repair.set_defaults(handler=_handle_repair, format_hint="")
28
+ repair.set_defaults(handler=_handle_repair, format_hint="import_repair")
29
29
 
30
30
  start = import_subparsers.add_parser("start", help="启动导入")
31
31
  start.add_argument("--app-key", required=True)
32
32
  start.add_argument("--verification-id", required=True)
33
33
  start.add_argument("--being-enter-auditing", type=parse_bool_text, required=True)
34
34
  start.add_argument("--view-key")
35
- start.set_defaults(handler=_handle_start, format_hint="")
35
+ start.set_defaults(handler=_handle_start, format_hint="import_start")
36
36
 
37
37
  status = import_subparsers.add_parser("status", help="查询导入状态")
38
38
  status.add_argument("--app-key")
@@ -741,6 +741,59 @@ def _format_import_status(result: dict[str, Any]) -> str:
741
741
  return "\n".join(lines) + "\n"
742
742
 
743
743
 
744
+ def _format_import_repair(result: dict[str, Any]) -> str:
745
+ lines = [
746
+ f"Status: {result.get('status') or '-'}",
747
+ f"Source File: {result.get('source_file_path') or '-'}",
748
+ f"Repaired File: {result.get('repaired_file_path') or '-'}",
749
+ f"Can Import After Repair: {result.get('can_import_after_repair')}",
750
+ ]
751
+ verification_id = result.get("verification_id") or result.get("new_verification_id")
752
+ if verification_id:
753
+ lines.append(f"Verification ID: {verification_id}")
754
+ applied_repairs = result.get("applied_repairs") if isinstance(result.get("applied_repairs"), list) else []
755
+ skipped_repairs = result.get("skipped_repairs") if isinstance(result.get("skipped_repairs"), list) else []
756
+ lines.append(f"Applied Repairs: {', '.join(map(str, applied_repairs)) if applied_repairs else '-'}")
757
+ if skipped_repairs:
758
+ lines.append(f"Skipped Repairs: {', '.join(map(str, skipped_repairs))}")
759
+ issue_summary = result.get("post_repair_issue_summary") if isinstance(result.get("post_repair_issue_summary"), dict) else {}
760
+ if issue_summary:
761
+ lines.append(
762
+ "Post Repair Issues: "
763
+ f"total={issue_summary.get('total', 0)}, "
764
+ f"errors={issue_summary.get('errors', 0)}, "
765
+ f"warnings={issue_summary.get('warnings', 0)}"
766
+ )
767
+ _append_warnings(lines, result.get("warnings"))
768
+ _append_verification(lines, result.get("verification"))
769
+ return "\n".join(lines) + "\n"
770
+
771
+
772
+ def _format_import_start(result: dict[str, Any]) -> str:
773
+ lines = [
774
+ f"Status: {result.get('status') or '-'}",
775
+ f"Accepted: {result.get('accepted')}",
776
+ f"Write Executed: {result.get('write_executed')}",
777
+ f"Safe To Retry: {result.get('safe_to_retry')}",
778
+ f"Import ID: {result.get('import_id') or '-'}",
779
+ f"Process ID: {result.get('process_id_str') or '-'}",
780
+ ]
781
+ if result.get("file_url"):
782
+ lines.append(f"File URL: {result.get('file_url')}")
783
+ for key, label in (
784
+ ("total", "Total Rows"),
785
+ ("finished", "Finished Rows"),
786
+ ("succeeded", "Succeeded Rows"),
787
+ ("failed", "Failed Rows"),
788
+ ):
789
+ value = result.get(key)
790
+ if value not in (None, ""):
791
+ lines.append(f"{label}: {value}")
792
+ _append_warnings(lines, result.get("warnings"))
793
+ _append_verification(lines, result.get("verification"))
794
+ return "\n".join(lines) + "\n"
795
+
796
+
744
797
  def _format_export_common(result: dict[str, Any], *, title: str | None = None) -> str:
745
798
  lines: list[str] = []
746
799
  if title:
@@ -1029,6 +1082,8 @@ _FORMATTERS = {
1029
1082
  "task_associated_report_detail_get": _format_task_associated_report_detail,
1030
1083
  "import_template": _format_import_template,
1031
1084
  "import_verify": _format_import_verify,
1085
+ "import_repair": _format_import_repair,
1086
+ "import_start": _format_import_start,
1032
1087
  "import_status": _format_import_status,
1033
1088
  "export_start": _format_export_start,
1034
1089
  "export_status": _format_export_status,