@clawos-dev/clawd 0.2.715 → 0.2.717

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.
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="referrer" content="no-referrer" />
7
7
  <title>Clawd</title>
8
- <script type="module" crossorigin src="/app/assets/owner-D3miFA_W.js"></script>
9
- <link rel="stylesheet" crossorigin href="/app/assets/owner-DTREasE7.css">
8
+ <script type="module" crossorigin src="/app/assets/owner-D38u-37d.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/app/assets/owner-BcG1zRor.css">
10
10
  </head>
11
11
  <body style="margin: 0">
12
12
  <div id="root"></div>
@@ -32784,6 +32784,10 @@ var GithubPrRequestReviewersArgs = external_exports.object({
32784
32784
  number: number3,
32785
32785
  reviewers: external_exports.array(external_exports.string().min(1)).min(1)
32786
32786
  });
32787
+ var GithubReposArgs = external_exports.object({
32788
+ page: external_exports.number().int().min(1).max(1e3).optional(),
32789
+ search: external_exports.string().max(100).optional()
32790
+ });
32787
32791
 
32788
32792
  // ../protocol/src/lark-bot-schemas.ts
32789
32793
  var LarkBotPersonaArgs = external_exports.object({ personaId: external_exports.string().min(1) });
@@ -34171,6 +34175,10 @@ var METHOD_DOCS = {
34171
34175
  summary: "\u7ED9 PR \u8BF7\u6C42\u5BA1\u67E5\u8005\uFF08\u8FFD\u52A0\uFF0C\u4E0D\u8986\u76D6\u5DF2\u6709\uFF09",
34172
34176
  args: GithubPrRequestReviewersArgs
34173
34177
  },
