ineedcodes 0.1.7 → 0.2.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/agent.mjs +244 -0
- package/package.json +10 -25
- package/docs/assets/ineed-logo.svg +0 -161
- package/docs/configuration.md +0 -71
- package/docs/skills.md +0 -58
- package/packages/agent/dist/boost.d.ts +0 -34
- package/packages/agent/dist/boost.js +0 -138
- package/packages/agent/dist/boost.js.map +0 -1
- package/packages/agent/dist/events.d.ts +0 -67
- package/packages/agent/dist/events.js +0 -16
- package/packages/agent/dist/events.js.map +0 -1
- package/packages/agent/dist/index.d.ts +0 -6
- package/packages/agent/dist/index.js +0 -7
- package/packages/agent/dist/index.js.map +0 -1
- package/packages/agent/dist/lead-agent.d.ts +0 -85
- package/packages/agent/dist/lead-agent.js +0 -235
- package/packages/agent/dist/lead-agent.js.map +0 -1
- package/packages/agent/dist/orchestrator.d.ts +0 -43
- package/packages/agent/dist/orchestrator.js +0 -135
- package/packages/agent/dist/orchestrator.js.map +0 -1
- package/packages/agent/dist/runtime.d.ts +0 -44
- package/packages/agent/dist/runtime.js +0 -265
- package/packages/agent/dist/runtime.js.map +0 -1
- package/packages/agent/dist/system-prompts.d.ts +0 -24
- package/packages/agent/dist/system-prompts.js +0 -91
- package/packages/agent/dist/system-prompts.js.map +0 -1
- package/packages/agent/package.json +0 -21
- package/packages/cli/dist/index.d.ts +0 -3
- package/packages/cli/dist/index.js +0 -11426
- package/packages/cli/dist/index.js.map +0 -1
- package/packages/cli/dist/setup.d.ts +0 -37
- package/packages/cli/dist/setup.js +0 -250
- package/packages/cli/dist/setup.js.map +0 -1
- package/packages/cli/dist/tools-setup.d.ts +0 -12
- package/packages/cli/dist/tools-setup.js +0 -28
- package/packages/cli/dist/tools-setup.js.map +0 -1
- package/packages/cli/dist/ui/approval.d.ts +0 -12
- package/packages/cli/dist/ui/approval.js +0 -52
- package/packages/cli/dist/ui/approval.js.map +0 -1
- package/packages/cli/dist/ui/colors.d.ts +0 -14
- package/packages/cli/dist/ui/colors.js +0 -21
- package/packages/cli/dist/ui/colors.js.map +0 -1
- package/packages/cli/dist/ui/prompts.d.ts +0 -46
- package/packages/cli/dist/ui/prompts.js +0 -135
- package/packages/cli/dist/ui/prompts.js.map +0 -1
- package/packages/cli/dist/ui/renderer.d.ts +0 -13
- package/packages/cli/dist/ui/renderer.js +0 -95
- package/packages/cli/dist/ui/renderer.js.map +0 -1
- package/packages/cli/package.json +0 -23
- package/packages/core/dist/config/config.d.ts +0 -32
- package/packages/core/dist/config/config.js +0 -43
- package/packages/core/dist/config/config.js.map +0 -1
- package/packages/core/dist/context/engine.d.ts +0 -25
- package/packages/core/dist/context/engine.js +0 -98
- package/packages/core/dist/context/engine.js.map +0 -1
- package/packages/core/dist/index.d.ts +0 -20
- package/packages/core/dist/index.js +0 -21
- package/packages/core/dist/index.js.map +0 -1
- package/packages/core/dist/llm/openai-compatible.d.ts +0 -23
- package/packages/core/dist/llm/openai-compatible.js +0 -177
- package/packages/core/dist/llm/openai-compatible.js.map +0 -1
- package/packages/core/dist/memory/icm-adapter.d.ts +0 -31
- package/packages/core/dist/memory/icm-adapter.js +0 -98
- package/packages/core/dist/memory/icm-adapter.js.map +0 -1
- package/packages/core/dist/permissions/permissions.d.ts +0 -28
- package/packages/core/dist/permissions/permissions.js +0 -89
- package/packages/core/dist/permissions/permissions.js.map +0 -1
- package/packages/core/dist/security/secrets.d.ts +0 -4
- package/packages/core/dist/security/secrets.js +0 -43
- package/packages/core/dist/security/secrets.js.map +0 -1
- package/packages/core/dist/session/store.d.ts +0 -16
- package/packages/core/dist/session/store.js +0 -54
- package/packages/core/dist/session/store.js.map +0 -1
- package/packages/core/dist/shell/process.d.ts +0 -26
- package/packages/core/dist/shell/process.js +0 -128
- package/packages/core/dist/shell/process.js.map +0 -1
- package/packages/core/dist/skills/loader.d.ts +0 -9
- package/packages/core/dist/skills/loader.js +0 -163
- package/packages/core/dist/skills/loader.js.map +0 -1
- package/packages/core/dist/tools/fs.d.ts +0 -10
- package/packages/core/dist/tools/fs.js +0 -409
- package/packages/core/dist/tools/fs.js.map +0 -1
- package/packages/core/dist/tools/git.d.ts +0 -7
- package/packages/core/dist/tools/git.js +0 -251
- package/packages/core/dist/tools/git.js.map +0 -1
- package/packages/core/dist/tools/mcp.d.ts +0 -42
- package/packages/core/dist/tools/mcp.js +0 -158
- package/packages/core/dist/tools/mcp.js.map +0 -1
- package/packages/core/dist/tools/registry.d.ts +0 -21
- package/packages/core/dist/tools/registry.js +0 -50
- package/packages/core/dist/tools/registry.js.map +0 -1
- package/packages/core/dist/tools/search.d.ts +0 -2
- package/packages/core/dist/tools/search.js +0 -243
- package/packages/core/dist/tools/search.js.map +0 -1
- package/packages/core/dist/tools/shell.d.ts +0 -8
- package/packages/core/dist/tools/shell.js +0 -164
- package/packages/core/dist/tools/shell.js.map +0 -1
- package/packages/core/dist/tools/web.d.ts +0 -14
- package/packages/core/dist/tools/web.js +0 -125
- package/packages/core/dist/tools/web.js.map +0 -1
- package/packages/core/dist/types.d.ts +0 -202
- package/packages/core/dist/types.js +0 -7
- package/packages/core/dist/types.js.map +0 -1
- package/packages/core/dist/util/fs.d.ts +0 -5
- package/packages/core/dist/util/fs.js +0 -33
- package/packages/core/dist/util/fs.js.map +0 -1
- package/packages/core/dist/util/shell-quote.d.ts +0 -7
- package/packages/core/dist/util/shell-quote.js +0 -20
- package/packages/core/dist/util/shell-quote.js.map +0 -1
- package/packages/core/dist/workspace/workspace.d.ts +0 -15
- package/packages/core/dist/workspace/workspace.js +0 -84
- package/packages/core/dist/workspace/workspace.js.map +0 -1
- package/packages/core/package.json +0 -22
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
const MAX_BUFFER_PER_STREAM = 512 * 1024;
|
|
3
|
-
/**
|
|
4
|
-
* Tracks long-running shell processes so the agent can start a dev server,
|
|
5
|
-
* check on it, read its output, and stop it: without blocking the loop.
|
|
6
|
-
*/
|
|
7
|
-
export class ProcessManager {
|
|
8
|
-
processes = new Map();
|
|
9
|
-
children = new Map();
|
|
10
|
-
nextFakePid = 1;
|
|
11
|
-
async start(command, cwd) {
|
|
12
|
-
const child = spawn(command, {
|
|
13
|
-
cwd,
|
|
14
|
-
shell: true,
|
|
15
|
-
stdio: ['ignore', 'pipe', 'pipe']
|
|
16
|
-
});
|
|
17
|
-
const record = {
|
|
18
|
-
pid: child.pid ?? this.nextFakePid++,
|
|
19
|
-
command,
|
|
20
|
-
cwd,
|
|
21
|
-
stdout: '',
|
|
22
|
-
stderr: '',
|
|
23
|
-
exited: false,
|
|
24
|
-
exitCode: null,
|
|
25
|
-
startedAt: Date.now()
|
|
26
|
-
};
|
|
27
|
-
child.stdout.on('data', (chunk) => {
|
|
28
|
-
record.stdout = appendCapped(record.stdout, chunk.toString('utf8'));
|
|
29
|
-
});
|
|
30
|
-
child.stderr.on('data', (chunk) => {
|
|
31
|
-
record.stderr = appendCapped(record.stderr, chunk.toString('utf8'));
|
|
32
|
-
});
|
|
33
|
-
child.on('error', (err) => {
|
|
34
|
-
record.stderr = appendCapped(record.stderr, `spawn error: ${err.message}\n`);
|
|
35
|
-
});
|
|
36
|
-
child.on('close', (code) => {
|
|
37
|
-
record.exited = true;
|
|
38
|
-
record.exitCode = code;
|
|
39
|
-
this.children.delete(record.pid);
|
|
40
|
-
});
|
|
41
|
-
this.processes.set(record.pid, record);
|
|
42
|
-
this.children.set(record.pid, child);
|
|
43
|
-
return record;
|
|
44
|
-
}
|
|
45
|
-
status(pid) {
|
|
46
|
-
return this.processes.get(pid);
|
|
47
|
-
}
|
|
48
|
-
list() {
|
|
49
|
-
return [...this.processes.values()];
|
|
50
|
-
}
|
|
51
|
-
stop(pid) {
|
|
52
|
-
const child = this.children.get(pid);
|
|
53
|
-
if (!child)
|
|
54
|
-
return false;
|
|
55
|
-
try {
|
|
56
|
-
child.kill('SIGTERM');
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
/** Kill every tracked child before the runtime shuts down. */
|
|
64
|
-
drain() {
|
|
65
|
-
for (const child of this.children.values()) {
|
|
66
|
-
try {
|
|
67
|
-
child.kill('SIGTERM');
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
// best effort
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
this.children.clear();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function appendCapped(current, add) {
|
|
77
|
-
const combined = current + add;
|
|
78
|
-
return combined.length > MAX_BUFFER_PER_STREAM
|
|
79
|
-
? combined.slice(combined.length - MAX_BUFFER_PER_STREAM)
|
|
80
|
-
: combined;
|
|
81
|
-
}
|
|
82
|
-
/** Run a command to completion with a hard timeout. Output is captured, never fabricated. */
|
|
83
|
-
export function execShell(command, cwd, timeoutMs = 120_000, maxBuffer = 1_048_576) {
|
|
84
|
-
return new Promise((resolve) => {
|
|
85
|
-
const startedAt = Date.now();
|
|
86
|
-
const child = spawn(command, {
|
|
87
|
-
cwd,
|
|
88
|
-
shell: true,
|
|
89
|
-
env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' }
|
|
90
|
-
});
|
|
91
|
-
let stdout = '';
|
|
92
|
-
let stderr = '';
|
|
93
|
-
let timedOut = false;
|
|
94
|
-
let settled = false;
|
|
95
|
-
const timer = setTimeout(() => {
|
|
96
|
-
timedOut = true;
|
|
97
|
-
try {
|
|
98
|
-
child.kill('SIGTERM');
|
|
99
|
-
}
|
|
100
|
-
catch {
|
|
101
|
-
// best effort
|
|
102
|
-
}
|
|
103
|
-
}, timeoutMs);
|
|
104
|
-
const cap = (s) => s.length > maxBuffer ? s.slice(0, maxBuffer) : s;
|
|
105
|
-
child.stdout?.on('data', (c) => { stdout = cap(stdout + c.toString('utf8')); });
|
|
106
|
-
child.stderr?.on('data', (c) => { stderr = cap(stderr + c.toString('utf8')); });
|
|
107
|
-
const finish = (code) => {
|
|
108
|
-
if (settled)
|
|
109
|
-
return;
|
|
110
|
-
settled = true;
|
|
111
|
-
clearTimeout(timer);
|
|
112
|
-
resolve({
|
|
113
|
-
exitCode: code,
|
|
114
|
-
stdout,
|
|
115
|
-
stderr,
|
|
116
|
-
durationMs: Date.now() - startedAt,
|
|
117
|
-
cwd,
|
|
118
|
-
timedOut
|
|
119
|
-
});
|
|
120
|
-
};
|
|
121
|
-
child.on('error', (err) => {
|
|
122
|
-
stderr = cap(stderr + `spawn error: ${err.message}\n`);
|
|
123
|
-
finish(null);
|
|
124
|
-
});
|
|
125
|
-
child.on('close', (code) => finish(code));
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=process.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/shell/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { Skill, SkillScope } from '../types.js';
|
|
2
|
-
export declare class SkillLoader {
|
|
3
|
-
private projectRoot;
|
|
4
|
-
constructor(projectRoot: string);
|
|
5
|
-
list(): Promise<Skill[]>;
|
|
6
|
-
find(name: string): Promise<Skill | undefined>;
|
|
7
|
-
private loadFrom;
|
|
8
|
-
}
|
|
9
|
-
export declare function parseSkillMd(raw: string, scope: SkillScope, source: string): Skill | undefined;
|
|
@@ -1,163 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
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 };
|