@ariacode/cli 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/LICENSE +21 -0
- package/README.md +404 -0
- package/dist/actions.d.ts +271 -0
- package/dist/actions.js +1809 -0
- package/dist/actions.js.map +1 -0
- package/dist/agent.d.ts +26 -0
- package/dist/agent.js +182 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +14 -0
- package/dist/app.js +83 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.js +157 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +170 -0
- package/dist/config.js +291 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +58 -0
- package/dist/context.js +44 -0
- package/dist/context.js.map +1 -0
- package/dist/parser.d.ts +39 -0
- package/dist/parser.js +323 -0
- package/dist/parser.js.map +1 -0
- package/dist/prompts/ask.md +20 -0
- package/dist/prompts/explore.md +38 -0
- package/dist/prompts/patch.md +27 -0
- package/dist/prompts/plan.md +41 -0
- package/dist/prompts/prompts/ask.md +20 -0
- package/dist/prompts/prompts/explore.md +38 -0
- package/dist/prompts/prompts/patch.md +27 -0
- package/dist/prompts/prompts/plan.md +41 -0
- package/dist/prompts/prompts/review.md +33 -0
- package/dist/prompts/review.md +33 -0
- package/dist/provider.d.ts +148 -0
- package/dist/provider.js +486 -0
- package/dist/provider.js.map +1 -0
- package/dist/repo.d.ts +22 -0
- package/dist/repo.js +154 -0
- package/dist/repo.js.map +1 -0
- package/dist/safety.d.ts +48 -0
- package/dist/safety.js +140 -0
- package/dist/safety.js.map +1 -0
- package/dist/storage.d.ts +133 -0
- package/dist/storage.js +300 -0
- package/dist/storage.js.map +1 -0
- package/dist/tools.d.ts +70 -0
- package/dist/tools.js +654 -0
- package/dist/tools.js.map +1 -0
- package/dist/ui.d.ts +203 -0
- package/dist/ui.js +410 -0
- package/dist/ui.js.map +1 -0
- package/package.json +73 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as nodePath from "node:path";
|
|
4
|
+
import { validatePath, validateFileSize, validatePatchSize } from "./safety.js";
|
|
5
|
+
import { createPatch } from "diff";
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
import { execFileSync } from "node:child_process";
|
|
8
|
+
import ignore from "ignore";
|
|
9
|
+
/**
|
|
10
|
+
* Max number of proposed diffs stored in memory
|
|
11
|
+
* Prevents unbounded memory growth
|
|
12
|
+
*/
|
|
13
|
+
const MAX_PROPOSED_DIFFS = 100;
|
|
14
|
+
/**
|
|
15
|
+
* TTL for proposed diffs in milliseconds (30 minutes)
|
|
16
|
+
*/
|
|
17
|
+
const PROPOSED_DIFF_TTL_MS = 30 * 60 * 1000;
|
|
18
|
+
/**
|
|
19
|
+
* In-memory storage for proposed diffs
|
|
20
|
+
* Maps diffId to diff data with creation timestamp
|
|
21
|
+
* Evicts entries beyond MAX_PROPOSED_DIFFS or older than PROPOSED_DIFF_TTL_MS
|
|
22
|
+
*/
|
|
23
|
+
const proposedDiffs = new Map();
|
|
24
|
+
/**
|
|
25
|
+
* Evict expired or excess diffs from the cache
|
|
26
|
+
*/
|
|
27
|
+
function evictStaleDiffs() {
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
// Remove expired entries
|
|
30
|
+
for (const [id, entry] of proposedDiffs) {
|
|
31
|
+
if (now - entry.createdAt > PROPOSED_DIFF_TTL_MS) {
|
|
32
|
+
proposedDiffs.delete(id);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// If still over limit, remove oldest entries
|
|
36
|
+
if (proposedDiffs.size > MAX_PROPOSED_DIFFS) {
|
|
37
|
+
const sorted = [...proposedDiffs.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt);
|
|
38
|
+
const toRemove = sorted.slice(0, sorted.length - MAX_PROPOSED_DIFFS);
|
|
39
|
+
for (const [id] of toRemove) {
|
|
40
|
+
proposedDiffs.delete(id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* read_file tool
|
|
46
|
+
* Reads file content by path with safety validation
|
|
47
|
+
* Requirements: 8.1, 8.7, 8.8
|
|
48
|
+
*/
|
|
49
|
+
export const readFileTool = {
|
|
50
|
+
name: "read_file",
|
|
51
|
+
description: "Read the contents of a file at the specified path",
|
|
52
|
+
isMutation: false,
|
|
53
|
+
inputSchema: z.object({
|
|
54
|
+
path: z.string().describe("Path to the file to read (relative to project root)"),
|
|
55
|
+
}),
|
|
56
|
+
async execute(input, ctx, config) {
|
|
57
|
+
try {
|
|
58
|
+
const { path: filePath } = this.inputSchema.parse(input);
|
|
59
|
+
// Validate path is within project root
|
|
60
|
+
validatePath(filePath, ctx.projectRoot);
|
|
61
|
+
// Resolve to absolute path
|
|
62
|
+
const absolutePath = nodePath.resolve(ctx.projectRoot, filePath);
|
|
63
|
+
// Check file size limit
|
|
64
|
+
validateFileSize(absolutePath, config.safety.maxFileSizeKb);
|
|
65
|
+
// Read file content
|
|
66
|
+
const content = fs.readFileSync(absolutePath, "utf-8");
|
|
67
|
+
return {
|
|
68
|
+
success: true,
|
|
69
|
+
data: {
|
|
70
|
+
path: filePath,
|
|
71
|
+
content,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: error instanceof Error ? error.message : String(error),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Load .gitignore patterns from project root
|
|
85
|
+
*/
|
|
86
|
+
function loadGitignorePatterns(projectRoot) {
|
|
87
|
+
const ig = ignore();
|
|
88
|
+
// Always exclude these patterns
|
|
89
|
+
ig.add([
|
|
90
|
+
"node_modules",
|
|
91
|
+
".git",
|
|
92
|
+
".env",
|
|
93
|
+
".env.*",
|
|
94
|
+
]);
|
|
95
|
+
// Load .gitignore if it exists
|
|
96
|
+
const gitignorePath = nodePath.join(projectRoot, ".gitignore");
|
|
97
|
+
if (fs.existsSync(gitignorePath)) {
|
|
98
|
+
const gitignoreContent = fs.readFileSync(gitignorePath, "utf-8");
|
|
99
|
+
ig.add(gitignoreContent);
|
|
100
|
+
}
|
|
101
|
+
return ig;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Recursively list directory contents
|
|
105
|
+
*/
|
|
106
|
+
function listDirectoryRecursive(dirPath, projectRoot, ig, currentDepth, maxDepth) {
|
|
107
|
+
if (currentDepth > maxDepth) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
const entries = [];
|
|
111
|
+
try {
|
|
112
|
+
const items = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
113
|
+
for (const item of items) {
|
|
114
|
+
const fullPath = nodePath.join(dirPath, item.name);
|
|
115
|
+
const relativePath = nodePath.relative(projectRoot, fullPath);
|
|
116
|
+
// Check if ignored
|
|
117
|
+
if (ig.ignores(relativePath)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (item.isDirectory()) {
|
|
121
|
+
entries.push(relativePath + "/");
|
|
122
|
+
// Recurse into subdirectory
|
|
123
|
+
const subEntries = listDirectoryRecursive(fullPath, projectRoot, ig, currentDepth + 1, maxDepth);
|
|
124
|
+
entries.push(...subEntries);
|
|
125
|
+
}
|
|
126
|
+
else if (item.isFile()) {
|
|
127
|
+
entries.push(relativePath);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
// Skip directories we can't read
|
|
133
|
+
}
|
|
134
|
+
return entries;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* list_directory tool
|
|
138
|
+
* Lists directory contents with optional recursion
|
|
139
|
+
* Requirements: 8.2, 8.6, 23.2, 23.3
|
|
140
|
+
*/
|
|
141
|
+
export const listDirectoryTool = {
|
|
142
|
+
name: "list_directory",
|
|
143
|
+
description: "List the contents of a directory with optional recursion",
|
|
144
|
+
isMutation: false,
|
|
145
|
+
inputSchema: z.object({
|
|
146
|
+
path: z.string().default(".").describe("Path to the directory (relative to project root)"),
|
|
147
|
+
recursive: z.boolean().default(false).describe("Whether to list recursively"),
|
|
148
|
+
maxDepth: z.number().int().positive().default(3).describe("Maximum depth for recursive listing"),
|
|
149
|
+
}),
|
|
150
|
+
async execute(input, ctx, _config) {
|
|
151
|
+
try {
|
|
152
|
+
const { path: dirPath, recursive, maxDepth } = this.inputSchema.parse(input);
|
|
153
|
+
// Validate path is within project root
|
|
154
|
+
validatePath(dirPath, ctx.projectRoot);
|
|
155
|
+
// Resolve to absolute path
|
|
156
|
+
const absolutePath = nodePath.resolve(ctx.projectRoot, dirPath);
|
|
157
|
+
// Check if directory exists
|
|
158
|
+
if (!fs.existsSync(absolutePath)) {
|
|
159
|
+
return {
|
|
160
|
+
success: false,
|
|
161
|
+
error: `Directory not found: ${dirPath}`,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (!fs.statSync(absolutePath).isDirectory()) {
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
error: `Path is not a directory: ${dirPath}`,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
// Load gitignore patterns
|
|
171
|
+
const ig = loadGitignorePatterns(ctx.projectRoot);
|
|
172
|
+
let entries;
|
|
173
|
+
if (recursive) {
|
|
174
|
+
entries = listDirectoryRecursive(absolutePath, ctx.projectRoot, ig, 0, maxDepth);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// Non-recursive listing
|
|
178
|
+
const items = fs.readdirSync(absolutePath, { withFileTypes: true });
|
|
179
|
+
entries = [];
|
|
180
|
+
for (const item of items) {
|
|
181
|
+
const fullPath = nodePath.join(absolutePath, item.name);
|
|
182
|
+
const relativePath = nodePath.relative(ctx.projectRoot, fullPath);
|
|
183
|
+
// Check if ignored
|
|
184
|
+
if (ig.ignores(relativePath)) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (item.isDirectory()) {
|
|
188
|
+
entries.push(relativePath + "/");
|
|
189
|
+
}
|
|
190
|
+
else if (item.isFile()) {
|
|
191
|
+
entries.push(relativePath);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
success: true,
|
|
197
|
+
data: {
|
|
198
|
+
path: dirPath,
|
|
199
|
+
entries: entries.sort(),
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
error: error instanceof Error ? error.message : String(error),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* search_code tool
|
|
213
|
+
* Searches code using ripgrep with gitignore support
|
|
214
|
+
* Requirements: 8.3, 22.3
|
|
215
|
+
*/
|
|
216
|
+
export const searchCodeTool = {
|
|
217
|
+
name: "search_code",
|
|
218
|
+
description: "Search for code patterns using ripgrep",
|
|
219
|
+
isMutation: false,
|
|
220
|
+
inputSchema: z.object({
|
|
221
|
+
query: z.string().describe("Search query (regex pattern)"),
|
|
222
|
+
path: z.string().default(".").describe("Path to search within (relative to project root)"),
|
|
223
|
+
maxResults: z.number().int().positive().default(50).describe("Maximum number of results to return"),
|
|
224
|
+
}),
|
|
225
|
+
async execute(input, ctx, _config) {
|
|
226
|
+
try {
|
|
227
|
+
const { query, path: searchPath, maxResults } = this.inputSchema.parse(input);
|
|
228
|
+
// Validate path is within project root
|
|
229
|
+
validatePath(searchPath, ctx.projectRoot);
|
|
230
|
+
// Resolve to absolute path
|
|
231
|
+
const absolutePath = nodePath.resolve(ctx.projectRoot, searchPath);
|
|
232
|
+
// Check if path exists
|
|
233
|
+
if (!fs.existsSync(absolutePath)) {
|
|
234
|
+
return {
|
|
235
|
+
success: false,
|
|
236
|
+
error: `Path not found: ${searchPath}`,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
// Use ripgrep for search via execFileSync (no shell — prevents command injection)
|
|
240
|
+
const rgArgs = [
|
|
241
|
+
"--json",
|
|
242
|
+
`--max-count=${maxResults}`,
|
|
243
|
+
"--ignore-case",
|
|
244
|
+
query,
|
|
245
|
+
absolutePath,
|
|
246
|
+
];
|
|
247
|
+
let output;
|
|
248
|
+
try {
|
|
249
|
+
output = execFileSync("rg", rgArgs, {
|
|
250
|
+
encoding: "utf-8",
|
|
251
|
+
maxBuffer: 10 * 1024 * 1024, // 10MB buffer
|
|
252
|
+
cwd: ctx.projectRoot,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
// ripgrep exits with code 1 when no matches found
|
|
257
|
+
if (error.status === 1) {
|
|
258
|
+
return {
|
|
259
|
+
success: true,
|
|
260
|
+
data: {
|
|
261
|
+
query,
|
|
262
|
+
path: searchPath,
|
|
263
|
+
results: [],
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// Check if ripgrep is not installed
|
|
268
|
+
if (error.message.includes("command not found") || error.message.includes("not recognized")) {
|
|
269
|
+
return {
|
|
270
|
+
success: false,
|
|
271
|
+
error: "ripgrep (rg) is not installed. Please install it to use code search.",
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
// Parse JSON output
|
|
277
|
+
const lines = output.trim().split("\n");
|
|
278
|
+
const results = [];
|
|
279
|
+
for (const line of lines) {
|
|
280
|
+
if (!line)
|
|
281
|
+
continue;
|
|
282
|
+
try {
|
|
283
|
+
const parsed = JSON.parse(line);
|
|
284
|
+
if (parsed.type === "match") {
|
|
285
|
+
const relativePath = nodePath.relative(ctx.projectRoot, parsed.data.path.text);
|
|
286
|
+
results.push({
|
|
287
|
+
file: relativePath,
|
|
288
|
+
line: parsed.data.line_number,
|
|
289
|
+
column: parsed.data.submatches[0]?.start || 0,
|
|
290
|
+
text: parsed.data.lines.text.trim(),
|
|
291
|
+
});
|
|
292
|
+
if (results.length >= maxResults) {
|
|
293
|
+
break;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (parseError) {
|
|
298
|
+
// Skip invalid JSON lines
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
success: true,
|
|
304
|
+
data: {
|
|
305
|
+
query,
|
|
306
|
+
path: searchPath,
|
|
307
|
+
results: results.slice(0, maxResults),
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
return {
|
|
313
|
+
success: false,
|
|
314
|
+
error: error instanceof Error ? error.message : String(error),
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* read_package_json tool
|
|
321
|
+
* Reads and parses package.json from project root
|
|
322
|
+
* Requirements: 8.4
|
|
323
|
+
*/
|
|
324
|
+
export const readPackageJsonTool = {
|
|
325
|
+
name: "read_package_json",
|
|
326
|
+
description: "Read and parse the package.json file from the project root",
|
|
327
|
+
isMutation: false,
|
|
328
|
+
inputSchema: z.object({}),
|
|
329
|
+
async execute(_input, ctx, _config) {
|
|
330
|
+
try {
|
|
331
|
+
const packageJsonPath = nodePath.join(ctx.projectRoot, "package.json");
|
|
332
|
+
// Check if package.json exists
|
|
333
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
334
|
+
return {
|
|
335
|
+
success: false,
|
|
336
|
+
error: "package.json not found in project root",
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
// Read and parse package.json
|
|
340
|
+
const content = fs.readFileSync(packageJsonPath, "utf-8");
|
|
341
|
+
const packageJson = JSON.parse(content);
|
|
342
|
+
return {
|
|
343
|
+
success: true,
|
|
344
|
+
data: packageJson,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
return {
|
|
349
|
+
success: false,
|
|
350
|
+
error: error instanceof Error ? error.message : String(error),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
};
|
|
355
|
+
/**
|
|
356
|
+
* read_prisma_schema tool
|
|
357
|
+
* Reads prisma/schema.prisma if Prisma is detected
|
|
358
|
+
* Requirements: 8.5
|
|
359
|
+
*/
|
|
360
|
+
export const readPrismaSchemaTool = {
|
|
361
|
+
name: "read_prisma_schema",
|
|
362
|
+
description: "Read the Prisma schema file if Prisma is detected in the project",
|
|
363
|
+
isMutation: false,
|
|
364
|
+
inputSchema: z.object({}),
|
|
365
|
+
async execute(_input, ctx, _config) {
|
|
366
|
+
try {
|
|
367
|
+
// Check for Prisma schema at standard location
|
|
368
|
+
const prismaSchemaPath = nodePath.join(ctx.projectRoot, "prisma", "schema.prisma");
|
|
369
|
+
if (!fs.existsSync(prismaSchemaPath)) {
|
|
370
|
+
return {
|
|
371
|
+
success: false,
|
|
372
|
+
error: "Prisma schema not found. Prisma may not be configured in this project.",
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
// Read schema content
|
|
376
|
+
const content = fs.readFileSync(prismaSchemaPath, "utf-8");
|
|
377
|
+
return {
|
|
378
|
+
success: true,
|
|
379
|
+
data: {
|
|
380
|
+
path: "prisma/schema.prisma",
|
|
381
|
+
content,
|
|
382
|
+
},
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
return {
|
|
387
|
+
success: false,
|
|
388
|
+
error: error instanceof Error ? error.message : String(error),
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
/**
|
|
394
|
+
* Calculate risk level based on file changes
|
|
395
|
+
*/
|
|
396
|
+
function calculateRiskLevel(files) {
|
|
397
|
+
let riskScore = 0;
|
|
398
|
+
for (const file of files) {
|
|
399
|
+
// High risk patterns
|
|
400
|
+
if (file.path.includes("package.json"))
|
|
401
|
+
riskScore += 3;
|
|
402
|
+
if (file.path.includes("prisma/schema.prisma"))
|
|
403
|
+
riskScore += 3;
|
|
404
|
+
if (file.path.includes(".env"))
|
|
405
|
+
riskScore += 5;
|
|
406
|
+
if (file.path.includes("config"))
|
|
407
|
+
riskScore += 2;
|
|
408
|
+
if (file.path.includes("database") || file.path.includes("db"))
|
|
409
|
+
riskScore += 2;
|
|
410
|
+
// Check for deletions
|
|
411
|
+
const oldLines = file.oldContent.split("\n").length;
|
|
412
|
+
const newLines = file.newContent.split("\n").length;
|
|
413
|
+
const deletionRatio = oldLines > 0 ? (oldLines - newLines) / oldLines : 0;
|
|
414
|
+
if (deletionRatio > 0.5)
|
|
415
|
+
riskScore += 2; // More than 50% deleted
|
|
416
|
+
if (deletionRatio > 0.8)
|
|
417
|
+
riskScore += 3; // More than 80% deleted
|
|
418
|
+
}
|
|
419
|
+
if (riskScore >= 5)
|
|
420
|
+
return "high";
|
|
421
|
+
if (riskScore >= 2)
|
|
422
|
+
return "medium";
|
|
423
|
+
return "low";
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Determine if changes are reversible
|
|
427
|
+
* All file modifications are reversible when old content is preserved for rollback.
|
|
428
|
+
* New file creations are reversible via deletion.
|
|
429
|
+
*/
|
|
430
|
+
function isReversible(files) {
|
|
431
|
+
// All changes tracked by propose_diff are reversible because we store oldContent
|
|
432
|
+
// for rollback. New files (oldContent === "") can be deleted, and modifications
|
|
433
|
+
// can be restored from the stored oldContent.
|
|
434
|
+
return files.every((file) => file.oldContent !== undefined && file.newContent !== undefined);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Shell-escape a file path for use in rollback hint commands
|
|
438
|
+
*/
|
|
439
|
+
function shellEscape(s) {
|
|
440
|
+
return "'" + s.replace(/'/g, "'\\''") + "'";
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Generate rollback hints for the changes
|
|
444
|
+
*/
|
|
445
|
+
function generateRollbackHints(files) {
|
|
446
|
+
const hints = [];
|
|
447
|
+
// Git-based rollback
|
|
448
|
+
hints.push("git checkout -- " + files.map(f => shellEscape(f.path)).join(" "));
|
|
449
|
+
// Individual file rollbacks
|
|
450
|
+
for (const file of files) {
|
|
451
|
+
if (file.oldContent === "") {
|
|
452
|
+
// New file - can be deleted
|
|
453
|
+
hints.push(`rm ${shellEscape(file.path)}`);
|
|
454
|
+
}
|
|
455
|
+
else if (file.newContent === "") {
|
|
456
|
+
// Deleted file - restore from git
|
|
457
|
+
hints.push(`git checkout -- ${shellEscape(file.path)}`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return hints;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* propose_diff tool
|
|
464
|
+
* Generates a unified diff without applying changes
|
|
465
|
+
* Requirements: 11.4, 11.5
|
|
466
|
+
*/
|
|
467
|
+
export const proposeDiffTool = {
|
|
468
|
+
name: "propose_diff",
|
|
469
|
+
description: "Generate a unified diff for proposed file changes without applying them",
|
|
470
|
+
isMutation: false, // This tool only proposes, doesn't mutate
|
|
471
|
+
inputSchema: z.object({
|
|
472
|
+
files: z.array(z.object({
|
|
473
|
+
path: z.string().describe("Path to the file (relative to project root)"),
|
|
474
|
+
oldContent: z.string().describe("Current content of the file (empty string for new files)"),
|
|
475
|
+
newContent: z.string().describe("Proposed new content of the file"),
|
|
476
|
+
})).min(1).describe("Array of files to change"),
|
|
477
|
+
}),
|
|
478
|
+
async execute(input, ctx, config) {
|
|
479
|
+
try {
|
|
480
|
+
const { files } = this.inputSchema.parse(input);
|
|
481
|
+
// Validate all paths
|
|
482
|
+
for (const file of files) {
|
|
483
|
+
validatePath(file.path, ctx.projectRoot);
|
|
484
|
+
}
|
|
485
|
+
// Check patch size limit
|
|
486
|
+
validatePatchSize(files.length, config.safety.maxFilesPerPatch);
|
|
487
|
+
// Generate unified diffs for each file
|
|
488
|
+
const diffs = [];
|
|
489
|
+
for (const file of files) {
|
|
490
|
+
const diff = createPatch(file.path, file.oldContent, file.newContent, "current", "proposed");
|
|
491
|
+
diffs.push({
|
|
492
|
+
path: file.path,
|
|
493
|
+
diff,
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
// Calculate risk level
|
|
497
|
+
const riskLevel = calculateRiskLevel(files);
|
|
498
|
+
// Determine reversibility
|
|
499
|
+
const reversible = isReversible(files);
|
|
500
|
+
// Generate rollback hints
|
|
501
|
+
const rollbackHints = generateRollbackHints(files);
|
|
502
|
+
// Generate unique diff ID
|
|
503
|
+
const diffId = randomUUID();
|
|
504
|
+
// Build mutation summary
|
|
505
|
+
const summary = {
|
|
506
|
+
action: "apply_diff",
|
|
507
|
+
affectedFiles: files.map((f) => f.path),
|
|
508
|
+
commandsToRun: [],
|
|
509
|
+
migrations: [],
|
|
510
|
+
riskLevel,
|
|
511
|
+
reversible,
|
|
512
|
+
rollbackHints,
|
|
513
|
+
diffId,
|
|
514
|
+
};
|
|
515
|
+
// Evict stale diffs before storing new one
|
|
516
|
+
evictStaleDiffs();
|
|
517
|
+
// Store the diff for later application
|
|
518
|
+
proposedDiffs.set(diffId, { files, summary, createdAt: Date.now() });
|
|
519
|
+
return {
|
|
520
|
+
success: true,
|
|
521
|
+
data: {
|
|
522
|
+
diffId,
|
|
523
|
+
diffs,
|
|
524
|
+
summary,
|
|
525
|
+
},
|
|
526
|
+
};
|
|
527
|
+
}
|
|
528
|
+
catch (error) {
|
|
529
|
+
return {
|
|
530
|
+
success: false,
|
|
531
|
+
error: error instanceof Error ? error.message : String(error),
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
/**
|
|
537
|
+
* apply_diff tool
|
|
538
|
+
* Applies a previously proposed diff atomically
|
|
539
|
+
* Requirements: 11.10, 11.11, 11.12, 11.13
|
|
540
|
+
*/
|
|
541
|
+
export const applyDiffTool = {
|
|
542
|
+
name: "apply_diff",
|
|
543
|
+
description: "Apply a previously proposed diff to the filesystem",
|
|
544
|
+
isMutation: true,
|
|
545
|
+
inputSchema: z.object({
|
|
546
|
+
diffId: z.string().uuid().describe("ID of the previously proposed diff"),
|
|
547
|
+
}),
|
|
548
|
+
async execute(input, ctx, config) {
|
|
549
|
+
try {
|
|
550
|
+
const { diffId } = this.inputSchema.parse(input);
|
|
551
|
+
// Retrieve stored diff
|
|
552
|
+
const stored = proposedDiffs.get(diffId);
|
|
553
|
+
if (!stored) {
|
|
554
|
+
return {
|
|
555
|
+
success: false,
|
|
556
|
+
error: `Diff not found: ${diffId}. Please use propose_diff first.`,
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
const { files, summary } = stored;
|
|
560
|
+
// Validate all paths again (safety check)
|
|
561
|
+
for (const file of files) {
|
|
562
|
+
validatePath(file.path, ctx.projectRoot);
|
|
563
|
+
}
|
|
564
|
+
// Check patch size limit again
|
|
565
|
+
validatePatchSize(files.length, config.safety.maxFilesPerPatch);
|
|
566
|
+
// Apply changes atomically (all or nothing)
|
|
567
|
+
const backups = [];
|
|
568
|
+
try {
|
|
569
|
+
// First, create backups of existing files
|
|
570
|
+
for (const file of files) {
|
|
571
|
+
const absolutePath = nodePath.resolve(ctx.projectRoot, file.path);
|
|
572
|
+
if (fs.existsSync(absolutePath)) {
|
|
573
|
+
const currentContent = fs.readFileSync(absolutePath, "utf-8");
|
|
574
|
+
backups.push({ path: absolutePath, content: currentContent });
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
backups.push({ path: absolutePath, content: null });
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
// Apply all changes
|
|
581
|
+
for (const file of files) {
|
|
582
|
+
const absolutePath = nodePath.resolve(ctx.projectRoot, file.path);
|
|
583
|
+
if (file.newContent === "") {
|
|
584
|
+
// Delete file
|
|
585
|
+
if (fs.existsSync(absolutePath)) {
|
|
586
|
+
fs.unlinkSync(absolutePath);
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
else {
|
|
590
|
+
// Create or update file
|
|
591
|
+
// Ensure directory exists
|
|
592
|
+
const dir = nodePath.dirname(absolutePath);
|
|
593
|
+
if (!fs.existsSync(dir)) {
|
|
594
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
595
|
+
}
|
|
596
|
+
fs.writeFileSync(absolutePath, file.newContent, "utf-8");
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
// Success - remove the diff from storage
|
|
600
|
+
proposedDiffs.delete(diffId);
|
|
601
|
+
return {
|
|
602
|
+
success: true,
|
|
603
|
+
data: {
|
|
604
|
+
diffId,
|
|
605
|
+
affectedFiles: summary.affectedFiles,
|
|
606
|
+
rollbackHints: summary.rollbackHints,
|
|
607
|
+
},
|
|
608
|
+
};
|
|
609
|
+
}
|
|
610
|
+
catch (error) {
|
|
611
|
+
// Rollback on failure
|
|
612
|
+
for (const backup of backups) {
|
|
613
|
+
try {
|
|
614
|
+
if (backup.content === null) {
|
|
615
|
+
// File didn't exist before, delete it
|
|
616
|
+
if (fs.existsSync(backup.path)) {
|
|
617
|
+
fs.unlinkSync(backup.path);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
// Restore original content
|
|
622
|
+
fs.writeFileSync(backup.path, backup.content, "utf-8");
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
catch (rollbackError) {
|
|
626
|
+
// Log rollback error but continue
|
|
627
|
+
console.error(`Failed to rollback ${backup.path}:`, rollbackError);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
throw new Error(`Failed to apply diff: ${error}. Changes have been rolled back.`);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
catch (error) {
|
|
634
|
+
return {
|
|
635
|
+
success: false,
|
|
636
|
+
error: error instanceof Error ? error.message : String(error),
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
},
|
|
640
|
+
};
|
|
641
|
+
/**
|
|
642
|
+
* Tool registry
|
|
643
|
+
* All available tools for the agent
|
|
644
|
+
*/
|
|
645
|
+
export const allTools = [
|
|
646
|
+
readFileTool,
|
|
647
|
+
listDirectoryTool,
|
|
648
|
+
searchCodeTool,
|
|
649
|
+
readPackageJsonTool,
|
|
650
|
+
readPrismaSchemaTool,
|
|
651
|
+
proposeDiffTool,
|
|
652
|
+
applyDiffTool,
|
|
653
|
+
];
|
|
654
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|