Skip to content

Commit 94be020

Browse files
codeprakhar25claude
andcommitted
feat: Add Copilot integration and fix Codex/Windsurf/OpenCode/Antigravity capture
- Add VS Code Copilot extension (plain JS, no build step) installed to ~/.vscode-server/extensions/ (WSL2) or ~/.vscode/extensions/ - Add capture-copilot.py script for Copilot inline/chat/save events - Fix capture-codex.py: handle JSONL multi-event stdin, nested turn_context.payload.cwd, session file fallback for cwd recovery, always-on fire-marker log for diagnostics - Fix capture-windsurf.py: use agent_action_name field, read file_path from nested tool_info, parse edits from tool_info.edits[] - Fix capture-antigravity.py: fix hunk reset bug wiping prior lines, move import re to top-level, add BeforeTool/AfterTool prompt caching - Fix opencode-agentdiff.ts: use Bun.spawnSync instead of unreliable echo pipe, add file/filePath/file_path/path field aliases - Fix init.rs: detect ~/.vscode-server/extensions/ first for WSL2, add --no-copilot and --no-antigravity flags - Add test_capture_antigravity.py and test_capture_codex.py Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 8a7480a commit 94be020

14 files changed

Lines changed: 1533 additions & 168 deletions

‎.agentdiff/ledger.jsonl‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
{"sha":"c060130ded9395b7725fa1d070bc822682e59aea","ts":"2026-03-25T20:30:57+00:00","agent":"human","model":"human","session_id":"unknown","author":"Prakhar Khatri","files_touched":[".agentdiff/ledger.jsonl",".github/workflows/ci.yml",".github/workflows/release.yml","Cargo.toml","README.md","examples/mcp/agentdiff-mcp.json","install.sh","scripts/mcp-smoke-test.py","src/cli.rs","src/commands/config_cmd.rs","src/config.rs","src/init.rs"],"lines":{".agentdiff/ledger.jsonl":[[3,3]],".github/workflows/ci.yml":[[1,33]],".github/workflows/release.yml":[[1,160]],"Cargo.toml":[[5,5],[9,21]],"README.md":[[12,18],[21,21],[24,24],[95,95],[108,108],[115,120],[156,175],[220,228],[312,312]],"examples/mcp/agentdiff-mcp.json":[[1,9]],"install.sh":[[1,133]],"scripts/mcp-smoke-test.py":[[1,196]],"src/cli.rs":[[208,208]],"src/commands/config_cmd.rs":[[23,30],[63,65],[68,68],[86,88],[96,103]],"src/config.rs":[[25,28],[41,44],[53,53],[91,94]],"src/init.rs":[[146,150],[187,188],[199,212],[219,219],[239,247]]},"prompt_excerpt":"","prompt_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","files_read":[],"flags":[],"tool":"commit"}
55
{"sha":"fc8d789cd0b98f3538f354ad8b29aadaacf41e5c","ts":"2026-03-26T04:54:02+00:00","agent":"human","model":"human","session_id":"unknown","author":"Prakhar Khatri","files_touched":["src/commands/report.rs"],"lines":{"src/commands/report.rs":[[27,27]]},"prompt_excerpt":"","prompt_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","files_read":[],"flags":[],"tool":"commit"}
66
{"sha":"36a629da1a77be3b1b679cdb9ced2262cddd25f1","ts":"2026-03-26T10:57:13+00:00","agent":"cursor","model":"claude-4.6-opus-high-thinking","session_id":"f03f0e16-6e4b-43be-af37-53fa9333e85a","author":"Prakhar Khatri","files_touched":["README.md","src/cli.rs","src/commands/report.rs"],"lines":{"README.md":[[51,51],[53,54],[65,65]],"src/cli.rs":[[77,77],[147,154]],"src/commands/report.rs":[[2,2],[4,8],[11,11],[13,14],[16,18],[20,27],[31,32],[35,36],[39,48],[55,73],[76,77],[80,81],[84,86],[89,100],[103,120],[122,124],[126,128],[131,148],[150,151],[154,155],[167,169],[176,234]]},"prompt_excerpt":"let's fix these so it works fine","prompt_hash":"5870c81ca874d46ead9a4b78a8d0e9854f8dee00b3fa99cfc4ca96af3d910848","files_read":[],"flags":[],"tool":"afterFileEdit","mode":"agent"}
7+
{"sha":"242dae98737da7ce344ba4f9317dad0b6d76c367","ts":"2026-03-27T09:59:37+00:00","agent":"codex","model":"codex","session_id":"unknown","author":"Prakhar Khatri","files_touched":["README.md","scripts/capture-antigravity.py","scripts/capture-codex.py","scripts/capture-copilot.py","scripts/capture-windsurf.py","scripts/opencode-agentdiff.ts","scripts/tests/test_capture_antigravity.py","scripts/tests/test_capture_codex.py","scripts/vscode-extension/extension.js","scripts/vscode-extension/package.json","src/cli.rs","src/init.rs","src/main.rs"],"lines":{"README.md":[[82,82],[85,85],[91,91],[94,94],[132,132],[135,135],[137,137],[220,229],[292,309],[321,321],[329,333]],"scripts/capture-antigravity.py":[[3,3],[5,8],[10,10],[47,92],[94,96],[98,266],[270,282],[284,348],[351,351],[353,353],[355,357],[361,362],[365,379],[381,381],[385,385]],"scripts/capture-codex.py":[[13,13],[38,41],[118,119],[123,123],[140,143],[189,189],[234,451],[458,470],[484,485],[490,505],[509,523],[526,526],[530,534],[537,541],[543,543],[554,554],[557,557],[563,563]],"scripts/capture-copilot.py":[[1,131]],"scripts/capture-windsurf.py":[[156,162],[173,173],[176,178],[180,181],[183,183],[185,196],[200,200],[203,211]],"scripts/opencode-agentdiff.ts":[[10,13],[23,58],[82,82],[109,117],[121,121],[126,127],[133,133]],"scripts/tests/test_capture_antigravity.py":[[1,94]],"scripts/tests/test_capture_codex.py":[[1,85]],"scripts/vscode-extension/extension.js":[[1,167]],"scripts/vscode-extension/package.json":[[1,19]],"src/cli.rs":[[69,72],[81,84]],"src/init.rs":[[13,17],[29,29],[32,32],[66,71],[76,76],[81,86],[89,89],[131,131],[626,637],[652,791],[923,1025]],"src/main.rs":[[50,50],[53,53]]},"prompt_excerpt":"unknown","prompt_hash":"b23a6a8439c0dde5515893e7c90c1e3233b8616e634470f20dc4928bcf3609bc","files_read":[],"flags":[],"tool":"task_complete","mode":"agent"}

