@google/gemini-cli-core 0.1.16 → 0.1.17-nightly.250806.805114ae

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 (131) hide show
  1. package/README.md +1 -1
  2. package/dist/google-gemini-cli-core-0.1.17.tgz +0 -0
  3. package/dist/src/config/config.d.ts +5 -4
  4. package/dist/src/config/config.js +43 -12
  5. package/dist/src/config/config.js.map +1 -1
  6. package/dist/src/config/config.test.js +60 -2
  7. package/dist/src/config/config.test.js.map +1 -1
  8. package/dist/src/config/flashFallback.test.js +0 -4
  9. package/dist/src/config/flashFallback.test.js.map +1 -1
  10. package/dist/src/core/coreToolScheduler.d.ts +2 -0
  11. package/dist/src/core/coreToolScheduler.js +3 -1
  12. package/dist/src/core/coreToolScheduler.js.map +1 -1
  13. package/dist/src/core/coreToolScheduler.test.js +4 -0
  14. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  15. package/dist/src/ide/detect-ide.js +6 -3
  16. package/dist/src/ide/detect-ide.js.map +1 -1
  17. package/dist/src/ide/ide-client.d.ts +8 -11
  18. package/dist/src/ide/ide-client.js +55 -58
  19. package/dist/src/ide/ide-client.js.map +1 -1
  20. package/dist/src/ide/ide-installer.d.ts +0 -1
  21. package/dist/src/ide/ide-installer.js +5 -7
  22. package/dist/src/ide/ide-installer.js.map +1 -1
  23. package/dist/src/ide/ide-installer.test.js +1 -24
  24. package/dist/src/ide/ide-installer.test.js.map +1 -1
  25. package/dist/src/index.d.ts +1 -0
  26. package/dist/src/index.js +1 -0
  27. package/dist/src/index.js.map +1 -1
  28. package/dist/src/mcp/oauth-provider.d.ts +1 -0
  29. package/dist/src/mcp/oauth-provider.js +14 -1
  30. package/dist/src/mcp/oauth-provider.js.map +1 -1
  31. package/dist/src/mcp/oauth-provider.test.js +87 -6
  32. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  33. package/dist/src/prompts/prompt-registry.d.ts +8 -0
  34. package/dist/src/prompts/prompt-registry.js +16 -0
  35. package/dist/src/prompts/prompt-registry.js.map +1 -1
  36. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -1
  37. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +14 -1
  38. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  39. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -1
  40. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +5 -0
  41. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  42. package/dist/src/telemetry/constants.d.ts +1 -0
  43. package/dist/src/telemetry/constants.js +1 -0
  44. package/dist/src/telemetry/constants.js.map +1 -1
  45. package/dist/src/telemetry/loggers.d.ts +2 -1
  46. package/dist/src/telemetry/loggers.js +17 -1
  47. package/dist/src/telemetry/loggers.js.map +1 -1
  48. package/dist/src/telemetry/telemetry.test.js +0 -2
  49. package/dist/src/telemetry/telemetry.test.js.map +1 -1
  50. package/dist/src/telemetry/types.d.ts +11 -1
  51. package/dist/src/telemetry/types.js +15 -0
  52. package/dist/src/telemetry/types.js.map +1 -1
  53. package/dist/src/tools/mcp-client.d.ts +1 -1
  54. package/dist/src/tools/mcp-client.js +32 -17
  55. package/dist/src/tools/mcp-client.js.map +1 -1
  56. package/dist/src/tools/mcp-client.test.js +35 -9
  57. package/dist/src/tools/mcp-client.test.js.map +1 -1
  58. package/dist/src/tools/mcp-tool.js +104 -45
  59. package/dist/src/tools/mcp-tool.js.map +1 -1
  60. package/dist/src/tools/mcp-tool.test.js +280 -2
  61. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  62. package/dist/src/tools/modifiable-tool.d.ts +1 -1
  63. package/dist/src/tools/modifiable-tool.js +2 -2
  64. package/dist/src/tools/modifiable-tool.js.map +1 -1
  65. package/dist/src/tools/modifiable-tool.test.js +9 -9
  66. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  67. package/dist/src/tools/read-many-files.js +78 -34
  68. package/dist/src/tools/read-many-files.js.map +1 -1
  69. package/dist/src/tools/read-many-files.test.js +96 -0
  70. package/dist/src/tools/read-many-files.test.js.map +1 -1
  71. package/dist/src/tools/tool-registry.d.ts +1 -0
  72. package/dist/src/tools/tool-registry.js +12 -10
  73. package/dist/src/tools/tool-registry.js.map +1 -1
  74. package/dist/src/tools/tool-registry.test.js +6 -4
  75. package/dist/src/tools/tool-registry.test.js.map +1 -1
  76. package/dist/src/tools/write-file.js +2 -2
  77. package/dist/src/tools/write-file.js.map +1 -1
  78. package/dist/src/tools/write-file.test.js +20 -0
  79. package/dist/src/tools/write-file.test.js.map +1 -1
  80. package/dist/src/utils/editor.d.ts +1 -1
  81. package/dist/src/utils/editor.js +13 -5
  82. package/dist/src/utils/editor.js.map +1 -1
  83. package/dist/src/utils/editor.test.js +38 -6
  84. package/dist/src/utils/editor.test.js.map +1 -1
  85. package/dist/src/utils/fileUtils.js +1 -1
  86. package/dist/src/utils/fileUtils.js.map +1 -1
  87. package/dist/src/utils/fileUtils.test.js +13 -0
  88. package/dist/src/utils/fileUtils.test.js.map +1 -1
  89. package/dist/src/utils/filesearch/crawlCache.d.ts +25 -0
  90. package/dist/src/utils/filesearch/crawlCache.js +54 -0
  91. package/dist/src/utils/filesearch/crawlCache.js.map +1 -0
  92. package/dist/src/utils/filesearch/crawlCache.test.d.ts +6 -0
  93. package/dist/src/utils/filesearch/crawlCache.test.js +93 -0
  94. package/dist/src/utils/filesearch/crawlCache.test.js.map +1 -0
  95. package/dist/src/utils/filesearch/fileSearch.d.ts +79 -0
  96. package/dist/src/utils/filesearch/fileSearch.js +216 -0
  97. package/dist/src/utils/filesearch/fileSearch.js.map +1 -0
  98. package/dist/src/utils/filesearch/fileSearch.test.d.ts +6 -0
  99. package/dist/src/utils/filesearch/fileSearch.test.js +515 -0
  100. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -0
  101. package/dist/src/utils/filesearch/ignore.d.ts +35 -0
  102. package/dist/src/utils/filesearch/ignore.js +81 -0
  103. package/dist/src/utils/filesearch/ignore.js.map +1 -0
  104. package/dist/src/utils/filesearch/ignore.test.d.ts +6 -0
  105. package/dist/src/utils/filesearch/ignore.test.js +57 -0
  106. package/dist/src/utils/filesearch/ignore.test.js.map +1 -0
  107. package/dist/src/utils/filesearch/result-cache.d.ts +34 -0
  108. package/dist/src/utils/filesearch/result-cache.js +61 -0
  109. package/dist/src/utils/filesearch/result-cache.js.map +1 -0
  110. package/dist/src/utils/filesearch/result-cache.test.d.ts +6 -0
  111. package/dist/src/utils/filesearch/result-cache.test.js +47 -0
  112. package/dist/src/utils/filesearch/result-cache.test.js.map +1 -0
  113. package/dist/src/utils/flashFallback.integration.test.js +0 -2
  114. package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
  115. package/dist/src/utils/memoryDiscovery.d.ts +1 -1
  116. package/dist/src/utils/memoryDiscovery.js +18 -6
  117. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  118. package/dist/src/utils/memoryDiscovery.test.js +30 -71
  119. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  120. package/dist/src/utils/paths.d.ts +11 -2
  121. package/dist/src/utils/paths.js +24 -7
  122. package/dist/src/utils/paths.js.map +1 -1
  123. package/dist/src/utils/paths.test.d.ts +6 -0
  124. package/dist/src/utils/paths.test.js +153 -0
  125. package/dist/src/utils/paths.test.js.map +1 -0
  126. package/dist/src/utils/workspaceContext.d.ts +4 -0
  127. package/dist/src/utils/workspaceContext.js +33 -0
  128. package/dist/src/utils/workspaceContext.js.map +1 -1
  129. package/dist/tsconfig.tsbuildinfo +1 -1
  130. package/package.json +5 -1
  131. package/dist/google-gemini-cli-core-0.1.15.tgz +0 -0
