Copilot-Hooks unter Windows: ./tools/trace-hook öffnet den Dialog „App auswählen“, statt still zu laufen #164

Closed
opened 2026-10-01 14:17:44 +00:00 by torben · 4 comments
Owner

Befund aus der Handprüfung von #151 auf dem Windows-Zielsystem (2026-10-01). Gehört zu #140 und betrifft D36 (Hooks über die venv-Python).

Erledigt (geschlossen 2026-10-02). Gebaut in 9d06050 (8.0.0-beta.18), CI 482/483 grün. Die Handprüfung des Betreibers auf dem Zielsystem (Checkout auf beta.22) bestätigt den Fix in Copilot CLI und in Copilot in VS Code.

Befund

Auf dem Zielsystem lief Copilot (pwsh 7.6.6) im Checkout C:\cm auf Stand 8.0.0-beta.17. Bei Hook-Ereignissen öffnete Windows den Dialog „App auswählen“, um trace-hook zu öffnen. Der Betreiber hat ihn jedes Mal weggeklickt; danach lief der Befehl normal.

Der Dialog zeigte: Eine PowerShell hat ./tools/trace-hook … ausgeführt. Für eine Datei ohne Endung kennt Windows keine App, also fragt es.

Ursache (geklärt gegen Doku und Quelltext der Clients, bestätigt durch die Handprüfung)

Die ursprüngliche Vermutung war: Unter Windows wird der bash-Eintrag aus .github/hooks/wiki-trace.json ausgeführt. Das stimmt laut Doku für keinen der beiden Clients.

  • Copilot CLI (Hooks-Referenz): Unter Windows hat powershell Vorrang, command ist der Fallback. Copilot CLI liest Hooks aber auch aus .claude/settings.json („Cross-tool .claude/settings.json … are also read“). Dort steht genau ein Eintrag (UserPromptSubmit), und der hat nur command: ./tools/trace-hook --source claude-code … 2>/dev/null || true. Diesen command führte Copilot CLI unter Windows in pwsh aus, und er landete bei der Dateizuordnung – einmal pro Prompt, also vor den Befehlen des Agenten. Mit trace-hook.ps1 ist der Dialog weg.
  • Copilot in VS Code (Quelltext hookSchema.ts, normalizeHookCommand): powershell wird auf windows abgebildet, bash auf linux/osx. Unter Windows läuft also der powershell-Eintrag. .claude/settings.json liest VS Code nur mit chat.useClaudeHooks. Nebenbefund: VS Code führt Hooks unter Windows mit powershell.exe 5.1 aus (hookExecutor.ts, getShellCommand, solange ComSpec cmd.exe ist), nicht mit pwsh 7. Unsere powershell-Einträge laufen auch dort. Der Claude-Eintrag scheitert unter 5.1 an || (Syntaxfehler), ohne Dialog und ohne Blockade.
  • T1 aus #140: pwsh löst tools/x unter Windows zuerst auf x.ps1 auf, vor .cmd und vor der Datei ohne Endung.

Umsetzung

