Skip to content

v1.8.0

Latest

Choose a tag to compare

@karlkfi karlkfi released this 03 Aug 22:07

Minor release: the guard runs on Windows. It guards the PowerShell tool with its own tokenizer and cmdlet table, reads Git Bash path forms the way Git Bash does, and is validated against real Windows in continuous integration (CI) — plus parsing hardening for heredocs, IFS, and loop variables.

Important

On Windows the guard was silently enforcing nothing before this release. All three hook entries invoked python3, which normally resolves to the Microsoft Store alias stub — it exits 9009, and Claude Code treats a failed PreToolUse hook as a non-blocking error. Upgrading turns enforcement on for the first time, so expect prompts on a Windows session that had none. No action is required: the hook now routes through a polyglot launcher that probes interpreters by executing them, and says so on stderr when none works.

PowerShell coverage is deliberately partial — a cmdlet outside the table, a .NET call, or a native .exe is not checked, and the hook does not announce that it skipped them. See Limitations for why that's the posture and what it costs.

Windows

  • fix: resolve Python interpreter portably so the hook runs on Windows by @smoochy in #94
  • fix: derive the Claude temp root without os.getuid() on Windows by @smoochy in #103
  • feat(powershell): guard the PowerShell shell tool (Q51) by @karlkfi in #120
  • fix(parsing): read Git Bash path forms the way Git Bash does (Q52) by @karlkfi in #119
  • fix(parsing): let a Windows drive prefix be a pure assignment value (Q48) by @karlkfi in #115
  • fix: resolve the home directory portably for the read-allow prefix (Q40) by @karlkfi in #108
  • fix(parsing): expand a leading ~ from the resolved home (Q43) by @karlkfi in #113
  • fix(windows): make the Windows suite pass (Q39) by @karlkfi in #107
  • test(ci): validate the guard against real Windows Git Bash (Q44) by @karlkfi in #118

Parsing

  • fix(parsing): scan an expanded heredoc body on its own (Q50) by @karlkfi in #122
  • fix(parsing): skip $(…) in a quoted-delimiter heredoc body (Q35) by @karlkfi in #117
  • fix(parsing): stop propagating when any command may set IFS (Q49) by @karlkfi in #116
  • fix(parsing): bind a for list built from an outer loop variable by @karlkfi in #109
  • fix(parsing): resolve a for-list glob as its own pattern by @karlkfi in #104
  • fix(parsing): bound the loop-variable cross product (Q46) by @karlkfi in #114

friction-report

  • fix(friction-report): bucket unmatched reasons as other and scope the path table by @karlkfi in #98
  • fix(friction-report): explain an empty result instead of printing zero by @karlkfi in #100
  • fix(friction-report): name what the scan cannot see by @karlkfi in #102

Continuous integration (CI), backlog, and documentation-only changes are folded into the changelog link below. Validation: 968 tests pass on macOS (8 skipped); the Windows job runs the same suite under both pwsh and Git Bash behind a skip ceiling.

Full Changelog: v1.7.2...v1.8.0