@diffohq/diffo 0.0.1

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 (152) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +300 -0
  4. package/dist/cli.mjs +4553 -0
  5. package/dist/client/assets/abnfDiagram-VCTEODGH--nG4YFZf.js +1 -0
  6. package/dist/client/assets/arc-DUDGa5yC.js +1 -0
  7. package/dist/client/assets/architecture-7GRP2DOG-BS3omA-i.js +1 -0
  8. package/dist/client/assets/architectureDiagram-5GKGNRK7-DvSKG4lO.js +36 -0
  9. package/dist/client/assets/array-BifhSqXX.js +1 -0
  10. package/dist/client/assets/blockDiagram-NRAW4CY4-t9YA0Zds.js +129 -0
  11. package/dist/client/assets/c-DWGmR78Y.js +1 -0
  12. package/dist/client/assets/c-SSSlmE39.js +1 -0
  13. package/dist/client/assets/c4Diagram-UCG6FXSJ-D0NJEiQf.js +38 -0
  14. package/dist/client/assets/channel-C2N97jf-.js +1 -0
  15. package/dist/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  16. package/dist/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  17. package/dist/client/assets/chunk-75Z2AOVW-Bai5ank7.js +2 -0
  18. package/dist/client/assets/chunk-DU6HZSFF-D2kJr6Sd.js +125 -0
  19. package/dist/client/assets/chunk-F27PBJKO-Bfqt90G-.js +1 -0
  20. package/dist/client/assets/chunk-FOHPRMQF-DHwB1DNv.js +161 -0
  21. package/dist/client/assets/chunk-G27WJ6UU-BaH77Llj.js +231 -0
  22. package/dist/client/assets/chunk-GMAD6QVW-DEk8GHWm.js +72 -0
  23. package/dist/client/assets/chunk-JQ64N6SF-DSC3eBmu.js +1 -0
  24. package/dist/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  25. package/dist/client/assets/chunk-LCL6LL3I-CbXTQnS7.js +206 -0
  26. package/dist/client/assets/chunk-OBVCFTLP-DTR5L5DZ.js +1 -0
  27. package/dist/client/assets/chunk-P2QGCYS3-B4CbyKz8.js +1 -0
  28. package/dist/client/assets/chunk-POPQ4Y6H-bUwnKEA6.js +1 -0
  29. package/dist/client/assets/chunk-PWAF6VOD-zdMmz14g.js +1 -0
  30. package/dist/client/assets/chunk-R7TYR2AO-Bij6COIm.js +10 -0
  31. package/dist/client/assets/chunk-RHFEMEQ7-B2_qXJHf.js +168 -0
  32. package/dist/client/assets/chunk-SVP7TREG-2A6DuC2c.js +88 -0
  33. package/dist/client/assets/chunk-TEH6E4GO-ByR-u0fj.js +62 -0
  34. package/dist/client/assets/chunk-XXDRQBXY-D_O-C3As.js +1 -0
  35. package/dist/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  36. package/dist/client/assets/classDiagram-DTDB5LWJ-DkiwiYZN.js +1 -0
  37. package/dist/client/assets/classDiagram-v2-JRS7N3AN-DkiwiYZN.js +1 -0
  38. package/dist/client/assets/core-Bnn4HFdG.js +12 -0
  39. package/dist/client/assets/cose-bilkent-JH36ORCC-Z148C14w.js +1 -0
  40. package/dist/client/assets/cpp-CJIxL8VH.js +1 -0
  41. package/dist/client/assets/cpp-Cts1PyIS.js +1 -0
  42. package/dist/client/assets/csharp-oqKa8noW.js +1 -0
  43. package/dist/client/assets/css-CdtkT07m.js +1 -0
  44. package/dist/client/assets/css-LbU1hoFO.js +1 -0
  45. package/dist/client/assets/cynefin-OW5HDTMX-_nvdHJ_6.js +1 -0
  46. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-DgjK3dBx.js +62 -0
  47. package/dist/client/assets/cytoscape.esm-C2x7inlt.js +321 -0
  48. package/dist/client/assets/dagre-3AP2YEHR-ZpUDL3As.js +4 -0
  49. package/dist/client/assets/dagre-PrKaheQc.js +1 -0
  50. package/dist/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  51. package/dist/client/assets/diagram-S7CK7UJ4-CkZIS9iX.js +30 -0
  52. package/dist/client/assets/diagram-UQ7AKVKN-CQ18pzfD.js +41 -0
  53. package/dist/client/assets/diagram-VSXAHHWV-BHksZhNT.js +3 -0
  54. package/dist/client/assets/diagram-VX7I27RA-JaMo95UB.js +24 -0
  55. package/dist/client/assets/diagram-Z3DM3KII-BtbUi7Zp.js +24 -0
  56. package/dist/client/assets/dist-frF0Fo17.js +1 -0
  57. package/dist/client/assets/docker-IyjqRm3v.js +1 -0
  58. package/dist/client/assets/ebnfDiagram-PWID7BFC-CrkTnETC.js +1 -0
  59. package/dist/client/assets/engine-oniguruma-BDMkTjCm.js +1 -0
  60. package/dist/client/assets/erDiagram-SSCWMZ5O-BU_DeMcX.js +99 -0
  61. package/dist/client/assets/eventmodeling-NTZA5JFV-C6iBQfJc.js +1 -0
  62. package/dist/client/assets/flowDiagram-A5DVABFB-Dq3MklmQ.js +1 -0
  63. package/dist/client/assets/ganttDiagram-EL5Y4UJY-DCoVu2Ob.js +292 -0
  64. package/dist/client/assets/gitGraph-4MIJSDKK-D_vOLjJd.js +1 -0
  65. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CbJeUVdZ.js +106 -0
  66. package/dist/client/assets/github-dark-C-LZuMrd.js +1 -0
  67. package/dist/client/assets/github-light-EUqPIrTm.js +1 -0
  68. package/dist/client/assets/go-rLFTqkRN.js +1 -0
  69. package/dist/client/assets/graphlib-DS17s2tU.js +1 -0
  70. package/dist/client/assets/html-BcACZWSP.js +1 -0
  71. package/dist/client/assets/html-DDNsd9lV.js +1 -0
  72. package/dist/client/assets/index-DUY5AD4r.js +90 -0
  73. package/dist/client/assets/index-pWZ6lr0e.css +1 -0
  74. package/dist/client/assets/info-A6RAGUB7-CRcr_2Kl.js +1 -0
  75. package/dist/client/assets/infoDiagram-RXCK75RN-B4UffpYj.js +2 -0
  76. package/dist/client/assets/init-C-OQMol4.js +1 -0
  77. package/dist/client/assets/ishikawaDiagram-5VMMS53U-DO6STczE.js +70 -0
  78. package/dist/client/assets/java-BtIQNnN0.js +1 -0
  79. package/dist/client/assets/java-DxlWrXwe.js +1 -0
  80. package/dist/client/assets/javascript-BzbQS41l.js +1 -0
  81. package/dist/client/assets/javascript-Yelw-5ZN.js +1 -0
  82. package/dist/client/assets/journeyDiagram-EYS64GPL-CJqu4rjo.js +139 -0
  83. package/dist/client/assets/json-B88Oqtu5.js +1 -0
  84. package/dist/client/assets/json-CaljABEy.js +1 -0
  85. package/dist/client/assets/jsx-D3KKoC5L.js +1 -0
  86. package/dist/client/assets/jsx-hEbJ82HF.js +1 -0
  87. package/dist/client/assets/kanban-definition-3QL26DDD-ugjVwpzB.js +89 -0
  88. package/dist/client/assets/katex-CXMH3UgJ.js +257 -0
  89. package/dist/client/assets/kotlin-DhhofPvG.js +1 -0
  90. package/dist/client/assets/line-C42aEa5T.js +1 -0
  91. package/dist/client/assets/linear-CAfNWogY.js +1 -0
  92. package/dist/client/assets/markdown-BYOwaDjH.js +1 -0
  93. package/dist/client/assets/mermaid-parser.core-DIpynd7a.js +7 -0
  94. package/dist/client/assets/mermaid.core-b7ipG6MC.js +44 -0
  95. package/dist/client/assets/mindmap-definition-FBJOCRG2-Btow11vP.js +96 -0
  96. package/dist/client/assets/ordinal-BDEzSJ7C.js +1 -0
  97. package/dist/client/assets/packet-AYTQ26CC-DmMiSJ_n.js +1 -0
  98. package/dist/client/assets/path-fybaL0A-.js +1 -0
  99. package/dist/client/assets/pegDiagram-XKGWAZYB-ZE6QXs-N.js +1 -0
  100. package/dist/client/assets/php-CQT4wx5i.js +1 -0
  101. package/dist/client/assets/pie-WAS4IAKB-CWO1GXQk.js +1 -0
  102. package/dist/client/assets/pieDiagram-E7YTZNPT-CkYClGbv.js +39 -0
  103. package/dist/client/assets/python-gzcpVVnB.js +1 -0
  104. package/dist/client/assets/quadrantDiagram-AXDQQJYC-CLah-4Vu.js +7 -0
  105. package/dist/client/assets/radar-RG4KPBEZ-VI14cwZd.js +1 -0
  106. package/dist/client/assets/railroad-74A4TZTK-s1iFKSLC.js +1 -0
  107. package/dist/client/assets/railroad-abnf-HS5TGJTU-DCYBjW-8.js +1 -0
  108. package/dist/client/assets/railroad-ebnf-LZEXJU2U-Cpg28CUR.js +1 -0
  109. package/dist/client/assets/railroad-peg-WCYAUIDC-D3OHUWgZ.js +1 -0
  110. package/dist/client/assets/railroadDiagram-O6MQD6OU-DSEEuZLE.js +1 -0
  111. package/dist/client/assets/requirementDiagram-EFPCY7ZU-DKPeLCXy.js +84 -0
  112. package/dist/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  113. package/dist/client/assets/ruby-D_UtGFHI.js +1 -0
  114. package/dist/client/assets/rust-Cfkwpbl8.js +1 -0
  115. package/dist/client/assets/sankeyDiagram-P5KCCOFB-CoRGTY0Z.js +40 -0
  116. package/dist/client/assets/scss-DHtrkMkT.js +1 -0
  117. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-vOT2DQAD.js +162 -0
  118. package/dist/client/assets/shellscript-BiGZg9Om.js +1 -0
  119. package/dist/client/assets/shellscript-CqHdAlCp.js +1 -0
  120. package/dist/client/assets/sizeCapture-X5ZJPWSS-B0uUizjq.js +1 -0
  121. package/dist/client/assets/sql-0Qcw9ht3.js +1 -0
  122. package/dist/client/assets/sql-CP0rg-5b.js +1 -0
  123. package/dist/client/assets/src-COpTHlse.js +1 -0
  124. package/dist/client/assets/stateDiagram-HBIQ2CUA-B1Q5gx1k.js +1 -0
  125. package/dist/client/assets/stateDiagram-v2-4QOOHH4V-Bq1OmWqW.js +1 -0
  126. package/dist/client/assets/svelte-BUVJxsYv.js +1 -0
  127. package/dist/client/assets/swift-CyEgAFGc.js +1 -0
  128. package/dist/client/assets/swimlanes-XN3QIQJK-BHsSTPP_.js +1 -0
  129. package/dist/client/assets/swimlanesDiagram-VK2B7HYN-DACxnx54.js +8 -0
  130. package/dist/client/assets/timeline-definition-24CTP7MA-gMAK8Huz.js +120 -0
  131. package/dist/client/assets/toml-CcmNWLt0.js +1 -0
  132. package/dist/client/assets/treeView-Q6P3EWNA-D_ac7x_f.js +1 -0
  133. package/dist/client/assets/treemap-WGGIJYW6-CmKDF5Bk.js +1 -0
  134. package/dist/client/assets/tsx-5f3ulCja.js +1 -0
  135. package/dist/client/assets/tsx-BOvsFOI6.js +1 -0
  136. package/dist/client/assets/typescript-Utq2Cl8c.js +1 -0
  137. package/dist/client/assets/typescript-j_1H8WHN.js +1 -0
  138. package/dist/client/assets/vennDiagram-4TSXK5OY-BwoJOmDU.js +34 -0
  139. package/dist/client/assets/vue-CSBlZ1UP.js +1 -0
  140. package/dist/client/assets/wardley-WFR3VGLG-DBwnOUBJ.js +1 -0
  141. package/dist/client/assets/wardleyDiagram-VM6X3IG4-DSpTGNPm.js +78 -0
  142. package/dist/client/assets/wasm-BnjxR4X6.js +1 -0
  143. package/dist/client/assets/xml-CoDIzWF0.js +1 -0
  144. package/dist/client/assets/xml-WY0zc4PG.js +1 -0
  145. package/dist/client/assets/xychartDiagram-S5SC5T6Z-I-7pacDu.js +7 -0
  146. package/dist/client/assets/yaml-CxbubiML.js +1 -0
  147. package/dist/client/assets/yaml-DijMHRDA.js +1 -0
  148. package/dist/client/favicon.svg +27 -0
  149. package/dist/client/index.html +16 -0
  150. package/package.json +81 -0
  151. package/plugin.json +14 -0
  152. package/skills/diffo/SKILL.md +163 -0
