Skip to main content

CLI Overview (gb)

Location: command/

The gb CLI is a monorepo-aware Git tool that scopes git operations to individual services. It prevents accidental cross-service commits and provides interactive prompts for common workflows.

Setup​

bun link # registers "gbsh" globally

Or run directly:

bun run gb <command>

Building the Monorepo​

All workspaces (frontend, backend, docs) are built via Turbo:

bun run build # build all workspaces
bun run build:frontend # Next.js production build
bun run build:backend # NestJS production build
bun run build:docs # Docusaurus static site

Compiling the backend to a standalone binary​

bun run compile

Runs turbo run build across all workspaces, then uses bun build --compile to produce a single native binary at ./dist/server. The binary bundles the backend and all its dependencies - no Bun or Node.js installation required to run it.

The frontend and docs cannot be compiled this way as they depend on the Next.js and Docusaurus runtimes respectively.

Architecture​

command/
├── index.ts # Entrypoint - parses args, dispatches to commands
├── commands.ts # Command implementations (status, commit, branch, push, …)
├── pr.ts # PR/MR creation - GitHub, GitLab, Bitbucket API
├── constants.ts # Loads _mr.json; exports SERVICES, ALL_SERVICES, PROTECTED_BRANCHES
├── prompts.ts # Interactive terminal UI (prompt, select, word limit)
├── utils.ts # Git helpers, remote URL parsing, arg parsing
├── timer.ts # Execution timer
└── help.json # Help text data (loaded at runtime)
_mr.json # Service registry - defines services and protected branches

Services​

Services are defined in _mr.json at the repo root rather than being hardcoded. Each entry maps a service name to one or more directory paths.

{ "name": "backend", "paths": ["backend"] }

constants.ts reads this file at startup and builds:

  • SERVICES - a flat path → name map used to group files
  • ALL_SERVICES - the list of service names shown in selectors (always includes root)

The built-in root pseudo-service captures any file not covered by a registered path.

To add, remove, or inspect services use gb service.

Protected Branches​

Protected branches are configured in _mr.json under protectedBranches (defaults to main, master, staging if omitted).

When committing on a protected branch, gb commit automatically creates a new feature branch before committing. When creating a branch from a non-protected branch, a confirmation prompt is shown.

Commit Types​

Used for branch naming and commit message prefixes:

feat, fix, refactor, test, docs, chore, ci, perf

Execution Timer​

Every command displays its execution time on completion (e.g., Done in 142ms or Done in 1.23s).

Commands​

CommandDescription
gb statusShow git status grouped by service
gb affectedList services with changes vs a base branch
gb branchCreate a service-scoped branch
gb checkoutSwitch to a branch and pull latest changes
gb commitStage and commit files for a service (multi-service loop)
gb diffShow diff for a service or all
gb syncDelete local branches that no longer exist on remote
gb pushPush current branch to origin
gb prCreate a pull request via GitHub, GitLab, or Bitbucket API
gb serviceAdd, remove, or list registered services in _mr.json
gb runRun a package.json script in a service
gb helpShow help

See commands.md for detailed documentation on each command.

Git Helper​

All git operations run through a centralized git() function in utils.ts that:

  1. Detects the repository root via git rev-parse --show-toplevel (cached after first call)
  2. Always runs from the repo root regardless of the user's current directory
  3. Throws descriptive errors on non-zero exit codes

This means gb works from any subdirectory in the monorepo.