svharness 0.14.13 → 0.14.17

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 (32) hide show
  1. package/README.md +148 -9
  2. package/assets/codechat-agent.ico +0 -0
  3. package/dist/adapters/codex.js +19 -0
  4. package/dist/adapters/index.js +2 -0
  5. package/dist/commands/doctor/utils.js +2 -0
  6. package/dist/commands/init.js +37 -129
  7. package/dist/commands/shell-integration.js +40 -3
  8. package/dist/commands/wiki.js +127 -0
  9. package/dist/config/index.js +2 -1
  10. package/dist/config/merge-options.js +19 -0
  11. package/dist/config/normalize.js +18 -0
  12. package/dist/core/state.js +39 -0
  13. package/dist/index.js +58 -10
  14. package/dist/lib/agent-launcher.js +14 -16
  15. package/dist/lib/codechat-runner-resolver.js +208 -0
  16. package/dist/lib/wiki/run-wiki-generation.js +161 -0
  17. package/dist/lib/win-registry.js +10 -0
  18. package/dist/utils/validate-args.js +1 -0
  19. package/dist/wiki/repowikiIndexer.js +19 -150
  20. package/dist/wiki/repowikiPrompts.js +296 -0
  21. package/dist/wiki/repowikiStructureNormalize.js +31 -1
  22. package/dist/wiki/wikiTasksWriter.js +59 -22
  23. package/docs/agent-launcher-design.md +127 -26
  24. package/docs/standalone-codechat-ps1.md +123 -0
  25. package/package.json +2 -1
  26. package/scripts/preuninstall.js +45 -5
  27. package/templates/_shared/build-rules/harness-build-rule-agent-agnostic.md +2 -2
  28. package/templates/_shared/build-rules/harness-build-rule-specs-schema.md +1 -1
  29. package/templates/_shared/build-skills/harness-build-skill-orchestrator.md +1 -1
  30. package/templates/_shared/build-skills/harness-build-skill-wiki-writer.md +15 -6
  31. package/templates/codechat/Start-CodeChat.ps1 +359 -0
  32. package/templates/svharness.config.example.yaml +7 -0
@@ -41,17 +41,16 @@
41
41
 
42
42
  ┌───────────────────────────▼─────────────────────────────────┐
43
43
  │ 核心层 src/lib/agent-launcher.ts │
44
- │ resolveWorkdir() → syncEnv() → preflight() → spawn()
44
+ │ resolveWorkdir() → syncEnv() → resolveRunner() → spawn()
45
45
  └───────────────────────────┬─────────────────────────────────┘
46
46
 
47
47
  ┌───────────────────────────▼─────────────────────────────────┐
48
- 平台层
49
- win32: ~/.codechat/cli_app/run.bat
50
- │ linux: ~/.codechat/cli_app/run.sh │
48
+ Runner 解析 src/lib/codechat-runner-resolver.ts
49
+ CODECHAT_CLI_RUNNER → standalone → IDE 插件扫描
51
50
  └───────────────────────────┬─────────────────────────────────┘
52
51
 
53
52
  ┌───────────────────────────▼─────────────────────────────────┐
54
- │ 外部依赖 CodeChat CLI
53
+ │ 外部依赖 CodeChat CLI(run.bat / run.sh)
55
54
  └─────────────────────────────────────────────────────────────┘
