@peterwangze/claude-trigger-router 1.4.0 → 1.6.0

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.
@@ -14,6 +14,9 @@
14
14
  - `src/e2e/cli-acceptance.test.ts`
15
15
  - 关注更贴近真实人工验证的 shell / wrapper / staged 包路径
16
16
  - 重点校验 Windows 终端输出、wrapper、daemon 生命周期、release stage 验收链路
17
+ - `src/ui/workbench.dom.test.ts`
18
+ - 关注 `/ui` 工作台真实 DOM 脚本执行和基础交互
19
+ - 重点校验配置载入、compiled preview、保存失败 validation issue 和 Health action 过滤
17
20
 
18
21
  ## 2. 当前自动覆盖范围
19
22
 
@@ -77,6 +80,8 @@
77
80
  ### UI / 服务状态
78
81
 
79
82
  - `/ui` 首屏展示服务 ready、端口、模型数、`Router.default`、`Runtime.mode`、listener、远程状态和 Registration 摘要
83
+ - `POST /api/config` 保存前复用 validation issue contract;已有配置备份失败时必须拒绝写入,避免 UI save 静默覆盖用户配置
84
+ - `POST /api/config` 保存 `Runtime` / `Registration` / `Auth` 等已配置分支时不能静默丢弃,尤其要保留 managed key 记录且不暴露一次性 secret
80
85
  - 维护者工作台展示 role / listener / remote client connection guide,和 `/api/service-info` 的 listener / clientConnection contract 对齐
81
86
  - 维护者工作台展示 Governance trace、metrics、Health 摘要、异常阈值、快照和归档入口
82
87
  - Compiled Models 区展示 `Registration.models` 编译出的 model pools、active endpoint、priority endpoint 列表和 upstream warning,覆盖同模型多源池化的编译期契约
@@ -84,6 +89,7 @@
84
89
  - `GET /api/governance/health` 返回维护者健康摘要、关键指标、模型切换 signals、routing outcome、异常列表和建议 action
85
90
  - Health action 可联动 trace 过滤:cascade action 对应 `cascadeTriggered=true`,shadow action 对应 `shadowChecked=true`
86
91
  - UI HTML 渲染测试覆盖 `/api/governance/health` 数据源、Health 状态占位、routing outcome 指标、分组 outcome 面板和健康摘要说明入口
92
+ - UI DOM smoke 执行 `renderWorkbenchHtml()` 生成的内联脚本,覆盖载入当前配置、compiled models 预览、保存失败 validation issue 展示和 Health action trace 过滤,防止字符串级 HTML 断言漏掉脚本拼接或 DOM 绑定错误
87
93
 
88
94
  ### setup 主要选择路径
89
95
 
@@ -128,6 +134,7 @@
128
134
  - 主命令不会异常退出
129
135
  - 命令只修改允许的隔离文件
130
136
  - setup 与路由主流程可走通
137
+ - 单个子命令超时时,harness 会清理子进程树并输出 stdout/stderr 摘要,便于定位卡点
131
138
 
132
139
  ### `cli-acceptance`
133
140
 
@@ -137,13 +144,38 @@
137
144
  - `release:stage` 产物本身可作为手工验收入口使用
138
145
  - staged 包路径会直接 smoke `/ui` 和 `/api/governance/health`,避免维护者工作台只在源码测试中可用
139
146
 
