@clawos-dev/clawd 0.2.444 → 0.2.446
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/cli.cjs +1225 -558
- package/dist/dispatch/mcp-server.cjs +215 -17
- package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md +134 -0
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/{guest-Cn0m2N_c.js → guest-ChNRpL1J.js} +132 -132
- package/dist/share-ui/assets/guest-DgGpoVf5.css +32 -0
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
- package/dist/share-ui/assets/guest-DISx208T.css +0 -32
|
@@ -21272,6 +21272,172 @@ var ContactHandshakeOkSchema = external_exports.object({
|
|
|
21272
21272
|
grants: external_exports.array(GrantSchema)
|
|
21273
21273
|
});
|
|
21274
21274
|
|
|
21275
|
+
// ../protocol/src/environment-schemas.ts
|
|
21276
|
+
var EnvCliSchema = external_exports.object({
|
|
21277
|
+
// 可执行文件名,装配后要能在 PATH 里直接调到('aliyun' / 's' / 'pnpm' / 'python3')
|
|
21278
|
+
name: external_exports.string().min(1),
|
|
21279
|
+
/**
|
|
21280
|
+
* 从哪装,约定 `<kind>:<ref>`:`npm:@serverless-devs/s` / `github:aliyun/aliyun-cli` /
|
|
21281
|
+
* `apt:python3`。
|
|
21282
|
+
*
|
|
21283
|
+
* **不是装饰字段,是构建器的必需输入**:可执行名往往推不出安装源——Serverless Devs 的命令
|
|
21284
|
+
* 就叫单个字母 `s`,没人能从 's' 猜到要 `npm i -g @serverless-devs/s`;`aliyun` 也不在
|
|
21285
|
+
* apt 源里,得从 GitHub release 拉 tarball。扫描器读 ensure-toolchain.sh 的时候本来就看见
|
|
21286
|
+
* 了这些,顺手带出来即可。
|
|
21287
|
+
*
|
|
21288
|
+
* 它同时解决人的阅读问题:单据上只写一个 `s`,看的人不知道那是什么东西。
|
|
21289
|
+
*
|
|
21290
|
+
* 允许缺省:扫描器拿不准安装源时不该编一个(编错了构建期才炸,还查不出来源)。缺省时构建
|
|
21291
|
+
* 器会失败或猜错,试装当场暴露——这跟整体「宁可让试装发现,不要靠猜」的取向一致。
|
|
21292
|
+
*
|
|
21293
|
+
* 只给一个源,不给平台回落链:本地那套 brew → GitHub → npm 的三级兜底是
|
|
21294
|
+
* ensure-toolchain.sh 的事,云上只构一个镜像、一个基础环境,多给反而要求构建器做选择。
|
|
21295
|
+
*/
|
|
21296
|
+
from: external_exports.string().optional(),
|
|
21297
|
+
// 精确版本;缺省 = 不挑版本,装配器自选
|
|
21298
|
+
version: external_exports.string().optional(),
|
|
21299
|
+
// 版本下限('20.6' 这种)。与 version 的区别:version 是「就要这个」,min 是「不低于」。
|
|
21300
|
+
// 两者都缺省即完全不约束。
|
|
21301
|
+
min: external_exports.string().optional()
|
|
21302
|
+
});
|
|
21303
|
+
var EnvSecretSchema = external_exports.object({
|
|
21304
|
+
// 凭据的命名引用('aliyun-ak' / 'supabase-shared')。部署时按这个名字去解析实际的值。
|
|
21305
|
+
name: external_exports.string().min(1),
|
|
21306
|
+
// 解析出的值注入到哪些环境变量。一份凭据可含多个字段(AK 是 id+secret 两个,
|
|
21307
|
+
// supabase 是 url/anon/service-role/jwt 四个),所以是数组不是单值。
|
|
21308
|
+
env: external_exports.array(external_exports.string().min(1)).min(1)
|
|
21309
|
+
});
|
|
21310
|
+
var EnvAssetSchema = external_exports.object({
|
|
21311
|
+
name: external_exports.string().min(1)
|
|
21312
|
+
});
|
|
21313
|
+
var MANIFEST_BODY = {
|
|
21314
|
+
clis: external_exports.array(EnvCliSchema),
|
|
21315
|
+
secrets: external_exports.array(EnvSecretSchema),
|
|
21316
|
+
assets: external_exports.array(EnvAssetSchema)
|
|
21317
|
+
};
|
|
21318
|
+
var EnvManifestBodySchema = external_exports.object(MANIFEST_BODY);
|
|
21319
|
+
var EnvironmentManifestSchema = external_exports.object({
|
|
21320
|
+
// 格式版本。manifest 要跨进程(daemon 扫 → 镜像构建器读)也跨时间(部署记录留档),
|
|
21321
|
+
// 加字段兼容但改语义不兼容,留一个显式版本位。
|
|
21322
|
+
version: external_exports.literal(1),
|
|
21323
|
+
...MANIFEST_BODY
|
|
21324
|
+
}).strict();
|
|
21325
|
+
var EnvEvidenceSchema = external_exports.object({
|
|
21326
|
+
// 这条证据支持的是哪一项:`${kind}:${name}`,如 'cli:aliyun' / 'secret:aliyun-ak'
|
|
21327
|
+
target: external_exports.string().min(1),
|
|
21328
|
+
// 一句人话:为什么需要它 + 从哪看出来的。单据默认显示这句。
|
|
21329
|
+
reason: external_exports.string().min(1),
|
|
21330
|
+
// persona 目录内的相对路径('CLAUDE.md' / '.claude/skills/foo/SKILL.md')
|
|
21331
|
+
file: external_exports.string().min(1),
|
|
21332
|
+
// 原文摘录(一两句即可,不是整段)。默认收起,起疑时才看。
|
|
21333
|
+
//
|
|
21334
|
+
// **自由文本,schema 守不住凭据值**:这里只验得了非空,而 agent 被要求「引原文不要转述」,
|
|
21335
|
+
// 引到 `KEY=值` 那行是迟早的事。落盘前由 daemon 的 deploy/redact.ts 涂抹(reason 同理)。
|
|
21336
|
+
quote: external_exports.string().min(1)
|
|
21337
|
+
});
|
|
21338
|
+
|
|
21339
|
+
// ../protocol/src/deploy-schemas.ts
|
|
21340
|
+
var FulfillmentSchema = external_exports.enum(["deployer", "user"]);
|
|
21341
|
+
var DeployStatusSchema = external_exports.enum([
|
|
21342
|
+
"scanning",
|
|
21343
|
+
"scanFailed",
|
|
21344
|
+
"draft",
|
|
21345
|
+
"ready",
|
|
21346
|
+
"trialing",
|
|
21347
|
+
"failed",
|
|
21348
|
+
"deployed"
|
|
21349
|
+
]);
|
|
21350
|
+
var DeployGapSchema = external_exports.object({
|
|
21351
|
+
// agent 的自然语言错因,如「我要解析 aliyun 的 JSON 输出,但容器里没有 python3」
|
|
21352
|
+
errorText: external_exports.string().min(1),
|
|
21353
|
+
// 原始输出片段,给人自己判断用
|
|
21354
|
+
raw: external_exports.string().optional(),
|
|
21355
|
+
// 建议补的依赖:`cli:python3` 这种。拿不准就不给,让人自己决定。
|
|
21356
|
+
suggest: external_exports.string().optional()
|
|
21357
|
+
}).strict();
|
|
21358
|
+
var DeployReceiptSchema = external_exports.object({
|
|
21359
|
+
deployId: external_exports.string().min(1),
|
|
21360
|
+
personaId: external_exports.string().min(1),
|
|
21361
|
+
status: DeployStatusSchema,
|
|
21362
|
+
/**
|
|
21363
|
+
* 干这次扫描的 butler 会话 id。单据上「看它怎么干的」入口靠它把工作过程调出来。
|
|
21364
|
+
*
|
|
21365
|
+
* 扫描不是 daemon 里一个闷头跑的黑盒进程,是 persona-butler 的一次真实会话——用户能翻
|
|
21366
|
+
* 看它读了哪些文件、搜了什么。这条也顺带解决「它到底有没有上网查」这类问题:不用另造
|
|
21367
|
+
* 探针去抓证据,看一眼就知道。
|
|
21368
|
+
*/
|
|
21369
|
+
scanSessionId: external_exports.string().optional(),
|
|
21370
|
+
// 扫描产物;scanning / scanFailed 时还没有
|
|
21371
|
+
manifest: EnvironmentManifestSchema.optional(),
|
|
21372
|
+
evidence: external_exports.array(EnvEvidenceSchema).optional(),
|
|
21373
|
+
smokeTask: external_exports.string().optional(),
|
|
21374
|
+
notes: external_exports.array(external_exports.string()).default([]),
|
|
21375
|
+
/**
|
|
21376
|
+
* 每条凭据的履约选择:secret name → 'deployer' | 'user'。
|
|
21377
|
+
* **只记「谁出」,不记值。** 没做选择的凭据不在这个 map 里(缺席即未定),
|
|
21378
|
+
* 用缺席而不是 'unset' 枚举值表达未定,省掉一个下游要处处判的第三态。
|
|
21379
|
+
*/
|
|
21380
|
+
fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({}),
|
|
21381
|
+
/** 试装失败时的缺口清单;成功或没试装过是空数组 */
|
|
21382
|
+
gaps: external_exports.array(DeployGapSchema).default([]),
|
|
21383
|
+
// 扫描 / 试装失败的原因(status 是 scanFailed / failed 时才有意义)
|
|
21384
|
+
error: external_exports.string().optional(),
|
|
21385
|
+
createdAt: external_exports.number(),
|
|
21386
|
+
updatedAt: external_exports.number()
|
|
21387
|
+
}).strict();
|
|
21388
|
+
var DeployStartArgsSchema = external_exports.object({
|
|
21389
|
+
personaId: external_exports.string().min(1)
|
|
21390
|
+
}).strict();
|
|
21391
|
+
var DeployIdArgsSchema = external_exports.object({
|
|
21392
|
+
deployId: external_exports.string().min(1)
|
|
21393
|
+
}).strict();
|
|
21394
|
+
var DeployPatchArgsSchema = external_exports.object({
|
|
21395
|
+
deployId: external_exports.string().min(1),
|
|
21396
|
+
patch: external_exports.object({
|
|
21397
|
+
fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).optional(),
|
|
21398
|
+
smokeTask: external_exports.string().min(1).optional(),
|
|
21399
|
+
// 人工补依赖(试装失败后补 python3 这种);整份替换 manifest
|
|
21400
|
+
manifest: EnvironmentManifestSchema.optional()
|
|
21401
|
+
}).strict()
|
|
21402
|
+
}).strict();
|
|
21403
|
+
var DeployPutSecretArgsSchema = external_exports.object({
|
|
21404
|
+
deployId: external_exports.string().min(1),
|
|
21405
|
+
// 对应 manifest.secrets[].name
|
|
21406
|
+
name: external_exports.string().min(1),
|
|
21407
|
+
// 环境变量名 → 值。key 必须是该 secret 声明过的 env 之一,handler 校验。
|
|
21408
|
+
values: external_exports.record(external_exports.string(), external_exports.string())
|
|
21409
|
+
}).strict();
|
|
21410
|
+
var DeployReportFindingArgsSchema = external_exports.object({
|
|
21411
|
+
deployId: external_exports.string().min(1),
|
|
21412
|
+
kind: external_exports.enum(["cli", "secret", "asset"]),
|
|
21413
|
+
// 该条目在 manifest 对应数组里的内容(形状随 kind 变,handler 按 kind 收窄校验)
|
|
21414
|
+
item: external_exports.record(external_exports.string(), external_exports.unknown()),
|
|
21415
|
+
// 这条发现的来历(一句人话 + 原文出处),形状同 EnvEvidence,target 由 handler 从 kind+name 派生
|
|
21416
|
+
evidence: external_exports.object({
|
|
21417
|
+
reason: external_exports.string().min(1),
|
|
21418
|
+
file: external_exports.string().min(1),
|
|
21419
|
+
quote: external_exports.string().min(1)
|
|
21420
|
+
})
|
|
21421
|
+
}).strict();
|
|
21422
|
+
var DeployFinishScanArgsSchema = external_exports.object({
|
|
21423
|
+
deployId: external_exports.string().min(1),
|
|
21424
|
+
smokeTask: external_exports.string().min(1),
|
|
21425
|
+
notes: external_exports.array(external_exports.string()).default([])
|
|
21426
|
+
}).strict();
|
|
21427
|
+
var DeploySecretStatusSchema = external_exports.object({
|
|
21428
|
+
name: external_exports.string(),
|
|
21429
|
+
// 该 secret 声明的 env 里已有值的个数
|
|
21430
|
+
filled: external_exports.number(),
|
|
21431
|
+
total: external_exports.number()
|
|
21432
|
+
}).strict();
|
|
21433
|
+
var DeployReceiptViewSchema = external_exports.object({
|
|
21434
|
+
receipt: DeployReceiptSchema,
|
|
21435
|
+
secretStatus: external_exports.array(DeploySecretStatusSchema)
|
|
21436
|
+
}).strict();
|
|
21437
|
+
var DeployListResultSchema = external_exports.object({
|
|
21438
|
+
receipts: external_exports.array(DeployReceiptSchema)
|
|
21439
|
+
}).strict();
|
|
21440
|
+
|
|
21275
21441
|
// ../protocol/src/contact-remote-access.ts
|
|
21276
21442
|
var ContactSetRemoteAccessArgsSchema = external_exports.object({
|
|
21277
21443
|
deviceId: external_exports.string().min(1),
|
|
@@ -23499,11 +23665,11 @@ var METHOD_DOCS = {
|
|
|
23499
23665
|
}
|
|
23500
23666
|
},
|
|
23501
23667
|
"session:externalScan": {
|
|
23502
|
-
summary: "\u626B\u63CF\u672C\u673A Claude Code / Codex \u5386\u53F2\u4F1A\u8BDD\uFF0C\u8FD4\u56DE\u53EF\u5BFC\u5165\u5019\u9009\u6E05\u5355\uFF08cwd/toolSessionId/\u65F6\u95F4\u6233/\u8F6E\u6570\uFF09\
|
|
23668
|
+
summary: "\u626B\u63CF\u672C\u673A Claude Code / Codex \u5386\u53F2\u4F1A\u8BDD\uFF0C\u8FD4\u56DE\u53EF\u5BFC\u5165\u5019\u9009\u6E05\u5355\uFF08cwd/toolSessionId/\u65F6\u95F4\u6233/\u8F6E\u6570\uFF09\uFF1Bowner-only\u3002\u88AB skip \u7684\u76F4\u63A5\u4E0D\u8FD4\u56DE\uFF1Asubagent \u652F\u7EBF / \u65E0 cwd / \u975E\u7528\u6237\u5165\u53E3\uFF08CC \u7684 entrypoint \u4E0D\u662F cli\xB7claude-desktop\uFF09/ \u975E\u7528\u6237\u65B0\u5EFA\xB7\u5DF2\u5F52\u6863\xB7\u7A7A\u4F1A\u8BDD\uFF08codex\uFF09/ \u96F6\u7528\u6237\u53D1\u8A00 / \u5DE5\u4F5C\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728 / cwd \u5728 ~/.clawd \u4E0B / \u5DF2\u5BFC\u5165\u8FC7\uFF08\u53BB\u91CD\u96C6\u5408 = \u6D3B\u7740\u7684 session \u222A \u5BFC\u5165\u53F0\u8D26\uFF0C\u5220\u4E86\u4F1A\u8BDD\u4E5F\u4E0D\u5931\u5FC6\uFF09\u3002**\u9664\u300C\u96F6\u7528\u6237\u53D1\u8A00\u300D\u5916\u4E0D\u518D\u8BBE\u8F6E\u6B21\u95E8\u69DB\uFF0C\u4E5F\u4E0D\u505A\u65F6\u95F4\u7A97\u8FC7\u6EE4**\u2014\u2014\u6309\u8FD4\u56DE\u7684 turns / \u65F6\u95F4\u6233\u7531\u8C03\u7528\u65B9\u81EA\u5DF1\u7B5B\uFF08UI \u7684\u6458\u8981\u7EDF\u8BA1\u540C\u7406\uFF09\u3002\u53E6\u6709\u6574\u6E90\u4E0D\u4EA7\u5019\u9009\u7684\u60C5\u51B5\uFF1A\u672C\u673A\u6CA1\u88C5 codex\u3001\u6216 codex \u5E93\u91CC\u5224\u4E0D\u51FA\u4F1A\u8BDD\u5165\u53E3\uFF08\u65E0 threads \u8868 / \u7F3A thread_source \u5217\uFF09\u65F6\uFF0C**codex \u4FA7\u6574\u4E2A\u8FD4\u7A7A**\uFF0C\u4E0D\u662F\u9010\u6761 skip",
|
|
23503
23669
|
args: SessionExternalScanArgs
|
|
23504
23670
|
},
|
|
23505
23671
|
"session:importExternal": {
|
|
23506
|
-
summary: "\u628A Claude Code / Codex \u65E2\u6709\u5386\u53F2\u4F1A\u8BDD\u5BFC\u5165\u4E3A clawd \u5F15\u7528\uFF1A\
|
|
23672
|
+
summary: "\u628A Claude Code / Codex \u65E2\u6709\u5386\u53F2\u4F1A\u8BDD\u5BFC\u5165\u4E3A clawd \u5F15\u7528\uFF1A\u5199 SessionFile + \u5F80\u5BFC\u5165\u53F0\u8D26 append \u4E00\u884C\uFF08\u53BB\u91CD\u547D\u4E2D\u7684\u4E0D\u843D\u8D26\uFF09\uFF0C**\u4E0D\u62C9\u8D77 runner\u3001\u4E0D\u6539\u539F\u59CB transcript**\uFF1B\u6309 toolSessionId \u8DE8 owned scope \u53BB\u91CD\uFF0C\u65B0\u5BFC\u5165\u4F1A\u5E7F\u64AD session:info\u3002\u53F0\u8D26 append-only \u4E14\u4E0D\u968F\u4F1A\u8BDD\u5220\u9664\u6D88\u5931\u2014\u2014\u5220\u6389\u4F1A\u8BDD\u4E0D\u7B49\u4E8E\u64A4\u9500\u5BFC\u5165\uFF0C\u60F3\u8BA9\u67D0\u6761\u91CD\u65B0\u53EF\u5BFC\u5165\u8981\u8D70 clawd-session-import --undo \u6E05\u8D26",
|
|
23507
23673
|
args: SessionImportExternalArgs
|
|
23508
23674
|
},
|
|
23509
23675
|
"session:list": {
|
|
@@ -23515,7 +23681,7 @@ var METHOD_DOCS = {
|
|
|
23515
23681
|
args: SessionIdArgs
|
|
23516
23682
|
},
|
|
23517
23683
|
"session:update": {
|
|
23518
|
-
summary: "\u6539\u4F1A\u8BDD\u5143\u6570\u636E\uFF0C\u4E0D\u5F71\u54CD\u8FDB\u7A0B\
|
|
23684
|
+
summary: "\u6539\u4F1A\u8BDD\u5143\u6570\u636E\uFF0C\u4E0D\u5F71\u54CD\u8FDB\u7A0B\u3002**patch \u91CC\u7684\u672A\u77E5\u952E\u4F1A\u88AB\u9759\u9ED8\u4E22\u5F03**\uFF08zod strip\uFF09\uFF0Chandler \u7167\u6837\u8FD4 ok\u2014\u2014\u5141\u8BB8\u54EA\u4E9B\u952E\u4EE5 argsSchema \u4E3A\u51C6\uFF08meta:methods \u4F20 method \u53C2\u6570\u5373\u53EF\u53D6\u5230\uFF09\uFF0C\u522B\u7167\u8BB0\u5FC6\u731C\u3002ephemeral \u53EA\u6536 false\uFF1A\u5FEB\u901F\u95EE\u7B54\u4F1A\u8BDD\u8F6C\u6B63\u53EA\u80FD\u6458\u4E0D\u80FD\u6253\uFF0C\u53CD\u5411\u6807\u8BB0\u4F1A\u8BA9\u4F1A\u8BDD\u4ECE\u6240\u6709 sidebar \u89C6\u91CE\u6D88\u5931\u4E14\u5220\u4E0D\u6389",
|
|
23519
23685
|
args: SessionUpdateArgs
|
|
23520
23686
|
},
|
|
23521
23687
|
"session:delete": {
|
|
@@ -23647,11 +23813,11 @@ var METHOD_DOCS = {
|
|
|
23647
23813
|
args: NO_ARGS
|
|
23648
23814
|
},
|
|
23649
23815
|
"project:list": {
|
|
23650
|
-
summary: "\u5217\u51FA
|
|
23816
|
+
summary: "\u5217\u51FA\u9879\u76EE\u6E05\u5355\uFF08owner-only\uFF09\u3002**\u771F\u503C = Codex \u7684 local-projects \u222A \u672C\u673A projects.json \u53E0\u52A0\u5C42**\uFF1A\u6309\u5F52\u4E00\u5316 path \u53BB\u91CD\u3001Codex \u4FA7\u7684 name \u4F18\u5148\uFF08\u7528\u6237\u5728 Codex \u91CC\u6539\u8FC7\u7684\u66F4\u6743\u5A01\uFF09\uFF0CCodex \u91CC createdAt=0 \u7684\u81EA\u52A8\u6536\u5F55\u6761\u76EE\u8DF3\u8FC7\uFF1B\u6CA1\u914D Codex state \u6587\u4EF6\u65F6\u9000\u5316\u4E3A\u53EA\u6709\u672C\u5730\u53E0\u52A0\u5C42\u3002\u4E09\u6761\u8DEF\u5F84\u5224\u636E\u4E00\u5F8B\u8FC7\u6EE4\uFF1A~/.clawd \u5B50\u6811 / home \u6839 / \u6587\u4EF6\u7CFB\u7EDF\u6839\u3002\u4F1A\u8BDD\u5F52\u7EC4\u5728 UI \u4FA7\u505A",
|
|
23651
23817
|
args: NO_ARGS
|
|
23652
23818
|
},
|
|
23653
23819
|
"project:create": {
|
|
23654
|
-
summary: "\u65B0\u5EFA project\uFF1A\u6821\u9A8C\u76EE\u5F55\
|
|
23820
|
+
summary: "\u65B0\u5EFA project\uFF08owner-only\uFF09\u3002**path \u4E0E name \u81F3\u5C11\u4F20\u4E00\u4E2A**\uFF0C\u4E24\u6761\u5206\u652F\u526F\u4F5C\u7528\u4E0D\u540C\uFF1A\u7ED9 path = \u5728\u73B0\u6210\u76EE\u5F55\u4E0A\u767B\u8BB0\uFF08\u53EA\u6821\u9A8C\u662F\u76EE\u5F55\uFF0C\u4E0D\u52A8\u78C1\u76D8\uFF09\uFF1B**\u53EA\u7ED9 name = \u5728 ~/Documents/ChatGPT/<name>/ \u5EFA\u76EE\u5F55\u5E76 git init**\uFF08\u649E\u540D\u52A0\u6570\u5B57\u540E\u7F00 `x 2`\uFF1Bgit init \u5931\u8D25\u4F1A\u6E05\u6389\u521A\u5EFA\u7684\u76EE\u5F55\u518D\u62A5\u9519\uFF09\u3002\u843D\u8FDB\u672C\u673A projects.json \u53E0\u52A0\u5C42\uFF08\u8DEF\u5F84\u987B\u8FC7 project:list \u90A3\u4E09\u6761\u5224\u636E\uFF0C\u5426\u5219\u62A5\u9519\uFF09\uFF0C**\u4E0D\u5199 Codex registry**\uFF08Codex \u4FA7\u9760\u81EA\u7136\u6536\u5F55\uFF09",
|
|
23655
23821
|
args: ProjectCreateArgs,
|
|
23656
23822
|
argsConstraints: {
|
|
23657
23823
|
anyOf: [{ required: ["path"] }, { required: ["name"] }]
|
|
@@ -23673,6 +23839,38 @@ var METHOD_DOCS = {
|
|
|
23673
23839
|
summary: "\u8BFB\u6587\u4EF6\u5185\u5BB9\uFF1Bguest \u8DEF\u5F84\u8FB9\u754C\u4E0E workspace:list \u540C",
|
|
23674
23840
|
args: WorkspaceReadArgs
|
|
23675
23841
|
},
|
|
23842
|
+
"deploy:start": {
|
|
23843
|
+
summary: "\u5BF9\u67D0\u4E2A persona \u53D1\u8D77\u4E00\u6B21\u4E0A\u4E91\u90E8\u7F72\uFF1A\u5EFA\u5355\u636E\u5E76**\u5F02\u6B65**\u8D77\u73AF\u5883\u626B\u63CF\u3002\u7ACB\u523B\u8FD4\u56DE scanning \u6001\u5355\u636E\uFF0C\u626B\u63CF\u8981\u8DD1\u51E0\u5206\u949F\u3001\u626B\u5B8C\u7531\u540E\u53F0\u56DE\u5199\uFF1Bowner-only",
|
|
23844
|
+
args: DeployStartArgsSchema
|
|
23845
|
+
},
|
|
23846
|
+
"deploy:list": {
|
|
23847
|
+
summary: "\u5217\u51FA\u5168\u90E8\u90E8\u7F72\u5355\uFF08\u65B0\u7684\u5728\u524D\uFF09\uFF1Bowner-only\u3002\u65E0\u53C2\u6570",
|
|
23848
|
+
args: NO_ARGS
|
|
23849
|
+
},
|
|
23850
|
+
"deploy:get": {
|
|
23851
|
+
summary: "\u53D6\u4E00\u5F20\u90E8\u7F72\u5355 + \u6BCF\u6761\u51ED\u636E\u7684\u586B\u5199\u8FDB\u5EA6\u3002**\u8FDB\u5EA6\u53EA\u6709\u4E2A\u6570\u4E0D\u542B\u503C**\u2014\u2014\u51ED\u636E\u503C\u4E0D\u7ECF\u8FC7\u8FD9\u6761\u8DEF\uFF1Bowner-only",
|
|
23852
|
+
args: DeployIdArgsSchema
|
|
23853
|
+
},
|
|
23854
|
+
"deploy:patch": {
|
|
23855
|
+
summary: "\u7F16\u8F91\u90E8\u7F72\u5355\uFF1A\u9009\u5C65\u7EA6\uFF08\u8C01\u51FA\u8FD9\u6761\u51ED\u636E\uFF09/ \u6539\u5192\u70DF\u4EFB\u52A1 / \u624B\u5DE5\u8865\u4F9D\u8D56\u3002**\u4E0D\u80FD\u4ECE\u8FD9\u91CC\u4F20\u51ED\u636E\u7684\u503C**\uFF08\u503C\u8D70 deploy:putSecret\uFF09\uFF1B\u5C65\u7EA6\u540D\u5FC5\u987B\u662F\u6E05\u5355\u91CC\u58F0\u660E\u8FC7\u7684\u51ED\u636E\uFF1Bowner-only",
|
|
23856
|
+
args: DeployPatchArgsSchema
|
|
23857
|
+
},
|
|
23858
|
+
"deploy:putSecret": {
|
|
23859
|
+
summary: "\u5F55\u5165\u4E00\u6761\u51ED\u636E\u7684\u503C\u3002**\u8FD9\u662F\u503C\u552F\u4E00\u7684\u5165\u53E3**\uFF1A\u5165\u53C2\u4E0D\u8FDB\u65E5\u5FD7\u3001\u54CD\u5E94\u53EA\u56DE\u586B\u5199\u8FDB\u5EA6\u4E0D\u56DE\u663E\u503C\u3002env \u540D\u5FC5\u987B\u662F\u8BE5\u51ED\u636E\u5728\u6E05\u5355\u91CC\u58F0\u660E\u8FC7\u7684\uFF0C\u5426\u5219\u503C\u5B58\u4E86\u4E5F\u6C38\u8FDC\u6CE8\u5165\u4E0D\u5230\uFF1Bowner-only",
|
|
23860
|
+
args: DeployPutSecretArgsSchema
|
|
23861
|
+
},
|
|
23862
|
+
"deploy:reportFinding": {
|
|
23863
|
+
summary: "\u626B\u63CF\u4E2D\u7684 butler \u9010\u6761\u4E0A\u62A5\u4E00\u4E2A\u53D1\u73B0\uFF08cli / secret / asset\uFF09\u3002**\u8FB9\u626B\u8FB9\u62A5**\uFF0C\u5355\u636E\u9875\u968F\u4E4B\u4E00\u70B9\u70B9\u586B\u5145\uFF1B\u540C (kind,name) \u91CD\u590D\u4E0A\u62A5\u5373\u8986\u76D6\u3002owner-only\u2014\u2014butler \u4F1A\u8BDD\u672C\u8EAB\u8DD1\u5728 owner \u6A21\u5F0F",
|
|
23864
|
+
args: DeployReportFindingArgsSchema
|
|
23865
|
+
},
|
|
23866
|
+
"deploy:finishScan": {
|
|
23867
|
+
summary: "butler \u6536\u5C3E\uFF1A\u7ED9\u51FA\u5192\u70DF\u4EFB\u52A1\u4E0E\u5B58\u7591\u9879\uFF0C\u5355\u636E\u4ECE scanning \u8F6C draft\u3002\u6CA1\u8C03\u5230\u5B83\u5C31\u7B49\u4E8E\u6CA1\u626B\u5B8C\u2014\u2014butler \u4F1A\u8BDD\u7ED3\u675F\u65F6\u5355\u636E\u8FD8\u505C\u5728 scanning\uFF0Cdaemon \u636E\u6B64\u5224 scanFailed\uFF1Bowner-only",
|
|
23868
|
+
args: DeployFinishScanArgsSchema
|
|
23869
|
+
},
|
|
23870
|
+
"deploy:remove": {
|
|
23871
|
+
summary: "\u5220\u6389\u4E00\u5F20\u90E8\u7F72\u5355\uFF0C\u8FDE\u5E26\u6E05\u6389\u5B83\u7684\u5168\u90E8\u51ED\u636E\u503C\uFF08\u503C\u4E0D\u8BE5\u6BD4\u5355\u636E\u6D3B\u5F97\u4E45\uFF09\uFF1Bowner-only",
|
|
23872
|
+
args: DeployIdArgsSchema
|
|
23873
|
+
},
|
|
23676
23874
|
"shift:list": {
|
|
23677
23875
|
summary: "\u5217\u51FA owner \u7684\u5168\u90E8 shift\uFF08\u6392\u73ED\uFF09\uFF0C\u7ED9 UI \u65E5\u5386\u6E32\u67D3\u7528\uFF1Bowner-only",
|
|
23678
23876
|
args: NO_ARGS
|
|
@@ -23745,7 +23943,7 @@ var METHOD_DOCS = {
|
|
|
23745
23943
|
},
|
|
23746
23944
|
// ---- master:*(授权查表,Master 经 clawd-rpc 桥调)----
|
|
23747
23945
|
"master:authorityCheck": {
|
|
23748
|
-
summary: "\u67E5 Master \u7684\u6388\u6743\u8BBE\u5B9A\uFF08\u5168\u5C40\u4E00\u5957\uFF09\uFF1A\u8FD4\u56DE ask / allow / deny\u3002\u8868\
|
|
23946
|
+
summary: "\u67E5 Master \u7684\u6388\u6743\u8BBE\u5B9A\uFF08\u5168\u5C40\u4E00\u5957\uFF09\uFF1A\u8FD4\u56DE ask / allow / deny + source\u3002**\u8BBE\u5B9A\u6587\u4EF6\u4E0D\u5B58\u5728 \u2192 \u7528\u51FA\u5382\u9ED8\u8BA4\u89C4\u5219\u8868**\uFF08source=default\uFF0C\u5F53\u524D\u56DB\u6761\u5BF9\u5916\u4E0D\u53EF\u9006\u52A8\u4F5C\u5168\u662F ask\uFF0C\u522B\u628A\u5B83\u5F53\u5F02\u5E38\u515C\u5E95\uFF09\uFF1B\u8BFB\u574F / \u7ED3\u6784\u4E0D\u5BF9 / action \u62FC\u9519 / id \u672A\u767B\u8BB0 \u2192 **fail-safe \u88C1\u51B3 ask**\uFF08source=fallback:<\u539F\u56E0>\uFF0C\u4E0D\u9759\u9ED8\u541E\uFF09",
|
|
23749
23947
|
args: AuthorityCheckArgsSchema
|
|
23750
23948
|
},
|
|
23751
23949
|
"github:status": {
|
|
@@ -23869,7 +24067,7 @@ var METHOD_DOCS = {
|
|
|
23869
24067
|
args: NO_ARGS
|
|
23870
24068
|
},
|
|
23871
24069
|
"persona:get": {
|
|
23872
|
-
summary: "\u53D6\u5355\u4E2A persona \u8BE6\u60C5\uFF0C**\
|
|
24070
|
+
summary: "\u53D6\u5355\u4E2A persona \u8BE6\u60C5\u2014\u2014\u552F\u4E00\u643A\u5E26\u4EBA\u683C\u6B63\u6587\u7684 method\uFF0C\u800C**\u6B63\u6587\u662F\u4E24\u5C42\u3001\u8981\u8BFB\u5168\u5F97\u4E24\u5C42\u90FD\u770B**\uFF1Apersonality\uFF08builtin CLAUDE.md\uFF09+ personalityLocal\uFF08\u8865\u5145\u5C42 .clawd/personality.local.md\uFF0C'' = \u6CA1\u5199\uFF09\uFF0CpersonalityManaged \u6807 builtin \u5C42\u5F52\u4E0D\u5F52 daemon \u6258\u7BA1\uFF08\u9884\u88C5 persona = \u4EA7\u54C1\u89C4\u683C\u3001\u53EA\u8BFB\uFF09\u3002\u53E6\u5E26 skills / plugins / sandboxSettings / codexSandbox\u3002\u54CD\u5E94\u628A PersonaFile \u5E73\u94FA\u5728\u5E27\u4E0A\uFF08\u65E0 persona \u5305\u88F9\u952E\uFF09\uFF1B\u67E5\u4E0D\u5230 / guest \u65E0\u6743\u9650\u629B PERSONA_NOT_FOUND",
|
|
23873
24071
|
args: PersonaIdArgsSchema
|
|
23874
24072
|
},
|
|
23875
24073
|
"persona:update": {
|
|
@@ -23905,16 +24103,16 @@ var METHOD_DOCS = {
|
|
|
23905
24103
|
args: PeerExecRunArgsSchema
|
|
23906
24104
|
},
|
|
23907
24105
|
"session:pty:input": {
|
|
23908
|
-
summary: "\u628A\u7528\u6237\u952E\u76D8\u5B57\u8282\u5199\u8FDB pty stdin\uFF08\u4EC5 CLAWD_CC_MODE=tui\uFF09\u3002\u9AD8\u9891\u5E27\uFF0C\u4E0D\u5165 reducer\u3002body: { sessionId, data\uFF08base64-utf8\uFF09 }"
|
|
24106
|
+
summary: "\u628A\u7528\u6237\u952E\u76D8\u5B57\u8282\u5199\u8FDB pty stdin\uFF08\u4EC5 CLAWD_CC_MODE=tui\uFF09\u3002\u9AD8\u9891\u5E27\uFF0C\u4E0D\u5165 reducer\u3002body: { sessionId, data\uFF08base64-utf8\uFF09 }\u3002**\u53C2\u6570\u7F3A\u5931 / \u7C7B\u578B\u4E0D\u5BF9 / \u975E tui / pty \u5DF2\u9000\u51FA\u90FD\u9759\u9ED8\u8FD4 ok:false \u800C\u4E0D\u62A5\u9519**\uFF08\u9AD8\u9891\u5E27\u4E0D\u80FD\u629B\u9519\u5237\u5C4F\uFF09\u2014\u2014\u62FF\u5230 false \u5206\u4E0D\u51FA\u662F\u54EA\u79CD\u539F\u56E0\u3002\u53EA\u6709\u8D8A\u6743\u8BBF\u95EE\u8BE5\u4F1A\u8BDD\u624D\u629B\u9519"
|
|
23909
24107
|
},
|
|
23910
24108
|
"session:pty:resize": {
|
|
23911
|
-
summary: "\u540C\u6B65\u7EC8\u7AEF\u5C3A\u5BF8\u7ED9 pty\uFF08\u4EC5 tui \u6A21\u5F0F\uFF09\u3002body: { sessionId, cols, rows }"
|
|
24109
|
+
summary: "\u540C\u6B65\u7EC8\u7AEF\u5C3A\u5BF8\u7ED9 pty\uFF08\u4EC5 tui \u6A21\u5F0F\uFF09\u3002body: { sessionId, cols, rows }\u3002**\u540C pty:input\uFF1A\u53C2\u6570\u4E0D\u5BF9 / \u627E\u4E0D\u5230 pty \u9759\u9ED8\u8FD4 ok:false\uFF0C\u4E0D\u62A5\u9519**"
|
|
23912
24110
|
},
|
|
23913
24111
|
"session:pty:snapshot": {
|
|
23914
|
-
summary: "\u62C9\u5F53\u524D pty \u5C4F\u5E55\u5168\u91CF\u5FEB\u7167\uFF08\u5207\u56DE\u4F1A\u8BDD / \u5237\u65B0\u65F6\u7528\uFF09\uFF0C\u8FD4\u56DE { data, atSeq, popupKind }\uFF1B\u975E tui \
|
|
24112
|
+
summary: "\u62C9\u5F53\u524D pty \u5C4F\u5E55\u5168\u91CF\u5FEB\u7167\uFF08\u5207\u56DE\u4F1A\u8BDD / \u5237\u65B0\u65F6\u7528\uFF09\uFF0C\u8FD4\u56DE { data, atSeq, popupKind }\u3002body: { sessionId }\u3002**\u7F3A sessionId \u9759\u9ED8\u8FD4 ok:false\uFF1B\u975E tui / pty \u5DF2\u9000\u51FA\u8FD4 ok:true \u4F46 data=null, atSeq=0** \u2014\u2014 \u4E24\u8005\u90FD\u4E0D\u62A5\u9519\uFF0C\u8981\u5206\u6E05\u5F97\u770B ok\u3002\u53EA\u6709\u8D8A\u6743\u8BBF\u95EE\u8BE5\u4F1A\u8BDD\u624D\u629B\u9519"
|
|
23915
24113
|
},
|
|
23916
24114
|
"attachment.signUrl": {
|
|
23917
|
-
summary: "\u7ED9\u5DF2\u5165\u7FA4\u7684\u6587\u4EF6\u7B7E\u53D1 HMAC \u4E0B\u8F7D URL\uFF08\u8DE8\u8BBE\u5907\u53EF\u76F4\u63A5\u6253\u5F00\uFF09",
|
|
24115
|
+
summary: "\u7ED9\u5DF2\u5165\u7FA4**\u4E14\u975E stale** \u7684\u6587\u4EF6\u7B7E\u53D1 HMAC \u4E0B\u8F7D URL\uFF08\u8DE8\u8BBE\u5907\u53EF\u76F4\u63A5\u6253\u5F00\uFF09\u3002**\u9ED8\u8BA4 24h \u8FC7\u671F**\uFF1BttlSeconds \u663E\u5F0F\u4F20 null = \u6C38\u4E0D\u8FC7\u671F\u3002\u4E0D\u5728\u6E05\u5355\u91CC\u548C stale \u62A5\u540C\u4E00\u4E2A\u9519\uFF0C\u5206\u4E0D\u51FA\u662F\u54EA\u79CD",
|
|
23918
24116
|
args: AttachmentSignUrlArgs
|
|
23919
24117
|
},
|
|
23920
24118
|
"attachment.groupAdd": {
|
|
@@ -23942,7 +24140,7 @@ var METHOD_DOCS = {
|
|
|
23942
24140
|
args: InboxPostMessageArgsSchema
|
|
23943
24141
|
},
|
|
23944
24142
|
"inbox:sendDm": {
|
|
23945
|
-
summary: "\u4EE5\u5F53\u524D\u4F1A\u8BDD\u7684\u8EAB\u4EFD\u53D1\u4E00\u6761 DM\uFF08\u53D1\u4FE1\u4EBA\u7531 session scope \u5F52\u56E0\uFF0C\u4E0D\u53EF\u4F2A\u9020\uFF09\u3002**owner \u9A71\u52A8\u7684\u4F1A\u8BDD\u5FC5\u586B peerDeviceId**\uFF0Cguest \u9A71\u52A8\u7684\u53EF\u7701",
|
|
24143
|
+
summary: "\u4EE5\u5F53\u524D\u4F1A\u8BDD\u7684\u8EAB\u4EFD\u53D1\u4E00\u6761 DM\uFF08\u53D1\u4FE1\u4EBA\u7531 session scope \u5F52\u56E0\uFF0C\u4E0D\u53EF\u4F2A\u9020\uFF09\u3002**owner \u9A71\u52A8\u7684\u4F1A\u8BDD\u5FC5\u586B peerDeviceId**\uFF0Cguest \u9A71\u52A8\u7684\u53EF\u7701\uFF08\u4E14\u53EA\u80FD\u53D1\u7ED9 owner\uFF09\u3002**sessionId \u786C\u5FC5\u586B\u4F46\u4E0D\u5728 args schema \u91CC**\uFF08clawd-rpc \u81EA\u52A8\u8865\uFF0C\u76F4\u8FDE\u987B\u81EA\u5E26\uFF09\uFF0C\u4E14\u5FC5\u987B\u662F persona \u4F1A\u8BDD\uFF0C\u5426\u5219\u62D2",
|
|
23946
24144
|
args: InboxSendDmArgsSchema
|
|
23947
24145
|
},
|
|
23948
24146
|
"contact:list": {
|
|
@@ -24010,7 +24208,7 @@ var METHOD_DOCS = {
|
|
|
24010
24208
|
args: ExtensionIdArgs
|
|
24011
24209
|
},
|
|
24012
24210
|
"extension.publish": {
|
|
24013
|
-
summary: "\u628A\u672C\u673A extension \u516C\u5F00\u5230\u5206\u4EAB\u9891\u9053\uFF0C\u4F9B\u8054\u7CFB\u4EBA\u62C9\u53D6\u3002owner-only",
|
|
24211
|
+
summary: "\u628A\u672C\u673A extension \u516C\u5F00\u5230**\u5206\u53D1\u6E20\u9053**\uFF08extension \u7684\u5206\u4EAB\u9762\uFF0C\u4E0E channel:* \u7684\u300C\u9891\u9053\u300D\u662F\u4E24\u56DE\u4E8B\uFF09\uFF0C\u4F9B\u8054\u7CFB\u4EBA\u62C9\u53D6\u3002owner-only\u3002**\u7ED9\u4E86 newVersion \u4F1A\u5148\u539F\u5B50\u6539\u5199\u8BE5 extension \u78C1\u76D8\u4E0A manifest.json \u7684 version**\uFF08\u683C\u5F0F\u4E0D\u5408 semver \u2192 INVALID_VERSION\uFF1B\u6B64\u524D\u53D1\u5E03\u8FC7\u7684\u8FD8\u8981\u6C42\u4E25\u683C\u5927\u4E8E\u4E0A\u4E00\u4E2A\u5DF2\u53D1\u5E03\u7248\u672C\uFF0C\u5426\u5219 VERSION_NOT_BUMPED\uFF0C\u9996\u6B21\u53D1\u5E03\u4E0D\u6BD4\u8F83\uFF09\uFF1Bnull = \u4E0D bump",
|
|
24014
24212
|
args: ExtensionPublishArgs
|
|
24015
24213
|
},
|
|
24016
24214
|
"extension.unpublish": {
|
|
@@ -24030,11 +24228,11 @@ var METHOD_DOCS = {
|
|
|
24030
24228
|
args: ExtensionFetchBundleArgs
|
|
24031
24229
|
},
|
|
24032
24230
|
"extension.install-from-channel": {
|
|
24033
|
-
summary: "\u5728\u81EA\u5DF1 daemon \u4E0A\
|
|
24231
|
+
summary: "\u5728\u81EA\u5DF1 daemon \u4E0A\u88C5\u4E00\u4E2A\u6765\u81EA**\u5206\u53D1\u6E20\u9053**\u7684 extension\uFF08channelRef \u6307\u7684\u662F\u5206\u53D1\u6E20\u9053\uFF0C\u4E0E channel:* \u7684\u300C\u9891\u9053\u300D\u65E0\u5173\uFF09\u3002**bundle \u5B57\u8282\u8981\u8C03\u7528\u65B9\u7ED9**\uFF08zipBase64\uFF09\u2014\u2014daemon \u4E0D\u81EA\u5DF1\u53BB\u5BF9\u7AEF\u53D6\uFF0C\u5B8C\u6574\u94FE\u8DEF\u662F extension.list-published \u2192 extension.fetchBundle \u2192 \u672C\u65B9\u6CD5",
|
|
24034
24232
|
args: ExtensionFromChannelArgs
|
|
24035
24233
|
},
|
|
24036
24234
|
"extension.update-from-channel": {
|
|
24037
|
-
summary: "\
|
|
24235
|
+
summary: "\u628A\u5DF2\u88C5 extension \u66F4\u65B0\u5230**\u5206\u53D1\u6E20\u9053**\u4E0A\u7684\u65B0\u7248\u672C\uFF1B\u4E0E install-from-channel \u540C\u6837\u8981\u8C03\u7528\u65B9\u81EA\u5E26 zipBase64\uFF0C\u53D6\u5B57\u8282\u4ECD\u8D70 extension.fetchBundle",
|
|
24038
24236
|
args: ExtensionFromChannelArgs
|
|
24039
24237
|
},
|
|
24040
24238
|
"auth:login:start": {
|
|
@@ -24070,7 +24268,7 @@ var METHOD_DOCS = {
|
|
|
24070
24268
|
args: GetProjectArgsSchema
|
|
24071
24269
|
},
|
|
24072
24270
|
"appBuilder:createProject": {
|
|
24073
|
-
summary: "\u7ED9\u4F1A\u8BDD\u7ED1\u5B9A\u65B0 project\uFF1A\u6821\u9A8C\u540D + \u4ECE
|
|
24271
|
+
summary: "\u7ED9\u4F1A\u8BDD\u7ED1\u5B9A\u65B0 project\uFF1A\u6821\u9A8C\u540D + \u4ECE PROJECT_PORT_MIN..MAX \u6BB5\uFF08\u5F53\u524D 6173-6272\uFF09\u5206\u914D\u672A\u5360\u7528\u7AEF\u53E3\uFF08\u8DE8 user \u5168\u5C40\u552F\u4E00\uFF0C\u6C60\u6EE1\u62A5\u9519\uFF09+ \u5EFA\u76EE\u5F55\u5199\u5143\u6570\u636E + **\u540C\u6B65 scaffold**\uFF08spawn \u811A\u672C\u628A nestjs-react \u6A21\u677F\u62F7\u8FDB\u53BB\uFF1B\u5931\u8D25\u4F1A\u5220\u6389\u521A\u5EFA\u7684\u76EE\u5F55\u518D\u629B INTERNAL\uFF0C\u4E0D\u7559\u534A\u6210\u54C1\uFF09\u3002**\u88C5\u4F9D\u8D56\u548C\u8D77 dev server \u90FD\u4E0D\u5728\u8FD9\u91CC**\uFF1A\u843D\u5730 stage=install-pending\uFF0C\u8C03\u7528\u65B9\u81EA\u5DF1 pnpm install + appBuilder:reportStage + appBuilder:startDevServer",
|
|
24074
24272
|
args: CreateProjectArgsSchema
|
|
24075
24273
|
},
|
|
24076
24274
|
"appBuilder:deleteProject": {
|
|
@@ -24078,7 +24276,7 @@ var METHOD_DOCS = {
|
|
|
24078
24276
|
args: DeleteProjectArgsSchema
|
|
24079
24277
|
},
|
|
24080
24278
|
"appBuilder:updateProjectPort": {
|
|
24081
|
-
summary: "\u6539 dev server \u7AEF\u53E3\uFF08\u6821\u9A8C\u6BB5\u5185
|
|
24279
|
+
summary: "\u6539 dev server \u7AEF\u53E3\uFF08\u6821\u9A8C\u5728 PROJECT_PORT_MIN..MAX \u6BB5\u5185\u3001\u5F53\u524D 6173-6272\uFF1B**\u649E\u8F66\u53EA\u67E5\u8C03\u7528\u65B9\u81EA\u5DF1\u540D\u4E0B\u7684 project**\uFF0C\u4E0D\u50CF createProject \u90A3\u6837\u8DE8 user \u67E5\uFF09\uFF1A\u505C\u65E7\u7AEF\u53E3 dev server + \u6539 .clawd-project.json + \u7F6E stage=stopped\u3002**\u4E0D\u81EA\u52A8\u62C9\u8D77\u65B0\u7AEF\u53E3\u7684 dev server**\u2014\u2014\u8981\u8D77\u5F97\u518D\u8C03 appBuilder:startDevServer\uFF08\u90A3\u6761\u624D\u8D70 readiness probe\uFF09",
|
|
24082
24280
|
args: UpdateProjectPortArgsSchema
|
|
24083
24281
|
},
|
|
24084
24282
|
"appBuilder:setProdUrl": {
|
package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scan-persona-for-deploy
|
|
3
|
+
description: 老板要把某个 persona 发布到云上时触发——把这个 persona 读一遍,弄清它挪到一台干净的云上机器要预备什么(命令行工具、凭据、随行资产),边查边填进部署单据。收到形如「扫描 persona-xxx 的部署环境,deployId=dp-xxxx」的任务时使用。只负责扫,不负责部署。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 扫 persona 的上云环境
|
|
7
|
+
|
|
8
|
+
老板在界面上点了「发布到云上」,现在有一张空的部署单据等着你填。**这张单据是随你干活一点点
|
|
9
|
+
长出来的**——他正看着页面,你查明白一条就报一条,别攒到最后一次性倒出来。
|
|
10
|
+
|
|
11
|
+
## 你要回答的问题
|
|
12
|
+
|
|
13
|
+
这个 persona 如果被搬到一台**干净的 Linux 容器**里跑(没有任何人的 home 目录、没有预装工具、
|
|
14
|
+
没有任何凭据),需要事先给它备好什么,它才能正常干活?
|
|
15
|
+
|
|
16
|
+
## 读什么
|
|
17
|
+
|
|
18
|
+
主体是任务里给你的 persona 目录,把里面的**全部文本**读完:
|
|
19
|
+
|
|
20
|
+
- `CLAUDE.md` / `AGENTS.md`——人格与操作指引,依赖大多写在这里
|
|
21
|
+
- `.claude/skills/**/SKILL.md` 及 skill 附带的脚本
|
|
22
|
+
- `.mcp.json`——挂了哪些 MCP server,怎么启动、要什么参数
|
|
23
|
+
- 目录里的任何脚本、模板、配置样例
|
|
24
|
+
|
|
25
|
+
**关键:跟着引用往外走至少一跳。** 人格里出现的文件路径、脚本名、命令,都要去把那个文件读了
|
|
26
|
+
再下结论。一句「发布走 publish.sh」背后可能藏着五六个命令行工具,只读人格发现不了。
|
|
27
|
+
|
|
28
|
+
任务里会告诉你还有哪些 persona 目录之外的共享资产可以读(如 `deploy-kit`)。
|
|
29
|
+
|
|
30
|
+
## 边查边报
|
|
31
|
+
|
|
32
|
+
每查明白一条,立刻调 `clawd-rpc` 的 `call`:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
call({ method: "deploy:reportFinding", args: {
|
|
36
|
+
deployId: "<任务里给的>",
|
|
37
|
+
kind: "cli" | "secret" | "asset",
|
|
38
|
+
item: { ... }, // 见下面各类的字段
|
|
39
|
+
evidence: { reason: "...", file: "...", quote: "..." }
|
|
40
|
+
}})
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
同一个名字重复上报即覆盖——先给初判、读到更硬的证据再修正,是允许的。
|
|
44
|
+
|
|
45
|
+
### kind: "cli" —— 需要预装的命令行工具
|
|
46
|
+
|
|
47
|
+
`item` 字段:`name`(必填,可执行名)、`from`(从哪装)、`version`(精确版本)、`min`(版本下限)。
|
|
48
|
+
|
|
49
|
+
只列**干净容器里不会自带**的:要列 `aliyun` / `s`(Serverless Devs) / `pnpm` / `python3` / `git`
|
|
50
|
+
这类;不必列 `ls` `cat` `grep` `sed` `awk` `curl` `tar` `bash` 这些基础镜像自带的。
|
|
51
|
+
|
|
52
|
+
**`from` 必须给出,查清楚是你的活,不是留给老板的作业。** 写成 `<kind>:<ref>`,如
|
|
53
|
+
`npm:@serverless-devs/s` / `github:aliyun/aliyun-cli` / `apt:python3`。按这个顺序找:
|
|
54
|
+
|
|
55
|
+
1. **persona 自己的脚本**——工具链自举脚本(如 `ensure-toolchain.sh`)里往往直接写着安装命令。
|
|
56
|
+
这层最可信:是这个 persona 实际验证过的装法。
|
|
57
|
+
2. **你已经知道的**——`python3` / `git` / `rsync` 这类常见工具,直接给 `apt:<包名>`。
|
|
58
|
+
3. **上网查**——前两层没有就用 WebSearch 查官方安装文档。冷门工具、自研 CLI、包名和命令名对不上
|
|
59
|
+
的(`s` 那种)都走这条。以官方文档为准,别信随手一篇博客。
|
|
60
|
+
|
|
61
|
+
只有三层都试过还查不到,才允许省略 `from`,并在收尾的 `notes` 里写清你查了什么、卡在哪。
|
|
62
|
+
|
|
63
|
+
注意目标是 **Linux 容器**:persona 脚本里的 macOS 装法(brew 之类)不能照抄,要找 Linux 对应的。
|
|
64
|
+
|
|
65
|
+
版本:拿得准精确版本填 `version`,只知道下限填 `min`,都不确定就都不填。**不要猜版本号**。
|
|
66
|
+
|
|
67
|
+
### kind: "secret" —— 需要的凭据
|
|
68
|
+
|
|
69
|
+
`item` 字段:`name`(命名引用,短横线小写)、`env`(字符串数组,这份凭据要落进哪些环境变量)。
|
|
70
|
+
|
|
71
|
+
- 一份凭据含多个字段就把多个环境变量都列进 `env`(AK 是 id+secret 两个,supabase 是四个)
|
|
72
|
+
- **绝对不要把凭据的值写进来**,哪怕你在文件里看到了明文的 key。你只报告「这里需要一份
|
|
73
|
+
supabase 凭据」,值由老板另外填进单据。看到明文 key 也不要复述它的内容。
|
|
74
|
+
- **不要判断这条凭据该谁出**(部署者出还是使用者自带)。那是老板的决定,不是你能扫出来的。
|
|
75
|
+
|
|
76
|
+
### kind: "asset" —— persona 目录之外的共享资产
|
|
77
|
+
|
|
78
|
+
`item` 字段只有 `name`。任务里列的共享资产里,这个 persona 确实用到的才报。
|
|
79
|
+
|
|
80
|
+
资产是从本机整包带走的,**没有「装法」这回事**,不要给它编 `from`。
|
|
81
|
+
|
|
82
|
+
### evidence —— 每条的来历
|
|
83
|
+
|
|
84
|
+
- `reason`:**一句人话**,说清「为什么需要它 + 你从哪看出来的」,写给不熟悉这个 persona 的人看。
|
|
85
|
+
- 好:「发布脚本用它解析 aliyun CLI 返回的 JSON,没有它 publish 走不到底」
|
|
86
|
+
- 差:「publish.sh 里用到了 python3」(复述原文,没说清为什么要)
|
|
87
|
+
- 差:「用于 JSON 解析」(太短,看不出跟这个 persona 有什么关系)
|
|
88
|
+
- `file`:persona 目录内的相对路径,或资产名开头的路径
|
|
89
|
+
- `quote`:原文摘一两句,**引原文不要转述**(老板起疑时展开核对用)
|
|
90
|
+
|
|
91
|
+
**引文里不要带凭据的值。** 这条对 `quote` 和 `reason` 都成立——引到 `KEY=值` 这种行时,
|
|
92
|
+
把等号右边换成 `<已略去>` 再写进来:
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
好:SUPABASE_KEY=<已略去>
|
|
96
|
+
好:ALIYUN_ACCESS_KEY_SECRET= ← 空值/占位符本身就是证据,照引不用改
|
|
97
|
+
差:SUPABASE_KEY=eyJhbGciOiJIUzI1NiIs...
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
值一旦进了单据,就会跟着单据进 UI、进日志、将来进模型上下文。左边的键名和这行在哪个文件,
|
|
101
|
+
已经足够老板核对了,右边的值对他没有任何用处。
|
|
102
|
+
|
|
103
|
+
## 收尾
|
|
104
|
+
|
|
105
|
+
全部查完,调一次:
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
call({ method: "deploy:finishScan", args: {
|
|
109
|
+
deployId: "<任务里给的>",
|
|
110
|
+
smokeTask: "...",
|
|
111
|
+
notes: ["...", "..."]
|
|
112
|
+
}})
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**`smokeTask`** —— 一句冒烟任务。这个 persona 上云后会被真跑一遍来验证环境装全了:
|
|
116
|
+
|
|
117
|
+
- 覆盖它的**主线活**(读完人格你该知道它主要干什么)
|
|
118
|
+
- 尽量把你列的依赖都用上——用不到的依赖,试装也验不出来
|
|
119
|
+
- 规模最小:能跑通就行,别让它干半小时
|
|
120
|
+
- 用祈使句,就像老板会怎么吩咐它
|
|
121
|
+
|
|
122
|
+
**`notes`** —— 需要老板判断的事。例如「这个 skill 要求浏览器登录,云上大概率不可用」、
|
|
123
|
+
「这里引用的服务是裸 IP,可能受出网策略影响」、「某个工具三层都查了还是没找到装法,卡在 X」。
|
|
124
|
+
没有就空数组。
|
|
125
|
+
|
|
126
|
+
调完 `finishScan` 单据就从「分析中」转成可编辑的草稿,你的活就结束了。
|
|
127
|
+
|
|
128
|
+
## 纪律
|
|
129
|
+
|
|
130
|
+
- **只读不写**:不要修改被扫 persona 目录里的任何文件,不要执行它的脚本。
|
|
131
|
+
- **宁缺毋滥**:拿不准的放进 `notes`,不要编一条依赖进单据。多报一条假依赖会让镜像装一堆没用的
|
|
132
|
+
东西;漏报一条真依赖,后面试装会当场发现。
|
|
133
|
+
- **没调 `finishScan` 就等于没扫完**——中途卡住也要调,把卡在哪写进 `notes`,别让单据一直停在
|
|
134
|
+
「分析中」。
|