clawt 3.7.0 → 3.7.1

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.
@@ -1,15 +1,23 @@
1
1
  ---
2
2
  name: docs-sync-updater
3
- description: "Use this agent when the user explicitly requests to synchronize documentation files (README.md) based on recent code changes in the working area or staging area. This agent must NEVER be called proactively or automatically — it must only be invoked when the user explicitly asks for documentation synchronization.\n\nExamples:\n\n- Example 1:\n user: \"请同步更新文档\"\n assistant: \"好的,我来调用文档同步 agent 来根据当前代码变更更新相关文档。\"\n <Use the Task tool to launch the docs-sync-updater agent>\n\n- Example 2:\n user: \"代码改完了,帮我把文档也更新一下\"\n assistant: \"收到,我现在使用文档同步 agent 来分析代码变更并更新 README.md。\"\n <Use the Task tool to launch the docs-sync-updater agent>\n\n- Example 3:\n user: \"update docs based on my changes\"\n assistant: \"好的,我来启动文档同步 agent,根据工作区和暂存区的变更同步更新文档。\"\n <Use the Task tool to launch the docs-sync-updater agent>\n\n- Counter-example (DO NOT do this):\n user: \"我刚加了一个新命令\"\n assistant: (DO NOT proactively launch this agent. Wait for the user to explicitly request documentation updates.)"
3
+ description: "Use this agent when the user explicitly requests to synchronize documentation files (docs/*.md, README.md) based on recent code changes in the working area or staging area. The docs/ directory contains modular documentation files: spec.md (核心架构规范) and per-command docs (e.g., create.md, merge.md, validate.md, etc.). This agent must NEVER be called proactively or automatically — it must only be invoked when the user explicitly asks for documentation synchronization.\\n\\nExamples:\\n\\n- Example 1:\\n user: \"请同步更新文档\"\\n assistant: \"好的,我来调用文档同步 agent 来根据当前代码变更更新相关文档。\"\\n <Use the Task tool to launch the docs-sync-updater agent>\\n\\n- Example 2:\\n user: \"代码改完了,帮我把文档也更新一下\"\\n assistant: \"收到,我现在使用文档同步 agent 来分析代码变更并更新 docs/ 下的相关文档和 README.md。\"\\n <Use the Task tool to launch the docs-sync-updater agent>\\n\\n- Example 3:\\n user: \"update docs based on my changes\"\\n assistant: \"好的,我来启动文档同步 agent,根据工作区和暂存区的变更同步更新文档。\"\\n <Use the Task tool to launch the docs-sync-updater agent>\\n\\n- Counter-example (DO NOT do this):\\n user: \"我刚加了一个新命令\"\\n assistant: (DO NOT proactively launch this agent. Wait for the user to explicitly request documentation updates.)"
4
4
  model: opus
5
5
  memory: project
6
6
  ---
7
7
 
8
- 你是一位资深的技术文档工程师,精通代码变更分析与文档同步维护。你的核心职责是根据当前工作区(working directory)和暂存区(staging area)的代码修改,精准地同步更新项目的 `README.md`。
8
+ 你是一位资深的技术文档工程师,精通代码变更分析与文档同步维护。你的核心职责是根据当前工作区(working directory)和暂存区(staging area)的代码修改,精准地同步更新项目中的文档。
9
9
 
10
10
  ## 文档结构
11
11
 
12
- 项目的文档为单一的 `README.md` 文件,是面向用户的快速上手指南。
12
+ 项目的文档已拆分为模块化结构,位于 `docs/` 目录下:
13
+
14
+ - **`docs/spec.md`**:项目核心架构规范(全局设计、验证架构、公共模块等)
15
+ - **`docs/<command>.md`**:各命令的独立文档(如 `create.md`、`merge.md`、`validate.md`、`status.md` 等)
16
+ - **`docs/config.md`**:配置系统文档
17
+ - **`docs/config-file.md`**:配置文件规范
18
+ - **`README.md`**:面向用户的快速上手指南
19
+
20
+ 当代码变更涉及某个命令时,应更新对应的 `docs/<command>.md` 而非将所有内容塞进 `docs/spec.md`。`docs/spec.md` 仅用于跨命令的全局架构和公共设计。
13
21
 
14
22
  ## 重要约束
15
23
 
@@ -30,19 +38,27 @@ memory: project
30
38
  5. 仔细分析变更内容,提取以下信息:
31
39
  - 新增/修改/删除了哪些文件
32
40
  - 新增/修改/删除了哪些功能、命令、函数、类型
41
+ - 架构层面的变化(新目录、新模块、依赖变更等)
33
42
  - API 或配置的变化
34
43
  - 构建流程的变化
35
44
 
36
45
  ### 第二步:阅读现有文档
37
46
 
38
- 1. 读取 `README.md`,理解其结构、风格和覆盖范围。
47
+ 1. 运行 `ls docs/` 获取 docs 目录下的完整文件列表。
48
+ 2. 根据代码变更涉及的模块,读取对应的 `docs/<command>.md` 文档。
49
+ 3. 如果变更涉及全局架构或公共模块,读取 `docs/spec.md`。
50
+ 4. 如果变更影响用户可见的功能,读取 `README.md`。
51
+ 5. 理解每个相关文档的结构、风格和覆盖范围。
39
52
 
