jj-plus 0.10.10

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 (404) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +102 -0
  3. package/assets/jj-plus-icon.png +0 -0
  4. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  5. package/dist/bin.cjs +112 -0
  6. package/dist/bin.cjs.map +1 -0
  7. package/dist/cli/options.cjs +376 -0
  8. package/dist/cli/options.cjs.map +1 -0
  9. package/dist/cli/timeline-json.cjs +29 -0
  10. package/dist/cli/timeline-json.cjs.map +1 -0
  11. package/dist/extension/blame-codelens.cjs +228 -0
  12. package/dist/extension/blame-codelens.cjs.map +1 -0
  13. package/dist/extension/command-runner.cjs +99 -0
  14. package/dist/extension/command-runner.cjs.map +1 -0
  15. package/dist/extension/constants.cjs +56 -0
  16. package/dist/extension/constants.cjs.map +1 -0
  17. package/dist/extension/editor-extra-features.cjs +464 -0
  18. package/dist/extension/editor-extra-features.cjs.map +1 -0
  19. package/dist/extension/history-adapters.cjs +702 -0
  20. package/dist/extension/history-adapters.cjs.map +1 -0
  21. package/dist/extension/index.cjs +657 -0
  22. package/dist/extension/index.cjs.map +1 -0
  23. package/dist/extension/repo-timeline-panel.cjs +402 -0
  24. package/dist/extension/repo-timeline-panel.cjs.map +1 -0
  25. package/dist/extension/resolve-file-path.cjs +16 -0
  26. package/dist/extension/resolve-file-path.cjs.map +1 -0
  27. package/dist/extension/revision-diff-nav.cjs +169 -0
  28. package/dist/extension/revision-diff-nav.cjs.map +1 -0
  29. package/dist/extension/settings.cjs +41 -0
  30. package/dist/extension/settings.cjs.map +1 -0
  31. package/dist/extension/timeline-at-line.cjs +72 -0
  32. package/dist/extension/timeline-at-line.cjs.map +1 -0
  33. package/dist/extension/timeline-panel.cjs +1113 -0
  34. package/dist/extension/timeline-panel.cjs.map +1 -0
  35. package/dist/extension/timeline-service.cjs +1154 -0
  36. package/dist/extension/timeline-service.cjs.map +1 -0
  37. package/dist/extension/uri-utils.cjs +75 -0
  38. package/dist/extension/uri-utils.cjs.map +1 -0
  39. package/dist/package.cjs +11 -0
  40. package/dist/package.cjs.map +1 -0
  41. package/dist/shared/blame.cjs +211 -0
  42. package/dist/shared/blame.cjs.map +1 -0
  43. package/dist/shared/diff-content-search.cjs +23 -0
  44. package/dist/shared/diff-content-search.cjs.map +1 -0
  45. package/dist/shared/diff-helpers.cjs +12 -0
  46. package/dist/shared/diff-helpers.cjs.map +1 -0
  47. package/dist/shared/diff-stats.cjs +129 -0
  48. package/dist/shared/diff-stats.cjs.map +1 -0
  49. package/dist/shared/file-oplog.cjs +82 -0
  50. package/dist/shared/file-oplog.cjs.map +1 -0
  51. package/dist/shared/history-helpers.cjs +257 -0
  52. package/dist/shared/history-helpers.cjs.map +1 -0
  53. package/dist/shared/history-search.cjs +85 -0
  54. package/dist/shared/history-search.cjs.map +1 -0
  55. package/dist/shared/jj-revset-suggestions.cjs +41 -0
  56. package/dist/shared/jj-revset-suggestions.cjs.map +1 -0
  57. package/dist/shared/line-history.cjs +181 -0
  58. package/dist/shared/line-history.cjs.map +1 -0
  59. package/dist/shared/list-file-revisions.cjs +36 -0
  60. package/dist/shared/list-file-revisions.cjs.map +1 -0
  61. package/dist/shared/non-textual-details.cjs +43 -0
  62. package/dist/shared/non-textual-details.cjs.map +1 -0
  63. package/dist/shared/resolve-file-path.cjs +14 -0
  64. package/dist/shared/resolve-file-path.cjs.map +1 -0
  65. package/dist/shared/revision-diff-availability.cjs +18 -0
  66. package/dist/shared/revision-diff-availability.cjs.map +1 -0
  67. package/dist/shared/revision-diff-pair.cjs +42 -0
  68. package/dist/shared/revision-diff-pair.cjs.map +1 -0
  69. package/dist/shared/revset.cjs +16 -0
  70. package/dist/shared/revset.cjs.map +1 -0
  71. package/dist/shared/timeline-model.cjs +29 -0
  72. package/dist/shared/timeline-model.cjs.map +1 -0
  73. package/dist/standalone/server.cjs +1733 -0
  74. package/dist/standalone/server.cjs.map +1 -0
  75. package/dist/webview/timeline-template.cjs +214 -0
  76. package/dist/webview/timeline-template.cjs.map +1 -0
  77. package/package.json +320 -0
  78. package/webview-dist/assets/worker-DuV13XDT.js +161 -0
  79. package/webview-dist/chunks/abap-CLvhMVsD.js +1 -0
  80. package/webview-dist/chunks/actionscript-3-Cs6JJXT5.js +1 -0
  81. package/webview-dist/chunks/ada-C5qYipkI.js +1 -0
  82. package/webview-dist/chunks/ahk-CA9gdOdF.js +1 -0
  83. package/webview-dist/chunks/ahk2-_6rzW9BS.js +1 -0
  84. package/webview-dist/chunks/andromeeda-vGVdxbeo.js +1 -0
  85. package/webview-dist/chunks/angular-html-DTpR04n4.js +1 -0
  86. package/webview-dist/chunks/angular-ts-BCtbMvbl.js +1 -0
  87. package/webview-dist/chunks/apache-U0d_L8uA.js +1 -0
  88. package/webview-dist/chunks/apex-KFGFyKwG.js +1 -0
  89. package/webview-dist/chunks/apl-BMZuN1Ql.js +1 -0
  90. package/webview-dist/chunks/applescript-CCn79oCD.js +1 -0
  91. package/webview-dist/chunks/ara-4CJ0cIlV.js +1 -0
  92. package/webview-dist/chunks/asciidoc-SCjQUq34.js +1 -0
  93. package/webview-dist/chunks/asm-Cmm7eHzH.js +1 -0
  94. package/webview-dist/chunks/astro-DrbV4Z7r.js +1 -0
  95. package/webview-dist/chunks/aurora-x-CDeNXAV0.js +1 -0
  96. package/webview-dist/chunks/awk-BWXHIvNe.js +1 -0
  97. package/webview-dist/chunks/ayu-dark-DluEY0Gj.js +1 -0
  98. package/webview-dist/chunks/ayu-light-C3h-C4tm.js +1 -0
  99. package/webview-dist/chunks/ayu-mirage-Bqwy1Gya.js +1 -0
  100. package/webview-dist/chunks/ballerina-B7ZEbQpA.js +1 -0
  101. package/webview-dist/chunks/bat-qdxAdBWQ.js +1 -0
  102. package/webview-dist/chunks/beancount-D-usSTwE.js +1 -0
  103. package/webview-dist/chunks/berry-DKpUyyne.js +1 -0
  104. package/webview-dist/chunks/bibtex-Ci_nEsc7.js +1 -0
  105. package/webview-dist/chunks/bicep-CUHmPFLl.js +1 -0
  106. package/webview-dist/chunks/bird2-CYIUgYqB.js +1 -0
  107. package/webview-dist/chunks/blade-oPV8S6rR.js +1 -0
  108. package/webview-dist/chunks/bsl-_VjlB9mv.js +1 -0
  109. package/webview-dist/chunks/c-DYf-3tob.js +1 -0
  110. package/webview-dist/chunks/c3-D0apG41V.js +1 -0
  111. package/webview-dist/chunks/cadence-CQ2zXKGN.js +1 -0
  112. package/webview-dist/chunks/cairo-DLTphjLi.js +1 -0
  113. package/webview-dist/chunks/catppuccin-frappe-C9Q5zVZY.js +1 -0
  114. package/webview-dist/chunks/catppuccin-latte-CtsyrtPq.js +1 -0
  115. package/webview-dist/chunks/catppuccin-macchiato-R8nAf1vR.js +1 -0
  116. package/webview-dist/chunks/catppuccin-mocha-DjuaAJKi.js +1 -0
  117. package/webview-dist/chunks/chapel-DY-WYB1D.js +1 -0
  118. package/webview-dist/chunks/clarity-CtfBBspg.js +1 -0
  119. package/webview-dist/chunks/clojure-DqKBuwfJ.js +1 -0
  120. package/webview-dist/chunks/cmake-Bj61d0ZC.js +1 -0
  121. package/webview-dist/chunks/cobol-DvdX_6CO.js +1 -0
  122. package/webview-dist/chunks/codeowners-C8r90Shi.js +1 -0
  123. package/webview-dist/chunks/codeql-oeQT6MSM.js +1 -0
  124. package/webview-dist/chunks/coffee-C1kO7jr_.js +1 -0
  125. package/webview-dist/chunks/common-lisp-Cv5bFMCO.js +1 -0
  126. package/webview-dist/chunks/coq-DuBRPxYg.js +1 -0
  127. package/webview-dist/chunks/cpp-CoSarUrI.js +1 -0
  128. package/webview-dist/chunks/crystal-SLJeZ5EP.js +1 -0
  129. package/webview-dist/chunks/csharp-oqKa8noW.js +1 -0
  130. package/webview-dist/chunks/css-cfScyrSP.js +1 -0
  131. package/webview-dist/chunks/csv-Dx-8-gkx.js +1 -0
  132. package/webview-dist/chunks/cue-CE9AQfxI.js +1 -0
  133. package/webview-dist/chunks/cypher-ClKdZ_lG.js +1 -0
  134. package/webview-dist/chunks/d-qD-0Kul2.js +1 -0
  135. package/webview-dist/chunks/dark-plus-Cs2F2srj.js +1 -0
  136. package/webview-dist/chunks/dart-CnvKMtbv.js +1 -0
  137. package/webview-dist/chunks/dax-BkyTk9wS.js +1 -0
  138. package/webview-dist/chunks/desktop-Dlh5hvp9.js +1 -0
  139. package/webview-dist/chunks/diff-woXpYk--.js +1 -0
  140. package/webview-dist/chunks/docker-IyjqRm3v.js +1 -0
  141. package/webview-dist/chunks/dotenv-_5a1GRtc.js +1 -0
  142. package/webview-dist/chunks/dracula-BHWKrbxM.js +1 -0
  143. package/webview-dist/chunks/dracula-soft-5eyTD99u.js +1 -0
  144. package/webview-dist/chunks/dream-maker-DW3nJb8Q.js +1 -0
  145. package/webview-dist/chunks/edge-lvBr3t3s.js +1 -0
  146. package/webview-dist/chunks/elixir-BLoPe0KG.js +1 -0
  147. package/webview-dist/chunks/elm-BveBINBn.js +1 -0
  148. package/webview-dist/chunks/emacs-lisp-c_oH4hRZ.js +1 -0
  149. package/webview-dist/chunks/erb-Bmf8z4ph.js +1 -0
  150. package/webview-dist/chunks/erlang-Cphh6RMH.js +1 -0
  151. package/webview-dist/chunks/everforest-dark-sB-x3p7T.js +1 -0
  152. package/webview-dist/chunks/everforest-light-Df2xbC6M.js +1 -0
  153. package/webview-dist/chunks/fennel-DQxkIbk2.js +1 -0
  154. package/webview-dist/chunks/fish-BJitypiv.js +1 -0
  155. package/webview-dist/chunks/fluent-C03EYrpw.js +1 -0
  156. package/webview-dist/chunks/fortran-fixed-form-DEKoE2YW.js +1 -0
  157. package/webview-dist/chunks/fortran-free-form-CYNrtFtB.js +1 -0
  158. package/webview-dist/chunks/fsharp-D13ZGOAj.js +1 -0
  159. package/webview-dist/chunks/gdresource-xMC7jr7x.js +1 -0
  160. package/webview-dist/chunks/gdscript-DYvRD3hg.js +1 -0
  161. package/webview-dist/chunks/gdshader-CBce3t8t.js +1 -0
  162. package/webview-dist/chunks/genie-CV2tkWYe.js +1 -0
  163. package/webview-dist/chunks/gherkin-DExj1W_8.js +1 -0
  164. package/webview-dist/chunks/git-commit-BSykSTBG.js +1 -0
  165. package/webview-dist/chunks/git-rebase-BBii7GBM.js +1 -0
  166. package/webview-dist/chunks/github-dark-C-LZuMrd.js +1 -0
  167. package/webview-dist/chunks/github-dark-default-DXG-b-1a.js +1 -0
  168. package/webview-dist/chunks/github-dark-dimmed-Bx1FflLF.js +1 -0
  169. package/webview-dist/chunks/github-dark-high-contrast-B_tTalzw.js +1 -0
  170. package/webview-dist/chunks/github-light-EUqPIrTm.js +1 -0
  171. package/webview-dist/chunks/github-light-default-BXViO-2h.js +1 -0
  172. package/webview-dist/chunks/github-light-high-contrast-B68TUdTA.js +1 -0
  173. package/webview-dist/chunks/gleam-CSRkHgEL.js +1 -0
  174. package/webview-dist/chunks/glimmer-js-CuCPna-X.js +1 -0
  175. package/webview-dist/chunks/glimmer-ts-DNAjZNDK.js +1 -0
  176. package/webview-dist/chunks/glsl-COQvRxdz.js +1 -0
  177. package/webview-dist/chunks/gn-ilITqXS6.js +1 -0
  178. package/webview-dist/chunks/gnuplot-7GGW24-e.js +1 -0
  179. package/webview-dist/chunks/go-rLFTqkRN.js +1 -0
  180. package/webview-dist/chunks/graphql-1cKCVreZ.js +1 -0
  181. package/webview-dist/chunks/groovy-CacY0gHj.js +1 -0
  182. package/webview-dist/chunks/gruvbox-dark-hard-C820rvS2.js +1 -0
  183. package/webview-dist/chunks/gruvbox-dark-medium-BPjhmG05.js +1 -0
  184. package/webview-dist/chunks/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  185. package/webview-dist/chunks/gruvbox-light-hard-BC_s9l72.js +1 -0
  186. package/webview-dist/chunks/gruvbox-light-medium-BAWPOn9u.js +1 -0
  187. package/webview-dist/chunks/gruvbox-light-soft-BSMLrYjP.js +1 -0
  188. package/webview-dist/chunks/hack-7CXYxWGO.js +1 -0
  189. package/webview-dist/chunks/haml-CeE16iG9.js +1 -0
  190. package/webview-dist/chunks/handlebars-CLm7Miue.js +1 -0
  191. package/webview-dist/chunks/haskell-D8IpX4py.js +1 -0
  192. package/webview-dist/chunks/haxe-C8oCnwJJ.js +1 -0
  193. package/webview-dist/chunks/hcl-Dh228itO.js +1 -0
  194. package/webview-dist/chunks/hjson-CxZEssPk.js +1 -0
  195. package/webview-dist/chunks/hlsl-Cvrh5tZx.js +1 -0
  196. package/webview-dist/chunks/horizon-CE9ld1lL.js +1 -0
  197. package/webview-dist/chunks/horizon-bright-DSNQnXHK.js +1 -0
  198. package/webview-dist/chunks/houston-CsvMBhTu.js +1 -0
  199. package/webview-dist/chunks/html-EbCri-_j.js +1 -0
  200. package/webview-dist/chunks/html-derivative-DGcE2kQi.js +1 -0
  201. package/webview-dist/chunks/http-DpnqgCg2.js +1 -0
  202. package/webview-dist/chunks/hurl-B6NGpamo.js +1 -0
  203. package/webview-dist/chunks/hxml-Dcm88srW.js +1 -0
  204. package/webview-dist/chunks/hy-CZbG8q4J.js +1 -0
  205. package/webview-dist/chunks/imba-DsUTQ-LC.js +1 -0
  206. package/webview-dist/chunks/ini-B5eOa1yu.js +1 -0
  207. package/webview-dist/chunks/java-ZkUoUSJy.js +1 -0
  208. package/webview-dist/chunks/javascript-DLd0EIw7.js +1 -0
  209. package/webview-dist/chunks/jinja-WhIqNp3q.js +1 -0
  210. package/webview-dist/chunks/jison-CIn1t7S8.js +1 -0
  211. package/webview-dist/chunks/json-AHG_JuKN.js +1 -0
  212. package/webview-dist/chunks/json5-BR5RXkoi.js +1 -0
  213. package/webview-dist/chunks/jsonc-CYpm1nAK.js +1 -0
  214. package/webview-dist/chunks/jsonl-CmCQp5Yx.js +1 -0
  215. package/webview-dist/chunks/jsonnet-CJTPZ8u_.js +1 -0
  216. package/webview-dist/chunks/jssm-DXw9l8Rf.js +1 -0
  217. package/webview-dist/chunks/jsx-BLy2KGb2.js +1 -0
  218. package/webview-dist/chunks/julia-XrhdGMY0.js +1 -0
  219. package/webview-dist/chunks/just-CiO9rOBq.js +1 -0
  220. package/webview-dist/chunks/kanagawa-dragon-Bozd7klA.js +1 -0
  221. package/webview-dist/chunks/kanagawa-lotus-BmuOG9ZW.js +1 -0
  222. package/webview-dist/chunks/kanagawa-wave-BML5mF2J.js +1 -0
  223. package/webview-dist/chunks/kdl-CsD5j6eV.js +1 -0
  224. package/webview-dist/chunks/kotlin-DhhofPvG.js +1 -0
  225. package/webview-dist/chunks/kusto-C7mF5XQf.js +1 -0
  226. package/webview-dist/chunks/laserwave-C_8bwKvT.js +1 -0
  227. package/webview-dist/chunks/latex-4tqdYtbu.js +1 -0
  228. package/webview-dist/chunks/lean-CewbzKMR.js +1 -0
  229. package/webview-dist/chunks/less-DVTAwKKz.js +1 -0
  230. package/webview-dist/chunks/light-plus-DVQuIRkW.js +1 -0
  231. package/webview-dist/chunks/liquid-BiiWRCLG.js +1 -0
  232. package/webview-dist/chunks/llvm-DqHOMS-s.js +1 -0
  233. package/webview-dist/chunks/log-BNLmms1o.js +1 -0
  234. package/webview-dist/chunks/logo-Cluzi2Zq.js +1 -0
  235. package/webview-dist/chunks/lua-BPFdS2Mc.js +1 -0
  236. package/webview-dist/chunks/luau-C2pBCSgt.js +1 -0
  237. package/webview-dist/chunks/make-Dixweg8N.js +1 -0
  238. package/webview-dist/chunks/markdown-BYOwaDjH.js +1 -0
  239. package/webview-dist/chunks/marko-BLi1Yy1V.js +1 -0
  240. package/webview-dist/chunks/material-theme-Bm3Qr25_.js +1 -0
  241. package/webview-dist/chunks/material-theme-darker-2IIEA8gg.js +1 -0
  242. package/webview-dist/chunks/material-theme-lighter-uhdI0v04.js +1 -0
  243. package/webview-dist/chunks/material-theme-ocean-CHQ94UKr.js +1 -0
  244. package/webview-dist/chunks/material-theme-palenight-B5W6OYN7.js +1 -0
  245. package/webview-dist/chunks/matlab-D7qyCx1q.js +1 -0
  246. package/webview-dist/chunks/mdc-Dx-qyM1x.js +1 -0
  247. package/webview-dist/chunks/mdx-DQZ5AkYe.js +1 -0
  248. package/webview-dist/chunks/mermaid-BxpfTIzt.js +1 -0
  249. package/webview-dist/chunks/min-dark-BSWPekZh.js +1 -0
  250. package/webview-dist/chunks/min-light-DDpmG2fV.js +1 -0
  251. package/webview-dist/chunks/mipsasm-BMqwQI7S.js +1 -0
  252. package/webview-dist/chunks/mojo-fg40_ntQ.js +1 -0
  253. package/webview-dist/chunks/monokai-B_bV9PQ9.js +1 -0
  254. package/webview-dist/chunks/moonbit-DgjMoLWr.js +1 -0
  255. package/webview-dist/chunks/move-BYnGhZoM.js +1 -0
  256. package/webview-dist/chunks/narrat-_X_XdTYD.js +1 -0
  257. package/webview-dist/chunks/nextflow-BJtWHP5T.js +1 -0
  258. package/webview-dist/chunks/nextflow-groovy-DJMQeKeT.js +1 -0
  259. package/webview-dist/chunks/nginx-rnpjAIVq.js +1 -0
  260. package/webview-dist/chunks/night-owl-DhmEMT88.js +1 -0
  261. package/webview-dist/chunks/night-owl-light-eJ-hLW7d.js +1 -0
  262. package/webview-dist/chunks/nim-kKTJ2fIs.js +1 -0
  263. package/webview-dist/chunks/nix-IvuFDN5E.js +1 -0
  264. package/webview-dist/chunks/nord-Cb4Vim4T.js +1 -0
  265. package/webview-dist/chunks/nsis-CjNLYCLg.js +1 -0
  266. package/webview-dist/chunks/nushell-DHYfO66s.js +1 -0
  267. package/webview-dist/chunks/objective-c-D1A_Heim.js +1 -0
  268. package/webview-dist/chunks/objective-cpp-BsSzOQcm.js +1 -0
  269. package/webview-dist/chunks/ocaml-O90oeIOV.js +1 -0
  270. package/webview-dist/chunks/odin-B1RWQWA5.js +1 -0
  271. package/webview-dist/chunks/one-dark-pro-CLwyXe_n.js +1 -0
  272. package/webview-dist/chunks/one-light-D7Lr4KcI.js +1 -0
  273. package/webview-dist/chunks/openscad-BUDT5pXO.js +1 -0
  274. package/webview-dist/chunks/org-BGWCjkJX.js +1 -0
  275. package/webview-dist/chunks/pascal-4ZHwLPI5.js +1 -0
  276. package/webview-dist/chunks/perl-DEimDILQ.js +1 -0
  277. package/webview-dist/chunks/php-QnaNN--1.js +1 -0
  278. package/webview-dist/chunks/pierre-dark-CpLgRqie.js +1 -0
  279. package/webview-dist/chunks/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
  280. package/webview-dist/chunks/pierre-dark-soft-kZQmAZld.js +1 -0
  281. package/webview-dist/chunks/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
  282. package/webview-dist/chunks/pierre-dark-vibrant-CpQYzh95.js +1 -0
  283. package/webview-dist/chunks/pierre-light-CoaEpmwp.js +1 -0
  284. package/webview-dist/chunks/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
  285. package/webview-dist/chunks/pierre-light-soft-lWLdNTOI.js +1 -0
  286. package/webview-dist/chunks/pierre-light-tritanopia-CEbqgOJL.js +1 -0
  287. package/webview-dist/chunks/pierre-light-vibrant-D80Fkn33.js +1 -0
  288. package/webview-dist/chunks/pkl-ot-7Btpt.js +1 -0
  289. package/webview-dist/chunks/plastic-DQwYfKfQ.js +1 -0
  290. package/webview-dist/chunks/plsql-DGHpHOYJ.js +1 -0
  291. package/webview-dist/chunks/po-BiJDBrnU.js +1 -0
  292. package/webview-dist/chunks/poimandres-DRFjx7u4.js +1 -0
  293. package/webview-dist/chunks/polar-C7UOKdEL.js +1 -0
  294. package/webview-dist/chunks/postcss-BXeXVLqQ.js +1 -0
  295. package/webview-dist/chunks/powerquery-DNMTfnFr.js +1 -0
  296. package/webview-dist/chunks/powershell-CCSX75yM.js +1 -0
  297. package/webview-dist/chunks/prisma-DMgNhnYS.js +1 -0
  298. package/webview-dist/chunks/prolog-iXnhIJG7.js +1 -0
  299. package/webview-dist/chunks/proto-DB4EqR-F.js +1 -0
  300. package/webview-dist/chunks/pug-D5rsKmMX.js +1 -0
  301. package/webview-dist/chunks/puppet-CDv2pdJW.js +1 -0
  302. package/webview-dist/chunks/purescript-9MfHhQsQ.js +1 -0
  303. package/webview-dist/chunks/python-gzcpVVnB.js +1 -0
  304. package/webview-dist/chunks/qml-wvbZb8UE.js +1 -0
  305. package/webview-dist/chunks/qmldir-DCQb3MpD.js +1 -0
  306. package/webview-dist/chunks/qss-Fe1Jh2GI.js +1 -0
  307. package/webview-dist/chunks/r-BNyBFaU1.js +1 -0
  308. package/webview-dist/chunks/racket-DcIDlBhZ.js +1 -0
  309. package/webview-dist/chunks/raku-B3gFvitq.js +1 -0
  310. package/webview-dist/chunks/razor-bKaHS6Kz.js +1 -0
  311. package/webview-dist/chunks/rbs-C0MpOrj4.js +1 -0
  312. package/webview-dist/chunks/red-DX1BQOs8.js +1 -0
  313. package/webview-dist/chunks/reg-CRGYupPL.js +1 -0
  314. package/webview-dist/chunks/regexp-B-mZuWUh.js +1 -0
  315. package/webview-dist/chunks/rel-BtDbiS_P.js +1 -0
  316. package/webview-dist/chunks/riscv-Ckw8ddFX.js +1 -0
  317. package/webview-dist/chunks/ron-VUp2lXgN.js +1 -0
  318. package/webview-dist/chunks/rose-pine-aMsaMD1D.js +1 -0
  319. package/webview-dist/chunks/rose-pine-dawn-8PwUyIlP.js +1 -0
  320. package/webview-dist/chunks/rose-pine-moon-DO-qXg-I.js +1 -0
  321. package/webview-dist/chunks/rosmsg-CAekHB0j.js +1 -0
  322. package/webview-dist/chunks/rst-Qq8ybXHe.js +1 -0
  323. package/webview-dist/chunks/ruby-U659LEwU.js +1 -0
  324. package/webview-dist/chunks/rust-Cfkwpbl8.js +1 -0
  325. package/webview-dist/chunks/sas-C4NtLApe.js +1 -0
  326. package/webview-dist/chunks/sass-DXrisJhu.js +1 -0
  327. package/webview-dist/chunks/scala-BiFt_7mu.js +1 -0
  328. package/webview-dist/chunks/scheme-DQCgrYNe.js +1 -0
  329. package/webview-dist/chunks/scss-KAaA4sHk.js +1 -0
  330. package/webview-dist/chunks/sdbl-bTVj8UrX.js +1 -0
  331. package/webview-dist/chunks/shaderlab-TOUzSsQk.js +1 -0
  332. package/webview-dist/chunks/shellscript-_7bOVsRC.js +1 -0
  333. package/webview-dist/chunks/shellsession-Bs_5k0qk.js +1 -0
  334. package/webview-dist/chunks/slack-dark-DnToyrRv.js +1 -0
  335. package/webview-dist/chunks/slack-ochin-B2OO5cIa.js +1 -0
  336. package/webview-dist/chunks/smalltalk-BHpQb5nM.js +1 -0
  337. package/webview-dist/chunks/smithy-Dgaz7aur.js +1 -0
  338. package/webview-dist/chunks/snazzy-light-4G7pJPwS.js +1 -0
  339. package/webview-dist/chunks/solarized-dark-UdsmMDCL.js +1 -0
  340. package/webview-dist/chunks/solarized-light-C1IUL_tW.js +1 -0
  341. package/webview-dist/chunks/solidity-Bj7E1mRn.js +1 -0
  342. package/webview-dist/chunks/soy-C5iuoFCh.js +1 -0
  343. package/webview-dist/chunks/sparql-D_iOobhT.js +1 -0
  344. package/webview-dist/chunks/splunk-BC2Px7Mm.js +1 -0
  345. package/webview-dist/chunks/sql-JX305rZh.js +1 -0
  346. package/webview-dist/chunks/ssh-config-BgfXC-Er.js +1 -0
  347. package/webview-dist/chunks/stata-2Rtik3TV.js +1 -0
  348. package/webview-dist/chunks/stylus-B6D30XZt.js +1 -0
  349. package/webview-dist/chunks/surrealql-IvpiLAIH.js +1 -0
  350. package/webview-dist/chunks/svelte-DeZcV_1u.js +1 -0
  351. package/webview-dist/chunks/swift-CyEgAFGc.js +1 -0
  352. package/webview-dist/chunks/synthwave-84-nFMaYfgc.js +1 -0
  353. package/webview-dist/chunks/system-verilog-Dh5ihWbf.js +1 -0
  354. package/webview-dist/chunks/systemd-BxMlprV5.js +1 -0
  355. package/webview-dist/chunks/talonscript-CohzipZa.js +1 -0
  356. package/webview-dist/chunks/tasl-DMoTqEGO.js +1 -0
  357. package/webview-dist/chunks/tcl-CZd0xW_V.js +1 -0
  358. package/webview-dist/chunks/templ-CcwjPXJr.js +1 -0
  359. package/webview-dist/chunks/terraform-DswuEJGm.js +1 -0
  360. package/webview-dist/chunks/tex-CZYHgHl8.js +1 -0
  361. package/webview-dist/chunks/tokyo-night-oM2G3aXe.js +1 -0
  362. package/webview-dist/chunks/toml-CcmNWLt0.js +1 -0
  363. package/webview-dist/chunks/ts-tags-DPINfEO_.js +1 -0
  364. package/webview-dist/chunks/tsv-sltzmVWM.js +1 -0
  365. package/webview-dist/chunks/tsx-Dq7pSIyE.js +1 -0
  366. package/webview-dist/chunks/turtle-ByJddavk.js +1 -0
  367. package/webview-dist/chunks/twig-DFpC8yDL.js +1 -0
  368. package/webview-dist/chunks/typescript-CN-guYmK.js +1 -0
  369. package/webview-dist/chunks/typespec-BRdr0IET.js +1 -0
  370. package/webview-dist/chunks/typst-hgW4q6mN.js +1 -0
  371. package/webview-dist/chunks/v-DBj4K9d_.js +1 -0
  372. package/webview-dist/chunks/vala-zf12oZj6.js +1 -0
  373. package/webview-dist/chunks/vb-DOwzaHZ0.js +1 -0
  374. package/webview-dist/chunks/verilog-B2gwz-sJ.js +1 -0
  375. package/webview-dist/chunks/vesper-DdrHHSXu.js +1 -0
  376. package/webview-dist/chunks/vhdl-BroJfC0k.js +1 -0
  377. package/webview-dist/chunks/viml-DvXPmvsu.js +1 -0
  378. package/webview-dist/chunks/vitesse-black-fwtXNY1n.js +1 -0
  379. package/webview-dist/chunks/vitesse-dark-BZCL-v6S.js +1 -0
  380. package/webview-dist/chunks/vitesse-light-VbXTXTou.js +1 -0
  381. package/webview-dist/chunks/vue-Dkz9ntel.js +1 -0
  382. package/webview-dist/chunks/vue-html-Dg8LQ5v3.js +1 -0
  383. package/webview-dist/chunks/vue-vine-CIEXICEN.js +1 -0
  384. package/webview-dist/chunks/vyper-CgoNMtux.js +1 -0
  385. package/webview-dist/chunks/wasm-BnjxR4X6.js +1 -0
  386. package/webview-dist/chunks/wasm-ByWQv1Qj.js +1 -0
  387. package/webview-dist/chunks/wenyan-C8pVoKbM.js +1 -0
  388. package/webview-dist/chunks/wgsl-BsKzXJz4.js +1 -0
  389. package/webview-dist/chunks/wikitext-ClFFjSW2.js +1 -0
  390. package/webview-dist/chunks/wit-DdvCle-K.js +1 -0
  391. package/webview-dist/chunks/wolfram-DLL8P-h_.js +1 -0
  392. package/webview-dist/chunks/worker-D52zl71O.js +1 -0
  393. package/webview-dist/chunks/worker-pool-lOjh8Q2A.js +1543 -0
  394. package/webview-dist/chunks/xml-X7YOen_c.js +1 -0
  395. package/webview-dist/chunks/xsl-h4d_Px-X.js +1 -0
  396. package/webview-dist/chunks/yaml-BRDpsfaj.js +1 -0
  397. package/webview-dist/chunks/zenscript-BnlCZFoB.js +1 -0
  398. package/webview-dist/chunks/zig-CMLA9XwU.js +1 -0
  399. package/webview-dist/index.html +18 -0
  400. package/webview-dist/pierre-worker-portable.js +13633 -0
  401. package/webview-dist/repo-timeline-app.js +7 -0
  402. package/webview-dist/repo-timeline.html +14 -0
  403. package/webview-dist/timeline-app.css +2 -0
  404. package/webview-dist/timeline-app.js +85 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,30 @@
