@clawos-dev/clawd 0.2.526 → 0.2.527
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 +13 -20
- package/dist/cli.cjs +59 -79
- package/dist/dispatch/mcp-server.cjs +13 -20
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/guest-CnDyufxk.css +32 -0
- package/dist/share-ui/assets/{guest-DDkJz4od.js → guest-DcCzHdsq.js} +132 -132
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
- package/dist/share-ui/assets/guest-UkS4T7xe.css +0 -32
|
@@ -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:
|
|
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
|
-
*
|
|
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.
|
|
21679
|
-
|
|
21680
|
-
|
|
21681
|
-
|
|
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
|
|
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,
|
|
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:
|
|
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
|
-
*
|
|
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.
|
|
6221
|
-
|
|
6222
|
-
|
|
6223
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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\
|
|
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\
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
59846
|
-
if (
|
|
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
|
-
|
|
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.
|
|
70331
|
+
var version = "0.2.527".length > 0 ? "0.2.527" : "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:
|
|
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
|
-
*
|
|
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.
|
|
21494
|
-
|
|
21495
|
-
|
|
21496
|
-
|
|
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
|
|
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": {
|