dsh-plugin-t-expert 0.2.4 → 0.2.6

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 CHANGED
@@ -1,240 +1,146 @@
1
1
  # T专家(dsh-plugin-t-expert)
2
2
 
3
- **T专家** 把一个 **22 个分区 / 314 位专家**的名册(含全量中文译文)
4
- 做成一个独立的 DeepSeek Harness 插件,并在插件内部**自带一套多智能体团队引擎**(多成员小队、任务 DAG、调度、邮箱、活动面板)。
3
+ DeepSeek Harness 插件:**22 个分类 / 314 位专家**的名册(中文名、简介、人格正文全量覆盖),
4
+ 外加插件内自带的**多智能体团队引擎**(小队模板、任务 DAG、调度、活动面板)。
5
5
 
6
- 装上一个插件,你同时得到三样东西:
6
+ 装上以后你能做四件事:
7
7
 
8
- | 能力 | 说明 |
8
+ | 做什么 | 怎么做 |
9
9
  | --- | --- |
10
- | 专家名册 | 314 位专家,含**中文侧车**(中文名 / 中文简介 / 中文人格正文,当前覆盖率 314/314) |
11
- | `@` 召唤 | 在输入框打 `@` 出现按分区分组的中文菜单,选中的专家作为原生引用 chip 进入本轮对话 |
12
- | 模型工具 | `list_t_experts` / `summon_t_expert` / `summon_t_experts` / `t_team_plan_check` 四个工具 |
13
- | 小队命令 | `/t` 列出小队;`/t <小队名\|别名> <目标>` 直接拉起一支多成员小队干活 |
14
- | 设置页 | 设置 → T专家,两个标签:**专家**(启停 / 看提示词)与 **队伍**(小队模板 + 运行中的团队) |
10
+ | 用专家 | 输入框打 `@` 按分类分组的菜单 选中的专家作为引用 chip 进本轮对话;模型也可用 `summon_t_expert` 召唤 |
11
+ | 拉起一支小队干活 | `/t <小队> <目标>`(`/t` 单跑列出现有小队) |
12
+ | 管名册 | 设置 T专家 → **专家**(启停 / 看提示词 / 新建自建专家) |
13
+ | 管分类与小队 | 设置 T专家 **分类**(新建 / 改名 / 删除自建分类)、**队伍**(小队模板 + 运行中的团队) |
15
14
 
16
- 专家名册与团队引擎**解耦**:团队引擎挂载失败(例如宿主子代理契约不匹配)时,
17
- 专家名册、`@` 召唤、`/t` 列表仍然照常可用。
18
- > 注意:这条解耦覆盖的是**引擎的运行时挂载**。宿主包本身缺失时(插件声明了若干
19
- > `@deepseek-ai/*` peer 依赖,由 DSH 安装提供)整个插件都无法加载 —— 这是任何插件的共同前提。
15
+ 设置页一共**三个标签**:**专家**(启停 / 看提示词 / 新建自建专家)、**分类**(自建分类的增删改)、
16
+ **队伍**(小队模板 + 运行中的团队)。
20
17
 
21
18
  ---
22
19
 
23
- ## 一、环境要求
24
-
25
- | 项 | 要求 |
26
- | --- | --- |
27
- | DSH 宿主 | `0.1.5-rc.1` 或 `0.1.5-rc.2` |
28
- | Node.js | `^22.19.0 || >=24` |
29
- | pnpm | **必须在 PATH 上**。`dsh plugin` 本质上是在 profile 目录里转发 pnpm,缺 pnpm 会直接报错 |
30
- | python3 | 仅在用设置页「小队」标签编辑并编译小队时需要(保存时要调用 `team-profiles.py`) |
31
-
32
- ---
33
-
34
- ## 二、安装
35
-
36
- ### 1. 命令行安装(推荐)
20
+ ## 一、安装
37
21
 
38
22
  ```bash
39
23
  dsh plugin --profile web add dsh-plugin-t-expert
40
24
  ```
41
25
 
