From 2955e8d929450b2f591f3cb6edd5a77771c4ac08 Mon Sep 17 00:00:00 2001 From: BenStullsBets Date: Fri, 26 Jun 2026 14:17:40 -0700 Subject: [PATCH] feat: color pending proposal blocks by author (Claude blue/purple) Co-Authored-By: Claude Sonnet 4.6 --- src/proposalController.ts | 1 + src/trackChangesModel.ts | 7 +++++-- test/trackChangesModel.test.ts | 7 +++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/proposalController.ts b/src/proposalController.ts index ba9649c..af90a30 100644 --- a/src/proposalController.ts +++ b/src/proposalController.ts @@ -94,6 +94,7 @@ export class ProposalController implements vscode.Disposable { replaced: p.original ?? fp?.text ?? "", replacement: p.replacement, original: p.original, + author: p.author?.kind === "agent" ? "claude" : "human", }; }); } diff --git a/src/trackChangesModel.ts b/src/trackChangesModel.ts index 4d10fd9..9351551 100644 --- a/src/trackChangesModel.ts +++ b/src/trackChangesModel.ts @@ -837,6 +837,8 @@ export interface ProposalView { replacement: string; /** F12/#64 (INV-48): the pre-apply original, set after optimistic apply. */ original?: string; + /** Who made the proposal — colors the del/ins. Defaults to "claude". */ + author?: AuthorKind; } function proposalBlockHtml(p: ProposalView, render: (src: string) => string): string { @@ -848,8 +850,9 @@ function proposalBlockHtml(p: ProposalView, render: (src: string) => string): st } }; const unanchored = p.anchorStart === null ? " cw-proposal-unanchored" : ""; - const before = p.replaced ? `${safe(p.replaced)}` : ""; - const after = `${safe(p.replacement)}`; + const who = p.author ?? "claude"; + const before = p.replaced ? `${safe(p.replaced)}` : ""; + const after = `${safe(p.replacement)}`; const actions = `` + `` + diff --git a/test/trackChangesModel.test.ts b/test/trackChangesModel.test.ts index dfabb87..2907fb1 100644 --- a/test/trackChangesModel.test.ts +++ b/test/trackChangesModel.test.ts @@ -503,6 +503,13 @@ describe("renderReview", () => { expect(html).toContain("cw-ins-human"); // author-colored insertion expect(html).not.toContain(">>"); // sanity: markers not escaped as text }); + + test("renderReview: a proposal block colors its del/ins by author (claude default)", () => { + const proposals: ProposalView[] = [{ id: "p1", anchorStart: 0, anchorEnd: 5, replaced: "hello", replacement: "goodbye" }]; + const html = renderReview("hello", "hello", [], proposals); + expect(html).toContain('cw-del-claude'); + expect(html).toContain('cw-ins-claude'); + }); }); import { renderTrackChanges as rtc2 } from "../src/trackChangesModel";