dsh-plugin-t-expert 0.1.1 → 0.2.2

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
@@ -11,12 +11,12 @@
11
11
  | `@` 召唤 | 在输入框打 `@` 出现按分区分组的中文菜单,选中的专家作为原生引用 chip 进入本轮对话 |
12
12
  | 模型工具 | `list_t_experts` / `summon_t_expert` / `summon_t_experts` / `t_team_plan_check` 四个工具 |
13
13
  | 小队命令 | `/t` 列出小队;`/t <小队名\|别名> <目标>` 直接拉起一支多成员小队干活 |
14
- | 设置页 | 设置 → T专家,三个标签:**专家**(启停)/ **小队**(编辑小队模板)/ **团队**(运行中团队的活动面板) |
14
+ | 设置页 | 设置 → T专家,两个标签:**专家**(启停 / 看提示词)与 **队伍**(小队模板 + 运行中的团队) |
15
15
 
16
- 专家名册与团队引擎**解耦**:即使团队引擎挂载失败,专家名册、`@` 召唤、`/t` 列表仍然照常可用。
17
-
18
- 界面效果见 `docs/`:`panel-preview.png`(专家卡片网格)、`popup-preview.png`(`@` 召唤弹窗)、
19
- `prompt-modal-preview.png`(查看提示词)、`settings-tabs-preview.png`(设置页标签)。
16
+ 专家名册与团队引擎**解耦**:团队引擎挂载失败(例如宿主子代理契约不匹配)时,
17
+ 专家名册、`@` 召唤、`/t` 列表仍然照常可用。
18
+ > 注意:这条解耦覆盖的是**引擎的运行时挂载**。宿主包本身缺失时(插件声明了若干
19
+ > `@deepseek-ai/*` peer 依赖,由 DSH 安装提供)整个插件都无法加载 —— 这是任何插件的共同前提。
20
20
 
21
21
  ---
22
22
 
@@ -42,7 +42,7 @@ dsh plugin --profile web add dsh-plugin-t-expert
42
42
  需要锁版本时:
43
43
 
44
44
  ```bash
45
- dsh plugin --profile web add --save-exact dsh-plugin-t-expert@0.1.0
45
+ dsh plugin --profile web add --save-exact dsh-plugin-t-expert@0.1.1
46
46
  ```
47
47
 
48
48
  插件在 `package.json` 里声明了 `dsh.bundle`(补丁文件 `cordis.patch.yml`),
@@ -57,21 +57,16 @@ dsh plugin --profile web add --save-exact dsh-plugin-t-expert@0.1.0
57
57
  error: profile "desktop" is managed exclusively by the Electron application