42
- 需要锁版本时:
43
-
44
- ```bash
45
- dsh plugin --profile web add --save-exact dsh-plugin-t-expert@0.1.1
46
- ```
47
-
48
- 插件在 `package.json` 里声明了 `dsh.bundle`(补丁文件 `cordis.patch.yml`),
49
- `dsh plugin` 会**自动**把它接到 profile 的 bundle 层(注册 `t-team` 与 `t-team-remote` 两行)。
50
- **你不需要手改任何配置文件。**
51
-
52
- ### 2. 图形端(DSH Desktop)
53
-
54
- `desktop` profile 由 Electron 应用独占,`dsh plugin --profile desktop …` 会被 CLI 直接拒绝:
55
-
56
- ```
57
- error: profile "desktop" is managed exclusively by the Electron application
58
- ```
59
-
60
- **请用插件市场(dsh-market)安装**:在 DSH Desktop 里搜索本插件一键装即可。
61
-
62
- 本仓库**不自带安装脚本**(维护者的运维脚本不在仓库里)。如果你要手工装,等价动作是:
63
- 把包内的 `lib/`、`data/`、`cordis.patch.yml` 与许可文件复制到一个运行目录,在目标 profile 的
64
- `package.json` 里加一条 `file:<该目录>` 依赖并追加到 `dsh.profile.bundles`,再把整个目录
65
- **真目录拷贝**(不要符号链接)到 profile 的 `node_modules/<包名>`。
26
+ **DSH Desktop 请在插件市场里装**(搜 `dsh-plugin-t-expert` 一键安装)。
27
+ `dsh plugin --profile desktop …` 会被 CLI 拒绝(desktop profile 由 Electron 应用独占),
28
+ 这不是本插件的限制——任何插件都一样。
66
29
 
67
- > ⚠️ `file:` 依赖指向的是**运行目录**,与首次播种出来的数据目录是两处,不要混在一起:
68
- > 运行目录可随时重建,数据目录必须长期保留。清空或迁移运行目录会连带影响插件解析,
69
- > 届时重跑一遍安装步骤即可。
30
+ 依赖:DSH 宿主 `0.1.5-rc.1` / `0.1.5-rc.2`;Node `^22.19.0 || >=24`;`pnpm` 在 PATH 上
31
+ (`dsh plugin` 本质是在 profile 目录里转发 pnpm)。`python3` 只在**设置页保存小队**时需要
32
+ (要调用小队编译器);缺它插件照常加载,只是小队编译会报错并回滚。
70
33
 
71
- ### 3. 装完之后
72
-
73
- 1. 重启 DSH。
74
- 2. 打开 **设置 → T专家**。
75
- 3. 勾选要启用的专家(**默认全部未启用**,未启用的专家不能被召唤)。
76
- 4. 回到输入框打 `@`,出现 T专家的分组菜单即可用。
34
+ 装完重启 DSH,然后在 **设置 → T专家** 里启用专家——**默认全部未启用**,未启用的专家不能被召唤。
77
35
 
78
36
  ---
79
37
 
80
- ## 三、数据目录与首次播种
81
-
82
- 插件对任何机器都是**自包含**的:包内自带一份数据快照(`data/`),
83
- 首次启动时会把快照**播种**到你的数据目录 `~/.t-team/`,因此不需要任何额外脚本或同步流程。
38
+ ## 二、数据目录
84
39
 
85
- - 默认 `root = ~/.t-team/experts`、`zhRoot = ~/.t-team/zh`。
86
- - **已有的文件不会被覆盖**:目录(`experts` / `zh`)与文件(`teams.json` / `teams.resolved.json` / `t-team.config.json` / `team-profiles.py` / `source.json`)按项独立判断,缺哪个补哪个。
87
- - 因此**升级插件不会动你改过的内容**(例如你编辑过的小队定义、你补译的中文正文)。
88
- - 播种失败(只读文件系统、权限不足等)只告警,插件照常加载。
89
-
90
- 播种后的数据目录大致是:
40
+ 插件对任何机器都**自包含**:包内带一份名册快照,首次启动播种到 `~/.t-team/`。
91
41
 
92
42
  ```
93
43
  ~/.t-team/
94
- ├── experts/ # 专家名册:<分区>/<slug>.md(22 个分区、314 位)
95
- ├── zh/ # 中文侧车(译文只在这里,永不写进 experts/)
96
- ├── names.json # slug → 中文名
97
- ├── descriptions.json # slug → 中文简介
98
- ├── divisions.json # 分区中文标签
99
- ├── <分区>/<slug>.md # 中文人格正文(与 experts/ 同相对路径)
100
- ├── manual.json # 人工补译:names / descriptions(优先于自动层)
101
- │ ├── manual-bodies/ # 人工补译正文(最高优先,不会被覆盖)
102
- │ └── COVERAGE.json # 中文覆盖率与缺口清单
103
- ├── teams.json # 小队定义(设置页「小队」标签写回这里)
104
- ├── teams.resolved.json # 编译产物:/t 列表与成员解析用
105
- ├── t-team.config.json # 编译产物:内置团队引擎的配置(人格已内联)
106
- ├── team-profiles.py # 小队编译器(设置页保存小队时调用)
107
- └── source.json # 名册指纹(宿主据此判断名册是否变化)
44
+ ├── experts/ 名册:<分类>/<slug>.md(22 个分类、314 位)
45
+ ├── zh/ 中文侧车:names.json、descriptions.json、<分类>/<slug>.md、divisions.json
46
+ ├── custom/ 你在面板里自建的专家
47
+ ├── teams.json 小队定义(设置页「队伍」写回这里)
48
+ ├── t-team.config.json 小队编译产物(引擎配置,人格已内联)
49
+ ├── teams.resolved.json 小队编译产物(/t 列表用)
50
+ ├── team-profiles.py 小队编译器的播种副本(实际跑的是包内那份)
51
+ └── source.json 名册清单(专家数 / 分类 / 更新时间)
108
52
  ```
