cardbuddy 0.19.3 → 0.21.0

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 (29) hide show
  1. package/README.md +8 -8
  2. package/dist/cli.js +21 -8
  3. package/dist/init.js +3 -3
  4. package/dist/preview-editor/assets/codeBridgeHeartbeat.worker-Zb_A5RUd.js +1 -0
  5. package/dist/preview-editor/assets/index-C8VLzU18.css +1 -0
  6. package/dist/preview-editor/assets/index-CpDojF__.js +383 -0
  7. package/dist/preview-editor/index.html +2 -2
  8. package/dist/skills-upgrade.js +64 -25
  9. package/dist/standalone.js +49 -0
  10. package/dist/vendored/card-editor/components/MultiColumn.vue +19 -10
  11. package/dist/vendored/card-editor/runtime/card-runtime.js +1 -1
  12. package/dist/vendored/mcp/client.mjs +22 -3
  13. package/dist/vendored/server/core/ai-chat.js +92 -12
  14. package/dist/vendored/server/core/cardExport.js +831 -0
  15. package/dist/vendored/server/core/cardHistoryRemote.js +203 -0
  16. package/dist/vendored/server/core/cardImportMeta.js +6 -1
  17. package/dist/vendored/server/core/cardPublishVersions.js +91 -0
  18. package/dist/vendored/server/core/cardSave.js +143 -6
  19. package/dist/vendored/server/core/cardSync.js +467 -95
  20. package/dist/vendored/server/core/codeBridge.js +4 -2
  21. package/dist/vendored/server/core/index.js +16 -0
  22. package/dist/vendored/skills/finmall-card-sync/SKILL.md +46 -0
  23. package/dist/vendored/skills/finmall-card-sync/scripts/api_batch_sync.mjs +657 -15
  24. package/dist/vendored/skills/finmall-session-navigator/scripts/finmall_login.mjs +79 -8
  25. package/dist/vendored/skills/finmall-session-navigator/scripts/session-manager.mjs +25 -1
  26. package/dist/vendored/skills/mbank-design-gen/tools/screenshot.mjs +10 -1
  27. package/package.json +1 -1
  28. package/dist/preview-editor/assets/index-C_uqjKqI.css +0 -1
  29. package/dist/preview-editor/assets/index-DRzBK4qj.js +0 -347
package/README.md CHANGED
@@ -76,23 +76,23 @@ npm run preview # 本地服务(8787) + 内置编辑器前端 +
76
76
 
77
77
  ```bash
78
78
  npm i cardbuddy@latest
79
- npx cardbuddy skills upgrade # 新增的 skill 复制进来;本地改过的 shipped skill 默认跳过并黄色警告
80
- npx cardbuddy skills upgrade --force # 确认要抛弃本地改动、用包内版本覆盖时
79
+ npx cardbuddy skills upgrade # 把包内新版技能带进来;覆盖本地改过的 shipped skill 前会先列清单请确认 [y/N]
80
+ npx cardbuddy skills upgrade --force # 非交互 / 确定要抛弃本地改动,跳过确认直接覆盖
81
81
  npx cardbuddy skills upgrade --dry-run # 先看会动哪些文件(四类统计,不落盘)
82
82
  npx cardbuddy skills upgrade --prune # 额外删除包内已不存在的技能文件(默认保留,防误删你的私有 skill)
83
83
  ```
84
84
 
85
85
  按**内容比对**(非 mtime)分四类处理:
86
86
 
87
- | 分类 | 判定 | 默认行为 | 风险 |
87
+ | 分类 | 判定 | 默认行为 | 说明 |
88
88
  | --- | --- | --- | --- |
89
89
  | `ADDED` | 包内有、本地无 | 复制 | 无(新 skill) |
90
90
  | `SAME` | 两边内容一致 | 跳过 | 无 |
91
- | `MODIFIED` | 两边都有、内容不同 | **跳过 + 黄色警告列清单** | ⚠️ 你可能改过该 shipped skill;`--force` 才覆盖 |
92
- | `ORPHAN` | 本地有、包内无 | **保留不删** | ⚠️ 可能是你私有的 skill,或上游已下架该 skill;`--prune` 才删 |
91
+ | `MODIFIED` | 两边都有、内容不同 | **覆盖** | 这正是升级的目的;覆盖前会列出清单请 [y/N] 确认,确认即覆盖、否认即保留本地副本并继续其余 |
92
+ | `ORPHAN` | 本地有、包内无 | **保留不删** | 可能是你私有的 skill,或上游已下架该 skill;`--prune` 才删 |
93
93
 
