Passives Default-Shell-Feld reichte nicht: Agent tippte weiter POSIX (VAR=$(...)) in eine fish-Shell. Neue MANDATORY-Sektion 'Terminal-Syntax' in der Framework-Sektion beider copilot-instructions.md mit exaktem Fehlerbild und deterministischem Ausweg (nicht-triviale Logik in .sh mit Shebang, bash datei.sh). Memory-Notiz shell-syntax.md ergaenzt. History + PROJECT_CONTEXT aktualisiert.
6.8 KiB
Session History
Prompt 1
nimm mal mit auf was die default shell auf dem system ist auf dem entwickelt wird, bei mir ist das fast immer fish und das sollte als default drin stehen aber auch änderbar sein bzw. bei einem neuen repo neu hinzugefügt werden muss.
Antwort 1
Ich habe ein Default-Shell-Feld eingeführt, das (a) standardmäßig fish enthält, (b) jederzeit manuell änderbar ist und (c) beim Bootstrap eines neuen Repos automatisch aus $SHELL des Entwicklungssystems gesetzt wird.
Zentrale Designentscheidung: Das Feld liegt in der Projekt-Sektion der copilot-instructions.md (nach dem ersten ---). Grund: copilot-update schreibt die Framework-Sektion (vor ---) bei jedem Update neu — nur hinter --- überlebt ein repo-/maschinenspezifischer Wert. Diese Constraint habe ich zusätzlich im Repo-Memory festgehalten.
Geänderte Dateien (7):
.github/copilot-instructions.md # neue Sektion "🖥 Entwicklungsumgebung" mit "- **Default-Shell:** fish" (nach ---)
git-templates/.github/copilot-instructions.md # gleiche Sektion im Template (Wert wird beim Bootstrap ersetzt)
scripts/copilot-bootstrap.sh # $SHELL-Erkennung (basename, Fallback fish, Whitelist ^[a-z0-9_-]+$) + _set_dev_shell()
scripts/copilot-bootstrap.fish # Parität zur sh-Version (string match -qr Validierung, functions -e Cleanup)
scripts/selftest.sh # neue Fälle: Default-Shell-Zeile vorhanden + SHELL=zsz/leer → korrekter Wert (sh & fish)
docs/MAINTAINER.md # Designentscheidung + Fallstrick "Feld nach --- platzieren" dokumentiert
git-templates/docs/MAINTAINER.md # Default-Shell-Feld für neue Repos erklärt
Implementierungsdetails der Erkennung (identisch in sh und fish):
$SHELL→basename(z. B./usr/bin/fish→fish); leeres$SHELL→ Fallbackfish.- Wert gegen
^[a-z0-9_-]+$geprüft (verhindert sed-Injection), sonst Fallbackfish. _set_dev_shell()ersetzt die- **Default-Shell:** …-Zeile nur in frisch erzeugtencopilot-instructions.md(bestehende Dateien bleiben unangetastet → User-Anpassung bleibt erhalten).
Prompt 2
War das hier alles abgeschlossen und committed, dokumentiert und gepusht?
Antwort 2
Nein — der Code war fertig und validiert, aber nicht committed, nicht in die History dokumentiert und nicht gepusht; zusätzlich lag der lokale Branch 1 Commit hinter origin/master. Ich habe den Zustand geprüft, das fehlende Remote-Commit integriert, alles validiert und anschließend History + Kontext geschrieben, committed und gepusht.
Statusprüfung:
git status → 7 unstaged Dateien, "behind 'origin/master' by 1 commit"
git log --oneline @{u}.. → leer (nichts unpushed, weil nichts committed)
sh -n / fish -n → bootstrap.sh OK, selftest.sh OK, bootstrap.fish OK
sh scripts/selftest.sh → 6/6 PASS (inkl. neuer Shell-Erkennungsfälle)
Integration des Remote-Commits (e83c333 docs: add rd13 infrastructure conventions) trotz dirty tree — die 3 überlappenden Dateien hatten Hunks an unterschiedlichen Stellen, daher konfliktfrei:
git stash push -m dev-shell-feature-wip -- <7 Dateien>
git pull --ff-only # 5dc89f0 → e83c333, Fast-forward
git stash pop # Auto-merge: docs/MAINTAINER.md, git-templates/{.github/copilot-instructions,docs/MAINTAINER}.md → exit 0, keine Konflikte
Verifikation nach Merge: beide Änderungssätze (rd13_-Blöcke + Default-Shell) in allen überlappenden Dateien vorhanden, Selftest erneut 6/6 PASS.
Danach: Session-History (diese Datei) angelegt, PROJECT_CONTEXT.md aktualisiert, committed (pre-commit Quality Gate bestanden) und nach origin/master gepusht.
Prompt 3
ja lokal ausrollen
Antwort 3
Reihenfolge laut Fallstrick-Regel eingehalten (erst committed+gepusht, dann deployt). Vollständiger fish-Deploy ausgeführt, der sowohl die Bin-Skripte als auch ~/.git-templates/ aktualisiert:
fish scripts/deploy.fish
Ergebnis (Auszug): ✓ copilot-bootstrap.sh installed to ~/.local/bin/, ✓ copilot-bootstrap.fish installed, ✓ git-templates deployed → /home/shs-schc/.git-templates.
Verifikation (Bin = Repo, Template trägt Feld, End-to-End-Smoke-Test):
for s in copilot-bootstrap.sh copilot-bootstrap.fish
if diff -q ~/.local/bin/$s scripts/$s >/dev/null 2>&1
echo " OK identisch: $s"
else
echo " DIFF: $s"
end
end
grep -n '^- \*\*Default-Shell:\*\*' ~/.git-templates/.github/copilot-instructions.md
set tmp (mktemp -d); git -C $tmp init -q; sh ~/.local/bin/copilot-bootstrap.sh $tmp >/dev/null 2>&1
grep '^- \*\*Default-Shell:\*\*' "$tmp/.github/copilot-instructions.md"; rm -rf $tmp
Output: beide Skripte OK identisch, Template Zeile 66 - **Default-Shell:** fish, Smoke-Test schrieb - **Default-Shell:** fish (erkannt aus SHELL=/bin/fish).
Fehler dabei: Der erste Verifikations-Versuch war in POSIX-Syntax (tmp=$(mktemp -d), for…do…done) in eine fish-Shell getippt → fish: Unsupported use of '='. Hintergrund-Terminal verworfen, fish-nativ neu geschrieben.
Prompt 4
Der Befehl war in POSIX-Syntax geschrieben, aber das Terminal ist fish — daher die Syntaxfehler. Ich räume das Hintergrund-Terminal weg und schreibe die Verifikation fish-nativ.
Das das nicht mehr passiert habe ich dich angewiesen die letzten änderungen zu machen. jetzt passiert das immer noch. Warum und was müssen wir noch anpassen das das nicht mehr passiert das nervt!!!!
Antwort 4
Ursachenanalyse: Das Default-Shell-Feld war nicht das Problem — die Information stand bereits in meinem Kontext (in copilot-instructions.md und der Terminal-Tool-Beschreibung „persistent fish terminal session"). Ein passives Datenfeld ändert das Modellverhalten aber nicht zuverlässig; mein Default-Reflex ist POSIX/bash. Das Feld war zudem schwach formuliert und stand in der unteren Projekt-Sektion statt als harte Regel oben.
Drei Hebel umgesetzt:
- Imperative Regel statt Beschreibung — neue Sektion „🖥 Terminal-Syntax (MANDATORY)" in der Framework-Sektion beider
copilot-instructions.md(dieses Repo + Template). Mit exaktem Fehlerbild (VAR=$(cmd)→ fish-Abbruch) und dem deterministischen Ausweg: alles Nicht-Triviale in eine.sh-Datei mit#!/usr/bin/env bashschreiben undbash datei.shausführen → Prompt-Shell-Syntax wird irrelevant. - Memory-Notiz
/memories/shell-syntax.md— wird jede Session automatisch geladen, wirkt direkt auf mein Verhalten über Sessions hinweg. - Template + Redeploy — neue Repos erben die Regel;
~/.git-templatesnach Commit/Push neu deployt.
Geänderte Dateien: .github/copilot-instructions.md, git-templates/.github/copilot-instructions.md, /memories/shell-syntax.md (User-Memory), History + PROJECT_CONTEXT.