Slice 2: the §8 active-RFC view in full

Per the §19.1 brief: the three-column shape (§8.1) opens on main
in discuss mode (§8.2), supports the §8.3 discuss-vs-contribute
flip on non-main branches, hosts §8.4's per-branch chat with AI
participation (§18's <change> protocol → §8.14 changes rows), the
§8.8 change-card panel with §8.9 accept/decline/edit-before-accept,
the §8.10 tracked-change markup + DiffView toggle, the §8.11
manual-edit flushes with the stale-change mechanic, the §8.12
range and paragraph sub-threads, the §8.13 flag affordance, and
the §8.14 discuss-mode buffer.

Backend: bot.py grew per-RFC-repo write ops (cut_branch_from_main,
commit_accepted_change with the structured original/proposed/reason
body and Change-Id + Source-Message-Id + On-behalf-of trailers,
commit_manual_flush, ensure_rfc_repo_seed). cache.py grew
refresh_rfc_repo and the webhook dispatches on repository.full_name.
providers.py and chat.py port the §18 carryovers — multi-provider
LLM abstraction and SSE-streaming chat against the §5 threads /
thread_messages / changes schema. api_branches.py mounts the §17
branches/<branch>/* and threads/<thread_id>/* routes with the §6
/ §11 permission checks inline.

Frontend: RFCView.jsx rebuilt as the §8 surface; Editor.jsx,
ChatPanel.jsx, ChangePanel.jsx, PromptBar.jsx, SelectionTooltip.jsx,
DiffView.jsx, ModelPicker.jsx, modelStyles.js lifted from the
prototype and adapted to the canonical schema.

Covered by `backend/tests/test_rfc_view_vertical.py` — eleven new
integration tests against an extended FakeGitea (PUT contents,
POST orgs/{org}/repos, seed_rfc_repo): main-view read,
promote-to-branch, accept (with and without edit-before-accept),
decline, manual flush + system message, flag creation, visibility
flip, anonymous read-but-no-contribute, stale-change refusal, and
the chat-streaming path with a fake provider injected. The 5
Slice 1 tests continue to pass alongside.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ben Stull
2026-05-24 04:35:14 -07:00
parent 779ba6db59
commit 3bc8fe92af
24 changed files with 5433 additions and 151 deletions
+23
View File
@@ -0,0 +1,23 @@
// modelStyles.js — colors and display labels for each LLM provider.
// §18 carryover from the prototype. Per §19.2's per-RFC-model topic,
// future per-RFC overrides land on top of this map without replacing it.
export const MODEL_STYLES = {
// Claude variants — shades of purple
'claude': { color: '#7c3aed', bg: '#faf5ff', label: 'Claude' },
'claude-sonnet': { color: '#7c3aed', bg: '#faf5ff', label: 'Sonnet' },
'claude-opus': { color: '#4c1d95', bg: '#f5f3ff', label: 'Opus' },
'claude-haiku': { color: '#a78bfa', bg: '#faf5ff', label: 'Haiku' },
// Gemini variants — shades of blue
'gemini': { color: '#1d4ed8', bg: '#eff6ff', label: 'Gemini' },
'gemini-pro': { color: '#1d4ed8', bg: '#eff6ff', label: 'Gemini Pro' },
'gemini-flash': { color: '#0284c7', bg: '#f0f9ff', label: 'Gemini Flash' },
'gemini-2-flash': { color: '#0ea5e9', bg: '#f0f9ff', label: 'Gemini 2 Flash' },
// OpenAI / Copilot
'openai': { color: '#059669', bg: '#ecfdf5', label: 'Copilot' },
// Fallback
'default': { color: '#6b7280', bg: '#f9fafb', label: 'AI' },
}