140
- ## 4. 当前发布门禁
147
+ ## 4. v1.5 入口稳定专项门禁
148
+
149
+ v1.5.0 期间新增或修改功能前,先确认这些入口契约不退化:
150
+
151
+ - `setup`:覆盖 fresh setup、复用已有配置、legacy migration、repair、rebuild、远程客户端和服务端部署三类角色;不能误启动、误覆盖或把 next steps 指向错误角色。
152
+ - `start/status/stop/restart`:覆盖前台、后台、alternate port、端口被非本服务占用、stale PID、服务已运行和配置错误;失败信息必须给出清晰下一步。
153
+ - `code`:只在服务 ready 时进入 Claude Code;本地/远程代理环境变量必须正确注入;服务未运行或 Claude CLI 缺失时必须明确失败。
154
+ - `doctor/setup/ui save`:复用同一 validation issue contract;写入前保留备份,不能静默丢弃 `Runtime` / `Registration` / `Auth` 等已配置分支。
155
+ - `/ui`:现阶段保留 HTML / API smoke,并新增 `npm run test:ui` 的 jsdom DOM smoke;后续真实浏览器 smoke 继续覆盖基础路由解释、键鼠流程和维护者 Health 展示。
156
+ - coverage:入口看护范围从早期 `src/trigger/**/*.ts` 扩展到 setup、config、models、protocols、governance、server、auth、doctor、cli 主链。
157
+
158
+ 专项验证建议加跑:
159
+
160
+ ```bash
161
+ npm test -- --run --coverage
162
+ npm run test:ui
163
+ npm run test:e2e:cli:entry
164
+ npm run test:e2e:cli
165
+ npm run test:e2e:acceptance
166
+ ```
167
+
168
+ 这组检查不是替代 `release:verify`,而是在 v1.5.0 期间提前暴露入口主路径、UI 交互和 coverage 口径漂移。`test:ui` 是源码侧 `/ui` DOM smoke;`test:e2e:cli:entry` 是较短的入口 smoke,覆盖 init、doctor、start/status/stop、setup fresh、setup remote client、setup server deployment、code 和 ui;完整 `test:e2e:cli` 仍保留为发布门禁,当前在 Windows 本地约 3-4 分钟。
169
+
170
+ ## 5. 当前发布门禁
141
171
 
142
172
  发布前建议至少通过:
143
173
 
