@clawos-dev/clawd 0.2.124 → 0.2.125
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/cli.cjs +6 -6
- package/dist/persona-defaults/persona-app-builder/.mcp.json +15 -0
- package/dist/persona-defaults/persona-app-builder/CLAUDE.md +5 -2
- package/dist/persona-defaults/persona-app-builder/extension-kit/config.env +8 -5
- package/dist/persona-defaults/persona-app-builder/extension-kit/examples/nestjs-react/server/.env.example +5 -2
- package/dist/persona-defaults/persona-app-builder/extension-kit/examples/nestjs-react/server/package.json +1 -0
- package/dist/persona-defaults/persona-app-builder/extension-kit/examples/nestjs-react/server/src/main.ts +12 -2
- package/dist/persona-defaults/persona-app-builder/extension-kit/examples/nestjs-react/server/src/polyfill.ts +7 -0
- package/dist/persona-defaults/persona-bug-fixer/.mcp.json +15 -0
- package/dist/persona-defaults/persona-bug-fixer/CLAUDE.md +4 -26
- package/dist/persona-defaults/persona-developer/.mcp.json +15 -0
- package/dist/persona-defaults/persona-developer/CLAUDE.md +4 -26
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -34926,7 +34926,7 @@ function copyBundleExtras(srcDir, dstDir) {
|
|
|
34926
34926
|
}
|
|
34927
34927
|
}
|
|
34928
34928
|
}
|
|
34929
|
-
var
|
|
34929
|
+
var DAEMON_MANAGED_PATHS = ["extension-kit", "CLAUDE.md", ".mcp.json"];
|
|
34930
34930
|
function refreshDaemonManagedDirs(args) {
|
|
34931
34931
|
const entries = args.entries ?? DEFAULT_PERSONAS;
|
|
34932
34932
|
for (const entry of entries) {
|
|
@@ -34934,20 +34934,20 @@ function refreshDaemonManagedDirs(args) {
|
|
|
34934
34934
|
if (!fs9.existsSync(bundleDir)) continue;
|
|
34935
34935
|
const personaDir = args.store.personaDirPath(entry.personaId);
|
|
34936
34936
|
if (!fs9.existsSync(personaDir)) continue;
|
|
34937
|
-
for (const
|
|
34938
|
-
const srcPath = path11.join(bundleDir,
|
|
34937
|
+
for (const relPath of DAEMON_MANAGED_PATHS) {
|
|
34938
|
+
const srcPath = path11.join(bundleDir, relPath);
|
|
34939
34939
|
if (!fs9.existsSync(srcPath)) continue;
|
|
34940
|
-
const dstPath = path11.join(personaDir,
|
|
34940
|
+
const dstPath = path11.join(personaDir, relPath);
|
|
34941
34941
|
try {
|
|
34942
34942
|
fs9.cpSync(srcPath, dstPath, { recursive: true, force: true, dereference: true });
|
|
34943
34943
|
args.logger.info("persona.refresh.synced", {
|
|
34944
34944
|
personaId: entry.personaId,
|
|
34945
|
-
|
|
34945
|
+
path: relPath
|
|
34946
34946
|
});
|
|
34947
34947
|
} catch (err) {
|
|
34948
34948
|
args.logger.warn("persona.refresh.failed", {
|
|
34949
34949
|
personaId: entry.personaId,
|
|
34950
|
-
|
|
34950
|
+
path: relPath,
|
|
34951
34951
|
error: err instanceof Error ? err.message : String(err)
|
|
34952
34952
|
});
|
|
34953
34953
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "preinstall ship 进 daemon defaults,daemon 启动时 refreshDaemonManagedDirs 把这文件同步到 ~/.clawd*/personas/persona-app-builder/.mcp.json。cc CLI 启动时(cwd=projects/<name>/)会向上找 persona dir 的 .mcp.json 自动加载。用 @aliyun-rds/supabase-mcp-server(阿里云 RDS 包装,跟 clawos / lovagent / extension-kit 一致),底下连阿里云自建 supabase 实例 120.26.157.138。AK 是共享 demo 凭证(跟 .secrets/aliyun.env 同性质,PR #808 设计前提),跟 lovagent .mcp.json 用同一把(RDS 权限)。",
|
|
3
|
+
"mcpServers": {
|
|
4
|
+
"supabase": {
|
|
5
|
+
"type": "stdio",
|
|
6
|
+
"command": "npx",
|
|
7
|
+
"args": [
|
|
8
|
+
"@aliyun-rds/supabase-mcp-server",
|
|
9
|
+
"--aliyun-ak", "LTAI5tSebp9pyBLk2nxF5wDg",
|
|
10
|
+
"--aliyun-sk", "DnkOBhZ9pLympYlwcLuQbsaGRIitwG",
|
|
11
|
+
"--aliyun-region", "cn-hangzhou"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -163,10 +163,13 @@ createProject 成功后 daemon 自动:
|
|
|
163
163
|
|
|
164
164
|
## 后端:supabase MCP
|
|
165
165
|
|
|
166
|
-
**`supabase`** —— 后端数据/认证/存储,唯一的 MCP 支柱。这份 Supabase
|
|
166
|
+
**`supabase`** —— 后端数据/认证/存储,唯一的 MCP 支柱。这份 Supabase **是阿里云自建实例**(`http://120.26.157.138:80`),全局 MCP / clawos / lovagent / moltoffer 都共用这一台。**不是**云上 `supabase.com` 的实例。开工前确认能连上:
|
|
167
167
|
|
|
168
168
|
- 读表结构、跑 SQL、看 auth 用户都走这个 MCP,不要凭记忆猜 schema
|
|
169
|
-
-
|
|
169
|
+
- 模板里 `extension-kit/config.env` + `server/.env.example` 已对齐这台阿里云自建实例(SUPABASE_URL / SUPABASE_KEY),创建 project 时拷进项目目录的 `.env` 也是同一套
|
|
170
|
+
- **红线**:这是共享生产库。建表 / 迁移前先 `list_tables` 看清现状,新项目的表**必须**用 `<项目名>_` 前缀沉到 `public` schema(如 `helloworld_click_counter`),避免和 clawos / 其它项目的表撞名;**绝不** drop / alter clawos 已有的表,不确定哪些是 clawos 的就先问老板
|
|
171
|
+
|
|
172
|
+
**易踩的坑**:MCP 工具走阿里云自建那台,假如哪一步把 `.env` / `config.env` 写成云上 `qmhqmopgwsbmfxiqagay.supabase.co`(曾经的旧默认),就会**MCP 建表落阿里云 / server 通过 supabase-js 查云上**,两台 PostgREST schema cache 各自独立 → `PGRST205 schema cache 找不到表`。看到 PGRST 系列错码先 `grep -r supabase.co` 自查模板配置,再怀疑 schema cache。
|
|
170
173
|
|
|
171
174
|
## 阿里云凭证:在 `.secrets/aliyun.env`,用时现读
|
|
172
175
|
|
|
@@ -8,11 +8,14 @@ REGION=cn-hangzhou
|
|
|
8
8
|
FC_RUNTIME=custom.debian12
|
|
9
9
|
NODE_LAYER=acs:fc:cn-hangzhou:official:layers/Nodejs22/versions/1
|
|
10
10
|
|
|
11
|
-
# Supabase(clawos
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
|
|
11
|
+
# Supabase(clawos 共享阿里云自建实例!建表务必加 <app>_ 前缀沉到 public schema,绝不动 clawos 已有表)
|
|
12
|
+
# 注意:这是阿里云自建 supabase(120.26.157.138),不是云上 supabase.com 实例 ——
|
|
13
|
+
# 全局 MCP / clawos / lovagent / moltoffer 都共用这一台,跟 supabase MCP 操作的也是这台。
|
|
14
|
+
# 之前误指云上 qmhqmopgwsbmfxiqagay.supabase.co 导致 MCP 建表落阿里云,server 走 supabase-js
|
|
15
|
+
# 查云上,两台 PostgREST schema cache 独立 → PGRST205 找不到表。
|
|
16
|
+
SUPABASE_URL=http://120.26.157.138:80
|
|
17
|
+
# anon/publishable key(公开可暴露,客户端用)。阿里云自建实例无 project-ref 概念。
|
|
18
|
+
SUPABASE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJvbGUiOiJhbm9uIiwiaWF0IjoxNzY3OTU0MTY0LCJleHAiOjEzMjc4NTk0MTY0fQ.quOr1bQZ2OCQ49_UCto8LGY-n90Hlku1IbJYltFVWPc
|
|
16
19
|
|
|
17
20
|
# FC 资源规格(够跑轻量 extension;按需改)
|
|
18
21
|
FC_CPU=0.35
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# Supabase 共享阿里云自建实例(跟 extension-kit/config.env 对齐)。
|
|
2
|
+
# 这台 supabase 也是全局 MCP / clawos / lovagent / moltoffer 在用的同一台 ——
|
|
3
|
+
# 用 MCP 建表落到这里,server 通过 supabase-js 读也走这里,schema cache 对得齐。
|
|
4
|
+
SUPABASE_URL=http://120.26.157.138:80
|
|
5
|
+
SUPABASE_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJvbGUiOiJhbm9uIiwiaWF0IjoxNzY3OTU0MTY0LCJleHAiOjEzMjc4NTk0MTY0fQ.quOr1bQZ2OCQ49_UCto8LGY-n90Hlku1IbJYltFVWPc
|
|
3
6
|
PORT=3000
|
|
@@ -56,10 +56,20 @@ async function bootstrap() {
|
|
|
56
56
|
allowedHosts,
|
|
57
57
|
},
|
|
58
58
|
// appType: 'spa' 让 vite middleware 自己 serve index.html + fallback 路由(base 下任何
|
|
59
|
-
// 非 vite asset 路径都返 index.html)。
|
|
59
|
+
// 非 vite asset 路径都返 index.html)。
|
|
60
60
|
appType: 'spa',
|
|
61
61
|
});
|
|
62
|
-
|
|
62
|
+
// /api/* 守卫:实测 vite 'spa' catch-all 会先吃掉 /api/* 返 HTML,导致 API 拿不到 JSON。
|
|
63
|
+
// Express middleware 栈顺序:vite.middlewares 这一行加进去时 nest controllers 还没挂
|
|
64
|
+
// (nest router init 在 app.listen 时),所以 vite 拦截优先于 nest router → 命中 /api 也走 vite。
|
|
65
|
+
// 守卫:req.url 命中 apiPrefix 时直接 next() 跳过 vite,让 nest router 接管返 JSON。
|
|
66
|
+
const apiPathPrefix = `/${apiPrefix}/`; // 如 '/preview/6173/api/' 或 '/api/'
|
|
67
|
+
app.use((req: any, res: any, next: any) => {
|
|
68
|
+
if (typeof req.url === 'string' && req.url.startsWith(apiPathPrefix)) {
|
|
69
|
+
return next(); // skip vite,让 nest router 处理 /api/*
|
|
70
|
+
}
|
|
71
|
+
return vite.middlewares(req, res, next);
|
|
72
|
+
});
|
|
63
73
|
console.log(`[clawd-dev] vite middleware mounted (root=${viteRoot}, base=${viteBase}, apiPrefix=${apiPrefix}, allowedHosts=${allowedHosts.join(',')})`);
|
|
64
74
|
} else {
|
|
65
75
|
// prod / 脱离 clawd 跑:直接 serve 前端静态资源。
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
// Dev 模式 .env loader:`nest start --watch` 不会经过 `node --env-file=.env`,
|
|
2
|
+
// server 拿不到 SUPABASE_URL/KEY → createClient 跑了但 process.env 是空 → PGRST 系列错码。
|
|
3
|
+
// 这里在 nest bootstrap 之前显式 require dotenv 把 .env 填进 process.env。
|
|
4
|
+
// prod 路径(node --env-file=.env dist/main.js)Node 自带 loader 已经填了,dotenv 看到
|
|
5
|
+
// 已存在的 env 不会覆盖(默认行为),行为对齐。
|
|
6
|
+
require('dotenv/config');
|
|
7
|
+
|
|
1
8
|
// Node < 22 没有原生 WebSocket,而 @supabase/supabase-js 的 realtime 客户端
|
|
2
9
|
// 初始化时需要它。在应用启动前补一个全局 WebSocket,使任意 Node 版本
|
|
3
10
|
// (FC 运行时给的 node 可能是 18/20)下都能正常 createClient。
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "preinstall ship 进 daemon defaults。跟 persona-app-builder / persona-developer 同一份配置——共享同一台阿里云自建 supabase(120.26.157.138)+ 同一把阿里云 RDS AK(共享 demo 凭证,跟 .secrets/aliyun.env 同性质,PR #808 决策前提)。daemon refreshDaemonManagedDirs 把这文件同步到 ~/.clawd*/personas/persona-bug-fixer/.mcp.json。cc CLI 在 persona dir 自动加载 → assistant 直接可调 mcp__supabase__*。",
|
|
3
|
+
"mcpServers": {
|
|
4
|
+
"supabase": {
|
|
5
|
+
"type": "stdio",
|
|
6
|
+
"command": "npx",
|
|
7
|
+
"args": [
|
|
8
|
+
"@aliyun-rds/supabase-mcp-server",
|
|
9
|
+
"--aliyun-ak", "LTAI5tSebp9pyBLk2nxF5wDg",
|
|
10
|
+
"--aliyun-sk", "DnkOBhZ9pLympYlwcLuQbsaGRIitwG",
|
|
11
|
+
"--aliyun-region", "cn-hangzhou"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -91,32 +91,10 @@ done
|
|
|
91
91
|
|
|
92
92
|
**ALWAYS**:增量提交可工作的代码 / 跟随项目模式 / 3 次失败停下重新评估 / 修完写回归测试 / **动手前自问"我有几成把握",< 70% 先加日志再说**
|
|
93
93
|
|
|
94
|
-
##
|
|
94
|
+
## MCP server
|
|
95
95
|
|
|
96
|
-
|
|
96
|
+
**已 preinstall:阿里云自建 supabase MCP**。daemon ship 了 `.mcp.json` 到 persona 目录,cc 启动时自动加载,assistant 直接可调 `mcp__supabase__*` 工具(list_tables / execute_sql / get_logs 等)操作 clawos 共享阿里云 supabase(`120.26.157.138`)—— 修 bug 复现需要查 DB / 看日志时直接用。
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
cat > ~/.clawd/personas/persona-bug-fixer/.mcp.json <<'EOF'
|
|
100
|
-
{
|
|
101
|
-
"mcpServers": {
|
|
102
|
-
"supabase": {
|
|
103
|
-
"command": "npx",
|
|
104
|
-
"args": [
|
|
105
|
-
"-y",
|
|
106
|
-
"@supabase/mcp-server-supabase@latest",
|
|
107
|
-
"--project-ref=<你的 project ref>"
|
|
108
|
-
],
|
|
109
|
-
"env": {
|
|
110
|
-
"SUPABASE_ACCESS_TOKEN": "<你的 access token>"
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
EOF
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
- `<你的 project ref>`:在 supabase dashboard 项目设置里找
|
|
119
|
-
- `<你的 access token>`:去 https://supabase.com/dashboard/account/tokens 创建
|
|
120
|
-
- 其他 MCP server 同理:参考各 server 自己的 npm package README
|
|
98
|
+
⚠️ **`.mcp.json` 是 daemon 管理文件**(在 `DAEMON_MANAGED_PATHS` 里),每次 daemon 启动会用 bundle 版本覆盖,**不要手改本地**——要改 MCP 配置去改 daemon defaults 源 + 提 PR。
|
|
121
99
|
|
|
122
|
-
|
|
100
|
+
**要加别的 MCP server**(项目专属 / 个人用):在**项目目录**(不是 persona 目录)下加 `.mcp.json`,跟 persona 这份不冲突。或者扩 daemon defaults 给所有用户。
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_comment": "preinstall ship 进 daemon defaults。跟 persona-app-builder / persona-bug-fixer 同一份配置——共享同一台阿里云自建 supabase(120.26.157.138)+ 同一把阿里云 RDS AK(共享 demo 凭证,跟 .secrets/aliyun.env 同性质,PR #808 决策前提)。daemon refreshDaemonManagedDirs 把这文件同步到 ~/.clawd*/personas/persona-developer/.mcp.json。cc CLI 在 persona dir 自动加载 → assistant 直接可调 mcp__supabase__*。",
|
|
3
|
+
"mcpServers": {
|
|
4
|
+
"supabase": {
|
|
5
|
+
"type": "stdio",
|
|
6
|
+
"command": "npx",
|
|
7
|
+
"args": [
|
|
8
|
+
"@aliyun-rds/supabase-mcp-server",
|
|
9
|
+
"--aliyun-ak", "LTAI5tSebp9pyBLk2nxF5wDg",
|
|
10
|
+
"--aliyun-sk", "DnkOBhZ9pLympYlwcLuQbsaGRIitwG",
|
|
11
|
+
"--aliyun-region", "cn-hangzhou"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -95,32 +95,10 @@ done
|
|
|
95
95
|
|
|
96
96
|
**ALWAYS**:增量提交可工作的代码 / 从既有实现学 / 3 次失败停下重新评估 / 错误处理快速失败 + 描述清楚 + 不静默吞异常
|
|
97
97
|
|
|
98
|
-
##
|
|
98
|
+
## MCP server
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
**已 preinstall:阿里云自建 supabase MCP**。daemon ship 了 `.mcp.json` 到 persona 目录,cc 启动时自动加载,assistant 直接可调 `mcp__supabase__*` 工具(list_tables / execute_sql / apply_migration 等)操作 clawos 共享阿里云 supabase(`120.26.157.138`)。
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
cat > ~/.clawd/personas/persona-developer/.mcp.json <<'EOF'
|
|
104
|
-
{
|
|
105
|
-
"mcpServers": {
|
|
106
|
-
"supabase": {
|
|
107
|
-
"command": "npx",
|
|
108
|
-
"args": [
|
|
109
|
-
"-y",
|
|
110
|
-
"@supabase/mcp-server-supabase@latest",
|
|
111
|
-
"--project-ref=<你的 project ref>"
|
|
112
|
-
],
|
|
113
|
-
"env": {
|
|
114
|
-
"SUPABASE_ACCESS_TOKEN": "<你的 access token>"
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
EOF
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
- `<你的 project ref>`:在 supabase dashboard 项目设置里找
|
|
123
|
-
- `<你的 access token>`:去 https://supabase.com/dashboard/account/tokens 创建
|
|
124
|
-
- 其他 MCP server 同理:参考各 server 自己的 npm package README
|
|
102
|
+
⚠️ **`.mcp.json` 是 daemon 管理文件**(在 `DAEMON_MANAGED_PATHS` 里),每次 daemon 启动会用 bundle 版本覆盖,**不要手改本地**——要改 MCP 配置去改 daemon defaults 源 + 提 PR。
|
|
125
103
|
|
|
126
|
-
|
|
104
|
+
**要加别的 MCP server**(项目专属 / 个人用):在**项目目录**(不是 persona 目录)下加 `.mcp.json`,跟 persona 这份不冲突。或者扩 daemon defaults 给所有用户。
|