@josephyan/qingflow-app-builder-mcp 1.1.30 → 1.1.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.
Files changed (88) hide show
  1. package/README.md +6 -4
  2. package/docs/local-agent-install.md +57 -6
  3. package/entry_point.py +1 -1
  4. package/npm/bin/qingflow-app-builder-mcp.mjs +1 -1
  5. package/npm/bin/qingflow-skills.mjs +5 -0
  6. package/npm/lib/runtime.mjs +20 -59
  7. package/npm/scripts/postinstall.mjs +1 -10
  8. package/package.json +3 -2
  9. package/pyproject.toml +1 -1
  10. package/skills/qingflow-app-builder/SKILL.md +111 -55
  11. package/skills/qingflow-app-builder/references/complete-system-development-guide.md +169 -0
  12. package/skills/qingflow-app-builder/references/create-app.md +31 -24
  13. package/skills/qingflow-app-builder/references/environments.md +1 -1
  14. package/skills/qingflow-app-builder/references/gotchas.md +40 -14
  15. package/skills/qingflow-app-builder/references/match-rules.md +196 -85
  16. package/skills/qingflow-app-builder/references/public-surface-sync.md +2 -2
  17. package/skills/qingflow-app-builder/references/single-app-development-guide.md +84 -0
  18. package/skills/qingflow-app-builder/references/solution-playbooks.md +10 -0
  19. package/skills/qingflow-app-builder/references/tool-selection.md +40 -25
  20. package/skills/qingflow-app-builder/references/update-flow.md +27 -52
  21. package/skills/qingflow-app-builder/references/update-schema.md +14 -0
  22. package/skills/qingflow-app-builder/references/update-views.md +101 -32
  23. package/skills/qingflow-app-builder/scripts/validate_system_build_summary.py +124 -0
  24. package/skills/qingflow-app-builder-code-integrations/SKILL.md +5 -3
  25. package/skills/qingflow-app-builder-code-integrations/references/code-block.md +1 -1
  26. package/skills/qingflow-app-builder-code-integrations/references/q-linker.md +1 -1
  27. package/skills/qingflow-mcp-setup/SKILL.md +13 -9
  28. package/skills/qingflow-mcp-setup/references/claude-desktop.md +1 -1
  29. package/skills/qingflow-mcp-setup/references/environments.md +2 -1
  30. package/skills/qingflow-mcp-setup/references/generic-stdio.md +6 -5
  31. package/skills/qingflow-workflow-builder/SKILL.md +9 -7
  32. package/skills/qingflow-workflow-builder/references/01-overview.md +4 -2
  33. package/skills/qingflow-workflow-builder/references/03-flow-patterns.md +2 -0
  34. package/skills/qingflow-workflow-builder/references/06-stage3-build-spec.md +59 -7
  35. package/skills/qingflow-workflow-builder/references/07-stage4-validate-spec.md +14 -5
  36. package/skills/qingflow-workflow-builder/references/08-stage5-apply-verify.md +19 -3
  37. package/skills/qingflow-workflow-builder/references/11-troubleshooting.md +2 -0
  38. package/src/qingflow_mcp/__main__.py +6 -2
  39. package/src/qingflow_mcp/builder_facade/models.py +473 -138
  40. package/src/qingflow_mcp/builder_facade/service.py +6356 -1866
  41. package/src/qingflow_mcp/cli/commands/builder.py +358 -355
  42. package/src/qingflow_mcp/cli/commands/chart.py +1 -1
  43. package/src/qingflow_mcp/cli/commands/common.py +12 -3
  44. package/src/qingflow_mcp/cli/commands/exports.py +2 -2
  45. package/src/qingflow_mcp/cli/commands/imports.py +3 -3
  46. package/src/qingflow_mcp/cli/commands/portal.py +2 -2
  47. package/src/qingflow_mcp/cli/commands/record.py +101 -27
  48. package/src/qingflow_mcp/cli/commands/task.py +28 -47
  49. package/src/qingflow_mcp/cli/commands/view.py +1 -1
  50. package/src/qingflow_mcp/cli/context.py +0 -3
  51. package/src/qingflow_mcp/cli/formatters.py +784 -16
  52. package/src/qingflow_mcp/cli/main.py +120 -41
  53. package/src/qingflow_mcp/errors.py +43 -2
  54. package/src/qingflow_mcp/public_surface.py +26 -17
  55. package/src/qingflow_mcp/response_trim.py +81 -17
  56. package/src/qingflow_mcp/server.py +14 -12
  57. package/src/qingflow_mcp/server_app_builder.py +83 -39
  58. package/src/qingflow_mcp/server_app_user.py +22 -16
  59. package/src/qingflow_mcp/session_store.py +11 -7
  60. package/src/qingflow_mcp/solution/compiler/workflow_compiler.py +173 -0
  61. package/src/qingflow_mcp/solution/executor.py +114 -15
  62. package/src/qingflow_mcp/tools/ai_builder_tools.py +3571 -1473
  63. package/src/qingflow_mcp/tools/app_tools.py +184 -43
  64. package/src/qingflow_mcp/tools/approval_tools.py +197 -35
  65. package/src/qingflow_mcp/tools/auth_tools.py +92 -16
  66. package/src/qingflow_mcp/tools/code_block_tools.py +298 -40
  67. package/src/qingflow_mcp/tools/custom_button_tools.py +64 -10
  68. package/src/qingflow_mcp/tools/directory_tools.py +236 -72
  69. package/src/qingflow_mcp/tools/export_tools.py +244 -34
  70. package/src/qingflow_mcp/tools/feedback_tools.py +9 -0
  71. package/src/qingflow_mcp/tools/file_tools.py +9 -3
  72. package/src/qingflow_mcp/tools/import_tools.py +336 -49
  73. package/src/qingflow_mcp/tools/navigation_tools.py +91 -12
  74. package/src/qingflow_mcp/tools/package_tools.py +118 -6
  75. package/src/qingflow_mcp/tools/portal_tools.py +39 -3
  76. package/src/qingflow_mcp/tools/qingbi_report_tools.py +116 -7
  77. package/src/qingflow_mcp/tools/record_tools.py +1141 -356
  78. package/src/qingflow_mcp/tools/resource_read_tools.py +188 -39
  79. package/src/qingflow_mcp/tools/role_tools.py +80 -9
  80. package/src/qingflow_mcp/tools/solution_tools.py +57 -15
  81. package/src/qingflow_mcp/tools/task_context_tools.py +687 -159
  82. package/src/qingflow_mcp/tools/task_tools.py +113 -29
  83. package/src/qingflow_mcp/tools/view_tools.py +106 -3
  84. package/src/qingflow_mcp/tools/workflow_tools.py +17 -1
  85. package/src/qingflow_mcp/tools/workspace_tools.py +71 -3
  86. package/src/qingflow_mcp/version.py +0 -2
  87. package/skills/qingflow-app-builder/references/build-complete-system.md +0 -234
  88. package/skills/qingflow-app-builder/references/build-single-app.md +0 -138
