From 82068955f7dae6f1837cb7d56e71ed42407fd54b Mon Sep 17 00:00:00 2001 From: David Hill Date: Tue, 27 Jan 2026 14:42:52 +0000 Subject: [PATCH] feat(app): color filetree change dots by diff kind --- packages/app/src/components/file-tree.tsx | 37 ++++++++++++++++++++--- packages/app/src/pages/session.tsx | 12 ++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx index 64988af53..3b6524b57 100644 --- a/packages/app/src/components/file-tree.tsx +++ b/packages/app/src/components/file-tree.tsx @@ -17,6 +17,8 @@ import { import { Dynamic } from "solid-js/web" import type { FileNode } from "@opencode-ai/sdk/v2" +type Kind = "add" | "del" | "mix" + type Filter = { files: Set dirs: Set @@ -29,6 +31,7 @@ export default function FileTree(props: { level?: number allowed?: readonly string[] modified?: readonly string[] + kinds?: ReadonlyMap draggable?: boolean tooltip?: boolean onFileClick?: (file: FileNode) => void @@ -36,6 +39,7 @@ export default function FileTree(props: { _filter?: Filter _marks?: Set _deeps?: Map + _kinds?: ReadonlyMap }) { const file = useFile() const level = props.level ?? 0 @@ -66,11 +70,16 @@ export default function FileTree(props: { const marks = createMemo(() => { if (props._marks) return props._marks - const modified = props.modified + const modified = props.modified ?? (props.kinds ? Array.from(props.kinds.keys()) : undefined) if (!modified || modified.length === 0) return return new Set(modified) }) + const kinds = createMemo(() => { + if (props._kinds) return props._kinds + return props.kinds + }) + const deeps = createMemo(() => { if (props._deeps) return props._deeps @@ -179,9 +188,27 @@ export default function FileTree(props: { > {local.node.name} - {local.node.type === "file" && marks()?.has(local.node.path) ? ( -
- ) : null} + {(() => { + if (local.node.type !== "file") return null + if (!marks()?.has(local.node.path)) return null + + const kind = kinds()?.get(local.node.path) + return ( +
+ ) + })()} ) } @@ -235,12 +262,14 @@ export default function FileTree(props: { level={level + 1} allowed={props.allowed} modified={props.modified} + kinds={props.kinds} draggable={props.draggable} tooltip={props.tooltip} onFileClick={props.onFileClick} _filter={filter()} _marks={marks()} _deeps={deeps()} + _kinds={kinds()} /> diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 04f34b2a9..d16719d84 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -479,6 +479,16 @@ export default function Page() { scrollToMessage(msgs[targetIndex], "auto") } + const kinds = createMemo(() => { + const out = new Map() + for (const diff of diffs()) { + const add = diff.additions > 0 + const del = diff.deletions > 0 + const kind = add && del ? "mix" : add ? "add" : del ? "del" : "mix" + out.set(diff.file, kind) + } + return out + }) const emptyDiffFiles: string[] = [] const diffFiles = createMemo(() => diffs().map((d) => d.file), emptyDiffFiles, { equals: same }) const diffsReady = createMemo(() => { @@ -2652,6 +2662,7 @@ export default function Page() { focusReviewDiff(node.path)} @@ -2669,6 +2680,7 @@ export default function Page() { openTab(file.tab(node.path))} />