@gracefultools/astrid-sdk 0.1.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/README.md +160 -0
- package/dist/adapters/astrid-oauth.d.ts +95 -0
- package/dist/adapters/astrid-oauth.d.ts.map +1 -0
- package/dist/adapters/astrid-oauth.js +230 -0
- package/dist/adapters/astrid-oauth.js.map +1 -0
- package/dist/bin/cli.d.ts +13 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +286 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/executors/claude.d.ts +45 -0
- package/dist/executors/claude.d.ts.map +1 -0
- package/dist/executors/claude.js +654 -0
- package/dist/executors/claude.js.map +1 -0
- package/dist/executors/gemini.d.ts +23 -0
- package/dist/executors/gemini.d.ts.map +1 -0
- package/dist/executors/gemini.js +487 -0
- package/dist/executors/gemini.js.map +1 -0
- package/dist/executors/openai.d.ts +24 -0
- package/dist/executors/openai.d.ts.map +1 -0
- package/dist/executors/openai.js +502 -0
- package/dist/executors/openai.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +143 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/agent-config.d.ts +56 -0
- package/dist/utils/agent-config.d.ts.map +1 -0
- package/dist/utils/agent-config.js +125 -0
- package/dist/utils/agent-config.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Claude Agent SDK Executor
|
|
4
|
+
*
|
|
5
|
+
* Executes code implementation using Claude Code's native tools (Read, Write, Edit, Bash)
|
|
6
|
+
* instead of generating code via API and parsing JSON responses.
|
|
7
|
+
*
|
|
8
|
+
* This provides:
|
|
9
|
+
* - Better code quality (real file editing vs generated text)
|
|
10
|
+
* - Native error handling and recovery
|
|
11
|
+
* - Actual test execution
|
|
12
|
+
* - Real git operations
|
|
13
|
+
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.planWithClaude = planWithClaude;
|
|
49
|
+
exports.executeWithClaude = executeWithClaude;
|
|
50
|
+
exports.prepareRepository = prepareRepository;
|
|
51
|
+
const claude_agent_sdk_1 = require("@anthropic-ai/claude-agent-sdk");
|
|
52
|
+
const fs = __importStar(require("fs/promises"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// REPOSITORY CONTEXT LOADING
|
|
56
|
+
// ============================================================================
|
|
57
|
+
/**
|
|
58
|
+
* Load ASTRID.md from the repository if it exists
|
|
59
|
+
*/
|
|
60
|
+
async function loadAstridMd(repoPath) {
|
|
61
|
+
const astridPath = path.join(repoPath, 'ASTRID.md');
|
|
62
|
+
try {
|
|
63
|
+
const content = await fs.readFile(astridPath, 'utf-8');
|
|
64
|
+
return content.length > 8000 ? content.substring(0, 8000) + '\n\n[ASTRID.md truncated...]' : content;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Detect the test command for the repository
|
|
72
|
+
*/
|
|
73
|
+
async function detectTestCommand(repoPath) {
|
|
74
|
+
const packageJsonPath = path.join(repoPath, 'package.json');
|
|
75
|
+
try {
|
|
76
|
+
const content = await fs.readFile(packageJsonPath, 'utf-8');
|
|
77
|
+
const pkg = JSON.parse(content);
|
|
78
|
+
if (pkg.scripts?.test) {
|
|
79
|
+
return 'npm test';
|
|
80
|
+
}
|
|
81
|
+
if (pkg.scripts?.['predeploy:quick']) {
|
|
82
|
+
return 'npm run predeploy:quick';
|
|
83
|
+
}
|
|
84
|
+
if (pkg.scripts?.predeploy) {
|
|
85
|
+
return 'npm run predeploy';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// No package.json or invalid JSON
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Detect iOS project and return build info
|
|
95
|
+
*/
|
|
96
|
+
async function detectiOSProject(repoPath) {
|
|
97
|
+
const possiblePaths = ['ios-app', 'ios', 'iOS', '.'];
|
|
98
|
+
for (const subdir of possiblePaths) {
|
|
99
|
+
const searchPath = path.join(repoPath, subdir);
|
|
100
|
+
try {
|
|
101
|
+
const entries = await fs.readdir(searchPath);
|
|
102
|
+
const xcodeproj = entries.find(e => e.endsWith('.xcodeproj'));
|
|
103
|
+
if (xcodeproj) {
|
|
104
|
+
const schemeName = xcodeproj.replace('.xcodeproj', '');
|
|
105
|
+
const projectPath = subdir === '.' ? xcodeproj : `${subdir}/${xcodeproj}`;
|
|
106
|
+
return {
|
|
107
|
+
hasIOSProject: true,
|
|
108
|
+
projectPath,
|
|
109
|
+
schemeName,
|
|
110
|
+
buildCommand: `cd ${subdir === '.' ? '.' : subdir} && xcodebuild -scheme "${schemeName}" -destination "platform=iOS Simulator,name=iPhone 16" -configuration Debug build 2>&1 | tail -50`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Directory doesn't exist
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
// ============================================================================
|
|
121
|
+
// PLANNING
|
|
122
|
+
// ============================================================================
|
|
123
|
+
/**
|
|
124
|
+
* Generate an implementation plan using Claude Agent SDK
|
|
125
|
+
*/
|
|
126
|
+
async function planWithClaude(taskTitle, taskDescription, config) {
|
|
127
|
+
const log = config.logger || (() => { });
|
|
128
|
+
const onProgress = config.onProgress || (() => { });
|
|
129
|
+
log('info', 'Starting Claude Agent SDK planning', {
|
|
130
|
+
repoPath: config.repoPath,
|
|
131
|
+
taskTitle
|
|
132
|
+
});
|
|
133
|
+
onProgress('Initializing Claude Code for planning...');
|
|
134
|
+
const astridMd = await loadAstridMd(config.repoPath);
|
|
135
|
+
if (astridMd) {
|
|
136
|
+
log('info', 'Loaded ASTRID.md from repository');
|
|
137
|
+
onProgress('Loaded project context from ASTRID.md');
|
|
138
|
+
}
|
|
139
|
+
if (config.previousContext?.hasBeenProcessedBefore) {
|
|
140
|
+
log('info', 'Task has previous context', {
|
|
141
|
+
attempts: config.previousContext.previousAttempts.length,
|
|
142
|
+
feedbackItems: config.previousContext.userFeedback.length
|
|
143
|
+
});
|
|
144
|
+
onProgress('Considering previous attempts and user feedback...');
|
|
145
|
+
}
|
|
146
|
+
const prompt = buildPlanningPrompt(taskTitle, taskDescription, astridMd, config.previousContext);
|
|
147
|
+
const options = {
|
|
148
|
+
cwd: config.repoPath,
|
|
149
|
+
permissionMode: 'default',
|
|
150
|
+
maxTurns: config.maxTurns || 30,
|
|
151
|
+
maxBudgetUsd: config.maxBudgetUsd || 2.0,
|
|
152
|
+
allowedTools: ['Read', 'Glob', 'Grep', 'Bash'],
|
|
153
|
+
settingSources: [],
|
|
154
|
+
systemPrompt: {
|
|
155
|
+
type: 'preset',
|
|
156
|
+
preset: 'claude_code',
|
|
157
|
+
append: `
|
|
158
|
+
You are analyzing a codebase to create an implementation plan for a coding task.
|
|
159
|
+
|
|
160
|
+
CRITICAL RULES:
|
|
161
|
+
1. DO NOT modify any files - this is READ-ONLY exploration
|
|
162
|
+
2. DO NOT use Write or Edit tools
|
|
163
|
+
3. Explore the codebase to understand the structure and patterns
|
|
164
|
+
4. Read relevant files to understand existing implementations
|
|
165
|
+
5. Create a focused, surgical implementation plan
|
|
166
|
+
|
|
167
|
+
After exploring, output ONLY a JSON block with this exact structure:
|
|
168
|
+
\`\`\`json
|
|
169
|
+
{
|
|
170
|
+
"summary": "Brief summary of what needs to be done",
|
|
171
|
+
"approach": "High-level approach to implementing the changes",
|
|
172
|
+
"files": [
|
|
173
|
+
{
|
|
174
|
+
"path": "path/to/file.ts",
|
|
175
|
+
"purpose": "Why this file needs changes",
|
|
176
|
+
"changes": "Specific changes to make"
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
"estimatedComplexity": "simple|medium|complex",
|
|
180
|
+
"considerations": ["Important consideration 1", "Important consideration 2"]
|
|
181
|
+
}
|
|
182
|
+
\`\`\`
|
|
183
|
+
|
|
184
|
+
PLANNING RULES:
|
|
185
|
+
- Maximum 5 files in the plan
|
|
186
|
+
- Be SURGICAL: only list files that MUST change
|
|
187
|
+
- Include specific file paths you discovered
|
|
188
|
+
- Consider existing patterns in the codebase
|
|
189
|
+
`
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const env = { ...process.env };
|
|
193
|
+
if (config.apiKey) {
|
|
194
|
+
env.ANTHROPIC_API_KEY = config.apiKey;
|
|
195
|
+
}
|
|
196
|
+
options.env = env;
|
|
197
|
+
try {
|
|
198
|
+
const messages = [];
|
|
199
|
+
let result = null;
|
|
200
|
+
const exploredFiles = [];
|
|
201
|
+
onProgress('Claude Code is exploring the codebase...');
|
|
202
|
+
for await (const message of (0, claude_agent_sdk_1.query)({ prompt, options })) {
|
|
203
|
+
messages.push(message);
|
|
204
|
+
if (message.type === 'assistant') {
|
|
205
|
+
const content = message.message.content;
|
|
206
|
+
if (Array.isArray(content)) {
|
|
207
|
+
for (const block of content) {
|
|
208
|
+
if (block.type === 'text' && block.text) {
|
|
209
|
+
onProgress(`Analyzing: ${block.text.substring(0, 100)}...`);
|
|
210
|
+
}
|
|
211
|
+
if (block.type === 'tool_use') {
|
|
212
|
+
onProgress(`Exploring: ${block.name}`);
|
|
213
|
+
log('info', 'Tool use (planning)', { tool: block.name, input: block.input });
|
|
214
|
+
if (block.name === 'Read' && typeof block.input === 'object' && block.input !== null) {
|
|
215
|
+
const input = block.input;
|
|
216
|
+
if (input.file_path) {
|
|
217
|
+
exploredFiles.push({
|
|
218
|
+
path: input.file_path,
|
|
219
|
+
content: '',
|
|
220
|
+
relevance: 'Explored during planning'
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (message.type === 'result') {
|
|
229
|
+
result = message;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (!result) {
|
|
233
|
+
throw new Error('No result received from Claude Agent SDK');
|
|
234
|
+
}
|
|
235
|
+
if (result.subtype !== 'success') {
|
|
236
|
+
const errorResult = result;
|
|
237
|
+
throw new Error(`Planning failed: ${result.subtype} - ${errorResult.errors?.join(', ') || 'Unknown error'}`);
|
|
238
|
+
}
|
|
239
|
+
log('info', 'Claude Agent SDK planning completed', {
|
|
240
|
+
turns: result.num_turns,
|
|
241
|
+
costUsd: result.total_cost_usd,
|
|
242
|
+
filesExplored: exploredFiles.length
|
|
243
|
+
});
|
|
244
|
+
const plan = parsePlanFromResult(result, exploredFiles, log);
|
|
245
|
+
if (!plan) {
|
|
246
|
+
throw new Error('Could not parse implementation plan from Claude output');
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
success: true,
|
|
250
|
+
plan,
|
|
251
|
+
usage: {
|
|
252
|
+
inputTokens: result.usage.input_tokens,
|
|
253
|
+
outputTokens: result.usage.output_tokens,
|
|
254
|
+
costUSD: result.total_cost_usd
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
260
|
+
log('error', 'Claude Agent SDK planning failed', { error: errorMessage });
|
|
261
|
+
return {
|
|
262
|
+
success: false,
|
|
263
|
+
error: errorMessage
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// ============================================================================
|
|
268
|
+
// EXECUTION
|
|
269
|
+
// ============================================================================
|
|
270
|
+
/**
|
|
271
|
+
* Execute an implementation plan using Claude Agent SDK
|
|
272
|
+
*/
|
|
273
|
+
async function executeWithClaude(plan, taskTitle, taskDescription, config) {
|
|
274
|
+
const log = config.logger || (() => { });
|
|
275
|
+
const onProgress = config.onProgress || (() => { });
|
|
276
|
+
log('info', 'Starting Claude Agent SDK execution', {
|
|
277
|
+
repoPath: config.repoPath,
|
|
278
|
+
filesInPlan: plan.files.length,
|
|
279
|
+
complexity: plan.estimatedComplexity
|
|
280
|
+
});
|
|
281
|
+
onProgress('Initializing Claude Code agent...');
|
|
282
|
+
const astridMd = await loadAstridMd(config.repoPath);
|
|
283
|
+
const testCommand = await detectTestCommand(config.repoPath);
|
|
284
|
+
const iosProject = await detectiOSProject(config.repoPath);
|
|
285
|
+
if (astridMd)
|
|
286
|
+
log('info', 'Loaded ASTRID.md from repository');
|
|
287
|
+
if (testCommand)
|
|
288
|
+
log('info', `Detected test command: ${testCommand}`);
|
|
289
|
+
if (iosProject?.hasIOSProject) {
|
|
290
|
+
log('info', `Detected iOS project: ${iosProject.projectPath}`);
|
|
291
|
+
onProgress(`Found iOS project: ${iosProject.schemeName}`);
|
|
292
|
+
}
|
|
293
|
+
const prompt = buildImplementationPrompt(plan, taskTitle, taskDescription, astridMd, testCommand, iosProject);
|
|
294
|
+
let testingInstructions = '';
|
|
295
|
+
if (testCommand) {
|
|
296
|
+
testingInstructions += `
|
|
297
|
+
WEB/NODE TESTING:
|
|
298
|
+
1. After making code changes, run: ${testCommand}
|
|
299
|
+
2. If tests fail, fix the issues before completing`;
|
|
300
|
+
}
|
|
301
|
+
if (iosProject?.hasIOSProject) {
|
|
302
|
+
testingInstructions += `
|
|
303
|
+
|
|
304
|
+
iOS BUILD REQUIREMENTS (CRITICAL):
|
|
305
|
+
1. If you modified ANY Swift files, you MUST run the iOS build
|
|
306
|
+
2. Build command: ${iosProject.buildCommand}
|
|
307
|
+
3. If the build fails, FIX THE ERRORS before completing`;
|
|
308
|
+
}
|
|
309
|
+
const options = {
|
|
310
|
+
cwd: config.repoPath,
|
|
311
|
+
permissionMode: 'acceptEdits',
|
|
312
|
+
maxTurns: config.maxTurns || 50,
|
|
313
|
+
maxBudgetUsd: config.maxBudgetUsd || 5.0,
|
|
314
|
+
allowedTools: ['Read', 'Write', 'Edit', 'Glob', 'Grep', 'Bash'],
|
|
315
|
+
settingSources: [],
|
|
316
|
+
systemPrompt: {
|
|
317
|
+
type: 'preset',
|
|
318
|
+
preset: 'claude_code',
|
|
319
|
+
append: `
|
|
320
|
+
You are implementing a coding task from an approved plan.
|
|
321
|
+
|
|
322
|
+
CRITICAL RULES:
|
|
323
|
+
1. Follow the implementation plan exactly
|
|
324
|
+
2. Create/modify ONLY the files specified in the plan
|
|
325
|
+
3. Write complete, working code - no placeholders or TODOs
|
|
326
|
+
4. Run tests/builds after making changes - they MUST pass
|
|
327
|
+
5. Do NOT commit changes - just make the file edits
|
|
328
|
+
${testingInstructions}
|
|
329
|
+
|
|
330
|
+
After completing all changes, output a JSON block:
|
|
331
|
+
\`\`\`json
|
|
332
|
+
{
|
|
333
|
+
"completed": true,
|
|
334
|
+
"filesModified": ["path/to/file1.ts"],
|
|
335
|
+
"testsRun": true,
|
|
336
|
+
"testsPassed": true,
|
|
337
|
+
"commitMessage": "brief commit message",
|
|
338
|
+
"prTitle": "PR title",
|
|
339
|
+
"prDescription": "What this PR does"
|
|
340
|
+
}
|
|
341
|
+
\`\`\`
|
|
342
|
+
`
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
const env = { ...process.env };
|
|
346
|
+
if (config.apiKey) {
|
|
347
|
+
env.ANTHROPIC_API_KEY = config.apiKey;
|
|
348
|
+
}
|
|
349
|
+
options.env = env;
|
|
350
|
+
try {
|
|
351
|
+
const messages = [];
|
|
352
|
+
let result = null;
|
|
353
|
+
onProgress('Claude Code is analyzing the codebase...');
|
|
354
|
+
for await (const message of (0, claude_agent_sdk_1.query)({ prompt, options })) {
|
|
355
|
+
messages.push(message);
|
|
356
|
+
if (message.type === 'assistant') {
|
|
357
|
+
const content = message.message.content;
|
|
358
|
+
if (Array.isArray(content)) {
|
|
359
|
+
for (const block of content) {
|
|
360
|
+
if (block.type === 'text' && block.text) {
|
|
361
|
+
onProgress(`Working: ${block.text.substring(0, 100)}...`);
|
|
362
|
+
}
|
|
363
|
+
if (block.type === 'tool_use') {
|
|
364
|
+
onProgress(`Using tool: ${block.name}`);
|
|
365
|
+
log('info', 'Tool use', { tool: block.name, input: block.input });
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
if (message.type === 'result') {
|
|
371
|
+
result = message;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (!result) {
|
|
375
|
+
throw new Error('No result received from Claude Agent SDK');
|
|
376
|
+
}
|
|
377
|
+
if (result.subtype !== 'success') {
|
|
378
|
+
const errorResult = result;
|
|
379
|
+
throw new Error(`Execution failed: ${result.subtype} - ${errorResult.errors?.join(', ') || 'Unknown error'}`);
|
|
380
|
+
}
|
|
381
|
+
log('info', 'Claude Agent SDK execution completed', {
|
|
382
|
+
turns: result.num_turns,
|
|
383
|
+
costUsd: result.total_cost_usd,
|
|
384
|
+
inputTokens: result.usage.input_tokens,
|
|
385
|
+
outputTokens: result.usage.output_tokens
|
|
386
|
+
});
|
|
387
|
+
const executionResult = await parseExecutionResult(config.repoPath, result, plan, log);
|
|
388
|
+
return {
|
|
389
|
+
...executionResult,
|
|
390
|
+
usage: {
|
|
391
|
+
inputTokens: result.usage.input_tokens,
|
|
392
|
+
outputTokens: result.usage.output_tokens,
|
|
393
|
+
costUSD: result.total_cost_usd
|
|
394
|
+
}
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
catch (error) {
|
|
398
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
399
|
+
log('error', 'Claude Agent SDK execution failed', { error: errorMessage });
|
|
400
|
+
return {
|
|
401
|
+
success: false,
|
|
402
|
+
files: [],
|
|
403
|
+
commitMessage: '',
|
|
404
|
+
prTitle: '',
|
|
405
|
+
prDescription: '',
|
|
406
|
+
error: errorMessage
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
// ============================================================================
|
|
411
|
+
// REPOSITORY PREPARATION
|
|
412
|
+
// ============================================================================
|
|
413
|
+
/**
|
|
414
|
+
* Prepare a repository for execution
|
|
415
|
+
*/
|
|
416
|
+
async function prepareRepository(repoOwner, repoName, branch, githubToken, workDir) {
|
|
417
|
+
const { execSync } = await import('child_process');
|
|
418
|
+
const os = await import('os');
|
|
419
|
+
const tempDir = workDir || await fs.mkdtemp(path.join(os.tmpdir(), 'claude-agent-'));
|
|
420
|
+
const repoPath = path.join(tempDir, repoName);
|
|
421
|
+
const cloneUrl = `https://x-access-token:${githubToken}@github.com/${repoOwner}/${repoName}.git`;
|
|
422
|
+
execSync(`git clone --depth 1 --branch ${branch} ${cloneUrl} ${repoPath}`, {
|
|
423
|
+
stdio: 'pipe',
|
|
424
|
+
timeout: 120000
|
|
425
|
+
});
|
|
426
|
+
execSync('git config user.email "ai-agent@astrid.cc"', { cwd: repoPath });
|
|
427
|
+
execSync('git config user.name "Astrid AI Agent"', { cwd: repoPath });
|
|
428
|
+
return {
|
|
429
|
+
repoPath,
|
|
430
|
+
cleanup: async () => {
|
|
431
|
+
try {
|
|
432
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
// Ignore cleanup errors
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
// ============================================================================
|
|
441
|
+
// HELPER FUNCTIONS
|
|
442
|
+
// ============================================================================
|
|
443
|
+
function buildPlanningPrompt(taskTitle, taskDescription, astridMd, previousContext) {
|
|
444
|
+
const contextSection = astridMd
|
|
445
|
+
? `## Project Context (from ASTRID.md)\n\n${astridMd}\n\n---\n\n`
|
|
446
|
+
: '';
|
|
447
|
+
let previousAttemptsSection = '';
|
|
448
|
+
if (previousContext?.hasBeenProcessedBefore) {
|
|
449
|
+
previousAttemptsSection = `## Previous Attempts & User Feedback\n\n`;
|
|
450
|
+
if (previousContext.previousAttempts.length > 0) {
|
|
451
|
+
previousAttemptsSection += `### Previous Attempts\n`;
|
|
452
|
+
previousContext.previousAttempts.forEach((attempt, i) => {
|
|
453
|
+
previousAttemptsSection += `\n**Attempt ${i + 1}:**\n`;
|
|
454
|
+
if (attempt.planSummary)
|
|
455
|
+
previousAttemptsSection += `- Previous plan: ${attempt.planSummary}\n`;
|
|
456
|
+
if (attempt.filesModified?.length)
|
|
457
|
+
previousAttemptsSection += `- Files modified: ${attempt.filesModified.slice(0, 5).join(', ')}\n`;
|
|
458
|
+
if (attempt.prUrl)
|
|
459
|
+
previousAttemptsSection += `- PR created: ${attempt.prUrl}\n`;
|
|
460
|
+
if (attempt.outcome)
|
|
461
|
+
previousAttemptsSection += `- Outcome: ${attempt.outcome}\n`;
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
if (previousContext.userFeedback.length > 0) {
|
|
465
|
+
previousAttemptsSection += `\n### User Feedback (Address These)\n`;
|
|
466
|
+
previousContext.userFeedback.forEach(feedback => {
|
|
467
|
+
previousAttemptsSection += `\n> "${feedback.content}"\n`;
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
previousAttemptsSection += `\n---\n\n`;
|
|
471
|
+
}
|
|
472
|
+
return `# Planning Task
|
|
473
|
+
|
|
474
|
+
${contextSection}${previousAttemptsSection}## Task to Implement
|
|
475
|
+
**${taskTitle}**
|
|
476
|
+
|
|
477
|
+
${taskDescription || 'No additional description provided.'}
|
|
478
|
+
|
|
479
|
+
## Your Mission
|
|
480
|
+
|
|
481
|
+
1. **Check for ASTRID.md** - Read project context
|
|
482
|
+
2. **Explore the codebase** - Understand structure and patterns
|
|
483
|
+
3. **Read key files** - Understand implementations you'll change
|
|
484
|
+
4. **Create an implementation plan** - List specific files to modify
|
|
485
|
+
|
|
486
|
+
Begin exploration now.`;
|
|
487
|
+
}
|
|
488
|
+
function buildImplementationPrompt(plan, taskTitle, taskDescription, astridMd, testCommand, iosProject) {
|
|
489
|
+
const filesSection = plan.files
|
|
490
|
+
.map(f => `- **${f.path}**: ${f.purpose}\n Changes: ${f.changes}`)
|
|
491
|
+
.join('\n');
|
|
492
|
+
const contextSection = astridMd
|
|
493
|
+
? `## Project Context\n\n${astridMd.substring(0, 4000)}${astridMd.length > 4000 ? '\n\n[truncated...]' : ''}\n\n---\n\n`
|
|
494
|
+
: '';
|
|
495
|
+
let testingSection = '## Testing Requirements\n\n';
|
|
496
|
+
if (testCommand) {
|
|
497
|
+
testingSection += `**Test Command:** \`${testCommand}\`\n\n`;
|
|
498
|
+
}
|
|
499
|
+
if (iosProject?.hasIOSProject) {
|
|
500
|
+
testingSection += `**iOS Build:** \`${iosProject.buildCommand}\`\n\n`;
|
|
501
|
+
}
|
|
502
|
+
return `# Implementation Task
|
|
503
|
+
|
|
504
|
+
${contextSection}## Task
|
|
505
|
+
**${taskTitle}**
|
|
506
|
+
${taskDescription || ''}
|
|
507
|
+
|
|
508
|
+
## Approved Implementation Plan
|
|
509
|
+
|
|
510
|
+
### Summary
|
|
511
|
+
${plan.summary}
|
|
512
|
+
|
|
513
|
+
### Approach
|
|
514
|
+
${plan.approach}
|
|
515
|
+
|
|
516
|
+
### Files to Modify
|
|
517
|
+
${filesSection}
|
|
518
|
+
|
|
519
|
+
### Complexity
|
|
520
|
+
${plan.estimatedComplexity}
|
|
521
|
+
|
|
522
|
+
${testingSection}
|
|
523
|
+
|
|
524
|
+
Begin implementation now.`;
|
|
525
|
+
}
|
|
526
|
+
function parsePlanFromResult(result, exploredFiles, log) {
|
|
527
|
+
const resultText = result.result || '';
|
|
528
|
+
const jsonMatch = resultText.match(/```json\s*([\s\S]*?)\s*```/);
|
|
529
|
+
if (!jsonMatch) {
|
|
530
|
+
log('warn', 'No JSON block found in planning output', {});
|
|
531
|
+
return null;
|
|
532
|
+
}
|
|
533
|
+
try {
|
|
534
|
+
const parsed = JSON.parse(jsonMatch[1]);
|
|
535
|
+
if (!parsed.summary || !parsed.files || !Array.isArray(parsed.files)) {
|
|
536
|
+
log('warn', 'Invalid plan structure', { parsed });
|
|
537
|
+
return null;
|
|
538
|
+
}
|
|
539
|
+
const plan = {
|
|
540
|
+
summary: parsed.summary,
|
|
541
|
+
approach: parsed.approach || parsed.summary,
|
|
542
|
+
files: parsed.files.map((f) => ({
|
|
543
|
+
path: f.path,
|
|
544
|
+
purpose: f.purpose || 'Implementation',
|
|
545
|
+
changes: f.changes || 'See plan'
|
|
546
|
+
})),
|
|
547
|
+
estimatedComplexity: parsed.estimatedComplexity || 'medium',
|
|
548
|
+
considerations: parsed.considerations || [],
|
|
549
|
+
exploredFiles
|
|
550
|
+
};
|
|
551
|
+
log('info', 'Successfully parsed implementation plan', {
|
|
552
|
+
filesInPlan: plan.files.length,
|
|
553
|
+
filesExplored: plan.exploredFiles?.length || 0
|
|
554
|
+
});
|
|
555
|
+
return plan;
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
log('error', 'Failed to parse plan JSON', { error: String(error), jsonText: jsonMatch[1] });
|
|
559
|
+
return null;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
async function parseExecutionResult(repoPath, result, plan, log) {
|
|
563
|
+
const { execSync } = await import('child_process');
|
|
564
|
+
try {
|
|
565
|
+
const gitStatusRaw = execSync('git status --porcelain', {
|
|
566
|
+
cwd: repoPath,
|
|
567
|
+
encoding: 'utf-8'
|
|
568
|
+
});
|
|
569
|
+
const lines = gitStatusRaw.split('\n').filter(line => line.trim().length > 0);
|
|
570
|
+
if (lines.length === 0) {
|
|
571
|
+
log('warn', 'No file changes detected by git', {});
|
|
572
|
+
return {
|
|
573
|
+
success: false,
|
|
574
|
+
files: [],
|
|
575
|
+
commitMessage: '',
|
|
576
|
+
prTitle: '',
|
|
577
|
+
prDescription: '',
|
|
578
|
+
error: 'No file changes were made'
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
const files = [];
|
|
582
|
+
for (const line of lines) {
|
|
583
|
+
const status = line.substring(0, 2).trim();
|
|
584
|
+
const filePath = line.substring(3).trim();
|
|
585
|
+
let action;
|
|
586
|
+
if (status === 'D' || status === ' D') {
|
|
587
|
+
action = 'delete';
|
|
588
|
+
}
|
|
589
|
+
else if (status === '?' || status === 'A' || status === '??') {
|
|
590
|
+
action = 'create';
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
action = 'modify';
|
|
594
|
+
}
|
|
595
|
+
let content = '';
|
|
596
|
+
if (action !== 'delete') {
|
|
597
|
+
const fullPath = path.join(repoPath, filePath);
|
|
598
|
+
try {
|
|
599
|
+
content = await fs.readFile(fullPath, 'utf-8');
|
|
600
|
+
}
|
|
601
|
+
catch {
|
|
602
|
+
log('warn', `Could not read file: ${filePath}`, {});
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
files.push({ path: filePath, content, action });
|
|
606
|
+
}
|
|
607
|
+
log('info', 'Parsed file changes from git', {
|
|
608
|
+
totalFiles: files.length,
|
|
609
|
+
created: files.filter(f => f.action === 'create').length,
|
|
610
|
+
modified: files.filter(f => f.action === 'modify').length,
|
|
611
|
+
deleted: files.filter(f => f.action === 'delete').length
|
|
612
|
+
});
|
|
613
|
+
const resultText = result.result || '';
|
|
614
|
+
const jsonMatch = resultText.match(/```json\s*([\s\S]*?)\s*```/);
|
|
615
|
+
let commitMessage = `feat: ${plan.summary.substring(0, 50)}`;
|
|
616
|
+
let prTitle = plan.summary;
|
|
617
|
+
let prDescription = plan.approach;
|
|
618
|
+
if (jsonMatch) {
|
|
619
|
+
try {
|
|
620
|
+
const parsed = JSON.parse(jsonMatch[1]);
|
|
621
|
+
if (parsed.commitMessage)
|
|
622
|
+
commitMessage = parsed.commitMessage;
|
|
623
|
+
if (parsed.prTitle)
|
|
624
|
+
prTitle = parsed.prTitle;
|
|
625
|
+
if (parsed.prDescription)
|
|
626
|
+
prDescription = parsed.prDescription;
|
|
627
|
+
}
|
|
628
|
+
catch {
|
|
629
|
+
log('warn', 'Could not parse JSON output from Claude', {});
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return {
|
|
633
|
+
success: true,
|
|
634
|
+
files,
|
|
635
|
+
commitMessage,
|
|
636
|
+
prTitle,
|
|
637
|
+
prDescription
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
catch (error) {
|
|
641
|
+
log('error', 'Failed to parse execution result', {
|
|
642
|
+
error: error instanceof Error ? error.message : String(error)
|
|
643
|
+
});
|
|
644
|
+
return {
|
|
645
|
+
success: false,
|
|
646
|
+
files: [],
|
|
647
|
+
commitMessage: '',
|
|
648
|
+
prTitle: '',
|
|
649
|
+
prDescription: '',
|
|
650
|
+
error: `Failed to parse file changes: ${error instanceof Error ? error.message : String(error)}`
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/executors/claude.ts"],"names":[],"mappings":"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"}
|