spec/schema.md 8.0 KiB 167 lines Raw

f0rge schema v1 (frozen)

Single source of truth for every .forge/ format. No byte changes without a schema-version bump in the contract (f0rge --skill).

0. Global rules

1. Layout (OUTLINE §5)

.forge/issues/<uuid>/issue.md + comments/<uuid>.md
.forge/prs/<uuid>/pr.md + patch.diff + comments/<uuid>.md + reviews/<uuid>.md
.forge/tasks/<uuid>.md
.forge/labels.md · milestones.md
.forge/wiki/ (index derived: tree + first H1)
.forge/ci/ci.env + steps/NN_name.sh + runs/<ts>/summary.md
.forge/releases/<version>.md + build/ + out/ (ignored)
.forge/merges/<ts>.md
.forge/archive/<type>/<uuid>/

2. Entities

issue — .forge/issues/<uuid>/issue.md

Required: id, title, state, created. Optional: labels: [str] ([]), assignees: [str] ([]), milestone: str, updated. Body = issue text. Golden: spec/fixtures/issue.md.

issue-comment — comments/<uuid>.md

Required: id, created. Optional: author. Body = comment. Golden: spec/fixtures/issue-comment.md.

pr — .forge/prs/<uuid>/pr.md

Required: id, title, state, base, head, created. Optional: draft: bool (false), issues: [uuid] ([]), ci: verdict, updated. Body = description; sidecar patch.diff. Golden: spec/fixtures/pr.md.

pr-review — reviews/<uuid>.md

Required: id, created. Optional: author, state: approved|changes-requested|commented. Body = review text. Golden: spec/fixtures/pr-review.md.

task — .forge/tasks/<uuid>.md

Required: id, title, status, created. Optional: assignee, updated, closed. Column derived from status (todo|doing|blocked|done). Create: --title T [--body B] [--column C] (default todo); body = markdown after frontmatter. Golden: spec/fixtures/task.md.

label — entries in .forge/labels.md (YAML list)

Required: name. Optional: color, description. Golden: spec/fixtures/labels.md.

milestone — entries in .forge/milestones.md (YAML list)

Required: name. Optional: state (open), due, description. Golden: spec/fixtures/milestones.md.

release — .forge/releases/<version>.md

Required: version, created. Optional: title, sha (HEAD short sha at create time; absent on old records). Body = notes. Verbs: create <ver> --notes <file|-> [--title S], install [ver|main] [--dry-run] (list/view unchanged). Golden: spec/fixtures/release.md.

merge-record — .forge/merges/<ts>.md

Required: pr (uuid), verdict: pass|fail, created. Optional: applied: bool (false), resolved: [str] ([]). Body = notes. Golden: spec/fixtures/merge-record.md. Gate only: CI-gates patch in scratch worktree; never touches main/branches; prints conflicts, never resolves; you integrate (ff) + delete branch.

ci-env — .forge/ci/ci.env (YAML mapping, no fences)

Known: runner: local|docker (default local). Any extra KEY: value string knob allowed, never secret. Golden: spec/fixtures/ci-env.

ci-step — .forge/ci/steps/NN_name.sh

Executable script, filename order, exit 0 = step pass, first nonzero exit = run fail. Golden: spec/fixtures/ci-step.sh.

ci-run — .forge/ci/runs/<ts>/summary.md (gitignored)

Required: run, verdict, created. Optional: steps: [{name, exit, duration_ms}]. Golden: spec/fixtures/ci-run.md.

3. Derived indexes (pure, deterministic)

4. Procedures (wiki, release, init)

wiki — files are the API; index derived, never stored

release — notes are truth, build is a side effect

init — bootstrap skeleton, idempotent

view raw