yuangs 5.45.0 → 5.48.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/dist/commands/git/auto.js +63 -243
- package/dist/commands/git/auto.js.map +1 -1
- package/dist/commands/git/plan.d.ts +0 -3
- package/dist/commands/git/plan.js +55 -182
- package/dist/commands/git/plan.js.map +1 -1
- package/dist/core/kernel/ASTParser.d.ts +79 -5
- package/dist/core/kernel/ASTParser.js +312 -44
- package/dist/core/kernel/ASTParser.js.map +1 -1
- package/dist/core/kernel/FastScanner.js +5 -6
- package/dist/core/kernel/FastScanner.js.map +1 -1
- package/dist/core/workflows/AutoWorkflow.d.ts +21 -0
- package/dist/core/workflows/AutoWorkflow.js +200 -0
- package/dist/core/workflows/AutoWorkflow.js.map +1 -0
- package/dist/core/workflows/ConstraintEngine.d.ts +35 -0
- package/dist/core/workflows/ConstraintEngine.js +109 -0
- package/dist/core/workflows/ConstraintEngine.js.map +1 -0
- package/dist/core/workflows/GitWorkflowSession.d.ts +46 -0
- package/dist/core/workflows/GitWorkflowSession.js +221 -0
- package/dist/core/workflows/GitWorkflowSession.js.map +1 -0
- package/dist/core/workflows/PlanWorkflow.d.ts +14 -0
- package/dist/core/workflows/PlanWorkflow.js +214 -0
- package/dist/core/workflows/PlanWorkflow.js.map +1 -0
- package/dist/core/workflows/ReviewWorkflow.d.ts +17 -0
- package/dist/core/workflows/ReviewWorkflow.js +112 -0
- package/dist/core/workflows/ReviewWorkflow.js.map +1 -0
- package/dist/core/workflows/index.d.ts +6 -0
- package/dist/core/workflows/index.js +23 -0
- package/dist/core/workflows/index.js.map +1 -0
- package/dist/core/workflows/types.d.ts +159 -0
- package/dist/core/workflows/types.js +116 -0
- package/dist/core/workflows/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,37 +1,4 @@
|
|
|
1
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
4
|
};
|
|
@@ -39,244 +6,97 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
6
|
exports.registerAutoCommand = registerAutoCommand;
|
|
40
7
|
const chalk_1 = __importDefault(require("chalk"));
|
|
41
8
|
const ora_1 = __importDefault(require("ora"));
|
|
42
|
-
const fs_1 = __importDefault(require("fs"));
|
|
43
9
|
const path_1 = __importDefault(require("path"));
|
|
44
|
-
const ProgressBar_1 = require("../../utils/ProgressBar");
|
|
45
|
-
const CLIComponent_1 = require("../../utils/CLIComponent");
|
|
46
10
|
const GitService_1 = require("../../core/git/GitService");
|
|
47
11
|
const llm_1 = require("../../agent/llm");
|
|
48
|
-
const
|
|
49
|
-
const
|
|
50
|
-
const constants_1 = require("../../core/git/constants");
|
|
51
|
-
const CodeGenerator_1 = require("../../core/git/CodeGenerator");
|
|
52
|
-
const CommitMessageGenerator_1 = require("../../core/git/CommitMessageGenerator");
|
|
53
|
-
const ErrorHandler_1 = require("../../core/git/ErrorHandler");
|
|
54
|
-
const ProgressManager_1 = require("../../core/git/ProgressManager");
|
|
12
|
+
const workflows_1 = require("../../core/workflows");
|
|
13
|
+
const CapabilityLevel_1 = require("../../core/capability/CapabilityLevel");
|
|
55
14
|
const ContextGatherer_1 = require("../../core/git/ContextGatherer");
|
|
56
|
-
|
|
57
|
-
* 执行单个任务
|
|
58
|
-
*/
|
|
59
|
-
async function executeTask(task, context, model, previousFeedback) {
|
|
60
|
-
try {
|
|
61
|
-
const response = await (0, llm_1.runLLM)({
|
|
62
|
-
prompt: {
|
|
63
|
-
system: `你是一个全方位的交付专家。
|
|
64
|
-
1. 如果当前任务涉及代码(如 .ts, .js, .py 等文件),请扮演**资深软件工程师**,确保代码健壮、注释详尽、遵循最佳实践,并追求极致的模块化与性能。
|
|
65
|
-
2. 如果当前任务涉及文档(如 .md, .yaml, .html 等文件),请扮演**资深内容专家或历史学者**,确保叙事优美、逻辑严密、事实准确。
|
|
66
|
-
|
|
67
|
-
**重要输出格式要求:**
|
|
68
|
-
- 每个文件必须以 \`### 文件: path\` 或 \`**文件**: path\` 明确标注。
|
|
69
|
-
- 代码内容必须包裹在对应的 Markdown 代码块中。
|
|
70
|
-
- 不要解释,直接输出文件内容。`,
|
|
71
|
-
messages: [
|
|
72
|
-
{
|
|
73
|
-
role: 'user',
|
|
74
|
-
content: `[项目上下文]\n${context}\n\n[当前任务]\n${task.description}\n\n${previousFeedback ? `[审查反馈 - 请修复以下问题]\n${previousFeedback}\n\n` : ''}请根据以上信息开始任务。`
|
|
75
|
-
}
|
|
76
|
-
]
|
|
77
|
-
},
|
|
78
|
-
model: model || constants_1.DEFAULT_AI_MODEL,
|
|
79
|
-
stream: false
|
|
80
|
-
});
|
|
81
|
-
return { code: response.rawText, success: true };
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
return { code: '', success: false, error: error.message };
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* 代码审查包装器
|
|
89
|
-
*/
|
|
90
|
-
async function reviewCode(level, staged = true) {
|
|
91
|
-
const gitService = new GitService_1.GitService();
|
|
92
|
-
const reviewer = new CodeReviewer_1.CodeReviewer(gitService);
|
|
93
|
-
return await reviewer.review(level, staged);
|
|
94
|
-
}
|
|
15
|
+
const CodeReviewer_1 = require("../../core/git/CodeReviewer");
|
|
95
16
|
function registerAutoCommand(gitCmd) {
|
|
96
17
|
gitCmd
|
|
97
18
|
.command('auto')
|
|
98
19
|
.description('自动执行 todo.md 中的任务,直到全部完成或达到最大限制')
|
|
99
20
|
.option('-n, --max-tasks <number>', '本次运行执行的最大任务数', '5')
|
|
100
|
-
.option('-m, --model <model>', '使用的 AI 模型',
|
|
101
|
-
.option('-s, --min-score <number>', '任务通过所需的最低评分',
|
|
21
|
+
.option('-m, --model <model>', '使用的 AI 模型', 'Assistant')
|
|
22
|
+
.option('-s, --min-score <number>', '任务通过所需的最低评分', '70')
|
|
102
23
|
.option('-l, --review-level <level>', '代码审查级别 (quick/standard/deep)', 'standard')
|
|
103
24
|
.option('--skip-review', '跳过代码审查')
|
|
104
25
|
.option('-o, --save-only', '只保存代码,不写入文件系统')
|
|
105
26
|
.option('-c, --commit', '所有任务完成后自动提交')
|
|
106
27
|
.option('--commit-message <msg>', '自定义提交信息(使用 --commit 时生效)')
|
|
107
28
|
.action(async (options) => {
|
|
108
|
-
const
|
|
109
|
-
const maxTasks = parseInt(options.maxTasks) || 5;
|
|
110
|
-
const minScore = parseInt(options.minScore) || constants_1.MIN_REVIEW_SCORE;
|
|
111
|
-
const progressManager = new ProgressManager_1.ProgressManager();
|
|
112
|
-
console.log(chalk_1.default.bold.cyan('\n🤖 启动全自动 AI 开发工作流...\n'));
|
|
113
|
-
console.log(chalk_1.default.gray(`📋 最大任务数: ${maxTasks}`));
|
|
114
|
-
console.log(chalk_1.default.gray(`🎯 最低审查分数: ${minScore}`));
|
|
115
|
-
console.log(chalk_1.default.gray(`🤖 AI 模型: ${options.model}\n`));
|
|
116
|
-
const spinner = (0, ora_1.default)('正在初始化...').start();
|
|
29
|
+
const spinner = (0, ora_1.default)('正在初始化工作流会话...').start();
|
|
117
30
|
try {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (tasks.length === 0) {
|
|
123
|
-
spinner.fail('未找到任何任务');
|
|
124
|
-
console.log(chalk_1.default.yellow('💡 提示:请先运行 yuangs git plan 生成任务'));
|
|
31
|
+
const gitService = new GitService_1.GitService();
|
|
32
|
+
const todoPath = path_1.default.join(process.cwd(), 'todo.md');
|
|
33
|
+
if (!(await gitService.isGitRepository())) {
|
|
34
|
+
spinner.fail('当前目录不是 Git 仓库');
|
|
125
35
|
return;
|
|
126
36
|
}
|
|
127
|
-
spinner.succeed(
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
minScore,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
37
|
+
spinner.succeed('Git 仓库验证通过');
|
|
38
|
+
const workflowConfig = {
|
|
39
|
+
sessionId: Date.now().toString(36) + Math.random().toString(36).substring(2, 11),
|
|
40
|
+
model: options.model || 'Assistant',
|
|
41
|
+
capability: CapabilityLevel_1.CapabilityLevel.STRUCTURAL
|
|
42
|
+
};
|
|
43
|
+
const session = new workflows_1.GitWorkflowSession(workflowConfig);
|
|
44
|
+
console.log(chalk_1.default.bold.cyan('\n🤖 启动自动执行工作流...\n'));
|
|
45
|
+
spinner.succeed('工作流会话已初始化');
|
|
46
|
+
const autoInput = {
|
|
47
|
+
maxTasks: parseInt(options.maxTasks) || 5,
|
|
48
|
+
minScore: parseInt(options.minScore) || 70,
|
|
49
|
+
reviewLevel: options.reviewLevel || 'standard',
|
|
50
|
+
skipReview: options.skipReview || false,
|
|
51
|
+
saveOnly: options.saveOnly || false,
|
|
52
|
+
autoCommit: options.commit || false,
|
|
142
53
|
commitMessage: options.commitMessage
|
|
54
|
+
};
|
|
55
|
+
spinner.start('[工作流] 正在执行任务...');
|
|
56
|
+
const result = await session.runAuto(async (input) => {
|
|
57
|
+
const autoWorkflow = new workflows_1.AutoWorkflow(gitService, new ContextGatherer_1.ContextGatherer(gitService), new CodeReviewer_1.CodeReviewer(gitService));
|
|
58
|
+
return autoWorkflow.run({ ...input, ...autoInput }, session.getConfig());
|
|
143
59
|
});
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
60
|
+
if (result.success && result.data) {
|
|
61
|
+
spinner.succeed('自动执行完成');
|
|
62
|
+
console.log('');
|
|
63
|
+
console.log(chalk_1.default.green(`✅ 任务执行完成: ${result.data.executedTasks}/${result.data.totalTasks}`));
|
|
64
|
+
console.log(chalk_1.default.gray(`📁 修改文件数: ${result.data.filesModified.length}`));
|
|
65
|
+
console.log(chalk_1.default.gray(`💾 备份数: ${result.data.backupIds.length}`));
|
|
66
|
+
if (result.data.commitHash) {
|
|
67
|
+
console.log(chalk_1.default.cyan(`📝 提交哈希: ${result.data.commitHash}`));
|
|
150
68
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
// 采集真实上下文
|
|
167
|
-
spinner.text = `[尝试 ${attempts}] 正在采集项目上下文...`;
|
|
168
|
-
const gitService = new GitService_1.GitService();
|
|
169
|
-
const gatherer = new ContextGatherer_1.ContextGatherer(gitService);
|
|
170
|
-
const gathered = await gatherer.gather(nextTask.description);
|
|
171
|
-
spinner.text = `[尝试 ${attempts}] 正在向 AI 请求代码生成...`;
|
|
172
|
-
const { code, success } = await executeTask(nextTask, gathered.summary, options.model, previousFeedback);
|
|
173
|
-
if (!success) {
|
|
174
|
-
spinner.fail('代码生成失败');
|
|
175
|
-
await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
|
|
176
|
-
execStatus: 'failed'
|
|
177
|
-
});
|
|
178
|
-
break;
|
|
179
|
-
}
|
|
180
|
-
spinner.succeed('方案生成完成');
|
|
181
|
-
// 3b. 保存原始输出
|
|
182
|
-
const savedPath = await (0, CodeGenerator_1.saveRawOutput)(code, nextTask.index);
|
|
183
|
-
progressBar.log(chalk_1.default.gray(`📄 原始输出已保存: ${path_1.default.relative(process.cwd(), savedPath)}`));
|
|
184
|
-
// 3c. 解析并写入代码
|
|
185
|
-
const generated = (0, CodeGenerator_1.parseGeneratedCode)(code);
|
|
186
|
-
if (generated.files.length > 0) {
|
|
187
|
-
progressBar.log(chalk_1.default.cyan(`\n📦 完成代码解析,涉及 ${generated.files.length} 个文件`));
|
|
188
|
-
if (!options.saveOnly) {
|
|
189
|
-
spinner.start('正在备份并写入文件...');
|
|
190
|
-
let backupId;
|
|
191
|
-
try {
|
|
192
|
-
const backup = await (0, CodeGenerator_1.backupFiles)(generated.files);
|
|
193
|
-
backupId = backup.id;
|
|
194
|
-
}
|
|
195
|
-
catch (e) { }
|
|
196
|
-
const { written } = await (0, CodeGenerator_1.writeGeneratedCode)(generated);
|
|
197
|
-
spinner.succeed(`已更新 ${written.length} 个文件`);
|
|
198
|
-
// 保存备份ID
|
|
199
|
-
await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, { backupId });
|
|
200
|
-
nextTask.backupId = backupId;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// 3d. 代码审查
|
|
204
|
-
if (!options.skipReview) {
|
|
205
|
-
spinner.start('正在进行 AI 质量审查...');
|
|
206
|
-
const levelMap = {
|
|
207
|
-
'quick': CodeReviewer_1.ReviewLevel.QUICK,
|
|
208
|
-
'standard': CodeReviewer_1.ReviewLevel.STANDARD,
|
|
209
|
-
'deep': CodeReviewer_1.ReviewLevel.DEEP
|
|
210
|
-
};
|
|
211
|
-
const reviewLevel = levelMap[options.reviewLevel] || CodeReviewer_1.ReviewLevel.STANDARD;
|
|
212
|
-
const review = await reviewCode(reviewLevel, false);
|
|
213
|
-
spinner.succeed(`审查完成 (评分: ${review.score}/100)`);
|
|
214
|
-
await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
|
|
215
|
-
reviewScore: review.score,
|
|
216
|
-
reviewIssues: review.issues.map(i => i.message)
|
|
217
|
-
});
|
|
218
|
-
if (review.score >= minScore) {
|
|
219
|
-
progressBar.log(chalk_1.default.green(`✅ 质量达标 (${review.score} pts)`));
|
|
220
|
-
taskCompleted = true;
|
|
221
|
-
await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
|
|
222
|
-
completed: true,
|
|
223
|
-
execStatus: 'done'
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log(chalk_1.default.bold.cyan('📊 会话摘要:'));
|
|
71
|
+
console.log(chalk_1.default.gray(session.getSummary()));
|
|
72
|
+
session.complete();
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
spinner.fail('自动执行失败');
|
|
76
|
+
if (result.errors && result.errors.length > 0) {
|
|
77
|
+
console.log('');
|
|
78
|
+
console.log(chalk_1.default.bold.red('❌ 错误详情:'));
|
|
79
|
+
result.errors.forEach((error, index) => {
|
|
80
|
+
console.log(chalk_1.default.red(` ${index + 1}. [${error.kind}] ${error.message}`));
|
|
81
|
+
if (error.suggestions && error.suggestions.length > 0) {
|
|
82
|
+
error.suggestions.forEach(suggestion => {
|
|
83
|
+
console.log(chalk_1.default.yellow(` 💡 ${suggestion}`));
|
|
224
84
|
});
|
|
225
|
-
nextTask.completed = true;
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
progressBar.log(chalk_1.default.yellow(`⚠️ 质量不合格 (${review.score} < ${minScore})`));
|
|
229
|
-
if (attempts > constants_1.MAX_RETRY_ATTEMPTS) {
|
|
230
|
-
progressBar.log(chalk_1.default.red(`❌ 达到最大尝试次数,任务失败`));
|
|
231
|
-
await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, { execStatus: 'failed' });
|
|
232
|
-
}
|
|
233
85
|
}
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
progressBar.log(chalk_1.default.gray('⏭️ 已跳过代码审查'));
|
|
237
|
-
taskCompleted = true;
|
|
238
|
-
await (0, TodoManager_1.updateTaskStatus)(todoPath, nextTask.index, {
|
|
239
|
-
completed: true,
|
|
240
|
-
execStatus: 'done'
|
|
241
|
-
});
|
|
242
|
-
nextTask.completed = true;
|
|
243
|
-
}
|
|
86
|
+
});
|
|
244
87
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
progressBar.update(newProgress.completed);
|
|
249
|
-
console.log('\n');
|
|
250
|
-
}
|
|
251
|
-
// 4. 总结
|
|
252
|
-
const finalProgress = (0, TodoManager_1.calculateProgress)(tasks);
|
|
253
|
-
CLIComponent_1.CLIComponent.renderSummaryPanel(finalProgress.completed, finalProgress.total, tasksExecuted, finalProgress.completed < finalProgress.total);
|
|
254
|
-
if (options.commit && finalProgress.completed === finalProgress.total) {
|
|
255
|
-
const gitService = new GitService_1.GitService();
|
|
256
|
-
if (!(await gitService.isWorkingTreeClean())) {
|
|
257
|
-
spinner.start('准备自动提交...');
|
|
258
|
-
await gitService.stageAll();
|
|
259
|
-
const router = await (await Promise.resolve().then(() => __importStar(require('../../core/modelRouter')))).getRouter();
|
|
260
|
-
const commitGen = new CommitMessageGenerator_1.CommitMessageGenerator(gitService, router);
|
|
261
|
-
const commit = await commitGen.generate({ detailed: false });
|
|
262
|
-
await gitService.commit(commit.full);
|
|
263
|
-
spinner.succeed('已完成自动提交');
|
|
88
|
+
if (result.summary) {
|
|
89
|
+
console.log('');
|
|
90
|
+
console.log(chalk_1.default.gray(`📝 ${result.summary}`));
|
|
264
91
|
}
|
|
265
92
|
}
|
|
266
93
|
}
|
|
267
|
-
catch (
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
else if (e instanceof llm_1.AIError) {
|
|
272
|
-
spinner.fail((0, ErrorHandler_1.formatError)(e, 'AI 调用失败'));
|
|
273
|
-
}
|
|
274
|
-
else if (e instanceof Error) {
|
|
275
|
-
spinner.fail((0, ErrorHandler_1.formatError)(e, '执行失败'));
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
spinner.fail('未知严重错误');
|
|
94
|
+
catch (error) {
|
|
95
|
+
spinner.fail(chalk_1.default.red(`执行过程中出错: ${error.message}`));
|
|
96
|
+
if (error instanceof llm_1.AIError) {
|
|
97
|
+
console.error(chalk_1.default.red(`Status: ${error.statusCode}`));
|
|
279
98
|
}
|
|
99
|
+
process.exit(1);
|
|
280
100
|
}
|
|
281
101
|
});
|
|
282
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto.js","sourceRoot":"","sources":["../../../src/commands/git/auto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auto.js","sourceRoot":"","sources":["../../../src/commands/git/auto.ts"],"names":[],"mappings":"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"}
|