58
58
  ```
59
59
 
60
- 所以请走这两条路之一:
61
-
62
- - **插件市场(推荐)**:在 DSH Desktop 里用插件市场(dsh-market)一键安装。
63
- - **仓库内的安装脚本**:先在本仓库里构建,再安装:
60
+ **请用插件市场(dsh-market)安装**:在 DSH Desktop 里搜索本插件一键装即可。
64
61
 
65
- ```bash
66
- npm install
67
- npm run build
68
- bash scripts/install-desktop.sh --dry-run # 预览将要做什么
69
- bash scripts/install-desktop.sh # 真正安装
70
- bash scripts/install-desktop.sh --remove # 卸载(还原 profile manifest)
71
- ```
62
+ 本仓库**不自带安装脚本**(维护者的运维脚本不在仓库里)。如果你要手工装,等价动作是:
63
+ 把包内的 `lib/`、`data/`、`cordis.patch.yml` 与许可文件复制到一个运行目录,在目标 profile 的
64
+ `package.json` 里加一条 `file:<该目录>` 依赖并追加到 `dsh.profile.bundles`,再把整个目录
65
+ **真目录拷贝**(不要符号链接)到 profile `node_modules/<包名>`。
72
66
 
73
- 脚本会把运行副本写到 `~/.t-team/plugin`,在 profile `package.json` 里加一条 `file:` 依赖与 bundle 条目
74
- (写入前先备份 manifest),再把运行副本原样拷进 profile 的 `node_modules`。
67
+ > ⚠️ `file:` 依赖指向的是**运行目录**,与首次播种出来的数据目录是两处,不要混在一起:
68
+ > 运行目录可随时重建,数据目录必须长期保留。清空或迁移运行目录会连带影响插件解析,
69
+ > 届时重跑一遍安装步骤即可。
75
70
 
76
71
  ### 3. 装完之后
77
72
 
@@ -102,7 +97,7 @@ bash scripts/install-desktop.sh --remove # 卸载(还原 profile manifest
102
97
  │ ├── descriptions.json # slug → 中文简介
103
98
  │ ├── divisions.json # 分区中文标签
104
99
  │ ├── <分区>/<slug>.md # 中文人格正文(与 experts/ 同相对路径)
105
- │ ├── manual.json # 人工补译:names / descriptions / divisionLabels(优先于自动层)
100
+ │ ├── manual.json # 人工补译:names / descriptions(优先于自动层)
106
101
  │ ├── manual-bodies/ # 人工补译正文(最高优先,不会被覆盖)
107
102
  │ └── COVERAGE.json # 中文覆盖率与缺口清单
108
103
  ├── teams.json # 小队定义(设置页「小队」标签写回这里)
@@ -127,6 +122,29 @@ bash scripts/install-desktop.sh --remove # 卸载(还原 profile manifest
127
122
  | `provider` | string | `"spawn"` | 召唤专家时使用的子代理 provider |
128
123
  | `divisions` | string[] | `[]` | 留空 = 自动扫描 `root` 下所有含 `.md` 的分区目录 |
129
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` 类型不对,属于自带数据的错配,插件会在**加载时直接失败**并指出路径与修法。
130
148
 
131
149
  ---
132
150
 
@@ -152,13 +170,14 @@ bash scripts/install-desktop.sh --remove # 卸载(还原 profile manifest
152
170
  | `/t <小队名\|别名> <目标>` | 拉起该小队执行目标(队长先给出成员与任务草案,等你 review 后再启动) |
153
171
  | `/t <一句话目标>` | 没有匹配到小队名时,按目标自动挑选最合适的小队 |
154
172
 
155
- 小队匹配支持 key、中文别名与模糊匹配;改名单不需要重启,每次都从磁盘读小队定义。
173
+ 小队**列表与匹配**每次都从磁盘读定义,所以改完名字立刻反映在 `/t` 里;
174
+ 但**建队时用的是插件启动时载入的引擎配置**,因此小队定义的增删改要**重启 DSH** 才对建队生效。
156
175
 
157
176
  ---
158
177
 
159
178
  ## 六、编辑小队
160
179
 
161
- **设置 → T专家 → 小队** 标签里可以搜索、修改成员 / 别名 / 启停,然后保存。
180
+ **设置 → T专家 → 队伍** 标签里可以搜索、修改成员 / 别名 / 启停,然后保存。
162
181
 
163
182
  保存流程:
164
183
 
@@ -167,6 +186,9 @@ bash scripts/install-desktop.sh --remove # 卸载(还原 profile manifest
167
186
  3. **编译失败会自动回滚** `teams.json`(不会把坏定义留在盘上);
168
187
  4. 缺 `python3` 时报错并回滚。
169
188
 
189
+ > ⚠️ **保存后需要重启 DSH**:`/t` 列表会立刻看到新小队,但引擎配置在插件启动时已载入,
190
+ > 不重启就建不了队(`/t 新队 目标` 会提示「小队不存在」)。
191
+
170
192
  硬约束(由 `team-profiles.py` 与小队数据层校验):
171
193
 
172
194
  | 约束 | 值 |
@@ -184,32 +206,35 @@ bash scripts/install-desktop.sh --remove # 卸载(还原 profile manifest
184
206
 
