dsh-plugin-t-expert 0.2.15 → 0.3.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
@@ -15,6 +15,19 @@ DeepSeek Harness 插件:**22 个分类 / 316 位专家**的名册(中文名
15
15
  设置页一共**三个标签**:**专家**(启停 / 看提示词 / 新建自建专家)、**分类**(自建分类的增删改)、
16
16
  **队伍**(小队模板 + 运行中的团队)。
17
17
 
18
+ 真实的后台任务列表不在设置页。右上角有一个**常驻的小徽章**(与团队徽章同一层、同一视觉体系),
19
+ 它是随时点开查看的入口;只有真的还有东西在跑时才亮起来并给出运行中数量(安静时只是一个灰点,不显示数字),
20
+ 点开就是任务面板:当前会话及其子代理的后台任务,只读(状态、退出码与耗时,
21
+ 不含输出与终止)。面板可拖动,位置记在本机。
22
+
23
+ 徽章只在"从无到有"时冒出,**面板绝不自动展开**——展开与否完全由你决定,关掉之后同一批任务不会再打扰你。
24
+ 子代理区显示的是**子代理的真名**(取自语宿主的子代理目录 `label`,而不是从提示词生成的会话标题),
25
+ 点一行即可跳到那个子代理的会话(与官方任务页同一个 `openSubagent` 接口)。
26
+ 每行副标题显示该子代理的**请求文本前一段**(会话标题就是从它生成的),并标注运行中/已结束;
27
+ 列表顺序沿用宿主子代理目录的原生次序——与官方任务页一致(快照里没有创建时间字段,不自造一种序)。
28
+ 输入区 **T专家** 按钮弹开的浮层里有四个标签:**专家 → 小队 →(有运行中的团队时才出现)团队 → 任务**,
29
+ 点开时默认停在**专家**标签(这个浮层主要就是用来挑专家的)。
30
+
18
31
  ---
19
32
 
20
33
  ## 一、安装
@@ -57,6 +70,7 @@ dsh plugin --profile web add dsh-plugin-t-expert
57
70
  ├── zh/ 中文侧车:names.json、descriptions.json、<分类>/<slug>.md、divisions.json
58
71
  ├── custom/ 你在面板里自建的专家
59
72
  ├── teams.json 小队定义(设置页「队伍」写回这里)
73
+ ├── schedule.json 定时任务:任务、cron 表达式与最近 20 次执行记录
60
74
  ├── t-team.config.json 小队编译产物(引擎配置,人格已内联)
61
75
  ├── teams.resolved.json 小队编译产物(/t 列表用)
62
76
  ├── team-profiles.py 小队编译器的播种副本(实际跑的是包内那份)
@@ -74,10 +88,65 @@ dsh plugin --profile web add dsh-plugin-t-expert
74
88
  - 一句话:**送得到的送到,送不到的一定出声**(日志里给出数量与例子,删掉对应文件后重启即可重新播种)。
75
89
  - 唯一始终用包内那份的是小队编译器 `team-profiles.py`——它是代码,随插件版本走。
76
90
  - 想换目录位置,用配置项 `root` / `zhRoot` / `customRoot` 覆盖即可,不必改代码。
91
+ - `schedule.json` 是**定时任务自己的数据文件**(见第三节):它在数据根下、与 `teams.json` 同级,
92
+ 刻意不写进宿主的存储域,也不与其它定时插件(例如 `@weibaohui/dsh-tasks`)共享任何文件。
77
93
 
78
94
  ---
79
95
 
80
- ## 三、自建专家与分类
96
+ ## 三、定时任务
97
+
98
+ 到点自动**新开一个会话**、把提示词交给它执行——也可以随时手动「立即执行」。
99
+
100
+ **入口在哪**:Web UI 左侧栏**「新会话」按钮正下方**那一行「定时任务」(与「新会话」同款按钮外观:
101
+ 38px 高、12px 圆角、同样的边框与抬升填充;侧栏收起时退回图标态)。
102
+ 点开后在**右侧主区域**直接显示管理页(不是设置弹窗里的一个小节)。点左侧任意会话即回到会话视图。
103
+
104
+ **能做什么**:
105
+
106
+ | 能力 | 说明 |
107
+ | --- | --- |
108
+ | cron 定时执行 | 每条 = 标题 + 提示词 + 五段 croner 表达式(`分 时 日 月 周`) |
109
+ | 结构化选择器 | 快捷模板(每小时整点 / 每 30 分钟 / 每天 9:00 / 工作日 8:30 / 每周一 10:00);按「每小时 / 每天 / 每周 / 自定义」逐级选;周几多选;也可直接写原始表达式 |
110
+ | 实时预览 | 选定后在面板上显示**最近 5 次执行时间**(由宿主用 croner 计算,保存前就能确认周期对不对) |
111
+ | 立即执行 | 任意一条都能一键跑一次,不必等 cron 到点 |
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 是共用依赖(各装各的)。
146
+
147
+ ---
148
+
149
+ ## 四、自建专家与分类
81
150
 
82
151
  **新建专家**:设置 → 专家 → 「+ 新建专家」,选分类(官方 22 个或你自建的),填名称 / 简介 / 人格正文。
83
152
 
@@ -91,7 +160,7 @@ dsh plugin --profile web add dsh-plugin-t-expert
91
160
 
92
161
  ---
93
162
 
94
- ## 四、工具与命令
163
+ ## 五、工具与命令
95
164
 
96
165
  | 工具 | 作用 |
97
166
  | --- | --- |
@@ -133,7 +202,7 @@ Host/Origin 校验与浏览器认证,静态资源另有白名单,非白名
133
202
 
134
203
  ---
135
204
 
136
- ## 五、小队
205
+ ## 六、小队
137
206
 
138
207
  设置 → 队伍 里搜索、修改成员 / 别名 / 启停,然后保存:改动写回 `~/.t-team/teams.json`,
139
208
  再调用小队编译器生成引擎配置;**编译失败会自动回滚**,不会把坏定义留在盘上。
@@ -145,7 +214,7 @@ Host/Origin 校验与浏览器认证,静态资源另有白名单,非白名
145
214
  - 引擎重载本身失败时会留下可诊断的信号(日志里有 `[t-team]` 的 error/warn),
146
215
  并且报错时会带着原因说清引擎当前是否可用,不会静默假装已生效。
147
216
 
148
- 约束:小队 key 只能 ASCII `a-z0-9-`(中文放 `description` / `aliases`);每队 ≤ `maxMembers`(默认 8,见「六、配置项」);
217
+ 约束:小队 key 只能 ASCII `a-z0-9-`(中文放 `description` / `aliases`);每队 ≤ `maxMembers`(默认 8,见「七、配置项」);
149
218
  小队总数 ≤ 48;别名全局唯一;成员必须是名册里真实存在的专家。
150
219
  > 成员上限由插件透传给小队编译器(`data/team-profiles.py --max-members`),两边同一个真源:
151
220
  > 改 `maxMembers` 就能真正生效,不必再动编译器。只有在用**旧版本**编译器(不认这个参数)时,
@@ -153,7 +222,7 @@ Host/Origin 校验与浏览器认证,静态资源另有白名单,非白名
153
222
 
154
223
  ---
155
224
 
156
- ## 六、配置项
225
+ ## 七、配置项
157
226
 
158
227
  全部以插件 `Config` 定义为准(`lib/index.js`,共 15 项)。常用的几个:
159
228
 
@@ -166,24 +235,25 @@ Host/Origin 校验与浏览器认证,静态资源另有白名单,非白名
166
235
  | `divisions` | `[]` | 留空=自动扫描 `root` 下所有含 `.md` 的分类 |
167
236
  | `maxSummonBatch` / `summonConcurrency` | `8` / `4` | 批量召唤上限与并发 |
168
237
  | `stateDir` | `.agent-teams` | 团队状态目录(**工作区内的相对路径**),团队状态落在 `<工作区>/<stateDir>/<teamId>/`。内置团队引擎、设置页「队伍」标签与只读预检工具 `t_team_plan_check` 都按它定位团队——**三处都读这一个字段**,不存在第二来源(自检 8f 有静态 + 行为双断言兜着)。要挪团队状态目录只改这里 |
169
- | `memberProvider` / `memberModel` / `maxMembers` | — | 转给内置团队引擎;`maxMembers` 还由插件透传给小队编译器(见「五、小队」) |
238
+ | `memberProvider` / `memberModel` / `maxMembers` | — | 转给内置团队引擎;`maxMembers` 还由插件透传给小队编译器(见「六、小队」) |
170
239
 
171
240
  ---
172
241
 
173
- ## 七、许可
242
+ ## 八、许可
174
243
 
175
- 本插件 MIT(见 `LICENSE`)。随包分发的专家名册、中文译文与内置团队引擎各自按其原许可使用:
244
+ 本插件 MIT(见 `LICENSE`)。随包分发的专家名册、中文译文、内置团队引擎,以及**运行时依赖**
245
+ `croner`(定时任务的 cron 解析与调度)各自按其原许可使用:
176
246
  来源、版本与署名写在 `THIRD-PARTY-NOTICES`,完整许可文本随包放在 `vendor/`。
177
- 再分发(含修改版)时请一并保留这三样。
247
+ 再分发(含修改版)时请一并保留这四样。
178
248
 
179
249
  ---
180
250
 
181
- ## 八、开发
251
+ ## 九、开发
182
252
 
183
253
  ```bash
184
254
  npm install # 装开发期依赖(.npmrc 里开了 legacy-peer-deps,原因见该文件)
185
255
  npm run typecheck # 类型检查(tsconfig.json 只覆盖自研 Host 文件,不碰并入的引擎)
186
- npm run verify # 自检套件(现 511 项断言):插件契约、工具、remote、客户端产物、播种与快照,
256
+ npm run verify # 自检套件(现 601 项断言):插件契约、工具、remote、客户端产物、播种与快照,
187
257
  # 外加「发布包自洽」(真打一份 tgz、解开、再用插件解析器读一遍)
188
258
  npm run invariants # 引擎不变量门禁:真 cordis + 真 lib/teams + 桩 Agent,只报「违反集 D」
189
259
  npm run build # 构建客户端产物(lib/client.js)
@@ -209,6 +279,19 @@ npm run sync-data # 把运行时数据同步进包内 data/
209
279
  | `INV-6` | `review` 必须带 `reviewedTaskId`;`needs_revision` 走 `failed` 且自动生成 `repair`;`verdict=pass` 才算完成 |
210
280
  | `INV-7` | 质量类建单契约:`implementation` 必须带 `objective`/`acceptance`/`inScope`/`verify` |
211
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`)。
212
295
 
