@clawos-dev/clawd 0.2.473 → 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.
@@ -21345,117 +21345,75 @@ var EnvEvidenceSchema = external_exports.object({
21345
21345
 
21346
21346
  // ../protocol/src/deploy-schemas.ts
21347
21347
  var FulfillmentSchema = external_exports.enum(["deployer", "user"]);
21348
- var DeployStatusSchema = external_exports.enum([
21349
- "scanning",
21350
- "scanFailed",
21351
- "draft",
21352
- "ready",
21353
- "trialing",
21354
- "failed",
21355
- "deployed"
21356
- ]);
21357
- var DeployGapSchema = external_exports.object({
21358
- // agent 的自然语言错因,如「我要解析 aliyun 的 JSON 输出,但容器里没有 python3」
21359
- errorText: external_exports.string().min(1),
21360
- // 原始输出片段,给人自己判断用
21361
- raw: external_exports.string().optional(),
21362
- // 建议补的依赖:`cli:python3` 这种。拿不准就不给,让人自己决定。
21363
- suggest: external_exports.string().optional()
21364
- }).strict();
21365
- var DeployPlacementSchema = external_exports.object({
21366
- /** gateway 的公网地址(入口 A 直接 POST 它;入口 B 由设备目录下发 ws 地址) */
21367
- gatewayUrl: external_exports.string().min(1),
21368
- /** 服务设备 id:别人的 clawd 用 `device:connect { deviceId }` 就能连上,本机侧零改动 */
21369
- serviceDeviceId: external_exports.string().min(1),
21370
- /** 这次登记为正式的镜像 tag(= 试装通过的那个) */
21371
- image: external_exports.string().min(1),
21372
- /** 使用者自带的凭据名字(= 单据里 fulfillment 选了 'user' 的那些)。**只有名字** */
21373
- userSecrets: external_exports.array(external_exports.string()).default([]),
21374
- /** 是否进公共设备目录。false = 只有拿到 deviceId 的人连得上 */
21375
- publicDirectory: external_exports.boolean(),
21376
- deployedAt: external_exports.number()
21348
+ var DeployFileSchema = external_exports.object({
21349
+ version: external_exports.literal(1),
21350
+ manifest: EnvironmentManifestSchema,
21351
+ /** secret name → 谁提供。缺席 = 还没定 */
21352
+ fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({})
21377
21353
  }).strict();
21378
- var DeployReceiptSchema = external_exports.object({
21379
- deployId: external_exports.string().min(1),
21380
- personaId: external_exports.string().min(1),
21381
- status: DeployStatusSchema,
21382
- /**
21383
- * 干这次扫描的 butler 会话 id。单据上「看它怎么干的」入口靠它把工作过程调出来。
21384
- *
21385
- * 扫描不是 daemon 里一个闷头跑的黑盒进程,是 persona-butler 的一次真实会话——用户能翻
21386
- * 看它读了哪些文件、搜了什么。这条也顺带解决「它到底有没有上网查」这类问题:不用另造
21387
- * 探针去抓证据,看一眼就知道。
21388
- */
21354
+ var DeployScanStatusSchema = external_exports.enum(["scanning", "done", "failed"]);
21355
+ var DeployScanSchema = external_exports.object({
21356
+ /** 干这次扫描的 butler 会话,「看它怎么干的」入口 */
21389
21357
  scanSessionId: external_exports.string().optional(),
21390
- // 扫描产物;scanning / scanFailed 时还没有
21391
- manifest: EnvironmentManifestSchema.optional(),
21392
- evidence: external_exports.array(EnvEvidenceSchema).optional(),
21393
- smokeTask: external_exports.string().optional(),
21358
+ status: DeployScanStatusSchema,
21359
+ evidence: external_exports.array(EnvEvidenceSchema).default([]),
21394
21360
  notes: external_exports.array(external_exports.string()).default([]),
21361
+ /** 扫描时被告知的共享资产名单(判「扫描器后来长了新本事」用) */
21362
+ scannedAssets: external_exports.array(external_exports.string()).default([]),
21363
+ startedAt: external_exports.number(),
21364
+ finishedAt: external_exports.number().optional(),
21365
+ error: external_exports.string().optional()
21366
+ }).strict();
21367
+ var DeployRepoSchema = external_exports.object({
21368
+ url: external_exports.string().min(1),
21369
+ branch: external_exports.string().min(1),
21370
+ head: external_exports.string().min(1),
21371
+ /** 工作区有没有未提交的改动 */
21372
+ dirty: external_exports.boolean(),
21373
+ /** 本地领先远端几个提交 */
21374
+ ahead: external_exports.number()
21375
+ }).strict();
21376
+ var DeploySecretPresenceSchema = external_exports.object({
21377
+ env: external_exports.string().min(1),
21378
+ setAt: external_exports.number().optional()
21379
+ }).strict();
21380
+ var DeployStateSchema = external_exports.object({
21381
+ personaId: external_exports.string().min(1),
21382
+ repo: DeployRepoSchema.optional(),
21383
+ file: DeployFileSchema.optional(),
21384
+ scan: DeployScanSchema.optional(),
21385
+ /** 没仓库时缺席(查不了) */
21386
+ secrets: external_exports.array(DeploySecretPresenceSchema).optional(),
21395
21387
  /**
21396
- * 这次扫描**被告知有哪些共享资产**(daemon 的 `SCANNABLE_ASSETS` 在 finishScan 那一刻的名单)。
21397
- *
21398
- * 记它是为了回答一个只有它答得了的问题:「这张单据是不是用还不知道某个资产的扫描器扫的」。
21399
- * 没有它就只能拿「当前资产表 ⊄ 单据的 assets」当判据——而一个 persona 本来就可能真的用不到
21400
- * 某个资产,那会变成对每张单据的常态唠叨。
21401
- *
21402
- * 缺席 = M1b 及以前扫的老单据(那时候扫描器只被告知了 deploy-kit 一条)。
21403
- */
21404
- scannedAssets: external_exports.array(external_exports.string()).optional(),
21405
- /**
21406
- * 每条凭据的履约选择:secret name → 'deployer' | 'user'。
21407
- * **只记「谁出」,不记值。** 没做选择的凭据不在这个 map 里(缺席即未定),
21408
- * 用缺席而不是 'unset' 枚举值表达未定,省掉一个下游要处处判的第三态。
21409
- */
21410
- fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).default({}),
21411
- /** 试装失败时的缺口清单;成功或没试装过是空数组 */
21412
- gaps: external_exports.array(DeployGapSchema).default([]),
21413
- /** 试装跑到第几轮了(每次 deploy:trial +1,上限 TRIAL_ROUND_MAX)。重扫清零 */
21414
- trialRound: external_exports.number().default(0),
21415
- /**
21416
- * 试装当前在哪一步的一句人话(「在构镜像」「冒烟任务跑起来了」)。
21417
- * 单据页要的是「到哪一步了」,不是逐 token 的过程——过程在 gateway 的任务台账里。
21418
- */
21419
- trialStage: external_exports.string().optional(),
21420
- /**
21421
- * 上一次试装通过的时刻。**deploy:deploy 的前置**——没试装过不让部署,那正是试装存在的理由。
21422
- * 试装通过后单据回 `ready` 而不是直接 `deployed`:试装的产物是一个用完即弃的镜像,
21423
- * 部署的产物是一个别人能派活的服务,中间那次决定得留给人。
21388
+ * `.clawd/deploy.json` 读不出来(人手改坏了)时的人话。有它就没有 `file`。
21389
+ * 页面据此给一条能走的路(重新扫描会整份重写),而不是白屏。
21424
21390
  */
21425
- trialPassedAt: external_exports.number().optional(),
21426
- /** 试装通过的那个镜像 tag;deploy:deploy 登记的就是它,不重新构一遍 */
21427
- trialImage: external_exports.string().optional(),
21428
- /** 部署落点(status 是 deployed 才有) */
21429
- placement: DeployPlacementSchema.optional(),
21430
- // 扫描 / 试装失败的原因(status 是 scanFailed / failed 时才有意义)
21431
- error: external_exports.string().optional(),
21432
- createdAt: external_exports.number(),
21433
- updatedAt: external_exports.number()
21391
+ fileError: external_exports.string().optional()
21434
21392
  }).strict();
21435
- var DeployStartArgsSchema = external_exports.object({
21436
- personaId: external_exports.string().min(1)
21393
+ var DeployReleaseResultSchema = external_exports.object({
21394
+ sha: external_exports.string().min(1),
21395
+ actionsUrl: external_exports.string().min(1)
21437
21396
  }).strict();
21438
- var DeployIdArgsSchema = external_exports.object({
21439
- deployId: external_exports.string().min(1)
21397
+ var DeployPersonaArgsSchema = external_exports.object({
21398
+ personaId: external_exports.string().min(1)
21440
21399
  }).strict();
21441
21400
  var DeployPatchArgsSchema = external_exports.object({
21442
- deployId: external_exports.string().min(1),
21401
+ personaId: external_exports.string().min(1),
21443
21402
  patch: external_exports.object({
21444
21403
  fulfillment: external_exports.record(external_exports.string(), FulfillmentSchema).optional(),
21445
- smokeTask: external_exports.string().min(1).optional(),
21446
- // 人工补依赖(试装失败后补 python3 这种);整份替换 manifest
21404
+ // 人工补依赖;整份替换 manifest
21447
21405
  manifest: EnvironmentManifestSchema.optional()
21448
21406
  }).strict()
21449
21407
  }).strict();
21450
21408
  var DeployPutSecretArgsSchema = external_exports.object({
21451
- deployId: external_exports.string().min(1),
21409
+ personaId: external_exports.string().min(1),
21452
21410
  // 对应 manifest.secrets[].name
21453
21411
  name: external_exports.string().min(1),
21454
21412
  // 环境变量名 → 值。key 必须是该 secret 声明过的 env 之一,handler 校验。
21455
21413
  values: external_exports.record(external_exports.string(), external_exports.string())
21456
21414
  }).strict();
21457
21415
  var DeployReportFindingArgsSchema = external_exports.object({
21458
- deployId: external_exports.string().min(1),
21416
+ personaId: external_exports.string().min(1),
21459
21417
  kind: external_exports.enum(["cli", "secret", "asset"]),
21460
21418
  // 该条目在 manifest 对应数组里的内容(形状随 kind 变,handler 按 kind 收窄校验)
21461
21419
  item: external_exports.record(external_exports.string(), external_exports.unknown()),
@@ -21467,23 +21425,9 @@ var DeployReportFindingArgsSchema = external_exports.object({
21467
21425
  })
21468
21426
  }).strict();
21469
21427
  var DeployFinishScanArgsSchema = external_exports.object({
21470
- deployId: external_exports.string().min(1),
21471
- smokeTask: external_exports.string().min(1),
21428
+ personaId: external_exports.string().min(1),
21472
21429
  notes: external_exports.array(external_exports.string()).default([])
21473
21430
  }).strict();
21474
- var DeploySecretStatusSchema = external_exports.object({
21475
- name: external_exports.string(),
21476
- // 该 secret 声明的 env 里已有值的个数
21477
- filled: external_exports.number(),
21478
- total: external_exports.number()
21479
- }).strict();
21480
- var DeployReceiptViewSchema = external_exports.object({
21481
- receipt: DeployReceiptSchema,
21482
- secretStatus: external_exports.array(DeploySecretStatusSchema)
21483
- }).strict();
21484
- var DeployListResultSchema = external_exports.object({
21485
- receipts: external_exports.array(DeployReceiptSchema)
21486
- }).strict();
21487
21431
 
21488
21432
  // ../protocol/src/contact-remote-access.ts
21489
21433
  var ContactSetRemoteAccessArgsSchema = external_exports.object({
@@ -23938,49 +23882,34 @@ var METHOD_DOCS = {
23938
23882
  summary: "\u8BFB\u6587\u4EF6\u5185\u5BB9\uFF1Bguest \u8DEF\u5F84\u8FB9\u754C\u4E0E workspace:list \u540C",
23939
23883
  args: WorkspaceReadArgs
23940
23884
  },
23885
+ // ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
23941
23886
  "deploy:start": {
23942
- 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",
23943
- args: DeployStartArgsSchema
23944
- },
23945
- "deploy:rescan": {
23946
- 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",
23947
- args: DeployIdArgsSchema
23948
- },
23949
- "deploy:list": {
23950
- summary: "\u5217\u51FA\u5168\u90E8\u90E8\u7F72\u5355\uFF08\u65B0\u7684\u5728\u524D\uFF09\uFF1Bowner-only\u3002\u65E0\u53C2\u6570",
23951
- args: NO_ARGS
23887
+ 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",
23888
+ args: DeployPersonaArgsSchema
23952
23889
  },
23953
23890
  "deploy:get": {
23954
- 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",
23955
- args: DeployIdArgsSchema
23891
+ 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",
23892
+ args: DeployPersonaArgsSchema
23956
23893
  },
23957
23894
  "deploy:patch": {
23958
- 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",
23895
+ 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",
23959
23896
  args: DeployPatchArgsSchema
23960
23897
  },
23961
23898
  "deploy:putSecret": {
23962
- 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",
23899
+ 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",
23963
23900
  args: DeployPutSecretArgsSchema
23964
23901
  },
23965
23902
  "deploy:reportFinding": {
23966
- 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",
23903
+ 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",
23967
23904
  args: DeployReportFindingArgsSchema
23968
23905
  },
23969
23906
  "deploy:finishScan": {
23970
- 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",
23907
+ 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",
23971
23908
  args: DeployFinishScanArgsSchema
23972
23909
  },
23973
- "deploy:trial": {
23974
- 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",
23975
- args: DeployIdArgsSchema
23976
- },
23977
- "deploy:deploy": {
23978
- 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",
23979
- args: DeployIdArgsSchema
23980
- },
23981
- "deploy:remove": {
23982
- 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",
23983
- args: DeployIdArgsSchema
23910
+ "deploy:release": {
23911
+ 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",
23912
+ args: DeployPersonaArgsSchema
23984
23913
  },
23985
23914
  "shift:list": {
23986
23915
  summary: "\u5217\u51FA owner \u7684\u5168\u90E8 shift\uFF08\u6392\u73ED\uFF09\uFF0C\u7ED9 UI \u65E5\u5386\u6E32\u67D3\u7528\uFF1Bowner-only",