developer-ai 1.1.0 → 1.1.2
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/cli.js +24 -12
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/core/agent.d.ts +10 -0
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +74 -6
- package/dist/core/agent.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +52 -10
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/skills/loader.d.ts +7 -3
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +109 -12
- package/dist/skills/loader.js.map +1 -1
- package/dist/tools/git-commit.d.ts +7 -0
- package/dist/tools/git-commit.d.ts.map +1 -0
- package/dist/tools/git-commit.js +84 -0
- package/dist/tools/git-commit.js.map +1 -0
- package/dist/tools/git-diff.d.ts +6 -0
- package/dist/tools/git-diff.d.ts.map +1 -0
- package/dist/tools/git-diff.js +84 -0
- package/dist/tools/git-diff.js.map +1 -0
- package/dist/tools/git-status.d.ts +7 -0
- package/dist/tools/git-status.d.ts.map +1 -0
- package/dist/tools/git-status.js +70 -0
- package/dist/tools/git-status.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +19 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/patch-file.d.ts +13 -0
- package/dist/tools/patch-file.d.ts.map +1 -0
- package/dist/tools/patch-file.js +120 -0
- package/dist/tools/patch-file.js.map +1 -0
- package/dist/tools/project-detect.d.ts +8 -0
- package/dist/tools/project-detect.d.ts.map +1 -0
- package/dist/tools/project-detect.js +201 -0
- package/dist/tools/project-detect.js.map +1 -0
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +27 -3
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/run-command.d.ts.map +1 -1
- package/dist/tools/run-command.js +29 -8
- package/dist/tools/run-command.js.map +1 -1
- package/dist/tools/stat-file.d.ts +7 -0
- package/dist/tools/stat-file.d.ts.map +1 -0
- package/dist/tools/stat-file.js +96 -0
- package/dist/tools/stat-file.js.map +1 -0
- package/dist/tools/test-run.d.ts +7 -0
- package/dist/tools/test-run.d.ts.map +1 -0
- package/dist/tools/test-run.js +181 -0
- package/dist/tools/test-run.js.map +1 -0
- package/dist/ui/spinner.d.ts +21 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +76 -0
- package/dist/ui/spinner.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { resolveSafePath } from './utils.js';
|
|
5
|
+
const schema = z.object({
|
|
6
|
+
path: z.string().describe('Workspace-relative file path'),
|
|
7
|
+
old_string: z.string().describe('Exact text to find and replace (must match uniquely)'),
|
|
8
|
+
new_string: z.string().describe('Replacement text'),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* Targeted string-replacement tool — like GitHub Copilot's replace_string_in_file.
|
|
12
|
+
* Saves tokens by only sending the changed portion instead of the entire file.
|
|
13
|
+
*
|
|
14
|
+
* Rules:
|
|
15
|
+
* - `old_string` must match exactly ONE location in the file.
|
|
16
|
+
* - If it matches zero or multiple locations, the tool fails with a clear error.
|
|
17
|
+
* - Surrounding context (3+ unchanged lines) should be included in `old_string`
|
|
18
|
+
* to guarantee uniqueness.
|
|
19
|
+
*/
|
|
20
|
+
export const patchFileTool = {
|
|
21
|
+
name: 'patch_file',
|
|
22
|
+
description: 'Apply a targeted text replacement to an existing file. ' +
|
|
23
|
+
'Provide the exact `old_string` to find (must match exactly one location) and the `new_string` to replace it with. ' +
|
|
24
|
+
'This is far more token-efficient than rewriting the entire file — prefer this for small edits. ' +
|
|
25
|
+
'Include 2-3 lines of surrounding context in old_string to ensure a unique match.',
|
|
26
|
+
schema,
|
|
27
|
+
jsonSchema: {
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
path: { type: 'string', description: 'Workspace-relative file path' },
|
|
31
|
+
old_string: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Exact text to find. Must match exactly one location in the file. Include surrounding context lines for uniqueness.',
|
|
34
|
+
},
|
|
35
|
+
new_string: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Replacement text. Use empty string to delete the matched text.',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ['path', 'old_string', 'new_string'],
|
|
41
|
+
},
|
|
42
|
+
async execute(input, ctx) {
|
|
43
|
+
const { path: filePath, old_string, new_string } = schema.parse(input);
|
|
44
|
+
const resolved = resolveSafePath(ctx.workspaceDir, filePath);
|
|
45
|
+
if (!resolved) {
|
|
46
|
+
return { success: false, output: '', error: 'Path escapes workspace directory' };
|
|
47
|
+
}
|
|
48
|
+
// Read current content
|
|
49
|
+
let content;
|
|
50
|
+
try {
|
|
51
|
+
content = await fs.readFile(resolved, 'utf-8');
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
output: '',
|
|
57
|
+
error: `Cannot read file: ${err.message}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Count occurrences
|
|
61
|
+
const occurrences = countOccurrences(content, old_string);
|
|
62
|
+
if (occurrences === 0) {
|
|
63
|
+
// Provide helpful context: show a snippet of the file so the LLM can self-correct
|
|
64
|
+
const preview = content.slice(0, 500);
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
output: '',
|
|
68
|
+
error: `old_string not found in "${filePath}". ` +
|
|
69
|
+
`Make sure you copied the text exactly (whitespace matters).\n` +
|
|
70
|
+
`File preview (first 500 chars):\n${preview}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (occurrences > 1) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
output: '',
|
|
77
|
+
error: `old_string matched ${occurrences} locations in "${filePath}". ` +
|
|
78
|
+
`Include more surrounding context to make the match unique.`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// Apply the single replacement
|
|
82
|
+
const updated = content.replace(old_string, new_string);
|
|
83
|
+
try {
|
|
84
|
+
await fs.mkdir(path.dirname(resolved), { recursive: true });
|
|
85
|
+
await fs.writeFile(resolved, updated, 'utf-8');
|
|
86
|
+
const oldLines = old_string.split('\n').length;
|
|
87
|
+
const newLines = new_string.split('\n').length;
|
|
88
|
+
const diff = newLines - oldLines;
|
|
89
|
+
const diffLabel = diff === 0
|
|
90
|
+
? 'same line count'
|
|
91
|
+
: diff > 0
|
|
92
|
+
? `+${diff} lines`
|
|
93
|
+
: `${diff} lines`;
|
|
94
|
+
return {
|
|
95
|
+
success: true,
|
|
96
|
+
output: `Patched: ${filePath} (replaced ${old_string.length} → ${new_string.length} chars, ${diffLabel})`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
return {
|
|
101
|
+
success: false,
|
|
102
|
+
output: '',
|
|
103
|
+
error: `Cannot write file: ${err.message}`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
/** Count non-overlapping occurrences of `needle` in `haystack`. */
|
|
109
|
+
function countOccurrences(haystack, needle) {
|
|
110
|
+
if (needle.length === 0)
|
|
111
|
+
return 0;
|
|
112
|
+
let count = 0;
|
|
113
|
+
let pos = 0;
|
|
114
|
+
while ((pos = haystack.indexOf(needle, pos)) !== -1) {
|
|
115
|
+
count++;
|
|
116
|
+
pos += needle.length;
|
|
117
|
+
}
|
|
118
|
+
return count;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=patch-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-file.js","sourceRoot":"","sources":["../../src/tools/patch-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolHandler } from './registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* Project detection tool — scans the workspace to identify the project type,
|
|
4
|
+
* language, package manager, test runner, and other metadata.
|
|
5
|
+
* This gives the agent situational awareness without wasting tokens guessing.
|
|
6
|
+
*/
|
|
7
|
+
export declare const projectDetectTool: ToolHandler;
|
|
8
|
+
//# sourceMappingURL=project-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detect.d.ts","sourceRoot":"","sources":["../../src/tools/project-detect.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAK9D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAiJ/B,CAAC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { execSync } from 'node:child_process';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
const schema = z.object({});
|
|
6
|
+
/**
|
|
7
|
+
* Project detection tool — scans the workspace to identify the project type,
|
|
8
|
+
* language, package manager, test runner, and other metadata.
|
|
9
|
+
* This gives the agent situational awareness without wasting tokens guessing.
|
|
10
|
+
*/
|
|
11
|
+
export const projectDetectTool = {
|
|
12
|
+
name: 'project_detect',
|
|
13
|
+
description: 'Detect the project type, language, package manager, test runner, build tool, and ' +
|
|
14
|
+
'framework by scanning configuration files in the workspace root. ' +
|
|
15
|
+
'Call this early to understand the project before making changes.',
|
|
16
|
+
schema,
|
|
17
|
+
jsonSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {},
|
|
20
|
+
required: [],
|
|
21
|
+
},
|
|
22
|
+
async execute(_input, ctx) {
|
|
23
|
+
const root = ctx.workspaceDir;
|
|
24
|
+
const result = {
|
|
25
|
+
languages: [],
|
|
26
|
+
frameworks: [],
|
|
27
|
+
packageManager: null,
|
|
28
|
+
testRunner: null,
|
|
29
|
+
buildTool: null,
|
|
30
|
+
linter: null,
|
|
31
|
+
formatter: null,
|
|
32
|
+
hasGit: false,
|
|
33
|
+
hasCi: false,
|
|
34
|
+
hasDocker: false,
|
|
35
|
+
monorepo: false,
|
|
36
|
+
entryPoints: [],
|
|
37
|
+
};
|
|
38
|
+
const exists = (p) => fs.existsSync(path.join(root, p));
|
|
39
|
+
const readJson = (p) => {
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(fs.readFileSync(path.join(root, p), 'utf-8'));
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
// ---- Languages ----
|
|
48
|
+
const langs = result['languages'];
|
|
49
|
+
if (exists('tsconfig.json') || exists('tsconfig.base.json'))
|
|
50
|
+
langs.push('TypeScript');
|
|
51
|
+
if (exists('jsconfig.json') || exists('package.json'))
|
|
52
|
+
langs.push('JavaScript');
|
|
53
|
+
if (exists('pyproject.toml') || exists('setup.py') || exists('requirements.txt'))
|
|
54
|
+
langs.push('Python');
|
|
55
|
+
if (exists('go.mod'))
|
|
56
|
+
langs.push('Go');
|
|
57
|
+
if (exists('Cargo.toml'))
|
|
58
|
+
langs.push('Rust');
|
|
59
|
+
if (exists('pom.xml') || exists('build.gradle') || exists('build.gradle.kts'))
|
|
60
|
+
langs.push('Java');
|
|
61
|
+
if (exists('*.csproj') || exists('*.sln'))
|
|
62
|
+
langs.push('C#');
|
|
63
|
+
if (exists('Gemfile'))
|
|
64
|
+
langs.push('Ruby');
|
|
65
|
+
if (exists('composer.json'))
|
|
66
|
+
langs.push('PHP');
|
|
67
|
+
// ---- Package Manager ----
|
|
68
|
+
if (exists('pnpm-lock.yaml'))
|
|
69
|
+
result['packageManager'] = 'pnpm';
|
|
70
|
+
else if (exists('yarn.lock'))
|
|
71
|
+
result['packageManager'] = 'yarn';
|
|
72
|
+
else if (exists('bun.lockb'))
|
|
73
|
+
result['packageManager'] = 'bun';
|
|
74
|
+
else if (exists('package-lock.json'))
|
|
75
|
+
result['packageManager'] = 'npm';
|
|
76
|
+
else if (exists('Pipfile.lock'))
|
|
77
|
+
result['packageManager'] = 'pipenv';
|
|
78
|
+
else if (exists('poetry.lock'))
|
|
79
|
+
result['packageManager'] = 'poetry';
|
|
80
|
+
else if (exists('uv.lock'))
|
|
81
|
+
result['packageManager'] = 'uv';
|
|
82
|
+
else if (exists('Cargo.lock'))
|
|
83
|
+
result['packageManager'] = 'cargo';
|
|
84
|
+
else if (exists('go.sum'))
|
|
85
|
+
result['packageManager'] = 'go modules';
|
|
86
|
+
// ---- Frameworks (from package.json) ----
|
|
87
|
+
const pkg = readJson('package.json');
|
|
88
|
+
const frameworks = result['frameworks'];
|
|
89
|
+
if (pkg) {
|
|
90
|
+
const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
91
|
+
if (allDeps['next'])
|
|
92
|
+
frameworks.push('Next.js');
|
|
93
|
+
if (allDeps['nuxt'] || allDeps['nuxt3'])
|
|
94
|
+
frameworks.push('Nuxt');
|
|
95
|
+
if (allDeps['react'])
|
|
96
|
+
frameworks.push('React');
|
|
97
|
+
if (allDeps['vue'])
|
|
98
|
+
frameworks.push('Vue');
|
|
99
|
+
if (allDeps['svelte'] || allDeps['@sveltejs/kit'])
|
|
100
|
+
frameworks.push('Svelte');
|
|
101
|
+
if (allDeps['angular'] || allDeps['@angular/core'])
|
|
102
|
+
frameworks.push('Angular');
|
|
103
|
+
if (allDeps['express'])
|
|
104
|
+
frameworks.push('Express');
|
|
105
|
+
if (allDeps['fastify'])
|
|
106
|
+
frameworks.push('Fastify');
|
|
107
|
+
if (allDeps['hono'])
|
|
108
|
+
frameworks.push('Hono');
|
|
109
|
+
if (allDeps['astro'])
|
|
110
|
+
frameworks.push('Astro');
|
|
111
|
+
if (allDeps['remix'] || allDeps['@remix-run/node'])
|
|
112
|
+
frameworks.push('Remix');
|
|
113
|
+
if (allDeps['electron'])
|
|
114
|
+
frameworks.push('Electron');
|
|
115
|
+
if (allDeps['vite'])
|
|
116
|
+
frameworks.push('Vite');
|
|
117
|
+
if (allDeps['tailwindcss'])
|
|
118
|
+
frameworks.push('Tailwind CSS');
|
|
119
|
+
// Test runner
|
|
120
|
+
if (allDeps['vitest'])
|
|
121
|
+
result['testRunner'] = 'vitest';
|
|
122
|
+
else if (allDeps['jest'])
|
|
123
|
+
result['testRunner'] = 'jest';
|
|
124
|
+
else if (allDeps['mocha'])
|
|
125
|
+
result['testRunner'] = 'mocha';
|
|
126
|
+
else if (allDeps['@playwright/test'])
|
|
127
|
+
result['testRunner'] = 'playwright';
|
|
128
|
+
else if (allDeps['cypress'])
|
|
129
|
+
result['testRunner'] = 'cypress';
|
|
130
|
+
// Linter
|
|
131
|
+
if (allDeps['eslint'] || allDeps['@eslint/js'])
|
|
132
|
+
result['linter'] = 'eslint';
|
|
133
|
+
else if (allDeps['biome'] || allDeps['@biomejs/biome'])
|
|
134
|
+
result['linter'] = 'biome';
|
|
135
|
+
// Formatter
|
|
136
|
+
if (allDeps['prettier'])
|
|
137
|
+
result['formatter'] = 'prettier';
|
|
138
|
+
else if (allDeps['@biomejs/biome'])
|
|
139
|
+
result['formatter'] = 'biome';
|
|
140
|
+
// Build tool
|
|
141
|
+
if (allDeps['vite'])
|
|
142
|
+
result['buildTool'] = 'vite';
|
|
143
|
+
else if (allDeps['webpack'])
|
|
144
|
+
result['buildTool'] = 'webpack';
|
|
145
|
+
else if (allDeps['esbuild'])
|
|
146
|
+
result['buildTool'] = 'esbuild';
|
|
147
|
+
else if (allDeps['rollup'])
|
|
148
|
+
result['buildTool'] = 'rollup';
|
|
149
|
+
else if (allDeps['turbo'] || allDeps['turborepo'])
|
|
150
|
+
result['buildTool'] = 'turbo';
|
|
151
|
+
else if (allDeps['typescript'])
|
|
152
|
+
result['buildTool'] = 'tsc';
|
|
153
|
+
// Entry points from scripts
|
|
154
|
+
const scripts = pkg.scripts ?? {};
|
|
155
|
+
const entries = result['entryPoints'];
|
|
156
|
+
if (scripts['start'])
|
|
157
|
+
entries.push(`start: ${scripts['start']}`);
|
|
158
|
+
if (scripts['dev'])
|
|
159
|
+
entries.push(`dev: ${scripts['dev']}`);
|
|
160
|
+
if (scripts['build'])
|
|
161
|
+
entries.push(`build: ${scripts['build']}`);
|
|
162
|
+
if (scripts['test'])
|
|
163
|
+
entries.push(`test: ${scripts['test']}`);
|
|
164
|
+
}
|
|
165
|
+
// ---- Python specifics ----
|
|
166
|
+
if (exists('pyproject.toml')) {
|
|
167
|
+
const pyproject = fs.readFileSync(path.join(root, 'pyproject.toml'), 'utf-8');
|
|
168
|
+
if (pyproject.includes('pytest'))
|
|
169
|
+
result['testRunner'] = 'pytest';
|
|
170
|
+
if (pyproject.includes('ruff'))
|
|
171
|
+
result['linter'] = 'ruff';
|
|
172
|
+
if (pyproject.includes('black'))
|
|
173
|
+
result['formatter'] = 'black';
|
|
174
|
+
if (pyproject.includes('django'))
|
|
175
|
+
frameworks.push('Django');
|
|
176
|
+
if (pyproject.includes('fastapi'))
|
|
177
|
+
frameworks.push('FastAPI');
|
|
178
|
+
if (pyproject.includes('flask'))
|
|
179
|
+
frameworks.push('Flask');
|
|
180
|
+
}
|
|
181
|
+
// ---- Infrastructure ----
|
|
182
|
+
result['hasGit'] = exists('.git');
|
|
183
|
+
result['hasCi'] = exists('.github/workflows') || exists('.gitlab-ci.yml') || exists('.circleci');
|
|
184
|
+
result['hasDocker'] = exists('Dockerfile') || exists('docker-compose.yml') || exists('compose.yaml');
|
|
185
|
+
result['monorepo'] = exists('pnpm-workspace.yaml') || exists('lerna.json') || exists('nx.json') ||
|
|
186
|
+
(pkg?.workspaces != null);
|
|
187
|
+
// ---- Git info ----
|
|
188
|
+
if (result['hasGit']) {
|
|
189
|
+
try {
|
|
190
|
+
const branch = execSync('git branch --show-current', {
|
|
191
|
+
cwd: root, encoding: 'utf-8', timeout: 5_000,
|
|
192
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
193
|
+
}).trim();
|
|
194
|
+
result['gitBranch'] = branch;
|
|
195
|
+
}
|
|
196
|
+
catch { /* not fatal */ }
|
|
197
|
+
}
|
|
198
|
+
return { success: true, output: JSON.stringify(result, null, 2) };
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=project-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detect.js","sourceRoot":"","sources":["../../src/tools/project-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAW9D,eAAO,MAAM,YAAY,EAAE,WAiE1B,CAAC"}
|
package/dist/tools/read-file.js
CHANGED
|
@@ -4,20 +4,32 @@ import { resolveSafePath } from './utils.js';
|
|
|
4
4
|
import { MAX_FILE_SIZE } from '../constants.js';
|
|
5
5
|
const schema = z.object({
|
|
6
6
|
path: z.string().describe('Workspace-relative file path'),
|
|
7
|
+
start_line: z.number().optional().describe('1-based start line (inclusive)'),
|
|
8
|
+
end_line: z.number().optional().describe('1-based end line (inclusive)'),
|
|
7
9
|
});
|
|
8
10
|
export const readFileTool = {
|
|
9
11
|
name: 'read_file',
|
|
10
|
-
description: 'Read a text file from the workspace. Path is relative to workspace root.'
|
|
12
|
+
description: 'Read a text file from the workspace. Path is relative to workspace root. ' +
|
|
13
|
+
'Optionally specify start_line and end_line (1-based, inclusive) to read a specific range — ' +
|
|
14
|
+
'this saves tokens on large files. Without range parameters, reads the entire file.',
|
|
11
15
|
schema,
|
|
12
16
|
jsonSchema: {
|
|
13
17
|
type: 'object',
|
|
14
18
|
properties: {
|
|
15
19
|
path: { type: 'string', description: 'Workspace-relative file path' },
|
|
20
|
+
start_line: {
|
|
21
|
+
type: 'number',
|
|
22
|
+
description: '1-based start line (inclusive). Omit to read from beginning.',
|
|
23
|
+
},
|
|
24
|
+
end_line: {
|
|
25
|
+
type: 'number',
|
|
26
|
+
description: '1-based end line (inclusive). Omit to read to end of file.',
|
|
27
|
+
},
|
|
16
28
|
},
|
|
17
29
|
required: ['path'],
|
|
18
30
|
},
|
|
19
31
|
async execute(input, ctx) {
|
|
20
|
-
const { path: filePath } = schema.parse(input);
|
|
32
|
+
const { path: filePath, start_line, end_line } = schema.parse(input);
|
|
21
33
|
const resolved = resolveSafePath(ctx.workspaceDir, filePath);
|
|
22
34
|
if (!resolved) {
|
|
23
35
|
return { success: false, output: '', error: 'Path escapes workspace directory' };
|
|
@@ -28,10 +40,22 @@ export const readFileTool = {
|
|
|
28
40
|
return {
|
|
29
41
|
success: false,
|
|
30
42
|
output: '',
|
|
31
|
-
error: `File too large (${(stat.size / 1024).toFixed(0)} KB). Max: ${MAX_FILE_SIZE / 1024} KB
|
|
43
|
+
error: `File too large (${(stat.size / 1024).toFixed(0)} KB). Max: ${MAX_FILE_SIZE / 1024} KB. Use start_line/end_line to read a range.`,
|
|
32
44
|
};
|
|
33
45
|
}
|
|
34
46
|
const content = await fs.readFile(resolved, 'utf-8');
|
|
47
|
+
// Line range extraction
|
|
48
|
+
if (start_line !== undefined || end_line !== undefined) {
|
|
49
|
+
const lines = content.split('\n');
|
|
50
|
+
const totalLines = lines.length;
|
|
51
|
+
const from = Math.max(1, start_line ?? 1) - 1; // 0-based
|
|
52
|
+
const to = Math.min(totalLines, end_line ?? totalLines); // 1-based inclusive
|
|
53
|
+
const slice = lines.slice(from, to);
|
|
54
|
+
// Prefix each line with its line number for context
|
|
55
|
+
const numbered = slice.map((line, i) => `${from + i + 1}│ ${line}`);
|
|
56
|
+
const header = `[${filePath} lines ${from + 1}-${to} of ${totalLines}]`;
|
|
57
|
+
return { success: true, output: `${header}\n${numbered.join('\n')}` };
|
|
58
|
+
}
|
|
35
59
|
return { success: true, output: content };
|
|
36
60
|
}
|
|
37
61
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/tools/read-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"run-command.d.ts","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAmD9D,eAAO,MAAM,cAAc,EAAE,WAkG5B,CAAC"}
|
|
@@ -38,13 +38,16 @@ function isDangerous(command) {
|
|
|
38
38
|
const schema = z.object({
|
|
39
39
|
command: z.string(),
|
|
40
40
|
cwd: z.string().optional(),
|
|
41
|
+
timeout_ms: z.number().optional(),
|
|
42
|
+
env: z.record(z.string()).optional(),
|
|
43
|
+
max_output_kb: z.number().optional(),
|
|
41
44
|
allowDangerous: z.boolean().optional().default(false),
|
|
42
45
|
});
|
|
43
46
|
export const runCommandTool = {
|
|
44
47
|
name: 'run_command',
|
|
45
48
|
description: 'Run a shell command in the workspace. Safe commands (ls, cat, npm, git, node, etc.) ' +
|
|
46
49
|
'run automatically. Other commands require confirmation. Dangerous commands are blocked unless ' +
|
|
47
|
-
'explicitly allowed.',
|
|
50
|
+
'explicitly allowed. Supports custom timeout, environment variables, and output limits.',
|
|
48
51
|
schema,
|
|
49
52
|
jsonSchema: {
|
|
50
53
|
type: 'object',
|
|
@@ -54,6 +57,19 @@ export const runCommandTool = {
|
|
|
54
57
|
type: 'string',
|
|
55
58
|
description: 'Working directory relative to workspace (default: workspace root)',
|
|
56
59
|
},
|
|
60
|
+
timeout_ms: {
|
|
61
|
+
type: 'number',
|
|
62
|
+
description: 'Custom timeout in milliseconds (default: 30000)',
|
|
63
|
+
},
|
|
64
|
+
env: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
description: 'Extra environment variables to set for this command',
|
|
67
|
+
additionalProperties: { type: 'string' },
|
|
68
|
+
},
|
|
69
|
+
max_output_kb: {
|
|
70
|
+
type: 'number',
|
|
71
|
+
description: 'Maximum output size in KB (default: ~10 KB)',
|
|
72
|
+
},
|
|
57
73
|
allowDangerous: {
|
|
58
74
|
type: 'boolean',
|
|
59
75
|
description: 'Explicitly allow dangerous commands',
|
|
@@ -62,7 +78,9 @@ export const runCommandTool = {
|
|
|
62
78
|
required: ['command'],
|
|
63
79
|
},
|
|
64
80
|
async execute(input, ctx) {
|
|
65
|
-
const { command, cwd, allowDangerous } = schema.parse(input);
|
|
81
|
+
const { command, cwd, timeout_ms, env: extraEnv, max_output_kb, allowDangerous } = schema.parse(input);
|
|
82
|
+
const effectiveTimeout = timeout_ms ?? COMMAND_TIMEOUT_MS;
|
|
83
|
+
const effectiveMaxOutput = max_output_kb ? max_output_kb * 1024 : MAX_OUTPUT_LENGTH;
|
|
66
84
|
const workDir = cwd
|
|
67
85
|
? path.resolve(ctx.workspaceDir, cwd)
|
|
68
86
|
: ctx.workspaceDir;
|
|
@@ -89,24 +107,27 @@ export const runCommandTool = {
|
|
|
89
107
|
return { success: false, output: '', error: 'Command cancelled by user' };
|
|
90
108
|
}
|
|
91
109
|
}
|
|
110
|
+
const execEnv = extraEnv ? { ...process.env, ...extraEnv } : undefined;
|
|
92
111
|
try {
|
|
93
112
|
const stdout = execSync(command, {
|
|
94
113
|
cwd: workDir,
|
|
95
114
|
encoding: 'utf-8',
|
|
96
|
-
timeout:
|
|
97
|
-
maxBuffer:
|
|
115
|
+
timeout: effectiveTimeout,
|
|
116
|
+
maxBuffer: 4 * 1024 * 1024,
|
|
98
117
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
118
|
+
...(execEnv ? { env: execEnv } : {}),
|
|
99
119
|
});
|
|
100
|
-
return { success: true, output: stdout.slice(0,
|
|
120
|
+
return { success: true, output: stdout.slice(0, effectiveMaxOutput) };
|
|
101
121
|
}
|
|
102
122
|
catch (err) {
|
|
103
123
|
const e = err;
|
|
104
|
-
const stderr = (e.stderr ?? '').slice(0,
|
|
105
|
-
const stdout = (e.stdout ?? '').slice(0,
|
|
124
|
+
const stderr = (e.stderr ?? '').slice(0, effectiveMaxOutput / 2);
|
|
125
|
+
const stdout = (e.stdout ?? '').slice(0, effectiveMaxOutput / 2);
|
|
126
|
+
const reason = e.killed ? 'Timed out' : `Exit code ${e.status ?? 1}`;
|
|
106
127
|
return {
|
|
107
128
|
success: false,
|
|
108
129
|
output: stdout,
|
|
109
|
-
error:
|
|
130
|
+
error: `${reason}: ${stderr}`,
|
|
110
131
|
};
|
|
111
132
|
}
|
|
112
133
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAExE,iDAAiD;AACjD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IACxE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM;IAC/D,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI;IACpD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI;IAC/C,MAAM,EAAQ,QAAQ;IACtB,UAAU,EAAI,QAAQ;IACtB,OAAO;CACR,CAAC,CAAC;AAEH,qDAAqD;AACrD,MAAM,kBAAkB,GAAG;IACzB,uBAAuB;IACvB,WAAW;IACX,aAAa;IACb,eAAe,EAAyB,YAAY;IACpD,iCAAiC;IACjC,iCAAiC;IACjC,kBAAkB;IAClB,cAAc;IACd,oBAAoB;IACpB,sCAAsC;CACvC,CAAC;AAEF,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACtD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,sFAAsF;QACtF,gGAAgG;QAChG,
|
|
1
|
+
{"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/tools/run-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolHandler } from './registry.js';
|
|
2
|
+
/**
|
|
3
|
+
* File metadata tool — lets the agent verify reality before/after edits.
|
|
4
|
+
* Returns size, modified time, type, permissions, and optional hash.
|
|
5
|
+
*/
|
|
6
|
+
export declare const statFileTool: ToolHandler;
|
|
7
|
+
//# sourceMappingURL=stat-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stat-file.d.ts","sourceRoot":"","sources":["../../src/tools/stat-file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAS9D;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,WAmF1B,CAAC"}
|