dsh-tower 2.3.0 → 2.4.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/COMPATIBILITY.md +1 -0
  3. package/CONTRIBUTING.md +17 -3
  4. package/PRINCIPLES.md +18 -0
  5. package/README.en.md +29 -16
  6. package/README.md +22 -15
  7. package/cordis.patch.yml +56 -28
  8. package/docs/README.md +2 -1
  9. package/docs/adr/0004-surface-budget.md +20 -0
  10. package/docs/adr/0005-component-surface.md +130 -0
  11. package/docs/adr/README.md +1 -0
  12. package/docs/agents/workflow.md +1 -1
  13. package/docs/architecture/overview.md +25 -7
  14. package/docs/guide/hot-reload.md +4 -4
  15. package/docs/guide/install-upgrade-migration.md +13 -0
  16. package/docs/operations/security.md +1 -1
  17. package/docs/reference/component-surface.md +135 -0
  18. package/docs/reference/config.generated.md +2 -10
  19. package/docs/reference/config.md +11 -9
  20. package/docs/reference/doctor.md +14 -9
  21. package/docs/reference/surface-budget.md +52 -23
  22. package/docs/reference/tools.generated.md +4 -2
  23. package/docs/reference/tools.md +6 -3
  24. package/docs/zh/README.md +1 -1
  25. package/docs/zh/guide/hot-reload.md +3 -3
  26. package/docs/zh/guide/install-upgrade-migration.md +10 -0
  27. package/docs/zh/operations/security.md +1 -1
  28. package/docs/zh/reference/config.md +9 -9
  29. package/docs/zh/reference/tools.md +6 -4
  30. package/domain/components.js +641 -0
  31. package/domain/config/schema.js +37 -27
  32. package/domain/contracts/outputs.js +10 -0
  33. package/domain/errors.js +11 -1
  34. package/domain/mission.js +12 -1
  35. package/domain/surface.js +154 -55
  36. package/host/capability-batch.js +15 -0
  37. package/host/capability-hmr.js +30 -0
  38. package/host/capability-import.js +11 -0
  39. package/host/capability-leases.js +11 -0
  40. package/host/capability-registry.js +149 -0
  41. package/host/capability-tests.js +16 -0
  42. package/host/doctor.js +41 -9
  43. package/host/hmr.js +2 -4
  44. package/host/presets.js +51 -9
  45. package/host/tool-registry.js +150 -34
  46. package/index.js +32 -20
  47. package/locale/en.json +31 -11
  48. package/locale/zh.json +30 -10
  49. package/package.json +16 -3
  50. package/scripts/check-components.mjs +235 -0
  51. package/scripts/component-surface.json +395 -0
  52. package/scripts/generate-component-surface.mjs +59 -0
  53. package/scripts/generate-tools-reference.mjs +7 -25
  54. package/scripts/generate-types.mjs +127 -0
  55. package/scripts/lib/tool-surface.mjs +85 -0
  56. package/scripts/mount-smoke/fixtures.mjs +3 -3
  57. package/scripts/mount-smoke/surface.mjs +96 -27
  58. package/scripts/mount-smoke.mjs +3 -1
  59. package/scripts/pack-manifest.txt +17 -0
  60. package/scripts/surface-baseline.json +35 -4
  61. package/scripts/surface-baseline.mjs +32 -34
  62. package/scripts/types-coverage.mjs +184 -0
  63. package/scripts/types-strict-manifest.txt +10 -0
  64. package/scripts/types-strict.mjs +141 -0
  65. package/skills.js +8 -1
  66. package/tools/index.js +2 -1
  67. package/tools/reload.js +34 -35
  68. package/tools/status.js +8 -1
  69. package/types/index.d.ts +28 -12
@@ -42,6 +42,16 @@ Host 插件在 DSH 启动时加载:**安装或更新后需要重启 DSH**。
42
42
  `tower_doctor` 会把未知模式报告为 `warn`(`case-mode`)。在大小写不敏感的检出上,
43
43
  `src/Api/**` 与 `src/api/**` 从此视为重叠,仅大小写不同的改动不再被 out-of-scope 门禁拒绝。
44
44
  存储的 scope 文本永远不会被改写:看板仍显示操作者输入的原样。
