Skip to content

feat(desktop): Projects v3 — overview redesign, activity feed, agent access & sync controls#1851

Open
thomaspblock wants to merge 18 commits into
mainfrom
projects-v3
Open

feat(desktop): Projects v3 — overview redesign, activity feed, agent access & sync controls#1851
thomaspblock wants to merge 18 commits into
mainfrom
projects-v3

Conversation

@thomaspblock

@thomaspblock thomaspblock commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Summary

A broad UI/UX pass on the desktop Projects experience ("v3").

Overview page

  • Redesigned overview layout: contribution graph + top-callout stats, a GitHub-style activity feed in the left column, and a right rail with People, Top Languages, and Active Repositories.
  • Contribution graph uses the theme primary color and tints (not grayscale), tooltips on the legend dots, subtle borders for not-yet-visited cells, and proportional rounded cell corners.
  • Activity feed rendered as a timeline with event-specific icons/connectors; bodies are flattened from Markdown to clean plain-text previews; status tags aligned top-right; avatars/names/timestamps deep-link to the underlying event.
  • Repository creation events now appear in the feed ("created the repository …", sourced from kind-30617 announcements).
  • Sticky filter toolbar with background blur when scrolled; scroll-only custom scrollbar indicator (thumb hidden at rest, painted over the gutter while scrolling).
  • "+ Project" button (top-right, expands on hover) opening a Create Project modal that publishes a NIP-34 repo announcement and lands on the Repositories tab.
  • Fixed overview responsiveness: the scroll pane no longer overflows horizontally; content reflows/truncates to the pane width.
  • "Active Repositories" rows: name + activity graph nested right of the icon, with the graph capped to the People avatar-row width.

Repositories / cards / toolbar

  • Removed card/list/sort borders; per-segment hover on repository progress bars.
  • Left-aligned toolbar, rounded + larger project/repo icons, reordered filters, pill-styled selected menu items (matching the sidebar), and a search entry point.
  • Repos with no git activity show their announcement date instead of the Unix epoch ("56 years ago" fix).

Actionable metadata across sections

  • Author/creator names and contributor avatars in the PR list, issues list, and repository cards open the user profile popover (hover or click), matching the activity feed.
  • PR and issue list action buttons ("Review PR", "Open issue", …) use the outline variant.

Agent access

  • Inline agentic access to git repositories directly on the Projects page (persisted conversation with a clear-conversation control, agent avatars, rich-text composer) instead of navigating away to a DM channel.

PR / issue / commit detail

  • Two-column PR detail layout with author attribution under the title.
  • Consistent "Created [date] by [name]" metadata for PRs and issues; natural-sentence issue creation line.
  • Copy-repo-address button on the right edge of the project detail header (replacing the Details row).
  • Commits tab: rounded day-group boxes connected to the timeline rail; outlined terminal icon.

Local/remote sync

  • Repo source controls redesigned (source + branch dropdowns, single contextual action) with push/pull backed by a new pull_project_local_repository command and can_pull/can_push sync status.

Branch is kept current with main (community rename and later merges resolved).

Test plan

  • Overview renders correctly and reflows at narrow/wide desktop widths (no horizontal overflow)
  • Activity feed: markdown previews render as plain text; deep links open the right event; status tags top-right; repo-creation entries appear
  • Names/avatars in PR, issue, and repo lists open the profile popover without triggering the row action
  • Create Project modal publishes an announcement and the new repo appears under Repositories
  • Scrollbar indicator only appears while scrolling and never hides behind the blur bar
  • Zero-activity repos show their creation date (no "56 years ago")
  • Agent conversation persists on the Projects page and restores across reloads
  • Local/remote push & pull work and reflect accurate sync status
  • CI green

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
@thomaspblock thomaspblock marked this pull request as ready for review July 14, 2026 20:46
@thomaspblock thomaspblock requested a review from a team as a code owner July 14, 2026 20:46
const nextConversation = {
channel,
agent: selectedAgent,
visibleAfter: Math.floor(clearedAt / 1_000),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Fixed in f56ebbc:

  • The cutoff is now anchored to the first Projects prompt: visibleAfter is captured in handleSubmit before 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 (restoreProjectsAgentConversation in the new lib/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 wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.
@thomaspblock thomaspblock marked this pull request as draft July 15, 2026 09:28
…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.
@thomaspblock thomaspblock requested a review from wesbillman July 15, 2026 11:47
@thomaspblock thomaspblock marked this pull request as ready for review July 15, 2026 13:06
@thomaspblock

Copy link
Copy Markdown
Contributor Author

@wesbillman let me know if this helped?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants