Releases: hellices/ghcp-maestro
Releases · hellices/ghcp-maestro
Release list
v0.7.0
Added
- Demo GIF + scripted replay. New
demo/replay.mjs(a presentation-only
replay of a/maestro taskrun that closely mirrors the runtime's real log
output) anddemo/demo.tape(VHS scene) renderdocs/assets/demo.gif,
now embedded at the top of both READMEs. Dev-only:demo/and
docs/assets/are excluded from release archives. - Always-on token accounting. Completed task runs log their total token
usage (tokens=<used>[/limit]) and persisttokensUsedin the run
manifest (budget-stopped runs too);/maestrosshowstokens=<n>per run.
Enforcement stays opt-in viaGHCP_MAESTRO_BUDGET_TOKENS— accounting
always-on, spend caps only when explicitly configured. - Cross-agent prompt-injection hardening. Dependency outputs
(augmentPromptWithDeps) and the synth digest (buildSynthPrompt) are now
fenced in<<<UNTRUSTED-AGENT-OUTPUT>>>sentinels with an explicit
treat-as-data instruction, per OWASP Agentic Security guidance — agent
output is data, not instructions. Always-on, zero token cost. (#33) - Opt-in per-label model routing. New
core/model-routes.mjs:
GHCP_MAESTRO_MODEL_ROUTES(oropts.modelRoutes) maps label patterns
(plan,explore:<agent>,verify,synth;*wildcards,
first-match-wins) to models so fan-out workers can run on cheaper models
than the planner/synth. No routes → adapter default, specs unchanged. (#17) - Opt-in verify phase.
GHCP_MAESTRO_VERIFY=1(oropts.verify) inserts
a verification agent between explore and synth that judges each subtask
output against the original task objective (met / partially-met /
not-met + gaps, MAST-style); the report feeds the synth prompt. Verify
failure is non-fatal. Off by default — one extra agent per run. (#31) - OTel GenAI-style trace export. New
core/trace.mjs+writeRunTrace
inrun-flow.mjs: every terminal run (complete / stopped / error) writes
trace.json— aninvoke_workflowroot span plusinvoke_agentchild
spans withgen_ai.*semantic-convention attributes. Always-on, zero deps,
best-effort (never fails a run). (#32) - Release polish. New
docs/DEMO.md— a five-minute end-to-end
/maestro taskwalkthrough with real log-line formats (install → plan gate
→ parallel explore +/maestrosdashboard → synth → resume/stop). READMEs
gain a Known limitations section, thecopilot plugin installflow was
verified end-to-end against the self-served marketplace (0.5.0 → 0.6.0
upgrade), and the release-archive file list was re-confirmed lean after the
docs reorg. (#24) /maestro install <source> [--force]— one-command workflow install.
Newcore/workflow-install.mjs: accepts a github.com blob URL, a
raw.githubusercontent.com URL, orowner/repo/path/flow.mjs[@ref]shorthand
(ref defaults tomain; https only), downloads the file (256 KB cap, checked
against Content-Length before the body is read; redirects refused so a raw
URL cannot bounce off GitHub), and validates it without executing it —
node --checkparse + default/runexport scan on a quarantined temp copy —
before writing to the user workflow dir; project workflows still shadow
it. Existing names are never overwritten without--force, installs confirm
via elicitation when the host supports it (dialog errors fail closed), and
every install prints a review-before-running warning.installjoins the
reserved workflow names. (#23)- Agent auto-retry with exponential backoff.
spawn/spawnAllretry
error-status attempts (API blips, rate limits) with exponential backoff +
jitter —GHCP_MAESTRO_RETRIESextra attempts (default 1,0disables).
timeout/abortedoutcomes never retry, backoff sleeps abort with the run
signal, and results/persisted agent records carry anattemptscount. The
quality helpers forwardretries/retryBaseMs. (#20) - Cost visibility + token budget cap. New
core/budget.mjs: the task
workflow logs a run-size estimate at the plan gate (also shown in the
approval dialog), warns on fan-outs ofGHCP_MAESTRO_LARGE_RUN_AGENTS+
subtasks (default 5), andGHCP_MAESTRO_BUDGET_TOKENS(accepts500k/2m)
soft-stops a run once exceeded — in-flight agents finish, un-started agents
are skipped asaborted, the run is markedstoppedand stays resumable
via/maestro-resume.spawn/spawnAll/runPhaseaccept a shared
budgettracker. (#14) - DAG plans:
dependsOnbetween subtasks. The plan schema gains an
optionaldependsOn: string[](validated: known agents, no self-reference,
no cycles).planLayersgroups specs into topological layers; the task
workflow fans each layer out in order and injects dependency outputs
(truncated to 4 000 chars each) into dependents' prompts via
augmentPromptWithDeps. Dependents of a failed dependency are persisted as
a newskippedstatus without invoking the adapter, so/maestro-resume
reruns them. Plans withoutdependsOnbehave exactly as before. (#21) - Partial-failure disclosure in synthesis.
agentDigestrenders non-ok
results as## <agent> (FAILED: <status>)blocks with the error text;
buildSynthPromptadds a "state explicitly which angles are missing"
instruction when any subagent failed (all-ok prompts are byte-identical to
before); the task workflow logs acoverage: N/M subtasks ok (…)line next
to the final answer. Both surfaces share the change viacore/synth.mjs. (#22)
Fixed
- Resume now reruns failed agents.
spawnreplays only cachedokrecords
from the run store; cachederror/timeout/abortedrecords re-invoke the
adapter on/maestro-resume, matching the documented resume contract
(previously a failed agent's cached failure was replayed forever). - In-flight cancellation actually interrupts agents. The standalone-client
adapter racessendAndWaitagainst the caller'sAbortSignal(raceAbort),
so timeouts and user cancellation no longer wait for the model to finish.
Changed
- READMEs slimmed, docs split. The long "Features" section and the
configuration table moved todocs/GUIDE.md/docs/GUIDE.ko.md; the
CLI-vs-VS-Code install-surface details moved todocs/SURFACES.md. The
READMEs keep a compact feature summary, the commands table, and links. - Design docs consolidated under
docs/specs/. Thedocs/superpowers/
tree (specs + implementation plans) is gone; all design/plan documents now
live indocs/specs/and the staleexport-ignorerule was dropped. /maestro-stopaborts in-flight agents. Newcore/run-registry.mjs
(process-local runId →AbortController);runPhasewires the registry
signal by default andstopRunaborts it, so stopping a run started in the
same session interrupts its agents instead of only flipping the manifest./maestro workflowsrescans the workflow dirs (and/maestro run
rescans on a name miss), so workflows added after startup are picked up
without restarting the CLI.- VS Code runtime bridge deduplicated against core: uses
runWithConcurrencyandDEFAULT_CONCURRENCYfrom core instead of local
copies; the<name> [args]split is shared as
splitWorkflowInvocationincore/saved-workflows.mjs.
v0.6.0
Adds a VS Code surface alongside the CLI plugin and extracts the runtime into a
shared, zero-deps core/ package consumed by both. The CLI behaviour is
unchanged; the plugin now imports the same core the VS Code extension uses.
Added
- VS Code
/maestrochat participant with a TUI-like Run Console (webview)
and an Activity Bar Runs tree for per-agent drill-down (model, tokens, tools,
timing, prompt/output/error, retry). Ships as a separate VS Code extension
(vscode-extension/), not part of the CLI plugin archive. - Shared
core/package (@ghcp-maestro/core): the fan-out, spawn,
run-store, saved-workflows, quality, plan/approval, probes, and synth logic —
surface-neutral and unit-tested — now imported by both the CLI plugin
(extensions/ghcp-maestro/) and the VS Code extension.
Changed
- Unified synth + run commands.
core/synth.mjs(buildSynthPrompt) is the
single source for the synthesis prompt across both surfaces;showRuns/
resumeRun/stopRunmoved intocore/run-commands.mjs. The CLI reproduces
its prior synth prompt and run-listing output byte-for-byte. - Slimmed the CLI extension God-file (
extensions/ghcp-maestro/extension.mjs)
by extracting run-phase, builtin-workflows, and run-command helpers into core. - Leaner release archive:
vscode-extension/,scripts/, and design docs
underdocs/superpowers/areexport-ignored from the CLI plugin archive.
Fixed
- Run Console webview hardening: escape
U+2028/U+2029in embedded state
(JS line terminators inside<script>) and replace thescript-src 'unsafe-inline'CSP with a per-render crypto nonce. - Cancellation is honoured end-to-end: a stopped run skips the synth phase
and finishes asstoppedinstead of being overridden withcomplete/error;
aborted/stopped/cancelledagents count as terminal and get a distinct
tree icon. - Portability:
scripts/rebuild-install-stable.ps1derives the repo root
from$PSScriptRootand resolves thecodeCLI fromPATH— no hard-coded,
username-leaking absolute paths.
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.