109
53
 
110
- 换源或改目录位置:用配置项 `root` / `zhRoot` 覆盖即可,不必改代码。
54
+ - **已有文件不会被覆盖**:升级插件不会动你改过的小队定义或补译的中文正文。
55
+ 唯一例外是小队编译器——它是代码、随插件版本走,始终用包内那份(数据目录里那份只作兜底)。
56
+ - 想换目录位置,用配置项 `root` / `zhRoot` / `customRoot` 覆盖即可,不必改代码。
111
57
 
112
58
  ---
113
59
 
114
- ## 四、配置项
115
-
116
- 以插件 `Config` 定义为准(`lib/index.js`):
117
-
118
- | 配置项 | 类型 | 默认值 | 含义 |
119
- | --- | --- | --- | --- |
120
- | `root` | string | `~/.t-team/experts` | 专家名册目录,读 `experts/<分区>/<slug>.md` |
121
- | `zhRoot` | string | `~/.t-team/zh` | 中文侧车目录(名字 / 简介 / 正文 / 分区标签) |
122
- | `provider` | string | `"spawn"` | 召唤专家时使用的子代理 provider |
123
- | `divisions` | string[] | `[]` | 留空 = 自动扫描 `root` 下所有含 `.md` 的分区目录 |
124
- | `maxDepth` | natural | 无默认(不传则不加限制) | 传给子代理的嵌套深度上限 |
125
- | `maxSummonBatch` | natural | `8` | 一次 `summon_t_experts` 最多几位专家 |
126
- | `summonConcurrency` | natural | `4` | `summon_t_experts` 的并发度 |
127
- | `summonTaskMaxChars` | natural | `8000` | 单个专家任务的字符上限 |
128
- | `descriptionLimit` | natural | `120` | `list_t_experts` 里简介的截断长度 |
129
- | `engineConfig` | string | `root` 同级目录下的 `t-team.config.json` | 团队引擎配置路径(`team-profiles.py` 的产物) |
130
- | `stateDir` | string | `".agent-teams"` | 团队状态目录(相对工作区) |
131
- | `memberProvider` | string | `"spawn"` | 队员子代理使用的 provider |
132
- | `memberModel` | string | 不传 = 跟随队长 | 队员默认模型 |
133
- | `maxMembers` | natural | `8` | 一支团队最多几名成员 |
134
-
135
- > 这些都可以在 profile 的 `cordis.patch.yml` 里覆盖,例如:
136
- >
137
- > ```yaml
138
- > - id: t-team
139
- > name: 'dsh-plugin-t-expert'
140
- > config:
141
- > maxSummonBatch: 4
142
- > stateDir: .my-team-state
143
- > ```
144
- >
145
- > 注意 patch 行的 `config` 是**整体替换**而不是深合并,覆盖时要重述该行需要的每一个键。
146
-
147
- **引擎配置:缺失 vs 损坏**。`engineConfig` 指向的文件不存在时(例如自定义了 `root`、还没生成过小队),插件正常加载,只是团队功能不可用 —— 原因会写进日志、由 `/t` 报出,并进入系统提示段让模型知道,不是静默跳过。而文件存在却解析失败、或 `profiles` 类型不对,属于自带数据的错配,插件会在**加载时直接失败**并指出路径与修法。
60
+ ## 三、自建专家与分类
148
61
 
149
- ---
62
+ **新建专家**:设置 → 专家 → 「+ 新建专家」,选分类(官方 22 个或你自建的),填名称 / 简介 / 人格正文。
150
63
 