45
+ - **2.3.0 → 2.4.0(未发布)**:所有能力合一的 `tower-bundle` 组行已移除。`cordis.patch.yml`
46
+ 现在随包提供强制的 `tower` host 锚点(Host 插件与 worker preset 是它的内部 section),以及可单独
47
+ 开关的顶层行:`tower-skills`、`tower-batch`、`tower-import`、`tower-leases`、`tower-tests`、
48
+ `tower-hmr`(随包关闭)与 `preset-tower-reviewer`(受 `review.requireReview` 条件约束)。
49
+ `tools` 配置组与 `dev.hotReload` 已删除:仍带这些键的 profile 现在会作为未知键被拒绝
50
+ (`config-unknown-key`),在删除它们之前 host 不会挂载,因此不再存在静默无效的开关。请改为在插件页
51
+ 使用对应的组件行;`tower-hmr` 随包关闭,因此在为联动开发 profile 开启它之前,`tower_reload` 与
52
+ `/tower reload` 会报告为 “disabled by component tower-hmr”。`tower_doctor` 与 `tower_recover`
53
+ 在任何配置下都会注册,无需配置键。仅当 `review.requireReview` 为 false 时 reviewer 行才可关闭;
54
+ 该门禁开启时,规划与模式进入会以带解释的错误拒绝该组合。不需要迁移 state。
45
55
  - **2.0.4 → 2.1.0-beta.1**:不需要迁移 config;state 会按上述说明自动迁移(v1/v2 → v3)。
46
56
  这是发布到 `next` dist-tag 的**预发布**,
47
57
  `latest` 仍指向 2.0.4——请用 `dsh plugin --profile web add dsh-tower@next`(或精确版本号)安装。
@@ -70,7 +70,7 @@ OS 级隔离运行 host。
70
70
  - **测试发现是仓库代码。** `tests.admission` 默认 `off`,只有显式 `tower_test` 才会执行仓库
71
71
  `package.json` 的 `tower.testDiscovery` 命令;该命令以 DSH 的 OS 权限运行,不是沙箱。不可信仓库应
72
72
  设 `tests.allowPackageDiscovery:false`。
73
- - **HMR 重载。** 开启 `dev.hotReload` 时,`/tower reload`/`tower_reload` 会让 DSH 从磁盘重新导入
73
+ - **HMR 重载。** 开启 `tower-hmr` 组件行时,`/tower reload`/`tower_reload` 会让 DSH 从磁盘重新导入
74
74
  插件。只为你信任的检出配置 HMR 监视 root;重载会执行这些文件当前的代码。
75
75
  - **提示注入。** reviewer 会读取不受信任的分支内容(diff/评论)。只读 preset 限制了影响面,但模型侧
76
76
  没有绝对防护。
@@ -73,14 +73,14 @@ merge、worktree 与 spawn 策略。它使用与 profile 配置相同的 JSON
73
73
  | `spawn.requireLease` | `''` | worker spawn 前必须持有的可选租约名。 |
74
74
  | `send.maxPerMinute` | `120` | 每个仓库的 `tower_send` 每分钟速率限制(0 关闭);超出返回 `rate-limited`。 |
75
75
  | `send.interruptDefault` | `false`(随包 patch:`true`) | `tower_send.interrupt` 的默认值(投递前先中断运行中的回合)。 |
76
- | `tests.enabled` | `true` | worktree 的 `package.json` 配置了测试发现时运行它。 |
76
+ | `tests.enabled` | `true` | worktree 的 `package.json` 配置了测试发现时运行它。它只调整可选的 `tower-tests` 组件:该行关闭时既没有 `tower_test` 工具也无法记录回执,`gates.requireTests:true` 会被拒绝而不是静默失效。 |
77
77
  | `tests.admission` | `off` | `spawn` 在启动 worker 前运行发现(fail-closed,不启动子代理);`complete` 在 `tower_complete` 时运行;`off` 只在显式 `tower_test` 时运行(默认;不会自动执行仓库代码)。 |
78
78
  | `tests.timeoutMs` | `60000` | 每条发现命令的超时。 |
79
79
  | `tests.maxBytes` | `16777216`(16 MiB) | 每条命令捕获的 stdout 上限。 |
80
80
  | `tests.autoChecks` | `true` | 向完成报告附加自动 `tests` 检查。 |
81
81
  | `tests.allowPackageDiscovery` | `true` | 允许仓库控制的 `tower.testDiscovery` 命令(会执行 worktree 代码;见安全页)。 |
82
82
  | `gates.requireChecks` | `false` | 合并前要求至少一条 `tower_complete.checks` 证据(`no-check-evidence`)。 |
