zen-gitsync 2.15.3 → 2.15.5
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/package.json +2 -1
- package/src/aiCommit.js +349 -0
- package/src/ui/public/assets/{AppVersionBadge-BPdgjwWX.js → AppVersionBadge-jNKpz4Zv.js} +1 -1
- package/src/ui/public/assets/{BranchSelector-BiBKA9o3.js → BranchSelector-FlXPeVlm.js} +1 -1
- package/src/ui/public/assets/{CommitForm-yLLGMo1w.js → CommitForm-DC1aAJzg.js} +1 -1
- package/src/ui/public/assets/{ConsoleView-Ba4eSIo2.js → ConsoleView-BC3FTRJd.js} +2 -2
- package/src/ui/public/assets/CustomCommandManager-CnyrXPl1.js +1 -0
- package/src/ui/public/assets/{EditorView-BltlVjcc.js → EditorView-C3NbM37Q.js} +0 -0
- package/src/ui/public/assets/{FlowOrchestrationWorkspace-ByDio10N.js → FlowOrchestrationWorkspace-3UqoiNF8.js} +1 -1
- package/src/ui/public/assets/{LogList-BKjwSt1d.js → LogList-CSV0mgZQ.js} +1 -1
- package/src/ui/public/assets/{ProjectStartupButton-D6PtAcxK.js → ProjectStartupButton-DRSGErdt.js} +1 -1
- package/src/ui/public/assets/{RemoteRepoCard-DKLNbm3h.js → RemoteRepoCard-Bzv_dE6D.js} +1 -1
- package/src/ui/public/assets/{SourceMapView-BPbU7JR1.js → SourceMapView-BoVsTsdH.js} +1 -1
- package/src/ui/public/assets/{TemplateManager-DEndz4md.js → TemplateManager-qcgRsZ_X.js} +1 -1
- package/src/ui/public/assets/{WorkbenchView-Dv_opiH4.js → WorkbenchView-BuEZRkau.js} +1 -1
- package/src/ui/public/assets/{index-9ACx2M1Q.js → index-DZ1sMoYt.js} +3 -3
- package/src/ui/public/index.html +1 -1
- package/src/ui/public/assets/CustomCommandManager-DKub4rWF.js +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zen-gitsync",
|
|
3
|
-
"version": "2.15.
|
|
3
|
+
"version": "2.15.5",
|
|
4
4
|
"description": "Auto commit, scheduled sync, and visual GUI for Git. Run `g` in any repo for one-key commit & push, AI commit messages, scheduled background sync, and a drag-and-drop workflow builder.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"src/ui/server/**",
|
|
55
55
|
"src/utils/**",
|
|
56
56
|
"src/gitCommit.js",
|
|
57
|
+
"src/aiCommit.js",
|
|
57
58
|
"src/config.js",
|
|
58
59
|
"src/cli/**",
|
|
59
60
|
"scripts/run-tests.cjs",
|
package/src/aiCommit.js
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
// Copyright 2026 xz333221
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
// CLI AI 提交信息生成器 — 独立模块,不依赖 GUI 服务器代码
|
|
16
|
+
// 逻辑与 GUI 的 /api/config/generate-commit-message 路由保持一致:
|
|
17
|
+
// 收集 diff → 压缩 diff → 构建 prompt → 调用 LLM → 解析 JSON → 返回 Conventional Commits 消息
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import ora from 'ora';
|
|
20
|
+
import config from './config.js';
|
|
21
|
+
import { execGitCommand } from './utils/index.js';
|
|
22
|
+
|
|
23
|
+
// ──────────────────────────────────────────────
|
|
24
|
+
// 跳过的产物/资源/lock 文件(与 GUI config.js SKIP_FILE_PATTERNS 一致)
|
|
25
|
+
// ──────────────────────────────────────────────
|
|
26
|
+
const SKIP_FILE_PATTERNS = [
|
|
27
|
+
/(^|[\\/])dist[\\/]/,
|
|
28
|
+
/(^|[\\/])build[\\/]/,
|
|
29
|
+
/(^|[\\/])\.next[\\/]/,
|
|
30
|
+
/(^|[\\/])coverage[\\/]/,
|
|
31
|
+
/(^|[\\/])node_modules[\\/]/,
|
|
32
|
+
/\.lock$/,
|
|
33
|
+
/package-lock\.json$/,
|
|
34
|
+
/yarn\.lock$/,
|
|
35
|
+
/pnpm-lock\.yaml$/,
|
|
36
|
+
/min\.js$/,
|
|
37
|
+
/min\.css$/,
|
|
38
|
+
/\.bundle\.js$/,
|
|
39
|
+
/\.map$/,
|
|
40
|
+
/\.(png|jpe?g|gif|webp|svg|ico|bmp|tiff)$/,
|
|
41
|
+
/\.(mp4|mov|avi|mkv|webm)$/,
|
|
42
|
+
/\.(mp3|wav|ogg|flac)$/,
|
|
43
|
+
/\.(woff2?|ttf|otf|eot)$/,
|
|
44
|
+
/\.(pdf|zip|tar|gz|7z|rar)$/
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
function isSkippedFile(filePath) {
|
|
48
|
+
return SKIP_FILE_PATTERNS.some(re => re.test(filePath));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 文件优先级:数字越大越重要(与 GUI 一致)
|
|
52
|
+
function filePriority(p) {
|
|
53
|
+
if (/\.(test|spec)\.(js|ts|jsx|tsx|vue)$/i.test(p)) return 1;
|
|
54
|
+
if (/^docs?\//i.test(p) || /\.md$/i.test(p)) return 2;
|
|
55
|
+
if (/\.(json|ya?ml|toml|env|ini|cfg|conf)$/i.test(p)) return 3;
|
|
56
|
+
if (/\.(css|scss|sass|less|html|vue|jsx|tsx)$/i.test(p)) return 4;
|
|
57
|
+
if (/\.(ts|js|mjs|cjs)$/i.test(p)) return 5;
|
|
58
|
+
return 3;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 从 git diff 文本解析出 per-file 块(与 GUI parseDiffByFile 一致)
|
|
62
|
+
function parseDiffByFile(diffText) {
|
|
63
|
+
if (!diffText) return [];
|
|
64
|
+
const files = [];
|
|
65
|
+
const parts = diffText.split(/^diff --git /m).filter(Boolean);
|
|
66
|
+
for (const part of parts) {
|
|
67
|
+
const headerEnd = part.indexOf('\n');
|
|
68
|
+
const headerLine = (headerEnd >= 0 ? part.slice(0, headerEnd) : part).trim();
|
|
69
|
+
const m = headerLine.match(/^a\/(.+?)\s+b\/(.+)$/);
|
|
70
|
+
if (!m) continue;
|
|
71
|
+
const bPath = m[2];
|
|
72
|
+
const patch = part.slice(headerEnd + 1);
|
|
73
|
+
let added = 0, removed = 0;
|
|
74
|
+
for (const line of patch.split('\n')) {
|
|
75
|
+
if (line.startsWith('+') && !line.startsWith('+++')) added++;
|
|
76
|
+
else if (line.startsWith('-') && !line.startsWith('---')) removed++;
|
|
77
|
+
}
|
|
78
|
+
files.push({ path: bPath, patch, added, removed });
|
|
79
|
+
}
|
|
80
|
+
return files;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// ──────────────────────────────────────────────
|
|
84
|
+
// 收集 AI 生成提交信息所需的 diff 和文件列表
|
|
85
|
+
// 关键: untracked 文件默认不会出现在 git diff 输出里,
|
|
86
|
+
// 所以先对所有 untracked 文件做 git add -N(intent to add),
|
|
87
|
+
// 这样它们会以 "new file" 形式出现在 diff 里
|
|
88
|
+
// ──────────────────────────────────────────────
|
|
89
|
+
async function collectDiff() {
|
|
90
|
+
const opts = { log: false };
|
|
91
|
+
|
|
92
|
+
// 1. 拿到工作区状态,识别 untracked 文件
|
|
93
|
+
const { stdout: statusOut } = await execGitCommand(
|
|
94
|
+
['status', '--porcelain=1', '--untracked-files=all'], opts
|
|
95
|
+
);
|
|
96
|
+
const untracked = [];
|
|
97
|
+
const fileList = [];
|
|
98
|
+
for (const line of (statusOut || '').split('\n')) {
|
|
99
|
+
if (!line || line.length < 3) continue;
|
|
100
|
+
const x = line[0];
|
|
101
|
+
const y = line[1];
|
|
102
|
+
const filePath = line.slice(3);
|
|
103
|
+
if (x === '?' && y === '?') {
|
|
104
|
+
untracked.push(filePath);
|
|
105
|
+
fileList.push(`? ${filePath}`);
|
|
106
|
+
} else if (x !== ' ' || y !== ' ') {
|
|
107
|
+
fileList.push(`${x !== ' ' ? x : ' '} ${filePath}`.trim());
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// 2. 对 untracked 文件做 intent to add(只在内存中,不会真的暂存内容)
|
|
112
|
+
if (untracked.length > 0) {
|
|
113
|
+
const batchSize = 20;
|
|
114
|
+
for (let i = 0; i < untracked.length; i += batchSize) {
|
|
115
|
+
const batch = untracked.slice(i, i + batchSize);
|
|
116
|
+
try {
|
|
117
|
+
await execGitCommand(['add', '-N', '--force', ...batch], opts);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
// 单批失败不影响整体
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// 3. 合并 staged + unstaged diff
|
|
125
|
+
const [stagedRes, unstagedRes] = await Promise.all([
|
|
126
|
+
execGitCommand(['diff', '--staged', '--no-color', '--no-ext-diff'], opts).catch(() => ({ stdout: '' })),
|
|
127
|
+
execGitCommand(['diff', '--no-color', '--no-ext-diff'], opts).catch(() => ({ stdout: '' })),
|
|
128
|
+
]);
|
|
129
|
+
let combined = '';
|
|
130
|
+
if (stagedRes?.stdout) combined += stagedRes.stdout.trim() + '\n';
|
|
131
|
+
if (unstagedRes?.stdout) combined += unstagedRes.stdout.trim() + '\n';
|
|
132
|
+
|
|
133
|
+
return { diff: combined.trim(), fileList };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// 把 diff 压缩成给 LLM 的紧凑文本(与 GUI prepareDiffForPrompt 逻辑一致)
|
|
137
|
+
// 策略: 跳过产物/资源文件(用一行 stat 带过),源码按优先级排序,每个文件 patch 限 1500 字,总预算 6000 字
|
|
138
|
+
function prepareDiffForPrompt(diffText, fileList) {
|
|
139
|
+
const safeFileList = Array.isArray(fileList) ? fileList : [];
|
|
140
|
+
let files = parseDiffByFile(diffText);
|
|
141
|
+
|
|
142
|
+
if (safeFileList.length > 0 && files.length > 0) {
|
|
143
|
+
const selectedPaths = new Set(
|
|
144
|
+
safeFileList
|
|
145
|
+
.map(s => {
|
|
146
|
+
if (typeof s !== 'string') return '';
|
|
147
|
+
const m = s.match(/^[A-Z?\s]+\s+(.+)$/);
|
|
148
|
+
return (m ? m[1] : s).replace(/\\/g, '/');
|
|
149
|
+
})
|
|
150
|
+
.filter(Boolean)
|
|
151
|
+
);
|
|
152
|
+
if (selectedPaths.size > 0) {
|
|
153
|
+
files = files.filter(f => selectedPaths.has(f.path.replace(/\\/g, '/')));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (files.length === 0) {
|
|
158
|
+
const list = safeFileList.slice(0, 30).map(s => {
|
|
159
|
+
const m = s.match(/^[A-Z?\s]+\s+(.+)$/);
|
|
160
|
+
return m ? m[1] : s;
|
|
161
|
+
});
|
|
162
|
+
if (list.length === 0) return '';
|
|
163
|
+
return list.map(p => {
|
|
164
|
+
if (isSkippedFile(p)) return `${p} [产物/资源,已跳过]`;
|
|
165
|
+
return p;
|
|
166
|
+
}).join('\n');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const skipped = [];
|
|
170
|
+
const kept = [];
|
|
171
|
+
for (const f of files) {
|
|
172
|
+
if (isSkippedFile(f.path)) {
|
|
173
|
+
skipped.push(f);
|
|
174
|
+
} else {
|
|
175
|
+
kept.push(f);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
kept.sort((a, b) => {
|
|
180
|
+
const dp = filePriority(b.path) - filePriority(a.path);
|
|
181
|
+
if (dp !== 0) return dp;
|
|
182
|
+
return (b.added + b.removed) - (a.added + a.removed);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const TOTAL_BUDGET = 6000;
|
|
186
|
+
const PER_FILE_LIMIT = 1500;
|
|
187
|
+
const lines = [];
|
|
188
|
+
let budget = TOTAL_BUDGET;
|
|
189
|
+
|
|
190
|
+
for (const f of skipped) {
|
|
191
|
+
if (budget < 80) break;
|
|
192
|
+
lines.push(`${f.path} [+${f.added}/-${f.removed}, 已跳过产物/资源]`);
|
|
193
|
+
budget -= 80;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
for (const f of kept) {
|
|
197
|
+
if (budget <= 50) break;
|
|
198
|
+
let patch = f.patch;
|
|
199
|
+
let truncated = false;
|
|
200
|
+
if (patch.length > PER_FILE_LIMIT) {
|
|
201
|
+
patch = patch.slice(0, PER_FILE_LIMIT) + '\n... (diff 已截断)';
|
|
202
|
+
truncated = true;
|
|
203
|
+
}
|
|
204
|
+
const block = `--- ${f.path} (+${f.added}/-${f.removed})${truncated ? ' [截断]' : ''}\n${patch}`;
|
|
205
|
+
if (block.length > budget) {
|
|
206
|
+
const sliceLen = Math.max(0, budget - 80);
|
|
207
|
+
if (sliceLen < 100) break;
|
|
208
|
+
lines.push(`--- ${f.path} (+${f.added}/-${f.removed}) [预算耗尽,已截断]\n${patch.slice(0, sliceLen)}`);
|
|
209
|
+
budget = 0;
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
lines.push(block);
|
|
213
|
+
budget -= block.length;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return lines.length > 0 ? lines.join('\n\n') : '';
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// ──────────────────────────────────────────────
|
|
220
|
+
// 主入口: 生成 AI 提交信息
|
|
221
|
+
// 返回 Conventional Commits 格式的字符串,如 "feat(auth): 添加登录按钮"
|
|
222
|
+
// ──────────────────────────────────────────────
|
|
223
|
+
export async function generateAiCommitMessage({ locale = 'zh-CN' } = {}) {
|
|
224
|
+
// 1. 读取配置,获取默认模型
|
|
225
|
+
const cfg = await config.loadConfig();
|
|
226
|
+
const models = Array.isArray(cfg.models) ? cfg.models : [];
|
|
227
|
+
const defaultModel = models.find(m => m.isDefault) || models[0];
|
|
228
|
+
if (!defaultModel) {
|
|
229
|
+
throw new Error('未配置 AI 模型,请先在 GUI 通用设置中添加模型(运行 g ui 打开设置)');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// 2. 收集 diff
|
|
233
|
+
const spinner = ora('正在收集代码变更...').start();
|
|
234
|
+
const { diff: rawDiff, fileList } = await collectDiff();
|
|
235
|
+
const diffText = prepareDiffForPrompt(rawDiff, fileList);
|
|
236
|
+
const filesText = fileList.slice(0, 30).join('\n');
|
|
237
|
+
|
|
238
|
+
if (!diffText && fileList.length === 0) {
|
|
239
|
+
spinner.fail('没有检测到代码变更');
|
|
240
|
+
throw new Error('没有检测到代码变更');
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
spinner.succeed(`已收集 ${fileList.length} 个文件变更`);
|
|
244
|
+
|
|
245
|
+
// 3. 构建 prompt(与 GUI 一致)
|
|
246
|
+
const promptZh = `你是一个 Git 提交信息生成助手。根据以下 git diff 信息,生成一条符合 Conventional Commits 规范的提交信息。
|
|
247
|
+
|
|
248
|
+
要求:
|
|
249
|
+
1. type 只能是:feat/fix/docs/style/refactor/test/chore 之一
|
|
250
|
+
2. scope 可选,表示影响范围,简短英文或中文,如果改动范围明确就填
|
|
251
|
+
3. description 用中文简短描述本次变更(不超过50字)
|
|
252
|
+
4. 只返回 JSON,格式:{"type":"feat","scope":"","description":"xxx"}
|
|
253
|
+
|
|
254
|
+
变更文件:
|
|
255
|
+
${filesText}
|
|
256
|
+
|
|
257
|
+
git diff --staged:
|
|
258
|
+
${diffText || '(无 staged 内容,请根据文件列表推断)'}`;
|
|
259
|
+
|
|
260
|
+
const promptEn = `You are a Git commit message generation assistant. Based on the following git diff, generate a commit message that follows the Conventional Commits specification.
|
|
261
|
+
|
|
262
|
+
Requirements:
|
|
263
|
+
1. type must be one of: feat/fix/docs/style/refactor/test/chore
|
|
264
|
+
2. scope is optional; use a short English word or short noun phrase to indicate the affected area. Leave empty if unclear.
|
|
265
|
+
3. description must be a concise English summary of the change (no more than 50 characters). Use the imperative mood (e.g. "add login button", not "added" or "adding").
|
|
266
|
+
4. Return ONLY a JSON object in the format: {"type":"feat","scope":"","description":"xxx"}
|
|
267
|
+
|
|
268
|
+
Changed files:
|
|
269
|
+
${filesText}
|
|
270
|
+
|
|
271
|
+
git diff --staged:
|
|
272
|
+
${diffText || '(no staged content, please infer from the file list)'}`;
|
|
273
|
+
|
|
274
|
+
const prompt = locale.startsWith('en') ? promptEn : promptZh;
|
|
275
|
+
|
|
276
|
+
// 4. 调用 LLM
|
|
277
|
+
spinner.start('AI 正在生成提交信息...');
|
|
278
|
+
const { default: fetch } = await import('node-fetch').catch(() => ({ default: globalThis.fetch }));
|
|
279
|
+
const url = `${defaultModel.baseURL.replace(/\/$/, '')}/chat/completions`;
|
|
280
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
281
|
+
if (defaultModel.apiKey) headers['Authorization'] = `Bearer ${defaultModel.apiKey}`;
|
|
282
|
+
const body = JSON.stringify({
|
|
283
|
+
model: defaultModel.model,
|
|
284
|
+
messages: [{ role: 'user', content: prompt }],
|
|
285
|
+
max_tokens: 1024,
|
|
286
|
+
temperature: 0.3,
|
|
287
|
+
stream: false
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
const controller = new AbortController();
|
|
291
|
+
const timer = setTimeout(() => controller.abort(), 60000);
|
|
292
|
+
let response;
|
|
293
|
+
try {
|
|
294
|
+
response = await fetch(url, { method: 'POST', headers, body, signal: controller.signal });
|
|
295
|
+
} finally {
|
|
296
|
+
clearTimeout(timer);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const data = await response.json().catch(() => ({}));
|
|
300
|
+
if (!response.ok) {
|
|
301
|
+
const msg = data?.error?.message || data?.message || `HTTP ${response.status}`;
|
|
302
|
+
spinner.fail(`AI 请求失败: ${msg}`);
|
|
303
|
+
throw new Error(`AI 请求失败: ${msg}`);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const content = data?.choices?.[0]?.message?.content || '';
|
|
307
|
+
|
|
308
|
+
// 5. 解析 JSON 响应(与 GUI 一致的容错逻辑)
|
|
309
|
+
const codeBlockMatch = content.match(/```(?:json)?\s*(\{[^`]*?\})\s*```/);
|
|
310
|
+
const jsonMatch = codeBlockMatch
|
|
311
|
+
? [codeBlockMatch[1]]
|
|
312
|
+
: [...content.matchAll(/\{[^{}]*\}/g)].at(-1);
|
|
313
|
+
|
|
314
|
+
if (!jsonMatch) {
|
|
315
|
+
spinner.fail('AI 未返回有效的 JSON');
|
|
316
|
+
throw new Error('AI 未返回有效的 JSON');
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
let parsed;
|
|
320
|
+
try {
|
|
321
|
+
parsed = JSON.parse(jsonMatch[0]);
|
|
322
|
+
} catch {
|
|
323
|
+
// JSON.parse 失败时用正则兜底提取字段
|
|
324
|
+
const typeM = jsonMatch[0].match(/"type"\s*:\s*"([^"]+)"/);
|
|
325
|
+
const scopeM = jsonMatch[0].match(/"scope"\s*:\s*"([^"]*)"/);
|
|
326
|
+
const descM = jsonMatch[0].match(/"description"\s*:\s*"([^"]+)"/);
|
|
327
|
+
if (typeM || descM) {
|
|
328
|
+
parsed = {
|
|
329
|
+
type: (typeM?.[1] || 'feat').trim(),
|
|
330
|
+
scope: (scopeM?.[1] || '').trim(),
|
|
331
|
+
description: (descM?.[1] || '').trim()
|
|
332
|
+
};
|
|
333
|
+
} else {
|
|
334
|
+
spinner.fail('AI 返回的 JSON 解析失败');
|
|
335
|
+
throw new Error('AI 返回的 JSON 解析失败');
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// 6. 构建 Conventional Commits 消息
|
|
340
|
+
const type = String(parsed.type || 'feat').trim();
|
|
341
|
+
const scope = String(parsed.scope || '').trim();
|
|
342
|
+
const description = String(parsed.description || '').trim();
|
|
343
|
+
const commitMessage = scope
|
|
344
|
+
? `${type}(${scope}): ${description}`
|
|
345
|
+
: `${type}: ${description}`;
|
|
346
|
+
|
|
347
|
+
spinner.succeed(`AI 生成提交信息: ${chalk.cyan(commitMessage)}`);
|
|
348
|
+
return commitMessage;
|
|
349
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import"./rolldown-runtime-CMxvf4Kt.js";import{B as e,Cn as t,D as n,Et as r,Fn as i,G as a,Jn as o,Ln as s,Mn as c,Sn as l,Tn as u,Xn as d,Y as f,_n as p,_r as m,a as h,gn as g,hn as _,i as v,mn as y,mr as b,nt as x,pr as S,rt as C,sr as w,vn as T,zn as E}from"./element-plus-DB-NeCl9.js";import{n as D,t as O}from"./_plugin-vue_export-helper-DIn89cdZ.js";async function k(e,t){let n=e.body.getReader(),r=new TextDecoder(`utf-8`),i=``;for(;;){let{done:e,value:a}=await n.read();if(e)break;i+=r.decode(a,{stream:!0});let o=i.split(`
|
|
2
|
-
`);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function A(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function j(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await k(t,t=>{try{e(JSON.parse(t))}catch{}})}async function M(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};k(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}var N={key:3},P={key:4},F={key:5},I={key:0,class:`upgrade-hint`},L={key:0,class:`upgrade-countdown`},R=O(u({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(i,{emit:a}){let s=i,u=a,h=w(null);o(()=>s.logs,async()=>{await c(),h.value&&(h.value.scrollTop=h.value.scrollHeight)});function v(){s.status!==`running`&&(s.status===`success`&&s.countdown>0&&u(`cancel`),u(`update:modelValue`,!1))}function y(){u(`retry`)}function O(){u(`restart`)}function k(){u(`cancel`),u(`update:modelValue`,!1)}return(a,o)=>{let s=f,c=e,w=n;return E(),g(w,{"model-value":i.modelValue,"onUpdate:modelValue":o[0]||=e=>u(`update:modelValue`,e),title:S(D)(`@F13B4:升级`),width:`680px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`running`,"append-to-body":``,onClose:v},{footer:d(()=>[i.status===`failed`?(E(),g(c,{key:0,type:`primary`,onClick:y},{default:d(()=>[l(m(S(D)(`@F13B4:重试`)),1)]),_:1})):p(``,!0),i.status===`success`?(E(),g(c,{key:1,type:`primary`,onClick:O},{default:d(()=>[l(m(S(D)(`@F13B4:立即重启并刷新`)),1)]),_:1})):p(``,!0),i.status===`success`?(E(),g(c,{key:2,onClick:k},{default:d(()=>[l(m(S(D)(`@F13B4:稍后手动重启`)),1)]),_:1})):p(``,!0),i.status===`running`?(E(),g(c,{key:3,disabled:``},{default:d(()=>[l(m(S(D)(`@F13B4:升级中`))+`... `,1)]),_:1})):p(``,!0)]),default:d(()=>[_(`div`,{class:b([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(E(),g(s,{key:0,class:`is-loading`},{default:d(()=>[t(S(r))]),_:1})):i.status===`success`?(E(),g(s,{key:1,color:`#67c23a`},{default:d(()=>[t(S(x))]),_:1})):(E(),g(s,{key:2,color:`#f56c6c`},{default:d(()=>[t(S(C))]),_:1})),i.status===`running`?(E(),T(`span`,N,m(S(D)(`@F13B4:升级中`)),1)):i.status===`success`?(E(),T(`span`,P,m(S(D)(`@F13B4:升级完成`)),1)):(E(),T(`span`,F,m(S(D)(`@F13B4:升级失败`)),1))],2),i.status===`success`?(E(),T(`p`,I,[l(m(S(D)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(E(),T(`span`,L,m(S(D)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):p(``,!0)])):p(``,!0),_(`pre`,{ref_key:`logEl`,ref:h,class:`upgrade-log`},m(i.logs||S(D)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-3de8edac`]]),z={class:`app-version-badge`},B=[`aria-label`],V=[`aria-label`],H=[`title`,`aria-label`],U={class:`upgrade-btn__label`},W={class:`upgrade-btn__version`},G=`https://github.com/xz333221/zen-gitsync/releases`,K=5,q=`app-version-check`,J=3600*1e3,Y=O(u({__name:`AppVersionBadge`,setup(e){let n=`2.15.
|
|
2
|
+
`);i=o.pop()??``;for(let e of o)e.trim()&&t(e)}i.trim()&&t(i)}async function A(){let e=await fetch(`/api/app-version`);return e.ok?e.json():{success:!1,current:``,latest:null,hasUpdate:!1,error:`HTTP ${e.status}`}}async function j(e){let t=await fetch(`/api/app-upgrade`,{method:`POST`});if(!t.ok){let n=`HTTP ${t.status}`;try{let e=await t.json();e?.error&&(n=e.error)}catch{}e({type:`error`,message:n}),e({type:`done`,code:t.status});return}if(!t.body){e({type:`error`,message:`响应无 body`}),e({type:`done`,code:-1});return}await k(t,t=>{try{e(JSON.parse(t))}catch{}})}async function M(){let e=await fetch(`/api/app-restart`,{method:`POST`});if(!e.ok){let t=`HTTP ${e.status}`;try{let n=await e.json();n?.error&&(t=n.error)}catch{}throw Error(t)}if(!e.body)throw Error(`响应无 body`);return new Promise((t,n)=>{let r=!1,i=e=>{r||(r=!0,e())};k(e,e=>{try{let r=JSON.parse(e);r.type===`ready`&&typeof r.port==`number`&&r.port>0?i(()=>t(r.port)):r.type===`timeout`?i(()=>n(Error(`restart.timeout`))):r.type===`error`&&i(()=>n(Error(r.message||`restart.failed`)))}catch{}}).then(()=>{i(()=>n(Error(`restart.stream-closed`)))}).catch(()=>{})})}var N={key:3},P={key:4},F={key:5},I={key:0,class:`upgrade-hint`},L={key:0,class:`upgrade-countdown`},R=O(u({__name:`UpgradeDialog`,props:{modelValue:{type:Boolean},logs:{},status:{},countdown:{default:0}},emits:[`update:modelValue`,`retry`,`restart`,`cancel`],setup(i,{emit:a}){let s=i,u=a,h=w(null);o(()=>s.logs,async()=>{await c(),h.value&&(h.value.scrollTop=h.value.scrollHeight)});function v(){s.status!==`running`&&(s.status===`success`&&s.countdown>0&&u(`cancel`),u(`update:modelValue`,!1))}function y(){u(`retry`)}function O(){u(`restart`)}function k(){u(`cancel`),u(`update:modelValue`,!1)}return(a,o)=>{let s=f,c=e,w=n;return E(),g(w,{"model-value":i.modelValue,"onUpdate:modelValue":o[0]||=e=>u(`update:modelValue`,e),title:S(D)(`@F13B4:升级`),width:`680px`,"close-on-click-modal":!1,"close-on-press-escape":!1,"show-close":i.status!==`running`,"append-to-body":``,onClose:v},{footer:d(()=>[i.status===`failed`?(E(),g(c,{key:0,type:`primary`,onClick:y},{default:d(()=>[l(m(S(D)(`@F13B4:重试`)),1)]),_:1})):p(``,!0),i.status===`success`?(E(),g(c,{key:1,type:`primary`,onClick:O},{default:d(()=>[l(m(S(D)(`@F13B4:立即重启并刷新`)),1)]),_:1})):p(``,!0),i.status===`success`?(E(),g(c,{key:2,onClick:k},{default:d(()=>[l(m(S(D)(`@F13B4:稍后手动重启`)),1)]),_:1})):p(``,!0),i.status===`running`?(E(),g(c,{key:3,disabled:``},{default:d(()=>[l(m(S(D)(`@F13B4:升级中`))+`... `,1)]),_:1})):p(``,!0)]),default:d(()=>[_(`div`,{class:b([`upgrade-status`,`is-${i.status}`])},[i.status===`running`?(E(),g(s,{key:0,class:`is-loading`},{default:d(()=>[t(S(r))]),_:1})):i.status===`success`?(E(),g(s,{key:1,color:`#67c23a`},{default:d(()=>[t(S(x))]),_:1})):(E(),g(s,{key:2,color:`#f56c6c`},{default:d(()=>[t(S(C))]),_:1})),i.status===`running`?(E(),T(`span`,N,m(S(D)(`@F13B4:升级中`)),1)):i.status===`success`?(E(),T(`span`,P,m(S(D)(`@F13B4:升级完成`)),1)):(E(),T(`span`,F,m(S(D)(`@F13B4:升级失败`)),1))],2),i.status===`success`?(E(),T(`p`,I,[l(m(S(D)(`@F13B4:新版本已全局安装,需要重启服务才能生效`))+` `,1),i.countdown>0?(E(),T(`span`,L,m(S(D)(`@F13B4:{seconds} 秒后自动刷新`,{seconds:i.countdown})),1)):p(``,!0)])):p(``,!0),_(`pre`,{ref_key:`logEl`,ref:h,class:`upgrade-log`},m(i.logs||S(D)(`@F13B4:等待日志输出`)),513)]),_:1},8,[`model-value`,`title`,`show-close`])}}}),[[`__scopeId`,`data-v-3de8edac`]]),z={class:`app-version-badge`},B=[`aria-label`],V=[`aria-label`],H=[`title`,`aria-label`],U={class:`upgrade-btn__label`},W={class:`upgrade-btn__version`},G=`https://github.com/xz333221/zen-gitsync/releases`,K=5,q=`app-version-check`,J=3600*1e3,Y=O(u({__name:`AppVersionBadge`,setup(e){let n=`2.15.5`,r=w(n),o=y(()=>r.value||n),c=w(null),l=w(!1),u=w(``),f=w(`running`),g=w(0),b=null,x=w(!1);function C(){try{let e=sessionStorage.getItem(q);if(!e)return null;let{at:t,data:n}=JSON.parse(e);return Date.now()-t>J?null:n}catch{return null}}function O(e){try{sessionStorage.setItem(q,JSON.stringify({at:Date.now(),data:e}))}catch{}}async function k(e=!1){let t=C();t&&(c.value=t);try{let t=await A();c.value=t,O(t),t.current&&(r.value=t.current),!e&&t.success&&t.hasUpdate&&h({type:`success`,message:D(`@F13B4:发现新版本 {version}`,{version:t.latest??``}),duration:4e3})}catch(t){e||h({type:`warning`,message:D(`@F13B4:检查更新失败 {error}`,{error:t?.message||``})})}}async function N(){if(c.value?.hasUpdate){try{await v.confirm(D(`@F13B4:确定要从 {current} 升级到 {latest} 吗?`,{current:c.value.current,latest:c.value.latest}),D(`@F13B4:升级`),{confirmButtonText:D(`@F13B4:确定升级`),cancelButtonText:D(`@F13B4:取消`),type:`info`})}catch{return}u.value=``,f.value=`running`,l.value=!0,await j(e=>{if(e.type===`done`){if(f.value=e.code===0?`success`:`failed`,e.code===0){try{sessionStorage.removeItem(q)}catch{}c.value?.latest&&(r.value=c.value.latest),P()}}else e.message&&(u.value+=e.message)})}}function P(){F(),g.value=K,b=setInterval(()=>{--g.value,g.value<=0&&(b&&=(clearInterval(b),null),L())},1e3)}function F(){b&&=(clearInterval(b),null),g.value=0}function I(){F()}async function L(){if(F(),!x.value){x.value=!0;try{let e=await M(),{pathname:t,search:n,hash:r}=window.location;window.location.href=`http://localhost:${e}${t}${n}${r}`}catch(e){let t=e?.message||``,n={"restart.timeout":`@F13B4:重启超时`,"restart.stream-closed":`@F13B4:重启失败,请刷新页面重试`,"restart.failed":`@F13B4:重启失败`}[t];h({type:`warning`,message:n?D(n):D(`@F13B4:重启失败 {error}`,{error:t})}),x.value=!1}}}return i(()=>{F()}),s(()=>{k(!0)}),(e,n)=>{let r=a;return E(),T(`div`,z,[t(r,{content:S(D)(`@F13B4:在 GitHub 上查看源码`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:`https://github.com/xz333221/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link`,"aria-label":S(D)(`@F13B4:在 GitHub 上查看源码`)},[...n[1]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[_(`path`,{d:`M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844a9.59 9.59 0 0 1 2.504.337c1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.02 10.02 0 0 0 22 12.017C22 6.484 17.522 2 12 2z`})],-1)]],8,B)]),_:1},8,[`content`]),t(r,{content:S(D)(`@F13B4:在 npm 上查看包`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:`https://www.npmjs.com/package/zen-gitsync`,target:`_blank`,rel:`noopener noreferrer`,class:`badge-icon-link badge-icon-link--npm`,"aria-label":S(D)(`@F13B4:在 npm 上查看包`)},[...n[2]||=[_(`svg`,{viewBox:`0 0 24 24`,width:`15`,height:`15`,"aria-hidden":`true`,fill:`currentColor`,xmlns:`http://www.w3.org/2000/svg`},[_(`path`,{d:`M2 2v20h20V2H2zm17.167 17.167H12.5v-10h-3.333v10H4.833V4.833h14.334v14.334z`})],-1)]],8,V)]),_:1},8,[`content`]),t(r,{content:S(D)(`@F13B4:查看更新`),placement:`top`,effect:`dark`,"show-after":300},{default:d(()=>[_(`a`,{href:G,target:`_blank`,rel:`noopener noreferrer`,class:`version-link`},`v`+m(o.value),1)]),_:1},8,[`content`]),c.value?.hasUpdate?(E(),T(`button`,{key:0,type:`button`,class:`upgrade-btn`,title:S(D)(`@F13B4:发现新版本 {version},点击升级`,{version:c.value.latest??``}),"aria-label":S(D)(`@F13B4:发现新版本 {version},点击升级`,{version:c.value.latest??``}),onClick:N},[n[3]||=_(`span`,{class:`upgrade-btn__dot`,"aria-hidden":`true`},null,-1),_(`span`,U,m(S(D)(`@F13B4:升级`)),1),_(`span`,W,`v`+m(c.value.latest),1)],8,H)):p(``,!0),t(R,{modelValue:l.value,"onUpdate:modelValue":n[0]||=e=>l.value=e,logs:u.value,status:f.value,countdown:g.value,onRetry:N,onRestart:L,onCancel:I},null,8,[`modelValue`,`logs`,`status`,`countdown`])])}}}),[[`__scopeId`,`data-v-bc7c0d5c`]]);export{Y as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rolldown-runtime-CMxvf4Kt.js";import{Cn as e,K as t,L as ee,Lt as n,Pt as r,R as i,Tn as a,Vn as o,W as te,Xn as s,Y as ne,_n as c,_r as l,cn as u,gn as d,hn as f,kt as p,mn as m,mr as h,pr as g,q as re,r as ie,sr as _,tt as v,un as y,vn as b,zn as x}from"./element-plus-DB-NeCl9.js";import{n as S,t as C}from"./_plugin-vue_export-helper-DIn89cdZ.js";import{t as w}from"./SvgIcon-B6tujJqO.js";import{b as ae,u as oe,v as T}from"./index-
|
|
1
|
+
import"./rolldown-runtime-CMxvf4Kt.js";import{Cn as e,K as t,L as ee,Lt as n,Pt as r,R as i,Tn as a,Vn as o,W as te,Xn as s,Y as ne,_n as c,_r as l,cn as u,gn as d,hn as f,kt as p,mn as m,mr as h,pr as g,q as re,r as ie,sr as _,tt as v,un as y,vn as b,zn as x}from"./element-plus-DB-NeCl9.js";import{n as S,t as C}from"./_plugin-vue_export-helper-DIn89cdZ.js";import{t as w}from"./SvgIcon-B6tujJqO.js";import{b as ae,u as oe,v as T}from"./index-DZ1sMoYt.js";var E={key:0,class:`branch-info`},D={class:`branch-wrapper`},O={class:`branch-btn`},k={class:`branch-btn-name`},A={class:`branch-btn-caret`},j={class:`branch-popover-inner`},M={class:`branch-search`},N={class:`branch-list`},P=[`onClick`],F={key:1,class:`branch-item-check-placeholder`},I={class:`branch-item-name`},L={key:0,class:`branch-empty`},R={class:`branch-popover-footer`},z={class:`create-branch-content`},B={class:`form-label`},se={class:`form-label`},V={class:`dialog-footer`},H={class:`footer-actions`},U=[`disabled`],W=C(a({__name:`BranchSelector`,emits:[`branchChanged`],setup(a,{emit:C}){let W=T(),G=C,K=_(!1),q=_(``),J=m(()=>{let e=q.value.trim().toLowerCase();return e?W.allBranches.filter(t=>t.toLowerCase().includes(e)):W.allBranches});async function ce(e){if(e===W.currentBranch){K.value=!1;return}K.value=!1,await W.changeBranch(e)&&(G(`branchChanged`),W.refreshLog())}let Y=_(!1),X=_(``),Z=_(``);function le(){K.value=!1,Z.value=W.currentBranch,Y.value=!0}async function Q(){await W.createBranch(X.value,Z.value)&&(Y.value=!1,X.value=``,G(`branchChanged`))}let $=_(!1);async function ue(){if(!$.value){$.value=!0;try{await Promise.all([W.getCurrentBranch(!0),W.getBranchStatus(!0),W.getAllBranches()]),G(`branchChanged`),W.refreshLog()}finally{$.value=!1}}}return(a,m)=>{let _=ne,C=te,T=ie,G=re,de=ee,fe=i,pe=t;return g(W).currentBranch?(x(),b(`div`,E,[f(`div`,D,[e(T,{visible:K.value,"onUpdate:visible":m[1]||=e=>K.value=e,placement:`top-start`,width:260,trigger:`click`,"popper-class":`branch-popover`,"show-arrow":!1,onShow:m[2]||=e=>q.value=``},{reference:s(()=>[f(`button`,O,[e(w,{"icon-class":`git-branch`,"class-name":`branch-btn-icon`}),f(`span`,k,l(g(W).currentBranch),1),f(`span`,A,[e(_,null,{default:s(()=>[...m[7]||=[f(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[f(`path`,{fill:`currentColor`,d:`M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.776a29.12 29.12 0 0 0 0-41.6 30.592 30.592 0 0 0-42.752 0z`})],-1)]]),_:1})])])]),default:s(()=>[f(`div`,j,[f(`div`,M,[e(C,{modelValue:q.value,"onUpdate:modelValue":m[0]||=e=>q.value=e,placeholder:g(S)(`@F13B4:搜索或签出分支`),size:`small`,clearable:``,autofocus:``},null,8,[`modelValue`,`placeholder`])]),f(`div`,N,[(x(!0),b(y,null,o(J.value,t=>(x(),b(`div`,{key:t,class:h([`branch-item`,{"is-active":t===g(W).currentBranch}]),onClick:e=>ce(t)},[t===g(W).currentBranch?(x(),d(_,{key:0,class:`branch-item-check`},{default:s(()=>[e(g(v))]),_:1})):(x(),b(`span`,F)),e(w,{"icon-class":`git-branch`,"class-name":`branch-item-icon`}),f(`span`,I,l(t),1)],10,P))),128)),J.value.length===0?(x(),b(`div`,L,l(g(S)(`@F13B4:没有匹配的分支`)),1)):c(``,!0)]),f(`div`,R,[f(`button`,{class:`branch-create-btn`,onClick:le},[e(_,null,{default:s(()=>[e(g(r))]),_:1}),f(`span`,null,l(g(S)(`@F13B4:创建新分支`)),1)])])])]),_:1},8,[`visible`]),e(ae,{tooltip:g(S)(`@CMDCON:刷新`),onClick:ue},{default:s(()=>[e(_,{class:h({"is-loading":$.value})},{default:s(()=>[e(g(n))]),_:1},8,[`class`])]),_:1},8,[`tooltip`])]),e(oe,{modelValue:Y.value,"onUpdate:modelValue":m[6]||=e=>Y.value=e,title:g(S)(`@F13B4:创建新分支`),size:`small`,"destroy-on-close":!0,"append-to-body":!0,"custom-class":`create-branch-dialog`},{footer:s(()=>[f(`div`,V,[f(`div`,H,[f(`button`,{type:`button`,class:`dialog-cancel-btn`,onClick:m[5]||=e=>Y.value=!1},l(g(S)(`@F13B4:取消`)),1),f(`button`,{type:`button`,class:`dialog-confirm-btn`,onClick:Q,disabled:g(W).isCreatingBranch},[g(W).isCreatingBranch?(x(),d(_,{key:1,class:`is-loading`},{default:s(()=>[...m[8]||=[f(`svg`,{viewBox:`0 0 1024 1024`,xmlns:`http://www.w3.org/2000/svg`},[f(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32z`})],-1)]]),_:1})):(x(),d(_,{key:0},{default:s(()=>[e(g(v))]),_:1})),f(`span`,null,l(g(S)(`@F13B4:创建`)),1)],8,U)])])]),default:s(()=>[f(`div`,z,[e(pe,{model:{newBranchName:X.value,selectedBaseBranch:Z.value},"label-position":`top`},{default:s(()=>[e(G,null,{label:s(()=>[f(`div`,B,[e(_,{class:`label-icon`},{default:s(()=>[e(g(r))]),_:1}),f(`span`,null,l(g(S)(`@F13B4:新分支名称`)),1)])]),default:s(()=>[e(C,{modelValue:X.value,"onUpdate:modelValue":m[3]||=e=>X.value=e,placeholder:g(S)(`@F13B4:请输入新分支名称`),class:`modern-input`,size:`large`,onKeyup:u(Q,[`enter`])},null,8,[`modelValue`,`placeholder`])]),_:1}),e(G,null,{label:s(()=>[f(`div`,se,[e(_,{class:`label-icon`},{default:s(()=>[e(g(p))]),_:1}),f(`span`,null,l(g(S)(`@F13B4:基于分支`)),1)])]),default:s(()=>[e(fe,{modelValue:Z.value,"onUpdate:modelValue":m[4]||=e=>Z.value=e,placeholder:g(S)(`@F13B4:选择基础分支`),class:`modern-select`,size:`large`,style:{width:`100%`}},{default:s(()=>[(x(!0),b(y,null,o(g(W).allBranches,e=>(x(),d(de,{key:e,label:e,value:e},null,8,[`label`,`value`]))),128))]),_:1},8,[`modelValue`,`placeholder`])]),_:1})]),_:1},8,[`model`])])]),_:1},8,[`modelValue`,`title`])])):c(``,!0)}}}),[[`__scopeId`,`data-v-665171bc`]]);export{W as default};
|