185
207
  本插件以 **MIT** 发布,全文见 `LICENSE`。
186
208
 
187
- 随包分发的专家名册与其人格文本、内置团队引擎均按 **MIT** 授权使用,各自的来源、版本与署名要求写在
188
- `THIRD-PARTY-NOTICES` 里。再分发本插件(含修改版)时,请一并保留 `LICENSE` 与该文件。
209
+ 随包分发的专家名册、中文译文与内置团队引擎各自按 MIT 授权使用,
210
+ 各自的来源、版本与署名要求写在 `THIRD-PARTY-NOTICES` 里,**完整许可文本随包放在 `vendor/` 下**。
211
+ 再分发本插件(含修改版)时,请一并保留 `LICENSE`、`THIRD-PARTY-NOTICES` 与 `vendor/` 下的许可文本。
189
212
 
190
213
  ---
191
214
 
192
215
  ## 八、开发 / 构建
193
216
 
194
217
  ```bash
195
- npm install # 安装开发依赖
196
- npm run build # 品牌化(scripts/brand.mjs)+ 构建客户端产物(scripts/build-client.mjs)
218
+ npm install # 安装依赖(peer 依赖由 DSH 宿主提供)
219
+ npm run build # 品牌化 + 构建客户端产物
197
220
  npm run verify # 自检套件(插件契约、工具、remote、客户端产物、播种与快照一致性)
221
+ npm run sync-data # 把运行时数据同步进包内 data/(默认源 ~/.t-team)
198
222
  ```
199
223
 
200
- 随包数据快照:
201
-
202
- ```bash
203
- npm run sync-data # 把运行时数据同步进包内 data/(默认源 ~/.t-team)
204
- node scripts/sync-data.mjs --check # 只校验快照与源是否一致
205
- ```
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
+ > 顺序错了会把旧文本打进产物。
206
230
 
207
231
  ---
208
232
 
209
233
  ## 九、已知限制
210
234
 
211
235
  - 客户端面板**不做自定义专家的增删改**;要加自己的专家,直接把 `.md` 放进 `~/.t-team/experts/<分区>/`,宿主按 mtime 指纹自动重载,不需要重启。
236
+ (中文侧车同理:`zh/` 下的名字 / 简介 / 正文文件增删改都会按指纹重载。)
212
237
  - 包内快照只在数据目录**缺项**时播种。升级插件只更新包内快照,**不会覆盖你已有的数据目录内容**。
213
- - 设置页的「团队」标签只在真的有运行中团队时才出现。
238
+ - 小队定义的改动需要重启 DSH 才对**建队**生效(见第五、六节)。
214
239
  - 改插件代码后需要重新 `npm run build`(改了 `src/client.jsx` 才会重新生成客户端产物)并重装/重启。
215
240
  - 团队引擎挂载失败时,团队相关功能不可用,但专家名册、`@` 召唤、`/t` 列表不受影响,失败原因由 `/t` 报出。
@@ -1,7 +1,8 @@
1
1
  # 第三方组件与内容声明
2
2
 
3
- 本插件(`dsh-plugin-t-expert`,MIT,见 `LICENSE`)打包了两部分第三方成果。它们各自保留原许可,
4
- 本文件说明来源、版本与许可,以便再分发时履行署名义务。
3
+ 本插件(`dsh-plugin-t-expert`,MIT,见 `LICENSE`)打包了两部分第三方成果。
4
+ 它们各自保留原许可,本文件说明来源、版本与许可,以便再分发时履行署名义务。
5
+ **完整许可文本随包分发**在 `vendor/` 下(见第 3 节)。
5
6
 
6
7
  ## 1. 内置团队引擎
7
8
 
@@ -10,24 +11,34 @@
10
11
  | 上游包 | `@nanmicoder/dsh-agent-teams` |
11
12
  | 上游仓库 | https://github.com/NanmiCoder/dsh-agent-teams |
