ECC/tests/hooks
Thejesh Reddy 5deee34c93
fix(hooks): remove stray '?' that made every 'yarn <anything>' fire tmux reminder (#2517)
* fix(hooks): remove stray '?' that made every 'yarn <anything>' trigger tmux reminder

The tmux-reminder matcher uses one alternation per package manager. Each
branch requires a subcommand (install|test) — except yarn, whose subcommand
group carried a trailing `?`:

    yarn (install|test)?

That made the subcommand optional, so the branch degraded to "yarn " plus
anything: `yarn add foo`, `yarn build`, `yarn dev`, even `yarn --version`
all matched and spammed the "Consider running in tmux" hint into the
additional-context channel.

Drop the `?` so yarn matches parity with npm/pnpm/bun. Verified locally
against 14 cases (yarn install/test still fire; yarn add/build/dev/… no
longer do; npm/pnpm/bun/pytest behavior unchanged).

Fixes #2514

* test(hooks): add pre-bash-tmux-reminder regression tests

Add coverage for the tmux-reminder matcher following the auto-tmux-dev.test.js
structure — the regex-first hook now has direct regression tests for the yarn
branch fix in this PR (and for the sibling package managers, other matched
tools, TMUX bypass, and malformed input).

16 assertions total:
  - fires for: yarn install, yarn test, npm install, pnpm test, bun install,
               pytest tests/, cargo build
  - does NOT fire for: yarn add react, yarn build, yarn dev, yarn --version,
                       bare `yarn`, npm run dev
  - respects TMUX env var
  - tolerates invalid JSON and missing command field

Verified the tests actually catch the bug: reintroducing the buggy
`yarn (install|test)?` fails 4 of the 5 yarn non-match cases (the fifth,
bare `yarn`, stays passing because even the buggy branch requires a trailing
space after yarn).

Addresses CodeRabbit review on #2517.

* test(hooks): fail loudly on spawn errors, use destructuring, split runTests

Address three CodeRabbit review notes on tests/hooks/pre-bash-tmux-reminder.test.js:

- Fail loudly on spawnSync errors: raise instead of coercing
  `result.status || 0`, which would mask spawn errors, timeouts, or signal
  termination as a successful exit 0 (masks legitimate test failures).
- Use destructuring (`const { TMUX, ...env } = process.env`) instead of
  copy-then-`delete` so the base env is built immutably.
- Split `runTests` (was 66 lines) into small per-group helpers
  (runYarnTests, runSiblingPackageManagerTests, runOtherToolTests,
  runTmuxBypassTests, runEdgeCaseTests). `runTests` is now 18 lines and
  purely orchestrates.

16 assertions still pass; no coverage changes.

The 4th CodeRabbit note (avoid console.log in test files) is intentionally
not adopted here — every sibling hook test in this repo
(auto-tmux-dev.test.js, bash-hook-dispatcher.test.js, block-no-verify.test.js,
etc.) writes to console.log because the project's own test runner
(tests/run-all.js) is console-log based and there is no Jest/Mocha
dependency. Diverging from the established convention in a bugfix PR is
out of scope.

* test(hooks): trim tmux reminder regression coverage

---------

Co-authored-by: Haley Chen <2022hachen@gmail.com>
2026-07-20 16:21:03 -04:00
..
auto-tmux-dev.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
bash-hook-dispatcher.test.js fix(hooks): stop pre/post Bash dispatcher from echoing the input event (#2240) 2026-06-15 13:48:46 -04:00
block-no-verify.test.js fix: close block-no-verify bypass holes 2026-05-12 22:28:12 -04:00
check-hook-enabled.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
config-protection.test.js fix: integrate recent hook and docs PRs (#1905) 2026-05-14 21:37:28 -04:00
continuous-learning-observe-runner.test.js refactor(hooks): consolidate PostToolUse hooks into sync/async dispatchers (#2494) 2026-07-19 15:47:10 -04:00
continuous-learning-shebang-consistency.test.js chore(continuous-learning-v2): standardize shell shebangs to env bash (#2401) 2026-07-03 20:40:44 -07:00
cost-tracker.test.js fix(hooks): prefer fresh harness cost cache (#2054) 2026-05-25 14:08:11 -04:00
cursor-block-no-verify.test.js fix(.cursor/hooks): route block-no-verify through local hook to fix message-body false positives (#2107) (#2177) 2026-06-07 13:01:36 +08:00
design-quality-check.test.js feat: add web frontend rules and design quality hook 2026-04-02 17:33:17 -07:00
detect-project-worktree.test.js fix(learning): add project registry maintenance 2026-05-19 12:51:18 -04:00
doc-file-warning.test.js fix(hooks): guard doc-file-warning stdin listeners behind require.main (#2358) 2026-06-29 15:54:55 -07:00
ecc-context-monitor.test.js fix: add context monitor cost warning opt-out 2026-05-17 01:53:57 -04:00
ecc-metrics-bridge.test.js fix(hooks): stop false loop warnings and repeated identical context warnings (#2121) 2026-06-07 13:26:30 +08:00
ecc-statusline.test.js chore: update statusline ANSI color palette 2026-05-15 23:18:01 -04:00
evaluate-session.test.js fix: remove unused execFileSync import (no-unused-vars ESLint) 2026-02-18 07:15:53 +05:30
gateguard-fact-force.test.js feat(gateguard): add GATEGUARD_EXEMPT_GLOBS path exemptions (#2432) 2026-07-03 20:41:11 -07:00
governance-capture.test.js fix: resolve blocker PR validation regressions 2026-03-25 01:34:29 -04:00
hook-flags.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
hooks.test.js refactor(hooks): consolidate PostToolUse hooks into sync/async dispatchers (#2494) 2026-07-19 15:47:10 -04:00
insaits-security-monitor.test.js test: skip insaits monitor subprocesses without python 2026-05-18 00:47:05 -04:00
insaits-security-wrapper.test.js test: harden InsAIts wrapper fake Python shim 2026-05-12 01:13:01 -04:00
mcp-health-check.test.js fix(hooks): quote args when probing Windows .cmd MCP servers via shell (#2343) 2026-06-29 15:54:52 -07:00
migrate-homunculus-home-escape.test.js fix(clv2): escape $HOME before pgrep -f in migrate-homunculus.sh (#2339) 2026-06-25 16:47:32 -07:00
observe-entrypoint-allowlist.test.js fix(continuous-learning-v2): accept claude-vscode as valid entrypoint (#2134) 2026-06-07 13:01:24 +08:00
observe-signal-counter-race.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
observe-signal-timeout.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
observe-subdirectory-detection.test.js fix(learning): add project registry maintenance 2026-05-19 12:51:18 -04:00
observer-loop-archive.test.js fix(clv2): archive observations only after successful analysis in observer-loop (#2386) 2026-06-29 18:43:37 -07:00
observer-loop-mktemp.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
observer-memory.test.js fix: resolve open-issue cluster (#2295, #2298, #2303–#2306, #2340) + createdTime fallback bug (#2408) 2026-07-03 21:10:45 -07:00
plan-canvas-sessions-hook.test.js feat: Plan Canvas, a browser review canvas for plans (#2467) 2026-07-08 17:12:48 -04:00
plugin-hook-bootstrap.test.js fix(windows): prefer PowerShell over bash to prevent zombie process accumulation (#2346) 2026-06-29 15:54:58 -07:00
post-bash-hooks.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
posttooluse-dispatcher.test.js refactor(hooks): consolidate PostToolUse hooks into sync/async dispatchers (#2494) 2026-07-19 15:47:10 -04:00
pre-bash-commit-quality.test.js fix: run pre-bash linters through windows wrappers 2026-04-29 18:59:10 -04:00
pre-bash-dev-server-block.test.js fix(dev-server-block): stop blocking dev-<suffix> scripts (#2179) 2026-06-07 13:25:39 +08:00
pre-bash-reminders.test.js fix: surface warn-only PreToolUse hooks (#2084) 2026-05-28 07:45:46 -04:00
pre-bash-tmux-reminder.test.js fix(hooks): remove stray '?' that made every 'yarn <anything>' fire tmux reminder (#2517) 2026-07-20 16:21:03 -04:00
quality-gate.test.js feat: add C++ language support and hook tests (#539) 2026-03-16 14:31:49 -07:00
run-with-flags-truncation.test.js fix: stability batch — hook stdin truncation, Codex exa TOML, Stop hook JSON, GateGuard repetition (#2227) 2026-06-11 00:31:33 -04:00
session-activity-tracker.test.js test: cover session activity tracker edge paths 2026-04-29 18:15:51 -04:00
session-end.test.js fix(session-end): preserve $-sequences in user messages when rewriting summary (#2180) 2026-06-07 13:25:36 +08:00
stop-format-typecheck.test.js perf(hooks): batch format+typecheck at Stop instead of per Edit (#746) 2026-03-31 14:12:12 -07:00
stop-hooks-stdout.test.js fix: stability batch — hook stdin truncation, Codex exa TOML, Stop hook JSON, GateGuard repetition (#2227) 2026-06-11 00:31:33 -04:00
suggest-compact.test.js fix: context-size /compact trigger, Codex marketplace plugin path, live README badges (#2237) 2026-06-11 16:21:53 -04:00
test_insaits_security_monitor.py test: cover hook bootstrap and InsAIts monitor 2026-04-29 17:45:22 -04:00