151
- ## 五、工具与命令
64
+ - 自建专家写在 `customRoot`(默认 `~/.t-team/custom/<分类>/<slug>.md`),**与随包发布的名册分开**:
65
+ 内置名册升级时整棵替换,自建的不受影响。
66
+ - 归到官方分类名下是**允许且安全**的:分类只是归属,文件仍在 `customRoot`,内置名册一个字节不动。
67
+ - 自建专家自带中文(frontmatter 里的 `name` 就是显示名),不依赖中文侧车。
152
68
 
153
- ### 工具
69
+ **新建分类**:设置 → 分类 → 填目录名(小写 ASCII)+ 显示名(中文)。
70
+ 官方分类只读(名字与存亡随包内名册);删除自建分类时若里面还有专家会被拒绝,不会静默连删。
154
71
 
155
- | 工具 | 作用 |
156
- | --- | --- |
157
- | `list_t_experts` | 列出**已启用**专家的分区与数量;传入分区名可列出该分区专家(用于挑出唯一的专家名) |
158
- | `summon_t_expert` | 召唤 1 位专家:以该专家的完整人格跑一个子代理并返回结果(阻塞等待) |
159
- | `summon_t_experts` | 并行召唤多位专家:最多 8 位、并发 4;部分失败时仍返回成功的结果 |
160
- | `t_team_plan_check` | **只读** DAG 预检:把打算创建的一批团队任务先跑一遍引擎校验,一次报出全部问题、警示与建议执行顺序 |
72
+ ---
161
73
 
162
- > 团队引擎自身还注册了 `t_team_*` 系列工具(建队、建任务、派发等),随插件一起提供。
74
+ ## 四、工具与命令
163
75
 
164
- ### 命令
76
+ | 工具 | 作用 |
77
+ | --- | --- |
78
+ | `list_t_experts` | 列出已启用专家的分类与数量;传分类名可列出该分类的专家 |
79
+ | `summon_t_expert` | 召唤 1 位专家:以它的完整人格跑一个子代理并返回结果 |
80
+ | `summon_t_experts` | 并行召唤多位(最多 8 位、并发 4;部分失败仍返回成功的结果) |
81
+ | `t_team_plan_check` | 只读 DAG 预检:一批团队任务先跑一遍引擎校验,一次报出全部问题 |
165
82
 
166
- | 用法 | 行为 |
83
+ | 命令 | 行为 |
167
84
  | --- | --- |
168
85
  | `/t` | 列出所有小队(key、别名、人数、成员中文名) |
169
- | `/t <小队名\|别名>` | 选定小队,队长会列出成员并问你这次要做什么 |
170
- | `/t <小队名\|别名> <目标>` | 拉起该小队执行目标(队长先给出成员与任务草案,等你 review 后再启动) |
171
- | `/t <一句话目标>` | 没有匹配到小队名时,按目标自动挑选最合适的小队 |
86
+ | `/t <小队\|别名>` | 选定小队,队长列出成员并问你目标 |
87
+ | `/t <小队\|别名> <目标>` | 拉起小队干活(先给成员与任务草案,你 review 后开跑) |
88
+ | `/t <一句话目标>` | 没匹配到小队名时,按目标自动挑最合适的小队 |
172
89
 
173
- 小队**列表与匹配**每次都从磁盘读定义,所以改完名字立刻反映在 `/t` 里;
174
- 但**建队时用的是插件启动时载入的引擎配置**,因此小队定义的增删改要**重启 DSH** 才对建队生效。
90
+ 团队引擎另注册 **13 个 `t_team_*` 工具**(`t_team_create` 建队、`t_team_approve` 审批、
91
+ `t_team_create_task` 建任务、`t_team_reassign_task` 派发、`t_team_status` 看状态、`t_team_resume` 恢复等),
92
+ 随插件一起提供;队长与成员各看到其中一个子集。
175
93
 
176
94
  ---
177
95
 
178
- ## 六、编辑小队
96
+ ## 五、小队
97
+
98
+ 设置 → 队伍 里搜索、修改成员 / 别名 / 启停,然后保存:改动写回 `~/.t-team/teams.json`,
99
+ 再调用小队编译器生成引擎配置;**编译失败会自动回滚**,不会把坏定义留在盘上。
179
100
 
180
- **设置 T专家 队伍** 标签里可以搜索、修改成员 / 别名 / 启停,然后保存。
101
+ > ⚠️ **保存后要重启 DSH 才对建队生效**:`/t` 列表会立刻显示新小队,
102
+ > 但引擎配置在插件启动时就已载入,不重启用新小队建不了队。
181
103
 
182
- 保存流程:
104
+ 约束:小队 key 只能 ASCII `a-z0-9-`(中文放 `description` / `aliases`);每队 ≤ 8 人;小队总数 ≤ 48;
105
+ 别名全局唯一;成员必须是名册里真实存在的专家。
183
106
 