56
55
  ```
57
56
 
@@ -150,22 +149,95 @@ launch_codechat_cli ./my-app # 指定 workdir
150
149
 
151
150
  ---
152
151
 
153
- ## 6. 平台差异
152
+ ## 6. Runner 解析 `resolveCodechatRunner()`
154
153
 
155
- | 项 | Windows (`win32`) | Linux |
156
- |----|-------------------|-------|
157
- | Runner | `~/.codechat/cli_app/run.bat` | `~/.codechat/cli_app/run.sh` |
158
- | spawn | `shell: true` | `shell: false` |
159
- | 右键菜单 | 支持 | 不支持 |
160
- | postinstall | global install 自动 `shell install` | 跳过 |
154
+ 实现:`src/lib/codechat-runner-resolver.ts`
161
155
 
162
- macOS (`darwin`) 路径约定与 Linux 相同;若 runner 不存在则报错。
156
+ ### 6.1 优先级(高 低)
157
+
158
+ | 优先级 | 来源 | 说明 |
159
+ |--------|------|------|
160
+ | 1 | `CODECHAT_CLI_RUNNER` | 环境变量显式指向 `run.bat` / `run.sh` 绝对路径 |
161
+ | 2 | standalone | `~/.codechat/cli_app/run.bat`(Win)或 `run.sh`(Linux/macOS) |
162
+ | 3 | IDE 插件 | 扫描 Android Studio / IntelliJ IDEA 插件目录 |
163
+
164
+ 启动日志示例:
165
+
166
+ ```text
167
+ CodeChat CLI: C:\Users\...\AndroidStudio2024.2\plugins\CodeChat\cli\run.bat (ide-plugin: Android Studio 2024.2)
168
+ 启动 CodeChat Agent(workdir: D:\projects\my-app)
169
+ ```
170
+
171
+ ### 6.2 IDE 插件扫描路径
172
+
173
+ 不绑定具体 IDE 版本号,遍历版本化安装目录(如 `AndroidStudio2024.2`)。
174
+
175
+ | 平台 | 扫描根目录 | 目录前缀 |
176
+ |------|------------|----------|
177
+ | Windows | `%APPDATA%\Google\` | `AndroidStudio*` |
178
+ | Windows | `%APPDATA%\JetBrains\` | `IntelliJIdea*`、`IdeaIC*` |
179
+ | Linux | `~/.local/share/JetBrains/` | `IntelliJIdea*`、`IdeaIC*` |
180
+ | macOS | `~/Library/Application Support/Google/` | `AndroidStudio*` |
181
+ | macOS | `~/Library/Application Support/JetBrains/` | `IntelliJIdea*`、`IdeaIC*` |
182
+
183
+ 完整 runner 路径模式:
184
+
185
+ ```text
186
+ <root>/<Prefix><version>/plugins/CodeChat/cli/run.bat # Windows
187
+ <root>/<Prefix><version>/plugins/CodeChat/cli/run.sh # Linux/macOS
188
+ ```
189
+
190
+ ### 6.3 多候选选择规则
191
+
192
+ Android Studio 与 IntelliJ IDEA 同时安装 CodeChat 插件时:
193
+
194
+ 1. 从目录名解析版本号(`AndroidStudio2024.2` → `[2024, 2]`),**版本最高者优先**
195
+ 2. 版本相同则比较 runner 文件 `mtime`,取最新
196
+ 3. `label` 写入日志(如 `Android Studio 2024.2`)
197
+
198
+ ### 6.4 返回结构
199
+
200
+ ```typescript
201
+ interface ResolvedCodechatRunner {
202
+ runner: string; // 绝对路径
203
+ source: 'env' | 'standalone' | 'ide-plugin';
204
+ label?: string; // 如 "Android Studio 2024.2"
205
+ }
206
+ ```
207
+
208
+ ### 6.5 不变约束
209
+
210
+ - **`--env-file` 仍固定为 `~/.claude/.env`**(见 §5 env 同步策略);IDE 插件版 `run.bat` 与用户手动调用参数兼容(`--env-file` + `--cwd`)
211
+ - 右键 stub / `launch_codechat_cli` 间接受益,**无需**改 registry
212
+
213
+ ### 6.6 示例
214
+
215
+ ```powershell
216
+ # 自动解析(standalone 不存在,仅 IDE 插件)
217
+ # → C:\Users\<user>\AppData\Roaming\Google\AndroidStudio2024.2\plugins\CodeChat\cli\run.bat
218
+ svharness start-agent --work-dir D:\projects\my-app
219
+
220
+ # 显式覆盖
221
+ $env:CODECHAT_CLI_RUNNER = "$env:APPDATA\Google\AndroidStudio2024.2\plugins\CodeChat\cli\run.bat"
222
+ svharness start-agent --work-dir D:\projects\my-app
223
+ ```
163
224
 
164
225
  ---
165
226
 
166
- ## 7. Windows 右键集成
227
+ ## 7. 平台差异
228
+
229
+ | 项 | Windows (`win32`) | Linux | macOS (`darwin`) |
230
+ |----|-------------------|-------|------------------|
231
+ | Runner | 见 §6 Runner 解析;默认 standalone,缺失时 IDE 插件回退 | 同左 | 同左 |
232
+ | spawn | `shell: true` | `shell: false` | `shell: false` |
233
+ | 右键菜单 | 支持 | 不支持 | 不支持 |
234
+ | postinstall | global install 自动 `shell install` | 跳过 | 跳过 |
167
235
 
168
- ### 7.1 为何需要 stub
236
+ ---
237
+
238
+ ## 8. Windows 右键集成
239
+
240
+ ### 8.1 为何需要 stub
169
241
 
170
242
  资源管理器触发的命令 **不保证** 含 `%AppData%\npm` PATH。因此 registry 指向固定路径:
171
243
 
@@ -175,7 +247,7 @@ macOS (`darwin`) 路径约定与 Linux 相同;若 runner 不存在则报错。
175
247
 
176
248
  stub 接收 Explorer 传入的目录参数,`cd` 后调用 **绝对路径** 的 `bin/launch-codechat-cli.js`。
177
249
 
178
- ### 7.3 终端与编码(右键 vs 手动 PowerShell)
250
+ ### 8.3 终端与编码(右键 vs 手动 PowerShell)
179
251
 
180
252
  | 启动方式 | 典型终端 | 现象 |
181
253
  |----------|----------|------|
@@ -191,7 +263,7 @@ stub 接收 Explorer 传入的目录参数,`cd` 后调用 **绝对路径** 的
191
263
 
192
264
  重新注册:`svharness shell install`
193
265
 
194
- ### 7.4 注册表结构
266
+ ### 8.4 注册表结构
195
267
 
196
268
  | 位置 | 键 |
197
269
  |------|-----|
@@ -200,6 +272,14 @@ stub 接收 Explorer 传入的目录参数,`cd` 后调用 **绝对路径** 的
200
272
 
201
273
  菜单标题:`在此启动 CodeChat CLI`
202
274
 
275
+ Icon(两处菜单键均设置):
276
+
277
+ ```text
278
+ C:\Users\<user>\AppData\Local\svharness\bin\codechat-agent.ico,0
279
+ ```
280
+
281
+ 源文件:`assets/codechat-agent.ico`(圆角边框 + `>_` 终端提示符;可用 `scripts/generate-shell-icon.ps1` 重新生成)。
282
+
203
283
  Command(Background,已安装 WT 时):
204
284
 
205
285
  ```text
