@diffohq/diffo 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +13 -6
  2. package/dist/cli.mjs +2678 -310
  3. package/dist/client/assets/{abnfDiagram-O67JEVCF-vILxBZcB.js → abnfDiagram-O67JEVCF-1LPV7Bta.js} +1 -1
  4. package/dist/client/assets/{arc-KM37zfEu.js → arc-B6fobjtY.js} +1 -1
  5. package/dist/client/assets/architecture-7GRP2DOG-WcOrmKkC.js +1 -0
  6. package/dist/client/assets/{architectureDiagram-NJMV4G6O-CCe24XcA.js → architectureDiagram-NJMV4G6O-CTN0gguk.js} +1 -1
  7. package/dist/client/assets/{blockDiagram-BEXU5L5S-GL2esJ0w.js → blockDiagram-BEXU5L5S-DTR5PHKV.js} +1 -1
  8. package/dist/client/assets/{c4Diagram-YGBWAQC7-BcRujrvs.js → c4Diagram-YGBWAQC7-NGxq4JmF.js} +1 -1
  9. package/dist/client/assets/channel-DhaDDyGS.js +1 -0
  10. package/dist/client/assets/{chunk-3FUC2YCW-Gj4X9KK9.js → chunk-3FUC2YCW-DA-Lgw5Q.js} +1 -1
  11. package/dist/client/assets/{chunk-5DYCD2WN-DZs-erj_.js → chunk-5DYCD2WN-DcE0aMs7.js} +1 -1
  12. package/dist/client/assets/{chunk-742MDFTN-Db1JJZ9G.js → chunk-742MDFTN-CyTGvDWd.js} +1 -1
  13. package/dist/client/assets/{chunk-7INBJB4K-B_wqJ7Xn.js → chunk-7INBJB4K-Dd4mQ9Jx.js} +1 -1
  14. package/dist/client/assets/{chunk-7M6MHVWA-DuALBizw.js → chunk-7M6MHVWA-CTU7JU3x.js} +1 -1
  15. package/dist/client/assets/{chunk-7PRAP22T-D9QvZUm3.js → chunk-7PRAP22T-BF_GNhON.js} +1 -1
  16. package/dist/client/assets/{chunk-GTNCS2PH-JFHsSpPU.js → chunk-GTNCS2PH-Bu7kc4uW.js} +1 -1
  17. package/dist/client/assets/{chunk-GWA4HPMP-CX_60U9Y.js → chunk-GWA4HPMP-DOeikbS_.js} +1 -1
  18. package/dist/client/assets/{chunk-MBY4JIJT-BVqUStmy.js → chunk-MBY4JIJT-BMMqnoVS.js} +1 -1
  19. package/dist/client/assets/{chunk-NETBCI7D-BoSm0O5f.js → chunk-NETBCI7D-YxbfsgLs.js} +1 -1
  20. package/dist/client/assets/{chunk-O7XYJQB3-DG64mbS_.js → chunk-O7XYJQB3-B5lrUf5i.js} +1 -1
  21. package/dist/client/assets/{chunk-UA2S7LBM-BL039fcM.js → chunk-UA2S7LBM-BDaXVsL8.js} +1 -1
  22. package/dist/client/assets/{chunk-WEXAMYUT-BPFyuzbi.js → chunk-WEXAMYUT-DxlWoHYQ.js} +1 -1
  23. package/dist/client/assets/{chunk-XXDRQBXY-BzCs4oPB.js → chunk-XXDRQBXY-Cp47KzsC.js} +1 -1
  24. package/dist/client/assets/{chunk-Z7XXMR3K-D9UN9ldM.js → chunk-Z7XXMR3K-CESnPXew.js} +1 -1
  25. package/dist/client/assets/{chunk-ZIGJFQKS-D47UlTiy.js → chunk-ZIGJFQKS-CNWS7Wkq.js} +1 -1
  26. package/dist/client/assets/{classDiagram-v2-NBCMYWYE-CXeBds6Z.js → classDiagram-v2-NBCMYWYE-BceAVX_T.js} +1 -1
  27. package/dist/client/assets/{core-De6Bel6T.js → core-Br-4vljZ.js} +1 -1
  28. package/dist/client/assets/{cose-bilkent-JH36ORCC-C5C9BMn5.js → cose-bilkent-JH36ORCC-D__9SuyS.js} +1 -1
  29. package/dist/client/assets/{cynefin-OW5HDTMX-TQm3krMs.js → cynefin-OW5HDTMX-DgTdpSz6.js} +1 -1
  30. package/dist/client/assets/{cynefinDiagram-VND7K2PF-D9L1g2S1.js → cynefinDiagram-VND7K2PF-CWEqRTNF.js} +1 -1
  31. package/dist/client/assets/{dagre-6A5THRUB-D9iVd0tg.js → dagre-6A5THRUB-B3HGDOgj.js} +1 -1
  32. package/dist/client/assets/{diagram-22UHCM2B-CD_1yZgj.js → diagram-22UHCM2B-Ce04XJcX.js} +1 -1
  33. package/dist/client/assets/{diagram-3UASUU5V-BLiXkub3.js → diagram-3UASUU5V-Bp5Chgzw.js} +1 -1
  34. package/dist/client/assets/{diagram-ATOU4E4O-CnXY0tjf.js → diagram-ATOU4E4O-BmKaDuB5.js} +1 -1
  35. package/dist/client/assets/{diagram-CDSNMT55-BBnDsrf_.js → diagram-CDSNMT55-DrSDVwyB.js} +1 -1
  36. package/dist/client/assets/{diagram-MLGK6HIB-BUiu4OKD.js → diagram-MLGK6HIB-8AyH2eMG.js} +1 -1
  37. package/dist/client/assets/{diagram-MPIPVDR6-DiI9FWeO.js → diagram-MPIPVDR6-C9AcuOld.js} +1 -1
  38. package/dist/client/assets/{dist-Co85aeoI.js → dist-CVtr89jj.js} +1 -1
  39. package/dist/client/assets/{dist-BWYGCgdo.js → dist-Cdc7REqJ.js} +1 -1
  40. package/dist/client/assets/{ebnfDiagram-ZINNZB2B-Bg_BLedv.js → ebnfDiagram-ZINNZB2B-DX6ekwEH.js} +1 -1
  41. package/dist/client/assets/{elk-276RUBZZ-BO7Zoa7U.js → elk-276RUBZZ-Cm9uWHa7.js} +1 -1
  42. package/dist/client/assets/{engine-oniguruma-DCFwTJLE.js → engine-oniguruma-DbGd6VkA.js} +1 -1
  43. package/dist/client/assets/{erDiagram-OPXOYQCR-DjBak3Ld.js → erDiagram-OPXOYQCR-CaUHiYv4.js} +1 -1
  44. package/dist/client/assets/eventmodeling-NTZA5JFV-n7NgJYAj.js +1 -0
  45. package/dist/client/assets/flowDiagram-KWPJA3E3-B-DNn9sz.js +1 -0
  46. package/dist/client/assets/{ganttDiagram-FUAMR5RP-CEn0Np5L.js → ganttDiagram-FUAMR5RP-DL6UN0sq.js} +1 -1
  47. package/dist/client/assets/{gitGraph-4MIJSDKK-DVMdaaG2.js → gitGraph-4MIJSDKK-CsKV1QJN.js} +1 -1
  48. package/dist/client/assets/{gitGraphDiagram-X574FWY7-B6ZkiY7u.js → gitGraphDiagram-X574FWY7-D8Snpa_F.js} +1 -1
  49. package/dist/client/assets/index-CE0LasmM.css +1 -0
  50. package/dist/client/assets/index-CEiheKtN.js +91 -0
  51. package/dist/client/assets/{info-A6RAGUB7-Idt2RahI.js → info-A6RAGUB7-BxOCsCG2.js} +1 -1
  52. package/dist/client/assets/{infoDiagram-VRGFBTTK-CA8T3csq.js → infoDiagram-VRGFBTTK-CfW5lEnk.js} +1 -1
  53. package/dist/client/assets/{ishikawaDiagram-OU5B5YK6-DcgLwVJX.js → ishikawaDiagram-OU5B5YK6-B4gbggT_.js} +1 -1
  54. package/dist/client/assets/{journeyDiagram-ZHPQQLJL-_AVEW5aE.js → journeyDiagram-ZHPQQLJL-IWmYxrcn.js} +1 -1
  55. package/dist/client/assets/{kanban-definition-PNTS6WVX-CZ2gNo-B.js → kanban-definition-PNTS6WVX-CbaKE2PB.js} +1 -1
  56. package/dist/client/assets/{line-CHew3ngr.js → line-BtA026Ya.js} +1 -1
  57. package/dist/client/assets/{linear-Baz1Hb3u.js → linear-B5Crnel0.js} +1 -1
  58. package/dist/client/assets/{mermaid-parser.core-D2BrkwRE.js → mermaid-parser.core-BPmT-0j3.js} +3 -3
  59. package/dist/client/assets/{mermaid.core-CCFlYVgY.js → mermaid.core-BTblV3B-.js} +4 -4
  60. package/dist/client/assets/{mindmap-definition-NLK3R4M7-BXG9w5sC.js → mindmap-definition-NLK3R4M7-CIB2jRud.js} +1 -1
  61. package/dist/client/assets/{packet-AYTQ26CC-BOvg32Rh.js → packet-AYTQ26CC-BWwlCBfL.js} +1 -1
  62. package/dist/client/assets/{pegDiagram-GJSIUBJH-COukdq7o.js → pegDiagram-GJSIUBJH-DhOZCJeC.js} +1 -1
  63. package/dist/client/assets/{pie-WAS4IAKB-ChHsdIQV.js → pie-WAS4IAKB-BYPEomkb.js} +1 -1
  64. package/dist/client/assets/{pieDiagram-5QR66LMP-Deng5oun.js → pieDiagram-5QR66LMP-BPMuMrQa.js} +1 -1
  65. package/dist/client/assets/{quadrantDiagram-O4NWA36T-DmEJ83mR.js → quadrantDiagram-O4NWA36T-CNiAZ4Fx.js} +1 -1
  66. package/dist/client/assets/{radar-RG4KPBEZ-YxcXBiXc.js → radar-RG4KPBEZ-D4cJCxoB.js} +1 -1
  67. package/dist/client/assets/{railroad-74A4TZTK-RkYX7A2D.js → railroad-74A4TZTK-GypTiD9-.js} +1 -1
  68. package/dist/client/assets/railroad-abnf-HS5TGJTU-CJCTFtWl.js +1 -0
  69. package/dist/client/assets/railroad-ebnf-LZEXJU2U-DEndv2ed.js +1 -0
  70. package/dist/client/assets/railroad-peg-WCYAUIDC-BJQI82cq.js +1 -0
  71. package/dist/client/assets/{railroadDiagram-XR7U4H2S-uj5HQbYy.js → railroadDiagram-XR7U4H2S-C9onf3MB.js} +1 -1
  72. package/dist/client/assets/{requirementDiagram-PLB6GJNP-C_QtkIlI.js → requirementDiagram-PLB6GJNP-BAtMHH1O.js} +1 -1
  73. package/dist/client/assets/{sankeyDiagram-IPEJSGJF-BfxM5TKv.js → sankeyDiagram-IPEJSGJF-ByIBebPb.js} +1 -1
  74. package/dist/client/assets/{sequenceDiagram-PO4LG4MO-DXflg1u_.js → sequenceDiagram-PO4LG4MO-CZWeGbVd.js} +1 -1
  75. package/dist/client/assets/{src-YTrwJCk8.js → src-3ZsKiqdK.js} +1 -1
  76. package/dist/client/assets/{stateDiagram-v2-GCMORJYK-BjDmED1Q.js → stateDiagram-v2-GCMORJYK-BLS3Ppqp.js} +1 -1
  77. package/dist/client/assets/{swimlanes-2SLR337P-BAvnQ6KT.js → swimlanes-2SLR337P-VfJv1Azt.js} +1 -1
  78. package/dist/client/assets/swimlanesDiagram-TC7HE7FX-CsAstSgi.js +8 -0
  79. package/dist/client/assets/{timeline-definition-EJHVYXUP-BYemcgr1.js → timeline-definition-EJHVYXUP-CFsTCeFJ.js} +1 -1
  80. package/dist/client/assets/{treeView-Q6P3EWNA-CsuBtqLq.js → treeView-Q6P3EWNA-BcU2cd9W.js} +1 -1
  81. package/dist/client/assets/{treemap-WGGIJYW6-DUk1Z6g4.js → treemap-WGGIJYW6-BKWQgOsJ.js} +1 -1
  82. package/dist/client/assets/{usecaseDiagram-POWQR4AR-j1nHXvyL.js → usecaseDiagram-POWQR4AR-CaDVH5UF.js} +1 -1
  83. package/dist/client/assets/{vennDiagram-UO4OBE2U-B5eUL-dD.js → vennDiagram-UO4OBE2U-BD60NU6D.js} +1 -1
  84. package/dist/client/assets/{wardley-WFR3VGLG-1YjpwPJM.js → wardley-WFR3VGLG-CGRKLXxQ.js} +1 -1
  85. package/dist/client/assets/{wardleyDiagram-VNRHLVJA-C7laBq5A.js → wardleyDiagram-VNRHLVJA-BNSajOpz.js} +1 -1
  86. package/dist/client/assets/{xychartDiagram-PMCCYNJV-BkYPx-ts.js → xychartDiagram-PMCCYNJV-Bw7XhF-N.js} +1 -1
  87. package/dist/client/index.html +2 -2
  88. package/package.json +1 -1
  89. package/plugin.json +1 -1
  90. package/skills/diffo/SKILL.md +7 -4
  91. package/dist/client/assets/architecture-7GRP2DOG-DzlmD0Wj.js +0 -1
  92. package/dist/client/assets/channel-BffjfVqs.js +0 -1
  93. package/dist/client/assets/eventmodeling-NTZA5JFV-BA4dpxhq.js +0 -1
  94. package/dist/client/assets/flowDiagram-KWPJA3E3-BXSGu0Q5.js +0 -1
  95. package/dist/client/assets/index-6w3rS9cw.js +0 -91
  96. package/dist/client/assets/index-D934d4yh.css +0 -1
  97. package/dist/client/assets/railroad-abnf-HS5TGJTU-CYF7Z2Wu.js +0 -1
  98. package/dist/client/assets/railroad-ebnf-LZEXJU2U-CqV11tet.js +0 -1
  99. package/dist/client/assets/railroad-peg-WCYAUIDC-CPusJj6I.js +0 -1
  100. package/dist/client/assets/swimlanesDiagram-TC7HE7FX-CbFPwcec.js +0 -8