94
- > `init` 生成的工程已带 `npm run upgrade:skills` 脚本(等价 `cardbuddy skills upgrade`),
95
- > 要覆盖时用 `npm run upgrade:skills -- --force`。
94
+ > `init` 生成的工程已带 `npm run upgrade:skills` 脚本(等价 `cardbuddy skills upgrade`)。
95
+ > 非交互环境(无 TTY)无法确认覆盖,必须加 `--force` 才升级,否则命令会明确拒绝并提示,不会静默跳过。
96
96
 
97
97
  同步后写 `skills/.synced-from = 当前装包版本`,供下次 drift 检测(Phase 2:服务启动时可据此提示
98
98
  "skills 停留在 X,包已 Y")。
@@ -242,7 +242,7 @@ DSL_DEV_HTTPS=1 cardbuddy
242
242
  | `GET /__cards` | 自包含 | 卡片列表 |
243
243
  | `GET /__card/:id` | 自包含 | 单卡 schema/data 读取 |
244
244
  | `POST /__sync` | 本地服务代理 | 同步远端 FinMall(依赖 `finmall-card-sync` skill) |
245
- | `POST /__save` | 本地服务代理 | 保存到远端 FinMall(依赖 `finmall-card-sync` skill) |
245
+ | `POST /__save` | 本地服务代理 | 保存到远端 FinMall(依赖 `finmall-card-sync` skill);成功后自动截图并上传远端预览图(IDC10014) |
246
246
  | `GET /__preview` | 本地服务代理 | 远端取卡(IDC10015,依赖 `finmall-card-sync` skill) |
247
247
  | `POST /__validate` | 本地服务代理 | 契约校验(依赖 `dsl-card-generator` skill) |
248
248
  | `GET /__render-status/:id` | 自包含 + 内嵌 Vite SSR | 渲染自检 |
package/dist/cli.js CHANGED
@@ -36,6 +36,20 @@ const srcTag =
36
36
  ? ''
37
37
  : chalk.magenta('▌ ') + chalk.magenta.bold('cardbuddy') + ' '
38
38
 
39
+ // 进程级兜底:cardbuddy-dev(8787)是开发者常驻服务,单个请求里的异步异常(如模型网关卡死 /
40
+ // 掉线触发未捕获 rejection)绝不该拖垮整个进程。connect 中间件框架不会 await / catch 异步中间件
41
+ // 抛出的错误,逃逸的 rejection 在 Node ≥15 默认会终止进程。这里统一兜底为「记日志、保活」,确保一个
42
+ // 坏请求 / 一个卡死的模型不会让 8787 端口整体不再响应。
43
+ function guardProcessAlive() {
44
+ process.on('unhandledRejection', (reason) => {
45
+ console.error('[cardbuddy] 未处理的 Promise rejection(已兜底,服务继续运行):', reason && reason.stack ? reason.stack : reason)
46
+ })
47
+ process.on('uncaughtException', (err) => {
48
+ console.error('[cardbuddy] 未捕获异常(已兜底,服务继续运行):', err && err.stack ? err.stack : err)
49
+ })
50
+ }
51
+ guardProcessAlive()
52
+
39
53
  // 加载环境(与 skills 同套约定:.env.cb 为共享配置,.env.cb.local 为个人覆盖层)。
40
54
  // dotenv 默认不覆盖已存在变量,故主仓库由启动器注入的 DSL_DEV_PORT / FINMALL_BASE_URL 仍优先。
41
55
  // 同时登记「dotenv 注入值」:server/core/ai-chat.js 据此区分「启动时灌进 process.env 的文件值」
