139 lines
6.5 KiB
Markdown
139 lines
6.5 KiB
Markdown
|
|
# Portabilität & Universalität des Setups – 2026-06-10
|
|||
|
|
|
|||
|
|
## Aufgabe / Ziel
|
|||
|
|
|
|||
|
|
Das `rd13_copilot_setup` portabler und universeller machen. Aus der Analyse in
|
|||
|
|
`memory.md` wurden 12 Arbeitspakete (WP1–WP12) abgeleitet und einzeln zur
|
|||
|
|
Umsetzung freigegeben. **Umgesetzt: WP1–WP7, WP11, WP12.** Ausgeschlossen
|
|||
|
|
(auf Wunsch, separat zu besprechen): **WP8, WP9** (settings.json) und **WP10**
|
|||
|
|
(Vendor-Naming).
|
|||
|
|
|
|||
|
|
## Verlauf
|
|||
|
|
|
|||
|
|
### Prompt 1
|
|||
|
|
Nutzer die Memory datei um dieses Repo portabler und universeller zu machen. Identifiziere alle möglichen arbeitsschritte und lass uns einzeln durchgehen was wir implementieren und was nicht.
|
|||
|
|
|
|||
|
|
### Antwort 1
|
|||
|
|
`memory.md` und das gesamte Repo analysiert (Skripte, settings.json, Prompts,
|
|||
|
|
git-templates/hooks). Daraus 12 Arbeitspakete abgeleitet und gruppiert:
|
|||
|
|
- Sichere Fixes: WP1 (bootstrap.fish `$HOME` + Parität), WP2 (Zone.Identifier + .gitignore)
|
|||
|
|
- Parametrisierung: WP3 (Remote konfigurierbar), WP4 (VS-Code-Pfad-Erkennung), WP5 (Offline-Modus)
|
|||
|
|
- Invasivität: WP6 (Opt-in `git init-copilot`), WP7 (post-merge opt-in)
|
|||
|
|
- settings.json: WP8/WP9
|
|||
|
|
- Universalität: WP10 (Vendor-Namen), WP11 (CI), WP12 (Doku)
|
|||
|
|
|
|||
|
|
Triage-Fragen gestellt (`vscode_askQuestions`), vom Nutzer abgebrochen.
|
|||
|
|
|
|||
|
|
### Prompt 2
|
|||
|
|
bevor ich die fragen beantworte, was sind diese Zone Identifier?
|
|||
|
|
|
|||
|
|
### Antwort 2
|
|||
|
|
Erklärt: `*:Zone.Identifier` sind Windows-Mark-of-the-Web-Metadaten (NTFS
|
|||
|
|
Alternate Data Streams, `ZoneId=3` = aus dem Internet). Beim Lesen über den
|
|||
|
|
WSL/Linux-Layer werden sie als separate Dateien sichtbar. Reiner Download-Müll,
|
|||
|
|
gehören weder committet noch deployt → WP2: löschen + Ignore-Pattern.
|
|||
|
|
|
|||
|
|
### Prompt 3
|
|||
|
|
ok alles implementieren aber nicht WP8,WP8 und WP10. Diese WPs will ich nicht implementiert haben und danach nochmal mit dir sprechen.
|
|||
|
|
|
|||
|
|
### Antwort 3
|
|||
|
|
Scope bestätigt: WP1,2,3,4,5,6,7,11,12 umsetzen; WP8+WP9 (settings.json) und
|
|||
|
|
WP10 (Vendor-Naming) ausgeschlossen. Finalen Phasenplan erstellt (Phase 1
|
|||
|
|
Hygiene/Bug → Phase 2 Skript-Portabilität → Phase 3 CI → Phase 4 Doku) und in
|
|||
|
|
Session-Memory gesichert.
|
|||
|
|
|
|||
|
|
### Prompt 4
|
|||
|
|
Start implementation
|
|||
|
|
|
|||
|
|
### Antwort 4
|
|||
|
|
Repo-Zustand geprüft – zu diesem Zeitpunkt **kein `.git`** (entpackte
|
|||
|
|
ZIP-Kopie). Implementierung gestoppt, da kein Versionierungsziel.
|
|||
|
|
|
|||
|
|
### Prompt 5
|
|||
|
|
ok lets then stop right hiere.
|
|||
|
|
|
|||
|
|
### Antwort 5
|
|||
|
|
Gestoppt, nichts geändert. Befund (kein git-Repo) in Session-Memory festgehalten.
|
|||
|
|
|
|||
|
|
### Prompt 6
|
|||
|
|
ok jetzt nochmal implementieren im richtigen repo!
|
|||
|
|
|
|||
|
|
### Antwort 6
|
|||
|
|
Echtes Repo gefunden und verifiziert (`~/workspace/ai-tooling/rd13_copilot_setup`
|
|||
|
|
ist jetzt git-Repo, `master`→`origin/master`, volle History, HEAD `114bb5b`).
|
|||
|
|
Anschließend alle freigegebenen WPs in 4 Phasen umgesetzt und je Phase committet.
|
|||
|
|
|
|||
|
|
**Phase 1 – Hygiene & Bug (Commit `80b6248`)**
|
|||
|
|
- WP2: `.gitignore` um `*:Zone.Identifier` ergänzt (Dateien existieren im echten Checkout nicht mehr).
|
|||
|
|
- WP1: `copilot-bootstrap.fish` neu geschrieben – `/home/rd13server/` → `$HOME`, volle Parität zur `.sh` (`--with-update-hook`, `data/`, `history/`, `docs/`, Hooks, `.gitignore`-Append inkl. Zone.Identifier).
|
|||
|
|
- Verifikation:
|
|||
|
|
```sh
|
|||
|
|
fish -n scripts/copilot-bootstrap.fish # OK
|
|||
|
|
# Smoke-Test gegen /tmp-Repo + Fake-Template: alle Dateien erzeugt, idempotent
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Phase 2a – copilot-update.{sh,fish} (Commit `5890bff`)**
|
|||
|
|
- WP3: Remote-URLs aus `COPILOT_SETUP_REMOTE_SSH/_HTTP` (env) oder Config-Datei
|
|||
|
|
`~/.config/copilot-setup/config` (sh sourcet, fish parst `KEY="value"`). Env hat Vorrang.
|
|||
|
|
- WP5: Offline-Betrieb (lokaler Klon ohne `.git` nutzbar; Pull-Fehler nutzt Cache);
|
|||
|
|
fehlende/unerreichbare Quelle → graceful `exit 0` statt `exit 1`.
|
|||
|
|
- WP4: `detect_vscode_user_dir` (Server/Insiders/VSCodium/Cursor/Flatpak/macOS/Windows-WSL).
|
|||
|
|
- Verifikation (sh + fish, je 3 Szenarien):
|
|||
|
|
```
|
|||
|
|
TEST A: no remote, no cache -> graceful exit 0
|
|||
|
|
TEST B: offline local source -> templates kopiert, exit 0
|
|||
|
|
TEST C: config-file unreachable-> graceful exit 0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Phase 2b – deploy.{sh,fish} (Commit `9e14a5f`)**
|
|||
|
|
- WP6: kein globales `init.templateDir`/`git init`-Override mehr; Opt-in-Alias
|
|||
|
|
`git init-copilot`; frühere invasive Werte werden gezielt entfernt (guarded unset).
|
|||
|
|
- WP7: post-merge Auto-Deploy im Setup-Repo nur mit `--with-self-update-hook`.
|
|||
|
|
- WP4: gleiche `detect_vscode_user_dir`; `${USER:-}` gegen `set -u` abgesichert.
|
|||
|
|
- Verifikation (isoliertes HOME, kein Eingriff ins echte Repo):
|
|||
|
|
```
|
|||
|
|
deploy.sh/.fish ohne Flag -> kein alias.init, init-copilot gesetzt, kein init.templateDir, Hook gated
|
|||
|
|
--with-self-update-hook (Temp-Repo) -> post-merge hook geschrieben
|
|||
|
|
--bogus -> exit 2
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Phase 3 – CI (Commit `deca872`)**
|
|||
|
|
- WP11: `.github/workflows/ci.yml` (shellcheck + `fish -n` + `scripts/selftest.sh`).
|
|||
|
|
- `scripts/selftest.sh`: Bootstrap-Dry-Run sh+fish gegen isoliertes Fake-HOME mit Assertions.
|
|||
|
|
- `copilot-bootstrap.sh` propagiert nun ebenfalls `*:Zone.Identifier` (Parität).
|
|||
|
|
- shellcheck-Direktiven für bewusste Muster (SC2016, SC1090, SC2043).
|
|||
|
|
- Verifikation:
|
|||
|
|
```sh
|
|||
|
|
/tmp/shellcheck scripts/*.sh git-templates/hooks/* # exit 0
|
|||
|
|
sh scripts/selftest.sh # PASS sh + PASS fish
|
|||
|
|
python3 -c "import yaml; yaml.safe_load(open('.github/workflows/ci.yml'))" # YAML OK
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Phase 4 – Doku (Commit `afd5b38`)**
|
|||
|
|
- WP12: README + USER + ADMIN + MAINTAINER aktualisiert (Env/Config, Offline,
|
|||
|
|
`init-copilot`, `--with-self-update-hook`, neue Editionen). Tote IP
|
|||
|
|
`192.168.178.6` aus der Doku entfernt. MAINTAINER: CI/selftest + neue Fallstricke.
|
|||
|
|
|
|||
|
|
## Ergebnis
|
|||
|
|
|
|||
|
|
- 5 Commits (`80b6248`, `5890bff`, `9e14a5f`, `deca872`, `afd5b38`) + dieser History-Commit.
|
|||
|
|
- Alle Skripte shellcheck-sauber und `fish -n`-sauber; selftest grün (sh+fish).
|
|||
|
|
- Keine hartkodierte Infrastruktur mehr in Skripten; Standard-`git init`/`clone` unberührt.
|
|||
|
|
|
|||
|
|
## Entscheidungen
|
|||
|
|
|
|||
|
|
- `detect_vscode_user_dir` bewusst in jedem Skript dupliziert (standalone aus
|
|||
|
|
`~/.local/bin` → keine sourcebare Lib).
|
|||
|
|
- Remote-Präzedenz: env > Config-Datei; keine Quelle = graceful skip (exit 0).
|
|||
|
|
- `init.templateDir`/`alias.init` werden nur entfernt, wenn sie auf unsere
|
|||
|
|
Templates/Bootstrap zeigen (kein Eingriff in fremde Konfiguration).
|
|||
|
|
- fish liest dieselbe sh-Config-Datei per Parser (sourcet sie nicht).
|
|||
|
|
|
|||
|
|
## Offene Punkte
|
|||
|
|
|
|||
|
|
- **WP8/WP9** (settings.json: Absolute-Mode-Widerspruch entschärfen, non-destruktiver
|
|||
|
|
Merge) – auf Wunsch zurückgestellt, separat besprechen.
|
|||
|
|
- **WP10** (Vendor-neutrale Namen `rd13`/`cschulz`/`rd13server`) – zurückgestellt.
|
|||
|
|
- Das **Remote dieses Repos** zeigt weiterhin auf die tote IP
|
|||
|
|
`ssh://git@192.168.178.6:2222/...` (bewusst nicht angefasst – separate Entscheidung).
|