Reply shapes reach the reply, a Stop hook checks completion reports, and hook pipes keep their output #156
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "scribe",
|
||||
"description": "Scribe for Claude Code: connects the scribe MCP server, adds the hooks that deliver live project state and relevant records at the right moment, ships the shared client-neutral Scribe skills (using-scribe, writing-plans, reporting-back, systematic-debugging, verification, brainstorming, reusing-code, shape-accounting), and syncs your saved Scribe Processes as skills (/scribe:sync).",
|
||||
"version": "2026.09.14.2234",
|
||||
"version": "2026.09.14.2237",
|
||||
"author": {
|
||||
"name": "Bryan Van Deusen"
|
||||
},
|
||||
|
||||
@@ -73,7 +73,7 @@ marker="$state_dir/${safe_sid}.blocked"
|
||||
# check. Keeps the ordinary turn at one grep. Process substitution, NOT a pipe:
|
||||
# under `pipefail`, `grep -q` exiting on the first match kills `tail` with
|
||||
# SIGPIPE, and the pipeline then reports failure precisely when it matched.
|
||||
grep -q -E '"name":"([^"]*__)?(update|create)_task"' < <(tail -c 2000000 "$transcript" 2>/dev/null) || {
|
||||
grep -q -E '"name":[[:space:]]*"([^"]*__)?(update|create)_task"' < <(tail -c 2000000 "$transcript" 2>/dev/null) || {
|
||||
rm -f "$marker" 2>/dev/null || true
|
||||
exit 0
|
||||
}
|
||||
|
||||
@@ -55,7 +55,8 @@ def _text(text):
|
||||
|
||||
def _transcript(tmp_path, lines):
|
||||
path = tmp_path / "t.jsonl"
|
||||
path.write_text("\n".join(json.dumps(line) for line in lines) + "\n")
|
||||
# Compact, like the file Claude Code writes ({"name":"…"}, no spaces).
|
||||
path.write_text("\n".join(json.dumps(line, separators=(",", ":")) for line in lines) + "\n")
|
||||
return path
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user