Commands
Daily development
bun install
bun run dev
bun run dev:full
bun run dev:web
bun run dev:convex
bun run dev:stripe
bun run auth:dev:doctorRun bun run dev:convex first on a new machine or whenever you need to switch hosted Convex dev deployments.
bun run dev and bun run dev:web now run the same auth guardrail before next dev starts. If local Clerk env values and the active hosted Convex dev issuer disagree, startup stops with the exact convex env set command needed to realign them.
bun run dev:stripe now prints the local Stripe guardrail state before it starts forwarding webhooks. The repo expects the pinned Stripe CLI project ship-by-sunday; repair it with stripe login --project-name ship-by-sunday if the CLI context drifted.
Verification
bun run build
bun run typecheck
bun run lint
bun run test:unit
bun run test:contracts
bun run test:integration
set -a; source .env.local; set +a; bun run test:browser-smoke
bun run checkShip by Sunday CLI
Use the repository-local launcher from the repo root with either bun run sbs or ./bin/sbs. For the longer operating guide, read Ship by Sunday CLI.
bun run sbs init --fixture complete --json
bun run sbs schema --json
bun run sbs stages --json
bun run sbs fields --stage design --json
bun run sbs next --json
bun run sbs validate --json
bun run sbs set product.product_name "Ship by Sunday CLI" --json
bun run sbs append scope_in "Packet intake" --json
bun run sbs unset build-plan.domain --json
bun run sbs mutate --file ./tmp/mutations.json --json
bun run sbs --help
bun run sbs --version
bun run sbs version --json
bun run sbs completion zsh
bun run sbs resume
bun run sbs stage design
bun run sbs review --stage build-plan --missing-only --json
bun run sbs export --out -
bun run sbs export --out ./.ship-by-sunday/export.json
bun run sbs import --file ./tmp/sbs-cli-complete.json
cat ./tmp/build-plan-patch.json | bun run sbs apply --stage build-plan --file -
bun run sbs generate --out ./tmp/sbs-cli-repo --json
bun run sbs generate --out ./tmp/sbs-cli-repo.zip --zip --json
bun run sbs generate --out ./tmp/sbs-cli-repo --dry-run --json
./bin/sbs --help
./bin/sbs --version
./bin/sbs completion bashUse the CLI when you want the packet intake and starter snapshot flow without going through the protected web UI. For the actual draft model, command behavior, and generation notes, read Ship by Sunday CLI.
Stripe dev QA
bun run stripe:create-product
bun run stripe:listen:dev
bun run stripe:webhook:sync -- --secret whsec_...
bun run stripe:dev:doctor
bun run stripe:dev:verifybun run stripe:dev:doctor compares the app Stripe account from .env.local against the pinned Stripe CLI project ship-by-sunday. The listener itself still runs from STRIPE_SECRET_KEY, so a CLI mismatch is a warning-worthy local guardrail problem, not a second billing authority.
Clerk QA users
bun run clerk:test-user:check
bun run clerk:test-user:create
bun run clerk:test-user:check:entitled
bun run clerk:test-user:create:entitled
bun run clerk:test-user:prepare:entitledUse bun run clerk:test-user:prepare:entitled for the fastest single-user local debug path. Use bun run qa:personas:prepare -- --pack=<pack> when you need the canonical QA control-plane prep for every persona in a pack.
For hosted browser QA against a non-local target, use the root QA commands with matching Clerk env values for that target. qa/personas.local.json still supplies the real QA account emails and passwords. QA_ENV_FILE only changes which Clerk and Convex environment those identities are provisioned against. It is optional and only needed if you keep a separate hosted or production env file:
PLAYWRIGHT_BASE_URL=https://www.man-meets-ai.com QA_ENV_FILE=apps/web/.env.production bun run qa:personas:prepare -- --pack=default_ship
PLAYWRIGHT_BASE_URL=https://www.man-meets-ai.com QA_ENV_FILE=apps/web/.env.production bun run qa:run-pack -- --pack=default_shipPrefer qa:run-pack for hosted verification. It runs persona prep, browser smoke, and the tagged authenticated browser pack with the same target assumptions.
Use dev first, prod second:
bun run dev:full
PLAYWRIGHT_USE_LOCAL_SERVER=0 PLAYWRIGHT_BASE_URL=http://localhost:3000 bun run --cwd apps/web test:e2e:sandbox:default-shipWhen resuming local billing QA, start from the green rerun in qa/runs/2026-03-25-dev-billing-integration-rerun.md. If it regresses, check that bun run dev:stripe is forwarding to {NEXT_PUBLIC_CONVEX_SITE_URL}/stripe/webhook before treating it as an app-auth failure.
For local targets, bun run qa:run-pack -- --pack=billing_integration now adds a warning-only stripe:dev:doctor preflight and a hard stripe:dev:verify follow-through after the sandbox billing flow. A pinned-profile warning should not override a passing billing handoff, but the warning should still be fixed.
Current QA state:
default_shipis green on localdev.billing_integrationondevhas a green rerun.default_shiponprodhas a green rerun.billing_integrationonprodnow has both the repair report and a fresh automatic rerun proving live webhook delivery.- Hosted
billing_integrationshould still stay opt-in because it spends real live Checkout Sessions, even when the order total is reduced to zero.
Only move to the hosted domain after the local auth/runtime path is understood.
Optional lesson-media pipeline
bun run video:lessons
bun run video:cut:setup
bun run video:cut -- --only <fileName>
bun run video:prepare:color -- --only <fileName>
bun run video:grade -- --only <fileName>
bun run video:upload:bunny -- --only <fileName>
bun run video:publish -- --only <fileName>
bun run video:statusUse video:prepare:color when you want the local cut plus Auphonic pass but need to stop before Bunny so you can touch up the downloaded handoff files in Final Cut Pro. That command writes the Auphonic outputs into Color Correction/ under the Ship by Sunday raw-footage root and archives the original staged source into Processed/.
Use video:grade when you want a headless LUT pass on the handoff files. It reads from Color Correction/, writes graded outputs into Color Graded/, and defaults to Oliur 01.cube at a 15% blend over the original image.
Use video:upload:bunny when the graded exports are final and ready to publish. It reads from Color Graded/, uploads to Bunny without rerunning cut or Auphonic, writes the Bunny embed links into the run report, and archives the uploaded graded masters into Bunny Uploaded/. If you need to supersede an older Bunny set, publish the corrected set as a fresh run and delete the old Bunny video IDs from the earlier report.