Repository navigation
Conversation
3 of 6 tasks
3 of 6 tasks
neriousy
force-pushed
the
goal-tui
branch
3 times, most recently
from
October 26, 2026 14:18
8fa9596 to
cc379a3
Compare
4 of 6 tasks
Member
Author
|
Folded into #58508, which now holds the whole /goal stack (idle hook, settled notifications, /goal, TUI and desktop) in one PR. |
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.
Issue for this PR
Stacked on #59262 (
/goal). Merge that first; this PR then retargets todev.Type of change
What does this PR do?
Shows the session's goal under the TUI prompt, next to the other session status, and keeps goal changes live in the client store.
flowchart LR Plugin["goal plugin<br/>writes metadata"] -->|session.metadata.updated| Store["client store<br/>(now handled)"] Store --> Status["prompt footer<br/>◎ goal · ◎ goal paused · ◎ goal met"] Status -->|click| Dialog["goal dialog<br/>objective · pause · resume · clear"] Dialog -->|/goal pause| Pluginpackages/client/src/solid/data.tsignoredsession.metadata.updated, so metadata changed only on a full re-read. It now replaces the Session's metadata from the event. It usesreconcile, because the event carries the whole record and dropped keys must go.GoalStatusinfeature-plugins/prompt/goal.tsx, rendered byprompt/footer.tsx): a short item in the footer under the prompt, beside the subagent/shell counts and usage. It reads◎ goal,◎ goal pausedor◎ goal met.SessionGoal.fromMetadata, so a goal a child Session copied from its parent isn't shown.ppause,rresume andxclear, depending on the status, runs the server's/goalsubcommands, and follows the live state.◎instead of the generic◈.OPENCODE_STORY=goal bun run dev:liverenders the real prompt footer with a fixture goal.scycles the status,ltoggles a long objective, andx/rclear and reset. Actions update the fixture only.How did you verify your code works?
packages/client/test/solid-data.test.ts: a metadata update adds a key, and a later update without it removes it. This fails with a plainsetStore, which merges.packages/tui/test/feature-plugins/prompt-footer.test.tsx:◎ goalin the muted colour, without the objective or a round counter, and opens the dialog on click;◎ goal pausedin the warning colour;opencode-drive:◎ goalappeared under the prompt on/goaland stayed while two long reports scrolled the kickoff row away;◎ goal met, and clicking it opened the dialog with the objective and the reviewer's reason;◎ goal paused.bun run checkpasses.Visual
A looping animation for the desktop app's "What's new" dialog. GitHub only shows its source.
SVG source
Screenshots / recordings
Real TUI and server from this stack, driven with
opencode-drive. Only the model and reviewer replies are scripted.The whole loop:
/goal→ a continuation → met → the dialog → a second goal stopped with Esc.◎ goalunder the prompt, at the right.Checklist