‎README.md‎

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,19 @@ agentdiff report --format annotations --out-annotations annotations.json
7979
- Claude Code PostToolUse hook
8080
- Cursor afterFileEdit hook
8181
- Codex notify hook
82+
- Gemini/Antigravity BeforeTool/AfterTool hooks
8283
- Windsurf repo-level hooks
8384
- OpenCode repo-level plugin
85+
- VS Code Copilot extension (`~/.vscode/extensions/agentdiff-copilot-0.1.0/`)
8486

8587
2. **Capture** — When you use AI tools:
8688
- Claude Code → PostToolUse hook fires on Edit/Write/MultiEdit
8789
- Cursor → afterFileEdit/afterTabFileEdit hooks fire
8890
- Codex → notify hook fires on turn completion
91+
- Gemini/Antigravity → BeforeTool/AfterTool hooks fire on write_file/replace
8992
- Windsurf → post_write_code hook fires on code write
9093
- OpenCode → plugin fires on tool.execute.after
94+
- GitHub Copilot → VS Code extension captures inline completions and chat edits on save
9195
- Each capture writes to `<repo>/.git/agentdiff/session.jsonl`
9296
- Optional MCP writes context to `<repo>/.git/agentdiff/pending.json`
9397

@@ -125,10 +129,12 @@ agentdiff init
125129
- **Claude Code** — via PostToolUse hook
126130
- **Cursor** — via afterFileEdit/afterTabFileEdit hooks
127131
- **Codex CLI** — via `notify` hook
132+
- **Gemini/Antigravity** — via `~/.gemini/settings.json` hooks (`write_file|replace`)
128133
- **Windsurf** — via `post_write_code` hook
129134
- **OpenCode** — via `.opencode/plugins/agentdiff.ts`
135+
- **GitHub Copilot (VS Code)** — via VS Code extension installed to `~/.vscode/extensions/`
130136
- **MCP context writer** — via `record-context.py` (writes `.git/agentdiff/pending.json`)
131-
- **Antigravity/batch agents** — via CLI (`capture-antigravity.py --prompt "..." --model "..."`)
137+
- **Manual batch fallback** — `capture-antigravity.py --prompt "..." --model "..."`
132138

