feat(desktop): refine repository-aware project workspaces (#6003)

## Summary
- Makes Projects repository-aware across browsing, branch and tag
selection, local and remote source management, work items, commits, and
contextual repository actions.
- Refines project details into consistent single-column reading surfaces
with a resizable, section-aware context pod, while keeping project
conversations available in the attached chat panel.
- Adds persistent sidebar project navigation, direct entity links,
repository discussion channels, contributor identity matching, and
consistent loading and activity presentation.
- Keeps branch-specific controls on code-oriented sections while Tasks,
Reviews, and Channels remain repository-scoped, reducing misleading
context and actions.

Replacement for #5981 with an identical final tree flattened into one
signed-off commit because the required DCO check suite remained stalled.

### Related issue
N/A

### Testing
- [x] Desktop pre-push checks, TypeScript typecheck, and unit tests
- [x] E2E production build with `pnpm build:e2e`
- [x] Focused Playwright smoke coverage for project workspace, task,
review, commit, sidebar, and contextual-panel behavior
- [ ] Attach final before/after screenshots after design review

---------

Signed-off-by: Thomas Petersen <thomasp@squareup.com>
Signed-off-by: Wintermute <165f0c871dd2586bb18b6aa109eeaf57bb2132ff4d27b10120f4368a0f627022@buzz.block.builderlab.xyz>
Co-authored-by: Wintermute <165f0c871dd2586bb18b6aa109eeaf57bb2132ff4d27b10120f4368a0f627022@buzz.block.builderlab.xyz>
This commit is contained in:
thomaspblock
2026-08-19 07:50:00 -04:00
committed by GitHub
parent 93114c9c65
commit 87f8ff82ae
188 changed files with 13049 additions and 3931 deletions

View File

@@ -68,6 +68,8 @@ export type MarkdownParseInputs = {
components: Components;
content: string;
customEmoji?: CustomEmoji[];
/** Omit or true for chat-style `<br>` on every newline. */
hardLineBreaks?: boolean;
/** Inserts the runtime-provided leading content marker during parsing. */
leadingInlineContent?: boolean;
mentionNames?: string[];
@@ -104,7 +106,7 @@ function buildMarkdownElement(input: MarkdownParseInputs): React.ReactElement {
components: input.components,
remarkPlugins: [
remarkGfm,
remarkBreaks,
...(input.hardLineBreaks === false ? [] : [remarkBreaks]),
remarkSpoilers,
remarkChannelDeepLinks,
remarkMessageLinks,
@@ -140,6 +142,7 @@ export function renderCachedMarkdown(
// distinct input tuples. Content is last and needs no prefix: everything
// before it is self-delimiting.
const key =
segment(input.hardLineBreaks === false ? "soft" : "hard") +
segment(input.variant) +
segment(input.leadingInlineContent ? "leading" : "") +
listSegment(input.mentionNames) +