yuangs 5.34.0 → 5.35.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.
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 注册 git auto 命令
4
+ */
5
+ export declare function registerAutoCommand(gitCmd: Command): void;
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerAutoCommand = registerAutoCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const ora_1 = __importDefault(require("ora"));
42
+ const fs_1 = __importDefault(require("fs"));
43
+ const path_1 = __importDefault(require("path"));
44
+ const GitService_1 = require("../../core/git/GitService");
45
+ const llm_1 = require("../../agent/llm");
46
+ const TodoManager_1 = require("../../core/git/TodoManager");
47
+ const CodeReviewer_1 = require("../../core/git/CodeReviewer");
48
+ const constants_1 = require("../../core/git/constants");
49
+ const CodeGenerator_1 = require("../../core/git/CodeGenerator");
50
+ /**
51
+ * 执行单个任务
52
+ */
53
+ async function executeTask(task, context, model, previousFeedback) {
54
+ const prompt = [
55
+ {
56
+ role: 'system',
57
+ content: `你是一个资深软件工程师。请根据任务描述生成完整的代码实现。
58
+
59
+ **重要输出格式要求:**
60
+ 对于每个需要创建或修改的文件,请使用以下格式:
61
+
62
+ ### 文件: src/path/to/file.ts
63
+ \`\`\`typescript
64
+ // 完整的文件代码
65
+ \`\`\`
66
+
67
+ 要求:
68
+ 1. 明确指出每个文件的完整路径
69
+ 2. 提供完整的、可直接使用的代码
70
+ 3. 包含必要的注释
71
+ 4. 遵循最佳实践`
72
+ },
73
+ {
74
+ role: 'user',
75
+ content: `
76
+ [项目上下文]
77
+ ${context}
78
+
79
+ [当前任务]
80
+ ${task.description}
81
+
82
+ ${previousFeedback ? `\n[上次实现的问题]\n${previousFeedback}\n\n请根据以上反馈重新实现。` : ''}
83
+
84
+ 请生成完整的实现代码,并明确标注每个文件的路径。
85
+ `
86
+ }
87
+ ];
88
+ try {
89
+ const response = await (0, llm_1.runLLM)({
90
+ prompt: { messages: prompt },
91
+ model,
92
+ stream: false,
93
+ bypassRouter: true
94
+ });
95
+ return { code: response.rawText, success: true };
96
+ }
97
+ catch (e) {
98
+ return { code: '', success: false };
99
+ }
100
+ }
101
+ /**
102
+ * 执行代码审查
103
+ */
104
+ async function reviewCode() {
105
+ try {
106
+ const { CodeReviewer } = await Promise.resolve().then(() => __importStar(require('../../core/git/CodeReviewer')));
107
+ const { getRouter } = await Promise.resolve().then(() => __importStar(require('../../core/modelRouter')));
108
+ const gitService = new GitService_1.GitService();
109
+ const router = getRouter();
110
+ const reviewer = new CodeReviewer(gitService, router);
111
+ const result = await reviewer.review(CodeReviewer_1.ReviewLevel.STANDARD, true);
112
+ return {
113
+ score: result.score,
114
+ issues: result.issues.map(i => `${i.severity}: ${i.message}`)
115
+ };
116
+ }
117
+ catch (e) {
118
+ const errorMsg = e instanceof Error ? e.message : '未知错误';
119
+ console.warn(chalk_1.default.yellow(`⚠️ 代码审查失败: ${errorMsg}`));
120
+ // 审查失败时返回低分,避免掩盖问题
121
+ return {
122
+ score: constants_1.REVIEW_FAILURE_SCORE,
123
+ issues: [`审查系统错误: ${errorMsg}`],
124
+ error: errorMsg
125
+ };
126
+ }
127
+ }
128
+ /**
129
+ * 注册 git auto 命令
130
+ */
131
+ function registerAutoCommand(gitCmd) {
132
+ gitCmd
133
+ .command('auto')
134
+ .description('全自动工作流:plan → exec → review 循环')
135
+ .option('--max-tasks <number>', '最大执行任务数', '5')
136
+ .option('--model <model>', '指定 AI 模型', 'Assistant')
137
+ .option('--min-score <score>', '最低审查分数', '85')
138
+ .option('--skip-review', '跳过代码审查')
139
+ .option('--save-only', '只保存代码,不写入文件系统')
140
+ .action(async (options) => {
141
+ const todoPath = path_1.default.join(process.cwd(), 'todo.md');
142
+ const maxTasks = parseInt(options.maxTasks) || 5;
143
+ const minScore = parseInt(options.minScore) || constants_1.MIN_REVIEW_SCORE;
144
+ console.log(chalk_1.default.bold.cyan('\n🤖 启动全自动 AI 开发工作流...\n'));
145
+ console.log(chalk_1.default.gray(`📋 最大任务数: ${maxTasks}`));
146
+ console.log(chalk_1.default.gray(`🎯 最低审查分数: ${minScore}`));
147
+ console.log(chalk_1.default.gray(`🤖 AI 模型: ${options.model}\n`));
148
+ const spinner = (0, ora_1.default)('正在初始化...').start();
149
+ try {
150
+ // 1. 检查 todo.md 是否存在
151
+ await fs_1.default.promises.access(todoPath, fs_1.default.constants.F_OK);
152
+ // 2. 解析任务
153
+ const { metadata, tasks, rawContent } = await (0, TodoManager_1.parseTodoFile)(todoPath);
154
+ if (tasks.length === 0) {
155
+ spinner.fail('未找到任何任务');
156
+ console.log(chalk_1.default.yellow('💡 提示:请先运行 yuangs git plan 生成任务'));
157
+ return;
158
+ }
159
+ spinner.succeed(`发现 ${tasks.length} 个任务`);
160
+ const progress = (0, TodoManager_1.calculateProgress)(tasks);
161
+ console.log(chalk_1.default.cyan(`📊 当前进度: ${progress.completed}/${progress.total}\n`));
162
+ let tasksExecuted = 0;
163
+ // 3. 循环执行任务
164
+ while (tasksExecuted < maxTasks) {
165
+ const nextTask = (0, TodoManager_1.getNextTask)(tasks);
166
+ if (!nextTask) {
167
+ console.log(chalk_1.default.green('\n🎉 所有任务已完成!'));
168
+ break;
169
+ }
170
+ console.log(chalk_1.default.bold.cyan(`\n━━━ 任务 #${nextTask.index + 1} ━━━`));
171
+ console.log(chalk_1.default.white(`📝 ${nextTask.description}\n`));
172
+ let attempts = nextTask.attempts || 0;
173
+ let taskCompleted = false;
174
+ while (attempts <= constants_1.MAX_RETRY_ATTEMPTS && !taskCompleted) {
175
+ attempts++;
176
+ // 3a. 执行任务
177
+ spinner.start(`[尝试 ${attempts}/${constants_1.MAX_RETRY_ATTEMPTS + 1}] 正在生成代码...`);
178
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
179
+ execStatus: 'in_progress',
180
+ attempts
181
+ });
182
+ const previousFeedback = attempts > 1 && nextTask.reviewIssues
183
+ ? nextTask.reviewIssues.join('\n')
184
+ : undefined;
185
+ const { code, success } = await executeTask(nextTask, rawContent, options.model, previousFeedback);
186
+ if (!success) {
187
+ spinner.fail('代码生成失败');
188
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
189
+ execStatus: 'failed'
190
+ });
191
+ break;
192
+ }
193
+ spinner.succeed('代码已生成');
194
+ // 3b. 保存原始输出
195
+ const savedPath = await (0, CodeGenerator_1.saveRawOutput)(code, nextTask.index);
196
+ console.log(chalk_1.default.gray(`📄 原始输出已保存: ${path_1.default.relative(process.cwd(), savedPath)}`));
197
+ // 3c. 解析并写入代码
198
+ const generated = (0, CodeGenerator_1.parseGeneratedCode)(code);
199
+ if (generated.files.length > 0) {
200
+ console.log(chalk_1.default.cyan(`\n📦 检测到 ${generated.files.length} 个文件:\n`));
201
+ if (!options.saveOnly) {
202
+ const { written, skipped } = await (0, CodeGenerator_1.writeGeneratedCode)(generated);
203
+ if (written.length > 0) {
204
+ console.log(chalk_1.default.green(`\n✅ 成功写入 ${written.length} 个文件`));
205
+ }
206
+ if (skipped.length > 0) {
207
+ console.log(chalk_1.default.yellow(`⚠️ 跳过 ${skipped.length} 个文件`));
208
+ }
209
+ }
210
+ else {
211
+ console.log(chalk_1.default.gray(' (--save-only 模式,未写入文件系统)'));
212
+ generated.files.forEach(f => {
213
+ console.log(chalk_1.default.gray(` - ${f.path}`));
214
+ });
215
+ }
216
+ }
217
+ else {
218
+ console.log(chalk_1.default.yellow('\n⚠️ 未检测到可解析的文件路径和代码'));
219
+ console.log(chalk_1.default.gray('💡 提示:请检查 AI 输出格式,或查看原始输出文件'));
220
+ }
221
+ // 3b. 代码审查(如果未跳过)
222
+ if (!options.skipReview) {
223
+ spinner.start('正在进行代码审查...');
224
+ const review = await reviewCode();
225
+ spinner.succeed(`审查完成 (评分: ${review.score}/100)`);
226
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
227
+ reviewScore: review.score,
228
+ reviewIssues: review.issues
229
+ });
230
+ // 3c. 判断是否通过
231
+ if (review.score >= minScore) {
232
+ console.log(chalk_1.default.green(`✅ 审查通过!(${review.score} >= ${minScore})\n`));
233
+ taskCompleted = true;
234
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
235
+ completed: true,
236
+ execStatus: 'done'
237
+ });
238
+ nextTask.completed = true;
239
+ }
240
+ else {
241
+ console.log(chalk_1.default.yellow(`⚠️ 审查未通过 (${review.score} < ${minScore})`));
242
+ if (review.issues.length > 0) {
243
+ console.log(chalk_1.default.yellow('问题列表:'));
244
+ review.issues.forEach(issue => {
245
+ console.log(chalk_1.default.yellow(` • ${issue}`));
246
+ });
247
+ }
248
+ if (attempts <= constants_1.MAX_RETRY_ATTEMPTS) {
249
+ console.log(chalk_1.default.cyan(`\n🔄 将根据反馈重新生成...\n`));
250
+ }
251
+ else {
252
+ console.log(chalk_1.default.red(`\n❌ 已达最大重试次数,跳过此任务\n`));
253
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
254
+ execStatus: 'failed'
255
+ });
256
+ }
257
+ }
258
+ }
259
+ else {
260
+ // 跳过审查,直接标记完成
261
+ console.log(chalk_1.default.gray('⏭️ 已跳过代码审查\n'));
262
+ taskCompleted = true;
263
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
264
+ completed: true,
265
+ execStatus: 'done'
266
+ });
267
+ nextTask.completed = true;
268
+ }
269
+ }
270
+ tasksExecuted++;
271
+ // 更新总体进度
272
+ const newProgress = (0, TodoManager_1.calculateProgress)(tasks);
273
+ await (0, TodoManager_1.updateMetadata)(todoPath, {
274
+ progress: newProgress,
275
+ currentTask: nextTask.index + 1
276
+ });
277
+ }
278
+ // 4. 总结
279
+ const finalProgress = (0, TodoManager_1.calculateProgress)(tasks);
280
+ console.log(chalk_1.default.bold.cyan('\n━━━━━━━━━━━━━━━━━━━━━━━━━━━'));
281
+ console.log(chalk_1.default.bold.cyan('📊 工作流执行完成'));
282
+ console.log(chalk_1.default.bold.cyan('━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'));
283
+ console.log(chalk_1.default.white(`✅ 已完成: ${finalProgress.completed}/${finalProgress.total}`));
284
+ console.log(chalk_1.default.white(`🔄 本次执行: ${tasksExecuted} 个任务\n`));
285
+ if (finalProgress.completed < finalProgress.total) {
286
+ console.log(chalk_1.default.yellow('💡 提示:还有未完成的任务,可以再次运行 yuangs git auto 继续'));
287
+ }
288
+ }
289
+ catch (e) {
290
+ if (e instanceof Error && e.code === 'ENOENT') {
291
+ spinner.fail('未找到 todo.md 文件');
292
+ console.log(chalk_1.default.yellow('\n💡 建议流程:'));
293
+ console.log(chalk_1.default.gray(' 1. yuangs git plan "你的需求" # 生成任务清单'));
294
+ console.log(chalk_1.default.gray(' 2. yuangs git auto # 启动自动化工作流\n'));
295
+ }
296
+ else if (e instanceof llm_1.AIError) {
297
+ spinner.fail(`AI 调用失败: ${e.message}`);
298
+ }
299
+ else if (e instanceof Error) {
300
+ spinner.fail(`执行失败: ${e.message}`);
301
+ }
302
+ else {
303
+ spinner.fail('未知错误');
304
+ }
305
+ }
306
+ });
307
+ }
308
+ //# sourceMappingURL=auto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto.js","sourceRoot":"","sources":["../../../src/commands/git/auto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * 注册 git exec 命令
4
+ */
5
+ export declare function registerExecCommand(gitCmd: Command): void;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerExecCommand = registerExecCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const llm_1 = require("../../agent/llm");
12
+ const METADATA_PREFIX = '>';
13
+ /**
14
+ * 从 todo.md 中提取任务列表
15
+ */
16
+ async function parseTodoFile(filePath) {
17
+ const content = await fs_1.default.promises.readFile(filePath, 'utf8');
18
+ const lines = content.split('\n');
19
+ // 跳过元数据
20
+ let startIndex = 0;
21
+ while (startIndex < lines.length && lines[startIndex].trim().startsWith(METADATA_PREFIX)) {
22
+ startIndex++;
23
+ }
24
+ while (startIndex < lines.length && lines[startIndex].trim() === '') {
25
+ startIndex++;
26
+ }
27
+ const mainContent = lines.slice(startIndex).join('\n');
28
+ // 提取所有未完成的任务(- [ ] 格式)
29
+ const tasks = [];
30
+ const taskRegex = /^[\s]*-\s*\[\s*\]\s*(.+)$/gm;
31
+ let match;
32
+ while ((match = taskRegex.exec(mainContent)) !== null) {
33
+ tasks.push(match[1].trim());
34
+ }
35
+ return { tasks, context: mainContent };
36
+ }
37
+ /**
38
+ * 注册 git exec 命令
39
+ */
40
+ function registerExecCommand(gitCmd) {
41
+ gitCmd
42
+ .command('exec')
43
+ .description('根据 todo.md 自动生成代码并执行任务')
44
+ .option('--fromfile <file>', '指定 todo 文件路径', 'todo.md')
45
+ .option('--task <number>', '执行指定编号的任务(从 1 开始)')
46
+ .option('--model <model>', '指定 AI 模型', 'Assistant')
47
+ .action(async (options) => {
48
+ const todoPath = path_1.default.join(process.cwd(), options.fromfile);
49
+ const spinner = (0, ora_1.default)('正在读取任务文件...').start();
50
+ try {
51
+ // 1. 检查文件是否存在
52
+ await fs_1.default.promises.access(todoPath, fs_1.default.constants.F_OK);
53
+ // 2. 解析任务
54
+ const { tasks, context } = await parseTodoFile(todoPath);
55
+ if (tasks.length === 0) {
56
+ spinner.fail('未找到待执行的任务(- [ ] 格式)');
57
+ console.log(chalk_1.default.yellow('💡 提示:请确保 todo.md 中包含未完成的任务,格式如:- [ ] 任务描述'));
58
+ return;
59
+ }
60
+ spinner.succeed(`发现 ${tasks.length} 个待执行任务`);
61
+ // 3. 确定要执行的任务
62
+ let taskIndex = 0;
63
+ if (options.task) {
64
+ taskIndex = parseInt(options.task) - 1;
65
+ if (taskIndex < 0 || taskIndex >= tasks.length) {
66
+ console.error(chalk_1.default.red(`❌ 任务编号 ${options.task} 超出范围(1-${tasks.length})`));
67
+ return;
68
+ }
69
+ }
70
+ else {
71
+ // 默认执行第一个任务
72
+ taskIndex = 0;
73
+ }
74
+ const currentTask = tasks[taskIndex];
75
+ console.log(chalk_1.default.cyan(`\n📋 准备执行任务 #${taskIndex + 1}: ${chalk_1.default.bold(currentTask)}\n`));
76
+ // 4. 构建 AI 提示
77
+ spinner.start('正在生成实现方案...');
78
+ const prompt = [
79
+ {
80
+ role: 'system',
81
+ content: `你是一个资深软件工程师。请根据任务描述和上下文,生成完整的代码实现。
82
+ 要求:
83
+ 1. 输出可直接使用的代码
84
+ 2. 包含必要的注释
85
+ 3. 遵循最佳实践
86
+ 4. 如果需要创建新文件,明确指出文件路径`
87
+ },
88
+ {
89
+ role: 'user',
90
+ content: `
91
+ [项目上下文 - 来自 todo.md]
92
+ ${context}
93
+
94
+ [当前任务]
95
+ ${currentTask}
96
+
97
+ 请生成完整的实现代码。如果需要创建或修改文件,请按以下格式输出:
98
+
99
+ \`\`\`filepath
100
+ 文件路径
101
+ \`\`\`
102
+
103
+ \`\`\`code
104
+ 代码内容
105
+ \`\`\`
106
+ `
107
+ }
108
+ ];
109
+ const response = await (0, llm_1.runLLM)({
110
+ prompt: { messages: prompt },
111
+ model: options.model,
112
+ stream: false,
113
+ bypassRouter: true
114
+ });
115
+ spinner.succeed('实现方案已生成');
116
+ // 5. 显示生成的代码
117
+ console.log(chalk_1.default.gray('━'.repeat(60)));
118
+ console.log(response.rawText);
119
+ console.log(chalk_1.default.gray('━'.repeat(60)));
120
+ // 6. 询问是否应用
121
+ const readline = require('readline').createInterface({
122
+ input: process.stdin,
123
+ output: process.stdout
124
+ });
125
+ const answer = await new Promise((resolve) => {
126
+ readline.question(chalk_1.default.yellow('\n是否应用以上代码?(y/N): '), resolve);
127
+ });
128
+ readline.close();
129
+ if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
130
+ // 7. 解析并应用代码(这里需要实现文件写入逻辑)
131
+ console.log(chalk_1.default.green('\n✅ 代码已应用(文件写入功能待实现)'));
132
+ console.log(chalk_1.default.gray('💡 提示:请手动复制代码到对应文件,或等待自动写入功能完善'));
133
+ }
134
+ else {
135
+ console.log(chalk_1.default.gray('\n已取消应用'));
136
+ }
137
+ }
138
+ catch (e) {
139
+ if (e instanceof Error && e.code === 'ENOENT') {
140
+ spinner.fail(`文件不存在: ${todoPath}`);
141
+ console.log(chalk_1.default.yellow('💡 提示:请先运行 yuangs git plan 生成任务文件'));
142
+ }
143
+ else if (e instanceof llm_1.AIError) {
144
+ spinner.fail(`AI 调用失败: ${e.message}`);
145
+ console.error(chalk_1.default.red(`Status: ${e.statusCode}`));
146
+ }
147
+ else if (e instanceof Error) {
148
+ spinner.fail(`执行失败: ${e.message}`);
149
+ }
150
+ else {
151
+ spinner.fail('未知错误');
152
+ }
153
+ }
154
+ });
155
+ }
156
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/commands/git/exec.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,41 @@ const fs_1 = __importDefault(require("fs"));
10
10
  const path_1 = __importDefault(require("path"));
