Add "Publish to Gist" to Notes plugin
Details
One-click publishing of Notes pages as GitHub Gists. Converts the page to
markdown using the existing export infrastructure, creates a secret gist via
the GitHub API, and copies the gist URL to the clipboard.
Accessible from:
- Export dropdown in page toolbar (Export → GitHub Gist)
- Right-click context menu on page tree (Publish to Gist)
Uses the existing GitHub connection (Notes already implements IConnectionConsumer
with repo scope). No new dependencies or schema changes needed.
New files:
- GistPublishService.cs: lightweight HTTP client for POST /gists only
Fix gist push to handle title/filename renames
Details
PushSnippetAsync now detects when the snippet title has changed (producing a
different filename via BuildFilename) and sends a rename payload to the GitHub
API: deletes the old filename (null) and creates the new filename with content.
UpdateGistAsync gains a rawFiles parameter (Dictionary<string, object?>) to
support null values for file deletion, which is how the GitHub API expresses
file renames.
Auto-push to gist on save when bidirectional sync is enabled
Details
When a snippet is linked to a gist source with sync_direction="bidirectional",
saving the snippet now automatically pushes the changes to GitHub. If the push
fails, the local save still succeeds and the user is notified of the push failure.
Push tasks to GitHub Projects on assignment
Details
Add bidirectional GitHub Projects v2 sync for project assignment:
when a task is assigned to a PrivStack project linked to a GitHub
Project, it now appears on the GitHub board. Unassigning removes it.
Two scenarios on assign:
- If the task is already a GitHub issue, add it to the project via
the addProjectV2ItemById GraphQL mutation.
- If the task is local-only, create a GitHub issue first (in a repo
matching the project's org/user from configured issue sources),
then add the new issue to the project.
On unassign: remove the item from the GitHub Project via the
deleteProjectV2Item mutation. The issue itself is not deleted.
Changes:
- GitHubIssue model: add NodeId from REST API node_id field
- GitHubIssueFieldMapper: persist github_node_id in custom fields
during issue sync for later use in project mutations
- TaskItem: add GitHubNodeId convenience accessor
- GitHubProjectApiClient: add AddItemToProjectAsync and
RemoveItemFromProjectAsync GraphQL mutations
- GitHubProjectSyncService: add PushTaskToProjectAsync and
RemoveTaskFromProjectAsync with issue creation fallback and
node_id resolution; inject IGitHubIssueApiClient and
GitHubIssueSourceService for repo resolution
- TasksViewModel.Projects: hook FireGitHubProjectSync into
AssignTaskToProject, BulkAssignToProject, and
ApplyProjectEditorResultAsync (fire-and-forget with error toast)
- TasksPlugin: share GitHubIssueApiClient instance between issue
sync and project sync services
Fix tasks showing Jan 1, 0001 for UpdatedAt timestamp
Details
API-created tasks (via IApiProvider) were missing updated_at in the
create payload because the caller (fix-bugs skill, external API)
doesn't include timestamps. The Rust backend auto-sets created_at
but not updated_at, leaving it as DateTimeOffset.MinValue.
- HandleCreateTaskAsync: inject created_at and updated_at if missing
- HandleUpdateTaskAsync: always set updated_at to now on PATCH
- UtcToLocalConverter: return null for MinValue dates so the detail
panel shows blank instead of "Jan 1, 0001 12:00 AM"
Get notified about new releases