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";