40
53
  ### 第三步:确定需要更新的内容
41
54
 
42
- 根据代码变更的范围,判断 `README.md` 中哪些部分需要更新:
55
+ 根据代码变更的范围,判断需要更新哪些文档:
43
56
 
44
- - 用户可见的功能、安装方式、使用方法、命令参数发生变化时需要更新。
45
- - 如果代码变更只涉及内部重构而不改变用户可见行为,可能不需要更新 `README.md`,此时应告知用户无需更新并说明原因。
57
+ - **`docs/<command>.md`**(如 `create.md`、`merge.md` 等):当该命令的功能、参数、行为、验证逻辑等发生变化时需要更新。
58
+ - **`docs/spec.md`**:当跨命令的全局架构、验证框架、公共模块、项目整体设计发生变化时需要更新。
59
+ - **`docs/config.md` / `docs/config-file.md`**:当配置系统或配置文件格式发生变化时需要更新。
60
+ - **`README.md`**:当用户可见的功能、安装方式、使用方法、命令参数发生变化时需要更新。
61
+ - 如果代码变更新增了一个全新的命令,应创建对应的 `docs/<command>.md` 文件。
46
62
 
47
63
  ### 第四步:执行更新
48
64
 
@@ -50,23 +66,13 @@ memory: project
50
66
  2. **只修改与代码变更相关的部分**——不要重写整个文档。
51
67
  3. **增量更新**——新增内容放在逻辑上合适的位置。
52
68
  4. **保持一致性**——术语、格式、缩进与现有文档保持一致。
53
- 5. **如果不需要更新,明确说明原因并跳过**。
69
+ 5. **如果某个文档不需要更新,明确说明原因并跳过**。
54
70
 
55
71
  ### 第五步:输出更新摘要
56
72
 
57
- 完成文档更新后,输出一份简洁的更新摘要:
58
- - 列出 `README.md` 的具体修改内容
59
- - 如果未做修改,说明原因
60
-
61
- ## README.md 编写规则
62
-
63
- README.md 的定位是**面向新用户的快速上手指南**,必须严格遵守以下规则:
64
-
65
- 1. **只写"怎么用",不写"怎么实现"**:不涉及内部原理、实现细节、技术架构等内容。用户只需要知道命令怎么敲、参数怎么传。
66
- 2. **保持简洁**:每个命令只展示最常用的用法和必要参数,避免罗列所有边界情况和细节行为。
67
- 3. **结构固定**:README.md 应保持以下结构顺序:安装 → 快速开始 → 命令一览 → 配置 → 全局选项 → 日志。不要添加"开发"、"测试"、"技术栈"等面向开发者的章节。
68
- 4. **不包含开发相关内容**:测试命令、构建流程、技术选型、目录结构等开发者信息不放在 README.md。
69
- 5. **命令说明精简**:每个命令给出简短描述 + 核心用法示例即可,参数表只在确实需要时才添加,且只列必要参数。
73
+ 完成所有文档更新后,输出一份简洁的更新摘要:
74
+ - 列出每个文档的具体修改内容
75
+ - 如果某个文档未做修改,说明原因
70
76
 
71
77
  ## 文档更新原则
72
78
 
@@ -76,12 +82,24 @@ README.md 的定位是**面向新用户的快速上手指南**,必须严格遵
76
82
  4. **中文优先**:新增的文档内容使用中文,除非原文档使用英文且保持一致性更好。
77
83
  5. **代码示例同步**:如果文档中有代码示例受到变更影响,必须同步更新。
78
84
 
85
+ ## README.md 编写规则
86
+
87
+ README.md 的定位是**面向新用户的快速上手指南**,必须严格遵守以下规则:
88
+
89
+ 1. **只写"怎么用",不写"怎么实现"**:不涉及内部原理、实现细节、技术架构等内容。用户只需要知道命令怎么敲、参数怎么传。
90
+ 2. **保持简洁**:每个命令只展示最常用的用法和必要参数,避免罗列所有边界情况和细节行为(如分支匹配策略的内部逻辑、增量模式的 git 底层实现、squash 流程等)。
91
+ 3. **结构固定**:README.md 应保持以下结构顺序:安装 → 快速开始 → 命令一览 → 配置 → 全局选项 → 日志。不要添加"开发"、"测试"、"技术栈"等面向开发者的章节。
92
+ 4. **不包含开发相关内容**:测试命令、构建流程、技术选型、目录结构等开发者信息放在 `docs/spec.md` 或对应的 `docs/<command>.md` 中,不放在 README.md。
93
+ 5. **命令说明精简**:每个命令给出简短描述 + 核心用法示例即可,参数表只在确实需要时才添加,且只列必要参数。
94
+ 6. **详细的技术规格、设计原理、边界情况处理等内容应更新到 `docs/` 下对应的文档文件中**(命令相关的更新到 `docs/<command>.md`,全局架构更新到 `docs/spec.md`),而非 README.md。
95
+
79
96
  ## 质量检查
