From devboy
Runs shell commands with step-by-step tracing, verifies outcomes via exit code/stdout/files/custom checks, retries on failure up to 3 times. Use when exit code alone doesn't confirm success.
npx claudepluginhub meteora-pro/devboy-tools --plugin devboyThis skill uses the workspace's default tool permissions.
The opinionated wrapper that the other skills in this category assume.
Verifies claims like 'tests pass', 'build succeeds', 'no lint errors', or 'coverage >80%' by running shell commands, checking staleness, analyzing full output, and reporting PASS/FAIL with evidence.
Enforces fresh command output verification before claiming task completion, bug fixes, test passes, builds, deployments, or success.
Enforces running verification commands before claiming tests pass, builds succeed, bugs fixed, or work complete. Ensures evidence-based status reports.
Share bugs, ideas, or general feedback.
The opinionated wrapper that the other skills in this category assume.
It runs one command, emits a structured session trace for every attempt,
checks the expected outcome, and decides whether to retry. Downstream
skills (daily-report, retro,
knowledge-extract) consume the trace this skill produces.
Collect the following arguments from the caller:
--command "<shell command>" — the command to execute.--expect-exit 0 — exact exit code.--expect-stdout "<substring>" — stdout must contain this string.--expect-file "<path>" — this path must exist after the run.--expect-check "<verification command>" — a shell command whose
exit code 0 means "the main command did what it was supposed to".--max-retries 2 (default 2). The command runs up to
1 + max-retries times.--skill-name <name> — the name of the skill that invoked this
wrapper. Traces are written under
.devboy/sessions/<YYYY-MM-DD>/<skill-name>/<session_id>/ so
downstream readers attribute the work correctly.--allow-destructive — required before running anything that matches
the destructive-command guardrail (see below).If an expected-outcome flag is missing, the skill exits with an error — there is nothing to verify against.
result=$(devboy trace begin --skill "$SKILL_NAME")
SESSION_DIR=$(echo "$result" | jq -r .session_dir)
SESSION_ID=$(echo "$result" | jq -r .session_id)
Emit a decision event that records what the caller asked for:
devboy trace event \
--session-dir "$SESSION_DIR" --session-id "$SESSION_ID" \
--skill "$SKILL_NAME" --phase decision \
--payload "$(jq -nc --arg cmd "$COMMAND" --arg expect "$EXPECT" \
'{question:"what to run",decision:$cmd,expected:$expect}')"
For attempt in 1..=1+max_retries:
tool_call event describing the command about to run and
the attempt number.ERROR|WARN|FAIL|panic. Everything else
can be dropped — trace payloads should stay small (ADR-015 risks).tool_result event with {ok, exit, duration_ms, summary}.verify event with
{check, ok, detail}. The check is:
test -e <path>, or--expect-check shell command.ok: true, break out of the loop.note event explaining why
the next attempt is happening ("expect-exit 0 but got 1; retrying"),
and continue. If retries are exhausted, fall through to step 4.Pick the outcome:
success — some attempt produced ok: true on both tool-result and
verify.failure — every attempt failed the verification.aborted — the caller interrupted mid-run, or a destructive command
was rejected by the guardrail.devboy trace end \
--session-dir "$SESSION_DIR" --session-id "$SESSION_ID" \
--skill "$SKILL_NAME" --outcome "$OUTCOME" \
--summary "$SHORT_SUMMARY"
Print a 3-to-5-line summary to stdout naming: the command, attempts
used, final outcome, and the path to the trace directory. Do not
reprint the full captured output — the caller can cat the trace if
they want it.
start and one end event per invocation.tool_call / tool_result /
verify trio.meta.json lands with outcome set to one of success | failure | aborted.Destructive commands are refused unless the caller passes
--allow-destructive. The refusal path still opens a session, emits a
note event describing the rejection, and ends with
outcome: aborted so downstream skills can see what happened.
Treat the following substrings (case-insensitive) as destructive:
git push --force, git push -f, git reset --hard,
git clean -fdx, git branch -Drm -rfdrop table, drop database, truncatekubectl delete, helm uninstallnotify (category 5).