feat: INSTALL.md is the English installation tutorial; new tutorial docs/tutorials/first-source-to-first-answer.md with a shipped sample source; README.md links it as its first-ingestion step (#191)
CI / verify (push) Successful in 6m14s
CI / pwsh (push) Successful in 2m2s
Release / release (push) Successful in 34s

Files changed:
- CHANGES.md
- INSTALL.md
- README.md
- VERSION
- docs/reference/commands/types-instructions-and-docs.md
- docs/tutorials/README.md
- docs/tutorials/first-source-to-first-answer.md
- docs/tutorials/sample-source.md
- instructions/dev/doc-pull-through.md
- tools/CONTRACT.md
- tools/chemenu/commands/docs_verify.py
- tools/chemenu/install_doc.py
- tools/chemenu/tests/test_install_doc.py

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SnAJ7Z3CpVD3PRbN73QtU2
This commit is contained in:
torbenandClaude Opus 5.5 committed 2026-10-07 06:38:40 +02:00
1 parent f9056c04f7
commit fe1de63e0f
13 files changed
+403 -190

No files matched your search

+136 -136
View File
@@ -1,27 +1,27 @@
# Installation
# Install a Chemenu instance
Dieses Dokument richtet sich an Menschen. Es gibt genau einen Weg zu einer Chemenu-Instanz: Ein
Agent installiert das **neueste Release** in ein leeres Verzeichnis, das du vorgibst. Die
Schritte führt der Agent aus, nach `instructions/setup-instance.md` aus demselben Release. Hier
steht, was du vorher bereitstellst, welchen Satz du ihm gibst, was er dich fragt und was zu tun
ist, wenn er anhält. Die vollständige Kommandoreferenz steht in
This tutorial takes you from an empty folder to a running Chemenu instance. There is exactly one
way to get one: an agent installs the **latest release** into an empty folder you choose. The
agent runs the steps, following `instructions/setup-instance.md` from that same release. This
page covers what you prepare beforehand, the sentence you give the agent, what it asks you, and
what to do when it stops. The full command reference is in
[tools/CONTRACT.md](tools/CONTRACT.md).
Den optionalen **MCP-Leseserver** richtet
[docs/how-to/set-up-the-mcp-server.md](docs/how-to/set-up-the-mcp-server.md) ein: derselbe
Korpus, lesend, für einen Konsumenten, der kein Terminal auf dieser Maschine ist.
The optional **MCP read server** is set up separately, once the instance runs:
[docs/how-to/set-up-the-mcp-server.md](docs/how-to/set-up-the-mcp-server.md). It serves the same
corpus, read-only, to a consumer that is not a terminal on this machine.
<!-- dist:strip-start -->
Wer am Stack selbst arbeiten will, klont dieses Repo. Das ist eine Entwicklungsumgebung mit
Demo-Korpus und keine Instanz; sie steht in [docs/dev/development.md](docs/dev/development.md).
To work on the stack itself, clone this repository instead. That is a development checkout with a
demo corpus, not an instance; it is described in [docs/dev/development.md](docs/dev/development.md).
<!-- dist:strip-end -->
## Was vorher da sein muss
## What you need first
Diese Programme prüft der Preflight, bevor irgendein `wikitool`-Befehl läuft. Installieren musst
du sie selbst - der Agent tut es nie, auch nicht mit deiner Zustimmung. Wo eines fehlt, nennt
der Preflight den Installationsbefehl für dein System. Die Liste wird aus
`tools/prerequisites.txt` erzeugt, derselben Datei, die der Preflight liest:
The preflight checks these programs before any `wikitool` command runs. You install them
yourself - the agent never does, not even with your permission. Where one is missing, the
preflight names the install command for your system. The list is generated from
`tools/prerequisites.txt`, the same file the preflight reads:
<!-- wikitool:prerequisites -->
- **Python** ≥ 3.11
@@ -29,166 +29,166 @@ der Preflight den Installationsbefehl für dein System. Die Liste wird aus
- **ripgrep (rg)**
<!-- /wikitool:prerequisites -->
Dazu:
You also need:
- **Ein Agent-Harness**: Claude Code, GitHub Copilot (in VS Code oder als CLI), Codex CLI oder
- **An agent harness**: Claude Code, GitHub Copilot (in VS Code or as a CLI), Codex CLI or
Mistral Vibe.
- **Ein leeres Verzeichnis**, in dem die Instanz liegen soll, und dein Harness darin geöffnet.
Leer heißt: nichts außer einem `.git`. Ein frisch geklontes, leeres Repo für deine Instanz ist
also genau richtig - liegt dein Repo `torben/nathan` etwa in `~/src/nathan`, installierst du
dorthin, und der Agent übernimmt dessen `origin` als Ziel für `publish`.
- **An empty folder** for the instance, with your harness opened in it. Empty means nothing but a
`.git`. A freshly cloned, empty repository for your instance is exactly right: if your
repository `torben/nathan` lives in `~/src/nathan`, install there, and the agent keeps its
`origin` as the target for `publish`.
Unter Windows zusätzlich, ebenfalls vom Preflight geprüft:
On Windows, additionally, also checked by the preflight:
<!-- wikitool:prerequisites-windows -->
- **PowerShell 7 (pwsh)** ≥ 7
<!-- /wikitool:prerequisites-windows -->
Und außerdem:
And on Windows also:
- **PowerShell 7 als Standardterminal in VS Code.** Windows PowerShell 5.1 reicht nicht, und WSL
ist nicht vorgesehen.
- **Execution Policy `RemoteSigned`** - auf vielen Rechnern ab Werk gesetzt
(`Get-ExecutionPolicy -List` zeigt es).
- **Git for Windows.** Es bringt Git Bash mit, in dem Claude Code seine Befehle ausführt.
- **Ein Installationsverzeichnis mit höchstens 95 Zeichen**, zum Beispiel `C:\Chemenu`. Windows
erlaubt ohne eingeschaltete lange Pfade nur 259 Zeichen je Pfad, und die Dateien des Wikis
brauchen den Rest. Wer Administratorrechte hat, kann stattdessen lange Pfade einschalten
(`LongPathsEnabled`); verlangt wird das nicht.
- **PowerShell 7 as the default terminal in VS Code.** Windows PowerShell 5.1 is not enough, and
WSL is not supported.
- **Execution policy `RemoteSigned`** - the factory setting on many machines
(`Get-ExecutionPolicy -List` shows it).
- **Git for Windows.** It brings Git Bash, which Claude Code runs its commands in.
- **An installation folder of at most 95 characters**, for example `C:\Chemenu`. Without long
paths switched on, Windows allows only 259 characters per path, and the wiki's files need the
rest. If you have administrator rights you can switch long paths on instead
(`LongPathsEnabled`); that is not required.
## Der Satz für den Agenten
## The sentence for the agent
Öffne das leere Verzeichnis in deinem Harness und gib dem Agenten diesen Satz:
Open the empty folder in your harness and give the agent this sentence:
> Richte in diesem Verzeichnis eine neue Chemenu-Instanz ein. Hol dazu das neueste Release von
> `https://gitea.nehmer.net/api/v1/repos/torben/chemenu/releases/latest` und folge dessen Asset
> `setup-instance.md`. Lies vor dem Start des Preflights das Asset `preflight.md` aus demselben
> Release.
> Set up a new Chemenu instance in this folder. Fetch the latest release from
> `https://gitea.nehmer.net/api/v1/repos/torben/chemenu/releases/latest` and follow its asset
> `setup-instance.md`. Before you start the preflight, read the asset `preflight.md` from the same
> release.
Damit liest der Agent die Beschreibung des neuesten Releases und daraus die beiden Anleitungen.
Dann lädt er das passende Preflight-Skript (`preflight.ps1` für PowerShell, `preflight.sh` für
eine POSIX-Shell) mit einem Befehl seiner Shell ins Verzeichnis - nicht über den Browser, damit
Windows die Datei nicht als „aus dem Internet“ markiert - und startet es. Das Skript lädt den
Tarball desselben Releases, prüft dessen sha256, entpackt ihn in das Verzeichnis, löscht sich
selbst und prüft dann im entpackten Baum, ob alles da ist.
With that, the agent reads the description of the latest release, and from it the two
instructions. It then downloads the matching preflight script (`preflight.ps1` for PowerShell,
`preflight.sh` for a POSIX shell) into the folder with a command of its shell - not through the
browser, so that Windows does not mark the file as "from the internet" - and runs it. The script
downloads the tarball of the same release, checks its sha256, unpacks it into the folder, deletes
itself, and then checks in the unpacked tree that everything is in place.
Die Liste aller Releases: <https://gitea.nehmer.net/torben/chemenu/releases>. Das Repo ist
öffentlich; der Download braucht weder Konto noch Token.
All releases are listed at <https://gitea.nehmer.net/torben/chemenu/releases>. The repository is
public; the download needs neither an account nor a token.
## Was der Agent dich fragt
## What the agent asks you
Raten darf der Agent keine dieser Antworten, und keine übernimmt er aus einem anderen Repo:
The agent may guess none of these answers, and it carries none of them over from another
repository:
- <!-- setup-question: identity --> **Autor-Identität** - Name und E-Mail für `git config`. Das ist
zugleich der Autorname jeder künftig angelegten Wiki-Seite (`$WIKI_AUTHOR` überschreibt ihn bei
Bedarf).
- <!-- setup-question: remote --> **Remote** - bei einem leeren Klon nur die Bestätigung, dass
`origin` stimmt; sonst eine URL, wenn du auf einen Server pushen willst. Ohne Remote bleibt die
Instanz lokal, und jedes `publish` läuft mit `--no-push`.
- <!-- setup-question: kb-language --> **Sprache und Ton der Seiten** - sie landen in
`kb/CONVENTIONS.md`, dazu je Collection `kb/<name>/COLLECTION.md`. Fertige Profile, darunter ein
vollständiges deutsches, hält `instructions/kb-profiles.md` bereit. Entscheide das **vor dem
ersten Ingest**: Danach ist ein Wechsel der Abschnittsnamen eine Migration jeder bestehenden
Seite. Titel, Wikilink-Ziele, Zitat-IDs, Schema-Werte, Tags, Befehle und Pfade folgen keiner
Sprache - `Act Runner` heißt in jeder Instanz `Act Runner`.
- <!-- setup-question: domain --> **Anwendungsgebiet** - woraus dieses Wiki seine Quellen zieht.
Daraus schlägt der Agent eine `source_type`-Liste vor (bei einem Verein etwa Satzung, Protokoll,
Spielbericht). Das ist ein Startpunkt, keine Festlegung: Später wird sie an echtem Bestand
korrigiert (`instructions/evolve-subtypes.md`).
- <!-- setup-question: personalization --> **Personalisierung** - wer diese Instanz bedient
(`USER.md`) und wie sie klingt (`SOUL.md`). Der Agent interviewt dich entlang der Vorlagen und
schreibt deine Antworten wörtlich mit. Zwei Fragen beantwortest nur du: den **Namen der Persona**
und die **Themen, die bewusst draußen bleiben**.
- <!-- setup-question: environment --> **Umgebung** (optional) - Harness, MCP-Server, Remotes,
damit spätere Sitzungen nicht erneut fragen. „Weiß ich nicht“ ist eine gültige Antwort.
- <!-- setup-question: telemetry --> **Telemetrie** - standardmäßig aus; der Agent fragt nur, ob du
sie einschalten willst.
- <!-- setup-question: task-tracker --> **Aufgaben-Tracker** (optional) - siehe
- <!-- setup-question: identity --> **Author identity** - name and email for `git config`. This is
also the author name of every wiki page created from now on (`$WIKI_AUTHOR` overrides it when
needed).
- <!-- setup-question: remote --> **Remote** - for an empty clone, only the confirmation that
`origin` is right; otherwise a URL, if you want to push to a server. Without a remote the
instance stays local, and every `publish` runs with `--no-push`.
- <!-- setup-question: kb-language --> **Language and tone of the pages** - they go into
`kb/CONVENTIONS.md`, plus `kb/<name>/COLLECTION.md` per collection. Ready-made profiles,
including a complete German one, are in `instructions/kb-profiles.md`. Decide this **before the
first ingest**: afterwards, changing the section names is a migration of every existing page.
Titles, wikilink targets, citation ids, schema values, tags, commands and paths follow no
language - `Act Runner` is called `Act Runner` in every instance.
- <!-- setup-question: domain --> **Subject area** - where this wiki draws its sources from. From
it the agent proposes a `source_type` list (for a sports club, say: statutes, minutes, match
report). That is a starting point, not a commitment: it gets corrected against real material
later (`instructions/evolve-subtypes.md`).
- <!-- setup-question: personalization --> **Personalization** - who operates this instance
(`USER.md`) and how it sounds (`SOUL.md`). The agent interviews you along the templates and
writes your answers down verbatim. Two questions only you answer: the **name of the persona**
and the **topics that deliberately stay out**.
- <!-- setup-question: environment --> **Environment** (optional) - harness, MCP servers, remotes,
so that later sessions don't ask again. "I don't know" is a valid answer.
- <!-- setup-question: telemetry --> **Telemetry** - off by default; the agent only asks whether
you want to switch it on.
- <!-- setup-question: task-tracker --> **Task tracker** (optional) - see
[docs/reference/configuration.md](docs/reference/configuration.md#task-tracker).
Am Ende legt der Agent den ersten Commit an. Dabei hält das Mass-Update-Gate an (Exit 42), weil
eine neue Instanz aus weit mehr als zehn Dateien besteht. Das ist erwartet: Der Agent zeigt dir
die Dateiliste und die `--confirm`-Zeile, und erst nach deiner Freigabe wird veröffentlicht.
Danach startest du die Agent-Sitzung im selben Verzeichnis neu, damit sie die Skills lädt.
At the end the agent makes the first commit. The Mass-Update Gate stops it there (exit 42),
because a new instance consists of far more than ten files. That is expected: the agent shows you
the file list and the `--confirm` line, and nothing is published until you approve. Afterwards,
restart the agent session in the same folder so that it loads the skills.
## Wenn der Agent anhält
## When the agent stops
Der Preflight hält mit **Exit 42** an, wenn du etwas tun musst. Seine Ausgabe nennt in einem
nummerierten Block, was fehlt, warum, den Befehl, der es behebt, und wie es weitergeht. Der
Agent zeigt dir diesen Block unverändert, setzt eine Übersetzung höchstens darunter und wartet.
Sag ihm Bescheid, wenn du fertig bist; dann prüft er erneut. Ausweichen oder selbst installieren
darf er nicht.
The preflight stops with **exit 42** when you have to do something. Its output names, in a
numbered block, what is missing, why, the command that fixes it, and how to continue. The agent
shows you this block unchanged, adds a translation below it at most, and waits. Tell it when you
are done; then it checks again. It may not work around the stop or install anything itself.
**Beim Herunterladen und Entpacken** (das Skript aus dem Release, bevor es einen Baum gibt):
**While downloading and unpacking** (the script from the release, before there is a tree):
- **Werkzeuge zum Laden oder Entpacken fehlen** (Exit 42). Unter Linux und macOS braucht das
Skript `curl`, `tar` und `sha256sum` (oder `shasum`), unter Windows nur das `tar.exe` aus
Windows 10/11. Installiere, was die Ausgabe nennt; unter Windows liefert Git for Windows alles
für Git Bash mit.
- **Das Verzeichnis ist zu lang** (Exit 42, nur Windows ohne lange Pfade). Nimm ein kürzeres,
etwa `C:\Chemenu`, öffne es im Harness und gib den Satz dort noch einmal.
- **Das Verzeichnis ist nicht leer** (Exit 1). Es darf nichts enthalten außer dem Skript und
einem `.git`. Räume es selbst auf oder nimm ein anderes - der Agent löscht dort nichts.
- **Download fehlgeschlagen oder Prüfsumme falsch** (Exit 1). Es wurde nichts entpackt. Prüf die
Internetverbindung und lass es erneut versuchen; einen anderen Download-Weg sucht der Agent
nicht. Ohne direkten Download kannst du Tarball und `.sha256` von der Release-Seite selbst
nebeneinander ablegen; der Agent startet das Skript dann mit `--archive <tarball>`.
- **Tools for downloading or unpacking are missing** (exit 42). On Linux and macOS the script
needs `curl`, `tar` and `sha256sum` (or `shasum`); on Windows only the `tar.exe` that comes
with Windows 10/11. Install what the output names; on Windows, Git for Windows brings
everything for Git Bash.
- **The folder path is too long** (exit 42, only on Windows without long paths). Take a shorter
one, such as `C:\Chemenu`, open it in the harness and give the sentence there again.
- **The folder is not empty** (exit 1). It may hold nothing but the script and a `.git`. Clean it
up yourself or take another one - the agent deletes nothing there.
- **Download failed or checksum wrong** (exit 1). Nothing was unpacked. Check the internet
connection and let it try again; the agent does not look for another way to download. Without a
direct download you can put the tarball and its `.sha256` from the release page side by side
yourself; the agent then runs the script with `--archive <tarball>`.
**Im entpackten Baum** (jeder weitere Lauf ist `tools/preflight.sh` bzw. unter PowerShell
**In the unpacked tree** (every further run is `tools/preflight.sh`, or under PowerShell
`pwsh -NoProfile -ExecutionPolicy Bypass -File tools/preflight.ps1`):
- **Ein Werkzeug fehlt** - Python, git, ripgrep, unter Windows auch PowerShell 7. Die Ausgabe
nennt den Installationsbefehl für dein System. Ist es schon installiert, nur woanders, nenn dem
Agenten den Pfad; er reicht ihn mit `--set <werkzeug>=<pfad>` weiter.
- **Eine Version ist zu alt** - zum Beispiel Python unter 3.11. Neuere Version installieren oder
deren Pfad nennen.
- **Ein genannter Pfad funktioniert nicht** - der Pfad muss auf das Programm selbst zeigen, nicht
auf seinen Ordner.
- **Die Python-Umgebung (`tools/.venv`) oder ihre Bibliotheken ließen sich nicht einrichten.** Die
Ausgabe zeigt, was Python oder pip gemeldet haben. Meist blockiert ein Proxy oder ein
Sicherheitsprogramm den Download; das klärt, wer deinen Rechner betreut.
- **Skripte tragen die Markierung „aus dem Internet“** (nur Windows). Das passiert, wenn das
Release im Browser geladen und im Explorer entpackt wurde. Einmal im Verzeichnis, in
PowerShell 7: `Get-ChildItem -Recurse -File | Unblock-File`. `doctor` zeigt den Stand unter
`script-marks`.
- **Die Execution Policy verbietet Skripte** (`Restricted` oder `AllSigned`, nur Windows). Die
Ausgabe nennt die eine Zeile für ein PowerShell-7-Fenster
(`Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned`). Setzt eine
Gruppenrichtlinie sie, hilft nur die IT - oder du arbeitest aus Git Bash mit `tools/wikitool`.
`doctor` zeigt den Stand unter `execution-policy`.
- **Das Installationsverzeichnis ist zu lang** (nur Windows ohne lange Pfade). Die Instanz muss
in ein kürzeres Verzeichnis umziehen, etwa `C:\Chemenu`.
- **A tool is missing** - Python, git, ripgrep, on Windows also PowerShell 7. The output names
the install command for your system. If it is installed, just somewhere else, tell the agent the
path; it passes it on with `--set <tool>=<path>`.
- **A version is too old** - Python below 3.11, for example. Install a newer version or name its
path.
- **A path you named does not work** - the path must point at the program itself, not at its
folder.
- **The Python environment (`tools/.venv`) or its libraries could not be set up.** The output
shows what Python or pip reported. Usually a proxy or a security program blocks the download;
whoever looks after your machine can sort that out.
- **Scripts carry the "from the internet" mark** (only on Windows). That happens when the release
was downloaded in the browser and unpacked in Explorer. Once, in the folder, in PowerShell 7:
`Get-ChildItem -Recurse -File | Unblock-File`. `doctor` shows the state under `script-marks`.
- **The execution policy forbids scripts** (`Restricted` or `AllSigned`, only on Windows). The
output names the one line for a PowerShell 7 window
(`Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned`). If a group policy sets
it, only your IT department can help - or you work from Git Bash with `tools/wikitool`. `doctor`
shows the state under `execution-policy`.
- **The installation folder path is too long** (only on Windows without long paths). The instance
has to move to a shorter folder, such as `C:\Chemenu`.
Hält der Agent an einer anderen Stelle an und ist die Ursache nicht offensichtlich, bietet er dir
einen Fehlerbericht an - siehe
If the agent stops anywhere else and the cause is not obvious, it offers you a bug report - see
[docs/how-to/troubleshoot.md](docs/how-to/troubleshoot.md).
## Verifikation
## Check the instance
```bash
tools/wikitool doctor
```
Prüft in einem Aufruf: Abhängigkeiten, Autor-Auflösung, Git-Identität/Branch/Remote,
publizierte Skills, Struktur (Collection-Contracts, generierte Dateien), Personalization
(`USER.md`/`SOUL.md` vorhanden **und** ausgefüllt), die optionale Umgebungsnotiz
(`ENVIRONMENT.md`), den Aufgaben-Tracker (`.wikitool-tasks.json` - fehlt sie, ist das `OK`; ist
ein Provider konfiguriert, zusätzlich ob sein Lesepfad bereitsteht und seine API gerade
antwortet, beides nie ein `FAIL`) und die Session-ID.
`OK`/`WARN` sind unbedenklich (ein fehlender Remote z. B. ist ein gültiger Endzustand); nur ein
`FAIL` bricht mit exit 1 ab, und jede Zeile nennt ihr eigenes Fix-Kommando.
This checks in one call: dependencies, author resolution, git identity/branch/remote, published
skills, structure (collection contracts, generated files), personalization (`USER.md`/`SOUL.md`
present **and** filled in), the optional environment note (`ENVIRONMENT.md`), the task tracker
(`.wikitool-tasks.json` - if it is missing, that is `OK`; if a provider is configured, also
whether its read path is ready and its API is answering right now, neither ever a `FAIL`) and the
session id. `OK`/`WARN` are harmless (a missing remote, for example, is a valid end state); only a
`FAIL` ends with exit 1, and every line names its own fix command.
Danach zusätzlich:
Then also:
```bash
tools/wikitool docs verify
tools/wikitool instructions verify
```
## Danach
## Next steps
- **Aktualisieren** auf ein neueres Release: [docs/how-to/update-an-instance.md](docs/how-to/update-an-instance.md).
- **Konfiguration** - Umgebungsvariablen und die Dateien pro Checkout:
- **Your first source and your first answer:**
[docs/tutorials/first-source-to-first-answer.md](docs/tutorials/first-source-to-first-answer.md)
walks you through both in the instance you just set up.
- **Updating** to a newer release: [docs/how-to/update-an-instance.md](docs/how-to/update-an-instance.md).
- **Configuration** - environment variables and the files per checkout:
[docs/reference/configuration.md](docs/reference/configuration.md).
- **Wenn etwas nicht geht:** [docs/how-to/troubleshoot.md](docs/how-to/troubleshoot.md).
- **Mit dem Wiki arbeiten:** [docs/how-to/](docs/how-to/README.md).
- **When something does not work:** [docs/how-to/troubleshoot.md](docs/how-to/troubleshoot.md).
- **Working with the wiki:** [docs/how-to/](docs/how-to/README.md).