184
- 1. 把改动写回 `~/.t-team/teams.json`;
185
- 2. 调用 `~/.t-team/team-profiles.py` 编译出 `t-team.config.json` 与 `teams.resolved.json`;
186
- 3. **编译失败会自动回滚** `teams.json`(不会把坏定义留在盘上);
187
- 4. 缺 `python3` 时报错并回滚。
107
+ ---
188
108
 
189
- > ⚠️ **保存后需要重启 DSH**:`/t` 列表会立刻看到新小队,但引擎配置在插件启动时已载入,
190
- > 不重启就建不了队(`/t 新队 目标` 会提示「小队不存在」)。
109
+ ## 六、配置项
191
110
 
192
- 硬约束(由 `team-profiles.py` 与小队数据层校验):
111
+ 全部以插件 `Config` 定义为准(`lib/index.js`,共 15 项)。常用的几个:
193
112
 
194
- | 约束 | |
195
- | --- | --- |
196
- | 小队 key | 只能是 ASCII 的 `a-z0-9-`(形如 `^[a-z0-9]+(?:-[a-z0-9]+)*$`),中文放在 `description` `aliases` |
197
- | 每队成员数 | 8 |
198
- | 小队总数 | 48 |
199
- | 每队固定任务数 | 32 |
200
- | 别名 | 全局唯一,不能与别的小队 key 冲突(否则 `/t` 无法判断用哪支) |
201
- | 成员 | 写专家 slug(或 `{slug, role}`),必须能在名册里找到有效成员 |
113
+ | 配置项 | 默认值 | 含义 |
114
+ | --- | --- | --- |
115
+ | `root` | `~/.t-team/experts` | 名册目录 |
116
+ | `zhRoot` | `~/.t-team/zh` | 中文侧车目录 |
117
+ | `customRoot` | `~/.t-team/custom` | 自建专家目录(与 `root` 分开是硬要求) |
118
+ | `provider` | `"spawn"` | 召唤专家用的子代理 provider |
119
+ | `divisions` | `[]` | 留空=自动扫描 `root` 下所有含 `.md` 的分类 |
120
+ | `maxSummonBatch` / `summonConcurrency` | `8` / `4` | 批量召唤上限与并发 |
121
+ | `stateDir` / `memberProvider` / `memberModel` / `maxMembers` | — | 转给内置团队引擎 |
202
122
 
203
123
  ---
204
124
 
205
125
  ## 七、许可
206
126
 
207
- 本插件以 **MIT** 发布,全文见 `LICENSE`。
208
-
209
- 随包分发的专家名册、中文译文与内置团队引擎各自按 MIT 授权使用,
210
- 各自的来源、版本与署名要求写在 `THIRD-PARTY-NOTICES` 里,**完整许可文本随包放在 `vendor/` 下**。
211
- 再分发本插件(含修改版)时,请一并保留 `LICENSE`、`THIRD-PARTY-NOTICES` 与 `vendor/` 下的许可文本。
127
+ 本插件 MIT(见 `LICENSE`)。随包分发的专家名册、中文译文与内置团队引擎各自按其原许可使用:
128
+ 来源、版本与署名写在 `THIRD-PARTY-NOTICES`,完整许可文本随包放在 `vendor/`。
129
+ 再分发(含修改版)时请一并保留这三样。
212
130
 
213
131
  ---
214
132
 
215
- ## 八、开发 / 构建
133
+ ## 八、开发
216
134
 
217
135
  ```bash
218
- npm install # 安装依赖(peer 依赖由 DSH 宿主提供)
219
- npm run build # 品牌化 + 构建客户端产物
220
- npm run verify # 自检套件(插件契约、工具、remote、客户端产物、播种与快照一致性)
221
- npm run sync-data # 把运行时数据同步进包内 data/(默认源 ~/.t-team)
136
+ npm run build # 构建客户端产物(lib/client.js)
137
+ npm run verify # 自检套件:插件契约、工具、remote、客户端产物、播种与快照,
138
+ # 外加「发布包自洽」(真打一份 tgz、解开、再用插件解析器读一遍)
139
+ npm run sync-data # 把运行时数据同步进包内 data/
222
140
  ```
223
141
 
