dsh-plugin-t-expert 0.3.6 → 0.3.24
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 +99 -276
- package/lib/client.js +366 -85
- package/lib/index.js +41 -2
- package/lib/remote-schemas.js +7 -1
- package/lib/remote.js +22 -1
- package/lib/schedule.js +14 -1
- package/lib/skill.js +21 -5
- package/package.json +3 -2
- package/vendor/third-party-licenses/README.md +1 -1
- package/skills/t-expert-manager/SKILL.md +0 -125
- package/skills/t-expert-manager/references/ops-reference.md +0 -100
package/README.md
CHANGED
|
@@ -1,166 +1,54 @@
|
|
|
1
1
|
# T专家(dsh-plugin-t-expert)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
dsh-plugin-t-expert 插件:包含 **22 个分类 / 316 位专家**的名册(中文名、简介全量覆盖),
|
|
4
|
+
外加插件自带的**多智能体团队引擎**(T Team:小队模板、任务 DAG、调度、活动面板)。
|
|
5
5
|
|
|
6
6
|
装上以后你能做四件事:
|
|
7
7
|
|
|
8
8
|
| 做什么 | 怎么做 |
|
|
9
9
|
| --- | --- |
|
|
10
|
-
| 用专家 | 输入框打 `@` → 按分类分组的菜单 → 选中的专家作为引用 chip
|
|
10
|
+
| 用专家 | 输入框打 `@` → 按分类分组的菜单 → 选中的专家作为引用 chip 进本轮对话;模型也可自行 `summon_t_expert` |
|
|
11
11
|
| 拉起一支小队干活 | `/t <小队> <目标>`(`/t` 单跑列出现有小队) |
|
|
12
12
|
| 管名册 | 设置 → T专家 → **专家**(启停 / 看提示词 / 新建自建专家) |
|
|
13
|
-
| 管分类与小队 | 设置 → T专家 →
|
|
13
|
+
| 管分类与小队 | 设置 → T专家 → **分类**(自建分类增删改)、**队伍**(小队模板 + 运行中的团队) |
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
**队伍**(小队模板 + 运行中的团队)。
|
|
17
|
-
|
|
18
|
-
真实的后台任务列表不在设置页。右上角有一个**常驻的小徽章**(与团队徽章同一层、同一视觉体系),
|
|
19
|
-
它是随时点开查看的入口;只有真的还有东西在跑时才亮起来并给出运行中数量(安静时只是一个灰点,不显示数字),
|
|
20
|
-
点开就是任务面板:当前会话及其子代理的后台任务,只读(状态、退出码与耗时,
|
|
21
|
-
不含输出与终止)。面板可拖动,位置记在本机。
|
|
22
|
-
|
|
23
|
-
徽章只在"从无到有"时冒出,**面板绝不自动展开**——展开与否完全由你决定,关掉之后同一批任务不会再打扰你。
|
|
24
|
-
子代理区显示的是**子代理的真名**(取自语宿主的子代理目录 `label`,而不是从提示词生成的会话标题),
|
|
25
|
-
点一行即可跳到那个子代理的会话(与官方任务页同一个 `openSubagent` 接口)。
|
|
26
|
-
每行副标题显示该子代理的**请求文本前一段**(会话标题就是从它生成的),并标注运行中/已结束;
|
|
27
|
-
列表顺序沿用宿主子代理目录的原生次序——与官方任务页一致(快照里没有创建时间字段,不自造一种序)。
|
|
28
|
-
输入区 **T专家** 按钮弹开的浮层里有四个标签:**专家 → 小队 →(有运行中的团队时才出现)团队 → 任务**,
|
|
29
|
-
点开时默认停在**专家**标签(这个浮层主要就是用来挑专家的)。
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## 一、安装
|
|
15
|
+
## 安装
|
|
34
16
|
|
|
35
17
|
```bash
|
|
36
18
|
dsh plugin --profile web add dsh-plugin-t-expert
|
|
37
19
|
```
|
|
38
20
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
这不是本插件的限制——任何插件都一样。
|
|
42
|
-
|
|
43
|
-
依赖:DSH 宿主 `0.1.5-rc.1` / `0.1.5-rc.2`;Node `^22.19.0 || >=24`;`pnpm` 在 PATH 上
|
|
44
|
-
(`dsh plugin` 本质是在 profile 目录里转发 pnpm)。`python3` 只在**设置页保存小队**时需要
|
|
45
|
-
(要调用小队编译器);缺它插件照常加载,只是小队编译会报错并回滚。
|
|
46
|
-
|
|
47
|
-
装完重启 DSH,然后在 **设置 → T专家** 里启用专家——**默认全部未启用**,未启用的专家不能被召唤。
|
|
48
|
-
|
|
49
|
-
### 兼容性与两个已知依赖
|
|
50
|
-
|
|
51
|
-
团队引擎里有两处**贴着宿主实现细节**的适配,升级 DSH 前值得知道:
|
|
52
|
-
|
|
53
|
-
| 依赖 | 说明 | 失效时的表现 |
|
|
54
|
-
| --- | --- | --- |
|
|
55
|
-
| 子代理投递契约(`ctx.subagents` 的 `followup` / `sendMessage` 与两个 `Symbol.for` 内部接口) | 插件要在"成员已退役"时拦住投递,而宿主没有公开的 retire/forget 扩展点,只能按**实测过的版本**包装这几个方法;已实测版本写在 `lib/teams/harness-compat.js` 的 `TESTED_HARNESS_VERSIONS`(当前 `0.1.5-rc.1` / `rc.2`) | 引擎**降级**(团队功能不可用,名册与召唤不受影响),日志与 `/t` 会给出原因。若上游把服务冻结或改成 accessor,会明确报「属性不可写」而不是一个裸 `TypeError` |
|
|
56
|
-
| 活动面板的客户端物化用 `new Function` 求值内联产物 | 因此需要宿主允许 `eval`。当前 DSH 壳**没有**设置 CSP,本机实测可用 | 壳将来若加严格 CSP,面板模块会加载失败——失败会记 `console.error` 并跳过,不影响名册与团队引擎 |
|
|
57
|
-
|
|
58
|
-
这两条都不是"插件写坏了",而是宿主还没提供文档化扩展点。要根治第一条,需要宿主提供一个
|
|
59
|
-
文档化的退役/投递拦截扩展点,插件改为挂在那里。
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## 二、数据目录
|
|
64
|
-
|
|
65
|
-
插件对任何机器都**自包含**:包内带一份名册快照,启动时与 `~/.t-team/` 对齐(不是只在首次播种)。
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
~/.t-team/
|
|
69
|
-
├── experts/ 名册:<分类>/<slug>.md(22 个分类、316 位)
|
|
70
|
-
├── zh/ 中文侧车:names.json、descriptions.json、<分类>/<slug>.md、divisions.json
|
|
71
|
-
├── custom/ 你在面板里自建的专家
|
|
72
|
-
├── teams.json 小队定义(设置页「队伍」写回这里)
|
|
73
|
-
├── schedule.json 定时任务:任务、cron 表达式与最近 20 次执行记录
|
|
74
|
-
├── t-team.config.json 小队编译产物(引擎配置,人格已内联)
|
|
75
|
-
├── teams.resolved.json 小队编译产物(/t 列表用)
|
|
76
|
-
├── team-profiles.py 小队编译器的播种副本(实际跑的是包内那份)
|
|
77
|
-
├── source.json 名册清单(专家数 / 分类 / 更新时间)
|
|
78
|
-
└── .t-team-snapshot.json 上次对齐的记录(版本 / 漂移计数,用于「升级与送不到」出声)
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
- **升级会送达,用户内容不动**(2026-09-13 起按条目同步,不再是「首次播种后一律不动」):
|
|
82
|
-
- 包内**新增**的专家、小队、译文键:直接补齐到你的数据目录;
|
|
83
|
-
- 包内**修订**的只读条目(`experts/`、`source.json`、`team-profiles.py`、`zh/` 的覆盖表与分区表):
|
|
84
|
-
与包内对齐;
|
|
85
|
-
- `zh/names.json`、`zh/descriptions.json`、`teams.json`:**只补缺失的键**,你改过的键一个都不动;
|
|
86
|
-
- 你改过或补译的 `zh/<分类>/<slug>.md` 正文:**保留盘上那份**,并在日志里明确告知;
|
|
87
|
-
- 包内已移除的条目:只报告,不删你的文件。
|
|
88
|
-
- 一句话:**送得到的送到,送不到的一定出声**(日志里给出数量与例子,删掉对应文件后重启即可重新播种)。
|
|
89
|
-
- 唯一始终用包内那份的是小队编译器 `team-profiles.py`——它是代码,随插件版本走。
|
|
90
|
-
- 想换目录位置,用配置项 `root` / `zhRoot` / `customRoot` 覆盖即可,不必改代码。
|
|
91
|
-
- `schedule.json` 是**定时任务自己的数据文件**(见第三节):它在数据根下、与 `teams.json` 同级,
|
|
92
|
-
刻意不写进宿主的存储域,也不与其它定时插件(例如 `@weibaohui/dsh-tasks`)共享任何文件。
|
|
21
|
+
DSH Desktop 请在插件市场里搜 `dsh-plugin-t-expert` 安装(`--profile desktop` 由 Electron 应用独占,
|
|
22
|
+
CLI 会被拒绝 —— 任何插件都一样)。
|
|
93
23
|
|
|
94
|
-
|
|
24
|
+
- 依赖:DSH 宿主 `0.1.5-rc.1` / `0.1.5-rc.2`;Node `^22.19.0 || >=24`;`pnpm` 在 PATH 上。
|
|
25
|
+
`python3` 只在**保存小队**时用到(缺它插件照常加载,只是小队编译会报错并回滚)。
|
|
26
|
+
- 装完**重启 DSH** 即可用;第一次怎么上手见下面的「快速上手」。
|
|
95
27
|
|
|
96
|
-
##
|
|
28
|
+
## 快速上手
|
|
97
29
|
|
|
98
|
-
|
|
30
|
+
1. **启用专家**:设置 → T专家 → **专家**,把要用的打开 —— **默认全部未启用**,未启用的不会被召唤。
|
|
31
|
+
2. **用一位专家**:输入框打 `@`,按分类挑一位,它以引用 chip 进入本轮对话;也可以直接说"让 XX 专家看看",
|
|
32
|
+
由模型调 `summon_t_expert`。
|
|
33
|
+
3. **拉一支小队**:`/t` 看有哪些小队(随包自带 48 支),`/t <小队> <目标>` 让它干活 —— 先给成员与任务草案,
|
|
34
|
+
你 review 后开跑。
|
|
99
35
|
|
|
100
|
-
|
|
101
|
-
38px 高、12px 圆角、同样的边框与抬升填充;侧栏收起时退回图标态)。
|
|
102
|
-
点开后在**右侧主区域**直接显示管理页(不是设置弹窗里的一个小节)。点左侧任意会话即回到会话视图。
|
|
36
|
+
## 界面入口
|
|
103
37
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
| 能力 | 说明 |
|
|
38
|
+
| 位置 | 是什么 |
|
|
107
39
|
| --- | --- |
|
|
108
|
-
|
|
|
109
|
-
|
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
| 会话自动命名 | 执行出来的会话叫「任务标题 · MM-DD HH:mm」,同一任务多次运行在侧栏里能一一区分 |
|
|
114
|
-
| 执行记录 | 每条保留最近 20 次(时间、成败、失败原因、会话 id),可展开追溯 |
|
|
115
|
-
| 启用/停用 | 停用的事项保留数据但不再定时触发 |
|
|
116
|
-
| 点名专家 | 提示词框下面有「🧩 T专家」按钮:浮层只列**已启用**专家(可搜、可键盘选),选中后把 `@专家名` 填进提示词 —— 与对话输入框里那个专家芯片同一形态。**可以点选多位**(列表里打勾标记,再点一次即取消) |
|
|
117
|
-
|
|
118
|
-
**点名专家怎么生效**:提示词开头的 `@A @B …` 在到点执行时由宿主改写成一句明确的召唤指令,并把这些
|
|
119
|
-
提及从正文里摘掉:**点名一位**用 `summon_t_expert`,**点名多位**改用 `summon_t_experts` 批量并行召唤。
|
|
120
|
-
之所以要改写:新会话没有对话输入框那套引用芯片机制,光留几个名字模型不一定会去请人。
|
|
121
|
-
名字判据是中文名 / 英文名 / slug 三种都认(互为子串时取更长的那个),**不在已启用名册里就原样提交、
|
|
122
|
-
绝不猜**;面板会实时显示「到点执行时会召唤「X」」或「会同时召唤「X、Y」」,重复挑选同一位是
|
|
123
|
-
**取消**而不是叠加。
|
|
124
|
-
|
|
125
|
-
**到点执行会发生什么**:新建会话 → 挂载部署的默认 agent preset(不挂 preset 的新会话没有工具)→
|
|
126
|
-
写入会话标题 → 以 **插件来源**(`plugin: dsh-plugin-t-expert`)提交你的提示词。
|
|
127
|
-
绑定工作区的工作区若已被删除,这次执行会记一条失败原因,不会静默。
|
|
128
|
-
|
|
129
|
-
**功能开关**:设置 → T专家 → 「显示定时任务按钮」(在「显示任务徽章」下面)。
|
|
130
|
-
**关掉它不是仅仅藏按钮**:宿主会**同时停掉全部定时触发**,手动执行也会被拒;任务与执行记录完整保留,
|
|
131
|
-
重新打开立刻按 stored 状态恢复调度。这样做是为了不出现「以为关了、其实 cron 还在后台开新会话」。
|
|
132
|
-
|
|
133
|
-
**与 `@weibaohui/dsh-tasks` 的关系(可同时安装、同时使用)**:
|
|
134
|
-
|
|
135
|
-
| 维度 | 本插件 | `@weibaohui/dsh-tasks` |
|
|
136
|
-
| --- | --- | --- |
|
|
137
|
-
| 数据 | `~/.t-team/schedule.json` | 宿主存储域 `dsh_tasks` |
|
|
138
|
-
| 侧栏入口 | `sidebar.panellist`(id `t-team-schedule`,「新会话」下方那一组) | 设置面板内的 section |
|
|
139
|
-
| 右侧页面 | `main` 槽 keyed 面板(key `t-team-schedule`) | 同上(设置内一节) |
|
|
140
|
-
| remote 服务 | `tTeam` / `tTeamSchedule` | 自有 HTTP 路由 `/dsh-tasks/api` |
|
|
141
|
-
| 消息来源 | `plugin: dsh-plugin-t-expert` | `plugin: dsh-tasks` |
|
|
142
|
-
| locale 命名空间 | `t-team`(键前缀 `sched.`) | `settings.dshTasks` |
|
|
143
|
-
| CSS 前缀 | `t-team-sched-*` | `si-*` |
|
|
144
|
-
|
|
145
|
-
两者各跑各的定时器、各存各的任务,互不可见也互不干扰;只有 croner 是共用依赖(各装各的)。
|
|
40
|
+
| 设置 → T专家 | 管理页,一共**三个标签**:**专家**(启停 / 提示词 / 新建自建专家)、**分类**(自建分类增删改)、**队伍**(小队模板 + 运行中的团队) |
|
|
41
|
+
| 输入框 `@` | 按分类分组的专家菜单,选中即插入引用 chip |
|
|
42
|
+
| 输入区「T专家」按钮 | 浮层四个标签:**专家 → 小队 →(有运行中的团队时才出现)团队 → 任务**,默认停在**专家** |
|
|
43
|
+
| 会话标题栏徽章 | 后台任务只读面板(当前会话及其子代理的任务:状态、退出码、耗时);只在真有任务在跑时亮起并给出数量,**面板绝不自动展开**,可拖动、位置记在本机 |
|
|
44
|
+
| 左侧栏「新会话」下方 | **定时任务**入口(与「新会话」同款按钮外观),点开在右侧主区域显示管理页;点任意会话即回到会话视图 |
|
|
146
45
|
|
|
147
|
-
|
|
46
|
+
## 专家
|
|
148
47
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
- 自建专家写在 `customRoot`(默认 `~/.t-team/custom/<分类>/<slug>.md`),**与随包发布的名册分开**:
|
|
154
|
-
内置名册升级时整棵替换,自建的不受影响。
|
|
155
|
-
- 归到官方分类名下是**允许且安全**的:分类只是归属,文件仍在 `customRoot`,内置名册一个字节不动。
|
|
156
|
-
- 自建专家自带中文(frontmatter 里的 `name` 就是显示名),不依赖中文侧车。
|
|
157
|
-
|
|
158
|
-
**新建分类**:设置 → 分类 → 填目录名(小写 ASCII)+ 显示名(中文)。
|
|
159
|
-
官方分类只读(名字与存亡随包内名册);删除自建分类时若里面还有专家会被拒绝,不会静默连删。
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## 五、工具与命令
|
|
48
|
+
- 名册随包发布,启动时与 `~/.t-team/` 对齐(按条目送达,见「数据目录」)。
|
|
49
|
+
- **自建专家**:设置 → 专家 → 「+ 新建专家」,写在 `customRoot`(默认 `~/.t-team/custom/<分类>/<slug>.md`),
|
|
50
|
+
与内置名册分开 —— 内置名册升级时整棵替换,自建的不受影响;归到官方分类名下也安全(分类只是归属)。
|
|
51
|
+
- **自建分类**:设置 → 分类 → 目录名(小写 ASCII)+ 显示名。官方分类只读;删除自建分类时若里面还有专家会被拒绝。
|
|
164
52
|
|
|
165
53
|
| 工具 | 作用 |
|
|
166
54
|
| --- | --- |
|
|
@@ -169,160 +57,95 @@ dsh plugin --profile web add dsh-plugin-t-expert
|
|
|
169
57
|
| `summon_t_experts` | 并行召唤多位(最多 8 位、并发 4;部分失败仍返回成功的结果) |
|
|
170
58
|
| `t_team_plan_check` | 只读 DAG 预检:一批团队任务先跑一遍引擎校验,一次报出全部问题 |
|
|
171
59
|
|
|
172
|
-
|
|
173
|
-
| --- | --- |
|
|
174
|
-
| `/t` | 列出所有小队(key、别名、人数、成员中文名) |
|
|
175
|
-
| `/t <小队\|别名>` | 选定小队,队长列出成员并问你目标 |
|
|
176
|
-
| `/t <小队\|别名> <目标>` | 拉起小队干活(先给成员与任务草案,你 review 后开跑) |
|
|
177
|
-
| `/t <一句话目标>` | 没匹配到小队名时,按目标自动挑最合适的小队 |
|
|
178
|
-
|
|
179
|
-
团队引擎另注册 **13 个 `t_team_*` 工具**(`t_team_create` 建队、`t_team_approve` 审批、
|
|
180
|
-
`t_team_create_task` 建任务、`t_team_reassign_task` 派发、`t_team_status` 看状态、`t_team_resume` 恢复等),
|
|
181
|
-
随插件一起提供;队长与成员各看到其中一个子集。
|
|
182
|
-
|
|
183
|
-
另有 **3 个按需加载的 skill**(`skills/`,插件启动时注册):
|
|
60
|
+
## 小队与团队引擎
|
|
184
61
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
它们都不占常驻提示段;宿主没有 skill 注册表的组合里会静默跳过,不影响其它任何功能。
|
|
192
|
-
`t-expert-manager` 正文里的 `tz.sh` 路径是注册时按本机解出来的,不是写死的。
|
|
193
|
-
后两个是 `dsh-project-expert`(项目专家模式)这个 agent preset 里同名 skill 的随包副本。
|
|
194
|
-
|
|
195
|
-
### 本地活动的可见范围
|
|
196
|
-
|
|
197
|
-
设置页「团队」标签读的是插件在本机注册的只读接口(`/plugins/t-team/…`):每个请求都先过宿主的
|
|
198
|
-
Host/Origin 校验与浏览器认证,静态资源另有白名单,非白名单一律 404。其中团队活动接口会**遍历
|
|
199
|
-
当前机器的所有工作区**,所以任何已认证的本机浏览器上下文都能看到这些工作区里的团队名、成员名
|
|
200
|
-
与任务标题(这是内置引擎的既有行为,不是 T专家 自己引入的)。DSH 是单用户本地应用,风险有限;
|
|
201
|
-
只在你的机器上有不信任的浏览器扩展或共享浏览器配置时才需要留意。
|
|
62
|
+
```bash
|
|
63
|
+
/t # 列出所有小队(key、别名、人数、成员中文名)
|
|
64
|
+
/t <小队|别名> # 选定小队,队长列出成员并问你目标
|
|
65
|
+
/t <小队|别名> <目标> # 拉起小队干活(先给成员与任务草案,你 review 后开跑)
|
|
66
|
+
/t <一句话目标> # 没匹配到小队名时,按目标自动挑最合适的小队
|
|
67
|
+
```
|
|
202
68
|
|
|
203
|
-
|
|
69
|
+
引擎另注册 **13 个 `t_team_*` 工具**(建队 / 审批 / 建任务 / 派发 / 状态 / 恢复 / 删除…),随插件一起提供;
|
|
70
|
+
队长与成员各看到其中一个子集。
|
|
204
71
|
|
|
205
|
-
|
|
72
|
+
**设置 → 队伍**里改成员 / 别名 / 启停,保存写回 `~/.t-team/teams.json` 并调用小队编译器:
|
|
73
|
+
**保存后立即生效,无需重启 DSH**——编译成功后运行中的插件就地重载引擎配置,`/t` 与新建队随即看到新小队,
|
|
74
|
+
已经跑起来的团队继续用启动时的成员表。**编译失败会自动回滚**,盘上仍是旧配置,设置页直接报错并说明引擎是否可用。
|
|
206
75
|
|
|
207
|
-
|
|
208
|
-
|
|
76
|
+
约束:小队 key 只能 ASCII `a-z0-9-`(中文放 `description` / `aliases`);每队 ≤ `maxMembers`(默认 8);
|
|
77
|
+
小队总数 ≤ 48;别名全局唯一;成员必须是名册里真实存在的专家。
|
|
209
78
|
|
|
210
|
-
|
|
211
|
-
`/t` 列表与新建队(含队长提示段)随即看到新小队;已经跑起来的团队不受影响,继续用启动时的成员表。
|
|
79
|
+
## 定时任务
|
|
212
80
|
|
|
213
|
-
|
|
214
|
-
- 引擎重载本身失败时会留下可诊断的信号(日志里有 `[t-team]` 的 error/warn),
|
|
215
|
-
并且报错时会带着原因说清引擎当前是否可用,不会静默假装已生效。
|
|
81
|
+
到点自动**新开一个会话**执行提示词,也可以随时「立即执行」。
|
|
216
82
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
83
|
+
| 能力 | 说明 |
|
|
84
|
+
| --- | --- |
|
|
85
|
+
| cron 执行 | 每条 = 标题 + 提示词 + 五段 croner 表达式(`分 时 日 月 周`) |
|
|
86
|
+
| 结构化选择器 | 快捷模板 + 「每小时 / 每天 / 每周 / 自定义」逐级选,周几多选;也可直接写原始表达式 |
|
|
87
|
+
| 实时预览 | 面板显示**最近 5 次执行时间**(宿主用 croner 算,保存前就能确认周期) |
|
|
88
|
+
| 立即执行 | 任意一条一键跑一次,不必等 cron 到点 |
|
|
89
|
+
| 绑定工作区 | **默认绑好**:新建即绑定自动创建的「定时任务」工作区(目录 = 默认工作目录下的 `tesk`);下拉里还能选「+ 自定义目录…」填任意绝对路径(不存在会建出来,工作区名取目录名),或选「不绑定工作区」 |
|
|
90
|
+
| 会话自动命名 | 「任务标题 · MM-DD HH:mm」,同一任务多次运行在侧栏里分得清 |
|
|
91
|
+
| 执行记录 | 每条保留最近 20 次(时间、成败、失败原因、会话 id) |
|
|
92
|
+
| 启用 / 停用 | 停用的事项保留数据但不再触发 |
|
|
93
|
+
| 点名专家 | 提示词框下的「🧩 T专家」浮层只列**已启用**专家(可搜、可键盘选、可多选),把 `@专家名` 插在光标处;到点执行时宿主把它改写成召唤指令(1 位 → `summon_t_expert`,多位 → `summon_t_experts`),不在已启用名册里的名字**原样提交、绝不猜** |
|
|
222
94
|
|
|
223
|
-
|
|
95
|
+
**开关**:设置 → T专家 → 「显示定时任务按钮」。关掉它**不只是藏按钮**:宿主同时停掉全部定时触发,
|
|
96
|
+
手动执行也被拒;任务与执行记录完整保留,重新打开立刻按 stored 状态恢复调度。
|
|
224
97
|
|
|
225
|
-
|
|
98
|
+
数据写在 `~/.t-team/schedule.json`(插件自己的数据根下,不进宿主存储域),与 `@weibaohui/dsh-tasks`
|
|
99
|
+
**可同时安装、同时使用**:各跑各的定时器、各存各的任务、各用各的侧栏入口与 remote 服务,互不可见。
|
|
226
100
|
|
|
227
|
-
|
|
101
|
+
## 数据与目录
|
|
228
102
|
|
|
229
|
-
|
|
230
|
-
| --- | --- | --- |
|
|
231
|
-
| `root` | `~/.t-team/experts` | 名册目录 |
|
|
232
|
-
| `zhRoot` | `~/.t-team/zh` | 中文侧车目录 |
|
|
233
|
-
| `customRoot` | `~/.t-team/custom` | 自建专家目录(与 `root` 分开是硬要求) |
|
|
234
|
-
| `provider` | `"spawn"` | 召唤专家用的子代理 provider |
|
|
235
|
-
| `divisions` | `[]` | 留空=自动扫描 `root` 下所有含 `.md` 的分类 |
|
|
236
|
-
| `maxSummonBatch` / `summonConcurrency` | `8` / `4` | 批量召唤上限与并发 |
|
|
237
|
-
| `stateDir` | `.agent-teams` | 团队状态目录(**工作区内的相对路径**),团队状态落在 `<工作区>/<stateDir>/<teamId>/`。内置团队引擎、设置页「队伍」标签与只读预检工具 `t_team_plan_check` 都按它定位团队——**三处都读这一个字段**,不存在第二来源(自检 8f 有静态 + 行为双断言兜着)。要挪团队状态目录只改这里 |
|
|
238
|
-
| `memberProvider` / `memberModel` / `maxMembers` | — | 转给内置团队引擎;`maxMembers` 还由插件透传给小队编译器(见「六、小队」) |
|
|
103
|
+
**全部数据都在你本机**:不连任何网络服务、不做遥测;名册、中文译文与小队的编译器都随包分发,运行时不向上游拉取。
|
|
239
104
|
|
|
240
|
-
|
|
105
|
+
```
|
|
106
|
+
~/.t-team/
|
|
107
|
+
├── experts/ 名册:<分类>/<slug>.md(包内快照 22 个分类、316 位;你自建的另计)
|
|
108
|
+
├── zh/ 中文侧车:names.json、descriptions.json、<分类>/<slug>.md
|
|
109
|
+
├── custom/ 你在面板里自建的专家
|
|
110
|
+
├── teams.json 小队定义(设置页「队伍」写回)
|
|
111
|
+
├── schedule.json 定时任务:任务、cron 表达式与最近 20 次执行记录
|
|
112
|
+
├── t-team.config.json 小队编译产物(引擎配置,人格已内联)
|
|
113
|
+
├── teams.resolved.json 小队编译产物(/t 列表用)
|
|
114
|
+
├── team-profiles.py 小队编译器的播种副本(实际跑的是包内那份)
|
|
115
|
+
├── source.json 名册清单(专家数 / 分类 / 更新时间)
|
|
116
|
+
└── .t-team-snapshot.json 上次对齐的记录(版本 / 漂移计数)
|
|
117
|
+
```
|
|
241
118
|
|
|
242
|
-
|
|
119
|
+
- 启动时**按条目**与包内快照对齐:包内新增的专家 / 小队 / 译文键补齐;只读条目(`experts/`、`source.json`、
|
|
120
|
+
`team-profiles.py`、`zh/` 的覆盖表与分区表)与包内对齐;`names.json` / `descriptions.json` / `teams.json`
|
|
121
|
+
**只补缺失的键**(你改过的键一个都不动);你改过的译文正文保留盘上那份;包内已移除的条目只报告、不删你的文件。
|
|
122
|
+
- 一句话:**送得到的送到,送不到的一定出声**(日志给出数量与例子)。唯一始终用包内那份的是小队编译器
|
|
123
|
+
(它是代码,随插件版本走)。想换目录位置,用配置项 `root` / `zhRoot` / `customRoot` 覆盖。
|
|
243
124
|
|
|
244
|
-
|
|
245
|
-
`croner`(定时任务的 cron 解析与调度)各自按其原许可使用:
|
|
246
|
-
来源、版本与署名写在 `THIRD-PARTY-NOTICES`,完整许可文本随包放在 `vendor/`。
|
|
247
|
-
再分发(含修改版)时请一并保留这四样。
|
|
125
|
+
## 常见问题
|
|
248
126
|
|
|
249
|
-
|
|
127
|
+
| 现象 | 原因与处理 |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| 召唤不了某位专家 | 它没被启用(设置 → T专家 → 专家);名册默认是"全部未启用" |
|
|
130
|
+
| `/t` 不可用或提示引擎降级 | 宿主版本不在实测范围内(见「安装」的依赖一行)时团队引擎会降级:`/t` 会给出原因,名册与 `@` 召唤不受影响 |
|
|
131
|
+
| 保存小队报错 | 缺 `python3`,或新定义没通过编译 —— **失败会自动回滚**,盘上仍是旧配置,设置页会说明引擎是否可用 |
|
|
132
|
+
| 定时任务没有按时跑 | 设置 → T专家 → 「显示定时任务按钮」若被关掉,宿主会停掉**全部**定时触发(手动执行也会被拒),这是有意为之 |
|
|
133
|
+
| 改完插件看不到变化 | 客户端与宿主代码都要重启 DSH 才生效;设置 → T专家 标题行有当前版本号(`v0.3.x`)可核对 |
|
|
250
134
|
|
|
251
|
-
##
|
|
135
|
+
## 卸载与反馈
|
|
252
136
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
npm run verify # 自检套件(现 601 项断言):插件契约、工具、remote、客户端产物、播种与快照,
|
|
257
|
-
# 外加「发布包自洽」(真打一份 tgz、解开、再用插件解析器读一遍)
|
|
258
|
-
npm run invariants # 引擎不变量门禁:真 cordis + 真 lib/teams + 桩 Agent,只报「违反集 D」
|
|
259
|
-
npm run build # 构建客户端产物(lib/client.js)
|
|
260
|
-
npm run sync-data # 把运行时数据同步进包内 data/
|
|
261
|
-
```
|
|
137
|
+
- **卸载**:DSH Desktop 在插件市场里卸载;CLI 用 `dsh plugin --profile web remove dsh-plugin-t-expert`。
|
|
138
|
+
卸载不会删数据目录 `~/.t-team/`(名册、自建专家、小队、定时任务都在那儿),要清干净手动删它即可。
|
|
139
|
+
- **反馈与源码**:<https://github.com/jiuaiwo/dsh-plugin-t-expert> —— 问题请走 Issues。
|
|
262
140
|
|
|
263
|
-
|
|
264
|
-
需要运维台(`tz.sh`、`add-expert.py`)的那几节在本机没有运维目录时会**显式打印 skip**,不会
|
|
265
|
-
静默少跑。推送与 PR 由 `.github/workflows/ci.yml` 跑同一套门禁(含 `npm run invariants`)。
|
|
141
|
+
## 许可
|
|
266
142
|
|
|
267
|
-
|
|
143
|
+
本插件以 **MIT** 发布(见 `LICENSE`)。
|
|
268
144
|
|
|
269
|
-
|
|
270
|
-
|
|
145
|
+
随包内容包含第三方成果 —— 内置团队引擎(派生自 `@nanmicoder/dsh-agent-teams`)、专家名册与中文译文
|
|
146
|
+
(`msitarzewski/agency-agents`、`jnMetaCode/agency-agents-zh` 等)、以及运行时依赖 `croner` ——
|
|
147
|
+
它们各自保留原许可。完整来源、版本与署名见 `THIRD-PARTY-NOTICES`,完整许可文本随包放在 `vendor/`。
|
|
271
148
|
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
| `INV-2` | 两个未完成的**写**任务不得共用同一 `inScope` 路径;`implementation` 必须带 `inScope` |
|
|
276
|
-
| `INV-3` | 一成员同时只能有一个未完成任务(顺序与**并发**都成立,并发恰好 1 胜) |
|
|
277
|
-
| `INV-4` | `halted` 语义:停→取消未完成任务并拒新单;`resume` 必须带非空 reason,之后才恢复派发 |
|
|
278
|
-
| `INV-5` | 并发写不丢更新:N 次并发建单全部落盘、id 唯一、状态文件始终可解析 |
|
|
279
|
-
| `INV-6` | `review` 必须带 `reviewedTaskId`;`needs_revision` 走 `failed` 且自动生成 `repair`;`verdict=pass` 才算完成 |
|
|
280
|
-
| `INV-7` | 质量类建单契约:`implementation` 必须带 `objective`/`acceptance`/`inScope`/`verify` |
|
|
281
|
-
| `INV-8` | 调度器契约:`approve` 后 pending 任务会被自动派给空闲成员(不是停在池里等人 claim) |
|
|
282
|
-
| `INV-9` | 宿主路径契约:`agents` 未就绪时快照不得抛错(用**真 cordis 受门控 ctx** 钉住;旧写法会抛 `without inject`,那一瞬间所有团队会从面板消失) |
|
|
283
|
-
|
|
284
|
-
**聚合入口**:`npm run invariants -- --all` 会把引擎不变量与既有的三道门禁一起跑,统一输出违反集 `D`:
|
|
285
|
-
|
|
286
|
-
| 聚合项 | 说明 |
|
|
287
|
-
| --- | --- |
|
|
288
|
-
| 引擎不变量 | 本文件的 9 条(真 cordis + 真 `lib/teams` + 桩 Agent) |
|
|
289
|
-
| 插件契约 | 以**黑盒**调用 `tools/verify.mjs`(527 项),只取退出码与摘要行 |
|
|
290
|
-
| 宿主 skill 漂移 | `tools/skill-drift.mjs`(它现在也能独立跑:有漂移即退出码 1) |
|
|
291
|
-
| 数据快照一致 | `tools/sync-data.mjs --check`(**源目录不存在时显式记 SKIP**,不算违反) |
|
|
292
|
-
|
|
293
|
-
约定:门禁报告「已跳过」不算违反(与 `verify.mjs` 的 skip 规矩一致)。CI 里仍分别跑 `verify` 与
|
|
294
|
-
`invariants`(不重复跑一遍 `--all`)。
|
|
295
|
-
|
|
296
|
-
探针基座的三条忠告写在 `tools/invariants.mjs` 的文件头(成员 id 要 approve 后才出现、团队 id
|
|
297
|
-
会被 slug 化、工具执行上下文必须带 `signal` 且成员 agent 要有 `status`/`whenIdle`)——它们都是
|
|
298
|
-
写这个门禁时踩出来的,改探针前先读那段。
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
四条容易踩的开发约定:
|
|
302
|
-
|
|
303
|
-
- **线格式(remote)的 schema 只有一份**:`lib/remote-schemas.js`,host 的 `lib/remote.js`
|
|
304
|
-
与客户端 `src/client.jsx` 都从它取;两端各自只保留**信封**(`descriptor()` / `direct()`)。
|
|
305
|
-
改字段只改 schema 文件;改方法签名要同时改两端信封——自检会机械比对每个方法的**参数名与
|
|
306
|
-
typeSymbol 是否两端一致**,漏改一处就会被拦下(不用等调用期)。
|
|
307
|
-
- `lib/client.js` 是**入库的构建产物**(≈1 MB)。改客户端只改 `src/client.jsx`,
|
|
308
|
-
然后必须重跑 `npm run build` —— 自检里有一条「产物新鲜度」门禁,忘了重跑会拦下来。
|
|
309
|
-
- `package-lock.json` 管的是**本插件自己的 devDependencies**;用户装插件用的 `pnpm`
|
|
310
|
-
是宿主 `dsh plugin` 在 profile 目录里跑的,两者互不冲突,不要为了方便删掉 lock。
|
|
311
|
-
- `lib/squads.js` 这类数据层**不写 `console`**:诊断一律走注入的宿主 logger
|
|
312
|
-
(`ctx.logger`),桌面与 Web 里 stderr 用户看不见。编译团队配置是**异步**的
|
|
313
|
-
(`execFile`,不是 `execFileSync`)—— 同步跑会把整个 Host 事件循环卡住。
|
|
314
|
-
|
|
315
|
-
内置团队引擎(`lib/teams/`)是**手工维护的源码**,改引擎直接改这里;
|
|
316
|
-
名册(`data/experts/`)与中文侧车(`data/zh/`)就是发布源,两者都不再从任何上游同步。
|
|
317
|
-
|
|
318
|
-
### `dsh.client.inject` 为什么写着 `dsh-client-ui-primitives`
|
|
319
|
-
|
|
320
|
-
那是**承重的声明,不是笔误**。`@deepseek-ai/dsh-client-modules` 的到达顺序契约里,
|
|
321
|
-
`dsh.client.inject` 让被点名的包**先于本插件的 client module 到达**;而 `lib/client.js`
|
|
322
|
-
里确实有 `require("@deepseek-ai/dsh-client-ui-primitives")`(构建时只把 `react` 外部化)。
|
|
323
|
-
删掉它并不会让构建失败,却可能让本插件赶在 primitives 之前物化、require 当场抛错。
|
|
324
|
-
|
|
325
|
-
顺带说明两个容易误判的点:**①** 这个包没有 `exports["./client"]`,所以它不作为「client module」
|
|
326
|
-
参与 `dsh.client.inject` 的常规扫描——但名字仍必须留在这里;**②** 自检 `[20b]` 已经把
|
|
327
|
-
「bundle 里每个 `@deepseek-ai/*` 外部 require 都必须在名单里」固化成不变量,以后新增 require
|
|
328
|
-
忘了声明会当场红,不必再靠人肉比对。
|
|
149
|
+
本插件及随包内容按**「原样」提供,不附带任何明示或默示担保**;与上述上游项目及 DeepSeek Harness
|
|
150
|
+
官方无隶属或背书关系。再分发(含修改版)时请保留 `LICENSE`、`THIRD-PARTY-NOTICES` 与 `vendor/`
|
|
151
|
+
下的许可文本。
|