Skip to content

fix: only deactivate ponytail on a standalone stop command - #162

Merged
DietrichGebert merged 1 commit into
DietrichGebert:mainfrom
Lakshya77089:fix-deactivation-substring
Jun 18, 2026
Merged

DietrichGebert merged 1 commit into
DietrichGebert:mainfrom
Lakshya77089:fix-deactivation-substring

Conversation

@Lakshya77089

Copy link
Copy Markdown
Contributor

Fixes #161.

stop ponytail / normal mode were matched anywhere in the prompt, so ordinary requests like "add a normal mode toggle" turned ponytail off mid-session with no feedback. Repro and details in the issue.

The docs describe these as commands you type, so this matches them only when the whole message is the command — trimmed, case-insensitive, trailing punctuation ignored — via a shared isDeactivationCommand helper so the Claude/Codex hook and the pi extension stay in sync.

  • hooks/ponytail-config.js: add isDeactivationCommand
  • hooks/ponytail-mode-tracker.js, pi-extension/index.js: use it instead of the substring regex
  • tests: a request that merely mentions "normal mode" now stays active; the existing standalone "normal mode" / off tests are unchanged and still pass

node --test tests/*.test.js (51) and node --test pi-extension/test/*.test.js (12) pass, and node scripts/check-rule-copies.js is clean.

The deactivation check matched the phrase anywhere in the prompt, so an
ordinary request like "add a normal mode toggle" silently turned ponytail
off for the rest of the session. Match the whole message instead (trimmed,
case-insensitive, trailing punctuation ignored) through a shared helper used
by both the Claude/Codex hook and the pi extension.

Fixes DietrichGebert#161
@DietrichGebert
DietrichGebert merged commit 53fd1e8 into DietrichGebert:main Jun 18, 2026
1 check passed
Eugene3dotdev added a commit to Eugene3dotdev/ponytail that referenced this pull request Jun 27, 2026
…CI hardening

WHY: Codex P1/P2 + CodeRabbit Majors on PR #4. The Zig hook didn't cover the
retired JS command surface, Windows lost its hook, and the release workflow had
real security/correctness gaps. All verified against live code.

WHAT:
- P1 main.zig: replaced the exact-/ponytail-only parser with a full port of the
  retired hooks/ponytail-mode-tracker.js surface (parsePrompt → Action set/clear/
  none). Accepts: /ponytail [lite|full|ultra], /ponytail off (clear), /ponytail
  <unknown>→default, @Ponytail / $ponytail sigils (normalized to /), /ponytail-review,
  namespaced /ponytail:ponytail(-review), case-insensitive+trimmed, standalone
  "stop ponytail" / "normal mode" deactivation with the DietrichGebert#162 embedded-phrase guard.
  +8 parsePrompt tests. All std string APIs verified via zigdoc.
- P2 claude-codex-hooks.json: restored commandWindows for SessionStart +
  UserPromptSubmit (PowerShell $env:CLAUDE_PLUGIN_ROOT → new bin/ponytail-launch.ps1,
  a Windows launcher mirroring the bash resolution order, silent no-op until
  R6-Windows binaries ship).
- CodeRabbit Majors on release-binaries.yml: workflow perms dropped to contents:read
  (write scoped per-job); workflow_dispatch tag validated against a strict semver
  regex before use; packaging asserts all 5 runtime binaries present before tar;
  checksums job fails instead of publishing an empty SHA256SUMS.

IMPACT: native (Claude Code / Codex / Copilot) hook command surface matches the
retired JS exactly; Windows SessionStart restored; release workflow hardened.

VALIDATION (clean cache, zig-0.16.0-dev.3142):
- zig build + zig build test + zig fmt --check: exit 0
- runtime parity (sandboxed ponytail-hook): /ponytail ultra→ultra, @Ponytail lite→lite,
  /ponytail-review→review, /ponytail:ponytail full→full, "stop ponytail"→CLEARED,
  DietrichGebert#162 "add a normal mode toggle"→none (no false clear)
- hooks-windows.test.js 3/3; release-binaries.yml valid YAML; hooks JSON valid
- ziglint main.zig: 2 pre-existing idiom findings, none from the new code
DevZonayed pushed a commit to DevZonayed/ponytail that referenced this pull request Aug 17, 2026
…ietrichGebert#162)

The deactivation check matched the phrase anywhere in the prompt, so an
ordinary request like "add a normal mode toggle" silently turned ponytail
off for the rest of the session. Match the whole message instead (trimmed,
case-insensitive, trailing punctuation ignored) through a shared helper used
by both the Claude/Codex hook and the pi extension.

Fixes DietrichGebert#161
Afristrat pushed a commit to Afristrat/ponytail that referenced this pull request Sep 29, 2026
…ietrichGebert#162)

The deactivation check matched the phrase anywhere in the prompt, so an
ordinary request like "add a normal mode toggle" silently turned ponytail
off for the rest of the session. Match the whole message instead (trimmed,
case-insensitive, trailing punctuation ignored) through a shared helper used
by both the Claude/Codex hook and the pi extension.

Fixes DietrichGebert#161
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Ponytail silently turns off when a prompt happens to contain "normal mode"

2 participants