Reply shapes reach the reply, a Stop hook checks completion reports, and hook pipes keep their output #156

Merged
bvandeusen merged 6 commits from dev into main 2026-09-14 18:57:07 -04:00
3 changed files with 4 additions and 3 deletions
Showing only changes of commit c7531d3700 - Show all commits
+1 -1
View File
@@ -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"
},
+1 -1
View File
@@ -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
}
+2 -1
View File
@@ -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