Adds a "what's new" modal shown once after the plugin updates to a new
version, so users don't miss what changed:
- New src/changelog.ts: a hand-curated CHANGELOG array (distinct from
the auto-generated CHANGELOG.md, which lists every commit) where
entries can be marked `notable` so they're called out separately
from minor fixes, per the issue's clarification comment.
- New src/utils/version.ts: compareVersions() does numeric per-segment
comparison (so "1.10.0" sorts after "1.9.0", unlike a plain string
compare).
- getUnseenReleases() filters+sorts the changelog to what's newer than
a given "last seen" version, extracted as a pure/testable function
rather than inlined in main.ts (which isn't unit-tested in this repo).
- New settings field lastSeenVersion, persisted the same way as other
settings. On a fresh install (empty lastSeenVersion) it's just
recorded silently — no modal, since there's nothing to compare
against. On an actual version bump, WhatsNewModal shows the unseen
releases' highlights, with a "View full changelog" link out to
CHANGELOG.md and a "Got it" dismiss; the version is recorded either
way so the tip only ever shows once per upgrade.
- The whole check is wrapped in try/catch so a malformed version
string can never break plugin startup.
Closes#39
- Conflict modal (#42): resize to min(1100px,92vw) x min(85vh,800px) flex
layout, remove the 280px content height cap, and add a Diff/Local/Remote
tab switcher on narrow screens (defaults to Diff).
- Settings connection status (#41): show a persistent Connected/Not
connected/Checking badge in the settings tab, auto-tested on open and
after an 800ms debounce on token/branch/URL/owner/repo edits, updated
in place (no full re-render, so typing focus is preserved).
- Local ignore patterns (#40): new "Ignore patterns" setting (.gitignore-
style, multi-line) applied in GitignoreManager.isIgnored() in addition
to the repo's own .gitignore, covering push/pull/refresh uniformly.
Closes#42, #41, #40.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YYCTyZw7gUmJ7oh1VTmAqh
The view mixed hand-picked Unicode glyphs (✓ ⚠ ↑ ↓ ⟳ ↻ ✕ ≡ ⎇ 📁),
duplicated across files, which rendered at inconsistent sizes/weights
across platforms and could drift (e.g. the Refresh button used ↻ while
the "checking" status used ⟳).
Centralize every icon in src/ui/components/icons.ts as Lucide icon ids and
render them with Obsidian's setIcon, so status, action-bar, tab, and
info-strip icons all share one consistent icon set. Tabs now derive their
icon from statusMeta so they can no longer diverge from the file list.
Add CSS to size the SVGs uniformly.
Add setIcon to the obsidian test mock and update statusMeta expectations.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DwioG4CNKUBuKiZdowLFWe