Przejdź do głównej zawartości

Generowanie i utrzymanie dokumentacji z Codex

Codex generuje referencję API, dokumenty architektury, komentarze TSDoc i szkice changelogów z kodu źródłowego i historii gita w izolowanym worktree Gita, więc nic nie trafia do głównego katalogu roboczego bez przeglądu. Generowanie to łatwiejsza połowa. Dokumentacja pozostaje prawdziwa dzięki deterministycznym bramkom i cyklicznemu raportowi rozjazdów z codex exec, który zwraca JSON zgodny ze schematem, na którym CI może przerwać build.

Ta strona jest dla programistów odpowiedzialnych za dokumentację serwisu i dla tech leadów, którzy chcą, żeby dokumentacja przestała obciążać code review. Znasz ten obrazek: docs/API.md wciąż wymienia endpoint usunięty dwa sprinty temu, polecenie instalacji z README pada na czystej maszynie, a każda nowa osoba zadaje te same pytania, bo ARCHITECTURE.md opisuje system sprzed ostatniej refaktoryzacji. Nikt nie aktualizuje dokumentacji ręcznie, więc rozwiązaniem jest workflow, który ją regeneruje, i bramka, która pada, gdy dokumentacja się rozjedzie.

  • Tabelę decyzyjną: które dokumenty Codex ma generować, które tylko szkicować i jaka kontrola dowodzi poprawności każdego z nich.
  • Sekcję AGENTS.md i skill repozytorium, dzięki którym każda sesja Codex pisze dokumentację tak samo.
  • Prompty do skopiowania: referencja API z testem kontraktowym, ARCHITECTURE.md z cytowaniami i szkic changelogu.
  • Raport rozjazdów z codex exec --output-schema w trybie tylko do odczytu, który zamienia „dokumentacja chyba jest OK” w kod wyjścia.
  • Listę typowych awarii wraz ze sposobem naprawy każdej.

Zanim zaczniesz, zainstaluj Codex i dodaj AGENTS.md w katalogu głównym repozytorium; podstawy opisuje konfiguracja AGENTS.md dla Codex. Polecenia na tej stronie sprawdzono na Codex CLI 0.157.1.

Codex jest wiarygodny tam, gdzie odpowiedź jest w kodzie, i zawodny tam, gdzie odpowiedź jest w czyjejś głowie. Zdecyduj osobno dla każdego typu dokumentu, zanim napiszesz prompt:

DokumentŹródło prawdyRola CodexCo dowodzi poprawności
TSDoc / JSDoc eksportowanych symboliSygnatury, typy, rzucane błędyGenerujeWalidacja TypeDoc pada przy każdym nieudokumentowanym eksporcie
Referencja API (openapi.yaml lub API.md)Handlery tras, schematy walidacji, middlewareGenerujeLint Redocly i test kontraktowy porównujący opisane trasy z zarejestrowanymi
ARCHITECTURE.mdUkład katalogów, punkty wejścia, przepływ danychGeneruje z cytowaniamiSkrypt sprawdza, czy każda cytowana ścieżka istnieje
Sekcja instalacji w READMESkrypty, które naprawdę działająGeneruje, potem uruchamiaCI wykonuje polecenia instalacji na czystym checkoucie
Changeloggit log między tagamiSzkicujeWłaściciel wydania poprawia treść i ją zatwierdza
Zapisy decyzji („dlaczego wybraliśmy X”)Rozumowanie ludziTylko wywiad i szkicWłaściciel decyzji pisze lub zatwierdza każde uzasadnienie

Ostatni wiersz jest najważniejszy. Zapytany, dlaczego moduł korzysta z kolejki, Codex napisze wiarygodnie brzmiący powód niezależnie od tego, czy taki istnieje. Uzasadnienia zostaw ludziom i korzystaj z wywiadu opisanego w decyzjach architektonicznych, za którymi agent potrafi pójść.

Dodaj kontrole przed pierwszym wygenerowanym dokumentem, żeby już pierwszy diff był zweryfikowany. W serwisie TypeScript zainstaluj TypeDoc i Redocly CLI (0.28.20 i 2.54.3 w npm na 2026-09-26):

Okno terminala
npm install -D typedoc @redocly/cli

Następnie dodaj do package.json jeden skrypt docs:check. --emit none waliduje bez generowania HTML, a --treatValidationWarningsAsErrors sprawia, że TypeDoc kończy się błędem, gdy którykolwiek eksportowany symbol w src/ nie ma dokumentacji:

{
"scripts": {
"docs:check": "typedoc --emit none --entryPointStrategy expand --entryPoints src --validation.notDocumented --treatValidationWarningsAsErrors && redocly lint docs/openapi.yaml && bash scripts/check-doc-citations.sh"
}
}