@@ -230,7 +310,7 @@ stub 脚本须为 **UTF-8 BOM + ASCII 正文**(Windows PowerShell 5.1 对无 B
230
310
 
231
311
  ---
232
312
 
233
- ## 8. 生命周期钩子
313
+ ## 9. 生命周期钩子
234
314
 
235
315
  ### postinstall
236
316
 
@@ -246,11 +326,12 @@ stub 脚本须为 **UTF-8 BOM + ASCII 正文**(Windows PowerShell 5.1 对无 B
246
326
 
247
327
  ---
248
328
 
249
- ## 9. 错误与用户提示
329
+ ## 10. 错误与用户提示
250
330
 
251
331
  | 场景 | 消息要点 |
252
332
  |------|----------|
253
- | runner 缺失 | 平台对应 `run.bat` / `run.sh` 路径 |
333
+ | runner 缺失 | 列出三级尝试路径(env / standalone / IDE 扫描根目录);提示设置 `CODECHAT_CLI_RUNNER` |
334
+ | `CODECHAT_CLI_RUNNER` 不可访问 | 环境变量路径 + 「不可访问」 |
254
335
  | workdir 不存在 | 绝对路径 + 「工作目录不存在」 |
255
336
  | workdir 冲突 | `--work-dir` 与位置参数不一致 |
256
337
  | env 缺失 | 项目级或用户级 `.claude/.env` 创建指引 |
@@ -259,7 +340,7 @@ stub 脚本须为 **UTF-8 BOM + ASCII 正文**(Windows PowerShell 5.1 对无 B
259
340
 
260
341
  ---
261
342
 
262
- ## 10. 安全说明
343
+ ## 11. 安全说明
263
344
 
264
345
  默认向 CodeChat CLI 传递 **`--dangerously-skip-permissions`**,以便 harness 构建流程(S10–S90)在自动化场景下少打断。
265
346
 
@@ -271,18 +352,19 @@ svharness start-agent --work-dir . --no-skip-permissions
271
352
 
272
353
  ---
273
354
 
274
- ## 11. 扩展点
355
+ ## 12. 扩展点
275
356
 
276
357
  | 扩展 | 状态 |
277
358
  |------|------|
278
359
  | `start-agent cursor` / `claude-code` | 预留 agent 配置表 |
279
- | `CODECHAT_CLI_RUNNER` 环境变量 | 未实现 |
360
+ | `CODECHAT_CLI_RUNNER` 环境变量 | **已实现**(最高优先级 override) |
361
+ | CLI flag `--runner` | 未实现(环境变量足够;后续可按需扩展) |
280
362
  | `svharness.config.yaml` → `startAgent` 节 | 未实现 |
281
363
  | Linux 文件管理器 actions (Nautilus) | 未实现 |
282
364
 
283
365
  ---
284
366
 
285
- ## 12. 故障排查 FAQ
367
+ ## 13. 故障排查 FAQ
286
368
 
287
369
  **Q: `launch_codechat_cli` 不是内部或外部命令**
288
370
 
@@ -296,7 +378,14 @@ svharness start-agent --work-dir . --no-skip-permissions
296
378
 
297
379
  **Q: 未找到 run.bat / run.sh**
298
380
 
299
- 安装 CodeChat CLI 到 `~/.codechat/cli_app/`。
381
+ 1. **独立安装**:CodeChat CLI 到 `~/.codechat/cli_app/`
382
+ 2. **IDE 插件**:在 Android Studio 或 IntelliJ IDEA 中安装 CodeChat 插件(无需指定版本号,`start-agent` 会自动扫描 `%APPDATA%\Google\AndroidStudio*` 等路径)
383
+ 3. **手动指定**:
384
+
385
+ ```powershell
386
+ $env:CODECHAT_CLI_RUNNER = "$env:APPDATA\Google\AndroidStudio2024.2\plugins\CodeChat\cli\run.bat"
387
+ svharness start-agent --work-dir D:\projects\my-app
388
+ ```
300
389
 
301
390
  **Q: env 文件缺失**
302
391
 
@@ -314,13 +403,25 @@ SVHARNESS_SKIP_SHELL=1 npm install -g svharness
314
403
 
315
404
  ---
316
405
 
317
- ## 13. 源码索引
406
+ ## 14. 源码索引
318
407
 
319
408
  | 模块 | 路径 |
320
409
  |------|------|
321
410
  | 启动核心 | `src/lib/agent-launcher.ts` |
411
+ | Runner 解析 | `src/lib/codechat-runner-resolver.ts` |
322
412
  | start-agent 命令 | `src/commands/start-agent.ts` |
323
413
  | 右键集成 | `src/commands/shell-integration.ts` |
324
414
  | 注册表工具 | `src/lib/win-registry.ts` |
325
415
  | 全局 bin | `bin/launch-codechat-cli.js` |
326
416
  | postinstall | `scripts/postinstall.js` |
417
+
418
+ ---
419
+
420
+ ## 15. 独立 PowerShell 启动器(附录)
421
+
422
+ 无需 Node / svharness 时,可分发 [`templates/codechat/Start-CodeChat.ps1`](../templates/codechat/Start-CodeChat.ps1):
423
+
424
+ - env / runner 行为与 §5、§6 对齐(PowerShell 自实现)
425
+ - 右键注册表键 **`CodeChatStandaloneAgent`**,与 §8 svharness 键 **`SvharnessLaunchCodeChatAgent`** 隔离,可并存
426
+
427
+ 完整用法见 [`standalone-codechat-ps1.md`](standalone-codechat-ps1.md)。
@@ -0,0 +1,123 @@
1
+ # 独立 CodeChat PowerShell 启动器
2
+
3
+ > 无需安装 Node.js / svharness,拷贝脚本即可启动 CodeChat CLI。
4
+
5
+ 脚本路径:[`templates/codechat/Start-CodeChat.ps1`](../templates/codechat/Start-CodeChat.ps1)
6
+
7
+ ## 适用场景
8
+
9
+ - 团队未使用 svharness,但项目根已有 `.claude/.env`
10
+ - CodeChat 仅通过 **Android Studio / IntelliJ IDEA 插件**安装(无 `~/.codechat/cli_app/run.bat`)
11
+ - 希望在资源管理器右键启动,且**不与** `svharness shell install` 的全局菜单冲突
12
+
13
+ ## 快速开始
14
+
15
+ ```powershell
16
+ # 1. 拷贝到项目(推荐 .claude\)
17
+ Copy-Item .\templates\codechat\Start-CodeChat.ps1 .\.claude\
18
+
19
+ # 2. 在项目根启动
20
+ cd D:\projects\my-app
21
+ .\.claude\Start-CodeChat.ps1
22
+
23
+ # 3. 可选:注册 Explorer 右键(独立菜单项)
24
+ .\.claude\Start-CodeChat.ps1 -Action InstallMenu
25
+
26
+ # 4. 状态 / 卸载右键
27
+ .\.claude\Start-CodeChat.ps1 -Action Status
28
+ .\.claude\Start-CodeChat.ps1 -Action UninstallMenu
29
+ ```
30
+
31
+ ## 子命令 `-Action`
32
+
33
+ | Action | 说明 |
34
+ |--------|------|
35
+ | `Start`(默认) | 同步 env → 解析 `run.bat` → 启动 CodeChat |
36
+ | `InstallMenu` | 复制脚本到 `%LOCALAPPDATA%\codechat-standalone\` 并注册 HKCU 右键 |
37
+ | `UninstallMenu` | 删除独立注册表键与 `%LOCALAPPDATA%\codechat-standalone\` |
38
+ | `Status` | 打印 runner / env / 菜单注册状态 |
39
+
40
+ ## Start 参数
41
+
42
+ | 参数 | 说明 |
43
+ |------|------|
44
+ | `-WorkDir` | 项目根目录,默认当前目录 |
45
+ | `-NoSyncEnv` | 不同步项目 `.claude/.env`(仅使用已有 `~/.claude/.env`) |
46
+ | `-NoSkipPermissions` | 不传 `--dangerously-skip-permissions` |
47
+
48
+ ## env 策略(与 svharness 一致)
49
+
50
+ | 步骤 | 行为 |
51
+ |------|------|
52
+ | 项目有 `.claude/.env` 且未 `-NoSyncEnv` | **只读**项目文件,复制到 `~/.claude/.env`(覆盖用户 env) |
53
+ | 项目无 env,用户 env 存在 | 使用 `~/.claude/.env` |
54
+ | 均无 | 报错,提示创建项目 `.claude/.env` |
55
+
56
+ 启动时 `--env-file` 始终指向 **`~/.claude/.env`**,不修改项目内 env 文件。
57
+
58
+ ## Runner 解析优先级
59
+
60
+ | 优先级 | 来源 |
61
+ |--------|------|
62
+ | 1 | 环境变量 `CODECHAT_CLI_RUNNER` |
63
+ | 2 | `~/.codechat/cli_app/run.bat` |
64
+ | 3 | IDE 插件扫描(版本最高 + 文件最新): |
65
+ | | `%APPDATA%\Google\AndroidStudio*\plugins\CodeChat\cli\run.bat` |
66
+ | | `%APPDATA%\JetBrains\IntelliJIdea*\plugins\CodeChat\cli\run.bat` |
67
+ | | `%APPDATA%\JetBrains\IdeaIC*\plugins\CodeChat\cli\run.bat` |
68
+
69
+ 手动指定 runner:
70
+
71
+ ```powershell
72
+ $env:CODECHAT_CLI_RUNNER = "$env:APPDATA\Google\AndroidStudio2024.2\plugins\CodeChat\cli\run.bat"
73
+ .\.claude\Start-CodeChat.ps1
74
+ ```
75
+
76
+ ## 与 svharness 对比
77
+
78
+ | 项 | `svharness start-agent` | `Start-CodeChat.ps1` |
79
+ |----|-------------------------|----------------------|
80
+ | 依赖 | Node.js + npm 全局包 | 仅 PowerShell |
81
+ | env 同步 | 项目 → `~/.claude/.env` | 相同 |
82
+ | runner 扫描 | `codechat-runner-resolver.ts` | PS1 内等价逻辑 |
83
+ | 右键注册表键 | `SvharnessLaunchCodeChatAgent` | `CodeChatStandaloneAgent` |
84
+ | 菜单标题 | 在此启动 CodeChat CLI | 在此启动 CodeChat(项目 env) |
85
+ | stub 目录 | `%LOCALAPPDATA%\svharness\bin\` | `%LOCALAPPDATA%\codechat-standalone\` |
86
+
87
+ 两者**可同时安装**:Explorer 中会出现两条菜单(若都注册了右键)。
88
+
89
+ 卸载独立菜单 **不会** 影响 `svharness shell` 注册的菜单。
90
+
91
+ ## 右键安装细节
92
+
93
+ - 脚本复制到:`%LOCALAPPDATA%\codechat-standalone\Start-CodeChat.ps1`
94
+ - 若同目录或上级存在 `codechat-agent.ico` / `assets/codechat-agent.ico`,会一并复制为菜单图标
95
+ - 已安装 Windows Terminal 时,注册表直接调用 `wt.exe`(单窗口,与 svharness 右键行为一致)
96
+
97
+ ## 故障排查
98
+
99
+ **ExecutionPolicy 阻止脚本**
100
+
101
+ ```powershell
102
+ powershell -ExecutionPolicy Bypass -File .\.claude\Start-CodeChat.ps1
103
+ ```
104
+
105
+ **找不到 run.bat**
106
+
107
+ - 确认 Android Studio / IDEA 已安装 CodeChat 插件
108
+ - 或设置 `CODECHAT_CLI_RUNNER` 指向插件内 `run.bat`
109
+
110
+ **No env file**
111
+
112
+ - 在项目根创建 `.claude\.env`
113
+
114
+ **与 svharness 菜单混淆**
115
+
116
+ - 独立菜单标题含「项目 env」
117
+ - `Start-CodeChat.ps1 -Action Status` 仅报告 `CodeChatStandaloneAgent` 状态
118
+ - `svharness shell status` 报告 svharness 菜单状态
119
+
120
+ ## 相关文档
121
+
122
+ - Agent Launcher 详细设计:[`agent-launcher-design.md`](agent-launcher-design.md)
123
+ - svharness CLI:[`README.md`](../README.md) 中 `start-agent` 章节
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svharness",
3
- "version": "0.14.13",
3
+ "version": "0.14.17",
4
4
  "description": "CLI scaffolder for SDD-Driven Agent-Agnostic Coding Framework (harness)",
5
5
  "bin": {
6
6
  "svharness": "./bin/cli.js",
@@ -11,6 +11,7 @@
11
11
  "dist/",
12
12
  "bin/",
13
13
  "docs/",
14
+ "assets/",
14
15
  "scripts/postinstall.js",
15
16
  "scripts/preuninstall.js",
16
17
  "templates/",
@@ -7,11 +7,51 @@ if (process.env.npm_config_global !== 'true') {
7
7
  process.exit(0);
8
8
  }
9
9
 
10
- (async () => {
10
+ /**
11
+ * IMPORTANT:
12
+ * - Keep this script synchronous and self-contained.
13
+ * - Do NOT require compiled JS from dist/, because npm uninstall may remove files
14
+ * before this hook finishes (best-effort but should be robust).
15
+ */
16
+
17
+ const { execFileSync } = require('child_process');
18
+ const fs = require('fs');
19
+ const os = require('os');
20
+ const path = require('path');
21
+
22
+ const REG = 'reg.exe';
23
+ const STUB_DIR = path.join(
24
+ process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'),
25
+ 'svharness',
26
+ );
27
+
28
+ function regDeleteKey(key) {
29
+ try {
30
+ execFileSync(REG, ['delete', key, '/f'], { stdio: 'ignore', windowsHide: true });
31
+ } catch {
32
+ // best effort
33
+ }
34
+ }
35
+
36
+ function removeDirRecursive(dir) {
11
37
  try {
12
- const { runShellUninstall } = require('../dist/commands/shell-integration');
13
- await runShellUninstall({ silent: true });
38
+ if (fs.existsSync(dir)) {
39
+ fs.rmSync(dir, { recursive: true, force: true });
40
+ }
14
41
  } catch {
15
- // best effort on uninstall
42
+ // best effort
16
43
  }
17
- })();
44
+ }
45
+
46
+ // Current keys (since 2026-05)
47
+ regDeleteKey(
48
+ 'HKCU\\Software\\Classes\\Directory\\Background\\shell\\SvharnessLaunchCodeChatAgent',
49
+ );
50
+ regDeleteKey('HKCU\\Software\\Classes\\Directory\\shell\\SvharnessLaunchCodeChatAgent');
51
+
52
+ // Legacy keys (older releases / experiments)
53
+ regDeleteKey('HKCU\\Software\\Classes\\Directory\\Background\\shell\\svharness_codechat');
54
+ regDeleteKey('HKCU\\Software\\Classes\\Directory\\shell\\svharness_codechat');
55
+
56
+ // Stub files + icon under %LOCALAPPDATA%\svharness
57
+ removeDirRecursive(STUB_DIR);
@@ -5,9 +5,9 @@ harness 是 SDD-Driven Agent-Agnostic Coding Framework。spec 层与 task 层产
5
5
  ## 绝对禁止
6
6
 
7
7
  - 在 `specs/**`、`tasks/**`、`agent-env/rules/**`、`agent-env/memory/categories/**` 的内容里出现以下任一:
8
- - 具体 agent 名(如 `qoder`、`codechat`、`cursor`、`claude-code`、`opencode`、`claude`、`chatgpt`、`gpt-4` 等)。
8
+ - 具体 agent 名(如 `qoder`、`codechat`、`cursor`、`claude-code`、`opencode`、`codex`、`claude`、`chatgpt`、`gpt-4` 等)。
9
9
  - 某一 agent 的私有指令语法(如特定 slash command、特定 frontmatter 字段)。
10
- - 某一 agent 的私有目录路径(`.qoder/`、`.codechat/`、`.cursor/`、`.claude/`、`.opencode/` 等)。
10
+ - 某一 agent 的私有目录路径(`.qoder/`、`.codechat/`、`.cursor/`、`.claude/`、`.opencode/`、`.agents/` 等)。
11
11
 
12
12
  ## 允许出现 agent 标识的位置(白名单)
13
13
 
@@ -18,7 +18,7 @@ specs/
18
18
 
19
19
  - 写入任一 `specs/<domain>/*.yaml` 前,必须先读 `specs/<domain>/schema.json`。
20
20
  - 字段增减/重命名时,`schema.json` 与对应 yaml 必须**同一提交**更新,不得分两步。
21
- - yaml 中不得出现任何具体 agent 名(qoder/codechat/cursor/claude-code/opencode 等)— 违反 agent-agnostic 铁律。
21
+ - yaml 中不得出现任何具体 agent 名(qoder/codechat/cursor/claude-code/opencode/codex 等)— 违反 agent-agnostic 铁律。
22
22
 
23
23
  ## requirements 追溯字段要求(S40/S50 配套)
24
24
 
@@ -112,7 +112,7 @@ description: >
112
112
 
113
113
  执行任何阶段前,先加载并严格遵循以下规则(文件位于当前 agent 的 rules 目录,
114
114
  如 `.qoder/rules/`、`.codechat/rules/`、`.cursor/rules/harness-build/`、
115
- `.claude/rules/`、`.opencode/rules/`、`.harness/rules/`,具体扩展名随 agent 可能为 `.md` 或 `.mdc`):
115
+ `.claude/rules/`、`.opencode/rules/`、`.agents/rules/`、`.harness/rules/`,具体扩展名随 agent 可能为 `.md` 或 `.mdc`):
116
116
 
117
117
  - `harness-build-rule-orchestrator-flow` — 构建阶段准入/退出红线,任何调度决策都必须匹配。
118
118
  - `harness-build-rule-convert-check` — S30_convert_docs 阶段须检查 `requirements/raw/` 与 `references/raw/`,确保非 md 原始文档已转为 Markdown 方可推进。
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: harness-build-skill-wiki-writer
3
3
  description: >
4
- 逐页撰写 baseline wiki 正文。读取 state 中 `tasks_file` 指向的任务清单与 structure.xml,
4
+ 逐页撰写 baseline wiki 正文(面向编码 Agent 的知识页)。读取 state 中 `tasks_file` 指向的任务清单与 structure.xml,
5
5
  基于 baseline/code/ 下的源码快照产出每一页 Markdown。当用户说"生成 baseline wiki 正文"、
6
6
  "按 TASKS.md 逐页生成 baseline wiki"、"继续写 wiki 下一页",或由 harness-build-skill-orchestrator
7
7
  在阶段 S10_wiki 委派时触发。
@@ -10,7 +10,7 @@ description: >
10
10
  # harness-build-skill-wiki-writer(baseline wiki 正文撰写)
11
11
 
12
12
  你只做一件事:**按 `__HARNESS_ROOT__.harness-build-state.yaml` 中 `S10_wiki.tasks_file` 指向的任务清单,
13
- 一页一页地,基于 `__HARNESS_ROOT__baseline/code/` 下的真实源码,写成 Markdown**。
13
+ 一页一页地,基于 `__HARNESS_ROOT__baseline/code/` 下的真实源码,写成面向编码 Agent 的 Markdown 知识页**。
14
14
  references intake、agent-env 合并、skills/tasks 索引不是你的职责(分别由 harness-build-skill-references-intake、harness-build-skill-agent-env-merge、harness-build-skill-knowledge-builder 负责)。
15
15
 
16
16
  ## 输入
@@ -33,17 +33,26 @@ references intake、agent-env 合并、skills/tasks 索引不是你的职责(
33
33
  5. 写完后最小补丁式修改 `TASKS.md`,把该任务的 `[ ]` 改为 `[x]`(不得重排任务顺序、不得删除其他行)。
34
34
  6. 默认单步询问是否继续下一页。如果用户说"批量"、"全部继续"、"run through",则连续处理至清单尾。
35
35
 
36
- ## 撰写规则(强制,与 --generate-wiki 的产出口径必须一致)
36
+ ## 撰写规则(强制,与 build `--generate-wiki` Agent 向产出口径必须一致)
37
37
 
38
38
  - **H1** 必须与 task `Title` 完全一致。
39
- - **简介段** 后若后续有 2 个及以上的 `##` 章节,插入锚点式 TOC。
40
- - **Mermaid** 使用 `graph TD` 或 `sequenceDiagram`,不使用 classDef / style / 颜色。
39
+ - **H1 下方** 立即一行:`Sources: <repo-relative>/path:start-end, ...`
40
+ - **固定章节顺序**(不得省略;空则写「见关键路径」或「暂无」):
41
+ 1. `## 阅读时机` — 1–3 条 bullet:编码 Agent 何时应读本文
42
+ 2. `## 关键路径` — 表格:用途 | 路径 | 符号/类
43
+ 3. `## 扩展与修改入口` — 如何新增/修改类似功能
44
+ 4. `## 数据流 / 调用链` — 短文字;**仅**在非显然链路时用 `graph TD` 或 `sequenceDiagram`
45
+ 5. `## 约定与禁区` — 必须遵守与禁止事项
46
+ 6. `## 关联` — 相关 wiki 页或模块(若可推断)
47
+ - **禁止** 简介段 + 锚点 TOC(Agent 向页面不使用人类教程式 TOC)。
48
+ - **Mermaid** 可选;不使用 classDef / style / 颜色。
41
49
  - **引用源码** 必须指向 `__HARNESS_ROOT__baseline/code/`。允许两种书写方式(可混用):
42
50
  - 行内链接:`[Foo.java:10-30](../../baseline/code/<repo-relative>/Foo.java#L10-L30)`
43
51
  - Sources 行:`Sources: <repo-relative>/Foo.java:10-30, <repo-relative>/Bar.kt:5-8`
44
52
  `<repo-relative>` 是**相对 `__HARNESS_ROOT__baseline/code/` 的路径**,既不是仓库原始绝对路径,
45
53
  也不是 wiki md 文件的相对路径。行号采用 `start-end`(闭区间)。
46
- - 禁止粘贴大段代码:单个 code block ≤ 40 行;必要时用省略号 `// ...` 裁剪。
54
+ - 禁止粘贴大段代码:单个 code block ≤ 40 行;必要时用省略号 `// ...` 裁剪;优先接口/签名片段。
55
+ - 单段 prose 不超过 5 行(除代码块外);以表格与 bullet 为主。
47
56
  - 所有中文段落使用中文标点;字段名、类名、路径保留英文不译。
48
57
 
49
58
  ## 产出