feat(desktop): Projects v3 — overview redesign, activity feed, agent access & sync controls#1851
feat(desktop): Projects v3 — overview redesign, activity feed, agent access & sync controls#1851thomaspblock wants to merge 18 commits into
Conversation
Overview: primary-tinted contribution heatmap with per-dot legend tooltips and flush-left month labels, pill filter toolbar (reordered, content-aligned), larger rounded project/repo icons, per-segment activity bar tooltips. PR detail: full-height meta rail (two-column card layout), title-first header with author attribution line. Code tab: sync-aware Remote/Local pill toggle — a small round push or pull button appears inside the toggle when the local checkout is ahead of or behind the remote, backed by a new fast-forward-only pull_project_local_repository Tauri command and can_pull sync status, with 60s polling + focus refetch. Sync hooks split into repoSyncHooks.ts to keep hooks.ts under the file-size ceiling.
…ropdown sync Replace the projects search page with an agent prompt page that keeps the conversation inline: submitting opens a DM with the agent under the hood, renders the live thread full-width on the projects page, and pins the composer for follow-ups. The agent picker and thread rows show profile avatars. Also swap the remote/local pill toggle for a GitHub Desktop-style source dropdown with a single contextual pull/push/fetch action button. Split project card/list-row components out of ProjectsView into ProjectCards.tsx to stay under the file-size cap.
Move pull request approval into the conversation flow, resolve creator names across pull requests and issues, and present creation details as readable sentences. Simplify issue rows, use a filled terminal action icon, and extract project Git types to keep the shared API module within its size limit.
Add a workspace activity-focused overview, consistent selected navigation, and restoration controls for inline project agent conversations.
…y feed - Constrain the Projects overview scroll pane to the pane width so content reflows/truncates instead of overflowing horizontally - Cap the "Active Repositories" activity bars to a full avatar-row width - Render activity-feed bodies as plain text (strip Markdown syntax) for clean previews via a shared markdownToPlainText helper - Add rounded corners and a timeline connector stub to commit day-group boxes - Move the activity-feed status tag to the top-right, aligned with the meta text
…row width Stack the activity bar beneath the repo name (both right of the icon) and cap its width so its right edge stays within the People avatar row above.
The projects overview redesign no longer lists repository cards/rows by default (it shows the activity feed + right rail), so the project-*.spec.ts smoke tests timed out waiting for project-card-buzz / project-row-buzz. Switch to the Repositories filter (exact-match button) before locating the project entry to restore the card/row list.
…r polish Move the relay header into the scroll flow so it scrolls away while the filter menu pins to the top (sticky, with backdrop blur). Shrink menu pills to h-7 and align project detail tabs to the same sizing, border the inactive search/read icons, drop the Recent activity headline, align the overview rail sections with the contribution graph rows, and bump the overview headings to text-base.
…bar fix - "+ Project" button (contrast pill, expands on hover) opens a modal that publishes a NIP-34 repo announcement; switches to Repositories after create so the new project is visible - Activity feed titles/bodies back to base/sm sizes; meta line stays small - Contribution cells use proportional corner radius - Custom content scrollbar so sticky blurred chrome no longer covers the overlay scrollbar in WKWebView - PR review card moved into Discussion, rounded subsection corners, ghost push/pull buttons, readme icon sizing
# Conflicts: # desktop/src/features/projects/ui/ProjectDetailScreen.tsx # desktop/src/features/projects/ui/ProjectsOverviewPanel.tsx # desktop/src/features/projects/ui/ProjectsView.tsx
| const nextConversation = { | ||
| channel, | ||
| agent: selectedAgent, | ||
| visibleAfter: Math.floor(clearedAt / 1_000), |
There was a problem hiding this comment.
This initializes a new inline conversation with visibleAfter = 0 unless the user has previously pressed Clear. Because openDmMutation reuses the existing DM with that agent, ConversationThread then renders the entire pre-existing DM history inside Projects, including unrelated conversations; latestAgentConversation() can also auto-restore any recent agent DM for the same reason. Set the cutoff from the first Projects prompt (before sending, to avoid timestamp races) and only restore conversations explicitly persisted by this feature. Please add coverage starting with an existing agent DM and verify older messages never appear in Projects.
There was a problem hiding this comment.
🤖 Fixed in f56ebbc:
- The cutoff is now anchored to the first Projects prompt:
visibleAfteris captured inhandleSubmitbefore sending (so the opener itself stays visible while everything a reused DM already held is hidden). latestAgentConversation()is removed — Projects only restores conversations from the pointer this feature explicitly persisted (restoreProjectsAgentConversationin the newlib/projectAgentConversation.ts).- Legacy pointers with a zero cutoff (written by the previous build) are rejected on read and on restore, so they can no longer expose full DM history.
- Added node test coverage in
projectAgentConversation.test.mjs: an existing agent DM with history is never auto-restored, and messages sent before the first Projects prompt never appear in the thread.
wesbillman
left a comment
There was a problem hiding this comment.
Blocking on conversation isolation: the new Projects surface can expose unrelated historical DM messages with the selected agent. The inline comment has the concrete failure mode and requested coverage. The rest of this very large UI/sync change should also be rebased onto current main and revalidated before approval.
…, scroll-only scrollbar
- Author/creator names and avatars in PR, issue, and repo lists open the
user profile popover (matching the activity feed pattern)
- PR and issue list action buttons switch from solid to outline variant
- Copy-repo-address button moves to the right edge of the detail header
- Content scrollbar indicator only shows while actively scrolling
- Repos with no git activity show their announcement date instead of the
Unix epoch ("56 years ago")
- Activity feed body text tightened under its title
The sync-status fallback took `git branch --show-current` output verbatim, so a hostile remote pointing HEAD at a flag-shaped refname (e.g. `--upload-pack=...`) could smuggle options into the pull/fetch/push argv. Route the local branch through the shared clean_branch allowlist and add --end-of-options before positional refs at every call site.
…tory The inline Projects prompt reuses the existing DM channel with the selected agent, but anchored new conversations at visibleAfter=0 (unless the user had pressed Clear), rendering the agent DM's entire unrelated history on the Projects page; latestAgentConversation() could also auto-restore any recent agent DM the feature never created. Anchor the cutoff to the first Projects prompt (captured before sending, so the opener itself stays visible), restore only pointers explicitly persisted by this feature, and reject legacy zero-cutoff pointers on read. Extract the restore/visibility logic into projectAgentConversation.ts with node test coverage for the existing-DM leak scenarios.
|
@wesbillman let me know if this helped? |
Summary
A broad UI/UX pass on the desktop Projects experience ("v3").
Overview page
Repositories / cards / toolbar
Actionable metadata across sections
Agent access
PR / issue / commit detail
Local/remote sync
pull_project_local_repositorycommand andcan_pull/can_pushsync status.Branch is kept current with
main(community rename and later merges resolved).Test plan