clawt 3.9.12 → 3.10.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/.clawt/postCreate.sh +0 -0
- package/README.md +3 -0
- package/README.zh-CN.md +3 -0
- package/dist/index.js +1936 -592
- package/dist/postinstall.js +1626 -283
- package/docs/config-file.md +2 -0
- package/docs/config.md +2 -1
- package/docs/init.md +3 -2
- package/docs/project-config.md +10 -1
- package/docs/spec.md +69 -2
- package/docs/status.md +2 -1
- package/package.json +12 -11
- package/scripts/release.sh +2 -2
- package/src/commands/alias.ts +5 -4
- package/src/commands/completion.ts +2 -1
- package/src/commands/config.ts +25 -7
- package/src/commands/cover-validate.ts +3 -2
- package/src/commands/create.ts +8 -7
- package/src/commands/home.ts +2 -1
- package/src/commands/init.ts +13 -6
- package/src/commands/list.ts +6 -4
- package/src/commands/merge.ts +8 -7
- package/src/commands/projects.ts +5 -3
- package/src/commands/remove.ts +7 -6
- package/src/commands/reset.ts +3 -2
- package/src/commands/resume.ts +10 -7
- package/src/commands/run.ts +8 -7
- package/src/commands/status.ts +16 -11
- package/src/commands/sync.ts +4 -3
- package/src/commands/tasks.ts +8 -6
- package/src/commands/validate.ts +7 -6
- package/src/constants/ai-prompts.ts +11 -11
- package/src/constants/config.ts +30 -0
- package/src/constants/index.ts +3 -2
- package/src/constants/messages/alias.ts +44 -14
- package/src/constants/messages/cli-descriptions.ts +91 -0
- package/src/constants/messages/common.ts +221 -36
- package/src/constants/messages/completion.ts +43 -14
- package/src/constants/messages/config.ts +61 -18
- package/src/constants/messages/cover-validate.ts +43 -14
- package/src/constants/messages/create.ts +16 -5
- package/src/constants/messages/home.ts +19 -6
- package/src/constants/messages/index.ts +2 -0
- package/src/constants/messages/init.ts +45 -14
- package/src/constants/messages/interactive-panel.ts +183 -29
- package/src/constants/messages/merge.ts +140 -38
- package/src/constants/messages/post-create.ts +59 -19
- package/src/constants/messages/projects.ts +51 -14
- package/src/constants/messages/remove.ts +50 -15
- package/src/constants/messages/reset.ts +14 -4
- package/src/constants/messages/resume.ts +116 -19
- package/src/constants/messages/run.ts +165 -35
- package/src/constants/messages/status.ts +84 -23
- package/src/constants/messages/sync.ts +54 -17
- package/src/constants/messages/tasks.ts +21 -7
- package/src/constants/messages/update.ts +35 -11
- package/src/constants/messages/validate.ts +218 -57
- package/src/constants/progress.ts +17 -6
- package/src/constants/project-config.ts +17 -0
- package/src/constants/prompt.ts +18 -2
- package/src/constants/tasks-template.ts +56 -2
- package/src/hooks/post-create.ts +5 -2
- package/src/index.ts +6 -5
- package/src/types/config.ts +2 -0
- package/src/utils/alias.ts +2 -1
- package/src/utils/claude.ts +10 -9
- package/src/utils/config-strategy.ts +3 -3
- package/src/utils/dry-run.ts +2 -2
- package/src/utils/formatter.ts +18 -11
- package/src/utils/i18n.ts +63 -0
- package/src/utils/index.ts +2 -0
- package/src/utils/interactive-panel-render.ts +6 -3
- package/src/utils/interactive-panel.ts +3 -1
- package/src/utils/progress-render.ts +11 -9
- package/src/utils/prompt.ts +2 -1
- package/src/utils/task-executor.ts +10 -7
- package/src/utils/task-file.ts +2 -1
- package/src/utils/terminal.ts +9 -9
- package/src/utils/ui-prompts.ts +4 -3
- package/src/utils/update-checker.ts +1 -1
- package/src/utils/validate-branch.ts +16 -9
- package/src/utils/validate-core.ts +2 -1
- package/src/utils/validate-runner.ts +2 -2
- package/src/utils/worktree-matcher.ts +9 -7
- package/tests/unit/commands/alias.test.ts +4 -0
- package/tests/unit/commands/completion.test.ts +14 -0
- package/tests/unit/commands/config.test.ts +61 -28
- package/tests/unit/commands/cover-validate.test.ts +13 -2
- package/tests/unit/commands/init.test.ts +6 -2
- package/tests/unit/commands/merge.test.ts +14 -0
- package/tests/unit/commands/run.test.ts +17 -0
- package/tests/unit/commands/tasks.test.ts +39 -9
- package/tests/unit/constants/config.test.ts +16 -1
- package/tests/unit/constants/messages-post-create.test.ts +93 -1
- package/tests/unit/constants/messages.test.ts +85 -1
- package/tests/unit/hooks/post-create.test.ts +32 -0
- package/tests/unit/utils/alias.test.ts +14 -0
- package/tests/unit/utils/claude.test.ts +24 -4
- package/tests/unit/utils/config-strategy.test.ts +21 -0
- package/tests/unit/utils/conflict-resolver.test.ts +24 -4
- package/tests/unit/utils/formatter.test.ts +21 -0
- package/tests/unit/utils/i18n.test.ts +91 -0
- package/tests/unit/utils/interactive-panel.test.ts +191 -0
- package/tests/unit/utils/progress.test.ts +39 -18
- package/tests/unit/utils/prompt.test.ts +25 -2
- package/tests/unit/utils/task-file.test.ts +73 -10
- package/tests/unit/utils/terminal-cmux.test.ts +19 -4
- package/tests/unit/utils/update-checker.test.ts +2 -0
- package/tests/unit/utils/validate-branch.test.ts +26 -1
- package/tests/unit/utils/validation.test.ts +2 -2
- package/tests/unit/utils/worktree-matcher.test.ts +2 -0
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { PANEL_SHORTCUT_KEYS } from '../interactive-panel.js';
|
|
3
|
+
import { createMessages } from '../../utils/i18n.js';
|
|
4
|
+
|
|
5
|
+
/** 快捷键标签映射 - 英文版 */
|
|
6
|
+
const SHORTCUT_LABELS_EN: Record<keyof typeof PANEL_SHORTCUT_KEYS, string> = {
|
|
7
|
+
VALIDATE: 'Validate',
|
|
8
|
+
MERGE: 'Merge',
|
|
9
|
+
DELETE: 'Delete',
|
|
10
|
+
RESUME: 'Resume',
|
|
11
|
+
SYNC: 'Sync',
|
|
12
|
+
COVER: 'Cover',
|
|
13
|
+
REFRESH: 'Refresh',
|
|
14
|
+
QUIT: 'Quit',
|
|
15
|
+
};
|
|
3
16
|
|
|
4
|
-
/**
|
|
5
|
-
const
|
|
17
|
+
/** 快捷键标签映射 - 中文版 */
|
|
18
|
+
const SHORTCUT_LABELS_ZH: Record<keyof typeof PANEL_SHORTCUT_KEYS, string> = {
|
|
6
19
|
VALIDATE: '验证',
|
|
7
20
|
MERGE: '合并',
|
|
8
21
|
DELETE: '删除',
|
|
@@ -13,23 +26,77 @@ const SHORTCUT_LABELS: Record<keyof typeof PANEL_SHORTCUT_KEYS, string> = {
|
|
|
13
26
|
QUIT: '退出',
|
|
14
27
|
};
|
|
15
28
|
|
|
29
|
+
/** 底栏快捷键提示文本(双语映射) */
|
|
30
|
+
const PANEL_FOOTER_SHORTCUTS_I18N = {
|
|
31
|
+
PANEL_FOOTER_SHORTCUTS: {
|
|
32
|
+
en: Object.entries(SHORTCUT_LABELS_EN)
|
|
33
|
+
.map(([key, label]) => `[${chalk.cyan(PANEL_SHORTCUT_KEYS[key as keyof typeof PANEL_SHORTCUT_KEYS])}]${label}`)
|
|
34
|
+
.join(' '),
|
|
35
|
+
'zh-CN': Object.entries(SHORTCUT_LABELS_ZH)
|
|
36
|
+
.map(([key, label]) => `[${chalk.cyan(PANEL_SHORTCUT_KEYS[key as keyof typeof PANEL_SHORTCUT_KEYS])}]${label}`)
|
|
37
|
+
.join(' '),
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
16
41
|
/** 底栏快捷键提示文本(从 PANEL_SHORTCUT_KEYS 自动生成) */
|
|
17
|
-
export const PANEL_FOOTER_SHORTCUTS =
|
|
18
|
-
|
|
19
|
-
|
|
42
|
+
export const PANEL_FOOTER_SHORTCUTS = createMessages(PANEL_FOOTER_SHORTCUTS_I18N).PANEL_FOOTER_SHORTCUTS;
|
|
43
|
+
|
|
44
|
+
/** 底栏倒计时文本(双语映射) */
|
|
45
|
+
const PANEL_FOOTER_COUNTDOWN_I18N = {
|
|
46
|
+
PANEL_FOOTER_COUNTDOWN: {
|
|
47
|
+
en: (seconds: number): string => chalk.gray(`(refresh in ${seconds}s)`),
|
|
48
|
+
'zh-CN': (seconds: number): string => chalk.gray(`(${seconds}s 后刷新)`),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
20
51
|
|
|
21
52
|
/**
|
|
22
53
|
* 底栏倒计时文本
|
|
23
54
|
* @param {number} seconds - 剩余秒数
|
|
24
55
|
* @returns {string} 格式化的倒计时文本
|
|
25
56
|
*/
|
|
26
|
-
export const PANEL_FOOTER_COUNTDOWN = (
|
|
57
|
+
export const PANEL_FOOTER_COUNTDOWN = createMessages(PANEL_FOOTER_COUNTDOWN_I18N).PANEL_FOOTER_COUNTDOWN;
|
|
58
|
+
|
|
59
|
+
/** 向下溢出提示(双语映射) */
|
|
60
|
+
const PANEL_OVERFLOW_DOWN_HINT_I18N = {
|
|
61
|
+
PANEL_OVERFLOW_DOWN_HINT: {
|
|
62
|
+
en: chalk.gray('↓ more worktrees...'),
|
|
63
|
+
'zh-CN': chalk.gray('↓ 更多 worktree...'),
|
|
64
|
+
},
|
|
65
|
+
};
|
|
27
66
|
|
|
28
67
|
/** 向下溢出提示 */
|
|
29
|
-
export const PANEL_OVERFLOW_DOWN_HINT =
|
|
68
|
+
export const PANEL_OVERFLOW_DOWN_HINT = createMessages(PANEL_OVERFLOW_DOWN_HINT_I18N).PANEL_OVERFLOW_DOWN_HINT;
|
|
69
|
+
|
|
70
|
+
/** 向上溢出提示(双语映射) */
|
|
71
|
+
const PANEL_OVERFLOW_UP_HINT_I18N = {
|
|
72
|
+
PANEL_OVERFLOW_UP_HINT: {
|
|
73
|
+
en: chalk.gray('↑ more worktrees...'),
|
|
74
|
+
'zh-CN': chalk.gray('↑ 更多 worktree...'),
|
|
75
|
+
},
|
|
76
|
+
};
|
|
30
77
|
|
|
31
78
|
/** 向上溢出提示 */
|
|
32
|
-
export const PANEL_OVERFLOW_UP_HINT =
|
|
79
|
+
export const PANEL_OVERFLOW_UP_HINT = createMessages(PANEL_OVERFLOW_UP_HINT_I18N).PANEL_OVERFLOW_UP_HINT;
|
|
80
|
+
|
|
81
|
+
/** 快照摘要文本(双语映射) */
|
|
82
|
+
const PANEL_SNAPSHOT_SUMMARY_I18N = {
|
|
83
|
+
PANEL_SNAPSHOT_SUMMARY: {
|
|
84
|
+
en: (total: number, orphaned: number): string => {
|
|
85
|
+
const base = `Snapshots: ${total}`;
|
|
86
|
+
if (orphaned > 0) {
|
|
87
|
+
return `${base} (${chalk.yellow(`${orphaned} orphaned`)})`;
|
|
88
|
+
}
|
|
89
|
+
return base;
|
|
90
|
+
},
|
|
91
|
+
'zh-CN': (total: number, orphaned: number): string => {
|
|
92
|
+
const base = `快照: ${total} 个`;
|
|
93
|
+
if (orphaned > 0) {
|
|
94
|
+
return `${base}(${chalk.yellow(`${orphaned} 个孤立`)})`;
|
|
95
|
+
}
|
|
96
|
+
return base;
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
};
|
|
33
100
|
|
|
34
101
|
/**
|
|
35
102
|
* 快照摘要文本
|
|
@@ -37,65 +104,152 @@ export const PANEL_OVERFLOW_UP_HINT = chalk.gray('↑ 更多 worktree...');
|
|
|
37
104
|
* @param {number} orphaned - 孤立快照数
|
|
38
105
|
* @returns {string} 格式化的快照摘要
|
|
39
106
|
*/
|
|
40
|
-
export const PANEL_SNAPSHOT_SUMMARY = (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
107
|
+
export const PANEL_SNAPSHOT_SUMMARY = createMessages(PANEL_SNAPSHOT_SUMMARY_I18N).PANEL_SNAPSHOT_SUMMARY;
|
|
108
|
+
|
|
109
|
+
/** 无 worktree 提示(双语映射) */
|
|
110
|
+
const PANEL_NO_WORKTREES_I18N = {
|
|
111
|
+
PANEL_NO_WORKTREES: {
|
|
112
|
+
en: '(No active worktrees)',
|
|
113
|
+
'zh-CN': '(无活跃 worktree)',
|
|
114
|
+
},
|
|
46
115
|
};
|
|
47
116
|
|
|
48
117
|
/** 无 worktree 提示 */
|
|
49
|
-
export const PANEL_NO_WORKTREES =
|
|
118
|
+
export const PANEL_NO_WORKTREES = createMessages(PANEL_NO_WORKTREES_I18N).PANEL_NO_WORKTREES;
|
|
119
|
+
|
|
120
|
+
/** 操作后返回提示(双语映射) */
|
|
121
|
+
const PANEL_PRESS_ENTER_TO_RETURN_I18N = {
|
|
122
|
+
PANEL_PRESS_ENTER_TO_RETURN: {
|
|
123
|
+
en: chalk.gray('\nPress Enter to return to panel...'),
|
|
124
|
+
'zh-CN': chalk.gray('\n按 Enter 返回面板...'),
|
|
125
|
+
},
|
|
126
|
+
};
|
|
50
127
|
|
|
51
128
|
/** 操作后返回提示 */
|
|
52
|
-
export const PANEL_PRESS_ENTER_TO_RETURN =
|
|
129
|
+
export const PANEL_PRESS_ENTER_TO_RETURN = createMessages(PANEL_PRESS_ENTER_TO_RETURN_I18N).PANEL_PRESS_ENTER_TO_RETURN;
|
|
130
|
+
|
|
131
|
+
/** 非 TTY 降级提示(双语映射) */
|
|
132
|
+
const PANEL_NOT_TTY_I18N = {
|
|
133
|
+
PANEL_NOT_TTY: {
|
|
134
|
+
en: 'Interactive panel requires a TTY terminal. Please run clawt status -i directly in a terminal',
|
|
135
|
+
'zh-CN': '交互式面板需要 TTY 终端环境,请直接在终端中运行 clawt status -i',
|
|
136
|
+
},
|
|
137
|
+
};
|
|
53
138
|
|
|
54
139
|
/** 非 TTY 降级提示 */
|
|
55
|
-
export const PANEL_NOT_TTY =
|
|
140
|
+
export const PANEL_NOT_TTY = createMessages(PANEL_NOT_TTY_I18N).PANEL_NOT_TTY;
|
|
141
|
+
|
|
142
|
+
/** 面板标题(双语映射) */
|
|
143
|
+
const PANEL_TITLE_I18N = {
|
|
144
|
+
PANEL_TITLE: {
|
|
145
|
+
en: (projectName: string): string => chalk.bold.cyan(`Project Status: ${projectName}`),
|
|
146
|
+
'zh-CN': (projectName: string): string => chalk.bold.cyan(`项目状态总览: ${projectName}`),
|
|
147
|
+
},
|
|
148
|
+
};
|
|
56
149
|
|
|
57
150
|
/**
|
|
58
151
|
* 面板标题
|
|
59
152
|
* @param {string} projectName - 项目名
|
|
60
153
|
* @returns {string} 格式化的标题
|
|
61
154
|
*/
|
|
62
|
-
export const PANEL_TITLE = (
|
|
155
|
+
export const PANEL_TITLE = createMessages(PANEL_TITLE_I18N).PANEL_TITLE;
|
|
156
|
+
|
|
157
|
+
/** 面板配置分支信息(正常)(双语映射) */
|
|
158
|
+
const PANEL_CONFIGURED_BRANCH_I18N = {
|
|
159
|
+
PANEL_CONFIGURED_BRANCH: {
|
|
160
|
+
en: (branchName: string): string => chalk.gray(`Main work branch: ${branchName}`),
|
|
161
|
+
'zh-CN': (branchName: string): string => chalk.gray(`主工作分支: ${branchName}`),
|
|
162
|
+
},
|
|
163
|
+
};
|
|
63
164
|
|
|
64
165
|
/**
|
|
65
166
|
* 面板配置分支信息(正常)
|
|
66
167
|
* @param {string} branchName - 分支名
|
|
67
168
|
* @returns {string} 格式化的分支信息
|
|
68
169
|
*/
|
|
69
|
-
export const PANEL_CONFIGURED_BRANCH = (
|
|
70
|
-
|
|
170
|
+
export const PANEL_CONFIGURED_BRANCH = createMessages(PANEL_CONFIGURED_BRANCH_I18N).PANEL_CONFIGURED_BRANCH;
|
|
171
|
+
|
|
172
|
+
/** 面板配置分支信息(分支已删除)(双语映射) */
|
|
173
|
+
const PANEL_CONFIGURED_BRANCH_DELETED_I18N = {
|
|
174
|
+
PANEL_CONFIGURED_BRANCH_DELETED: {
|
|
175
|
+
en: (branchName: string): string => chalk.red(`✗ Main work branch: ${branchName} (deleted)`),
|
|
176
|
+
'zh-CN': (branchName: string): string => chalk.red(`✗ 主工作分支: ${branchName}(已不存在)`),
|
|
177
|
+
},
|
|
178
|
+
};
|
|
71
179
|
|
|
72
180
|
/**
|
|
73
181
|
* 面板配置分支信息(分支已删除)
|
|
74
182
|
* @param {string} branchName - 分支名
|
|
75
183
|
* @returns {string} 格式化的分支信息
|
|
76
184
|
*/
|
|
77
|
-
export const PANEL_CONFIGURED_BRANCH_DELETED = (
|
|
78
|
-
|
|
185
|
+
export const PANEL_CONFIGURED_BRANCH_DELETED = createMessages(PANEL_CONFIGURED_BRANCH_DELETED_I18N).PANEL_CONFIGURED_BRANCH_DELETED;
|
|
186
|
+
|
|
187
|
+
/** 面板配置分支信息(分支不一致)(双语映射) */
|
|
188
|
+
const PANEL_CONFIGURED_BRANCH_MISMATCH_I18N = {
|
|
189
|
+
PANEL_CONFIGURED_BRANCH_MISMATCH: {
|
|
190
|
+
en: (branchName: string): string => chalk.red(`⚠ Main work branch: ${branchName} (mismatch)`),
|
|
191
|
+
'zh-CN': (branchName: string): string => chalk.red(`⚠ 主工作分支: ${branchName}(不一致)`),
|
|
192
|
+
},
|
|
193
|
+
};
|
|
79
194
|
|
|
80
195
|
/**
|
|
81
196
|
* 面板配置分支信息(分支不一致)
|
|
82
197
|
* @param {string} branchName - 分支名
|
|
83
198
|
* @returns {string} 格式化的分支信息
|
|
84
199
|
*/
|
|
85
|
-
export const PANEL_CONFIGURED_BRANCH_MISMATCH = (
|
|
86
|
-
|
|
200
|
+
export const PANEL_CONFIGURED_BRANCH_MISMATCH = createMessages(PANEL_CONFIGURED_BRANCH_MISMATCH_I18N).PANEL_CONFIGURED_BRANCH_MISMATCH;
|
|
201
|
+
|
|
202
|
+
/** 面板配置分支信息(未初始化)(双语映射) */
|
|
203
|
+
const PANEL_NOT_INITIALIZED_I18N = {
|
|
204
|
+
PANEL_NOT_INITIALIZED: {
|
|
205
|
+
en: chalk.gray('Not initialized (run clawt init to set main work branch)'),
|
|
206
|
+
'zh-CN': chalk.gray('未初始化(执行 clawt init 设置主工作分支)'),
|
|
207
|
+
},
|
|
208
|
+
};
|
|
87
209
|
|
|
88
210
|
/** 面板配置分支信息(未初始化) */
|
|
89
|
-
export const PANEL_NOT_INITIALIZED =
|
|
211
|
+
export const PANEL_NOT_INITIALIZED = createMessages(PANEL_NOT_INITIALIZED_I18N).PANEL_NOT_INITIALIZED;
|
|
212
|
+
|
|
213
|
+
/** 交互面板日期分隔线:未知日期文案(双语映射) */
|
|
214
|
+
const PANEL_UNKNOWN_DATE_I18N = {
|
|
215
|
+
PANEL_UNKNOWN_DATE: {
|
|
216
|
+
en: 'Unknown date',
|
|
217
|
+
'zh-CN': '未知日期',
|
|
218
|
+
},
|
|
219
|
+
};
|
|
90
220
|
|
|
91
221
|
/** 交互面板日期分隔线:未知日期文案 */
|
|
92
|
-
export const PANEL_UNKNOWN_DATE =
|
|
222
|
+
export const PANEL_UNKNOWN_DATE = createMessages(PANEL_UNKNOWN_DATE_I18N).PANEL_UNKNOWN_DATE;
|
|
223
|
+
|
|
224
|
+
/** 交互面板:与主分支同步(双语映射) */
|
|
225
|
+
const PANEL_SYNCED_WITH_MAIN_I18N = {
|
|
226
|
+
PANEL_SYNCED_WITH_MAIN: {
|
|
227
|
+
en: 'Synced with main branch',
|
|
228
|
+
'zh-CN': '与主分支同步',
|
|
229
|
+
},
|
|
230
|
+
};
|
|
93
231
|
|
|
94
232
|
/** 交互面板:与主分支同步 */
|
|
95
|
-
export const PANEL_SYNCED_WITH_MAIN =
|
|
233
|
+
export const PANEL_SYNCED_WITH_MAIN = createMessages(PANEL_SYNCED_WITH_MAIN_I18N).PANEL_SYNCED_WITH_MAIN;
|
|
234
|
+
|
|
235
|
+
/** 交互面板:本地提交数量提示(双语映射) */
|
|
236
|
+
const PANEL_COMMITS_AHEAD_I18N = {
|
|
237
|
+
PANEL_COMMITS_AHEAD: {
|
|
238
|
+
en: (count: number): string => `${count} local commit(s)`,
|
|
239
|
+
'zh-CN': (count: number): string => `${count} 个本地提交`,
|
|
240
|
+
},
|
|
241
|
+
};
|
|
96
242
|
|
|
97
243
|
/** 交互面板:本地提交数量提示 */
|
|
98
|
-
export const PANEL_COMMITS_AHEAD = (
|
|
244
|
+
export const PANEL_COMMITS_AHEAD = createMessages(PANEL_COMMITS_AHEAD_I18N).PANEL_COMMITS_AHEAD;
|
|
245
|
+
|
|
246
|
+
/** 交互面板:落后主分支提交数量提示(双语映射) */
|
|
247
|
+
const PANEL_COMMITS_BEHIND_I18N = {
|
|
248
|
+
PANEL_COMMITS_BEHIND: {
|
|
249
|
+
en: (count: number): string => `${count} commit(s) behind main`,
|
|
250
|
+
'zh-CN': (count: number): string => `落后主分支 ${count} 个提交`,
|
|
251
|
+
},
|
|
252
|
+
};
|
|
99
253
|
|
|
100
254
|
/** 交互面板:落后主分支提交数量提示 */
|
|
101
|
-
export const PANEL_COMMITS_BEHIND = (
|
|
255
|
+
export const PANEL_COMMITS_BEHIND = createMessages(PANEL_COMMITS_BEHIND_I18N).PANEL_COMMITS_BEHIND;
|
|
@@ -1,62 +1,164 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { createMessages } from '../../utils/i18n.js';
|
|
2
|
+
|
|
3
|
+
/** merge 命令专属提示消息(双语映射) */
|
|
4
|
+
const MERGE_MESSAGES_I18N = {
|
|
3
5
|
/** merge 成功 */
|
|
4
|
-
MERGE_SUCCESS:
|
|
5
|
-
|
|
6
|
+
MERGE_SUCCESS: {
|
|
7
|
+
en: (branch: string, message: string, pushed: boolean) =>
|
|
8
|
+
`✓ Branch ${branch} successfully merged into current branch\n Commit message: ${message}${pushed ? '\n Pushed to remote' : ''}`,
|
|
9
|
+
'zh-CN': (branch: string, message: string, pushed: boolean) =>
|
|
10
|
+
`✓ 分支 ${branch} 已成功合并到当前分支\n 提交信息: ${message}${pushed ? '\n 已推送到远程仓库' : ''}`,
|
|
11
|
+
},
|
|
6
12
|
/** merge 成功(无提交信息,目标 worktree 已提交过) */
|
|
7
|
-
MERGE_SUCCESS_NO_MESSAGE:
|
|
8
|
-
|
|
13
|
+
MERGE_SUCCESS_NO_MESSAGE: {
|
|
14
|
+
en: (branch: string, pushed: boolean) =>
|
|
15
|
+
`✓ Branch ${branch} successfully merged into current branch${pushed ? '\n Pushed to remote' : ''}`,
|
|
16
|
+
'zh-CN': (branch: string, pushed: boolean) =>
|
|
17
|
+
`✓ 分支 ${branch} 已成功合并到当前分支${pushed ? '\n 已推送到远程仓库' : ''}`,
|
|
18
|
+
},
|
|
9
19
|
/** merge 冲突 */
|
|
10
|
-
MERGE_CONFLICT:
|
|
20
|
+
MERGE_CONFLICT: {
|
|
21
|
+
en: 'Merge has conflicts, please resolve manually:\n After resolving, run git add . && git merge --continue',
|
|
22
|
+
'zh-CN': '合并存在冲突,请手动处理:\n 解决冲突后执行 git add . && git merge --continue',
|
|
23
|
+
},
|
|
11
24
|
/** merge 后清理 worktree 和分支成功 */
|
|
12
|
-
WORKTREE_CLEANED:
|
|
25
|
+
WORKTREE_CLEANED: {
|
|
26
|
+
en: (branch: string) => `✓ Cleaned worktree and branch: ${branch}`,
|
|
27
|
+
'zh-CN': (branch: string) => `✓ 已清理 worktree 和分支: ${branch}`,
|
|
28
|
+
},
|
|
13
29
|
/** 目标 worktree 有未提交修改但未指定 -m */
|
|
14
|
-
TARGET_WORKTREE_DIRTY_NO_MESSAGE:
|
|
15
|
-
|
|
30
|
+
TARGET_WORKTREE_DIRTY_NO_MESSAGE: {
|
|
31
|
+
en: (worktreePath: string) =>
|
|
32
|
+
`${worktreePath} has uncommitted changes, please provide a commit message via -m option`,
|
|
33
|
+
'zh-CN': (worktreePath: string) =>
|
|
34
|
+
`${worktreePath} 有未提交的修改,请通过 -m 参数提供提交信息`,
|
|
35
|
+
},
|
|
16
36
|
/** 目标 worktree 既干净又无本地提交 */
|
|
17
|
-
TARGET_WORKTREE_NO_CHANGES:
|
|
37
|
+
TARGET_WORKTREE_NO_CHANGES: {
|
|
38
|
+
en: 'Target worktree has no changes to merge (working directory clean and no local commits)',
|
|
39
|
+
'zh-CN': '目标 worktree 没有任何可合并的变更(工作区干净且无本地提交)',
|
|
40
|
+
},
|
|
18
41
|
/** merge 命令检测到 validate 状态的提示 */
|
|
19
|
-
MERGE_VALIDATE_STATE_HINT:
|
|
20
|
-
|
|
42
|
+
MERGE_VALIDATE_STATE_HINT: {
|
|
43
|
+
en: (branch: string) =>
|
|
44
|
+
`Main worktree may have residual validate state, run clawt validate -b ${branch} --clean first`,
|
|
45
|
+
'zh-CN': (branch: string) =>
|
|
46
|
+
`主 worktree 可能存在 validate 残留状态,可先执行 clawt validate -b ${branch} --clean 清理`,
|
|
47
|
+
},
|
|
21
48
|
/** merge 检测到 auto-save 提交,提示用户是否压缩 */
|
|
22
|
-
MERGE_SQUASH_PROMPT:
|
|
49
|
+
MERGE_SQUASH_PROMPT: {
|
|
50
|
+
en: 'Detected temporary commits from sync, squash all commits into one?\n After squashing, changes will remain in the target worktree staging area and need to be re-committed (you can use Claude Code CLI or other tools to generate the commit message)',
|
|
51
|
+
'zh-CN': '检测到 sync 产生的临时提交,是否将所有提交压缩为一个?\n 压缩后变更将保留在目标worktree的暂存区,需要重新提交(可使用 Claude Code Cli或其他工具生成提交信息)',
|
|
52
|
+
},
|
|
23
53
|
/** squash 完成且通过 -m 直接提交后的提示 */
|
|
24
|
-
MERGE_SQUASH_COMMITTED:
|
|
25
|
-
|
|
54
|
+
MERGE_SQUASH_COMMITTED: {
|
|
55
|
+
en: (branch: string) =>
|
|
56
|
+
`✓ All commits from branch ${branch} squashed into one`,
|
|
57
|
+
'zh-CN': (branch: string) =>
|
|
58
|
+
`✓ 已将分支 ${branch} 的所有提交压缩为一个`,
|
|
59
|
+
},
|
|
26
60
|
/** squash 完成但未提供 -m,提示用户自行提交 */
|
|
27
|
-
MERGE_SQUASH_PENDING:
|
|
28
|
-
|
|
61
|
+
MERGE_SQUASH_PENDING: {
|
|
62
|
+
en: (worktreePath: string, branch: string) =>
|
|
63
|
+
`✓ All commits squashed into staging area\n Please commit in the target worktree, then re-run merge:\n cd ${worktreePath}\n After committing, run: clawt merge -b ${branch}`,
|
|
64
|
+
'zh-CN': (worktreePath: string, branch: string) =>
|
|
65
|
+
`✓ 已将所有提交压缩到暂存区\n 请在目标 worktree 中提交后重新执行 merge:\n cd ${worktreePath}\n 提交完成后执行:clawt merge -b ${branch}`,
|
|
66
|
+
},
|
|
29
67
|
/** merge 后 pull 冲突 */
|
|
30
|
-
PULL_CONFLICT:
|
|
31
|
-
'
|
|
68
|
+
PULL_CONFLICT: {
|
|
69
|
+
en: 'Conflict during auto-pull, merge completed but remote sync failed\n Please resolve manually:\n After resolving, run git add . && git commit\n Then run git push to push to remote',
|
|
70
|
+
'zh-CN': '自动 pull 时发生冲突,merge 已完成但远程同步失败\n 请手动解决冲突:\n 解决冲突后执行 git add . && git commit\n 然后执行 git push 推送到远程',
|
|
71
|
+
},
|
|
32
72
|
/** push 失败 */
|
|
33
|
-
PUSH_FAILED:
|
|
73
|
+
PUSH_FAILED: {
|
|
74
|
+
en: 'Auto-push failed, merge and pull completed\n Please run git push manually',
|
|
75
|
+
'zh-CN': '自动 push 失败,merge 和 pull 已完成\n 请手动执行 git push',
|
|
76
|
+
},
|
|
34
77
|
/** merge 无可用 worktree */
|
|
35
|
-
MERGE_NO_WORKTREES:
|
|
78
|
+
MERGE_NO_WORKTREES: {
|
|
79
|
+
en: 'No worktrees available, please create one with clawt run or clawt create first',
|
|
80
|
+
'zh-CN': '当前项目没有可用的 worktree,请先通过 clawt run 或 clawt create 创建',
|
|
81
|
+
},
|
|
36
82
|
/** merge 模糊匹配无结果,列出可用分支 */
|
|
37
|
-
MERGE_NO_MATCH:
|
|
38
|
-
|
|
83
|
+
MERGE_NO_MATCH: {
|
|
84
|
+
en: (name: string, branches: string[]) =>
|
|
85
|
+
`No branch matching "${name}"\n Available branches:\n${branches.map((b) => ` - ${b}`).join('\n')}`,
|
|
86
|
+
'zh-CN': (name: string, branches: string[]) =>
|
|
87
|
+
`未找到与 "${name}" 匹配的分支\n 可用分支:\n${branches.map((b) => ` - ${b}`).join('\n')}`,
|
|
88
|
+
},
|
|
39
89
|
/** merge 交互选择提示 */
|
|
40
|
-
MERGE_SELECT_BRANCH:
|
|
90
|
+
MERGE_SELECT_BRANCH: {
|
|
91
|
+
en: 'Select a branch to merge',
|
|
92
|
+
'zh-CN': '请选择要合并的分支',
|
|
93
|
+
},
|
|
41
94
|
/** merge 模糊匹配到多个结果提示 */
|
|
42
|
-
MERGE_MULTIPLE_MATCHES:
|
|
95
|
+
MERGE_MULTIPLE_MATCHES: {
|
|
96
|
+
en: (name: string) => `"${name}" matched multiple branches, please select:`,
|
|
97
|
+
'zh-CN': (name: string) => `"${name}" 匹配到多个分支,请选择:`,
|
|
98
|
+
},
|
|
43
99
|
/** 询问是否使用 AI 辅助解决冲突 */
|
|
44
|
-
MERGE_CONFLICT_ASK_AI:
|
|
100
|
+
MERGE_CONFLICT_ASK_AI: {
|
|
101
|
+
en: 'Merge conflict detected, use Claude Code to auto-resolve?',
|
|
102
|
+
'zh-CN': '检测到合并冲突,是否使用 Claude Code 自动解决?',
|
|
103
|
+
},
|
|
45
104
|
/** AI 冲突解决开始 */
|
|
46
|
-
MERGE_CONFLICT_AI_START:
|
|
47
|
-
|
|
105
|
+
MERGE_CONFLICT_AI_START: {
|
|
106
|
+
en: (fileCount: number) =>
|
|
107
|
+
`Using Claude Code to analyze and resolve ${fileCount} conflicting file(s)...`,
|
|
108
|
+
'zh-CN': (fileCount: number) =>
|
|
109
|
+
`正在使用 Claude Code 分析并解决 ${fileCount} 个冲突文件...`,
|
|
110
|
+
},
|
|
48
111
|
/** AI 冲突解决成功 */
|
|
49
|
-
MERGE_CONFLICT_AI_SUCCESS:
|
|
112
|
+
MERGE_CONFLICT_AI_SUCCESS: {
|
|
113
|
+
en: '✓ Claude Code successfully resolved all conflicts',
|
|
114
|
+
'zh-CN': '✓ Claude Code 已成功解决所有冲突',
|
|
115
|
+
},
|
|
50
116
|
/** AI 冲突解决后仍有未解决的冲突 */
|
|
51
|
-
MERGE_CONFLICT_AI_PARTIAL:
|
|
52
|
-
|
|
117
|
+
MERGE_CONFLICT_AI_PARTIAL: {
|
|
118
|
+
en: (remaining: number) =>
|
|
119
|
+
`Claude Code processed conflicts, but ${remaining} file(s) still have conflicts\n Please resolve remaining conflicts manually, then run git add . && git merge --continue`,
|
|
120
|
+
'zh-CN': (remaining: number) =>
|
|
121
|
+
`Claude Code 已处理冲突文件,但仍有 ${remaining} 个文件存在冲突\n 请手动处理剩余冲突后执行 git add . && git merge --continue`,
|
|
122
|
+
},
|
|
53
123
|
/** AI 冲突解决失败 */
|
|
54
|
-
MERGE_CONFLICT_AI_FAILED:
|
|
55
|
-
|
|
124
|
+
MERGE_CONFLICT_AI_FAILED: {
|
|
125
|
+
en: (errorMsg: string) =>
|
|
126
|
+
`Claude Code failed to resolve conflicts: ${errorMsg}\n Please resolve manually:\n After resolving, run git add . && git merge --continue`,
|
|
127
|
+
'zh-CN': (errorMsg: string) =>
|
|
128
|
+
`Claude Code 解决冲突失败: ${errorMsg}\n 请手动处理:\n 解决冲突后执行 git add . && git merge --continue`,
|
|
129
|
+
},
|
|
56
130
|
/** --auto 模式下的冲突手动解决(配置为 manual) */
|
|
57
|
-
MERGE_CONFLICT_MANUAL:
|
|
131
|
+
MERGE_CONFLICT_MANUAL: {
|
|
132
|
+
en: 'Merge has conflicts, please resolve manually:\n After resolving, run git add . && git merge --continue',
|
|
133
|
+
'zh-CN': '合并存在冲突,请手动处理:\n 解决冲突后执行 git add . && git merge --continue',
|
|
134
|
+
},
|
|
58
135
|
/** 目标 worktree 有未提交修改时的交互式提交信息提示 */
|
|
59
|
-
MERGE_PROMPT_COMMIT_MESSAGE:
|
|
136
|
+
MERGE_PROMPT_COMMIT_MESSAGE: {
|
|
137
|
+
en: 'Target worktree has uncommitted changes, please enter a commit message',
|
|
138
|
+
'zh-CN': '目标 worktree 有未提交的修改,请输入提交信息',
|
|
139
|
+
},
|
|
60
140
|
/** squash 后的交互式提交信息提示 */
|
|
61
|
-
MERGE_SQUASH_PROMPT_COMMIT_MESSAGE:
|
|
62
|
-
|
|
141
|
+
MERGE_SQUASH_PROMPT_COMMIT_MESSAGE: {
|
|
142
|
+
en: 'Enter commit message after squash',
|
|
143
|
+
'zh-CN': '请输入 squash 后的提交信息',
|
|
144
|
+
},
|
|
145
|
+
// --- 从 prompt.ts 迁移 ---
|
|
146
|
+
/** 提交信息不能为空 */
|
|
147
|
+
COMMIT_MESSAGE_NOT_EMPTY: {
|
|
148
|
+
en: 'Commit message cannot be empty',
|
|
149
|
+
'zh-CN': '提交信息不能为空',
|
|
150
|
+
},
|
|
151
|
+
// --- 从 commands/merge.ts 迁移 ---
|
|
152
|
+
/** 已配置自动删除 */
|
|
153
|
+
AUTO_DELETE_CONFIGURED: {
|
|
154
|
+
en: (branch: string) => `Auto-delete configured, worktree and branch will be cleaned up after merge: ${branch}`,
|
|
155
|
+
'zh-CN': (branch: string) => `已配置自动删除,merge 成功后将自动清理 worktree 和分支: ${branch}`,
|
|
156
|
+
},
|
|
157
|
+
/** 是否删除对应的 worktree 和分支 */
|
|
158
|
+
CONFIRM_DELETE_WORKTREE_BRANCH: {
|
|
159
|
+
en: (branch: string) => `Delete the corresponding worktree and branch (${branch})?`,
|
|
160
|
+
'zh-CN': (branch: string) => `是否删除对应的 worktree 和分支 (${branch})?`,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
export const MERGE_MESSAGES = createMessages(MERGE_MESSAGES_I18N);
|
|
@@ -1,29 +1,69 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { createMessages } from '../../utils/i18n.js';
|
|
2
|
+
|
|
3
|
+
/** postCreate hook 相关提示消息(双语映射) */
|
|
4
|
+
const POST_CREATE_MESSAGES_I18N = {
|
|
3
5
|
/** hook 执行跳过(--no-post-create) */
|
|
4
|
-
HOOK_SKIPPED:
|
|
6
|
+
HOOK_SKIPPED: {
|
|
7
|
+
en: 'Skipped postCreate hook (--no-post-create)',
|
|
8
|
+
'zh-CN': '已跳过 postCreate hook(--no-post-create)',
|
|
9
|
+
},
|
|
5
10
|
/** 无 hook 配置 */
|
|
6
|
-
HOOK_NOT_CONFIGURED:
|
|
11
|
+
HOOK_NOT_CONFIGURED: {
|
|
12
|
+
en: 'postCreate hook not configured, skipping',
|
|
13
|
+
'zh-CN': '未配置 postCreate hook,跳过',
|
|
14
|
+
},
|
|
7
15
|
/** hook 来源提示 */
|
|
8
|
-
HOOK_SOURCE_INFO:
|
|
16
|
+
HOOK_SOURCE_INFO: {
|
|
17
|
+
en: (source: string) => `postCreate hook source: ${source}`,
|
|
18
|
+
'zh-CN': (source: string) => `postCreate hook 来源: ${source}`,
|
|
19
|
+
},
|
|
9
20
|
/** hook 开始执行 */
|
|
10
|
-
HOOK_EXECUTING:
|
|
11
|
-
|
|
21
|
+
HOOK_EXECUTING: {
|
|
22
|
+
en: (branch: string, command: string) =>
|
|
23
|
+
`[${branch}] Executing postCreate hook: ${command}`,
|
|
24
|
+
'zh-CN': (branch: string, command: string) =>
|
|
25
|
+
`[${branch}] 正在执行 postCreate hook: ${command}`,
|
|
26
|
+
},
|
|
12
27
|
/** hook 执行成功 */
|
|
13
|
-
HOOK_SUCCESS:
|
|
28
|
+
HOOK_SUCCESS: {
|
|
29
|
+
en: (branch: string) => `[${branch}] postCreate hook executed successfully`,
|
|
30
|
+
'zh-CN': (branch: string) => `[${branch}] postCreate hook 执行成功`,
|
|
31
|
+
},
|
|
14
32
|
/** hook 执行失败 */
|
|
15
|
-
HOOK_FAILED:
|
|
16
|
-
|
|
33
|
+
HOOK_FAILED: {
|
|
34
|
+
en: (branch: string, error: string) =>
|
|
35
|
+
`[${branch}] postCreate hook execution failed: ${error}`,
|
|
36
|
+
'zh-CN': (branch: string, error: string) =>
|
|
37
|
+
`[${branch}] postCreate hook 执行失败: ${error}`,
|
|
38
|
+
},
|
|
17
39
|
/** hook 执行汇总 */
|
|
18
|
-
HOOK_SUMMARY:
|
|
19
|
-
|
|
40
|
+
HOOK_SUMMARY: {
|
|
41
|
+
en: (succeeded: number, failed: number) =>
|
|
42
|
+
`postCreate hook completed: ${succeeded} succeeded, ${failed} failed`,
|
|
43
|
+
'zh-CN': (succeeded: number, failed: number) =>
|
|
44
|
+
`postCreate hook 执行完成: ${succeeded} 成功, ${failed} 失败`,
|
|
45
|
+
},
|
|
20
46
|
/** hook 后台执行中提示 */
|
|
21
|
-
HOOK_BACKGROUND_START:
|
|
22
|
-
|
|
47
|
+
HOOK_BACKGROUND_START: {
|
|
48
|
+
en: (count: number, command: string) =>
|
|
49
|
+
`postCreate hook running in background (${count} worktree(s)): ${command}`,
|
|
50
|
+
'zh-CN': (count: number, command: string) =>
|
|
51
|
+
`postCreate hook 正在后台执行 (${count} 个 worktree): ${command}`,
|
|
52
|
+
},
|
|
23
53
|
/** postCreate.sh 自动添加执行权限 */
|
|
24
|
-
POST_CREATE_SCRIPT_AUTO_CHMOD:
|
|
25
|
-
|
|
54
|
+
POST_CREATE_SCRIPT_AUTO_CHMOD: {
|
|
55
|
+
en: (path: string) =>
|
|
56
|
+
`${path} is not executable, auto-added execute permission`,
|
|
57
|
+
'zh-CN': (path: string) =>
|
|
58
|
+
`${path} 不可执行,已自动添加执行权限`,
|
|
59
|
+
},
|
|
26
60
|
/** postCreate.sh 不可执行(自动 chmod 失败时降级提示) */
|
|
27
|
-
POST_CREATE_SCRIPT_NOT_EXECUTABLE:
|
|
28
|
-
|
|
29
|
-
}
|
|
61
|
+
POST_CREATE_SCRIPT_NOT_EXECUTABLE: {
|
|
62
|
+
en: (path: string) =>
|
|
63
|
+
`Detected ${path} but not executable, auto-chmod failed. Please run chmod +x ${path} manually`,
|
|
64
|
+
'zh-CN': (path: string) =>
|
|
65
|
+
`检测到 ${path} 但不可执行,自动添加权限失败,请手动执行 chmod +x ${path}`,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const POST_CREATE_MESSAGES = createMessages(POST_CREATE_MESSAGES_I18N);
|
|
@@ -1,25 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { createMessages } from '../../utils/i18n.js';
|
|
2
|
+
|
|
3
|
+
/** projects 命令专属提示消息(双语映射) */
|
|
4
|
+
const PROJECTS_MESSAGES_I18N = {
|
|
3
5
|
/** projects 命令全局概览标题 */
|
|
4
|
-
PROJECTS_OVERVIEW_TITLE:
|
|
6
|
+
PROJECTS_OVERVIEW_TITLE: {
|
|
7
|
+
en: 'Project Overview',
|
|
8
|
+
'zh-CN': '项目概览',
|
|
9
|
+
},
|
|
5
10
|
/** projects 命令指定项目详情标题 */
|
|
6
|
-
PROJECTS_DETAIL_TITLE:
|
|
11
|
+
PROJECTS_DETAIL_TITLE: {
|
|
12
|
+
en: (projectName: string) => `Project Details: ${projectName}`,
|
|
13
|
+
'zh-CN': (projectName: string) => `项目详情: ${projectName}`,
|
|
14
|
+
},
|
|
7
15
|
/** 无项目提示 */
|
|
8
|
-
PROJECTS_NO_PROJECTS:
|
|
16
|
+
PROJECTS_NO_PROJECTS: {
|
|
17
|
+
en: '(No projects, worktrees directory is empty)',
|
|
18
|
+
'zh-CN': '(暂无项目,worktrees 目录为空)',
|
|
19
|
+
},
|
|
9
20
|
/** 项目不存在提示 */
|
|
10
|
-
PROJECTS_NOT_FOUND:
|
|
21
|
+
PROJECTS_NOT_FOUND: {
|
|
22
|
+
en: (name: string) => `Project ${name} does not exist`,
|
|
23
|
+
'zh-CN': (name: string) => `项目 ${name} 不存在`,
|
|
24
|
+
},
|
|
11
25
|
/** worktree 数量标签 */
|
|
12
|
-
PROJECTS_WORKTREE_COUNT:
|
|
26
|
+
PROJECTS_WORKTREE_COUNT: {
|
|
27
|
+
en: (count: number) => `${count} worktree(s)`,
|
|
28
|
+
'zh-CN': (count: number) => `${count} 个 worktree`,
|
|
29
|
+
},
|
|
13
30
|
/** 最近活跃时间标签 */
|
|
14
|
-
PROJECTS_LAST_ACTIVE:
|
|
31
|
+
PROJECTS_LAST_ACTIVE: {
|
|
32
|
+
en: (relativeTime: string) => `Last active: ${relativeTime}`,
|
|
33
|
+
'zh-CN': (relativeTime: string) => `最近活跃: ${relativeTime}`,
|
|
34
|
+
},
|
|
15
35
|
/** 磁盘占用标签 */
|
|
16
|
-
PROJECTS_DISK_USAGE:
|
|
36
|
+
PROJECTS_DISK_USAGE: {
|
|
37
|
+
en: (size: string) => `Disk usage: ${size}`,
|
|
38
|
+
'zh-CN': (size: string) => `磁盘占用: ${size}`,
|
|
39
|
+
},
|
|
17
40
|
/** 总磁盘占用标签 */
|
|
18
|
-
PROJECTS_TOTAL_DISK_USAGE:
|
|
41
|
+
PROJECTS_TOTAL_DISK_USAGE: {
|
|
42
|
+
en: (size: string) => `Total: ${size}`,
|
|
43
|
+
'zh-CN': (size: string) => `总占用: ${size}`,
|
|
44
|
+
},
|
|
19
45
|
/** projects 详情无 worktree */
|
|
20
|
-
PROJECTS_DETAIL_NO_WORKTREES:
|
|
46
|
+
PROJECTS_DETAIL_NO_WORKTREES: {
|
|
47
|
+
en: '(No worktrees in this project)',
|
|
48
|
+
'zh-CN': '(该项目下无 worktree)',
|
|
49
|
+
},
|
|
21
50
|
/** 路径标签 */
|
|
22
|
-
PROJECTS_PATH:
|
|
51
|
+
PROJECTS_PATH: {
|
|
52
|
+
en: (path: string) => `Path: ${path}`,
|
|
53
|
+
'zh-CN': (path: string) => `路径: ${path}`,
|
|
54
|
+
},
|
|
23
55
|
/** 最后修改时间标签 */
|
|
24
|
-
PROJECTS_LAST_MODIFIED:
|
|
25
|
-
|
|
56
|
+
PROJECTS_LAST_MODIFIED: {
|
|
57
|
+
en: (relativeTime: string) => `Last modified: ${relativeTime}`,
|
|
58
|
+
'zh-CN': (relativeTime: string) => `最后修改: ${relativeTime}`,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
export const PROJECTS_MESSAGES = createMessages(PROJECTS_MESSAGES_I18N);
|