tools/trace-hook.ps1 ist der PowerShell-Zwilling von tools/trace-hook, nach dem Muster von wikitool/wikitool.ps1 (D15). Jede PowerShell unter Windows, die ./tools/trace-hook … ausführt, landet damit in der .ps1 statt bei der Dateizuordnung. Das gilt egal, aus welcher Datei der Befehl stammt und welcher Client ihn startet. Die Befehlsstrings in den drei Hook-Dateien sind unverändert.

  • Die .ps1 ruft trace_ingest.py mit der venv-Python auf (Scripts\python.exe, sonst bin/python). Sie unterdrückt stderr und endet immer mit 0 (trap { exit 0 }, exit 0). Ohne venv bleibt sie still.
  • Kein #Requires -Version 7, nur 5.1-taugliche Syntax: Ein Hook darf nie scheitern, auch wenn ihn eine 5.1 startet.
  • Die MotW-Prüfung von Preflight und doctor erfasst die Datei ohne Änderung (tools/**/*.ps1), ebenso PSScriptAnalyzer im CI (tools/*.ps1, 0 Befunde). dist export liefert sie aus.
  • Doku: EVALS.md § Copilot CLI (neues tragendes Detail), tools/README.md, Kommentar in tools/trace-hook, CHANGES.md.

Ausgelagert:

  • #165: Unter Copilot CLI läuft der Claude-Hook auf allen Plattformen mit und schreibt ein zweites prompt.submitted mit --source claude-code (Hinweis an #82).
  • #167: Unter Copilot CLI öffnete in der Handprüfung tools/wikitool doctor die App-Auswahl für den sh-Starter, nicht für den Hook. Der Betreiber vermutet eine lokale Konfiguration des Klons; der Test folgt später.

Handprüfung (Betreiber, 2026-10-02, Checkout auf beta.22)

  • Copilot CLI: kein Dialog bei Hook-Ereignissen; der Trace enthält prompt.submitted sowie tool.pre/tool.post.
  • Copilot in VS Code: Traces wie erwartet, kein Dialog gemeldet. Der Agent startete dort den Preflight über pwsh -NoProfile -ExecutionPolicy Bypass -File tools/preflight.ps1.
  • Claude Code (Git Bash): prompt.submitted im Trace, kein tool.pre/tool.post – erwartet, weil .claude/settings.json nur UserPromptSubmit verdrahtet (#82). Kein Befund gegen dieses Issue.

Akzeptanzkriterien

  • Auf dem Windows-Zielsystem erscheint in Copilot in VS Code und in Copilot CLI bei keinem Hook-Ereignis ein Dialog (Handprüfung 2026-10-02).
  • Kein Windows-Zweig startet etwas über eine Dateizuordnung. Jeder Befehl ./tools/trace-hook … hat mit tools/trace-hook.ps1 eine Datei, die PowerShell selbst ausführt. test_every_extensionless_hook_target_has_a_powershell_twin sichert das ab.
  • trace-hook.ps1 reicht stdin und die Argumente an trace_ingest.py unter der venv-Python durch (beide Layouts). Ohne venv bleibt es still und endet mit 0. Es endet auch mit 0, wenn die Python scheitert. Abgedeckt durch drei pwsh-Tests in test_preflight_pwsh.py, grün lokal und im CI-Job pwsh.
  • Mit vorhandenem venv landen die Ereignisse beider Clients wie unter Linux im Trace unter reports/ (Handprüfung 2026-10-02: prompt.submitted, tool.pre/tool.post in Copilot CLI und VS Code).
  • Linux, macOS und Claude Code unter Git Bash verhalten sich unverändert: Kein Befehlsstring hat sich geändert, und test_no_hook_relies_on_a_shebang_or_a_bare_python ist grün (volle Suite: 1923 passed).
  • EVALS.md (Abschnitt Copilot CLI, tragende Details) und tools/README.md nennen die .ps1 und den Grund.

Version

--patch, drop-in (8.0.0-beta.18). Das Schließen hat keine Datei berührt.

Befund aus der Handprüfung von #151 auf dem Windows-Zielsystem (2026-10-01). Gehört zu #140 und betrifft D36 (Hooks über die venv-Python). **Erledigt (geschlossen 2026-10-02).** Gebaut in `9d06050` (8.0.0-beta.18), CI 482/483 grün. Die Handprüfung des Betreibers auf dem Zielsystem (Checkout auf beta.22) bestätigt den Fix in Copilot CLI und in Copilot in VS Code. ## Befund Auf dem Zielsystem lief Copilot (pwsh 7.6.6) im Checkout `C:\cm` auf Stand 8.0.0-beta.17. Bei Hook-Ereignissen öffnete Windows den Dialog „App auswählen“, um `trace-hook` zu öffnen. Der Betreiber hat ihn jedes Mal weggeklickt; danach lief der Befehl normal. Der Dialog zeigte: Eine PowerShell hat `./tools/trace-hook …` ausgeführt. Für eine Datei ohne Endung kennt Windows keine App, also fragt es. ## Ursache (geklärt gegen Doku und Quelltext der Clients, bestätigt durch die Handprüfung) Die ursprüngliche Vermutung war: Unter Windows wird der `bash`-Eintrag aus `.github/hooks/wiki-trace.json` ausgeführt. Das stimmt laut Doku für keinen der beiden Clients. - **Copilot CLI** ([Hooks-Referenz](https://docs.github.com/en/copilot/reference/hooks-reference)): Unter Windows hat `powershell` Vorrang, `command` ist der Fallback. Copilot CLI liest Hooks aber **auch aus `.claude/settings.json`** („Cross-tool .claude/settings.json … are also read“). Dort steht genau ein Eintrag (`UserPromptSubmit`), und der hat nur `command: ./tools/trace-hook --source claude-code … 2>/dev/null || true`. Diesen `command` führte Copilot CLI unter Windows in pwsh aus, und er landete bei der Dateizuordnung – einmal pro Prompt, also vor den Befehlen des Agenten. Mit `trace-hook.ps1` ist der Dialog weg. - **Copilot in VS Code** (Quelltext `hookSchema.ts`, `normalizeHookCommand`): `powershell` wird auf `windows` abgebildet, `bash` auf `linux`/`osx`. Unter Windows läuft also der `powershell`-Eintrag. `.claude/settings.json` liest VS Code nur mit `chat.useClaudeHooks`. Nebenbefund: VS Code führt Hooks unter Windows mit `powershell.exe` 5.1 aus (`hookExecutor.ts`, `getShellCommand`, solange `ComSpec` cmd.exe ist), nicht mit pwsh 7. Unsere `powershell`-Einträge laufen auch dort. Der Claude-Eintrag scheitert unter 5.1 an `||` (Syntaxfehler), ohne Dialog und ohne Blockade. - **T1 aus #140:** pwsh löst `tools/x` unter Windows zuerst auf `x.ps1` auf, vor `.cmd` und vor der Datei ohne Endung. ## Umsetzung **`tools/trace-hook.ps1`** ist der PowerShell-Zwilling von `tools/trace-hook`, nach dem Muster von `wikitool`/`wikitool.ps1` (D15). Jede PowerShell unter Windows, die `./tools/trace-hook …` ausführt, landet damit in der `.ps1` statt bei der Dateizuordnung. Das gilt egal, aus welcher Datei der Befehl stammt und welcher Client ihn startet. **Die Befehlsstrings in den drei Hook-Dateien sind unverändert.** - Die `.ps1` ruft `trace_ingest.py` mit der venv-Python auf (`Scripts\python.exe`, sonst `bin/python`). Sie unterdrückt stderr und endet **immer** mit 0 (`trap { exit 0 }`, `exit 0`). Ohne venv bleibt sie still. - Kein `#Requires -Version 7`, nur 5.1-taugliche Syntax: Ein Hook darf nie scheitern, auch wenn ihn eine 5.1 startet. - Die MotW-Prüfung von Preflight und `doctor` erfasst die Datei ohne Änderung (`tools/**/*.ps1`), ebenso PSScriptAnalyzer im CI (`tools/*.ps1`, 0 Befunde). `dist export` liefert sie aus. - Doku: EVALS.md § Copilot CLI (neues tragendes Detail), `tools/README.md`, Kommentar in `tools/trace-hook`, CHANGES.md. **Ausgelagert:** - #165: Unter Copilot CLI läuft der Claude-Hook auf allen Plattformen mit und schreibt ein zweites `prompt.submitted` mit `--source claude-code` (Hinweis an #82). - #167: Unter Copilot CLI öffnete in der Handprüfung `tools/wikitool doctor` die App-Auswahl für den sh-Starter, nicht für den Hook. Der Betreiber vermutet eine lokale Konfiguration des Klons; der Test folgt später. ## Handprüfung (Betreiber, 2026-10-02, Checkout auf beta.22) - **Copilot CLI:** kein Dialog bei Hook-Ereignissen; der Trace enthält `prompt.submitted` sowie `tool.pre`/`tool.post`. - **Copilot in VS Code:** Traces wie erwartet, kein Dialog gemeldet. Der Agent startete dort den Preflight über `pwsh -NoProfile -ExecutionPolicy Bypass -File tools/preflight.ps1`. - **Claude Code (Git Bash):** `prompt.submitted` im Trace, kein `tool.pre`/`tool.post` – erwartet, weil `.claude/settings.json` nur `UserPromptSubmit` verdrahtet (#82). Kein Befund gegen dieses Issue. ## Akzeptanzkriterien - [x] Auf dem Windows-Zielsystem erscheint in Copilot in VS Code und in Copilot CLI bei keinem Hook-Ereignis ein Dialog (Handprüfung 2026-10-02). - [x] Kein Windows-Zweig startet etwas über eine Dateizuordnung. Jeder Befehl `./tools/trace-hook …` hat mit `tools/trace-hook.ps1` eine Datei, die PowerShell selbst ausführt. `test_every_extensionless_hook_target_has_a_powershell_twin` sichert das ab. - [x] `trace-hook.ps1` reicht stdin und die Argumente an `trace_ingest.py` unter der venv-Python durch (beide Layouts). Ohne venv bleibt es still und endet mit 0. Es endet auch mit 0, wenn die Python scheitert. Abgedeckt durch drei pwsh-Tests in `test_preflight_pwsh.py`, grün lokal und im CI-Job `pwsh`. - [x] Mit vorhandenem venv landen die Ereignisse beider Clients wie unter Linux im Trace unter `reports/` (Handprüfung 2026-10-02: `prompt.submitted`, `tool.pre`/`tool.post` in Copilot CLI und VS Code). - [x] Linux, macOS und Claude Code unter Git Bash verhalten sich unverändert: Kein Befehlsstring hat sich geändert, und `test_no_hook_relies_on_a_shebang_or_a_bare_python` ist grün (volle Suite: 1923 passed). - [x] EVALS.md (Abschnitt Copilot CLI, tragende Details) und `tools/README.md` nennen die `.ps1` und den Grund. ## Version `--patch`, drop-in (8.0.0-beta.18). Das Schließen hat keine Datei berührt.
torben added the prio/blockingsize/Sarea/distributionkind/defect labels 2026-10-01 14:17:44 +00:00
Author
Owner

Changelog: Die Ursache ist korrigiert. Nicht der bash-Zweig läuft unter Windows, sondern Copilot CLI führt den command aus .claude/settings.json in pwsh aus (laut Doku; VS Code laut Quelltext nicht betroffen). Die Umsetzung (tools/trace-hook.ps1) ist in 9d06050 / 8.0.0-beta.18 gebaut, CI 482/483 grün. Die Kriterien 2, 3, 5 und 6 sind abgehakt. Offen ist die Handprüfung (Kriterien 1 und 4), Ablauf im Body. Der Nebenbefund ist ausgelagert nach #165.

**Changelog:** Die Ursache ist korrigiert. Nicht der `bash`-Zweig läuft unter Windows, sondern Copilot CLI führt den `command` aus `.claude/settings.json` in pwsh aus (laut Doku; VS Code laut Quelltext nicht betroffen). Die Umsetzung (`tools/trace-hook.ps1`) ist in `9d06050` / 8.0.0-beta.18 gebaut, CI 482/483 grün. Die Kriterien 2, 3, 5 und 6 sind abgehakt. Offen ist die Handprüfung (Kriterien 1 und 4), Ablauf im Body. Der Nebenbefund ist ausgelagert nach #165.
torben added prio/waiting and removed prio/blocking labels 2026-10-02 04:42:42 +00:00
Author
Owner

Changelog (2026-10-02): Die Handprüfung (Kriterien 1 und 4) hat der Betreiber zurückgestellt; er macht sie später selbst. Neu geprüft: Im Code ist nichts mehr offen. Neu gelabelt: prio/blocking → prio/waiting, Auslöser ist die Handprüfung. Der Fix ist veröffentlicht, also blockiert das Issue keine laufende Arbeit mehr. Es bleibt Freigabebedingung für 8.0.0. Der Body nennt den Schritt nach der Handprüfung und den Weg zurück auf prio/blocking, falls doch ein Dialog kommt.

**Changelog (2026-10-02):** Die Handprüfung (Kriterien 1 und 4) hat der Betreiber zurückgestellt; er macht sie später selbst. Neu geprüft: Im Code ist nichts mehr offen. **Neu gelabelt:** `prio/blocking` → `prio/waiting`, Auslöser ist die Handprüfung. Der Fix ist veröffentlicht, also blockiert das Issue keine laufende Arbeit mehr. Es bleibt Freigabebedingung für 8.0.0. Der Body nennt den Schritt nach der Handprüfung und den Weg zurück auf `prio/blocking`, falls doch ein Dialog kommt.
Author
Owner

Changelog (2026-10-02): Die Handprüfung des Betreibers auf beta.22 ist eingetragen. Unter Copilot CLI erscheint kein Hook-Dialog mehr, und der Trace ist vollständig; damit sind Kriterium 1 und 4 für Copilot CLI bestätigt. Unter Claude Code fehlen tool.pre/tool.post; das ist erwartet und gehört zu #82. Copilot in VS Code ist noch offen. Der Nebenbefund zu tools/wikitool unter Copilot CLI ist nach #167 ausgelagert.

**Changelog (2026-10-02):** Die Handprüfung des Betreibers auf beta.22 ist eingetragen. Unter Copilot CLI erscheint kein Hook-Dialog mehr, und der Trace ist vollständig; damit sind Kriterium 1 und 4 für Copilot CLI bestätigt. Unter Claude Code fehlen `tool.pre`/`tool.post`; das ist erwartet und gehört zu #82. Copilot in VS Code ist noch offen. Der Nebenbefund zu `tools/wikitool` unter Copilot CLI ist nach #167 ausgelagert.
Author
Owner

Changelog (2026-10-02): Copilot in VS Code ist bestätigt (Betreiber): Traces wie erwartet, kein Dialog gemeldet. Damit sind Kriterium 1 und 4 für beide Clients erfüllt. Der Body steht im Endzustand. Geschlossen.

**Changelog (2026-10-02):** Copilot in VS Code ist bestätigt (Betreiber): Traces wie erwartet, kein Dialog gemeldet. Damit sind Kriterium 1 und 4 für beide Clients erfüllt. Der Body steht im Endzustand. Geschlossen.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#164