3 Commits

Author SHA1 Message Date
Boris Cherny
a310cc1ae6
ralph-loop: fix false completion on bare word, whitespace-asymmetric promise match, and frozen iteration counter
Three stop-hook bugs that break loop termination:

- A bare assistant message equal to the promise (e.g. just "DONE") ended
  the loop even without <promise> tags: the perl substitution passed the
  input through unchanged when the tag was absent. Now the promise text
  is only extracted when a <promise>...</promise> tag is present.
- The observed promise text was whitespace-normalized but the expected
  promise was not, so a promise containing consecutive spaces
  ("ALL  DONE") could never match and the loop never ended. Both sides
  are now normalized identically (trim + collapse runs of whitespace).
- The iteration reader accepted "iteration:1" (no space after the colon)
  but the writer's sed only matched "iteration: " with a space, so the
  counter froze and the loop ran past max_iterations. The writer now
  matches with or without spaces, like the reader.

Adds tests/stop-hook.test.sh covering all three regressions plus
controls; the three bug cases fail on the previous script and pass now.

Fixes anthropics/claude-code#81827
Fixes anthropics/claude-code#81828
Fixes anthropics/claude-code#81829

No-Verification-Needed: shell-script plugin in claude-plugins-official; no claude-cli-internal runtime surface

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 20:19:46 -07:00
Dickson Tsai
986deab6a1
fix: invoke .sh hooks via bash prefix; add version for cache invalidation
Fixes #993 (Permission denied on hook scripts) without relying on
client-side +x preservation.

The hook executor spawns commands via /bin/sh -c, which requires +x
to execute a script directly. Prefixing with bash reads the script
as data — mode bits are irrelevant. This works on all Claude Code
versions, whereas the client-side chmod fix (claude-cli #24666) only
shipped in v2.1.86.

All 3 scripts declare #!/bin/bash and use bashisms ([[ ]], =~), so
bash (not sh) is the correct interpreter.

The version field forces a fresh cache path (1.0.0/ instead of
unknown/), ensuring the new hooks.json reaches users with stale
caches.
2026-03-28 08:40:34 -07:00
Noah Zweben
44328beed4
Rename ralph-wiggum plugin to ralph-loop per legal guidance (#142)
- Rename plugin from "ralph-wiggum" to "ralph-loop" to avoid trademark concerns
- Update all internal references to use "Ralph Loop" as the prominent name
- Keep explanatory text noting it "implements the Ralph Wiggum technique" (allowed)
- Rename plugin directory from plugins/ralph-wiggum to plugins/ralph-loop
- Update marketplace.json with new plugin name and source path
- Update plugin-dev documentation references

This change follows legal's recommendation to replace "Wiggum" with "Loop"
in the plugin name while still explaining the technique origin.

Slack thread: https://anthropic.slack.com/archives/C09KU300P7F/p1767741142753959

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-06 15:22:54 -08:00