@clawos-dev/clawd 0.2.526 → 0.2.528

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.
@@ -21579,8 +21579,8 @@ var DeployScanSchema = external_exports.object({
21579
21579
  /** 扫描时被告知的共享资产名单(判「扫描器后来长了新本事」用) */
21580
21580
  scannedAssets: external_exports.array(external_exports.string()).default([]),
21581
21581
  /**
21582
- * 这次扫描是**对哪个 commit 的断言**。`deploy:start` 在起扫描之前会先把 persona 目录
21583
- * 提交并推上去,所以这个值一定是仓库里真实存在的一版。
21582
+ * 这次扫描是**对哪个 commit 的断言**。`deploy:release` 在起扫描之前会先把 persona 目录
21583
+ * 提交(只提交不推,推是发布末尾那一下的事),所以这个值一定是仓库里真实存在的一版。
21584
21584
  *
21585
21585
  * 有了它,「清单过没过时」才是个可判定的等式(`head === repo.head`),
21586
21586
  * 而不是从 `dirty` / `ahead` 里猜——那两个字段判不出「清单是好几版之前扫的」。
@@ -21599,8 +21599,8 @@ var DeployScanSchema = external_exports.object({
21599
21599
  */
21600
21600
  releasedHead: external_exports.string().min(1).optional(),
21601
21601
  /**
21602
- * 这次**实际**怎么扫的。是结果不是入参——`deploy:start` 收到的 mode 可能因为没有可比的
21603
- * 基准而退成硬扫,页面要显示的是真正发生的那个。
21602
+ * 这次**实际**怎么扫的。档位由 daemon 定(有线上版本可比 + 有跑完的清单 → 软扫,否则硬扫),
21603
+ * 页面要显示的是真正发生的那个。
21604
21604
  *
21605
21605
  * `.default('hard')` 而不是必填:这个文件是 strict 解析的,存量记录没有这个字段,
21606
21606
  * 定成必填会让 `readScan` 当场抛、上云页面直接打不开。而老记录确实都是从零扫的。
@@ -21675,20 +21675,17 @@ var DeployStateSchema = external_exports.object({
21675
21675
  */
21676
21676
  fileError: external_exports.string().optional()
21677
21677
  }).strict();
21678
- var DeployReleaseResultSchema = external_exports.object({
21679
- sha: external_exports.string().min(1),
21680
- actionsUrl: external_exports.string().min(1)
21681
- }).strict();
21678
+ var DeployReleaseResultSchema = external_exports.discriminatedUnion("outcome", [
21679
+ external_exports.object({
21680
+ outcome: external_exports.literal("pushed"),
21681
+ sha: external_exports.string().min(1),
21682
+ actionsUrl: external_exports.string().min(1)
21683
+ }).strict(),
21684
+ external_exports.object({ outcome: external_exports.literal("scanning") }).strict()
21685
+ ]);
21682
21686
  var DeployPersonaArgsSchema = external_exports.object({
21683
21687
  personaId: external_exports.string().min(1)
21684
21688
  }).strict();
