.forge/wiki/docs/OUTLINE.md 9.6 KiB 202 lines Raw

f0rge — outline

Status: committed build. Scope: the coordination layer — a git forge that lives inside the repository, built for one person and a swarm of agents, with the grammar of gh.

1. Thesis

f0rge is gh with a different backend. Same commands, same flags, same --json fields the models are already trained on — but instead of talking to api.github.com, it reads and writes files under .forge/.

Built for one person and a swarm of agents. You do not need a team of people to work on a thing; you need a team of agents, and they already speak gh. The repo is simultaneously the product, the payload, and the protocol. No server, because it was never a server question: one person does not need federation — they need a local forge their agents already know how to use.

2. The model (one owner, many agents)

3. Coordination protocol (the agent workflow)

f0rge is the postal system of the swarm: issues are the queue, PRs are deliverables, CI is the gate, the wiki is memory, merges are the record.

agent starts in its own worktree (a herdr pane)
  → takes an issue from .forge/issues/                    (claims it)
  → does the work, scripts verify with .forge/ci/
  → files a PR folder back (diff + .forge/prs/<uuid>/ record)
  → you (or an agent under your policy) merge it onto main
  → merge record lands in .forge/merges/

4. Feature surface

gh-literal where gh exists; better than gh where gh has nothing. The prior is a tool, not a cage — but the default is: same grammar.

Port as gh (models are trained on gh; keep the muscle memory):

The one deliberate difference: there is no gh api — the files are the API; any agent already in the repo reads and edits .forge/ directly.

Better than gh (nothing to inherit):

Explicitly not ported from gh: hosting commands (repo create/fork/…), auth, api, secret, gist, codespace, browse — server creatures.

5. Storage layout

.forge/                          # no README — contract is `f0rge --skill`
├── issues/<uuid>/issue.md       # frontmatter + body; comments/<uuid>.md
├── prs/<uuid>/pr.md             # base/head, reviews, merge state
│                                #   + patch.diff; comments/
├── tasks/<uuid>.md              # todo/kanban cards; column = status
├── labels.md  ·  milestones.md
├── wiki/                        # docs/, research/, experiments/;
│                                #   index.md derived
├── ci/
│   ├── ci.env                   # optional non-secret knobs
│   ├── steps/                   # ordered by filename (00_fmt.sh, 10_check.sh)
│   └── runs/<ts>/               # gitignored: summary.md + steps/<name>.log
├── releases/
│   ├── <version>.md             # release notes
│   ├── build/                   # checkout-and-build per platform
│   └── out/                     # built artifacts, gitignored
└── merges/<ts>.md               # import/conflict records

Rules: UUIDs for identity (numbers are derived aliases, never references); one file per entity (git merges independently); indexes derived, never stored (issue numbering, kanban columns, wiki index); frontmatter for structure, markdown for prose; exit code as CI verdict. Everything versioned except releases/out/ and ci/runs/. .forge/ is committed by default; it is the state.

6. Agent story

7. Stances (resolved)

8. Open questions

9. Relationship to the world

10. Resolved from §8 (M8 hardening; §8 kept as asked)

view raw