Fix: Allow directory creation outside workspace in Add Project modal (#256)

This commit is contained in:
Nelson Pires
2026-01-31 22:36:10 +02:00
committed by GitHub
parent 0b12678f24
commit 5bb2c56bc0
4 changed files with 26 additions and 10 deletions
+1
View File
@@ -26,3 +26,4 @@ local-dev*
*.njsproj
*.sln
*.sw?
.opencode/plans/*
@@ -582,7 +582,7 @@ export const DirectoryTree: React.FC<DirectoryTreeProps> = ({
const fullPath = `${creatingInPath}/${dirName}`;
try {
await opencodeClient.createDirectory(fullPath);
await opencodeClient.createDirectory(fullPath, { allowOutsideWorkspace: true });
const children = await loadDirectory(creatingInPath);
const updateItems = (items: DirectoryItem[]): DirectoryItem[] => {
+10 -2
View File
@@ -1752,7 +1752,10 @@ class OpencodeService {
}
// File System Operations
async createDirectory(dirPath: string): Promise<{ success: boolean; path: string }> {
async createDirectory(
dirPath: string,
options?: { allowOutsideWorkspace?: boolean }
): Promise<{ success: boolean; path: string }> {
const desktopFiles = getDesktopFilesApi();
if (desktopFiles?.createDirectory) {
try {
@@ -1763,12 +1766,17 @@ class OpencodeService {
}
}
const payload = {
path: dirPath,
...(options?.allowOutsideWorkspace ? { allowOutsideWorkspace: true } : {}),
};
const response = await fetch(`${this.baseUrl}/fs/mkdir`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ path: dirPath }),
body: JSON.stringify(payload),
});
if (!response.ok) {
+14 -7
View File
@@ -6151,20 +6151,27 @@ async function main(options = {}) {
app.post('/api/fs/mkdir', async (req, res) => {
try {
const { path: dirPath } = req.body;
const { path: dirPath, allowOutsideWorkspace } = req.body ?? {};
if (!dirPath) {
if (typeof dirPath !== 'string' || !dirPath.trim()) {
return res.status(400).json({ error: 'Path is required' });
}
const resolved = await resolveWorkspacePathFromContext(req, dirPath);
if (!resolved.ok) {
return res.status(400).json({ error: resolved.error });
let resolvedPath = '';
if (allowOutsideWorkspace) {
resolvedPath = path.resolve(normalizeDirectoryPath(dirPath));
} else {
const resolved = await resolveWorkspacePathFromContext(req, dirPath);
if (!resolved.ok) {
return res.status(400).json({ error: resolved.error });
}
resolvedPath = resolved.resolved;
}
await fsPromises.mkdir(resolved.resolved, { recursive: true });
await fsPromises.mkdir(resolvedPath, { recursive: true });
res.json({ success: true, path: resolved.resolved });
res.json({ success: true, path: resolvedPath });
} catch (error) {
console.error('Failed to create directory:', error);
res.status(500).json({ error: error.message || 'Failed to create directory' });