@timetotest/cli 0.2.4 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +49 -40
  2. package/dist/bin/ttt.js +0 -2
  3. package/dist/bin/ttt.js.map +1 -1
  4. package/dist/package.json +8 -3
  5. package/dist/src/commands/chat/ChatApp.js +249 -67
  6. package/dist/src/commands/chat/ChatApp.js.map +1 -1
  7. package/dist/src/commands/chat/OnboardingApp.js +49 -0
  8. package/dist/src/commands/chat/OnboardingApp.js.map +1 -0
  9. package/dist/src/commands/chat/components/Banner.js +1 -1
  10. package/dist/src/commands/chat/components/Banner.js.map +1 -1
  11. package/dist/src/commands/chat/components/ChatInput.js +61 -22
  12. package/dist/src/commands/chat/components/ChatInput.js.map +1 -1
  13. package/dist/src/commands/chat/components/ChatMessage.js +102 -0
  14. package/dist/src/commands/chat/components/ChatMessage.js.map +1 -0
  15. package/dist/src/commands/chat/components/MessageBubble.js +1 -1
  16. package/dist/src/commands/chat/components/MessageBubble.js.map +1 -1
  17. package/dist/src/commands/chat/components/PermissionPrompt.js +92 -0
  18. package/dist/src/commands/chat/components/PermissionPrompt.js.map +1 -0
  19. package/dist/src/commands/chat/components/StatusIndicator.js +21 -5
  20. package/dist/src/commands/chat/components/StatusIndicator.js.map +1 -1
  21. package/dist/src/commands/chat/components/ToolCallDisplay.js +141 -0
  22. package/dist/src/commands/chat/components/ToolCallDisplay.js.map +1 -0
  23. package/dist/src/commands/chat-ink.js +328 -93
  24. package/dist/src/commands/chat-ink.js.map +1 -1
  25. package/dist/src/commands/login.js +5 -5
  26. package/dist/src/commands/login.js.map +1 -1
  27. package/dist/src/commands/test.js +14 -291
  28. package/dist/src/commands/test.js.map +1 -1
  29. package/dist/src/lib/__tests__/code-mode-integration.test.js +381 -0
  30. package/dist/src/lib/__tests__/code-mode-integration.test.js.map +1 -0
  31. package/dist/src/lib/__tests__/config-manager.test.js +81 -0
  32. package/dist/src/lib/__tests__/config-manager.test.js.map +1 -0
  33. package/dist/src/lib/__tests__/mode-persistence-integration.test.js +75 -0
  34. package/dist/src/lib/__tests__/mode-persistence-integration.test.js.map +1 -0
  35. package/dist/src/lib/__tests__/permission-flow-integration.test.js +145 -0
  36. package/dist/src/lib/__tests__/permission-flow-integration.test.js.map +1 -0
  37. package/dist/src/lib/__tests__/permissions.test.js +132 -0
  38. package/dist/src/lib/__tests__/permissions.test.js.map +1 -0
  39. package/dist/src/lib/agent-orchestrator.js +259 -5
  40. package/dist/src/lib/agent-orchestrator.js.map +1 -1
  41. package/dist/src/lib/config.js +40 -0
  42. package/dist/src/lib/config.js.map +1 -1
  43. package/dist/src/lib/context-compactor.js +310 -0
  44. package/dist/src/lib/context-compactor.js.map +1 -0
  45. package/dist/src/lib/http.js +8 -0
  46. package/dist/src/lib/http.js.map +1 -1
  47. package/dist/src/lib/local-tools/code/__tests__/grep-search.test.js +146 -0
  48. package/dist/src/lib/local-tools/code/__tests__/grep-search.test.js.map +1 -0
  49. package/dist/src/lib/local-tools/code/__tests__/list-directory.test.js +192 -0
  50. package/dist/src/lib/local-tools/code/__tests__/list-directory.test.js.map +1 -0
  51. package/dist/src/lib/local-tools/code/__tests__/read-file.test.js +169 -0
  52. package/dist/src/lib/local-tools/code/__tests__/read-file.test.js.map +1 -0
  53. package/dist/src/lib/local-tools/code/__tests__/run-command.test.js +101 -0
  54. package/dist/src/lib/local-tools/code/__tests__/run-command.test.js.map +1 -0
  55. package/dist/src/lib/local-tools/code/__tests__/search-files.test.js +191 -0
  56. package/dist/src/lib/local-tools/code/__tests__/search-files.test.js.map +1 -0
  57. package/dist/src/lib/local-tools/code/grep-search.js +404 -0
  58. package/dist/src/lib/local-tools/code/grep-search.js.map +1 -0
  59. package/dist/src/lib/local-tools/code/index.js +11 -0
  60. package/dist/src/lib/local-tools/code/index.js.map +1 -0
  61. package/dist/src/lib/local-tools/code/list-directory.js +276 -0
  62. package/dist/src/lib/local-tools/code/list-directory.js.map +1 -0
  63. package/dist/src/lib/local-tools/code/read-file.js +301 -0
  64. package/dist/src/lib/local-tools/code/read-file.js.map +1 -0
  65. package/dist/src/lib/local-tools/code/run-command.js +235 -0
  66. package/dist/src/lib/local-tools/code/run-command.js.map +1 -0
  67. package/dist/src/lib/local-tools/code/search-files.js +297 -0
  68. package/dist/src/lib/local-tools/code/search-files.js.map +1 -0
  69. package/dist/src/lib/local-tools/code/types.js +6 -0
  70. package/dist/src/lib/local-tools/code/types.js.map +1 -0
  71. package/dist/src/lib/permissions.js +94 -0
  72. package/dist/src/lib/permissions.js.map +1 -0
  73. package/dist/src/lib/prompts/builder.js +13 -10
  74. package/dist/src/lib/prompts/builder.js.map +1 -1
  75. package/dist/src/lib/prompts/templates.js +78 -0
  76. package/dist/src/lib/prompts/templates.js.map +1 -1
  77. package/dist/src/lib/session-manager.js.map +1 -1
  78. package/dist/src/lib/testing-mode.js +2 -2
  79. package/dist/src/lib/testing-mode.js.map +1 -1
  80. package/dist/src/lib/tool-executor.js +131 -2
  81. package/dist/src/lib/tool-executor.js.map +1 -1
  82. package/dist/src/lib/tool-registry.js +171 -3
  83. package/dist/src/lib/tool-registry.js.map +1 -1
  84. package/dist/src/lib/tool-result-pruner.js +4 -4
  85. package/dist/src/lib/tool-result-pruner.js.map +1 -1
  86. package/dist/src/lib/tui/ink/components/AppFrame.js +17 -0
  87. package/dist/src/lib/tui/ink/components/AppFrame.js.map +1 -0
  88. package/dist/src/lib/tui/ink/components/CommandPalette.js +24 -0
  89. package/dist/src/lib/tui/ink/components/CommandPalette.js.map +1 -0
  90. package/dist/src/lib/tui/ink/components/Pill.js +19 -0
  91. package/dist/src/lib/tui/ink/components/Pill.js.map +1 -0
  92. package/dist/src/lib/tui/ink/components/TimetoTestLogo.js +30 -0
  93. package/dist/src/lib/tui/ink/components/TimetoTestLogo.js.map +1 -0
  94. package/dist/src/lib/tui/ink/theme.js +13 -6
  95. package/dist/src/lib/tui/ink/theme.js.map +1 -1
  96. package/dist/src/lib/tui/interactive-chat.js +35 -35
  97. package/dist/src/lib/tui/interactive-chat.js.map +1 -1
  98. package/dist/src/lib/tui/print.js +18 -18
  99. package/dist/src/lib/tui/print.js.map +1 -1
  100. package/dist/src/lib/tui/prompt.js +3 -3
  101. package/dist/src/lib/tui/prompt.js.map +1 -1
  102. package/dist/src/lib/tui/status.js +1 -1
  103. package/dist/src/lib/tui/status.js.map +1 -1
  104. package/dist/src/lib/update.js +10 -10
  105. package/dist/src/lib/update.js.map +1 -1
  106. package/package.json +8 -3
  107. package/dist/src/commands/start-test.js +0 -180
  108. package/dist/src/commands/start-test.js.map +0 -1
  109. package/dist/src/commands/stream/StreamApp.js +0 -127
  110. package/dist/src/commands/stream/StreamApp.js.map +0 -1
  111. package/dist/src/commands/stream.js +0 -52
  112. package/dist/src/commands/stream.js.map +0 -1
  113. package/dist/src/commands/test/TestRunApp.js +0 -183
  114. package/dist/src/commands/test/TestRunApp.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":"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"}
@@ -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"}