@@ -11,17 +11,19 @@ vim.g.opencode_opts = {
1111 events = {
1212 session_diff = {
1313 enabled = true , -- PR-style review (default: true)
14+ open_in_tab = false , -- Open review in tab instead of vsplit(default: false)
1415 },
1516 },
1617}
1718```
1819
1920** To disable:**
21+
2022``` lua
2123vim .g .opencode_opts = {
2224 events = {
2325 session_diff = {
24- enabled = false , -- Disable diff review
26+ enabled = false ,
2527 },
2628 },
2729}
@@ -31,7 +33,7 @@ vim.g.opencode_opts = {
3133
32341 . ** AI makes edits** across multiple files
33352 . ** Files are written** to disk immediately
34- 3 . ** ` session.diff ` event fires** with complete change data:
36+ 3 . ** ` message.updated ` event fires** with complete change data:
3537 - All modified files in one event
3638 - Each file includes ` before ` (original) and ` after ` (new) content
37394 . ** Review UI opens** showing current file's changes
@@ -45,63 +47,45 @@ vim.g.opencode_opts = {
4547 - ` q ` - Close review (keeps current state)
4648
4749** Restore Strategy:**
48- - Uses ` before ` content from ` session.diff ` event
49- - Writes original content back to disk
50- - Reloads buffer if open in editor
51- - No Git dependencies required
52- - ` A ` - Accept all files
53- - ` R ` - Reject all files
54- - ` q ` - Close review (keeps current state)
5550
56- ** Restore Strategy:**
57- - Uses ` before ` content from ` session.diff ` event
51+ - Uses ` before ` content from ` messaged.updated ` event
5852- Writes original content back to disk
5953- Reloads buffer if open in editor
6054- No Git dependencies required
61-
62- ### Permission-Based Review
63-
64- 1 . ** AI wants to edit file** → Permission request fires
65- 2 . ** Shows unified diff** in vertical split
66- 3 . ** User decides:**
67- - ` <leader>aa ` - Accept edit (file will be written)
68- - ` <leader>ar ` or ` q ` - Reject edit (file won't be modified)
69- 4 . ** Repeat for each file** individually
55+ - ` A ` - Accept all files
56+ - ` R ` - Reject all files
57+ - ` q ` - Close review (keeps current state)
7058
7159## Usage Example
7260
7361### Testing Session Diff Review
7462
75631 . ** Enable the feature** (it's on by default)
76642 . ** Ask OpenCode to make changes:**
65+
7766 ```
7867 Update file1.txt and file2.txt with programming jokes
7968 ```
69+
80703 . ** Wait for OpenCode to finish**
81714 . ** Review UI appears** showing all changes
82725 . ** Navigate with ` n ` /` p ` ** , accept with ` a ` , or reject with ` r `
8373
8474## Files
8575
8676** Core Implementation:**
87- - ` plugin/events/session_diff.lua ` - Listens for ` OpencodeEvent:session.diff `
88- - ` lua/opencode/diff.lua ` - Review UI and restore logic
89- - ` lua/opencode/config.lua ` - Configuration options
90- - ` lua/opencode/events.lua ` - Type definitions
9177
92- ** Legacy (kept for compatibility): **
93- - ` plugin/events/permissions .lua` - Permission-based review (disabled by default)
78+ - ` plugin/events/session_diff.lua ` - Listens for ` OpencodeEvent:message.updated `
79+ - ` lua/opencode/diff .lua` - Review UI and restore logic
9480
9581## Current Limitations
9682
97- 1 . ** Simple diff display** - Shows before/after content, not unified diff format (yet)
98- 2 . ** No syntax highlighting** - Displays as plain diff format
83+ 1 . ** Simple diff display** - Shows before/after content using vim.diff(unified)
99843 . ** No per-hunk review** - Accept/reject entire file only
100- 4 . ** Buffer management** - Opens in vertical split (not configurable yet)
10185
10286## Future Enhancements
10387
104- - [ ] Proper unified diff rendering with syntax highlighting
88+ - [x ] Proper unified diff rendering with syntax highlighting
10589- [ ] Per-hunk accept/reject
10690- [ ] Floating window option
10791- [ ] Side-by-side diff view
@@ -115,19 +99,17 @@ vim.g.opencode_opts = {
11599### Event Flow
116100
117101```
118- AI makes edits
119- ↓
120- Files written to disk
121- ↓
122- OpencodeEvent:session.diff fires
123- ↓
124- plugin/events/session_diff.lua catches it
125- ↓
126- lua/opencode/diff.lua handles review
127- ↓
128- User reviews in split buffer
129- ↓
130- Accept (keep) or Reject (restore from 'before' content)
102+ → session.created
103+ → message.updated (user)
104+ → session.status (busy)
105+ → message.updated (assistant starts)
106+ → message.part.updated (streaming response)
107+ → [4x tool calls executed, files edited]
108+ → message.updated (finish: "tool-calls")
109+ → session.diff (ONE event with all cumulative changes in the session)
110+ → message.updated (Using this as the indicator for a Q&A cycle, only contains diff for files
111+ changed, not like session.diff that contains everything)
112+ → session.status (idle)
131113```
132114
133115### Restore Strategy
@@ -151,22 +133,3 @@ Instead of Git stash/commit, we use the `before` content from the event:
151133-- To revert:
152134vim .fn .writefile (vim .split (file_data .before , " \n " ), file_data .file )
153135```
154-
155- ** Benefits:**
156- - No Git dependency
157- - No pollution of Git history
158- - 100% accurate (exact original content)
159- - Works in any project
160-
161- ## Comparison: Permission vs Session Diff
162-
163- | Aspect | Permission Review | Session Diff Review |
164- | --------| ------------------| ---------------------|
165- | ** Timing** | Before file write | After file write |
166- | ** Unified view** | ❌ One file at a time | ✅ All files together |
167- | ** Navigation** | ❌ Sequential only | ✅ Free navigation |
168- | ** Configuration** | Needs OpenCode config | Works out of the box |
169- | ** Undo method** | Don't write file | Restore from ` before ` |
170- | ** Reliability** | ⚠️ Works sometimes | ✅ Always works |
171-
172- ** Recommendation:** Use Session Diff Review for better UX.
0 commit comments