@clawos-dev/clawd 0.2.454 → 0.2.456
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 +43 -8
- package/dist/cli.cjs +1153 -904
- package/dist/deploy-kit/scripts/new-extension.sh +25 -0
- package/dist/deploy-kit/scripts/publish.sh +92 -16
- package/dist/deploy-kit/scripts/publish.spec.ts +138 -1
- package/dist/deploy-kit/scripts/verify.sh +16 -5
- package/dist/dispatch/mcp-server.cjs +31 -3
- package/dist/persona-defaults/persona-app-builder/.mcp.json +7 -10
- package/dist/persona-defaults/persona-app-builder/CLAUDE.md +17 -10
- package/dist/persona-defaults/persona-app-builder/extension-kit/config.env +28 -22
- package/dist/persona-defaults/persona-app-builder/extension-kit/contract/s.yaml.domain.tmpl +19 -0
- package/dist/persona-defaults/persona-app-builder/extension-kit/contract/s.yaml.tmpl +4 -16
- package/dist/persona-defaults/persona-app-builder/extension-kit/examples/nestjs-react/server/.env.example +7 -6
- package/dist/persona-defaults/persona-master/CLAUDE.md +68 -0
- package/dist/secrets/README.md +29 -0
- package/dist/secrets/supabase.env +16 -0
- package/dist/share-ui/assets/{guest-Dh-ssMM-.js → guest-joTJl1Mi.js} +133 -133
- package/dist/share-ui/guest.html +1 -1
- package/package.json +1 -1
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
# __APP_NAME__ = 用户给的项目名(描述/可读用)
|
|
6
6
|
# __DEPLOY_NAME__ = APP_NAME-<4位 slug>,FC functionName / 子域名 / s 项目名/资源 key 走这个
|
|
7
7
|
# 保证多用户/多副本同名时不撞 FC 函数 + 不撞域名
|
|
8
|
+
#
|
|
9
|
+
# **自定义域名段不在本文件里**,在同目录的 s.yaml.domain.tmpl。publish.sh 只在
|
|
10
|
+
# APP_DOMAIN_SUFFIX 非空时把那一段接到本文件后面再渲染 —— 使用者自带阿里云 key 时
|
|
11
|
+
# 那个账号没有我们的 DNS 与证书,渲染出来必挂(见 config.env 的「账号级资源:按履约切换」)。
|
|
8
12
|
edition: 3.0.0
|
|
9
13
|
name: __DEPLOY_NAME__-app
|
|
10
14
|
# clawd 自己的 Serverless Devs profile,写在 deploy-kit 私有 s-home 里(见 scripts/ensure-credentials.sh)。
|
|
@@ -46,19 +50,3 @@ resources:
|
|
|
46
50
|
triggerConfig:
|
|
47
51
|
authType: anonymous
|
|
48
52
|
methods: [GET, POST, PUT, DELETE, HEAD]
|
|
49
|
-
|
|
50
|
-
# 自定义域名:绑 *.app.clawos.chat 子域名(根域 DNS 已加泛解析 CNAME 到 FC)
|
|
51
|
-
# 证书走 FC 账号 CAS 托管(certId 在 config.env 里),续期 FC 自动跟新
|
|
52
|
-
__DEPLOY_NAME__Domain:
|
|
53
|
-
component: fc3-domain
|
|
54
|
-
props:
|
|
55
|
-
region: ${vars.region}
|
|
56
|
-
domainName: __DEPLOY_NAME__.app.clawos.chat
|
|
57
|
-
protocol: HTTP,HTTPS
|
|
58
|
-
certConfig:
|
|
59
|
-
certId: __CERT_ID__
|
|
60
|
-
routeConfig:
|
|
61
|
-
routes:
|
|
62
|
-
- path: /*
|
|
63
|
-
functionName: __DEPLOY_NAME__
|
|
64
|
-
qualifier: LATEST
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
#
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
# supabase 连接串的**唯一真源是 daemon 的凭据表**(`~/.clawd/secrets/` 覆盖 clawd 自带那份)。
|
|
2
|
+
# 本文件是模板:scaffold(new-extension.sh)把下面的占位引用展开成同目录的 `.env` 给本地 dev 用;
|
|
3
|
+
# 线上那份由 publish.sh 渲进 s.yaml 的 environmentVariables。两条路取同一张表的同一个变量名,
|
|
4
|
+
# 所以不会出现「本地连一台、线上连另一台」的漂移(那会表现成 PGRST205 找不到表)。
|
|
5
|
+
# 要换实例改凭据表,别改这里的值——改了下次 scaffold 就被覆盖回去。
|
|
6
|
+
SUPABASE_URL=${SUPABASE_URL}
|
|
7
|
+
SUPABASE_KEY=${SUPABASE_KEY}
|
|
7
8
|
PORT=3000
|
|
@@ -154,6 +154,74 @@ worker 干到一半上报「答不了的问题」(它会以回报形式带出
|
|
|
154
154
|
先自己判断——你是任务源头,多数问题你能答,答了就续派回注。答不了 → 停下上报老板拍板。
|
|
155
155
|
**不许用未经确认的假设擅自解锁一条挂起的线**——除非该假设来自设定里的预授权或老板临场拍板。
|
|
156
156
|
|
|
157
|
+
### 6.1 决策留痕:代老板确认与向老板升级(硬性)
|
|
158
|
+
|
|
159
|
+
worker 的问题不能只在对话里一闪而过。你每次替老板作出判断,或因为判断不了而停线,
|
|
160
|
+
都必须在**作出动作的当下**用 `topic:append` 记录一条决策;普通的派活、收结果、进度更新
|
|
161
|
+
仍按下面「落账纪律」记录,**不要给每条普通流水都加 `decision`**。
|
|
162
|
+
|
|
163
|
+
#### 你能独立判断时:记录 `master-confirmed`
|
|
164
|
+
|
|
165
|
+
只有设定中已有预授权、或问题完全落在本话题已确认的目标/边界/验收标准内,才可以代老板
|
|
166
|
+
确认。先落账并确认 RPC 成功,再把决定回注给对应 worker;落账失败就停下并上报,不能无痕继续:
|
|
167
|
+
|
|
168
|
+
mcp__clawd-rpc__call({ method: 'topic:append', args: {
|
|
169
|
+
topicId, action: '代老板确认:采用方案 A', target: '<lineId>',
|
|
170
|
+
reason: '方案 A 符合已确认的边界 <边界>,不会触碰 <风险>;因此无需打扰老板',
|
|
171
|
+
decision: {
|
|
172
|
+
type: 'master-confirmed', status: 'resolved',
|
|
173
|
+
question: 'worker 提出的问题原文', recommendation: '最终采用的决定',
|
|
174
|
+
},
|
|
175
|
+
}})
|
|
176
|
+
|
|
177
|
+
`target` 必须指向提出问题的 worker lane;`question` 保留问题原文,`recommendation` 写实际
|
|
178
|
+
采取的决定。`reason` 不能只写「符合预授权」,要指出对应哪条边界/标准以及排除了什么风险。
|
|
179
|
+
|
|
180
|
+
#### 你不能独立判断时:记录 `owner-needed` 并停线
|
|
181
|
+
|
|
182
|
+
遇到设定没有覆盖、目标或边界有两种合理解释、会造成不可逆外部影响,或你判断「可能判断错」
|
|
183
|
+
时,**禁止猜测后继续**。先停止给对应 lane 续派;如果 worker 仍在运行,先按下面的方式温柔中断,
|
|
184
|
+
再落账。任何 RPC 失败都要保持暂停并把失败原因一并上报:
|
|
185
|
+
|
|
186
|
+
mcp__clawd-rpc__call({ method: 'session:interrupt', args: {
|
|
187
|
+
sessionId: '<该线的 workerSessionId>',
|
|
188
|
+
}})
|
|
189
|
+
|
|
190
|
+
`session:interrupt` 只结束当前 worker turn,不杀会话、不丢上下文;恢复时仍复用原
|
|
191
|
+
`dispatchId`。如果该调用失败,不能假定 worker 已停下;仍要追加下面的 `owner-needed`
|
|
192
|
+
记录,并在 `reason` 里写明中断失败,继续保持不续派。
|
|
193
|
+
|
|
194
|
+
mcp__clawd-rpc__call({ method: 'topic:append', args: {
|
|
195
|
+
topicId, action: '需要老板拍板:<一句话问题>', target: '<lineId>',
|
|
196
|
+
reason: '现有设定同时允许 <A> 与 <B>,继续执行可能导致 <具体后果>,我无法安全代判',
|
|
197
|
+
decision: {
|
|
198
|
+
type: 'owner-needed', status: 'open',
|
|
199
|
+
question: '请老板在 <选项 A> / <选项 B> 中选择(附必要上下文)',
|
|
200
|
+
recommendation: '如无额外偏好,我建议 <选项>,因为 <理由>',
|
|
201
|
+
},
|
|
202
|
+
}})
|
|
203
|
+
|
|
204
|
+
然后向老板报告这条待决策项,并等待明确答复;不要用普通 `topic:append` 假装已经解决。
|
|
205
|
+
如果 worker 已经 idle,则不需要额外 RPC;只是不再给该 `dispatchId` 续派,等老板答复。
|
|
206
|
+
老板答复后,先把答复原样记录成同一 `target` 的已解决决策,再用**同一个 `dispatchId`**
|
|
207
|
+
续派可执行指令;不要新建第二条线。`session:interrupt` 失败时不能当作已经停住。
|
|
208
|
+
记录已解决决策的调用仍走 `topic:append`:
|
|
209
|
+
|
|
210
|
+
mcp__clawd-rpc__call({ method: 'topic:append', args: {
|
|
211
|
+
topicId, action: '按老板决定:<一句话结论>', target: '<lineId>',
|
|
212
|
+
reason: '老板明确选择了 <选项>,因此按该选择恢复这条线',
|
|
213
|
+
decision: {
|
|
214
|
+
type: 'owner-needed', status: 'resolved',
|
|
215
|
+
question: '<原待决策问题>', recommendation: '老板最终选择:<选项>',
|
|
216
|
+
},
|
|
217
|
+
}})
|
|
218
|
+
|
|
219
|
+
随后才用原 `dispatchId` 续派。决策记录落账失败就不要继续派活,先上报失败原因。
|
|
220
|
+
决策 tab 会据此保留完整的「提出问题 → 得到结论」轨迹。
|
|
221
|
+
|
|
222
|
+
这两类记录是老板在话题「决策」tab 里唯一关注的内容:没有 `decision` 的旧流水不会出现在
|
|
223
|
+
该 tab,但仍保存在话题外部大脑中,供你用 `topic:get` 重建现场。
|
|
224
|
+
|
|
157
225
|
### 7. 收敛与上报
|
|
158
226
|
|
|
159
227
|
`topic:accept` 返回 `allAccepted: true` → 合并 → 自己先验一遍 → 交付。
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# `src/secrets/` —— 随 OTA 下发的共享凭据表
|
|
2
|
+
|
|
3
|
+
这里的每个 `<name>.env` 是一条**命名凭据**的值,`name` 对齐环境清单
|
|
4
|
+
(`EnvironmentManifest.secrets[].name`)。daemon 在 spawn 时把它们合成一张
|
|
5
|
+
`Record<envName, value>`,只交给**真正用它的那个子进程**(MCP server / deploy-kit 发布脚本),
|
|
6
|
+
agent 主进程 env 一条都不放。读法与合并顺序见 `../deploy/secret-table.ts`。
|
|
7
|
+
|
|
8
|
+
## 为什么单独一个目录,而不是继续写在 persona bundle 里
|
|
9
|
+
|
|
10
|
+
原先 supabase 的 url / anon / service-role 是**明文 CLI 参数**硬写在
|
|
11
|
+
`persona-app-builder/.mcp.json` 里的。那个文件在 persona 目录下,agent 一个 `Read` 就看得见
|
|
12
|
+
——等于每次会话都把 key 摊给模型。挪到这里之后:
|
|
13
|
+
|
|
14
|
+
- persona 目录(agent 的 cwd 及其上级)里没有任何凭据值;
|
|
15
|
+
- 「哪些 key 随 OTA 下发」在**目录层面就是可数的**——将来做收敛(见
|
|
16
|
+
`doc/glossary/persona-cloud.md` 的「随 OTA 下发的凭据 = 公开凭据」)时,要删的就是这个目录。
|
|
17
|
+
|
|
18
|
+
## 信任层级:这里的每一把 key 都等于公开
|
|
19
|
+
|
|
20
|
+
本目录随 npm 包 ship 给所有用户,跟 `deploy-kit/.secrets/aliyun.env` 同级。判断风险时按
|
|
21
|
+
「这把 key 落在所有用户手上」算。把 service-role key 换成受限 role 的收敛方向记在 glossary,
|
|
22
|
+
不在 M1b 范围。
|
|
23
|
+
|
|
24
|
+
## 本机覆盖
|
|
25
|
+
|
|
26
|
+
`~/.clawd/secrets/<name>.env` 覆盖同名条目(逐个 env 变量覆盖,不是整份替换)。用途:
|
|
27
|
+
部署者用自己的 supabase 实例、或轮换出新 key 又不想等 OTA。该目录不随 OTA 覆盖。
|
|
28
|
+
|
|
29
|
+
云上没有这两个文件——gateway 起 Pod 时把同一张表经容器 env 交进来,走同一个交付点。
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# supabase —— 阿里云托管 supabase 实例(公网 endpoint 121.196.249.178:80,
|
|
2
|
+
# 项目 ra-ae0i57kef06s6ix / clawd-app-builder,杭州可用区J)。
|
|
3
|
+
# 消费方两处,都经 daemon 的凭据表交付、都不落 persona 目录:
|
|
4
|
+
# - supabase MCP server(persona-app-builder/.mcp.json 的 ${...} 占位)
|
|
5
|
+
# —— @aliyun-rds/supabase-mcp-server 的 commander option 默认值就读这三个名字,
|
|
6
|
+
# 所以不再传 --supabase-* CLI 参数(参数会出现在 ps 输出里)。
|
|
7
|
+
# - deploy-kit 的 publish.sh / new-extension.sh(渲染进 s.yaml 的 environmentVariables
|
|
8
|
+
# 与项目 server/.env)—— 那两处历史上叫 SUPABASE_KEY,值同 anon。
|
|
9
|
+
#
|
|
10
|
+
# **不放 JWT 签发密钥**:它能自签任意 role / 任意 user 的 token(含 service_role),
|
|
11
|
+
# 下发出去等于把 anon/service key 的轮换能力一起交出去;而 MCP server 里它唯一的用处是
|
|
12
|
+
# verify_jwt_secret 这个自检工具报个 found/preview。摘掉零功能损失。
|
|
13
|
+
SUPABASE_URL=http://121.196.249.178:80
|
|
14
|
+
SUPABASE_ANON_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJvbGUiOiJhbm9uIiwiaWF0IjoxNzgzMzEwODU1LCJleHAiOjEzMjkzOTUwODU1fQ.sHLZH8q2SGWYbNPEFOzTFlQEtjVK3z1DlEqoU_5Uyyg
|
|
15
|
+
SUPABASE_SERVICE_ROLE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJvbGUiOiJzZXJ2aWNlX3JvbGUiLCJpYXQiOjE3ODMzMTA4NTUsImV4cCI6MTMyOTM5NTA4NTV9.MdlymSh0DaJdiOVRmM3QnukUDtkOf_Eljh8_fpdLi8Q
|
|
16
|
+
SUPABASE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJvbGUiOiJhbm9uIiwiaWF0IjoxNzgzMzEwODU1LCJleHAiOjEzMjkzOTUwODU1fQ.sHLZH8q2SGWYbNPEFOzTFlQEtjVK3z1DlEqoU_5Uyyg
|