package/README.md CHANGED
@@ -32,9 +32,9 @@ come back as fixes.
32
32
  <!-- Light-theme only. The clip opens once the session has finished writing the change:
33
33
  waiting on the agent is fast-forwarded — the badge in the session's corner says so
34
34
  while it runs — and nothing else is cut. -->
35
- <img alt="One take of the whole loop. A Claude Code session has just written natural-language due dates into a todo app; the reviewer types /diffo, and the session opens a live review and hands over its localhost URL, which opens beside the session. The reviewer leaves a question on the weekday line — a bare weekday always lands next week, should it mean today? — and the agent's answer appears in the thread while they watch." src="docs/assets/loop.gif" width="100%">
35
+ <img alt="One take of the whole loop. A Claude Code session has just written natural-language due dates into a todo app; the reviewer types /diffo, and the session opens a live review and hands over its localhost URL, which opens beside the session. The reviewer leaves a question on the weekday line (a bare weekday always lands next week, should it mean today?) and the agent's answer appears in the thread while they watch." src="docs/assets/loop.gif" width="100%">
36
36
 
37
- <p align="center"><sub>The whole loop in one take: type <code>/diffo</code>, read the diff, ask on the line — and the answer comes back in the thread. Left is a real Claude Code session, right is the real review it opened. Nothing here is a mock-up; the only edit is that waiting on the agent runs fast.</sub></p>
37
+ <p align="center"><sub>The whole loop in one take: type <code>/diffo</code>, read the diff, ask on the line, and the answer comes back in the thread. Left is a real Claude Code session, right is the real review it opened. Nothing here is a mock-up; the only edit is that waiting on the agent runs fast.</sub></p>
38
38
 
