Skip to content

chore: version packages#285

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main
Open

chore: version packages#285
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@gemstack/framework@0.9.0

Minor Changes

  • 0faa297: Add the "Add project(s)" install flow to the dashboard. A POST /api/projects (guarded like the other state-changing routes) installs The Framework into a repo, or every git repo directly under a folder, then registers each so it shows up in the Projects list; the daemon wires it to install-core. The Projects sidebar gains an "Add" control with a small path form (single repo or "folder of repos"), shown only when the server enables adding. Also fixes enumerateGitRepos to detect repo roots via git rev-parse --show-prefix instead of comparing --show-toplevel to the path, which failed across a symlink (e.g. macOS /var -> /private/var) and returned no repos.

  • 418a85b: Add bootstrap mode (--bootstrap, and StartRunOptions.bootstrap for the dashboard): starting a brand-new project from an empty directory. It prepends a forceful preamble above the built-in System prompt #326 prompt so the first turn stops for a plan (ranked interpretations or a PLAN file) instead of charging ahead and scaffolding code. The System prompt #326 template is left byte-identical; the preamble only raises its "Unclear scope" / "Large scope" rules above Claude Code's default decisiveness, which otherwise overrides them on the append path ([The Framework] Bootstrap mode #297, [The Framework] Bootstrap system prompt (interpretations / PLAN / await) #448).

  • 016fb8d: Bare framework now tells you whether the CLI is up to date (CLI #312): after the version footer it checks npm's dist-tags.latest (2.5s cap) and prints "Up to date" or "Update available: vX (you have vY). Run: npm i -g @gemstack/framework". Offline or on any fetch failure it prints nothing. Display only; no auto-update.

  • 87d67c8: Turn-boundary gate for plan approval (showMarkdown() + AWAIT): a build turn that ends with an await-confirmation block (the System prompt #326 large-scope PLAN flow) now pauses the run with a green Approve and a red Decline button on the dashboard. Approve resumes the build; Decline logs "Plan declined, awaiting user instructions." and stops the run cleanly (like the budget cap), so nothing reviews or improves work the user just declined. Headless runs auto-approve, keeping programmatic runs deterministic. Try it offline with FRAMEWORK_FAKE_AWAIT=confirmation.

  • f61a367: Add the context selector and trust-on-add to the dashboard ([The Framework] dashboard: context selector + trust-on-add #439, part of UI #314). The Start form gains a "Context" picker — tick the registered repos to focus the agent on, and each becomes one Context: <dirs> line in the run's system prompt (the agent can still reach every repo; this just narrows where it looks). Threaded through as a repeatable --context <dir> CLI flag and StartRunOptions.context. Adding a project now asks "do you trust this repository?" first, warning about prompt-injection risk before the agent is given read access.

    Also hardens the daemon's Telefunc mount: a bare GET /_telefunc (which a browser tab issues on reconnect) made telefunc throw an unhandled rejection that crashed the daemon; the mount now catches it and returns 400.

  • 7ca71be: Bare framework now runs the dashboard server in the foreground (--daemon #456): Ctrl+C stops it, and the server's logs and any errors it throws are visible in the terminal. framework --daemon does what bare framework used to do, running the dashboard in the background (detached) and returning after printing the convenience commands. If a background daemon is already running, bare framework reports its URL and defers instead of fighting for the port.

  • 1dbc02a: The daemon can now serve the new Vike + Telefunc dashboard bundle (The dashboard: rebuild on Vike + React + shadcn + Telefunc-stream #405). Opt in with FRAMEWORK_DASHBOARD=next (serves the prerendered SPA at /, with the legacy page.ts at /legacy) or FRAMEWORK_DASHBOARD=legacy (mounts the Telefunc surface at /_telefunc while page.ts stays at /). Unset keeps today's behavior exactly. The dashboard's read + steer RPCs and the live-event Channel are served in-process at /_telefunc (same-origin guarded), backed by a new @gemstack/framework/dashboard-rpc subpath; starting a run over Telefunc lands next.

  • f82e220: Restore the dashboard actions on the new dashboard ([The Framework] restore the dashboard actions (global options + presets on Start, autopilot countdown, Deploy card, Add project) #433): the Start form now carries the Global options (autopilot, technical, vanilla, eco) and the run presets (Research, Readability, Maintainability), the interactive choice gate auto-accepts the recommended pick on an autopilot countdown, a Deploy card shows the chosen render + target, and projects can be added from the Projects sidebar over a new sendAddProject telefunction. Adds a browser-safe deployPlan projection and the preset builders to @gemstack/framework/client.

  • 18de94b: Let the agent push ad-hoc markdown views into the dashboard right rail. A show-markdown block in a turn (non-blocking, unlike a choice gate) becomes a view event that renders as a first-class Views tab in the right rail, with a sticky top-nav to jump between views. Re-showing the same title updates that view in place.

  • 27f522a: feat(framework): opt-in browser notifications on the dashboard for run-end and choice gates ([The Framework] Dashboard: browser notifications on run-end + choice gates #317)

    The localhost dashboard can now notify you when a run finishes (or fails/stops) and when a run reaches a <Choices> gate that needs your input (e.g. a PLAN.md approval). Opt in via the header bell; it only nudges when the dashboard tab is backgrounded, so a run you are watching stays quiet.

  • 4ed510f: Dashboard control channel: the persistent daemon dashboard can now steer any run in its workspace. Its Stop button and choice picks append to .framework/control.jsonl; the run tails the file and aborts or resolves its parked gate. Gates now pause whenever a workspace daemon is live, not only when the run owns its own dashboard; headless behavior without a daemon is unchanged. Also fixes the fresh-workspace daemon startup: bare framework in a project with no .framework/ yet used to fail and leave a zombie server on the port.

  • a345a83: The new Vike + Telefunc dashboard (The dashboard: rebuild on Vike + React + shadcn + Telefunc-stream #405) is now what the daemon serves by default at /; the legacy page.ts dashboard moves to /legacy. Set FRAMEWORK_DASHBOARD=legacy to keep page.ts at / (the escape hatch), and if a build ever ships without the prerendered bundle the daemon falls back to page.ts automatically. The release flow now runs bundle:dashboard so the published package ships the dashboard assets.

  • 63b2a73: feat(framework): document sidebar on the dashboard, rendering the run's PLAN.md / TODO.md ([The Framework] Dashboard: document sidebar (render PLAN.md / TODO.md) #319)

    The localhost dashboard now surfaces the PLAN.md and TODO.md the agent writes at the workspace root (via the anti-lazy-pill) in a right sidebar, rendered as markdown with a sticky tab nav to jump between them. A new GET /api/docs endpoint reads the surfaced docs (fixed filenames, gated on the workspace cwd like /api/runs); the sidebar polls it so a plan written mid-run appears, and stays hidden when there are no docs.

  • 3091bc2: Add an Overview section to the top of the dashboard's first sidebar. It gives a cross-project glance over a new onOverview Telefunc read: what the agent is running right now (from each project's live run meta), the total open TODO count across all projects, and the most recently active projects. Clicking any of them selects the project.

  • dabdf0f: Default dashboard port is now 4200 (was 4477): easier to remember. Pass --port to override.

  • c26159d: Persist the dashboard's Global options (Autopilot, Technical, Vanilla, Eco) in the same the-framework.json as the project list, read and written daemon-side over Telefunc (onPreferences / savePreferences), so they survive restarts without localStorage (~/$HOME/.the-framework.json instead of localhost #410). The registry file becomes an object { projects, preferences }; older bare-array files still read and are migrated on the next write.

  • 16e86c4: Add a Project log panel to the dashboard (Dashboard: Project log panel (reads .the-framework/LOGS.md) #384). It surfaces the committed .the-framework/LOGS.md history (Project DB: the .the-framework/LOGS.md log module #378/Project DB: append a LOGS.md entry when a run finishes #379) for the workspace: every loop/prompt/build run with its title, status, kind, session link, and a loop's constituent prompts, newest-first. Served by a new GET /api/logs endpoint and refreshed on load, on run-end, and on an interval. All fields are escaped and the session link is passed through the page's safe-URL guard, since the log is agent-authored.

  • 43d4f50: Add a cross-project Queue section to the dashboard's first sidebar. It aggregates the open TODO.md items across every registered project over a new onQueue Telefunc read, so the whole backlog is visible in one place instead of per-selected-project only. Clicking a project in the queue selects it.

  • 90c15bf: Export readDocs + the WorkspaceDoc type from the package root, so a separate dashboard can read the same surfaced PLAN/TODO docs the daemon serves (The dashboard: rebuild on Vike + React + shadcn + Telefunc-stream #405 phase 2).

  • 388f3ad: feat(framework): browse a project's run history in the dashboard ([The Framework] Run history in the dashboard (single project) #303)

    The dashboard now has a left sidebar listing a project's past runs (intent, status, session link); clicking one replays that run's projection in the main view, and "Back to live" returns to the current run. Each finished run is archived under .framework/runs/<id>.jsonl + .framework/runs/<id>.json (a crash that skips the final flush is archived on the next run), and served over GET /api/runs and GET /api/runs/<id>. Single project only. Closes [The Framework] Run history in the dashboard (single project) #303.

  • 48f25cd: Add event-stream projections for the dashboard's run overview: architectPlan, decisionLedger, loopStatus, and sessionInfo derive the chosen stack + rationale, the decisions ledger, the production-grade loop status, and the live session from a FrameworkEvent[]. They plus formatFrameworkEvent are re-exported from a new browser-safe @gemstack/framework/client subpath (no Node imports), so the dashboard renders the rich run view — the stack/PROS-CONS card, decisions, loop status, and a human-readable event log instead of raw JSON — across the live view, past-run replay, and the relay watch view.

  • 4e43d76: The new dashboard can now start a run over Telefunc (The dashboard: rebuild on Vike + React + shadcn + Telefunc-stream #405). A sendStart telefunction reaches the daemon's own startRun closure through the Telefunc request context, so it runs in-process with the one-run-per-project busy guard intact (a second start returns busy). Served at /_telefunc alongside the read + steer RPCs, same-origin guarded.

  • 72fb351: Start runs from the daemon dashboard (Start runs from the dashboard: prompt textarea + POST /api/start #345): a prompt textarea + POST /api/start that spawns framework "<prompt>" --no-dashboard as a detached child, with a one-run-at-a-time guard. The started run streams into the page via the tailed event log and is steerable (gates + Stop) through the control channel.

  • 1f588aa: Add framework maintain ([The Framework] Background jobs #298): a background maintenance sweep. It walks the registered repos, and for each that has grown commits since its last review it runs the maintainability loop on them (framework prompt, budget-capped by --max-cost, bounded by --max-repos). A first-seen repo is baselined (recorded, not reviewed retroactively); per-repo review state lives in .the-framework/maintenance.json. --dry-run previews the plan. Also exports the maintenance API (assessRepo, planMaintenanceSweep, maintainSweep, review state helpers).

  • 5882932: feat(framework): inject a system prompt into every prompt (anti-lazy-pill + SYSTEM.md)

    Every run is now framed with a built-in system prompt: the validated anti-lazy-pill ([The Framework] Bootstrap mode #297), which turns unclear scope into a ranked list, a large scope into a PLAN.md, and a very large one into a TODO.md backlog, so the agent builds a real backend and declares what it descopes instead of silently faking it. Drop a SYSTEM.md at the workspace root to add project-specific instructions on top, or set antiLazyPill: false in the-framework.yml to remove the built-in default. Closes [The Framework] User system prompt injected into every prompt #301.

  • eec009d: Thread the UI #314 Global options through the run engine (Global options: run-engine + start-flow plumbing #370). POST /api/start now carries an options object which the daemon turns into CLI flags: --vanilla removes the built-in System prompt #326 system prompt entirely (raw Claude Code), and --eco-auto-planning / --eco-auto-research / --eco-auto-maintenance drop the matching System prompt #326 sections to save tokens (Autopilot and Technical keep mapping to modes). system-prompt.ts drops the Eco sections at render, so the MVP transparency — show real prompt (that includes the system prompt) #343 Prompts panel reflects the toggles live; the System prompt #326 template stays byte-identical. The dashboard panel that drives these lands separately (Global options: dashboard panel (UI) #371); all fields default off, so today's behavior is unchanged.

  • 5d54b64: Add the UI #314 Global options panel to the dashboard (Global options: dashboard panel (UI) #371). Beside the Start box the daemon dashboard now shows persistent toggles: Autopilot (auto-accept, sharing its key with the choice-panel toggle so the two stay in lockstep), Technical control, Vanilla (remove all system prompts, fully transparent), and Eco with Auto planning / Auto research / Auto maintenance to trim the built-in prompt. Each persists in localStorage and rides along in the POST /api/start body, so flipping a toggle changes what the run gets (and, with the engine plumbing in Global options: run-engine + start-flow plumbing #370, what the MVP transparency — show real prompt (that includes the system prompt) #343 Prompts panel shows). Vanilla disables Eco, since a removed prompt has nothing left to trim.

  • 1f6a0d3: feat(framework): interactive plan-approval choice + autopilot in the dashboard ([The Framework] Interactive <Choices> panel + autopilot auto-accept #304)

    The run now pauses at a plan-approval gate right after the architect decides the stack (the AWAIT point of the plan-then-AWAIT flow): the dashboard shows a "Your call" panel with "Proceed" plus each architect alternative as "Use X instead". Accept with the button or Ctrl+Enter, or leave the [x] autopilot countdown auto-accept the recommended plan after 10s (moving the mouse cancels it). Picking an alternative re-architects the run around it. New requestChoice option on runFramework, choice / choice-resolved events, and a POST /choice dashboard route; a headless run with no handler auto-accepts the recommended plan, so nothing else changes. Closes [The Framework] Interactive <Choices> panel + autopilot auto-accept #304.

  • 1300765: Add a [Maintainability (minimal)] preset button on the dashboard (Preset: Maintainability #362) beside the existing [Maintainability] one (Preset: Maintainability #361), as a deliberate A/B. The minimal variant prefills the bare prompt "Look for maintainability red flags, and fix them." with no target scope and no goal framing, where Preset: Maintainability #361 adds a <PARAM:what> target and a "make it as maintainable as possible" lead line. Both prefill the start textarea for review/editing and run verbatim as a direct prompt. Once the comparison settles, the losing variant will be removed.

  • 28fff61: New [Maintainability] preset button on the dashboard (Preset: Maintainability #361): prefills the deliberately minimal refactor-for-future-changes prompt ("look for maintainability red flags, and fix them") into the start textarea for review or editing; Start runs the text verbatim as a direct prompt run. The one blank, <PARAM:what>, defaults to this PR.

  • 4aaa00a: Make the dashboard multi-project on the read side: GET /api/projects lists the registered projects (from the registry) with a per-project summary (name, activated, last activity), and ?project=<id> on /api/logs, /api/runs, /api/runs/<id>, and /api/docs reads that project's data (an absent id keeps the daemon's own workspace, single-project back-compat). The daemon auto-registers its own workspace on boot when it is activated, so the Projects list is populated for the common single-project case. Live event streaming and per-project run start/stop stay single-project for now. Adds ProjectSummary / ProjectsProvider / summarizeProject / defaultProjectsProvider.

  • f0a024c: Add the install-core module: installProject(cwd) activates a repo for The Framework by creating the .the-framework/ marker with a seeded LOGS.md, committing any pre-existing dirty changes first ([The Framework] uncommitted changes) so the install commit ([The Framework] install The Framework) is clean; an already-activated repo is a no-op. Also enumerateGitRepos(dir) lists the immediate child directories that are their own git repo roots (for the "add a directory of repos" flow). Pure core over the existing GitRunner + StoreFs seams; any git failure surfaces as a value, never a throw. No daemon or UI wiring yet.

  • 4746188: Add the multi-project registry module: reads and writes the list of projects The Framework is installed into, as a small {id, path, addedAt} JSON index under the user's config dir. Exposes projectId, registryPath, listProjects, addProject, removeProject, and an injectable RegistryFs seam with a nodeRegistryFs() adapter. No daemon or UI wiring yet.

  • f496a54: Add a multi-select gate (showMultiSelect()): a dashboard checklist with pre-checked defaults that pauses the run and resolves to the selected subset. Built on the existing single-select choice gate (same panel and POST-back resolver), exposed as requestMultiSelect(); a headless run auto-accepts the default set. This is the primitive the [Research] preset uses to let the user pick which problems to deep-dive.

  • e370b41: feat(framework): turn an agent's showMultiSelect()+AWAIT into a live checklist gate (Turn-boundary gate: agent showMultiSelect()+AWAIT becomes a live checklist gate #339)

    The multi twin of the single-select turn-boundary gate (Turn-boundary gate: an agent's showChoices()+AWAIT becomes a live gate #337). When a build turn ends on an await-multiselect block, the framework shows a checklist on the dashboard (via requestMultiSelect, with the agent-marked defaults pre-checked), waits for the selection, and re-prompts the agent to continue from it. This is what the research preset needs to let the user pick which problems to deep-dive. Same safety as Turn-boundary gate: an agent's showChoices()+AWAIT becomes a live gate #337: a no-op when headless and when the agent just finishes.

  • 7e1ea76: Per-project daemon runs + one daemon per machine (Multi-project daemon: live event stream + run start/stop keyed by project #393). Dashboard-started runs, Stop, and choice picks now carry the viewed project id, so the daemon spawns each run with that project's --cwd, steers it through that project's own control log, and guards one run per project. Daemon liveness moved from a per-workspace .the-framework/daemon.json to a single global file beside the registry ($XDG_CONFIG_HOME/the-framework-daemon.json), so framework and framework stop in any repo find the same daemon. Per-project live event streaming is folded in with the dashboard rebuild (The dashboard: rebuild on Vike + React + shadcn + Telefunc-stream #405).

  • 5709703: Serve the new Vike + Telefunc dashboard for per-run foreground runs and --resume, not just the daemon. framework "<prompt>" and framework --resume now serve the rebuilt dashboard in single-project mode, scoped to that run's workspace without touching the global registry, and the live run steers over its own .the-framework/control.jsonl even with no daemon running. Falls back to the legacy page.ts when the bundle is absent or --no-persist is set. Adds singleProjectProvider and resolveDashboardBundle to the public surface.

  • 21fe373: feat(framework): persistent background dashboard daemon ([The Framework] Persistent background dashboard process #302)

    Bare framework now ensures a long-lived dashboard process for the workspace and prints its URL plus the convenience commands; framework stop shuts it down. The dashboard is a projection of .framework/events.jsonl: the detached daemon tails the log and pushes each new event to connected browsers, so it outlives any single run. The tailer also detects an in-place truncation when a fresh run rewrites the log to the same byte length (size unchanged but mtime advanced), and the daemon spawn refuses to re-exec a test entry so a node --test run can never fork-bomb itself.

  • 721f539: Add preset-prompt param substitution (<PARAM:name>), the foundation for prompt-preset buttons. A preset prompt template can carry <PARAM:name> placeholders substituted from supplied values or declared defaults; unfilled params are surfaced so a caller can ask the user to fill the blanks.

  • d834af8: Dashboard presets only prefill the textarea (Polish: presets only prefill textarea #353): the [Research] button now loads the full rendered preset prompt for review and editing, and nothing runs until Start / Ctrl+Enter. The edited text is sent verbatim via a new prompt start kind and framework prompt <text> subcommand (the direct path: gates honored, no build pipeline). Clearing the box reverts Start to a normal build run.

  • 5108aea: Add the per-project second sidebar and main view. The second sidebar now shows the selected project's loops/prompts (its .the-framework/LOGS.md, scoped via ?project=<id>) with its Runs archive below it, both following the selection. The main view shows the selected or latest loop/prompt claude.ai/code-style (kind, title, status, session link, and a loop's constituent prompts); clicking a loop in the sidebar opens it. On load the most recently active project is auto-selected, so the view is populated immediately.

  • 32e9d3e: Add the Projects sidebar to the dashboard: a leftmost nav with Overview (project count plus the most recently active projects), Projects (every registered project with an activation dot and last-activity, from /api/projects), and Queue (the open TODO items aggregated across all projects). Selecting a project re-points the project log to ?project=<id>. The per-project second sidebar and main view come next.

  • f736b55: New [Readability] preset button on the dashboard (Preset: Readability #360): prefills Rom's refactor-for-human-readers prompt (architectural seams, linearity/altitude pass, exhaustive per-function rating lists, one commit per refactor) into the start textarea for review or editing; Start runs the text verbatim as a direct prompt run. The one blank, <PARAM:what>, defaults to this PR.

  • 632f0df: Serve the new Vike + Telefunc dashboard from the run relay (--share), in a read-only watch mode. The relay now serves the prerendered SPA and streams events over the same Telefunc onEvents Channel the daemon uses, sourced from its in-memory run instead of a file. Only the live event stream is exposed (an empty projects provider neutralizes the file/registry RPCs on the public host, and no run can be started or steered). The shareable viewer URL moves from /r/:id/ to /?run=:id (old links redirect); ingest stays at /r/:id/publish. This removes the relay's dependency on the legacy page.ts. Adds makeTelefuncMount, serveClientBundle, emptyProjectsProvider, and the EventsSource type to the public surface.

  • 98f44e2: The [Research] preset (Preset: research #331): framework research [what] and a [Research] button on the daemon dashboard run Rom's problem-variability review as a direct prompt via the new runPrompt() path, which honors await gates (showChoices/showMultiSelect) but skips the scope/architect/build scaffolding. The "what" defaults to this PR.

  • aafbb55: Retire the legacy page.ts dashboard and its HTTP routes ([The Framework] retire page.ts: port the per-run dashboard + relay to the new dashboard #426, part 3). Both consumers are now on the new Vike + Telefunc dashboard (the daemon default, per-run/resume, and the relay), so startDashboard now serves only the prerendered SPA plus the /_telefunc mount (RPCs + the live-event Channel). Removed: the dashboardHtml and parseStartOptions exports, the in-process Dashboard.push/Dashboard.stream (the SPA reads events.jsonl over the Channel and steers over control.jsonl), and the now-unused DashboardOptions fields (onStop, onChoice, cwd, dashboardMode) and the FRAMEWORK_DASHBOARD=legacy escape hatch. A --no-persist foreground run (or an install missing the built bundle) now runs headless rather than falling back to the old page.

  • 03ca1b0: Show the real prompts on the dashboard (MVP transparency — show real prompt (that includes the system prompt) #343). The framework now emits the exact system prompt it runs the agent under, the System prompt #326 block plus any persona / skill / memory framing, as a system-prompt event at session start (both the direct-prompt path and the full build path). A new "Prompts sent to Claude Code" panel renders it alongside each turn's user prompt (harvested from the driver start events already in the stream), so the normally-hidden prompt is fully visible for transparency. Prompt text renders as inert text, never markup. Read-only; nothing is gated on it.

  • 34d3ec2: feat(framework): extract a shared single-select gate primitive (requestChoices) (Extract a shared single-select gate primitive (requestChoices) #335)

    The single-select choice gate ([The Framework] Interactive <Choices> panel + autopilot auto-accept #304) is now a reusable requestChoices({ id, title, options, recommended }) export, the twin of requestMultiSelect (Multi-select view (showMultiSelect()) #332): it emits the choice event, parks for the pick, and falls back to the recommended option if the run is headless or aborts. The plan-approval gate builds on it, and it is the primitive the system prompt's showChoices() and the research preset need. No behavior change for existing runs.

  • c72d155: Give the dashboard clear feedback when a run is started. A run is spawned detached, so there was a gap between clicking Start and the first event (and a failed launch produced nothing, so the page looked frozen). Now clicking Start shows an immediate "Starting your run..." banner; if no output arrives within ~8s it warns that the run may have failed to start; a run-launch/exit failure surfaces as an error banner; and a rejected Start (a run is already active) shows a clear "busy" banner instead of a tiny note.

  • 5c83bc2: The built-in system prompt is now Rom's System prompt #326 text, verbatim, replacing the anti-lazy-pill it grew out of: unclear scope becomes a ranked showChoices() list, a large scope a PLAN_<session>.agent.md to approve, a very large one also a TODO_<session>.agent.md backlog, an alternatives pass rates problem "variability" before code is written, and edits to existing code stay minimal. The prompt is a template (Generate markdown fragments via JavaScript #350): ${{ ... }} JS fragments render against the run context, so tf.params.autopilot relaxes the maintenance stance on autopilot runs and ${{tf.prompt}} carries the user prompt slot. New exports: SYSTEM_PROMPT_TEMPLATE, renderSystemPrompt, renderTemplate; the ANTI_LAZY_PILL export is gone (the antiLazyPill config key still toggles the built-in prompt). --autopilot now has an effect without a preset.

  • 9345476: Record every finished run in the project log .the-framework/LOGS.md (Project DB: append a LOGS.md entry when a run finishes #379). When a run ends, the CLI appends an entry with the intent/prompt title, the kind (build or prompt), the final status (done/stopped/failed), and the Claude Code session id and link. Best-effort, so a log write can never break a run. This is what makes the project DB (Project DB: the .the-framework/LOGS.md log module #378) fill itself; the run-history sidebar in UI #314 reads from it.

  • 59e3707: New .the-framework/LOGS.md project-log module (Project DB: the .the-framework/LOGS.md log module #378): appendLog/readLogs keep a human-readable markdown log of every loop, prompt, and build in a project, with renderLogEntry/parseLogs as the pure core over the same StoreFs seam as the run store. Parsing is forgiving: a malformed entry is skipped, never thrown. Standalone for now; the run-lifecycle wiring and dashboard UI land in follow-up issues.

  • 6b561fc: Add project repo helpers (Project DB: repo activation marker + git ls-files crawl #380): isActivated() checks the .the-framework/ activation marker via an injectable ProjectFs, and crawlRepoFiles() lists every tracked + untracked (gitignore-honoring) file via git ls-files -z behind an injectable GitRunner. Both forgiving: any failure reads as not-activated / an empty list. Building blocks for the UI #314 sidebars.

  • d1202dc: The backlog loop (Looping #323): after the build settles, the run consumes the agent's own TODO backlog (TODO_<slug>.agent.md, or the flat TODO.md) one entry per turn until it is empty. When a dashboard can answer, the loop gates before each entry ("start the next item?"), so autopilot consumes the backlog unattended and autopilot-off pauses per item. Caps make it safe overnight: the budget/Stop signal ends any turn, --max-todo-items bounds the run (default 25), and two no-progress items stop the loop. --no-todo-loop opts out.

  • e4b518a: feat(framework): turn an agent's showChoices()+AWAIT into a live gate at the turn boundary (Turn-boundary gate: an agent's showChoices()+AWAIT becomes a live gate #337)

    The system prompt tells the agent to showChoices() and AWAIT at unclear-scope / alternatives points, but until now only framework-emitted gates (the plan-approval gate, multi-select) could pause a run. Now when a build turn ends by asking the user, an await-choices block, the framework shows the choice on the dashboard, waits for the pick, and re-prompts the agent to continue from that decision. It is the agent-authored counterpart to the plan-approval gate: a no-op when headless and when the agent just finishes instead of asking, so existing runs are unchanged.

  • bc3586b: Keep everything in a single .the-framework/ directory (Database #313). The transient run state (events.jsonl, run.json, runs/, control.jsonl, daemon.json) now lives in .the-framework/ alongside the committed project log LOGS.md, instead of a separate .framework/ directory. install seeds a .the-framework/.gitignore that ignores everything except LOGS.md, so the run state stays transient and only the log is committed.

  • 7db5a9c: feat(framework): track agent spend and add a budget cap (Retrieve usage limits #322)

    The framework now accumulates the token + cost usage the wrapped agent reports each turn, streams a running total as a usage event, and shows a live spend readout on the dashboard header. Pass --max-cost <usd> to stop a run once it has spent that much: the current turn finishes, then the run stops cleanly (not a failure). Useful for long autopilot runs where you only review the result at the end.

Patch Changes

  • 40491ba: Architect turns now honor agent-authored await gates (Architect turns ignore agent await gates: reArchitect swallows the agent's question #356): an architect (or re-architect) turn that stops to ask via showChoices() / showMultiSelect() resolves through the live dashboard gate and re-prompts with the answer, instead of the question being silently swallowed into a stub fallback plan at the plan-approval gate. Headless runs are unchanged. Bounded at 5 rounds, like the build gate.

  • 6721c0f: Untangle the two "autopilot" concepts in the dashboard (Two different "autopilot" concepts (mode vs countdown) #325): the countdown text now reads "Auto accept in 10s" (and "Auto accept canceled" / "Auto accept off"), so "autopilot" is left to mean the mode preset. The checkbox that arms the countdown is labeled "Autopilot", per Rom's call on the issue.

  • 7a94b48: Fix framework --version (and the bare-framework footer) reporting 0.0.0 instead of the real package version (CLI #312). The version is now read from the package's own package.json at runtime, so it always matches what is installed.

  • 900efbb: Center the dashboard's main grid in the content column. main had a max-width: 1100px cap but no horizontal centering, so on a wide window the panels hugged the left edge next to the runs sidebar. Add margin: 0 auto so the capped grid sits centered.

  • 48aba07: Make the dashboard layout fill the viewport height. #layout only grew to its content height, so on a short page the runs-sidebar right border stopped partway down instead of reaching the bottom. Give #layout a min-height: calc(100vh - 57px) (matching the sidebar's existing header-height key) so the stretched sidebar runs full-height.

  • 8cbff44: fix(framework): narrate the auto-preset routing turn so the dashboard is not blank at the start of a run ([The Framework] Dashboard is blank during auto-preset routing #310)

    A preset-less live run first does a real Claude routing turn to auto-select a domain preset. The dashboard was started only after that turn, so its first few seconds looked dead. The dashboard now starts before the routing turn and the turn narrates a log line into it.

  • ed25ab8: Keep the dashboard header and sidebar in view while scrolling. The header is now sticky at the top (with a background and z-index so content scrolls under it), and the app-running banner and the runs sidebar stick just below it. On a long page you no longer lose the title, stop button, and run list when you scroll down.

  • 131f349: fix(framework): surface session-scoped PLAN/TODO docs in the dashboard sidebar (Looping #323)

    The document sidebar now also surfaces the session-scoped PLAN_<SESSION>.agent.md / TODO_<SESSION>.agent.md files The Framework writes per run (Looping #323/System prompt #326), not just flat PLAN.md / TODO.md. Flat files stay supported as a fallback for hand-written docs. Names are matched against the workspace root with a fixed slug pattern, so there is still no path traversal.

  • c05a186: Harden the dashboard against cross-site abuse and event-borne XSS. The state-changing dashboard routes (/stop, /choice, /api/start) now reject any request whose Origin is a foreign site, so a page on another origin can no longer drive the localhost dashboard into spawning or steering a run (a non-browser caller that sends no Origin is unaffected). The client render pipeline no longer trusts event strings: link URLs (session link, preview URL, run-history link) are scheme-checked so a javascript: URL collapses to #, and the HTML escaper now escapes quotes so a relay-published event can't break out of an attribute (e.g. a choice option id like x" autofocus onfocus=...).

  • 07f1756: fix(framework): re-fire the plan-approval gate after picking an alternative (Plan-approval gate does not re-fire after picking an alternative #324)

    Picking an alternative at the plan-approval gate re-architects the plan, and that fresh plan can differ a lot from the one you rejected. The gate now re-fires on the re-architected plan so you approve the plan you will actually build, not just the first one. Bounded to a few re-architect rounds so a run of alternative-picks can't loop forever.

  • 1e1b4dc: Store the multi-project registry as a single file, .bashrc-style: $HOME/.the-framework.json (or $XDG_CONFIG_HOME/the-framework.json) instead of a projects.json nested inside a .the-framework/ directory (Multi-project registry: the projects.json read/write module #390).

  • 734da1a: fix(framework): harden the run relay and workspace sandbox against resource exhaustion

    • The relay now caps how many runs it holds in memory and evicts the least-recently-used one on overflow. Because it is unauthenticated, an anonymous request to /r/<id>/… could previously create per-run state that was never freed; run creation is now bounded (maxRuns, default 200).
    • A disconnected SSE viewer now cancels its stream iterator, releasing its waiter immediately instead of lingering on the stream until the next event (which may never arrive for an idle run).
    • snapshotWorkspace checks a file's size before reading it, so a large asset in the workspace is skipped without ever being loaded into memory during a --sandbox docker sync.
    • relayPublisher's POST has a timeout, so a relay that accepts a connection but never responds can no longer hang the CLI on exit (flush()).
  • Updated dependencies [734da1a]

    • @gemstack/ai-autopilot@0.9.1

@gemstack/ai-autopilot@0.9.1

Patch Changes

  • 734da1a: fix(ai-autopilot): EventStream iterators are now cancellable

    A consumer's async iterator gained a return() that drops its waiter from the stream and settles any pending next(). Previously a consumer that stopped iterating (e.g. a disconnected SSE client) left its waiter registered until the next push/close, so many short-lived consumers on an idle stream leaked. Live iteration and history replay are unchanged.

@gemstack/example-framework-demo@0.0.7

Patch Changes

@gemstack/example-framework-discovery@0.0.7

Patch Changes

@gemstack/framework-dashboard@0.0.1

Patch Changes

@github-actions github-actions Bot force-pushed the changeset-release/main branch 30 times, most recently from ee68c3f to a300323 Compare July 11, 2026 13:32
@github-actions github-actions Bot force-pushed the changeset-release/main branch 29 times, most recently from 7b882ad to db016a4 Compare July 12, 2026 17:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

0 participants