144
174
  ```bash
145
175
  npm run build
146
176
  npm test -- --run
177
+ npm run test:ui
178
+ npm run test:e2e:cli:entry
147
179
  npm run test:e2e:cli
148
180
  npm run test:e2e:acceptance
149
181
  npm run release:verify
@@ -155,7 +187,7 @@ npm run release:verify
155
187
  - `release:verify` 已包含 `test:e2e:acceptance`
156
188
  - `test:e2e:acceptance` 已包含 release-stage wrapper 的 `/ui` HTML 与治理健康 API smoke
157
189
 
158
- ## 5. 仍建议保留的人工验收重点
190
+ ## 6. 仍建议保留的人工验收重点
159
191
 
160
192
  自动化已经尽量接近真实路径,但发布前仍建议人工快速确认:
161
193
 
@@ -166,7 +198,7 @@ npm run release:verify
166
198
  - 新增配置模板和 README 的指引是否和实现一致
167
199
  - server 部署入口生成的 bootstrap key 是否只用于维护者管理,远程客户端是否改用 managed `client + read-only` key
168
200
 
169
- ## 6. 后续增补原则
201
+ ## 7. 后续增补原则
170
202
 
171
203
  后续新增用户可见命令、选项、setup 分支或发布脚本行为时,优先补到这 3 层之一:
172
204
 
@@ -0,0 +1,39 @@
1
+ # v1.5.0 Release Notes
2
+
3
+ `v1.5.0` 定位为“入口基础功能稳定与易用性巩固版”。这个版本不继续扩展 benchmark、服务化或模型池策略,而是先把新用户和日常用户每天会碰到的入口主路径做稳。
4
+
5
+ ## 本次发布主线
6
+
7
+ - 入口门禁稳定化:新增 `npm run test:e2e:cli:entry` 作为较短 packaged CLI smoke,覆盖 init、doctor、start/status/stop、setup fresh、setup remote client、setup server deployment、code 和 ui。
8
+ - packaged E2E 可诊断性:E2E harness 在单命令 timeout 时会清理子进程树,并输出 cwd、stdout、stderr 摘要,避免发布前只看到超时和残留进程。
9
+ - 配置保存安全线:setup、doctor、UI save 和 server save 继续复用 validation issue contract;配置写入前必须先备份,备份失败不继续写入。
10
+ - 远程/服务端 setup 角色路径:packaged E2E 覆盖 remote client setup 保存 `Runtime.remote_service` 且不进入 provider/model 填写;server deployment setup 生成 `Runtime.mode: server` / bootstrap `APIKEY` 且不自动启动服务。
11
+ - UI 基础交互看护:新增 `npm run test:ui` 与 jsdom DOM smoke,覆盖 `/ui` 载入当前配置、compiled models 预览、保存失败 validation issue 展示和 Health action trace 过滤。
12
+ - UI 首轮工程化拆分:`workbench-document.ts` 承接 HTML 文档骨架和内联脚本抽取,UI smoke 增加脚本语法检查,防止字符串拼接错误绕过 HTML 字符串断言。
13
+
14
+ ## 发布边界
15
+
16
+ 本版本聚焦入口稳定,不把 CTR 宣称为完整 benchmark 运营平台、完整 server/cloud 托管平台或 agent 平台。以下事项进入后续版本,但不作为 `v1.5.0` 发布承诺:
17
+
18
+ - benchmark 历史看板和人工校准 UI 表单。
19
+ - `ctr eval` 与真实 trace 的长期收益运营闭环。
20
+ - 服务端默认安全运营、密钥轮换手册、主动 pool health、成本/速率元数据和更多调度策略。
21
+ - 更深入的 UI CSS/JS/渲染片段拆分、真实浏览器截图和键鼠流程 smoke。
22
+
23
+ 对用户的建议口径是:`v1.5.0` 适合把 CTR 作为日常 Claude Code 路由代理入口使用;遇到问题时优先依赖 `ctr doctor`、`ctr status`、`ctr ui` 和发布前 packaged smoke 所覆盖的主路径。
24
+
25
+ ## 发布前必跑
26
+
27
+ ```bash
28
+ npm run release:verify
29
+ npm run release:stage
30
+ ```
31
+
32
+ 正式发布前确认:
33
+
34
+ - `package.json` 与 `package-lock.json` 版本均为 `1.5.0`
35
+ - `ctr version` 输出 `Version: 1.5.0`
36
+ - `v1.5.0` tag 与包版本一致
37
+ - npm registry 中不存在 `@peterwangze/claude-trigger-router@1.5.0`
38
+ - npm trusted publisher 指向 `peterwangze/claude-trigger-router` 的 `publish.yml`
39
+ - GitHub publish workflow 使用 Node 24 / npm 11.5.1+
@@ -0,0 +1,36 @@
1
+ # v1.6.0 Release Notes
2
+
3
+ `v1.6.0` 定位为“多模型收益运营化版”。这个版本不继续扩展服务化或模型池策略,而是先把维护者判断“多模型组合是否真的带来质量/速度收益”的证据链做完整。
4
+
5
+ ## 本次发布主线
6
+
7
+ - Benchmark history:`ctr eval --input/--run` 支持 `--save-history`,把评测摘要写入 `~/.claude-trigger-router/benchmark-history.json`;`ctr eval --history` 可查看最近分数、趋势和 Top models。
8
+ - History API/UI:新增 `/api/benchmark/history`,`/ui` 维护者工作台展示 benchmark history、最近趋势、Top models,并同屏显示真实 trace 的 task comparison / quality evidence 对齐摘要。
9
+ - 人工校准 UI:新增 `/api/benchmark/calibration` 与 `/ui` Human calibration 表单,维护者可把人工评分样本追加进 benchmark history;历史文件只保存摘要,不持久化原始模型输出。
10
+ - 核心路由场景任务集:固定任务新增 `routeScenario`,覆盖 default、think、long_context、background、rule_hit、candidate_selection,并保留 server_ops / pool_health 作为后续服务化证据。
11
+ - 评测与真实 trace 对齐:离线评测报告新增 `byRouteScenario`,UI benchmark history 同时展示离线 history、真实 task comparison 和 quality evidence,避免把 rubric 分数孤立看待。
12
+
13
+ ## 发布边界
14
+
15
+ 本版本聚焦收益运营化,不把 CTR 宣称为完整 server/cloud 托管平台、完整模型池运营平台或 agent 平台。以下事项进入后续版本,但不作为 `v1.6.0` 发布承诺:
16
+
17
+ - 服务端部署默认安全策略、密钥轮换手册和托管维护 checklist。
18
+ - 模型池主动健康探测、成本/速率元数据和更多调度策略。
19
+ - handoff summary、tool capability guardrail、输入/输出 guardrail 和 trace span 化。
20
+ - 更完整的可视化趋势图表或外部报表系统。
21
+
22
+ ## 发布前必跑
23
+
24
+ ```bash
25
+ npm run release:verify
26
+ npm run release:stage
27
+ ```
28
+
29
+ 正式发布前确认:
30
+
31
+ - `package.json` 与 `package-lock.json` 版本均为 `1.6.0`
32
+ - `ctr version` 输出 `Version: 1.6.0`
33
+ - `v1.6.0` tag 与包版本一致
34
+ - npm registry 中不存在 `@peterwangze/claude-trigger-router@1.6.0`
35
+ - npm trusted publisher 指向 `peterwangze/claude-trigger-router` 的 `publish.yml`
36
+ - GitHub publish workflow 使用 Node 24 / npm 11.5.1+
package/docs/releasing.md CHANGED
@@ -7,6 +7,8 @@
7
7
  - `Release Check`:在 PR、`master` push 和手动触发时执行发布前检查
8
8
  - `Publish Package`:在版本 tag、GitHub Release 或手动触发时执行正式发布
9
9
 
10
+ 本次 `v1.6.0` minor release 的优先级是多模型收益运营化。发布检查需要同时保护既有 `setup / start / status / code / doctor / ui` 入口主路径,以及 `ctr eval`、benchmark history、人工校准 UI、真实 trace outcome / task comparison 的收益证据链。
11
+
10
12
  ## 一次性准备
11
13
 
12
14
  1. 在 npm 包 `@peterwangze/claude-trigger-router` 的包设置中添加 trusted publisher
@@ -24,17 +26,31 @@
24
26
 
25
27
  1. 更新版本号
26
28
  - `vX.Y.0` 这类 minor release 还需要同步更新版本依赖用例、README 发布定位和对应 release notes。
27
- - 本次 `v1.4.0` 的发布边界以 `docs/release-notes-v1.4.0.md` 为准:主打 SmartRouter 常用体验,不宣称完整 benchmark 运营平台或完整云端平台。
29
+ - 本次 `v1.6.0` 的发布边界以 `docs/release-notes-v1.6.0.md` 为准:主打多模型收益运营化,不宣称完整云端平台、完整模型池运营平台或 agent 平台。
28
30
  2. 本地先执行发布包验证:
29
31
 
30
32
  ```bash
