Files
cfw-autumn/scripts/dw/helpers/git.ts
amianthus 25e920bbd3 feat(dw): 🎸 parallel agent worktrees with isolated infra + test harness
bun dw spins up a fully isolated per-worktree dev stack: Neon DB branch,
Dragonfly + ElasticMQ via docker compose, portless aliases, tmux
session, and emulate.dev Google OAuth. Workers, dev server, vite,
checkout, and stripe-listen run as concurrently siblings. bun setup-test
auto-runs on first dw and seeds unit-test-org via
clearOrg+setupOrg+ensureDefaultStripeAccount with 13 features + team
invites for all 5 useautumn.com members. Hardcoded localhost URLs in
test scenarios now read AUTUMN_TEST_BASE_URL/AUTUMN_TEST_VITE_URL.
preload-env.ts loads .env.local so bun t/cm/setup-test route to the
worktree server. 1265-line scripts/dw.ts split into scripts/dw/ module
(index + commands + helpers). server/src/db/initDrizzle.ts reverted to
upstream (search_path concerns solved by per-branch Neon isolation).
Workers enabled in agent worktrees now that SQS is per-worktree via
ElasticMQ.
2026-05-16 02:02:43 +01:00

27 lines
716 B
TypeScript

import { sh, fatal } from "./shell.ts";
import { PROJECT_ROOT } from "../constants.ts";
export function getWorktreeList(): string[] {
const res = sh("git", ["worktree", "list", "--porcelain"], {
cwd: PROJECT_ROOT,
});
if (res.code !== 0) return [];
return res.stdout
.split("\n")
.filter((l) => l.startsWith("worktree "))
.map((l) => l.slice("worktree ".length).trim());
}
export function getCanonicalWorktree(): string {
const list = getWorktreeList();
return list[0] ?? PROJECT_ROOT;
}
export function getCurrentWorktree(): string {
const res = sh("git", ["rev-parse", "--show-toplevel"], {
cwd: PROJECT_ROOT,
});
if (res.code !== 0) fatal("not inside a git worktree");
return res.stdout;
}