Hoppa till huvudinnehållet

Teamregler och beslut

Ett beslut som fattas i en persons agentsession stannar i den sessionen. Nästa session, eller en kollegas agent, får aldrig veta om det. Teamregler ger besluten ett hem som varje agent läser: ett repo för organisationen, en fil per repo och ett verktyg för att läsa dem.

Det är en konvention plus ett verktyg. Det finns inget att slå på.

Var reglerna finns

VarFilGäller för
<org>/.rules (ett repo i din organisation)RULES.md, DECISIONS.mdVarje repo i organisationen
Valfritt repo.forgejo/RULES.md, .forgejo/DECISIONS.mdDet repot

Filerna läses från varje repos standardbranch, så en regel ändras genom en pull request precis som alla andra ändringar, med granskning och historik.

Varje ## -rubrik inleder en regel (eller ett beslut), och rubriken namnger den. Text före den första ## -rubriken behålls som inledning.

# Rules

## Migrations
Every migration is expand-only. A column is dropped in a later release, never in the one that stops using it.

## Review
One approval from someone who did not write the change.

Hur organisationens och repots regler kombineras

Organisationens regler och repots slås ihop per rubrik. En regel i repot med samma rubrik som en regel i organisationen ersätter den (versaler och skiljetecken spelar ingen roll), så ett repo kan skärpa eller lätta på en enskild regel utan att kopiera resten. Regler som bara finns i repot kommer efter organisationens.

<!-- web/.forgejo/RULES.md -->
## Review
Two approvals: this repository takes payments.

get_team_rules: verktyget som agenterna anropar

MCP-verktygREST
get_team_rulesGET /_app/api/v1/orgs/<org>/repos/<repo>/team-rules

Det returnerar varje regel med dess kind (rules eller decisions), title, body, om den kom från organisationen eller repot (scope), om den ersatte en regel i organisationen (overrides_org) och dess source (repo, sökväg och branch). files listar varje fil som söktes och om den hittades. digest ändras så fort de sammanslagna reglerna ändras.

Det kräver findings:read (eller orgs:read) och läsåtkomst till repot. Den som kan läsa repot men inte .rules-repot får bara repots regler, och organisationens filer listas då som not_readable.

Regler är instruktioner till dina agenter, med samma tyngd som repots AGENTS.md, och alla med skrivåtkomst till .rules-repot eller till repot kan ändra dem. Dela ut skrivåtkomst till .rules med det i åtanke. En regel ger aldrig någon behörighet.

Lägg reglerna i AGENTS.md eller CLAUDE.md

Agenter som läser en AGENTS.md- eller CLAUDE.md-fil men inte anropar verktyg kan bära reglerna i den filen. ?format=agents-md returnerar ett Markdown-block mellan två markörer:

<!-- fremforge:team-rules:start -->
...
<!-- fremforge:team-rules:end -->

Blocket består av samma byte för samma regler. Kör det här från repots rot för att lägga till blocket eller uppdatera det (det ersätter bara blocket och lägger till det i slutet första gången):

ORG=<org>; REPO=<repo>; FILE=AGENTS.md
curl -fsS -H "Authorization: Bearer $FREMFORGE_TOKEN" \
  "https://frem.sh/_app/api/v1/orgs/$ORG/repos/$REPO/team-rules?format=agents-md" > .team-rules.md
touch "$FILE"
python3 - "$FILE" .team-rules.md <<'PY'
import sys
path, block = sys.argv[1], open(sys.argv[2]).read().strip()
cur = open(path).read()
s, e = '<!-- fremforge:team-rules:start -->', '<!-- fremforge:team-rules:end -->'
if s in cur and e in cur:
    new = cur[:cur.index(s)] + block + cur[cur.index(e) + len(e):]
else:
    new = cur.rstrip() + ('\n\n' if cur.strip() else '') + block + '\n'
open(path, 'w').write(new)
PY
rm .team-rules.md

Committa resultatet i en pull request. Om du vill kontrollera i CI att kopian är aktuell jämför du digest: i filens block med headern X-Fremforge-Rules-Digest i svaret på samma begäran.

Om du hellre inte kopierar in reglerna i filen räcker det med en rad för agenter som kan anropa verktyg:

At the start of a task, call get_team_rules for this repository and follow the rules it returns.

Beslut

DECISIONS.md har samma form som RULES.md: en ## -rubrik per beslut. Skriv beslutet, datumet och varför, så att en agent som stöter på frågan igen inte fattar beslutet en gång till:

## Kysely, not Drizzle (2026-10-01)
New database code uses Kysely. Drizzle stays only in the frozen migrations.