clawt 3.9.2 → 3.9.4
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/dist/index.js
CHANGED
|
@@ -655,7 +655,7 @@ var PANEL_NOT_TTY = "\u4EA4\u4E92\u5F0F\u9762\u677F\u9700\u8981 TTY \u7EC8\u7AEF
|
|
|
655
655
|
var PANEL_TITLE = (projectName) => chalk.bold.cyan(`\u9879\u76EE\u72B6\u6001\u603B\u89C8: ${projectName}`);
|
|
656
656
|
var PANEL_CONFIGURED_BRANCH = (branchName) => chalk.gray(`\u4E3B\u5DE5\u4F5C\u5206\u652F: ${branchName}`);
|
|
657
657
|
var PANEL_CONFIGURED_BRANCH_DELETED = (branchName) => chalk.red(`\u2717 \u4E3B\u5DE5\u4F5C\u5206\u652F: ${branchName}\uFF08\u5DF2\u4E0D\u5B58\u5728\uFF09`);
|
|
658
|
-
var PANEL_CONFIGURED_BRANCH_MISMATCH = (branchName) => chalk.
|
|
658
|
+
var PANEL_CONFIGURED_BRANCH_MISMATCH = (branchName) => chalk.red(`\u26A0 \u4E3B\u5DE5\u4F5C\u5206\u652F: ${branchName}\uFF08\u4E0D\u4E00\u81F4\uFF09`);
|
|
659
659
|
var PANEL_NOT_INITIALIZED = chalk.gray("\u672A\u521D\u59CB\u5316\uFF08\u6267\u884C clawt init \u8BBE\u7F6E\u4E3B\u5DE5\u4F5C\u5206\u652F\uFF09");
|
|
660
660
|
var PANEL_UNKNOWN_DATE = "\u672A\u77E5\u65E5\u671F";
|
|
661
661
|
var PANEL_SYNCED_WITH_MAIN = "\u4E0E\u4E3B\u5206\u652F\u540C\u6B65";
|
|
@@ -999,9 +999,14 @@ import { execSync as execSync2, execFileSync, spawn, spawnSync } from "child_pro
|
|
|
999
999
|
import { join as join2, isAbsolute } from "path";
|
|
1000
1000
|
import { execSync } from "child_process";
|
|
1001
1001
|
var INDEX_LOCK_ERROR_PATTERNS = [
|
|
1002
|
+
// 英文错误消息
|
|
1002
1003
|
/Unable to write.*index/i,
|
|
1003
1004
|
/index\.lock/i,
|
|
1004
|
-
/Unable to create.*index/i
|
|
1005
|
+
/Unable to create.*index/i,
|
|
1006
|
+
// 中文错误消息(Git 本地化)
|
|
1007
|
+
/不能写入索引/,
|
|
1008
|
+
/无法写入.*索引/,
|
|
1009
|
+
/无法创建.*index/i
|
|
1005
1010
|
];
|
|
1006
1011
|
var INDEX_LOCK_PATH_EXTRACT_PATTERN = /'([^']*index\.lock)'/;
|
|
1007
1012
|
function isGitIndexLockError(errorMessage) {
|
|
@@ -5592,7 +5597,7 @@ function printMainSection(main2) {
|
|
|
5592
5597
|
if (main2.configuredBranchExists === false) {
|
|
5593
5598
|
printInfo(` ${chalk11.red(MESSAGES.STATUS_CONFIGURED_BRANCH_DELETED(main2.configuredMainBranch))}`);
|
|
5594
5599
|
} else if (main2.branch !== main2.configuredMainBranch && !main2.branch.startsWith(VALIDATE_BRANCH_PREFIX)) {
|
|
5595
|
-
printInfo(` ${chalk11.
|
|
5600
|
+
printInfo(` ${chalk11.red(MESSAGES.STATUS_CONFIGURED_BRANCH_MISMATCH(main2.configuredMainBranch))}`);
|
|
5596
5601
|
} else {
|
|
5597
5602
|
printInfo(` ${chalk11.gray(MESSAGES.STATUS_CONFIGURED_BRANCH(main2.configuredMainBranch))}`);
|
|
5598
5603
|
}
|
package/docs/status.md
CHANGED
|
@@ -50,7 +50,7 @@ clawt status [--json] [-i | --interactive]
|
|
|
50
50
|
|
|
51
51
|
主 Worktree 区块会显示配置的主工作分支信息,根据状态有以下三种展示:
|
|
52
52
|
- **正常**(灰色):`主工作分支: <branchName>`
|
|
53
|
-
-
|
|
53
|
+
- **当前分支不一致**(红色):`⚠ 主工作分支: <branchName>(当前分支不一致,如需更新请执行 clawt init)`
|
|
54
54
|
- **分支已不存在**(红色):`✗ 主工作分支: <branchName>(已不存在,请执行 clawt init 重新设置)`
|
|
55
55
|
|
|
56
56
|
注意:当项目未初始化(`configuredMainBranch` 为 null)时不展示配置分支信息;当主 worktree 当前处于验证分支(`VALIDATE_BRANCH_PREFIX` 前缀)时不显示不一致警告。
|
|
@@ -184,7 +184,7 @@ clawt status [--json] [-i | --interactive]
|
|
|
184
184
|
- `STATUS_SNAPSHOT_ORPHANED(count)`:孤立快照警告(接受数量参数)
|
|
185
185
|
- `STATUS_CONFIGURED_BRANCH(branchName)`:配置的主工作分支(正常状态,灰色)
|
|
186
186
|
- `STATUS_CONFIGURED_BRANCH_DELETED(branchName)`:配置的主工作分支已不存在(红色)
|
|
187
|
-
- `STATUS_CONFIGURED_BRANCH_MISMATCH(branchName)
|
|
187
|
+
- `STATUS_CONFIGURED_BRANCH_MISMATCH(branchName)`:当前分支与配置不一致(红色)
|
|
188
188
|
- `getWorktreeCreatedTime()` 工具函数(在 `src/utils/worktree-matcher.ts`),通过 `fs.statSync().birthtime` 获取 worktree 目录的创建时间,返回 ISO 8601 格式字符串或 null
|
|
189
189
|
- `getSnapshotModifiedTime()` 工具函数(在 `src/utils/validate-snapshot.ts`),通过 `fs.statSync` 获取快照文件的修改时间(mtime),返回 UTC 时区的 ISO 8601 格式字符串(`toISOString()` 格式)或 null
|
|
190
190
|
- `formatRelativeTime()` 格式化函数(在 `src/utils/formatter.ts`),将 ISO 8601 日期字符串转换为中文相对时间描述(如"3 天前"、"2 小时前"、"刚刚"),无效日期时返回 null
|
|
@@ -241,7 +241,7 @@ clawt status [--json] [-i | --interactive]
|
|
|
241
241
|
2. **配置分支信息行**:显示配置的主工作分支状态,有以下四种情况:
|
|
242
242
|
- 正常(灰色):`主工作分支: <branchName>`
|
|
243
243
|
- 分支已删除(红色):`✗ 主工作分支: <branchName>(已不存在)`
|
|
244
|
-
-
|
|
244
|
+
- 分支不一致(红色):`⚠ 主工作分支: <branchName>(不一致)`
|
|
245
245
|
- 未初始化(灰色):`未初始化(执行 clawt init 设置主工作分支)`
|
|
246
246
|
3. **工作区 diff 信息行**:显示主工作分支的工作区 diff 统计,有变更时格式为 `工作区: +N -M`(新增行数绿色,删除行数红色),无变更时显示 `工作区: 无变更`(绿色)
|
|
247
247
|
4. **顶部分隔线**:当存在向上溢出时,分隔线中间嵌入 `↑ 更多 worktree...` 提示
|
|
@@ -338,7 +338,7 @@ Worktree 按创建日期分组(复用 `groupWorktreesByDate()`),每组前
|
|
|
338
338
|
- `PANEL_TITLE(projectName)`:面板标题
|
|
339
339
|
- `PANEL_CONFIGURED_BRANCH(branchName)`:配置分支信息(正常状态,灰色)
|
|
340
340
|
- `PANEL_CONFIGURED_BRANCH_DELETED(branchName)`:配置分支信息(分支已删除,红色)
|
|
341
|
-
- `PANEL_CONFIGURED_BRANCH_MISMATCH(branchName)
|
|
341
|
+
- `PANEL_CONFIGURED_BRANCH_MISMATCH(branchName)`:配置分支信息(分支不一致,红色)
|
|
342
342
|
- `PANEL_NOT_INITIALIZED`:未初始化提示(灰色)
|
|
343
343
|
- `PanelLine` 接口(`src/utils/interactive-panel-render.ts`):面板行类型定义,包含 `type`(`'separator'` | `'worktree-content'`)、`text`、可选 `worktreeIndex`
|
|
344
344
|
- `collectStatus()` 函数已改为导出(`export`),以便 `InteractivePanel` 作为数据收集函数引用
|
package/package.json
CHANGED
package/src/commands/status.ts
CHANGED
|
@@ -272,7 +272,7 @@ function printMainSection(main: MainWorktreeStatus): void {
|
|
|
272
272
|
if (main.configuredBranchExists === false) {
|
|
273
273
|
printInfo(` ${chalk.red(MESSAGES.STATUS_CONFIGURED_BRANCH_DELETED(main.configuredMainBranch))}`);
|
|
274
274
|
} else if (main.branch !== main.configuredMainBranch && !main.branch.startsWith(VALIDATE_BRANCH_PREFIX)) {
|
|
275
|
-
printInfo(` ${chalk.
|
|
275
|
+
printInfo(` ${chalk.red(MESSAGES.STATUS_CONFIGURED_BRANCH_MISMATCH(main.configuredMainBranch))}`);
|
|
276
276
|
} else {
|
|
277
277
|
printInfo(` ${chalk.gray(MESSAGES.STATUS_CONFIGURED_BRANCH(main.configuredMainBranch))}`);
|
|
278
278
|
}
|
|
@@ -83,7 +83,7 @@ export const PANEL_CONFIGURED_BRANCH_DELETED = (branchName: string): string =>
|
|
|
83
83
|
* @returns {string} 格式化的分支信息
|
|
84
84
|
*/
|
|
85
85
|
export const PANEL_CONFIGURED_BRANCH_MISMATCH = (branchName: string): string =>
|
|
86
|
-
chalk.
|
|
86
|
+
chalk.red(`⚠ 主工作分支: ${branchName}(不一致)`);
|
|
87
87
|
|
|
88
88
|
/** 面板配置分支信息(未初始化) */
|
|
89
89
|
export const PANEL_NOT_INITIALIZED = chalk.gray('未初始化(执行 clawt init 设置主工作分支)');
|
package/src/utils/git-lock.ts
CHANGED
|
@@ -7,11 +7,17 @@ import { MESSAGES } from '../constants/index.js';
|
|
|
7
7
|
/**
|
|
8
8
|
* index.lock 错误的关键词匹配模式
|
|
9
9
|
* 每个模式同时要求包含 index 关键词,避免 "Unable to write" 单独匹配导致误报
|
|
10
|
+
* 同时支持英文和中文(Git 本地化)错误消息
|
|
10
11
|
*/
|
|
11
12
|
const INDEX_LOCK_ERROR_PATTERNS = [
|
|
13
|
+
// 英文错误消息
|
|
12
14
|
/Unable to write.*index/i,
|
|
13
15
|
/index\.lock/i,
|
|
14
16
|
/Unable to create.*index/i,
|
|
17
|
+
// 中文错误消息(Git 本地化)
|
|
18
|
+
/不能写入索引/,
|
|
19
|
+
/无法写入.*索引/,
|
|
20
|
+
/无法创建.*index/i,
|
|
15
21
|
];
|
|
16
22
|
|
|
17
23
|
/** 从 Git 错误消息中提取 index.lock 文件路径的正则(路径被 ASCII 单引号包裹) */
|
|
@@ -76,6 +76,18 @@ describe('isGitIndexLockError', () => {
|
|
|
76
76
|
it('大小写不敏感匹配 "unable to write"', () => {
|
|
77
77
|
expect(isGitIndexLockError('FATAL: UNABLE TO WRITE INDEX.')).toBe(true);
|
|
78
78
|
});
|
|
79
|
+
|
|
80
|
+
it('检测中文 "不能写入索引" 错误', () => {
|
|
81
|
+
expect(isGitIndexLockError('致命错误:不能写入索引。')).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('检测中文 "无法写入索引" 错误', () => {
|
|
85
|
+
expect(isGitIndexLockError('致命错误:无法写入新索引文件')).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('检测中文 "无法创建 index.lock" 错误', () => {
|
|
89
|
+
expect(isGitIndexLockError("致命错误:无法创建 '/repo/.git/index.lock':文件已存在")).toBe(true);
|
|
90
|
+
});
|
|
79
91
|
});
|
|
80
92
|
|
|
81
93
|
describe('findGitIndexLockPath', () => {
|