31
33
  npm run release:verify
32
34
  ```
33
35
 
36
+ v1.6.0 期间建议在正式 `release:verify` 前额外跑一次收益运营专项:
37
+
38
+ ```bash
39
+ npm test -- --run --coverage
40
+ npm run test:ui
41
+ npm run test:e2e:cli:entry
42
+ npm run test:e2e:cli
43
+ npm run test:e2e:acceptance
44
+ ```
45
+
46
+ 其中 coverage 口径已经从早期 `src/trigger/**/*.ts` 扩展到 setup、config、models、protocols、governance、server、auth、doctor、cli 主链;`test:ui` 是源码侧 `/ui` DOM smoke,用于保护配置载入、compiled preview、保存失败提示、Health action、benchmark history 和人工校准表单这类基础交互;`test:e2e:cli:entry` 是较短的打包后入口 smoke,用于先保护 init、doctor、start/status/stop、setup fresh、setup remote client、setup server deployment、code 和 ui;后续新增入口功能时,先补对应看护再扩展低频能力。
47
+
34
48
  这一步会依次执行:
35
49
 
36
50
  - `npm run build`
37
51
  - `npm test -- --run`
52
+ - `npm run test:ui`
53
+ - `npm run test:e2e:cli:entry`
38
54
  - `npm run test:e2e:cli`
39
55
  - `npm run test:e2e:acceptance`
40
56
  - `npm pack --dry-run`
@@ -44,7 +60,8 @@ npm run release:verify
44
60
 
45
61
  其中两层打包后验证分别承担不同职责:
46
62
 
47
- - `npm run test:e2e:cli`:覆盖打包后 CLI 的主要命令、选择路径与文件副作用边界
63
+ - `npm run test:e2e:cli:entry`:覆盖打包后 CLI 的入口 smoke,优先保护 init、doctor、start/status/stop、setup fresh、setup remote client、setup server deployment、code 和 ui
64
+ - `npm run test:e2e:cli`:覆盖打包后 CLI 的主要命令、选择路径与文件副作用边界;当前 Windows 本地完整运行约 3-4 分钟
48
65
  - `npm run test:e2e:acceptance`:通过真实 shell / 全局 wrapper / 隔离 HOME 做更贴近人工验收的主路径看护
49
66
 
50
67
  当前已经覆盖:
@@ -63,7 +80,7 @@ npm run release:verify
63
80
  - 目标端口被非本服务占用时的安全提示与“无额外文件修改”边界
64
81
  - 残留 / 失效 PID 文件的安全清理
65
82
  - `release:stage` 生成的 `.release-stage\ctr-release-home.cmd` wrapper 是否真的指向隔离 `.release-home`
66
- - SmartRouter v1.4.0 发布承诺的模板、配置解释、候选向导、路由决策摘要、切换体感摘要和配置路径级调优建议
83
+ - v1.6.0 收益运营发布承诺的 benchmark history CLI/API/UI、人工校准 UI、核心路由场景任务集和评测/真实 trace 对齐
67
84
 
68
85
  只有这一步通过后,才继续正式发布,避免“发布后才发现包内容、CLI 启动或 setup 主流程有问题”。
69
86
 
@@ -210,6 +227,7 @@ git push origin v1.0.1
210
227
  - `npm ci`
211
228
  - `npm run build`
212
229
  - `npm test -- --run`
230
+ - `npm run test:e2e:cli:entry`
213
231
  - `npm run test:e2e:cli`
214
232
  - npm trusted publishing 版本门禁
215
233
  - `npm publish --access public`
@@ -261,14 +279,17 @@ docs/cli-test-matrix.md
261
279
  - `npm run test:e2e:cli`
262
280
  - 当前 `package.json.version` 是否已经发布到 npm
263
281
  - 如果 `package.json` 已改动,版本号是否真的发生变化
282
+ - 当前提交是否已经带有匹配的 `vX.Y.Z` release tag
264
283
 
265
284
  它会在这些情况下直接失败:
266
285
 
267
286
  - `package.json` 改了,但版本号没有变化
268
- - `package.json` 改了,而且目标版本已经存在于 npm
287
+ - `package.json` 改了,而且目标版本已经存在于 npm,但当前提交没有匹配的 `vX.Y.Z` tag
269
288
 
270
289
  这样可以把常见发布问题提前暴露在 PR 或合入 `master` 之前。
271
290
 
291
+ 如果 `master` push 和 `vX.Y.Z` tag push 几乎同时发生,tag 触发的 `Publish Package` 可能先把版本发布到 npm。`Release Check` 会识别当前提交是否正好带有匹配 tag;如果是,它会把“npm 已存在”视为已完成发布提交,而不是误判为版本冲突。
292
+
272
293
  ## 本地兜底发布
273
294
 
274
295
  如果需要手动发布,仍可在本地执行:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peterwangze/claude-trigger-router",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "description": "Intelligent trigger-based router for Claude Code with automatic task type detection and model routing",
5
5
  "bin": {
6
6
  "ctr": "dist/cli.js"
@@ -27,7 +27,9 @@
27
27
  "dev": "tsx watch src/cli.ts",
28
28
  "start": "node dist/cli.js start",
29
29
  "test": "vitest --exclude src/e2e/**",
30
+ "test:ui": "vitest --run src/ui/workbench.dom.test.ts",
30
31
  "test:e2e:cli": "vitest --run src/e2e/cli-e2e.test.ts",
32
+ "test:e2e:cli:entry": "vitest --run src/e2e/cli-e2e.test.ts -t \"init --force generates|doctor can repair|start/status/stop work|code reuses|ui prints|setup can create a fresh config|setup can create a remote-service client config|setup can create a server deployment profile\"",
31
33
  "test:e2e:acceptance": "vitest --run src/e2e/cli-acceptance.test.ts",
32
34
  "verify:package": "pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/verify-package.ps1",
33
35
  "install:local-release": "pwsh -NoProfile -ExecutionPolicy Bypass -File scripts/install-local-release.ps1",
@@ -54,19 +56,22 @@
54
56
  "@fastify/static": "^8.2.0",
55
57
  "@musistudio/llms": "^1.0.31",
56
58
  "dotenv": "^16.4.7",
57
- "json5": "^2.2.3",
58
59
  "js-yaml": "^4.1.0",
60
+ "json5": "^2.2.3",
61
+ "lru-cache": "^10.0.0",
59
62
  "openurl": "^1.1.1",
60
63
  "rotating-file-stream": "^3.2.7",
61
64
  "tiktoken": "^1.0.21",
62
- "uuid": "^11.1.0",
63
- "lru-cache": "^10.0.0"
65
+ "uuid": "^11.1.0"
64
66
  },
65
67
  "devDependencies": {
66
68
  "@types/js-yaml": "^4.0.9",
69
+ "@types/jsdom": "^28.0.3",
67
70
  "@types/node": "^24.0.15",
71
+ "@vitest/coverage-v8": "^1.6.1",
68
72
  "esbuild": "^0.25.1",
69
73
  "fastify": "^5.4.0",
74
+ "jsdom": "^29.1.1",
70
75
  "shx": "^0.4.0",
71
76
  "tsx": "^4.7.0",
72
77
  "typescript": "^5.8.2",