package/README.md CHANGED
@@ -3,13 +3,13 @@
3
3
  Install:
4
4
 
5
5
  ```bash
6
- npm install @josephyan/qingflow-app-builder-mcp@1.1.30
6
+ npm install @josephyan/qingflow-app-builder-mcp@1.1.33
7
7
  ```
8
8
 
9
9
  Run:
10
10
 
11
11
  ```bash
12
- npx -y -p @josephyan/qingflow-app-builder-mcp@1.1.30 qingflow-app-builder-mcp
12
+ npx -y -p @josephyan/qingflow-app-builder-mcp@1.1.33 qingflow-app-builder-mcp
13
13
  ```
14
14
 
15
15
  Environment:
@@ -30,6 +30,8 @@ Bundled skills:
30
30
  Note:
31
31
 
32
32
  - The skill files are included in the npm package.
33
- - On install, the package installs bundled skills into `$CODEX_HOME/skills` (or `~/.codex/skills` if `CODEX_HOME` is unset) by symlink and refreshes them on package updates.
34
- - You can also run `qingflow-app-builder-mcp skills list` or `qingflow-app-builder-mcp skills install --agent codex|claude-code|cursor|generic --scope user|project [--copy] [--force]`.
33
+ - Installing the npm package does not overwrite agent skills automatically.
34
+ - To mount bundled skills from an installed package, run `qingflow-app-builder-mcp-skills install --agent codex --scope user`.
35
+ - For one-shot `npx -p` installs, prefer `--copy` because symlinks would point into the npm execution cache.
36
+ - Use `qingflow-app-builder-mcp-skills list` to inspect bundled skills. The installer defaults to symlinks for stable package installs and refuses to overwrite existing skills unless `--force` is provided.
35
37
  - If a stdio MCP client reports `Transport closed`, delete `.npm-python`, reinstall the package, and make sure CLI/user/builder packages are on the same version. The stdio entrypoints refuse runtime bootstrap so install logs never corrupt MCP stdout.