@@ -67,7 +81,7 @@ if (args.includes('--help') || args.includes('-h')) {
67
81
  用法:
68
82
  cardbuddy [--preview] [--mcp] [--version] [--help]
69
83
  cardbuddy init [目标目录] [--force] [--dry-run] [--no-skills] [--no-sample]
70
- cardbuddy skills upgrade [目标目录] [--force] [--dry-run] [--prune] [--strict]
84
+ cardbuddy skills upgrade [目标目录] [--force] [--dry-run] [--prune]
71
85
 
72
86
  命令:
73
87
  init 生成「立刻能开发调试」的卡片工程最小实例(增量、幂等,不覆盖已存在文件):
@@ -85,12 +99,12 @@ if (args.includes('--help') || args.includes('-h')) {
85
99
  skills 副本,需显式拉一次。按内容比对分四类:
86
100
  ADDED 包内有、本地无 → 复制(安全)
87
101
  SAME 两边一致 → 跳过
88
- MODIFIED 两边都有、内容不同 → 默认跳过并黄色警告(防丢你改过的 shipped skill)
102
+ MODIFIED 两边都有、内容不同 → 默认覆盖(这正是升级目的,会丢弃本地副本改动)
89
103
  ORPHAN 本地有、包内无 → 默认保留不删(可能是你私有的或上游已下架)
90
- --force 覆盖本地已修改的 shipped skill(丢弃你的改动)
104
+ 覆盖 MODIFIED 前会先展示清单请确认 [y/N];非交互环境(无 TTY)必须加 --force 才升级。
105
+ --force, -y 跳过确认直接覆盖本地已修改的 shipped skill(非交互必备)
91
106
  --dry-run 只报告四类统计,不落盘
92
107
  --prune 额外删除包内已不存在的技能文件(默认保留,防误删你的私有 skill)
93
- --strict 存在未覆盖的 MODIFIED 时返回非 0(便于 CI 感知)
94
108
  典型用法:npm i cardbuddy@latest && npx cardbuddy skills upgrade
95
109
 
96
110
  选项:
@@ -171,7 +185,7 @@ if (isSkillsUpgrade) {
171
185
  const rest = args.slice(marker + 1)
172
186
  const flags2 = new Set(rest.filter((a) => a.startsWith('-')))
173
187
  const positional2 = rest.filter((a) => !a.startsWith('-'))
174
- const knownFlags = ['--force', '--dry-run', '--prune', '--strict']
188
+ const knownFlags = ['--force', '-y', '--dry-run', '--prune']
175
189
  const unknown = [...flags2].filter((f) => !knownFlags.includes(f))
176
190
  if (unknown.length) {
177
191
  console.error(srcTag + chalk.red(`skills upgrade 不支持的参数:${unknown.join(' ')}(可用:${knownFlags.join(' ')})`))
@@ -185,10 +199,9 @@ if (isSkillsUpgrade) {
185
199
  process.exit(
186
200
  await runSkillsUpgrade({
187
201
  targetDir: positional2[0] || '.',
188
- force: flags2.has('--force'),
202
+ force: flags2.has('--force') || flags2.has('-y'),
189
203
  dryRun: flags2.has('--dry-run'),
190
204
  prune: flags2.has('--prune'),
191
- strict: flags2.has('--strict'),
192
205
  config: loadConfig(),
193
206
  })
194
207
  )
@@ -201,7 +214,7 @@ if (isSkillsUpgrade) {
201
214
  // 仅 `skills` 而无 upgrade:提示唯一合法子命令
202
215
  if (subCommand === 'skills' && !isSkillsUpgrade) {
203
216
  console.error(
204
- srcTag + chalk.red('skills 子命令仅支持 upgrade(用法:cardbuddy skills upgrade [目标目录] [--force] [--dry-run] [--prune] [--strict])')
217
+ srcTag + chalk.red('skills 子命令仅支持 upgrade(用法:cardbuddy skills upgrade [目标目录] [--force] [--dry-run] [--prune])')
205
218
  )
206
219
  process.exit(1)
207
220
  }
package/dist/init.js CHANGED
@@ -204,9 +204,9 @@ npm run link:skills # 交互式选择 Codex / Claude / WorkBuddy 等,建立
204
204
  装完新版后拉一次:
205
205
 
206
206
  \`\`\`bash
207
- npm run upgrade:skills # 新增的 skill 复制进来;本地改过的 shipped skill 默认跳过并警告
208
- npx cardbuddy skills upgrade --force # 确认要抛弃本地改动、用包内版本覆盖时
209
- npx cardbuddy skills upgrade --dry-run # 先看会动哪些文件(四类:新增/相同/已修改/本地私有)
207
+ npm run upgrade:skills # 把包内新版技能带进来;覆盖本地改过的 shipped skill 前会先列清单请确认
208
+ npx cardbuddy skills upgrade --force # 非交互/确定要抛弃本地改动,跳过确认直接覆盖
209
+ npx cardbuddy skills upgrade --dry-run # 先看会动哪些文件(四类:新增/相同/已修改/本地私有)
210
210
  \`\`\`
211
211
 
212
212
  该命令**只动 \`skills/\`**,绝不碰 \`.env.cb\` / \`package.json\` / \`README.md\`
@@ -0,0 +1 @@
1
+ (function(){let e=null;self.onmessage=t=>{let n=t.data||{};if(n.type===`start`){e&&clearInterval(e);let t=n.url,r=n.interval||5e3,i=()=>{fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`}}).then(()=>self.postMessage({type:`beat`,ok:!0})).catch(()=>self.postMessage({type:`beat`,ok:!1}))};i(),e=setInterval(i,r)}else n.type===`stop`&&(e&&clearInterval(e),e=null)}})();