224
- > ⚠️ 这些 script 的实现文件**不在本仓库里**:维护者把它们放在仓库同级的运维目录
225
- > (`../brand.mjs`、`../build-client.mjs`、`../verify.mjs`、`../sync-data.mjs`,由 `package.json`
226
- > 的 `scripts` 以相对路径引用)。只 clone 本仓库是跑不了构建与自检的;要发布请使用完整的工作目录。
227
- >
228
- > `npm run build` 必须**先**品牌化再构建客户端:客户端产物把品牌化后的引擎 bundle 内联进去,
229
- > 顺序错了会把旧文本打进产物。
230
-
231
- ---
232
-
233
- ## 九、已知限制
142
+ > 这些 script 的实现不在本仓库:维护者的构建 / 自检脚本放在仓库同级的运维目录,
143
+ > `package.json` 以 `node ../<file>.mjs` 引用。只 clone 本仓库跑不了构建与自检。
234
144
 
235
- - 客户端面板**不做自定义专家的增删改**;要加自己的专家,直接把 `.md` 放进 `~/.t-team/experts/<分区>/`,宿主按 mtime 指纹自动重载,不需要重启。
236
- (中文侧车同理:`zh/` 下的名字 / 简介 / 正文文件增删改都会按指纹重载。)
237
- - 包内快照只在数据目录**缺项**时播种。升级插件只更新包内快照,**不会覆盖你已有的数据目录内容**。
238
- - 小队定义的改动需要重启 DSH 才对**建队**生效(见第五、六节)。
239
- - 改插件代码后需要重新 `npm run build`(改了 `src/client.jsx` 才会重新生成客户端产物)并重装/重启。
240
- - 团队引擎挂载失败时,团队相关功能不可用,但专家名册、`@` 召唤、`/t` 列表不受影响,失败原因由 `/t` 报出。
145
+ 内置团队引擎(`lib/teams/`)是**手工维护的源码**,改引擎直接改这里;
146
+ 名册(`data/experts/`)与中文侧车(`data/zh/`)就是发布源,两者都不再从任何上游同步。
@@ -12,13 +12,17 @@
12
12
  | 上游仓库 | https://github.com/NanmiCoder/dsh-agent-teams |
13
13
  | 版本 | `0.1.17-rc.1` |
14
14
  | 许可 | MIT(完整文本随包:`vendor/dsh-agent-teams/LICENSE`)— Copyright (c) 2026 程序员阿江(Relakkes) |
15
- | 位置 | `vendor/dsh-agent-teams/upstream/`(上游文件逐字节原样保留,含 `LICENSE` 与 `VENDOR.md`)、`lib/teams/`(由品牌化工具 `brand.mjs` 从上游镜像生成的品牌化产物:命令 `/agent-teams` → `/t`、工具 `agent_teams_*` → `t_team_*`) |
15
+ | 位置 | `lib/teams/`(16 个文件,由上述上游派生的品牌化产物:命令 `/agent-teams` → `/t`、工具 `agent_teams_*` → `t_team_*`)。它的客户端产物内联在 `lib/client.js` 里 |
16
+ | 许可全文 | `vendor/dsh-agent-teams/LICENSE` |
16
17
 
17
- **对上游镜像的改动**:`vendor/dsh-agent-teams/upstream/` 内的文件**永不修改**;
18
- `lib/teams/` 是生成物,差异 = 品牌化改名 + `brand.mjs` 中逐条注释的 `FIXES`。
19
- 除改名外,`FIXES` 还包含少量**本地缺陷修补与必要的行为改动**(例如把 profile 上限从 16 抬到 48
20
- 修正命令视图 key、修正交接期与终态任务的校验、放行 `.env.example` 一类模板文件等)。
21
- 每条 `FIXES` 都声明了期望命中次数,上游文本一变即构建失败,不会静默退回上游行为。
18
+ **本插件对该上游做的改动**(都在 `lib/teams/` 里,可直接对照阅读):
19
+ 一是品牌化改名(命令与工具名、包 id、事件与路由前缀);二是少量**本地缺陷修补与必要的行为改动**
20
+ (例如把 profile 上限从 16 抬到 48、修正命令视图 key、修正交接期与终态任务的校验、
21
+ 放行 `.env.example` 一类模板文件等)。上游文本从未被修改过——我们只在自己的产物里改。
22
+
23
+ > 2026-09-12 起,上游的**逐字节原样镜像**(`vendor/dsh-agent-teams/upstream/`)与品牌化生成工具
24
+ > (`brand.mjs`)已从仓库移除:`lib/teams/` 转为**手工维护的源码**,不再在构建时从上游重新生成。
25
+ > 停止跟随上游不改变署名义务,故本节保留。
22
26
 
23
27
  ## 2. 专家名册与中文侧车
24
28
 
