Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/chatSessions/claude/node/claudeProjectFolders.ts
13405 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { IWorkspaceService } from '../../../../platform/workspace/common/workspaceService';
7
import { URI } from '../../../../util/vs/base/common/uri';
8
import { IFolderRepositoryManager } from '../../../chatSessions/common/folderRepositoryManager';
9
10
// #region Slug Computation
11
12
/**
13
* Compute the workspace slug from a folder URI.
14
* Matches the Claude Code slug format.
15
*
16
* @example
17
* // Windows: drive letter is uppercased, path separators become hyphens
18
* '/c:/Users/test/project' → 'C--Users-test-project'
19
*
20
* // macOS/Linux: leading slash becomes hyphen, path separators become hyphens
21
* '/Users/test/project' → '-Users-test-project'
22
*/
23
export function computeFolderSlug(folderUri: URI): string {
24
return folderUri.path
25
.replace(/^\/([a-z]):/i, (_, driveLetter: string) => driveLetter.toUpperCase() + '-')
26
.replace(/[\/ .]/g, '-');
27
}
28
29
// #endregion
30
31
// #region Project Folder Discovery
32
33
export interface ProjectFolder {
34
readonly slug: string;
35
readonly folderUri: URI;
36
}
37
38
/**
39
* Get the project directory slugs to scan for sessions, along with their
40
* original folder URIs (needed for badge display).
41
*
42
* - Single-root: slug for that one folder
43
* - Multi-root: slug for every workspace folder
44
* - Empty workspace: slug for every folder known to the folder repository manager
45
*/
46
export async function getProjectFolders(
47
workspace: IWorkspaceService,
48
folderRepositoryManager: IFolderRepositoryManager
49
): Promise<ProjectFolder[]> {
50
const folders = workspace.getWorkspaceFolders();
51
52
if (folders.length > 0) {
53
return folders.map(folder => ({ slug: computeFolderSlug(folder), folderUri: folder }));
54
}
55
56
// Empty workspace: use all known folders from the folder repository manager
57
const mruEntries = await folderRepositoryManager.getFolderMRU();
58
if (mruEntries.length > 0) {
59
return mruEntries.map(entry => ({ slug: computeFolderSlug(entry.folder), folderUri: entry.folder }));
60
}
61
62
return [];
63
}
64
65
// #endregion
66
67