Kontrola cytowań łapie najczęstszą postać zmyślonej prozy: twierdzenie powołujące się na plik, który nie istnieje. Zapisz ją jako scripts/check-doc-citations.sh:

#!/usr/bin/env bash
# Fail when a doc cites a repository path that does not exist.
# A line suffix such as `src/routes/billing.ts:42` is checked as the bare path.
set -uo pipefail
missing=0
for doc in docs/ARCHITECTURE.md docs/API.md README.md; do
[ -f "$doc" ] || continue
for path in $(grep -oE '`(src|scripts|tests|docs|config)/[A-Za-z0-9_./-]+(:[0-9]+)?`' "$doc" \
| tr -d '`' | sed -E 's/:[0-9]+$//' | sort -u); do
if [ ! -e "$path" ]; then
echo "$doc cites a missing path: $path"
missing=1
fi
done
done
exit "$missing"

Trzy bramki są połączone przez &&, więc npm run docs:check zatrzymuje się na pierwszej, która padnie, a redocly lint i tak pada, dopóki nie istnieje docs/openapi.yaml. Żeby zbudować backlog, uruchom je raz osobno i zachowaj wszystkie błędy:

Okno terminala
npx typedoc --emit none --entryPointStrategy expand --entryPoints src --validation.notDocumented --treatValidationWarningsAsErrors; \
npx redocly lint docs/openapi.yaml; \
bash scripts/check-doc-citations.sh

Ta lista to backlog, który przekazujesz Codex, jeden katalog na zadanie. Bramki TypeDoc i wykonywania README nie zależą od narzędzia; przewodnik po dokumentacji w Claude Code pokazuje krok CI, który uruchamia blok szybkiego startu z README w czystym kontenerze.

Codex czyta AGENTS.md, zanim zacznie jakąkolwiek pracę, więc zapisane tam konwencje obowiązują w każdej sesji, także w wątkach w worktree i w zaplanowanych uruchomieniach. Dodaj krótką sekcję do głównego AGENTS.md:

## Documentation
- API reference: docs/openapi.yaml. Architecture: docs/ARCHITECTURE.md. Changelog: CHANGELOG.md.
- Cite every claim about the code as a repo-relative path in backticks, for example `src/routes/billing.ts`.
- Never write rationale ("we chose X because") that is not in a code comment, docs/adr/ or the prompt.
Write "(rationale: ask the owner)" instead.
- In hand-written docs, edit only between <!-- generated:start --> and <!-- generated:end -->.
- Before finishing any change to docs/ or to an exported API, run `npm run docs:check` and fix failures.

Wpisuj tam tylko zasady, które dotyczą każdego zadania. Wieloetapowa procedura pełnego przeglądu dokumentacji należy do skilla, który Codex wczytuje dopiero wtedy, gdy zadanie go potrzebuje. Zapisz go jako .agents/skills/docs-sync/SKILL.md:

---
name: docs-sync
description: Bring docs/ back in line with the code after a change. Use when a task changes routes, exported APIs, scripts or directory layout.
---
1. Run `git diff --name-only origin/main...HEAD` and list the changed routes, exports and scripts.
2. For each change, find every place in docs/, README.md and docs/openapi.yaml that describes it.
3. Update only those passages. Cite the file each claim comes from.
4. Run `npm run docs:check`. Fix documentation, never code, until it passes.
5. Report: each doc changed, the code change that caused it, and the final docs:check output.

Wywołaj go przez $docs-sync w prompcie albo przejrzyj zainstalowane skille poleceniem /skills. Jeśli skill się nie pojawia, optymalizacja AGENTS.md i skilli w Codex pokazuje, jak sprawdzić, co dokładnie Codex wczytał.

Generuj dokumentację referencyjną w zadaniu w worktree

Dział zatytułowany „Generuj dokumentację referencyjną w zadaniu w worktree”