11
11
  const GitService_1 = require("../../core/git/GitService");
12
12
  const llm_1 = require("../../agent/llm");
13
+ const DEFAULT_PLAN_PROMPT = '分析项目现状并规划下一步开发任务';
14
+ const METADATA_PREFIX = '>';
15
+ /**
16
+ * 解析用户指令(优先级:命令行 > todo.md > 默认值)
17
+ */
18
+ async function resolveUserPrompt(cliPrompt, todoPath) {
19
+ if (cliPrompt) {
20
+ return { prompt: cliPrompt, fromFile: false };
21
+ }
22
+ try {
23
+ await fs_1.default.promises.access(todoPath, fs_1.default.constants.F_OK);
24
+ const content = await fs_1.default.promises.readFile(todoPath, 'utf8');
25
+ // 过滤掉文件开头由 yuangs 生成的元数据行(连续的 > 开头的行)
26
+ const lines = content.split('\n');
27
+ let startIndex = 0;
28
+ // 跳过开头连续的元数据行
29
+ while (startIndex < lines.length && lines[startIndex].trim().startsWith(METADATA_PREFIX)) {
30
+ startIndex++;
31
+ }
32
+ // 跳过元数据后的空行
33
+ while (startIndex < lines.length && lines[startIndex].trim() === '') {
34
+ startIndex++;
35
+ }
36
+ const filePrompt = lines.slice(startIndex).join('\n').trim();
37
+ if (filePrompt) {
38
+ return { prompt: filePrompt, fromFile: true };
39
+ }
40
+ }
41
+ catch (e) {
42
+ if (e instanceof Error && e.code !== 'ENOENT') {
43
+ console.warn(chalk_1.default.yellow(`⚠️ 读取 todo.md 失败: ${e.message}`));
44
+ }
45
+ }
46
+ return { prompt: DEFAULT_PLAN_PROMPT, fromFile: false };
47
+ }
13
48
  /**
14
49
  * 注册 git plan 命令
15
50
  */