83
- | `gates.requireTests` | `false` | 要求针对当前 mission 分支 tip 的通过测试回执(`tests-missing`);与审查门禁独立。 |
83
+ | `gates.requireTests` | `false` | 要求针对当前 mission 分支 tip 的通过测试回执(`tests-missing`);与审查门禁独立。`tower-tests` 组件行关闭时,规划/进入模式会带解释拒绝该组合。 |
84
84
  | `gates.allowReviewExemption` | `false` | 在 `review.requireReview:true` 时,允许用 `reviewPolicy:"none"` + 非空理由跳过审查 blocker;默认故意关闭;全局审查关闭时无影响。 |
85
85
  | `gates.maxReportBytes` | `32768`(32 KiB) | `tower_complete.report` 的 UTF-8 字节硬上限。超出时以 `invalid-argument` 拒绝并给出可执行的 `nextAction`(把全文写进 mission worktree 的文件并引用路径),绝不截断。已存在的超限报告仍可读取。 |
86
86
  | `docs.board` | `true` | 变更后写入 `MISSIONS.md`。 |
@@ -88,16 +88,14 @@ merge、worktree 与 spawn 策略。它使用与 profile 配置相同的 JSON
88
88
  | `archive.enabled` | `true` | 在变更边界把 worktree 已移除的终态(`merged`/`abandoned`)任务移入 `<git-common-dir>/dsh-tower/archive/`。归档任务保留 tasks、reviews、findings 与完成报告;这是移动,不是删除。 |
89
89
  | `archive.afterDays` | `30` | 年龄触发:终态任务超过这么多天未更新,会在下次变更时归档(`0` 表示立即归档)。 |
90
90
  | `archive.maxMissions` | `100` | 数量触发:热状态中的终态任务超过此数时,从最旧的开始归档直到满足上限(`0` 表示归档所有符合条件的终态任务)。worktree 仍存在的任务永不归档。 |
91
- | `tools.exposeOperational` | `true` | 注册 batch/resource/import/legacy/recover/test/doctor 工具;`false` 可缩小固定工具 schema 上下文。 |
92
91
  | `leases.ttlMs` | `900000` | 默认咨询式租约寿命;过期不会自动释放。 |
93
- | `dev.hotReload` | `true` | 注册 `tower_reload`;关闭时 `/tower reload` 也被禁用。无 HMR 服务时调用返回 `reload-unavailable`。 |
94
- | `dev.reloadDelayMs` | `50` | 计划中的 reload 延迟,先让工具结果送达。 |
95
- | `dev.reloadRequiredIds` | 五个 Tower loader id | 作为 required 传给 `reconcileProfile` 的条目 id。 |
92
+ | `dev.reloadDelayMs` | `50` | 计划中的 reload 延迟,先让工具结果送达。属于可选的 `tower-hmr` 组件。 |
93
+ | `dev.reloadRequiredIds` | 三个 Tower loader id | `tower-hmr` 组件作为 required 传给 `reconcileProfile` 的条目 id。可选组件行刻意不在 required 中。 |
96
94
 
97
95
  ## 示例
98
96
 
99
97
  ```yaml
100
- - id: tower
98
+ - id: tower-host
101
99
  name: 'dsh-tower'
102
100
  config:
103
101
  mode:
@@ -112,10 +110,12 @@ merge、worktree 与 spawn 策略。它使用与 profile 配置相同的 JSON
112
110
  reviewerModel:
113
111
  provider: deepseek-account
114
112
  model: deepseek-flash
115
- dev:
116
- hotReload: true
117
113
  ```
118
114
 
115
+ 可选能力(`tower-skills`、`tower-batch`、`tower-import`、`tower-leases`、
116
+ `tower-tests`、`tower-hmr`、`preset-tower-reviewer`)在插件页切换,而不是用配置键。
117
+ 原先用于切换它们的键(`tools.expose*`、`dev.hotReload`)已在 2.4.0 移除,会作为未知键被拒绝。
118
+
119
119
  ## 查看实际生效的 schema
120
120
 
121
121
  插件声明 `Config` 后(本版本已声明),用 `cordis_inspect_query` 调用
@@ -4,9 +4,11 @@
4
4
 
5
5
  所有工具都接受 `repoRoot`(目标 Git 仓库内的绝对路径)并返回 JSON。