Worktree trzyma wygenerowane pliki z dala od twojego katalogu roboczego, dopóki ich nie sprawdzisz, i pozwala zadaniu dokumentacyjnemu działać równolegle z pracą nad funkcją.

  1. Uruchom zadanie we własnym worktree. Najpierw zrób commit albo stash: worktree startuje ze stanu zatwierdzonego, więc niezacommitowanych zmian w nim nie ma.

    Okno terminala
    codex --worktree

    --worktree uruchamia sesję w nowym, zarządzanym worktree Gita (obsługa worktree jest domyślnie włączona od Codex CLI 0.156.0).

  2. Zainstaluj zależności w worktree (npm ci), bo inaczej bramki padną z powodu, który nie ma nic wspólnego z dokumentacją.

  3. Wklej jeden z poniższych promptów, jeden dokument albo jeden katalog na zadanie. Małe zadania dają diffy, które sprawdzisz wyrywkowo w minutę.

  4. Niech zdecydują bramki. Prompt kończy się uruchomieniem npm run docs:check. Zielony wynik oznacza, że każdy eksport ma dokumentację, specyfikacja się parsuje, a każde cytowanie prowadzi do istniejącego pliku. Nie oznacza, że proza jest prawdziwa, i dlatego istnieje test kontraktowy.

  5. Przepuść diff przez review. Wpisz /review w sesji albo uruchom codex exec review --uncommitted, żeby dostać wbudowane review. Żeby zastosować instrukcje review dokumentacji podane niżej, uruchom je jako codex exec w trybie tylko do odczytu (zobacz sekcję o review).

  6. Wróć z pracą przez Gita. Zrób commit w worktree i otwórz pull request. Izolowane zadania Codex w worktree Gita opisują scalanie i sprzątanie.

Od tej chwili wyrocznią jest test kontraktowy: trasa dodana bez wpisu w specyfikacji zmienia CI na czerwone, niezależnie od tego, kto ją dodał. Resztę workflow „najpierw kontrakt” opisuje budowanie API z Codex.

Lista „Drift found” bywa cenniejsza niż sam dokument: to audyt dokumentacji, którą już masz. Sprawdź każdy znacznik (inferred); każdy z nich to twierdzenie, którego nie potwierdza żaden plik.

Przy TSDoc wskaż Codex ostrzeżenia TypeDoc dla jednego katalogu i dodaj dwa ograniczenia: „follow the style already used in src/lib/database.ts” oraz „keep each comment shorter than the function body it documents”. Drugie ogranicza najczęstszą wadę generowanych komentarzy, czyli powtarzanie kodu słowami.

Changelog to komunikat dla użytkowników, więc Codex go szkicuje, a treść należy do człowieka. Uruchom to w zwykłym lokalnym wątku; zadanie tylko czyta historię i zapisuje jeden plik.

Lista „Not user-facing” sprawia, że klasyfikację agenta da się sprawdzić. Właściciel wydania czyta tę listę i zmiany łamiące zgodność, a nie każdy wpis.

Wygenerowana dokumentacja jest prawdziwa w dniu wygenerowania. Prawdziwą utrzymuje ją raport rozjazdów: uruchomienie codex exec tylko do odczytu, które porównuje dokumentację z kodem i zwraca JSON o stałym kształcie.

Zapisz schemat jako scripts/docs-drift/schema.json. --output-schema działa w trybie strict, więc każdy obiekt wymienia wszystkie swoje właściwości w required i ustawia additionalProperties na false:

{
"type": "object",
"properties": {
"verdict": { "type": "string", "enum": ["current", "drift"] },
"findings": {
"type": "array",
"items": {
"type": "object",
"properties": {
"doc": { "type": "string" },
"claim": { "type": "string" },
"code_evidence": { "type": "string" },
"kind": { "type": "string", "enum": ["missing", "stale", "wrong", "dead-reference"] }
},
"required": ["doc", "claim", "code_evidence", "kind"],
"additionalProperties": false
}
}
},
"required": ["verdict", "findings"],
"additionalProperties": false
}

Prompt zapisz jako scripts/docs-drift/prompt.md:

Uruchom go z katalogu głównego repozytorium i pozwól, żeby jq -e zamienił odpowiedź w kod wyjścia:

Okno terminala
codex exec -c default_permissions=":read-only" \
--output-schema scripts/docs-drift/schema.json -o drift.json \
"$(cat scripts/docs-drift/prompt.md)"
jq -e '.verdict == "current"' drift.json > /dev/null || {
jq -r '.findings[] | "\(.doc): \(.claim) <- \(.code_evidence)"' drift.json
exit 1
}

:read-only to wbudowany profil uprawnień (beta od Codex CLI 0.138.0); jego starszy odpowiednik to --sandbox read-only. Użyj jednego albo drugiego, nie obu naraz, bo według OpenAI te dwa systemy się nie łączą. Schemat gwarantuje kształt odpowiedzi, nie jej prawdziwość: pole code_evidence istnieje po to, żeby sprawdzić znalezisko, otwierając jeden plik, a nie czytając dokumentację od nowa.

Utwórz automatyzację w aplikacji desktopowej Codex z powyższym promptem, wybierz projekt i ustaw harmonogram tygodniowy. Działa tylko wtedy, gdy komputer nie śpi, a wyniki trafiają do skrzynki w aplikacji. Zanim ustawisz harmonogram, przetestuj prompt ręcznie dwa razy; procedurę i wybór sandboxa opisuje przewodnik po zaplanowanych automatyzacjach Codex.

