Fork Workflow

Fork Workflow

This explains what the Steward does under the hood when you use the fork-based ownership model. Most users don't need this — just tell the Steward what you want. But if you're curious about the git mechanics or want to understand how upstream sync and conflict handling work, this is the reference.


The Model

jmagly/aiwg  (upstream — AIWG releases happen here)
      │
      │  gh repo fork  (Steward does this once, during setup)
      ▼
you/aiwg  (your fork — your source of truth)
      │
      │  git clone
      ▼
~/my-aiwg/  (your local working copy)
      │
      │  aiwg --use-dev ~/my-aiwg
      ▼
global AIWG = your fork

Your fork has two remotes:

  • `origin` — your fork on GitHub (`github.com/you/aiwg`)
  • `upstream` — the canonical AIWG repo (`github.com/jmagly/aiwg`)

Initial Setup

The Steward runs these steps when you say "set up AIWG customization mode":

# Fork and clone in one step — sets both remotes
gh repo fork jmagly/aiwg --clone --remote --clone-dir ~/my-aiwg

# Point AIWG CLI at your local clone
aiwg --use-dev ~/my-aiwg

# Build TypeScript (only needed once at setup)
npm --prefix ~/my-aiwg run build

# Deploy everything from your fork
aiwg use all

After setup, `aiwg version` shows `[dev]` and the path to your clone. That's how you know it's working.


The Edit Cycle (Daily Use)

Edit a file in ~/my-aiwg
    ↓
Tell Steward: "apply my changes"
    ↓
Steward runs: aiwg use all
    ↓
Change is active in your next session

Most customizations (rules, agents, skills) don't need a TypeScript build — `aiwg use all` alone is sufficient. The Steward only runs `npm run build` when you've changed something in `src/`.


Upstream Sync

When AIWG releases new features, you pull them into your fork with:

"Sync my AIWG"

The Steward runs:

git fetch upstream
git log HEAD..upstream/main --oneline   # shows what's incoming
git merge upstream/main
# (handle conflicts if any — see below)
aiwg use all
git push origin main

You see a summary of what changed before the merge happens. The Steward reports what was new upstream after the sync.


Conflict Handling

Conflicts can happen when upstream changes a file you've also modified. The Steward's strategy:

SituationWhat Happens
File you added (not in upstream)Always kept — upstream never sees it
File only upstream changedAuto-accepted — you never touched it
File both you and upstream changedSteward shows the diff and asks which version to keep

When in doubt, the Steward keeps your version and flags it for your review. Your customizations are never silently overwritten.


Contributing Back

If you build something that might be useful to others:

"PR this back to AIWG"

The Steward: 1. Reviews the candidate for general applicability — is it useful to anyone, or is it specific to you? 2. If general: creates a feature branch off your fork, makes a conventional commit, opens a PR to `jmagly/aiwg` 3. If personal: explains why it's a good private customization but not a fit for the main repo

PR branches follow the naming convention `feat/contribute-<name>`. Your `main` branch is unaffected — you keep working normally while the PR is in review.


What `aiwg doctor` Reports

When you're in customize mode, `aiwg doctor` includes a Customize Mode check:

✓ Customize Mode: Active (fork) — source: ~/my-aiwg — up to date with upstream

Or, if upstream has new commits:

○ Customize Mode: Active — source: ~/my-aiwg | upstream has 3 commit(s) — tell Steward "sync my AIWG" to update

Going Back

To return to the standard npm-installed AIWG:

"Switch back to stable AIWG"

The Steward runs `aiwg --use-stable` and resyncs from the npm package. Your fork stays on GitHub and your local clone stays on disk — reactivating customize mode later is just `aiwg --use-dev ~/my-aiwg`.


Local Clone Mode (No Fork)

If you chose the local clone path instead of forking:

  • `origin` doesn't point to your GitHub account — it points to `jmagly/aiwg` directly (or there's no `origin` at all)
  • `upstream` remote doesn't exist — so "sync my AIWG" won't work
  • Everything else (edit cycle, apply changes, doctor) works the same

You can add a fork later by following the fork path at any time. The Steward handles that transition too.