@@ -101,7 +101,51 @@ npm install /absolute/path/to/dist/npm/qingflow-tech-qingflow-app-builder-mcp-<v
101
101
  1. 创建 `.npm-python/`
102
102
  2. 在其中建立 Python 虚拟环境
103
103
  3. 执行 `pip install .`
104
- 4. 在安装位置暴露 `qingflow`、`qingflow-app-user-mcp`、`qingflow-app-builder-mcp` 命令
104
+ 4. 在安装位置暴露对应入口:CLI 包暴露 `qingflow` / `qingflow-skills`;app-user 包暴露 `qingflow-app-user-mcp` / `qingflow-app-user-mcp-skills`;app-builder 包暴露 `qingflow-app-builder-mcp` / `qingflow-app-builder-mcp-skills`
105
+ 5. 携带 `skills/<skill-name>/SKILL.md`,但不在 `postinstall` 阶段自动覆盖本机 agent skills
106
+
107
+ ## Skills 挂载
108
+
109
+ 显式查看包内 skills:
110
+
111
+ ```bash
112
+ qingflow-skills list
113
+ ```
114
+
115
+ 独立 MCP split 包使用包专属 skills 命令,避免全局安装多个包时发生 bin 覆盖:
116
+
117
+ ```bash
118
+ qingflow-app-user-mcp-skills list
119
+ qingflow-app-builder-mcp-skills list
120
+ ```
121
+
122
+ 显式挂载到 Codex 用户目录:
123
+
124
+ ```bash
125
+ qingflow-skills install --agent codex --scope user
126
+ ```
127
+
128
+ 如果通过一次性 `npx -p <package>` 执行安装,请加 `--copy`,避免 symlink 指向 npm 临时执行缓存:
129
+
130
+ ```bash
131
+ npx -y -p @qingflow-tech/qingflow-cli qingflow-skills install --agent codex --scope user --copy
132
+ ```
133
+
134
+ 也可以挂载到项目级 agent 目录:
135
+
136
+ ```bash
137
+ qingflow-skills install --agent claude-code --scope project
138
+ qingflow-skills install --agent cursor --scope project --copy
139
+ qingflow-skills install --agent all --scope project
140
+ ```
141
+
142
+ 默认行为:
143
+
144
+ - `--mode symlink`:使用 symlink,让 npm 包版本成为单一来源
145
+ - `--scope user`:安装到用户级 agent skills 目录
146
+ - `--agent codex`:目标 agent 为 Codex
147
+ - 不覆盖已有同名 skill;需要替换时显式加 `--force`
148
+ - 每次安装会在目标 skills 目录下写入 `.qingflow-skill-sources/<skill>.json`,记录 package、version、source、destination、agent、scope、mode
105
149
 
106
150
  ## 本地验证
107
151
 
@@ -110,24 +154,31 @@ npm install /absolute/path/to/dist/npm/qingflow-tech-qingflow-app-builder-mcp-<v
110
154
  ```bash
111
155
  cd qingflow-support/mcp-server
112
156
  node ./npm/bin/qingflow.mjs --help
157
+ node ./npm/bin/qingflow-skills.mjs list
113
158
  node ./npm/bin/qingflow-app-user-mcp.mjs
114
159
  node ./npm/bin/qingflow-app-builder-mcp.mjs
115
160
  ```
116
161
 
117
- 如果你是全局安装:
162
+ 如果你是全局安装对应包:
118
163
 
119
164
  ```bash
120
165
  qingflow --help
166
+ qingflow-skills list
121
167
  qingflow-app-user-mcp
168
+ qingflow-app-user-mcp-skills list
122
169
  qingflow-app-builder-mcp
170
+ qingflow-app-builder-mcp-skills list
123
171
  ```
124
172
 
125
- 如果你是把包安装到了某个本地 agent workspace,命令通常位于:
173
+ 如果你是把包安装到了某个本地 agent workspace,安装对应包后命令通常位于:
126
174
 
127
175
  ```bash
128
176
  /absolute/path/to/agent-workspace/node_modules/.bin/qingflow
177
+ /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-skills
129
178
  /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-user-mcp
179
+ /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-user-mcp-skills
130
180
  /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-builder-mcp
181
+ /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-builder-mcp-skills
131
182
  ```
132
183
 
133
184
  如果你是从 tgz 安装到某个空目录,命令通常位于:
@@ -217,7 +268,7 @@ qingflow-app-builder-mcp
217
268
  "command": "npx",
