@clawos-dev/clawd 0.2.474 → 0.2.475
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 +61 -132
- package/dist/cli.cjs +1499 -2332
- package/dist/dispatch/mcp-server.cjs +61 -132
- package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md +12 -19
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/guest-UrSYl_LP.css +32 -0
- package/dist/share-ui/assets/{guest-6sOkOwA_.js → guest-qhUOEJaG.js} +63 -63
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
- package/dist/share-ui/assets/guest-C2N-X9iw.css +0 -32
|
@@ -21338,117 +21338,75 @@ var EnvEvidenceSchema = external_exports.object({
|
|
|
21338
21338
|
|
|
21339
21339
|
// ../protocol/src/deploy-schemas.ts
|
|
21340
21340
|
var FulfillmentSchema = external_exports.enum(["deployer", "user"]);
|
|
21341
|
-
var
|
|
21342
|
-
|
|
21343
|
-
|
|
21344
|
-
|
|
21345
|
-
|
|
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 DeployPlacementSchema = external_exports.object({
|
|
21359
|
-
/** gateway 的公网地址(入口 A 直接 POST 它;入口 B 由设备目录下发 ws 地址) */
|
|
21360
|
-
gatewayUrl: external_exports.string().min(1),
|
|
21361
|
-
/** 服务设备 id:别人的 clawd 用 `device:connect { deviceId }` 就能连上,本机侧零改动 */
|
|
21362
|
-
serviceDeviceId: external_exports.string().min(1),
|
|
21363
|
-
/** 这次登记为正式的镜像 tag(= 试装通过的那个) */
|
|
21364
|
-
image: external_exports.string().min(1),
|
|
21365
|
-
/** 使用者自带的凭据名字(= 单据里 fulfillment 选了 'user' 的那些)。**只有名字** */
|
|
21366
|
-
userSecrets: external_exports.array(external_exports.string()).default([]),
|
|
21367
|
-
/** 是否进公共设备目录。false = 只有拿到 deviceId 的人连得上 */
|
|
21368
|
-
publicDirectory: external_exports.boolean(),
|
|
21369
|
-
deployedAt: external_exports.number()
|
|
21341
|
+
var DeployFileSchema = external_exports.object({
|
|
21342
|
+
version: external_exports.literal(1),
|
|
21343
|
+
manifest: EnvironmentManifestSchema,
|
|
21344
|
+
/** secret name → 谁提供。缺席 = 还没定 */
|
|
21345
|
+
fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({})
|
|
21370
21346
|
}).strict();
|
|
21371
|
-
var
|
|
21372
|
-
|
|
21373
|
-
|
|
21374
|
-
status: DeployStatusSchema,
|
|
21375
|
-
/**
|
|
21376
|
-
* 干这次扫描的 butler 会话 id。单据上「看它怎么干的」入口靠它把工作过程调出来。
|
|
21377
|
-
*
|
|
21378
|
-
* 扫描不是 daemon 里一个闷头跑的黑盒进程,是 persona-butler 的一次真实会话——用户能翻
|
|
21379
|
-
* 看它读了哪些文件、搜了什么。这条也顺带解决「它到底有没有上网查」这类问题:不用另造
|
|
21380
|
-
* 探针去抓证据,看一眼就知道。
|
|
21381
|
-
*/
|
|
21347
|
+
var DeployScanStatusSchema = external_exports.enum(["scanning", "done", "failed"]);
|
|
21348
|
+
var DeployScanSchema = external_exports.object({
|
|
21349
|
+
/** 干这次扫描的 butler 会话,「看它怎么干的」入口 */
|
|
21382
21350
|
scanSessionId: external_exports.string().optional(),
|
|
21383
|
-
|
|
21384
|
-
|
|
21385
|
-
evidence: external_exports.array(EnvEvidenceSchema).optional(),
|
|
21386
|
-
smokeTask: external_exports.string().optional(),
|
|
21351
|
+
status: DeployScanStatusSchema,
|
|
21352
|
+
evidence: external_exports.array(EnvEvidenceSchema).default([]),
|
|
21387
21353
|
notes: external_exports.array(external_exports.string()).default([]),
|
|
21354
|
+
/** 扫描时被告知的共享资产名单(判「扫描器后来长了新本事」用) */
|
|
21355
|
+
scannedAssets: external_exports.array(external_exports.string()).default([]),
|
|
21356
|
+
startedAt: external_exports.number(),
|
|
21357
|
+
finishedAt: external_exports.number().optional(),
|
|
21358
|
+
error: external_exports.string().optional()
|
|
21359
|
+
}).strict();
|
|
21360
|
+
var DeployRepoSchema = external_exports.object({
|
|
21361
|
+
url: external_exports.string().min(1),
|
|
21362
|
+
branch: external_exports.string().min(1),
|
|
21363
|
+
head: external_exports.string().min(1),
|
|
21364
|
+
/** 工作区有没有未提交的改动 */
|
|
21365
|
+
dirty: external_exports.boolean(),
|
|
21366
|
+
/** 本地领先远端几个提交 */
|
|
21367
|
+
ahead: external_exports.number()
|
|
21368
|
+
}).strict();
|
|
21369
|
+
var DeploySecretPresenceSchema = external_exports.object({
|
|
21370
|
+
env: external_exports.string().min(1),
|
|
21371
|
+
setAt: external_exports.number().optional()
|
|
21372
|
+
}).strict();
|
|
21373
|
+
var DeployStateSchema = external_exports.object({
|
|
21374
|
+
personaId: external_exports.string().min(1),
|
|
21375
|
+
repo: DeployRepoSchema.optional(),
|
|
21376
|
+
file: DeployFileSchema.optional(),
|
|
21377
|
+
scan: DeployScanSchema.optional(),
|
|
21378
|
+
/** 没仓库时缺席(查不了) */
|
|
21379
|
+
secrets: external_exports.array(DeploySecretPresenceSchema).optional(),
|
|
21388
21380
|
/**
|
|
21389
|
-
*
|
|
21390
|
-
*
|
|
21391
|
-
* 记它是为了回答一个只有它答得了的问题:「这张单据是不是用还不知道某个资产的扫描器扫的」。
|
|
21392
|
-
* 没有它就只能拿「当前资产表 ⊄ 单据的 assets」当判据——而一个 persona 本来就可能真的用不到
|
|
21393
|
-
* 某个资产,那会变成对每张单据的常态唠叨。
|
|
21394
|
-
*
|
|
21395
|
-
* 缺席 = M1b 及以前扫的老单据(那时候扫描器只被告知了 deploy-kit 一条)。
|
|
21396
|
-
*/
|
|
21397
|
-
scannedAssets: external_exports.array(external_exports.string()).optional(),
|
|
21398
|
-
/**
|
|
21399
|
-
* 每条凭据的履约选择:secret name → 'deployer' | 'user'。
|
|
21400
|
-
* **只记「谁出」,不记值。** 没做选择的凭据不在这个 map 里(缺席即未定),
|
|
21401
|
-
* 用缺席而不是 'unset' 枚举值表达未定,省掉一个下游要处处判的第三态。
|
|
21402
|
-
*/
|
|
21403
|
-
fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({}),
|
|
21404
|
-
/** 试装失败时的缺口清单;成功或没试装过是空数组 */
|
|
21405
|
-
gaps: external_exports.array(DeployGapSchema).default([]),
|
|
21406
|
-
/** 试装跑到第几轮了(每次 deploy:trial +1,上限 TRIAL_ROUND_MAX)。重扫清零 */
|
|
21407
|
-
trialRound: external_exports.number().default(0),
|
|
21408
|
-
/**
|
|
21409
|
-
* 试装当前在哪一步的一句人话(「在构镜像」「冒烟任务跑起来了」)。
|
|
21410
|
-
* 单据页要的是「到哪一步了」,不是逐 token 的过程——过程在 gateway 的任务台账里。
|
|
21411
|
-
*/
|
|
21412
|
-
trialStage: external_exports.string().optional(),
|
|
21413
|
-
/**
|
|
21414
|
-
* 上一次试装通过的时刻。**deploy:deploy 的前置**——没试装过不让部署,那正是试装存在的理由。
|
|
21415
|
-
* 试装通过后单据回 `ready` 而不是直接 `deployed`:试装的产物是一个用完即弃的镜像,
|
|
21416
|
-
* 部署的产物是一个别人能派活的服务,中间那次决定得留给人。
|
|
21381
|
+
* `.clawd/deploy.json` 读不出来(人手改坏了)时的人话。有它就没有 `file`。
|
|
21382
|
+
* 页面据此给一条能走的路(重新扫描会整份重写),而不是白屏。
|
|
21417
21383
|
*/
|
|
21418
|
-
|
|
21419
|
-
/** 试装通过的那个镜像 tag;deploy:deploy 登记的就是它,不重新构一遍 */
|
|
21420
|
-
trialImage: external_exports.string().optional(),
|
|
21421
|
-
/** 部署落点(status 是 deployed 才有) */
|
|
21422
|
-
placement: DeployPlacementSchema.optional(),
|
|
21423
|
-
// 扫描 / 试装失败的原因(status 是 scanFailed / failed 时才有意义)
|
|
21424
|
-
error: external_exports.string().optional(),
|
|
21425
|
-
createdAt: external_exports.number(),
|
|
21426
|
-
updatedAt: external_exports.number()
|
|
21384
|
+
fileError: external_exports.string().optional()
|
|
21427
21385
|
}).strict();
|
|
21428
|
-
var
|
|
21429
|
-
|
|
21386
|
+
var DeployReleaseResultSchema = external_exports.object({
|
|
21387
|
+
sha: external_exports.string().min(1),
|
|
21388
|
+
actionsUrl: external_exports.string().min(1)
|
|
21430
21389
|
}).strict();
|
|
21431
|
-
var
|
|
21432
|
-
|
|
21390
|
+
var DeployPersonaArgsSchema = external_exports.object({
|
|
21391
|
+
personaId: external_exports.string().min(1)
|
|
21433
21392
|
}).strict();
|
|
21434
21393
|
var DeployPatchArgsSchema = external_exports.object({
|
|
21435
|
-
|
|
21394
|
+
personaId: external_exports.string().min(1),
|
|
21436
21395
|
patch: external_exports.object({
|
|
21437
21396
|
fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).optional(),
|
|
21438
|
-
|
|
21439
|
-
// 人工补依赖(试装失败后补 python3 这种);整份替换 manifest
|
|
21397
|
+
// 人工补依赖;整份替换 manifest
|
|
21440
21398
|
manifest: EnvironmentManifestSchema.optional()
|
|
21441
21399
|
}).strict()
|
|
21442
21400
|
}).strict();
|
|
21443
21401
|
var DeployPutSecretArgsSchema = external_exports.object({
|
|
21444
|
-
|
|
21402
|
+
personaId: external_exports.string().min(1),
|
|
21445
21403
|
// 对应 manifest.secrets[].name
|
|
21446
21404
|
name: external_exports.string().min(1),
|
|
21447
21405
|
// 环境变量名 → 值。key 必须是该 secret 声明过的 env 之一,handler 校验。
|
|
21448
21406
|
values: external_exports.record(external_exports.string(), external_exports.string())
|
|
21449
21407
|
}).strict();
|
|
21450
21408
|
var DeployReportFindingArgsSchema = external_exports.object({
|
|
21451
|
-
|
|
21409
|
+
personaId: external_exports.string().min(1),
|
|
21452
21410
|
kind: external_exports.enum(["cli", "secret", "asset"]),
|
|
21453
21411
|
// 该条目在 manifest 对应数组里的内容(形状随 kind 变,handler 按 kind 收窄校验)
|
|
21454
21412
|
item: external_exports.record(external_exports.string(), external_exports.unknown()),
|
|
@@ -21460,23 +21418,9 @@ var DeployReportFindingArgsSchema = external_exports.object({
|
|
|
21460
21418
|
})
|
|
21461
21419
|
}).strict();
|
|
21462
21420
|
var DeployFinishScanArgsSchema = external_exports.object({
|
|
21463
|
-
|
|
21464
|
-
smokeTask: external_exports.string().min(1),
|
|
21421
|
+
personaId: external_exports.string().min(1),
|
|
21465
21422
|
notes: external_exports.array(external_exports.string()).default([])
|
|
21466
21423
|
}).strict();
|
|
21467
|
-
var DeploySecretStatusSchema = external_exports.object({
|
|
21468
|
-
name: external_exports.string(),
|
|
21469
|
-
// 该 secret 声明的 env 里已有值的个数
|
|
21470
|
-
filled: external_exports.number(),
|
|
21471
|
-
total: external_exports.number()
|
|
21472
|
-
}).strict();
|
|
21473
|
-
var DeployReceiptViewSchema = external_exports.object({
|
|
21474
|
-
receipt: DeployReceiptSchema,
|
|
21475
|
-
secretStatus: external_exports.array(DeploySecretStatusSchema)
|
|
21476
|
-
}).strict();
|
|
21477
|
-
var DeployListResultSchema = external_exports.object({
|
|
21478
|
-
receipts: external_exports.array(DeployReceiptSchema)
|
|
21479
|
-
}).strict();
|
|
21480
21424
|
|
|
21481
21425
|
// ../protocol/src/contact-remote-access.ts
|
|
21482
21426
|
var ContactSetRemoteAccessArgsSchema = external_exports.object({
|
|
@@ -23930,49 +23874,34 @@ var METHOD_DOCS = {
|
|
|
23930
23874
|
summary: "\u8BFB\u6587\u4EF6\u5185\u5BB9\uFF1Bguest \u8DEF\u5F84\u8FB9\u754C\u4E0E workspace:list \u540C",
|
|
23931
23875
|
args: WorkspaceReadArgs
|
|
23932
23876
|
},
|
|
23877
|
+
// ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
|
|
23933
23878
|
"deploy:start": {
|
|
23934
|
-
summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21
|
|
23935
|
-
args:
|
|
23936
|
-
},
|
|
23937
|
-
"deploy:rescan": {
|
|
23938
|
-
summary: "\u5C31\u5730\u91CD\u626B\u4E00\u5F20\u5DF2\u6709\u7684\u90E8\u7F72\u5355\uFF1A\u6E05\u6389\u4E0A\u6B21\u626B\u51FA\u6765\u7684\u6E05\u5355 / \u8BC1\u636E / \u5B58\u7591\u9879\uFF0C\u72B6\u6001\u56DE scanning\uFF0C\u8D77\u4E00\u4E2A\u65B0\u7684\u626B\u63CF\u4F1A\u8BDD\u3002**\u5DF2\u586B\u7684\u51ED\u636E\u503C\u548C\u5C65\u7EA6\u9009\u62E9\u539F\u6837\u4FDD\u7559**\uFF08\u5B83\u4EEC\u6309\u5355\u636E id \u5B58\uFF0C\u4E0D\u968F\u626B\u63CF\u7ED3\u679C\u8D70\uFF09\uFF0C\u6240\u4EE5\u91CD\u626B\u4E0D\u4F1A\u8BA9\u4EBA\u767D\u586B\u4E00\u904D\uFF1Bowner-only",
|
|
23939
|
-
args: DeployIdArgsSchema
|
|
23940
|
-
},
|
|
23941
|
-
"deploy:list": {
|
|
23942
|
-
summary: "\u5217\u51FA\u5168\u90E8\u90E8\u7F72\u5355\uFF08\u65B0\u7684\u5728\u524D\uFF09\uFF1Bowner-only\u3002\u65E0\u53C2\u6570",
|
|
23943
|
-
args: NO_ARGS
|
|
23879
|
+
summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08gh repo create\uFF0C\u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\u3001\u63A8\u9996\u4E2A\u63D0\u4EA4\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u6E05\u5355 + \u5C65\u7EA6\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u3001\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\uFF1Bowner-only",
|
|
23880
|
+
args: DeployPersonaArgsSchema
|
|
23944
23881
|
},
|
|
23945
23882
|
"deploy:get": {
|
|
23946
|
-
summary: "\
|
|
23947
|
-
args:
|
|
23883
|
+
summary: "\u4E0A\u4E91\u9875\u9762\u8981\u7684\u5168\u90E8\uFF1A\u4ED3\u5E93\u7ED1\u5B9A\u72B6\u6001\uFF08git \u73B0\u7B97\uFF09\u3001\u90E8\u7F72\u6587\u4EF6\u3001\u626B\u63CF\u8BB0\u5F55\u3001\u4ED3\u5E93 Secrets \u91CC\u5404\u53D8\u91CF\u540D\u586B\u8FC7\u6CA1\u6709\uFF08**\u53EA\u6709\u540D\u5B57\u548C\u65F6\u95F4\uFF0C\u6CA1\u6709\u503C**\uFF09\uFF1Bowner-only",
|
|
23884
|
+
args: DeployPersonaArgsSchema
|
|
23948
23885
|
},
|
|
23949
23886
|
"deploy:patch": {
|
|
23950
|
-
summary: "\u7F16\u8F91\u90E8\u7F72\
|
|
23887
|
+
summary: "\u7F16\u8F91\u90E8\u7F72\u6587\u4EF6\uFF1A\u9009\u5C65\u7EA6\uFF08\u8C01\u51FA\u8FD9\u6761\u51ED\u636E\uFF09/ \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",
|
|
23951
23888
|
args: DeployPatchArgsSchema
|
|
23952
23889
|
},
|
|
23953
23890
|
"deploy:putSecret": {
|
|
23954
|
-
summary: "\
|
|
23891
|
+
summary: "\u628A\u4E00\u6761\u51ED\u636E\u7684\u503C\u5199\u8FDB\u4ED3\u5E93\u7684 GitHub Secrets\uFF08gh secret set\uFF0C\u503C\u8D70 stdin\uFF09\u3002**\u8FD9\u662F\u503C\u552F\u4E00\u7684\u5165\u53E3**\uFF1A\u5165\u53C2\u4E0D\u8FDB\u65E5\u5FD7\u3001\u54CD\u5E94\u4E0D\u56DE\u663E\u503C\u3001\u672C\u673A\u4E0D\u843D\u76D8\u3002env \u540D\u5FC5\u987B\u662F\u8BE5\u51ED\u636E\u5728\u6E05\u5355\u91CC\u58F0\u660E\u8FC7\u7684\uFF1Bowner-only",
|
|
23955
23892
|
args: DeployPutSecretArgsSchema
|
|
23956
23893
|
},
|
|
23957
23894
|
"deploy:reportFinding": {
|
|
23958
|
-
summary: "\u626B\u63CF\u4E2D\u7684 butler \u9010\u6761\u4E0A\u62A5\u4E00\u4E2A\u53D1\u73B0\uFF08cli / secret / asset\uFF09\u3002**\u8FB9\u626B\u8FB9\u62A5**\uFF0C\
|
|
23895
|
+
summary: "\u626B\u63CF\u4E2D\u7684 butler \u9010\u6761\u4E0A\u62A5\u4E00\u4E2A\u53D1\u73B0\uFF08cli / secret / asset\uFF09\u3002**\u8FB9\u626B\u8FB9\u62A5**\uFF0C\u9875\u9762\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",
|
|
23959
23896
|
args: DeployReportFindingArgsSchema
|
|
23960
23897
|
},
|
|
23961
23898
|
"deploy:finishScan": {
|
|
23962
|
-
summary: "butler \u6536\u5C3E\uFF1A\u7ED9\u51FA\
|
|
23899
|
+
summary: "butler \u6536\u5C3E\uFF1A\u7ED9\u51FA\u5B58\u7591\u9879\uFF0C\u626B\u63CF\u8BB0\u5F55\u4ECE scanning \u8F6C done\u3002\u6CA1\u8C03\u5230\u5B83\u5C31\u7B49\u4E8E\u6CA1\u626B\u5B8C\u2014\u2014butler \u4F1A\u8BDD\u7ED3\u675F\u65F6\u8BB0\u5F55\u8FD8\u505C\u5728 scanning\uFF0Cdaemon \u636E\u6B64\u5224 failed\uFF1Bowner-only",
|
|
23963
23900
|
args: DeployFinishScanArgsSchema
|
|
23964
23901
|
},
|
|
23965
|
-
"deploy:
|
|
23966
|
-
summary: "\
|
|
23967
|
-
args:
|
|
23968
|
-
},
|
|
23969
|
-
"deploy:deploy": {
|
|
23970
|
-
summary: "\u628A\u8BD5\u88C5\u901A\u8FC7\u7684\u90A3\u4E2A\u955C\u50CF\u5728 gateway \u767B\u8BB0\u4E3A**\u6B63\u5F0F**\u90E8\u7F72\uFF1A\u4E4B\u540E\u522B\u4EBA\u7684 clawd \u6D3E\u6D3B\u7ED9\u8FD9\u4E2A\u670D\u52A1\u8BBE\u5907\uFF0C\u8D77\u7684\u5C31\u662F\u5B83\u3002\u524D\u7F6E\u662F\u8BD5\u88C5\u901A\u8FC7\u8FC7\uFF08\u6CA1\u9A8C\u8FC7\u4E0D\u8BA9\u53D1\uFF0C\u90A3\u6B63\u662F\u8BD5\u88C5\u5B58\u5728\u7684\u7406\u7531\uFF09\u3002\u56DE\u6765\u7684\u5355\u636E\u5E26 placement\u2014\u2014\u4E91\u4E0A\u5730\u5740 / \u670D\u52A1\u8BBE\u5907 id / \u8C01\u53EF\u8C03\u7528 / \u4F7F\u7528\u8005\u9700\u81EA\u5E26\u54EA\u4E9B\u51ED\u636E\uFF1Bowner-only",
|
|
23971
|
-
args: DeployIdArgsSchema
|
|
23972
|
-
},
|
|
23973
|
-
"deploy:remove": {
|
|
23974
|
-
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",
|
|
23975
|
-
args: DeployIdArgsSchema
|
|
23902
|
+
"deploy:release": {
|
|
23903
|
+
summary: "\u53D1\u5E03 = \u63D0\u4EA4\u5E76\u63A8\u9001\u5230\u4ED3\u5E93\uFF1A\u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\u3002\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u5728\u96C6\u7FA4\u4E0A\u771F\u8D77\u4E00\u6B21\u3001\u767B\u8BB0\u6210\u6B63\u5F0F\uFF0C\u8FDB\u5EA6\u5728 GitHub Actions \u770B\u3002\u524D\u7F6E\uFF1A\u5DF2\u7ED1\u5B9A\u4ED3\u5E93\u3001\u6709\u6E05\u5355\u3001\u6BCF\u6761\u51ED\u636E\u90FD\u5B9A\u4E86\u5C65\u7EA6\u3001\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
|
|
23904
|
+
args: DeployPersonaArgsSchema
|
|
23976
23905
|
},
|
|
23977
23906
|
"shift:list": {
|
|
23978
23907
|
summary: "\u5217\u51FA owner \u7684\u5168\u90E8 shift\uFF08\u6392\u73ED\uFF09\uFF0C\u7ED9 UI \u65E5\u5386\u6E32\u67D3\u7528\uFF1Bowner-only",
|
package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scan-persona-for-deploy
|
|
3
|
-
description: 老板要把某个 persona 发布到云上时触发——把这个 persona
|
|
3
|
+
description: 老板要把某个 persona 发布到云上时触发——把这个 persona 读一遍,弄清它挪到一台干净的云上机器要预备什么(命令行工具、凭据、随行资产),边查边填进它的部署文件。收到形如「扫描 persona-xxx 的部署环境,personaId=persona-xxx」的任务时使用。只负责扫,不负责部署。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 扫 persona 的上云环境
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
老板在界面上点了「发布到云上」,现在这个 persona 的部署文件(`.clawd/deploy.json`,会随 persona
|
|
9
|
+
一起进 git 仓库)还是空的,等着你填。**页面是随你干活一点点长出来的**——他正看着,你查明白一条
|
|
10
|
+
就报一条,别攒到最后一次性倒出来。
|
|
10
11
|
|
|
11
12
|
## 你要回答的问题
|
|
12
13
|
|
|
@@ -33,7 +34,7 @@ description: 老板要把某个 persona 发布到云上时触发——把这个
|
|
|
33
34
|
|
|
34
35
|
```
|
|
35
36
|
call({ method: "deploy:reportFinding", args: {
|
|
36
|
-
|
|
37
|
+
personaId: "<任务里给的>",
|
|
37
38
|
kind: "cli" | "secret" | "asset",
|
|
38
39
|
item: { ... }, // 见下面各类的字段
|
|
39
40
|
evidence: { reason: "...", file: "...", quote: "..." }
|
|
@@ -80,7 +81,7 @@ call({ method: "deploy:reportFinding", args: {
|
|
|
80
81
|
|
|
81
82
|
- 一份凭据含多个字段就把多个环境变量都列进 `env`(AK 是 id+secret 两个,supabase 是四个)
|
|
82
83
|
- **绝对不要把凭据的值写进来**,哪怕你在文件里看到了明文的 key。你只报告「这里需要一份
|
|
83
|
-
supabase
|
|
84
|
+
supabase 凭据」,值由老板另外填进仓库的 GitHub Secrets。看到明文 key 也不要复述它的内容。
|
|
84
85
|
- **不要判断这条凭据该谁出**(部署者出还是使用者自带)。那是老板的决定,不是你能扫出来的。
|
|
85
86
|
|
|
86
87
|
### kind: "asset" —— persona 目录之外的共享资产
|
|
@@ -116,7 +117,7 @@ call({ method: "deploy:reportFinding", args: {
|
|
|
116
117
|
差:SUPABASE_KEY=eyJhbGciOiJIUzI1NiIs...
|
|
117
118
|
```
|
|
118
119
|
|
|
119
|
-
|
|
120
|
+
值一旦进了部署文件,就会跟着它进 git 仓库、进 UI、进日志、将来进模型上下文。左边的键名和这行在哪个文件,
|
|
120
121
|
已经足够老板核对了,右边的值对他没有任何用处。
|
|
121
122
|
|
|
122
123
|
## 收尾
|
|
@@ -125,29 +126,21 @@ call({ method: "deploy:reportFinding", args: {
|
|
|
125
126
|
|
|
126
127
|
```
|
|
127
128
|
call({ method: "deploy:finishScan", args: {
|
|
128
|
-
|
|
129
|
-
smokeTask: "...",
|
|
129
|
+
personaId: "<任务里给的>",
|
|
130
130
|
notes: ["...", "..."]
|
|
131
131
|
}})
|
|
132
132
|
```
|
|
133
133
|
|
|
134
|
-
**`smokeTask`** —— 一句冒烟任务。这个 persona 上云后会被真跑一遍来验证环境装全了:
|
|
135
|
-
|
|
136
|
-
- 覆盖它的**主线活**(读完人格你该知道它主要干什么)
|
|
137
|
-
- 尽量把你列的依赖都用上——用不到的依赖,试装也验不出来
|
|
138
|
-
- 规模最小:能跑通就行,别让它干半小时
|
|
139
|
-
- 用祈使句,就像老板会怎么吩咐它
|
|
140
|
-
|
|
141
134
|
**`notes`** —— 需要老板判断的事。例如「这个 skill 要求浏览器登录,云上大概率不可用」、
|
|
142
135
|
「这里引用的服务是裸 IP,可能受出网策略影响」、「某个工具三层都查了还是没找到装法,卡在 X」。
|
|
143
136
|
没有就空数组。
|
|
144
137
|
|
|
145
|
-
调完 `finishScan`
|
|
138
|
+
调完 `finishScan` 页面就从「分析中」转成可编辑的清单,你的活就结束了。
|
|
146
139
|
|
|
147
140
|
## 纪律
|
|
148
141
|
|
|
149
142
|
- **只读不写**:不要修改被扫 persona 目录里的任何文件,不要执行它的脚本。
|
|
150
|
-
- **宁缺毋滥**:拿不准的放进 `notes
|
|
151
|
-
|
|
152
|
-
- **没调 `finishScan` 就等于没扫完**——中途卡住也要调,把卡在哪写进 `notes
|
|
143
|
+
- **宁缺毋滥**:拿不准的放进 `notes`,不要编一条依赖进清单。多报一条假依赖会让镜像装一堆没用的
|
|
144
|
+
东西;漏报一条真依赖,上云后用起来会发现,补一行再发一次就行。
|
|
145
|
+
- **没调 `finishScan` 就等于没扫完**——中途卡住也要调,把卡在哪写进 `notes`,别让页面一直停在
|
|
153
146
|
「分析中」。
|