Gdy raport pokaże rozjazd, uruchom zadanie w worktree z $docs-sync i wklej znaleziska do promptu. Poprawka przechodzi wtedy przez te same bramki co każda inna zmiana w dokumentacji.

Przeglądaj diff dokumentacji bez czytania każdej linii

Dział zatytułowany „Przeglądaj diff dokumentacji bez czytania każdej linii”

Diffy dokumentacji są długie i brzmią wiarygodnie, więc czytanie ich linia po linii to najgorszy możliwy sposób przeglądu. Czytanie zostaw bramkom i ukierunkowanemu review, a uwagę człowieka zachowaj dla twierdzeń, których żadna bramka nie sprawdzi.

Zapisz go jako scripts/docs-drift/review.md i uruchom jako codex exec w trybie tylko do odczytu; prompt sam wskazuje diff do przejrzenia:

Okno terminala
codex exec -c default_permissions=":read-only" "$(cat scripts/docs-drift/review.md)"

Wbudowane review bez własnych instrukcji uruchomisz poleceniem codex exec review --base main. W Codex CLI 0.157.1 flag --base, --uncommitted i --commit nie można łączyć z własnymi instrukcjami; CLI kończy się błędem „cannot be used with ‘[PROMPT]’”.

Odpowiedzialność za zatwierdzenie jest jasno przypisana:

ZmianaSprawdzaZatwierdza
TSDoc, OpenAPI, cytowanianpm run docs:check, test kontraktowyWłaściciel kodu zmienionych ścieżek, na podstawie wyników bramek
ARCHITECTURE.mdKontrola cytowań, znaczniki (inferred), reviewTech lead czyta listę „Drift found” i każdą linię (inferred)
ChangelogCzłowiekWłaściciel wydania
Uzasadnienia i zapisy decyzjiCzłowiekWłaściciel decyzji

Dowody, które pull request powinien zawierać, żeby recenzent mógł go zatwierdzić na ich podstawie, opisuje pakiet dowodów.

Dokumentacja wyjaśnia „dlaczego”, a powody są zmyślone. Codex wypełnia luki wiarygodnie brzmiącym uzasadnieniem. Naprawa: reguła z AGENTS.md powyżej każe mu pisać „(rationale: ask the owner)”; przeszukaj diff pod kątem „because” i „in order to” i potwierdź źródło każdego wystąpienia.

Codex przepisuje sekcje napisane ręcznie. Regeneracja całego pliku spłaszcza akapity, które napisał człowiek. Naprawa: otocz generowane fragmenty znacznikami <!-- generated:start --> i <!-- generated:end -->, zapisz regułę w AGENTS.md i dodaj kontrolę, która pada, gdy diff dotyka linii poza znacznikami.

Bramki padają w worktree z powodów niezwiązanych z dokumentacją. Świeże worktree nie ma node_modules ani twoich lokalnych plików z .gitignore. Naprawa: najpierw uruchom npm ci albo dodaj instalację do konfiguracji worktree opisanej w przewodniku po worktree.

Codex ignoruje twoje zasady dokumentacji. Od Codex CLI 0.150.0 niezaufane projekty nie dostarczają instrukcji z projektowego AGENTS.md. Naprawa: oznacz projekt jako zaufany, gdy Codex o to zapyta, a potem potwierdź poleceniem codex debug prompt-input, że reguły zostały wczytane.

Raport rozjazdów zmienia się co tydzień bez żadnej zmiany w kodzie. Nieprecyzyjny prompt daje przy każdym uruchomieniu inną listę. Naprawa: uruchom go ręcznie dwa razy; jeśli znaleziska się różnią, zawęź zakres (jeden dokument na kontrolę) i wymagaj code_evidence dla każdego znaleziska, co schemat już wymusza.

Job rozjazdów sam „poprawia” dokumentację. Zaplanowany job, który zapisuje pliki, wprowadza zmiany, o które nikt nie prosił. Naprawa: trzymaj raport na :read-only, a poprawki rób w osobnym zadaniu w worktree, które przechodzi review.

Cytowania plików psują się po przeniesieniu. Zmiana nazwy src/services/ na src/domain/ po cichu unieważnia każde cytowanie. Naprawa: kontrola cytowań przerywa build; wskaż Codex jej wynik z poleceniem „update the citations in docs/ to the new paths, do not change code”. Kontrola cytowań nie sprawdza względnych linków Markdown, takich jak [setup](../setup.md); do nich potrzebny jest link checker w CI, na przykład markdown-link-check (3.15.0 w npm): find docs -name '*.md' -print0 | xargs -0 -n1 npx markdown-link-check, a odwołania wewnątrz specyfikacji OpenAPI obejmuje redocly lint.