12
13
  | 版本 | `0.1.17-rc.1` |
13
- | 许可 | MIT Copyright (c) 2026 程序员阿江(Relakkes) |
14
- | 位置 | `vendor/dsh-agent-teams/`(上游文件逐字节原样保留,含其 `LICENSE` 与 `VENDOR.md`)、`lib/teams/`(由 `scripts/brand.mjs` vendor 改名生成的品牌化产物:命令 `/agent-teams` → `/t`、工具 `agent_teams_*` → `t_team_*`) |
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
16
 
16
- 本插件对引擎的改动都在自己的代码里(挂载、配置注入、client 复用),vendor 目录内的文件不作修改。
17
+ **对上游镜像的改动**:`vendor/dsh-agent-teams/upstream/` 内的文件**永不修改**;
18
+ `lib/teams/` 是生成物,差异 = 品牌化改名 + `brand.mjs` 中逐条注释的 `FIXES`。
19
+ 除改名外,`FIXES` 还包含少量**本地缺陷修补与必要的行为改动**(例如把 profile 上限从 16 抬到 48、
20
+ 修正命令视图 key、修正交接期与终态任务的校验、放行 `.env.example` 一类模板文件等)。
21
+ 每条 `FIXES` 都声明了期望命中次数,上游文本一变即构建失败,不会静默退回上游行为。
17
22
 
18
- ## 2. 专家名册与人格文本
23
+ ## 2. 专家名册与中文侧车
19
24
 
20
25
  | 项 | 值 |
21
26
  | --- | --- |