@@ -5,6 +5,12 @@
5
5
  */
6
6
  export declare const GEMINI_DIR = ".gemini";
7
7
  export declare const GOOGLE_ACCOUNTS_FILENAME = "google_accounts.json";
8
+ /**
9
+ * Special characters that need to be escaped in file paths for shell compatibility.
10
+ * Includes: spaces, parentheses, brackets, braces, semicolons, ampersands, pipes,
11
+ * asterisks, question marks, dollar signs, backticks, quotes, hash, and other shell metacharacters.
12
+ */
13
+ export declare const SHELL_SPECIAL_CHARS: RegExp;
8
14
  /**
9
15
  * Replaces the home directory with a tilde.
10
16
  * @param path - The path to tildeify.
@@ -27,11 +33,14 @@ export declare function shortenPath(filePath: string, maxLen?: number): string;
27
33
  */
28
34
  export declare function makeRelative(targetPath: string, rootDirectory: string): string;
29
35
  /**
30
- * Escapes spaces in a file path.
36
+ * Escapes special characters in a file path like macOS terminal does.
37
+ * Escapes: spaces, parentheses, brackets, braces, semicolons, ampersands, pipes,
38
+ * asterisks, question marks, dollar signs, backticks, quotes, hash, and other shell metacharacters.
31
39
  */