213
296
  探针基座的三条忠告写在 `tools/invariants.mjs` 的文件头(成员 id 要 approve 后才出现、团队 id
214
297
  会被 slug 化、工具执行上下文必须带 `signal` 且成员 agent 要有 `status`/`whenIdle`)——它们都是
@@ -59,7 +59,23 @@
59
59
  `data/zh/manual.json` 与 `data/zh/manual-bodies/` 是**本项目的补充翻译**(用于补齐尚未覆盖的条目
60
60
  或在译文不准确时覆盖),随本插件以 MIT 发布,同样保留在包内。
61
61
 
62
- ## 3. 分发要求
62
+ ## 3. 定时任务调度器(运行时依赖)
63
+
64
+ | 项 | 值 |
65
+ | --- | --- |
66
+ | 上游包 | [`croner`](https://www.npmjs.com/package/croner) |
67
+ | 上游仓库 | https://github.com/Hexagon/croner |
68
+ | 版本 | `^9.1.0`(`package.json` 的 `dependencies`) |
69
+ | 许可 | MIT — Copyright (c) 2015-2021 Hexagon <github.com/Hexagon> |
70
+ | 位置 | **不作为源码内联**:按普通 npm 依赖安装(`node_modules/croner`),由 `lib/schedule.js` 在运行期 `import { Cron }` |
71
+ | 许可全文 | `vendor/third-party-licenses/croner.LICENSE`(随包分发,便于再分发者与离线安装核对) |
72
+
73
+ 用途:T专家 的定时任务(cron 表达式解析、下次触发时间预览、定时器)由它提供;本插件不修改其源码。
74
+
75
+ > 与 `@weibaohui/dsh-tasks` 的关系:两者都用 `croner`,但**各自声明依赖、各装各的**,
76
+ > 数据文件、服务名与定时器互不共享(见 README 的「定时任务」一节)。
77
+
78
+ ## 4. 分发要求
63
79
 
64
80
  再分发本插件(或其修改版)时请一并保留以下文件(它们都在 npm 包内):
65
81
 
@@ -68,3 +84,4 @@
68
84
  - `vendor/dsh-agent-teams/LICENSE`(内置团队引擎)
69
85
  - `vendor/third-party-licenses/agency-agents.LICENSE`(英文名册)
70
86
  - `vendor/third-party-licenses/agency-agents-zh.LICENSE`(中文译文)
87
+ - `vendor/third-party-licenses/croner.LICENSE`(定时任务调度器,运行时依赖)