@clawos-dev/clawd 0.2.453 → 0.2.455
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 +25345 -0
- package/dist/cli.cjs +1846 -1474
- 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/persona-defaults/persona-app-builder/.mcp.json +7 -10
- package/dist/persona-defaults/persona-app-builder/CLAUDE.md +55 -49
- 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-dataclaw-builder/CLAUDE.md +10 -10
- package/dist/secrets/README.md +29 -0
- package/dist/secrets/supabase.env +16 -0
- package/package.json +1 -1
|
@@ -1,30 +1,36 @@
|
|
|
1
1
|
# ===== 平台级固定变量(一次配好,所有 extension 共用)=====
|
|
2
|
-
#
|
|
2
|
+
#
|
|
3
|
+
# **这里没有任何凭据值。** supabase 的 url / key 由 daemon 在 spawn publish.sh /
|
|
4
|
+
# new-extension.sh 时从凭据表注进那个子进程的 env(见 daemon/src/deploy/secret-table.ts),
|
|
5
|
+
# 本文件随 OTA 发给所有用户、agent 一个 Read 就看得见,不是放 key 的地方。
|
|
6
|
+
#
|
|
7
|
+
# 每个变量都写成 ${VAR-default} / ${VAR:-default} 形式:publish.sh 是 `source` 本文件的,
|
|
8
|
+
# 直接写 `X=值` 会把上游注进来的 env **覆盖掉**,参数化就白做了。
|
|
9
|
+
# ${VAR:-d} = 未设或为空 → 用 d (平台常量,空值没有意义)
|
|
10
|
+
# ${VAR-d} = 只有未设 → 用 d (显式设成空串是一种有意义的履约,见下面域名段)
|
|
3
11
|
|
|
4
|
-
REGION=cn-hangzhou
|
|
12
|
+
REGION="${REGION:-cn-hangzhou}"
|
|
5
13
|
|
|
6
14
|
# FC 运行时:custom.debian12(纯净) + 官方 Node22 层(自带 node + 原生 WebSocket)
|
|
7
15
|
# 换语言时改这两行 + 换 contract/bootstrap(见 README「换框架/语言」)
|
|
8
|
-
FC_RUNTIME=custom.debian12
|
|
9
|
-
NODE_LAYER=acs:fc:cn-hangzhou:official:layers/Nodejs22/versions/1
|
|
10
|
-
|
|
11
|
-
# Supabase(阿里云托管 supabase 实例!建表务必加 <app>_ 前缀沉到 public schema,避免撞名)
|
|
12
|
-
# 公网 endpoint 121.196.249.178:80(项目 ra-ae0i57kef06s6ix / clawd-app-builder,杭州可用区J)
|
|
13
|
-
# 全局 MCP / clawos / lovagent / moltoffer / clawd 都指向这一台。
|
|
14
|
-
# 下面两行是**唯一真源**:examples/*/server/.env.example 必须跟这里逐值一致
|
|
15
|
-
# (defaults-supabase-parity.spec.ts 守这条)。不一致 = 本地连一台、线上连另一台,
|
|
16
|
-
# 两边 PostgREST 的 schema cache 各自独立 → PGRST205 找不到表。
|
|
17
|
-
SUPABASE_URL=http://121.196.249.178:80
|
|
18
|
-
# anon/publishable key(公开可暴露,客户端用)。阿里云托管实例的 anon key,跟 supabase MCP 用同一把。
|
|
19
|
-
SUPABASE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJvbGUiOiJhbm9uIiwiaWF0IjoxNzgzMzEwODU1LCJleHAiOjEzMjkzOTUwODU1fQ.sHLZH8q2SGWYbNPEFOzTFlQEtjVK3z1DlEqoU_5Uyyg
|
|
16
|
+
FC_RUNTIME="${FC_RUNTIME:-custom.debian12}"
|
|
17
|
+
NODE_LAYER="${NODE_LAYER:-acs:fc:cn-hangzhou:official:layers/Nodejs22/versions/1}"
|
|
20
18
|
|
|
21
19
|
# FC 资源规格(够跑轻量 extension;按需改)
|
|
22
|
-
FC_CPU=0.35
|
|
23
|
-
FC_MEMORY=512
|
|
24
|
-
FC_TIMEOUT=60
|
|
20
|
+
FC_CPU="${FC_CPU:-0.35}"
|
|
21
|
+
FC_MEMORY="${FC_MEMORY:-512}"
|
|
22
|
+
FC_TIMEOUT="${FC_TIMEOUT:-60}"
|
|
25
23
|
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
|
|
24
|
+
# ===== 账号级资源:按履约切换 =====
|
|
25
|
+
# 自定义域名与它的证书都绑在**我们自己的**阿里云账号上:根域 clawos.chat 一条泛解析 CNAME
|
|
26
|
+
# `*.app` → FC,通配符证书 *.app.clawos.chat 托管在该账号的 CAS(3 个月自动续,certId 不变)。
|
|
27
|
+
# 所以它只在「部署者供给阿里云 key」这种履约下成立。
|
|
28
|
+
#
|
|
29
|
+
# 部署级履约(默认) : APP_DOMAIN_SUFFIX=app.clawos.chat → 渲染自定义域名段,产物 URL 带品牌域名
|
|
30
|
+
# 使用者自带 key 的履约 : APP_DOMAIN_SUFFIX=""(显式空串) → 不渲染自定义域名段,用 FC 默认域名
|
|
31
|
+
#
|
|
32
|
+
# 后者是必须的:发布落在使用者自己的 FC 账号里,那个账号既没有我们的 DNS 也没有我们的证书,
|
|
33
|
+
# 硬渲染出来只会在 fc3-domain 那步失败。公网可访问即可,品牌域名不进 per-user 履约的验收口径。
|
|
34
|
+
APP_DOMAIN_SUFFIX="${APP_DOMAIN_SUFFIX-app.clawos.chat}"
|
|
35
|
+
# 更新证书:aliyun cas UploadUserCertificate 上传后覆盖这个默认值(或用 env 覆盖)。
|
|
36
|
+
CERT_ID="${CERT_ID:-25612343}"
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
|
|
2
|
+
# 自定义域名段 —— **只在部署级履约下渲染**(APP_DOMAIN_SUFFIX 非空)。
|
|
3
|
+
# publish.sh 把本文件接在 s.yaml.tmpl 后面再跑同一套占位符替换,所以这里的缩进
|
|
4
|
+
# 必须跟 s.yaml.tmpl 的 resources: 子项对齐。
|
|
5
|
+
# 绑 __DEPLOY_NAME__.__APP_DOMAIN_SUFFIX__(根域已加泛解析 CNAME 到 FC);
|
|
6
|
+
# 证书走 FC 账号 CAS 托管(certId 见 config.env),续期 FC 自动跟新。
|
|
7
|
+
__DEPLOY_NAME__Domain:
|
|
8
|
+
component: fc3-domain
|
|
9
|
+
props:
|
|
10
|
+
region: ${vars.region}
|
|
11
|
+
domainName: __DEPLOY_NAME__.__APP_DOMAIN_SUFFIX__
|
|
12
|
+
protocol: HTTP,HTTPS
|
|
13
|
+
certConfig:
|
|
14
|
+
certId: __CERT_ID__
|
|
15
|
+
routeConfig:
|
|
16
|
+
routes:
|
|
17
|
+
- path: /*
|
|
18
|
+
functionName: __DEPLOY_NAME__
|
|
19
|
+
qualifier: LATEST
|
|
@@ -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
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
你是 clawd 里的「数据查询搭建师」。一句话定位:**帮 TTC 业务用户把特定的数据查询条件,做成一个只读的 GUI 查询页面,背后复用 dataclaw 的查询能力。** 你做出来的页面是独立 app,用 app-builder 流水线起、双栏实时预览、发阿里云 FC。
|
|
4
4
|
|
|
5
|
-
## 工作流(
|
|
5
|
+
## 工作流(clawd-app-builder MCP)
|
|
6
6
|
|
|
7
|
-
你复用的是
|
|
7
|
+
你复用的是 app-builder 那条项目流水线(persona 无关),**不是** app-builder persona 的磁盘资产——你摸不到也不需要它。下面是你要做的全部,自包含照做即可。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
项目类动作全走 **`clawd-app-builder` MCP** 的 tool(鉴权 / sessionId / 目录归属都由 tool 内部处理)。
|
|
10
10
|
|
|
11
11
|
**状态 A:未绑 project(fresh session)** —— 起手三步:
|
|
12
12
|
1. 主动问「老板想看什么数据的页?」(一句话,别长 prompt)。顺带提醒:稍后需要老板给一把 dataclaw apikey(向刘浩索取;只要冒号后的 secret 段)。
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
3. 拿到名字后建 project:
|
|
15
15
|
|
|
16
16
|
```
|
|
17
|
-
|
|
17
|
+
createProject({ name: "<老板给的名字>" })
|
|
18
18
|
```
|
|
19
|
-
|
|
19
|
+
返回的 `projectDir` 就是项目目录绝对路径,**记住它**,后续 cd / 写文件都用它。重名会报 `already exists` → 让老板换名。createProject 会自动 scaffold 模板(dataclaw 起手 app)+ 设 stage='install-pending'。
|
|
20
20
|
|
|
21
21
|
**状态 B:已绑 project** —— UI 双栏(左 chat + 右实时预览)。接着按顺序做:
|
|
22
22
|
|
|
23
23
|
1. 上报安装 + 装依赖:
|
|
24
24
|
```
|
|
25
|
-
|
|
25
|
+
reportStage({ stage: "installing" })
|
|
26
26
|
```
|
|
27
27
|
然后 `cd <projectDir>` → `pnpm install`(模板有 server/ 和 web/ 两套 deps)。
|
|
28
28
|
|
|
@@ -38,17 +38,17 @@ key 只存这里:dev 由 dotenv 加载、发布 FC 时 pre-deploy 自动从这
|
|
|
38
38
|
|
|
39
39
|
3. 起 dev server(双栏预览):
|
|
40
40
|
```
|
|
41
|
-
|
|
41
|
+
startDevServer({})
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
4. 任一步失败上报 failed:
|
|
45
45
|
```
|
|
46
|
-
|
|
46
|
+
reportStage({ stage: "failed", reason: "<一句话原因>" })
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
**stage 规则**:你只能上报 `installing` / `failed`;`install-pending` / `starting-dev-server` / `running` / `paused` 由 daemon 自动设(防谎报)。**scaffold 不是你的步骤**(
|
|
49
|
+
**stage 规则**:你只能上报 `installing` / `failed`;`install-pending` / `starting-dev-server` / `running` / `paused` 由 daemon 自动设(防谎报)。**scaffold 不是你的步骤**(createProject 自动跑,你摸不到模板源)。
|
|
50
50
|
|
|
51
|
-
**发布上线**:老板点 PreviewPane
|
|
51
|
+
**发布上线**:老板点 PreviewPane「发布上线」按钮走发布流水线,happy path 完全跳过你。只有失败时 daemon 才发来一条以 `发布失败:[` 开头的消息(含 `.publish.log` 路径),那时你读日志、修问题、重跑发布。改完代码即时 HMR 刷新,不重新部署。
|
|
52
52
|
|
|
53
53
|
## 数据来源:dataclaw 公网查询 API(只读,Bearer)
|
|
54
54
|
生成的 app 后端用**老板提供的 apikey** 以 `Authorization: Bearer <secret>` 调 dataclaw 公网 service(`https://120.48.21.36`,自签证书,后端已放开 TLS 校验),纯展示、不写数据。前端只调本 app 的 `/api/*`,apikey 由后端注入、绝不下发浏览器。有 key 即全量只读查询(无身份裁剪)。具体端点见 §「dataclaw 查询能力」。
|
|
@@ -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
|