80
97
 
81
98
  在完成更新前,自我检查:
82
- - [ ] 所有变更的功能是否都在 README.md 中体现?
99
+ - [ ] 所有变更的功能是否都在相关文档中体现?
83
100
  - [ ] 文档中的代码示例是否仍然正确?
84
101
  - [ ] 命令列表、参数说明是否与代码一致?
102
+ - [ ] 目录结构描述是否与实际一致?
85
103
  - [ ] 没有删除任何注释掉的代码或解释性注释?
86
104
  - [ ] 新增注释是否使用中文?
87
105
  - [ ] 文档格式是否与原有风格保持一致?
@@ -89,13 +107,15 @@ README.md 的定位是**面向新用户的快速上手指南**,必须严格遵
89
107
  ## 边界情况处理
90
108
 
91
109
  - 如果工作区和暂存区都没有变更,检查最近的提交并告知用户当前没有未提交的变更,询问是否基于最近提交更新。
110
+ - 如果某个文档文件不存在,告知用户并询问是否需要创建。
92
111
  - 如果变更内容过于复杂或不确定如何反映到文档中,列出你的理解并询问用户确认。
93
- - 如果变更只涉及代码重构而不改变功能,可能不需要更新 README.md,告知用户即可。
112
+ - 如果变更只涉及代码重构而不改变功能,可能不需要更新面向用户的文档(README.md),但可能需要更新规格文档(`docs/spec.md` 或对应的 `docs/<command>.md`)。
113
+ - 如果变更涉及新增命令,且 `docs/` 下还没有对应的命令文档,应创建 `docs/<command>.md`。
94
114
 
95
115
  **Update your agent memory** as you discover documentation patterns, document structure conventions, terminology usage, and relationships between code modules and their documentation sections. This builds up institutional knowledge across conversations. Write concise notes about what you found and where.
96
116
 
97
117
  Examples of what to record:
98
- - README.md 的章节结构和更新模式
118
+ - 各文档的章节结构和更新模式
99
119
  - 项目术语和命名惯例
100
120
  - 代码模块与文档章节的对应关系
101
121
  - 常见的文档更新场景和处理方式
package/README.md CHANGED
@@ -34,6 +34,7 @@ clawt status -i
34
34
  | `r` | 恢复 Claude Code 会话 | `clawt resume -b <branch>` |
35
35
  | `s` | 同步主分支代码 | `clawt sync -b <branch>` |
36
36
  | `d` | 删除 worktree | `clawt remove -b <branch>` |
37
+ | `c` | 覆盖修改回目标 worktree | `clawt cover` |
37
38
  | `q` | 退出面板 | — |
38
39
 
39
40
  示例:
@@ -50,9 +51,10 @@ clawt status -i
50
51
  clawt init # 以当前分支作为主工作分支进行初始化
51
52
  clawt init -b <branch> # 指定主工作分支名
52
53
  clawt init show # 交互式查看和修改项目配置
54
+ clawt init show --json # 以 JSON 格式输出项目配置
53
55
  ```
54
56
 
55
- 设置项目的主工作分支。重复执行会更新主工作分支配置。`init show` 提供交互式面板,可查看和修改项目配置项(如 validate 成功后自动执行的命令)。
57
+ 设置项目的主工作分支。重复执行会更新主工作分支配置。`init show` 提供交互式面板,可查看和修改项目配置项(如 validate 成功后自动执行的命令)。`init show --json` 可以直接输出当前项目配置的 JSON 格式。
56
58
 
57
59
  ### `clawt run` — 创建 worktree 并执行任务
58
60
 
@@ -117,10 +119,17 @@ clawt run -b <branch> --tasks "任务1" --tasks "任务2" --dry-run
117
119
  ```bash
118
120
  clawt resume -b <branch> # 指定分支
119
121
  clawt resume # 交互式多选(按创建日期分组)
122
+
123
+ # 非交互式追问
124
+ clawt resume -b <branch> --prompt "追问内容"
125
+ clawt resume -f tasks.md # 从任务文件批量追问
126
+ clawt resume -f tasks.md -c 2 # 限制并发数
120
127
  ```
121
128
 
122
129
  不传 `-b` 时,分支列表按创建日期分组显示,支持全局全选和按组全选。选 1 个默认在新终端 Tab 中恢复(设置 `resumeInPlace: true` 可改为在当前终端就地恢复),选多个自动在独立终端 Tab 中批量恢复(仅 macOS)。
123
130
 
131
+ `--prompt` 用于对指定分支进行非交互式追问,`-f` 从任务文件批量追问多个分支(通过 branch 名匹配已有 worktree)。两者互斥。
132
+
124
133
  如果目标 worktree 存在历史会话,会自动继续上次对话(`--continue`)。
125
134
 
126
135
  > **注意:** 使用 Terminal.app 批量恢复时,需要在「系统设置 → 隐私与安全性 → 辅助功能」中授权终端应用。iTerm2 无需额外授权。终端类型可通过配置项 `terminalApp` 指定。
@@ -175,6 +184,7 @@ clawt sync -b <branch>
175
184
  ```bash