218
269
  "args": [
219
270
  "-y",
220
- "@josephyan/qingflow-app-user-mcp"
271
+ "@qingflow-tech/qingflow-app-user-mcp"
221
272
  ],
222
273
  "env": {
223
274
  "QINGFLOW_MCP_DEFAULT_BASE_URL": "https://qingflow.com/api",
@@ -230,7 +281,7 @@ qingflow-app-builder-mcp
230
281
  "command": "npx",
231
282
  "args": [
232
283
  "-y",
233
- "@josephyan/qingflow-app-builder-mcp"
284
+ "@qingflow-tech/qingflow-app-builder-mcp"
234
285
  ],
235
286
  "env": {
236
287
  "QINGFLOW_MCP_DEFAULT_BASE_URL": "https://qingflow.com/api",
@@ -272,7 +323,7 @@ npm install
272
323
 
273
324
  如果 MCP 客户端一调用工具就报 `Transport closed`,优先检查这几件事:
274
325
 
275
- 1. 不要混用不同版本的 `@josephyan/qingflow-cli`、`@josephyan/qingflow-app-user-mcp`、`@josephyan/qingflow-app-builder-mcp`
326
+ 1. 不要混用不同版本的 `@qingflow-tech/qingflow-cli`、`@qingflow-tech/qingflow-app-user-mcp`、`@qingflow-tech/qingflow-app-builder-mcp`
276
327
  2. 删除安装目录下的 `.npm-python`
277
328
  3. 重新执行 `npm install` 或重新安装对应 tgz/npm 包
278
329
  4. 再启动 MCP 客户端
package/entry_point.py CHANGED
@@ -7,7 +7,7 @@ src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "src"))
7
7
  if src_path not in sys.path:
8
8
  sys.path.insert(0, src_path)
9
9
 
10
- from qingflow_mcp.server import main
10
+ from qingflow_mcp.server_app_user import main
11
11
 
12
12
  if __name__ == "__main__":
13
13
  main()
