All notable changes to Maestro will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Antigravity runtime: Maestro ships a plugin for Google Antigravity (the
agyCLI and the Antigravity app) inantigravity/, generated fromsrc/like the other runtimes. Install it withagy plugin install https://github.com/josstei/maestro-orchestrate/tree/main/antigravity, then restartagy. The plugin carriesplugin.json,mcp_config.json,hooks.json, the 39 specialists as subagents inagents/, the 12 public entry points as/maestro:<skill>skills (withreview-code,debug-workflow, andresume-session, as in Claude Code and Codex) plus the shared methodology skills, and a bundledsrc/payload so an installed copy runs on its own. The npm package and the release archive includeantigravity/anddocs/runtime-antigravity.md. - Antigravity MCP tools and delegation: every Maestro MCP tool is listed with
_meta: {"antigravity/alwaysLoad": true}, so Antigravity registers them as native tools namedmcp_maestro_maestro_<tool>. The orchestrator delegates withinvoke_subagent, andget_runtime_contextreportsresult_surface: "notified": each subagent's final response arrives later as a message, so the delegation and execution skills end the turn instead of polling. - Antigravity hooks: a SessionStart hook adds the active session's phase and status to the main conversation and to every subagent conversation, and a PreToolUse hook applies Maestro's shell policy to
run_command(deny rules returndeny, ask rulesforce_ask, and every other commandask, which leaves the user's own permission settings in charge). Antigravity has no post-delegation hook, so the orchestrator validates each handoff report itself and asks a subagent once to resend a malformed one.
- Served skill and protocol text: the delegation, execution, session-management, design-dialogue, implementation-planning, and code-review skills, the agent-base and filesystem-safety protocols, and the orchestration references are deduplicated and no longer contradict each other (one prompt assembly order, one place to record the execution mode, and one shared agent Output Contract appended by
get_agent). Orchestration behavior is unchanged. - Qwen Code core commands: the
orchestrate,execute, andresumeTOML commands incommands/maestro/now carry a## Runtime: Qwen Codepreamble (skillto load skills, MCP tools by the names Qwen Code lists for themaestroserver,ask_user_questionfor prompts and approvals, Plan Mode treated as non-native, andexit_plan_modegiven the plan's markdown content rather than a file path) instead of the Gemini CLI one, andresume.tomlfalls back to$HOME/.qwen/extensions/maestrowhenMAESTRO_EXTENSION_PATHis unset. - Qwen Code agent stubs: the repo-root
agents/directory, which Qwen Code loads extension subagents from, now holds the Qwen agent stubs (Qwen tool names such asedit,todo_write,skill, andask_user_question) instead of the Gemini CLI stubs Qwen Code previously picked up. The separateqwen/agents/copy, which Qwen Code never loaded, is gone. - The MCP server identifies its host runtime instead of assuming one: it uses
MAESTRO_RUNTIMEwhen that is set, and otherwise the runtime whosemcpClientNamesmatch theclientInfo.namethe host sends ininitialize(claude-code,codex-mcp-client,qwen-cli-mcp-client-<server key>, orantigravity-client). When neither identifies a runtime, the server still lists its tools and fails every call withRUNTIME_UNIDENTIFIEDand the validMAESTRO_RUNTIMEvalues, where an unset variable used to fall back to Claude. The MCP entrypoint shims and the generatedqwen-extension.json,plugins/maestro/.mcp.json, andantigravity/mcp_config.jsonno longer set or defaultMAESTRO_RUNTIME. - Shell-policy parser: the command splitting and rule matching behind the Claude Code
Bashpolicy hook moved fromsrc/platforms/claude/policy-enforcer.jstocheckCommand()insrc/core/policy-rules.js, which the Antigravity enforcer shares throughsrc/platforms/shared/policy-enforcer.js. The Claude Code enforcer's decisions and output are unchanged. - Agent dispatch rule in the orchestration steps: the step 23 and step 36 hard gates now say to dispatch through
agent_dispatch.patternfromget_runtime_contextwith the agent'stool_namefromget_agent, instead of "call the agent's registered tool, never by bare name", which contradicted Antigravity'sinvoke_subagentdispatch by bareTypeName. The rule against handing a phase to the runtime's generalist agent is unchanged. get_agenttool lists drop duplicate names: when several canonical tools map to one runtime tool, the agent'stoolslist names it once (Codex listsdirect file readsandapply_patchonce; Antigravity listsview_fileonce). Claude Code and Qwen Code lists are unchanged.- Extension-cache detection covers Antigravity plugin installs:
.gemini/config/pluginsand.gemini/antigravity-cli/pluginsare now treated as host extension caches alongside.codex/pluginsand.claude/plugins, soinitialize_workspacerejects a workspace path under them andworkspace_suggestionandscan_phase_changesskip them. - Internal: simplified and deduplicated the generator, MCP server, hook, platform, release-tooling, and test code (for example, one
agent-stubtransform, agent tool tiers derived fromtools, hook adapters colocated undersrc/platforms/<runtime>/, and the hook registrations generated bysrc/platforms/metadata.js) without changing runtime behavior. - Internal: split the remaining mixed modules by scope of concern and removed the duplicated logic between them, without changing runtime behavior:
<state_dir>/plans/document handling moved out ofdesign-gate.jsintosrc/state/session-documents.js(with the tool-parameter rules for supplying a document by path or by content insrc/mcp/contracts/document-input.js), and oneresolveStateDirSetting()owns theMAESTRO_STATE_DIRprecedence; the generator andget_agentshare one agent tool resolver (src/core/agent-tools.js) and naming helper; the runtime config registry moved fromsrc/mcp/runtime/tosrc/platforms/runtime-config-map.js, so the generator no longer reaches into the MCP server; manifest rendering moved fromscripts/generate.jsintosrc/generator/manifest-expander.js, and the Qwen policy pack renderer intosrc/platforms/qwen/policy-pack.js; the shell-policy parser scans the command line and each substitution body once, and the policy enforcer reuses the bounded stdin reader;PHASE_LIMITSis the single source of thetask_complexitytiers; the detachedantigravity/src/,claude/src/andplugins/maestro/src/payloads no longer carry the generator-onlysrc/entry-points/registries and templates; and the tests share their session-file, filesystem, environment and catalog fixtures throughtests/support/and drive every MCP entrypoint through one stdio client.
- Gemini CLI runtime: Maestro no longer ships a Gemini CLI extension.
gemini-extension.json,GEMINI.md,.geminiignore, thehooks/hooks.jsonhook registration,src/platforms/gemini/, anddocs/runtime-gemini.mdare deleted. Qwen Code keeps the repo-rootagents/stubs,commands/maestro/TOML commands, andpolicies/maestro.tomlpolicy pack (all now generated for theqwenruntime) and themcp/maestro-server.jsandhooks/hook-runner.jsshims as its own. The Gemini-only agent frontmatter fieldstemperatureandtimeout_minsare dropped fromsrc/agents/*.md..gemini/extensionsis no longer treated as a host extension cache:initialize_workspaceno longer rejects a workspace path under it, andworkspace_suggestionandscan_phase_changesno longer skip it. .workspace-rootmarker:initialize_workspaceno longer writes<state_dir>/.workspace-root, a JSON file holding the absolute workspace path and a timestamp that no Maestro code ever read. It was not gitignored, so it showed up as an untracked file and, once committed, changed on every call. A marker left by an earlier version is not deleted and can be removed by hand. Becauseassess_task_complexitycounts every file under the workspace, itsfile_countafterinitialize_workspaceis one lower than before.
initialize_workspacecould overwrite a file outside the workspace: it wrote<state_dir>/.workspace-rootwith a plain write that follows symlinks, so a symlink at that path (for example one committed to a cloned repository) had its target replaced with the marker JSON, and a directory at that path made the call fail withEISDIR. The marker is no longer written (see Removed).- The session-start hook failed when it could not create a per-session hook-state directory: while a Maestro session was active in the workspace and a file was in the way or the hook-state directory was unwritable, Claude Code's session-start hook returned its error fallback (
continue: false) and Qwen Code's printed a hook error. Session-start now only prunes stale hook state; the before-agent hook creates the per-session directory when it records the active agent. workspace_suggestionfell back to the MCP server's cwd after a roots change: onnotifications/roots/list_changedthe server only cleared its cachedroots/listresult, so a client that sends the notification after answeringroots/list(Antigravity does) leftget_runtime_contextsuggesting the server's cwd, which Antigravity sets to the plugin install directory. The server now requests the roots again.scan_phase_changesmissed every file below the workspace root under Claude Code: the extension-cache check resolved each workspace-relative directory against the MCP server's cwd, which Claude Code sets to the plugin install directory (itself a cache path), so every subdirectory was skipped. The check now uses the absolute path, so only directories inside the workspace that are themselves host extension caches (.codex/plugins,.claude/plugins) are skipped.scan_phase_changesreported Maestro's own state files as phase changes whenMAESTRO_STATE_DIRis set in the environment: the scan now skips the resolved state directory (matched on real paths, so symlinked workspaces and state dirs are covered) in addition todocs/maestro.- Before-agent hook never injected session context for MCP-created sessions: it matched YAML-style
current_phase:/status:lines, butcreate_sessionwrites JSON frontmatter. The hook now parses the session file the same way MCP writes it, falling back to the YAML-style match for legacy files. - Hooks looked for session state relative to the hook's working directory: fired from a subdirectory of the workspace,
before-agentandsession-startmissed the active session, and with an absoluteMAESTRO_STATE_DIRthe before-agent hook failed and, under Claude Code, its error fallback stopped the turn on every Agent dispatch. Hooks now resolve the git toplevel the same wayinitialize_workspacedoes, and a state-dir resolution error is logged and yields no context instead of stopping the turn. maestro-install-codexprinted a stack trace on failure: it now prints a one-linecodex plugin install failed: <reason>error and still exits with code 1.package-release-artifactsdid not say which flag lacked a value: a trailing--versionor--out-dirnow fails withMissing value for <flag>.- Prepare Release wrote the
versioninput to a step output before validating it: a multi-line input reached that output unchecked. The workflow now validates the raw input againstX.Y.Zbefore exporting it, so a multi-line value is rejected. - Heredoc shell-policy rule blocked arithmetic shifts and here-strings: the deny rule matched any
<<, soecho $((1<<4)),python3 -c "print(1 << 3)"and here-strings such asgrep x <<<"$v"were blocked by the Claude Code policy hook and the Qwen Code policy pack. The rule now matches only a heredoc operator followed by a delimiter word (<<EOF,<< 'EOF',<<-EOF,<<\EOF), and its message says to use the file-writing tool instead of namingwrite_file. read-active-session.jsprinted.envparse warnings twice: whenMAESTRO_STATE_DIRwas unset, the script resolved it once itself and again inside the session-path lookup, so a malformed workspace or extension.envwarned twice. It now resolves the setting once.MAESTRO_STATE_DIRfrom the workspace.envwas honored only byinitialize_workspace: with the setting in the workspace.envand not in the environment,initialize_workspacecreated the configured state directory, but session, design-gate and reconciliation tools and the session-start and before-agent hooks still read and wrotedocs/maestro. Every caller now resolvesMAESTRO_STATE_DIRwith the same precedence (environment, workspace.env, extension.env, default).
- Maestro cheatsheet: added an English quick-reference guide covering supported runtimes, common commands, workflow concepts, and suggested reading order.
- npm package identity: renamed the planned npm package to
@josstei/maestro, addedhello@josstei.devto public author metadata, and moved the stable release publish path into GitHub Actions with npm token authentication.
- Stable npm release recovery: Release now uses
NPM_TOKENfor stable publishes, uses verified Git tag lookups, supports manual recovery from an existingvX.Y.Ztag and target SHA, and enforces a stable-onlylatestdist-tag through the idempotent npm publish helper. Prerelease publishes defer stalelatestrepair when no stable version exists instead of attempting to delete npm'slatesttag. - Codex plugin MCP server fails to start: corrected
npxargs inplugins/maestro/.mcp.json— added-p/--packageflag somaestro-mcp-serveris resolved as the binary name rather than an argument to the package's default binary. - Release metadata drift: runtime manifests, marketplace entries, detached payload versions, and Codex MCP package specs are now generated from
package.jsonso stable and prerelease packages stay self-consistent.
- 5 new MCP tools (Session pack 5 → 10; total pack count 12 → 17):
enter_design_gate,record_design_approval,get_design_gate_status— server-side design-gate lifecycle;create_sessionnow enforces approval before session creationscan_phase_changes,reconcile_phase— post-hoc phase reconciliation when an agent's actual file manifest diverges from the plan
- 17 additional specialist agents — Expanded the roster from 22 to 39 specialists:
- ML / AI:
ml-engineer,mlops-engineer,prompt-engineer - Ops / reliability:
site-reliability-engineer,observability-engineer,release-manager - Platform:
cloud-architect,platform-engineer,solutions-architect,integration-engineer - Data / mobile:
database-administrator,mobile-engineer - Mainframe / legacy:
cobol-engineer,db2-dba,zos-sysprog,hlasm-assembler-specialist,ibm-i-specialist
- ML / AI:
maestro-mcp-serverbin (bin/maestro-mcp-server.js) — Thin Node entrypoint declared inpackage.jsonbin; setsMAESTRO_RUNTIME=codexandMAESTRO_EXTENSION_PATH, then delegates tosrc/mcp/maestro-server.js. Invoked by Codex vianpx.- Root-level Codex marketplace manifest (
.agents/plugins/marketplace.json) — Makes the repo a valid marketplace target forcodex marketplace add. - Declarative
requiresWorkspacetool contract — Tool schemas carryrequiresWorkspace: truewhen they depend on an initialized workspace; the registry captures the metadata and the dispatcher enforces it before handler invocation, returning a typedWORKSPACE_NOT_INITIALIZEDerror that namesinitialize_workspacein the recovery message. - Workspace marker file module —
initialize_workspacenow writes a canonical marker andrequireExplicitWorkspaceRootrejects extension-cache paths. - Content variant for design-gate and implementation-plan submission —
record_design_approvalacceptsdesign_document_content+design_document_filename;create_sessionacceptsimplementation_plan_content+implementation_plan_filename. Bytes are materialized atomically into<state_dir>/plans/by the server. Motivation: Gemini Plan Mode resolves relative paths against~/.gemini/tmp/<uuid>/, so a path the model hands back to MCP never resolves to the same file the server sees — the content variant bypasses runtime-specific path resolution. - Shared plan-phase schema contract (
src/mcp/contracts/plan-schema.js) — Single source of truth for phase shape consumed by bothvalidate_planandcreate_session.phase.filesis recognized as the planning-time canonical file manifest and is checked byfile_overlapandagent_capability_mismatchvalidators. downstream-contextcontract module (src/mcp/contracts/downstream-context.js) — Canonical handoff shape: accepts string or array, handles'none'/'n/a'/empty-string sentinels, and embeds a human-readable shape description in theHANDOFF_INCOMPLETEerror.- Runtime
delegation.constraintsobject — Per-runtime machine-readable constraints exposed viaget_runtime_context. Codex declares deferred results and fork-incompatibility withagent_type/model/reasoning_effort; Claude, Gemini, and Qwen declare synchronous dispatch. - Blocker parser for child-agent question surfacing — Agents emit a
Blockers:section in their handoff report; the orchestrator surfaces unresolved blockers back to the user. workspace_suggestioninget_runtime_context— Server surfaces a recommended workspace path for runtimes that cannot auto-resolve one.- Per-entry
runtimeNames— Each entry-point registry entry owns its per-runtime rename declaratively; replaces the centralizedENTRY_POINT_NAME_OVERRIDESmap. - Host-reserved command protection extended to Claude — Entry-point generation now rejects names that would shadow Claude's built-in slash commands (
review,debug,resume). Previously only Codex was guarded. - Adapter factory (
src/platforms/shared/adapters/factory.js) — Captures the adapter contract (normalizeInput,formatOutput,errorFallback,readBoundedStdin,getExitCode) with shared defaults.claude,gemini, andqwenadapters now declare only their protocol-specific extractors. - Adapter naming conventions module — Shared conventions consumed by
hook-runnerfor adapter discovery; replaces open-coded filename parsing. src/lib/yaml-emit.js—emitBlockListandemitInlineQuotedListhelpers replace 4 hand-rolled YAML emission sites.src/lib/framework-detection.js—SKIP_DIRS,CONFIG_FILES,FRAMEWORK_INDICATORSextracted fromassess_task_complexityso the handler owns only logic.src/generator/manifest-curator.js—collectManifestPathsrelocated fromscripts/generate.jsshell wrapper into the generator module.session-state-core.js—withSessionState/readActiveSessiontransaction helpers; the three mutation handlers insession-state-tools.jsroute through the helper (418 → 378 lines).- Isolated integration tests — Codex workspace resolution contract,
validate_plan → create_sessionround-trip, handoff validation and reconciliation flow, design-gate Plan Mode lifecycle (late-write success path, phantom-path failure path, archival).
- Codex MCP server invocation —
plugins/maestro/.mcp.jsonnow spawns the server vianpx -y github:josstei/maestro-orchestrate maestro-mcp-server, matching the convention used by every curated Codex plugin. The previous relative-path spawn (./mcp/maestro-server.js) resolved against the user's workspace cwd rather than the plugin directory, causing MCP handshake failures in any workspace outside the repo checkout. The new invocation is location-independent. - Codex installation path — Primary install is now
codex marketplace add josstei/maestro-orchestrate(uses the new root.agents/plugins/marketplace.json).scripts/install-codex-plugin.jsremains as a legacy/offline fallback. initialize_workspacerequires explicitworkspace_path— Handler callsrequireExplicitWorkspaceRoot, writes a workspace marker, and returnsworkspace_pathin the result. Schema declaresworkspace_pathas required. Back-compat preserved via acachedProjectRootfallback for callers that pass the third MCP arg but not the explicit param.create_sessionenforces design-gate approval — Auto-populatesstate.design_documentfrom the approved gate when the param is omitted, and resolvesimplementation_planpaths through the same copy-into-plans contract. Extends the design-gate from a single-step approval signal to the owner of the full design-doc lifecycle through archival.create_sessionpreserves phase ID types —phase.idandblocked_bypreserved verbatim, so plans with string IDs round-trip consistently. Tool schemas forcompleted_phase_id,next_phase_id,next_phase_ids, and thescan_phase_changes/reconcile_phasephase_idnow accept number or string.transition_phaserejects handoffs with files but emptydownstream_context— ReturnsHANDOFF_INCOMPLETEwith the shape description embedded.archive_sessionblocks onrequires_reconciliationand removes thestate/<session_id>.design-gate.jsonsidecar on success (previously lingered; a future session reusing the same id inherited a stale "already approved" gate).validate_planenforces the shared phase schema —file-overlapandagent-capabilitycheckers inspectphase.filesin addition to runtimefiles_created/files_modifiedmanifests. Previously a plan usingphase.filesbypassed both guards, letting parallel phases declare conflicting ownership and letting read-only agents be assigned to write phases. Both error early-return paths now includeparallelization_profile: null, matching the success-path response shape.reconcile_phaserejects empty payloads — ReturnsRECONCILIATION_EMPTY_PAYLOADwhen no files and no populateddownstream_contextare supplied; overwrites file arrays only when the caller explicitly supplies them (previously silently clearedrequires_reconciliationwithout recording attribution).resolve_settingstolerates null project root — Falls back to env + extension settings when no workspace is available, matching the documented startup-phase contract. Fixes the parallel-race crash where Gemini's concurrent startup calls produced a raw Node path error.maestro-server.jsdecomposed — 398-line monolith split into three single-purpose core modules and a 115-line composer:core/line-reader.js(readline stdin → JSON dispatch),core/protocol-dispatcher.js(JSON-RPC 2.0 routing, result builders),core/project-root-cache.js(workspace env +roots/listcaching). Public exports preserved.validate-plan.jsdecomposed — 341-line handler split into four orthogonal checkers plus a 65-line orchestrator:validation/schema-checker.js,validation/agent-checker.js,validation/dag-checker.js,validation/file-overlap-checker.js. Violation ordering and error codes preserved.rebuild-frontmatter.jsrewritten as table-driven — Per-field emitter map plus per-runtime ordered field lists. Claude's block-scalar description and color emission, Gemini'stools-before-turnslayout, and the default (codex/qwen) shape are now data rather than conditionals. Generator output byte-identical.- Content provider simplified — Inlined the filesystem branch of
content/provider.js; every runtime usesprimary=filesystemso the fallback-chain was dead code. Public exports (CONTENT_SOURCES,createContentProvider,createFilesystemProvider,normalizeContentPolicy) preserved. - Entry-point expansion unified —
expandEntryPointsandexpandCoreCommandssharerunTemplateExpansionwith per-runtime config maps. - Recovery hints table-driven —
recovery-hints.jscascade replaced byRECOVERY_TABLElookup. - Manifest-expander refactored —
normalizeSrcRelPath(skills/shared flatten + snake_case agent rename) composed withbuildRuntimeOutputPath; removes three open-codedruntime.outputDir + outPathsites and the{ ...runtime, outputDir: './' }glob-fallback hack. - Skill-discovery-stub consolidated onto the canonical
parse()API —agent-stub.jskeepsextractValue/splitAtBoundarybecause those are the right primitives for its permissive unclosed-frontmatter behavior. - 13 unused feature flags pruned from each runtime-config's
featuresblock. OnlyexampleBlocks,claudeStateContract,scriptBasedStateContract, andcodexStateContractremain — the others were mutual-exclusion triples with no readers insrc/or tests. - Renamed:
geminiStateContract→scriptBasedStateContract(the flag gates the contract shared by Gemini and Qwen, which is a Gemini fork using the sameread-active-session.jsscript);createAdapter→defineAdapter(matchesdefineToolPack/defineRuntimepattern; the factory is a spec-assembler, not a registry-dispatch builder). - Payload builder separated concerns — Allowlist and adapter filtering are now distinct pipeline steps.
- Orchestration flow restructured for Gemini Plan Mode — Step 7 pre-loads architecture plus every pre-execution skill (
design-dialogue,design-document,implementation-planning,implementation-plan) in a single batch before any Plan Mode entry. Gemini Plan Mode deregisters MCP tools, so previouslyget_skill_contentcalls at steps 11/13/15 returned "tool not found" and stranded the orchestrator. Steps 11/13/15 now reference the already-loaded skills. Step 13/14 split sorecord_design_approvalis called AFTERexit_plan_mode. Step 9a HARD-GATE pins the chosensession_idacross every MCP call that acceptssession_idto prevent orphan-gate drift. - MCP client request timeout — Bumped to 5000ms.
- Documentation refreshed to canonical state — Agent count 22 → 39, MCP tools 12 → 17, transforms 10 → 6, runtimes 3 → 4 applied across every hand-maintained surface. New
docs/runtime-qwen.mdmirrors theruntime-gemini.mdstructure.src/references/architecture.mdagent roster lists all 39 agents with focus areas.docs/usage.mdreplaced the non-existentjust release <version>target withjust check-layersandjust cleanup-brancheswhich do exist. - Qwen Code runtime documentation — Added to Runtime Targets and installation sections across README and docs.
downstream_contextcontract mismatch across three layers —agent-base-protocoldocumented string examples ('or none'), session-state stored arrays,transition_phaseaccepted arrays only. Agents emitting the documented string form were rejected with a misleading "no downstream context" error. The canonical contract now normalizes both forms.- Latent error-hierarchy bug —
ValidationError,StateError,NotFoundError, andConfigErrorhard-coded their code and silently dropped caller-supplied subtype codes.HANDOFF_INCOMPLETE,DESIGN_GATE_UNAPPROVED,RECONCILIATION_PENDINGwere all collapsing to the base code. - Design-gate race under Gemini Plan Mode —
write_fileandrecord_design_approvalfire in the same turn; the approval handler's existence check raced the write. File materialization deferred fromrecord_design_approvaltocreate_sessionso the file has settled by the time the server reads it. - Design-gate
session_iddrift —create_sessionrejects withDESIGN_GATE_SESSION_MISMATCHwhen an approved orphan gate exists and the current session has no gate of its own (belt-and-suspenders with the step 9a HARD-GATE). - Skill loading inside Plan Mode — Addressed by the step 7 pre-load (see Changed).
- Dispatcher drain on close — Pending outbound client-request timeouts are now rejected when the server closes, letting Node exit promptly even with
roots/listrequests in flight. - Swallowed dispatcher errors —
protocol-dispatcherbare catch ongetProjectRoot()now logs any error whose code is notWORKSPACE_NOT_INITIALIZEDinstead of silently resolving to null. - Codex public skill naming collisions (carry-through) — Codex plugin MCP manifest no longer declares a misleading
cwdkey. - CI changelog version-header matching —
awknow uses a prefix match.
plugins/maestro/mcp/maestro-server.js— No longer referenced; Codex invokes the server vianpxrather than a local wrapper file.- Centralized
ENTRY_POINT_NAME_OVERRIDESmap — Replaced by per-entryruntimeNames. - Top-level
delegationPatternfield in runtime-configs — Duplicateddelegation.pattern; the consumer's fallback branch was dead code.get-runtime-contextsimplified toresolvedRuntimeConfig.delegation || { pattern: '', constraints: {} }. - Gemini
workspacePathenv key — Non-functional (Gemini has no CLI-injected workspace env var); replaced with explicitworkspacePath: nullto make the asymmetry withCLAUDE_PROJECT_DIR/MAESTRO_WORKSPACE_PATHvisible in the config. - Dead module exports —
ACTIVE_SESSION_REL(session-state-core),PHASE_LIMITS(schema-checker),CREATION_SIGNAL_PATTERNS(agent-checker), and theparseSessionState/serializeSessionStateback-compat re-exports fromsession-state-tools.js.
protocol-dispatchererror visibility — Unexpected workspace-resolution errors now log instead of silently coercing to null, surfacing future failure modes.yaml-emitcaller-safe-scalar contract documented — JSDoc names the precondition (no escaping in the emitter) for future callers.withSessionStatecontract documented — JSDoc names the requirement that callers return an outcome object; the|| {}coalesce is preserved to avoid crashing on a genuine read-only mutator, but the footgun is now named.- Filename validation for design-doc / plan content variants — Rejects path separators,
.,.., and null bytes.
- Local Codex plugin development iterates through GitHub.
plugins/maestro/.mcp.jsonalways pointsnpxatgithub:josstei/maestro-orchestrate, so runningcodex marketplace add /path/to/maestro-orchestratestill fetches the server from the default branch rather than the working tree. For iterating on server code, push the branch and test there, or invokebin/maestro-mcp-server.jsdirectly and point Codex at it with a hand-authored.mcp.json. qwen-extension.jsonversion drift.scripts/update-versions.jsdoes not include it inJSON_VERSION_FILES, so it drifts behind the other three manifests on each release. Bumped manually to 1.6.3 during this release; future releases must bump it manually or the script should be extended.
- Qwen Code runtime support (#26) — Fourth runtime target with hook adapter, extension manifest (
qwen-extension.json), context file (QWEN.md), 22 agent stubs, andhooks.jsonforSubagentStart/SubagentStoplifecycle events getExitCode(result)adapter contract (#42) — Each hook adapter now owns its exit code semantics; sharedexit-codes.jsconstants (EXIT_SUCCESS,EXIT_BLOCK) verified against Gemini CLI, Claude Code, and Codex CLI source- npm publishing workflows — Nightly (cron), preview (PR label), RC (release PR), and stable release pipelines with
NPM_TOKENgating - Community standards — Code of Conduct (Contributor Covenant v2.1), Contributing Guide, Security Policy, issue/PR templates
- CI/CD pipeline documentation (
docs/cicd.md) — Mermaid workflow diagrams, job breakdowns, release pipeline chain, and cross-references from existing docs lib/foundation layer — 6 shared modules (errors,io,naming,frontmatter,validation,discovery) extracted from duplicated implementations across the codebase- Exhaustive test coverage — 121 tests across 22 files wired into CI; previously only transforms and integration tests ran in CI
- Build-time auto-discovered registries —
agent-registry.json,resource-registry.json,hook-registry.jsonscanned at generate time, replacing hardcoded allowlists
- Thin multi-runtime entrypoints — Replaced generated
canonical-source.js, MCP entrypoint, hook-runner, and adapter copies with hand-authored wrappers that defaultMAESTRO_RUNTIMEper runtime and use bounded repo-first / bundled-fallback resolution for detached Claude and Codex installs - Generator architecture (
src/manifest.js,scripts/generate.js) — Simplified the manifest to 2 discovery rules, reduced the generation-time transform registry from 10 entries to 4, and added an explicit detached-payload pack step forclaude/src/andplugins/maestro/src/ - Generator decomposed — 807-line monolith split into focused modules:
file-writer,manifest-expander,stale-pruner,payload-builder,registry-scanner,entry-point-expander - Codex plugin packaging — Removed unused
plugins/maestro/agents/stubs; Codex now relies on skills, MCP tools, andget_agentfor methodology instead of plugin-level agent files - Centralized policy rules — Claude policy-enforcer imports from canonical
src/core/policy-rules.jswith bundled fallback; deduplicatedreadBoundedStdinintocore/stdin-reader.js - Lazy-loaded runtime configs — Runtime configs loaded on demand with per-runtime detached payload filtering
- Minimum Node.js version — Raised to 20 (Node 18 EOL);
enginesfield declared inpackage.json - Package renamed — From
@maestro-orchestrator/gemini-extensionto@maestro-orchestrator/maestro - Runtime documentation — Updated Gemini, Claude, and Codex runtime docs to describe thin entrypoints plus detached payloads rather than generated helper copies
- Documentation aligned — All docs updated to match post-consolidation codebase state
- Codex public skill naming collisions — Renamed the public Codex skills to
$maestro:review-code,$maestro:debug-workflow, and$maestro:resume-sessionso installing Maestro does not shadow or break Codex's built-in/review,/debug, and/resumecommands - LLM string-to-integer coercion — Phase IDs sent as strings by LLMs in
transition_phasenow parsed correctly before phase lookups
- Self-contained Claude runtime payload (
src/manifest.js) — Added'claude'to the self-contained runtime payload manifest rule (already used by Codex) so the fullsrc/tree is bundled intoclaude/src/; canonical-source resolution now succeeds from plugin caches outside the repo tree withIsolatedClaudePlugintest helper (tests/integration/helpers.js) — Copies the generatedclaude/directory into an isolated temp directory for testing plugin behavior outside the repo tree; mirrors the existingwithIsolatedCodexPluginhelper- Isolated Claude bundle integration tests — Hook entrypoint boot test, MCP server startup test, MCP tool listing and content serving tests, all running against an isolated plugin bundle
- Claude plugin canonical-source resolution from plugin cache —
requireFromCanonicalSrc(__dirname)in hook scripts (session-start.js,before-agent.js,session-end.js) and MCP entry-point walked up from~/.claude/plugins/cache/looking forsrc/mcp/maestro-server.jsbut never found it because the Claude runtime did not bundlesrc/; resolved by the self-contained payload rule above
- Codex runtime target (
plugins/maestro/) — Complete third runtime for OpenAI Codex with plugin manifest, 22 agent stubs, 19 skills, MCP entry-point, and runtime guide; agents use kebab-case names andspawn_agent(...)delegation - Canonical source architecture — Single
src/tree serves all three runtimes (Gemini, Claude, Codex) viarequireFromCanonicalSrc()dynamic resolution, eliminating verbatim lib copies and runtime-specific source directories get_agentMCP tool — Returns agent methodology content by name, enabling runtime access to agent definitions without filesystem readsget_runtime_contextMCP tool — Returns runtime-specific configuration (delegation patterns, tool mappings, environment variables) for the active platform- Entry-point generation system (
src/entry-points/) — Registry of 9 entry-point commands with 3 per-runtime templates (Gemini TOML, Claude SKILL.md, Codex SKILL.md); entry-point commands are now generated rather than hand-maintained - 4 new transforms —
agent-stub(generates lightweight stubs that load methodology via MCP),inline-runtime(injects runtime-specific content blocks),skill-discovery-stub(generates skill stubs that load content via MCP),copy(verbatim file copy) canonical-source.jsutility (src/core/) —requireFromCanonicalSrc()resolves the canonicalsrc/directory from any runtime entry-point by walking parent directories; deployed as thin shims in each runtime'smcp/andscripts/directoriesproject-root-resolver.jsrewrite (src/core/) — Multi-strategy workspace resolution supporting all three runtimes: env vars (MAESTRO_WORKSPACE_PATH,CLAUDE_PROJECT_DIR), git root detection, and cwd fallback- Justfile — Development commands:
just test,just check,just test-transforms,just test-integration; replaces ad-hoc npm scripts - Documentation suite (
docs/) — 7 focused docs replacing old plans/specs:overview.md,architecture.md,flow.md,usage.md,runtime-gemini.md,runtime-claude.md,runtime-codex.md - 27 new test files — MCP handler tests (content provider, runtime context, kernel, session pack, workspace pack, content pack, pack composition), transform tests (copy, index, project-root-resolver), integration tests (entry-point templates, hook entry-points, glob manifest, source of truth, MCP server bundle behavior, MCP server entry-point, MCP stdio client helper)
- CI release workflow (
.github/workflows/release.yml) — Automated GitHub releases from version tags usingCHANGELOG.mdcontent
- MCP server decomposed — Monolithic ~38k-line bundles (
mcp/maestro-server.js,claude/mcp/maestro-server.js) replaced by ~14-line entry-points delegating to modularsrc/mcp/tree: 8 handlers, 3 tool-packs (workspace, session, content), core modules (server creation, tool registry, recovery hints), and utilities (extension root resolution) - Generator rewrite (
scripts/generate.js) — Updated to support manifest expansion with glob patterns, transform pipeline across three runtimes, entry-point rendering from templates, platform file mapping, and stale file pruning src/manifest.jsexpanded — Glob patterns, per-runtime platform file mappings, entry-point generation rules, and self-contained Codexsrc/payload rules- Codex skill names — Dropped
maestro-prefix from all skill names; skills use plugin namespace directly ($maestro:orchestrateinstead of$maestro:maestro-orchestrate) - Shared skills restructured — All 7 methodology skills (delegation, design-dialogue, execution, implementation-planning, session-management, code-review, validation) updated to load protocols and references via
get_skill_contentMCP tool instead of filesystem reads - Agent methodologies — All 22 agents updated with explicit tool access declarations in frontmatter; Claude and Codex runtimes serve methodology content via MCP at runtime rather than inlining full definitions
- Hook entry-points — All 10 hook scripts (5 Gemini, 5 Claude) now use
requireFromCanonicalSrc()to resolve logic modules from canonical source instead of runtime-locallib/copies - CI generator check (
.github/workflows/generator-check.yml) — Updated for three-runtime architecture with Codex output verification - Shared skill content — Delegation protocols, design-dialogue, execution, implementation-planning, and session-management skills updated with runtime-agnostic path references and MCP-first content loading patterns
GEMINI.md— Updated pointers to canonical source locations- 62 documentation audit findings resolved — Cross-referenced all docs against codebase; corrected stale paths, outdated counts, missing entries, and inaccurate descriptions across 12 files
lib/directory (root) —lib/core/,lib/hooks/modules relocated tosrc/core/,src/hooks/logic/; root-levellib/eliminatedsrc/lib/directory — All 14 modules (config/,core/,hooks/,mcp/,state/) relocated to canonicalsrc/locations; entire directory removedclaude/lib/directory — Runtime-specificcore/andhooks/copies removed; Claude runtime delegates to canonical source viarequireFromCanonicalSrc()src/runtime-only/directory — 9 Claude skill stubs and 9 Gemini command stubs replaced by entry-point generation system- Monolithic MCP bundles —
mcp/maestro-server.jsandclaude/mcp/maestro-server.jsreduced from ~38k lines each to ~14-line entry-points; bundled source replaced by modularsrc/mcp/tree - Library drift detection (
scripts/check-claude-lib-drift.sh) — Superseded by the runtime generator; canonical source architecture makes drift impossible - Root-level utility scripts —
scripts/ensure-workspace.js,scripts/read-active-session.js,scripts/read-setting.js,scripts/read-state.jsrelocated tosrc/scripts/ references/directory (root) —architecture.mdandorchestration-steps.mdmoved tosrc/references/templates/directory (root) —design-document.md,implementation-plan.md,session-state.mdmoved tosrc/templates/claude/scripts/write-state.js— Consolidated intosrc/scripts/write-state.jsclaude/skills/delegation/protocols/— Protocol files removed from runtime output; loaded via MCPget_skill_contentfrom canonical source- Old planning docs —
docs/plans/2026-04-04-runtime-generator.mdanddocs/specs/2026-04-04-runtime-generator-design.mdreplaced by focused documentation suite
get_skill_contentMCP tool — Reads delegation protocols, templates, and reference documents by identifier via MCP, bypassing workspace sandbox restrictions. Used by the orchestrate command to load non-skill resources (methodology skills are loaded viaactivate_skill).references/orchestration-steps.md— Shared numbered-step sequence (40 steps with inline HARD-GATEs) loaded by both Gemini CLI and Claude Code orchestrate commands as the sole procedural authority.AGENT_CAPABILITIEStier map inlib/core/agent-registry.js— Classifies all 22 agents intoread_only,read_shell,read_write, orfullcapability tiers. ExportsgetAgentCapability()andcanCreateFiles().agent_capability_mismatchvalidation rule invalidate_plan— Server-side enforcement that read-only agents cannot be assigned to file-creating phases. Emits error violations for explicit file lists, warnings for creation-signal phase names.- Claude Code plugin — Full dual-runtime support. Same 22 agents, 7 methodology skills (plus 12 command entry-point wrappers), 12 commands, lifecycle hooks, and MCP state management now available on Claude Code via the
claude/subdirectory - Claude Code MCP auto-registration (
claude/.mcp.json) — MCP server discovered automatically when the plugin is loaded - MCP tool name mapping — Orchestrator commands include mapping tables translating bare tool names (e.g.,
initialize_workspace) to Claude Code's prefixed names (mcp__plugin_maestro_maestro__initialize_workspace) - Agent name mapping — Orchestrator commands include mapping for Claude Code's
maestro:agent prefix (e.g.,maestro:coder,maestro:code-reviewer) - Claude Code hook adapter (
claude/scripts/hook-adapter.js) — Normalizes Claude Code's PreToolUse/SessionStart/SessionEnd hook contract to Maestro's internal format - Policy enforcer (
claude/scripts/policy-enforcer.js) — Blocks destructive shell commands via Claude Code's PreToolUse hook on Bash tool calls
- Orchestrate command restructured to numbered-step backbone —
commands/maestro/orchestrate.tomlis now a thin runtime preamble (~28 lines) that loadsorchestration-steps.md. The previous 347-line inlined protocol with prose instruction sections has been replaced. Same change applied toclaude/commands/orchestrate.md(~773 lines → ~214 lines). - Design-dialogue protocol moved from inlined in orchestrate command to on-demand loading via
activate_skill(Gemini) orReadtool (Claude). - Template and reference loading deferred to consumption points —
design-document,implementation-plan, andsession-statetemplates are no longer loaded at classification time; each is loaded at the step where it's consumed (steps 13, 15, 20). GEMINI.mdinline workflow content removed — Express Workflow, Standard Workflow Phase 1-4, Task Complexity Classification, and Workflow Mode Selection sections replaced by pointer toorchestration-steps.md.- Express Flow state persistence — Added step 5 (
transition_phase) between coder delegation and code review to persist file manifests and downstream context before the review runs. Previously, state was only updated after the review. - Express Flow delegation enforcement — Added HARD-GATE blocks preventing the orchestrator from editing code directly after code review findings. Fixes must be re-delegated to the implementing agent.
- Express Flow brief presentation — Split into two explicit sub-steps (2a: output brief as text, 2b: short approval prompt) with HARD-GATE preventing brief content from being stuffed into AskUserQuestion/ask_user
create_sessionfield name — Express Flow instructions now explicitly requireagent(singular string) in phase objects, notagents(plural array which was silently ignored by the MCP server)- Delegation headers — Added
Batch: singleto Express Flow delegation headers to match the delegation skill's required header set - Environment variable fallbacks —
lib/config/setting-resolver.jschecksCLAUDE_PLUGIN_ROOTas fallback forMAESTRO_EXTENSION_PATH;lib/core/project-root-resolver.jschecksCLAUDE_PROJECT_DIRas fallback forMAESTRO_WORKSPACE_PATH. Harmless no-op under Gemini CLI.
validateContainment()insession-state.js— Absolutestate_dirpaths must resolve within the project root; rejects paths outside the cwd boundary. Applied to bothresolveStateDirPathandensureWorkspace.ensureBaseDir()inhook-state.js— Validates hook state base directory is not a symlink before creating session subdirectories. Temp directory naming changed from predictable/tmp/maestro-hooksto per-usermaestro-hooks-${uid}.- Policy enforcer full-command parsing —
splitCommands()andextractSubshells()inpolicy-enforcer.jsdecompose commands on;,&&,||,|, and$()boundaries before checking deny rules against each segment. Prefix matching trims leading whitespace. Error handler changed from fail-open to fail-closed. - MCP error message path stripping — Error handler in both MCP bundles replaces absolute filesystem paths with
[path]before returning to the client.get-skill-content.jsreturnserr.codeinstead oferr.message. readBoundedStdin()in hook adapters — 1MBMAX_STDIN_BYTESlimit applied to all hook entry scripts (7 scripts across both runtimes),stdin-reader.js, andpolicy-enforcer.js.ensureWorkspacecreate-then-verify ordering — Directory is created first, then verified vialstatSyncthat it is not a symlink, replacing the previous check-then-create ordering.- Explicit file permissions in
atomicWriteSync— Directories created with mode0o700, files with mode0o600. Same modes applied inensureWorkspaceandensureSessionDir. - Session state
.gitignore—docs/maestro/state/added to project.gitignore.ensureWorkspaceauto-creates a.gitignoreinside the state directory excludingactive-session.mdandarchive/.
- Skill files now accessible in all modes (normal, Plan Mode, auto-edit) via
get_skill_contentMCP tool — replaces brokenread_file→run_shell_command catfallback chain that failed due to workspace sandbox + Plan Mode policy restrictions. - Agent dispatch enforcement — Delegation rules now require calling agents by registered tool name, preventing fallback to the built-in
generalisttool which ignores agent frontmatter (methodology, temperature, tool restrictions, turn limits). - Express workflow
transition_phaseenforcement — HARD-GATE ensures session state records all delivered files after agent execution.
- 10 new specialist agents —
seo_specialist,copywriter,content_strategist,ux_designer,accessibility_specialist,product_manager,analytics_engineer,i18n_specialist,design_system_engineer,compliance_reviewer; roster expanded from 12 to 22 - MCP server (
mcp/maestro-server.js) — Bundled Model Context Protocol server registered viamcpServersingemini-extension.jsonwith 9 tools at launch:initialize_workspace,assess_task_complexity,validate_plan,create_session,get_session_status,update_session,transition_phase,archive_session,resolve_settings(10th toolget_skill_contentadded in v1.5.0) - Express workflow — Streamlined inline flow for
simpletasks: 1-2 clarifying questions, combined design+plan structured brief, single-agent delegation, code review, and archival without skill activations or execution-mode gating - Task complexity classification — Three-tier system (
simple,medium,complex) gating workflow mode selection (Express vs Standard), design depth defaults, domain analysis breadth, question coverage, and phase count limits - 8-domain analysis — Pre-planning domain sweep across Engineering, Product, Design, Content, SEO, Compliance, Internationalization, and Analytics; scaled by task complexity to identify specialist involvement
- Design depth gate — Three-tier depth selector (
Quick,Standard,Deep) in design-dialogue controlling reasoning richness: assumption surfacing, decision matrices, rationale annotations, and requirement traceability; orthogonal to task complexity - 3 standalone commands —
/maestro:a11y-audit(WCAG compliance),/maestro:compliance-check(GDPR/CCPA/regulatory),/maestro:seo-audit(technical SEO assessment) - Policy engine rules (
policies/maestro.toml) — Extension-tier deny/ask guardrails: blocksrm -rf,git reset --hard,git clean, and heredoc shell writes; prompts onteeand shell redirection operators - Hook adapter layer (
hooks/hook-adapter.js) — Normalizes Gemini stdin JSON to internal context contract and formats responses for stdout, decoupling hook I/O from business logic - Runtime-agnostic hook logic — Extracted core hook behavior into
lib/hooks/modules (before-agent-logic.js,after-agent-logic.js,session-start-logic.js,session-end-logic.js) separate from I/O handling scripts/read-setting.js— CLI utility to resolve a single Maestro setting using script-accurate precedence- Architecture reference (
references/architecture.md) — Compact reference for agent roster, state contract, session lifecycle, execution modes, and delegation contract; read by commands at startup ARCHITECTURE.mdandOVERVIEW.md— Top-level project documentation for architecture deep-dive and quick-start overview- Context budget guidance — GEMINI.md section on minimizing skill activations, leveraging delegation for context relief, and preferring compact MCP responses over full state reads
codebase_investigatorintegration — Design-dialogue and implementation-planning skills call the built-in investigator for repo grounding before proposing approaches or decomposing phases- Design document enrichments — Decision matrix template (Standard/Deep), rationale annotations, per-decision alternatives (Deep), requirement traceability tags (Deep),
design_depthandtask_complexityfrontmatter fields, numbered requirement IDs (REQ-N) - Session state fields —
workflow_mode,execution_backend,current_batch, andtask_complexityadded to session state template
src/lib/flattened tolib/— All shared modules relocated fromsrc/lib/tolib/; scripts, hooks, and internal imports updated to new paths- Default state directory —
MAESTRO_STATE_DIRdefault changed from.geminitodocs/maestro; updated ingemini-extension.json, GEMINI.md, session-state module, and all command/skill references - Hook architecture — Hooks (
before-agent.js,after-agent.js,session-start.js,session-end.js) refactored fromdefineHook/hook-facadepattern to direct stdin/stdout withhook-adapter.jsnormalization and separated logic modules - Agent registry —
KNOWN_AGENTSarray updated from 12 to 22 entries;detectAgentFromPromptnow checks agent header (agent: <name>) before env var and prompt pattern matching - Orchestrate command — Expanded from 14-line protocol summary to full orchestrator template with hard gates, first-turn contract, required question order, design/plan approval gates, execution mode gate, delegation requirements, Express workflow routing, and recovery rules
- Execute command — Added inline Maestro Execute section with workspace initialization, execution-mode gate resolution, and parallel/sequential dispatch constraints
- Resume command — Added Express resume detection (
workflow_mode: "express"), anti-delegation guards for token/status queries, and inline Maestro Resume section with constraint rules - Archive command — Rewritten to use
get_session_statusandarchive_sessionMCP tools instead of direct file manipulation - Status and resume commands — Added anti-delegation guards preventing token/accounting questions from being routed to
cli_helpor research agents - All standalone audit commands (
debug,perf-check,security-audit,review) — Added delegation skill activation for protocol injection - Delegation skill — Protocol injection paths updated to
${extensionPath}/skills/delegation/protocols/; added missing context fallback and downstream consumer declaration patterns - Design-dialogue skill — Added Standard-workflow-only gate, Express bypass, repository grounding protocol with
codebase_investigator, depth gate with first-turn contract, and complexity-aware section/question scaling - Implementation-planning skill — Added Standard-workflow-only gate, codebase grounding protocol,
task_complexitypropagation from design document to plan frontmatter - Session-management skill — Added MCP-first state access protocol (preferred > fallback > legacy), Express workflow session creation, and
workflow_modeawareness - Execution skill — Added Standard-workflow-only scope note and Express bypass
- GEMINI.md orchestrator context — Expanded with workflow routing, complexity classification, Express workflow definition, domain analysis matrix, context budget section, MCP tool preference for state operations,
codebase_investigatorguidance, and 22-agent roster - Package identity — Renamed from
gemini-maestroto@maestro-orchestrator/gemini-extension; addedfilesmanifest for publishable assets - License — Changed from MIT to Apache-2.0
env-file-parser— Added multi-line quoted value support for values spanning multiple lines within double quotessession-statemodule — AddedresolveStateDirPathhelper;ensureWorkspaceaccepts absolutestateDirpaths; removedparallelsubdirectory from workspace scaffoldatomic-write— Added monotonic counter to temp file names to prevent PID-only collisionsproject-root-resolver— AddedMAESTRO_WORKSPACE_PATHenv var check before git fallbackhook-state— AddedMAESTRO_HOOKS_DIRenv var override for hook state base directorysetting-resolver— Removedos.homedir()fallback for extension path; requiresMAESTRO_EXTENSION_PATHenv var when resolving extension.envrefactoragent — Addedrun_shell_commandto tool set- Implementation plan template — Updated parallel dispatch note from
--approval-mode=yoloreference to native subagent framing; addedtask_complexityfrontmatter USAGE.mdandREADME.md— Rewrites reflecting 22-agent roster, Express workflow, MCP tools, policy engine, and updated configuration
src/lib/directory — All modules relocated tolib/; removedsrc/lib/config/dispatch-config-resolver.js,src/lib/core/integer-parser.js,src/lib/dispatch/concurrency-limiter.js,src/lib/dispatch/process-runner.js,src/lib/hooks/hook-facade.js,src/lib/hooks/hook-response.jsscripts/parallel-dispatch.js— Script-based parallel dispatch replaced by native subagent calls in v1.3.0; module fully removedscripts/sync-version.js— Version sync script betweenpackage.jsonandgemini-extension.json; replaced byfilesmanifest inpackage.json- Entire test suite — Removed
tests/directory: 19 unit tests, 8 integration tests, test runner (run-all.js), and helpers; tests were coupled to removedsrc/lib/modules and dispatch infrastructure - CI workflow — Removed
.github/workflows/ci.yml(cross-platform test matrix onubuntu-latestandwindows-latest) - Architecture docs directory — Removed
docs/architecture/(5 files:agent-system.md,comprehensive-map.md,skills-and-commands.md,state-management-and-scripts.md,system-overview.md); replaced byARCHITECTURE.md,OVERVIEW.md, andreferences/architecture.md
- Plan-based execution mode recommendation — When
MAESTRO_EXECUTION_MODE=ask(default), the orchestrator analyzes the implementation plan's dependency graph and presents a data-driven parallel vs sequential recommendation viaask_user - Execution mode gate enforcement —
<HARD-GATE>language in the execution skill ensures the mode prompt cannot be skipped; safety fallback stops delegation ifexecution_modeis missing from session state - Mandatory gate references across all entry points —
orchestrate,execute, andresumecommand prompts all enforce the execution mode gate before any delegation proceeds
- Native-only parallel execution — Replaced script-based parallel dispatch (
parallel-dispatch.js,process-runner.js,concurrency-limiter.js) with Gemini CLI's native subagent scheduler; parallel batches are now contiguous agent tool calls in a single turn - Simplified extension settings — Removed script-dispatch-only settings (
MAESTRO_DEFAULT_MODEL,MAESTRO_WRITER_MODEL,MAESTRO_DEFAULT_TEMPERATURE,MAESTRO_MAX_TURNS,MAESTRO_AGENT_TIMEOUT,MAESTRO_STAGGER_DELAY,MAESTRO_GEMINI_EXTRA_ARGS); native tuning uses agent frontmatter and Gemini CLIagents.overrides MAESTRO_MAX_CONCURRENTredefined — Now controls native parallel batch chunk size (how many subagent calls per turn) instead of subprocess concurrency limit- Execution skill rewrite — Structured 5-step mode gate protocol with plan analysis,
ask_usercall format, and recommendation logic covering all parallelization percentages - GEMINI.md orchestrator context — Updated Phase 3 description and Execution Mode Protocol section to reference the execution skill as the authoritative gate source
- Script-based dispatch backend — Removed
scripts/parallel-dispatch.js,src/lib/dispatch/process-runner.js,src/lib/dispatch/concurrency-limiter.js,src/lib/config/dispatch-config-resolver.js, and all associated tests - Dispatch-only extension settings — Removed 7 settings from
gemini-extension.jsonthat only applied to the script dispatch backend
- Expanded test coverage — Added 91 unit tests and migrated integration tests to Node.js to validate hooks, dispatch, state handling, config resolution, and timeout behavior
- Cross-platform PR CI matrix — Added GitHub Actions workflow (
.github/workflows/ci.yml) runningnode tests/run-all.json bothubuntu-latestandwindows-latest
- Cross-platform runtime migration — Replaced bash/Python hook and script execution paths with Node.js entry points for Windows PowerShell compatibility
- Layered module architecture — Reorganized shared runtime into focused modules under
src/lib/core,src/lib/config,src/lib/hooks,src/lib/state, andsrc/lib/dispatch - Hook lifecycle and context output — Registered SessionStart/SessionEnd hooks and standardized hook response context metadata (
hookEventName+additionalContext) via shared hook helpers - Dispatch and settings behavior — Moved operational logs to stderr, standardized env resolution/parsing, strengthened integer/path validation, and enforced canonical snake_case agent naming with hyphen alias normalization
- Windows shell behavior — Made shell mode opt-in to avoid
cmd.exeargument mangling in Windows terminal flows - Documentation alignment — Updated project documentation to align with current codebase behavior, naming conventions, and workflows
- Windows stability fixes — Resolved Windows-specific dispatch/session regressions and aligned integration harness behavior with
windows-latestrunner semantics - AfterAgent stale-state handling — Cleared active-agent state on deny responses to prevent sticky handoff validation across unrelated turns
- Process safety hardening — Added PID guards, timeout validation, descriptor cleanup safeguards, and safer stale hook-state handling
- Legacy shell runtime paths — Removed
.shhooks/scripts and bash/Python runtime dependencies in favor of Node.js equivalents
- Hooks-based lifecycle middleware — BeforeAgent and AfterAgent hooks with shared shell library (
hooks/lib/common.sh),safe_mainwrapper for guaranteed JSON output, and advisory error handling - Agent tracking — BeforeAgent/AfterAgent hooks track active agent identity via
/tmp/maestro-hooks/<session-id>/active-agent; lazy state creation on first write, stale-pruned during BeforeAgent - Handoff report validation — AfterAgent hook validates delegated agent output includes
Task ReportandDownstream Context; skips TechLead and non-delegation turns; requests one retry on malformed output - Active session gating —
has_active_maestro_sessionhelper allows hooks to skip initialization when no Maestro session exists in the workspace - Final code review quality gate — Phase 4 completion requires a
code_reviewerpass on non-documentation file changes before archival; blocks on unresolved Critical/Major findings with remediation loop - 14 extension settings — All
MAESTRO_*env vars declared ingemini-extension.json:DEFAULT_MODEL,WRITER_MODEL,DEFAULT_TEMPERATURE,MAX_TURNS,AGENT_TIMEOUT,DISABLED_AGENTS,MAX_RETRIES,AUTO_ARCHIVE,VALIDATION_STRICTNESS,STATE_DIR,MAX_CONCURRENT,STAGGER_DELAY,GEMINI_EXTRA_ARGS,EXECUTION_MODE MAESTRO_WRITER_MODEL(restored) — Per-agent model override for technical_writer in parallel dispatchMAESTRO_GEMINI_EXTRA_ARGS— Space-separated Gemini CLI flags forwarded to each parallel dispatch processMAESTRO_STATE_DIR(restored) — Configurable state directory withextensionPathresolution and env/workspace/extension/default precedenceread-active-session.sh— Script to resolve the active session file path respectingMAESTRO_STATE_DIR- macOS timeout fallback — Cancel-file-based watchdog with SIGTERM/SIGKILL for systems without GNU
timeout - Shell helper library (
hooks/lib/common.sh) —read_stdin,json_get,json_get_bool,respond_allow,respond_block,log_hook,validate_session_id,resolve_active_session_path,has_active_maestro_session,prune_stale_hook_state - Built-in tools expanded —
read_many_files,write_todos,ask_user, and web tools added across agents activate_skillguidance — Agents and skills document how to activate skills with user consent behaviorenter_plan_mode/exit_plan_modefor read-only Phase 1-2 with fallback when Plan Mode unavailablesave_memoryfor cross-session knowledge persistence at Phase 4{{args}}parameter forwarding in status and resume commands- Integration test suite —
tests/run-all.shcovering all hooks, parallel dispatch (args forwarding, config fallback, exit-code propagation), and active-session resolution (8 test files) CLAUDE.md— Project-level contributor instructions
- Lazy hook lifecycle — SessionStart and SessionEnd removed from
hooks.jsonregistration; hook state created lazily by BeforeAgent and stale-pruned inline (2-hour threshold) - All 12 agents:
modelfield omitted (inherits main session model), canonicalgrep_searchtool name, unified Handoff Report output contract parallel-dispatch.sh: setsMAESTRO_CURRENT_AGENTper spawned process, forwardsMAESTRO_GEMINI_EXTRA_ARGS, warns on deprecated--allowed-toolsflag- Commands moved from
commands/maestro.*.tomltocommands/maestro/*.toml(directory-based namespace) - Protocols moved from
protocols/toskills/delegation/protocols/(co-located with delegation skill) delegationskill: prompt-based enforcement documented as defense-in-depth (native frontmatter is primary gate)code-reviewskill: updated for orchestration quality gates (post-phase checks and final completion gate); includes current file contents when diff unavailableexecutionskill: documents hook lifecycle, adds final code review gate section, includes review status in completion summarysession-managementskill: documents lazy hook state lifecycle with BeforeAgent creation and stale pruningdesign-dialogueskill: adds Plan Mode handlingsession-start.sh: checks for active Maestro session before initializing statesession-end.sh: simplified to minimal cleanup without logging- Architecture docs rewritten for accuracy against Gemini CLI specification
- Deprecated
--yoloand-pflags replaced with--approval-mode=yoloand positional args in dispatch - Session state template: added
taskfield, reconciledexecution_mode
- Hook advisory behavior:
safe_mainwrapper guarantees JSON output on all code paths; errors emit{}instead of crashing - Hook matchers removed (were too restrictive for SessionStart/SessionEnd)
- AfterAgent validates on retry without re-issuing denial
ask_userparameter schema corrected in design-dialogue skill- Plan Mode write paths corrected (
exit_plan_modepath) - Delegation paths corrected in skills to use
activate_skillresources - State template synced with runtime expectations
read_fileignore enforcement and state access asymmetry clarified in skills- Agent roster corrections:
run_shell_commandremoved from refactor,get_internal_docsremoved from devops_engineer and technical_writer - macOS timeout support in parallel dispatch
before-tool.sh,before-tool-selection.sh,after-tool.shhooks — native frontmattertools:handles tool enforcementBeforeModelhook — Gemini CLI discards model field from hook outputpermissions.jsonandgenerate-permissions.sh— redundant with native frontmatter enforcementvalidate-agent-permissions.sh— validated against the removed permissions manifestdisplay_namefield from all agent frontmatter (undocumented by Gemini CLI)excludeToolspatterns — non-functional; use Policy Engine insteadhookEventNamefrom hook output (not consumed by Gemini CLI)
- Removed extension settings prompts from install — Gemini CLI doesn't support default values, so users were forced through 13 prompts on install. All settings now use orchestrator defaults and are configurable via environment variables.
- README configuration section renamed from "Extension Settings" to "Environment Variables" with all 13 parameters documented
- Extension settings with 13 configurable parameters via environment variables
- Maestro branded dark theme with warm gold accents
- Shell-based parallel dispatch for concurrent subagent execution (
scripts/parallel-dispatch.sh) - Agent base protocol with pre-flight procedures and structured output formatting
- Settings references in delegation, execution, session-management, and validation skills
- TechLead orchestrator startup checks with settings resolution
- Filesystem safety protocol for delegated agents (
protocols/filesystem-safety-protocol.md) - Workspace bootstrap script for directory safety (
scripts/ensure-workspace.sh) - State file I/O scripts for atomic reads and writes (
scripts/read-state.sh,scripts/write-state.sh) - Agent name validation against
agents/directory in parallel dispatch (scripts/validate-agent-permissions.sh) - Concurrency cap (
max_concurrent) and stagger delay (stagger_delay_seconds) settings for parallel dispatch - Execution mode selection (
execution_mode) in extension settings and session state template - Workspace readiness startup check in orchestrator
- File-writing enforcement rules across agent base protocol, delegation prompts, and filesystem safety protocol
- Project root auto-injection into all parallel dispatch prompts
- Execution mode gate and state file access protocol in execution skill
- Execution profile requirement in implementation planning skill
- Hardened
parallel-dispatch.shagainst shell injection and edge cases - Hardened scripts and commands against injection and path traversal attacks
- Stagger delay default changed from 0 to 5 seconds
- File writing rules enforced via
write_filetool-only policy across all delegation prompts
- Execution mode upgraded from sequential-only to PARALLEL (shell-based) as default strategy
- Delegation skill updated with agent name rules and absolute path safety net
- Filesystem safety protocol injected into all delegation prompts
- Session-management
mkdirsteps annotated as defense-in-depth fallbacks
- TechLead orchestrator with 12 specialized subagents
- Guided design dialogue with structured requirements gathering
- Automated implementation planning with phase dependencies and parallelization
- Parallel execution of independent phases via subagent invocation
- Session persistence with YAML+Markdown state tracking
- Least-privilege security model per agent
- Standalone commands:
maestro.orchestrate,maestro.resume,maestro.execute - Standalone commands:
maestro.review,maestro.debug,maestro.security-audit,maestro.perf-check - Session management:
maestro.status,maestro.archive - Design document, implementation plan, and session state templates
- Skill modules: code-review, delegation, design-dialogue, execution, implementation-planning, session-management, validation