133139
## MCP Server
134140

@@ -211,6 +217,16 @@ tail -n 50 .git/agentdiff/session.jsonl
211217
tail -n 20 .agentdiff/ledger.jsonl
212218
```
213219

220+
### 4b) Codex / Gemini diagnostics (if entry is missing)
221+
```bash
222+
export AGENTDIFF_DEBUG=1
223+
# make one edit in Codex or Gemini, then commit
224+
tail -n 100 ~/.agentdiff/logs/codex-notify-fired.log
225+
tail -n 100 ~/.agentdiff/logs/capture-codex.log
226+
tail -n 50 .git/agentdiff/session.jsonl
227+
tail -n 20 .agentdiff/ledger.jsonl
228+
```
229+
214230
### 5) Edge cases to validate
215231
- Empty or malformed hook payloads should not crash capture scripts.
216232
- `afterTabFileEdit` events should still attribute file/line/model without prompt.
@@ -273,6 +289,24 @@ Tagging `v*` triggers release workflow:
273289
- **Code review** — Identify AI-authored code requiring extra scrutiny
274290
- **Attribution** — Track prompts driving major changes
275291

292+
## VS Code Copilot Extension
293+
294+
`agentdiff init` installs a plain-JavaScript VS Code extension directly into
295+
`~/.vscode/extensions/agentdiff-copilot-0.1.0/`. No `npm install` or build step
296+
is needed. **Restart VS Code** after running `agentdiff init` to activate it.
297+
298+
The extension:
299+
- Detects GitHub Copilot inline completions (multi-character/multi-line insertions)
300+
- Flushes captured lines to `session.jsonl` on file save
301+
- Exposes command **"agentdiff: Capture Copilot edits for current file"** for manual capture
302+
303+
To skip Copilot setup: `agentdiff init --no-copilot`
304+
To skip Gemini/Antigravity setup: `agentdiff init --no-antigravity`
305+
306+
> **Note:** The extension uses a heuristic — insertions of ≥10 characters or multiple
307+
> lines while Copilot is active are attributed to Copilot. Short single-character
308+
> insertions are treated as manual typing.
309+
276310
## Architecture
277311

278312
```
@@ -284,13 +318,19 @@ Tagging `v*` triggers release workflow:
284318
│ ├── capture-codex.py
285319
│ ├── capture-windsurf.py
286320
│ ├── capture-opencode.py
321+
│ ├── capture-copilot.py
287322
│ ├── prepare-ledger.py
288323
│ ├── finalize-ledger.py
289324
│ ├── record-context.py
290325
│ ├── capture-antigravity.py
291326
│ └── write-note.py ← legacy notes writer (migration only)
292327
└── spillover/ ← Optional no-repo event spillover
293328
329+
~/.vscode/extensions/
330+
└── agentdiff-copilot-0.1.0/
331+
├── package.json ← VS Code extension manifest
332+
└── extension.js ← Copilot capture logic (plain JS, no build needed)
333+
294334
<repo>/.agentdiff/
295335
└── ledger.jsonl ← Canonical committed append-only attribution log
296336

0 commit comments

Comments
 (0)