32
40
  export declare function escapePath(filePath: string): string;
33
41
  /**
34
- * Unescapes spaces in a file path.
42
+ * Unescapes special characters in a file path.
43
+ * Removes backslash escaping from shell metacharacters.
35
44
  */
36
45
  export declare function unescapePath(filePath: string): string;
37
46
  /**
@@ -10,6 +10,12 @@ export const GEMINI_DIR = '.gemini';
10
10
  export const GOOGLE_ACCOUNTS_FILENAME = 'google_accounts.json';
11
11
  const TMP_DIR_NAME = 'tmp';
12
12
  const COMMANDS_DIR_NAME = 'commands';
13
+ /**
14
+ * Special characters that need to be escaped in file paths for shell compatibility.
15
+ * Includes: spaces, parentheses, brackets, braces, semicolons, ampersands, pipes,
16
+ * asterisks, question marks, dollar signs, backticks, quotes, hash, and other shell metacharacters.
17
+ */
18
+ export const SHELL_SPECIAL_CHARS = /[ \t()[\]{};|*?$`'"#&<>!~]/;
13
19
  /**
14
20
  * Replaces the home directory with a tilde.
15
21
  * @param path - The path to tildeify.
@@ -97,26 +103,37 @@ export function makeRelative(targetPath, rootDirectory) {
97
103
  return relativePath || '.';
98
104
  }
99
105
  /**
100
- * Escapes spaces in a file path.
106
+ * Escapes special characters in a file path like macOS terminal does.
107
+ * Escapes: spaces, parentheses, brackets, braces, semicolons, ampersands, pipes,
108
+ * asterisks, question marks, dollar signs, backticks, quotes, hash, and other shell metacharacters.
101
109
  */
102
110
  export function escapePath(filePath) {
103
111
  let result = '';
104
112
  for (let i = 0; i < filePath.length; i++) {
105
- // Only escape spaces that are not already escaped.
106
- if (filePath[i] === ' ' && (i === 0 || filePath[i - 1] !== '\\')) {
107
- result += '\\ ';
113
+ const char = filePath[i];
114
+ // Count consecutive backslashes before this character
115
+ let backslashCount = 0;
116
+ for (let j = i - 1; j >= 0 && filePath[j] === '\\'; j--) {
117
+ backslashCount++;
118
+ }
119
+ // Character is already escaped if there's an odd number of backslashes before it
120
+ const isAlreadyEscaped = backslashCount % 2 === 1;
121
+ // Only escape if not already escaped
122
+ if (!isAlreadyEscaped && SHELL_SPECIAL_CHARS.test(char)) {
123
+ result += '\\' + char;
108
124
  }
109
125
  else {
110
- result += filePath[i];
126
+ result += char;
111
127
  }
112
128
  }
113
129
  return result;
114
130
  }
115
131
  /**
116
- * Unescapes spaces in a file path.
132
+ * Unescapes special characters in a file path.
133
+ * Removes backslash escaping from shell metacharacters.
117
134
  */
118
135
  export function unescapePath(filePath) {
119
- return filePath.replace(/\\ /g, ' ');
136
+ return filePath.replace(new RegExp(`\\\\([${SHELL_SPECIAL_CHARS.source.slice(1, -1)}])`, 'g'), '$1');
120
137
  }
121
138
  /**
122
139
  * Generates a unique hash for a project based on its root path.
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,153 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { escapePath, unescapePath } from './paths.js';
8
+ describe('escapePath', () => {
9
+ it('should escape spaces', () => {
10
+ expect(escapePath('my file.txt')).toBe('my\\ file.txt');
11
+ });
12
+ it('should escape tabs', () => {
13
+ expect(escapePath('file\twith\ttabs.txt')).toBe('file\\\twith\\\ttabs.txt');
14
+ });
15
+ it('should escape parentheses', () => {
16
+ expect(escapePath('file(1).txt')).toBe('file\\(1\\).txt');
17
+ });
18
+ it('should escape square brackets', () => {
19
+ expect(escapePath('file[backup].txt')).toBe('file\\[backup\\].txt');
20
+ });
21
+ it('should escape curly braces', () => {
22
+ expect(escapePath('file{temp}.txt')).toBe('file\\{temp\\}.txt');
23
+ });
24
+ it('should escape semicolons', () => {
25
+ expect(escapePath('file;name.txt')).toBe('file\\;name.txt');
26
+ });
27
+ it('should escape ampersands', () => {
28
+ expect(escapePath('file&name.txt')).toBe('file\\&name.txt');
29
+ });
30
+ it('should escape pipes', () => {
31
+ expect(escapePath('file|name.txt')).toBe('file\\|name.txt');
32
+ });
33
+ it('should escape asterisks', () => {
34
+ expect(escapePath('file*.txt')).toBe('file\\*.txt');
35
+ });
36
+ it('should escape question marks', () => {
37
+ expect(escapePath('file?.txt')).toBe('file\\?.txt');
38
+ });
39
+ it('should escape dollar signs', () => {
40
+ expect(escapePath('file$name.txt')).toBe('file\\$name.txt');
41
+ });
42
+ it('should escape backticks', () => {
43
+ expect(escapePath('file`name.txt')).toBe('file\\`name.txt');
44
+ });
45
+ it('should escape single quotes', () => {
46
+ expect(escapePath("file'name.txt")).toBe("file\\'name.txt");
47
+ });
48
+ it('should escape double quotes', () => {
49
+ expect(escapePath('file"name.txt')).toBe('file\\"name.txt');
50
+ });
51
+ it('should escape hash symbols', () => {
52
+ expect(escapePath('file#name.txt')).toBe('file\\#name.txt');
53
+ });
54
+ it('should escape exclamation marks', () => {
55
+ expect(escapePath('file!name.txt')).toBe('file\\!name.txt');
56
+ });
57
+ it('should escape tildes', () => {
58
+ expect(escapePath('file~name.txt')).toBe('file\\~name.txt');
59
+ });
60
+ it('should escape less than and greater than signs', () => {
61
+ expect(escapePath('file<name>.txt')).toBe('file\\<name\\>.txt');
62
+ });
63
+ it('should handle multiple special characters', () => {
64
+ expect(escapePath('my file (backup) [v1.2].txt')).toBe('my\\ file\\ \\(backup\\)\\ \\[v1.2\\].txt');
65
+ });
66
+ it('should not double-escape already escaped characters', () => {
67
+ expect(escapePath('my\\ file.txt')).toBe('my\\ file.txt');
68
+ expect(escapePath('file\\(name\\).txt')).toBe('file\\(name\\).txt');
69
+ });
70
+ it('should handle escaped backslashes correctly', () => {
71
+ // Double backslash (escaped backslash) followed by space should escape the space
72
+ expect(escapePath('path\\\\ file.txt')).toBe('path\\\\\\ file.txt');
73
+ // Triple backslash (escaped backslash + escaping backslash) followed by space should not double-escape
74
+ expect(escapePath('path\\\\\\ file.txt')).toBe('path\\\\\\ file.txt');
75
+ // Quadruple backslash (two escaped backslashes) followed by space should escape the space
76
+ expect(escapePath('path\\\\\\\\ file.txt')).toBe('path\\\\\\\\\\ file.txt');
77
+ });
78
+ it('should handle complex escaped backslash scenarios', () => {
79
+ // Escaped backslash before special character that needs escaping
80
+ expect(escapePath('file\\\\(test).txt')).toBe('file\\\\\\(test\\).txt');
81
+ // Multiple escaped backslashes
82
+ expect(escapePath('path\\\\\\\\with space.txt')).toBe('path\\\\\\\\with\\ space.txt');
83
+ });
84
+ it('should handle paths without special characters', () => {
85
+ expect(escapePath('normalfile.txt')).toBe('normalfile.txt');
86
+ expect(escapePath('path/to/normalfile.txt')).toBe('path/to/normalfile.txt');
87
+ });
88
+ it('should handle complex real-world examples', () => {
89
+ expect(escapePath('My Documents/Project (2024)/file [backup].txt')).toBe('My\\ Documents/Project\\ \\(2024\\)/file\\ \\[backup\\].txt');
90
+ expect(escapePath('file with $special &chars!.txt')).toBe('file\\ with\\ \\$special\\ \\&chars\\!.txt');
91
+ });
92
+ it('should handle empty strings', () => {
93
+ expect(escapePath('')).toBe('');
94
+ });
95
+ it('should handle paths with only special characters', () => {
96
+ expect(escapePath(' ()[]{};&|*?$`\'"#!~<>')).toBe('\\ \\(\\)\\[\\]\\{\\}\\;\\&\\|\\*\\?\\$\\`\\\'\\"\\#\\!\\~\\<\\>');
97
+ });
98
+ });
99
+ describe('unescapePath', () => {
100
+ it('should unescape spaces', () => {
101
+ expect(unescapePath('my\\ file.txt')).toBe('my file.txt');
102
+ });
103
+ it('should unescape tabs', () => {
104
+ expect(unescapePath('file\\\twith\\\ttabs.txt')).toBe('file\twith\ttabs.txt');
105
+ });
106
+ it('should unescape parentheses', () => {
107
+ expect(unescapePath('file\\(1\\).txt')).toBe('file(1).txt');
108
+ });
109
+ it('should unescape square brackets', () => {
110
+ expect(unescapePath('file\\[backup\\].txt')).toBe('file[backup].txt');
111
+ });
112
+ it('should unescape curly braces', () => {
113
+ expect(unescapePath('file\\{temp\\}.txt')).toBe('file{temp}.txt');
114
+ });
115
+ it('should unescape multiple special characters', () => {
116
+ expect(unescapePath('my\\ file\\ \\(backup\\)\\ \\[v1.2\\].txt')).toBe('my file (backup) [v1.2].txt');
117
+ });
118
+ it('should handle paths without escaped characters', () => {
119
+ expect(unescapePath('normalfile.txt')).toBe('normalfile.txt');
120
+ expect(unescapePath('path/to/normalfile.txt')).toBe('path/to/normalfile.txt');
121
+ });
122
+ it('should handle all special characters', () => {
123
+ expect(unescapePath('\\ \\(\\)\\[\\]\\{\\}\\;\\&\\|\\*\\?\\$\\`\\\'\\"\\#\\!\\~\\<\\>')).toBe(' ()[]{};&|*?$`\'"#!~<>');
124
+ });
125
+ it('should be the inverse of escapePath', () => {
126
+ const testCases = [
127
+ 'my file.txt',
128
+ 'file(1).txt',
129
+ 'file[backup].txt',
130
+ 'My Documents/Project (2024)/file [backup].txt',
131
+ 'file with $special &chars!.txt',
132
+ ' ()[]{};&|*?$`\'"#!~<>',
133
+ 'file\twith\ttabs.txt',
134
+ ];
135
+ testCases.forEach((testCase) => {
136
+ expect(unescapePath(escapePath(testCase))).toBe(testCase);
137
+ });
138
+ });
139
+ it('should handle empty strings', () => {
140
+ expect(unescapePath('')).toBe('');
141
+ });
142
+ it('should not affect backslashes not followed by special characters', () => {
143
+ expect(unescapePath('file\\name.txt')).toBe('file\\name.txt');
144
+ expect(unescapePath('path\\to\\file.txt')).toBe('path\\to\\file.txt');
145
+ });
146
+ it('should handle escaped backslashes in unescaping', () => {
147
+ // Should correctly unescape when there are escaped backslashes
148
+ expect(unescapePath('path\\\\\\ file.txt')).toBe('path\\\\ file.txt');
149
+ expect(unescapePath('path\\\\\\\\\\ file.txt')).toBe('path\\\\\\\\ file.txt');
150
+ expect(unescapePath('file\\\\\\(test\\).txt')).toBe('file\\\\(test).txt');
151
+ });
152
+ });
153
+ //# sourceMappingURL=paths.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../src/utils/paths.test.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@
10
10
  */