176
185
  clawt merge -b <branch> -m "feat: 提交信息" # 有未提交修改时需要 -m
177
186
  clawt merge -b <branch> # 已提交过可省略 -m
187
+ clawt merge -b <branch> --auto # 遇到冲突直接调用 AI 解决
178
188
  ```
179
189
 
180
190
  ### `clawt remove` — 移除 worktree
@@ -207,7 +217,7 @@ clawt status -i # 交互式面板模式(实时刷新,支持键盘导
207
217
  | 快捷键 | 操作 |
208
218
  | ------ | ---- |
209
219
  | `↑` `↓` | 导航选中 worktree |
210
- | `v` `m` `d` `r` `s` | 验证 / 合并 / 删除 / 恢复 / 同步 |
220
+ | `v` `m` `d` `r` `s` `c` | 验证 / 合并 / 删除 / 恢复 / 同步 / 覆盖 |
211
221
  | `f` | 手动刷新 |
212
222
  | `q` / `Ctrl+C` | 退出 |
213
223
 
@@ -225,6 +235,15 @@ clawt home
225
235
 
226
236
  如果当前已在主工作分支上,会提示无需切换。
227
237
 
238
+ ### `clawt tasks` — 任务文件管理
239
+
240
+ ```bash
241
+ clawt tasks init # 生成任务模板文件(默认输出到 clawt/tasks/ 目录)
242
+ clawt tasks init [path] # 指定输出路径
243
+ ```
244
+
245
+ 快速生成 `clawt run -f` 所需的任务文件模板,包含格式说明注释和示例任务块。
246
+
228
247
  ### `clawt projects` — 跨项目 worktree 概览
229
248
 
230
249
  ```bash
@@ -315,12 +334,24 @@ clawt alias remove l
315
334
  | `resumeInPlace` | `false` | resume 单选时在当前终端就地恢复,`false` 则在新 Tab 中打开 |
316
335
  | `aliases` | `{}` | 命令别名映射(如 `{"l": "list", "r": "run"}`) |
317
336
  | `autoUpdate` | `true` | 自动检查新版本(每 24 小时检查一次 npm registry) |
337
+ | `conflictResolveMode` | `"ask"` | merge 冲突时的解决模式:`ask`(询问是否使用 AI)、`auto`(自动 AI 解决)、`manual`(手动解决) |
338
+ | `conflictResolveTimeoutMs` | `300000` | Claude Code 冲突解决超时时间(毫秒),默认 5 分钟 |
318
339
 
319
340
  ## 全局选项
320
341
 
321
342
  | 选项 | 说明 |
322
343
  | ---- | ---- |
323
344
  | `--debug` | 输出调试信息 |
345
+ | `-y, --yes` | 跳过所有交互式确认,适用于脚本/CI 环境 |
346
+
347
+ ## 环境变量
348
+
349
+ | 环境变量 | 说明 |
350
+ | -------- | ---- |
351
+ | `CI` | 设置为 `true` 或 `1` 时,自动启用非交互模式(等同于 `--yes`) |
352
+ | `CLAWT_NON_INTERACTIVE` | 设置为 `true` 或 `1` 时,自动启用非交互模式(等同于 `--yes`) |
353
+
354
+ > **优先级:** `--yes` > `CI` > `CLAWT_NON_INTERACTIVE` > 默认交互模式
324
355
 
325
356
  ## 日志
326
357
 
package/dist/index.js CHANGED
@@ -762,6 +762,7 @@ var PROJECT_CONFIG_DESCRIPTIONS = deriveConfigDescriptions2(PROJECT_CONFIG_DEFIN
762
762
 
763
763
  // src/constants/git.ts
764
764
  var AUTO_SAVE_COMMIT_MESSAGE = "chore: auto-save before sync";
765
+ var EXEC_MAX_BUFFER = 200 * 1024 * 1024;
765
766
 
766
767
  // src/constants/logger.ts
767
768
  var DEBUG_TIMESTAMP_FORMAT = "HH:mm:ss.SSS";
@@ -967,7 +968,8 @@ function execCommand(command, options) {
967
968
  const result = execSync(command, {
968
969
  cwd: options?.cwd,
969
970
  encoding: "utf-8",
970
- stdio: ["pipe", "pipe", "pipe"]
971
+ stdio: ["pipe", "pipe", "pipe"],
972
+ maxBuffer: EXEC_MAX_BUFFER
971
973
  });
972
974
  return result.trim();
973
975
  }
@@ -992,7 +994,8 @@ function execCommandWithInput(command, args, options) {
992
994
  cwd: options.cwd,
993
995
  input: options.input,
994
996
  encoding: "utf-8",
995
- stdio: ["pipe", "pipe", "pipe"]
997
+ stdio: ["pipe", "pipe", "pipe"],
998
+ maxBuffer: EXEC_MAX_BUFFER
996
999
  });