6
6
  本构建最多 29 个工具:下列 19 个核心仓库工具(含 `tower_interrupt`)、`tower_mode`、默认注册的
7
- `tower_control`(设 `mode.allowAgentControl:false` 可禁用)、`dev.hotReload` 开启时注册的
8
- `tower_reload`,以及 2.1 的验证/运维工具 `tower_doctor`、`tower_recover`、`tower_test`、`tower_batch`、
9
- `tower_resource`、`tower_import_legacy`、`tower_legacy_map`。
7
+ `tower_control`(设 `mode.allowAgentControl:false` 可禁用)、始终注册的 `tower_doctor` 与
8
+ `tower_recover`(#122),以及由组件行拥有的 `tower_reload`(`tower-hmr`)、`tower_test`
9
+ (`tower-tests`)、`tower_batch`(`tower-batch`)、`tower_resource`(`tower-leases`)、
10
+ `tower_import_legacy` / `tower_legacy_map`(`tower-import`)。关闭某个组件行只会移除它的工具;
11
+ `tower_status` 与 `tower_doctor` 会以 “disabled by component <id>” 报告。
10
12
 
11
13
  `tower_mission` 使用 `id`(别名 `missionId`);其他所有 mission 级工具使用 `missionId`
12
14
  (别名 `id`)。其他输入别名:`task_done`/`taskDone`、`task_drop`/`taskDrop`、
@@ -52,7 +54,7 @@ roster 角色由 `exec.agent` 与 roster 共同决定。mission 级工具(`tow
52
54
  | `tower_teardown` | `force?`、`exclude?`、`dry_run?`(别名 `dryRun`) | 移除符合条件的 merged/abandoned worktree 与分支;运行中的 agent 始终保留。 |
53
55
  | `tower_mode` | — | 报告模式、最近修改、被暂停的 goal、被拒绝的工具、store 路径、插件版本、HMR 可用性、workspace 锁持有者。 |
54
56
  | `tower_control` | `action`(`enter`/`exit`)、`reason` | 模型主动切换模式;默认注册,设 `mode.allowAgentControl:false` 可禁用;`reason` 必填。 |
55
- | `tower_reload` | `repoRoot?` | 仅开发用:请求 DSH HMR 对账 profile 并从磁盘重载 Host 插件。`dev.hotReload` 开启时注册;在工具结果返回后调度(默认 50 ms);没有 HMR 时以 `reload-unavailable` 失败。传入 `repoRoot` 时调用者必须是控制塔。 |
57
+ | `tower_reload` | `repoRoot?` | 仅开发用:请求 DSH HMR 对账 profile 并从磁盘重载 Host 插件。`tower-hmr` 组件行开启时注册(该行随包关闭);在工具结果返回后调度(默认 50 ms);没有 HMR 时以 `reload-unavailable` 失败。传入 `repoRoot` 时调用者必须是控制塔。 |
56
58
  | `tower_doctor` | —(需要 `repoRoot`) | 只读健康契约:git、state schema、config、preset/subagents/HMR、state 锁的年龄与心跳新鲜度、仓库级 git 锁持有者、workspace 锁、roster、worktree realpath/归属、测试配置、leases。返回 `{ok, checks[{id,status,detail}], stateLock, gitLock, environmentContract}`;`stateLock` 报告 `{held, pid, startedAt, at, alive, ageMs, heartbeatAgeMs, staleAfterMs, stale}`,`gitLock` 报告 `{held, pid, phase, heldMs}`(空闲时 `{held:false}`)并附带 `git-lock` 检查,无需读取文件即可诊断卡住的控制塔。从不写状态。 |
57
59
  | `tower_recover` | `action`(`status`/`clear-stale-lock`)、`confirm?`、`force?` | 恢复诊断与显式 stale state-lock 修复。`clear-stale-lock` 需要 `confirm:"CLEAR_STALE_LOCK"`,只把 PID 已死的锁改名为 `.recovered-<ts>` 备份。`force:true` 还能清理 PID 仍存活但心跳静默(PID 被复用)的锁:输出 `{pid, startedAt, ageMs, heartbeatAgeMs}`,记录仍只改名、绝不 unlink。不会重置状态或 worktree。 |
58
60
  | `tower_test` | `missionId`(别名 `id`) | 运行 worktree 的 `package.json` 中 `tower.testDiscovery` 配置的发现命令并记录回执;失败时 `ok:false`。自动准入检查请用 `tower_complete`。 |