mirror of
https://github.com/getpaseo/paseo.git
synced 2026-11-10 02:15:02 +00:00
* Add inline git diff review comments
Adds a review draft store keyed per diff target, inline gutter + thread
rendering in the diff pane, and a generated review attachment that flows
through the composer and agent providers.
* Strip generated review attachments before saving to draft store
Drafts persist only UserComposerAttachment (no review kind), so filter the
auto-generated review attachment out when seeding the draft or restoring
after a failed auto-submit.
* Fix inline review typecheck and test harness drift
* Unslop inline review feature
- Fix stale-closure bug in composer queueMessage: clear drafts for the
actually-queued attachments, not the latest props
- Drop dead useEffect mirroring initialBody in inline review editor
(parent already remounts via key)
- Restore typed AgentAttachment signature on renderPromptAttachmentAsText;
delete schema redispatch helper and drop null-checks across 5 providers
- Inline single-use review prompt formatters and replace marker switch
with const map
- Drop normalizeComment field-copy redundancy after type guard
- Remove __reviewDraftStoreTestUtils export; test migration via
rehydrate() public path
- Refactor findTarget to return the target line directly (no non-null
assertion at call site)
- Drop redundant isGeneratedReviewAttachment helper; inline kind check
* Update review pill to withUnistyles after rebase
Main's unistyles refactor stripped useUnistyles in favor of withUnistyles +
StyleSheet. Convert ReviewAttachmentPill to use ThemedCircleDot + ICON_SIZE so
the icon picks up the foreground-muted mapping like the other pills.
* Fix lint and typecheck after rebase onto main
Resolve drift after main's withUnistyles refactor:
- Composer complexity: dedup voice?.isVoiceSwitching to drop to 20
- Move per-comment Pressable handlers in git-diff-inline-review into
CommentRow subcomponent so callbacks are stable
- Hoist style/onPress factories to module level (iconButton,
iconButtonDestructive, ghostButton)
- Memoize style arrays in git-diff-pane review wrappers
- Replace inline {} placeholders with useMemo styles
- review-draft-store: extract applyCommentUpdates to avoid map-spread,
include input.key in useMemo deps
- Test fixtures: hoist EMPTY_COMMENTS, add buildReviewActions helper
* Drop GitDiffPane default param to keep complexity at 20
After the rebase, main's `enabled = true` default param combined with the
inline review additions pushed cyclomatic complexity to 21. Drop the
default and resolve `enabled !== false` at the call site (comparison
doesn't count toward complexity).
* Reshape inline review behind @/review module
Drop the `generated: true` attachment flag and consolidate inline-review
logic behind a deep `@/review` module so composer and git-diff-pane stop
hand-composing review primitives. Workspace-scoped review snapshots are
now derived at submit/queue time rather than persisted in the draft
store. Composer review references drop from 51 to 4; git-diff-pane drops
~108 lines and now consumes a controller hook + slot components.
* Fix optimistic review attachments
90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { WorkspaceComposerAttachment } from "./types";
|
|
import {
|
|
buildWorkspaceAttachmentScopeKey,
|
|
resetWorkspaceAttachmentsStore,
|
|
useWorkspaceAttachmentsStore,
|
|
} from "./workspace-attachments-store";
|
|
|
|
function reviewAttachment(body: string): WorkspaceComposerAttachment {
|
|
return {
|
|
kind: "review",
|
|
reviewDraftKey: `review:${body}`,
|
|
commentCount: 1,
|
|
attachment: {
|
|
type: "review",
|
|
mimeType: "application/paseo-review",
|
|
cwd: "/repo",
|
|
mode: "uncommitted",
|
|
baseRef: null,
|
|
comments: [
|
|
{
|
|
filePath: "src/example.ts",
|
|
side: "new",
|
|
lineNumber: 41,
|
|
body,
|
|
context: {
|
|
hunkHeader: "@@ -40,1 +40,1 @@",
|
|
targetLine: {
|
|
oldLineNumber: null,
|
|
newLineNumber: 41,
|
|
type: "add",
|
|
content: "const value = newValue;",
|
|
},
|
|
lines: [
|
|
{
|
|
oldLineNumber: null,
|
|
newLineNumber: 41,
|
|
type: "add",
|
|
content: "const value = newValue;",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
],
|
|
},
|
|
};
|
|
}
|
|
|
|
describe("workspace attachments store", () => {
|
|
it("scopes workspace attachments by server and workspace before cwd fallback", () => {
|
|
expect(
|
|
buildWorkspaceAttachmentScopeKey({
|
|
serverId: " local ",
|
|
workspaceId: " workspace-1 ",
|
|
cwd: "/repo",
|
|
}),
|
|
).toBe("workspace-attachments:server=local:workspace=workspace-1");
|
|
|
|
expect(
|
|
buildWorkspaceAttachmentScopeKey({
|
|
serverId: "local",
|
|
workspaceId: null,
|
|
cwd: "/repo/",
|
|
}),
|
|
).toBe("workspace-attachments:server=local:cwd=%2Frepo");
|
|
});
|
|
|
|
it("publishes and clears attachments for a workspace scope", () => {
|
|
resetWorkspaceAttachmentsStore();
|
|
const scopeKey = buildWorkspaceAttachmentScopeKey({
|
|
serverId: "local",
|
|
workspaceId: "workspace-1",
|
|
cwd: "/repo",
|
|
});
|
|
const attachment = reviewAttachment("Please simplify this.");
|
|
|
|
useWorkspaceAttachmentsStore
|
|
.getState()
|
|
.setWorkspaceAttachments({ scopeKey, attachments: [attachment] });
|
|
|
|
expect(useWorkspaceAttachmentsStore.getState().attachmentsByScope[scopeKey]).toEqual([
|
|
attachment,
|
|
]);
|
|
|
|
useWorkspaceAttachmentsStore.getState().clearWorkspaceAttachments({ scopeKey });
|
|
|
|
expect(useWorkspaceAttachmentsStore.getState().attachmentsByScope[scopeKey]).toBeUndefined();
|
|
});
|
|
});
|