samykabu/agent-tools
Delegate one task to an external agent CLI and get back a measured, normalised result; and keep a live, deterministic progress report for a Markdown plan or Spec Kit feature, with native Claude Code and Codex hooks
Changelog
1.4.3 — 2026-10-18
Adds the Agent Plugins root manifest (plugin.json, schema 1.0.0) beside .claude-plugin/plugin.json so Codex can install the bundle from a marketplace. No skill content changes.
1.4.2 — 2026-10-18
Fixes from the sanduq #90 review of the vendored progress-report code.
- Clarification answers decode Scope's
option_labelexactly:A..Z, thenAA,AB, and so on (AAis index 26), one to three ASCII letters in either case, and only when the label is in range. Anything else stays exact text with a null index. Scope options are kept up to 100 (they were cut at 20, which hid every label pastT). Workflow decisions use single letters, so they are unchanged. - A self-report bound to a session applies only when the host snapshot names the same main session. With no snapshot, or an
unreadable one, it is not applied; a session-unknown report still is. The reader also stops treating
self-report.jsonas a host snapshot, which had given the report a main session of its own. sourceslists every file the build read (host snapshots, delegate run journals, project config) instead of a fixed list, naming a dynamic file by its repository-relative path. A change to any of them during a build setscollection.dirtyand is listed ininconsistent_sources.- When two marked workstreams claim the same task, the one that loses it stays in the report with its owners and the conflict, and each workstream the conflict names shows it. The task's bucket stays on the winner.
1.4.1 — 2026-10-18
Docs only. No code changes.
- The
progress-reportREADME describes the Timeline page,--workstream,--schema v2,bind --model --effortandtheme --layout, and quotes the token benchmark fromdocs/token-benchmark.md.
1.4.0 — 2026-10-18
progress-report 1.2.0: a v3 projection with stages, workstreams, runs and a timeline, and a Timeline view that replaces
the lane boards as the default page.
-
The page now reads top to bottom: what needs attention, the orchestrator, a Gantt of stages over time with episode detail, what happened next to the workstreams and decisions, a History section for retired lanes, and a collapsed, searchable runs table. It works at 360 px, keeps focus and open sections across refreshes, and switches layout on an open page.
-
progress status --jsonnow printssanduq.progress.v3by default.--schema v2prints the v2 document unchanged, and the Workflow shim, the one-line summary,progress export --schema v2and theclassiclayout use it.report.jsonholds v3. -
Stages come from Workflow's published
stage_plan(canonical order and policy filter for older producers). Episodes come fromworkflow/lifecycle.jsonl; older data gives labelled partial episodes from receipts and recoveries, or an unknown group. -
Runs are keyed by delegation run id, with recorded retry links, exact-claim candidate acceptance, intents kept apart as
dispatch, namespaced host children and labelled durations. Nothing is inferred from timing or matching text. -
Workstreams: lane facts marked with
progress lane --workstream, the workstream tags thattasks.mddeclares in its legend, and a Shared group. Role markers and[P]never count. -
Decisions from three adapters (facts, Workflow ledger,
workflow/clarifications.json), each reported as available, absent, unsupported or invalid. An unrecorded editor or answer time stays null. -
progress bind --host H --model M --effort Estores a coordinator self-report in.host/, shown as self-reported and never preferred over what the host observed. -
progress theme --layout timeline|classicsets the layout key inlayout.js;classicfeeds the browser the v2 document. -
Every source file read is listed with a content fingerprint and generation.
-
progress exportaccepts--schema;statusrejects an unknown schema withPROGRESS_USAGE. -
Fixture
tests/fixtures/run-842gains the tasks.md legend and a derivedworkflow/clarifications.json(C1Q1). -
Checkpoint receipts and recoveries are matched to lifecycle events only by the same stage, kind and
claim_id; records without one are always kept. Onlyacceptedand post-checkrejected-completionevents decide candidate acceptance. -
Reads of
lifecycle.jsonl(8 MiB tail) andclarifications.json(2 MiB) are capped, fingerprints come from the bytes actually parsed, and ids such asconstructoror__proto__cannot break the page. -
Reviewed over four cycles by Claude Fable 5.1 and Codex gpt-6-astra.
1.3.1 — 2026-10-17
Fixes from the review of the sanduq vendoring PR.
delegate-taskon Linux: check batches no longer fail on kernels that lack the/proc/<pid>/task/<tid>/childrenfile. The containment helper now falls back to scanning/proc/*/statfor its own children, and it still stops with a clearCHILD_ENUMERATION_UNAVAILABLEif/proccannot be read at all.delegate-taskon Windows: environment names are matched without regard to case, so a batch or per-checkPATHreplaces an inheritedPathinstead of sitting beside it. Order stays inherited, then batch, then per-check.delegate-task: every check's launcher is resolved before the batch creates an attempt, so a missing executable fails up front instead of partway through; on Unix the launcher must be executable. Public delegate summaries no longer include the raw usage block.delegate-taskon Windows: a cancel request that arrives before the check is launched now starts nothing and reports a closed, not-started result.progress-report: when two lanes in the facts log name the same delegation identity, they now fold into one lane (before, the second one kept its own duplicate row).progress-report: a receipt that Workflow marked stale no longer decides the current stage. The stage comes from the latest receipt that is not stale. Stale receipts still count for pause history and the events list.
1.3.0 — 2026-10-17
-
Add native argv check batches with immutable attempts, exclusive execution ownership and explicit retries.
-
Bound public collection by UTF-8 bytes while retaining complete raw evidence and omission metadata.
-
Add bounded delegate summaries and startup diagnostics with an optional deadline; preserve legacy result semantics.
-
progress-reportcorrectness patch, found on a real 23-task run (frozen astests/fixtures/run-842):- The header names the stage from the latest accepted receipt when no claim is active (it was blank).
- A checkpoint
pausethat later stages superseded is no longer a blocker. - Finished lanes stop at their last terminal evidence; a lane with attempts shows the sum of their own durations, and a reused lane id restarts at its current owner (a 26-minute run no longer reads 13h 52m).
- A facts lane and the Workflow delegation for the same run are one lane, matched only by durable ids (the lane owner is the run id or the delegation identity), never by label, time window or requested model: on the fixture 77 lanes become 72, and the 44 that carry tasks or attempts are the table.
- UI: decisions and blockers come before lanes; no board for a lane with no tasks; done-only boards start closed; lanes with nothing to read collapse into one line; events keep stage, failure and decision lines and filter by kind; a line explains missing host hook data; "None made" now reads "No decisions recorded in Workflow decisions".
- The default block order changed; a project's own
theme.jsonorder is kept. - Review fixes: a closed lane that absorbs a newer running attempt is active; retired
W<n>ids and folded ids keep aliases (blocker targets,by.ref, lane references); a closed lane's closure yields to any attempt that started after it closed (running, failed, blocked or unaccepted success); a pause is history once the status leavespausedor a newer claim exists, and the event says why ("superseded: newer claim"); notes reach the events list within their own bound; the header shows a stage status other than in-progress ("pr · paused"); board and quiet-lane summaries keep keyboard focus across a refresh; the missing-telemetry note is host-neutral.
1.2.2 — 2026-10-16
progress-reportdocs: Spec Kit now runs every Progress event through one internal command,speckit.progress.hook(not registered as an agent skill, so it no longer uses the host's skill budget);commands.mdandhosts.mdshow the new hook commands. Codex asks to re-approve the hooks once because their command strings changed.
1.2.1 — 2026-10-16
progress-report: Codex runs project hooks only when the project is trusted and each hook is approved in the user config; unapproved hooks are skipped silently, so the session never binds.progress hooks status --host codexnow reports registered and approved counts per scope and whether the project is trusted, and counts Spec Kit's hooks in.codex/config.toml.hooks install --host codexreminds you to approve the hooks, andprogress statushintsno bound session (codex hooks not approved?). Trust and approval state is read, never written.
1.2.0 — 2026-10-15
progress-report:.host/and.view/each hold a nested.gitignorewith*, so local-only files stay ignored even when a parent.gitignorere-includes them;initcreates them before its ignore preflight and rolls them back if the preflight refuses.- New skill
progress-report: a live, deterministic progress report for a Markdown plan checklist or a Spec Kit feature. It is the portable home of the Sanduq Progress extension (1.0.1), under MIT; the extension will vendor it from here. - Plan mode:
progress init --plan PATH [--name NAME] [--dir DIR]turns any- [ ]/- [x]file into a report in.progress/<name>/. Headings become phases, ids such asT001are kept, other items get stableP001... ids (equal text first, then 60 percent similar text, then the next number; numbers are never reused), and(depends on …)/(after …)annotations become edges. The plan is only read. The trackedplan.jsonstores ids and one-way text fingerprints, never item text (the text used for fuzzy matching lives in the git-ignored.host/). An id with no bold and no:.)must beT,USorPplus digits, so MP3, GPT-4, Q3, ES6, X11, H264 and RFC-7231 are text; a repeated id becomes an automatic one. A plan outside the repository is stored asexternal:<name>; its absolute path and a path fingerprint stay in a git-ignored file, and a different file of the same name is refused unless--rebind. - Plan report safety: glob characters in
--dirare escaped in the git exclusions andinitverifies them withgit check-ignore(PROGRESS_EXCLUDE_FAILED) on the actual local-only files, before anything is registered or created; a--dirthat holds another tool'splan.jsonis refused before any write (PROGRESS_DIR_CONFLICT); nothing underspecs/is a report directory; the plan is read once per refresh. - Target resolution for every verb:
--plan NAME|PATHor--feature DIR; with exactly one active report no flag is needed, otherwisePROGRESS_NO_FEATURElists the candidates on one line. - Works with no Spec Kit: project state lives in
.progress/.project/when there is no.specify/. Feature mode, Workflow collection and every 1.0.1 behaviour are unchanged. progress hooks install|uninstall|status --host claude|codex [--scope project|user]writes tagged native hook entries (.claude/settings.json,.codex/hooks.json), preserves all other settings, removes only its own entries, and refuses (exit 3) when Spec Kit's Progress hooks are already registered. The Codex file shape is unverified against a running host. Commands use the braced${CLAUDE_PROJECT_DIR}and end in; exit 0so a vanished plugin path cannot block the host (hooks statusflags it; uninstall before updating the plugin). Settings are edited under a lock and only if unchanged since read; entries in the other scope are refused unless--force-both; an unreadable other-scope file does not stop an install;--pythonwith spaces is refused;installprintsbind=<nonce>when a report exists, so hooks can be installed before or afterinit.- UI: a plan report shows its plan file in the header instead of the Workflow stage.
- 323 tests (stdlib unittest, 100 of them new for plan mode, the hook installer and the review fixes); browser tests skip without Playwright.
1.1.3 — 2026-10-10
- Remove a third-party notices file that did not apply: this bundle contains no third-party material.
1.1.2 — 2026-10-10
- Relicensed under MIT; the plugin now carries LICENSE.
- Claude runs report the model that did the work:
actual_modelis themodelUsageentry with the most output tokens, not a side call's model. - Moved to the samykabu/sanduq-skills repository.
--resumewith an unknown run id reports "no such run to resume" before looking for the harness CLI.- Fix a relay SIGTERM on Linux publishing the harness as killed by SIGKILL instead of
relay_aborted; the test fake harness no longer truncates stdout past 64 KiB on POSIX pipes. All 174 tests pass on Windows and Linux.
1.1.1 — 2026-09-27
- Fix sandboxed Codex continuation by placing exec options before the resume subcommand (B6).
- Add an end-to-end fake-harness test that rejects misplaced sandbox options.
- Keep the driver and result schemas unchanged; this is an argument-order fix.
1.1.0 — 2026-09-26
- Add the machine-readable
delegate-task.driver.v1contract for workflow integration, including requested and observed model fields. - Make the driver entry point work when the skill is installed through a symlinked folder.
- Keep run status and measured file changes explicit in the result contract; 172 driver tests pass.
1.0.0
- Initial
agent-toolsplugin bundle with thedelegate-taskskill.