ECC/scripts/hooks
QWsin 118e57e14b
feat(hooks): add WSL desktop notification support via PowerShell + BurntToast (#1019)
* fix(hooks): add WSL desktop notification support via PowerShell + BurntToast

Adds WSL (Windows Subsystem for Linux) desktop notification support to the
existing desktop-notify hook. The hook now detects WSL, finds available
PowerShell (7 or Windows PowerShell), checks for BurntToast module, and
sends Windows toast notifications.

New functions:
- isWSL(): detects WSL environment
- findPowerShell(): finds PowerShell 7 or Windows PowerShell on WSL
- isBurntToastAvailable(): checks if BurntToast module is installed
- notifyWindows(): sends Windows toast notification via BurntToast

If BurntToast is not installed, logs helpful tip for installation.
Falls back silently on non-WSL/non-macOS platforms.

* docs(hooks): update desktop-notify description to include WSL

Updates the hook description in hooks.json to reflect the newly
added WSL notification support alongside macOS.

* fix(hooks): capture stderr properly in notifyWindows

Change stdio to ['ignore', 'pipe', 'pipe'] so stderr is captured
and can be logged on errors. Without this, result.stderr is null
and error logs show 'undefined' instead of the actual error.

* fix(hooks): quote PowerShell path in install tip for shell safety

The PowerShell path contains spaces and needs to be quoted
when displayed as a copy-pasteable command.

* fix(hooks): remove external repo URL from tip message

BurntToast module is a well-known Microsoft module but per project
policy avoiding unvetted external links in user-facing output.

* fix(hooks): probe WSL interop PATH before hardcoded paths

Adds 'pwsh.exe' and 'powershell.exe' as candidates to leverage
WSL's Windows interop PATH resolution, making the hook work with
non-default WSL mount prefixes or Windows drives.

* perf(hooks): memoize isWSL detection at module load

Avoids reading /proc/version twice (once in run(), once in findPowerShell())
by computing the result once when the module loads.

* perf(hooks): reduce PowerShell spawns from 3 to 1 per notification

Merge findPowerShell version check and isBurntToastAvailable check
into a single notifyWindows call. Now just tries to send directly;
if it fails, tries next PowerShell path. Version field was unused.

Net effect: up to 3 spawns reduced to 1 in the happy path.

* fix(hooks): remove duplicate notifyWindows declaration

There were two notifyWindows function declarations due to incomplete
refactoring. Keeps only the version that returns true/false for the
call site. Node.js would throw SyntaxError with 'use strict'.

* fix(hooks): improve error handling and detection robustness

- Increase PowerShell detection timeout from 1s to 3s to avoid false
  negatives on slower/cold WSL interop startup
- Return error reason from notifyWindows to distinguish BurntToast
  module not found vs other PowerShell errors
- Log actionable error details instead of always showing install tip

---------

Co-authored-by: boss <boss@example.com>
2026-03-30 03:14:49 -04:00
..
auto-tmux-dev.js fix: auto-start dev servers in tmux instead of blocking (#344) 2026-03-07 14:47:46 -08:00
check-console-log.js Fix stdin overflow bug in hook scripts - truncate chunks to stay within MAX_STDIN limit 2026-02-18 07:40:12 +00:00
check-hook-enabled.js feat: deliver v1.8.0 harness reliability and parity updates 2026-03-04 14:48:06 -08:00
config-protection.js fix: fold session manager blockers into one candidate 2026-03-24 23:08:27 -04:00
cost-tracker.js feat: deliver v1.8.0 harness reliability and parity updates 2026-03-04 14:48:06 -08:00
desktop-notify.js feat(hooks): add WSL desktop notification support via PowerShell + BurntToast (#1019) 2026-03-30 03:14:49 -04:00
doc-file-warning.js fix(lint): prefix unused options parameter with underscore 2026-03-29 10:14:53 +08:00
evaluate-session.js Fix stdin overflow bug in hook scripts - truncate chunks to stay within MAX_STDIN limit 2026-02-18 07:40:12 +00:00
governance-capture.js fix: fold session manager blockers into one candidate 2026-03-24 23:08:27 -04:00
insaits-security-monitor.py fix: narrow unicode cleanup scope 2026-03-29 21:21:18 -04:00
insaits-security-wrapper.js fix: make insaits hook opt-in 2026-03-10 20:47:09 -07:00
mcp-health-check.js fix: fold session manager blockers into one candidate 2026-03-24 23:08:27 -04:00
post-bash-build-complete.js feat: deliver v1.8.0 harness reliability and parity updates 2026-03-04 14:48:06 -08:00
post-bash-pr-created.js feat: deliver v1.8.0 harness reliability and parity updates 2026-03-04 14:48:06 -08:00
post-edit-console-warn.js Merge branch 'affaan-m:main' into main 2026-02-18 18:33:04 +05:30
post-edit-format.js fix(hooks): add Windows .cmd support with shell injection guard 2026-03-11 10:45:28 +09:00
post-edit-typecheck.js Fix stdin overflow bug in hook scripts - truncate chunks to stay within MAX_STDIN limit 2026-02-18 07:40:12 +00:00
pre-bash-commit-quality.js fix: narrow unicode cleanup scope 2026-03-29 21:21:18 -04:00
pre-bash-dev-server-block.js fix: resolve PR 371 portability regressions 2026-03-09 22:49:43 -07:00
pre-bash-git-push-reminder.js feat: deliver v1.8.0 harness reliability and parity updates 2026-03-04 14:48:06 -08:00
pre-bash-tmux-reminder.js feat: deliver v1.8.0 harness reliability and parity updates 2026-03-04 14:48:06 -08:00
pre-compact.js fix: nullish coalescing in evaluate-session config, narrow pre-compact glob, add 11 tests 2026-02-13 02:42:01 -08:00
pre-write-doc-warn.js feat: deliver v1.8.0 harness reliability and parity updates 2026-03-04 14:48:06 -08:00
quality-gate.js refactor: deduplicate config lists and unify resolveFormatterBin branches 2026-03-11 10:45:28 +09:00
run-with-flags-shell.sh fix: harden hook portability and plugin docs 2026-03-09 22:49:43 -07:00
run-with-flags.js fix: finish blocker lane hook and install regressions 2026-03-25 04:00:50 -04:00
session-end-marker.js fix: export run() to avoid Windows spawnSync issues (#431) 2026-03-16 13:38:47 -07:00
session-end.js fix: strip ANSI escape codes from session persistence hooks (#642) (#684) 2026-03-20 01:38:11 -07:00
session-start.js fix: finish hook fallback and canonical session follow-ups 2026-03-25 03:44:03 -04:00
suggest-compact.js fix(hooks): scrub secrets and harden hook security (#348) 2026-03-07 14:47:31 -08:00