cardbuddy 0.13.3 → 0.14.1

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 (61) hide show
  1. package/README.md +7 -3
  2. package/dist/cli.js +4 -4
  3. package/dist/config.js +7 -7
  4. package/dist/init.js +15 -4
  5. package/dist/portGuard.js +2 -2
  6. package/dist/preview-editor/assets/index-DnXqKrCc.js +307 -0
  7. package/dist/preview-editor/assets/index-cbTCHp8J.css +1 -0
  8. package/dist/preview-editor/index.html +2 -2
  9. package/dist/standalone.js +14 -6
  10. package/dist/vendored/card-editor/api.js +6 -6
  11. package/dist/vendored/mcp/client.mjs +53 -3
  12. package/dist/vendored/mcp/tools.mjs +17 -1
  13. package/dist/vendored/server/core/ai-chat.js +1443 -271
  14. package/dist/vendored/server/core/cardFiles.js +271 -39
  15. package/dist/vendored/server/core/cardImportMeta.js +16 -0
  16. package/dist/vendored/server/core/chatHistory.js +122 -0
  17. package/dist/vendored/server/core/index.js +10 -3
  18. package/dist/vendored/server/core/turnJournal.js +386 -0
  19. package/dist/vendored/skills/card-skill-trainer/SKILL.md +399 -222
  20. package/dist/vendored/skills/card-skill-trainer/scripts/build_dataset.py +103 -19
  21. package/dist/vendored/skills/card-skill-trainer/scripts/diagnose_case.mjs +378 -200
  22. package/dist/vendored/skills/card-skill-trainer/scripts/lib/runs.mjs +147 -0
  23. package/dist/vendored/skills/card-skill-trainer/scripts/lib/scoring.mjs +297 -4
  24. package/dist/vendored/skills/card-skill-trainer/scripts/plan_next_round.mjs +484 -0
  25. package/dist/vendored/skills/card-skill-trainer/scripts/round_diff.mjs +77 -96
  26. package/dist/vendored/skills/card-skill-trainer/scripts/run_round.mjs +237 -62
  27. package/dist/vendored/skills/card-skill-trainer/scripts/score_round.mjs +74 -35
  28. package/dist/vendored/skills/dsl-card-ai/SKILL.md +15 -2
  29. package/dist/vendored/skills/dsl-card-generator/SKILL.md +5 -3
  30. package/dist/vendored/skills/dsl-card-generator/references/generation_pitfalls.md +120 -0
  31. package/dist/vendored/skills/dsl-card-generator/references/previewer_contract.md +10 -0
  32. package/dist/vendored/skills/dsl-card-generator/references/quickref.md +15 -1
  33. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/canvas-radar.json +2 -2
  34. package/dist/vendored/skills/dsl-card-generator/references/recipe_snippets/scatter-pill-band.json +10 -0
  35. package/dist/vendored/skills/dsl-card-generator/references/recipes.md +43 -1
  36. package/dist/vendored/skills/dsl-card-generator/references/rules.md +33 -6
  37. package/dist/vendored/skills/dsl-card-generator/references/slices_convention.md +12 -5
  38. package/dist/vendored/skills/dsl-card-generator/scripts/add_component.mjs +5 -10
  39. package/dist/vendored/skills/dsl-card-generator/scripts/crop_slices.mjs +47 -10
  40. package/dist/vendored/skills/dsl-card-generator/scripts/expand_ir.mjs +12 -4
  41. package/dist/vendored/skills/dsl-card-generator/scripts/lib/design_sample.mjs +388 -328
  42. package/dist/vendored/skills/dsl-card-generator/scripts/lib/slice_pixels.mjs +109 -0
  43. package/dist/vendored/skills/dsl-card-generator/scripts/render_card.mjs +45 -7
  44. package/dist/vendored/skills/dsl-card-generator/scripts/route_input.mjs +7 -3
  45. package/dist/vendored/skills/dsl-card-generator/scripts/spec_audit.mjs +110 -23
  46. package/dist/vendored/skills/dsl-card-generator/scripts/spec_to_schema_v3.mjs +2954 -127
  47. package/dist/vendored/skills/dsl-card-generator/scripts/spec_tree.mjs +128 -3
  48. package/dist/vendored/skills/dsl-card-generator/scripts/validate_schema.py +28 -0
  49. package/dist/vendored/skills/finmall-card-sync/SKILL.md +1 -1
  50. package/dist/vendored/skills/finmall-session-navigator/SKILL.md +1 -1
  51. package/dist/vendored/skills/finmall-session-navigator/scripts/session-manager.mjs +1 -1
  52. package/dist/vendored/skills/shared/finmall-config.mjs +4 -4
  53. package/dist/vendored/skills/sketch-spec-to-card/SKILL.md +2 -2
  54. package/dist/vendored/skills/sketch-spec-to-card/scripts/parse_meaxure.py +29 -2
  55. package/dist/vendored/tools/finmall-env.mjs +6 -6
  56. package/package.json +1 -1
  57. package/dist/preview-editor/assets/index-CQScMhyg.css +0 -1
  58. package/dist/preview-editor/assets/index-pW1J4vP3.js +0 -276
  59. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r038n.json +0 -43
  60. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r039n.json +0 -47
  61. package/dist/vendored/skills/card-skill-trainer/baselines/v3-r050n.json +0 -48
