Conductor/Superset clone a bare worktree with no node_modules. The
legacy .superset/setup.sh ran bun install; cmdSetup did not, so
drizzle-kit generate (which executes the temp .ts drizzle config via
NODE_OPTIONS=--import tsx) failed with ERR_MODULE_NOT_FOUND for tsx. Now
cmdSetup runs bun install at the very top — Bun no-ops when lockfile
matches, so the cost on repeat runs is negligible.
Conductor and Superset distinguish setup (one-shot provisioning on
workspace creation), run (restartable dev server bound to the Run
button's pane), and teardown (cleanup on deletion). The single 'bun dw'
entrypoint conflated all three. Splits cmdDefault into cmdSetup
(provision only, returns the registry entry) and cmdRun (load entry,
kill ports, startDev inline). Adds startDev opts.allowTmux so cmdRun
forces inline regardless of TTY — the Run pane owns the process. Direct
CLI 'bun dw' still works byte-for-byte via the default.ts shim. Replaces
.superset/setup.sh and .conductor/config.json with the three-field {
setup, run, teardown } shape pointing at the new subcommands. Adds
scripts/dw/README.md as the agent-facing guide.
Prints the current worktree's server URL, vite URL, tmux session, and
ports in both a human-readable block and a KEY=value block for shell
eval. Canonical worktree gracefully shows direct localhost ports with no
tmux. Useful for agents landing in a Conductor/Superset-spawned worktree
to discover their stack.
cmdReset deleted all managed .env.local files and reprovisioned the Neon
branch but never re-wrote the env files. Subsequent commands had no
DATABASE_URL / AUTUMN_TEST_BASE_URL and silently ran against default
localhost targets. Now calls writeEnvLocalFiles with the
freshly-provisioned entry. Also adds BRANCH_NAME_RE guard before rmSync
on the drizzle-local directory.
The deleteBranch call was correctly gated by BRANCH_NAME_RE, but the
subsequent rmSync of drizzle-local/<branchName> was not. A crafted
branchName like '../../etc' could trigger recursive deletion of
unintended paths. Restructured the orphan loop so a single regex guard
covers both deletion paths.
Previously logged to stderr and continued, leaving dev startup
proceeding with broken wtN.localhost URLs. Now calls fatal() so the
caller halts before downstream code uses the invalid alias.
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.