feat(recipe): live grove recipe run launches a session (#276)#478
Open
windoliver wants to merge 23 commits into
Open
feat(recipe): live grove recipe run launches a session (#276)#478windoliver wants to merge 23 commits into
windoliver wants to merge 23 commits into
Conversation
Write a focused integration test that proves a launched session persists recipeProvenance to SQLite. Uses a _testRuntime shim (QuickIdleRuntime) to avoid spawning real agent processes; the runtime marks all sessions idle immediately so the orchestrator stops after the 30-second grace period. Also adds _testRuntime?: AgentRuntime to LaunchGoalSessionInput — a minimal test-only escape hatch that bypasses selectRuntime/isAvailable and injects a runtime directly, enabling in-process testing without real CLI agents.
…ist surface recipeDigest (#276)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements live
grove recipe run(issue #276 follow-up to the dry-run phase).grove recipe run <path> [--param k=v] [--goal "..."] [--repo <ref>](without--dry-run) now materializes a recipe into a persistent, launched session whose record carries the recipe digest for reproducibility, with declaredstdio:MCP extensions wired into every spawned agent.grove session startintosrc/cli/utils/launch-session.ts(launchGoalSession). Bothsession startandrecipe runuse it;session startbehavior (incl.--preset) is preserved byte-for-byte.instructionsbecome the goal (--goaloverrides), topology comes from the materialized contract, and the run launches via the shared launcher (src/cli/commands/recipe.ts). Dry-run output is unchanged.resolveRecipeMcpServersmapsstdio:extensions to MCP server configs (required non-stdio → error, optional → warn+skip); the orchestrator appends them after the built-ingroveserver (SessionConfig.extraMcpServers).Session/CreateSessionInputgainrecipeProvenance, persisted across SQLite (additiverecipe_provenance_jsoncolumn + v17 column-safe migration), Nexus, and InMemory stores; surfaced ingrove session status.idleGracePeriodMs; specGROVE-RECIPES.mdupdated with a Live Run section.Out of scope (record-only, per the issue): sub-recipe spawning and non-
stdioextension wiring.Design:
docs/superpowers/specs/2026-06-08-grove-recipe-run-live-design.md· Plan:docs/superpowers/plans/2026-06-08-grove-recipe-run-live.mdTest Plan
extraMcpServers, store round-trips (SQLite/Nexus/InMemory), launcher provenance, recipe-run wiring (injected fake launcher) — added across the changed filesgrove session startregression suite green (faithful extraction)tsc --noEmitclean; biome clean on changed filestests/e2e/recipe-run-tmux.ts):grove upmanaged stack + real codex↔claude review-loop → asserts run digest ==recipe validatedigest, both roles spawn, thestdio:MCP extension launches inside an agent, the Nexus session record carriesrecipeProvenance.recipeDigest, and the loop produced 3 contributions (status=completed) — PASSFollow-ups (non-blocking): hoist
resolveSessionNexusZoneId/terminalSessionStatusto a neutral util (drop the util→command import + duplication); namedLaunchGoalSessiontype; InMemory provenance round-trip test;recipe runJSON per-agentsessionIdparity withsession start.Closes #276