@@ -27,20 +31,22 @@
27
31
  | 英文名册 | The Agency / AgentLand(`msitarzewski/agency-agents`)— MIT,Copyright (c) 2025 AgentLand Contributors。完整文本随包:`vendor/third-party-licenses/agency-agents.LICENSE` |
28
32
  | 中文译文 | `jnMetaCode/agency-agents-zh`(中文翻译与本地化)— MIT,Copyright (c) 2025 Michael Sitarzewski(英文原版)、Copyright (c) 2026 jnMetaCode(中文翻译与本地化)。完整文本随包:`vendor/third-party-licenses/agency-agents-zh.LICENSE` |
29
33
  | 分发形态 | 上述两部分内容随 `@michengai/dsh-agency-agents` 一同分发(该包自身的 TypeScript 源码与构建脚本为 Apache-2.0,**本插件不打包其任何代码**) |
30
- | 版本指纹 | `data/source.json` `sourceRevision`;补入部分见同文件的 `extraSource` / `extraSourceVersion` |
31
- | 位置 | `data/experts/`(22 分区 / 314 位)、`data/zh/`(中文名字 / 简介 / 人格正文 / 分区标签) |
34
+ | 位置 | `data/experts/`(22 个分类 / 314 位)、`data/zh/`(中文名字 / 简介 / 人格正文 / 分类标签) |
35
+ | 维护方式 | 上述内容随本插件分发(`data/` 是发布源,不再从上游重新镜像);`data/source.json` 是该名册的清单(专家数 / 分类 / 更新时间) |
36
+
37
+ 名册的构成分两部分(总计 314 位):
32
38
 
33
- 名册的构成分两部分:
39
+ - **279 位来自 `msitarzewski/agency-agents`**(上表英文名册一行)。
40
+ - **35 位来自 `@michengai/dsh-agency-agents` 的包内快照**(company / hr / legal / supply-chain
41
+ 四个分类,以及若干中国本地化角色)。这些条目在另一上游仓库的任何历史与分支里都不存在,只随该包分发。
42
+ 它们的英文人格与中文译文同样按上表两个 MIT 项目(AgentLand Contributors / jnMetaCode)的条款使用,
43
+ 完整许可文本与上表共用。与已有角色职能重复的条目未并入。
34
44
 
35
- - **279 位逐字节镜像上游仓库** `msitarzewski/agency-agents`(上表第 1 行),随时可 `git pull` 后重新镜像。
36
- - **35 位由 `@michengai/dsh-agency-agents` 包内快照补入**(company / hr / legal / supply-chain
37
- 四个分区,以及若干中国本地化角色)。这些条目在上游仓库的任何历史与分支里都不存在,只随该包分发;
38
- 其英文人格与中文译文同样按上表两个 MIT 项目(AgentLand Contributors / jnMetaCode)的条款使用,
39
- 完整许可文本与上表共用。补入范围与逐条判定依据记录在 `data/source.json` 的
40
- `extraAdded` / `extraSkipped`(与上游角色职能重复的条目会被排除,不并入名册)。
45
+ > 两部分内容自 2026-09-12 起随本插件分发并作为**名册真源**维护,不再从上游重新拉取或镜像
46
+ > (原镜像 / 补入脚本与逐条判定记录已移除;需要追溯当时来源与判定,见仓库 git 历史)。
41
47
 
42
- `data/zh/manual.json` 与 `data/zh/manual-bodies/` 是**本项目的补充翻译**(用于补齐上游尚未覆盖的
43
- 条目或在译文不准确时覆盖),随本插件以 MIT 发布。
48
+ `data/zh/manual.json` 与 `data/zh/manual-bodies/` 是**本项目的补充翻译**(用于补齐尚未覆盖的条目
49
+ 或在译文不准确时覆盖),随本插件以 MIT 发布,同样保留在包内。
44
50
 
45
51
  ## 3. 分发要求
46
52
 
