From 093a3e7876bfec4bdfc57f580e37875d6fe9e4cb Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Thu, 15 Jan 2026 13:33:21 -0600 Subject: feat(app): reset worktree --- packages/app/src/pages/layout.tsx | 90 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) (limited to 'packages/app/src') diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 8d61f0510..e7acd5f89 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -942,6 +942,30 @@ export default function Layout(props: ParentProps) { } } + const resetWorkspace = async (directory: string) => { + const current = currentProject() + if (!current) return + if (directory === current.worktree) return + + const result = await globalSDK.client.worktree + .reset({ directory: current.worktree, worktreeResetInput: { directory } }) + .then((x) => x.data) + .catch((err) => { + showToast({ + title: "Failed to reset workspace", + description: errorMessage(err), + }) + return false + }) + + if (!result) return + + showToast({ + title: "Workspace reset", + description: "Workspace now matches the default branch.", + }) + } + function DialogDeleteWorkspace(props: { directory: string }) { const name = createMemo(() => getFilename(props.directory)) const [data, setData] = createStore({ @@ -1000,6 +1024,66 @@ export default function Layout(props: ParentProps) { ) } + function DialogResetWorkspace(props: { directory: string }) { + const name = createMemo(() => getFilename(props.directory)) + const [data, setData] = createStore({ + status: "loading" as "loading" | "ready" | "error", + dirty: false, + }) + + onMount(() => { + const current = currentProject() + if (!current) { + setData({ status: "error", dirty: false }) + return + } + + globalSDK.client.file + .status({ directory: props.directory }) + .then((x) => { + const files = x.data ?? [] + const dirty = files.length > 0 + setData({ status: "ready", dirty }) + }) + .catch(() => { + setData({ status: "error", dirty: false }) + }) + }) + + const handleReset = async () => { + await resetWorkspace(props.directory) + dialog.close() + } + + const description = () => { + if (data.status === "loading") return "Checking for unmerged changes..." + if (data.status === "error") return "Unable to verify git status." + if (!data.dirty) return "No unmerged changes detected." + return "Unmerged changes detected in this workspace." + } + + return ( + +
+
+ Reset workspace "{name()}"? + + {description()} This will reset the workspace to match the default branch. + +
+
+ + +
+
+
+ ) + } + createEffect( on( () => ({ ready: pageReady(), dir: params.dir, id: params.id }), @@ -1391,6 +1475,12 @@ export default function Layout(props: ParentProps) { navigate(`/${slug()}/session`)}> New session + dialog.show(() => )} + > + Reset workspace + dialog.show(() => )} -- cgit v1.2.3