39
39
  ---
40
40
 
@@ -192,6 +192,11 @@ So they stack rather than compete: iterate here until the diff reads clean, then
192
192
  pull request you actually want reviewed. Your judgement is the scarce resource, and this is
193
193
  the stage where spending it changes the outcome.
194
194
 
195
+ And when a pull request lands on *your* desk, Diffo reads that too: `/diffo <PR link>`
196
+ opens it in a worktree of its own, imports its conversation, puts your agent beside you as
197
+ a copilot for code it did not write, and submits your review to GitHub when you finish.
198
+ [Reviewing a pull request](https://diffohq.github.io/diffo/guide/pr-review) has the loop.
199
+
195
200
  ---
196
201
 
197
202
  ## How it works
@@ -231,7 +236,8 @@ cheapest to change.
231
236
  TypeScript on Node >= 24: a [Hono](https://hono.dev) server over loopback serving a React 19
232
237
  UI, live updates over server-sent events from one recursive filesystem watch, and state in a
233
238
  single SQLite file at `~/.diffo/diffo.db` through the runtime's built-in `node:sqlite`, so
234
- there is no database to install. **Zero network calls.** 1,143 tests across 63 files.
239
+ there is no database to install. **No network calls of its own**: a pull request review
240
+ talks to GitHub only through your `gh`. 1,307 tests across 70 files.
235
241
 
236
242
  Reviews are scoped per repo **and branch**, and the server is loopback-only, rejecting
237
243
  non-loopback `Host` and `Origin` headers so a web page can't reach into your repo through
@@ -266,14 +272,15 @@ we commit to: **anything that runs on your machine for one reviewer is core.**
266
272
 
267
273
  ## Status
268
274
 
269
- Diffo is pre-1.0: the loop below works end to end — this repo is reviewed with it
270
- daily — and the edges are still moving. What works today:
275
+ Diffo is pre-1.0: the loop below works end to end (this repo is reviewed with it
276
+ daily) and the edges are still moving. What works today:
271
277
 
272
278
  - [x] [Live review of any changeset](https://diffohq.github.io/diffo/guide/how-it-works): the working tree, or anything since `--base`.
273
279
  - [x] [The comment loop](https://diffohq.github.io/diffo/guide/the-loop): threads that reach the session that wrote the code.
274
280
  - [x] [Layers](https://diffohq.github.io/diffo/guide/the-loop#read-it-in-layers): the agent's reading plan, one ordered step at a time.
275
281
  - [x] [One setup, every agent](https://diffohq.github.io/diffo/guide/getting-started): Claude Code, Codex, Cursor, VS Code, Copilot CLI, Gemini CLI, Amp, Goose, OpenCode.
276
282
  - [x] [Reading tools](https://diffohq.github.io/diffo/reference/keyboard-shortcuts): unified and split diffs, word-level marks, coverage tracking.
283
+ - [x] [Pull request review](https://diffohq.github.io/diffo/guide/pr-review): `diffo <PR URL>` reviews a GitHub PR in a worktree of its own, with the conversation imported and your review submitted from Diffo.
277
284
 
278
285
  ## Contributing
279
286
 
@@ -286,7 +293,7 @@ pnpm typecheck && pnpm test && pnpm build && pnpm lint && pnpm docs:build
286
293
  Local development is `pnpm dev` (server and client together). One hard rule:
287
294
  **`skills/diffo/SKILL.md` is generated.** Edit [`src/skill.ts`](src/skill.ts) and run
288
295
  `pnpm build:skill`; a test fails if the committed file drifts. That rewrites the repo
289
- file, not the skill your own agent runs — `pnpm dev:skill --global` installs a separate
296
+ file, not the skill your own agent runs; `pnpm dev:skill --global` installs a separate
290
297
  `/diffo-dev` that drives your checkout, alongside the shipped `/diffo`.
291
298
 
292
299
  Details in [CONTRIBUTING.md](CONTRIBUTING.md), plus a [Code of Conduct](CODE_OF_CONDUCT.md)