@clawos-dev/clawd 0.2.503 → 0.2.505
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 +2 -2
- package/dist/cli.cjs +12 -12
- package/dist/dispatch/mcp-server.cjs +2 -2
- package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md +58 -7
- package/dist/share-md-viewer-error.html +1 -1
- package/dist/share-md-viewer.html +1 -1
- package/dist/share-ui/assets/guest-BllOBGLj.css +32 -0
- package/dist/share-ui/assets/{guest-DzRUzO30.js → guest-Uh00t3gI.js} +2 -2
- package/dist/share-ui/guest.html +2 -2
- package/package.json +1 -1
- package/dist/share-ui/assets/guest-BDtdGETg.css +0 -32
|
@@ -21323,7 +21323,7 @@ var CONNECTOR_RUNNERS = ["mcp", "cli"];
|
|
|
21323
21323
|
var CONNECTOR_PROTOCOLS = ["bearer", "lark-sidecar"];
|
|
21324
21324
|
var CREDENTIAL_SOURCES = ["none", "shared", "personal"];
|
|
21325
21325
|
var CONNECTOR_AUTHS = ["oauth", "fields"];
|
|
21326
|
-
var ConnectorFieldSchema = external_exports.string().regex(/^[A-Z][A-Z0-9_]*$/, "\u8981\u586B\u7684\
|
|
21326
|
+
var ConnectorFieldSchema = external_exports.string().regex(/^[A-Z][A-Z0-9_]*$/, "\u8981\u586B\u7684\u53D8\u91CF\u540D\u53EA\u80FD\u662F\u5927\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF\uFF0C\u4E14\u4EE5\u5B57\u6BCD\u5F00\u5934");
|
|
21327
21327
|
var EnvConnectorSchema = external_exports.object({
|
|
21328
21328
|
name: ConnectorNameSchema,
|
|
21329
21329
|
kind: external_exports.enum(CONNECTOR_KINDS),
|
|
@@ -24103,7 +24103,7 @@ var METHOD_DOCS = {
|
|
|
24103
24103
|
},
|
|
24104
24104
|
// ---- cloud:connectors:*(云 persona 卡片上的连接器;design 2026-09-11-mcp-connector §3.8)----
|
|
24105
24105
|
"cloud:connectors:list": {
|
|
24106
|
-
summary: "\u4E91\u4E0A persona \u5361\u7247\u4E0A\u7684\u8FDE\u63A5\u5668\u533A\uFF1A\u8FD9\u4E2A persona \u58F0\u660E\u7684\u3001**\u8981\u4F7F\u7528\u8005\u672C\u4EBA\u6388\u6743\u7684**\u8FDE\u63A5\u5668\u5404\u81EA\u8FDE\u6CA1\u8FDE\u4E0A\uFF08connected / missing / reauth\uFF09\u3001\u6309\u94AE\u662F\u5173\u8054\
|
|
24106
|
+
summary: "\u4E91\u4E0A persona \u5361\u7247\u4E0A\u7684\u8FDE\u63A5\u5668\u533A\uFF1A\u8FD9\u4E2A persona \u58F0\u660E\u7684\u3001**\u8981\u4F7F\u7528\u8005\u672C\u4EBA\u6388\u6743\u7684**\u8FDE\u63A5\u5668\u5404\u81EA\u8FDE\u6CA1\u8FDE\u4E0A\uFF08connected / missing / reauth\uFF09\u3001\u6309\u94AE\u662F\u5173\u8054\uFF08OAuth\uFF0C\u5E26\u73B0\u7B97\u7684 authUrl\uFF09\u8FD8\u662F\u7C98\u8D34 API key\uFF08\u5E26\u8981\u586B\u7684\u53D8\u91CF\uFF09\u3002daemon \u62FF gateway \u767B\u8BB0\u884C + \u672C\u673A\u767B\u5F55\u51ED\u8BC1\u5411\u4E2D\u5FC3\u4EE3\u67E5\uFF0C\u51ED\u8BC1\u4E0D\u51FA ws\uFF1Bowner-only",
|
|
24107
24107
|
args: CloudConnectorsListArgsSchema
|
|
24108
24108
|
},
|
|
24109
24109
|
"cloud:connectors:fill": {
|
package/dist/cli.cjs
CHANGED
|
@@ -5952,14 +5952,14 @@ var init_contact_handshake = __esm({
|
|
|
5952
5952
|
|
|
5953
5953
|
// ../protocol/src/environment-schemas.ts
|
|
5954
5954
|
function connectorBlockers(c) {
|
|
5955
|
-
if (!c.credentialSource) return [`\u8FDE\u63A5\u5668 ${c.name} \u8FD8\u6CA1\
|
|
5955
|
+
if (!c.credentialSource) return [`\u8FDE\u63A5\u5668 ${c.name} \u8FD8\u6CA1\u9009\u7528\u8C01\u7684\u8D26\u53F7`];
|
|
5956
5956
|
const out = [];
|
|
5957
5957
|
if (c.credentialSource === "personal") {
|
|
5958
|
-
if (!c.auth) out.push(`\u8FDE\u63A5\u5668 ${c.name} \u8FD8\u6CA1\u9009\u5173\u8054\
|
|
5959
|
-
else if (c.auth === "oauth" && c.kind === "env") out.push(`\u8FDE\u63A5\u5668 ${c.name} \u662F\u8FDB\u7A0B\u578B\uFF08stdio MCP / CLI\uFF09\uFF0C\u53EA\u80FD\
|
|
5960
|
-
else if (c.auth === "fields" && c.fields.length === 0) out.push(`\u8FDE\u63A5\u5668 ${c.name} \u8981\u586B\u7684\
|
|
5958
|
+
if (!c.auth) out.push(`\u8FDE\u63A5\u5668 ${c.name} \u8FD8\u6CA1\u9009\u7528\u6237\u600E\u4E48\u5173\u8054\u8D26\u53F7`);
|
|
5959
|
+
else if (c.auth === "oauth" && c.kind === "env") out.push(`\u8FDE\u63A5\u5668 ${c.name} \u662F\u8FDB\u7A0B\u578B\uFF08stdio MCP / CLI\uFF09\uFF0C\u53EA\u80FD\u7C98\u8D34 API key\uFF0C\u8D70\u4E0D\u4E86 OAuth`);
|
|
5960
|
+
else if (c.auth === "fields" && c.fields.length === 0) out.push(`\u8FDE\u63A5\u5668 ${c.name} \u8981\u586B\u7684\u53D8\u91CF\u8FD8\u6CA1\u5217`);
|
|
5961
5961
|
}
|
|
5962
|
-
if (c.credentialSource === "shared" && c.fields.length === 0) out.push(`\u8FDE\u63A5\u5668 ${c.name} \u9009\u4E86\
|
|
5962
|
+
if (c.credentialSource === "shared" && c.fields.length === 0) out.push(`\u8FDE\u63A5\u5668 ${c.name} \u9009\u4E86\u53D1\u5E03\u8005\u7684\u8D26\u53F7\uFF0C\u4F46\u8981\u586B\u7684\u53D8\u91CF\u8FD8\u6CA1\u5217`);
|
|
5963
5963
|
return out;
|
|
5964
5964
|
}
|
|
5965
5965
|
function sharedConnectorSecrets(m2) {
|
|
@@ -6016,7 +6016,7 @@ var init_environment_schemas = __esm({
|
|
|
6016
6016
|
CONNECTOR_PROTOCOLS = ["bearer", "lark-sidecar"];
|
|
6017
6017
|
CREDENTIAL_SOURCES = ["none", "shared", "personal"];
|
|
6018
6018
|
CONNECTOR_AUTHS = ["oauth", "fields"];
|
|
6019
|
-
ConnectorFieldSchema = external_exports.string().regex(/^[A-Z][A-Z0-9_]*$/, "\u8981\u586B\u7684\
|
|
6019
|
+
ConnectorFieldSchema = external_exports.string().regex(/^[A-Z][A-Z0-9_]*$/, "\u8981\u586B\u7684\u53D8\u91CF\u540D\u53EA\u80FD\u662F\u5927\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF\uFF0C\u4E14\u4EE5\u5B57\u6BCD\u5F00\u5934");
|
|
6020
6020
|
EnvConnectorSchema = external_exports.object({
|
|
6021
6021
|
name: ConnectorNameSchema,
|
|
6022
6022
|
kind: external_exports.enum(CONNECTOR_KINDS),
|
|
@@ -9089,7 +9089,7 @@ var init_methods = __esm({
|
|
|
9089
9089
|
},
|
|
9090
9090
|
// ---- cloud:connectors:*(云 persona 卡片上的连接器;design 2026-09-11-mcp-connector §3.8)----
|
|
9091
9091
|
"cloud:connectors:list": {
|
|
9092
|
-
summary: "\u4E91\u4E0A persona \u5361\u7247\u4E0A\u7684\u8FDE\u63A5\u5668\u533A\uFF1A\u8FD9\u4E2A persona \u58F0\u660E\u7684\u3001**\u8981\u4F7F\u7528\u8005\u672C\u4EBA\u6388\u6743\u7684**\u8FDE\u63A5\u5668\u5404\u81EA\u8FDE\u6CA1\u8FDE\u4E0A\uFF08connected / missing / reauth\uFF09\u3001\u6309\u94AE\u662F\u5173\u8054\
|
|
9092
|
+
summary: "\u4E91\u4E0A persona \u5361\u7247\u4E0A\u7684\u8FDE\u63A5\u5668\u533A\uFF1A\u8FD9\u4E2A persona \u58F0\u660E\u7684\u3001**\u8981\u4F7F\u7528\u8005\u672C\u4EBA\u6388\u6743\u7684**\u8FDE\u63A5\u5668\u5404\u81EA\u8FDE\u6CA1\u8FDE\u4E0A\uFF08connected / missing / reauth\uFF09\u3001\u6309\u94AE\u662F\u5173\u8054\uFF08OAuth\uFF0C\u5E26\u73B0\u7B97\u7684 authUrl\uFF09\u8FD8\u662F\u7C98\u8D34 API key\uFF08\u5E26\u8981\u586B\u7684\u53D8\u91CF\uFF09\u3002daemon \u62FF gateway \u767B\u8BB0\u884C + \u672C\u673A\u767B\u5F55\u51ED\u8BC1\u5411\u4E2D\u5FC3\u4EE3\u67E5\uFF0C\u51ED\u8BC1\u4E0D\u51FA ws\uFF1Bowner-only",
|
|
9093
9093
|
args: CloudConnectorsListArgsSchema
|
|
9094
9094
|
},
|
|
9095
9095
|
"cloud:connectors:fill": {
|
|
@@ -55389,7 +55389,7 @@ function fieldsOf(name, where, placeholders, warnings) {
|
|
|
55389
55389
|
const ok = [];
|
|
55390
55390
|
for (const p2 of uniq(placeholders)) {
|
|
55391
55391
|
if (ConnectorFieldSchema.safeParse(p2).success) ok.push(p2);
|
|
55392
|
-
else warnings.push(`MCP server\u300C${name}\u300D\u7684 ${where} \u91CC\u6709\u5360\u4F4D \${${p2}}\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\
|
|
55392
|
+
else warnings.push(`MCP server\u300C${name}\u300D\u7684 ${where} \u91CC\u6709\u5360\u4F4D \${${p2}}\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`);
|
|
55393
55393
|
}
|
|
55394
55394
|
return ok;
|
|
55395
55395
|
}
|
|
@@ -55452,7 +55452,7 @@ function scanMcpConnectors(personaDir) {
|
|
|
55452
55452
|
out.connectors.push({ name, kind: "proxy", runner: "mcp", id: id2, fields: fields2, http: { url, headers } });
|
|
55453
55453
|
out.evidence.push({
|
|
55454
55454
|
target: `connector:${name}`,
|
|
55455
|
-
reason: `.mcp.json \u91CC\u6302\u4E86 http \u578B MCP server\u300C${name}\u300D\uFF08${id2}\uFF09\u3002` + (fields2.length > 0 ? `\u8BF7\u6C42\u5934\u91CC\u8981\u586B ${fields2.join(" / ")}\u3002` : "\u6CA1\u6709\u5360\u4F4D\uFF1A\
|
|
55455
|
+
reason: `.mcp.json \u91CC\u6302\u4E86 http \u578B MCP server\u300C${name}\u300D\uFF08${id2}\uFF09\u3002` + (fields2.length > 0 ? `\u8BF7\u6C42\u5934\u91CC\u8981\u586B ${fields2.join(" / ")}\u3002` : "\u6CA1\u6709\u5360\u4F4D\uFF1A\u53EF\u4EE5\u8BA9\u7528\u6237 OAuth \u767B\u5F55\u81EA\u5DF1\u7684\u8D26\u53F7\uFF0C\u4E5F\u53EF\u4EE5\u7528\u53D1\u5E03\u8005\u7684\u3002") + "\u7528\u8C01\u7684\u8D26\u53F7\u5728\u5355\u636E\u4E0A\u70B9\u3002",
|
|
55456
55456
|
file: ".mcp.json",
|
|
55457
55457
|
quote
|
|
55458
55458
|
});
|
|
@@ -55473,7 +55473,7 @@ function scanMcpConnectors(personaDir) {
|
|
|
55473
55473
|
out.connectors.push({ name, kind: "env", runner: "mcp", id, fields });
|
|
55474
55474
|
out.evidence.push({
|
|
55475
55475
|
target: `connector:${name}`,
|
|
55476
|
-
reason: `.mcp.json \u91CC\u6302\u4E86 stdio \u578B MCP server\u300C${name}\u300D\uFF08${id}\uFF09\u3002` + (fields.length > 0 ? `\u5B83\u4ECE\u73AF\u5883\u53D8\u91CF\u8BFB ${fields.join(" / ")}\u3002` : "\u6CA1\u6709\u8981\u586B\u7684\u73AF\u5883\u53D8\u91CF\u3002") + "\u8C01\
|
|
55476
|
+
reason: `.mcp.json \u91CC\u6302\u4E86 stdio \u578B MCP server\u300C${name}\u300D\uFF08${id}\uFF09\u3002` + (fields.length > 0 ? `\u5B83\u4ECE\u73AF\u5883\u53D8\u91CF\u8BFB ${fields.join(" / ")}\u3002` : "\u6CA1\u6709\u8981\u586B\u7684\u73AF\u5883\u53D8\u91CF\u3002") + "\u7528\u8C01\u7684\u8D26\u53F7\u5728\u5355\u636E\u4E0A\u70B9\uFF1A\u53D1\u5E03\u8005\u7684\u8D26\u53F7 = \u53D1\u5E03\u8005\u5728\u5355\u636E\u4E0A\u586B\u4E00\u4EFD key\uFF0C\u7528\u6237\u81EA\u5DF1\u7684\u8D26\u53F7 = \u6BCF\u4E2A\u7528\u6237\u5728\u5361\u7247\u4E0A\u7C98\u81EA\u5DF1\u7684 key\u3002",
|
|
55477
55477
|
file: ".mcp.json",
|
|
55478
55478
|
quote
|
|
55479
55479
|
});
|
|
@@ -56300,7 +56300,7 @@ function buildDeployHandlers(deps) {
|
|
|
56300
56300
|
const startedAt = deps.now();
|
|
56301
56301
|
const base = {
|
|
56302
56302
|
evidence: scanBase.kind === "hard" ? [] : current?.evidence ?? [],
|
|
56303
|
-
// notes
|
|
56303
|
+
// notes 反过来不沿用:它是「这次扫描要老板处理的事」,沿用会把上次的事项一直复读
|
|
56304
56304
|
notes: [],
|
|
56305
56305
|
scannedAssets: [],
|
|
56306
56306
|
startedAt,
|
|
@@ -66865,7 +66865,7 @@ function computeMethodAccess(args) {
|
|
|
66865
66865
|
}
|
|
66866
66866
|
|
|
66867
66867
|
// src/version.ts
|
|
66868
|
-
var version = "0.2.
|
|
66868
|
+
var version = "0.2.505".length > 0 ? "0.2.505" : "dev";
|
|
66869
66869
|
|
|
66870
66870
|
// src/cli-probe/probe.ts
|
|
66871
66871
|
var fs77 = __toESM(require("fs"), 1);
|
|
@@ -21316,7 +21316,7 @@ var CONNECTOR_RUNNERS = ["mcp", "cli"];
|
|
|
21316
21316
|
var CONNECTOR_PROTOCOLS = ["bearer", "lark-sidecar"];
|
|
21317
21317
|
var CREDENTIAL_SOURCES = ["none", "shared", "personal"];
|
|
21318
21318
|
var CONNECTOR_AUTHS = ["oauth", "fields"];
|
|
21319
|
-
var ConnectorFieldSchema = external_exports.string().regex(/^[A-Z][A-Z0-9_]*$/, "\u8981\u586B\u7684\
|
|
21319
|
+
var ConnectorFieldSchema = external_exports.string().regex(/^[A-Z][A-Z0-9_]*$/, "\u8981\u586B\u7684\u53D8\u91CF\u540D\u53EA\u80FD\u662F\u5927\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u4E0B\u5212\u7EBF\uFF0C\u4E14\u4EE5\u5B57\u6BCD\u5F00\u5934");
|
|
21320
21320
|
var EnvConnectorSchema = external_exports.object({
|
|
21321
21321
|
name: ConnectorNameSchema,
|
|
21322
21322
|
kind: external_exports.enum(CONNECTOR_KINDS),
|
|
@@ -24095,7 +24095,7 @@ var METHOD_DOCS = {
|
|
|
24095
24095
|
},
|
|
24096
24096
|
// ---- cloud:connectors:*(云 persona 卡片上的连接器;design 2026-09-11-mcp-connector §3.8)----
|
|
24097
24097
|
"cloud:connectors:list": {
|
|
24098
|
-
summary: "\u4E91\u4E0A persona \u5361\u7247\u4E0A\u7684\u8FDE\u63A5\u5668\u533A\uFF1A\u8FD9\u4E2A persona \u58F0\u660E\u7684\u3001**\u8981\u4F7F\u7528\u8005\u672C\u4EBA\u6388\u6743\u7684**\u8FDE\u63A5\u5668\u5404\u81EA\u8FDE\u6CA1\u8FDE\u4E0A\uFF08connected / missing / reauth\uFF09\u3001\u6309\u94AE\u662F\u5173\u8054\
|
|
24098
|
+
summary: "\u4E91\u4E0A persona \u5361\u7247\u4E0A\u7684\u8FDE\u63A5\u5668\u533A\uFF1A\u8FD9\u4E2A persona \u58F0\u660E\u7684\u3001**\u8981\u4F7F\u7528\u8005\u672C\u4EBA\u6388\u6743\u7684**\u8FDE\u63A5\u5668\u5404\u81EA\u8FDE\u6CA1\u8FDE\u4E0A\uFF08connected / missing / reauth\uFF09\u3001\u6309\u94AE\u662F\u5173\u8054\uFF08OAuth\uFF0C\u5E26\u73B0\u7B97\u7684 authUrl\uFF09\u8FD8\u662F\u7C98\u8D34 API key\uFF08\u5E26\u8981\u586B\u7684\u53D8\u91CF\uFF09\u3002daemon \u62FF gateway \u767B\u8BB0\u884C + \u672C\u673A\u767B\u5F55\u51ED\u8BC1\u5411\u4E2D\u5FC3\u4EE3\u67E5\uFF0C\u51ED\u8BC1\u4E0D\u51FA ws\uFF1Bowner-only",
|
|
24099
24099
|
args: CloudConnectorsListArgsSchema
|
|
24100
24100
|
},
|
|
24101
24101
|
"cloud:connectors:fill": {
|
package/dist/persona-defaults/persona-clawd-butler/.claude/skills/scan-persona-for-deploy/SKILL.md
CHANGED
|
@@ -43,11 +43,29 @@ persona 目录,很便宜,漏了的话资产进不了镜像,容器里那条
|
|
|
43
43
|
这个 persona 如果被搬到一台**干净的 Linux 容器**里跑(没有任何人的 home 目录、没有预装工具、
|
|
44
44
|
没有任何凭据),需要事先给它备好什么,它才能正常干活?
|
|
45
45
|
|
|
46
|
+
## 云上容器已经有的
|
|
47
|
+
|
|
48
|
+
「干净」是相对的——底座镜像和容器本身已经带了下面这些。**这些一律不报 `cli`、不写进 `notes`**,
|
|
49
|
+
也别在任何上报里替它们操心(「需要 node」「得有可写目录」「登录态怎么进去」这类话都不该出现):
|
|
50
|
+
|
|
51
|
+
| 有什么 | 说明 |
|
|
52
|
+
|---|---|
|
|
53
|
+
| node 22、npm、npx | 底座镜像就是 `node:22-bookworm-slim`。npm 包型的 MCP server / CLI 只需报一条 `cli` 让它预装,node 本身不用管 |
|
|
54
|
+
| git | 底座自带 |
|
|
55
|
+
| codex | 云上唯一的引擎,底座自带 |
|
|
56
|
+
| lark-cli | 底座自带,带凭据隔离编译。飞书的登录态由**飞书连接器**在容器起来时带进去,不需要也不能在容器里 `auth login` / `config init`;persona 里写的交互式初始化步骤在云上不会走到 |
|
|
57
|
+
| 可写的工作目录 | 工作目录就是 persona 目录(`/opt/bundle/persona`),可写,临时文件随手落;另有 `/workspace` 持久卷,同一个使用者用同一个 persona 时跨容器保留 |
|
|
58
|
+
| 一个容器最长 2 小时 | 到点 k8s 收掉。长连接类命令(事件监听、机器人入会)在这个上限内正常跑 |
|
|
59
|
+
|
|
60
|
+
出网策略这里不列(它不在仓库里定)。**但「如果有出网限制的话可能…」这种话也不要写**——见收尾那节:
|
|
61
|
+
拿不准的事去查清,查不清的不写。
|
|
62
|
+
|
|
46
63
|
## 读什么
|
|
47
64
|
|
|
48
65
|
主体是任务里给你的 persona 目录,把里面的**全部文本**读完:
|
|
49
66
|
|
|
50
|
-
- `CLAUDE.md` / `AGENTS.md
|
|
67
|
+
- `CLAUDE.md` / `AGENTS.md`——人格与操作指引,依赖大多写在这里。两份是镜像(daemon 双写),读一份即可;
|
|
68
|
+
上报时叫它「人格」,别写文件名(见 evidence 一节)
|
|
51
69
|
- `.claude/skills/**/SKILL.md` 及 skill 附带的脚本
|
|
52
70
|
- `.mcp.json`——挂了哪些 MCP server,怎么启动、要什么参数
|
|
53
71
|
- 目录里的任何脚本、模板、配置样例
|
|
@@ -157,10 +175,13 @@ call({ method: "deploy:reportFinding", args: {
|
|
|
157
175
|
|
|
158
176
|
### evidence —— 每条的来历
|
|
159
177
|
|
|
160
|
-
- `reason`:**一句人话**,说清「为什么需要它 + 你从哪看出来的」,写给不熟悉这个 persona
|
|
178
|
+
- `reason`:**一句人话**,说清「为什么需要它 + 你从哪看出来的」,写给不熟悉这个 persona 的人看——
|
|
179
|
+
部署的人不一定是开发者,别用内部词、别解释机制。
|
|
161
180
|
- 好:「发布脚本用它解析 aliyun CLI 返回的 JSON,没有它 publish 走不到底」
|
|
162
181
|
- 差:「publish.sh 里用到了 python3」(复述原文,没说清为什么要)
|
|
163
182
|
- 差:「用于 JSON 解析」(太短,看不出跟这个 persona 有什么关系)
|
|
183
|
+
- 人格文件在 `reason` / `notes` 里叫「人格」(「人格里写着发布走 publish.sh」),**不写 `CLAUDE.md` / `AGENTS.md`**:
|
|
184
|
+
两份是镜像,老板的 persona 跑的是 codex,看见 `CLAUDE.md` 会糊涂。`file` 照实填真路径,那是给展开核对用的
|
|
164
185
|
- `file`:persona 目录内的相对路径,或资产名开头的路径
|
|
165
186
|
- `quote`:原文摘一两句,**引原文不要转述**(老板起疑时展开核对用)
|
|
166
187
|
|
|
@@ -211,16 +232,46 @@ call({ method: "deploy:finishScan", args: {
|
|
|
211
232
|
}})
|
|
212
233
|
```
|
|
213
234
|
|
|
214
|
-
**`notes`** ——
|
|
215
|
-
|
|
216
|
-
|
|
235
|
+
**`notes`** —— 页面上叫「上云前要你处理的」。**一条 = 一件老板必须亲手做、不做就上不了云(或上去也是坏的)的事。**
|
|
236
|
+
写法:一两句话,先说要他做什么,再说不做会怎样。写给不是开发者的人看,别用内部词、别解释机制。
|
|
237
|
+
|
|
238
|
+
门槛,三条都过了才写:
|
|
239
|
+
|
|
240
|
+
1. **不做就不行**:不解决,persona 在云上跑不起来或核心动作是断的。「可能不太顺」「建议优化」不算。
|
|
241
|
+
2. **只有老板能做**:要他改 persona、换一个服务、去别处申请点什么。**你自己能查清的先查清**——读文件、
|
|
242
|
+
看 `--help`、上网查,查完要么进清单(cli / secret / asset / connector 各有位置),要么没事,都不是 note。
|
|
243
|
+
3. **确定,不是猜**:你真读到了、真查到了。带「如果 / 可能 / 大概率」的句子写不出来就对了——拿不准就去查,
|
|
244
|
+
查不清就不写。
|
|
245
|
+
|
|
246
|
+
不写的:
|
|
247
|
+
|
|
248
|
+
- 「云上容器已经有的」那节里的东西(node、可写目录、飞书登录态……)
|
|
249
|
+
- 你自己的推理过程(「我按底座已有 node 处理」「我没报这条是因为…」)
|
|
250
|
+
- 空结论(「两份共享资产都没用到」「没发现需要凭据的地方」)——没有就是没有,老板不需要知道你检查过
|
|
251
|
+
- 已经报进清单的东西再说一遍
|
|
252
|
+
|
|
253
|
+
反例(一次真实扫描里的五条,全部不该写):
|
|
254
|
+
|
|
255
|
+
| 写了什么 | 为什么不该 |
|
|
256
|
+
|---|---|
|
|
257
|
+
| 两份共享资产都没用到:persona 目录里没有 .mcp.json… | 空结论 |
|
|
258
|
+
| 人格里的初始化流程(lark-cli config init / auth login)是交互式,得靠飞书连接器把登录态带进去 | 容器已有:飞书登录态本来就是连接器带进去的,交互式步骤不会走到 |
|
|
259
|
+
| whiteboard-cli 是 npm 包运行需要 node,我按底座已有 node 处理、没单报一条 | 容器已有 + 自述推理 |
|
|
260
|
+
| lark-event 是长连接,云上容器有执行时长上限或出网限制的话可能跑不完整 | 猜测;且 2 小时上限在「已有」那节 |
|
|
261
|
+
| 画板上传会落临时文件,容器里需要一个可写的工作目录 | 容器已有 |
|
|
262
|
+
|
|
263
|
+
正例:「人格里的『同步文档』这一步要先在浏览器里手动登录 Notion 再跑脚本,云上没有浏览器——把它换成用
|
|
264
|
+
token 的方式,或者把这一步从人格里去掉」;「`s` 这个工具官方文档和包源都没找到 Linux 装法,查了 npm /
|
|
265
|
+
GitHub release / apt,你得告诉我它从哪装」。
|
|
266
|
+
|
|
267
|
+
没有就空数组,**空数组是常态**。
|
|
217
268
|
|
|
218
269
|
调完 `finishScan` 页面就从「分析中」转成可编辑的清单,你的活就结束了。
|
|
219
270
|
|
|
220
271
|
## 纪律
|
|
221
272
|
|
|
222
273
|
- **只读不写**:不要修改被扫 persona 目录里的任何文件,不要执行它的脚本。
|
|
223
|
-
-
|
|
224
|
-
|
|
274
|
+
- **宁缺毋滥**:拿不准的去查清,不要编一条依赖进清单;查清了、且过得了 `notes` 那三道门槛的才是 note。
|
|
275
|
+
多报一条假依赖会让镜像装一堆没用的东西;漏报一条真依赖,云上试跑和用起来会发现,补一行再发一次就行。
|
|
225
276
|
- **没调 `finishScan` 就等于没扫完**——中途卡住也要调,把卡在哪写进 `notes`,别让页面一直停在
|
|
226
277
|
「分析中」。
|