Skip to content

feat(client): widget "what's new" changelog popup (#31) - #74

Open
MateuszPaulski wants to merge 3 commits into
mainfrom
agent/issue-31
Open

feat(client): widget "what's new" changelog popup (#31)#74
MateuszPaulski wants to merge 3 commits into
mainfrom
agent/issue-31

Conversation

@MateuszPaulski

Copy link
Copy Markdown
Collaborator

Adds the in-widget "what's new" release-highlights popup from the approved spec (v2) on #31.

What changed

  • New packages/client/src/whatsnew/ slice
    • highlights.ts — hand-curated, newest-first HIGHLIGHTS content file (the first entry's version doubles as the "latest announced version"; no build-time version constant).
    • version.ts — pure helpers: numeric-tuple compareVersions (so 0.9.1 < 0.10.0), entriesNewerThan, latestVersion.
    • storage.tswhatsNewSeenSetting: SettingEntry<string | null> (on-disk key airside:whats-new-seen), registered in the client settings store per ADR-0046/0047 — no hand-rolled localStorage access.
    • WhatsNewModal.tsx — presentational Radix dialog mirroring IdentityModal (portal container, air: tokens, shared Button, "Got it" dismiss).
    • WhatsNewProvider.tsx — owns the auto-show-once-per-version flow, gated on identity-present: null last-seen seeds silently (no popup for brand-new reviewers), older last-seen opens with every newer entry, newest first, dismissal persists the latest version. Exposes useWhatsNew() for manual re-open (single latest entry).
  • WiringWhatsNewProvider mounts inside IdentityProvider in app.tsx; a ghost icon button (aria-label="What's new") joins the panel-list header next to the close button.
  • Settings store — one-line whatsNewSeen registration in ENTRIES; the generic store.test.ts suite (read-once count, defaults, round-trip, malformed-JSON, wrong-type) now covers the new key.
  • Tests — 22 new: version helpers, HIGHLIGHTS invariants (non-empty, unique strictly-descending versions, well-formed entries), modal rendering/dismiss, and provider auto-show/seed/persist/once-only/identity-gate behaviour (each case seeds localStorage then resetSettings() per the ADR-0046 read-once rule).
  • DocsRELEASING.md gains the "prepend a HIGHLIGHTS entry when cutting a user-facing release" step, with a pointer from CLAUDE.md's Changesets section.
  • Changeset@airnauts/airside-client patch.

Verification

  • pnpm lint (biome ci) — exit 0.
  • pnpm --filter @airnauts/airside-client test — 58 files, 405 tests passed.
  • pnpm --filter @airnauts/airside-client build — tsup + tsc --build --force green.

Closes #31

🤖 Draft opened by airside-agent — automated build of #31.

Curated release highlights now surface in-widget: a Radix dialog auto-shows
once per new version (gated on identity, silent seed for first-time users)
with a manual re-open button in the panel header. Last-seen version persists
through the client settings store as a new registered whatsNewSeen entry.

Closes #31.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@MateuszPaulski

Copy link
Copy Markdown
Collaborator Author

🤖 airside-agent review260e134 · 3 finding(s)

Sev Location Finding
🟠 high packages/client/src/app/app.tsx:89 PR is unmergeable — conflicts with origin/main in 4 files (icon-set unification, branding footer landed since merge-base)
🟡 medium packages/client/src/panel/PanelListView.tsx:60 Raw ✦ glyph bypasses main's single-icon-definition-point convention — use a ui/icons SparkleIcon
⚪ low packages/client/src/whatsnew/version.ts:17 compareVersions returns NaN for non-numeric segments — silently suppresses auto-show

Implementation is spec-faithful and well-tested (settings-store persistence, identity-gated once-per-version auto-show, patch changeset). The high (merge main + re-apply onto updated files) is being auto-fixed.

MateuszPaulski and others added 2 commits July 3, 2026 18:52
# Conflicts:
#	packages/client/src/app/app.tsx
#	packages/client/src/marker/MarkerLayer.test.tsx
#	packages/client/src/panel/PanelDrawer.test.tsx
#	packages/client/src/panel/PanelListView.tsx
Merge origin/main into agent/issue-31 (icon-set unification, branding footer),
replace the raw sparkle glyph with a SparkleIcon in the widget icon set, and
tighten the whats-new-seen setting validate to version-shaped strings.

Airside-Agent-Fix: true
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@MateuszPaulski

Copy link
Copy Markdown
Collaborator Author

🤖 airside-agent review74d4e19 · ✅ review clean (0 findings). Prior high (merge conflicts), medium (raw ✦ → SparkleIcon), and low (validate regex) all verified resolved. Note: the e2e check failed on runner infrastructure (apt 403 installing Playwright, no tests executed) — re-running it; ci job passed.

@MateuszPaulski
MateuszPaulski marked this pull request as ready for review July 3, 2026 17:03
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.

Widget: "what's new" changelog popup

1 participant