mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-15 01:15:29 +02:00
- The bash shim runs bun as a job and forwards SIGTERM/SIGINT/SIGHUP (bash holds a signal until a foreground child exits); the .ts kills the in-flight vendor's process group on the way out (runExternal exposes the group kill through onSpawn), so a hook the host terminates cannot leave the vendor running with the prompt on its stdin. - The tolerant stdout parser tries every complete top-level object (bounded) and takes the first carrying a string additionalContext, so a banner with braces or quotes, or a progress object, no longer costs the answer. - git runs with LC_ALL=C and the not-a-repository check is anchored to the start of its message: a localized git or a repository path containing the phrase can no longer flip the lookup. - The rate limiter remembers up to 32 live keys, so alternating failures cost two lines, not one per prompt. - Unicode format characters (bidi overrides, zero-width spaces) are stripped from vendor text at egress; the zero-width joiner stays for emoji. - A killed child (timeout, ENOBUFS) resolves on exit without the stdout drain, and the post-kill grace is 100 ms, so the timeout outcome fits the reserve. - The ledger size warning, which the host discards from an exit-0 hook's stderr, is logged where status looks. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
21 lines
1.0 KiB
Bash
Executable File
21 lines
1.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Bash shim — Claude Code hooks run `command` strings via /bin/sh, so this
|
|
# wrapper makes the TypeScript hook executable via bun. Settings.json
|
|
# references this file directly (registered by bin/gstack-memorable enable,
|
|
# never by ./setup).
|
|
#
|
|
# FAIL-OPEN: a third-party recall bridge must never block a prompt. Every
|
|
# failure path — bun missing, script crash — still exits 0 with empty stdout.
|
|
#
|
|
# bun runs as a job, not a foreground child: bash holds a SIGTERM until a
|
|
# foreground child exits, so a host that terminates this shim would leave the
|
|
# vendor process running with the prompt on its stdin. Forwarded, the signal
|
|
# reaches the .ts, which kills the vendor's process group on its way out.
|
|
# `<&0` keeps stdin: bash hands background jobs /dev/null otherwise.
|
|
HERE="$(cd "$(dirname "$0")" && pwd)" || exit 0
|
|
bun "$HERE/memorable-user-prompt-hook.ts" <&0 &
|
|
_child=$!
|
|
trap 'kill -TERM "$_child" 2>/dev/null' TERM INT HUP
|
|
wait "$_child" 2>/dev/null || wait "$_child" 2>/dev/null || true
|
|
exit 0
|