Skip to content

Commit 1c8f8f0

Browse files
committed
chore(diff): update doc
1 parent 3fe82ef commit 1c8f8f0

File tree

1 file changed

+25
-62
lines changed

1 file changed

+25
-62
lines changed

DIFF_FEATURE.md

Lines changed: 25 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -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
2123
vim.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

3234
1. **AI makes edits** across multiple files
3335
2. **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
3739
4. **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

7563
1. **Enable the feature** (it's on by default)
7664
2. **Ask OpenCode to make changes:**
65+
7766
```
7867
Update file1.txt and file2.txt with programming jokes
7968
```
69+
8070
3. **Wait for OpenCode to finish**
8171
4. **Review UI appears** showing all changes
8272
5. **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)
9984
3. **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:
152134
vim.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

Comments
 (0)