@timetotest/cli 0.2.3 → 0.3.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/README.md +49 -40
- package/dist/bin/ttt.js +0 -2
- package/dist/bin/ttt.js.map +1 -1
- package/dist/package.json +13 -6
- package/dist/src/commands/chat/ChatApp.js +270 -100
- package/dist/src/commands/chat/ChatApp.js.map +1 -1
- package/dist/src/commands/chat/components/Banner.js +1 -1
- package/dist/src/commands/chat/components/ChatInput.js +97 -36
- package/dist/src/commands/chat/components/ChatInput.js.map +1 -1
- package/dist/src/commands/chat/components/ChatMessage.js +102 -0
- package/dist/src/commands/chat/components/ChatMessage.js.map +1 -0
- package/dist/src/commands/chat/components/MessageBubble.js +2 -1
- package/dist/src/commands/chat/components/MessageBubble.js.map +1 -1
- package/dist/src/commands/chat/components/PermissionPrompt.js +92 -0
- package/dist/src/commands/chat/components/PermissionPrompt.js.map +1 -0
- package/dist/src/commands/chat/components/StatusIndicator.js +21 -5
- package/dist/src/commands/chat/components/StatusIndicator.js.map +1 -1
- package/dist/src/commands/chat/components/ToolCallDisplay.js +141 -0
- package/dist/src/commands/chat/components/ToolCallDisplay.js.map +1 -0
- package/dist/src/commands/chat-ink.js +389 -61
- package/dist/src/commands/chat-ink.js.map +1 -1
- package/dist/src/commands/login.js +5 -5
- package/dist/src/commands/login.js.map +1 -1
- package/dist/src/commands/test.js +14 -194
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/lib/__tests__/code-mode-integration.test.js +381 -0
- package/dist/src/lib/__tests__/code-mode-integration.test.js.map +1 -0
- package/dist/src/lib/__tests__/config-manager.test.js +81 -0
- package/dist/src/lib/__tests__/config-manager.test.js.map +1 -0
- package/dist/src/lib/__tests__/mode-persistence-integration.test.js +75 -0
- package/dist/src/lib/__tests__/mode-persistence-integration.test.js.map +1 -0
- package/dist/src/lib/__tests__/permission-flow-integration.test.js +145 -0
- package/dist/src/lib/__tests__/permission-flow-integration.test.js.map +1 -0
- package/dist/src/lib/__tests__/permissions.test.js +132 -0
- package/dist/src/lib/__tests__/permissions.test.js.map +1 -0
- package/dist/src/lib/agent-orchestrator.js +263 -4
- package/dist/src/lib/agent-orchestrator.js.map +1 -1
- package/dist/src/lib/config.js +40 -0
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/context-compactor.js +310 -0
- package/dist/src/lib/context-compactor.js.map +1 -0
- package/dist/src/lib/http.js +8 -0
- package/dist/src/lib/http.js.map +1 -1
- package/dist/src/lib/local-tools/code/__tests__/grep-search.test.js +146 -0
- package/dist/src/lib/local-tools/code/__tests__/grep-search.test.js.map +1 -0
- package/dist/src/lib/local-tools/code/__tests__/list-directory.test.js +192 -0
- package/dist/src/lib/local-tools/code/__tests__/list-directory.test.js.map +1 -0
- package/dist/src/lib/local-tools/code/__tests__/read-file.test.js +169 -0
- package/dist/src/lib/local-tools/code/__tests__/read-file.test.js.map +1 -0
- package/dist/src/lib/local-tools/code/__tests__/run-command.test.js +101 -0
- package/dist/src/lib/local-tools/code/__tests__/run-command.test.js.map +1 -0
- package/dist/src/lib/local-tools/code/__tests__/search-files.test.js +191 -0
- package/dist/src/lib/local-tools/code/__tests__/search-files.test.js.map +1 -0
- package/dist/src/lib/local-tools/code/grep-search.js +404 -0
- package/dist/src/lib/local-tools/code/grep-search.js.map +1 -0
- package/dist/src/lib/local-tools/code/index.js +11 -0
- package/dist/src/lib/local-tools/code/index.js.map +1 -0
- package/dist/src/lib/local-tools/code/list-directory.js +276 -0
- package/dist/src/lib/local-tools/code/list-directory.js.map +1 -0
- package/dist/src/lib/local-tools/code/read-file.js +301 -0
- package/dist/src/lib/local-tools/code/read-file.js.map +1 -0
- package/dist/src/lib/local-tools/code/run-command.js +235 -0
- package/dist/src/lib/local-tools/code/run-command.js.map +1 -0
- package/dist/src/lib/local-tools/code/search-files.js +297 -0
- package/dist/src/lib/local-tools/code/search-files.js.map +1 -0
- package/dist/src/lib/local-tools/code/types.js +6 -0
- package/dist/src/lib/local-tools/code/types.js.map +1 -0
- package/dist/src/lib/local-tools/ui/playwright-mcp.js +1 -1
- package/dist/src/lib/permissions.js +94 -0
- package/dist/src/lib/permissions.js.map +1 -0
- package/dist/src/lib/prompts/builder.js +13 -10
- package/dist/src/lib/prompts/builder.js.map +1 -1
- package/dist/src/lib/prompts/templates.js +78 -0
- package/dist/src/lib/prompts/templates.js.map +1 -1
- package/dist/src/lib/session-manager.js.map +1 -1
- package/dist/src/lib/testing-mode.js +2 -2
- package/dist/src/lib/testing-mode.js.map +1 -1
- package/dist/src/lib/tool-executor.js +131 -2
- package/dist/src/lib/tool-executor.js.map +1 -1
- package/dist/src/lib/tool-registry.js +171 -3
- package/dist/src/lib/tool-registry.js.map +1 -1
- package/dist/src/lib/tool-result-pruner.js +4 -4
- package/dist/src/lib/tool-result-pruner.js.map +1 -1
- package/dist/src/lib/tui/ink/components/AppFrame.js +17 -0
- package/dist/src/lib/tui/ink/components/AppFrame.js.map +1 -0
- package/dist/src/lib/tui/ink/components/CommandPalette.js +24 -0
- package/dist/src/lib/tui/ink/components/CommandPalette.js.map +1 -0
- package/dist/src/lib/tui/ink/components/Pill.js +19 -0
- package/dist/src/lib/tui/ink/components/Pill.js.map +1 -0
- package/dist/src/lib/tui/ink/components/TimetoTestLogo.js +30 -0
- package/dist/src/lib/tui/ink/components/TimetoTestLogo.js.map +1 -0
- package/dist/src/lib/tui/ink/theme.js +28 -0
- package/dist/src/lib/tui/ink/theme.js.map +1 -0
- package/dist/src/lib/tui/interactive-chat.js +35 -35
- package/dist/src/lib/tui/interactive-chat.js.map +1 -1
- package/dist/src/lib/tui/print.js +18 -18
- package/dist/src/lib/tui/print.js.map +1 -1
- package/dist/src/lib/tui/prompt.js +3 -3
- package/dist/src/lib/tui/prompt.js.map +1 -1
- package/dist/src/lib/tui/status.js +1 -1
- package/dist/src/lib/tui/status.js.map +1 -1
- package/dist/src/lib/update.js +10 -10
- package/dist/src/lib/update.js.map +1 -1
- package/package.json +13 -6
- package/dist/src/commands/ask/AskApp.js +0 -121
- package/dist/src/commands/ask/AskApp.js.map +0 -1
- package/dist/src/commands/ask/components/AssistantResponse.js +0 -31
- package/dist/src/commands/ask/components/AssistantResponse.js.map +0 -1
- package/dist/src/commands/ask/components/Banner.js +0 -15
- package/dist/src/commands/ask/components/Banner.js.map +0 -1
- package/dist/src/commands/ask/components/ChatInput.js +0 -93
- package/dist/src/commands/ask/components/ChatInput.js.map +0 -1
- package/dist/src/commands/ask/components/Divider.js +0 -17
- package/dist/src/commands/ask/components/Divider.js.map +0 -1
- package/dist/src/commands/ask/components/IntroTips.js +0 -19
- package/dist/src/commands/ask/components/IntroTips.js.map +0 -1
- package/dist/src/commands/ask/components/MessageBubble.js +0 -47
- package/dist/src/commands/ask/components/MessageBubble.js.map +0 -1
- package/dist/src/commands/ask/components/SessionInfo.js +0 -20
- package/dist/src/commands/ask/components/SessionInfo.js.map +0 -1
- package/dist/src/commands/ask/components/StatusIndicator.js +0 -67
- package/dist/src/commands/ask/components/StatusIndicator.js.map +0 -1
- package/dist/src/commands/ask-ink.js +0 -380
- package/dist/src/commands/ask-ink.js.map +0 -1
- package/dist/src/commands/ask.js +0 -991
- package/dist/src/commands/ask.js.map +0 -1
- package/dist/src/commands/chat/components/Divider.js +0 -7
- package/dist/src/commands/chat/components/Divider.js.map +0 -1
- package/dist/src/commands/chat/components/SessionInfo.js +0 -11
- package/dist/src/commands/chat/components/SessionInfo.js.map +0 -1
- package/dist/src/commands/chat.js +0 -82
- package/dist/src/commands/chat.js.map +0 -1
- package/dist/src/commands/start-test.js +0 -119
- package/dist/src/commands/start-test.js.map +0 -1
- package/dist/src/commands/stream.js +0 -17
- package/dist/src/commands/stream.js.map +0 -1
- package/dist/src/lib/legacy-chat-runner.js +0 -37
- package/dist/src/lib/legacy-chat-runner.js.map +0 -1
- package/dist/src/lib/local-tools/ui/click-element.js +0 -105
- package/dist/src/lib/local-tools/ui/click-element.js.map +0 -1
- package/dist/src/lib/local-tools/ui/dom-rag.js +0 -201
- package/dist/src/lib/local-tools/ui/dom-rag.js.map +0 -1
- package/dist/src/lib/local-tools/ui/find-element.js +0 -31
- package/dist/src/lib/local-tools/ui/find-element.js.map +0 -1
- package/dist/src/lib/local-tools/ui/hover-element.js +0 -94
- package/dist/src/lib/local-tools/ui/hover-element.js.map +0 -1
- package/dist/src/lib/local-tools/ui/manage-tab.js +0 -65
- package/dist/src/lib/local-tools/ui/manage-tab.js.map +0 -1
- package/dist/src/lib/local-tools/ui/navigate.js +0 -35
- package/dist/src/lib/local-tools/ui/navigate.js.map +0 -1
- package/dist/src/lib/local-tools/ui/page-discovery.js +0 -32
- package/dist/src/lib/local-tools/ui/page-discovery.js.map +0 -1
- package/dist/src/lib/local-tools/ui/screenshot.js +0 -19
- package/dist/src/lib/local-tools/ui/screenshot.js.map +0 -1
- package/dist/src/lib/local-tools/ui/search-interactive-elements.js +0 -18
- package/dist/src/lib/local-tools/ui/search-interactive-elements.js.map +0 -1
- package/dist/src/lib/local-tools/ui/selector-resolver.js +0 -153
- package/dist/src/lib/local-tools/ui/selector-resolver.js.map +0 -1
- package/dist/src/lib/local-tools/ui/type-text.js +0 -40
- package/dist/src/lib/local-tools/ui/type-text.js.map +0 -1
- package/dist/src/lib/tui/components/AskIntro.js +0 -6
- package/dist/src/lib/tui/components/AskIntro.js.map +0 -1
- package/dist/src/lib/tui/components/Banner.js +0 -15
- package/dist/src/lib/tui/components/Banner.js.map +0 -1
- package/dist/src/lib/tui/components/Divider.js +0 -17
- package/dist/src/lib/tui/components/Divider.js.map +0 -1
- package/dist/src/lib/tui/components/EventLine.js +0 -110
- package/dist/src/lib/tui/components/EventLine.js.map +0 -1
- package/dist/src/lib/tui/components/Header.js +0 -15
- package/dist/src/lib/tui/components/Header.js.map +0 -1
- package/dist/src/lib/tui/components/InputBox.js +0 -9
- package/dist/src/lib/tui/components/InputBox.js.map +0 -1
- package/dist/src/lib/tui/components/Mapping.js +0 -8
- package/dist/src/lib/tui/components/Mapping.js.map +0 -1
- package/dist/src/lib/tui/components/ProjectList.js +0 -6
- package/dist/src/lib/tui/components/ProjectList.js.map +0 -1
- package/dist/src/lib/tui/components/Spinner.js +0 -20
- package/dist/src/lib/tui/components/Spinner.js.map +0 -1
- package/dist/src/lib/tui/components/StatusBanner.js +0 -12
- package/dist/src/lib/tui/components/StatusBanner.js.map +0 -1
- package/dist/src/lib/tui/components/StatusBar.js +0 -11
- package/dist/src/lib/tui/components/StatusBar.js.map +0 -1
- package/dist/src/lib/tui/components/UserBubble.js +0 -6
- package/dist/src/lib/tui/components/UserBubble.js.map +0 -1
- package/dist/src/lib/tui/components/index.js +0 -16
- package/dist/src/lib/tui/components/index.js.map +0 -1
- package/dist/src/lib/tui/ink-print.js +0 -41
- package/dist/src/lib/tui/ink-print.js.map +0 -1
- package/dist/src/test-agent-flow.js +0 -148
- package/dist/src/test-agent-flow.js.map +0 -1
- package/dist/src/test-browser-session.js +0 -152
- package/dist/src/test-browser-session.js.map +0 -1
- package/dist/src/test-browser-snapshot.js +0 -187
- package/dist/src/test-browser-snapshot.js.map +0 -1
- package/dist/src/test-snapshot-detailed.js +0 -219
- package/dist/src/test-snapshot-detailed.js.map +0 -1
- package/dist/src/test-snapshot-simple.js +0 -85
- package/dist/src/test-snapshot-simple.js.map +0 -1
- package/dist/src/test-snapshot-tabs.js +0 -110
- package/dist/src/test-snapshot-tabs.js.map +0 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for search_files tool.
|
|
3
|
+
* Tests glob pattern matching, gitignore respect, and exclude patterns.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
6
|
+
import * as fs from "fs/promises";
|
|
7
|
+
import * as path from "path";
|
|
8
|
+
import * as os from "os";
|
|
9
|
+
import { searchFiles } from "../search-files.js";
|
|
10
|
+
describe("searchFiles", () => {
|
|
11
|
+
let tempDir;
|
|
12
|
+
let context;
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "search-files-test-"));
|
|
15
|
+
context = { workingDirectory: tempDir };
|
|
16
|
+
});
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
describe("glob pattern matching", () => {
|
|
21
|
+
it("should find files matching simple glob pattern", async () => {
|
|
22
|
+
await fs.writeFile(path.join(tempDir, "file1.ts"), "content");
|
|
23
|
+
await fs.writeFile(path.join(tempDir, "file2.ts"), "content");
|
|
24
|
+
await fs.writeFile(path.join(tempDir, "file3.js"), "content");
|
|
25
|
+
const result = await searchFiles({ pattern: "*.ts" }, context);
|
|
26
|
+
expect(result.success).toBe(true);
|
|
27
|
+
expect(result.files.length).toBe(2);
|
|
28
|
+
expect(result.files).toContain("file1.ts");
|
|
29
|
+
expect(result.files).toContain("file2.ts");
|
|
30
|
+
expect(result.files).not.toContain("file3.js");
|
|
31
|
+
});
|
|
32
|
+
it("should find files with ** glob pattern (recursive)", async () => {
|
|
33
|
+
await fs.mkdir(path.join(tempDir, "src"));
|
|
34
|
+
await fs.mkdir(path.join(tempDir, "src", "components"));
|
|
35
|
+
await fs.writeFile(path.join(tempDir, "root.ts"), "content");
|
|
36
|
+
await fs.writeFile(path.join(tempDir, "src", "index.ts"), "content");
|
|
37
|
+
await fs.writeFile(path.join(tempDir, "src", "components", "Button.ts"), "content");
|
|
38
|
+
const result = await searchFiles({ pattern: "**/*.ts" }, context);
|
|
39
|
+
expect(result.success).toBe(true);
|
|
40
|
+
// The ** pattern matches files in subdirectories
|
|
41
|
+
expect(result.files.length).toBeGreaterThanOrEqual(2);
|
|
42
|
+
expect(result.files.some((f) => f.includes("index.ts"))).toBe(true);
|
|
43
|
+
expect(result.files.some((f) => f.includes("Button.ts"))).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
it("should find files in specific directory pattern", async () => {
|
|
46
|
+
await fs.mkdir(path.join(tempDir, "src"));
|
|
47
|
+
await fs.mkdir(path.join(tempDir, "test"));
|
|
48
|
+
await fs.writeFile(path.join(tempDir, "src", "app.ts"), "content");
|
|
49
|
+
await fs.writeFile(path.join(tempDir, "test", "app.test.ts"), "content");
|
|
50
|
+
// Use base path instead of pattern prefix for directory-specific search
|
|
51
|
+
const result = await searchFiles({ pattern: "*.ts", path: "src" }, context);
|
|
52
|
+
expect(result.success).toBe(true);
|
|
53
|
+
expect(result.files.length).toBe(1);
|
|
54
|
+
expect(result.files[0]).toBe("app.ts");
|
|
55
|
+
});
|
|
56
|
+
it("should handle ? wildcard for single character", async () => {
|
|
57
|
+
await fs.writeFile(path.join(tempDir, "file1.ts"), "content");
|
|
58
|
+
await fs.writeFile(path.join(tempDir, "file2.ts"), "content");
|
|
59
|
+
await fs.writeFile(path.join(tempDir, "file10.ts"), "content");
|
|
60
|
+
const result = await searchFiles({ pattern: "file?.ts" }, context);
|
|
61
|
+
expect(result.success).toBe(true);
|
|
62
|
+
expect(result.files.length).toBe(2);
|
|
63
|
+
expect(result.files).not.toContain("file10.ts");
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe("gitignore respect", () => {
|
|
67
|
+
it("should respect .gitignore by default", async () => {
|
|
68
|
+
await fs.writeFile(path.join(tempDir, ".gitignore"), "ignored.ts\n");
|
|
69
|
+
await fs.writeFile(path.join(tempDir, "included.ts"), "content");
|
|
70
|
+
await fs.writeFile(path.join(tempDir, "ignored.ts"), "content");
|
|
71
|
+
const result = await searchFiles({ pattern: "*.ts" }, context);
|
|
72
|
+
expect(result.success).toBe(true);
|
|
73
|
+
expect(result.files).toContain("included.ts");
|
|
74
|
+
expect(result.files).not.toContain("ignored.ts");
|
|
75
|
+
});
|
|
76
|
+
it("should include gitignored files when respect_gitignore is false", async () => {
|
|
77
|
+
await fs.writeFile(path.join(tempDir, ".gitignore"), "ignored.ts\n");
|
|
78
|
+
await fs.writeFile(path.join(tempDir, "included.ts"), "content");
|
|
79
|
+
await fs.writeFile(path.join(tempDir, "ignored.ts"), "content");
|
|
80
|
+
const result = await searchFiles({ pattern: "*.ts", respect_gitignore: false }, context);
|
|
81
|
+
expect(result.success).toBe(true);
|
|
82
|
+
expect(result.files).toContain("included.ts");
|
|
83
|
+
expect(result.files).toContain("ignored.ts");
|
|
84
|
+
});
|
|
85
|
+
it("should skip node_modules by default", async () => {
|
|
86
|
+
await fs.mkdir(path.join(tempDir, "node_modules"));
|
|
87
|
+
await fs.mkdir(path.join(tempDir, "node_modules", "package"));
|
|
88
|
+
await fs.writeFile(path.join(tempDir, "node_modules", "package", "index.js"), "content");
|
|
89
|
+
await fs.writeFile(path.join(tempDir, "app.js"), "content");
|
|
90
|
+
const result = await searchFiles({ pattern: "*.js" }, context);
|
|
91
|
+
expect(result.success).toBe(true);
|
|
92
|
+
expect(result.files).toContain("app.js");
|
|
93
|
+
expect(result.files.some((f) => f.includes("node_modules"))).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
it("should skip .git directory by default", async () => {
|
|
96
|
+
await fs.mkdir(path.join(tempDir, ".git"));
|
|
97
|
+
await fs.mkdir(path.join(tempDir, ".git", "objects"));
|
|
98
|
+
await fs.writeFile(path.join(tempDir, ".git", "config"), "content");
|
|
99
|
+
await fs.writeFile(path.join(tempDir, "app.ts"), "content");
|
|
100
|
+
const result = await searchFiles({ pattern: "**/*" }, context);
|
|
101
|
+
expect(result.success).toBe(true);
|
|
102
|
+
expect(result.files.some((f) => f.includes(".git"))).toBe(false);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe("exclude patterns", () => {
|
|
106
|
+
it("should exclude files matching exclude patterns", async () => {
|
|
107
|
+
await fs.writeFile(path.join(tempDir, "app.ts"), "content");
|
|
108
|
+
await fs.writeFile(path.join(tempDir, "app.test.ts"), "content");
|
|
109
|
+
await fs.writeFile(path.join(tempDir, "utils.ts"), "content");
|
|
110
|
+
const result = await searchFiles({ pattern: "*.ts", exclude: ["*.test.ts"] }, context);
|
|
111
|
+
expect(result.success).toBe(true);
|
|
112
|
+
expect(result.files).toContain("app.ts");
|
|
113
|
+
expect(result.files).toContain("utils.ts");
|
|
114
|
+
expect(result.files).not.toContain("app.test.ts");
|
|
115
|
+
});
|
|
116
|
+
it("should support multiple exclude patterns", async () => {
|
|
117
|
+
await fs.writeFile(path.join(tempDir, "app.ts"), "content");
|
|
118
|
+
await fs.writeFile(path.join(tempDir, "app.test.ts"), "content");
|
|
119
|
+
await fs.writeFile(path.join(tempDir, "app.spec.ts"), "content");
|
|
120
|
+
const result = await searchFiles({ pattern: "*.ts", exclude: ["*.test.ts", "*.spec.ts"] }, context);
|
|
121
|
+
expect(result.success).toBe(true);
|
|
122
|
+
expect(result.files).toContain("app.ts");
|
|
123
|
+
expect(result.files).not.toContain("app.test.ts");
|
|
124
|
+
expect(result.files).not.toContain("app.spec.ts");
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe("max_results limit", () => {
|
|
128
|
+
it("should limit results to max_results", async () => {
|
|
129
|
+
// Create more files than the limit
|
|
130
|
+
for (let i = 0; i < 10; i++) {
|
|
131
|
+
await fs.writeFile(path.join(tempDir, `file${i}.ts`), "content");
|
|
132
|
+
}
|
|
133
|
+
const result = await searchFiles({ pattern: "*.ts", max_results: 5 }, context);
|
|
134
|
+
expect(result.success).toBe(true);
|
|
135
|
+
expect(result.files.length).toBe(5);
|
|
136
|
+
expect(result.truncated).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
it("should not truncate when results are under limit", async () => {
|
|
139
|
+
await fs.writeFile(path.join(tempDir, "file1.ts"), "content");
|
|
140
|
+
await fs.writeFile(path.join(tempDir, "file2.ts"), "content");
|
|
141
|
+
const result = await searchFiles({ pattern: "*.ts", max_results: 10 }, context);
|
|
142
|
+
expect(result.success).toBe(true);
|
|
143
|
+
expect(result.files.length).toBe(2);
|
|
144
|
+
expect(result.truncated).toBe(false);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
describe("base path", () => {
|
|
148
|
+
it("should search from specified base path", async () => {
|
|
149
|
+
await fs.mkdir(path.join(tempDir, "src"));
|
|
150
|
+
await fs.mkdir(path.join(tempDir, "test"));
|
|
151
|
+
await fs.writeFile(path.join(tempDir, "src", "app.ts"), "content");
|
|
152
|
+
await fs.writeFile(path.join(tempDir, "test", "app.test.ts"), "content");
|
|
153
|
+
const result = await searchFiles({ pattern: "*.ts", path: "src" }, context);
|
|
154
|
+
expect(result.success).toBe(true);
|
|
155
|
+
expect(result.files.length).toBe(1);
|
|
156
|
+
expect(result.files[0]).toBe("app.ts");
|
|
157
|
+
});
|
|
158
|
+
it("should return error for non-existent base path", async () => {
|
|
159
|
+
const result = await searchFiles({ pattern: "*.ts", path: "nonexistent" }, context);
|
|
160
|
+
expect(result.success).toBe(false);
|
|
161
|
+
expect(result.error).toBe("Base path not found");
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe("path validation (security)", () => {
|
|
165
|
+
it("should prevent directory traversal in base path", async () => {
|
|
166
|
+
const result = await searchFiles({ pattern: "*.ts", path: "../../../" }, context);
|
|
167
|
+
expect(result.success).toBe(false);
|
|
168
|
+
expect(result.error).toBe("Path validation failed: access denied");
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe("result sorting", () => {
|
|
172
|
+
it("should return results sorted alphabetically", async () => {
|
|
173
|
+
await fs.writeFile(path.join(tempDir, "c.ts"), "content");
|
|
174
|
+
await fs.writeFile(path.join(tempDir, "a.ts"), "content");
|
|
175
|
+
await fs.writeFile(path.join(tempDir, "b.ts"), "content");
|
|
176
|
+
const result = await searchFiles({ pattern: "*.ts" }, context);
|
|
177
|
+
expect(result.success).toBe(true);
|
|
178
|
+
expect(result.files).toEqual(["a.ts", "b.ts", "c.ts"]);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
describe("empty results", () => {
|
|
182
|
+
it("should return empty array when no files match", async () => {
|
|
183
|
+
await fs.writeFile(path.join(tempDir, "file.js"), "content");
|
|
184
|
+
const result = await searchFiles({ pattern: "*.ts" }, context);
|
|
185
|
+
expect(result.success).toBe(true);
|
|
186
|
+
expect(result.files).toEqual([]);
|
|
187
|
+
expect(result.total_found).toBe(0);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=search-files.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-files.test.js","sourceRoot":"","sources":["../../../../../../src/lib/local-tools/code/__tests__/search-files.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAC,MAAM,QAAQ,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAG/C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAe,CAAC;IACpB,IAAI,OAAoB,CAAC;IAEzB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACzE,OAAO,GAAG,EAAC,gBAAgB,EAAE,OAAO,EAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,EAAE,OAAO,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;YACxD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YACrE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,EACpD,SAAS,CACV,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,SAAS,EAAC,EAAE,OAAO,CAAC,CAAC;YAEhE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,iDAAiD;YACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YACnE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAEzE,wEAAwE;YACxE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAE,OAAO,CAAC,CAAC;YAE1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;YAE/D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,UAAU,EAAC,EAAE,OAAO,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC;YACrE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,EAAE,OAAO,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,cAAc,CAAC,CAAC;YACrE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAC,EAC3C,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,CAAC,EACzD,SAAS,CACV,CAAC;YACF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAE5D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,EAAE,OAAO,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACtD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAE5D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,EAAE,OAAO,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAC,EACzC,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAC,EACtD,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,mCAAmC;YACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAC,EACjC,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;YAE9D,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAC,EAClC,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YACnE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAC,EAAE,OAAO,CAAC,CAAC;YAE1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAC,EACtC,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,EAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAC,EACpC,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;YAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,EAAE,OAAO,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;YAE7D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,EAAC,OAAO,EAAE,MAAM,EAAC,EAAE,OAAO,CAAC,CAAC;YAE7D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* grep_search tool - Search for text or regex patterns within files.
|
|
3
|
+
* Supports text and regex search modes, case sensitivity, context lines,
|
|
4
|
+
* file pattern filtering, and result limits.
|
|
5
|
+
*
|
|
6
|
+
* Security: Implements path validation to prevent directory traversal (TR-5).
|
|
7
|
+
* Respects .gitignore by default and skips common ignored directories.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "fs/promises";
|
|
10
|
+
import * as path from "path";
|
|
11
|
+
// Default maximum results to return
|
|
12
|
+
const DEFAULT_MAX_RESULTS = 50;
|
|
13
|
+
// Maximum file size to search (1MB to avoid memory issues)
|
|
14
|
+
const MAX_FILE_SIZE = 1024 * 1024;
|
|
15
|
+
// Directories to always skip unless explicitly requested (TR-5)
|
|
16
|
+
const DEFAULT_IGNORED_DIRS = new Set([
|
|
17
|
+
"node_modules",
|
|
18
|
+
".git",
|
|
19
|
+
"__pycache__",
|
|
20
|
+
".pytest_cache",
|
|
21
|
+
".mypy_cache",
|
|
22
|
+
".tox",
|
|
23
|
+
".nox",
|
|
24
|
+
".eggs",
|
|
25
|
+
"*.egg-info",
|
|
26
|
+
".venv",
|
|
27
|
+
"venv",
|
|
28
|
+
"env",
|
|
29
|
+
".env",
|
|
30
|
+
"dist",
|
|
31
|
+
"build",
|
|
32
|
+
".next",
|
|
33
|
+
".nuxt",
|
|
34
|
+
".output",
|
|
35
|
+
".cache",
|
|
36
|
+
".parcel-cache",
|
|
37
|
+
"coverage",
|
|
38
|
+
".nyc_output",
|
|
39
|
+
]);
|
|
40
|
+
/**
|
|
41
|
+
* Parse a .gitignore file and return an array of patterns.
|
|
42
|
+
*/
|
|
43
|
+
async function parseGitignore(gitignorePath) {
|
|
44
|
+
try {
|
|
45
|
+
const content = await fs.readFile(gitignorePath, "utf-8");
|
|
46
|
+
return content
|
|
47
|
+
.split("\n")
|
|
48
|
+
.map((line) => line.trim())
|
|
49
|
+
.filter((line) => line && !line.startsWith("#"));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Convert a glob pattern to a RegExp.
|
|
57
|
+
* Supports *, **, and ? wildcards.
|
|
58
|
+
*/
|
|
59
|
+
function globToRegex(pattern) {
|
|
60
|
+
// Escape special regex characters except glob wildcards
|
|
61
|
+
let regexStr = pattern
|
|
62
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
63
|
+
// Handle ** (matches any path including separators)
|
|
64
|
+
.replace(/\*\*/g, "{{GLOBSTAR}}")
|
|
65
|
+
// Handle * (matches anything except path separator)
|
|
66
|
+
.replace(/\*/g, "[^/]*")
|
|
67
|
+
// Handle ? (matches single character except path separator)
|
|
68
|
+
.replace(/\?/g, "[^/]")
|
|
69
|
+
// Restore globstar
|
|
70
|
+
.replace(/\{\{GLOBSTAR\}\}/g, ".*");
|
|
71
|
+
return new RegExp(`^${regexStr}$`, "i");
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a path matches a glob pattern.
|
|
75
|
+
*/
|
|
76
|
+
function matchesGlob(filePath, pattern) {
|
|
77
|
+
// Normalize path separators
|
|
78
|
+
const normalizedPath = filePath.replace(/\\/g, "/");
|
|
79
|
+
const normalizedPattern = pattern.replace(/\\/g, "/");
|
|
80
|
+
// Handle patterns that start with /
|
|
81
|
+
const patternToUse = normalizedPattern.startsWith("/")
|
|
82
|
+
? normalizedPattern.slice(1)
|
|
83
|
+
: normalizedPattern;
|
|
84
|
+
const regex = globToRegex(patternToUse);
|
|
85
|
+
return regex.test(normalizedPath);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check if a path should be ignored based on gitignore patterns.
|
|
89
|
+
*/
|
|
90
|
+
function isIgnoredByPatterns(relativePath, patterns) {
|
|
91
|
+
const normalizedPath = relativePath.replace(/\\/g, "/");
|
|
92
|
+
for (const pattern of patterns) {
|
|
93
|
+
if (!pattern)
|
|
94
|
+
continue;
|
|
95
|
+
// Handle negation patterns (!)
|
|
96
|
+
if (pattern.startsWith("!")) {
|
|
97
|
+
// Negation - if it matches, it's NOT ignored
|
|
98
|
+
const negatedPattern = pattern.slice(1);
|
|
99
|
+
if (matchesGlob(normalizedPath, negatedPattern)) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// Handle directory-only patterns (ending with /)
|
|
105
|
+
const isDirectoryPattern = pattern.endsWith("/");
|
|
106
|
+
const cleanPattern = isDirectoryPattern ? pattern.slice(0, -1) : pattern;
|
|
107
|
+
// Check if pattern matches
|
|
108
|
+
if (matchesGlob(normalizedPath, cleanPattern)) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
// Also check if any path component matches (for patterns like "node_modules")
|
|
112
|
+
const pathParts = normalizedPath.split("/");
|
|
113
|
+
for (const part of pathParts) {
|
|
114
|
+
if (matchesGlob(part, cleanPattern)) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Check with ** prefix for patterns that should match anywhere
|
|
119
|
+
if (!cleanPattern.includes("/") && !cleanPattern.startsWith("*")) {
|
|
120
|
+
if (matchesGlob(normalizedPath, `**/${cleanPattern}`)) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if a directory name is in the default ignored list.
|
|
129
|
+
*/
|
|
130
|
+
function isDefaultIgnoredDir(dirName) {
|
|
131
|
+
return DEFAULT_IGNORED_DIRS.has(dirName);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Validate and resolve a path to prevent directory traversal.
|
|
135
|
+
* Returns the resolved absolute path if valid, or an error.
|
|
136
|
+
*
|
|
137
|
+
* Security (TR-5):
|
|
138
|
+
* - All paths normalized and validated against project root
|
|
139
|
+
* - Reject paths containing `..` that escape root
|
|
140
|
+
*/
|
|
141
|
+
function validatePath(targetPath, workingDirectory) {
|
|
142
|
+
const rootDir = path.resolve(workingDirectory);
|
|
143
|
+
const resolvedPath = path.resolve(rootDir, targetPath);
|
|
144
|
+
// Security check: ensure resolved path is within root directory
|
|
145
|
+
const normalizedRoot = rootDir.endsWith(path.sep)
|
|
146
|
+
? rootDir
|
|
147
|
+
: rootDir + path.sep;
|
|
148
|
+
const normalizedResolved = resolvedPath + path.sep;
|
|
149
|
+
if (!normalizedResolved.startsWith(normalizedRoot) &&
|
|
150
|
+
resolvedPath !== rootDir) {
|
|
151
|
+
return {
|
|
152
|
+
valid: false,
|
|
153
|
+
error: "Path validation failed: access denied",
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return { valid: true, resolvedPath };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Escape special regex characters in a string for literal matching.
|
|
160
|
+
*/
|
|
161
|
+
function escapeRegex(str) {
|
|
162
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Create a search regex from the query string.
|
|
166
|
+
*/
|
|
167
|
+
function createSearchRegex(query, isRegex, caseSensitive) {
|
|
168
|
+
const pattern = isRegex ? query : escapeRegex(query);
|
|
169
|
+
const flags = caseSensitive ? "g" : "gi";
|
|
170
|
+
return new RegExp(pattern, flags);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Search a single file for matches.
|
|
174
|
+
*/
|
|
175
|
+
async function searchFile(filePath, relativePath, searchRegex, contextLines) {
|
|
176
|
+
const matches = [];
|
|
177
|
+
try {
|
|
178
|
+
// Check file size before reading
|
|
179
|
+
const stats = await fs.stat(filePath);
|
|
180
|
+
if (stats.size > MAX_FILE_SIZE) {
|
|
181
|
+
return matches; // Skip large files
|
|
182
|
+
}
|
|
183
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
184
|
+
const lines = content.split("\n");
|
|
185
|
+
for (let i = 0; i < lines.length; i++) {
|
|
186
|
+
const line = lines[i];
|
|
187
|
+
// Reset regex lastIndex for each line
|
|
188
|
+
searchRegex.lastIndex = 0;
|
|
189
|
+
let match;
|
|
190
|
+
while ((match = searchRegex.exec(line)) !== null) {
|
|
191
|
+
const grepMatch = {
|
|
192
|
+
file: relativePath,
|
|
193
|
+
line: i + 1, // 1-indexed line number
|
|
194
|
+
column: match.index + 1, // 1-indexed column number
|
|
195
|
+
content: line,
|
|
196
|
+
};
|
|
197
|
+
// Add context lines if requested
|
|
198
|
+
if (contextLines > 0) {
|
|
199
|
+
// Context before
|
|
200
|
+
const beforeStart = Math.max(0, i - contextLines);
|
|
201
|
+
if (beforeStart < i) {
|
|
202
|
+
grepMatch.context_before = lines.slice(beforeStart, i);
|
|
203
|
+
}
|
|
204
|
+
// Context after
|
|
205
|
+
const afterEnd = Math.min(lines.length, i + contextLines + 1);
|
|
206
|
+
if (i + 1 < afterEnd) {
|
|
207
|
+
grepMatch.context_after = lines.slice(i + 1, afterEnd);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
matches.push(grepMatch);
|
|
211
|
+
// For non-global regex or to avoid infinite loops on zero-length matches
|
|
212
|
+
if (!searchRegex.global || match[0].length === 0) {
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// Skip files we can't read (binary files, permission issues, etc.)
|
|
220
|
+
}
|
|
221
|
+
return matches;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Recursively search for files and collect matches.
|
|
225
|
+
*/
|
|
226
|
+
async function searchRecursive(currentDir, rootDir, searchRegex, contextLines, options) {
|
|
227
|
+
// Check if we've reached the max results
|
|
228
|
+
if (options.matches.length >= options.maxResults) {
|
|
229
|
+
return { filesSearched: options.filesSearched };
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
233
|
+
for (const entry of entries) {
|
|
234
|
+
// Check max results limit
|
|
235
|
+
if (options.matches.length >= options.maxResults) {
|
|
236
|
+
return { filesSearched: options.filesSearched };
|
|
237
|
+
}
|
|
238
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
239
|
+
const relativePath = path.relative(rootDir, fullPath);
|
|
240
|
+
// Skip default ignored directories (TR-5)
|
|
241
|
+
if (entry.isDirectory() && isDefaultIgnoredDir(entry.name)) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
// Check gitignore patterns
|
|
245
|
+
if (isIgnoredByPatterns(relativePath, options.gitignorePatterns)) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (entry.isDirectory()) {
|
|
249
|
+
// Recurse into subdirectory
|
|
250
|
+
const result = await searchRecursive(fullPath, rootDir, searchRegex, contextLines, options);
|
|
251
|
+
options.filesSearched = result.filesSearched;
|
|
252
|
+
}
|
|
253
|
+
else if (entry.isFile()) {
|
|
254
|
+
// Check if file matches the pattern filter
|
|
255
|
+
const normalizedRelativePath = relativePath.replace(/\\/g, "/");
|
|
256
|
+
if (options.filePattern &&
|
|
257
|
+
!options.filePattern.test(normalizedRelativePath)) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
// Search the file
|
|
261
|
+
options.filesSearched++;
|
|
262
|
+
const fileMatches = await searchFile(fullPath, relativePath, searchRegex, contextLines);
|
|
263
|
+
// Add matches up to the limit
|
|
264
|
+
for (const match of fileMatches) {
|
|
265
|
+
if (options.matches.length >= options.maxResults) {
|
|
266
|
+
break;
|
|
267
|
+
}
|
|
268
|
+
options.matches.push(match);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// Skip directories we can't read (permission issues, etc.)
|
|
275
|
+
}
|
|
276
|
+
return { filesSearched: options.filesSearched };
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Search for text or regex patterns within files.
|
|
280
|
+
*
|
|
281
|
+
* @param args - GrepSearchArgs containing query and options
|
|
282
|
+
* @param context - CodeContext with working directory
|
|
283
|
+
* @returns GrepSearchResult with matching results
|
|
284
|
+
*/
|
|
285
|
+
export async function grepSearch(args, context) {
|
|
286
|
+
const { query, path: basePath = ".", pattern, is_regex = false, case_sensitive = false, context_lines = 0, max_results = DEFAULT_MAX_RESULTS, } = args;
|
|
287
|
+
// Validate query is not empty
|
|
288
|
+
if (!query || query.trim() === "") {
|
|
289
|
+
return {
|
|
290
|
+
success: false,
|
|
291
|
+
matches: [],
|
|
292
|
+
total_matches: 0,
|
|
293
|
+
files_searched: 0,
|
|
294
|
+
truncated: false,
|
|
295
|
+
error: "Search query cannot be empty",
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
// Validate the base path
|
|
299
|
+
const pathValidation = validatePath(basePath, context.workingDirectory);
|
|
300
|
+
if (!pathValidation.valid) {
|
|
301
|
+
return {
|
|
302
|
+
success: false,
|
|
303
|
+
matches: [],
|
|
304
|
+
total_matches: 0,
|
|
305
|
+
files_searched: 0,
|
|
306
|
+
truncated: false,
|
|
307
|
+
error: pathValidation.error,
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
const resolvedBasePath = pathValidation.resolvedPath;
|
|
311
|
+
try {
|
|
312
|
+
// Check if base path exists
|
|
313
|
+
const stats = await fs.stat(resolvedBasePath);
|
|
314
|
+
// Create search regex
|
|
315
|
+
let searchRegex;
|
|
316
|
+
try {
|
|
317
|
+
searchRegex = createSearchRegex(query, is_regex, case_sensitive);
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
return {
|
|
321
|
+
success: false,
|
|
322
|
+
matches: [],
|
|
323
|
+
total_matches: 0,
|
|
324
|
+
files_searched: 0,
|
|
325
|
+
truncated: false,
|
|
326
|
+
error: "Invalid regex pattern",
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
// Create file pattern regex if specified
|
|
330
|
+
let filePattern;
|
|
331
|
+
if (pattern) {
|
|
332
|
+
filePattern = globToRegex(pattern);
|
|
333
|
+
}
|
|
334
|
+
// Parse .gitignore
|
|
335
|
+
const gitignorePath = path.join(context.workingDirectory, ".gitignore");
|
|
336
|
+
const gitignorePatterns = await parseGitignore(gitignorePath);
|
|
337
|
+
const matches = [];
|
|
338
|
+
let filesSearched = 0;
|
|
339
|
+
if (stats.isFile()) {
|
|
340
|
+
// Search single file
|
|
341
|
+
const relativePath = path.relative(context.workingDirectory, resolvedBasePath);
|
|
342
|
+
filesSearched = 1;
|
|
343
|
+
const fileMatches = await searchFile(resolvedBasePath, relativePath, searchRegex, context_lines);
|
|
344
|
+
matches.push(...fileMatches.slice(0, max_results));
|
|
345
|
+
}
|
|
346
|
+
else if (stats.isDirectory()) {
|
|
347
|
+
// Search directory recursively
|
|
348
|
+
const result = await searchRecursive(resolvedBasePath, resolvedBasePath, searchRegex, context_lines, {
|
|
349
|
+
filePattern,
|
|
350
|
+
gitignorePatterns,
|
|
351
|
+
maxResults: max_results + 1, // Get one extra to detect truncation
|
|
352
|
+
matches,
|
|
353
|
+
filesSearched: 0,
|
|
354
|
+
});
|
|
355
|
+
filesSearched = result.filesSearched;
|
|
356
|
+
}
|
|
357
|
+
// Check if results were truncated
|
|
358
|
+
const truncated = matches.length > max_results;
|
|
359
|
+
const finalMatches = truncated ? matches.slice(0, max_results) : matches;
|
|
360
|
+
return {
|
|
361
|
+
success: true,
|
|
362
|
+
matches: finalMatches,
|
|
363
|
+
total_matches: finalMatches.length,
|
|
364
|
+
files_searched: filesSearched,
|
|
365
|
+
truncated,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
// Handle specific error types without exposing sensitive info (TR-5)
|
|
370
|
+
if (error instanceof Error) {
|
|
371
|
+
const nodeError = error;
|
|
372
|
+
if (nodeError.code === "ENOENT") {
|
|
373
|
+
return {
|
|
374
|
+
success: false,
|
|
375
|
+
matches: [],
|
|
376
|
+
total_matches: 0,
|
|
377
|
+
files_searched: 0,
|
|
378
|
+
truncated: false,
|
|
379
|
+
error: "Path not found",
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
if (nodeError.code === "EACCES") {
|
|
383
|
+
return {
|
|
384
|
+
success: false,
|
|
385
|
+
matches: [],
|
|
386
|
+
total_matches: 0,
|
|
387
|
+
files_searched: 0,
|
|
388
|
+
truncated: false,
|
|
389
|
+
error: "Permission denied",
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// Generic error without exposing details (TR-5)
|
|
394
|
+
return {
|
|
395
|
+
success: false,
|
|
396
|
+
matches: [],
|
|
397
|
+
total_matches: 0,
|
|
398
|
+
files_searched: 0,
|
|
399
|
+
truncated: false,
|
|
400
|
+
error: "Failed to search files",
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=grep-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep-search.js","sourceRoot":"","sources":["../../../../../src/lib/local-tools/code/grep-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code analysis tools module.
|
|
3
|
+
* Provides tools for local code analysis, bug finding, and quality checks.
|
|
4
|
+
*/
|
|
5
|
+
// Tool function exports
|
|
6
|
+
export { readFile } from "./read-file.js";
|
|
7
|
+
export { listDirectory } from "./list-directory.js";
|
|
8
|
+
export { searchFiles } from "./search-files.js";
|
|
9
|
+
export { grepSearch } from "./grep-search.js";
|
|
10
|
+
export { runCommand } from "./run-command.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/local-tools/code/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,wBAAwB;AACxB,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAC,WAAW,EAAC,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC"}
|