@@ -19,10 +54,12 @@ function registerPlanCommand(gitCmd) {
19
54
  .description('自动读取最近 10 次提交,由两个 AI (架构师 & 审查员) 协作生成 todo.md')
20
55
  .option('-r, --rounds <number>', '对话轮数', '2')
21
56
  .action(async (promptParts, options) => {
22
- const userPrompt = promptParts.join(' ').trim() || '分析项目现状并规划下一步开发任务';
57
+ const cliPrompt = promptParts.join(' ').trim();
23
58
  const maxRounds = parseInt(options.rounds) || 2;
59
+ const todoPath = path_1.default.join(process.cwd(), 'todo.md');
60
+ const { prompt: userPrompt, fromFile } = await resolveUserPrompt(cliPrompt, todoPath);
24
61
  // 使用主 spinner 管理整体状态
25
- const spinner = (0, ora_1.default)('正在初始化分析规划...').start();
62
+ const spinner = (0, ora_1.default)(fromFile ? '正在从 todo.md 读取并初始化分析规划...' : '正在初始化分析规划...').start();
26
63
  try {
27
64
  const gitService = new GitService_1.GitService();
28
65
  if (!(await gitService.isGitRepository())) {
@@ -1 +1 @@
1
- {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/commands/git/plan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/commands/git/plan.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,15 @@ const review_1 = require("./git/review");
6
6
  const status_1 = require("./git/status");
7
7
  const branch_1 = require("./git/branch");
8
8
  const plan_1 = require("./git/plan");
9
+ const exec_1 = require("./git/exec");
10
+ const auto_1 = require("./git/auto");
9
11
  /**
10
12
  * 注册 Git 相关命令
11
13
  */
12
14
  function registerGitCommands(program) {
13
15
  const gitCmd = program
14
16
  .command('git')
15
- .description('Git 集成工具 - 智能提交、代码审查、分支管理')
17
+ .description('Git 集成工具 - 智能提交、代码审查、分支管理、自动化工作流')
16
18
  .action((options, cmd) => {
17
19
  if (cmd.args.length === 0) {
18
20
  cmd.help();
@@ -23,5 +25,7 @@ function registerGitCommands(program) {
23
25
  (0, status_1.registerStatusCommand)(gitCmd);
24
26
  (0, branch_1.registerBranchCommand)(gitCmd);
25
27
  (0, plan_1.registerPlanCommand)(gitCmd);
28
+ (0, exec_1.registerExecCommand)(gitCmd);
29
+ (0, auto_1.registerAutoCommand)(gitCmd);
26
30
  }
27
31
  //# sourceMappingURL=gitCommands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitCommands.js","sourceRoot":"","sources":["../../src/commands/gitCommands.ts"],"names":[],"mappings":";;AAUA,kDAeC;AAxBD,yCAAqD;AACrD,yCAAqD;AACrD,yCAAqD;AACrD,yCAAqD;AACrD,qCAAiD;AAEjD;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAgB;IAChD,MAAM,MAAM,GAAG,OAAO;SACjB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,CAAC,OAAY,EAAE,GAAQ,EAAE,EAAE;QAC/B,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,EAAE,CAAC;QACf,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,0BAAmB,EAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"gitCommands.js","sourceRoot":"","sources":["../../src/commands/gitCommands.ts"],"names":[],"mappings":";;AAYA,kDAiBC;AA5BD,yCAAqD;AACrD,yCAAqD;AACrD,yCAAqD;AACrD,yCAAqD;AACrD,qCAAiD;AACjD,qCAAiD;AACjD,qCAAiD;AAEjD;;GAEG;AACH,SAAgB,mBAAmB,CAAC,OAAgB;IAChD,MAAM,MAAM,GAAG,OAAO;SACjB,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,CAAC,OAAY,EAAE,GAAQ,EAAE,EAAE;QAC/B,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,EAAE,CAAC;QACf,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,8BAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,0BAAmB,EAAC,MAAM,CAAC,CAAC;IAC5B,IAAA,0BAAmB,EAAC,MAAM,CAAC,CAAC;IAC5B,IAAA,0BAAmB,EAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 代码生成结果
3
+ */
4
+ export interface GeneratedCode {
5
+ files: Array<{
6
+ path: string;
7
+ content: string;
8
+ action: 'create' | 'modify';
9
+ }>;
10
+ rawOutput: string;
11
+ }
12
+ /**
13
+ * 从 LLM 输出中解析文件路径和代码
14
+ */
15
+ export declare function parseGeneratedCode(llmOutput: string): GeneratedCode;
16
+ /**
17
+ * 将生成的代码写入文件系统
18
+ */
19
+ export declare function writeGeneratedCode(generated: GeneratedCode, baseDir?: string): Promise<{
20
+ written: string[];
21
+ skipped: string[];
22
+ }>;
23
+ /**
24
+ * 保存原始输出到临时文件
25
+ */
26
+ export declare function saveRawOutput(content: string, taskIndex: number, baseDir?: string): Promise<string>;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseGeneratedCode = parseGeneratedCode;
7
+ exports.writeGeneratedCode = writeGeneratedCode;
8
+ exports.saveRawOutput = saveRawOutput;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ /**
13
+ * 从 LLM 输出中解析文件路径和代码
14
+ */
15
+ function parseGeneratedCode(llmOutput) {
16
+ const files = [];
17
+ // 尝试多种格式解析
18
+ // 格式 1: ```filepath\n路径\n```\n```code\n代码\n```
19
+ const pattern1 = /```filepath\s*\n(.*?)\n```\s*\n```(?:typescript|javascript|ts|js|code)?\s*\n([\s\S]*?)\n```/gi;
20
+ let match;
21
+ while ((match = pattern1.exec(llmOutput)) !== null) {
22
+ files.push({
23
+ path: match[1].trim(),
24
+ content: match[2].trim(),
25
+ action: 'create'
26
+ });
27
+ }
28
+ // 格式 2: ### 文件: path/to/file.ts\n```typescript\n代码\n```
29
+ const pattern2 = /###?\s*(?:文件|File)[::]\s*([^\n]+)\s*\n```(?:typescript|javascript|ts|js|code)?\s*\n([\s\S]*?)\n```/gi;
30
+ while ((match = pattern2.exec(llmOutput)) !== null) {
31
+ const filePath = match[1].trim().replace(/`/g, '');
32
+ if (!files.some(f => f.path === filePath)) {
33
+ files.push({
34
+ path: filePath,
35
+ content: match[2].trim(),
36
+ action: 'create'
37
+ });
38
+ }
39
+ }
40
+ // 格式 3: **path/to/file.ts**\n```typescript\n代码\n```
41
+ const pattern3 = /\*\*([^*]+\.(?:ts|js|tsx|jsx|json|md))\*\*\s*\n```(?:typescript|javascript|ts|js|json|markdown|code)?\s*\n([\s\S]*?)\n```/gi;
42
+ while ((match = pattern3.exec(llmOutput)) !== null) {
43
+ const filePath = match[1].trim();
44
+ if (!files.some(f => f.path === filePath)) {
45
+ files.push({
46
+ path: filePath,
47
+ content: match[2].trim(),
48
+ action: 'create'
49
+ });
50
+ }
51
+ }
52
+ return {
53
+ files,
54
+ rawOutput: llmOutput
55
+ };
56
+ }
57
+ /**
58
+ * 将生成的代码写入文件系统
59
+ */
60
+ async function writeGeneratedCode(generated, baseDir = process.cwd()) {
61
+ const written = [];
62
+ const skipped = [];
63
+ for (const file of generated.files) {
64
+ try {
65
+ const fullPath = path_1.default.isAbsolute(file.path)
66
+ ? file.path
67
+ : path_1.default.join(baseDir, file.path);
68
+ // 确保目录存在
69
+ const dir = path_1.default.dirname(fullPath);
70
+ await fs_1.default.promises.mkdir(dir, { recursive: true });
71
+ // 写入文件
72
+ await fs_1.default.promises.writeFile(fullPath, file.content, 'utf8');
73
+ written.push(file.path);
74
+ console.log(chalk_1.default.green(` ✓ ${file.action === 'create' ? '创建' : '修改'}: ${file.path}`));
75
+ }
76
+ catch (e) {
77
+ const errorMsg = e instanceof Error ? e.message : '未知错误';
78
+ console.warn(chalk_1.default.yellow(` ⚠ 跳过 ${file.path}: ${errorMsg}`));
79
+ skipped.push(file.path);
80
+ }
81
+ }
82
+ return { written, skipped };
83
+ }
84
+ /**
85
+ * 保存原始输出到临时文件
86
+ */
87
+ async function saveRawOutput(content, taskIndex, baseDir = process.cwd()) {
88
+ const outputDir = path_1.default.join(baseDir, '.yuangs', 'generated');
89
+ await fs_1.default.promises.mkdir(outputDir, { recursive: true });
90
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
91
+ const filename = `task-${taskIndex + 1}-${timestamp}.md`;
92
+ const filepath = path_1.default.join(outputDir, filename);
93
+ await fs_1.default.promises.writeFile(filepath, content, 'utf8');
94
+ return filepath;
95
+ }
96
+ //# sourceMappingURL=CodeGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeGenerator.js","sourceRoot":"","sources":["../../../src/core/git/CodeGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface TaskStatus {
2
+ index: number;
3
+ description: string;
4
+ completed: boolean;
5
+ execStatus?: 'pending' | 'in_progress' | 'done' | 'failed';
6
+ reviewScore?: number;
7
+ reviewIssues?: string[];
8
+ attempts?: number;
9
+ }
10
+ export interface TodoMetadata {
11
+ generatedAt?: string;
12
+ context?: string;
13
+ progress?: {
14
+ completed: number;
15
+ total: number;
16
+ };
17
+ currentTask?: number;
18
+ }
19
+ /**
20
+ * 解析 todo.md 文件
21
+ */
22
+ export declare function parseTodoFile(filePath: string): Promise<{
23
+ metadata: TodoMetadata;
24
+ tasks: TaskStatus[];
25
+ rawContent: string;
26
+ }>;
27
+ /**
28
+ * 更新任务状态
29
+ */
30
+ export declare function updateTaskStatus(filePath: string, taskIndex: number, updates: Partial<TaskStatus>): Promise<void>;
31
+ /**
32
+ * 更新元数据
33
+ */
34
+ export declare function updateMetadata(filePath: string, updates: Partial<TodoMetadata>): Promise<void>;
35
+ /**
36
+ * 获取下一个待执行的任务
37
+ */
38
+ export declare function getNextTask(tasks: TaskStatus[]): TaskStatus | null;
39
+ /**
40
+ * 计算进度
41
+ */
42
+ export declare function calculateProgress(tasks: TaskStatus[]): {
43
+ completed: number;
44
+ total: number;
45
+ };
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseTodoFile = parseTodoFile;
7
+ exports.updateTaskStatus = updateTaskStatus;
8
+ exports.updateMetadata = updateMetadata;
9
+ exports.getNextTask = getNextTask;
10
+ exports.calculateProgress = calculateProgress;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const METADATA_PREFIX = '>';
13
+ const TASK_REGEX = /^[\s]*-\s*\[([x\s])\]\s*(.+?)(?:\s*<!--\s*(.+?)\s*-->)?$/;
14
+ /**
15
+ * 解析 todo.md 文件
16
+ */
17
+ async function parseTodoFile(filePath) {
18
+ const content = await fs_1.default.promises.readFile(filePath, 'utf8');
19
+ const lines = content.split('\n');
20
+ // 解析元数据
21
+ const metadata = {};
22
+ let contentStartIndex = 0;
23
+ for (let i = 0; i < lines.length; i++) {
24
+ const line = lines[i].trim();
25
+ if (!line.startsWith(METADATA_PREFIX)) {
26
+ contentStartIndex = i;
27
+ break;
28
+ }
29
+ // 解析特定元数据
30
+ if (line.includes('Generated by Yuangs Git Plan at')) {
31
+ metadata.generatedAt = line.split('at')[1]?.trim();
32
+ }
33
+ else if (line.includes('Context:')) {
34
+ metadata.context = line.split('Context:')[1]?.trim();
35
+ }
36
+ else if (line.includes('Progress:')) {
37
+ const match = line.match(/(\d+)\/(\d+)/);
38
+ if (match) {
39
+ metadata.progress = {
40
+ completed: parseInt(match[1]),
41
+ total: parseInt(match[2])
42
+ };
43
+ }
44
+ }
45
+ else if (line.includes('Current Task:')) {
46
+ metadata.currentTask = parseInt(line.split('Current Task:')[1]?.trim() || '0');
47
+ }
48
+ }
49
+ // 解析任务
50
+ const tasks = [];
51
+ const mainContent = lines.slice(contentStartIndex).join('\n');
52
+ let taskIndex = 0;
53
+ for (const line of lines.slice(contentStartIndex)) {
54
+ const match = line.match(TASK_REGEX);
55
+ if (match) {
56
+ const [, checkbox, description, comment] = match;
57
+ const task = {
58
+ index: taskIndex++,
59
+ description: description.trim(),
60
+ completed: checkbox.toLowerCase() === 'x',
61
+ attempts: 0
62
+ };
63
+ // 解析注释中的状态
64
+ if (comment) {
65
+ const execMatch = comment.match(/exec:(\w+)/);
66
+ const reviewMatch = comment.match(/review:(\d+)/);
67
+ const attemptsMatch = comment.match(/attempts:(\d+)/);
68
+ if (execMatch)
69
+ task.execStatus = execMatch[1];
70
+ if (reviewMatch)
71
+ task.reviewScore = parseInt(reviewMatch[1]);
72
+ if (attemptsMatch)
73
+ task.attempts = parseInt(attemptsMatch[1]);
74
+ }
75
+ tasks.push(task);
76
+ }
77
+ }
78
+ return { metadata, tasks, rawContent: content };
79
+ }
80
+ /**
81
+ * 更新任务状态
82
+ */
83
+ async function updateTaskStatus(filePath, taskIndex, updates) {
84
+ const content = await fs_1.default.promises.readFile(filePath, 'utf8');
85
+ const lines = content.split('\n');
86
+ let currentTaskIndex = 0;
87
+ for (let i = 0; i < lines.length; i++) {
88
+ const match = lines[i].match(TASK_REGEX);
89
+ if (match && currentTaskIndex === taskIndex) {
90
+ const [, checkbox, description] = match;
91
+ // 构建新的注释
92
+ const comments = [];
93
+ if (updates.execStatus)
94
+ comments.push(`exec:${updates.execStatus}`);
95
+ if (updates.reviewScore !== undefined)
96
+ comments.push(`review:${updates.reviewScore}`);
97
+ if (updates.attempts !== undefined)
98
+ comments.push(`attempts:${updates.attempts}`);
99
+ const newCheckbox = updates.completed ? 'x' : ' ';
100
+ const commentStr = comments.length > 0 ? ` <!-- ${comments.join(', ')} -->` : '';
101
+ lines[i] = `- [${newCheckbox}] ${description}${commentStr}`;
102
+ break;
103
+ }
104
+ if (match)
105
+ currentTaskIndex++;
106
+ }
107
+ await fs_1.default.promises.writeFile(filePath, lines.join('\n'), 'utf8');
108
+ }
109
+ /**
110
+ * 更新元数据
111
+ */
112
+ async function updateMetadata(filePath, updates) {
113
+ const content = await fs_1.default.promises.readFile(filePath, 'utf8');
114
+ const lines = content.split('\n');
115
+ // 找到元数据结束位置
116
+ let metadataEndIndex = 0;
117
+ for (let i = 0; i < lines.length; i++) {
118
+ if (!lines[i].trim().startsWith(METADATA_PREFIX)) {
119
+ metadataEndIndex = i;
120
+ break;
121
+ }
122
+ }
123
+ // 更新或添加进度信息
124
+ if (updates.progress) {
125
+ let progressLineIndex = -1;
126
+ for (let i = 0; i < metadataEndIndex; i++) {
127
+ if (lines[i].includes('Progress:')) {
128
+ progressLineIndex = i;
129
+ break;
130
+ }
131
+ }
132
+ const progressLine = `> 📊 Progress: ${updates.progress.completed}/${updates.progress.total} tasks completed`;
133
+ if (progressLineIndex >= 0) {
134
+ lines[progressLineIndex] = progressLine;
135
+ }
136
+ else {
137
+ lines.splice(metadataEndIndex, 0, progressLine);
138
+ }
139
+ }
140
+ if (updates.currentTask !== undefined) {
141
+ let currentTaskLineIndex = -1;
142
+ for (let i = 0; i < metadataEndIndex; i++) {
143
+ if (lines[i].includes('Current Task:')) {
144
+ currentTaskLineIndex = i;
145
+ break;
146
+ }
147
+ }
148
+ const currentTaskLine = `> 🔄 Current Task: ${updates.currentTask}`;
149
+ if (currentTaskLineIndex >= 0) {
150
+ lines[currentTaskLineIndex] = currentTaskLine;
151
+ }
152
+ else {
153
+ lines.splice(metadataEndIndex, 0, currentTaskLine);
154
+ }
155
+ }
156
+ await fs_1.default.promises.writeFile(filePath, lines.join('\n'), 'utf8');
157
+ }
158
+ /**
159
+ * 获取下一个待执行的任务
160
+ */
161
+ function getNextTask(tasks) {
162
+ return tasks.find(t => !t.completed) || null;
163
+ }
164
+ /**
165
+ * 计算进度
166
+ */
167
+ function calculateProgress(tasks) {
168
+ return {
169
+ completed: tasks.filter(t => t.completed).length,
170
+ total: tasks.length
171
+ };
172
+ }
173
+ //# sourceMappingURL=TodoManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TodoManager.js","sourceRoot":"","sources":["../../../src/core/git/TodoManager.ts"],"names":[],"mappings":";;;;;AA0BA,sCAqEC;AAKD,4CA8BC;AAKD,wCAoDC;AAKD,kCAEC;AAKD,8CAKC;AA5MD,4CAAoB;AAoBpB,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,UAAU,GAAG,0DAA0D,CAAC;AAE9E;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,QAAgB;IAKhD,MAAM,OAAO,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,QAAQ;IACR,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACpC,iBAAiB,GAAG,CAAC,CAAC;YACtB,MAAM;QACV,CAAC;QAED,UAAU;QACV,IAAI,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvD,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACR,QAAQ,CAAC,QAAQ,GAAG;oBAChB,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC7B,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;iBAC5B,CAAC;YACN,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACxC,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;QACnF,CAAC;IACL,CAAC;IAED,OAAO;IACP,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;YACjD,MAAM,IAAI,GAAe;gBACrB,KAAK,EAAE,SAAS,EAAE;gBAClB,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;gBAC/B,SAAS,EAAE,QAAQ,CAAC,WAAW,EAAE,KAAK,GAAG;gBACzC,QAAQ,EAAE,CAAC;aACd,CAAC;YAEF,WAAW;YACX,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAClD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;gBAEtD,IAAI,SAAS;oBAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAQ,CAAC;gBACrD,IAAI,WAAW;oBAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,IAAI,aAAa;oBAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB,CAClC,QAAgB,EAChB,SAAiB,EACjB,OAA4B;IAE5B,MAAM,OAAO,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,KAAK,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC;YAExC,SAAS;YACT,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YACpE,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACtF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAElF,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAEjF,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,WAAW,KAAK,WAAW,GAAG,UAAU,EAAE,CAAC;YAC5D,MAAM;QACV,CAAC;QACD,IAAI,KAAK;YAAE,gBAAgB,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAChC,QAAgB,EAChB,OAA8B;IAE9B,MAAM,OAAO,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,YAAY;IACZ,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/C,gBAAgB,GAAG,CAAC,CAAC;YACrB,MAAM;QACV,CAAC;IACL,CAAC;IAED,YAAY;IACZ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,IAAI,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjC,iBAAiB,GAAG,CAAC,CAAC;gBACtB,MAAM;YACV,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,kBAAkB,OAAO,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,kBAAkB,CAAC;QAC9G,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC;QAC5C,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QACpD,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,oBAAoB,GAAG,CAAC,CAAC,CAAC;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACrC,oBAAoB,GAAG,CAAC,CAAC;gBACzB,MAAM;YACV,CAAC;QACL,CAAC;QAED,MAAM,eAAe,GAAG,sBAAsB,OAAO,CAAC,WAAW,EAAE,CAAC;QACpE,IAAI,oBAAoB,IAAI,CAAC,EAAE,CAAC;YAC5B,KAAK,CAAC,oBAAoB,CAAC,GAAG,eAAe,CAAC;QAClD,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAED,MAAM,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,KAAmB;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAmB;IACjD,OAAO;QACH,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM;QAChD,KAAK,EAAE,KAAK,CAAC,MAAM;KACtB,CAAC;AACN,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Git 模块公共常量
3
+ */
4
+ /** todo.md 元数据行前缀 */
5
+ export declare const METADATA_PREFIX = ">";
6
+ /** 默认 todo 文件名 */
7
+ export declare const TODO_FILENAME = "todo.md";
8
+ /** 默认规划提示词 */
9
+ export declare const DEFAULT_PLAN_PROMPT = "\u5206\u6790\u9879\u76EE\u73B0\u72B6\u5E76\u89C4\u5212\u4E0B\u4E00\u6B65\u5F00\u53D1\u4EFB\u52A1";
10
+ /** 默认 AI 模型 */
11
+ export declare const DEFAULT_AI_MODEL = "Assistant";
12
+ /** 最大重试次数 */
13
+ export declare const MAX_RETRY_ATTEMPTS = 2;
14
+ /** 最低审查分数 */
15
+ export declare const MIN_REVIEW_SCORE = 85;
16
+ /** 代码审查失败时的默认分数 */
17
+ export declare const REVIEW_FAILURE_SCORE = 60;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Git 模块公共常量
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.REVIEW_FAILURE_SCORE = exports.MIN_REVIEW_SCORE = exports.MAX_RETRY_ATTEMPTS = exports.DEFAULT_AI_MODEL = exports.DEFAULT_PLAN_PROMPT = exports.TODO_FILENAME = exports.METADATA_PREFIX = void 0;
7
+ /** todo.md 元数据行前缀 */
8
+ exports.METADATA_PREFIX = '>';
9
+ /** 默认 todo 文件名 */
10
+ exports.TODO_FILENAME = 'todo.md';
11
+ /** 默认规划提示词 */
12
+ exports.DEFAULT_PLAN_PROMPT = '分析项目现状并规划下一步开发任务';
13
+ /** 默认 AI 模型 */
14
+ exports.DEFAULT_AI_MODEL = 'Assistant';
15
+ /** 最大重试次数 */
16
+ exports.MAX_RETRY_ATTEMPTS = 2;
17
+ /** 最低审查分数 */
18
+ exports.MIN_REVIEW_SCORE = 85;
19
+ /** 代码审查失败时的默认分数 */
20
+ exports.REVIEW_FAILURE_SCORE = 60;
21
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/git/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,qBAAqB;AACR,QAAA,eAAe,GAAG,GAAG,CAAC;AAEnC,kBAAkB;AACL,QAAA,aAAa,GAAG,SAAS,CAAC;AAEvC,cAAc;AACD,QAAA,mBAAmB,GAAG,kBAAkB,CAAC;AAEtD,eAAe;AACF,QAAA,gBAAgB,GAAG,WAAW,CAAC;AAE5C,aAAa;AACA,QAAA,kBAAkB,GAAG,CAAC,CAAC;AAEpC,aAAa;AACA,QAAA,gBAAgB,GAAG,EAAE,CAAC;AAEnC,mBAAmB;AACN,QAAA,oBAAoB,GAAG,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yuangs",
3
- "version": "5.34.0",
3
+ "version": "5.35.0",
4
4
  "description": "苑广山的个人应用集合 CLI(彩色版)",
5
5
  "author": "苑广山",
6
6
  "license": "ISC",