ineedcodes 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.
Files changed (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -0
  3. package/docs/assets/ineed-logo.svg +161 -0
  4. package/docs/configuration.md +71 -0
  5. package/docs/skills.md +58 -0
  6. package/package.json +41 -0
  7. package/packages/agent/dist/boost.d.ts +34 -0
  8. package/packages/agent/dist/boost.js +138 -0
  9. package/packages/agent/dist/boost.js.map +1 -0
  10. package/packages/agent/dist/events.d.ts +67 -0
  11. package/packages/agent/dist/events.js +16 -0
  12. package/packages/agent/dist/events.js.map +1 -0
  13. package/packages/agent/dist/index.d.ts +6 -0
  14. package/packages/agent/dist/index.js +7 -0
  15. package/packages/agent/dist/index.js.map +1 -0
  16. package/packages/agent/dist/lead-agent.d.ts +85 -0
  17. package/packages/agent/dist/lead-agent.js +235 -0
  18. package/packages/agent/dist/lead-agent.js.map +1 -0
  19. package/packages/agent/dist/orchestrator.d.ts +43 -0
  20. package/packages/agent/dist/orchestrator.js +135 -0
  21. package/packages/agent/dist/orchestrator.js.map +1 -0
  22. package/packages/agent/dist/runtime.d.ts +44 -0
  23. package/packages/agent/dist/runtime.js +265 -0
  24. package/packages/agent/dist/runtime.js.map +1 -0
  25. package/packages/agent/dist/system-prompts.d.ts +24 -0
  26. package/packages/agent/dist/system-prompts.js +91 -0
  27. package/packages/agent/dist/system-prompts.js.map +1 -0
  28. package/packages/agent/package.json +21 -0
  29. package/packages/cli/dist/index.d.ts +3 -0
  30. package/packages/cli/dist/index.js +567 -0
  31. package/packages/cli/dist/index.js.map +1 -0
  32. package/packages/cli/dist/setup.d.ts +37 -0
  33. package/packages/cli/dist/setup.js +240 -0
  34. package/packages/cli/dist/setup.js.map +1 -0
  35. package/packages/cli/dist/tools-setup.d.ts +12 -0
  36. package/packages/cli/dist/tools-setup.js +28 -0
  37. package/packages/cli/dist/tools-setup.js.map +1 -0
  38. package/packages/cli/dist/ui/approval.d.ts +12 -0
  39. package/packages/cli/dist/ui/approval.js +52 -0
  40. package/packages/cli/dist/ui/approval.js.map +1 -0
  41. package/packages/cli/dist/ui/colors.d.ts +14 -0
  42. package/packages/cli/dist/ui/colors.js +21 -0
  43. package/packages/cli/dist/ui/colors.js.map +1 -0
  44. package/packages/cli/dist/ui/prompts.d.ts +46 -0
  45. package/packages/cli/dist/ui/prompts.js +135 -0
  46. package/packages/cli/dist/ui/prompts.js.map +1 -0
  47. package/packages/cli/dist/ui/renderer.d.ts +13 -0
  48. package/packages/cli/dist/ui/renderer.js +95 -0
  49. package/packages/cli/dist/ui/renderer.js.map +1 -0
  50. package/packages/cli/package.json +23 -0
  51. package/packages/core/dist/config/config.d.ts +32 -0
  52. package/packages/core/dist/config/config.js +43 -0
  53. package/packages/core/dist/config/config.js.map +1 -0
  54. package/packages/core/dist/context/engine.d.ts +25 -0
  55. package/packages/core/dist/context/engine.js +98 -0
  56. package/packages/core/dist/context/engine.js.map +1 -0
  57. package/packages/core/dist/index.d.ts +20 -0
  58. package/packages/core/dist/index.js +21 -0
  59. package/packages/core/dist/index.js.map +1 -0
  60. package/packages/core/dist/llm/openai-compatible.d.ts +23 -0
  61. package/packages/core/dist/llm/openai-compatible.js +177 -0
  62. package/packages/core/dist/llm/openai-compatible.js.map +1 -0
  63. package/packages/core/dist/memory/icm-adapter.d.ts +31 -0
  64. package/packages/core/dist/memory/icm-adapter.js +98 -0
  65. package/packages/core/dist/memory/icm-adapter.js.map +1 -0
  66. package/packages/core/dist/permissions/permissions.d.ts +28 -0
  67. package/packages/core/dist/permissions/permissions.js +89 -0
  68. package/packages/core/dist/permissions/permissions.js.map +1 -0
  69. package/packages/core/dist/security/secrets.d.ts +4 -0
  70. package/packages/core/dist/security/secrets.js +43 -0
  71. package/packages/core/dist/security/secrets.js.map +1 -0
  72. package/packages/core/dist/session/store.d.ts +16 -0
  73. package/packages/core/dist/session/store.js +54 -0
  74. package/packages/core/dist/session/store.js.map +1 -0
  75. package/packages/core/dist/shell/process.d.ts +26 -0
  76. package/packages/core/dist/shell/process.js +128 -0
  77. package/packages/core/dist/shell/process.js.map +1 -0
  78. package/packages/core/dist/skills/loader.d.ts +9 -0
  79. package/packages/core/dist/skills/loader.js +163 -0
  80. package/packages/core/dist/skills/loader.js.map +1 -0
  81. package/packages/core/dist/tools/fs.d.ts +10 -0
  82. package/packages/core/dist/tools/fs.js +409 -0
  83. package/packages/core/dist/tools/fs.js.map +1 -0
  84. package/packages/core/dist/tools/git.d.ts +7 -0
  85. package/packages/core/dist/tools/git.js +251 -0
  86. package/packages/core/dist/tools/git.js.map +1 -0
  87. package/packages/core/dist/tools/mcp.d.ts +42 -0
  88. package/packages/core/dist/tools/mcp.js +158 -0
  89. package/packages/core/dist/tools/mcp.js.map +1 -0
  90. package/packages/core/dist/tools/registry.d.ts +21 -0
  91. package/packages/core/dist/tools/registry.js +50 -0
  92. package/packages/core/dist/tools/registry.js.map +1 -0
  93. package/packages/core/dist/tools/search.d.ts +2 -0
  94. package/packages/core/dist/tools/search.js +243 -0
  95. package/packages/core/dist/tools/search.js.map +1 -0
  96. package/packages/core/dist/tools/shell.d.ts +8 -0
  97. package/packages/core/dist/tools/shell.js +164 -0
  98. package/packages/core/dist/tools/shell.js.map +1 -0
  99. package/packages/core/dist/tools/web.d.ts +14 -0
  100. package/packages/core/dist/tools/web.js +125 -0
  101. package/packages/core/dist/tools/web.js.map +1 -0
  102. package/packages/core/dist/types.d.ts +202 -0
  103. package/packages/core/dist/types.js +7 -0
  104. package/packages/core/dist/types.js.map +1 -0
  105. package/packages/core/dist/util/fs.d.ts +5 -0
  106. package/packages/core/dist/util/fs.js +33 -0
  107. package/packages/core/dist/util/fs.js.map +1 -0
  108. package/packages/core/dist/util/shell-quote.d.ts +7 -0
  109. package/packages/core/dist/util/shell-quote.js +20 -0
  110. package/packages/core/dist/util/shell-quote.js.map +1 -0
  111. package/packages/core/dist/workspace/workspace.d.ts +15 -0
  112. package/packages/core/dist/workspace/workspace.js +84 -0
  113. package/packages/core/dist/workspace/workspace.js.map +1 -0
  114. package/packages/core/package.json +21 -0
@@ -0,0 +1,163 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import { parse as parseYaml } from 'yaml';
5
+ import { pathExists } from '../util/fs.js';
6
+ /**
7
+ * Portable SKILL.md-based skills with YAML frontmatter.
8
+ *
9
+ * Discovery locations (plan §16):
10
+ * 1. <project>/.ineedcodes/skills/<name>/SKILL.md (project)
11
+ * 2. <project>/skills/<name>/SKILL.md (project, alternate)
12
+ * 3. ~/.ineedcodes/skills/<name>/SKILL.md (global user)
13
+ * 4. built-in skills shipped with iNeedCodes (builtin)
14
+ *
15
+ * Resolution priority (plan §17): project > global > builtin.
16
+ */
17
+ const SKILL_DIRS = [
18
+ { scope: 'project', relative: '.ineedcodes/skills' },
19
+ { scope: 'project', relative: 'skills' },
20
+ { scope: 'global', relative: '' }
21
+ ];
22
+ export class SkillLoader {
23
+ projectRoot;
24
+ constructor(projectRoot) {
25
+ this.projectRoot = projectRoot;
26
+ }
27
+ async list() {
28
+ const byName = new Map();
29
+ for (const { scope, relative } of SKILL_DIRS) {
30
+ const base = scope === 'global'
31
+ ? path.join(os.homedir(), '.ineedcodes', 'skills')
32
+ : path.join(this.projectRoot, relative);
33
+ if (!(await pathExists(base)))
34
+ continue;
35
+ let entries;
36
+ try {
37
+ entries = await fs.readdir(base, { withFileTypes: true });
38
+ }
39
+ catch {
40
+ continue;
41
+ }
42
+ for (const entry of entries) {
43
+ if (!entry.isDirectory())
44
+ continue;
45
+ const skill = await this.loadFrom(path.join(base, entry.name), scope);
46
+ if (skill)
47
+ byName.set(skill.name, skill); // project wins by load order
48
+ }
49
+ }
50
+ // Built-in skills ship last so real dirs can override them.
51
+ for (const skill of await builtinSkills()) {
52
+ if (!byName.has(skill.name))
53
+ byName.set(skill.name, skill);
54
+ }
55
+ return [...byName.values()];
56
+ }
57
+ async find(name) {
58
+ const all = await this.list();
59
+ return all.find((s) => s.name.toLowerCase() === name.toLowerCase());
60
+ }
61
+ async loadFrom(dir, scope) {
62
+ const file = path.join(dir, 'SKILL.md');
63
+ let raw;
64
+ try {
65
+ raw = await fs.readFile(file, 'utf8');
66
+ }
67
+ catch {
68
+ return undefined;
69
+ }
70
+ return parseSkillMd(raw, scope, file);
71
+ }
72
+ }
73
+ export function parseSkillMd(raw, scope, source) {
74
+ const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
75
+ if (!match) {
76
+ const name = path.basename(source, path.extname(source));
77
+ return { name, description: raw.slice(0, 200), instructions: raw, scope, source };
78
+ }
79
+ let front;
80
+ try {
81
+ front = parseYaml(match[1] ?? '');
82
+ }
83
+ catch {
84
+ return undefined;
85
+ }
86
+ if (!front || typeof front.name !== 'string')
87
+ return undefined;
88
+ return {
89
+ name: front.name,
90
+ description: typeof front.description === 'string' ? front.description : '',
91
+ instructions: (match[2] ?? '').trim(),
92
+ allowedTools: Array.isArray(front['allowed-tools'])
93
+ ? front['allowed-tools'].map(String)
94
+ : Array.isArray(front['allowed_tools'])
95
+ ? front['allowed_tools'].map(String)
96
+ : undefined,
97
+ version: typeof front.version === 'string' ? front.version : undefined,
98
+ scope,
99
+ source
100
+ };
101
+ }
102
+ async function builtinSkills() {
103
+ const builtins = [
104
+ {
105
+ name: 'boost',
106
+ description: 'Run an isolated Boost cycle: create a worktree, investigate, implement, test, and independently verify before merging.',
107
+ version: '0.1.0',
108
+ instructions: BOOST_INSTRUCTIONS
109
+ },
110
+ {
111
+ name: 'humanizer',
112
+ description: 'Rewrite prose (README, docs, release notes, explanations) so it sounds natural and human while preserving technical facts.',
113
+ version: '0.1.0',
114
+ instructions: HUMANIZER_INSTRUCTIONS
115
+ }
116
+ ];
117
+ return builtins.map((b) => ({
118
+ ...b,
119
+ scope: 'builtin',
120
+ source: 'builtin'
121
+ }));
122
+ }
123
+ const BOOST_INSTRUCTIONS = `# Boost: Advanced Execution and Verification Protocol
124
+
125
+ Boost runs ON TOP of the multi-agent runtime. When this skill is invoked:
126
+
127
+ 1. **Isolate**: If the project is a Git repo, create a worktree:
128
+ - git_worktree(mode="add", path=".ineedcodes/boost-<timestamp>", branch="boost/<timestamp>")
129
+ - All experimental work happens in that worktree. The user's active tree stays clean.
130
+ 2. **Investigation**: Read code, search, run diagnostics. Understand root causes before editing.
131
+ 3. **Implementation**: Make the changes. Prefer apply_patch over full rewrites.
132
+ 4. **Testing**: Run the project's build + tests. Collect real evidence (exit codes, output).
133
+ 5. **Verification**: Independently re-check the objective. A pass only counts with real evidence.
134
+ 6. **Reconcile**:
135
+ - Success: report and merge back (git checkout + copy, or git merge of the boost branch) with user approval.
136
+ - Failure: report what was tried, why it failed, and abort. Never merge unverified changes.
137
+ 7. **Cleanup**: git_worktree(mode="remove") the boost worktree either way.
138
+
139
+ Phases to report: start → investigate → implement → test → verify → reconcile → cleanup.
140
+
141
+ A failed Boost run must never silently merge broken changes.`;
142
+ const HUMANIZER_INSTRUCTIONS = `# Humanizer: Natural Prose Rewriting
143
+
144
+ Rewrite prose so it reads like a thoughtful human wrote it.
145
+
146
+ ## Applies to
147
+ README files, documentation, release notes, PR descriptions, explanations,
148
+ articles, normal prose comments, website copy, Markdown prose.
149
+
150
+ ## Never apply to
151
+ Source code, JSON, YAML, config values, API payloads, identifiers,
152
+ commands, code blocks, technical values.
153
+
154
+ ## Rules
155
+ 1. Preserve meaning and technical facts exactly.
156
+ 2. Remove AI-flavored padding: "In the world of...", "It's important to note...",
157
+ "delve", "leverage", "seamless", "robust", "cutting-edge", "elevate",
158
+ "unleash", "furthermore", "moreover", "In conclusion".
159
+ 3. Prefer short, direct sentences. Use contractions.
160
+ 4. Keep lists as lists; don't turn structure into paragraphs.
161
+ 5. Don't add claims that weren't there.
162
+ 6. Don't over-edit: if a sentence is already natural, leave it alone.`;
163
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { JsonValue, Tool, ToolContext, ToolResult } from '../types.js';
2
+ declare function str(input: JsonValue, key: string, fallback?: string): string;
3
+ declare function num(input: JsonValue, key: string, fallback: number): number;
4
+ declare function bool(input: JsonValue, key: string, fallback?: boolean): boolean;
5
+ declare function resolvePath(ctx: ToolContext, p: string): string;
6
+ declare function fail(summary: string, error: string): ToolResult;
7
+ /** Guard: path must be inside the workspace unless outside-workspace is approved. */
8
+ declare function guardPath(ctx: ToolContext, target: string, writing: boolean): Promise<ToolResult | null>;
9
+ export declare function createFilesystemTools(): Tool[];
10
+ export { str, num, bool, resolvePath, fail, guardPath };
@@ -0,0 +1,409 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { isInsideRoot } from '../util/fs.js';
4
+ import { isLikelySecretFile, secretFileNotice } from '../security/secrets.js';
5
+ function str(input, key, fallback = '') {
6
+ if (input && typeof input === 'object' && !Array.isArray(input)) {
7
+ const v = input[key];
8
+ if (typeof v === 'string')
9
+ return v;
10
+ if (typeof v === 'number' || typeof v === 'boolean')
11
+ return String(v);
12
+ }
13
+ return fallback;
14
+ }
15
+ function num(input, key, fallback) {
16
+ if (input && typeof input === 'object' && !Array.isArray(input)) {
17
+ const v = input[key];
18
+ if (typeof v === 'number' && Number.isFinite(v))
19
+ return v;
20
+ }
21
+ return fallback;
22
+ }
23
+ function bool(input, key, fallback = false) {
24
+ if (input && typeof input === 'object' && !Array.isArray(input)) {
25
+ const v = input[key];
26
+ if (typeof v === 'boolean')
27
+ return v;
28
+ }
29
+ return fallback;
30
+ }
31
+ function resolvePath(ctx, p) {
32
+ return path.resolve(ctx.cwd, p);
33
+ }
34
+ function fail(summary, error) {
35
+ return { ok: false, summary, error };
36
+ }
37
+ /** Guard: path must be inside the workspace unless outside-workspace is approved. */
38
+ async function guardPath(ctx, target, writing) {
39
+ if (isInsideRoot(ctx.workspaceRoot, target))
40
+ return null;
41
+ const decision = await ctx.permissions.check(['outside_workspace'], `access ${target}`);
42
+ if (!decision.allowed)
43
+ return fail(decision.reason, 'outside_workspace_denied');
44
+ void writing;
45
+ return null;
46
+ }
47
+ export function createFilesystemTools() {
48
+ const read_file = {
49
+ name: 'read_file',
50
+ description: 'Read a text file. Returns the file contents with line numbers. Refuses likely secret files.',
51
+ permissions: ['read'],
52
+ readonly: true,
53
+ inputSchema: {
54
+ type: 'object',
55
+ properties: {
56
+ path: { type: 'string', description: 'File path, relative to the working directory.' },
57
+ maxBytes: { type: 'number', description: 'Optional size cap in bytes.' }
58
+ },
59
+ required: ['path']
60
+ },
61
+ async execute(input, ctx) {
62
+ const target = resolvePath(ctx, str(input, 'path'));
63
+ const guard = await guardPath(ctx, target, false);
64
+ if (guard)
65
+ return guard;
66
+ if (isLikelySecretFile(target)) {
67
+ return { ok: false, summary: secretFileNotice(target), error: 'secret_file' };
68
+ }
69
+ const maxBytes = num(input, 'maxBytes', 256 * 1024);
70
+ try {
71
+ const stat = await fs.stat(target);
72
+ if (stat.size > maxBytes) {
73
+ return { ok: false, summary: `File is ${stat.size} bytes; over the ${maxBytes}-byte read cap. Use read_file_range.`, error: 'too_large' };
74
+ }
75
+ const text = await fs.readFile(target, 'utf8');
76
+ const lines = text.split('\n');
77
+ const numbered = lines.map((l, i) => `${String(i + 1).padStart(5)}: ${l}`).join('\n');
78
+ return { ok: true, summary: `Read ${path.basename(target)} (${lines.length} lines).`, data: numbered };
79
+ }
80
+ catch (err) {
81
+ const message = err instanceof Error ? err.message : String(err);
82
+ return fail(`Could not read ${target}: ${message}`, 'read_failed');
83
+ }
84
+ }
85
+ };
86
+ const read_file_range = {
87
+ name: 'read_file_range',
88
+ description: 'Read a slice of a file by line numbers (1-based, inclusive).',
89
+ permissions: ['read'],
90
+ readonly: true,
91
+ inputSchema: {
92
+ type: 'object',
93
+ properties: {
94
+ path: { type: 'string' },
95
+ startLine: { type: 'number' },
96
+ endLine: { type: 'number' }
97
+ },
98
+ required: ['path', 'startLine', 'endLine']
99
+ },
100
+ async execute(input, ctx) {
101
+ const target = resolvePath(ctx, str(input, 'path'));
102
+ const guard = await guardPath(ctx, target, false);
103
+ if (guard)
104
+ return guard;
105
+ if (isLikelySecretFile(target)) {
106
+ return { ok: false, summary: secretFileNotice(target), error: 'secret_file' };
107
+ }
108
+ try {
109
+ const text = await fs.readFile(target, 'utf8');
110
+ const lines = text.split('\n');
111
+ const start = Math.max(1, Math.floor(num(input, 'startLine', 1)));
112
+ const end = Math.min(lines.length, Math.floor(num(input, 'endLine', start + 99)));
113
+ const slice = lines.slice(start - 1, end);
114
+ const numbered = slice
115
+ .map((l, i) => `${String(start + i).padStart(5)}: ${l}`)
116
+ .join('\n');
117
+ return { ok: true, summary: `Read lines ${start}-${end} of ${path.basename(target)} (file has ${lines.length} lines).`, data: numbered };
118
+ }
119
+ catch (err) {
120
+ const message = err instanceof Error ? err.message : String(err);
121
+ return fail(`Could not read ${target}: ${message}`, 'read_failed');
122
+ }
123
+ }
124
+ };
125
+ const write_file = {
126
+ name: 'write_file',
127
+ description: 'Create or overwrite a file with the given content. Parent directories are created automatically.',
128
+ permissions: ['write'],
129
+ readonly: false,
130
+ inputSchema: {
131
+ type: 'object',
132
+ properties: {
133
+ path: { type: 'string' },
134
+ content: { type: 'string' }
135
+ },
136
+ required: ['path', 'content']
137
+ },
138
+ async execute(input, ctx) {
139
+ const target = resolvePath(ctx, str(input, 'path'));
140
+ const guard = await guardPath(ctx, target, true);
141
+ if (guard)
142
+ return guard;
143
+ if (isLikelySecretFile(target)) {
144
+ const decision = await ctx.permissions.check(['secret_access'], `write ${target}`);
145
+ if (!decision.allowed)
146
+ return fail(decision.reason, 'secret_write_denied');
147
+ }
148
+ const content = str(input, 'content');
149
+ try {
150
+ await fs.mkdir(path.dirname(target), { recursive: true });
151
+ await fs.writeFile(target, content, 'utf8');
152
+ return {
153
+ ok: true,
154
+ summary: `Wrote ${target} (${content.split('\n').length} lines, ${content.length} bytes).`
155
+ };
156
+ }
157
+ catch (err) {
158
+ const message = err instanceof Error ? err.message : String(err);
159
+ return fail(`Could not write ${target}: ${message}`, 'write_failed');
160
+ }
161
+ }
162
+ };
163
+ const apply_patch = {
164
+ name: 'apply_patch',
165
+ description: 'Replace an exact text snippet inside an existing file. The old string must match exactly and be unique. Prefer this over rewriting whole files.',
166
+ permissions: ['write'],
167
+ readonly: false,
168
+ inputSchema: {
169
+ type: 'object',
170
+ properties: {
171
+ path: { type: 'string' },
172
+ oldText: { type: 'string', description: 'Exact existing text to replace.' },
173
+ newText: { type: 'string', description: 'Replacement text.' },
174
+ replaceAll: { type: 'boolean', description: 'Replace every occurrence (default: false).' }
175
+ },
176
+ required: ['path', 'oldText', 'newText']
177
+ },
178
+ async execute(input, ctx) {
179
+ const target = resolvePath(ctx, str(input, 'path'));
180
+ const guard = await guardPath(ctx, target, true);
181
+ if (guard)
182
+ return guard;
183
+ const oldText = str(input, 'oldText');
184
+ const newText = str(input, 'newText');
185
+ if (!oldText)
186
+ return fail('oldText must not be empty.', 'empty_patch');
187
+ try {
188
+ const text = await fs.readFile(target, 'utf8');
189
+ const count = text.split(oldText).length - 1;
190
+ if (count === 0)
191
+ return fail('oldText not found in file.', 'patch_not_found');
192
+ if (count > 1 && !bool(input, 'replaceAll')) {
193
+ return fail(`oldText matches ${count} times; provide more context or set replaceAll.`, 'ambiguous_patch');
194
+ }
195
+ const updated = bool(input, 'replaceAll') ? text.replaceAll(oldText, newText) : text.replace(oldText, newText);
196
+ await fs.writeFile(target, updated, 'utf8');
197
+ return {
198
+ ok: true,
199
+ summary: `Patched ${target}: replaced ${bool(input, 'replaceAll') ? count : 1} occurrence(s).`
200
+ };
201
+ }
202
+ catch (err) {
203
+ const message = err instanceof Error ? err.message : String(err);
204
+ return fail(`Could not patch ${target}: ${message}`, 'patch_failed');
205
+ }
206
+ }
207
+ };
208
+ const delete_file = {
209
+ name: 'delete_file',
210
+ description: 'Delete a file or directory. Requires approval when deleting many files.',
211
+ permissions: ['write', 'destructive'],
212
+ readonly: false,
213
+ inputSchema: {
214
+ type: 'object',
215
+ properties: {
216
+ path: { type: 'string' },
217
+ recursive: { type: 'boolean' }
218
+ },
219
+ required: ['path']
220
+ },
221
+ async execute(input, ctx) {
222
+ const target = resolvePath(ctx, str(input, 'path'));
223
+ const guard = await guardPath(ctx, target, true);
224
+ if (guard)
225
+ return guard;
226
+ try {
227
+ const stat = await fs.stat(target);
228
+ const recursive = bool(input, 'recursive');
229
+ if (stat.isDirectory() && !recursive) {
230
+ return fail('Target is a directory; pass recursive=true to delete it.', 'needs_recursive');
231
+ }
232
+ await fs.rm(target, { recursive });
233
+ return { ok: true, summary: `Deleted ${target}.` };
234
+ }
235
+ catch (err) {
236
+ const message = err instanceof Error ? err.message : String(err);
237
+ return fail(`Could not delete ${target}: ${message}`, 'delete_failed');
238
+ }
239
+ }
240
+ };
241
+ const move_file = {
242
+ name: 'move_file',
243
+ description: 'Move or rename a file or directory.',
244
+ permissions: ['write'],
245
+ readonly: false,
246
+ inputSchema: {
247
+ type: 'object',
248
+ properties: {
249
+ from: { type: 'string' },
250
+ to: { type: 'string' }
251
+ },
252
+ required: ['from', 'to']
253
+ },
254
+ async execute(input, ctx) {
255
+ const from = resolvePath(ctx, str(input, 'from'));
256
+ const to = resolvePath(ctx, str(input, 'to'));
257
+ for (const [target, label] of [[from, 'from'], [to, 'to']]) {
258
+ const guard = await guardPath(ctx, target, true);
259
+ if (guard)
260
+ return fail(guard.summary ?? 'outside workspace', `outside_workspace_${label}`);
261
+ }
262
+ try {
263
+ await fs.mkdir(path.dirname(to), { recursive: true });
264
+ await fs.rename(from, to);
265
+ return { ok: true, summary: `Moved ${from} → ${to}.` };
266
+ }
267
+ catch (err) {
268
+ const message = err instanceof Error ? err.message : String(err);
269
+ return fail(`Could not move: ${message}`, 'move_failed');
270
+ }
271
+ }
272
+ };
273
+ const copy_file = {
274
+ name: 'copy_file',
275
+ description: 'Copy a file. Directories are copied recursively.',
276
+ permissions: ['write'],
277
+ readonly: false,
278
+ inputSchema: {
279
+ type: 'object',
280
+ properties: { from: { type: 'string' }, to: { type: 'string' } },
281
+ required: ['from', 'to']
282
+ },
283
+ async execute(input, ctx) {
284
+ const from = resolvePath(ctx, str(input, 'from'));
285
+ const to = resolvePath(ctx, str(input, 'to'));
286
+ for (const target of [from, to]) {
287
+ const guard = await guardPath(ctx, target, true);
288
+ if (guard)
289
+ return guard;
290
+ }
291
+ try {
292
+ await fs.mkdir(path.dirname(to), { recursive: true });
293
+ await fs.cp(from, to, { recursive: true });
294
+ return { ok: true, summary: `Copied ${from} → ${to}.` };
295
+ }
296
+ catch (err) {
297
+ const message = err instanceof Error ? err.message : String(err);
298
+ return fail(`Could not copy: ${message}`, 'copy_failed');
299
+ }
300
+ }
301
+ };
302
+ const list_directory = {
303
+ name: 'list_directory',
304
+ description: 'List the entries of a directory.',
305
+ permissions: ['read'],
306
+ readonly: true,
307
+ inputSchema: {
308
+ type: 'object',
309
+ properties: {
310
+ path: { type: 'string', description: 'Defaults to the working directory.' },
311
+ recursive: { type: 'boolean', description: 'List recursively (max depth 4). Default false.' }
312
+ }
313
+ },
314
+ async execute(input, ctx) {
315
+ const target = resolvePath(ctx, str(input, 'path') || '.');
316
+ const guard = await guardPath(ctx, target, false);
317
+ if (guard)
318
+ return guard;
319
+ const recursive = bool(input, 'recursive');
320
+ const out = [];
321
+ const walk = async (dir, depth) => {
322
+ if (out.length > 500 || (recursive && depth > 4))
323
+ return;
324
+ let entries;
325
+ try {
326
+ entries = await fs.readdir(dir, { withFileTypes: true });
327
+ }
328
+ catch {
329
+ return;
330
+ }
331
+ for (const entry of entries) {
332
+ if (['node_modules', '.git', 'dist', '.next'].includes(entry.name))
333
+ continue;
334
+ const marker = entry.isDirectory() ? '/' : '';
335
+ out.push(`${path.relative(target, path.join(dir, entry.name))}${marker}`);
336
+ if (entry.isDirectory() && recursive) {
337
+ await walk(path.join(dir, entry.name), depth + 1);
338
+ }
339
+ }
340
+ };
341
+ await walk(target, 1);
342
+ return {
343
+ ok: true,
344
+ summary: `Listed ${out.length} entries in ${target}${recursive ? ' (recursive)' : ''}.`,
345
+ data: out
346
+ };
347
+ }
348
+ };
349
+ const file_exists = {
350
+ name: 'file_exists',
351
+ description: 'Check whether a file or directory exists.',
352
+ permissions: ['read'],
353
+ readonly: true,
354
+ inputSchema: { type: 'object', properties: { path: { type: 'string' } }, required: ['path'] },
355
+ async execute(input, ctx) {
356
+ const target = resolvePath(ctx, str(input, 'path'));
357
+ const guard = await guardPath(ctx, target, false);
358
+ if (guard)
359
+ return guard;
360
+ try {
361
+ const stat = await fs.stat(target);
362
+ return {
363
+ ok: true,
364
+ summary: `${target} exists (${stat.isDirectory() ? 'directory' : 'file'}).`
365
+ };
366
+ }
367
+ catch {
368
+ return { ok: true, summary: `${target} does not exist.` };
369
+ }
370
+ }
371
+ };
372
+ const file_metadata = {
373
+ name: 'file_metadata',
374
+ description: 'Get size, timestamps, and type for a file or directory.',
375
+ permissions: ['read'],
376
+ readonly: true,
377
+ inputSchema: { type: 'object', properties: { path: { type: 'string' } }, required: ['path'] },
378
+ async execute(input, ctx) {
379
+ const target = resolvePath(ctx, str(input, 'path'));
380
+ const guard = await guardPath(ctx, target, false);
381
+ if (guard)
382
+ return guard;
383
+ try {
384
+ const stat = await fs.stat(target);
385
+ return {
386
+ ok: true,
387
+ summary: `Metadata for ${target}.`,
388
+ data: {
389
+ size: stat.size,
390
+ isDirectory: stat.isDirectory(),
391
+ isFile: stat.isFile(),
392
+ createdAt: stat.birthtime.toISOString(),
393
+ modifiedAt: stat.mtime.toISOString()
394
+ }
395
+ };
396
+ }
397
+ catch (err) {
398
+ const message = err instanceof Error ? err.message : String(err);
399
+ return fail(`Could not stat ${target}: ${message}`, 'stat_failed');
400
+ }
401
+ }
402
+ };
403
+ return [
404
+ read_file, read_file_range, write_file, apply_patch, delete_file,
405
+ move_file, copy_file, list_directory, file_exists, file_metadata
406
+ ];
407
+ }
408
+ export { str, num, bool, resolvePath, fail, guardPath };
409
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/tools/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Tool } from '../types.js';
2
+ /**
3
+ * First-class Git tools. These are structured wrappers: the model does not
4
+ * need to build raw Git command lines for common operations. Raw Git still
5
+ * works through shell_exec when needed.
6
+ */
7
+ export declare function createGitTools(): Tool[];