package/README.md CHANGED
@@ -125,10 +125,14 @@ agent 侧配置(`cwd` 必须是卡片工程根,读写才落在 `src/cards/`
125
125
 
126
126
  `cardbuddy init` 生成的工程已带 `npm run mcp` 脚本。回归见 `tools/tests/cardbuddy-mcp.test.mjs`。
127
127
 
128
+ > 第一次接 agent 的人建议先读 dsl-card 仓库的 `docs/CardBuddy MCP 新手教程.md`:角色拓扑、
129
+ > Codex / Claude / Cursor 三种注册配置、实测的完整编辑闭环、四个最常见的坑与排查手册。
130
+ > (该文件在仓库 `docs/` 下,不在本包 `files` 白名单内,故只给路径不给链接。)
131
+
128
132
  ### 工具对本地服务的依赖分档
129
133
 
130
134
  `--mcp` 自己不启服务。启动时自动注入 `CARD_ROOT=<工程根>` 与
131
- `CARD_API_BASE=http(s)://127.0.0.1:<端口>`(端口取 `FINMALL_CARD_PORT` / `DSL_DEV_PORT`,默认
135
+ `CARD_API_BASE=http(s)://127.0.0.1:<端口>`(端口取 `CARDBUDDY_CARD_PORT` / `DSL_DEV_PORT`,默认
132
136
  8787;已有同名环境变量时不覆盖),工具据此决定走 HTTP 还是本地降级:
133
137
 
134
138
  | 档 | 工具 |
@@ -292,7 +296,7 @@ DSL_DEV_HTTPS=1 cardbuddy
292
296
 
293
297
  ```bash
294
298
  npm run dev
295
- # → Vite dev server 端口 5180(由 .env.cb 的 FINMALL_DEV_PORT 控制)
299
+ # → Vite dev server 端口 5180(由 .env.cb 的 CARDBUDDY_DEV_PORT 控制)
296
300
  # 浏览器打开 http://localhost:5180
297
301
  ```
298
302
 
@@ -333,7 +337,7 @@ npm run dev:prod
333
337
 
334
338
  ### 前置条件
335
339
 
336
- - `.env.cb` 已存在(含 `FINMALL_BASE_URL` 远端基址、`FINMALL_DEV_PORT`)。缺它编辑器仍能起,只是远端资源代理会告警。
340
+ - `.env.cb` 已存在(含 `FINMALL_BASE_URL` 远端基址、`CARDBUDDY_DEV_PORT`)。缺它编辑器仍能起,只是远端资源代理会告警。
337
341
  - 首次跑前先 `npm install`(仓库根)。
338
342
 
339
343
  ### 服务侧单独起(调试 8787 本身)
package/dist/cli.js CHANGED
@@ -3,11 +3,11 @@
3
3
  * cardbuddy CLI 入口(npm 包名与可执行命令同为 cardbuddy;0.6.0 前叫 cardbuddy-dev)。
4
4
  *
5
5
  * 读取 cwd 下 .env / .env.cb / .env.cb.local(dotenv),启动本地开发服务(127.0.0.1)。
6
- * 配置项见 src/config.js(DSL_CARD_ROOT / FINMALL_CARD_PORT / DSL_DEV_PORT /
6
+ * 配置项见 src/config.js(DSL_CARD_ROOT / CARDBUDDY_CARD_PORT / DSL_DEV_PORT /
7
7
  * DSL_DEV_TOKEN / DSL_DEV_HTTPS / EDITOR_URL / DSL_EDITOR_SRC)。
8
8
  *
9
- * 端口约定:.env.cb 的 FINMALL_CARD_PORT 为「卡片开发服务端口」单一真值,
10
- * 主仓库由 tools/dev.mjs 把它注入为 DSL_DEV_PORT;此处直接用 FINMALL_CARD_PORT,
9
+ * 端口约定:.env.cb 的 CARDBUDDY_CARD_PORT 为「卡片开发服务端口」单一真值,
10
+ * 主仓库由 tools/dev.mjs 把它注入为 DSL_DEV_PORT;此处直接用 CARDBUDDY_CARD_PORT,
11
11
  * 使 demo(直接 npx cardbuddy 或 npm run dev,无启动器注入)也能经 .env.cb 生效。
12
12
  */
13
13
  import fs from 'node:fs'
@@ -92,7 +92,7 @@ if (args.includes('--help') || args.includes('-h')) {
92
92
 
93
93
  环境变量:
94
94
  DSL_CARD_ROOT 卡片仓库根目录(默认 cwd)
95
- DSL_DEV_PORT 本地服务端口(默认 8787,兼容 FINMALL_CARD_PORT)
95
+ DSL_DEV_PORT 本地服务端口(默认 8787,兼容 CARDBUDDY_CARD_PORT)
96
96
  DSL_DEV_HTTPS=1 启用自签 HTTPS
97
97
  DSL_DEV_TOKEN 可选鉴权 token
98
98
  DSL_DEV_PREVIEW=1 等价于 --preview
package/dist/config.js CHANGED
@@ -3,9 +3,9 @@
3
3
  *
4
4
  * 约定:
5
5
  * - 项目根默认 process.cwd(),可用 DSL_CARD_ROOT 覆盖。
6
- * - 监听端口默认 8787,由 FINMALL_CARD_PORT 控制(.env.cb 单一真值);
6
+ * - 监听端口默认 8787,由 CARDBUDDY_CARD_PORT 控制(.env.cb 单一真值);
7
7
  * 兼容旧 DSL_DEV_PORT(主仓库 tools/dev.mjs / prod-preview.mjs 注入)。
8
- * 前端 resolveApiBase 的 DEV 默认端口同样读 FINMALL_CARD_PORT,保持三者一致。
8
+ * 前端 resolveApiBase 的 DEV 默认端口同样读 CARDBUDDY_CARD_PORT,保持三者一致。
9
9
  * - 编辑器 URL 默认 http://127.0.0.1:5180(EDITOR_URL),供截图使用。
10
10
  * - 仅绑定 127.0.0.1;token / https 为可选增强。
11
11
  */
@@ -17,7 +17,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url))
17
17
 
18
18
  /**
19
19
  * 取「真实环境变量」的值:排除 cli.js 用 dotenv 从 .env / .env.cb / .env.cb.local 灌进来的那份。
20
- * 没有这层区分,工程里 .env.cb 写了 FINMALL_CARD_PORT=8787 时,命令行的
20
+ * 没有这层区分,工程里 .env.cb 写了 CARDBUDDY_CARD_PORT=8787 时,命令行的
21
21
  * `DSL_DEV_PORT=9000 cardbuddy` 会被文件值静默顶掉(实测踩过)——显式命令行覆盖必须赢。
22
22
  * @param {Record<string,string|undefined>} env
23
23
  * @param {string} key
@@ -34,12 +34,12 @@ export function loadConfig(env = process.env) {
34
34
  const root = env.DSL_CARD_ROOT
35
35
  ? path.resolve(env.DSL_CARD_ROOT)
36
36
  : process.cwd()
37
- // 端口优先级:真实环境变量(DSL_DEV_PORT > FINMALL_CARD_PORT)> .env 文件值
38
- // (FINMALL_CARD_PORT > DSL_DEV_PORT,文件层以 FINMALL_CARD_PORT 为单一真值)> 默认 8787。
37
+ // 端口优先级:真实环境变量(DSL_DEV_PORT > CARDBUDDY_CARD_PORT)> .env 文件值
38
+ // (CARDBUDDY_CARD_PORT > DSL_DEV_PORT,文件层以 CARDBUDDY_CARD_PORT 为单一真值)> 默认 8787。
39
39
  const port = Number(
40
40
  realEnvValue(env, 'DSL_DEV_PORT') ||
41
- realEnvValue(env, 'FINMALL_CARD_PORT') ||
42
- env.FINMALL_CARD_PORT ||
41
+ realEnvValue(env, 'CARDBUDDY_CARD_PORT') ||
42
+ env.CARDBUDDY_CARD_PORT ||
43
43
  env.DSL_DEV_PORT ||
44
44
  8787
45
45
  )
package/dist/init.js CHANGED
@@ -33,7 +33,7 @@ const ENV_TEMPLATE = `# CardBuddy 本地开发服务配置(共享层,可入
33
33
  # 个人机密(AI_API_KEY / FinMall 凭据等)请写 .env.cb.local,它覆盖本文件且不入库。
34
34
 
35
35
  # cardbuddy 本地服务端口(单一真值;编辑器前端也读它)
36
- FINMALL_CARD_PORT=8787
36
+ CARDBUDDY_CARD_PORT=8787
37
37
 
38
38
  # FinMall 远端站点基址(资源代理回源 / 同步 / 保存 / 切图上传用)
39
39
  FINMALL_BASE_URL=https://uat-pkg.finmall.com
@@ -42,7 +42,7 @@ FINMALL_WORKSPACE_ID=dev
42
42
  # 远端编辑器 Web 访问别名(站点下挂载路径)
43
43
  FINMALL_EDITOR_PATH=/ubomp-h5-sub
44
44
  # Chrome 远程调试端口(复用已登录的 FinMall 会话)
45
- FINMALL_CDP_PORT=9222
45
+ CARDBUDDY_CDP_PORT=9222
46
46
 
47
47
  # ---- AI 开发助手(自带网关,OpenAI 兼容 /chat/completions)----
48
48
  # AI_BASE_URL=https://your-gateway/openai/v1
@@ -54,6 +54,17 @@ FINMALL_CDP_PORT=9222
54
54
  # AI_ALLOW_SHELL=1
55
55
  # 单次输出上限:留空=自动(被 400 拒绝时自动减半重试)
56
56
  # AI_MAX_TOKENS=
57
+ # ---- 长程任务保活(建卡一轮几十分钟属正常,默认值已按此调好,一般不用改)----
58
+ # 上游多少毫秒不回任何字节算「网关静默」;静默会自动重试本步而不是整轮报废
59
+ # AI_STALL_TIMEOUT_MS=120000
60
+ # 网关静默后的自动重试次数(0=回到「一次静默即报错」)
61
+ # AI_STALL_RETRIES=3
62
+ # 单轮「纯思考」预算:到点催促 + 关深度思考重试,催促 3 次仍无产出则停用该熔断(改由墙钟兜底)
63
+ # AI_REASONING_TIMEOUT_MS=600000
64
+ # 模型没给收尾标记([任务完成] / [需用户确认])就停手时的自动续跑次数上限(0=关闭,等你手打「继续」)
65
+ # AI_AUTO_CONTINUE=12
66
+ # 单轮墙钟上限:唯一能兜住「无限跑下去」的闸门,到点收尾汇报(上下文不丢)
67
+ # AI_TURN_TIMEOUT_MS=3600000
57
68
  `
58
69
 
59
70
  /** .gitignore 应包含的条目(缺哪条补哪条,不重写既有内容) */
@@ -157,7 +168,7 @@ npm run dev # 等价于 npx cardbuddy
157
168
  \`\`\`
158
169
 
159
170
  然后在线上编辑器 **设置 → 本地开发服务** 里打开开关、填 \`http://127.0.0.1:8787\`
160
- (须与 \`.env.cb\` 的 \`FINMALL_CARD_PORT\` 一致)。
171
+ (须与 \`.env.cb\` 的 \`CARDBUDDY_CARD_PORT\` 一致)。
161
172
 
162
173
  ## 目录约定
163
174
 
@@ -220,7 +231,7 @@ npm run link:skills # 交互式选择 Codex / Claude / WorkBuddy 等,建立
220
231
  | **必须**另起服务 **且**已登录 FinMall | \`card_sync\` \`card_save\` \`card_slice_upload\` |
221
232
 
222
233
  \`--mcp\` 会自动把 \`CARD_ROOT\` 指到本工程根、\`CARD_API_BASE\` 指到 \`.env.cb\` 的
223
- \`FINMALL_CARD_PORT\`(默认 8787)。**别直接跑包内 \`vendored/mcp/server.mjs\`**:那样
234
+ \`CARDBUDDY_CARD_PORT\`(默认 8787)。**别直接跑包内 \`vendored/mcp/server.mjs\`**:那样
224
235
  \`CARD_ROOT\` 会落到 node_modules 里的快照目录(\`card_list\` 返回 0 张卡),端口也回退到
225
236
  5180(\`card_render_status\` 直接报 \`dev-server-required\`)。排查时可设
226
237
  \`CARDBUDDY_MCP_VERBOSE=1\` 让启动信息打到 stderr。
package/dist/portGuard.js CHANGED
@@ -249,7 +249,7 @@ export async function ensurePortFree({
249
249
  const before = await probePort(port, host)
250
250
  if (before.free) return result
251
251
  if (before.code !== 'EADDRINUSE') {
252
- throw new Error(`端口 ${port} 无法绑定(${before.code})。请检查权限,或用 FINMALL_CARD_PORT 换一个端口。`)
252
+ throw new Error(`端口 ${port} 无法绑定(${before.code})。请检查权限,或用 CARDBUDDY_CARD_PORT 换一个端口。`)
253
253
  }
254
254
 
255
255
  const owners = await findPortOwners(port)
@@ -281,7 +281,7 @@ export async function ensurePortFree({
281
281
  const list = result.skipped.map((o) => `PID ${o.pid}${o.command ? ` — ${o.command}` : ''}`).join('\n ')
282
282
  throw new Error(
283
283
  `端口 ${port} 被非 cardbuddy 进程占用,未自动结束:\n ${list}\n` +
284
- `请手动处理(${manualHint(port)}),或用 FINMALL_CARD_PORT 换端口;确需强制接管设 DSL_DEV_PORT_TAKEOVER=force。`
284
+ `请手动处理(${manualHint(port)}),或用 CARDBUDDY_CARD_PORT 换端口;确需强制接管设 DSL_DEV_PORT_TAKEOVER=force。`
285
285
  )
286
286
  }
287
287