teamai-cli 0.17.2 → 0.17.4
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/README.md +85 -471
- package/README.zh-CN.md +88 -474
- package/agents/teamai-recall.md +1 -0
- package/dist/index.js +21989 -20566
- package/package.json +1 -1
package/README.zh-CN.md
CHANGED
|
@@ -11,555 +11,169 @@
|
|
|
11
11
|
[](https://www.npmjs.com/package/teamai-cli)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
[](https://discord.gg/gervEZm58g)
|
|
15
|
+
[](https://discord.gg/DeHHxPnfZF)
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
面向 AI 智能体的团队 Harness 分发工具。
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
通过 Git 统一管理 skills、rules、docs,驾驭 Claude Code / Codex / CodeBuddy / WorkBuddy 等多种 AI 工具。
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
一个人也能用,团队用更强。
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
如有问题或建议,欢迎提交 PR 或 Issue,一起共建这个项目。
|
|
23
|
+
## 快速开始
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
### 安装
|
|
27
26
|
|
|
28
27
|
```bash
|
|
29
28
|
npm install -g teamai-cli
|
|
30
29
|
```
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
<summary>腾讯内部用户:通过 tnpm 安装 <code>@tencent/teamai-cli</code></summary>
|
|
31
|
+
### 团队管理员 / 个人使用者
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
npm install -g @tencent/teamai-cli --registry=http://r.tnpm.oa.com
|
|
37
|
-
```
|
|
33
|
+
在 Git 托管平台(GitHub 或 TGit)创建共享经验仓库,**授予团队成员写权限**,然后让他们运行 `teamai init --repo https://github.com/yourorg/yourrepo`。
|
|
38
34
|
|
|
39
|
-
|
|
40
|
-
</details>
|
|
41
|
-
|
|
42
|
-
## 快速开始
|
|
35
|
+
> 个人使用无需单独建仓:`teamai init` 会检查目标仓库,不存在时自动创建。
|
|
43
36
|
|
|
44
37
|
### 团队成员
|
|
45
38
|
|
|
46
39
|
```bash
|
|
47
|
-
# 用户级初始化(默认,资源安装到
|
|
48
|
-
teamai init --repo
|
|
40
|
+
# 用户级初始化(默认,资源安装到 ~/ 下)
|
|
41
|
+
teamai init --repo https://github.com/yourorg/yourrepo
|
|
49
42
|
|
|
50
43
|
# 项目级初始化(资源安装到项目目录下)
|
|
51
44
|
cd /path/to/my-project
|
|
52
|
-
teamai init --repo
|
|
53
|
-
|
|
54
|
-
# 非交互模式(适合 CI/CD 或 AI agent 自动化)
|
|
55
|
-
teamai init --repo yourteam/yourproject --scope user --role hai_dev --force
|
|
45
|
+
teamai init --repo https://github.com/yourorg/yourrepo --scope project
|
|
56
46
|
```
|
|
57
47
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
先在 git 托管平台上创建好团队共享经验的仓库(默认 GitHub;TGit 也支持),并把所有团队成员加入到该仓库的 write 权限。
|
|
61
|
-
|
|
62
|
-
- **GitHub**:用 `gh repo create yourorg/yourproject --private` 创建,或在 UI 上建。然后用 Settings → Collaborators 把成员加进来,并把 master/main 设置为默认分支。
|
|
63
|
-
- **TGit(腾讯工蜂)**:在 [git.woa.com](https://git.woa.com/) 上创建,通过 user group 批量添加 master 权限。
|
|
48
|
+
初始化完成后,每次开启 AI 会话时都会自动拉取管理员发布的 skills / rules 等 Harness 更新,无需手动同步。
|
|
64
49
|
|
|
65
|
-
|
|
50
|
+
> **完整使用指南**:[docs/usage-guide.zh-CN.md](docs/usage-guide.zh-CN.md)([English](docs/usage-guide.md))— 涵盖从团队创建到日常使用的全流程。
|
|
66
51
|
|
|
67
|
-
|
|
68
|
-
- `https://git.woa.com/yourteam/yourrepo` → TGit
|
|
52
|
+
## Harness 管理和分发
|
|
69
53
|
|
|
70
|
-
|
|
54
|
+
TeamAI 把 skills、rules、docs、hooks 统一存放在共享 Git 仓库,通过「push → 评审合并 → pull」的流程分发到每位成员的本地 AI 工具,并支持订阅其他团队的 Harness。
|
|
71
55
|
|
|
72
|
-
|
|
56
|
+
### 工作原理
|
|
73
57
|
|
|
74
|
-
```bash
|
|
75
|
-
teamai init --http https://your-team-host/api --token <api-key>
|
|
76
58
|
```
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
- 如果团队仓库端点(`/repo`)尚未上线,init 会回落到 **reporting-only 模式**——hooks 和状态上报立即生效,待端点可用后 skills/rules 会自动开始同步。
|
|
81
|
-
|
|
82
|
-
#### Agent 状态上报
|
|
83
|
-
|
|
84
|
-
初始化后,受支持的 agent(CodeBuddy / WorkBuddy)会在 session 启动时上报本地已安装 skill 的状态,并拉取服务端下发的 skill 安装 / 更新 / 卸载命令,全部挂在既有 hook dispatch 上(`session-start` → report + sync,`prompt-submit` → sync)。下发失败会进离线队列,下次重试。
|
|
85
|
-
|
|
86
|
-
> **隐私**:install path 和 machine id 仅在*本地*哈希以派生稳定的 `local_agent_id`,二者都不会上报。
|
|
87
|
-
|
|
88
|
-
<details>
|
|
89
|
-
<summary><b>HTTP 契约</b>(面向后端实现者)—— <code>--http</code> 端点需要提供哪些接口</summary>
|
|
90
|
-
|
|
91
|
-
`--http <baseUrl>` 传入的是基础地址,所有端点都相对于它,并统一用 `Authorization: Bearer <api-key>` 鉴权。
|
|
92
|
-
|
|
93
|
-
| 端点 | 方法 | 用途 | 路径 |
|
|
94
|
-
|------|------|------|------|
|
|
95
|
-
| `{baseUrl}/repo` | GET | 团队仓库快照(skills + rules/docs) | **固定** |
|
|
96
|
-
| `{baseUrl}/api/local-agent/report` | POST | session 启动:upsert agent + 已装 skill | 默认,可配置 |
|
|
97
|
-
| `{baseUrl}/api/local-agent/sync` | POST | 上报状态 + 返回待执行的 skill 命令 | 默认,可配置 |
|
|
98
|
-
| `{baseUrl}/api/local-agent/commands/ack` | POST | 回执单条命令(`{ id, status, error }`) | 默认,可配置 |
|
|
99
|
-
|
|
100
|
-
`GET /repo` 返回 JSON(返回 404 或非 JSON 的 200 ⇒ 客户端进入 reporting-only 模式):
|
|
101
|
-
|
|
102
|
-
```json
|
|
103
|
-
{
|
|
104
|
-
"version": "<不透明的缓存 key,例如 commit hash>",
|
|
105
|
-
"files": [{ "path": "rules/foo.md", "content": "..." }],
|
|
106
|
-
"commands":[{ "type": "install_skill", "skill_slug": "x", "skill_version": "1.0.0", "download_url": "https://signed-url/..." }]
|
|
107
|
-
}
|
|
59
|
+
teamai push → 创建分支 + MR → reviewer 审批合并
|
|
60
|
+
↓
|
|
61
|
+
SessionStart hook → teamai pull → 同步到本地 AI 工具
|
|
108
62
|
```
|
|
109
63
|
|
|
110
|
-
|
|
111
|
-
- skill 的 `download_url` 是**直连**拉取——它在 query string 里自带签名鉴权,因此不附带 `Bearer` 头。它必须指向一个 `.zip`,其根目录为 `<slug>/SKILL.md …` 或扁平的 `SKILL.md …`。
|
|
112
|
-
|
|
113
|
-
**固定 vs 可配置**:`/repo` 路径固定;reporter 三个路径是可覆盖的默认值;上面的 JSON 结构是契约。可调项(环境变量):
|
|
114
|
-
|
|
115
|
-
| 变量 | 作用 |
|
|
116
|
-
|------|------|
|
|
117
|
-
| `TEAMAI_API_TOKEN` | API key(`--token` 的替代) |
|
|
118
|
-
| `TEAMAI_REPORT_ENDPOINT` | reporter 基础 URL(默认 = `--http` 地址) |
|
|
119
|
-
| `TEAMAI_REPORT_PATHS` | JSON `{ "report", "sync", "ack" }`,覆盖 reporter 三个路径 |
|
|
120
|
-
| `TEAMAI_REPORT_AGENTS` | 参与上报的 agent,逗号分隔(默认 `workbuddy,codebuddy`) |
|
|
121
|
-
| `TEAMAI_SKILL_DOWNLOAD_HOSTS` | skill `download_url` 的 host 白名单,逗号分隔(空 = 全部放行) |
|
|
122
|
-
|
|
123
|
-
</details>
|
|
124
|
-
|
|
125
|
-
## 命令
|
|
126
|
-
|
|
127
|
-
| 命令 | 说明 |
|
|
128
|
-
|------|------|
|
|
129
|
-
| `teamai init` | 初始化(OAuth 登录、关联仓库、注册成员、注入 hooks) |
|
|
130
|
-
| `teamai push` | 推送本地资源到独立分支并创建 MR |
|
|
131
|
-
| `teamai pull` | 拉取团队资源并注入到本地 AI 工具 |
|
|
132
|
-
| `teamai status` | 查看本地 vs 团队仓库差异 |
|
|
133
|
-
| `teamai recall <query>` | 搜索团队知识库(BM25 + 图谱加权) |
|
|
134
|
-
| `teamai recall enable/disable/status` | 开启/关闭/查看 recall 状态(控制 auto-recall hooks 和 subagent 部署) |
|
|
135
|
-
| `teamai import --dir <path>` | 从本地目录提取代码知识图谱 |
|
|
136
|
-
| `teamai import --from-repo <url>` | 导入仓库代码知识图谱(`teamwiki/`) |
|
|
137
|
-
| `teamai import --from-org <org>` | 批量导入组织下所有仓库 |
|
|
138
|
-
| `teamai import --from-repo-list <yaml>` | 按白名单批量导入 |
|
|
139
|
-
| `teamai import --from-mr <url>` | 从已合并 MR 提取 learning |
|
|
140
|
-
| `teamai import --from-iwiki <id>` | 从 iWiki 导入文档为 learnings |
|
|
141
|
-
| `teamai codebase --lint` | 知识图谱健康度检查 |
|
|
142
|
-
| `teamai contribute` | 分享本次 session 经验到团队仓库 |
|
|
143
|
-
| `teamai members` | 列出团队成员 |
|
|
144
|
-
| `teamai roles` | 管理团队角色和命名空间 |
|
|
145
|
-
| `teamai remove <type> <name>` | 删除资源并创建 MR |
|
|
146
|
-
| `teamai digest` | 生成团队使用周报 |
|
|
147
|
-
| `teamai doctor` | 诊断配置问题 |
|
|
148
|
-
| `teamai uninstall` | 卸载所有 teamai 资源和 hooks |
|
|
149
|
-
|
|
150
|
-
全局选项:`--dry-run`、`--verbose`
|
|
64
|
+
成员通过 `teamai push` 提交变更并创建合并请求供审核。合并后,`teamai pull`(由 SessionStart hook 在会话启动时自动触发)将最新资源同步到本地。Skills 会同步到 `~/.claude/skills/`、`~/.codex/skills/`、`~/.cursor/skills/`、`~/.codebuddy/skills/` 等目录。
|
|
151
65
|
|
|
152
|
-
|
|
66
|
+
### 团队 Hooks
|
|
153
67
|
|
|
154
|
-
|
|
155
|
-
<summary>更多命令(管理、CI、分析)</summary>
|
|
156
|
-
|
|
157
|
-
| 命令 | 说明 |
|
|
158
|
-
|------|------|
|
|
159
|
-
| `teamai list [type]` | 列出资源(skills\|rules\|docs\|env\|wiki) |
|
|
160
|
-
| `teamai skill [show <name>]` | 查看 skill 元数据和贡献者 |
|
|
161
|
-
| `teamai source` | 管理跨团队 skill 订阅 |
|
|
162
|
-
| `teamai tags` | 管理基于标签的资源过滤 |
|
|
163
|
-
| `teamai env` | 管理团队环境变量 |
|
|
164
|
-
| `teamai hooks` | 管理 AI 工具 hooks |
|
|
165
|
-
| `teamai cache --gc` | 回收 clone 缓存 |
|
|
166
|
-
| `teamai ci extract-mr --url <url>` | CI:从 MR 提取知识,发布评论,合并后写入团队仓库 |
|
|
167
|
-
|
|
168
|
-
</details>
|
|
169
|
-
|
|
170
|
-
## 工作原理
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
成员 A 成员 B
|
|
174
|
-
创建 skill / 写规则 同上
|
|
175
|
-
│ │
|
|
176
|
-
▼ ▼
|
|
177
|
-
teamai push teamai push
|
|
178
|
-
│ │
|
|
179
|
-
▼ ▼
|
|
180
|
-
创建分支 + MR 创建分支 + MR
|
|
181
|
-
│ │
|
|
182
|
-
└──────► 团队git仓库 ◄──────────────┘
|
|
183
|
-
│ ▲
|
|
184
|
-
│ │ reviewer 审批合并 MR
|
|
185
|
-
▼
|
|
186
|
-
SessionStart hook → teamai pull
|
|
187
|
-
自动拉取到所有成员本地
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
- `teamai push` 会创建独立分支(`teamai/push/<user>/<timestamp>`),推送后自动创建 Merge Request 并指派 reviewers
|
|
191
|
-
- `teamai init` 初始化时可配置默认 reviewers(记录在 `teamai.yaml` 的 `reviewers` 字段)
|
|
192
|
-
- `teamai init` 会自动注入与各工具格式对齐的 hooks(含 `SessionStart`、`Stop`、`PostToolUse`、`UserPromptSubmit` 等),会话中会执行 `teamai pull`、`teamai update`、追踪与仪表盘等(支持 Claude Code、Codex、Claude Code Internal、Codex Internal、Cursor、CodeBuddy IDE、OpenClaw、WorkBuddy)
|
|
193
|
-
- Skills 同步到 `~/.claude/skills/`、`~/.codex/skills/`、`~/.codex-internal/skills/`、`~/.claude-internal/skills/`、`~/.cursor/skills/`、`~/.codebuddy/skills/`
|
|
194
|
-
- Rules 同步到各工具的 rules 目录,并通过标记注释合并到 `CLAUDE.md`(支持 claude、claude-internal、codebuddy)
|
|
195
|
-
- Knowledge 同步到 `~/.teamai/docs/`
|
|
196
|
-
- Learnings 同步到 `~/.teamai/learnings/`,并基于该目录构建 recall 索引(全团队共享,不按角色拆分)
|
|
197
|
-
- Culture 同步团队文化文件(`culture.md`),编译 frontmatter 和 body 后注入到各 AI 工具的 `CLAUDE.md`
|
|
198
|
-
|
|
199
|
-
## 角色化 Skills
|
|
200
|
-
|
|
201
|
-
当团队资源仓库启用角色化目录后,Skills 按角色 namespace 组织,CLI 在 `teamai init` 时要求选择 `primaryRole` 和可选的 `additionalRoles`,并写入本地 `config.yaml`。
|
|
202
|
-
|
|
203
|
-
远端仓库目录约定:
|
|
204
|
-
|
|
205
|
-
```text
|
|
206
|
-
manifest/roles.yaml # 角色定义
|
|
207
|
-
skills/<namespace>/<skill>/ # 按 namespace 组织的 skills
|
|
208
|
-
rules/ # 全局,不做角色拆分
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
- `teamai pull` 读取 `manifest/roles.yaml`,只同步 `primaryRole + additionalRoles` 对应 namespace 中的 skills(同时保留 tag 过滤的并集)。
|
|
212
|
-
- Skills 从 `skills/<namespace>/<skill-name>/` 拍平安装到本地 `<tool>/skills/<skill-name>/`,用户无感知 namespace 结构。
|
|
213
|
-
- 如果激活 namespace 中出现同名 skill,`pull` 会直接失败,避免隐式覆盖。
|
|
214
|
-
- 不在激活 namespace 中、也不在 tag 过滤结果中的 skills 会被自动清理。
|
|
215
|
-
- `rules/`、`docs/`、`learnings/` 仍然保持原有逻辑,不做角色拆分(learnings 全团队共享)。
|
|
216
|
-
|
|
217
|
-
配置示例:
|
|
68
|
+
在 `hooks/hooks.yaml` 中声明自定义 hooks,`teamai pull` 自动分发到所有 AI 工具:
|
|
218
69
|
|
|
219
70
|
```yaml
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
71
|
+
hooks:
|
|
72
|
+
- id: block-secret
|
|
73
|
+
description: 提交前扫描密钥
|
|
74
|
+
event: PreToolUse
|
|
75
|
+
matcher: Bash
|
|
76
|
+
command: 'bash -lc "~/.teamai/team-scripts/scan-secret.sh" || true'
|
|
77
|
+
tools: [claude, cursor]
|
|
224
78
|
```
|
|
225
79
|
|
|
226
|
-
这会同步 `skills/common/`、`skills/hai/`、`skills/pm/` 三个 namespace 中的所有 skills。
|
|
227
|
-
|
|
228
|
-
## 角色化推送
|
|
229
|
-
|
|
230
|
-
角色化仓库下,推送新 skill 时 CLI 会自动检测可用的命名空间并提供交互式选择:
|
|
231
|
-
|
|
232
80
|
```bash
|
|
233
|
-
#
|
|
234
|
-
teamai
|
|
235
|
-
#
|
|
236
|
-
# Which namespace should new skills be pushed to?
|
|
237
|
-
# 1. common
|
|
238
|
-
# 2. hai
|
|
239
|
-
# 3. pm
|
|
240
|
-
# Choose namespace [1-3] (default: 1 = common):
|
|
241
|
-
|
|
242
|
-
# 显式指定目标 namespace
|
|
243
|
-
teamai push --role pm
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
- 有 `primaryRole` 时,从 `manifest/roles.yaml` 展开可用 namespace 列表
|
|
247
|
-
- 无 `primaryRole` 时,自动扫描团队仓库目录结构中的 namespace
|
|
248
|
-
- 单一命名空间时自动选中,无需交互
|
|
249
|
-
- `--role <id>` 可临时覆盖目标 namespace
|
|
250
|
-
- 修改已有 skill 时自动保持原 namespace,无需重新选择
|
|
251
|
-
|
|
252
|
-
推送时 CLI 会自动检查 `SKILL.md` 的 YAML frontmatter(`name`/`description`),缺失则自动补全,无需手动维护。
|
|
253
|
-
|
|
254
|
-
## 团队文化(Culture)
|
|
255
|
-
|
|
256
|
-
在团队仓库根目录创建 `culture.md`,用 YAML frontmatter 定义公司和团队信息,body 部分写团队文化指引:
|
|
257
|
-
|
|
258
|
-
```markdown
|
|
259
|
-
---
|
|
260
|
-
company:
|
|
261
|
-
name: Acme Corp
|
|
262
|
-
mission: Build great things
|
|
263
|
-
values:
|
|
264
|
-
- Innovation
|
|
265
|
-
- Integrity
|
|
266
|
-
team:
|
|
267
|
-
name: Platform
|
|
268
|
-
mission: Enable developers
|
|
269
|
-
goals:
|
|
270
|
-
- Ship v2.0
|
|
271
|
-
- Improve test coverage
|
|
272
|
-
---
|
|
273
|
-
|
|
274
|
-
## 编码准则
|
|
275
|
-
|
|
276
|
-
- 所有 PR 必须有至少一个 reviewer 审批
|
|
277
|
-
- 禁止直接 push master
|
|
278
|
-
- 测试覆盖率不低于 80%
|
|
81
|
+
teamai hooks list # 查看生效的 hooks
|
|
82
|
+
teamai hooks inject # 强制重新注入到所有工具
|
|
83
|
+
teamai hooks remove # 移除所有 teamai 管理的 hooks
|
|
279
84
|
```
|
|
280
85
|
|
|
281
|
-
|
|
86
|
+
### 跨团队 Skill 订阅
|
|
282
87
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
通过 `teamai source` 订阅其他团队的公共 skill 仓库,pull 时自动同步订阅源的 skills:
|
|
88
|
+
订阅其他团队的公开 skill 仓库:
|
|
286
89
|
|
|
287
90
|
```bash
|
|
288
|
-
|
|
289
|
-
teamai source add https://git.woa.com/other-team/teamai-public.git --name other-team
|
|
290
|
-
|
|
291
|
-
# 查看已订阅的源
|
|
91
|
+
teamai source add https://github.com/other-team/teamai-public.git --name other-team
|
|
292
92
|
teamai source list
|
|
293
|
-
|
|
294
|
-
# 浏览订阅源的 skills
|
|
295
|
-
teamai source browse other-team
|
|
296
|
-
|
|
297
|
-
# 移除订阅(同时清理其 skills)
|
|
93
|
+
teamai source browse other-team # 浏览可用 skills
|
|
298
94
|
teamai source remove other-team
|
|
299
95
|
```
|
|
300
96
|
|
|
301
|
-
|
|
97
|
+
订阅的 skills 在 `teamai pull` 时自动同步。
|
|
302
98
|
|
|
303
|
-
##
|
|
99
|
+
## 知识库
|
|
304
100
|
|
|
305
|
-
TeamAI
|
|
101
|
+
除了分发 Harness,TeamAI 还把团队沉淀的经验和代码结构组织成可检索的知识库,让 AI 在需要时自动召回。
|
|
306
102
|
|
|
307
|
-
|
|
308
|
-
|------|-------------------|---------------|
|
|
309
|
-
| **资源安装位置** | `~/` 下(如 `~/.claude/skills/`) | 项目目录下(如 `<project>/.claude/skills/`) |
|
|
310
|
-
| **配置文件** | `~/.teamai/config.yaml` | `<project>/.teamai/config.yaml` |
|
|
311
|
-
| **适用场景** | 通用团队规范、跨项目技能 | 项目特定的技能和规则 |
|
|
312
|
-
| **初始化** | `teamai init --repo <group>/<repo>` | `cd <project> && teamai init --repo <group>/<repo> --scope project` |
|
|
103
|
+
### 自动经验沉淀
|
|
313
104
|
|
|
314
|
-
|
|
315
|
-
- `teamai pull` 会依次拉取 user + project 两个 scope 的资源,互不冲突
|
|
316
|
-
- `teamai contribute --scope user/project` 可显式选择推送到哪个仓库
|
|
317
|
-
- `teamai recall` 自动合并两个 scope 的知识库,统一搜索排序,结果标注来源 `[user]`/`[project]`
|
|
318
|
-
- 远端 `teamai.yaml` 的 `scope` 字段锁定仓库类型,成员 init 时必须匹配
|
|
319
|
-
|
|
320
|
-
## 经验自动分享
|
|
321
|
-
|
|
322
|
-
当一次 AI coding session 结束时,系统会通过 Stop hook 智能评估 session 价值并提示分享:
|
|
105
|
+
Session 结束时,Stop hook 按**摩擦信号**对 session 评分——这些信号表明本次 session 踩到了值得记录的东西:你打断或纠正了 AI、拒绝了某次工具调用,或 AI 反复重试出错的工具。又长又顺(工具调用很多但没有摩擦)的 session 不会触发;真正较劲过的 session 才会。达标后 AI 会建议:
|
|
323
106
|
|
|
324
107
|
```
|
|
325
|
-
|
|
326
|
-
│
|
|
327
|
-
▼ PostToolUse hook 持续追踪工具调用和 skill 使用
|
|
328
|
-
│
|
|
329
|
-
▼ 会话结束(Stop hook 触发)
|
|
330
|
-
│
|
|
331
|
-
├─ 智能评分:工具调用数量 + 工具多样性 + skill 使用 + 错误重试 + session 时长
|
|
332
|
-
│ (从 dashboard events.jsonl 提取,一次性评估,满分 100)
|
|
333
|
-
│
|
|
334
|
-
├─ 分数 < 35 → 不打扰(工具调用少或缺乏多样性,没有总结价值)
|
|
335
|
-
│
|
|
336
|
-
▼ 分数 ≥ 35
|
|
337
|
-
│
|
|
338
|
-
AI 提示:"本次 session 内容丰富,建议运行 /teamai-share-learnings 分享经验"
|
|
339
|
-
│
|
|
340
|
-
▼ 用户同意
|
|
341
|
-
│
|
|
342
|
-
/teamai-share-learnings (AI sub-agent)
|
|
343
|
-
├─ AI 总结本次 session 的经验
|
|
344
|
-
├─ 生成 Markdown 文档
|
|
345
|
-
└─ teamai contribute --file <path> → 直接 push 到团队仓库 learnings/
|
|
108
|
+
建议运行 /teamai-share-learnings 总结本次 session 的经验并分享给团队。
|
|
346
109
|
```
|
|
347
110
|
|
|
348
|
-
|
|
349
|
-
- 每个 session 最多提示一次(去重),用户可以忽略
|
|
350
|
-
- 文档直接 push 到 `learnings/` 目录,团队成员下次 pull 时可见
|
|
111
|
+
`/teamai-share-learnings` skill 自动总结 session 经验并推送到团队仓库。每个 session 最多提示一次。
|
|
351
112
|
|
|
352
|
-
|
|
113
|
+
### 团队知识检索
|
|
353
114
|
|
|
354
|
-
`teamai recall`
|
|
355
|
-
|
|
356
|
-
```
|
|
357
|
-
contribute(写入) → pull(同步+索引) → recall(搜索) → upvote(投票) → 排序优化
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
```bash
|
|
361
|
-
$ teamai recall "fuse 端口"
|
|
362
|
-
[1/2] MR 审查发现 FUSE 端口冲突 Bug ★1 [user]
|
|
363
|
-
Author: jeffyxu | Score: 18.5 | Tags: troubleshooting, fuse, k8s
|
|
364
|
-
|
|
365
|
-
[2/2] FUSE 部署配置最佳实践 [project]
|
|
366
|
-
Author: alice | Score: 12.0 | Tags: fuse, deploy
|
|
367
|
-
```
|
|
368
|
-
|
|
369
|
-
- **双 scope 合并搜索**:自动合并 user 和 project scope 的知识库,结果标注来源
|
|
370
|
-
- Hybrid 中英文搜索(Intl.Segmenter + CJK bigrams)
|
|
371
|
-
- 搜索自动投票,好文档自然浮到顶部
|
|
372
|
-
- 投票按 scope 分别写入各自的 repo,归属正确
|
|
373
|
-
|
|
374
|
-
`teamai recall` 的输出会给每条命中前置 `[<type>]` 标签,方便调用方快速判断知识来源。共享检索索引覆盖四类内容:
|
|
375
|
-
|
|
376
|
-
| 类型 | 源路径 | 说明 |
|
|
377
|
-
|------|--------|------|
|
|
378
|
-
| `[learnings]` | `~/.teamai/learnings/*.md` | session 经验文档 |
|
|
379
|
-
| `[docs]` | 团队仓库 `docs/**/*.md` | 共享项目知识 |
|
|
380
|
-
| `[rules]` | 团队仓库 `rules/**/*.md` | 编码规则和约定 |
|
|
381
|
-
| `[skills]` | 团队仓库 `skills/<name>/SKILL.md` | 可复用 AI skill |
|
|
382
|
-
|
|
383
|
-
索引在每次 `teamai pull` 时自动重建。旧版索引(无 `version` 字段或缺少 `type`)会在首次使用时被自动检测并重建,对调用方透明
|
|
384
|
-
|
|
385
|
-
### 开启 / 关闭 Recall
|
|
386
|
-
|
|
387
|
-
Recall 功能通过两级配置控制——管理员设置团队默认值,成员可在本地覆盖:
|
|
388
|
-
|
|
389
|
-
| 层级 | 配置文件 | 字段 | 说明 |
|
|
390
|
-
|------|----------|------|------|
|
|
391
|
-
| 团队默认 | `teamai.yaml` | `sharing.recall.enabled` | `true` / `false`(默认 `false`) |
|
|
392
|
-
| 用户覆盖 | `~/.teamai/config.yaml` | `recallEnabled` | `true` / `false`,优先级高于团队默认 |
|
|
393
|
-
| 环境变量 | shell | `TEAMAI_RECALL_DISABLED=1` | 强制禁用所有 recall hooks(应急开关) |
|
|
394
|
-
|
|
395
|
-
```bash
|
|
396
|
-
teamai recall enable # 开启 recall,部署 subagent 和 rules
|
|
397
|
-
teamai recall disable # 关闭 recall,移除 subagent 和 rules
|
|
398
|
-
teamai recall status # 查看当前生效状态(团队默认 + 用户覆盖)
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
关闭后,`teamai pull` 将跳过部署 recall subagent、recall rules 注入块和 TodoWrite 提醒 hook。手动执行 `teamai recall <query>` 搜索不受此开关影响。
|
|
402
|
-
|
|
403
|
-
### 代码库知识图谱(teamwiki/)
|
|
404
|
-
|
|
405
|
-
`teamai codebase --extract`(或 `teamai import --from-repo`)解析源码仓库,将结构化知识图谱写入 `teamwiki/` 目录:
|
|
406
|
-
|
|
407
|
-
```
|
|
408
|
-
teamwiki/
|
|
409
|
-
├── router.md # 导航枢纽,列出所有已导入仓库
|
|
410
|
-
├── index.md # 全局索引(自动生成,含时间戳)
|
|
411
|
-
├── hot.md # 活跃工作记忆(Phase 4 hot/cold 预留)
|
|
412
|
-
├── source-manifest.json # 源文件哈希清单(增量提取用)
|
|
413
|
-
├── .indices/
|
|
414
|
-
│ └── graph-index.json # 知识图谱:nodes + edges(JSON 格式)
|
|
415
|
-
├── evidence/
|
|
416
|
-
│ └── code/
|
|
417
|
-
│ └── <project>/ # 每个导入的仓库一个目录
|
|
418
|
-
│ ├── index.md # 项目摘要(facts 总数 + 页面列表)
|
|
419
|
-
│ ├── component.md # 函数 / 类 / 组件
|
|
420
|
-
│ ├── interface.md # 接口和类型定义
|
|
421
|
-
│ ├── config.md # 配置项(环境变量、TOML key 等)
|
|
422
|
-
│ ├── error.md # 错误处理模式
|
|
423
|
-
│ └── relation-<dir>.md # 按顶级目录分组的 import 依赖关系
|
|
424
|
-
└── gaps/
|
|
425
|
-
└── detected.md # 知识缺口检测结果(IMPL_MISSING / LOW_CONNECTIVITY / …)
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
**graph-index.json** 存储提取出的知识图谱。真实数据参考:HAI 团队 11 个仓库 → **2 218 个节点,852 条边**。
|
|
429
|
-
|
|
430
|
-
| 字段 | 说明 |
|
|
431
|
-
|------|------|
|
|
432
|
-
| `nodes[].kind` | `component`(函数/类)或 `config`(配置项) |
|
|
433
|
-
| `edges[].relation` | `imports` —— 跨文件或跨仓库依赖关系 |
|
|
434
|
-
|
|
435
|
-
跨仓 edge 通过 PascalCase 标签匹配自动检测,无需手动配置。
|
|
436
|
-
|
|
437
|
-
`teamai recall` 利用此图谱进行 **BM25 + graph-boost** 检索:关键词命中后按图结构邻近度重排序,结果兼具文本相关性和结构相关性。
|
|
438
|
-
|
|
439
|
-
### TodoWrite 提醒 hook
|
|
440
|
-
|
|
441
|
-
`teamai pull` 会在 `TodoWrite` 工具上注册一个 PostToolUse hook。当 session 第一次写 TODO 列表时,hook 会注入一次性提醒,要求 agent 在尚未调用 `teamai-recall` 时先调用一次。session 级去重通过 `~/.teamai/sessions/<sid>-todowrite-hint.json` 实现(TTL 24 小时)
|
|
442
|
-
|
|
443
|
-
如果要全局关闭该提醒,请设置:
|
|
115
|
+
让 AI 在执行任务前自动检索团队积累的知识。该功能**默认关闭**,需显式开启——团队可在 `teamai.yaml` 设 `sharing.recall.enabled: true` 作为默认值,成员也可本地覆盖:
|
|
444
116
|
|
|
445
117
|
```bash
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
该环境变量同时也会关闭 `teamai recall` 的召回质量记录(用于 contribute-check 知识空白检测)
|
|
450
|
-
|
|
451
|
-
### `agents` 资源类型
|
|
452
|
-
|
|
453
|
-
团队仓库可以在扁平的 `agents/` 目录下放置自定义 subagent 定义(每个 agent 一个 `*.md`),push / pull / remove 语义与 `rules` 保持一致:
|
|
454
|
-
|
|
455
|
-
```text
|
|
456
|
-
team-repo/
|
|
457
|
-
agents/
|
|
458
|
-
code-reviewer.md # 团队作者编写的 subagent
|
|
459
|
-
.removed # tombstone(由 `teamai remove agents <name>` 自动管理)
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
`teamai pull` 会把它们复制到每个 Tier-1 工具的 `agents/` 目录(例如 `~/.claude/agents/`)。CLI 内置的 `teamai-recall.md` 会与团队 agents 一起部署,并在 `teamai push` 时被自动排除(由 CLI 管理,不归团队仓库)
|
|
463
|
-
|
|
464
|
-
### `hooks` 资源类型(团队自定义 hooks)
|
|
465
|
-
|
|
466
|
-
除了 CLI 内置的运维 hooks,团队还可以在仓库里**声明一次自己的 hooks**,由 `teamai pull` 自动适配下发到各 AI 工具(Claude Code、CodeBuddy、Cursor……)。在 `hooks/hooks.yaml` 中声明:
|
|
467
|
-
|
|
468
|
-
```yaml
|
|
469
|
-
hooks:
|
|
470
|
-
- id: block-secret # 唯一,^[a-z0-9-]+$,用于 marker 与清单索引
|
|
471
|
-
description: 提交前扫描密钥 # 写进 hook 的 description
|
|
472
|
-
event: PreToolUse # Claude 规范事件名(跨工具中立语言)
|
|
473
|
-
matcher: Bash # 可选,工具 matcher
|
|
474
|
-
command: 'bash -lc "~/.teamai/team-scripts/scan-secret.sh" || true'
|
|
475
|
-
timeout: 15 # 可选,秒
|
|
476
|
-
tools: [claude, cursor] # 可选,缺省 = 所有支持 hooks 的工具
|
|
477
|
-
|
|
478
|
-
# 可选:有限度地调整 CLI 自身的内置 hooks(仅白名单字段)
|
|
479
|
-
builtin:
|
|
480
|
-
disabled: [Hook dispatch post-tool-use TodoWrite] # 关闭某条内置 hook
|
|
481
|
-
overrides:
|
|
482
|
-
Hook dispatch stop: { timeout: 20 } # 仅允许覆盖 timeout
|
|
118
|
+
teamai recall enable # 开启:部署 teamai-recall 子 agent + 注入引导规则
|
|
119
|
+
teamai recall disable # 关闭:移除子 agent 和规则
|
|
120
|
+
teamai recall status # 查看生效状态(团队默认 + 用户覆盖)
|
|
483
121
|
```
|
|
484
122
|
|
|
485
|
-
|
|
486
|
-
- 团队 hooks 通过 `[teamai:hook:<id>]` marker 与内置 hooks 隔离,并记录在 `~/.teamai/managed-hooks.json` 中;从 `hooks.yaml` 删除某条后,下次 pull 会从所有工具干净移除,且**绝不误伤内置 hooks**。
|
|
487
|
-
- 写到磁盘的内容对内置 hooks **逐字节不变**,老机器升级 CLI 是零 diff、零回归。
|
|
488
|
-
|
|
489
|
-
审计、强制注入或清除当前生效的 hooks:
|
|
123
|
+
**通过子 agent 检索**:开启后 `teamai pull` 会把内置的 `teamai-recall` 子 agent 部署到各 AI 工具的 `agents/` 目录。AI 在任务开始前调用它——由子 agent 提取关键词、执行检索、读取命中的源文件,最后返回结构化的团队知识摘要。子 agent 底层调用的仍是 `teamai recall` 命令,也可手动直接运行:
|
|
490
124
|
|
|
491
125
|
```bash
|
|
492
|
-
teamai
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
```
|
|
126
|
+
$ teamai recall "port conflict"
|
|
127
|
+
[1/2] MR review caught a port-conflict bug ★1 [user]
|
|
128
|
+
Author: member-a | Score: 18.5 | Tags: troubleshooting, networking
|
|
496
129
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
> - `teamai.yaml` 中 `sharing.hooks.autoApply: false`:`pull` 时只提示、不自动应用,需用户手动 `teamai hooks inject` 同意。
|
|
500
|
-
> - `sharing.hooks.requireTeamScripts: true`:拒绝命令不在 `~/.teamai/team-scripts/` 下的团队 hook。
|
|
501
|
-
> - 设置 `TEAMAI_HOOKS_DISABLED=1` 可在本机否决所有团队 hooks(内置 hooks 仍生效)。
|
|
502
|
-
|
|
503
|
-
## 更新
|
|
504
|
-
|
|
505
|
-
```bash
|
|
506
|
-
teamai update # 自动检测并升级到最新版
|
|
507
|
-
npm update -g teamai-cli # 或手动触发 npm 升级
|
|
130
|
+
[2/2] Deployment configuration best practices [project]
|
|
131
|
+
Author: member-b | Score: 12.0 | Tags: deploy, config
|
|
508
132
|
```
|
|
509
133
|
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
- `teamai-cli` → 公网 npm (`https://registry.npmjs.org`)
|
|
513
|
-
- `@tencent/teamai-cli` → 内网 tnpm (`http://r.tnpm.oa.com`)
|
|
134
|
+
**检索内容覆盖两部分**:
|
|
514
135
|
|
|
515
|
-
|
|
136
|
+
- **共享检索索引**(`search-index.json`):learnings(session 经验)、docs(团队文档)、rules(编码规则)、skills(各 `SKILL.md`)四类,源自团队仓库对应目录,在 `teamai pull` / `teamai contribute` 时构建重建。
|
|
137
|
+
- **代码知识图谱**(`teamwiki/`):由 `teamai import` 生成,检索时实时查询。
|
|
516
138
|
|
|
517
|
-
|
|
139
|
+
排序采用 BM25 + 图谱增强,合并用户 / 项目双 scope 结果并标注来源;搜索会隐式为命中文档投票,优质内容自然上浮。
|
|
518
140
|
|
|
519
|
-
|
|
141
|
+
### 代码知识图谱
|
|
520
142
|
|
|
521
|
-
|
|
522
|
-
|---------|------|------|-------|
|
|
523
|
-
| 团队默认 | `teamai.yaml` | `autoUpdate` | `true`(默认)/ `false` |
|
|
524
|
-
| 用户覆盖 | `~/.teamai/config.yaml` | `updatePolicy` | `auto` / `prompt` / `skip` |
|
|
525
|
-
|
|
526
|
-
用户级 `updatePolicy` 始终优先于团队级 `autoUpdate`。
|
|
527
|
-
|
|
528
|
-
## CI 集成
|
|
529
|
-
|
|
530
|
-
TeamAI 可以集成到 CI 流水线中,从每次 MR/PR 自动提取知识:
|
|
531
|
-
|
|
532
|
-
```
|
|
533
|
-
MR 创建/更新 → CI 提取 learning + codebase 建议 → 以评论形式发布
|
|
534
|
-
→ Reviewer 拒绝不需要的建议(GitHub 👎 / TGit ☝️)
|
|
535
|
-
→ MR 合并 → CI 将已通过的条目写入团队知识仓库
|
|
536
|
-
```
|
|
537
|
-
|
|
538
|
-
### 快速开始
|
|
143
|
+
`teamai import` 将源码仓库解析为 `teamwiki/` 下的结构化图谱,实现结构感知的检索:
|
|
539
144
|
|
|
540
145
|
```bash
|
|
541
|
-
|
|
542
|
-
teamai
|
|
543
|
-
|
|
544
|
-
# Write 模式:将已通过的条目写入知识仓库(在合并后运行)
|
|
545
|
-
teamai ci extract-mr --url "$MR_URL" --mode write --team-repo ./team-repo --individual-comments
|
|
146
|
+
teamai import --from-repo https://github.com/org/repo
|
|
147
|
+
teamai import --from-org myorg # 批量导入所有仓库
|
|
148
|
+
teamai codebase --lint # 健康检查
|
|
546
149
|
```
|
|
547
150
|
|
|
548
|
-
|
|
151
|
+
图谱存储组件、接口、配置和跨仓库依赖边。`teamai recall` 利用图谱进行增强排名。
|
|
549
152
|
|
|
550
|
-
|
|
153
|
+
## 命令一览
|
|
551
154
|
|
|
552
|
-
|
|
|
155
|
+
| 命令 | 说明 |
|
|
553
156
|
|------|------|
|
|
554
|
-
| `
|
|
555
|
-
| `
|
|
556
|
-
|
|
557
|
-
|
|
157
|
+
| `teamai init` | 初始化:OAuth 登录、关联仓库、注册成员、注入 hooks |
|
|
158
|
+
| `teamai pull` | 拉取团队资源并注入到本地 AI 工具 |
|
|
159
|
+
| `teamai push` | 推送本地资源到分支并创建合并请求 |
|
|
160
|
+
| `teamai status` | 显示本地与团队仓库的差异 |
|
|
161
|
+
| `teamai contribute` | 将 session 经验分享到团队仓库 |
|
|
162
|
+
| `teamai recall <query>` | 搜索团队知识库(BM25 + 图谱增强) |
|
|
163
|
+
| `teamai recall enable/disable/status` | 开关或查看 recall 状态 |
|
|
164
|
+
| `teamai import` | 导入知识(`--dir`、`--from-repo`、`--from-org`、`--from-repo-list`、`--from-mr`、`--from-iwiki`) |
|
|
165
|
+
| `teamai codebase --lint` | 知识图谱健康检查 |
|
|
166
|
+
| `teamai ci extract-mr --url <url>` | CI:从 MR 提取知识、发评论、合并后写入 |
|
|
167
|
+
| `teamai members` | 查看团队成员 |
|
|
168
|
+
| `teamai roles` | 管理团队角色和命名空间 |
|
|
169
|
+
| `teamai skill exclude add/remove/list` | 管理不参与本地同步的 skills([使用指南](docs/usage-guide.zh-CN.md#排除个人不需要的-skill)) |
|
|
170
|
+
| `teamai source` | 管理跨团队 skill 订阅 |
|
|
171
|
+
| `teamai remove <type> <name>` | 删除资源并创建 MR |
|
|
172
|
+
| `teamai digest` | 生成团队周报 |
|
|
173
|
+
| `teamai doctor` | 诊断配置问题 |
|
|
174
|
+
| `teamai uninstall` | 移除所有 teamai 资源和 hooks |
|
|
558
175
|
|
|
559
|
-
|
|
560
|
-
|------|---------|---------|
|
|
561
|
-
| GitHub | 对建议评论添加 👎 reaction | 全部写入 |
|
|
562
|
-
| TGit | 对建议 note 添加 ☝️ emoji | 全部写入 |
|
|
176
|
+
全局选项:`--dry-run`、`--verbose`
|
|
563
177
|
|
|
564
178
|
## 许可证
|
|
565
179
|
|
|
@@ -567,4 +181,4 @@ teamai ci extract-mr --url "$MR_URL" --mode write --team-repo ./team-repo --indi
|
|
|
567
181
|
|
|
568
182
|
## 贡献
|
|
569
183
|
|
|
570
|
-
|
|
184
|
+
欢迎提交 PR!请先阅读 [CONTRIBUTING.md](.github/CONTRIBUTING.md)。
|
package/agents/teamai-recall.md
CHANGED
|
@@ -135,6 +135,7 @@ Return your output in **this exact format** to the main conversation:
|
|
|
135
135
|
- The trailing HTML comment **must** list every doc_id you returned —
|
|
136
136
|
later phases (Phase 3 Stop hook) will parse this from the conversation
|
|
137
137
|
transcript.
|
|
138
|
+
- **不要自己输出带内容的 `teamai:referenced-doc-ids` 标记** —— 那是主对话的职责。你只需在返回末尾另起一行提示主对话:`👉 主对话:完成任务后请在最终回复末尾声明实际引用的 doc-id(从上面 recalled-doc-ids 列表中挑出真正用到的),方括号内只填用到的、没用到就留空。` 这样主对话是"剪枝"而非"凭记忆重建",能显著提高声明率。
|
|
138
139
|
|
|
139
140
|
## Hard rules
|
|
140
141
|
|