diff --git a/packages/opencode/src/cli/cmd/debug/snapshot.ts b/packages/opencode/src/cli/cmd/debug/snapshot.ts index 72bbd61d..edd5fbe2 100644 --- a/packages/opencode/src/cli/cmd/debug/snapshot.ts +++ b/packages/opencode/src/cli/cmd/debug/snapshot.ts @@ -4,7 +4,7 @@ import { cmd } from "../cmd" export const SnapshotCommand = cmd({ command: "snapshot", - builder: (yargs) => yargs.command(TrackCommand).command(PatchCommand).demandCommand(), + builder: (yargs) => yargs.command(TrackCommand).command(PatchCommand).command(DiffCommand).demandCommand(), async handler() {}, }) @@ -31,3 +31,18 @@ const PatchCommand = cmd({ }) }, }) + +const DiffCommand = cmd({ + command: "diff ", + builder: (yargs) => + yargs.positional("hash", { + type: "string", + description: "hash", + demandOption: true, + }), + async handler(args) { + await bootstrap({ cwd: process.cwd() }, async () => { + console.log(await Snapshot.diff(args.hash)) + }) + }, +}) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 799097e8..e8507342 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -67,6 +67,7 @@ export namespace Session { messageID: z.string(), partID: z.string().optional(), snapshot: z.string().optional(), + diff: z.string().optional(), }) .optional(), }) @@ -1160,6 +1161,7 @@ export namespace Session { const session = await get(input.sessionID) revert.snapshot = session.revert?.snapshot ?? (await Snapshot.track()) await Snapshot.revert(patches) + if (revert.snapshot) revert.diff = await Snapshot.diff(revert.snapshot) return update(input.sessionID, (draft) => { draft.revert = revert }) diff --git a/packages/opencode/src/snapshot/index.ts b/packages/opencode/src/snapshot/index.ts index a2203ecb..d249830b 100644 --- a/packages/opencode/src/snapshot/index.ts +++ b/packages/opencode/src/snapshot/index.ts @@ -94,6 +94,13 @@ export namespace Snapshot { } } + export async function diff(hash: string) { + const app = App.info() + const git = gitdir() + const result = await $`git --git-dir=${git} diff ${hash} -- .`.quiet().cwd(app.path.root).text() + return result.trim() + } + function gitdir() { const app = App.info() return path.join(app.path.data, "snapshots")