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
GitHub Projects v2 full sync: create tasks from project items
Details
GitHub Project sync previously only linked already-synced tasks to a
PrivStack project. Adding a project without also adding each repo as an
issue source resulted in zero tasks. This makes GitHub Projects a
self-contained sync source.
Changes:
- Expand GraphQL content fragment to fetch full issue data (body, state,
author, assignees, labels, comments, timestamps) from project items
- Add project status → PrivStack status mapping with fuzzy column name
matching (Todo/In Progress/Done/Review/Blocked/etc.)
- Add MapProjectItemToNewTask and UpdateTaskFromProjectItem factories
that create/update tasks directly from project items, with project
column status taking priority over issue state
- Rewrite GitHubProjectSyncService.SyncAsync to create missing tasks,
update existing tasks when remote is newer or column changed, and
link tasks to the PrivStack project
- Fix issue sync dedup: broaden task lookup to all github_issue tasks
by source_ref (not just tasks from the current source), preventing
duplicates when both project and issue sources cover the same repo
- Add push ownership guard: only push changes to GitHub if the source
that created the task owns it
- Fix orphan detection to only mark tasks owned by the current source
Version bump: Tasks 1.28.0 → 1.29.0
Add View Settings tab with item density modes to Tasks plugin
Details
Move Flat/GTD/Calendar grouping selector from inline sub-mode toggle
into a new "View" tab in Tasks Settings. Add "List Item Density" setting
with Full/Balanced/Compact modes that control item card visual density:
- Full: status color bar, priority label, timer button, tags
- Balanced (default): priority dot, title, metadata, tags
- Compact: priority dot, title, metadata only
Remove drag handle from all densities (press-and-hold drag still works).
Both ListSubMode and ListItemDensity persist across restarts via
IPluginSettings. StatusMessage moved into the header row to reclaim
vertical space formerly used by the sub-mode toggle row.
Unify Tasks views: List (with sub-modes) | Board
Details
Consolidate from 4 top-level views (List/Board/GTD/Calendar) to 2 main
views (List | Board). The List view now has sub-mode toggle tabs
(Flat/GTD/Calendar) that change the grouping in the left pane of a
split layout, with the detail panel always visible on the right.
ViewModel changes:
- Add ListSubMode property ("flat"/"gtd"/"calendar") with computed
booleans IsFlatSubMode, IsGtdSubMode, IsCalendarSubMode
- Redefine IsTimelineView/IsCalendarView as internal aliases that
combine IsListView with the appropriate sub-mode check
- Remove IsTasksSidebarCollapsed, SidebarWidth, sidebar persistence
- Add SetListSubModeCommand and OnListSubModeChanged handler
View restructure (~1000 lines deleted):
- Replace 4-button view toggle with 2 buttons (List | Board)
- Remove PluginSidebar entirely
- Replace full-screen detail panel with split layout: task list pane
(left) + resize handle + TaskDetailPanel (right)
- Move stats, New Task, Prioritize buttons into list pane header
- Add sub-mode toggle bar (Flat | GTD | Calendar) below header
- GTD and Calendar item templates moved into left pane, controlled
by sub-mode visibility
- Delete standalone GTD Timeline View and Calendar Timeline View
sections (their content is now in the split layout)
Code-behind:
- Remove sidebar wiring from constructor
- Update GetResizeTargetBorder: add "list-detail", remove "gtd-detail"
and "calendar-detail"
Version: 1.26.0 → 1.27.0
Get notified about new releases