Skip to content

feat(tui): browse recent release highlights - #61275

Open
Tarquinen wants to merge 1 commit into
devfrom
highlights-history
Open

Tarquinen wants to merge 1 commit into
devfrom
highlights-history

Conversation

@Tarquinen

@Tarquinen Tarquinen commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

Issue for this PR

Closes #

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

the What's new dialog only knew about the current release, so there was no way to see what an earlier update brought. it now carries the five newest stable releases and lets you step back through them.

  • build: embed() reads CHANGELOG.md from the tagged commit (which tag-release.sh has already extended with this release's notes) and runs the existing parse() on each ## vX.Y.Z section, keeping the newest five with highlights. problems are only warned for the newest section. build-cli no longer gets OPENCODE_RELEASE_NOTES; the tag, GitHub release and Discord jobs still use it.
  • dialog: the header is "What's new", with the version centered above the highlights. a > button goes to the older release, and a < button appears once there's a newer one to go back to (left/right and h/l do the same). up/down still scroll.
  • when it shows: decide() takes the embedded versions instead of a count and shows when any of them is newer than the saved one, so going from 2.2.2 to 2.2.5 still shows 2.2.4 and 2.2.3. the saved {"seen": ...} state keeps its format.
  • CHANGELOG: rewrote the v2.2.0 highlights into the **Title**: body form so they parse. its GitHub release body is unchanged.

side effect: build-node never received the release notes, so node builds had no highlights. they now get them from CHANGELOG.md too.

not changed here: the console changelog page (packages/console/app/src/lib/changelog.ts) and the desktop stable What's new (packages/gui-plugins/src/updater/whats-new.tsx) still parse GitHub release bodies for the older <highlight> HTML form.

How did you verify your code works?

  • bun run check from the root
  • packages/script: bun test test/highlights.test.ts (changelog history, skipping releases without highlights, newest-five limit, CRLF)
  • packages/tui: bun test --timeout 30000 test/highlights.test.ts test/component/dialog-highlights.test.tsx (skipped-release updates, clicking < / > through the releases)
  • ran the highlights story (OPENCODE_STORY=highlights bun run dev:live, now fed the real five releases) with the legacy and new-designs footers, at wide and 56-column widths

not tested: a real stable release build. dev builds embed no highlights, so the auto-show and /highlights were only exercised through tests and the story.

Visual

<svg xmlns="http://www.w3.org/2000/svg" width="240" height="72" viewBox="0 0 240 72" fill="currentColor" font-family="ui-monospace, Menlo, monospace">
  <rect x="36.5" y="2.5" width="167" height="67" rx="3" fill-opacity=".04" stroke="currentColor" stroke-opacity=".3"/>
  <text x="46" y="14" font-size="7" opacity=".85">What's new</text>
  <text x="194" y="14" font-size="6" text-anchor="end" opacity=".45">esc</text>
  <rect x="37" y="20" width="166" height="37" opacity=".06"/>
  <g font-size="7" text-anchor="middle">
    <g>
      <rect x="93" y="24" width="10" height="8" rx="1" opacity=".25"/>
      <text x="98" y="30.5">&lt;</text>
      <animate attributeName="opacity" values="0;1" keyTimes="0;.3333" dur="6s" calcMode="discrete" repeatCount="indefinite"/>
    </g>
    <rect x="137" y="24" width="10" height="8" rx="1" opacity=".25">
      <animate attributeName="opacity" values=".25;.6;.25;.6;.25" keyTimes="0;.28;.3333;.6133;.6667" dur="6s" calcMode="discrete" repeatCount="indefinite"/>
    </rect>
    <text x="142" y="30.5">&gt;</text>
    <text x="120" y="30.5" opacity="0">2.2.5<animate attributeName="opacity" values="1;0" keyTimes="0;.3333" dur="6s" calcMode="discrete" repeatCount="indefinite"/></text>
    <text x="120" y="30.5">2.2.4<animate attributeName="opacity" values="0;1;0" keyTimes="0;.3333;.6667" dur="6s" calcMode="discrete" repeatCount="indefinite"/></text>
    <text x="120" y="30.5" opacity="0">2.2.3<animate attributeName="opacity" values="0;1" keyTimes="0;.6667" dur="6s" calcMode="discrete" repeatCount="indefinite"/></text>
  </g>
  <g opacity="0">
    <rect x="46" y="37" width="70" height="2.5" opacity=".7"/><rect x="46" y="42" width="146" height="2" opacity=".3"/><rect x="46" y="45.5" width="98" height="2" opacity=".3"/>
    <rect x="46" y="50" width="58" height="2.5" opacity=".7"/>
    <animate attributeName="opacity" values="1;0" keyTimes="0;.3333" dur="6s" calcMode="discrete" repeatCount="indefinite"/>
  </g>
  <g>
    <rect x="46" y="37" width="88" height="2.5" opacity=".7"/><rect x="46" y="42" width="140" height="2" opacity=".3"/><rect x="46" y="45.5" width="120" height="2" opacity=".3"/>
    <rect x="46" y="50" width="76" height="2.5" opacity=".7"/>
    <animate attributeName="opacity" values="0;1;0" keyTimes="0;.3333;.6667" dur="6s" calcMode="discrete" repeatCount="indefinite"/>
  </g>
  <g opacity="0">
    <rect x="46" y="37" width="62" height="2.5" opacity=".7"/><rect x="46" y="42" width="132" height="2" opacity=".3"/><rect x="46" y="45.5" width="84" height="2" opacity=".3"/>
    <rect x="46" y="50" width="94" height="2.5" opacity=".7"/>
    <animate attributeName="opacity" values="0;1" keyTimes="0;.6667" dur="6s" calcMode="discrete" repeatCount="indefinite"/>
  </g>
  <text x="46" y="65" font-size="6" opacity=".5">scroll ↑/↓</text>
  <rect x="176" y="59.5" width="18" height="7" rx="1" opacity=".25"/>
  <text x="185" y="65" font-size="6" text-anchor="middle">ok</text>
</svg>

Screenshots / recordings

to add

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

Added by the opencode bot (AI-generated).

Fixes #56432

Related: #57608

The What's new dialog now carries the five newest stable releases'
highlights, read from CHANGELOG.md at build time, and pages between
them with < and > buttons beside a centered version (or left/right).
An update that skipped releases still shows their highlights.

The build reads CHANGELOG.md from the tagged commit instead of the
OPENCODE_RELEASE_NOTES env var, so both parsers share parse().
@Tarquinen
Tarquinen requested a review from a team November 2, 2026 17:42

@opencodejr opencodejr Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found nothing blocking; the change looks sound to me.

How I checked:

  • The new script and TUI tests pass, and tsc -b is clean in packages/tui and packages/cli.
  • history() on the real CHANGELOG.md gives 2.2.5 → 2.2.1 with no warnings.
  • The release and dry-run workflows build from the tagged commit, which tag-release.sh has already extended with the notes. Script.preview still limits highlights to the latest channel, so dropping OPENCODE_RELEASE_NOTES from build-cli keeps the same behaviour.

Public API: unchanged. The OPENCODE_RELEASE_HIGHLIGHTS payload and TuiApp.highlights change shape, but both are internal: the plugin API's App only exposes version/channel. The saved {"seen": ...} state keeps its format.

I couldn't run the dialog in a live TUI here: dev builds embed no highlights, and the story route didn't come up under opencode-drive. Could you add before/after screenshots or a short recording of the dialog, including stepping through releases, when you fill in that section?

Fixes #56432
Related: #57608

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

tui: /highlights should show all releases since the previous version, not just the latest

1 participant