import { describe, expect, it } from 'bun:test'; import { mkdtempSync, rmSync } from 'node:fs'; import { join } from 'node:path'; import { tmpdir } from 'node:os'; async function runCli(argv: string[]): Promise<{ code: number; stdout: string; stderr: string }> { const home = mkdtempSync(join(tmpdir(), 'shard-worktree-cli-')); try { const proc = Bun.spawn(['bun', 'src/cli/index.ts', ...argv], { cwd: process.cwd(), env: { ...process.env, HOME: home, XDG_CONFIG_HOME: join(home, '.config'), SHARD_SKIP_WEB_BUILD: '1', } as Record, stdout: 'pipe', stderr: 'pipe', }); const [code, stdout, stderr] = await Promise.all([ proc.exited, new Response(proc.stdout).text(), new Response(proc.stderr).text(), ]); return { code, stdout, stderr }; } finally { rmSync(home, { recursive: true, force: true }); } } describe('worktree CLI top-level dispatch', () => { it('routes `shard new --help` before provider/config resolution', async () => { const result = await runCli(['new', '--help']); expect(result.code).toBe(0); expect(result.stderr).toContain('Usage: shard new --worktree'); expect(result.stderr).not.toContain('config'); }); it('routes `shard worktree --help` before provider/config resolution', async () => { const result = await runCli(['worktree', '--help']); expect(result.code).toBe(0); expect(result.stderr).toContain('Usage: shard worktree '); }); it('reports an unavailable daemon for managed worktree creation', async () => { const result = await runCli(['new', '--worktree']); expect(result.code).toBe(2); expect(result.stderr).toContain('daemon is not running'); }); it('reports an unavailable daemon for repository-scoped listing', async () => { const result = await runCli(['worktree', 'list']); expect(result.code).toBe(2); expect(result.stderr).toContain('daemon is not running'); }); });