21685
- var DeployStartArgsSchema = DeployPersonaArgsSchema.extend({
21686
- /**
21687
- * 缺省 soft。真正用哪一档由 daemon 定(软扫比不了时会退硬扫),结果看 `DeployScan.baseKind`。
21688
- * 复用上面那个中央定义的字面量,不在这里手抄一份。
21689
- */
21690
- mode: ScanBaseKindSchema.optional()
21691
- }).strict();
21692
21689
  var DeployPatchArgsSchema = external_exports.object({
21693
21690
  personaId: external_exports.string().min(1),
21694
21691
  patch: external_exports.object({
@@ -24063,10 +24060,6 @@ var METHOD_DOCS = {
24063
24060
  args: WorkspaceReadArgs
24064
24061
  },
24065
24062
  // ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
24066
- "deploy:start": {
24067
- summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08GitHub REST \u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\uFF0Cgit \u63A8\u9996\u4E2A\u63D0\u4EA4\uFF1Btoken \u6765\u81EA\u672C\u673A git \u7684\u8EAB\u4EFD\uFF0C\u6CA1\u6388\u6743\u5148\u62D2\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u73AF\u5883\u6E05\u5355\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",
24068
- args: DeployPersonaArgsSchema
24069
- },
24070
24063
  "deploy:get": {
24071
24064
  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",
24072
24065
  args: DeployPersonaArgsSchema
@@ -24088,7 +24081,7 @@ var METHOD_DOCS = {
24088
24081
  args: DeployFinishScanArgsSchema
24089
24082
  },
24090
24083
  "deploy:release": {
24091
- 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\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
24084
+ summary: "\u53D1\u5E03\u2014\u2014\u4E0A\u4E91\u552F\u4E00\u7684\u52A8\u4F5C\uFF0C\u626B\u63CF\u662F\u5B83\u7684\u7B2C\u4E00\u6BB5\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08GitHub REST \u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\uFF0Cgit \u63A8\u9996\u4E2A\u63D0\u4EA4\uFF1Btoken \u6765\u81EA\u672C\u673A git \u7684\u8EAB\u4EFD\uFF0C\u6CA1\u6388\u6743\u5148\u62D2\uFF09\u3002\u6E05\u5355\u8FC7\u65F6\uFF08persona \u6539\u8FC7 / \u6CA1\u626B\u8FC7 / \u4E0A\u6B21\u626B\u5931\u8D25\uFF09\uFF1A\u5148\u628A persona \u76EE\u5F55\u63D0\u4EA4\u5230\u672C\u5730\uFF08\u4E0D\u63A8\uFF09\uFF0C\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u56DE outcome=scanning\u2014\u2014\u7ED3\u679C\u5199\u8FDB .clawd/deploy.json\uFF08\u6E05\u5355\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\uFF0C\u6B63\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u4F1A\u8BDD\u3002\u6E05\u5355\u65B0\u9C9C\uFF1A\u8FC7\u95F8\uFF08\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\u3001\u8FDE\u63A5\u5668\u6765\u6E90\u70B9\u8FC7\u3001\u9009\u4E86\u6A21\u578B\uFF09\u2192 \u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\uFF0C\u56DE outcome=pushed \u5E26 commit \u4E0E Actions \u5730\u5740\uFF1B\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u8BD5\u8DD1\u3001\u767B\u8BB0\u3002owner-only",
24092
24085
  args: DeployPersonaArgsSchema
24093
24086
  },
24094
24087
  "deploy:rerunJob": {
package/dist/cli.cjs CHANGED
@@ -6098,7 +6098,7 @@ function cloudEngineOk(tool) {
6098
6098
  function repoSlug(url) {
6099
6099
  return url.trim().replace(/^git@[^:]+:/, "").replace(/^https?:\/\/[^/]+\//, "").replace(/\.git$/, "");
6100
6100
  }
6101
- var DeployFileSchema, SCAN_BASE_KINDS, ScanBaseKindSchema, DeployScanStatusSchema, DeployScanSchema, DeployRepoSchema, DeploySecretPresenceSchema, DEPLOY_STAGE_STATUSES, DeployStageStatusSchema, DEPLOY_STAGE_KEYS, DeployStageKeySchema, DeployJobSchema, DeployRunSchema, DeployStateSchema, DeployReleaseResultSchema, DeployPersonaArgsSchema, DeployStartArgsSchema, DeployPatchArgsSchema, DeployPutSecretArgsSchema, DeployRerunJobArgsSchema, DeployReportFindingArgsSchema, DeployFinishScanArgsSchema, PERSONA_REPO_ORG;
6101
+ var DeployFileSchema, SCAN_BASE_KINDS, ScanBaseKindSchema, DeployScanStatusSchema, DeployScanSchema, DeployRepoSchema, DeploySecretPresenceSchema, DEPLOY_STAGE_STATUSES, DeployStageStatusSchema, DEPLOY_STAGE_KEYS, DeployStageKeySchema, DeployJobSchema, DeployRunSchema, DeployStateSchema, DeployReleaseResultSchema, DeployPersonaArgsSchema, DeployPatchArgsSchema, DeployPutSecretArgsSchema, DeployRerunJobArgsSchema, DeployReportFindingArgsSchema, DeployFinishScanArgsSchema, PERSONA_REPO_ORG;
6102
6102
  var init_deploy_schemas = __esm({
6103
6103
  "../protocol/src/deploy-schemas.ts"() {
6104
6104
  "use strict";
@@ -6121,8 +6121,8 @@ var init_deploy_schemas = __esm({
6121
6121
  /** 扫描时被告知的共享资产名单(判「扫描器后来长了新本事」用) */
6122
6122
  scannedAssets: external_exports.array(external_exports.string()).default([]),
6123
6123
  /**
6124
- * 这次扫描是**对哪个 commit 的断言**。`deploy:start` 在起扫描之前会先把 persona 目录
6125
- * 提交并推上去,所以这个值一定是仓库里真实存在的一版。
6124
+ * 这次扫描是**对哪个 commit 的断言**。`deploy:release` 在起扫描之前会先把 persona 目录
6125
+ * 提交(只提交不推,推是发布末尾那一下的事),所以这个值一定是仓库里真实存在的一版。
6126
6126
  *
6127
6127
  * 有了它,「清单过没过时」才是个可判定的等式(`head === repo.head`),
6128
6128
  * 而不是从 `dirty` / `ahead` 里猜——那两个字段判不出「清单是好几版之前扫的」。
@@ -6141,8 +6141,8 @@ var init_deploy_schemas = __esm({
6141
6141
  */
6142
6142
  releasedHead: external_exports.string().min(1).optional(),
6143
6143
  /**
6144
- * 这次**实际**怎么扫的。是结果不是入参——`deploy:start` 收到的 mode 可能因为没有可比的
6145
- * 基准而退成硬扫,页面要显示的是真正发生的那个。
6144
+ * 这次**实际**怎么扫的。档位由 daemon 定(有线上版本可比 + 有跑完的清单 → 软扫,否则硬扫),
6145
+ * 页面要显示的是真正发生的那个。
6146
6146
  *
6147
6147
  * `.default('hard')` 而不是必填:这个文件是 strict 解析的,存量记录没有这个字段,
6148
6148
  * 定成必填会让 `readScan` 当场抛、上云页面直接打不开。而老记录确实都是从零扫的。
@@ -6217,20 +6217,17 @@ var init_deploy_schemas = __esm({
6217
6217
  */
6218
6218
  fileError: external_exports.string().optional()
6219
6219
  }).strict();
6220
- DeployReleaseResultSchema = external_exports.object({
6221
- sha: external_exports.string().min(1),
6222
- actionsUrl: external_exports.string().min(1)
6223
- }).strict();
6220
+ DeployReleaseResultSchema = external_exports.discriminatedUnion("outcome", [
6221
+ external_exports.object({
6222
+ outcome: external_exports.literal("pushed"),
6223
+ sha: external_exports.string().min(1),
6224
+ actionsUrl: external_exports.string().min(1)
6225
+ }).strict(),
6226
+ external_exports.object({ outcome: external_exports.literal("scanning") }).strict()
6227
+ ]);
6224
6228
  DeployPersonaArgsSchema = external_exports.object({
6225
6229
  personaId: external_exports.string().min(1)
6226
6230
  }).strict();
6227
- DeployStartArgsSchema = DeployPersonaArgsSchema.extend({
6228
- /**
6229
- * 缺省 soft。真正用哪一档由 daemon 定(软扫比不了时会退硬扫),结果看 `DeployScan.baseKind`。
6230
- * 复用上面那个中央定义的字面量,不在这里手抄一份。
6231
- */
6232
- mode: ScanBaseKindSchema.optional()
6233
- }).strict();
6234
6231
  DeployPatchArgsSchema = external_exports.object({
6235
6232
  personaId: external_exports.string().min(1),
6236
6233
  patch: external_exports.object({
@@ -8880,10 +8877,6 @@ var init_methods = __esm({
8880
8877
  args: WorkspaceReadArgs
8881
8878
  },
8882
8879
  // ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
8883
- "deploy:start": {
8884
- summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08GitHub REST \u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\uFF0Cgit \u63A8\u9996\u4E2A\u63D0\u4EA4\uFF1Btoken \u6765\u81EA\u672C\u673A git \u7684\u8EAB\u4EFD\uFF0C\u6CA1\u6388\u6743\u5148\u62D2\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u73AF\u5883\u6E05\u5355\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",
8885
- args: DeployPersonaArgsSchema
8886
- },
8887
8880
  "deploy:get": {
8888
8881
  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",
8889
8882
  args: DeployPersonaArgsSchema
@@ -8905,7 +8898,7 @@ var init_methods = __esm({
8905
8898
  args: DeployFinishScanArgsSchema
8906
8899
  },
8907
8900
  "deploy:release": {
8908
- 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\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
8901
+ summary: "\u53D1\u5E03\u2014\u2014\u4E0A\u4E91\u552F\u4E00\u7684\u52A8\u4F5C\uFF0C\u626B\u63CF\u662F\u5B83\u7684\u7B2C\u4E00\u6BB5\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08GitHub REST \u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\uFF0Cgit \u63A8\u9996\u4E2A\u63D0\u4EA4\uFF1Btoken \u6765\u81EA\u672C\u673A git \u7684\u8EAB\u4EFD\uFF0C\u6CA1\u6388\u6743\u5148\u62D2\uFF09\u3002\u6E05\u5355\u8FC7\u65F6\uFF08persona \u6539\u8FC7 / \u6CA1\u626B\u8FC7 / \u4E0A\u6B21\u626B\u5931\u8D25\uFF09\uFF1A\u5148\u628A persona \u76EE\u5F55\u63D0\u4EA4\u5230\u672C\u5730\uFF08\u4E0D\u63A8\uFF09\uFF0C\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u56DE outcome=scanning\u2014\u2014\u7ED3\u679C\u5199\u8FDB .clawd/deploy.json\uFF08\u6E05\u5355\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\uFF0C\u6B63\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u4F1A\u8BDD\u3002\u6E05\u5355\u65B0\u9C9C\uFF1A\u8FC7\u95F8\uFF08\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\u3001\u8FDE\u63A5\u5668\u6765\u6E90\u70B9\u8FC7\u3001\u9009\u4E86\u6A21\u578B\uFF09\u2192 \u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\uFF0C\u56DE outcome=pushed \u5E26 commit \u4E0E Actions \u5730\u5740\uFF1B\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u8BD5\u8DD1\u3001\u767B\u8BB0\u3002owner-only",
8909
8902
  args: DeployPersonaArgsSchema
8910
8903
  },
8911
8904
  "deploy:rerunJob": {
@@ -55203,7 +55196,7 @@ function fieldsOf(name, where, placeholders, warnings) {
55203
55196
  const ok = [];
55204
55197
  for (const p3 of uniq(placeholders)) {
55205
55198
  if (ConnectorFieldSchema.safeParse(p3).success) ok.push(p3);
55206
- else warnings.push(`MCP server\u300C${name}\u300D\u7684 ${where} \u91CC\u6709\u5360\u4F4D \${${p3}}\uFF0C\u53D8\u91CF\u540D\u4E0D\u5408\u5F62\u72B6\uFF08\u53EA\u80FD\u5927\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\uFF0C\u5B57\u6BCD\u5F00\u5934\uFF09\uFF0C\u6CA1\u7B97\u8FDB\u8981\u586B\u7684\u53D8\u91CF\uFF1B\u6539\u540D\u540E\u91CD\u65B0\u626B\u63CF`);
55199
+ else warnings.push(`MCP server\u300C${name}\u300D\u7684 ${where} \u91CC\u6709\u5360\u4F4D \${${p3}}\uFF0C\u53D8\u91CF\u540D\u4E0D\u5408\u5F62\u72B6\uFF08\u53EA\u80FD\u5927\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\uFF0C\u5B57\u6BCD\u5F00\u5934\uFF09\uFF0C\u6CA1\u7B97\u8FDB\u8981\u586B\u7684\u53D8\u91CF\uFF1B\u6539\u540D\u540E\u518D\u53D1\u5E03\u4E00\u6B21\uFF08\u4F1A\u91CD\u65B0\u626B\u63CF\uFF09`);
55207
55200
  }
55208
55201
  return ok;
55209
55202
  }
@@ -55244,7 +55237,7 @@ function scanMcpConnectors(personaDir) {
55244
55237
  for (const [name, raw] of Object.entries(servers)) {
55245
55238
  const def = raw && typeof raw === "object" ? raw : {};
55246
55239
  if (!ConnectorNameSchema.safeParse(name).success) {
55247
- out.warnings.push(`MCP server\u300C${name}\u300D\u7684\u540D\u5B57\u4E0D\u5408\u5F62\u72B6\uFF08\u53EA\u80FD\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u77ED\u6A2A\u7EBF\uFF09\uFF0C\u6CA1\u5217\u8FDB\u6E05\u5355\uFF1B\u6539\u540D\u540E\u91CD\u65B0\u626B\u63CF`);
55240
+ out.warnings.push(`MCP server\u300C${name}\u300D\u7684\u540D\u5B57\u4E0D\u5408\u5F62\u72B6\uFF08\u53EA\u80FD\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u77ED\u6A2A\u7EBF\uFF09\uFF0C\u6CA1\u5217\u8FDB\u6E05\u5355\uFF1B\u6539\u540D\u540E\u518D\u53D1\u5E03\u4E00\u6B21\uFF08\u4F1A\u91CD\u65B0\u626B\u63CF\uFF09`);
55248
55241
  continue;
55249
55242
  }
55250
55243
  const type = typeof def.type === "string" ? def.type.toLowerCase() : typeof def.url === "string" ? "http" : "stdio";
@@ -59352,7 +59345,7 @@ async function identityArgs(exec, dir) {
59352
59345
  if (has(email) && has(name)) return [];
59353
59346
  return ["-c", "user.name=clawd", "-c", "user.email=clawd@clawos.local"];
59354
59347
  }
59355
- async function writeTemplates(dir) {
59348
+ async function writeGitignore(dir) {
59356
59349
  const gi = import_node_path34.default.join(dir, ".gitignore");
59357
59350
  let existing;
59358
59351
  try {
@@ -59361,6 +59354,8 @@ async function writeTemplates(dir) {
59361
59354
  existing = void 0;
59362
59355
  }
59363
59356
  await import_promises5.default.writeFile(gi, mergeGitignore(existing));
59357
+ }
59358
+ async function writeWorkflow(dir) {
59364
59359
  const wf = import_node_path34.default.join(dir, WORKFLOW_PATH);
59365
59360
  await import_promises5.default.mkdir(import_node_path34.default.dirname(wf), { recursive: true });
59366
59361
  await import_promises5.default.writeFile(wf, WORKFLOW_TEMPLATE);
@@ -59399,7 +59394,8 @@ async function ensureRepo(exec, api, args) {
59399
59394
  const { dir, org, personaId: personaId2 } = args;
59400
59395
  const existing = await repoInfo(exec, dir);
59401
59396
  if (existing) return { created: false, url: existing.url };
59402
- await writeTemplates(dir);
59397
+ await writeGitignore(dir);
59398
+ await import_promises5.default.rm(import_node_path34.default.join(dir, WORKFLOW_PATH), { force: true });
59403
59399
  let created;
59404
59400
  try {
59405
59401
  created = await createOrgRepo(exec, api, { dir, org, repoName: personaId2, message: "clawd: \u4E0A\u4E91", auth: args.auth });
@@ -59437,33 +59433,32 @@ async function hasCommit(exec, dir, sha) {
59437
59433
  const r2 = await git(exec, dir, ["cat-file", "-e", `${sha}^{commit}`]);
59438
59434
  return !r2.spawnError && r2.code === 0;
59439
59435
  }
59440
- async function commitAndPush(exec, args) {
59436
+ async function commitAll(exec, args) {
59441
59437
  await mustGit(exec, args.dir, ["add", "-A"], "\u6682\u5B58\u6587\u4EF6");
59442
59438
  const staged = await git(exec, args.dir, ["diff", "--cached", "--quiet"]);
59443
59439
  if (staged.code === 1) {
59444
59440
  const identity = await identityArgs(exec, args.dir);
59445
59441
  await mustGit(exec, args.dir, [...identity, "commit", "-m", args.message], "\u63D0\u4EA4");
59446
59442
  }
59447
- await gitPush(exec, args.dir, args.auth);
59448
59443
  return mustGit(exec, args.dir, ["rev-parse", "HEAD"], "\u8BFB\u63D0\u4EA4");
59449
59444
  }
59450
59445
  async function release(exec, api, args) {
59451
59446
  const info = await repoInfo(exec, args.dir);
59452
59447
  if (!info) throw new RepoError("\u8FD8\u6CA1\u6709\u4ED3\u5E93\uFF0C\u5148\u70B9\u4E00\u6B21\u300C\u53D1\u5E03\u5230\u4E91\u4E0A\u300D\u5EFA\u4ED3");
59453
59448
  await api.enableActions(repoSlug(info.url));
59454
- await writeTemplates(args.dir);
59449
+ await writeGitignore(args.dir);
59450
+ await writeWorkflow(args.dir);
59455
59451
  const identity = await identityArgs(exec, args.dir);
59456
59452
  await mustGit(exec, args.dir, ["add", "-A"], "\u6682\u5B58\u6587\u4EF6");
59457
59453
  const stamp = new Date(args.now()).toISOString();
59458
59454
  await mustGit(exec, args.dir, [...identity, "commit", "--allow-empty", "-m", `clawd: \u53D1\u5E03 ${stamp}`], "\u63D0\u4EA4");
59459
59455
  await gitPush(exec, args.dir, args.auth);
59460
59456
  const sha = await mustGit(exec, args.dir, ["rev-parse", "HEAD"], "\u8BFB\u63D0\u4EA4");
59461
- return { sha, actionsUrl: `https://github.com/${repoSlug(info.url)}/actions` };
59457
+ return { outcome: "pushed", sha, actionsUrl: `https://github.com/${repoSlug(info.url)}/actions` };
59462
59458
  }
59463
59459
 
59464
59460
  // src/deploy/scan-base.ts
59465
59461
  function pickScanBase(args) {
59466
- if (args.mode === "hard") return { kind: "hard" };
59467
59462
  if (!args.hasUsableManifest || !args.releasedHead) return { kind: "hard" };
59468
59463
  return { kind: "soft", base: args.releasedHead };
59469
59464
  }
@@ -59557,7 +59552,7 @@ var STALE_ASSETS_NOTE_PREFIX = "\u3010\u4E0A\u4E91\u626B\u63CF\u3011";
59557
59552
  function describeStaleAssets(stale) {
59558
59553
  if (stale.length === 0) return void 0;
59559
59554
  const plain = (s2) => s2.replace(/\*\*/g, "").replace(/\s+/g, " ").trim();
59560
- return `${STALE_ASSETS_NOTE_PREFIX}\u8FD9\u6B21\u626B\u63CF\u7684\u65F6\u5019\uFF0C\u626B\u63CF\u5668\u8FD8\u4E0D\u77E5\u9053\u6709${stale.map((a2) => `\u300C${a2.name}\u300D`).join("\u3001")}\u8FD9${stale.length > 1 ? "\u51E0" : ""}\u9879\u5171\u4EAB\u8D44\u4EA7\uFF0C\u6240\u4EE5\u6E05\u5355\u91CC\u53EF\u80FD\u6F0F\u4E86\u58F0\u660E\u3002${stale.map((a2) => ` ${a2.name} \u662F\uFF1A${plain(a2.what)}`).join("")} \u7528\u5F97\u4E0A\u7684\u8BDD\uFF0C\u5728\u6E05\u5355\u91CC\u8865\u4E00\u6761 asset\uFF0C\u6216\u8005\u91CD\u65B0\u626B\u63CF\u4E00\u904D\u3002`;
59555
+ return `${STALE_ASSETS_NOTE_PREFIX}\u8FD9\u6B21\u626B\u63CF\u7684\u65F6\u5019\uFF0C\u626B\u63CF\u5668\u8FD8\u4E0D\u77E5\u9053\u6709${stale.map((a2) => `\u300C${a2.name}\u300D`).join("\u3001")}\u8FD9${stale.length > 1 ? "\u51E0" : ""}\u9879\u5171\u4EAB\u8D44\u4EA7\uFF0C\u6240\u4EE5\u6E05\u5355\u91CC\u53EF\u80FD\u6F0F\u4E86\u58F0\u660E\u3002${stale.map((a2) => ` ${a2.name} \u662F\uFF1A${plain(a2.what)}`).join("")} \u7528\u5F97\u4E0A\u7684\u8BDD\uFF0C\u5728\u6E05\u5355\u91CC\u8865\u4E00\u6761 asset\u3002`;
59561
59556
  }
59562
59557
  function settleEndedScan(outcome, current, now) {
59563
59558
  if (current?.status !== "scanning") return void 0;
@@ -59576,7 +59571,7 @@ function reconcileInterruptedScans(deps) {
59576
59571
  ...scan,
59577
59572
  status: "failed",
59578
59573
  finishedAt: deps.now,
59579
- error: "daemon \u91CD\u542F\uFF0C\u626B\u63CF\u4F1A\u8BDD\u5DF2\u4E2D\u65AD\u2014\u2014\u8BF7\u91CD\u65B0\u626B\u63CF"
59574
+ error: "daemon \u91CD\u542F\uFF0C\u626B\u63CF\u4F1A\u8BDD\u5DF2\u4E2D\u65AD\u2014\u2014\u518D\u70B9\u4E00\u6B21\u300C\u53D1\u5E03\u300D\u4F1A\u91CD\u65B0\u626B\u63CF"
59580
59575
  });
59581
59576
  flipped.push(personaId2);
59582
59577
  }
@@ -59679,33 +59674,9 @@ function buildDeployHandlers(deps) {
59679
59674
  const view = async (personaId2) => ({
59680
59675
  response: { type: "deploy:state", ...await stateOf(personaId2) }
59681
59676
  });
59682
- const start = async (frame, _client, ctx) => {
59683
- ensureOwner(ctx);
59684
- const { personaId: personaId2, mode } = parseArgs2(DeployStartArgsSchema, frame, "deploy:start");
59685
- const dir = mustPersona(personaId2);
59686
- const wrong = wrongEngine(deps.personaEngine(personaId2)?.tool);
59687
- if (wrong) throw invalid(wrong);
59688
- const current = await readScan(dir);
59689
- if (current?.status === "scanning") return view(personaId2);
59690
- const { auth, api } = await requireGithub();
59691
- if (!await repoInfo(deps.exec, dir)) {
59692
- try {
59693
- await ensureRepo(deps.exec, api, { dir, org: deps.org, personaId: personaId2, auth });
59694
- } catch (err) {
59695
- throw toClawdError(err);
59696
- }
59697
- secretsCache.delete(personaId2);
59698
- }
59699
- let head;
59700
- try {
59701
- head = await commitAndPush(deps.exec, { dir, message: `clawd: \u626B\u63CF\u524D\u843D\u5B58 ${new Date(deps.now()).toISOString()}`, auth });
59702
- } catch (err) {
59703
- throw toClawdError(err);
59704
- }
59705
- runCache.delete(personaId2);
59677
+ async function beginScan(personaId2, dir, current, head) {
59706
59678
  const prevManifest = await readDeployFile(dir).catch(() => void 0);
59707
59679
  const scanBase = pickScanBase({
59708
- mode,
59709
59680
  // **文件在 ≠ 清单能用**:硬扫一开头就写了一份空清单,那一轮没跑完(OTA 重启 / butler 崩,
59710
59681
  // 见 scan-task.ts 的收尾判定)的话文件在、内容是空的。所以判据连上「上一轮扫完了」。
59711
59682
  hasUsableManifest: prevManifest !== void 0 && current?.status === "done",
@@ -59756,8 +59727,7 @@ function buildDeployHandlers(deps) {
59756
59727
  error: `\u8D77\u626B\u63CF\u4F1A\u8BDD\u5931\u8D25\uFF1A${started.error}`
59757
59728
  });
59758
59729
  }
59759
- return view(personaId2);
59760
- };
59730
+ }
59761
59731
  const get = async (frame, _client, ctx) => {
59762
59732
  ensureOwner(ctx);
59763
59733
  const { personaId: personaId2 } = parseArgs2(DeployPersonaArgsSchema, frame, "deploy:get");
@@ -59842,20 +59812,37 @@ function buildDeployHandlers(deps) {
59842
59812
  ensureOwner(ctx);
59843
59813
  const { personaId: personaId2 } = parseArgs2(DeployPersonaArgsSchema, frame, "deploy:release");
59844
59814
  const dir = mustPersona(personaId2);
59845
- const repo2 = await repoInfo(deps.exec, dir);
59846
- if (!repo2) throw invalid("\u8FD8\u6CA1\u6709\u4ED3\u5E93\uFF0C\u5148\u70B9\u4E00\u6B21\u300C\u53D1\u5E03\u5230\u4E91\u4E0A\u300D\u5EFA\u4ED3");
59815
+ const wrong = wrongEngine(deps.personaEngine(personaId2)?.tool);
59816
+ if (wrong) throw invalid(wrong);
59817
+ const { auth, api } = await requireGithub();
59818
+ let repo2 = await repoInfo(deps.exec, dir);
59819
+ if (!repo2) {
59820
+ try {
59821
+ await ensureRepo(deps.exec, api, { dir, org: deps.org, personaId: personaId2, auth });
59822
+ } catch (err) {
59823
+ throw toClawdError(err);
59824
+ }
59825
+ secretsCache.delete(personaId2);
59826
+ repo2 = await repoInfo(deps.exec, dir);
59827
+ if (!repo2) throw new ClawdError(ERROR_CODES.INTERNAL, "\u4ED3\u5E93\u5EFA\u597D\u4E86\u4F46\u8BFB\u4E0D\u5230 origin");
59828
+ }
59847
59829
  if (repo2.branch !== "main") throw invalid(`\u5F53\u524D\u5728\u5206\u652F ${repo2.branch}\uFF0C\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u53EA\u8BA4 main\uFF1B\u5207\u56DE main \u518D\u53D1\u5E03`);
59830
+ const current = await readScan(dir);
59831
+ if (current?.status === "scanning") return { response: { type: "deploy:release", outcome: "scanning" } };
59832
+ const fileUsable = await readDeployFile(dir).then((f2) => f2 !== void 0).catch(() => false);
59833
+ if (!fileUsable || !isScanFresh(current, repo2)) {
59834
+ let head;
59835
+ try {
59836
+ head = await commitAll(deps.exec, { dir, message: `clawd: \u626B\u63CF\u524D\u843D\u5B58 ${new Date(deps.now()).toISOString()}` });
59837
+ } catch (err) {
59838
+ throw toClawdError(err);
59839
+ }
59840
+ runCache.delete(personaId2);
59841
+ await beginScan(personaId2, dir, current, head);
59842
+ return { response: { type: "deploy:release", outcome: "scanning" } };
59843
+ }
59848
59844
  const file = await readDeployFile(dir);
59849
59845
  if (!file) throw invalid("\u8FD8\u6CA1\u626B\u63CF\u51FA\u6E05\u5355");
59850
- const scan = await readScan(dir);
59851
- if (scan?.status === "scanning") throw invalid("\u626B\u63CF\u8FD8\u6CA1\u7ED3\u675F");
59852
- if (scan?.status !== "done") throw invalid(scan?.status === "failed" ? "\u4E0A\u6B21\u626B\u63CF\u5931\u8D25\u4E86\uFF0C\u5148\u91CD\u65B0\u626B\u63CF" : "\u8FD8\u6CA1\u626B\u63CF\u8FC7\uFF0C\u5148\u626B\u63CF");
59853
- if (!isScanFresh(scan, repo2)) {
59854
- throw invalid(
59855
- repo2.dirty ? "persona \u76EE\u5F55\u6709\u6539\u52A8\u8FD8\u6CA1\u626B\u8FC7\uFF0C\u5148\u91CD\u65B0\u626B\u63CF\u4E00\u6B21\uFF08\u6E05\u5355\u8981\u8DDF\u7740\u6539\u52A8\u8D70\uFF09" : "\u6E05\u5355\u662F\u66F4\u65E9\u90A3\u4E00\u7248\u626B\u51FA\u6765\u7684\uFF0C\u5148\u91CD\u65B0\u626B\u63CF\u4E00\u6B21"
59856
- );
59857
- }
59858
- const { auth, api } = await requireGithub();
59859
59846
  const blockers = [];
59860
59847
  let present;
59861
59848
  try {
@@ -59866,11 +59853,7 @@ function buildDeployHandlers(deps) {
59866
59853
  const missing = requiredEnvNames(file).filter((e) => !present.has(e));
59867
59854
  if (missing.length > 0) blockers.push(`${missing.join(" / ")} \u8FD8\u6CA1\u586B`);
59868
59855
  for (const c2 of file.manifest.connectors) blockers.push(...connectorBlockers(c2));
59869
- const engine = deps.personaEngine(personaId2);
59870
- const wrongTool = wrongEngine(engine?.tool);
59871
- if (wrongTool) {
59872
- blockers.push(wrongTool);
59873
- } else if (!engine?.model) {
59856
+ if (!deps.personaEngine(personaId2)?.model) {
59874
59857
  blockers.push("\u8FD8\u6CA1\u9009\u6A21\u578B\uFF08\u5207\u5F15\u64CE\u65F6\u4F1A\u6E05\u7A7A\uFF09\u2014\u2014\u53BB persona \u8BBE\u7F6E\u91CC\u9009\u4E00\u4E2A");
59875
59858
  }
59876
59859
  if (blockers.length > 0) throw invalid(`\u8FD8\u5DEE\uFF1A${blockers.join("\uFF1B")}`);
@@ -59906,7 +59889,6 @@ function buildDeployHandlers(deps) {
59906
59889
  return view(personaId2);
59907
59890
  };
59908
59891
  return {
59909
- "deploy:start": start,
59910
59892
  "deploy:get": get,
59911
59893
  "deploy:patch": patch,
59912
59894
  "deploy:putSecret": putSecret,
@@ -70092,7 +70074,6 @@ var METHOD_GRANT_MAP = {
70092
70074
  "visitor:list": ADMIN_ANY,
70093
70075
  // deploy:*(persona 上云):全部 owner-only。里面有凭据录入口、建仓和推送,
70094
70076
  // guest 不该看见更不该动。
70095
- "deploy:start": ADMIN_ANY,
70096
70077
  "deploy:get": ADMIN_ANY,
70097
70078
  "deploy:patch": ADMIN_ANY,
70098
70079
  "deploy:putSecret": ADMIN_ANY,
@@ -70300,7 +70281,6 @@ var METHOD_GRANT_MAP = {
70300
70281
  "device:connections": ADMIN_ANY
70301
70282
  };
70302
70283
  var HUMAN_ONLY_METHODS = [
70303
- "deploy:start",
70304
70284
  "deploy:release",
70305
70285
  "deploy:putSecret",
70306
70286
  "deploy:rerunJob",
@@ -70348,7 +70328,7 @@ function computeMethodAccess(args) {
70348
70328
  }
70349
70329
 
70350
70330
  // src/version.ts
70351
- var version = "0.2.526".length > 0 ? "0.2.526" : "dev";
70331
+ var version = "0.2.528".length > 0 ? "0.2.528" : "dev";
70352
70332
 
70353
70333
  // src/cli-probe/probe.ts
70354
70334
  var fs77 = __toESM(require("fs"), 1);
@@ -21394,8 +21394,8 @@ var DeployScanSchema = external_exports.object({
21394
21394
  /** 扫描时被告知的共享资产名单(判「扫描器后来长了新本事」用) */
21395
21395
  scannedAssets: external_exports.array(external_exports.string()).default([]),
21396
21396
  /**
21397
- * 这次扫描是**对哪个 commit 的断言**。`deploy:start` 在起扫描之前会先把 persona 目录
21398
- * 提交并推上去,所以这个值一定是仓库里真实存在的一版。
21397
+ * 这次扫描是**对哪个 commit 的断言**。`deploy:release` 在起扫描之前会先把 persona 目录
21398
+ * 提交(只提交不推,推是发布末尾那一下的事),所以这个值一定是仓库里真实存在的一版。
21399
21399
  *
21400
21400
  * 有了它,「清单过没过时」才是个可判定的等式(`head === repo.head`),
21401
21401
  * 而不是从 `dirty` / `ahead` 里猜——那两个字段判不出「清单是好几版之前扫的」。
@@ -21414,8 +21414,8 @@ var DeployScanSchema = external_exports.object({
21414
21414
  */
21415
21415
  releasedHead: external_exports.string().min(1).optional(),
21416
21416
  /**
21417
- * 这次**实际**怎么扫的。是结果不是入参——`deploy:start` 收到的 mode 可能因为没有可比的
21418
- * 基准而退成硬扫,页面要显示的是真正发生的那个。
21417
+ * 这次**实际**怎么扫的。档位由 daemon 定(有线上版本可比 + 有跑完的清单 → 软扫,否则硬扫),
21418
+ * 页面要显示的是真正发生的那个。
21419
21419
  *
21420
21420
  * `.default('hard')` 而不是必填:这个文件是 strict 解析的,存量记录没有这个字段,
21421
21421
  * 定成必填会让 `readScan` 当场抛、上云页面直接打不开。而老记录确实都是从零扫的。
@@ -21490,20 +21490,17 @@ var DeployStateSchema = external_exports.object({
21490
21490
  */
21491
21491
  fileError: external_exports.string().optional()
21492
21492
  }).strict();
21493
- var DeployReleaseResultSchema = external_exports.object({
21494
- sha: external_exports.string().min(1),
21495
- actionsUrl: external_exports.string().min(1)
21496
- }).strict();
21493
+ var DeployReleaseResultSchema = external_exports.discriminatedUnion("outcome", [
21494
+ external_exports.object({
21495
+ outcome: external_exports.literal("pushed"),
21496
+ sha: external_exports.string().min(1),
21497
+ actionsUrl: external_exports.string().min(1)
21498
+ }).strict(),
21499
+ external_exports.object({ outcome: external_exports.literal("scanning") }).strict()
21500
+ ]);
21497
21501
  var DeployPersonaArgsSchema = external_exports.object({
21498
21502
  personaId: external_exports.string().min(1)
21499
21503
  }).strict();
21500
- var DeployStartArgsSchema = DeployPersonaArgsSchema.extend({
21501
- /**
21502
- * 缺省 soft。真正用哪一档由 daemon 定(软扫比不了时会退硬扫),结果看 `DeployScan.baseKind`。
21503
- * 复用上面那个中央定义的字面量,不在这里手抄一份。
21504
- */
21505
- mode: ScanBaseKindSchema.optional()
21506
- }).strict();
21507
21504
  var DeployPatchArgsSchema = external_exports.object({
21508
21505
  personaId: external_exports.string().min(1),
21509
21506
  patch: external_exports.object({
@@ -23878,10 +23875,6 @@ var METHOD_DOCS = {
23878
23875
  args: WorkspaceReadArgs
23879
23876
  },
23880
23877
  // ---- deploy:*(persona 上云:persona 目录 = git 仓库工作树,发布 = 推送触发仓库流水线)----
23881
- "deploy:start": {
23882
- summary: "\u5BF9\u67D0\u4E2A persona \u8D77\u4E00\u6B21\u4E0A\u4E91\u626B\u63CF\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08GitHub REST \u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\uFF0Cgit \u63A8\u9996\u4E2A\u63D0\u4EA4\uFF1Btoken \u6765\u81EA\u672C\u673A git \u7684\u8EAB\u4EFD\uFF0C\u6CA1\u6388\u6743\u5148\u62D2\uFF09\uFF0C\u518D\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u7ED3\u679C\u5199\u8FDB persona \u76EE\u5F55\u7684 .clawd/deploy.json \uFF08\u73AF\u5883\u6E05\u5355\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",
23883
- args: DeployPersonaArgsSchema
23884
- },
23885
23878
  "deploy:get": {
23886
23879
  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",
23887
23880
  args: DeployPersonaArgsSchema
@@ -23903,7 +23896,7 @@ var METHOD_DOCS = {
23903
23896
  args: DeployFinishScanArgsSchema
23904
23897
  },
23905
23898
  "deploy:release": {
23906
- 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\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\uFF1Bowner-only",
23899
+ summary: "\u53D1\u5E03\u2014\u2014\u4E0A\u4E91\u552F\u4E00\u7684\u52A8\u4F5C\uFF0C\u626B\u63CF\u662F\u5B83\u7684\u7B2C\u4E00\u6BB5\u3002**\u6CA1\u4ED3\u5E93\u5148\u5EFA\u4ED3**\uFF08GitHub REST \u5EFA\u5728\u7EC4\u7EC7\u4E0B\u3001\u79C1\u6709\uFF0Cgit \u63A8\u9996\u4E2A\u63D0\u4EA4\uFF1Btoken \u6765\u81EA\u672C\u673A git \u7684\u8EAB\u4EFD\uFF0C\u6CA1\u6388\u6743\u5148\u62D2\uFF09\u3002\u6E05\u5355\u8FC7\u65F6\uFF08persona \u6539\u8FC7 / \u6CA1\u626B\u8FC7 / \u4E0A\u6B21\u626B\u5931\u8D25\uFF09\uFF1A\u5148\u628A persona \u76EE\u5F55\u63D0\u4EA4\u5230\u672C\u5730\uFF08\u4E0D\u63A8\uFF09\uFF0C\u8D77 persona-butler \u7684\u626B\u63CF\u4F1A\u8BDD\uFF0C\u56DE outcome=scanning\u2014\u2014\u7ED3\u679C\u5199\u8FDB .clawd/deploy.json\uFF08\u6E05\u5355\uFF0C\u8FDB\u4ED3\u5E93\uFF09\u4E0E .clawd/deploy-scan.json\uFF08\u8BC1\u636E\uFF0C\u4E0D\u8FDB\u4ED3\u5E93\uFF09\uFF0C\u6B63\u5728\u626B\u7684\u8BDD\u539F\u6837\u8FD4\u56DE\u4E0D\u8D77\u7B2C\u4E8C\u4E2A\u4F1A\u8BDD\u3002\u6E05\u5355\u65B0\u9C9C\uFF1A\u8FC7\u95F8\uFF08\u6BCF\u4E2A\u53D8\u91CF\u540D\u90FD\u5728 Secrets \u91CC\u3001\u8FDE\u63A5\u5668\u6765\u6E90\u70B9\u8FC7\u3001\u9009\u4E86\u6A21\u578B\uFF09\u2192 \u91CD\u5199 workflow \u6A21\u677F \u2192 git add -A \u2192 \u7A7A\u63D0\u4EA4\u4E5F\u5141\u8BB8 \u2192 push\uFF0C\u56DE outcome=pushed \u5E26 commit \u4E0E Actions \u5730\u5740\uFF1B\u4ED3\u5E93\u91CC\u7684\u6D41\u6C34\u7EBF\u63A5\u7740\u6784\u955C\u50CF\u3001\u8BD5\u8DD1\u3001\u767B\u8BB0\u3002owner-only",
23907
23900
  args: DeployPersonaArgsSchema
23908
23901
  },
23909
23902
  "deploy:rerunJob": {