codebase-cli 2.0.0-pre.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 +266 -0
- package/bin/codebase +2 -0
- package/dist/agent/agent.js +198 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/config.js +117 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/events.js +153 -0
- package/dist/agent/events.js.map +1 -0
- package/dist/agent/router.js +35 -0
- package/dist/agent/router.js.map +1 -0
- package/dist/agent/system-prompt.js +21 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/auth/cli.js +138 -0
- package/dist/auth/cli.js.map +1 -0
- package/dist/auth/credentials.js +105 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/flow.js +222 -0
- package/dist/auth/flow.js.map +1 -0
- package/dist/auth/pkce.js +46 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/clipboard/copy.js +106 -0
- package/dist/clipboard/copy.js.map +1 -0
- package/dist/commands/builtins.js +203 -0
- package/dist/commands/builtins.js.map +1 -0
- package/dist/commands/registry.js +65 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/compaction/engine.js +209 -0
- package/dist/compaction/engine.js.map +1 -0
- package/dist/compaction/tokens.js +79 -0
- package/dist/compaction/tokens.js.map +1 -0
- package/dist/compaction/types.js +2 -0
- package/dist/compaction/types.js.map +1 -0
- package/dist/diagnostics/checkers.js +211 -0
- package/dist/diagnostics/checkers.js.map +1 -0
- package/dist/diagnostics/engine.js +71 -0
- package/dist/diagnostics/engine.js.map +1 -0
- package/dist/diagnostics/types.js +2 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/dotenv/loader.js +115 -0
- package/dist/dotenv/loader.js.map +1 -0
- package/dist/glue/client.js +47 -0
- package/dist/glue/client.js.map +1 -0
- package/dist/glue/intent.js +78 -0
- package/dist/glue/intent.js.map +1 -0
- package/dist/glue/narration.js +55 -0
- package/dist/glue/narration.js.map +1 -0
- package/dist/headless/run.js +89 -0
- package/dist/headless/run.js.map +1 -0
- package/dist/hooks/manager.js +158 -0
- package/dist/hooks/manager.js.map +1 -0
- package/dist/hooks/runner.js +70 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/memory/inject.js +12 -0
- package/dist/memory/inject.js.map +1 -0
- package/dist/memory/store.js +178 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.js +10 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/permissions/store.js +172 -0
- package/dist/permissions/store.js.map +1 -0
- package/dist/plan/flow.js +214 -0
- package/dist/plan/flow.js.map +1 -0
- package/dist/plan/prompts.js +69 -0
- package/dist/plan/prompts.js.map +1 -0
- package/dist/plan/store.js +37 -0
- package/dist/plan/store.js.map +1 -0
- package/dist/plan/types.js +3 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/sessions/store.js +105 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/skills/loader.js +41 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/platform-loader.js +63 -0
- package/dist/skills/platform-loader.js.map +1 -0
- package/dist/skills/types.js +21 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tools/ask-user.js +61 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/dispatch-agent.js +178 -0
- package/dist/tools/dispatch-agent.js.map +1 -0
- package/dist/tools/edit-file.js +80 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/errors.js +89 -0
- package/dist/tools/errors.js.map +1 -0
- package/dist/tools/file-ops.js +136 -0
- package/dist/tools/file-ops.js.map +1 -0
- package/dist/tools/file-state-cache.js +92 -0
- package/dist/tools/file-state-cache.js.map +1 -0
- package/dist/tools/git/branch.js +84 -0
- package/dist/tools/git/branch.js.map +1 -0
- package/dist/tools/git/commit.js +83 -0
- package/dist/tools/git/commit.js.map +1 -0
- package/dist/tools/git/diff.js +72 -0
- package/dist/tools/git/diff.js.map +1 -0
- package/dist/tools/git/git-helpers.js +58 -0
- package/dist/tools/git/git-helpers.js.map +1 -0
- package/dist/tools/git/log.js +70 -0
- package/dist/tools/git/log.js.map +1 -0
- package/dist/tools/git/status.js +97 -0
- package/dist/tools/git/status.js.map +1 -0
- package/dist/tools/git/worktree.js +132 -0
- package/dist/tools/git/worktree.js.map +1 -0
- package/dist/tools/glob.js +128 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.js +199 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/list-files.js +120 -0
- package/dist/tools/list-files.js.map +1 -0
- package/dist/tools/memory-tools.js +127 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/multi-edit.js +87 -0
- package/dist/tools/multi-edit.js.map +1 -0
- package/dist/tools/notebook-edit.js +147 -0
- package/dist/tools/notebook-edit.js.map +1 -0
- package/dist/tools/permission.js +168 -0
- package/dist/tools/permission.js.map +1 -0
- package/dist/tools/plan-mode.js +76 -0
- package/dist/tools/plan-mode.js.map +1 -0
- package/dist/tools/read-file.js +135 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/registry.js +52 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/shell.js +216 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/task-store.js +70 -0
- package/dist/tools/task-store.js.map +1 -0
- package/dist/tools/tasks.js +131 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-fetch.js +152 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.js +169 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write-file.js +70 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/App.js +216 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/Input.js +90 -0
- package/dist/ui/Input.js.map +1 -0
- package/dist/ui/Message.js +89 -0
- package/dist/ui/Message.js.map +1 -0
- package/dist/ui/MessageList.js +35 -0
- package/dist/ui/MessageList.js.map +1 -0
- package/dist/ui/Permission.js +39 -0
- package/dist/ui/Permission.js.map +1 -0
- package/dist/ui/Status.js +34 -0
- package/dist/ui/Status.js.map +1 -0
- package/dist/ui/TaskPanel.js +43 -0
- package/dist/ui/TaskPanel.js.map +1 -0
- package/dist/ui/Throbber.js +20 -0
- package/dist/ui/Throbber.js.map +1 -0
- package/dist/ui/ToolPanel.js +83 -0
- package/dist/ui/ToolPanel.js.map +1 -0
- package/dist/ui/UserQuery.js +38 -0
- package/dist/ui/UserQuery.js.map +1 -0
- package/dist/ui/input-state.js +210 -0
- package/dist/ui/input-state.js.map +1 -0
- package/dist/ui/wrap.js +30 -0
- package/dist/ui/wrap.js.map +1 -0
- package/dist/user-queries/store.js +60 -0
- package/dist/user-queries/store.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { requireGitRepo, runGit } from "./git-helpers.js";
|
|
3
|
+
const Params = Type.Object({});
|
|
4
|
+
const DESCRIPTION = `Show the working tree status: current branch, upstream tracking, ahead/behind counts, and the list of staged/unstaged/untracked files.
|
|
5
|
+
|
|
6
|
+
Output mirrors \`git status --short --branch\`. Two-character prefix per file: first column = staged change (M/A/D/R/?), second = unstaged change. ?? means untracked.`;
|
|
7
|
+
export function createGitStatus(ctx) {
|
|
8
|
+
return {
|
|
9
|
+
name: "git_status",
|
|
10
|
+
label: "Git status",
|
|
11
|
+
description: DESCRIPTION,
|
|
12
|
+
parameters: Params,
|
|
13
|
+
executionMode: "parallel",
|
|
14
|
+
execute: async (_id, _params, signal) => {
|
|
15
|
+
await requireGitRepo(ctx.cwd);
|
|
16
|
+
const r = await runGit(["status", "--short", "--branch"], ctx.cwd, signal);
|
|
17
|
+
if (r.exitCode !== 0) {
|
|
18
|
+
throw new Error(r.stderr.trim() || `git status exited ${r.exitCode}`);
|
|
19
|
+
}
|
|
20
|
+
const lines = r.stdout.split("\n").filter(Boolean);
|
|
21
|
+
let branch = null;
|
|
22
|
+
let upstream = null;
|
|
23
|
+
let ahead = 0;
|
|
24
|
+
let behind = 0;
|
|
25
|
+
const entries = [];
|
|
26
|
+
for (const line of lines) {
|
|
27
|
+
if (line.startsWith("##")) {
|
|
28
|
+
const parsed = parseBranchLine(line);
|
|
29
|
+
branch = parsed.branch;
|
|
30
|
+
upstream = parsed.upstream;
|
|
31
|
+
ahead = parsed.ahead;
|
|
32
|
+
behind = parsed.behind;
|
|
33
|
+
}
|
|
34
|
+
else if (line.length >= 3) {
|
|
35
|
+
entries.push({
|
|
36
|
+
staged: line[0],
|
|
37
|
+
unstaged: line[1],
|
|
38
|
+
path: line.slice(3).trim(),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const clean = entries.length === 0;
|
|
43
|
+
const summary = formatSummary(branch, upstream, ahead, behind, entries, clean);
|
|
44
|
+
return {
|
|
45
|
+
content: [{ type: "text", text: summary }],
|
|
46
|
+
details: { branch, upstream, ahead, behind, clean, entries },
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function parseBranchLine(line) {
|
|
52
|
+
// Examples:
|
|
53
|
+
// ## main
|
|
54
|
+
// ## main...origin/main
|
|
55
|
+
// ## main...origin/main [ahead 2, behind 1]
|
|
56
|
+
// ## HEAD (no branch)
|
|
57
|
+
const body = line.slice(2).trim();
|
|
58
|
+
if (body.startsWith("HEAD")) {
|
|
59
|
+
return { branch: null, upstream: null, ahead: 0, behind: 0 };
|
|
60
|
+
}
|
|
61
|
+
const bracketIdx = body.indexOf("[");
|
|
62
|
+
const head = (bracketIdx === -1 ? body : body.slice(0, bracketIdx)).trim();
|
|
63
|
+
const [branch, upstream = null] = head.split("...");
|
|
64
|
+
let ahead = 0;
|
|
65
|
+
let behind = 0;
|
|
66
|
+
if (bracketIdx !== -1) {
|
|
67
|
+
const inner = body.slice(bracketIdx + 1, body.lastIndexOf("]"));
|
|
68
|
+
const aheadMatch = inner.match(/ahead (\d+)/);
|
|
69
|
+
const behindMatch = inner.match(/behind (\d+)/);
|
|
70
|
+
if (aheadMatch)
|
|
71
|
+
ahead = Number.parseInt(aheadMatch[1], 10);
|
|
72
|
+
if (behindMatch)
|
|
73
|
+
behind = Number.parseInt(behindMatch[1], 10);
|
|
74
|
+
}
|
|
75
|
+
return { branch: branch || null, upstream, ahead, behind };
|
|
76
|
+
}
|
|
77
|
+
function formatSummary(branch, upstream, ahead, behind, entries, clean) {
|
|
78
|
+
const lines = [];
|
|
79
|
+
if (branch) {
|
|
80
|
+
const tracking = upstream ? ` → ${upstream}` : "";
|
|
81
|
+
const drift = ahead || behind ? ` [ahead ${ahead}, behind ${behind}]` : "";
|
|
82
|
+
lines.push(`On ${branch}${tracking}${drift}`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
lines.push("Detached HEAD");
|
|
86
|
+
}
|
|
87
|
+
if (clean) {
|
|
88
|
+
lines.push("Working tree clean.");
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
for (const e of entries) {
|
|
92
|
+
lines.push(` ${e.staged}${e.unstaged} ${e.path}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return lines.join("\n");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/git/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { requireGitRepo, runGit } from "./git-helpers.js";
|
|
5
|
+
const NAME_PATTERN = /^[a-zA-Z0-9._-]{1,64}$/;
|
|
6
|
+
// ─── enter_worktree ──────────────────────────────────────────
|
|
7
|
+
const EnterParams = Type.Object({
|
|
8
|
+
name: Type.Optional(Type.String({
|
|
9
|
+
description: "Worktree name (used as the branch suffix). Letters, digits, ., _, - only; max 64 chars. Auto-generated if omitted.",
|
|
10
|
+
})),
|
|
11
|
+
});
|
|
12
|
+
const ENTER_DESCRIPTION = `Create an isolated git worktree at .worktrees/<name> on a new branch worktree/<name>.
|
|
13
|
+
|
|
14
|
+
Use this when you want to work on a separate branch in parallel without disturbing the main checkout (e.g., a long-running refactor while reviews land on main).
|
|
15
|
+
|
|
16
|
+
The new worktree is a full checkout at the current HEAD with its own working tree. After this call returns, point a new codebase session at the printed path to start working there. The agent's current cwd does not move automatically.`;
|
|
17
|
+
export function createEnterWorktree(ctx) {
|
|
18
|
+
return {
|
|
19
|
+
name: "enter_worktree",
|
|
20
|
+
label: "Enter worktree",
|
|
21
|
+
description: ENTER_DESCRIPTION,
|
|
22
|
+
parameters: EnterParams,
|
|
23
|
+
executionMode: "sequential",
|
|
24
|
+
execute: async (_id, params, signal) => {
|
|
25
|
+
await requireGitRepo(ctx.cwd);
|
|
26
|
+
await assertNotInWorktree(ctx.cwd, signal);
|
|
27
|
+
const name = params.name?.trim() || `wt-${randomBytes(4).toString("hex")}`;
|
|
28
|
+
if (!NAME_PATTERN.test(name)) {
|
|
29
|
+
throw new Error("name must contain only letters, digits, dots, underscores, dashes (max 64 chars).");
|
|
30
|
+
}
|
|
31
|
+
const root = await readGitRoot(ctx.cwd, signal);
|
|
32
|
+
const worktreePath = join(root, ".worktrees", name);
|
|
33
|
+
const branch = `worktree/${name}`;
|
|
34
|
+
const r = await runGit(["worktree", "add", "-b", branch, worktreePath], root, signal);
|
|
35
|
+
if (r.exitCode !== 0) {
|
|
36
|
+
throw new Error(r.stderr.trim() || `git worktree add exited ${r.exitCode}`);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: "text",
|
|
42
|
+
text: `Created worktree at ${worktreePath} (branch: ${branch}).\n` +
|
|
43
|
+
"To use it, run codebase from that directory.",
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
details: { name, path: resolve(worktreePath), branch },
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async function assertNotInWorktree(cwd, signal) {
|
|
52
|
+
const common = await runGit(["rev-parse", "--git-common-dir"], cwd, signal);
|
|
53
|
+
const own = await runGit(["rev-parse", "--git-dir"], cwd, signal);
|
|
54
|
+
if (common.exitCode !== 0 || own.exitCode !== 0)
|
|
55
|
+
return;
|
|
56
|
+
const a = resolveGitDir(common.stdout.trim(), cwd);
|
|
57
|
+
const b = resolveGitDir(own.stdout.trim(), cwd);
|
|
58
|
+
if (a !== b) {
|
|
59
|
+
throw new Error("Already in a worktree. Run exit_worktree first if you want to leave it.");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function resolveGitDir(value, cwd) {
|
|
63
|
+
if (!value)
|
|
64
|
+
return value;
|
|
65
|
+
return value.startsWith("/") ? value : resolve(cwd, value);
|
|
66
|
+
}
|
|
67
|
+
async function readGitRoot(cwd, signal) {
|
|
68
|
+
const r = await runGit(["rev-parse", "--show-toplevel"], cwd, signal);
|
|
69
|
+
if (r.exitCode !== 0) {
|
|
70
|
+
throw new Error(r.stderr.trim() || "could not find git root");
|
|
71
|
+
}
|
|
72
|
+
return r.stdout.trim();
|
|
73
|
+
}
|
|
74
|
+
// ─── exit_worktree ───────────────────────────────────────────
|
|
75
|
+
const ExitParams = Type.Object({
|
|
76
|
+
action: Type.Union([Type.Literal("keep"), Type.Literal("remove")], {
|
|
77
|
+
description: "keep: leave the worktree on disk (just acknowledge). remove: git worktree remove.",
|
|
78
|
+
}),
|
|
79
|
+
discard_changes: Type.Optional(Type.Boolean({
|
|
80
|
+
description: "Force removal even with uncommitted changes. Default false.",
|
|
81
|
+
})),
|
|
82
|
+
});
|
|
83
|
+
const EXIT_DESCRIPTION = `Exit a worktree created by enter_worktree. Run this from INSIDE the worktree (your codebase session must be cwd'd into it).
|
|
84
|
+
|
|
85
|
+
action: "keep" leaves the worktree alone — the branch and disk state stay. action: "remove" runs \`git worktree remove\`. If the worktree has uncommitted changes, removal errors unless discard_changes: true.`;
|
|
86
|
+
export function createExitWorktree(ctx) {
|
|
87
|
+
return {
|
|
88
|
+
name: "exit_worktree",
|
|
89
|
+
label: "Exit worktree",
|
|
90
|
+
description: EXIT_DESCRIPTION,
|
|
91
|
+
parameters: ExitParams,
|
|
92
|
+
executionMode: "sequential",
|
|
93
|
+
execute: async (_id, params, signal) => {
|
|
94
|
+
await requireGitRepo(ctx.cwd);
|
|
95
|
+
if (params.action === "keep") {
|
|
96
|
+
return {
|
|
97
|
+
content: [{ type: "text", text: "Worktree kept. Switch back to the main checkout when ready." }],
|
|
98
|
+
details: { action: "keep", removed: false, hadUncommittedChanges: false },
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const status = await runGit(["status", "--porcelain"], ctx.cwd, signal);
|
|
102
|
+
const dirty = status.exitCode === 0 && status.stdout.trim().length > 0;
|
|
103
|
+
if (dirty && !params.discard_changes) {
|
|
104
|
+
throw new Error("worktree has uncommitted changes. Set discard_changes: true to force removal, or commit first.");
|
|
105
|
+
}
|
|
106
|
+
const path = await readGitRoot(ctx.cwd, signal);
|
|
107
|
+
const args = ["worktree", "remove"];
|
|
108
|
+
if (params.discard_changes)
|
|
109
|
+
args.push("--force");
|
|
110
|
+
args.push(path);
|
|
111
|
+
// Run from the parent (main) repo so we can remove the cwd we're in.
|
|
112
|
+
const main = await readMainRepoDir(ctx.cwd, signal);
|
|
113
|
+
const r = await runGit(args, main, signal);
|
|
114
|
+
if (r.exitCode !== 0) {
|
|
115
|
+
throw new Error(r.stderr.trim() || `git worktree remove exited ${r.exitCode}`);
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: "text", text: `Removed worktree ${path}.` }],
|
|
119
|
+
details: { action: "remove", removed: true, hadUncommittedChanges: dirty },
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async function readMainRepoDir(cwd, signal) {
|
|
125
|
+
const r = await runGit(["rev-parse", "--git-common-dir"], cwd, signal);
|
|
126
|
+
if (r.exitCode !== 0)
|
|
127
|
+
return cwd;
|
|
128
|
+
const commonDir = resolveGitDir(r.stdout.trim(), cwd);
|
|
129
|
+
// commonDir is the repo's .git dir; the worktree containing it is its parent.
|
|
130
|
+
return resolve(commonDir, "..");
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../../../src/tools/git/worktree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join, relative, resolve } from "node:path";
|
|
3
|
+
import { glob } from "glob";
|
|
4
|
+
import ignore from "ignore";
|
|
5
|
+
import { Type } from "typebox";
|
|
6
|
+
import { resolveInsideCwd } from "./file-ops.js";
|
|
7
|
+
const Params = Type.Object({
|
|
8
|
+
pattern: Type.String({
|
|
9
|
+
description: 'Glob pattern, e.g. "**/*.ts", "src/**/test/*.test.tsx", "package.json". Standard globstar (** = any depth) and brace expansion ({a,b}) supported.',
|
|
10
|
+
}),
|
|
11
|
+
path: Type.Optional(Type.String({
|
|
12
|
+
description: "Search root, relative to the project root. Defaults to the project root.",
|
|
13
|
+
})),
|
|
14
|
+
max_results: Type.Optional(Type.Integer({
|
|
15
|
+
minimum: 1,
|
|
16
|
+
maximum: 5000,
|
|
17
|
+
description: "Cap on matches returned. Default 500.",
|
|
18
|
+
})),
|
|
19
|
+
respect_gitignore: Type.Optional(Type.Boolean({
|
|
20
|
+
description: "Honor .gitignore at the search root and the project root. Default true.",
|
|
21
|
+
})),
|
|
22
|
+
});
|
|
23
|
+
const DEFAULT_LIMIT = 500;
|
|
24
|
+
const HARDCODED_IGNORES = [
|
|
25
|
+
"**/node_modules/**",
|
|
26
|
+
"**/.git/**",
|
|
27
|
+
"**/.hg/**",
|
|
28
|
+
"**/.svn/**",
|
|
29
|
+
"**/dist/**",
|
|
30
|
+
"**/build/**",
|
|
31
|
+
"**/out/**",
|
|
32
|
+
"**/.next/**",
|
|
33
|
+
"**/.nuxt/**",
|
|
34
|
+
"**/.cache/**",
|
|
35
|
+
"**/.turbo/**",
|
|
36
|
+
"**/__pycache__/**",
|
|
37
|
+
"**/.pytest_cache/**",
|
|
38
|
+
"**/target/**",
|
|
39
|
+
"**/vendor/**",
|
|
40
|
+
];
|
|
41
|
+
const DESCRIPTION = `Find files matching a glob pattern.
|
|
42
|
+
|
|
43
|
+
Behavior:
|
|
44
|
+
- Standard glob: ** = any directory depth, * = any chars in a segment, {a,b} = alternation, [abc] = char class.
|
|
45
|
+
- Search starts from the project root unless path is given (must remain inside the project root).
|
|
46
|
+
- Build/VCS metadata directories (node_modules, .git, dist, target, etc.) are excluded by default.
|
|
47
|
+
- .gitignore at the search root and project root is honored unless respect_gitignore: false.
|
|
48
|
+
- Results are sorted by modification time, newest first, so recently-changed files surface first.
|
|
49
|
+
- Results capped at 500 by default; truncation is reported in details.
|
|
50
|
+
|
|
51
|
+
Use this when you know what kind of file you're looking for. For directory orientation use list_files; for content search use grep.`;
|
|
52
|
+
export function createGlob(ctx) {
|
|
53
|
+
return {
|
|
54
|
+
name: "glob",
|
|
55
|
+
label: "Glob",
|
|
56
|
+
description: DESCRIPTION,
|
|
57
|
+
parameters: Params,
|
|
58
|
+
executionMode: "parallel",
|
|
59
|
+
execute: async (_toolCallId, params) => {
|
|
60
|
+
const root = resolveInsideCwd(ctx.cwd, params.path ?? ".");
|
|
61
|
+
const limit = params.max_results ?? DEFAULT_LIMIT;
|
|
62
|
+
const useGitignore = params.respect_gitignore !== false;
|
|
63
|
+
const matches = await glob(params.pattern, {
|
|
64
|
+
cwd: root,
|
|
65
|
+
ignore: HARDCODED_IGNORES.slice(),
|
|
66
|
+
dot: false,
|
|
67
|
+
nodir: true,
|
|
68
|
+
absolute: true,
|
|
69
|
+
});
|
|
70
|
+
let kept = matches.map((abs) => relative(ctx.cwd, abs));
|
|
71
|
+
let gitignoreApplied = false;
|
|
72
|
+
if (useGitignore) {
|
|
73
|
+
const ig = loadGitignore(ctx.cwd, root);
|
|
74
|
+
if (ig) {
|
|
75
|
+
gitignoreApplied = true;
|
|
76
|
+
kept = kept.filter((p) => !ig.ignores(p));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
kept.sort((a, b) => mtime(join(ctx.cwd, b)) - mtime(join(ctx.cwd, a)));
|
|
80
|
+
const truncated = kept.length > limit;
|
|
81
|
+
if (truncated)
|
|
82
|
+
kept = kept.slice(0, limit);
|
|
83
|
+
const tail = truncated ? `\n... (capped at ${limit} of ${matches.length} matches)` : "";
|
|
84
|
+
const text = kept.length === 0
|
|
85
|
+
? `No matches for ${params.pattern} under ${relative(ctx.cwd, root) || "."}`
|
|
86
|
+
: `${kept.length} match${kept.length === 1 ? "" : "es"}:\n${kept.join("\n")}${tail}`;
|
|
87
|
+
return {
|
|
88
|
+
content: [{ type: "text", text }],
|
|
89
|
+
details: {
|
|
90
|
+
pattern: params.pattern,
|
|
91
|
+
root: resolve(root),
|
|
92
|
+
matches: kept,
|
|
93
|
+
truncated,
|
|
94
|
+
gitignoreApplied,
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function loadGitignore(projectRoot, searchRoot) {
|
|
101
|
+
const ig = ignore();
|
|
102
|
+
let loaded = false;
|
|
103
|
+
for (const candidate of dedupe([projectRoot, searchRoot])) {
|
|
104
|
+
for (const file of [".gitignore", ".git/info/exclude"]) {
|
|
105
|
+
try {
|
|
106
|
+
const body = readFileSync(join(candidate, file), "utf8");
|
|
107
|
+
ig.add(body);
|
|
108
|
+
loaded = true;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// missing file is fine
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return loaded ? ig : null;
|
|
116
|
+
}
|
|
117
|
+
function dedupe(values) {
|
|
118
|
+
return Array.from(new Set(values));
|
|
119
|
+
}
|
|
120
|
+
function mtime(path) {
|
|
121
|
+
try {
|
|
122
|
+
return require("node:fs").statSync(path).mtimeMs;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=glob.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { relative, resolve } from "node:path";
|
|
3
|
+
import { Type } from "typebox";
|
|
4
|
+
import { resolveInsideCwd } from "./file-ops.js";
|
|
5
|
+
const Params = Type.Object({
|
|
6
|
+
pattern: Type.String({
|
|
7
|
+
description: "Regex pattern (PCRE2-like via ripgrep). Use fixed_strings: true to disable regex interpretation.",
|
|
8
|
+
}),
|
|
9
|
+
path: Type.Optional(Type.String({
|
|
10
|
+
description: "Search root, relative to the project root. Defaults to the project root.",
|
|
11
|
+
})),
|
|
12
|
+
glob: Type.Optional(Type.String({
|
|
13
|
+
description: 'File glob to scope the search, e.g. "*.ts" or "src/**/*.{ts,tsx}".',
|
|
14
|
+
})),
|
|
15
|
+
case_insensitive: Type.Optional(Type.Boolean({ description: "Case-insensitive match. Default false." })),
|
|
16
|
+
fixed_strings: Type.Optional(Type.Boolean({ description: "Treat pattern as a literal string, not regex. Default false." })),
|
|
17
|
+
context_lines: Type.Optional(Type.Integer({
|
|
18
|
+
minimum: 0,
|
|
19
|
+
maximum: 10,
|
|
20
|
+
description: "Lines of context around each match (-C flag). Default 0.",
|
|
21
|
+
})),
|
|
22
|
+
max_results: Type.Optional(Type.Integer({
|
|
23
|
+
minimum: 1,
|
|
24
|
+
maximum: 5000,
|
|
25
|
+
description: "Cap on matched lines returned. Default 500.",
|
|
26
|
+
})),
|
|
27
|
+
});
|
|
28
|
+
const DEFAULT_LIMIT = 500;
|
|
29
|
+
const DESCRIPTION = `Search file contents for a pattern.
|
|
30
|
+
|
|
31
|
+
Behavior:
|
|
32
|
+
- Uses ripgrep when available (faster, regex-rich, automatic .gitignore support); falls back to grep -rn.
|
|
33
|
+
- Pattern is regex by default; pass fixed_strings: true to match literally.
|
|
34
|
+
- Standard build/VCS dirs are skipped automatically (node_modules, .git, dist, target, etc.).
|
|
35
|
+
- Results capped at 500 by default; truncation reported in details.
|
|
36
|
+
- Output format: "path:line:text", one match per line — easy for the model to quote back to read_file.
|
|
37
|
+
|
|
38
|
+
Use this for content discovery. For path-pattern lookups use glob, for directory orientation use list_files.`;
|
|
39
|
+
export function createGrep(ctx) {
|
|
40
|
+
return {
|
|
41
|
+
name: "grep",
|
|
42
|
+
label: "Grep",
|
|
43
|
+
description: DESCRIPTION,
|
|
44
|
+
parameters: Params,
|
|
45
|
+
executionMode: "parallel",
|
|
46
|
+
execute: async (_toolCallId, params, signal) => {
|
|
47
|
+
const root = resolveInsideCwd(ctx.cwd, params.path ?? ".");
|
|
48
|
+
const limit = params.max_results ?? DEFAULT_LIMIT;
|
|
49
|
+
const useRipgrep = await canUseRipgrep();
|
|
50
|
+
const engine = useRipgrep ? "ripgrep" : "grep";
|
|
51
|
+
const argv = useRipgrep ? buildRipgrepArgs(params) : buildGrepArgs(params);
|
|
52
|
+
const { stdout, stderr, exitCode } = await runChild(argv[0], argv.slice(1), root, signal);
|
|
53
|
+
// rg/grep exit 0 = matches, 1 = no matches, ≥2 = error
|
|
54
|
+
if (exitCode >= 2) {
|
|
55
|
+
const reason = stderr.trim() || `${engine} exited ${exitCode}`;
|
|
56
|
+
throw new Error(reason);
|
|
57
|
+
}
|
|
58
|
+
// rg/grep emit paths relative to the cwd we passed (root). Re-anchor against the project cwd.
|
|
59
|
+
const allMatches = parseMatches(stdout, useRipgrep).map((m) => ({
|
|
60
|
+
...m,
|
|
61
|
+
file: relative(ctx.cwd, resolve(root, m.file)),
|
|
62
|
+
}));
|
|
63
|
+
const truncated = allMatches.length > limit;
|
|
64
|
+
const matches = truncated ? allMatches.slice(0, limit) : allMatches;
|
|
65
|
+
const text = formatOutput(matches, root, ctx.cwd, params.pattern, truncated, allMatches.length, limit);
|
|
66
|
+
return {
|
|
67
|
+
content: [{ type: "text", text }],
|
|
68
|
+
details: {
|
|
69
|
+
pattern: params.pattern,
|
|
70
|
+
root: resolve(root),
|
|
71
|
+
engine,
|
|
72
|
+
matches,
|
|
73
|
+
truncated,
|
|
74
|
+
exitCode,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function buildRipgrepArgs(p) {
|
|
81
|
+
const argv = ["rg", "--vimgrep", "--no-heading", "--line-number", "--color=never"];
|
|
82
|
+
if (p.case_insensitive)
|
|
83
|
+
argv.push("-i");
|
|
84
|
+
if (p.fixed_strings)
|
|
85
|
+
argv.push("-F");
|
|
86
|
+
if (p.context_lines && p.context_lines > 0)
|
|
87
|
+
argv.push("-C", String(p.context_lines));
|
|
88
|
+
if (p.glob)
|
|
89
|
+
argv.push("--glob", p.glob);
|
|
90
|
+
argv.push("--", p.pattern, ".");
|
|
91
|
+
return argv;
|
|
92
|
+
}
|
|
93
|
+
function buildGrepArgs(p) {
|
|
94
|
+
const argv = ["grep", "-rn", "--color=never"];
|
|
95
|
+
if (p.case_insensitive)
|
|
96
|
+
argv.push("-i");
|
|
97
|
+
if (p.fixed_strings)
|
|
98
|
+
argv.push("-F");
|
|
99
|
+
if (p.context_lines && p.context_lines > 0)
|
|
100
|
+
argv.push("-C", String(p.context_lines));
|
|
101
|
+
if (p.glob)
|
|
102
|
+
argv.push(`--include=${p.glob}`);
|
|
103
|
+
for (const skip of ["node_modules", ".git", "dist", "build", "target", "__pycache__"]) {
|
|
104
|
+
argv.push(`--exclude-dir=${skip}`);
|
|
105
|
+
}
|
|
106
|
+
argv.push("--", p.pattern, ".");
|
|
107
|
+
return argv;
|
|
108
|
+
}
|
|
109
|
+
let ripgrepCheck;
|
|
110
|
+
function canUseRipgrep() {
|
|
111
|
+
if (!ripgrepCheck) {
|
|
112
|
+
ripgrepCheck = new Promise((resolveCheck) => {
|
|
113
|
+
const child = spawn("rg", ["--version"], { stdio: "ignore" });
|
|
114
|
+
child.on("error", () => resolveCheck(false));
|
|
115
|
+
child.on("close", (code) => resolveCheck(code === 0));
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return ripgrepCheck;
|
|
119
|
+
}
|
|
120
|
+
function runChild(cmd, args, cwd, signal) {
|
|
121
|
+
return new Promise((resolveRun) => {
|
|
122
|
+
const child = spawn(cmd, args, {
|
|
123
|
+
cwd,
|
|
124
|
+
env: process.env,
|
|
125
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
126
|
+
});
|
|
127
|
+
const out = [];
|
|
128
|
+
const err = [];
|
|
129
|
+
child.stdout?.on("data", (b) => out.push(b));
|
|
130
|
+
child.stderr?.on("data", (b) => err.push(b));
|
|
131
|
+
const onAbort = () => child.kill("SIGTERM");
|
|
132
|
+
signal?.addEventListener("abort", onAbort);
|
|
133
|
+
child.on("error", (e) => {
|
|
134
|
+
signal?.removeEventListener("abort", onAbort);
|
|
135
|
+
resolveRun({ stdout: "", stderr: e.message, exitCode: 1 });
|
|
136
|
+
});
|
|
137
|
+
child.on("close", (code) => {
|
|
138
|
+
signal?.removeEventListener("abort", onAbort);
|
|
139
|
+
resolveRun({
|
|
140
|
+
stdout: Buffer.concat(out).toString("utf8"),
|
|
141
|
+
stderr: Buffer.concat(err).toString("utf8"),
|
|
142
|
+
exitCode: code ?? 1,
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function parseMatches(stdout, ripgrep) {
|
|
148
|
+
if (!stdout)
|
|
149
|
+
return [];
|
|
150
|
+
const matches = [];
|
|
151
|
+
for (const raw of stdout.split("\n")) {
|
|
152
|
+
if (!raw)
|
|
153
|
+
continue;
|
|
154
|
+
const m = ripgrep ? parseRipgrepLine(raw) : parseGrepLine(raw);
|
|
155
|
+
if (m)
|
|
156
|
+
matches.push(m);
|
|
157
|
+
}
|
|
158
|
+
return matches;
|
|
159
|
+
}
|
|
160
|
+
function parseRipgrepLine(line) {
|
|
161
|
+
// rg --vimgrep: file:line:col:text
|
|
162
|
+
const first = line.indexOf(":");
|
|
163
|
+
if (first < 0)
|
|
164
|
+
return null;
|
|
165
|
+
const second = line.indexOf(":", first + 1);
|
|
166
|
+
if (second < 0)
|
|
167
|
+
return null;
|
|
168
|
+
const third = line.indexOf(":", second + 1);
|
|
169
|
+
if (third < 0)
|
|
170
|
+
return null;
|
|
171
|
+
const file = line.slice(0, first);
|
|
172
|
+
const lineNum = Number.parseInt(line.slice(first + 1, second), 10);
|
|
173
|
+
if (!Number.isFinite(lineNum))
|
|
174
|
+
return null;
|
|
175
|
+
return { file, line: lineNum, text: line.slice(third + 1) };
|
|
176
|
+
}
|
|
177
|
+
function parseGrepLine(line) {
|
|
178
|
+
// grep -rn: file:line:text (no column)
|
|
179
|
+
const first = line.indexOf(":");
|
|
180
|
+
if (first < 0)
|
|
181
|
+
return null;
|
|
182
|
+
const second = line.indexOf(":", first + 1);
|
|
183
|
+
if (second < 0)
|
|
184
|
+
return null;
|
|
185
|
+
const file = line.slice(0, first);
|
|
186
|
+
const lineNum = Number.parseInt(line.slice(first + 1, second), 10);
|
|
187
|
+
if (!Number.isFinite(lineNum))
|
|
188
|
+
return null;
|
|
189
|
+
return { file, line: lineNum, text: line.slice(second + 1) };
|
|
190
|
+
}
|
|
191
|
+
function formatOutput(matches, root, cwd, pattern, truncated, totalFound, limit) {
|
|
192
|
+
if (matches.length === 0) {
|
|
193
|
+
return `No matches for ${pattern} under ${relative(cwd, root) || "."}`;
|
|
194
|
+
}
|
|
195
|
+
const lines = matches.map((m) => `${m.file}:${m.line}:${m.text}`);
|
|
196
|
+
const tail = truncated ? `\n... (showing ${limit} of ${totalFound} matches)` : "";
|
|
197
|
+
return `${matches.length} match${matches.length === 1 ? "" : "es"}:\n${lines.join("\n")}${tail}`;
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=grep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
|