clawt 3.2.0 → 3.2.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.
package/dist/index.js CHANGED
@@ -299,7 +299,11 @@ ${failures.map((f) => ` \u2717 ${f.path}: ${f.error}`).join("\n")}`,
299
299
  /** 用户选择保留本地分支 */
300
300
  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",
301
301
  /** 确认删除本地分支和验证分支 */
302
- REMOVE_CONFIRM_DELETE_BRANCHES: "\u662F\u5426\u540C\u65F6\u5220\u9664\u5BF9\u5E94\u7684\u672C\u5730\u5206\u652F\u548C\u9A8C\u8BC1\u5206\u652F\uFF1F"
302
+ REMOVE_CONFIRM_DELETE_BRANCHES: "\u662F\u5426\u540C\u65F6\u5220\u9664\u5BF9\u5E94\u7684\u672C\u5730\u5206\u652F\u548C\u9A8C\u8BC1\u5206\u652F\uFF1F",
303
+ /** 待移除的 worktree 的分支是主 worktree 当前所在分支 */
304
+ REMOVE_BRANCH_IS_CURRENT: (branch) => `\u65E0\u6CD5\u79FB\u9664\uFF1A\u5206\u652F ${branch} \u662F\u4E3B worktree \u5F53\u524D\u6240\u5728\u5206\u652F\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5206\u652F\u540E\u518D\u79FB\u9664`,
305
+ /** 待移除的 worktree 对应的验证分支是主 worktree 当前所在分支 */
306
+ REMOVE_VALIDATE_BRANCH_IS_CURRENT: (branch, validateBranch) => `\u65E0\u6CD5\u79FB\u9664\uFF1A\u5206\u652F ${branch} \u7684\u9A8C\u8BC1\u5206\u652F ${validateBranch} \u662F\u4E3B worktree \u5F53\u524D\u6240\u5728\u5206\u652F\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5206\u652F\u540E\u518D\u79FB\u9664`
303
307
  };
304
308
 
305
309
  // src/constants/messages/reset.ts
@@ -3811,6 +3815,16 @@ async function handleRemove(options) {
3811
3815
  printInfo(MESSAGES.NO_WORKTREES);
3812
3816
  return;
3813
3817
  }
3818
+ const currentBranch = getCurrentBranch();
3819
+ for (const wt of worktreesToRemove) {
3820
+ if (wt.branch === currentBranch) {
3821
+ throw new ClawtError(MESSAGES.REMOVE_BRANCH_IS_CURRENT(wt.branch));
3822
+ }
3823
+ const validateBranch = getValidateBranchName(wt.branch);
3824
+ if (validateBranch === currentBranch) {
3825
+ throw new ClawtError(MESSAGES.REMOVE_VALIDATE_BRANCH_IS_CURRENT(wt.branch, validateBranch));
3826
+ }
3827
+ }
3814
3828
  printInfo("\u5373\u5C06\u79FB\u9664\u4EE5\u4E0B worktree \u53CA\u672C\u5730\u5206\u652F\uFF1A\n");
3815
3829
  worktreesToRemove.forEach((wt, index) => {
3816
3830
  printInfo(` ${index + 1}. ${wt.path} \u2192 \u5206\u652F: ${wt.branch} \u9A8C\u8BC1\u5206\u652F: ${getValidateBranchName(wt.branch)}`);
@@ -290,7 +290,11 @@ ${failures.map((f) => ` \u2717 ${f.path}: ${f.error}`).join("\n")}`,
290
290
  /** 用户选择保留本地分支 */
291
291
  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",
292
292
  /** 确认删除本地分支和验证分支 */
293
- REMOVE_CONFIRM_DELETE_BRANCHES: "\u662F\u5426\u540C\u65F6\u5220\u9664\u5BF9\u5E94\u7684\u672C\u5730\u5206\u652F\u548C\u9A8C\u8BC1\u5206\u652F\uFF1F"
293
+ REMOVE_CONFIRM_DELETE_BRANCHES: "\u662F\u5426\u540C\u65F6\u5220\u9664\u5BF9\u5E94\u7684\u672C\u5730\u5206\u652F\u548C\u9A8C\u8BC1\u5206\u652F\uFF1F",
294
+ /** 待移除的 worktree 的分支是主 worktree 当前所在分支 */
295
+ REMOVE_BRANCH_IS_CURRENT: (branch) => `\u65E0\u6CD5\u79FB\u9664\uFF1A\u5206\u652F ${branch} \u662F\u4E3B worktree \u5F53\u524D\u6240\u5728\u5206\u652F\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5206\u652F\u540E\u518D\u79FB\u9664`,
296
+ /** 待移除的 worktree 对应的验证分支是主 worktree 当前所在分支 */
297
+ REMOVE_VALIDATE_BRANCH_IS_CURRENT: (branch, validateBranch) => `\u65E0\u6CD5\u79FB\u9664\uFF1A\u5206\u652F ${branch} \u7684\u9A8C\u8BC1\u5206\u652F ${validateBranch} \u662F\u4E3B worktree \u5F53\u524D\u6240\u5728\u5206\u652F\uFF0C\u8BF7\u5148\u5207\u6362\u5230\u5176\u4ED6\u5206\u652F\u540E\u518D\u79FB\u9664`
294
298
  };
295
299
 
296
300
  // src/constants/messages/reset.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clawt",