22
- | 上游项目 | The Agency(`msitarzewski/agency-agents`,README 中亦作 AgentLand |
27
+ | 英文名册 | The Agency / AgentLand(`msitarzewski/agency-agents`)— MIT,Copyright (c) 2025 AgentLand Contributors。完整文本随包:`vendor/third-party-licenses/agency-agents.LICENSE` |
28
+ | 中文译文 | `jnMetaCode/agency-agents-zh`(中文翻译与本地化)— MIT,Copyright (c) 2025 Michael Sitarzewski(英文原版)、Copyright (c) 2026 jnMetaCode(中文翻译与本地化)。完整文本随包:`vendor/third-party-licenses/agency-agents-zh.LICENSE` |
29
+ | 分发形态 | 上述两部分内容随 `@michengai/dsh-agency-agents` 一同分发(该包自身的 TypeScript 源码与构建脚本为 Apache-2.0,**本插件不打包其任何代码**) |
23
30
  | 版本指纹 | 见 `data/source.json` 的 `sourceRevision` |
24
- | 许可 | MIT Copyright (c) 2025 AgentLand Contributors |
25
- | 位置 | `data/experts/`(18 分区 / 279 位,逐字节镜像)、`data/zh/`(中文侧车) |
31
+ | 位置 | `data/experts/`(18 分区 / 279 位,逐字节镜像)、`data/zh/`(中文名字 / 简介 / 人格正文 / 分区标签) |
26
32
 
27
- `data/zh/` 下的中文名字、简介、人格正文与分区标签为本项目的翻译与整理成果,
28
- 其中 `data/zh/manual-bodies/` 与 `data/zh/manual.json` 为人工补译,随本插件以 MIT 授权发布。
33
+ `data/zh/manual.json` 与 `data/zh/manual-bodies/` 是**本项目的补充翻译**(用于补齐上游尚未覆盖的
34
+ 条目或在译文不准确时覆盖),随本插件以 MIT 发布。
29
35
 
30
36
  ## 3. 分发要求
31
37
 
32
- 再分发本插件(或其修改版)时请一并保留:本文件、`LICENSE`、`vendor/dsh-agent-teams/LICENSE`,
33
- 以及上述两处上游署名。
38
+ 再分发本插件(或其修改版)时请一并保留以下文件(它们都在 npm 包内):
39
+
40
+ - `LICENSE`(本插件)
41
+ - `THIRD-PARTY-NOTICES`(本文件)
42
+ - `vendor/dsh-agent-teams/LICENSE`(内置团队引擎)
43
+ - `vendor/third-party-licenses/agency-agents.LICENSE`(英文名册)
44
+ - `vendor/third-party-licenses/agency-agents-zh.LICENSE`(中文译文)
package/cordis.patch.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  # 由 `dsh plugin add` 读取并合并到目标 profile。
2
- # remote 行让 api-gateway 从根服务表发现 T团队 的 Typert 服务(wire 名 tTeam)。
2
+ # remote 行让 api-gateway 从根服务表发现 T专家 的 Typert 服务(wire 名 tTeam)。
3
3
  - insert:
4
4
  - id: t-team-remote
5
5
  name: 'dsh-plugin-t-expert/remote'
package/data/source.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "source": "<home>/.agency-agents",
3
3
  "sourceRevision": "6d29a9b",
4
4
  "target": "<home>/web/t-team/data/experts",
5
- "syncedAt": "2026-09-12 09:32:27 +0800",
5
+ "syncedAt": "2026-09-12 14:16:29 +0800",
6
6
  "divisions": [
7
7
  "academic",
8
8
  "design",
@@ -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 # 引擎侧已由 scripts/brand.mjs 把 MAX_TEAM_PROFILES 调到 48(上游默认 16)
45
+ MAX_PROFILES = 48 # 引擎侧已由品牌化工具 brand.mjs 把 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]+)*$")
package/data/teams.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "_note": "T专家 小队定义(人工维护)。每支小队 = 一个 AgentTeams profile:key 用 ASCII(会变成 /agent-teams-<key> 命令),中文放 description 与 aliases(供 /t 用),members 是 T专家 名册里的专家 slug。改完跑 `python3 team-profiles.py` 重新生成 profile 配置。",
2
+ "_note": "T专家 小队定义(人工维护)。每支小队 = 一个团队引擎 profile:key 用 ASCII(用 /t <key> <目标> 拉起,引擎内是 /t --profile <key>),中文放 description 与 aliases(供 /t 匹配),members 是 T专家 名册里的专家 slug。改完跑 `python3 team-profiles.py` 重新生成引擎配置。",
3
3
  "defaults": {
4
4
  "taskPlanning": "captain",
5
5
  "personaMode": "summary",
@@ -1,5 +1,5 @@
1
1
  {
2
- "_note": "T团队 的中文补译层(人工维护)。sync-zh.py 会把它覆盖到自动提取的译文之上;键是专家 slug。上游新增专家若缺译文,会出现在 zh/COVERAGE.json 的 gaps 里,在这里补上再重跑 sync-zh.py 即可。名字/简介用本文件的 names/descriptions;正文缺口另放 zh/manual-bodies/<分区>/<slug>.md(最高优先、不会被同步清理)。",
2
+ "_note": "T专家 的中文人工补译层(人工维护)。键是专家 slug。名字/简介写在本文件的 names/descriptions;正文另放 zh/manual-bodies/<分区>/<slug>.md(最高优先,同步清场时整棵子树跳过、永不被删)。上游新增专家若缺译文会出现在 zh/COVERAGE.json 的 gaps 里,在这里补上即可。",
3
3
  "names": {
4
4
  "engineering-ats-validator-architect": "ATS 简历解析验证架构师",
5
5
  "engineering-china-network-engineer": "中国网络工程师",
package/lib/catalog.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * T团队 花名册:扫描固定专家目录,解析 frontmatter,按 slug 建立索引。
2
+ * T专家 花名册:扫描固定专家目录,解析 frontmatter,按 slug 建立索引。
3
3
  *
4
4
  * 目录形态固定为 `<root>/<division>/<slug>.md`,
5
5
  * 其中 game-development 之类的分区可以再嵌套一层子目录(递归扫描)。