Skip to Content
Commands

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:doctor

Run 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 check

Ship 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 bash

Use 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:verify

bun 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:entitled

Use 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_ship

Prefer 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-ship

When 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_ship is green on local dev.
  • billing_integration on dev has a green rerun.
  • default_ship on prod has a green rerun.
  • billing_integration on prod now has both the repair report and a fresh automatic rerun proving live webhook delivery.
  • Hosted billing_integration should 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:status

Use 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.

Last updated on