summaryrefslogtreecommitdiff
path: root/packages/core/src/utils/workspaceContext.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/core/src/utils/workspaceContext.ts')
-rw-r--r--packages/core/src/utils/workspaceContext.ts43
1 files changed, 43 insertions, 0 deletions
diff --git a/packages/core/src/utils/workspaceContext.ts b/packages/core/src/utils/workspaceContext.ts
index 16d1b4c9..efbc8a4c 100644
--- a/packages/core/src/utils/workspaceContext.ts
+++ b/packages/core/src/utils/workspaceContext.ts
@@ -15,6 +15,8 @@ import * as path from 'path';
export class WorkspaceContext {
private directories: Set<string>;
+ private initialDirectories: Set<string>;
+
/**
* Creates a new WorkspaceContext with the given initial directory and optional additional directories.
* @param initialDirectory The initial working directory (usually cwd)
@@ -22,11 +24,14 @@ export class WorkspaceContext {
*/
constructor(initialDirectory: string, additionalDirectories: string[] = []) {
this.directories = new Set<string>();
+ this.initialDirectories = new Set<string>();
this.addDirectoryInternal(initialDirectory);
+ this.addInitialDirectoryInternal(initialDirectory);
for (const dir of additionalDirectories) {
this.addDirectoryInternal(dir);
+ this.addInitialDirectoryInternal(dir);
}
}
@@ -69,6 +74,33 @@ export class WorkspaceContext {
this.directories.add(realPath);
}
+ private addInitialDirectoryInternal(
+ directory: string,
+ basePath: string = process.cwd(),
+ ): void {
+ const absolutePath = path.isAbsolute(directory)
+ ? directory
+ : path.resolve(basePath, directory);
+
+ if (!fs.existsSync(absolutePath)) {
+ throw new Error(`Directory does not exist: ${absolutePath}`);
+ }
+
+ const stats = fs.statSync(absolutePath);
+ if (!stats.isDirectory()) {
+ throw new Error(`Path is not a directory: ${absolutePath}`);
+ }
+
+ let realPath: string;
+ try {
+ realPath = fs.realpathSync(absolutePath);
+ } catch (_error) {
+ throw new Error(`Failed to resolve path: ${absolutePath}`);
+ }
+
+ this.initialDirectories.add(realPath);
+ }
+
/**
* Gets a copy of all workspace directories.
* @returns Array of absolute directory paths
@@ -77,6 +109,17 @@ export class WorkspaceContext {
return Array.from(this.directories);
}
+ getInitialDirectories(): readonly string[] {
+ return Array.from(this.initialDirectories);
+ }
+
+ setDirectories(directories: readonly string[]): void {
+ this.directories.clear();
+ for (const dir of directories) {
+ this.addDirectoryInternal(dir);
+ }
+ }
+
/**
* Checks if a given path is within any of the workspace directories.
* @param pathToCheck The path to validate