@@ -24,7 +24,7 @@ function resolvePackageModule(metaUrl, ...segments) {
24
24
  if (!pkgName) {
25
25
  throw new Error(`Unknown qingflow command: ${binName}`);
26
26
  }
27
- const scope = process.env.QINGFLOW_NPM_SCOPE || "@josephyan";
27
+ const scope = process.env.QINGFLOW_NPM_SCOPE || "@qingflow-tech";
28
28
  const fromBin = path.join(scriptDir, "..", scope, pkgName, "npm", ...segments);
29
29
  if (fs.existsSync(fromBin)) {
30
30
  return pathToFileURL(fromBin).href;
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { getPackageRoot, runSkillsCli } from "../lib/runtime.mjs";
3
+
4
+ const packageRoot = getPackageRoot(import.meta.url);
5
+ runSkillsCli(packageRoot, process.argv.slice(2));
@@ -42,7 +42,7 @@ export function getPackageRoot(metaUrl) {
42
42
  if (!pkgName) {
43
43
  throw new Error(`Unknown qingflow command: ${binName}`);
44
44
  }
45
- const scope = process.env.QINGFLOW_NPM_SCOPE || "@josephyan";
45
+ const scope = process.env.QINGFLOW_NPM_SCOPE || "@qingflow-tech";
46
46
  return path.join(scriptDir, "..", scope, pkgName);
47
47
  }
48
48
  return path.resolve(scriptDir, "..", "..");
@@ -154,43 +154,6 @@ function writeSkillProvenance(skillsDestRoot, skillName, payload) {
154
154
  fs.writeFileSync(path.join(provenanceRoot, `${skillName}.json`), `${JSON.stringify(payload, null, 2)}\n`);
155
155
  }
156
156
 
157
- function sleepMs(ms) {
158
- Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
159
- }
160
-
161
- function withSkillInstallLock(skillsDestRoot, callback) {
162
- const lockDir = path.join(skillsDestRoot, ".qingflow-skill-install.lock");
163
- const startedAt = Date.now();
164
- while (true) {
165
- try {
166
- fs.mkdirSync(lockDir);
167
- break;
168
- } catch (error) {
169
- if (error.code !== "EEXIST") {
170
- throw error;
171
- }
172
- try {
173
- const stat = fs.statSync(lockDir);
174
- if (Date.now() - stat.mtimeMs > 300_000) {
175
- fs.rmSync(lockDir, { recursive: true, force: true });
176
- continue;
177
- }
178
- } catch {
179
- continue;
180
- }
181
- if (Date.now() - startedAt > 30_000) {
182
- throw new Error(`Timed out waiting for skill install lock: ${lockDir}`);
183
- }
184
- sleepMs(100);
185
- }
186
- }
187
- try {
188
- return callback();
189
- } finally {
190
- fs.rmSync(lockDir, { recursive: true, force: true });
191
- }
192
- }
193
-
194
157
  export function installBundledSkills(
195
158
  packageRoot,
196
159
  {
@@ -234,29 +197,27 @@ export function installBundledSkills(
234
197
  mode,
235
198
  };
236
199
 
237
- return withSkillInstallLock(skillsDestRoot, () => {
238
- for (const skillName of wanted) {
239
- const src = path.join(skillsSrc, skillName);
240
- const dest = path.join(skillsDestRoot, skillName);
241
- const installResult = installOneSkill(src, dest, { force, mode });
242
- result[installResult.status === "conflict" ? "conflicts" : installResult.status].push(skillName);
243
- if (installResult.status !== "conflict") {
244
- writeSkillProvenance(skillsDestRoot, skillName, {
245
- package: packageJson.name ?? null,
246
- version: packageJson.version ?? null,
247
- skill: skillName,
248
- source: src,
249
- destination: dest,
250
- agent,
251
- scope,
252
- mode,
253
- installed_at: new Date().toISOString(),
254
- });
255
- }
200
+ for (const skillName of wanted) {
201
+ const src = path.join(skillsSrc, skillName);
202
+ const dest = path.join(skillsDestRoot, skillName);
203
+ const installResult = installOneSkill(src, dest, { force, mode });
204
+ result[installResult.status === "conflict" ? "conflicts" : installResult.status].push(skillName);
205
+ if (installResult.status !== "conflict") {
206
+ writeSkillProvenance(skillsDestRoot, skillName, {
207
+ package: packageJson.name ?? null,
208
+ version: packageJson.version ?? null,
209
+ skill: skillName,
210
+ source: src,
211
+ destination: dest,
212
+ agent,
213
+ scope,
214
+ mode,
215
+ installed_at: new Date().toISOString(),
216
+ });
256
217
  }
218
+ }
257
219
 
258
- return result;
259
- });
220
+ return result;
260
221
  }
261
222
 
262
223
  function parseSkillsCliArgs(args) {
@@ -1,4 +1,4 @@
1
- import { ensurePythonEnv, getPackageRoot, installBundledSkills } from "../lib/runtime.mjs";
1
+ import { ensurePythonEnv, getPackageRoot } from "../lib/runtime.mjs";
2
2
 
3
3
  const packageRoot = getPackageRoot(import.meta.url);
4
4
 
@@ -6,15 +6,6 @@ try {
6
6
  console.log("[qingflow-mcp] Bootstrapping Python runtime...");
7
7
  ensurePythonEnv(packageRoot, { commandName: "qingflow-app-builder-mcp" });
8
8
  console.log("[qingflow-mcp] Python runtime is ready.");
9
- const skills = installBundledSkills(packageRoot, { force: true });
10
- if (!skills.skipped) {
11
- const changed = [
12
- skills.installed.length ? `installed=${skills.installed.join(",")}` : "",
13
- skills.unchanged.length ? `unchanged=${skills.unchanged.join(",")}` : "",
14
- skills.conflicts.length ? `conflicts=${skills.conflicts.join(",")}` : "",
15
- ].filter(Boolean).join(" ");
16
- console.log(`[qingflow-mcp] Installed skills to ${skills.destination}: ${changed || "none"}`);
17
- }
18
9
  } catch (error) {
19
10
  console.error(`[qingflow-mcp] postinstall failed: ${error.message}`);
20
11
  process.exit(1);
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@josephyan/qingflow-app-builder-mcp",
3
- "version": "1.1.30",
3
+ "version": "1.1.33",
4
4
  "description": "Builder MCP for Qingflow app/package/system design and staged solution workflows.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
8
- "qingflow-app-builder-mcp": "./npm/bin/qingflow-app-builder-mcp.mjs"
8
+ "qingflow-app-builder-mcp": "./npm/bin/qingflow-app-builder-mcp.mjs",
9
+ "qingflow-app-builder-mcp-skills": "./npm/bin/qingflow-skills.mjs"
9
10
  },
10
11
  "scripts": {
11
12
  "postinstall": "node ./npm/scripts/postinstall.mjs"
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.1.30"
7
+ version = "1.1.33"
8
8
  description = "User-authenticated MCP server for Qingflow"
9
9
  readme = "README.md"
10
10
  license = "MIT"