1
+ # Changelog
2
+
3
+ ## 0.10.10 — 2026-09-10
4
+
5
+ ### JJ Plus
6
+
7
+ - Add a reproducible Nix development shell for the Node, pnpm, JJ, and release toolchain.
8
+ - Make local and CI publishing resilient to token-based npm registries.
9
+
10
+ ## 0.10.5 — 2026-08-28
11
+
12
+ ### JJ Plus
13
+
14
+ - Add a dedicated Repo Timeline view for browsing repository-wide JJ history.
15
+ - Add revset filtering, history search, bookmark/branch references, revision patches, and remote revision links.
16
+
17
+ ## 0.10.4 — 2026-08-28
18
+
19
+ ### JJ Plus
20
+
21
+ - Refresh the Marketplace README around user workflows.
22
+ - Add the JJ Plus panda icon and a supported npm package boundary for the CLI.
23
+ - Improve line-blame hover content and add a focused webview UX review.
24
+
25
+ ## 0.10.3 — 2026-08-28
26
+
27
+ ### JJ Plus
28
+
29
+ - First release of the extension under the JJ Plus name.
30
+ - Includes the v2 revision timeline, range diff, search, overlay, blame, conflict, and navigation features.
package/README.md ADDED
@@ -0,0 +1,102 @@
1
+ # JJ Plus
2
+
3
+ Explore Jujutsu and Git history without leaving your editor.
4
+
5
+ JJ Plus is a VS Code extension for comparing revisions, browsing the history of the active file, and jumping from a line directly to the revision that introduced it. It prefers Jujutsu when a workspace is managed by JJ and falls back to Git when it is not.
6
+
7
+ ## What you can do
8
+
9
+ - Open a multi-file diff between two revisions, bookmarks, or revsets.
10
+ - Browse a file’s revision timeline with a compact history list, scrubber, and focused diff.
11
+ - Open a repository timeline to search and inspect revisions across the whole workspace.
12
+ - Compare a revision with its previous or next revision.
13
+ - Search history by author, description, or path.
14
+ - Inspect line blame and open the timeline at the current line.
15
+ - Review JJ evolution and operation history when working in a JJ repository.
16
+ - Use the same timeline from a terminal with the optional `jj-plus` CLI.
17
+
18
+ ## Requirements
19
+
20
+ - VS Code 1.134 or newer.
21
+ - [Jujutsu](https://jj-vcs.github.io/jj/latest/install-and-setup/) for JJ history.
22
+ - Git is used automatically for ordinary Git workspaces.
23
+
24
+ ## Install
25
+
26
+ Install **JJ Plus** from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=astahmer.jj-plus), then reload VS Code if prompted.
27
+
28
+ Open the Command Palette and try:
29
+
30
+ - **JJ Plus: Open Revision Timeline** — browse the active file’s history.
31
+ - **JJ Plus: Open Repo Timeline** — search repository history and inspect any revision’s patch.
32
+ - **JJ Plus: Open Range Multi Diff** — compare two revisions across files.
33
+ - **JJ Plus: Toggle Line Blame** — show the revision behind the active line.
34
+
35
+ The extension reads repository history using the `jj` or `git` executable available on your PATH. It does not bundle either VCS or install a global terminal command.
36
+
37
+ ## CLI (optional)
38
+
39
+ The Marketplace extension and the terminal CLI are separate installation channels. Installing the VSIX does not add `jj-plus` to your shell PATH.
40
+
41
+ Once the npm package is available, install the CLI separately:
42
+
43
+ ```sh
44
+ npm install --global jj-plus
45
+ # or: pnpm add --global jj-plus
46
+ ```
47
+
48
+ Then run a range diff or the standalone browser timeline from any repository:
49
+
50
+ ```sh
51
+ jj-plus diff --from <revision> --to <revision>
52
+ jj-plus timeline path/to/file.ts
53
+ ```
54
+
55
+ The CLI needs an installed VS Code-compatible IDE for deep-link diffs. It needs `jj` or `git` for the timeline, depending on the repository. Use `jj-plus --help` for all options, including `--ide`, `--workspace`, `--port`, `--no-open`, and `--verbose`.
56
+
57
+ ## Useful workflows
58
+
59
+ ### Timeline
60
+
61
+ Open **JJ Plus: Open Revision Timeline** with a file active. Select an entry to inspect its snapshot and use the comparison controls to switch between a single revision diff, a range, or the working tree. The file switcher can show all files in the selected revision or only files changed in the selected range.
62
+
63
+ Open **JJ Plus: Open Repo Timeline** when you are looking for a change across the repository. Search revision messages, authors, bookmarks, branches, and ids, then select a revision to inspect its changed files and patch. The Repo Timeline has its own view so repository discovery does not disturb the active file timeline.
64
+
65
+ ### Line history
66
+
67
+ Enable **JJ Plus: Toggle Line Blame** or hover a line. The compact blame popover identifies the author, age, summary, revision, and line number, with one action to open the timeline at that line.
68
+
69
+ ### Range diffs
70
+
71
+ The Command Palette command accepts the same revision language as JJ or Git. The CLI is useful for scripts and editor integrations:
72
+
73
+ ```sh
74
+ jj-plus diff --from closest_bookmark(@) --to @ --workspace .
75
+ jj-plus diff --ide cursor --from <revision> --to <revision>
76
+ ```
77
+
78
+ ## Configuration
79
+
80
+ All settings are under `jjplus` in VS Code settings. The most useful ones are:
81
+
82
+ - `jjplus.currentLineBlame` — annotate the active line with a non-editing end-of-line blame label (enabled by default); it is temporarily hidden while editing so inline completion text has the end-of-line slot to itself.
83
+ - `jjplus.inlineBlameGutter` — annotate revision hunk starts throughout the file.
84
+ - `jjplus.hoverTimelineLink` — offer a timeline link when hovering source lines.
85
+ - `jjplus.scmChangedLines` — show changes against the previous working-copy revision.
86
+ - `jjplus.conflictHelper` — highlight JJ conflict markers and enable next-conflict navigation.
87
+
88
+ ## Troubleshooting
89
+
90
+ Open the **JJ Plus** output channel to see the exact `jj` or `git` commands used by the extension. For CLI diagnostics, add `--verbose`.
91
+
92
+ If history is unavailable, verify the repository is open as a VS Code workspace and that `jj --version` or `git --version` works in the same environment as VS Code.
93
+
94
+ Report problems or request features in the [GitHub issue tracker](https://github.com/astahmer/jj-plus/issues).
95
+
96
+ ## Development
97
+
98
+ Contributor setup, test commands, fixture generation, and the release checklist live in [`docs/development.md`](docs/development.md). The user-facing Marketplace README intentionally stays short and task-oriented.
99
+
100
+ ## License
101
+
102
+ The project is currently distributed without a declared open-source license. Check the repository for the latest licensing decision before redistributing it.
Binary file
@@ -0,0 +1,23 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
10
+ key = keys[i];
11
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
12
+ get: ((k) => from[k]).bind(null, key),
13
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
14
+ });
15
+ }
16
+ return to;
17
+ };
18
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
19
+ value: mod,
20
+ enumerable: true
21
+ }) : target, mod));
22
+ //#endregion
23
+ exports.__toESM = __toESM;
package/dist/bin.cjs ADDED
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
3
+ const require_constants = require("./extension/constants.cjs");
4
+ const require_options = require("./cli/options.cjs");
5
+ let node_fs = require("node:fs");
6
+ node_fs = require_runtime.__toESM(node_fs, 1);
7
+ let node_path = require("node:path");
8
+ node_path = require_runtime.__toESM(node_path, 1);
9
+ let node_child_process = require("node:child_process");
10
+ //#region src/bin.ts
11
+ main().catch((error) => {
12
+ const message = error instanceof Error ? error.message : String(error);
13
+ process.stderr.write(`${message}\n`);
14
+ process.exitCode = 1;
15
+ });
16
+ async function main() {
17
+ const argv = process.argv.slice(2);
18
+ const invocation = require_options.resolveCliInvocation(argv);
19
+ if (invocation.command === "timeline") {
20
+ const options = require_options.parseTimelineArgs(invocation.argv);
21
+ if (options.help) {
22
+ process.stdout.write(`${require_options.usage()}\n`);
23
+ return;
24
+ }
25
+ await launchStandaloneTimeline(options);
26
+ return;
27
+ }
28
+ const options = require_options.parseRangeDiffArgs(invocation.argv);
29
+ if (options.help) {
30
+ process.stdout.write(`${require_options.usage()}\n`);
31
+ return;
32
+ }
33
+ const workspacePath = options.workspacePath || process.cwd();
34
+ const resolvedWorkspacePath = node_path.default.resolve(workspacePath);
35
+ const ide = require_options.resolveIde(options.ide);
36
+ const params = new URLSearchParams();
37
+ params.set("workspacePath", resolvedWorkspacePath);
38
+ params.set("source", "cli");
39
+ if (options.from) params.set("from", options.from);
40
+ if (options.to) params.set("to", options.to);
41
+ if (options.title) params.set("title", options.title);
42
+ if (options.confirm) params.set("confirm", "1");
43
+ if (options.verbose) params.set("verbose", "1");
44
+ openWorkspace({
45
+ workspacePath: resolvedWorkspacePath,
46
+ ide,
47
+ verbose: options.verbose
48
+ });
49
+ let lastFailure = "";
50
+ for (const launcher of require_options.getLaunchers(params.toString(), ide)) {
51
+ require_options.logVerbose(options.verbose, `Launching deep link: ${require_options.formatCommand(launcher.command, launcher.args)}`);
52
+ const result = (0, node_child_process.spawnSync)(launcher.command, launcher.args, { stdio: "inherit" });
53
+ const launchError = result.error;
54
+ if (launchError) {
55
+ if (launchError.code === "ENOENT") continue;
56
+ lastFailure = `${launcher.command}: ${launchError.message}`;
57
+ continue;
58
+ }
59
+ if (result.status === 0) return;
60
+ lastFailure = `${launcher.command} exited with status ${result.status}`;
61
+ }
62
+ process.stderr.write(`Failed to open IDE for ${require_constants.EXTENSION_ID}. ${lastFailure || "No supported launcher was found."}\n`);
63
+ process.exitCode = 1;
64
+ }
65
+ async function launchStandaloneTimeline(options) {
66
+ if (!options.filePath) throw new Error(`Missing file path for standalone timeline\n\n${require_options.usage()}`);
67
+ const workspacePath = node_path.default.resolve(options.workspacePath || (node_path.default.isAbsolute(options.filePath) ? node_path.default.dirname(options.filePath) : process.cwd()));
68
+ const absoluteFilePath = node_path.default.isAbsolute(options.filePath) ? node_path.default.resolve(options.filePath) : node_path.default.resolve(workspacePath, options.filePath);
69
+ if (!node_fs.default.existsSync(absoluteFilePath)) throw new Error(`File not found: ${absoluteFilePath}`);
70
+ if (options.json) {
71
+ const { createCommandRunner } = await Promise.resolve().then(() => require("./extension/command-runner.cjs"));
72
+ const { createTimelineService } = await Promise.resolve().then(() => require("./extension/timeline-service.cjs"));
73
+ const { buildTimelineJsonSummary } = await Promise.resolve().then(() => require("./cli/timeline-json.cjs"));
74
+ const session = await createTimelineService({ runner: createCommandRunner({}) }).buildSession({
75
+ workspacePath,
76
+ absolutePath: absoluteFilePath
77
+ });
78
+ const summary = buildTimelineJsonSummary({
79
+ backend: session.backend,
80
+ relativePath: session.relativePath,
81
+ workspacePath: session.workspacePath,
82
+ entries: session.entries
83
+ });
84
+ process.stdout.write(`${JSON.stringify(summary, null, 2)}\n`);
85
+ return;
86
+ }
87
+ const { startStandaloneTimelineServer } = await Promise.resolve().then(() => require("./standalone/server.cjs"));
88
+ const server = await startStandaloneTimelineServer({
89
+ workspacePath,
90
+ filePath: absoluteFilePath,
91
+ openBrowser: options.open,
92
+ port: options.port,
93
+ verbose: options.verbose
94
+ });
95
+ process.stderr.write(`Standalone timeline available at ${server.url}\n`);
96
+ const shutdown = () => {
97
+ server.close().finally(() => {
98
+ process.exit(0);
99
+ });
100
+ };
101
+ process.once("SIGINT", shutdown);
102
+ process.once("SIGTERM", shutdown);
103
+ }
104
+ function openWorkspace(args) {
105
+ const commandArgs = ["-r", args.workspacePath];
106
+ require_options.logVerbose(args.verbose, `Opening workspace: ${require_options.formatCommand(args.ide.command, commandArgs)}`);
107
+ const launchError = (0, node_child_process.spawnSync)(args.ide.command, commandArgs, { stdio: "ignore" }).error;
108
+ if (launchError && launchError.code !== "ENOENT") process.stderr.write(`Warning: failed to focus workspace via ${args.ide.command}: ${launchError.message}\n`);
109
+ }
110
+ //#endregion
111
+
112
+ //# sourceMappingURL=bin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.cjs","names":["resolveCliInvocation","parseTimelineArgs","usage","parseRangeDiffArgs","path","resolveIde","getLaunchers","formatCommand","spawnSync","EXTENSION_ID","fsSync"],"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fsSync from 'node:fs';\nimport path from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport {\n\tformatCommand,\n\tgetLaunchers,\n\tlogVerbose,\n\tparseRangeDiffArgs,\n\tparseTimelineArgs,\n\tresolveCliInvocation,\n\tresolveIde,\n\tusage,\n} from './cli/options.ts';\nimport { EXTENSION_ID } from './extension/constants.ts';\n\nvoid main().catch((error: unknown) => {\n\tconst message = error instanceof Error ? error.message : String(error);\n\tprocess.stderr.write(`${message}\\n`);\n\tprocess.exitCode = 1;\n});\n\nasync function main(): Promise<void> {\n\tconst argv = process.argv.slice(2);\n\tconst invocation = resolveCliInvocation(argv);\n\tif (invocation.command === 'timeline') {\n\t\tconst options = parseTimelineArgs(invocation.argv);\n\t\tif (options.help) {\n\t\t\tprocess.stdout.write(`${usage()}\\n`);\n\t\t\treturn;\n\t\t}\n\n\t\tawait launchStandaloneTimeline(options);\n\t\treturn;\n\t}\n\n\tconst options = parseRangeDiffArgs(invocation.argv);\n\tif (options.help) {\n\t\tprocess.stdout.write(`${usage()}\\n`);\n\t\treturn;\n\t}\n\n\tconst workspacePath = options.workspacePath || process.cwd();\n\tconst resolvedWorkspacePath = path.resolve(workspacePath);\n\tconst ide = resolveIde(options.ide);\n\tconst params = new URLSearchParams();\n\n\tparams.set('workspacePath', resolvedWorkspacePath);\n\tparams.set('source', 'cli');\n\n\tif (options.from) {\n\t\tparams.set('from', options.from);\n\t}\n\tif (options.to) {\n\t\tparams.set('to', options.to);\n\t}\n\tif (options.title) {\n\t\tparams.set('title', options.title);\n\t}\n\tif (options.confirm) {\n\t\tparams.set('confirm', '1');\n\t}\n\tif (options.verbose) {\n\t\tparams.set('verbose', '1');\n\t}\n\n\topenWorkspace({ workspacePath: resolvedWorkspacePath, ide, verbose: options.verbose });\n\n\tlet lastFailure = '';\n\tfor (const launcher of getLaunchers(params.toString(), ide)) {\n\t\tlogVerbose(options.verbose, `Launching deep link: ${formatCommand(launcher.command, launcher.args)}`);\n\t\tconst result = spawnSync(launcher.command, launcher.args, { stdio: 'inherit' });\n\t\tconst launchError = result.error as NodeJS.ErrnoException | undefined;\n\n\t\tif (launchError) {\n\t\t\tif (launchError.code === 'ENOENT') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlastFailure = `${launcher.command}: ${launchError.message}`;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (result.status === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tlastFailure = `${launcher.command} exited with status ${result.status}`;\n\t}\n\n\tprocess.stderr.write(\n\t\t`Failed to open IDE for ${EXTENSION_ID}. ${lastFailure || 'No supported launcher was found.'}\\n`,\n\t);\n\tprocess.exitCode = 1;\n}\n\nasync function launchStandaloneTimeline(options: ReturnType<typeof parseTimelineArgs>): Promise<void> {\n\tif (!options.filePath) {\n\t\tthrow new Error(`Missing file path for standalone timeline\\n\\n${usage()}`);\n\t}\n\n\tconst workspacePath = path.resolve(\n\t\toptions.workspacePath || (path.isAbsolute(options.filePath) ? path.dirname(options.filePath) : process.cwd()),\n\t);\n\tconst absoluteFilePath = path.isAbsolute(options.filePath)\n\t\t? path.resolve(options.filePath)\n\t\t: path.resolve(workspacePath, options.filePath);\n\n\tif (!fsSync.existsSync(absoluteFilePath)) {\n\t\tthrow new Error(`File not found: ${absoluteFilePath}`);\n\t}\n\n\tif (options.json) {\n\t\tconst { createCommandRunner } = await import('./extension/command-runner.ts');\n\t\tconst { createTimelineService } = await import('./extension/timeline-service.ts');\n\t\tconst { buildTimelineJsonSummary } = await import('./cli/timeline-json.ts');\n\t\tconst runner = createCommandRunner({});\n\t\tconst service = createTimelineService({ runner });\n\t\tconst session = await service.buildSession({\n\t\t\tworkspacePath,\n\t\t\tabsolutePath: absoluteFilePath,\n\t\t});\n\t\tconst summary = buildTimelineJsonSummary({\n\t\t\tbackend: session.backend,\n\t\t\trelativePath: session.relativePath,\n\t\t\tworkspacePath: session.workspacePath,\n\t\t\tentries: session.entries,\n\t\t});\n\t\tprocess.stdout.write(`${JSON.stringify(summary, null, 2)}\\n`);\n\t\treturn;\n\t}\n\n\tconst { startStandaloneTimelineServer } = await import('./standalone/server.ts');\n\tconst server = await startStandaloneTimelineServer({\n\t\tworkspacePath,\n\t\tfilePath: absoluteFilePath,\n\t\topenBrowser: options.open,\n\t\tport: options.port,\n\t\tverbose: options.verbose,\n\t});\n\n\tprocess.stderr.write(`Standalone timeline available at ${server.url}\\n`);\n\n\tconst shutdown = () => {\n\t\tvoid server.close().finally(() => {\n\t\t\tprocess.exit(0);\n\t\t});\n\t};\n\n\tprocess.once('SIGINT', shutdown);\n\tprocess.once('SIGTERM', shutdown);\n}\n\nfunction openWorkspace(args: { workspacePath: string; ide: ReturnType<typeof resolveIde>; verbose: boolean }): void {\n\tconst commandArgs = ['-r', args.workspacePath];\n\tlogVerbose(args.verbose, `Opening workspace: ${formatCommand(args.ide.command, commandArgs)}`);\n\tconst result = spawnSync(args.ide.command, commandArgs, { stdio: 'ignore' });\n\tconst launchError = result.error as NodeJS.ErrnoException | undefined;\n\n\tif (launchError && launchError.code !== 'ENOENT') {\n\t\tprocess.stderr.write(`Warning: failed to focus workspace via ${args.ide.command}: ${launchError.message}\\n`);\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,376 @@
1
+ const require_constants = require("../extension/constants.cjs");
2
+ //#region src/cli/options.ts
3
+ const URI_PATH = "/open-range-multi-diff";
4
+ const DEFAULT_IDE = "code";
5
+ const idePresets = {
6
+ code: {
7
+ command: process.env.VSCODE_BIN || "code",
8
+ schemes: ["vscode", "vscode-insiders"]
9
+ },
10
+ vscode: {
11
+ command: process.env.VSCODE_BIN || "code",
12
+ schemes: ["vscode", "vscode-insiders"]
13
+ },
14
+ "code-insiders": {
15
+ command: "code-insiders",
16
+ schemes: ["vscode-insiders"]
17
+ },
18
+ "vscode-insiders": {
19
+ command: "code-insiders",
20
+ schemes: ["vscode-insiders"]
21
+ },
22
+ cursor: {
23
+ command: "cursor",
24
+ schemes: ["cursor"]
25
+ },
26
+ "cursor-insiders": {
27
+ command: "cursor-insiders",
28
+ schemes: ["cursor-insiders", "cursor"]
29
+ },
30
+ zed: {
31
+ command: "zed",
32
+ schemes: ["zed"]
33
+ },
34
+ windsurf: {
35
+ command: "windsurf",
36
+ schemes: ["windsurf"]
37
+ },
38
+ codium: {
39
+ command: "codium",
40
+ schemes: ["vscodium", "vscode"]
41
+ }
42
+ };
43
+ function resolveCliInvocation(argv) {
44
+ const [command, ...rest] = argv;
45
+ if (command === "timeline" || command === "webview") return {
46
+ command: "timeline",
47
+ argv: rest
48
+ };
49
+ if (command === "diff") return {
50
+ command: "range-diff",
51
+ argv: rest
52
+ };
53
+ return {
54
+ command: "range-diff",
55
+ argv
56
+ };
57
+ }
58
+ function parseRangeDiffArgs(argv) {
59
+ const options = {
60
+ help: false,
61
+ confirm: false,
62
+ from: void 0,
63
+ ide: process.env.JJ_PLUS_IDE || void 0,
64
+ to: void 0,
65
+ title: void 0,
66
+ verbose: false,
67
+ workspacePath: void 0
68
+ };
69
+ for (let index = 0; index < argv.length; index += 1) {
70
+ const arg = argv[index];
71
+ if (arg === "-h" || arg === "--help") {
72
+ options.help = true;
73
+ continue;
74
+ }
75
+ if (arg === "--confirm") {
76
+ options.confirm = true;
77
+ continue;
78
+ }
79
+ if (arg === "-v" || arg === "--verbose") {
80
+ options.verbose = true;
81
+ continue;
82
+ }
83
+ if (arg === "-f" || arg === "--from" || arg === "-b" || arg === "--base") {
84
+ options.from = requireValue({
85
+ flag: arg,
86
+ value: argv[index + 1]
87
+ });
88
+ index += 1;
89
+ continue;
90
+ }
91
+ if (arg.startsWith("--from=")) {
92
+ options.from = requireValue({
93
+ flag: "--from",
94
+ value: arg.slice(7)
95
+ });
96
+ continue;
97
+ }
98
+ if (arg.startsWith("--base=")) {
99
+ options.from = requireValue({
100
+ flag: "--base",
101
+ value: arg.slice(7)
102
+ });
103
+ continue;
104
+ }
105
+ if (arg === "-t" || arg === "--to" || arg === "--target") {
106
+ options.to = requireValue({
107
+ flag: arg,
108
+ value: argv[index + 1]
109
+ });
110
+ index += 1;
111
+ continue;
112
+ }
113
+ if (arg.startsWith("--to=")) {
114
+ options.to = requireValue({
115
+ flag: "--to",
116
+ value: arg.slice(5)
117
+ });
118
+ continue;
119
+ }
120
+ if (arg.startsWith("--target=")) {
121
+ options.to = requireValue({
122
+ flag: "--target",
123
+ value: arg.slice(9)
124
+ });
125
+ continue;
126
+ }
127
+ if (arg === "--title") {
128
+ options.title = requireValue({
129
+ flag: arg,
130
+ value: argv[index + 1]
131
+ });
132
+ index += 1;
133
+ continue;
134
+ }
135
+ if (arg.startsWith("--title=")) {
136
+ options.title = requireValue({
137
+ flag: "--title",
138
+ value: arg.slice(8)
139
+ });
140
+ continue;
141
+ }
142
+ if (arg === "--ide") {
143
+ options.ide = requireValue({
144
+ flag: arg,
145
+ value: argv[index + 1]
146
+ });
147
+ index += 1;
148
+ continue;
149
+ }
150
+ if (arg.startsWith("--ide=")) {
151
+ options.ide = requireValue({
152
+ flag: "--ide",
153
+ value: arg.slice(6)
154
+ });
155
+ continue;
156
+ }
157
+ if (arg === "-w" || arg === "--workspace" || arg === "--workspace-path") {
158
+ options.workspacePath = requireValue({
159
+ flag: arg,
160
+ value: argv[index + 1]
161
+ });
162
+ index += 1;
163
+ continue;
164
+ }
165
+ if (arg.startsWith("--workspace=")) {
166
+ options.workspacePath = requireValue({
167
+ flag: "--workspace",
168
+ value: arg.slice(12)
169
+ });
170
+ continue;
171
+ }
172
+ if (arg.startsWith("--workspace-path=")) {
173
+ options.workspacePath = requireValue({
174
+ flag: "--workspace-path",
175
+ value: arg.slice(17)
176
+ });
177
+ continue;
178
+ }
179
+ throw new Error(`Unknown argument: ${arg}\n\n${usage()}`);
180
+ }
181
+ return options;
182
+ }
183
+ function parseTimelineArgs(argv) {
184
+ const options = {
185
+ help: false,
186
+ filePath: void 0,
187
+ open: true,
188
+ json: false,
189
+ port: 0,
190
+ verbose: false,
191
+ workspacePath: void 0
192
+ };
193
+ for (let index = 0; index < argv.length; index += 1) {
194
+ const arg = argv[index];
195
+ if (arg === "-h" || arg === "--help") {
196
+ options.help = true;
197
+ continue;
198
+ }
199
+ if (arg === "--json") {
200
+ options.json = true;
201
+ options.open = false;
202
+ continue;
203
+ }
204
+ if (arg === "--no-open") {
205
+ options.open = false;
206
+ continue;
207
+ }
208
+ if (arg === "-v" || arg === "--verbose") {
209
+ options.verbose = true;
210
+ continue;
211
+ }
212
+ if (arg === "-f" || arg === "--file") {
213
+ options.filePath = requireValue({
214
+ flag: arg,
215
+ value: argv[index + 1]
216
+ });
217
+ index += 1;
218
+ continue;
219
+ }
220
+ if (arg.startsWith("--file=")) {
221
+ options.filePath = requireValue({
222
+ flag: "--file",
223
+ value: arg.slice(7)
224
+ });
225
+ continue;
226
+ }
227
+ if (arg === "--port") {
228
+ options.port = parsePort(requireValue({
229
+ flag: arg,
230
+ value: argv[index + 1]
231
+ }));
232
+ index += 1;
233
+ continue;
234
+ }
235
+ if (arg.startsWith("--port=")) {
236
+ options.port = parsePort(requireValue({
237
+ flag: "--port",
238
+ value: arg.slice(7)
239
+ }));
240
+ continue;
241
+ }
242
+ if (arg === "-w" || arg === "--workspace" || arg === "--workspace-path") {
243
+ options.workspacePath = requireValue({
244
+ flag: arg,
245
+ value: argv[index + 1]
246
+ });
247
+ index += 1;
248
+ continue;
249
+ }
250
+ if (arg.startsWith("--workspace=")) {
251
+ options.workspacePath = requireValue({
252
+ flag: "--workspace",
253
+ value: arg.slice(12)
254
+ });
255
+ continue;
256
+ }
257
+ if (arg.startsWith("--workspace-path=")) {
258
+ options.workspacePath = requireValue({
259
+ flag: "--workspace-path",
260
+ value: arg.slice(17)
261
+ });
262
+ continue;
263
+ }
264
+ if (arg.startsWith("-")) throw new Error(`Unknown argument: ${arg}\n\n${usage()}`);
265
+ if (!options.filePath) {
266
+ options.filePath = arg;
267
+ continue;
268
+ }
269
+ throw new Error(`Unexpected positional argument: ${arg}\n\n${usage()}`);
270
+ }
271
+ return options;
272
+ }
273
+ function resolveIde(rawIde) {
274
+ const trimmed = rawIde?.trim() || DEFAULT_IDE;
275
+ const preset = idePresets[trimmed.toLowerCase()];
276
+ if (preset) return preset;
277
+ return {
278
+ command: trimmed,
279
+ schemes: [trimmed]
280
+ };
281
+ }
282
+ function getLaunchers(query, ide) {
283
+ const uris = ide.schemes.map((scheme) => buildUri({
284
+ scheme,
285
+ query
286
+ }));
287
+ if (process.platform === "darwin") return uris.map((uri) => ({
288
+ command: "open",
289
+ args: [uri]
290
+ }));
291
+ if (process.platform === "win32") return uris.map((uri) => ({
292
+ command: "cmd",
293
+ args: [
294
+ "/c",
295
+ "start",
296
+ "",
297
+ uri
298
+ ]
299
+ }));
300
+ return uris.map((uri) => ({
301
+ command: "xdg-open",
302
+ args: [uri]
303
+ }));
304
+ }
305
+ function logVerbose(enabled, message) {
306
+ if (!enabled) return;
307
+ process.stderr.write(`${message}\n`);
308
+ }
309
+ function formatCommand(command, args) {
310
+ return [command, ...args].map(quoteShellArg).join(" ");
311
+ }
312
+ function usage() {
313
+ return [
314
+ "Usage:",
315
+ " jj-plus [options]",
316
+ " jj-plus diff [options]",
317
+ " jj-plus timeline [options] <file>",
318
+ "",
319
+ "Commands:",
320
+ " diff Explicit alias for the default range diff deep-link flow",
321
+ " timeline <file> Open the timeline webview in the default browser",
322
+ " webview <file> Alias for timeline",
323
+ "",
324
+ "Range Diff Options:",
325
+ " --confirm Prompt before opening when launched from the CLI",
326
+ " -f, --from <revset> From change id or revset",
327
+ " --ide <name> IDE preset or command (default: code)",
328
+ " -t, --to <revset> To change id or revset",
329
+ " --base <revset> Alias for --from",
330
+ " --target <revset> Alias for --to",
331
+ " --title <title> Override the tab title",
332
+ " -v, --verbose Log launches and show extra diagnostics",
333
+ " -w, --workspace <path> Workspace path to resolve in VS Code",
334
+ " --workspace-path <path> Alias for --workspace",
335
+ "",
336
+ "Standalone Timeline Options:",
337
+ " -f, --file <path> File path inside the workspace (or absolute path)",
338
+ " --json Print timeline metadata JSON to stdout (implies --no-open)",
339
+ " --no-open Start the local server without opening the browser",
340
+ " --port <port> Preferred local port (default: random free port)",
341
+ " -w, --workspace <path> Workspace path containing the file (default: cwd)",
342
+ " --workspace-path <path> Alias for --workspace",
343
+ " -h, --help Show this help message",
344
+ "",
345
+ "Environment:",
346
+ " JJ_PLUS_IDE Default IDE preset or command for the VS Code deep-link flow"
347
+ ].join("\n");
348
+ }
349
+ function parsePort(value) {
350
+ const port = Number.parseInt(value, 10);
351
+ if (!Number.isInteger(port) || port < 0 || port > 65535) throw new Error(`Invalid port: ${value}\n\n${usage()}`);
352
+ return port;
353
+ }
354
+ function requireValue({ flag, value }) {
355
+ const trimmed = value?.trim();
356
+ if (trimmed) return trimmed;
357
+ throw new Error(`Missing value for ${flag}\n\n${usage()}`);
358
+ }
359
+ function buildUri({ scheme, query }) {
360
+ return `${scheme}://${require_constants.EXTENSION_ID}${URI_PATH}?${query}`;
361
+ }
362
+ function quoteShellArg(value) {
363
+ if (/^[a-zA-Z0-9_@./:=+-]+$/u.test(value)) return value;
364
+ return `'${value.replace(/'/g, `'\\''`)}'`;
365
+ }
366
+ //#endregion
367
+ exports.formatCommand = formatCommand;
368
+ exports.getLaunchers = getLaunchers;
369
+ exports.logVerbose = logVerbose;
370
+ exports.parseRangeDiffArgs = parseRangeDiffArgs;
371
+ exports.parseTimelineArgs = parseTimelineArgs;
372
+ exports.resolveCliInvocation = resolveCliInvocation;
373
+ exports.resolveIde = resolveIde;
374
+ exports.usage = usage;
375
+
376
+ //# sourceMappingURL=options.cjs.map