v0.5.0
First tagged release. Highlights since the initial scaffold: the M4 dynamic task
workflow (plan → fan-out → synth), M5 saved workflows, M6 quality helpers, the
M4.x plan pre-approval gate, background runs with on-demand /maestros
monitoring, env-configurable agent timeouts, and CI. The runtime is zero-deps.
Fixed
/maestros <runId>now shows the plan and synth phases too. Previously
only the explore fan-out reported progress, so during the (often minute-plus)
plandecomposition — and the finalsynth—/maestros <runId>showed "no
progress recorded yet" and the run looked stuck. A newruntime/phase-monitor.mjs
(startPhaseMonitor) wraps every phase, single-agent or fan-out: it records a
pendingsnapshot toprogress.jsonthe instant a phase begins and threads
the planner/synth streaming (bytes/tokens/state) through, so the phase is
visible from the moment it starts. Applied acrosstask(plan → explore →
synth),brainstorm, andhello. New unit tests:
tests/phase-monitor.test.mjs.- Task subagents no longer time out on research-heavy runs. The task
workflow's plan/explore/synth phases (and the brainstorm lenses) run full
research subagents — web fetches, repo analysis, many tool calls + extended
reasoning — whose wall-clock routinely exceeds the old hard-coded 120 s limit,
so every subtask could fail withstatus=timeoutand produce no output.
Timeouts are now two tiers: research agents default to 10 min
(GHCP_MAESTRO_TIMEOUT_MS) — matching the ~600 s floor of a single LLM API
call in the OpenAI/Anthropic SDKs — and the fixed-prompt diagnostics
(pong/hello/env probes) stay short at 1 min
(GHCP_MAESTRO_TIMEOUT_PROBE_MS) so a slow one still fails fast. When a task
aborts on timeouts, the failure message points toGHCP_MAESTRO_TIMEOUT_MS.
New unit tests:tests/timeouts.test.mjs.
Changed
- Diagnostics hidden from
/maestro help.helloandpongare
infrastructure smoke tests, not user features — they now carry ahiddenflag
and render under a separate "Diagnostics" section instead of the main
subcommand list (the commands still work, and theGHCP_MAESTRO_PROBE_*env
triggers and resume registry are unchanged). Thebrainstormsummary drops the
"demo" framing — it is a real multi-lens feature. Help rendering moved to a
pure, unit-testedruntime/help.mjs(renderMaestroHelp).
Added
- Background runs +
/maestrosmonitoring (issue #2)./maestro task|brainstorm|run(and thehellodiagnostic) now dispatch in the
background — the handler returns
immediately with arunning in background — watch with /maestros <runId>
pointer and the session stays free while the fan-out runs. Per-agent progress
(state, elapsed, streamed bytes, per-phase token totals) is aggregated by
runtime/monitor.mjsand persisted to the run dir asprogress.json. Watch it
on demand:/maestroslists runs with a one-line progress summary for any still
running, and/maestros <runId>prints the full dashboard. The standalone
adapter subscribes to each child session's events (subagent.*,
tool.execution_*,assistant.streaming_delta,assistant.usage) through an
onProgresssink threaded byspawn/spawnAll. Monitoring is best-effort and
never affects fan-out results; opt out withGHCP_MAESTRO_NO_MONITOR=1.
New/updated unit tests acrosstests/monitor.test.mjs,
tests/run-store.test.mjs,tests/spawn-progress.test.mjs,
tests/standalone-progress.test.mjs,tests/monitor-enabled.test.mjs. - M4.x — plan pre-approval gate. New
runtime/plan-approval.mjsadds a
planApprovalGatethat runs after theplanagent decomposes a task but
before the fan-out. On an interactive host (session.capabilities.ui. elicitation === true) it logs the subtask list + prompt previews and shows a
multi-select elicitation dialog so the user can approve, run only a subset, or
abort; declining/cancelling marks the runstoppedwith no fan-out. The gate
fails closed if the dialog errors. Non-interactive hosts (env probes, CI,
headless), resume replays, and theGHCP_MAESTRO_AUTO_APPROVE=1bypass
approve every subtask automatically, so existing paths keep working. The
dialog uses stable per-subtask index keys (withenumNameslabels) so
duplicate agent names can't collapse a selection. 12 unit tests
(tests/plan-approval.test.mjs). - M6 — quality helpers. New
runtime/quality.mjsbuilds four multi-agent
patterns on top ofspawnAll, each decoupled from any specific adapter and
fully unit-tested with scripted adapters:adversarialReview(findings, { reviewers, threshold })— independent
reviewers try to rebut each finding; survivors are those judged valid by at
leastthresholdof their reviewers.multiAngle(task, { angles })— drafts the task from several angles in
parallel, then a judge agent picks or merges the strongest draft.fixLoop({ check, applyFix, maxIters })— re-runscheckuntil it passes
(ormaxIters), dispatching a fix agent between failed checks.crossCheck(claims, { sources })— verifies each claim across multiple
perspectives and aggregates a support rate.
- M5 — saved workflows. New
runtime/saved-workflows.mjsdiscovers,
validates, and runs project/user/bundled workflow scripts:- scan order project (
./.ghcp-maestro/workflowsor
$GHCP_MAESTRO_WORKFLOWS_DIR) > user (<dataDir>/workflows) > bundled
(saved-workflows/), with kebab-case + reserved-name validation and
priority-based de-duplication; buildWorkflowApiinjects a sandboxedapi(boundspawn/spawnAll,
phase,log, structuredargs, plus the M6 quality helpers) so scripts
never touch the filesystem, shell, or SDK directly;- new commands
/maestro run <name> [json|text args]and
/maestro workflows; runs persist asworkflow=saved:<name>so they show
in/maestrosand can be resumed; - bundled example
saved-workflows/deep-review.mjs.
- scan order project (
- Dev tooling + CI. Root
package.jsonwithtest/lint/check
scripts and an ESLint flat config (eslint.config.mjs). The runtime stays
zero-dependency; ESLint and friends aredevDependenciesonly. A
no-consolerule enforces JSON-RPC-safe logging in extension/runtime code. - GitHub Actions:
ci.yml(ESLint static analysis,node --checkon every
tracked.mjs, and thenode:testsuite across Node 20 and 22) and
codeql.yml(CodeQLsecurity-and-qualityanalysis). - 43 new unit tests (
tests/quality.test.mjs,tests/saved-workflows.test.mjs,
plusbuildPlanPrompt/sanitizeAgentNamecoverage), and 12 more for the
M4.x approval gate (tests/plan-approval.test.mjs), for a total of 78.
Changed
- Extension load banner now reads
… (M6 release) …and reports discovered
saved workflows. - Plan generation/parsing extracted from
extension.mjsinto the importable,
pureruntime/plan.mjs(buildPlanPrompt,parseAndValidatePlan,
sanitizeAgentName).tests/plan-parse.test.mjsnow imports the module
directly instead of regex-extracting the function source. - Resume resolves both built-in and
saved:<name>workflows via a single
resolveWorkflowHandler. - Line endings normalized to LF across the tree (per
.gitattributes); the
lockfile is now committed so CI cannpm cireproducibly.
Fixed
- Review hardening (CodeRabbit / CodeQL on PR #1).
quality.mjs:adversarialReviewandcrossChecknow group agent results
by an exact per-item spec-id set (folding in the item index) instead of a
string prefix, so findings/claims whose ids share a prefix (e.g.aand
a-r1) can no longer cross-contaminate scores;crossCheckmaps each
verdict back to its source explicitly rather than by positional index.quality.mjs:defaultSupportParserchecks negative phrasing first, so
NOT SUPPORTED/UNSUPPORTED/SUPPORTED: NOare no longer misread as
supported.saved-workflows.mjs: an unreadable (non-ENOENT) workflow directory is
now recorded asskippedand skipped instead of aborting the whole scan;
parseWorkflowArgsrejects JSON arrays so structured args are always plain
objects;buildWorkflowApihelper wrappers tolerate a missingextraarg.extension.mjs: failed resume and a missing saved-workflow descriptor now
transition the run toerrorinstead of leaving it stuck asrunning;
task/brainstormruns fail (statuserror) when every fan-out agent
fails or whensynthfails, and log per-agent failures otherwise.plan.mjs: agent-id truncation length is now the namedMAX_AGENT_ID_LEN
constant instead of a magic number.- ESLint bans direct
process.stdout/stderr.writein extension/runtime code
(onlysession.log()is JSON-RPC-safe); CI/CodeQL checkouts run with
persist-credentials: false;plugin.jsondeclares itsextensionsentry
andrepositorymetadata explicitly.
M4 (previously unreleased)
- M4 — meta-prompt task workflow.
/maestro task <natural-language task>
launches a 3-phase run (plan→explore[N]→synth). Theplanagent
uses an LLM to decompose the task into 3-6 independent subtasks emitted as a
JSON spec array; the runtime fans them out through the
standalone-clientadapter so each subtask runs in its own isolated
Copilot CLI session. Thesynthagent merges the outputs. parseAndValidatePlan— fence-stripping JSON recovery with trailing-comma
tolerance, schema validation (3-6 entries, unique non-emptyagent,
non-emptyprompt, agent name <=60 chars, prompt <=4000 chars), and a one
retry pass that feeds the parser error back to the planner./maestro help(and/maestrowith no args) prints all subcommands with
short summaries, sourced from a single data-driven registry.