Wire GitHub system fields into sync pipeline
Details
Add CustomFieldService dependency to GitHubIssueSyncService and
GitHubProjectSyncService. Both call EnsureGitHubSystemFieldsAsync()
at the start of SyncAsync to create field definitions before processing.
TasksPlugin also triggers system field creation on init if any GitHub
issue sources exist, so fields are available immediately after startup.
Add ProjectId to GitHubIssueSource so synced issues can be assigned
to a specific project. New tasks created from issues inherit the
source's ProjectId.
Add per-project custom fields + GitHub system field definitions
Details
Add ProjectId, IsSystem, and SourceType properties to CustomFieldDefinition
to support project-scoped fields and auto-created system fields.
Restructure CustomFieldService cache from key-based to ID-based lookups
since project-scoped fields from different projects can share keys.
Add GetFieldsForProject() for project-aware field resolution, and
EnsureGitHubSystemFieldsAsync() for idempotent creation of GitHub
metadata field definitions (author, assignees, comments, project status).
Create GitHubSystemFields static class defining canonical field definitions
and internal keys that remain hidden from the UI.
Fix GitHubIssueSource deserialization error for project-synced tasks
Details
Tasks created by GitHub Projects sync have SourceId pointing to a
github_project_source entity. When these tasks are updated locally,
PushTaskAsync tried to read the SourceId through GitHubIssueSourceService
(entity type github_issue_source), causing the Rust backend to return
the wrong entity type and triggering a JsonException on the required
repo_owner/repo_name fields.
Fix: Add ResolveIssueSourceAsync that detects project-sourced tasks
(SourceId == GitHubProjectSourceId custom field) and finds a matching
issue source by parsing the repo from SourceRef instead. This avoids
the entity type mismatch and also enables push for project-synced
tasks when a bidirectional issue source covers the same repo.
Add GitHub assignee editing in task detail panel
Details
Adds inline assignee management directly in the GitHub Issue metadata
section of the task detail panel. Users can add/remove GitHub usernames
which immediately pushes to GitHub via the existing OnTaskUpdated
auto-push callback — no need to navigate through menus or manually sync.
Changes:
- New TasksViewModel.GitHubAssignees.cs partial: ObservableCollection
for assignees, add/remove commands that update custom_fields and call
UpdateTask (triggering auto-push)
- TaskDetailPanel.axaml: assignee input + chip list in GitHub section
- TasksViewModel.cs: hook RefreshGitHubAssignees into OnSelectedTaskChanged
Push assignees and labels to GitHub on task update
Details
MapTaskToIssueRequest previously only pushed title, body, and state.
Assignee and label changes made locally were silently ignored, requiring
users to manually sync or edit on GitHub directly.
Now extracts github_assignees from custom_fields and reconstructs the
labels list from tags + priority field, so any local change to a
bidirectional GitHub-linked task immediately propagates assignees and
labels back to the issue.
Safety: assignees return null (omitted from PATCH) when no github_assignees
field exists. Labels return null when the task hasn't been pulled from
GitHub yet (no github_number in custom_fields), preventing accidental
label clearing on tasks that haven't been synced.
Get notified about new releases