clawt 2.20.0 → 3.0.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.
- package/README.md +10 -0
- package/dist/index.js +395 -133
- package/dist/postinstall.js +35 -6
- package/docs/alias.md +108 -0
- package/docs/completion.md +55 -0
- package/docs/config-file.md +43 -0
- package/docs/config.md +91 -0
- package/docs/create.md +85 -0
- package/docs/init.md +65 -0
- package/docs/list.md +67 -0
- package/docs/log.md +67 -0
- package/docs/merge.md +137 -0
- package/docs/notification.md +94 -0
- package/docs/projects.md +135 -0
- package/docs/remove.md +79 -0
- package/docs/reset.md +35 -0
- package/docs/resume.md +99 -0
- package/docs/run.md +146 -0
- package/docs/spec.md +156 -1905
- package/docs/status.md +155 -0
- package/docs/sync.md +114 -0
- package/docs/update-check.md +95 -0
- package/docs/validate.md +368 -0
- package/package.json +1 -1
- package/src/commands/alias.ts +1 -1
- package/src/commands/create.ts +10 -5
- package/src/commands/init.ts +75 -0
- package/src/commands/list.ts +1 -1
- package/src/commands/merge.ts +11 -4
- package/src/commands/remove.ts +10 -3
- package/src/commands/reset.ts +3 -0
- package/src/commands/resume.ts +1 -1
- package/src/commands/run.ts +9 -3
- package/src/commands/status.ts +1 -1
- package/src/commands/sync.ts +18 -6
- package/src/commands/validate.ts +46 -52
- package/src/constants/branch.ts +3 -0
- package/src/constants/config.ts +1 -1
- package/src/constants/index.ts +2 -2
- package/src/constants/messages/completion.ts +1 -1
- package/src/constants/messages/create.ts +3 -0
- package/src/constants/messages/index.ts +2 -0
- package/src/constants/messages/init.ts +18 -0
- package/src/constants/messages/remove.ts +2 -0
- package/src/constants/messages/sync.ts +3 -0
- package/src/constants/messages/validate.ts +6 -0
- package/src/constants/paths.ts +3 -0
- package/src/index.ts +2 -0
- package/src/types/command.ts +7 -1
- package/src/types/index.ts +2 -1
- package/src/types/projectConfig.ts +5 -0
- package/src/utils/config.ts +2 -1
- package/src/utils/git.ts +18 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/json.ts +67 -0
- package/src/utils/project-config.ts +77 -0
- package/src/utils/validate-branch.ts +166 -0
- package/src/utils/worktree.ts +6 -2
- package/tests/unit/commands/create.test.ts +20 -16
- package/tests/unit/commands/init.test.ts +146 -0
- package/tests/unit/commands/merge.test.ts +7 -1
- package/tests/unit/commands/remove.test.ts +4 -0
- package/tests/unit/commands/reset.test.ts +2 -0
- package/tests/unit/commands/run.test.ts +2 -0
- package/tests/unit/commands/sync.test.ts +6 -0
- package/tests/unit/commands/validate.test.ts +13 -0
- package/tests/unit/utils/config.test.ts +2 -2
- package/tests/unit/utils/project-config.test.ts +136 -0
- package/tests/unit/utils/update-checker.test.ts +28 -7
- package/tests/unit/utils/validate-branch.test.ts +272 -0
- package/tests/unit/utils/worktree.test.ts +6 -0
package/dist/postinstall.js
CHANGED
|
@@ -11,6 +11,7 @@ var WORKTREES_DIR = join(CLAWT_HOME, "worktrees");
|
|
|
11
11
|
var VALIDATE_SNAPSHOTS_DIR = join(CLAWT_HOME, "validate-snapshots");
|
|
12
12
|
var CLAUDE_PROJECTS_DIR = join(homedir(), ".claude", "projects");
|
|
13
13
|
var UPDATE_CHECK_PATH = join(CLAWT_HOME, "update-check.json");
|
|
14
|
+
var PROJECTS_CONFIG_DIR = join(CLAWT_HOME, "projects");
|
|
14
15
|
|
|
15
16
|
// src/constants/messages/common.ts
|
|
16
17
|
var COMMON_MESSAGES = {
|
|
@@ -113,7 +114,9 @@ var RUN_MESSAGES = {
|
|
|
113
114
|
// src/constants/messages/create.ts
|
|
114
115
|
var CREATE_MESSAGES = {
|
|
115
116
|
/** 创建数量参数无效 */
|
|
116
|
-
INVALID_COUNT: (value) => `\u65E0\u6548\u7684\u521B\u5EFA\u6570\u91CF: "${value}"\uFF0C\u8BF7\u8F93\u5165\u6B63\u6574\u6570
|
|
117
|
+
INVALID_COUNT: (value) => `\u65E0\u6548\u7684\u521B\u5EFA\u6570\u91CF: "${value}"\uFF0C\u8BF7\u8F93\u5165\u6B63\u6574\u6570`,
|
|
118
|
+
/** 当前不在主工作分支上的警告 */
|
|
119
|
+
CREATE_WARN_NOT_ON_MAIN_BRANCH: (mainBranch, currentBranch) => `\u5F53\u524D\u4E0D\u5728\u4E3B\u5DE5\u4F5C\u5206\u652F ${mainBranch} \u4E0A\uFF08\u5F53\u524D: ${currentBranch}\uFF09`
|
|
117
120
|
};
|
|
118
121
|
|
|
119
122
|
// src/constants/messages/merge.ts
|
|
@@ -210,7 +213,12 @@ ${branches.map((b) => ` - ${b}`).join("\n")}`,
|
|
|
210
213
|
/** 自动 sync 开始提示 */
|
|
211
214
|
VALIDATE_AUTO_SYNC_START: (branch) => `\u6B63\u5728\u81EA\u52A8\u540C\u6B65\u4E3B\u5206\u652F\u5230 ${branch} ...`,
|
|
212
215
|
/** 用户拒绝自动 sync */
|
|
213
|
-
VALIDATE_AUTO_SYNC_DECLINED: (branch) => `\u8BF7\u624B\u52A8\u6267\u884C clawt sync -b ${branch} \u540C\u6B65\u4E3B\u5206\u652F\u540E\u91CD\u8BD5
|
|
216
|
+
VALIDATE_AUTO_SYNC_DECLINED: (branch) => `\u8BF7\u624B\u52A8\u6267\u884C clawt sync -b ${branch} \u540C\u6B65\u4E3B\u5206\u652F\u540E\u91CD\u8BD5`,
|
|
217
|
+
/** 验证分支不存在 */
|
|
218
|
+
VALIDATE_BRANCH_NOT_FOUND: (validateBranch, branch) => `\u9A8C\u8BC1\u5206\u652F ${validateBranch} \u4E0D\u5B58\u5728\uFF0C\u8BF7\u5148\u6267\u884C clawt create \u6216 clawt run \u521B\u5EFA\u5206\u652F ${branch}`,
|
|
219
|
+
/** validate 成功(含验证分支信息) */
|
|
220
|
+
VALIDATE_SUCCESS_WITH_BRANCH: (branch, validateBranch) => `\u2713 \u5DF2\u5207\u6362\u5230\u9A8C\u8BC1\u5206\u652F ${validateBranch} \u5E76\u5E94\u7528\u5206\u652F ${branch} \u7684\u53D8\u66F4
|
|
221
|
+
\u53EF\u4EE5\u5F00\u59CB\u9A8C\u8BC1\u4E86`
|
|
214
222
|
};
|
|
215
223
|
|
|
216
224
|
// src/constants/messages/sync.ts
|
|
@@ -235,7 +243,9 @@ ${branches.map((b) => ` - ${b}`).join("\n")}`,
|
|
|
235
243
|
/** sync 交互选择提示 */
|
|
236
244
|
SYNC_SELECT_BRANCH: "\u8BF7\u9009\u62E9\u8981\u540C\u6B65\u7684\u5206\u652F",
|
|
237
245
|
/** sync 模糊匹配到多个结果提示 */
|
|
238
|
-
SYNC_MULTIPLE_MATCHES: (name) => `"${name}" \u5339\u914D\u5230\u591A\u4E2A\u5206\u652F\uFF0C\u8BF7\u9009\u62E9\uFF1A
|
|
246
|
+
SYNC_MULTIPLE_MATCHES: (name) => `"${name}" \u5339\u914D\u5230\u591A\u4E2A\u5206\u652F\uFF0C\u8BF7\u9009\u62E9\uFF1A`,
|
|
247
|
+
/** sync 后验证分支已重建提示 */
|
|
248
|
+
SYNC_VALIDATE_BRANCH_REBUILT: (validateBranch) => `\u9A8C\u8BC1\u5206\u652F ${validateBranch} \u5DF2\u91CD\u5EFA`
|
|
239
249
|
};
|
|
240
250
|
|
|
241
251
|
// src/constants/messages/resume.ts
|
|
@@ -276,7 +286,9 @@ ${branches.map((b) => ` - ${b}`).join("\n")}`,
|
|
|
276
286
|
REMOVE_PARTIAL_FAILURE: (failures) => `\u4EE5\u4E0B worktree \u79FB\u9664\u5931\u8D25\uFF1A
|
|
277
287
|
${failures.map((f) => ` \u2717 ${f.path}: ${f.error}`).join("\n")}`,
|
|
278
288
|
/** 用户选择保留本地分支 */
|
|
279
|
-
REMOVE_BRANCHES_KEPT: "\u5DF2\u4FDD\u7559\u672C\u5730\u5206\u652F\uFF0C\u53EF\u7A0D\u540E\u4F7F\u7528 git branch -D <\u5206\u652F\u540D> \u624B\u52A8\u5220\u9664"
|
|
289
|
+
REMOVE_BRANCHES_KEPT: "\u5DF2\u4FDD\u7559\u672C\u5730\u5206\u652F\uFF0C\u53EF\u7A0D\u540E\u4F7F\u7528 git branch -D <\u5206\u652F\u540D> \u624B\u52A8\u5220\u9664",
|
|
290
|
+
/** 确认删除本地分支和验证分支 */
|
|
291
|
+
REMOVE_CONFIRM_DELETE_BRANCHES: "\u662F\u5426\u540C\u65F6\u5220\u9664\u5BF9\u5E94\u7684\u672C\u5730\u5206\u652F\u548C\u9A8C\u8BC1\u5206\u652F\uFF1F"
|
|
280
292
|
};
|
|
281
293
|
|
|
282
294
|
// src/constants/messages/reset.ts
|
|
@@ -393,7 +405,7 @@ var PROJECTS_MESSAGES = {
|
|
|
393
405
|
// src/constants/messages/completion.ts
|
|
394
406
|
var COMPLETION_MESSAGES = {
|
|
395
407
|
/** completion 命令的主描述 */
|
|
396
|
-
COMPLETION_COMMAND_DESC: "\
|
|
408
|
+
COMPLETION_COMMAND_DESC: "\u4E3A\u7EC8\u7AEF\u63D0\u4F9B shell \u81EA\u52A8\u8865\u5168\u529F\u80FD\uFF08bash/zsh\uFF09",
|
|
397
409
|
/** bash 子命令描述 */
|
|
398
410
|
COMPLETION_BASH_DESC: "\u8F93\u51FA bash \u81EA\u52A8\u8865\u5168\u811A\u672C",
|
|
399
411
|
/** zsh 子命令描述 */
|
|
@@ -412,6 +424,22 @@ var COMPLETION_MESSAGES = {
|
|
|
412
424
|
COMPLETION_INSTALL_WRITE_ERROR: (filePath) => `\u65E0\u6CD5\u5199\u5165\u6587\u4EF6 ${filePath}\uFF0C\u8BF7\u68C0\u67E5\u6587\u4EF6\u6743\u9650\u6216\u624B\u52A8\u914D\u7F6E\u3002`
|
|
413
425
|
};
|
|
414
426
|
|
|
427
|
+
// src/constants/messages/init.ts
|
|
428
|
+
var INIT_MESSAGES = {
|
|
429
|
+
/** init 成功 */
|
|
430
|
+
INIT_SUCCESS: (branch) => `\u2713 \u9879\u76EE\u521D\u59CB\u5316\u6210\u529F\uFF0C\u4E3B\u5DE5\u4F5C\u5206\u652F\u8BBE\u7F6E\u4E3A: ${branch}`,
|
|
431
|
+
/** init 更新 */
|
|
432
|
+
INIT_UPDATED: (oldBranch, newBranch) => `\u2713 \u5DF2\u5C06\u4E3B\u5DE5\u4F5C\u5206\u652F\u4ECE ${oldBranch} \u66F4\u65B0\u4E3A ${newBranch}`,
|
|
433
|
+
/** init show 查看当前项目完整配置(JSON 格式) */
|
|
434
|
+
INIT_SHOW: (configJson) => `${configJson}`,
|
|
435
|
+
/** init 未初始化 */
|
|
436
|
+
INIT_NOT_INITIALIZED: "\u9879\u76EE\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u6267\u884C clawt init \u8BBE\u7F6E\u4E3B\u5DE5\u4F5C\u5206\u652F",
|
|
437
|
+
/** 项目未初始化(requireProjectConfig 使用) */
|
|
438
|
+
PROJECT_NOT_INITIALIZED: "\u9879\u76EE\u5C1A\u672A\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u6267\u884C clawt init \u8BBE\u7F6E\u4E3B\u5DE5\u4F5C\u5206\u652F",
|
|
439
|
+
/** 项目配置缺少 clawtMainWorkBranch 字段 */
|
|
440
|
+
PROJECT_CONFIG_MISSING_BRANCH: "\u9879\u76EE\u914D\u7F6E\u7F3A\u5C11\u4E3B\u5DE5\u4F5C\u5206\u652F\u4FE1\u606F\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C clawt init \u8BBE\u7F6E\u4E3B\u5DE5\u4F5C\u5206\u652F"
|
|
441
|
+
};
|
|
442
|
+
|
|
415
443
|
// src/constants/messages/index.ts
|
|
416
444
|
var MESSAGES = {
|
|
417
445
|
...COMMON_MESSAGES,
|
|
@@ -427,7 +455,8 @@ var MESSAGES = {
|
|
|
427
455
|
...STATUS_MESSAGES,
|
|
428
456
|
...ALIAS_MESSAGES,
|
|
429
457
|
...PROJECTS_MESSAGES,
|
|
430
|
-
...COMPLETION_MESSAGES
|
|
458
|
+
...COMPLETION_MESSAGES,
|
|
459
|
+
...INIT_MESSAGES
|
|
431
460
|
};
|
|
432
461
|
|
|
433
462
|
// src/constants/terminal.ts
|
package/docs/alias.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
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`、`merge`、`config`、`sync`、`reset`、`status`、`alias`、`projects`、`completion`、`init`)。如果用户尝试设置与内置命令同名的别名,输出错误提示并返回
|
|
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
|
+
---
|
|
@@ -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,43 @@
|
|
|
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
|
+
"aliases": {},
|
|
26
|
+
"autoUpdate": true
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**配置项说明:**
|
|
31
|
+
|
|
32
|
+
| 配置项 | 类型 | 默认值 | 说明 |
|
|
33
|
+
| ------------------ | --------- | --------- | -------------------------------------------------- |
|
|
34
|
+
| `autoDeleteBranch` | `boolean` | `false` | 移除 worktree 时是否自动删除对应本地分支(无需每次确认);merge 成功后是否自动清理 worktree 和分支;run 任务被中断(Ctrl+C)后是否自动清理本次创建的 worktree 和分支 |
|
|
35
|
+
| `claudeCodeCommand` | `string` | `"claude"` | Claude Code CLI 启动指令,用于 `clawt run` 不传 `--tasks` 时和 `clawt resume` 在 worktree 中打开交互式界面 |
|
|
36
|
+
| `autoPullPush` | `boolean` | `false` | merge 成功后是否自动执行 git pull 和 git push |
|
|
37
|
+
| `confirmDestructiveOps` | `boolean` | `true` | 执行破坏性操作(reset、validate --clean)前是否提示确认 |
|
|
38
|
+
| `maxConcurrency` | `number` | `0` | run 命令默认最大并发数,`0` 表示不限制 |
|
|
39
|
+
| `terminalApp` | `string` | `"auto"` | 批量 resume 使用的终端应用:`auto`(自动检测)、`iterm2`、`terminal`(macOS) |
|
|
40
|
+
| `aliases` | `Record<string, string>` | `{}` | 命令别名映射,键为别名,值为目标内置命令名 |
|
|
41
|
+
| `autoUpdate` | `boolean` | `true` | 是否启用自动更新检查(每 24 小时通过 npm registry 检查一次新版本) |
|
|
42
|
+
|
|
43
|
+
---
|
package/docs/config.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
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
|
+
- `saveConfig(config)`:`src/utils/config.ts` 中新增的通用配置写入函数,将完整配置对象持久化到文件
|
|
89
|
+
- `formatConfigValue(value)`:支持 boolean(绿色/黄色)和 string/number(青色)的格式化显示。对象类型配置项(如 `aliases`)在交互式列表中通过 `JSON.stringify` 以暗淡色显示
|
|
90
|
+
|
|
91
|
+
---
|
package/docs/create.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
### 5.1 批量创建 Worktree(Worktree 对应分支)
|
|
2
|
+
|
|
3
|
+
**命令:**
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
clawt create -b <branchName> [-n <count>]
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**参数:**
|
|
10
|
+
|
|
11
|
+
| 参数 | 必填 | 说明 |
|
|
12
|
+
| ---- | ---- | ----------------------------------------------------- |
|
|
13
|
+
| `-b` | 是 | 分支名 |
|
|
14
|
+
| `-n` | 否 | 需要创建的 worktree 数量,默认 `1` |
|
|
15
|
+
|
|
16
|
+
**运行流程:**
|
|
17
|
+
|
|
18
|
+
1. **主 worktree 校验** (2.1)
|
|
19
|
+
2. **确保在主工作分支上**(`ensureOnMainWorkBranch`):在创建 worktree 之前,确保当前处于配置的主工作分支(`clawtMainWorkBranch`)上。
|
|
20
|
+
- 如果当前分支**是** `clawtMainWorkBranch`,正常继续
|
|
21
|
+
- 如果当前在**验证分支**(`clawt-validate-` 前缀)上:
|
|
22
|
+
- 验证分支上的修改视为可丢弃的临时状态
|
|
23
|
+
- 如果工作区有未提交更改,自动执行 `git reset --hard HEAD && git clean -fd` 清理;若已干净则跳过清理
|
|
24
|
+
- 然后自动切换到主工作分支,继续创建流程
|
|
25
|
+
- 如果当前在**其他普通分支**上:
|
|
26
|
+
- 如果工作区有未提交的更改,提供交互式选择(避免将修改意外带到主工作分支上):
|
|
27
|
+
```
|
|
28
|
+
⚠ 当前分支有未提交的更改,请选择处理方式:
|
|
29
|
+
|
|
30
|
+
❯ reset - 丢弃所有更改 (git reset --hard HEAD && git clean -fd)
|
|
31
|
+
stash - 暂存更改 (git add . && git stash)
|
|
32
|
+
exit - 退出,手动处理
|
|
33
|
+
```
|
|
34
|
+
- 选择 reset → 执行 `git reset --hard HEAD && git clean -fd`
|
|
35
|
+
- 选择 stash → 执行 `git add . && git stash push -m "clawt:auto-stash"`
|
|
36
|
+
- 选择 exit → 抛出错误退出
|
|
37
|
+
- 处理完成后再次校验工作区是否干净,不干净则报错退出
|
|
38
|
+
- 执行 `git checkout <clawtMainWorkBranch>`,然后继续创建流程
|
|
39
|
+
3. **创建数量校验**:校验 `-n` 参数必须为正整数,否则报错 `无效的创建数量: "<value>",请输入正整数`
|
|
40
|
+
4. **分支名合法性校验与转换** (2.3)
|
|
41
|
+
5. **分支名存在性校验** (2.4)
|
|
42
|
+
- 若 `n = 1`:校验 `branchName`
|
|
43
|
+
- 若 `n > 1`:校验 `branchName-1` 到 `branchName-n`
|
|
44
|
+
- 所有分支名在创建任何 worktree **之前**完成全部校验
|
|
45
|
+
6. **批量创建 worktree + 验证分支**
|
|
46
|
+
- 若 `n = 1`:
|
|
47
|
+
```bash
|
|
48
|
+
git worktree add -b <branchName> ~/.clawt/worktrees/<project>/<branchName>
|
|
49
|
+
git branch clawt-validate-<branchName>
|
|
50
|
+
```
|
|
51
|
+
- 若 `n > 1`:
|
|
52
|
+
```bash
|
|
53
|
+
git worktree add -b <branchName>-1 ~/.clawt/worktrees/<project>/<branchName>-1
|
|
54
|
+
git branch clawt-validate-<branchName>-1
|
|
55
|
+
git worktree add -b <branchName>-2 ~/.clawt/worktrees/<project>/<branchName>-2
|
|
56
|
+
git branch clawt-validate-<branchName>-2
|
|
57
|
+
...
|
|
58
|
+
git worktree add -b <branchName>-n ~/.clawt/worktrees/<project>/<branchName>-n
|
|
59
|
+
git branch clawt-validate-<branchName>-n
|
|
60
|
+
```
|
|
61
|
+
7. **输出创建日志**
|
|
62
|
+
|
|
63
|
+
**输出格式:**
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
✓ 已创建 3 个 worktree
|
|
67
|
+
|
|
68
|
+
目录路径1:
|
|
69
|
+
~/.clawt/worktrees/main-project/feature-scheme-1
|
|
70
|
+
分支名: feature-scheme-1
|
|
71
|
+
验证分支: clawt-validate-feature-scheme-1
|
|
72
|
+
────────────────────────────────────────
|
|
73
|
+
目录路径2:
|
|
74
|
+
~/.clawt/worktrees/main-project/feature-scheme-2
|
|
75
|
+
分支名: feature-scheme-2
|
|
76
|
+
验证分支: clawt-validate-feature-scheme-2
|
|
77
|
+
────────────────────────────────────────
|
|
78
|
+
目录路径3:
|
|
79
|
+
~/.clawt/worktrees/main-project/feature-scheme-3
|
|
80
|
+
分支名: feature-scheme-3
|
|
81
|
+
验证分支: clawt-validate-feature-scheme-3
|
|
82
|
+
────────────────────────────────────────
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
package/docs/init.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
### 5.19 初始化项目级配置
|
|
2
|
+
|
|
3
|
+
**命令:**
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
# 设置主工作分支(使用当前分支)
|
|
7
|
+
clawt init
|
|
8
|
+
|
|
9
|
+
# 设置主工作分支(指定分支名)
|
|
10
|
+
clawt init -b <branchName>
|
|
11
|
+
|
|
12
|
+
# 查看当前项目的 init 配置
|
|
13
|
+
clawt init show
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
**参数:**
|
|
17
|
+
|
|
18
|
+
| 参数/子命令 | 必填 | 说明 |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| `-b` | 否 | 指定主工作分支名。不传则使用当前分支 |
|
|
21
|
+
| `show` | 否 | 查看当前项目的 init 配置 |
|
|
22
|
+
|
|
23
|
+
**功能说明:**
|
|
24
|
+
|
|
25
|
+
初始化项目级配置,将指定分支记录为该项目的主工作分支(`clawtMainWorkBranch`)。该配置用于 `create` / `run` 时检测当前分支是否为主工作分支,并在偏离时提醒用户。详见 [2.6 项目级配置](#26-项目级配置)。
|
|
26
|
+
|
|
27
|
+
**运行流程(设置模式):**
|
|
28
|
+
|
|
29
|
+
1. **主 worktree 校验** (2.1)
|
|
30
|
+
2. **确定主工作分支名**:
|
|
31
|
+
- 传了 `-b` → 使用指定的分支名
|
|
32
|
+
- 未传 `-b` → 使用当前分支名(`git rev-parse --abbrev-ref HEAD`)
|
|
33
|
+
3. **写入项目级配置**:将 `clawtMainWorkBranch` 写入 `~/.clawt/projects/<projectName>/config.json`
|
|
34
|
+
- 配置文件不存在 → 创建
|
|
35
|
+
- 配置文件已存在 → 覆盖整个配置文件内容
|
|
36
|
+
4. **输出成功提示**
|
|
37
|
+
|
|
38
|
+
**运行流程(show 模式):**
|
|
39
|
+
|
|
40
|
+
1. **主 worktree 校验** (2.1)
|
|
41
|
+
2. **读取项目级配置**:读取 `~/.clawt/projects/<projectName>/config.json`
|
|
42
|
+
- 配置不存在 → 抛出错误 `项目尚未初始化,请先执行 clawt init 设置主工作分支`
|
|
43
|
+
- 配置存在 → 以 JSON 格式输出配置内容
|
|
44
|
+
|
|
45
|
+
**输出格式:**
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
# 首次初始化
|
|
49
|
+
✓ 项目初始化成功,主工作分支设置为: main
|
|
50
|
+
|
|
51
|
+
# 更新已有配置
|
|
52
|
+
✓ 已将主工作分支从 develop 更新为 main
|
|
53
|
+
|
|
54
|
+
# show 查看配置(JSON 格式输出)
|
|
55
|
+
{
|
|
56
|
+
"clawtMainWorkBranch": "main"
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# show 未初始化(抛出错误)
|
|
60
|
+
项目尚未初始化,请先执行 clawt init 设置主工作分支
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**重复执行:** 支持重复执行,后一次覆盖前一次的配置。
|
|
64
|
+
|
|
65
|
+
---
|
package/docs/list.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
### 5.8 获取当前项目所有 Worktree
|
|
2
|
+
|
|
3
|
+
**命令:**
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
clawt list [--json]
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
**参数:**
|
|
10
|
+
|
|
11
|
+
| 参数 | 必填 | 说明 |
|
|
12
|
+
| -------- | ---- | ---------------------------------------- |
|
|
13
|
+
| `--json` | 否 | 以 JSON 格式输出(仅包含 path 和 branch) |
|
|
14
|
+
|
|
15
|
+
**运行流程:**
|
|
16
|
+
|
|
17
|
+
1. **主 worktree 校验** (2.1)
|
|
18
|
+
2. **获取项目名** (2.2)
|
|
19
|
+
3. 扫描 `~/.clawt/worktrees/<project>/` 目录
|
|
20
|
+
4. 对每个子目录,验证是否为有效的 git worktree(`git worktree list` 交叉验证)
|
|
21
|
+
5. 根据 `--json` 选项决定输出格式:
|
|
22
|
+
- 指定 `--json` → 以 JSON 格式输出
|
|
23
|
+
- 未指定 → 以文本格式输出
|
|
24
|
+
|
|
25
|
+
**文本输出格式(默认):**
|
|
26
|
+
|
|
27
|
+
每个 worktree 会显示路径、分支名和变更状态。每个 worktree 条目下方额外显示一行状态信息(提交数、变更行数、未提交修改),各条目之间以空行分隔。如果某个 worktree 处于空闲状态(0 个提交、无变更、无未提交修改),其路径会以橙色高亮显示,方便用户快速识别可能需要清理或还未开始工作的 worktree。
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
当前项目: main-project
|
|
31
|
+
|
|
32
|
+
~/.clawt/worktrees/main-project/feature-scheme-1 [feature-scheme-1]
|
|
33
|
+
~/.clawt/worktrees/main-project/feature-scheme-2 [feature-scheme-2]
|
|
34
|
+
~/.clawt/worktrees/main-project/feature-scheme-3 [feature-scheme-3]
|
|
35
|
+
~/.clawt/worktrees/main-project/bugfix-login [bugfix-login]
|
|
36
|
+
|
|
37
|
+
共 4 个 worktree
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
如果没有 worktree:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
当前项目: main-project
|
|
44
|
+
|
|
45
|
+
(无 worktree)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**JSON 输出格式(`--json`):**
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"project": "main-project",
|
|
53
|
+
"total": 4,
|
|
54
|
+
"worktrees": [
|
|
55
|
+
{
|
|
56
|
+
"path": "~/.clawt/worktrees/main-project/feature-scheme-1",
|
|
57
|
+
"branch": "feature-scheme-1"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"path": "~/.clawt/worktrees/main-project/feature-scheme-2",
|
|
61
|
+
"branch": "feature-scheme-2"
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
---
|
package/docs/log.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
### 5.9 日志系统
|
|
2
|
+
|
|
3
|
+
**日志目录:** `~/.clawt/logs/`
|
|
4
|
+
|
|
5
|
+
**日志文件命名:** `clawt-YYYY-MM-DD.log`(按日期滚动)
|
|
6
|
+
|
|
7
|
+
**日志级别:**
|
|
8
|
+
|
|
9
|
+
| 级别 | 说明 | 使用场景 |
|
|
10
|
+
| ------- | ------------------ | -------------------------------------- |
|
|
11
|
+
| `debug` | 调试信息 | Git 命令执行详情、变量值等 |
|
|
12
|
+
| `info` | 一般信息 | 操作开始/完成、创建/移除 worktree 等 |
|
|
13
|
+
| `warn` | 警告信息 | 分支名被转换、非致命异常等 |
|
|
14
|
+
| `error` | 错误信息 | 命令执行失败、校验不通过等 |
|
|
15
|
+
|
|
16
|
+
**实现方案:** 使用 `winston` + `winston-daily-rotate-file` 库。
|
|
17
|
+
|
|
18
|
+
**日志格式:**
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
[2025-02-06 14:30:22] [INFO ] 创建 worktree: ~/.clawt/worktrees/main-project/feature-scheme-1
|
|
22
|
+
[2025-02-06 14:30:22] [DEBUG] 执行命令: git worktree add -b feature-scheme-1 ~/.clawt/worktrees/main-project/feature-scheme-1
|
|
23
|
+
[2025-02-06 14:30:23] [WARN ] 分支名已转换: feature/a.b → feature-a-b
|
|
24
|
+
[2025-02-06 14:30:25] [ERROR] 分支 feature-scheme-1 已存在,无法创建
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**保留策略:**
|
|
28
|
+
|
|
29
|
+
- 日志文件保留 30 天
|
|
30
|
+
- 单个日志文件最大 10MB
|
|
31
|
+
|
|
32
|
+
#### `--debug` 控制台调试输出
|
|
33
|
+
|
|
34
|
+
通过全局选项 `--debug` 可将调试日志实时输出到终端,方便排查问题。
|
|
35
|
+
|
|
36
|
+
**实现机制:**
|
|
37
|
+
|
|
38
|
+
- 在 Commander.js 的 `preAction` 钩子中检测 `--debug` 选项,按需调用 `enableConsoleTransport()` 函数
|
|
39
|
+
- `enableConsoleTransport()` 动态向 winston 实例添加 `Console` transport(level 为 `debug`),该函数幂等,多次调用不会重复添加 transport
|
|
40
|
+
- 相关常量定义在 `src/constants/logger.ts`:
|
|
41
|
+
- `DEBUG_TIMESTAMP_FORMAT`:时间戳格式(`HH:mm:ss.SSS`,精简,不含日期)
|
|
42
|
+
|
|
43
|
+
**控制台日志格式:**
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
HH:mm:ss.SSS LEVEL 消息内容
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**日志级别颜色映射:**
|
|
50
|
+
|
|
51
|
+
| 级别 | 颜色 |
|
|
52
|
+
| ------- | ------ |
|
|
53
|
+
| `error` | 红色 |
|
|
54
|
+
| `warn` | 黄色 |
|
|
55
|
+
| `info` | 青色 |
|
|
56
|
+
| `debug` | 灰色 |
|
|
57
|
+
|
|
58
|
+
**使用示例:**
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
clawt run -b feature-login --debug
|
|
62
|
+
clawt validate -b feature-scheme --debug
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
> **注意:** `--debug` 选项不影响文件日志(file transport),文件日志始终按原有策略写入。控制台输出仅在传入 `--debug` 时启用。
|
|
66
|
+
|
|
67
|
+
---
|