fix(session-inbox-monitor): UTF-8 OutputEncoding forward-guard in SessionStart hook (v0.2.2)
Closes session-inbox-monitor-encoding-guard-followup (finding from -review structural audit item E, CONCERN). inbox-monitor.ps1 emitted ConvertTo-Json (incl. the interpolated inbox path) to a redirected pipe under WinPS 5.1 without setting [Console]::OutputEncoding — the same context that mojibaked stop-dispatcher. ASCII-safe today, but the inbox path is user-data, so a non-ASCII path/content would mangle the inject. - Add [Console]::OutputEncoding + $OutputEncoding = UTF8 after the $ProjectDir gate (mirror of stop-dispatcher.ps1). Comment text kept pure ASCII. - Regression under WinPS 5.1: parse 0 errors; ran hook against a Cyrillic-path project, read raw stdout bytes as no-BOM UTF-8 -> JSON valid, Cyrillic path round-trips intact. - Re-deployed to ~/.claude/hooks/inbox-monitor.ps1, SHA256 byte-identical. - SKILL.md Mojibake failure-mode extended; version 0.2.1 -> 0.2.2 (PATCH). install/hermes/dist not rebuilt — PATCH needs only reload-plugins; the runtime hook is deployed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: session-inbox-monitor
|
name: session-inbox-monitor
|
||||||
version: 0.2.1
|
version: 0.2.2
|
||||||
description: >
|
description: >
|
||||||
Raises a persistent Monitor (Monitor tool, NOT background Bash) on the
|
Raises a persistent Monitor (Monitor tool, NOT background Bash) on the
|
||||||
project's `.claude-inbox/` at the start of an interactive session, so
|
project's `.claude-inbox/` at the start of an interactive session, so
|
||||||
@@ -113,7 +113,11 @@ for free on session end. Headless sessions skip it and rely on the pull-model
|
|||||||
`[IO.File]::WriteAllText($p,$t,[Text.UTF8Encoding]::new($false))`, NOT
|
`[IO.File]::WriteAllText($p,$t,[Text.UTF8Encoding]::new($false))`, NOT
|
||||||
`Set-Content`/`Out-File -Encoding utf8` (which adds a BOM under 5.1). Same
|
`Set-Content`/`Out-File -Encoding utf8` (which adds a BOM under 5.1). Same
|
||||||
WinPS-5.1 encoding class as the hook-source em-dash gotcha. Fixed + in-situ
|
WinPS-5.1 encoding class as the hook-source em-dash gotcha. Fixed + in-situ
|
||||||
verified 2026-06-17.
|
verified 2026-06-17. The SessionStart injector (`inbox-monitor.ps1`) carries
|
||||||
|
the **same `[Console]::OutputEncoding` UTF-8 guard** as a forward-protection
|
||||||
|
(v0.2.2): it interpolates the inbox path into the injected JSON, so a non-ASCII
|
||||||
|
path or `additionalContext` would otherwise mangle the same way — the guard is
|
||||||
|
preventive (today's `$ctx` is ASCII) but cheaper than an "ASCII-only" invariant.
|
||||||
|
|
||||||
## Side effects
|
## Side effects
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,14 @@ param(
|
|||||||
|
|
||||||
if (-not $ProjectDir) { exit 0 }
|
if (-not $ProjectDir) { exit 0 }
|
||||||
|
|
||||||
|
# UTF-8 stdout guard. This hook emits JSON (additionalContext) to a redirected
|
||||||
|
# pipe under WinPS 5.1 - the same context that mojibaked stop-dispatcher output
|
||||||
|
# (see session-inbox-monitor-stophook-utf8-fix). $ctx is ASCII today, but the
|
||||||
|
# inbox path ($inboxFwd) is user-data interpolated into stdout, so set UTF-8 as a
|
||||||
|
# forward-guard: a non-ASCII path or content never mangles the inject. Idempotent.
|
||||||
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
|
$OutputEncoding = [System.Text.Encoding]::UTF8
|
||||||
|
|
||||||
$inbox = Join-Path $ProjectDir '.claude-inbox'
|
$inbox = Join-Path $ProjectDir '.claude-inbox'
|
||||||
$claudeMd = Join-Path $ProjectDir 'CLAUDE.md'
|
$claudeMd = Join-Path $ProjectDir 'CLAUDE.md'
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user