# Tatsachenbericht: Installation von Chemenu (Weg D) unter Windows Reine Faktensammlung für ein Post-Mortem / Issue-Report. Keine Interpretation, keine Bewertung, keine Handlungsempfehlung - nur was tatsächlich passiert ist, in chronologischer Reihenfolge, mit Originaltexten wo verfügbar. ## Kontext - Ziel-Repo: https://gitea.nehmer.net/torben/chemenu - Angewendetes Vorgehen: `INSTALL.md`, Abschnitt "Weg D: Private Instanz mit diesem Repo als Upstream", ergänzt um `instructions/private-instance.md`. - Client: GitHub Copilot Chat in VS Code, Agent-Modus, Windows-Arbeitsstation. - Angaben des Nutzers zur Modellnutzung in dieser Sitzung (vom Nutzer so mitgeteilt, vom Assistenten nicht selbst verifizierbar): Mix aus Sonnet 5, GPT-5.3 Codex und GPT-5.6 Luna, geschätzter Verbrauch rund 250-300 Credits. - Zielverzeichnis (lokal): `C:\Repositories\Chemenu` - Privates Origin-Repo (lokal, bare, neu angelegt, da noch nicht existent): `C:\OneDrive - Agenic GmbH\Chemenu.git` - Öffentliches Upstream-Repo (fetch-only): `https://gitea.nehmer.net/torben/chemenu.git` - Git-Identität (Windows, global, bereits vorhanden): `Torben Nehmer ` ## 1. Prüfung der Voraussetzungen (nativ Windows, PowerShell) Befehl: `python --version; git --version; rg --version; choco --version` Ergebnis: - `python`: nicht gefunden ("Der Begriff „python" wird nicht als Name eines Cmdlets ... erkannt") - `git`: `git version 2.55.0.windows.5` - `rg` (ripgrep): `ripgrep 15.2.0 (rev e89fff89ac)` - `choco`: `2.7.4` Auf Nachfrage (`vscode_askQuestions`), ob Python per Chocolatey installiert werden soll, antwortete der Nutzer per Freitext: "python ist bereits mit choch installiert. C:\Python314". Prüfung: `Test-Path 'C:\Python314\python.exe'` → `True`; `& 'C:\Python314\python.exe' --version` → `Python 3.14.7`; `$env:Path -split ';' | Select-String -Pattern 'Python'` zeigte `C:\Python314\Scripts\` und `C:\Python314\` bereits im PATH. Ein erneuter Aufruf von `python --version` im selben Terminal lieferte danach `Python 3.14.7` (der identische Befehl war unmittelbar zuvor mit "nicht gefunden" fehlgeschlagen; die Ursache für den Unterschied zwischen den beiden Aufrufen wurde nicht weiter untersucht). ## 2. Einrichtung der zwei Remotes (Weg D, Schritte 1-2) Auf Nachfrage nach privater Repo-URL, Zielverzeichnis und Autor-Identität antwortete der Nutzer: - Privates Repo: `"C:\OneDrive - Agenic GmbH\Chemenu.git"` - Zielverzeichnis: `C:\Repositories\Chemenu` - Autor-Identität: leer gelassen (Freitext-Feld leer) Geprüft: Zielverzeichnis war leer (`list_dir` → "Folder is empty"). Globale Git-Identität war bereits gesetzt (`git config --global user.name` → `Torben Nehmer`, `git config --global user.email` → `torben.nehmer@agenic.com`). `Test-Path 'C:\OneDrive - Agenic GmbH\Chemenu.git'` → `False` (Pfad existierte noch nicht). Durchgeführte Befehle: ``` git init --bare "C:\OneDrive - Agenic GmbH\Chemenu.git" git clone https://gitea.nehmer.net/torben/chemenu.git "C:\Repositories\Chemenu" cd "C:\Repositories\Chemenu" git remote rename origin upstream git remote add origin "C:\OneDrive - Agenic GmbH\Chemenu.git" git remote set-url --push upstream no_push git push -u origin main ``` Alle Befehle liefen ohne Fehler durch. `git remote -v` zeigte danach: ``` origin C:\OneDrive - Agenic GmbH\Chemenu.git (fetch) origin C:\OneDrive - Agenic GmbH\Chemenu.git (push) upstream https://gitea.nehmer.net/torben/chemenu.git (fetch) upstream no_push (push) ``` ## 3. Erster Versuch: Tool-Venv nativ unter Windows Befehl: `cd tools; python -m venv .venv; .venv\Scripts\pip install -r requirements.txt` Fehler: ``` ResourceUnavailable: Das Programm „pip.exe" konnte nicht ausgeführt werden: An error occurred trying to start process 'C:\Repositories\Chemenu\tools\.venv\Scripts\pip.exe' with working directory 'C:\Repositories\Chemenu\tools'. Zugriff verweigert ``` Workaround: `.venv\Scripts\python.exe -m pip install -r requirements.txt` - lief erfolgreich durch, installierte pyyaml, typer, rich, jsonschema, referencing sowie deren Abhängigkeiten (u.a. shellingham, annotated-doc, colorama, markdown-it-py, pygments, attrs, jsonschema-specifications, mdurl, rpds-py). ## 4. `tools/wikitool` hängt nativ unter Windows Befehl: `cd "C:\Repositories\Chemenu"; tools\wikitool instructions sync; tools\wikitool instructions verify` Ergebnis: Der Befehl produzierte über einen längeren Zeitraum keinerlei Ausgabe und wurde vom Terminal-Tool automatisch in den Hintergrund verschoben ("This terminal execution was moved to the background..."). Mehrfaches Abfragen (`get_terminal_output`) zeigte weiterhin keinen Fortschritt; das Terminal wurde manuell beendet (`kill_terminal`). Ursachenklärung durch Lesen von `tools/wikitool`: ``` #!/usr/bin/env bash ... if [ ! -x "$DIR/.venv/bin/python" ]; then echo "wikitool: venv not found at $DIR/.venv" >&2 echo "Run: cd tools && python3 -m venv .venv && .venv/bin/pip install -r requirements.txt" >&2 exit 1 fi export PYTHONPATH="$DIR${PYTHONPATH:+:$PYTHONPATH}" exec "$DIR/.venv/bin/python" -m chemenu.cli "$@" ``` Feststellung: `tools/wikitool` ist ein Bash-Skript mit hartkodiertem Pfad `.venv/bin/python` (POSIX-Layout). Ein mit `python -m venv` unter nativem Windows erzeugtes venv legt stattdessen `Scripts\python.exe` an (kein `bin/`-Verzeichnis). Der Aufruf aus PowerShell heraus führte nicht zu einer Fehlermeldung, sondern zu einem unbestimmten Hängenbleiben ohne Ausgabe. Angewandter Workaround (nativ Windows, ab hier für mehrere Befehle verwendet, bis auf Vollumstieg auf WSL siehe unten): ``` $env:PYTHONPATH="tools"; tools\.venv\Scripts\python.exe -m chemenu.cli ``` Damit liefen `instructions sync` ("OK Published 8 skill(s) to .agents\skills and .claude\skills") erfolgreich. ## 5. Type-Resolver-Fehler unter Windows (`instructions verify`) Befehl (per obigem Workaround): `... -m chemenu.cli instructions verify` Fehler (für alle 23 Instruction-Dateien identisch, hier gekürzt): ``` ERROR Instruction layer issues: - bootstrap.md: Type-spec C:\Repositories\Chemenu\types\instruction.md has invalid type reference: types/type-spec.md - capture-session.md: ... (identischer Fehlertext) ... (insgesamt 23 betroffene Dateien) ``` Wiederholung mit explizit gesetztem `CHEMENU_ROOT` führte zum selben Fehler. Ursachenermittlung: `grep_search` nach dem Fehlertext fand ihn in `tools/chemenu/type_resolver.py`, Zeile 181, Methode `_validate_type_spec`: ```python def _validate_type_spec(self, frontmatter, path): ... type_ref = frontmatter['type'] if type_ref != str(path.relative_to(self.repo_root)): try: parent_path = self.resolve_type_path(type_ref, path) parent_frontmatter, _ = read_page(parent_path) self._validate_type_spec(parent_frontmatter, parent_path) except ValueError: raise ValueError(f"Type-spec {path} has invalid type reference: {type_ref}") ``` Feststellung: `path.relative_to(self.repo_root)` liefert unter Windows einen Pfad mit Backslash-Trennzeichen (`str(...)` ergibt z.B. `"types\type-spec.md"`), während der in der Frontmatter gespeicherte Wert `type_ref` Forward-Slashes verwendet (`"types/type-spec.md"`). Der Selbstreferenz-Vergleich für `types/type-spec.md` (das seinen eigenen `type:`-Wert auf sich selbst referenziert) schlägt dadurch unter Windows immer fehl. Verifiziert durch direkten Python-Aufruf (`TypeResolver(...).load_type_spec('types/instruction.md')`) mit vollständigem Traceback: rekursive Aufrufe von `_validate_type_spec` (Zeile 179 → Zeile 181), endend in: ``` ValueError: Type-spec C:\Repositories\Chemenu\types\type-spec.md has invalid type reference: types/type-spec.md ``` Weitergehende Prüfung (`grep_search` nach dem Muster `str\(.*relative_to\(` im gesamten `tools/chemenu`-Baum) fand 15 Fundstellen in 12 Dateien mit demselben Muster: - `tools/chemenu/commands/_util.py:176` - `tools/chemenu/commands/docs_verify.py:473` - `tools/chemenu/commands/provenance_cmd.py:39,129` - `tools/chemenu/kb_scan.py:84,86` - `tools/chemenu/kb_state.py:70` - `tools/chemenu/lint_core.py:89` - `tools/chemenu/provenance.py:352` - `tools/chemenu/search/base.py:35` - `tools/chemenu/tests/test_mcp_server.py:112` - `tools/chemenu/tests/test_review.py:102` - `tools/chemenu/tests/test_upload.py:37` - `tools/chemenu/type_resolver.py:81,526` Angewandter lokaler Patch (nicht zurückgenommen; Verbleib im finalen Commit nicht gesondert verifiziert) in `tools/chemenu/type_resolver.py`, `_validate_type_spec`: ```python # vorher if type_ref != str(path.relative_to(self.repo_root)): # nachher if type_ref != path.relative_to(self.repo_root).as_posix(): ``` Die übrigen 14 Fundstellen mit demselben Muster wurden nicht angepasst. ## 6. Umstieg auf WSL Geprüft: `wsl --status` → Standarddistribution `archlinux`, Version 2. `where.exe bash` → `C:\Windows\System32\bash.exe` und `C:\Users\Torben.Nehmer\AppData\Local\Microsoft\WindowsApps\bash.exe`. Voraussetzungsprüfung in WSL (`archlinux`): ``` wsl -d archlinux -- bash -lc "python3 --version; git --version; rg --version; which python3 git rg" ``` Ergebnis: - `Python 3.14.5` (`/usr/sbin/python3`) - `git version 2.54.0` (`/usr/sbin/git`) - `rg`: nicht gefunden ("bash: line 1: rg: command not found"), Exit-Code 1 Installation von ripgrep: - Erster Versuch `sudo -n pacman -S --noconfirm ripgrep` scheiterte: ``` error: failed retrieving file 'ripgrep-15.1.0-3-x86_64.pkg.tar.zst' from frankfurt.mirror.pkgbuild.com : The requested URL returned error: 404 error: failed retrieving file 'ripgrep-15.1.0-3-x86_64.pkg.tar.zst' from mirror.metalgamer.eu : The requested URL returned error: 404 error: failed retrieving file 'ripgrep-15.1.0-3-x86_64.pkg.tar.zst' from mirror.netcologne.de : The requested URL returned error: 404 error: failed retrieving file 'ripgrep-15.1.0-3-x86_64.pkg.tar.zst' from ftp.tu-chemnitz.de : The requested URL returned error: 404 error: failed to commit transaction (failed to retrieve some files) ``` - Nach `sudo -n pacman -Sy --noconfirm` (Datenbank-Refresh) wurde `ripgrep-15.2.0-1-x86_64` erfolgreich installiert. Danach: `python3 --version` → `Python 3.14.5`, `git --version` → `git version 2.54.0`, `rg --version` → `ripgrep 15.2.0`. ## 7. Neuanlage des Tool-Venv unter WSL Befehl: ``` wsl -d archlinux -- bash -lc "cd /mnt/c/Repositories/Chemenu/tools && rm -rf .venv && python3 -m venv .venv && .venv/bin/pip install -q -r requirements.txt && echo DONE" ``` Ergebnis: erfolgreich, mit Hinweis auf verfügbares Pip-Update (`26.1.1 -> 26.2.1`, nicht durchgeführt), Ausgabe endete mit `DONE`. ## 8. CRLF-Problem beim ersten `wikitool`-Aufruf unter WSL Befehl: ``` wsl -d archlinux -- bash -lc "cd /mnt/c/Repositories/Chemenu && tools/wikitool instructions sync && tools/wikitool instructions verify" ``` Fehler: ``` env: 'bash\r': No such file or directory env: use -[v]S to pass options in shebang lines env: 'bash\r': No such file or directory env: use -[v]S to pass options in shebang lines ``` Exit-Code 1. Diagnose: `git config core.autocrlf` (Windows-seitig) stand auf `true`; ein direkter Check bestätigte, dass `tools/wikitool` auf der Festplatte CRLF-Zeilenenden enthielt (`(Get-Content -Raw tools\wikitool) -match "` `r` `n"` → `True`); es existierte keine `.gitattributes`-Datei im Repo. Fix (Windows-seitig, PowerShell): ``` git config core.autocrlf input git rm --cached -r . -q git reset --hard -q ``` Danach: `git status --short` leer (clean), erneute Prüfung `(Get-Content -Raw tools\wikitool) -match "` `r` `n"` → `False`. Erneuter Versuch von `instructions sync`/`instructions verify` unter WSL: ``` OK Published 8 skill(s) to .agents/skills and .claude/skills OK 23 instruction(s) and 8 skill(s) valid, 16 published copy/copies match their source. ``` ## 9. Fehlende Git-Identität innerhalb von WSL Befehl: `wsl -d archlinux -- bash -lc "cd /mnt/c/Repositories/Chemenu && tools/wikitool doctor"` Relevanter Ausschnitt aus dem Ergebnis: ``` FAIL author: Neither $WIKI_AUTHOR nor `git config user.name` resolves fix: Run `git config user.name ""`, or export WIKI_AUTHOR ... FAIL git-identity: `git config user.name` is not set fix: Run `git config user.name ""` ``` (Alle übrigen Doctor-Checks zu diesem Zeitpunkt: OK, bis auf die zwei zu diesem Zeitpunkt erwarteten WARNs `publish-remotes` und `session-id`.) Feststellung: Die Windows-seitig bereits gesetzte globale Git-Identität war in der WSL-Umgebung nicht vorhanden (separate Git-Konfiguration). Fix: ``` git config user.name 'Torben Nehmer' git config user.email 'torben.nehmer@agenic.com' ``` (innerhalb WSL, repo-lokal, nicht global). Danach `doctor` → `OK author`, `OK git-identity`. ## 10. Publish-Remote-Gate scharfgeschaltet Datei `.wikitool-remotes.json` (im Repo-Root) angelegt mit Inhalt: ```json { "schema": 1, "allowed_push_urls": ["C:\\OneDrive - Agenic GmbH\\Chemenu.git"] } ``` Wert geprüft gegen `git remote get-url --push origin` → `C:\OneDrive - Agenic GmbH\Chemenu.git` (exakte Übereinstimmung). `doctor` danach: ``` OK publish-remotes: Gate armed: 1 allowed push target(s) in .wikitool-remotes.json ``` ## 11. Entfernung des mitgelieferten Demo-Korpus Auf Nachfrage per `vscode_askQuestions`, ob der Demo-Korpus (`kb/`, `raw/`, ~170 Seiten laut `INSTALL.md`) gelöscht werden soll, antwortete der Nutzer: "Ja, Demo-Korpus jetzt löschen". Ermittelte Zahlen: `find kb -type f -name '*.md'` → 191 Dateien insgesamt unter `kb/`. Nach Ausschluss von `COLLECTION.md`, `INDEX.md`, `CONTRACT.md`, `CONVENTIONS.md` sowie den generierten Root-Dateien (`kb/index.md`, `kb/log.md`, `kb/provenance.md`): 182 löschbare Seiten. ### 11.1 Wiederholte Quoting-/Escaping-Probleme des Terminal-Tools bei `wsl -d archlinux -- bash -lc "..."` Mehrere Versuche, Mehrfach-Befehle inline über `bash -lc "..."` bzw. `bash -lc '...'` an `wsl` zu übergeben, scheiterten: - `sed 's#.*/##; s#\.md$##'`-artiger Befehl scheiterte mit: ``` sed: -e expression #1, char 17: unterminated 's' command ``` Die Tool-Ausgabe zeigte dabei jeweils den Hinweis "Note: The tool simplified the command to ...", d.h. der tatsächlich ausgeführte Befehlsstring wich vom eingegebenen ab (u.a. wurde `&&` durch `;` ersetzt, Backslash-Escaping verändert). - Ein minimaler Isolationstest, `wsl -d archlinux -- bash -lc 'x=hello; echo $x'`, lieferte leere Ausgabe (kein `hello`), obwohl der äußere String vollständig einfach-gequotet war. - Ein weiterer Test, `wsl -d archlinux -- bash -lc "p='...'; b=$(basename \"$p\"); echo AAA${b%.md}BBB"`, lieferte `AAABBB` (die Variablenwerte fehlten), ebenso die einfach-gequotete Variante `bash -lc 'p="..."; b=$(basename "$p"); echo AAA${b%.md}BBB'`. - Endgültig funktionsfähig war die Ausführung erst, nachdem die Logik in reguläre `.sh`-Dateien auf der Festplatte geschrieben (per Datei-Tools) und per `wsl -d archlinux -- bash /mnt/c/Repositories/Chemenu/tools/