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.
- package/README.md +8 -8
- package/dist/cli.js +21 -8
- package/dist/init.js +3 -3
- package/dist/preview-editor/assets/codeBridgeHeartbeat.worker-Zb_A5RUd.js +1 -0
- package/dist/preview-editor/assets/index-C8VLzU18.css +1 -0
- package/dist/preview-editor/assets/index-CpDojF__.js +383 -0
- package/dist/preview-editor/index.html +2 -2
- package/dist/skills-upgrade.js +64 -25
- package/dist/standalone.js +49 -0
- package/dist/vendored/card-editor/components/MultiColumn.vue +19 -10
- package/dist/vendored/card-editor/runtime/card-runtime.js +1 -1
- package/dist/vendored/mcp/client.mjs +22 -3
- package/dist/vendored/server/core/ai-chat.js +92 -12
- package/dist/vendored/server/core/cardExport.js +831 -0
- package/dist/vendored/server/core/cardHistoryRemote.js +203 -0
- package/dist/vendored/server/core/cardImportMeta.js +6 -1
- package/dist/vendored/server/core/cardPublishVersions.js +91 -0
- package/dist/vendored/server/core/cardSave.js +143 -6
- package/dist/vendored/server/core/cardSync.js +467 -95
- package/dist/vendored/server/core/codeBridge.js +4 -2
- package/dist/vendored/server/core/index.js +16 -0
- package/dist/vendored/skills/finmall-card-sync/SKILL.md +46 -0
- package/dist/vendored/skills/finmall-card-sync/scripts/api_batch_sync.mjs +657 -15
- package/dist/vendored/skills/finmall-session-navigator/scripts/finmall_login.mjs +79 -8
- package/dist/vendored/skills/finmall-session-navigator/scripts/session-manager.mjs +25 -1
- package/dist/vendored/skills/mbank-design-gen/tools/screenshot.mjs +10 -1
- package/package.json +1 -1
- package/dist/preview-editor/assets/index-C_uqjKqI.css +0 -1
- 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 #
|
|
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` | 两边都有、内容不同 |
|
|
92
|
-
| `ORPHAN` | 本地有、包内无 | **保留不删** |
|
|
91
|
+
| `MODIFIED` | 两边都有、内容不同 | **覆盖** | 这正是升级的目的;覆盖前会列出清单请 [y/N] 确认,确认即覆盖、否认即保留本地副本并继续其余 |
|
|
92
|
+
| `ORPHAN` | 本地有、包内无 | **保留不删** | 可能是你私有的 skill,或上游已下架该 skill;`--prune` 才删 |
|
|
93
93
|
|
|
94
|
-
> `init` 生成的工程已带 `npm run upgrade:skills` 脚本(等价 `cardbuddy skills upgrade
|
|
95
|
-
>
|
|
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]
|
|
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 两边都有、内容不同 →
|
|
102
|
+
MODIFIED 两边都有、内容不同 → 默认覆盖(这正是升级目的,会丢弃本地副本改动)
|
|
89
103
|
ORPHAN 本地有、包内无 → 默认保留不删(可能是你私有的或上游已下架)
|
|
90
|
-
|
|
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', '
|
|
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]
|
|
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
|
|
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)}})();
|