@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.
@@ -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 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 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 DeployReceiptSchema = external_exports.object({
21372
- deployId: external_exports.string().min(1),
21373
- personaId: external_exports.string().min(1),
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
- // 扫描产物;scanning / scanFailed 时还没有
21384
- manifest: EnvironmentManifestSchema.optional(),
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
- * 这次扫描**被告知有哪些共享资产**(daemon 的 `SCANNABLE_ASSETS` 在 finishScan 那一刻的名单)。
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
- trialPassedAt: external_exports.number().optional(),
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 DeployStartArgsSchema = external_exports.object({
21429
- personaId: external_exports.string().min(1)
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 DeployIdArgsSchema = external_exports.object({
21432
- deployId: external_exports.string().min(1)
21390
+ var DeployPersonaArgsSchema = external_exports.object({
21391
+ personaId: external_exports.string().min(1)
21433
21392
  }).strict();
21434
21393
  var DeployPatchArgsSchema = external_exports.object({
21435
- deployId: external_exports.string().min(1),
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
- smokeTask: external_exports.string().min(1).optional(),
21439
- // 人工补依赖(试装失败后补 python3 这种);整份替换 manifest
21397
+ // 人工补依赖;整份替换 manifest
21440
21398
  manifest: EnvironmentManifestSchema.optional()
21441
21399
  }).strict()
21442
21400
  }).strict();
21443
21401
  var DeployPutSecretArgsSchema = external_exports.object({
21444
- deployId: external_exports.string().min(1),
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
- deployId: external_exports.string().min(1),
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
- deployId: external_exports.string().min(1),
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**\u65B0\u7684**\u4E0A\u4E91\u626B\u63CF\uFF1A\u5EFA\u4E00\u5F20\u65B0\u5355\u636E\u5E76\u5F02\u6B65\u626B\uFF08\u4EBA\u4F1A\u70B9\u8FD9\u4E2A\u53EA\u53EF\u80FD\u662F\u56E0\u4E3A persona \u8FED\u4EE3\u4E86\uFF0C\u62FF\u65E7\u6E05\u5355\u53BB\u90E8\u7F72\u662F\u9519\u7684\uFF09\u3002**\u5DF2\u586B\u7684\u51ED\u636E\u503C\u548C\u5C65\u7EA6\u9009\u62E9\u4ECE\u4E0A\u4E00\u5F20\u5355\u7EE7\u627F\u8FC7\u6765**\uFF0C\u4E0D\u7528\u6BCF\u8FED\u4EE3\u4E00\u6B21\u91CD\u8D34\u4E00\u904D key\u3002\u5DF2\u7ECF\u5728\u626B\u7684\u8BDD\u8FD4\u56DE\u90A3\u5F20\u3001\u4E0D\u5E76\u53D1\u8D77\u7B2C\u4E8C\u4E2A\u626B\u63CF\u4F1A\u8BDD\u3002\u56DE\u770B\u65E7\u7684\u90A3\u6B21\u8D70 deploy:list + deploy:get\uFF1Bowner-only",
23935
- args: DeployStartArgsSchema
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: "\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",
23947
- args: DeployIdArgsSchema
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\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",
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: "\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",
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\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",
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\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",
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:trial": {
23966
- summary: "\u8D77\u4E00\u6B21\u8BD5\u88C5\uFF1A**\u4E00\u6B21\u5E26\u81EA\u6BC1\u7684\u771F\u90E8\u7F72**\u2014\u2014\u6309\u5355\u636E\u7684\u6E05\u5355\u6784\u955C\u50CF \u2192 \u63A8\u8FDB k3s \u2192 \u7ECF gateway \u6295\u5582\u5355\u636E\u4E0A\u90A3\u6761\u5192\u70DF\u4EFB\u52A1 \u2192 \u8BA9 persona \u7528\u81EA\u5DF1\u7684\u65B9\u5F0F\u5E72 \u2192 \u8DD1\u5B8C\u8BA9\u5B83\u628A\u5EFA\u51FA\u6765\u7684\u4E1C\u897F\u62C6\u6389\u3002\u524D\u7F6E\u662F `ready`\uFF08\u5C65\u7EA6\u90FD\u9009\u4E86\u3001\u9009\u4E86\u300C\u6211\u6765\u63D0\u4F9B\u300D\u7684\u51ED\u636E\u90FD\u586B\u9F50\u4E86\uFF09\uFF0C\u7F3A\u54EA\u6761\u4F1A\u5728\u9519\u8BEF\u91CC\u70B9\u540D\uFF1B\u8DD1\u51E0\u5341\u5206\u949F\uFF0C\u6240\u4EE5 RPC \u79D2\u56DE `trialing` \u6001\u5355\u636E\uFF0C\u7ED3\u679C\u7531\u540E\u53F0\u56DE\u5199\uFF08UI \u8F6E\u8BE2\uFF09\u3002\u901A\u8FC7 \u2192 \u56DE `ready` \u5E76\u8BB0\u4E0B trialPassedAt\uFF08\u90E8\u7F72\u662F\u4EBA\u7684\u7B2C\u4E8C\u6B21\u51B3\u5B9A\uFF09\uFF1B\u6CA1\u8FC7 \u2192 `failed` + gaps\uFF08agent \u7684\u4EBA\u8BDD\u9519\u56E0\uFF09\uFF0C\u6539\u5B8C\u6E05\u5355\u518D\u8C03\u4E00\u6B21\u5373\u53EF\u3002\u8F6E\u6B21\u6709\u4E0A\u9650\uFF1Bowner-only",
23967
- args: DeployIdArgsSchema
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",
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  name: scan-persona-for-deploy
3
- description: 老板要把某个 persona 发布到云上时触发——把这个 persona 读一遍,弄清它挪到一台干净的云上机器要预备什么(命令行工具、凭据、随行资产),边查边填进部署单据。收到形如「扫描 persona-xxx 的部署环境,deployId=dp-xxxx」的任务时使用。只负责扫,不负责部署。
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
- deployId: "<任务里给的>",
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 凭据」,值由老板另外填进单据。看到明文 key 也不要复述它的内容。
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
- 值一旦进了单据,就会跟着单据进 UI、进日志、将来进模型上下文。左边的键名和这行在哪个文件,
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
- deployId: "<任务里给的>",
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
  「分析中」。