@clawos-dev/clawd 0.2.572 → 0.2.574
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/dist/app-builder-plugin/mcp-server.cjs +2 -2
- package/dist/cli.cjs +850 -904
- package/dist/dispatch/mcp-server.cjs +2 -2
- package/dist/persona-defaults/persona-app-builder/mcp/clawd-app-builder/mcp-server.cjs +2 -2
- package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md +39 -29
- package/dist/persona-defaults/persona-dataclaw-builder/mcp/clawd-app-builder/mcp-server.cjs +2 -2
- package/dist/share-ui/assets/{guest-CRh5Qm47.js → guest-Co-OS509.js} +1 -1
- package/dist/share-ui/guest.html +1 -1
- package/package.json +1 -1
|
@@ -21291,8 +21291,8 @@ var EnvArtifactSchema = external_exports.object({
|
|
|
21291
21291
|
url: external_exports.string().url(),
|
|
21292
21292
|
// 包内可执行文件的路径(`hbi` / `dist/bin/x`);空串 = 裸二进制
|
|
21293
21293
|
bin: external_exports.string(),
|
|
21294
|
-
sha256: external_exports.string().regex(/^[0-9a-f]{64}$/),
|
|
21295
|
-
size: external_exports.number().int().positive()
|
|
21294
|
+
sha256: external_exports.string().regex(/^[0-9a-f]{64}$/).optional(),
|
|
21295
|
+
size: external_exports.number().int().positive().optional()
|
|
21296
21296
|
});
|
|
21297
21297
|
var EnvPackageSchema = external_exports.object({
|
|
21298
21298
|
// 装完后在 PATH 里能直接调到的名字('aliyun' / 's' / 'pnpm' / 'python3');npm 包报 bin 名,包名进 from
|
|
@@ -21477,8 +21477,8 @@ var EnvArtifactSchema = external_exports.object({
|
|
|
21477
21477
|
url: external_exports.string().url(),
|
|
21478
21478
|
// 包内可执行文件的路径(`hbi` / `dist/bin/x`);空串 = 裸二进制
|
|
21479
21479
|
bin: external_exports.string(),
|
|
21480
|
-
sha256: external_exports.string().regex(/^[0-9a-f]{64}$/),
|
|
21481
|
-
size: external_exports.number().int().positive()
|
|
21480
|
+
sha256: external_exports.string().regex(/^[0-9a-f]{64}$/).optional(),
|
|
21481
|
+
size: external_exports.number().int().positive().optional()
|
|
21482
21482
|
});
|
|
21483
21483
|
var EnvPackageSchema = external_exports.object({
|
|
21484
21484
|
// 装完后在 PATH 里能直接调到的名字('aliyun' / 's' / 'pnpm' / 'python3');npm 包报 bin 名,包名进 from
|
package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md
CHANGED
|
@@ -38,10 +38,12 @@ git diff --name-only <任务里给的 sha> -- .
|
|
|
38
38
|
1. 调 `deploy:get`,在 `scans` 里找 `id` 等于任务给的 scanId 那条,拿它的 `manifest.packages` 和 `evidence`。
|
|
39
39
|
2. 对 `packages` 里的每一条调一次 `deploy:reportFinding`(`kind: "package"`):
|
|
40
40
|
- `item` 只带 `name` / `from` / `min` / `version`;有 `artifact` 的只带 `{ url, bin }`。
|
|
41
|
-
`localVersion
|
|
41
|
+
`localVersion` 是 daemon 写的,**不要带**;`artifact` 里老记录可能有 `sha256` / `size`,**也不要带**(带了会被按形状拒)。
|
|
42
42
|
- `evidence` 用记录里 `target` 等于 `package:<name>` 那条的 `reason` / `file` / `quote` 原样回传。
|
|
43
43
|
- 记录里**没有**这条 evidence 的(老板在页面上手工补的条目)跳过不报——上报口要求 evidence,编一条就是造假。
|
|
44
|
-
- 被拒就按错误里说的做:`github:` 包本机版本变了,daemon 会告诉你新版本,按它重找资产再报(规则见 package
|
|
44
|
+
- 被拒就按错误里说的做:`github:` 包本机版本变了,daemon 会告诉你新版本,按它重找资产再报(规则见 package 那节)。
|
|
45
|
+
- 重报后返回的那条**没有 `localVersion`** = 本机已经没有这个工具了(卸了、或它本来就是 npx 现拉现跑的)。
|
|
46
|
+
按「本机有啥就上云啥」它不该再在清单里,记下来,收尾时用 `deploy:patch` 删掉(见收尾那节)。
|
|
45
47
|
3. 然后再去读改动文件。改动涉及的条目在那一趟会再报一次,新结论盖过这里的,顺序不能反。
|
|
46
48
|
|
|
47
49
|
两件最容易做错的事:
|
|
@@ -63,7 +65,7 @@ git diff --name-only <任务里给的 sha> -- .
|
|
|
63
65
|
|
|
64
66
|
| 有什么 | 说明 |
|
|
65
67
|
|---|---|
|
|
66
|
-
| node 22、npm、npx | 底座镜像就是 `node:22-bookworm-slim
|
|
68
|
+
| node 22、npm、npx | 底座镜像就是 `node:22-bookworm-slim`。本机 `npm i -g` 装了的 MCP server / CLI 报一条 `package` 让它预装;本机 `npx` 现拉现跑的云上也现拉现跑、不报;node 本身不用管 |
|
|
67
69
|
| git | 底座自带 |
|
|
68
70
|
| codex | 云上唯一的引擎,底座自带 |
|
|
69
71
|
| lark-cli | 底座自带,带凭据隔离编译。飞书的登录态由**飞书连接器**在容器起来时带进去,不需要也不能在容器里 `auth login` / `config init`;persona 里写的交互式初始化步骤在云上不会走到 |
|
|
@@ -108,8 +110,20 @@ call({ method: "deploy:reportFinding", args: {
|
|
|
108
110
|
|
|
109
111
|
`item` 字段:`name`(必填,装完落在 PATH 上的可执行名)、`from`(从哪装)、`version`(精确版本,见下)、`min`(版本下限)、`artifact`(`github:` 专用,见下)。
|
|
110
112
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
**本机有啥就上云啥。** 这是老板定的原则,也是这一节唯一的判据:persona 是对着这台机器调出来的,
|
|
114
|
+
云上就照这台机器备——**只报本机 PATH 上真装了的工具**,不替他加、不替他升。
|
|
115
|
+
|
|
116
|
+
- 判据是 daemon 的探测:你每报一条 `package`,daemon 在这台机器的登录 shell PATH 上找同名可执行,
|
|
117
|
+
探到了返回的那条带 `localVersion`。**报之前自己先 `command -v <name>` 一下**——找不到就不报,
|
|
118
|
+
省得报进去再删(上报口只增不删)。
|
|
119
|
+
- **本机没装的不报,也不猜版本。** persona 文件里引用了、但这台机器上没有的工具,云上也不会有——
|
|
120
|
+
要不要写进 `notes` 按收尾那节的三道门槛判,不进清单。
|
|
121
|
+
- **`npx` / `uvx` 现拉现跑的不报。** `.mcp.json` 里 `"command": "npx"` 的 MCP server、skill 里
|
|
122
|
+
`npx -y <pkg>` 跑的工具,本机就是现拉现跑,云上也现拉现跑(底座有 node / npm / npx,见「云上容器已经有的」)。
|
|
123
|
+
它在 npx 缓存里、不在 PATH 上,daemon 探不到,正好和原则一致。全局装了的(`npm i -g`,PATH 上有 bin)才报。
|
|
124
|
+
|
|
125
|
+
只列**干净容器里不会自带**的:`aliyun` / `s`(Serverless Devs) / `pnpm` / `python3`
|
|
126
|
+
这类;不必列 `ls` `cat` `grep` `sed` `awk` `curl` `tar` `bash` 这些基础镜像自带的(`git` 在底座里,见「云上容器已经有的」)。
|
|
113
127
|
|
|
114
128
|
**`from` 必须给出,查清楚是你的活,不是留给老板的作业。** 写成 `<kind>:<ref>`,如
|
|
115
129
|
`npm:@serverless-devs/s` / `github:aliyun/aliyun-cli` / `apt:python3`。按这个顺序找:
|
|
@@ -124,34 +138,29 @@ call({ method: "deploy:reportFinding", args: {
|
|
|
124
138
|
|
|
125
139
|
注意目标是 **Linux 容器**:persona 脚本里的 macOS 装法(brew 之类)不能照抄,要找 Linux 对应的。
|
|
126
140
|
|
|
127
|
-
**版本不用你定——daemon 探本机。**
|
|
128
|
-
|
|
129
|
-
只有本机没装时才由你按官方文档填一个 `version`,并在收尾的 `notes` 里写明「本机未装 <name>,取的 x.y.z」。
|
|
141
|
+
**版本不用你定——daemon 探本机。** 探到的版本写进返回值里那条的 `version`(同时落 `localVersion`),
|
|
142
|
+
本机是啥就上云啥。首报不填 `version`(软扫重报、`github:` 第 2 步按各自那节说的带 daemon 定下的那个);
|
|
130
143
|
`min` 只在你确知下限时填。**不要猜版本号。**
|
|
131
144
|
|
|
132
|
-
**`from`
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
145
|
+
**`from` 写实际能装的源,不为了凑版本换源。** 源给不出本机那一版是常事(本机 brew 装的 jq 1.8.1,
|
|
146
|
+
Debian 12 的 apt 只有 1.6;本机 python 3.12,apt 只有 3.11)。这种情况**保留原来源**,在收尾的 `notes` 里写一条事实:
|
|
147
|
+
本机是哪版、这个源只能装哪版、照这样发布会在构建期的版本核对上红(镜像装到的版本要正好等于单据的 `version`)。
|
|
148
|
+
怎么办由老板定。**不要**为了钉住本机版本去翻 GitHub release 换 `github:`——那是替他做决定,
|
|
149
|
+
而且钉资产那条路上的每一步都可能卡住。
|
|
150
|
+
|
|
151
|
+
npm 包 `name` 写它装完**落在 PATH 上的可执行名**,常常跟包名不一样——`@aliyun-rds/supabase-mcp-server`
|
|
152
|
+
的 bin 是 `supabase-mcp`。名字拿不准就去看那个包的 `package.json` 的 `bin` 字段(或官方文档),别拿包名顶上;
|
|
153
|
+
`from` 写 `npm:<完整包名>`。
|
|
137
154
|
|
|
138
|
-
**`github:` 要钉资产。** GitHub
|
|
155
|
+
**`github:` 要钉资产。** 只用于本来就从 GitHub release 装的工具(`aliyun` / `hbi` 这类 apt / npm 里没有的)。
|
|
156
|
+
GitHub 不是包注册表,从「仓库 + 版本」推不出该下哪个文件,构建器不猜。分两步:
|
|
139
157
|
1. 先报 `{ name, from: "github:<owner>/<repo>" }`,从返回的 view 里读 daemon 定下的 `version`;
|
|
140
158
|
2. 按**那个版本**打开该仓库的 Releases 页(或读它官方 install 脚本里的下载 URL),找到 **linux-amd64** 资产的直链
|
|
141
159
|
和包内可执行文件的路径,再报一次同名条目:
|
|
142
160
|
`{ name, from, version: <第 1 步读到的>, artifact: { url: "<直链>", bin: "<包内路径,如 hbi 或 dist/bin/x;裸二进制留空串>" } }`。
|
|
143
|
-
只认 `.tar.gz` / `.tgz`
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
**`.mcp.json` 里 `npx` / `uvx` 现拉现跑的 MCP server,也要报一条 `package`。** 它看着像一条配置
|
|
147
|
-
不像一个命令行工具,但语义是一样的:容器里没有这个包时,MCP 首次启动要连 registry 现拉,
|
|
148
|
-
离线或抖动就直接起不来,persona 少一整块能力。所以它必须预装进镜像。
|
|
149
|
-
|
|
150
|
-
- `name` 写它装完**落在 PATH 上的可执行名**,常常跟包名不一样——
|
|
151
|
-
`@aliyun-rds/supabase-mcp-server` 的 bin 是 `supabase-mcp`。名字拿不准就去看那个包的
|
|
152
|
-
`package.json` 的 `bin` 字段(或官方文档),别拿包名顶上。
|
|
153
|
-
- `from` 写 `npm:<完整包名>`(`npm:@aliyun-rds/supabase-mcp-server`)。
|
|
154
|
-
- `evidence.quote` 引 `.mcp.json` 里那两行 `"command": "npx"` / `"args": [...]` 就够。
|
|
161
|
+
只认 `.tar.gz` / `.tgz` 和裸二进制。**不要带 sha256**(带了按形状拒)。
|
|
162
|
+
**daemon 不下载、不核实**——url 是不是 404、`bin` 在不在包里,只有你现在核(`curl -sIL -o /dev/null -w '%{http_code}' <url>` 看最终状态码——release 直链先回 302,不跟跳转会误判;`bin` 看发布页的文件清单),
|
|
163
|
+
错了要到构建期才红。被拒时错误里会说原因(版本不是本机那个 / url 形状不对),按它说的改了再报。
|
|
155
164
|
|
|
156
165
|
### kind: "secret" —— 需要的凭据
|
|
157
166
|
|
|
@@ -170,7 +179,7 @@ call({ method: "deploy:reportFinding", args: {
|
|
|
170
179
|
**连接器分两种来源,你只报其中一种:**
|
|
171
180
|
|
|
172
181
|
- **MCP 连接器**(`.mcp.json` 里的每个 server)——**不用报**。daemon 在扫描开始时已经从文件里机械列好
|
|
173
|
-
(http 型、stdio 型、要填哪些 `${VAR}`
|
|
182
|
+
(http 型、stdio 型、要填哪些 `${VAR}` 都读得出来),你报了也是重复。它们 `npx` 现拉现跑的包也不报 `package`(见上)。
|
|
174
183
|
- **CLI 连接器**——**要报**。判据:persona 里出现**以用户本人身份操作某个第三方的命令行工具**:
|
|
175
184
|
`lark-cli … --as user` 操作飞书、`gh` 开 PR、`railway up`、`vercel deploy` 这类。这些工具没有配置文件可读,
|
|
176
185
|
只有你读了文档才知道它从哪个环境变量拿凭据。
|
|
@@ -236,7 +245,8 @@ call({ method: "deploy:patch", args: {
|
|
|
236
245
|
去掉该去的那几条,其余原样带上。**没有要删的就别调**——整份改写是有风险的动作,没必要时不做。
|
|
237
246
|
|
|
238
247
|
判「该删」要有依据:来源文件在这次 diff 里被删了,或者你读了改动后的文件、确认它不再引用那个
|
|
239
|
-
|
|
248
|
+
东西,或者重报时 daemon 没探到(返回的那条没有 `localVersion`:本机没有它,按「本机有啥就上云啥」不该在清单里)。
|
|
249
|
+
**光是「这次 diff 没碰到它」不是依据**——软扫下多数条目 diff 都碰不到。
|
|
240
250
|
|
|
241
251
|
### 然后收尾
|
|
242
252
|
|
|
@@ -273,7 +283,7 @@ call({ method: "deploy:finishScan", args: {
|
|
|
273
283
|
|---|---|
|
|
274
284
|
| persona 目录里没有 .mcp.json,没有 MCP 连接器 | 空结论 |
|
|
275
285
|
| 人格里的初始化流程(lark-cli config init / auth login)是交互式,得靠飞书连接器把登录态带进去 | 容器已有:飞书登录态本来就是连接器带进去的,交互式步骤不会走到 |
|
|
276
|
-
| whiteboard-cli 是 npm 包运行需要 node,我按底座已有 node 处理、没单报一条 | 容器已有 +
|
|
286
|
+
| whiteboard-cli 是 npm 包运行需要 node,我按底座已有 node 处理、没单报一条 | 容器已有 + 自述推理(它本机就是 npx 现拉现跑,本来就不报 package) |
|
|
277
287
|
| lark-event 是长连接,云上容器有执行时长上限或出网限制的话可能跑不完整 | 猜测;且 2 小时上限在「已有」那节 |
|
|
278
288
|
| 画板上传会落临时文件,容器里需要一个可写的工作目录 | 容器已有 |
|
|
279
289
|
|
|
@@ -21477,8 +21477,8 @@ var EnvArtifactSchema = external_exports.object({
|
|
|
21477
21477
|
url: external_exports.string().url(),
|
|
21478
21478
|
// 包内可执行文件的路径(`hbi` / `dist/bin/x`);空串 = 裸二进制
|
|
21479
21479
|
bin: external_exports.string(),
|
|
21480
|
-
sha256: external_exports.string().regex(/^[0-9a-f]{64}$/),
|
|
21481
|
-
size: external_exports.number().int().positive()
|
|
21480
|
+
sha256: external_exports.string().regex(/^[0-9a-f]{64}$/).optional(),
|
|
21481
|
+
size: external_exports.number().int().positive().optional()
|
|
21482
21482
|
});
|
|
21483
21483
|
var EnvPackageSchema = external_exports.object({
|
|
21484
21484
|
// 装完后在 PATH 里能直接调到的名字('aliyun' / 's' / 'pnpm' / 'python3');npm 包报 bin 名,包名进 from
|