3
- "version": "3.2.0",
3
+ "version": "3.2.1",
4
4
  "description": "本地并行执行多个Claude Code Agent任务,融合 Git Worktree 与 Claude Code CLI 的命令行工具",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,6 +24,7 @@ import {
24
24
  getValidateBranchName,
25
25
  deleteValidateBranch,
26
26
  requireProjectConfig,
27
+ getCurrentBranch,
27
28
  } from '../utils/index.js';
28
29
  import type { WorktreeMultiResolveMessages } from '../utils/index.js';
29
30
 
@@ -77,6 +78,18 @@ async function handleRemove(options: RemoveOptions): Promise<void> {
77
78
  return;
78
79
  }
79
80
 
81
+ // 检查待移除的分支是否是主 worktree 当前所在分支
82
+ const currentBranch = getCurrentBranch();
83
+ for (const wt of worktreesToRemove) {
84
+ if (wt.branch === currentBranch) {
85
+ throw new ClawtError(MESSAGES.REMOVE_BRANCH_IS_CURRENT(wt.branch));
86
+ }
87
+ const validateBranch = getValidateBranchName(wt.branch);
88
+ if (validateBranch === currentBranch) {
89
+ throw new ClawtError(MESSAGES.REMOVE_VALIDATE_BRANCH_IS_CURRENT(wt.branch, validateBranch));
90
+ }
91
+ }
92
+
80
93
  // 列出即将移除的 worktree
81
94
  printInfo('即将移除以下 worktree 及本地分支:\n');
82
95
  worktreesToRemove.forEach((wt, index) => {
@@ -16,4 +16,10 @@ export const REMOVE_MESSAGES = {
16
16
  REMOVE_BRANCHES_KEPT: '已保留本地分支,可稍后使用 git branch -D <分支名> 手动删除',
17
17
  /** 确认删除本地分支和验证分支 */
18
18
  REMOVE_CONFIRM_DELETE_BRANCHES: '是否同时删除对应的本地分支和验证分支?',
19
+ /** 待移除的 worktree 的分支是主 worktree 当前所在分支 */
20
+ REMOVE_BRANCH_IS_CURRENT: (branch: string) =>
21
+ `无法移除:分支 ${branch} 是主 worktree 当前所在分支,请先切换到其他分支后再移除`,
22
+ /** 待移除的 worktree 对应的验证分支是主 worktree 当前所在分支 */
23
+ REMOVE_VALIDATE_BRANCH_IS_CURRENT: (branch: string, validateBranch: string) =>
24
+ `无法移除:分支 ${branch} 的验证分支 ${validateBranch} 是主 worktree 当前所在分支,请先切换到其他分支后再移除`,
19
25
  } as const;
@@ -25,6 +25,10 @@ vi.mock('../../../src/constants/index.js', () => ({
25
25
  REMOVE_MULTIPLE_MATCHES: (name: string) => `"${name}" 匹配到多个分支`,
26
26
  REMOVE_NO_MATCH: (name: string, branches: string[]) => `未找到与 "${name}" 匹配的分支,可用:${branches.join(', ')}`,
27
27
  REMOVE_BRANCHES_KEPT: '已保留本地分支,可稍后使用 git branch -D <分支名> 手动删除',
28
+ REMOVE_BRANCH_IS_CURRENT: (branch: string) =>
29
+ `无法移除:分支 ${branch} 是主 worktree 当前所在分支,请先切换到其他分支后再移除`,
30
+ REMOVE_VALIDATE_BRANCH_IS_CURRENT: (branch: string, validateBranch: string) =>
31
+ `无法移除:分支 ${branch} 的验证分支 ${validateBranch} 是主 worktree 当前所在分支,请先切换到其他分支后再移除`,
28
32
  },
29
33
  }));
30
34
 
@@ -49,6 +53,7 @@ vi.mock('../../../src/utils/index.js', () => ({
49
53
  requireProjectConfig: vi.fn().mockReturnValue({ clawtMainWorkBranch: 'main' }),
50
54
  getValidateBranchName: vi.fn((name: string) => `clawt-validate-${name}`),
51
55
  deleteValidateBranch: vi.fn(),
56
+ getCurrentBranch: vi.fn(),
52
57
  }));
53
58
 
54
59
  import { registerRemoveCommand } from '../../../src/commands/remove.js';
@@ -66,6 +71,7 @@ import {
66
71
  printError,
67
72
  printHint,
68
73
  resolveTargetWorktrees,
74
+ getCurrentBranch,
69
75
  } from '../../../src/utils/index.js';
70
76
 
71
77
  const mockedGetProjectName = vi.mocked(getProjectName);
@@ -80,6 +86,7 @@ const mockedPrintSuccess = vi.mocked(printSuccess);
80
86
  const mockedPrintError = vi.mocked(printError);
81
87
  const mockedPrintHint = vi.mocked(printHint);
82
88
  const mockedResolveTargetWorktrees = vi.mocked(resolveTargetWorktrees);
89
+ const mockedGetCurrentBranch = vi.mocked(getCurrentBranch);
83
90
 
84
91
  beforeEach(() => {
85
92
  vi.mocked(validateMainWorktree).mockReset();
@@ -95,6 +102,8 @@ beforeEach(() => {
95
102
  mockedPrintError.mockReset();
96
103
  mockedPrintHint.mockReset();
97
104
  mockedResolveTargetWorktrees.mockReset();
105
+ mockedGetCurrentBranch.mockReset();
106
+ mockedGetCurrentBranch.mockReturnValue('main');
98
107
  });
99
108
 
100
109
  describe('registerRemoveCommand', () => {