yuangs 5.45.0 → 5.47.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.
@@ -10,14 +10,11 @@ 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 CostProfile_1 = require("../../core/capability/CostProfile");
14
- const constants_1 = require("./constants");
13
+ const workflows_1 = require("../../core/workflows");
14
+ const CapabilityLevel_1 = require("../../core/capability/CapabilityLevel");
15
15
  const utils_1 = require("./utils");
16
16
  const DEFAULT_PLAN_PROMPT = '分析项目现状并规划下一步开发任务';
17
17
  const METADATA_PREFIX = '>';
18
- /**
19
- * 解析用户指令(优先级:命令行 > todo.md > 默认值)
20
- */
21
18
  async function resolveUserPrompt(cliPrompt, todoPath) {
22
19
  if (cliPrompt) {
23
20
  return { prompt: cliPrompt, fromFile: false };
@@ -25,14 +22,11 @@ async function resolveUserPrompt(cliPrompt, todoPath) {
25
22
  try {
26
23
  await fs_1.default.promises.access(todoPath, fs_1.default.constants.F_OK);
27
24
  const content = await fs_1.default.promises.readFile(todoPath, 'utf8');
28
- // 过滤掉文件开头由 yuangs 生成的元数据行(连续的 > 开头的行)
29
25
  const lines = content.split('\n');
30
26
  let startIndex = 0;
31
- // 跳过开头连续的元数据行
32
27
  while (startIndex < lines.length && lines[startIndex].trim().startsWith(METADATA_PREFIX)) {
33
28
  startIndex++;
34
29
  }
35
- // 跳过元数据后的空行
36
30
  while (startIndex < lines.length && lines[startIndex].trim() === '') {
37
31
  startIndex++;
38
32
  }
@@ -48,9 +42,6 @@ async function resolveUserPrompt(cliPrompt, todoPath) {
48
42
  }
49
43
  return { prompt: DEFAULT_PLAN_PROMPT, fromFile: false };
50
44
  }
51
- /**
52
- * 注册 git plan 命令
53
- */
54
45
  function registerPlanCommand(gitCmd) {
55
46
  gitCmd
56
47
  .command('plan [prompt...]')
@@ -63,7 +54,6 @@ function registerPlanCommand(gitCmd) {
63
54
  const maxRounds = parseInt(options.rounds) || 2;
64
55
  const todoPath = path_1.default.join(process.cwd(), 'todo.md');
65
56
  const { prompt: userPrompt, fromFile } = await resolveUserPrompt(cliPrompt, todoPath);
66
- // 使用主 spinner 管理整体状态
67
57
  const spinner = (0, ora_1.default)(fromFile ? '正在从 todo.md 读取并初始化分析规划...' : '正在初始化分析规划...').start();
68
58
  try {
69
59
  const gitService = new GitService_1.GitService();
@@ -71,186 +61,69 @@ function registerPlanCommand(gitCmd) {
71
61
  spinner.fail('当前目录不是 Git 仓库');
72
62
  return;
73
63
  }
74
- // 1. 获取最近 10 次提交
75
- spinner.text = '正在读取 Git 历史记录...';
76
- const commits = await gitService.getRecentCommits(10);
77
- const commitContext = commits.length > 0
78
- ? commits.map(c => `- ${c.date} [${c.hash.substring(0, 7)}] ${c.message}`).join('\n')
79
- : '暂无提交记录';
80
- spinner.succeed('已获取 Git 上下文');
81
- // 定义两个角色的配置
82
- const ARCHITECT_MODEL = options.model || 'Assistant'; // 负责写方案
83
- const REVIEWER_MODEL = options.reviewerModel || 'gemini-2.5-flash-lite'; // 负责挑刺
84
- // 共享的项目上下文
85
- const projectContext = `
86
- [项目背景 - 最近 Git 提交]
87
- ${commitContext}
88
-
89
- [用户需求]
90
- ${userPrompt}
91
- `;
92
- let currentPlan = ""; // 用于存储当前的方案草稿
93
- let reviewComments = ""; // 用于存储审查意见
94
- console.log(chalk_1.default.bold.cyan('\n🚀 启动双智能体协作引擎...\n'));
95
- // --- 阶段 1: 架构师起草初稿 ---
96
- spinner.start(`[架构师] ${ARCHITECT_MODEL} 正在起草初步方案...`);
97
- const draftPrompt = [
98
- {
99
- role: 'system',
100
- content: `你是一个资深软件架构师。请根据 Git 历史确保新功能与现有代码风格一致。
101
- 请基于用户需求输出一份初步的开发计划 (Draft Plan)。
102
- 包含:核心目标、修改文件列表、关键步骤。`
103
- },
104
- { role: 'user', content: projectContext }
105
- ];
106
- const draftRes = await (0, llm_1.runLLM)({
107
- prompt: { messages: draftPrompt },
108
- model: ARCHITECT_MODEL,
109
- stream: false,
110
- bypassRouter: true
64
+ spinner.succeed('Git 仓库验证通过');
65
+ const workflowConfig = {
66
+ sessionId: Date.now().toString(36) + Math.random().toString(36).substring(2, 11),
67
+ model: options.model || 'Assistant',
68
+ capability: CapabilityLevel_1.CapabilityLevel.SEMANTIC
69
+ };
70
+ const session = new workflows_1.GitWorkflowSession(workflowConfig);
71
+ const planWorkflow = new workflows_1.PlanWorkflow(gitService);
72
+ console.log(chalk_1.default.bold.cyan('\n🚀 启动工作流会话...\n'));
73
+ spinner.start('[工作流] 正在执行计划阶段...');
74
+ const result = await session.runPlan(async (input) => planWorkflow.run(input, session.getConfig()), {
75
+ userPrompt,
76
+ maxRounds,
77
+ architectModel: options.model,
78
+ reviewerModel: options.reviewerModel
111
79
  });
112
- currentPlan = draftRes.rawText;
113
- spinner.succeed(chalk_1.default.blue(`[架构师] 初稿已完成`));
114
- // console.log(chalk.gray(currentPlan.substring(0, 100) + '...'));
115
- // --- 阶段 2: 循环打磨 ---
116
- for (let i = 1; i <= maxRounds; i++) {
117
- console.log(chalk_1.default.gray(`\n--- Round ${i}/${maxRounds} ---`));
118
- // Step A: 审查员 (Gemini) 评审
119
- spinner.start(`[审查员] ${REVIEWER_MODEL} 正在评审方案...`);
120
- const reviewPrompt = [
121
- {
122
- role: 'system',
123
- content: `你是一个严格的代码审查员和产品经理。
124
- 你的任务是找出架构师方案中的漏洞、遗漏、安全风险或逻辑错误。
125
- 请简明扼要地列出修改建议。不要重写计划,只给建议。`
126
- },
127
- {
128
- role: 'user',
129
- content: `
130
- ${projectContext}
131
-
132
- [待评审的方案]
133
- ${currentPlan}
134
- `
135
- }
80
+ if (result.success && result.data) {
81
+ spinner.succeed('计划执行成功');
82
+ const filePath = path_1.default.join(process.cwd(), 'todo.md');
83
+ const metadataLines = [
84
+ `> 📅 Generated by Yuangs Git Plan at ${new Date().toLocaleString()}`,
85
+ `> 🎯 Context: ${userPrompt}`,
86
+ `> 🔧 Capability Level: ${(0, utils_1.getCapabilityLevelDisplay)(result.data.capability.minCapability)}`,
87
+ `> ⚙️ Estimated Time: ${result.data.estimatedTime}ms`,
88
+ `> 📊 Estimated Tokens: ${result.data.estimatedTokens}`,
89
+ '',
136
90
  ];
137
- const reviewRes = await (0, llm_1.runLLM)({
138
- prompt: { messages: reviewPrompt },
139
- model: REVIEWER_MODEL,
140
- stream: false,
141
- bypassRouter: true
142
- });
143
- reviewComments = reviewRes.rawText;
144
- spinner.succeed(chalk_1.default.magenta(`[审查员] 已提出修改意见`));
145
- console.log(chalk_1.default.gray(` 💬 "${reviewComments.replace(/\n/g, ' ').substring(0, 80)}..."`));
146
- // Step B: 架构师 (Assistant) 修正
147
- spinner.start(`[架构师] ${ARCHITECT_MODEL} 正在根据意见修订方案...`);
148
- const refinePrompt = [
149
- {
150
- role: 'system',
151
- content: `你是一个资深软件架构师。请根据审查员的意见优化你的开发计划。`
152
- },
153
- {
154
- role: 'user',
155
- content: `
156
- 这是你之前的方案:
157
- ${currentPlan}
158
-
159
- 审查员给出的意见:
160
- ${reviewComments}
161
-
162
- 请输出修正后的完整方案。`
163
- }
164
- ];
165
- const refineRes = await (0, llm_1.runLLM)({
166
- prompt: { messages: refinePrompt },
167
- model: ARCHITECT_MODEL,
168
- stream: false,
169
- bypassRouter: true
170
- });
171
- currentPlan = refineRes.rawText;
172
- spinner.succeed(chalk_1.default.blue(`[架构师] 方案已修订`));
91
+ const fileOutput = metadataLines.join('\n') + result.data.todoMarkdown;
92
+ fs_1.default.writeFileSync(filePath, fileOutput);
93
+ console.log('');
94
+ console.log(chalk_1.default.green(`✅ 规划完成!文件已生成: ${chalk_1.default.bold('todo.md')}`));
95
+ console.log(chalk_1.default.gray(`👉 你可以使用 'code todo.md' 打开查看`));
96
+ console.log('');
97
+ console.log(chalk_1.default.bold.cyan('📊 会话摘要:'));
98
+ console.log(chalk_1.default.gray(session.getSummary()));
99
+ session.complete();
173
100
  }
174
- // 4. 生成最终 todo.md
175
- spinner.start('正在生成最终 todo.md 文件...');
176
- // 计算任务复杂度和能力需求
177
- const diff = await gitService.getDiff();
178
- // 对文件列表去重,避免 staged 和 unstaged 中的重复文件被重复计数
179
- const allFiles = (0, utils_1.deduplicateFiles)([...diff.files.staged, ...diff.files.unstaged]);
180
- // 使用 git diff --numstat 获取准确的行数统计
181
- let estimatedTotalLines = 0;
182
- try {
183
- const numstat = await gitService.getDiffNumstat();
184
- // numstat 直接提供准确的 added 和 deleted 行数
185
- estimatedTotalLines = numstat.added + numstat.deleted;
186
- // 如果 numstat 没有数据(如没有变更),使用文件数估算
187
- if (estimatedTotalLines === 0 && allFiles.length > 0) {
188
- estimatedTotalLines = allFiles.length * constants_1.DIFF_ESTIMATION.LINES_PER_FILE_DEFAULT;
101
+ else {
102
+ spinner.fail('计划执行失败');
103
+ if (result.errors && result.errors.length > 0) {
104
+ console.log('');
105
+ console.log(chalk_1.default.bold.red('❌ 错误详情:'));
106
+ result.errors.forEach((error, index) => {
107
+ console.log(chalk_1.default.red(` ${index + 1}. [${error.kind}] ${error.message}`));
108
+ if (error.suggestions && error.suggestions.length > 0) {
109
+ error.suggestions.forEach(suggestion => {
110
+ console.log(chalk_1.default.yellow(` 💡 ${suggestion}`));
111
+ });
112
+ }
113
+ });
189
114
  }
190
- }
191
- catch (e) {
192
- // numstat 失败,使用更保守的估算值作为后备
193
- estimatedTotalLines = allFiles.length * constants_1.DIFF_ESTIMATION.LINES_PER_FILE_FALLBACK;
194
- }
195
- const costProfile = CostProfile_1.defaultCostProfileCalculator.calculate(allFiles, estimatedTotalLines);
196
- const finalPrompt = [
197
- {
198
- role: 'system',
199
- content: `你是一个技术文档专家。请将以下开发方案整理为一份标准的 todo.md 文档。
200
-
201
- 重要要求:
202
- 1. 格式清晰,使用 Markdown Checkbox (- [ ] )。
203
- 2. 包含 [目标]、[文件变更]、[详细步骤]。
204
- 3. 直接输出 Markdown 内容,不要使用 Markdown 代码块 (\`\`\`) 包裹。
205
- 4. 不要包含任何对话式前缀(如"好的"、"这是")或后缀(如"希望这对你有帮助")。
206
- 5. 开头直接输出内容,不要有任何问候语或开场白。
207
-
208
- 能力等级标注:
209
- - SEMANTIC: 语义理解,需要理解代码意图和设计
210
- - STRUCTURAL: 结构分析,需要理解代码结构和依赖关系
211
- - LINE: 行级分析,需要理解具体代码行
212
- - TEXT: 文本分析,只需要处理文本内容
213
- - NONE: 无需智能分析
214
-
215
- 格式示例:
216
- - [ ] 实现用户认证 [SEMANTIC]
217
- - capability: SEMANTIC
218
- - fallbackChain: [STRUCTURAL, LINE, TEXT, NONE]`
219
- },
220
- {
221
- role: 'user',
222
- content: currentPlan
115
+ if (result.summary) {
116
+ console.log('');
117
+ console.log(chalk_1.default.gray(`📝 ${result.summary}`));
223
118
  }
224
- ];
225
- const finalResponse = await (0, llm_1.runLLM)({
226
- prompt: { messages: finalPrompt },
227
- model: 'Assistant',
228
- stream: false,
229
- bypassRouter: true
230
- });
231
- const todoContent = finalResponse.rawText;
232
- const filePath = path_1.default.join(process.cwd(), 'todo.md');
233
- // 使用工具函数清理 LLM 输出
234
- const cleanedContent = (0, utils_1.cleanLLMOutput)(todoContent);
235
- // 添加能力元数据到文件头
236
- const metadataLines = [
237
- `> 📅 Generated by Yuangs Git Plan at ${new Date().toLocaleString()}`,
238
- `> 🎯 Context: ${userPrompt}`,
239
- `> 🔧 Capability Level: ${(0, utils_1.getCapabilityLevelDisplay)(costProfile.requiredCapability)}`,
240
- `> ⚙️ Estimated Time: ${costProfile.estimatedTime}ms`,
241
- `> 📊 Estimated Tokens: ${costProfile.estimatedTokens}`,
242
- '',
243
- ];
244
- const fileOutput = metadataLines.join('\n') + cleanedContent;
245
- fs_1.default.writeFileSync(filePath, fileOutput);
246
- spinner.succeed(chalk_1.default.green(`\n✅ 规划完成!文件已生成: ${chalk_1.default.bold('todo.md')}`));
247
- console.log(chalk_1.default.gray(`👉 你可以使用 'code todo.md' 打开查看`));
119
+ }
248
120
  }
249
121
  catch (error) {
250
- spinner.fail(chalk_1.default.red(`规划过程中出错: ${error.message}`));
122
+ spinner.fail(chalk_1.default.red(`执行过程中出错: ${error.message}`));
251
123
  if (error instanceof llm_1.AIError) {
252
124
  console.error(chalk_1.default.red(`Status: ${error.statusCode}`));
253
125
  }
126
+ process.exit(1);
254
127
  }
255
128
  });
256
129
  }
@@ -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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"}
@@ -0,0 +1,21 @@
1
+ import { GitService } from '../git/GitService';
2
+ import { ContextGatherer } from '../git/ContextGatherer';
3
+ import { CodeReviewer } from '../git/CodeReviewer';
4
+ import { AutoInput, AutoOutput, WorkflowConfig, WorkflowResult } from './types';
5
+ export interface AutoWorkflowProgress {
6
+ currentTask?: number;
7
+ executedTasks: number;
8
+ backupIds: string[];
9
+ filesModified: string[];
10
+ }
11
+ export declare class AutoWorkflow {
12
+ private gitService;
13
+ private contextGatherer;
14
+ private codeReviewer;
15
+ constructor(gitService: GitService, contextGatherer: ContextGatherer, codeReviewer: CodeReviewer);
16
+ run(input: AutoInput, config: WorkflowConfig): Promise<WorkflowResult<AutoOutput>>;
17
+ private executeTask;
18
+ private generateCode;
19
+ private reviewCode;
20
+ private performAutoCommit;
21
+ }
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AutoWorkflow = void 0;
4
+ const CodeReviewer_1 = require("../git/CodeReviewer");
5
+ const llm_1 = require("../../agent/llm");
6
+ const constants_1 = require("../git/constants");
7
+ const CodeGenerator_1 = require("../git/CodeGenerator");
8
+ const CommitMessageGenerator_1 = require("../git/CommitMessageGenerator");
9
+ const TodoManager_1 = require("../git/TodoManager");
10
+ const types_1 = require("./types");
11
+ const modelRouter_1 = require("../modelRouter");
12
+ class AutoWorkflow {
13
+ gitService;
14
+ contextGatherer;
15
+ codeReviewer;
16
+ constructor(gitService, contextGatherer, codeReviewer) {
17
+ this.gitService = gitService;
18
+ this.contextGatherer = contextGatherer;
19
+ this.codeReviewer = codeReviewer;
20
+ }
21
+ async run(input, config) {
22
+ try {
23
+ const maxTasks = input.maxTasks || 5;
24
+ const progress = {
25
+ executedTasks: 0,
26
+ backupIds: [],
27
+ filesModified: []
28
+ };
29
+ const todoPath = process.cwd() + '/todo.md';
30
+ const { tasks } = await (0, TodoManager_1.parseTodoFile)(todoPath);
31
+ if (tasks.length === 0) {
32
+ return (0, types_1.workflowFailure)('No tasks found in todo.md', [types_1.WorkflowError.userInput('Please run git plan first to generate tasks')]);
33
+ }
34
+ while (progress.executedTasks < maxTasks) {
35
+ const nextTask = (0, TodoManager_1.getNextTask)(tasks);
36
+ if (!nextTask) {
37
+ break;
38
+ }
39
+ const taskResult = await this.executeTask(nextTask, input, config, progress);
40
+ if (!taskResult.success) {
41
+ return (0, types_1.workflowFailure)(`Task #${nextTask.index + 1} failed`, taskResult.errors || []);
42
+ }
43
+ progress.executedTasks++;
44
+ }
45
+ if (input.autoCommit) {
46
+ await this.performAutoCommit(config);
47
+ }
48
+ return (0, types_1.workflowSuccess)({
49
+ executedTasks: progress.executedTasks,
50
+ totalTasks: tasks.length,
51
+ filesModified: progress.filesModified,
52
+ patch: '',
53
+ dryRunApplied: input.saveOnly || false,
54
+ backupIds: progress.backupIds
55
+ }, `Completed ${progress.executedTasks}/${tasks.length} tasks`);
56
+ }
57
+ catch (error) {
58
+ if (error instanceof llm_1.AIError) {
59
+ return (0, types_1.workflowFailure)('LLM call failed during execution', [
60
+ types_1.WorkflowError.externalService('LLM service unavailable or returned error', error)
61
+ ]);
62
+ }
63
+ return (0, types_1.workflowFailure)('Unexpected error during auto execution', [
64
+ types_1.WorkflowError.internalBug('Auto execution failed', error)
65
+ ]);
66
+ }
67
+ }
68
+ async executeTask(task, input, config, progress) {
69
+ let attempts = task.attempts || 0;
70
+ let taskCompleted = false;
71
+ const previousFeedback = attempts > 0 && task.reviewIssues
72
+ ? task.reviewIssues.join('\n')
73
+ : undefined;
74
+ while (attempts <= constants_1.MAX_RETRY_ATTEMPTS && !taskCompleted) {
75
+ attempts++;
76
+ const todoPath = process.cwd() + '/todo.md';
77
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, task.index, {
78
+ execStatus: 'in_progress',
79
+ attempts
80
+ });
81
+ const gathered = await this.contextGatherer.gather(task.description);
82
+ const { code, success } = await this.generateCode(task, gathered.summary, config.model || 'Assistant', previousFeedback);
83
+ if (!success) {
84
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, task.index, {
85
+ execStatus: 'failed'
86
+ });
87
+ return {
88
+ success: false,
89
+ errors: [
90
+ types_1.WorkflowError.externalService('Code generation failed')
91
+ ]
92
+ };
93
+ }
94
+ const savedPath = await (0, CodeGenerator_1.saveRawOutput)(code, task.index);
95
+ const generated = (0, CodeGenerator_1.parseGeneratedCode)(code);
96
+ if (generated.files.length > 0) {
97
+ if (!input.saveOnly) {
98
+ let backupId;
99
+ try {
100
+ const backup = await (0, CodeGenerator_1.backupFiles)(generated.files);
101
+ backupId = backup.id;
102
+ if (backupId) {
103
+ progress.backupIds.push(backupId);
104
+ }
105
+ }
106
+ catch (e) {
107
+ // Continue without backup
108
+ }
109
+ const { written } = await (0, CodeGenerator_1.writeGeneratedCode)(generated);
110
+ progress.filesModified.push(...written);
111
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, task.index, { backupId });
112
+ }
113
+ }
114
+ if (!input.skipReview) {
115
+ const reviewResult = await this.reviewCode(input.reviewLevel || 'standard', false);
116
+ if (reviewResult.score >= (input.minScore || 70)) {
117
+ taskCompleted = true;
118
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, task.index, {
119
+ completed: true,
120
+ execStatus: 'done'
121
+ });
122
+ }
123
+ else {
124
+ taskCompleted = false;
125
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, task.index, {
126
+ reviewScore: reviewResult.score,
127
+ reviewIssues: reviewResult.issues.map((i) => i.message)
128
+ });
129
+ if (attempts > constants_1.MAX_RETRY_ATTEMPTS) {
130
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, task.index, { execStatus: 'failed' });
131
+ return {
132
+ success: false,
133
+ errors: [
134
+ types_1.WorkflowError.capabilityDenied(`Max retry attempts reached. Final score: ${reviewResult.score} < ${input.minScore || 70}`, ['Consider adjusting minScore', 'Review task requirements', 'Simplify the task'])
135
+ ]
136
+ };
137
+ }
138
+ }
139
+ }
140
+ else {
141
+ taskCompleted = true;
142
+ await (0, TodoManager_1.updateTaskStatus)(todoPath, task.index, {
143
+ completed: true,
144
+ execStatus: 'done'
145
+ });
146
+ }
147
+ }
148
+ return { success: taskCompleted };
149
+ }
150
+ async generateCode(task, context, model, previousFeedback) {
151
+ try {
152
+ const response = await (0, llm_1.runLLM)({
153
+ prompt: {
154
+ system: `你是一个全方位的交付专家。
155
+ 1. 如果当前任务涉及代码(如 .ts, .js, .py 等文件),请扮演**资深软件工程师**,确保代码健壮、注释详尽、遵循最佳实践,并追求极致的模块化与性能。
156
+ 2. 如果当前任务涉及文档(如 .md, .yaml, .html 等文件),请扮演**资深内容专家或历史学者**,确保叙事优美、逻辑严密、事实准确。
157
+
158
+ **重要输出格式要求:**
159
+ - 每个文件必须以 \`### 文件: path\` 或 \`**文件**: path\` 明确标注。
160
+ - 代码内容必须包裹在对应的 Markdown 代码块中。
161
+ - 不要解释,直接输出文件内容。`,
162
+ messages: [
163
+ {
164
+ role: 'user',
165
+ content: `[项目上下文]\n${context}\n\n[当前任务]\n${task.description}\n\n${previousFeedback ? `[审查反馈 - 请修复以下问题]\n${previousFeedback}\n\n` : ''}请根据以上信息开始任务。`
166
+ }
167
+ ]
168
+ },
169
+ model: model || 'Assistant',
170
+ stream: false
171
+ });
172
+ return { code: response.rawText, success: true };
173
+ }
174
+ catch (error) {
175
+ return { code: '', success: false, error: error.message };
176
+ }
177
+ }
178
+ async reviewCode(level, staged) {
179
+ const levelMap = {
180
+ 'quick': CodeReviewer_1.ReviewLevel.QUICK,
181
+ 'standard': CodeReviewer_1.ReviewLevel.STANDARD,
182
+ 'deep': CodeReviewer_1.ReviewLevel.DEEP
183
+ };
184
+ const reviewLevel = level ? levelMap[level] : CodeReviewer_1.ReviewLevel.STANDARD;
185
+ return await this.codeReviewer.review(reviewLevel, staged);
186
+ }
187
+ async performAutoCommit(config) {
188
+ if (!(await this.gitService.isWorkingTreeClean())) {
189
+ await this.gitService.stageAll();
190
+ const router = await (0, modelRouter_1.getRouter)();
191
+ const commitGen = new CommitMessageGenerator_1.CommitMessageGenerator(this.gitService, router);
192
+ const commit = await commitGen.generate({ detailed: false });
193
+ await this.gitService.commit(commit.full);
194
+ return commit.full;
195
+ }
196
+ return undefined;
197
+ }
198
+ }
199
+ exports.AutoWorkflow = AutoWorkflow;
200
+ //# sourceMappingURL=AutoWorkflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoWorkflow.js","sourceRoot":"","sources":["../../../src/core/workflows/AutoWorkflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { CapabilityLevel } from '../capability/CapabilityLevel';
2
+ import { PlanOutput, AutoOutput, ReviewOutput } from './types';
3
+ export type Capability = 'ReadRepo' | 'GeneratePatch' | 'ApplyPatchDryRun' | 'ApplyPatch' | 'Commit' | 'ReviewCode' | 'AnalyzeSemantics';
4
+ export interface ConstraintContext {
5
+ step: 'plan' | 'auto' | 'review';
6
+ capabilityLevel: CapabilityLevel;
7
+ plan?: PlanOutput;
8
+ auto?: AutoOutput;
9
+ review?: ReviewOutput;
10
+ }
11
+ export interface Constraint {
12
+ capability: Capability;
13
+ description: string;
14
+ allow(ctx: ConstraintContext): boolean;
15
+ denyReason?(ctx: ConstraintContext): string;
16
+ }
17
+ export declare class ConstraintEngine {
18
+ private constraints;
19
+ register(constraint: Constraint): void;
20
+ unregister(capability: Capability): void;
21
+ assertAllowed(capability: Capability, ctx: ConstraintContext): void;
22
+ isAllowed(capability: Capability, ctx: ConstraintContext): boolean;
23
+ getAllowedCapabilities(ctx: ConstraintContext): Capability[];
24
+ }
25
+ export declare class DefaultConstraints {
26
+ static readRepo(ctx: ConstraintContext): boolean;
27
+ static generatePatch(ctx: ConstraintContext): boolean;
28
+ static applyPatchDryRun(ctx: ConstraintContext): boolean;
29
+ static applyPatch(ctx: ConstraintContext): boolean;
30
+ static commit(ctx: ConstraintContext): boolean;
31
+ static reviewCode(ctx: ConstraintContext): boolean;
32
+ static analyzeSemantics(ctx: ConstraintContext): boolean;
33
+ static getAll(): Constraint[];
34
+ }
35
+ export declare const defaultConstraintEngine: ConstraintEngine;