997
1000
  return result.trim();
998
1001
  }
@@ -1184,7 +1187,8 @@ function gitDiffBinaryAgainstBranch(branchName, cwd) {
1184
1187
  logger.debug(`\u6267\u884C\u547D\u4EE4: git diff HEAD...${branchName} --binary${cwd ? ` (cwd: ${cwd})` : ""}`);
1185
1188
  return execSync2(`git diff HEAD...${branchName} --binary`, {
1186
1189
  cwd,
1187
- stdio: ["pipe", "pipe", "pipe"]
1190
+ stdio: ["pipe", "pipe", "pipe"],
1191
+ maxBuffer: EXEC_MAX_BUFFER
1188
1192
  });
1189
1193
  }
1190
1194
  function gitApplyFromStdin(patchContent, cwd) {
@@ -1221,7 +1225,8 @@ function gitDiffTree(baseTreeHash, targetTreeHash, cwd) {
1221
1225
  logger.debug(`\u6267\u884C\u547D\u4EE4: git diff-tree -p --binary ${baseTreeHash} ${targetTreeHash}${cwd ? ` (cwd: ${cwd})` : ""}`);
1222
1226
  return execSync2(`git diff-tree -p --binary ${baseTreeHash} ${targetTreeHash}`, {
1223
1227
  cwd,
1224
- stdio: ["pipe", "pipe", "pipe"]
1228
+ stdio: ["pipe", "pipe", "pipe"],
1229
+ maxBuffer: EXEC_MAX_BUFFER
1225
1230
  });
1226
1231
  }
1227
1232
  function gitApplyCachedCheck(patchContent, cwd) {
@@ -696,6 +696,9 @@ function deriveConfigDescriptions2(definitions) {
696
696
  var PROJECT_DEFAULT_CONFIG = deriveDefaultConfig2(PROJECT_CONFIG_DEFINITIONS);
697
697
  var PROJECT_CONFIG_DESCRIPTIONS = deriveConfigDescriptions2(PROJECT_CONFIG_DEFINITIONS);
698
698
 
699
+ // src/constants/git.ts
700
+ var EXEC_MAX_BUFFER = 200 * 1024 * 1024;
701
+
699
702
  // src/constants/update.ts
700
703
  var UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1e3;
701
704
 
package/docs/alias.md ADDED
@@ -0,0 +1,114 @@
1
+ ### 5.15 命令别名管理
2
+
3
+ **命令:**
4
+
5
+ ```bash
6
+ # 列出所有命令别名
7
+ clawt alias
8
+ clawt alias list
9
+
10
+ # 设置命令别名
11
+ clawt alias set <alias> <command>
12
+
13
+ # 移除命令别名
14
+ clawt alias remove <alias>
15
+ ```
16
+
17
+ **子命令:**
18
+
19
+ | 子命令 | 说明 |
20
+ | ------ | ---- |
21
+ | `clawt alias` / `clawt alias list` | 列出所有已配置的命令别名 |
22
+ | `clawt alias set <alias> <command>` | 设置命令别名,将 `<alias>` 映射到 `<command>` |
23
+ | `clawt alias remove <alias>` | 移除指定的命令别名 |
24
+
25
+ **参数:**
26
+
27
+ | 参数 | 必填 | 说明 |
28
+ | ---- | ---- | ---- |
29
+ | `<alias>` | 是(set / remove) | 别名名称 |
30
+ | `<command>` | 是(set) | 目标内置命令名 |
31
+
32
+ **约束规则:**
33
+
34
+ 1. **别名不能覆盖内置命令名**:别名不能与任何已注册的内置命令同名(动态检测,当前包括 `list`、`create`、`remove`、`run`、`resume`、`validate`、`cover`、`merge`、`config`、`sync`、`reset`、`status`、`alias`、`projects`、`completion`、`init`、`home`、`tasks`)。如果用户尝试设置与内置命令同名的别名,输出错误提示并返回
35
+ 2. **目标必须是内置命令**:别名的目标(`<command>`)必须是已注册的内置命令名。如果指定了不存在的目标命令,输出错误提示并返回
36
+ 3. **参数透传**:通过别名调用时,所有选项和参数会完全透传给目标命令,行为与直接调用目标命令完全一致
37
+
38
+ **持久化:**
39
+
40
+ 别名配置存储在 `~/.clawt/config.json` 的 `aliases` 字段中(类型 `Record<string, string>`,默认 `{}`)。
41
+
42
+ **运行流程:**
43
+
44
+ #### `alias list`(默认)
45
+
46
+ 1. 读取配置文件中的 `aliases` 字段
47
+ 2. 如果没有配置任何别名,输出提示 `(无别名)`
48
+ 3. 如果有别名,逐行输出所有别名映射
49
+
50
+ **输出格式:**
51
+
52
+ ```
53
+ 当前别名列表:
54
+ ────────────────────────────────────────
55
+
56
+ l → list
57
+ r → run
58
+ v → validate
59
+
60
+ ────────────────────────────────────────
61
+ ```
62
+
63
+ #### `alias set <alias> <command>`
64
+
65
+ 1. **校验别名不与内置命令冲突**:检查 `<alias>` 是否为内置命令名,是则输出错误提示并返回
66
+ 2. **校验目标命令存在**:检查 `<command>` 是否为已注册的内置命令名,不是则输出错误提示并返回
67
+ 3. 将别名写入配置文件的 `aliases` 字段(如果别名已存在,覆盖旧值)
68
+ 4. 输出成功提示
69
+
70
+ **输出格式:**
71
+
72
+ ```
73
+ ✓ 已设置别名: l → list
74
+ ```
75
+
76
+ #### `alias remove <alias>`
77
+
78
+ 1. 读取配置文件中的 `aliases` 字段
79
+ 2. 检查指定的别名是否存在,不存在则输出错误提示并返回
80
+ 3. 从 `aliases` 中删除该别名并写入配置文件
81
+ 4. 输出成功提示
82
+
83
+ **输出格式:**
84
+
85
+ ```
86
+ ✓ 已移除别名: l
87
+ ```
88
+
89
+ **别名使用示例:**
90
+
91
+ ```bash
92
+ # 设置别名
93
+ clawt alias set l list
94
+ clawt alias set r run
95
+ clawt alias set v validate
96
+
97
+ # 使用别名(等同于对应的完整命令)
98
+ clawt l # 等同于 clawt list
99
+ clawt r task.md # 等同于 clawt run task.md
100
+
101
+ # 查看所有别名
102
+ clawt alias list
103
+
104
+ # 移除别名
105
+ clawt alias remove l
106
+ ```
107
+
108
+ **实现要点:**
109
+
110
+ - 消息常量定义在 `src/constants/messages/alias.ts`(`ALIAS_MESSAGES`),包括列表为空提示、设置/移除成功、别名不存在、与内置命令冲突、目标命令不存在等消息
111
+ - 别名应用逻辑位于 `src/utils/alias.ts` 的 `applyAliases` 函数:在主入口 `src/index.ts` 中,所有命令注册完成后调用,遍历配置中的 `aliases` 映射,通过 Commander.js 的 `.alias()` 方法为对应命令注册别名。如果目标命令不存在则跳过并输出 warn 级别日志
112
+ - 内置命令冲突检测通过 `getRegisteredCommandNames(program)` 动态获取所有已注册命令名,而非硬编码命令列表
113
+
114
+ ---
@@ -0,0 +1,55 @@
1
+ ### 5.16 `clawt completion` 命令
2
+
3
+ 为终端环境(bash/zsh)生成并安装 `clawt` 的命令、选项及参数的自动补全脚本。
4
+
5
+ #### 语法
6
+ ```bash
7
+ clawt completion bash
8
+ clawt completion zsh
9
+ clawt completion install
10
+ ```
11
+
12
+ #### 子命令说明
13
+
14
+ | 子命令 | 说明 |
15
+ | --------- | ----------------------------------------------------------------------------------- |
16
+ | `bash` | 输出适用于 bash 的补全脚本(用户可重定向到 `~/.bashrc`) |
17
+ | `zsh` | 输出适用于 zsh 的补全脚本(用户可重定向到 `~/.zshrc`) |
18
+ | `install` | 自动检测当前 shell 类型,将补全脚本追加到对应的配置文件中 |
19
+
20
+ #### `install` 子命令流程
21
+
22
+ 1. 通过 `process.env.SHELL` 检测当前 shell 类型
23
+ 2. 根据 shell 类型确定目标配置文件:
24
+ - zsh → `~/.zshrc`(追加 `source <(clawt completion zsh)`)
25
+ - bash → `~/.bashrc`(追加 `eval "$(clawt completion bash)"`)
26
+ 3. 检查目标文件中是否已包含 `clawt completion`,已存在则跳过并提示
27
+ 4. 追加成功后提示用户重启终端或 source 配置文件
28
+ 5. 未知 shell 类型时输出警告,提示手动配置
29
+
30
+ #### 动态补全特性
31
+
32
+ 补全脚本通过内部子命令 `_complete` 实现动态补全,不对外公开。补全引擎基于 Commander.js 的命令树结构遍历,支持以下场景:
33
+
34
+ | 场景 | 补全行为 |
35
+ | ---------------------------- | ---------------------------------------------------------- |
36
+ | `-b` / `--branch` 参数之后 | 动态列出当前项目所有 worktree 分支名(通过 `getProjectWorktrees`) |
37
+ | `-f` / `--file` 参数之后 | 动态列出匹配的文件和子目录(不限制文件类型,支持子目录递归浏览) |
38
+ | `config set` / `config get` 之后 | 动态列出所有配置项键名(从 `CONFIG_DEFINITIONS` 获取) |
39
+ | 输入以 `-` 开头 | 列出当前命令层级的可用选项(short/long) |
40
+ | 其他情况 | 列出当前命令层级的可用子命令及别名;若输入为空,同时列出可用选项 |
41
+
42
+ **文件路径补全细节:**
43
+ - 支持子目录递归浏览(如 `tasks/` 后继续 Tab 可深入子目录)
44
+ - 目录候选项以 `/` 结尾,补全时不自动追加空格
45
+ - 不限制文件类型,列出所有非隐藏文件
46
+ - 跳过隐藏文件和目录(以 `.` 开头)
47
+
48
+ #### 实现说明
49
+
50
+ - 补全命令注册函数:`registerCompletionCommand()`(在 `src/commands/completion.ts`)
51
+ - 消息常量:`COMPLETION_MESSAGES`(在 `src/constants/messages/completion.ts`)
52
+ - 核心函数:`generateCompletions()` 解析当前输入上下文并输出候选项,`completeFilePath()` 处理文件路径补全,`tryCompleteSpecialArg()` 处理特殊参数(分支名、文件路径、配置键)的动态补全,`completeFromCommandTree()` 基于命令树遍历生成子命令和选项候选项
53
+ - shell 脚本生成:`getBashScript()`、`getZshScript()` 分别生成对应 shell 的补全脚本
54
+
55
+ ---
@@ -0,0 +1,49 @@
1
+ ### 5.7 默认配置文件
2
+
3
+ **路径:** `~/.clawt/config.json`
4
+
5
+ **生成时机:** 全局安装后自动生成(通过 `postinstall` 脚本)。
6
+
7
+ **升级策略:** 配置文件已存在时,执行增量合并而非简单跳过:
8
+
9
+ - **新版本新增的配置项** → 使用默认值补充到用户配置中
10
+ - **用户已有的配置项** → 保留用户的值,不覆盖
11
+ - **新版本已移除的配置项** → 从用户配置中删除
12
+
13
+ 仅在合并后配置发生变化时才写入文件。配置文件损坏或无法解析时,视为不存在,重新生成默认配置。
14
+
15
+ **默认内容:**
16
+
17
+ ```json
18
+ {
19
+ "autoDeleteBranch": false,
20
+ "claudeCodeCommand": "claude",
21
+ "autoPullPush": false,
22
+ "confirmDestructiveOps": true,
23
+ "maxConcurrency": 0,
24
+ "terminalApp": "auto",
25
+ "resumeInPlace": false,
26
+ "aliases": {},
27
+ "autoUpdate": true,
28
+ "conflictResolveMode": "ask",
29
+ "conflictResolveTimeoutMs": 300000
30
+ }
31
+ ```
32
+
33
+ **配置项说明:**
34
+
35
+ | 配置项 | 类型 | 默认值 | 说明 |
36
+ | ------------------ | --------- | --------- | -------------------------------------------------- |
37
+ | `autoDeleteBranch` | `boolean` | `false` | 移除 worktree 时是否自动删除对应本地分支(无需每次确认);merge 成功后是否自动清理 worktree 和分支;run 任务被中断(Ctrl+C)后是否自动清理本次创建的 worktree 和分支 |
38
+ | `claudeCodeCommand` | `string` | `"claude"` | Claude Code CLI 启动指令,用于 `clawt run` 不传 `--tasks` 时和 `clawt resume` 在 worktree 中打开交互式界面 |
39
+ | `autoPullPush` | `boolean` | `false` | merge 成功后是否自动执行 git pull 和 git push |
40
+ | `confirmDestructiveOps` | `boolean` | `true` | 执行破坏性操作(reset、validate --clean)前是否提示确认 |
41
+ | `maxConcurrency` | `number` | `0` | run 命令默认最大并发数,`0` 表示不限制 |
42
+ | `terminalApp` | `string` | `"auto"` | 批量 resume 使用的终端应用:`auto`(自动检测)、`iterm2`、`terminal`(macOS) |
43
+ | `resumeInPlace` | `boolean` | `false` | resume 单选时是否在当前终端就地打开,`false` 则通过 `terminalApp` 在新 Tab 中打开 |
44
+ | `aliases` | `Record<string, string>` | `{}` | 命令别名映射,键为别名,值为目标内置命令名 |
45
+ | `autoUpdate` | `boolean` | `true` | 是否启用自动更新检查(每 24 小时通过 npm registry 检查一次新版本) |
46
+ | `conflictResolveMode` | `string` | `"ask"` | merge 冲突时的解决模式:`ask`(询问是否使用 AI)、`auto`(自动 AI 解决)、`manual`(手动解决) |
47
+ | `conflictResolveTimeoutMs` | `number` | `300000` | Claude Code 冲突解决超时时间(毫秒),默认 300000(5 分钟) |
48
+
49
+ ---
package/docs/config.md ADDED
@@ -0,0 +1,93 @@
1
+ ### 5.10 交互式查看和修改全局配置
2
+
3
+ **命令:**
4
+
5
+ ```bash
6
+ # 交互式修改配置(等同于 config set 无参数)
7
+ clawt config
8
+
9
+ # 修改配置项(无参数进入交互式,有参数直接设置)
10
+ clawt config set [key] [value]
11
+
12
+ # 获取单个配置项的值
13
+ clawt config get <key>
14
+
15
+ # 将配置恢复为默认值
16
+ clawt config reset
17
+ ```
18
+
19
+ #### 交互式修改配置(`config` / `config set`)
20
+
21
+ 直接执行 `clawt config` 或 `clawt config set`(不带参数)进入交互式配置修改模式。
22
+
23
+ **运行流程:**
24
+
25
+ 1. 读取全局配置文件 `~/.clawt/config.json`
26
+ 2. 列出所有配置项供用户选择(`Enquirer.Select`),每项显示:
27
+ - 配置项名称
28
+ - 当前值(布尔值绿色/黄色,字符串和数字青色)
29
+ - 配置项描述(暗淡色 dim)
30
+ - 对象类型配置项(如 `aliases`)标灰不可选,提示用户通过专用命令管理
31
+ 3. 用户选择某个配置项后,根据值类型自动选择提示策略:
32
+ - **boolean 类型** → `Select`(true / false)
33
+ - **number 类型** → `Input`(带数字校验)
34
+ - **string 类型 + 有 `allowedValues`** → `Select`(枚举列表)
35
+ - **string 类型 + 无 `allowedValues`** → `Input`(自由输入)
36
+ 4. 将修改后的配置持久化到配置文件
37
+ 5. 输出成功提示:`✓ <key> 已设置为 <value>`
38
+
39
+ #### 直接设置配置项(`config set <key> <value>`)
40
+
41
+ 当带参数执行 `clawt config set <key> <value>` 时,直接修改指定配置项。
42
+
43
+ **参数:**
44
+
45
+ | 参数 | 必填 | 说明 |
46
+ | ---- | ---- | ---- |
47
+ | `key` | 否 | 配置项名称(不传则进入交互式模式) |
48
+ | `value` | 否 | 配置值(传了 `key` 时必填) |
49
+
50
+ **运行流程:**
51
+
52
+ 1. 校验 `key` 是否为有效的配置项名称(基于 `DEFAULT_CONFIG` 的键列表),无效则输出错误及可用配置项列表
53
+ 2. 校验 `value` 是否缺失,缺失则提示:`缺少配置值,用法: clawt config set <key> <value>`
54
+ 3. 根据目标配置项的类型解析并校验值:
55
+ - **boolean** → 仅接受 `true` 或 `false`
56
+ - **number** → `Number()` 解析,`NaN` 报错
57
+ - **string + 有 `allowedValues`** → 校验值是否在枚举列表中
58
+ - **string + 无 `allowedValues`** → 无额外校验
59
+ 4. 加载配置、修改目标项、持久化
60
+ 5. 输出成功提示:`✓ <key> 已设置为 <value>`
61
+
62
+ #### 获取单个配置项(`config get <key>`)
63
+
64
+ **参数:**
65
+
66
+ | 参数 | 必填 | 说明 |
67
+ | ---- | ---- | ---- |
68
+ | `key` | 是 | 配置项名称 |
69
+
70
+ **运行流程:**
71
+
72
+ 1. 校验 `key` 是否为有效的配置项名称,无效则输出错误及可用配置项列表
73
+ 2. 读取配置文件,获取目标配置项的值
74
+ 3. 输出:`<key> = <value>`
75
+
76
+ #### 恢复默认配置(`config reset`)
77
+
78
+ **运行流程:**
79
+
80
+ 1. 始终提示确认(显示即将执行的操作和后果:当前配置将被覆盖为默认值),不受 `confirmDestructiveOps` 配置控制。用户取消则退出
81
+ 2. 将默认配置写入 `~/.clawt/config.json`(覆盖现有配置文件)
82
+ 3. 输出成功提示:`✓ 配置已恢复为默认值`
83
+
84
+ **实现要点:**
85
+
86
+ - 配置项类型定义:`ConfigItemDefinition` 新增可选字段 `allowedValues`(`readonly string[]`),仅对 string 类型有效,用于枚举值校验和交互式 Select 提示
87
+ - 值解析与提示策略:`src/utils/config-strategy.ts` 中的 `parseConfigValue()`(CLI 字符串解析)和 `promptConfigValue()`(交互式提示),基于类型和 `allowedValues` 自动分发
88
+ - 交互式配置编辑:`handleInteractiveConfigSet` 调用通用的 `interactiveConfigEditor`(`src/utils/config-strategy.ts`),传入 `CONFIG_DEFINITIONS` 和 `disabledKeys`(对象类型配置项禁用映射),不再在 config 命令中直接构建选择列表和调用 `promptConfigValue`
89
+ - `saveConfig(config)`:`src/utils/config.ts` 中的通用配置写入函数,将完整配置对象持久化到文件
90
+ - `formatConfigValue(value)`:支持 boolean(绿色/黄色)和 string/number(青色)的格式化显示。`undefined` / `null` 值显示为暗淡色的 `(未设置)`
91
+ - 对象类型配置项(如 `aliases`)的显示逻辑在 `interactiveConfigEditor` 的列表构建中处理:通过 `JSON.stringify` 以暗淡色显示值,并标记为不可选(disabled),提示用户通过 `clawt alias` 命令管理
92
+
93
+ ---