Getting started
Install Metastack and bring up a workspace in a few minutes.
Requirements
- GitHub CLI (
gh) onPATH, authenticated (gh auth status). gitonPATH.- A directory you want to turn into a workspace.
Install
Works on macOS (Apple Silicon and Intel) and Linux.
brew tap stackcube/tap
brew install metastack
Scaffold a workspace
From the directory you want to turn into a workspace:
metastack init
This writes metastack.yaml with an empty repos: list and a starter checks: set, plus a .gitignore that excludes repos/ (managed repos are clones, not tracked here). It does not run git init — track the workspace or don't, your call.
Pass a name to scaffold into a fresh subdirectory instead:
metastack init my-workspace
Or run interactively to be prompted for the workspace name, starter repos, and which checks to enable:
metastack init -i
Add repos
Each managed repo gets registered in metastack.yaml and cloned into ./repos/<name>:
metastack add my-org/my-cli
metastack add my-org/my-daemon
add appends to metastack.yaml (preserving comments) and clones via gh repo clone. It's idempotent — re-running with a name that's already registered skips the YAML edit but still tries the clone.
If you'd rather edit metastack.yaml by hand, do that and run:
metastack clone
clone reconciles the workspace with the config: any repo listed in metastack.yaml that isn't already cloned gets cloned. Idempotent.
Verify the toolchain
Run the checks declared in metastack.yaml to confirm contributors have the tools they need:
metastack doctor
Each check runs as a smoke command (e.g. gh auth status); a non-zero exit means the tool is missing or misconfigured. Required checks fail with ✗ and exit non-zero; optional checks fail with ⚠ and don't.
Daily ops
Once the workspace is set up, the rest of the verbs apply across every managed repo:
# Show branch / ahead-behind / working-tree state per repo
metastack status
# git pull --ff-only in every repo
metastack pull
# git fetch --all --prune in every repo
metastack fetch
# Run an arbitrary shell command in every repo
metastack exec -- git log -1 --oneline
# Create + checkout the same branch in every repo
metastack branch feat/billing
# Bump each repo's latest vX.Y.Z tag (patch/minor/major; --push to publish)
metastack tag minor
# Detach every repo onto a semver tag (latest by default; per-repo <= fallback)
metastack checkout list
metastack checkout v0.2.0
exec joins everything after -- into a single bash command. Per-repo non-zero exits are reported in the summary but don't abort the loop.
Where to go next
- CLI reference — every verb in detail.
- Configuration — the full
metastack.yamlschema.