package/LICENSE ADDED
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright 2026 Diffo
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
package/NOTICE ADDED
@@ -0,0 +1,5 @@
1
+ Diffo
2
+ Copyright 2026 Diffo
3
+
4
+ This product includes software developed as part of the Diffo project
5
+ (https://github.com/DiffoHQ/diffo).
package/README.md ADDED
@@ -0,0 +1,300 @@
1
+ > [!IMPORTANT]
2
+ > **Diffo is pre-release.** The loop works end to end and this repo is reviewed with it
3
+ > daily. The skill installs from this repository; the CLI it runs comes from npm as
4
+ > **`@diffohq/diffo`** — scoped because the bare `diffo` name belongs to an unrelated
5
+ > package. See [Status](#status) for what works today.
6
+
7
+ <div align="center">
8
+
9
+ <a href="https://diffohq.github.io/diffo/">
10
+ <picture>
11
+ <source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.svg">
12
+ <img src="assets/logo.svg" alt="Diffo" width="76" height="76">
13
+ </picture>
14
+ </a>
15
+
16
+ # Diffo
17
+
18
+ ### The human way to review agent-written code.
19
+
20
+ A live review on your machine, wired to the agent that wrote the code, so your comments
21
+ come back as fixes.
22
+
23
+ [Quick start](#quick-start) · [Why Diffo](#why-diffo) · [Docs](#docs) · [Status](#status) · [Contributing](#contributing)
24
+
25
+ [![CI](https://img.shields.io/github/actions/workflow/status/DiffoHQ/diffo/ci.yml?branch=main&label=CI)](https://github.com/DiffoHQ/diffo/actions/workflows/ci.yml)
26
+ [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)
27
+ [![Node](https://img.shields.io/badge/node-%E2%89%A5%2024-brightgreen)](#quick-start)
28
+ [![Docs](https://img.shields.io/badge/docs-diffo-8b5cf6)](https://diffohq.github.io/diffo/)
29
+ [![Status](https://img.shields.io/badge/status-pre--release-orange)](#status)
30
+
31
+ </div>
32
+
33
+ <!-- Every clip here is a real recording: a real Claude Code session, a real server, and a
34
+ real changeset under review. The hero reviews a small demo app, so the diff reads at a
35
+ glance; the clips further down and in the tutorial review this repo's own changesets. -->
36
+
37
+ <!-- Light-theme only. The clip opens once the session has finished writing the change:
38
+ waiting on the agent is fast-forwarded — the badge in the session's corner says so
39
+ while it runs — and nothing else is cut. -->
40
+ <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%">
41
+
42
+ <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>
43
+
44
+ ---
45
+
46
+ ## Quick start
47
+
48
+ Requires **Node >= 24** and **git**.
49
+
50
+ **Have your agent set it up.** Paste this into Claude Code, Cursor, Codex, or whichever
51
+ agent you already use:
52
+
53
+ ```text
54
+ Run `npx skills add DiffoHQ/diffo --skill diffo -g` and open the diffo review
55
+ ```
56
+
57
+ **Or install the skill yourself:**
58
+
59
+ ```bash
60
+ npx skills add DiffoHQ/diffo --skill diffo -g
61
+ ```
62
+
63
+ Either way, that's the whole install. Then, in any session, say:
64
+
65
+ > **"let's review that"**, or just **`/diffo`**
66
+
67
+ The agent opens a live review of its own work and hands you the URL. Your comments arrive
68
+ in its context, its replies land inline in your threads, and its fixes update the diff
69
+ while you read. That is the clip above, with no URL to ask for.
70
+
71
+ <details>
72
+ <summary><b>Running from a clone instead</b></summary>
73
+
74
+ <br>
75
+
76
+ You can also run the CLI straight out of a checkout, which is what contributors do:
77
+
78
+ ```bash
79
+ git clone https://github.com/DiffoHQ/diffo.git && cd diffo
80
+ pnpm install && pnpm build
81
+ node dist/cli.mjs setup # or `node dist/cli.mjs` from any repo to review it
82
+ ```
83
+
84
+ </details>
85
+
86
+ New here? [**Your first review, end to end**](docs/tutorial.md) takes about five minutes.
87
+
88
+ ## Why Diffo
89
+
90
+ **We write code with an LLM. We review it alone.**
91
+
92
+ Writing became a conversation: you and the model in the same window, trading context until
93
+ the thing is right. Reviewing never did. The code lands, the conversation ends, and you go
94
+ read four hundred lines by yourself, in a viewer built for a world where whoever wrote it
95
+ had already moved on.
96
+
97
+ Diffo keeps the conversation open through the review. Ask what a hunk does and the agent
98
+ that wrote it answers in the thread. Ask why, and it explains, with a diagram when the
99
+ shape needs one. Ask for a change and it makes it, and the diff updates while you read.
100
+ The judgement stays yours. You just stop reading alone.
101
+
102
+ <picture>
103
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/hero-dark.gif">
104
+ <img alt="Two windows side by side. The reviewer asks for a change on a line of src/cli.ts; the real Claude Code session on the left makes the edit, and the diff on the right updates while they watch." src="docs/assets/hero.gif" width="100%">
105
+ </picture>
106
+
107
+ <p align="center"><sub>Ask for a change and the agent makes it. The diff updates under you, and the file count falls as those files stop differing.</sub></p>
108
+
109
+ ## What you get
110
+
111
+ <table>
112
+ <tr>
113
+ <td width="50%">
114
+
115
+ **A thread is a decision**
116
+
117
+ Each comment is one small call: change this, explain that, leave it alone. Mark it a Change
118
+ or a Question and the agent is told which. The review is the sum of those decisions, not a
119
+ verdict at the end.
120
+
121
+ </td>
122
+ <td width="50%">
123
+
124
+ **Reading, not scrolling**
125
+
126
+ Syntax-highlighted unified and split diffs, word-level marks, keyboard-first movement,
127
+ context expansion, images side by side, lockfiles collapsed. The conventions are GitHub's,
128
+ deliberately: a reviewer shouldn't have to learn a new diff.
129
+
130
+ </td>
131
+ </tr>
132
+ <tr>
133
+ <td width="50%">
134
+
135
+ **Live while you iterate**
136
+
137
+ Fixes land in the diff you are already reading. A hunk you had marked read says *changed
138
+ since you read it* once it's edited, so the second pass stays honest.
139
+
140
+ </td>
141
+ <td width="50%">
142
+
143
+ **Local**
144
+
145
+ One process on your machine, bound to loopback. No account, no telemetry, no cloud, and
146
+ nothing to configure.
147
+
148
+ </td>
149
+ </tr>
150
+ <tr>
151
+ <td colspan="2">
152
+
153
+ **It explains itself**
154
+
155
+ On a change that's multi-file, structural, or just subtle, the agent opens the review with
156
+ one orienting comment: a sentence on what the change does, plus a small
157
+ [mermaid](https://mermaid.js.org) diagram when the shape is easier to see than to read. It
158
+ orients, and it never pre-reviews: no verdicts, nothing is "fine". That judgement is the
159
+ part it doesn't get to make.
160
+
161
+ </td>
162
+ </tr>
163
+ </table>
164
+
165
+ ## Where it fits
166
+
167
+ Diffo doesn't replace pull request review, and it isn't trying to. A pull request is how you
168
+ hand finished work to someone else. Diffo is the step before that: the loop where you and the
169
+ agent turn a first draft into something worth another person's time.
170
+
171
+ | | **Diffo** | Pull request review | AI reviewer bot |
172
+ | --- | --- | --- | --- |
173
+ | When | **before the PR exists** | after you push | after you push |
174
+ | What it's for | **getting the code right** | getting it approved | catching the obvious |
175
+ | Who you work with | **the agent that wrote it** | your teammates | nobody |
176
+ | Where the code is | **uncommitted, on your disk** | pushed to a branch | pushed to a branch |
177
+ | What comes out | **code worth pushing** | an approval and a record | a list of comments |
178
+
179
+ So they stack rather than compete: iterate here until the diff reads clean, then open the
180
+ pull request you actually want reviewed. Your judgement is the scarce resource, and this is
181
+ the stage where spending it changes the outcome.
182
+
183
+ ---
184
+
185
+ ## How it works
186
+
187
+ <picture>
188
+ <source media="(prefers-color-scheme: dark)" srcset="assets/how-it-works-dark.svg">
189
+ <img alt="Diffo's architecture: your agent writes the code and opens the review; a local Diffo server watches the changeset and serves it to your browser; your comments and Finish review return to the agent through diffo poll, and its answers and fixes land back in the review live." src="assets/how-it-works-light.svg" width="100%">
190
+ </picture>
191
+
192
+ The left half is a diff viewer. The right half is what Diffo is for: your comment doesn't
193
+ land in a queue for later, it lands in **the conversation that wrote the code**, while that
194
+ conversation still remembers why. Nothing needs to be committed, pushed, or opened as a PR
195
+ first, so agent output is reviewable the moment it hits the disk, which is the moment it's
196
+ cheapest to change.
197
+
198
+ | You want to review | Command |
199
+ | --- | --- |
200
+ | Uncommitted work in progress (the default) | `diffo` |
201
+ | Everything since you branched off `main` | `diffo --base main` |
202
+ | A pull request | *not supported yet* |
203
+
204
+ ## Docs
205
+
206
+ | | |
207
+ | --- | --- |
208
+ | [**Your first review**](docs/tutorial.md) | The whole loop end to end, about five minutes |
209
+ | [**Getting started**](docs/guide/getting-started.md) | Install, and where each agent gets wired |
210
+ | [**The review loop**](docs/guide/the-loop.md) | Reading, commenting, and what the agent receives |
211
+ | [**How it works**](docs/guide/how-it-works.md) | The components and the server lifecycle |
212
+ | [**The agent side**](docs/agents.md) | The agent protocol: every command, every payload |
213
+ | [**Architecture**](docs/architecture.md) | Diff pipeline, delivery queue, SQLite state |
214
+ | [**CLI**](docs/reference/cli.md) and [**Keyboard shortcuts**](docs/reference/keyboard-shortcuts.md) | Reference |
215
+ | [**FAQ**](docs/faq.md) | The short answers |
216
+
217
+ ## Under the hood
218
+
219
+ TypeScript on Node >= 24: a [Hono](https://hono.dev) server over loopback serving a React 19
220
+ UI, live updates over server-sent events from one recursive filesystem watch, and state in a
221
+ single SQLite file at `~/.diffo/diffo.db` through the runtime's built-in `node:sqlite`, so
222
+ there is no database to install. **Zero network calls.** 859 tests across 54 files.
223
+
224
+ Reviews are scoped per repo **and branch**, and the server is loopback-only, rejecting
225
+ non-loopback `Host` and `Origin` headers so a web page can't reach into your repo through
226
+ it. The full walkthrough is in [**Architecture**](docs/architecture.md).
227
+
228
+ <details>
229
+ <summary><b>Why read marks survive a live diff</b></summary>
230
+
231
+ <br>
232
+
233
+ Every hunk carries a **content-addressed id**: a hash of its path and changed lines, and
234
+ deliberately not its line numbers. That one decision is what makes the live review honest.
235
+
236
+ - Read marks survive a refresh, because an untouched hunk keeps its id.
237
+ - An edited hunk mints a new id, loses its mark, and says **changed since you read it**. You
238
+ can't accidentally sign off on code you never saw.
239
+ - The ids from your last Finish are a complete record of what existed then, so "what moved
240
+ since I last looked" is a set subtraction, needing no timestamps.
241
+
242
+ </details>
243
+
244
+ ---
245
+
246
+ ## Open core
247
+
248
+ Everything in this repository is the core, and the core stays Apache-2.0: local review, the
249
+ agent loop, the CLI, the Agent Skill. It works offline, for one reviewer, forever, for free.
250
+
251
+ A hosted team tier is planned: shared changesets, review history across a team, SSO. None of
252
+ it exists yet, and none of it will take an existing core feature behind a paywall. The line
253
+ we commit to: **anything that runs on your machine for one reviewer is core.**
254
+
255
+ ## Status
256
+
257
+ What works today:
258
+
259
+ - [x] [Live review of any changeset](docs/guide/how-it-works.md): the working tree, or anything since `--base`.
260
+ - [x] [The comment loop](docs/guide/the-loop.md): threads that reach the session that wrote the code.
261
+ - [x] [One setup, every agent](docs/guide/getting-started.md): Claude Code, Codex, Cursor, VS Code, Copilot CLI, Gemini CLI, Amp, Goose, OpenCode.
262
+ - [x] [Reading tools](docs/reference/keyboard-shortcuts.md): unified and split diffs, word-level marks, coverage tracking.
263
+
264
+ ## Contributing
265
+
266
+ Five gates, all of which CI runs, or `pnpm check` for all five:
267
+
268
+ ```bash
269
+ pnpm typecheck && pnpm test && pnpm build && pnpm lint && pnpm docs:build
270
+ ```
271
+
272
+ Local development is `pnpm dev` (server and client together). One hard rule:
273
+ **`skills/diffo/SKILL.md` is generated.** Edit [`src/skill.ts`](src/skill.ts) and run
274
+ `pnpm build:skill`; a test fails if the committed file drifts. That rewrites the repo
275
+ file, not the skill your own agent runs — `pnpm dev:skill --global` installs a separate
276
+ `/diffo-dev` that drives your checkout, alongside the shipped `/diffo`.
277
+
278
+ Details in [CONTRIBUTING.md](CONTRIBUTING.md), plus a [Code of Conduct](CODE_OF_CONDUCT.md)
279
+ and the [CHANGELOG](CHANGELOG.md). First-time contributors sign a [CLA](CLA.md): a bot asks
280
+ on your first pull request, and signing is one reply.
281
+
282
+ Found a security problem? Please don't open a public issue. The
283
+ [Security Policy](SECURITY.md) says where to send it and what's in scope.
284
+
285
+ <!-- Contributors grid: contrib.rocks 404s until DiffoHQ/diffo is public. Uncomment at launch.
286
+ <a href="https://github.com/DiffoHQ/diffo/graphs/contributors">
287
+ <img src="https://contrib.rocks/image?repo=DiffoHQ/diffo" alt="Contributors">
288
+ </a>
289
+ -->
290
+
291
+ ## License & trademark
292
+
293
+ Diffo is open source under the [Apache License 2.0](LICENSE), the whole of it, today. A
294
+ [Diffo Enterprise License](ENTERPRISE-TERMS.md) exists but currently covers **no files at
295
+ all**; it is written down so the open-core boundary is settled before it is needed, and it
296
+ carries the commitment that nothing Apache-2.0 in a released version moves out of it later.
297
+
298
+ The **Diffo** name and logo are trademarks of Diffo:
299
+ [the license covers the code, not the name](TRADEMARK.md). Forks are welcome; ship them
300
+ under your own name.