package/data/source.json CHANGED
@@ -1,8 +1,6 @@
1
1
  {
2
- "source": "<home>/.agency-agents",
3
- "sourceRevision": "6d29a9b",
4
- "target": "<home>/web/t-team/data/experts",
5
- "syncedAt": "2026-09-12 14:47:18 +0800",
2
+ "updatedAt": "2026-09-12 15:56:06 +0800",
3
+ "expertFiles": 314,
6
4
  "divisions": [
7
5
  "academic",
8
6
  "company",
@@ -27,88 +25,5 @@
27
25
  "support",
28
26
  "testing"
29
27
  ],
30
- "expertFiles": 314,
31
- "extraSource": "<home>/.dsh/profiles/desktop/node_modules/@michengai/dsh-agency-agents/assets/agency-agents",
32
- "extraSourceVersion": "0.1.41",
33
- "extraAdded": 35,
34
- "extraSkipped": [
35
- {
36
- "division": "company",
37
- "slug": "chief-of-staff",
38
- "duplicateOf": "specialized-chief-of-staff",
39
- "verdict": "duplicate"
40
- },
41
- {
42
- "division": "engineering",
43
- "slug": "engineering-network-engineer-china",
44
- "duplicateOf": "engineering-china-network-engineer",
45
- "verdict": "duplicate"
46
- },
47
- {
48
- "division": "engineering",
49
- "slug": "engineering-security-engineer",
50
- "duplicateOf": "security-appsec-engineer",
51
- "verdict": "duplicate"
52
- },
53
- {
54
- "division": "engineering",
55
- "slug": "engineering-threat-detection-engineer",
56
- "duplicateOf": "security-threat-detection-engineer",
57
- "verdict": "duplicate"
58
- },
59
- {
60
- "division": "finance",
61
- "slug": "finance-financial-forecaster",
62
- "duplicateOf": "finance-financial-analyst",
63
- "verdict": "near-duplicate"
64
- },
65
- {
66
- "division": "hr",
67
- "slug": "hr-recruiter",
68
- "duplicateOf": "specialized-recruitment-specialist",
69
- "verdict": "duplicate"
70
- },
71
- {
72
- "division": "marketing",
73
- "slug": "marketing-bilibili-strategist",
74
- "duplicateOf": "marketing-bilibili-content-strategist",
75
- "verdict": "near-duplicate"
76
- },
77
- {
78
- "division": "marketing",
79
- "slug": "marketing-ecommerce-operator",
80
- "duplicateOf": "marketing-china-ecommerce-operator",
81
- "verdict": "duplicate"
82
- },
83
- {
84
- "division": "marketing",
85
- "slug": "marketing-wechat-operator",
86
- "duplicateOf": "marketing-wechat-official-account",
87
- "verdict": "duplicate"
88
- },
89
- {
90
- "division": "marketing",
91
- "slug": "marketing-xiaohongshu-operator",
92
- "duplicateOf": "marketing-xiaohongshu-specialist",
93
- "verdict": "duplicate"
94
- },
95
- {
96
- "division": "specialized",
97
- "slug": "prompt-engineer",
98
- "duplicateOf": "engineering-prompt-engineer",
99
- "verdict": "duplicate"
100
- },
101
- {
102
- "division": "specialized",
103
- "slug": "specialized-pricing-optimizer",
104
- "duplicateOf": "specialized-pricing-analyst",
105
- "verdict": "near-duplicate"
106
- },
107
- {
108
- "division": "support",
109
- "slug": "support-recruitment-specialist",
110
- "duplicateOf": "specialized-recruitment-specialist",
111
- "verdict": "duplicate"
112
- }
113
- ]
28
+ "note": "本仓名册清单:data/experts 是真源,由 add-expert.py 维护(上游同步已移除)"
114
29
  }
@@ -42,7 +42,7 @@ DEFAULT_PATCH = os.environ.get("T_TEAM_PATCH", os.path.join(HOME, ".dsh", "profi
42
42
  MARKER_START = "# >>> t-team teams(由 team-profiles.py 生成,勿手改;改 teams.json 后重跑)"
43
43
  MARKER_END = "# <<< t-team teams"
44
44
 
45
- MAX_PROFILES = 48 # 引擎侧已由品牌化工具 brand.mjs MAX_TEAM_PROFILES 调到 48(上游默认 16)
45
+ MAX_PROFILES = 48 # 引擎侧 lib/teams/profiles.js 已把 MAX_TEAM_PROFILES 调到 48(原默认 16)
46
46
  MAX_MEMBERS = 8 # 一个 profile 的成员数上限(经验值:队长上下文压力)
47
47
  MAX_SEED_TASKS = 32 # AgentTeams: MAX_PROFILE_TASKS
48
48
  PROFILE_KEY_RE = re.compile(r"^[a-z0-9]+(?:-[a-z0-9]+)*$")
@@ -14,7 +14,7 @@
14
14
  "missingDescription": [],
15
15
  "missingBody": []
16
16
  },
17
- "generatedFrom": "<home>/.dsh/profiles/desktop/node_modules/@michengai/dsh-agency-agents",
17
+ "generatedFrom": "<home>/web/t-team/vendor/agency-agents",
18
18
  "divisions": 22,
19
19
  "unlabelledDivisions": []
20
20
  }