openpencil/apps/desktop/git/__tests__/test-helpers.ts
Kayshen-X a7d73ebb62 feat(ai): pencil-style agentic design tool-loop, multi-chat tabs, #27 panel restyle
Built-in design generation now runs as an agentic MCP tool-loop (reusing the
agent-rs BuiltInProvider), gated behind OPENPENCIL_DESIGN_AGENT_LOOP / the
Settings experimental toggle; the orchestrator stays the default.

- design-agent system prompt + in-process design toolset (parity-locked with
  the MCP surface) + flag-gated Intent::Design routing
- spawn_agents execution as sequential sub-loops + live creation-mode badges
  (per-agent glow + 'N/M designing...' header)
- new MCP tools: get_guidelines, ToolSearch, get_screenshot, get_editor_state,
  export_nodes, spawn_agents; style-guide local audit
- #27 AI panel restyle: rounded tool cards + green check-rings, gray user
  bubbles, model-pill bottom toolbar, header, empty-state pills, the
  PARALLEL AGENTS (agent_team_size) 1x-6x chip dropdown
- multi-chat tabs: ChatSessions model (Deref-to-active) + tab row UI
  (switch / close / + / Cmd+T) with each run bound to its tab

Large checkpoint commit spanning the working tree (Rust shell crates).
2026-07-02 21:21:06 +08:00

52 lines
1.5 KiB
TypeScript

// apps/desktop/git/__tests__/test-helpers.ts
//
// Shared test utilities for the desktop git layer tests. Each test creates
// a fresh temp dir, runs its operation, and cleans up via the returned
// disposer. This keeps tests isolated and parallel-safe.
import { mkdtemp, rm, writeFile, mkdir } from 'node:fs/promises';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
/**
* Create a fresh temp directory under the OS temp path. Returns the path
* and a disposer that recursively removes it. Always pair the call with
* `try { ... } finally { await dispose(); }`.
*/
export async function mkTempDir(prefix = 'op-git-test-'): Promise<{
dir: string;
dispose: () => Promise<void>;
}> {
const dir = await mkdtemp(join(tmpdir(), prefix));
return {
dir,
dispose: async () => {
await rm(dir, { recursive: true, force: true });
},
};
}
/**
* Write a stub `.op` file (a tiny PenDocument JSON) into a directory.
* Returns the absolute file path.
*/
export async function writeOpFile(
dir: string,
name: string,
content: object = { version: '1.0.0', children: [] },
): Promise<string> {
const path = join(dir, name);
await writeFile(path, JSON.stringify(content), 'utf-8');
return path;
}
/**
* Create a nested directory structure under a temp root.
* Useful for setting up "file inside parent git repo" scenarios.
*/
export async function mkSubdir(root: string, ...segments: string[]): Promise<string> {
const dir = join(root, ...segments);
await mkdir(dir, { recursive: true });
return dir;
}