Practical examples: multi-workspace repos

← Workspaces

One repo can carry several team workspaces. A team clones it once, and each engineer syncs only the team workspaces they use. The rest cost a few KB of manifest and wiki on disk, and materialize nothing.

The shape: a base workspace, nested team workspaces

The repo root is itself a workspace — the base of Nesting and external stores. Each team gets a --nested workspace directly beneath it. That nested workspace inherits the base's wiki, initiatives, and project registry wherever it declares none of its own.

~/workspaces/acme-base/           ← THE BASE WORKSPACE REPO — clone this
  .shipd-config.json              ← the base manifest                        (tracked)
  .shipd/wiki/                    ← knowledge every team below inherits      (tracked)
  myapp/                          ← NESTED TEAM WORKSPACE
    .shipd-config.json            ← this team's own manifest                 (tracked)
    .gitignore                    ← this team's members block                (tracked)
    .shipd/wiki/                  ← this team's own store — writes land here (tracked)
    api/  web/                    ← this team's member repos                 (ignored)
  billing-rollout/                ← ANOTHER NESTED TEAM WORKSPACE
    .shipd-config.json            ← its own manifest                        (tracked)
    .shipd/wiki/                  ← its own store, plus the base's by       (tracked)
                                     inheritance
    billing/  tasks/              ← its own member repos                    (ignored)

What lives where

Base workspaceEach nested team workspace
Manifest (.shipd-config.json)tracked, at the repo roottracked, one per team folder
Wiki pages (.shipd/wiki/)tracked — every team below inherits it on readtracked — writes land here, never at the base
Oracle queue (.shipd/wiki/queue.md)tracked — a question queued here is answerable only heretracked — the team's own pending questions
Initiatives (.shipd/initiatives/)tracked, falls back to it when a team declares nonetracked, shadows the base's when declared
Member reposnone — the base holds no members of its ownmachine-local, held out by the team's members block

Setup: shipd workspace team

Build the layout with the guided wizard, run from inside the base workspace:

shipd workspace init ~/workspaces/acme-base --git
cd ~/workspaces/acme-base
shipd workspace team

shipd workspace team asks for one or more team names. For each team, it asks for repo paths, clone URLs, and any checkout you already have on this machine. It creates the team's folder, initializes a nested workspace, declares the repos, and maps the checkouts you named. The wizard reaches the network never — shipd workspace sync materializes members afterward, inside the team workspace that needs them.

Cloning and day-to-day use

Clone the shared repo with plain git clone — it holds several workspaces, so the single-workspace /s:workspace clone verb is the wrong front door:

git clone git@github.com:acme/workspaces.git ~/workspaces/acme-base
cd ~/workspaces/acme-base/myapp
shipd workspace sync

cd into the team workspace you work in, and plan its materialization there. shipd workspace sync only prints the plan, so run /s:workspace sync in a Claude session to execute it. Sync reads only that team's own manifest. The teams you ignore stay unmaterialized, and cost nothing but their tracked manifest and wiki.

shipd workspace reports the team's roster of projects and initiatives. shipd board covers every declared project's repos from the workspace root, and only the repos beneath the folder it runs from otherwise.

What the shape costs

The base wiki accumulates knowledge only from writes made at the base. A teammate teaching a page from inside myapp/ writes it into myapp's own store, never the base's. Run /s:teach from the base workspace to grow the knowledge every team inherits.

The oracle queue splits the same way. A question queued at the base is answerable only from the base workspace, never from a nested team's own session. Queue a question there when every team should see its answer.

Isolation

Git has no per-directory permissions. Anyone who can clone the repo reads every team workspace in it — the base wiki and every nested team's own store alike. When a team's knowledge must stay invisible to some of the people who clone the repo, give that team a workspace repository of its own. Separate repos, not directories, are the isolation boundary.