Rework GitHub Gist integration: sync-all, gist picker for publish
Details
Replace the individual gist source picker with a "Sync All Gists" button that
pulls every user gist as a collection in a single operation. Replace the inline
"Publish as Gist" dialog in both Snippets and Notes with a gist picker modal
that lets users add files to existing gists or create new ones.
Snippets plugin:
- GistSyncService: add SyncAllGistsAsync() for bulk gist discovery/sync,
add AddSnippetToExistingGistAsync() for adding files to existing gists
- GistSourcesViewModel: remove add-source flow (IsAddingSource, gist picker
list, LoadAvailableGistsAsync), add SyncAllGists command with progress
- GistSourcesOverlay: remove gist picker panel, update empty state text,
replace footer with "Sync All Gists" button + progress indicator
- New GistPickerViewModel + GistPickerOverlay: two-tab picker (add to
existing gist from local GistSources, or create new gist)
- SnippetsViewModel: replace ShowPublishGistDialog/CancelPublishGist/
ConfirmPublishGist with PublishToGistAsync using the new picker
- SnippetsView: remove inline publish panel, add GistPickerOverlay
Notes plugin:
- GistPublishService: add ListUserGistsAsync() with pagination and
AddToExistingGistAsync() with duplicate filename handling
- New GistPickerViewModel + GistPickerOverlay: two-tab picker (add to
existing gist from GitHub API, or create new gist)
- NotesViewModel: replace fire-and-forget PublishToGistAsync with picker
workflow that returns gist URL on confirm
- NotesView: add GistPickerOverlay
Snippets 1.9.0 → 1.10.0, Notes 1.65.2 → 1.66.0
Add article category tags, tag filtering, and summary dedup
Details
Parse <category> elements from RSS/Atom feeds into a new Categories
field on RssArticle. Both FetchFeedAsync and RefreshFeedAsync now
extract category terms via SyndicationItem.Categories.
Article detail view shows category tags as styled pills below the
author/date line. Article list items also display compact tag labels.
Tag filter dropdown in the toolbar lets users filter articles by any
tag present in the current article set. Clear button resets the filter.
Summary preamble box is now hidden when the summary text is just a
prefix repetition of the article content — detected via normalized
plain-text comparison in HasDistinctSummary on RssArticle. This
prevents the redundant preamble block seen with feeds like the
PrivStack changelog where summary == content.
Version bump 1.9.6 → 1.10.0
Add fuzzy search, new AI intents, and RAG improvements to Contacts plugin
Details
Add StringSimilarity utility (Jaro-Winkler, Levenshtein, Token Jaccard) for
fuzzy name matching in contact resolution and search. ResolveContactAsync now
falls back to fuzzy matching (threshold 0.6) when exact match fails, including
a full scan fallback for typos/nicknames. Search intent also augments SDK
results with fuzzy matches.
New intents:
- contacts.get_contact: retrieves full contact details (emails, phones,
addresses, social profiles, tags, recent interactions)
- contacts.list_by_company: lists contacts at a company (fuzzy matched)
- contacts.list_by_group: lists contacts in a group (fuzzy matched)
RAG indexing now includes:
- Company chunks with name, industry, website, employee count
- Group chunks with name, description, member count, member names
- Enriched contact chunks with tags, address, social profiles
Version bump 1.9.7 → 1.10.0
Full-featured GitHub Gists integration for Snippets plugin (v1.9.0)
Details
Adds bidirectional gist sync and full gist management capabilities:
Models:
- GistSource: add sync_direction, remote_updated_at, html_url, is_starred, is_own
- Snippet: add gist_content_hash for dirty detection via SHA256
GitHubGistApiClient:
- Add CreateGistAsync, UpdateGistAsync, DeleteGistAsync for write operations
- Add StarGistAsync, UnstarGistAsync, IsGistStarredAsync for star management
- Add html_url field to GitHubGist DTO
GistSyncService:
- Refactor SyncAsync to branch on sync_direction (pull_only vs bidirectional)
- Bidirectional: compare content hashes (local dirty) and timestamps (remote dirty),
push local changes, pull remote changes, remote wins on conflict
- Add PublishSnippetAsGistAsync: create gist, link snippet, set up collection
- Add PushSnippetAsync: push local edits to GitHub
- Add DeleteGistAsync: delete from GitHub, unlink snippets
- Add RenameGistAsync: update gist description on GitHub
- Add ToggleStarAsync: star/unstar with local state persistence
GistSourcesViewModel (overlay):
- Add ToggleStar, StartRename/ConfirmRename/CancelRename, DeleteGistFromGitHub
- Add OpenInBrowser, CopyEmbedCode, ToggleSyncDirection commands
- GistSourceEntry: add IsStarred, IsOwn, SyncDirection, IsRenaming, EditName, HtmlUrl
- Ownership gating: rename/delete only available for owned gists
- Populate new fields in LoadSourcesAsync and AddSelectedGistAsync
SnippetsViewModel (detail panel):
- Add SelectedSnippetGistSource, IsGistLinked computed property
- Add publish dialog state: IsPublishingGist, PublishGistDescription, PublishGistIsPublic
- Add ShowPublishGistDialog, CancelPublishGist, ConfirmPublishGistAsync commands
- Add PushToGistAsync, CopyGistEmbedCodeAsync, OpenGistInBrowser commands
GistSourcesOverlay.axaml:
- Replace remove button with three-dot MenuFlyout (Open, Embed, Rename, Delete, Remove)
- Add star toggle button on source cards
- Add sync direction toggle (pull_only ↔ bidirectional) as clickable label
- Add inline rename with TextBox swap + confirm/cancel buttons
SnippetsView.axaml:
- Add "gist" text badge next to language badge for gist-linked snippets
- Add Push, Embed, Open in Browser icon buttons for gist-linked snippets
- Add Publish button with GitHub icon for unlinked snippets
- Add inline publish panel with description, public/secret toggle, publish/cancel
SnippetsPlugin.cs:
- Add sync_direction indexed field to gist_source schema
- Bump version 1.8.0 → 1.9.0 (csproj + Metadata)
- Update DetailedDescription to mention bidirectional gist sync
Add GitHub Gists integration to Snippets plugin (v1.8.0)
Details
Pull-only sync from GitHub Gists into local snippets. Each gist file
becomes a snippet, auto-grouped into a collection named after the gist
description. Follows the Notes plugin's Wiki Sources pattern.
New files:
- GistSource model with sync status tracking
- GitHubGistApiClient (paginated list + single-gist fetch)
- GistSourceService (SDK CRUD wrapper for gist_source entities)
- GistSyncService (orchestrates pull sync with file diffing)
- GistSourcesViewModel (overlay state machine with add/sync/remove)
- GistSourcesOverlay (modal UI using shared adaptive:ModalOverlay)
Modified files:
- Snippet: added gist_source_id and gist_filename tracking fields
- SnippetsPlugin: IConnectionConsumer (gist scope), gist_source entity
schema, service wiring, WipeTargets
- SnippetsViewModel: lazy GistSourcesViewModel, OpenGistSources command
- SnippetsView: gear icon with MenuFlyout, overlay embedding
- csproj: version bump 1.7.6 → 1.8.0
Get notified about new releases