Skip to main content

PR Workflow

Because The Shift Platform uses git submodules, where you open a pull request depends on what you changed. This page explains the workflow.

Where PRs Go

Change inPR goes to
A submodule (e.g., yellowpages/, passport/)The submodule's own repository
Gateway (packages/gateway/)Platform repository
Platform Core (packages/core/)Platform repository
Convex schema/functions (convex/)Platform repository
Scripts (scripts/)Platform repository
Root config (package.json, tsconfig.json, etc.)Platform repository
Submodule pointer updatePlatform repository (after submodule PR merges)

Submodule Change Workflow

When your change is in a submodule:

1. Work inside the submodule

cd yellowpages
git checkout -b feature/my-change
# Make changes
git add .
git commit -m "feat: add new endpoint"
git push origin feature/my-change

2. Open a PR in the submodule repo

Open the PR in the submodule's repository (e.g., the-shift-dev/yellowpages). Get it reviewed and merged.

3. Update the platform pointer

After the submodule PR merges, update the platform to reference the new commit:

cd ..  # back to platform root
cd yellowpages
git checkout main
git pull
cd ..
git add yellowpages
git commit -m "Update yellowpages submodule"
git push

This can be a direct push or a separate PR to the platform repo, depending on your team's convention.

Platform Change Workflow

When your change is in the gateway, core library, or root configuration:

# From the platform root
git checkout -b feature/my-change
# Make changes in packages/gateway, packages/core, convex/, etc.
git add .
git commit -m "feat: add new gateway middleware"
git push origin feature/my-change

Then open a PR in the platform repository.

Mixed Changes

If your change spans both a submodule and the platform (e.g., adding a new export to @shift/platform-core and consuming it in a service):

  1. Make the platform-core change first and merge it
  2. Update the submodule's dependency, commit, push, and merge the submodule PR
  3. Update the platform's submodule pointer

Alternatively, you can develop both changes locally using symlinks (Bun resolves workspace symlinks), then split them into separate PRs when ready.

Before Submitting

Regardless of where the PR goes, always run:

# From the platform root
bun run check # Biome lint + format
bun run test # All tests

If you changed Convex schema or functions:

npx convex deploy --dry-run  # Verify schema changes

CI Checks

The CI pipeline runs on every PR:

  1. Lint -- bun run check
  2. Test -- bun run test
  3. Build -- Docker image build (ensures nothing is broken)

All checks must pass before merging.

Commit Messages

Follow conventional commit format:

feat: add new endpoint for bulk operations
fix: handle empty response from Convex
docs: update API reference for palette service
refactor: extract store factory pattern
test: add integration tests for ledger policies

When using Claude Code, commits include the co-author trailer:

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>