Releases: ypxing/coding-crew
Releases · ypxing/coding-crew
Release list
fix: don't trust a partial dev-commands.json cache as fully discovered
Fixed
- Command discovery (
discover-commands.sh) no longer trusts a partial.coding-crew/dev-commands.jsonas fully discovered. It used to skip re-running discovery the moment the cache file existed at all, regardless of which of the six fields (test/lint/typecheck/install/env/credential_target) it actually contained. That let a partial write — e.g.ensure-deps.sh's owninstall_mode/docker_servicefields landing first because an earlier sprint's model dispatch failed (expired credentials, a timeout) before ever writing the six discovery fields — permanently starve every later sprint of full discovery, since the file "already existed." The skip now requires all six fields to be present (any value, including JSONnull, which still means "checked, confirmed no such command") before trusting the cache; a cache missing even one field falls through and re-runs discovery.
feat: prune skills dropped from a --skills list
Fixed
install.shnow re-execs into a newer bash instead of dying withdeclare: -A: invalid optionon macOS. Apple's stock/bin/bashis 3.2 (frozen there since the GPLv2→GPLv3
switch) andinstall.sh's own#!/bin/bashshebang is resolved by the kernel from that
hardcoded path, not from$PATH— so a newer Homebrew bash already on a user'sPATHwas
never picked up just by running the script (which is whatbootstrap.sh'sexec "$INSTALL"
does). The registry-read cache needsdeclare -A(bash ≥ 4). The script now detects bash < 4,
hops to a findable newer bash (Homebrew's common install locations, orPATH), and exits with
brew install bashguidance if none exists.
Added
install.sh claude --skills a,b,cnow treats that list as the full desired skill set: a
name present in a prior--skillsinstall but missing from this one is uninstalled, instead
of being silently left on disk forever.write_manifest()'s merge only adds/updates keys, so
without this a shrunk--skillslist had no way to actually drop anything. The new
prune_skills_not_in()shells out touninstall.sh --skill— the existing single writer of
skill removal — rather than duplicating that logic, then deletes the pruned key from
manifest.jsonso the merge doesn't resurrect it.
chore: remove caveman and improve-codebase-architecture skills
Removed
- The
cavemanandimprove-codebase-architectureskills are gone, along with their
registry.jsonentries,install.sh/bootstrap.sh/unbootstrap.sh/uninstall.shexamples,
doc references, and structural tests. Both were third-party skills (JuliusBrussee/crew-caveman,
mattpocock/skills) this repo no longer maintains as part of its distribution.
fix: clear stale sidecar report.json before each dispatch
Fixed
runWorker/runReview/runTriagenow delete each dispatch's.report.jsonsidecar
before writing that round's prompt, instead of leaving a prior round's (or a prior resumed
sprint's) sidecar sitting at the same fixed path.waitForSidecarReportindispatch.mjs
treatsexistsSyncas "found" the instant the herdr wait settles, so a stale sidecar from an
earlier dispatch to the same slug was read back as this round's verdict whenever the coder's,
reviewer's, or triage agent's turn died before writing a fresh one — a false verdict rather
than the intended pane-scrape fallback.
feat: extend the sidecar-first herdr dispatch policy to review and triage
Changed
- The
<slug>.report.jsonsidecar-first dispatch policy (already used for the crew-coder
worker) now also covers the reviewer and triage agents.dispatchViaHerdrchecks each
role's report file before scraping the pane at all: the review and triage prompts now name
areportPathand instruct the agent to write its verdict there as its last action, falling
back to the same fenced-json-in-prose reply only if that file never lands.
parseReviewReport/parseTriageReportaccept the parsed sidecar and prefer it over the
captured text entirely, same policyparseWorkerReportalready had. Closes the same class of
herdr read-capture failure (empty/garbled pane render) for review and triage that the worker
fix already closed — a genuine verdict no longer depends on a terminal scrape succeeding.
fix: report render line count and echo-found status on herdr empty-reply failures
Changed
- A herdr
DISPATCH-FAIL outEmpty=trueline now reports the captured render's line count and
whether the echoed prompt was found anywhere in it (lines=N echoFound=yes|no). Previously
the log's only diagnostic was the last 400 characters of the render — which is always just
Claude's bottom status-bar chrome whether the reply capture failed or succeeded, so it couldn't
distinguish "the read's--lineswindow (or the pane's alt-screen buffer) never captured the
echoed prompt at all" from "the echo is there butextractHerdrReply's end-marker pattern
didn't match."echoFoundis computed byherdrEchoFound, sharingherdrIsEchoLinewith
extractHerdrReplyitself rather than reimplementing the echo check.
feat: unify review/triage verdict reporting on a shared JSON contract
Changed
- The reviewer and triage agents now report their verdict as a fenced json block
({"branch", "slug", "verdict", "detail", "findings"}/{"fixable", "category", "detail"})
instead of column-0## Branch:/AC:/Review:/FINDING:andFIXABLE:/CATEGORY:/DETAIL:
lines, mirroring the structured-result contractcrew-coderalready used. The old shape had
three independent hand-rolled parsers of the same aggregate review report file — a Node regex
gating the merge, an awk increw-summary.sh's rollup, and a second awk in
promote-findings.sh'sremind— and they drifted apart on how much whitespace a
herdr-captured review header could carry before a line no longer matched. A genuinely
successful, all-met retry review could land indented and without the##after an earlier
not_runstub in the same file and still be silently dropped from the summary and the findings
count, even though the merge/AC gate (whose regex already tolerated leading whitespace) had
parsed and acted on the real verdict correctly. JSON's whitespace-between-tokens-is-insignificant
grammar closes the whole class rather than one more anchor at a time —crew-summary.shand
promote-findings.shnow both read the aggregate file through one shared parser
(orchestrator/review-rollup.mjs, overreport.mjs's newparseReviewAggregate) instead of
reimplementing it twice.report.mjs'sparseReviewReport/parseTriageReportprefer the json
block and fall back to the old markdown shape, so an un-migrated reviewer/triage agent still
works.mark-not-run's stub now emits the same json shape (verdict: "not_run").
fix: notify the triggering herdr pane even when a sprint fails before it starts
Added
- Under
HERDR_ENV=1, crew-afk now pushes the sprint's outcome into the triggering pane
($HERDR_PANE_ID) once the run finishes, stalls, or errors, instead of leaving that pane to
poll on a long interval for the same information — seenotifyTriggeringPane's doc comment.
Fixed
- That nudge only fired once a sprint had actually been initialized, so a preflight or
feature-slug resolution failure — the fastest way a run can end — left the triggering pane
with nothing to stop polling for.main()'s run is now wrapped in a singletry/finally
from before preflight onward, so every exit path, including one that never got as far as
creating aSprint, still reaches the notify call.
fix: fail fast on a herdr pane blocked mid-turn, log last-seen agent_status on empty replies
Fixed
- A dialog appearing mid-turn on a herdr pane (after
--waitsettled on a stale idle/done
match) polled uselessly until the dispatch's whole deadline expired before reporting an
unexplained empty reply. Unlike idle/done, ablockedagent_statusnever resolves on its
own — it stays blocked until a dialog is answered — sodispatchViaHerdrnow fails immediately
on that status (from both the direct check and from insidewaitForHerdrIdle's own polling)
with the pane's actual dialog text, the same way it already does for a dialog that's there
before the prompt is even sent. - A
DISPATCH-FAIL outEmpty=truelog line gave no way to tell a genuinely empty reply from
one that simply ran out of deadline while the pane was still busy. The line now includes the
last-seenagent_statusalongside the rendered tail.
fix: check agent_status directly before giving up on a busy herdr pane that never errors on read
Fixed
- A herdr dispatch could still report an empty reply even after v1.29.79's
agent_not_idle
fix, when the pane was busy in a way that never madeagent readitself error. The same
--wait"does not track turns" gap could leave a read succeeding with code 0 while only
catching the pane's live status footer (tool-call counters, a running timer) — indistinguishable
from a genuinely blank reply, and the fixed-delay backoff that follows only covers a few
seconds of flush lag, not minutes of real work.dispatchViaHerdrnow checksagent_status
directly once that backoff is exhausted: if the pane is still actively busy, it polls until
idle/done (bounded by the dispatch's own deadline) and reads again, instead of giving up while
the coder is still working.