manager.ts

 1import { mkdtemp, rm, chmod } from "node:fs/promises";
 2import { tmpdir } from "node:os";
 3import { join } from "node:path";
 4import { WorkspaceError } from "../util/errors.js";
 5
 6export interface Workspace {
 7  path: string;
 8  cleanup: () => Promise<void>;
 9}
10
11export interface WorkspaceOptions {
12  cleanup: boolean;
13}
14
15export async function createWorkspace(options: WorkspaceOptions): Promise<Workspace> {
16  try {
17    const root = await mkdtemp(join(tmpdir(), "rumilo-"));
18    await chmod(root, 0o700);
19
20    const cleanup = async () => {
21      if (!options.cleanup) return;
22      await rm(root, { recursive: true, force: true });
23    };
24
25    return { path: root, cleanup };
26  } catch (error) {
27    throw new WorkspaceError(`Failed to create workspace: ${String(error)}`);
28  }
29}