11
11
  export declare class WorkspaceContext {
12
12
  private directories;
13
+ private initialDirectories;
13
14
  /**
14
15
  * Creates a new WorkspaceContext with the given initial directory and optional additional directories.
15
16
  * @param initialDirectory The initial working directory (usually cwd)
@@ -26,11 +27,14 @@ export declare class WorkspaceContext {
26
27
  * Internal method to add a directory with validation.
27
28
  */
28
29
  private addDirectoryInternal;
30
+ private addInitialDirectoryInternal;
29
31
  /**
30
32
  * Gets a copy of all workspace directories.
31
33
  * @returns Array of absolute directory paths
32
34
  */
33
35
  getDirectories(): readonly string[];
36
+ getInitialDirectories(): readonly string[];
37
+ setDirectories(directories: readonly string[]): void;
34
38
  /**
35
39
  * Checks if a given path is within any of the workspace directories.
36
40
  * @param pathToCheck The path to validate
@@ -12,6 +12,7 @@ import * as path from 'path';
12
12
  */
13
13
  export class WorkspaceContext {
14
14
  directories;
15
+ initialDirectories;
15
16
  /**
16
17
  * Creates a new WorkspaceContext with the given initial directory and optional additional directories.
17
18
  * @param initialDirectory The initial working directory (usually cwd)
@@ -19,9 +20,12 @@ export class WorkspaceContext {
19
20
  */
20
21
  constructor(initialDirectory, additionalDirectories = []) {
21
22
  this.directories = new Set();
23
+ this.initialDirectories = new Set();
22
24
  this.addDirectoryInternal(initialDirectory);
25
+ this.addInitialDirectoryInternal(initialDirectory);
23
26
  for (const dir of additionalDirectories) {
24
27
  this.addDirectoryInternal(dir);
28
+ this.addInitialDirectoryInternal(dir);
25
29
  }
26
30
  }
27
31
  /**
@@ -55,6 +59,26 @@ export class WorkspaceContext {
55
59
  }
56
60
  this.directories.add(realPath);
57
61
  }
62
+ addInitialDirectoryInternal(directory, basePath = process.cwd()) {
63
+ const absolutePath = path.isAbsolute(directory)
64
+ ? directory
65
+ : path.resolve(basePath, directory);
66
+ if (!fs.existsSync(absolutePath)) {
67
+ throw new Error(`Directory does not exist: ${absolutePath}`);
68
+ }
69
+ const stats = fs.statSync(absolutePath);
70
+ if (!stats.isDirectory()) {
71
+ throw new Error(`Path is not a directory: ${absolutePath}`);
72
+ }
73
+ let realPath;
74
+ try {
75
+ realPath = fs.realpathSync(absolutePath);
76
+ }
77
+ catch (_error) {
78
+ throw new Error(`Failed to resolve path: ${absolutePath}`);
79
+ }
80
+ this.initialDirectories.add(realPath);
81
+ }
58
82
  /**
59
83
  * Gets a copy of all workspace directories.
60
84
  * @returns Array of absolute directory paths
@@ -62,6 +86,15 @@ export class WorkspaceContext {
62
86
  getDirectories() {
63
87
  return Array.from(this.directories);
64
88
  }
89
+ getInitialDirectories() {
90
+ return Array.from(this.initialDirectories);
91
+ }
92
+ setDirectories(directories) {
93
+ this.directories.clear();
94
+ for (const dir of directories) {
95
+ this.addDirectoryInternal(dir);
96
+ }
97
+ }
65
98
  /**
66
99
  * Checks if a given path is within any of the workspace directories.
67
100
  * @param pathToCheck The path to validate
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceContext.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspaceContext.js","sourceRoot":"","sources":["../../../src/utils/workspaceContext.ts"],"names":[],"mappings":"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"}