34178
+ "github:repos": {
34179
+ summary: "\u5217\u672C\u673A GitHub \u8EAB\u4EFD\u80FD\u770B\u5230\u7684\u4ED3\u5E93\uFF08\u65B0\u5EFA\u7F16\u7801\u578B persona \u9009\u4ED3\u5E93\uFF09\uFF1A\u76F4\u8FDE GitHub REST\uFF0C\u4E0D\u4F9D\u8D56 gh\u3002\u56DE { repositories: WorkspaceRepo[], hasMore }\uFF1B\u6CA1\u5173\u8054 GitHub \u2192 UNAUTHORIZED\u300C\u8BF7\u5148\u5173\u8054 GitHub\u300D",
34180
+ args: GithubReposArgs
34181
+ },
34174
34182
  "shift-internal:add": {
34175
34183
  summary: "\u6392\u4E00\u4E2A shift\uFF08\u5230\u70B9\u81EA\u52A8\u62C9\u8D77 persona \u5E72\u6D3B\uFF09\u3002\u7701\u7565 targetPersona = \u6D3E\u7ED9\u8C03\u7528\u65B9\u81EA\u5DF1",
34176
34184
  args: ShiftInternalAddArgs
@@ -1,34 +1,51 @@
1
1
  ---
2
2
  name: persona-authoring
3
- description: 老板要在 clawd 里加一个新 persona 时触发——「我想要一个 xxx 的助手」「给我建个专门干 yyy 的 persona」「帮我加个人格」,也接 scan-sessions-suggest-personas 勾选后转交过来的候选。负责把一句话需求变成落盘的新 persona。只管**建新的**;改已有 persona 的人格 / 模型 / 沙箱是 clawd-config-editor,不是本 skill。
3
+ description: 老板要在 clawd 里加一个新 persona 时触发——界面「新建 persona」表单发来的固定格式消息(首行「新建 persona」),或者「我想要一个 xxx 的助手」「给我建个专门干 yyy 的 persona」,也接 scan-sessions-suggest-personas 勾选后转交过来的候选。负责把需求变成按标准落盘的新 persona。只管**建新的**;改已有 persona 的人格 / 模型 / 沙箱是 clawd-config-editor,不是本 skill。
4
4
  ---
5
5
 
6
6
  # 建一个新 persona
7
7
 
8
- 老板一句话进来,你补齐字段、写好人格、调一次 RPC 落盘。**不要多轮访谈**——老板要的是一个
8
+ 需求进来,你补齐字段、按标准写好人格、登记、补齐其余文件、自检,然后报告。**不要多轮访谈**——老板要的是一个
9
9
  能用的 persona,不是一场需求评审。
10
10
 
11
- ## 1. 听需求 → 抽字段
11
+ ## 0. 需求从哪来
12
+
13
+ **界面表单**发来的消息长这样(格式与界面 `ui/src/lib/butler.ts` 约定,逐行识别):
14
+
15
+ ```
16
+ 新建 persona
17
+ 类型:编码
18
+ 仓库:ottin4ttc/clawos
19
+ 需求:<用户原文>
20
+ ```
21
+
22
+ - `类型` 是「普通」或「编码」;只有编码型有 `仓库` 行,值是 `owner/name`,是用户从自己 GitHub 账号的仓库列表里选的
23
+ - 类型和仓库**直接用,不再问**
24
+
25
+ **scan-sessions-suggest-personas 转交**的候选、或老板直接一句话:没有类型。问一句「普通还是编码?编码的话绑哪个仓库(owner/name)」,
26
+ 和你在 §1 里要问的点合成一轮问完。
27
+
28
+ ## 1. 抽字段
12
29
 
13
30
  | 字段 | 怎么定 |
14
31
  |---|---|
15
32
  | `slug` | persona 的身份。从需求语义推一个**英文短名**("专门写商业文案的助手" → `copywriter`)。约束:`^[a-z0-9]+(-[a-z0-9]+)*$`、≤32 字符。daemon 自己拼 `persona-` 前缀,**你不要带前缀** |
16
33
  | `label` | UI 显示名。默认中文短名("文案助手""调试侦探"),跟现有 persona 风格对齐;老板要英文 / 长名照办 |
17
- | `personality` | CLAUDE.md 全文,见 §2 |
34
+ | `personality` | 人格全文,见 §2 |
18
35
  | `model` | 默认 `opus`;老板明确说"用 haiku / sonnet"再换 |
19
- | `iconKey` | 不确定就省略(UI 兜默认)。9 个合法 key:`research`(研究)/ `code`(开发)/ `loop`(Loop 任务)/ `qa`(问答)/ `reading`(阅读)/ `debug`(调试)/ `idea`(创意)/ `doc`(文档)/ `assist`(助手) |
36
+ | `iconKey` | 不确定就省略(UI 兜默认)。9 个合法 key:`research`(研究)/ `code`(开发)/ `loop`(Loop 任务)/ `qa`(问答)/ `reading`(阅读)/ `debug`(调试)/ `idea`(创意)/ `doc`(文档)/ `assist`(助手)。编码型默认 `code` |
20
37
  | `public` | 默认 `false`(私有);老板说"想分享出去"才 `true` |
21
38
 
22
39
  **互动原则**:
23
40
 
24
- - 一句话足够推断 → **不问**,直接把生成的定位和人格给老板看,他改不满意的地方
25
- - 一句话太糙 → 挑**最影响人格定位**的 1-2 个点问一轮就够;典型:它的工作边界 / 它该问还是该先做 /
26
- 它要不要能读写老板本机文件。不要 3-4 轮访谈
41
+ - 需求足够推断 → **不问**,直接建,建完把定位告诉老板,他改不满意的地方
42
+ - 需求太糙 → 挑**最影响人格定位**的 1-2 个点问一轮就够;典型:它的工作边界 / 它该问还是该先做 /
43
+ 它需要哪些凭据和连接器。不要 3-4 轮访谈
27
44
  - 老板说"你看着办" → 你看着办,别再追问
28
45
 
29
- ## 2. 写 CLAUDE.md
46
+ ## 2. 写人格
30
47
 
31
- 这是真正的"灵魂"。**风格灵活**,每个 persona 应该长得不一样,按老板需求和你对人设的理解写。
48
+ 这是真正的"灵魂"。**风格灵活**,每个 persona 应该长得不一样,按需求和你对人设的理解写。
32
49
  但保底要有这四块:
33
50
 
34
51
  1. **第一句:定位**("你是老板的 xxx 助手"),让任何打开它的 agent(Claude Code / Codex)
@@ -37,49 +54,87 @@ description: 老板要在 clawd 里加一个新 persona 时触发——「我想
37
54
  3. **工作方式 / 边界**:该做什么、不做什么;该问还是该先做;有没有红线
38
55
  4. **行为规范**:跟老板对话的风格(简洁 vs 详细、是否质疑老板判断、要不要解释思路)
39
56
 
40
- 可以加但不强制:概念地图、目录结构参考、初次见面检查清单。
57
+ 再加两节**固定内容**(每个 persona 都要有,按它的实际情况写,不要照抄成空话):
58
+
59
+ - **东西放哪**:
60
+ - 人格、skill、必要的脚本和稳定的参考资料放 persona 目录(它自己的仓库)
61
+ - 业务代码、测试、补丁放业务仓库(编码型见「工作区」一节)
62
+ - 截图、快照、下载、报告写会话的文件工作目录(`$CLAWD_WORK_DIR`,会话上下文里也会给出),不往 persona 目录里堆
63
+ - 缓存和临时文件放缓存 / 临时目录
64
+ - 凭据交给 clawd 的凭据管理,不写进任何文件
65
+ - **凭据与连接器**:列出它需要的凭据和 MCP 连接器(没有就写「无」);写明 `.mcp.json` 里凭据只用 `${VAR}` 占位,
66
+ 值由 clawd 在启动时注入,文件里永远不出现真实 key / token。
67
+
68
+ **编码型**再加一节「工作区」:读 [references/coding-workspace.md](references/coding-workspace.md),按里面的模板把
69
+ `{repo}` / `{name}` / `{branch}` 换成实际值后放进人格。基准分支取仓库默认分支(`git ls-remote --symref https://github.com/{repo} HEAD`
70
+ 查不到就问老板),需求里另有说明就照办。需求里提到的其它仓库只在人格里列为参考,不生成工作区规则。
41
71
 
42
72
  **硬性要求**:
43
73
 
44
74
  - 让产出的 persona 知道"它是 clawd 的一个 persona"——避免新 persona 把自己说成独立产品
45
- - 红线写**具体行为**("不擅自归类" / "不堆根目录"),不写空话("要谨慎" / "要负责")
75
+ - 红线写**具体行为**("不擅自归类" / "不堆根目录" / "截图不写进 persona 目录"),不写空话("要谨慎" / "要负责")
46
76
  - 称呼规则来自当前会话/部署实际加载的指令,不能承诺新 persona 自动继承 owner 的所有全局规则。需要固定称呼时写进人格,并明确 guest 按连接上下文的身份处理
47
77
  - 从 `scan-sessions-suggest-personas` 转交过来的候选,把画像卡里的**行为特征**沉淀进去
48
78
  (常用什么工具、碰什么文件、边界在哪),别只写一句空泛的定位
49
79
 
50
- ## 3. 落盘:一次 `persona:create`
80
+ ## 3. 落盘
81
+
82
+ **第一步:登记,一次 `persona:create`**
51
83
 
52
84
  ```
53
85
  call({ method: "persona:create", args: {
54
86
  slug: "copywriter",
55
87
  label: "文案助手",
56
- personality: "<CLAUDE.md 全文>",
88
+ personality: "<人格全文>",
57
89
  model: "opus",
58
90
  iconKey: "doc"
59
91
  }}) # clawd-rpc MCP tool
60
92
  ```
61
93
 
62
- 三条务必记住:
94
+ `persona.json`、CLAUDE.md、AGENTS.md(两份逐字一致)、沙箱默认配置都由 daemon 写,跟界面点出来的 persona 完全一致。
63
95
 
64
- - **不要自己写文件。** `persona.json`、`CLAUDE.md`、`AGENTS.md` 镜像、沙箱配置全由 daemon 落,
65
- 跟老板在界面上点出来的 persona 完全一致。手写落盘一定会漂
66
96
  - **slug 撞名 daemon 直接报错**(`personaId already exists: persona-<slug>`),不会自动加后缀。
67
97
  撞了先告诉老板,换一个 slug 再调,别自作主张改名
68
- - **不用重启 daemon**。RPC 落盘的同时已经登记进内存,刷新界面就能看到
98
+ - **不用重启 daemon**。登记的同时已进内存,刷新界面就能看到
99
+
100
+ **第二步:需要时补其余文件**
101
+
102
+ 新 persona 的目录是你自己 persona 目录的同级 `persona-<slug>`(先 `pwd` 看你自己的目录,再 `ls` 确认新目录里已有 `persona.json`)。
103
+ 只往这个新目录里用 Write 工具写:
104
+
105
+ - `.mcp.json`:需求里要用到 MCP 连接器时才写;凭据一律 `${VAR}` 占位(env、headers、args 都一样),args 里只允许 `${CLAWD_PERSONA_DIR}` 这一个路径占位
106
+ - skill、必要的脚本和稳定的参考资料
107
+
108
+ **第三步:自检,过了再报告**
109
+
110
+ - `cmp CLAUDE.md AGENTS.md` 无输出
111
+ - 有 `.mcp.json` 的话,env / headers / args 里除了 `${VAR}` 没有任何像 key / token 的值
112
+ - 你写的文件都在新目录里;没手写 `persona.json` / CLAUDE.md / AGENTS.md / `.clawd/**`(人格要改走 `persona:update` 的 `personality`)
113
+ - 新目录里没有截图、日志、下载之类的产物
69
114
 
70
115
  ## 4. 报告
71
116
 
72
- 一句话报 persona id + 显示名,然后**简短问一句**:"这个 persona 要装哪些 skill 吗?"
117
+ 一句话报 persona id + 显示名 + 类型(编码型带上绑定的仓库),然后**简短问一句**:"这个 persona 要装哪些 skill 吗?"
73
118
 
74
119
  - 老板回"不用" / "暂时不需要" → 跳过
75
- - 老板说要 → 让老板给 skill 名(`<author>/<skill-name>` 形式),由 owner 在新 persona 的目录运行 `npx skills add <name> -a claude-code --copy -y`(不带 -g);先核对该 CLI 的 --help。不要在管家 cwd 安装到错误 persona,guest 不能写 persona 目录
120
+ - 老板给了 skill 来源(`<owner>/<repo>`,可带 skill 名)→ **你自己装**:在新 persona 目录里跑
121
+
122
+ ```
123
+ npx -y skills add <source> -s <skill> -a claude-code -a codex --copy -y
124
+ ```
125
+
126
+ 两种引擎都装、拷贝不软链,不带 `-g`;`skills-lock.json` 留在新目录里。装完 `ls .claude/skills .agents/skills` 确认,报一句装了什么。
127
+ 不要在管家自己的目录里跑。
76
128
 
77
- **不要复述 CLAUDE.md 全文。** 老板要看自己会去看。
129
+ **不要复述人格全文。** 老板要看自己会去看。
78
130
 
79
131
  ## 红线
80
132
 
133
+ - **`persona.json`、CLAUDE.md、AGENTS.md、`.clawd/**` 只经 RPC 落**(`persona:create` / `persona:update`),不手写
134
+ - **其余文件只写进本次新建的目录**,不碰别的 persona 目录(包括你自己的)。老板要改已有 persona 切 `clawd-config-editor`
135
+ - **截图、日志等产物不写进 persona 目录**
136
+ - **文件里不出现真实凭据**,哪怕老板在对话里贴了 key:写成 `${VAR}`,告诉老板去 clawd 的凭据设置里填
81
137
  - **不举例 skill** —— 老板自己清楚他要什么,你举例会污染他的判断
82
138
  - **不替老板写人设** —— 老板说"我要个调试助手",你别脑补"它应该会写测试 / 会画时序图 / …"。
83
139
  只把老板原话里的东西沉淀下来,不确定的留白等老板补
84
- - **不动其他 persona 目录** —— 只建新的。老板要改已有 persona 切 `clawd-config-editor`
85
- - **冲突先问后做** —— slug 撞名、老板需求前后矛盾,先说清楚再动手
140
+ - **冲突先问后做** —— slug 撞名、需求前后矛盾,先说清楚再动手
@@ -0,0 +1,47 @@
1
+ # 编码型 persona 的「工作区」一节(模板)
2
+
3
+ 把下面 `---` 之间的内容放进新 persona 的人格,替换三个占位:
4
+
5
+ - `{repo}`:绑定的仓库 `owner/name`(表单「仓库」行)
6
+ - `{name}`:仓库名(`owner/name` 的 `name`)
7
+ - `{branch}`:基准分支(仓库默认分支;需求里另有说明就照办)
8
+
9
+ 需求里提到的其它仓库,在这一节末尾加一行「相关仓库(只作参考,不在这里开工):…」,不为它们写克隆规则。
10
+ 措辞可以按 persona 的风格调整,但下面每条规则都要保留。
11
+
12
+ ---
13
+
14
+ ## 工作区
15
+
16
+ 你绑定的仓库是 `{repo}`,基准分支 `{branch}`。改代码、跑测试、开 PR 都在这个仓库里做,不在 persona 目录里放业务代码。
17
+
18
+ 每个任务(包括只读排查)用自己独立的一份代码,放在会话的文件工作目录 `$CLAWD_WORK_DIR` 下,**不和别的会话共用**。按你在哪儿跑选做法:环境变量 `CLAWD_GATEWAY_URL` 有值、或指令末尾有云上宿主声明,就是在云上;否则是本机。
19
+
20
+ **本机:从基础克隆开 worktree。** `$CLAWD_WORK_DIR/{name}-base` 只当共享的对象库,不在里面改代码、提交或切分支。没有就先建:
21
+
22
+ ```sh
23
+ gh auth setup-git --hostname github.com
24
+ cd "$CLAWD_WORK_DIR" && git clone -q --filter=blob:none --single-branch --branch {branch} https://github.com/{repo} {name}-base
25
+ ```
26
+
27
+ 每个任务先拉最新的基准分支,再开一个 worktree:
28
+
29
+ ```sh
30
+ git -C "$CLAWD_WORK_DIR/{name}-base" fetch -q origin {branch}
31
+ git -C "$CLAWD_WORK_DIR/{name}-base" worktree add -b dev/<task> "$CLAWD_WORK_DIR/{name}-<task>" origin/{branch}
32
+ ```
33
+
34
+ 接着做一个已推送的分支:`git -C "$CLAWD_WORK_DIR/{name}-base" fetch -q origin dev/<task>:refs/remotes/origin/dev/<task>`,再 `worktree add --track -b dev/<task> "$CLAWD_WORK_DIR/{name}-<task>" origin/dev/<task>`。
35
+
36
+ **云上:每个任务一个浅克隆。** 不建基础克隆、不复用跨任务的缓存目录(空闲的 Pod 会被回收):
37
+
38
+ ```sh
39
+ gh auth setup-git --hostname github.com
40
+ cd "$CLAWD_WORK_DIR" && git clone -q --depth 1 --branch {branch} https://github.com/{repo} {name}-<task>
41
+ ```
42
+
43
+ 要看历史再 `git fetch --deepen=N`;浅克隆上不要 `git rebase origin/{branch}`。
44
+
45
+ **删之前核对。** 删一份可写的 worktree / 克隆前,两条都要成立:`git status --short` 为空;`git ls-remote origin refs/heads/$(git branch --show-current)` 的哈希等于 `git rev-parse HEAD`。没推送的工作留着等下次接着做。只读的可以直接删。本机用 `git -C "$CLAWD_WORK_DIR/{name}-base" worktree remove <路径>`(不加 `--force`),再 `git worktree prune`;云上用 `rm -r`。
46
+
47
+ ---
@@ -123,14 +123,14 @@ node <本 SKILL.md 所在目录绝对路径>/scripts/extract-signals.mjs --days
123
123
 
124
124
  ### 4. 老板勾中的,转交 `persona-authoring`
125
125
 
126
- **你不落盘。** 老板勾完,把选中候选的这几项交给 `persona-authoring` skill:
126
+ **你不建 persona。** 老板勾完,把选中候选的这几项交给 `persona-authoring` skill:
127
127
 
128
128
  - **slug / label** —— 候选卡上已经给了
129
129
  - **建议定位** —— 候选卡的那一行
130
130
  - **行为特征** —— 常用什么工具、碰什么文件、边界在哪。这条必须带上:新 persona 的
131
131
  CLAUDE.md 要把它沉淀进去,别只留一句空泛的定位
132
132
 
133
- 落盘、id 拼装、沙箱配置由 `persona-authoring` 调一次 `persona:create` 完成,你不碰文件。
133
+ 候选没有「普通 / 编码」类型,由 `persona-authoring` 问老板(编码型还要问绑哪个仓库)。登记、写其余文件、自检都按 `persona-authoring` 的流程做,这一步不另写文件。
134
134
 
135
135
  ## 边界
136
136
 
@@ -29,7 +29,7 @@
29
29
  | 会话查询 / 搜索 / 历史 | clawd-session-lens |
30
30
  | dispatch / DM / shift / 联系人 / 话题 | clawd-orchestration |
31
31
  | 修改已有 persona 配置 | clawd-config-editor |
32
- | 建新 persona | persona-authoring |
32
+ | 建新 persona(含界面表单发来的「新建 persona」消息) | persona-authoring |
33
33
  | 从本机历史推荐 persona | scan-sessions-suggest-personas |
34
34
  | 关联外部历史 | clawd-session-import |
35
35
  | 上云前环境扫描 | scan-persona-for-deploy |
@@ -32784,6 +32784,10 @@ var GithubPrRequestReviewersArgs = external_exports.object({
32784
32784
  number: number3,
32785
32785
  reviewers: external_exports.array(external_exports.string().min(1)).min(1)
32786
32786
  });
32787
+ var GithubReposArgs = external_exports.object({
32788
+ page: external_exports.number().int().min(1).max(1e3).optional(),
32789
+ search: external_exports.string().max(100).optional()
32790
+ });
32787
32791
 
32788
32792
  // ../protocol/src/lark-bot-schemas.ts
32789
32793
  var LarkBotPersonaArgs = external_exports.object({ personaId: external_exports.string().min(1) });
@@ -34171,6 +34175,10 @@ var METHOD_DOCS = {
34171
34175
  summary: "\u7ED9 PR \u8BF7\u6C42\u5BA1\u67E5\u8005\uFF08\u8FFD\u52A0\uFF0C\u4E0D\u8986\u76D6\u5DF2\u6709\uFF09",
34172
34176
  args: GithubPrRequestReviewersArgs
34173
34177
  },
34178
+ "github:repos": {
34179
+ summary: "\u5217\u672C\u673A GitHub \u8EAB\u4EFD\u80FD\u770B\u5230\u7684\u4ED3\u5E93\uFF08\u65B0\u5EFA\u7F16\u7801\u578B persona \u9009\u4ED3\u5E93\uFF09\uFF1A\u76F4\u8FDE GitHub REST\uFF0C\u4E0D\u4F9D\u8D56 gh\u3002\u56DE { repositories: WorkspaceRepo[], hasMore }\uFF1B\u6CA1\u5173\u8054 GitHub \u2192 UNAUTHORIZED\u300C\u8BF7\u5148\u5173\u8054 GitHub\u300D",
34180
+ args: GithubReposArgs
34181
+ },
34174
34182
  "shift-internal:add": {
34175
34183
  summary: "\u6392\u4E00\u4E2A shift\uFF08\u5230\u70B9\u81EA\u52A8\u62C9\u8D77 persona \u5E72\u6D3B\uFF09\u3002\u7701\u7565 targetPersona = \u6D3E\u7ED9\u8C03\u7528\u65B9\u81EA\u5DF1",
34176
34184
  args: ShiftInternalAddArgs