@variantree/watcher 0.1.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 (117) hide show
  1. package/dist/__tests__/git-snapshot.test.d.ts +2 -0
  2. package/dist/__tests__/git-snapshot.test.d.ts.map +1 -0
  3. package/dist/__tests__/git-snapshot.test.js +437 -0
  4. package/dist/__tests__/git-snapshot.test.js.map +1 -0
  5. package/dist/__tests__/integration.test.d.ts +10 -0
  6. package/dist/__tests__/integration.test.d.ts.map +1 -0
  7. package/dist/__tests__/integration.test.js +316 -0
  8. package/dist/__tests__/integration.test.js.map +1 -0
  9. package/dist/__tests__/watcher.test.d.ts +2 -0
  10. package/dist/__tests__/watcher.test.d.ts.map +1 -0
  11. package/dist/__tests__/watcher.test.js +375 -0
  12. package/dist/__tests__/watcher.test.js.map +1 -0
  13. package/dist/adapters/aider.d.ts +21 -0
  14. package/dist/adapters/aider.d.ts.map +1 -0
  15. package/dist/adapters/aider.js +42 -0
  16. package/dist/adapters/aider.js.map +1 -0
  17. package/dist/adapters/base.d.ts +3 -0
  18. package/dist/adapters/base.d.ts.map +1 -0
  19. package/dist/adapters/base.js +2 -0
  20. package/dist/adapters/base.js.map +1 -0
  21. package/dist/adapters/claude-code.d.ts +17 -0
  22. package/dist/adapters/claude-code.d.ts.map +1 -0
  23. package/dist/adapters/claude-code.js +58 -0
  24. package/dist/adapters/claude-code.js.map +1 -0
  25. package/dist/adapters/opencode.d.ts +3 -0
  26. package/dist/adapters/opencode.d.ts.map +1 -0
  27. package/dist/adapters/opencode.js +3 -0
  28. package/dist/adapters/opencode.js.map +1 -0
  29. package/dist/agents-md.d.ts +18 -0
  30. package/dist/agents-md.d.ts.map +1 -0
  31. package/dist/agents-md.js +93 -0
  32. package/dist/agents-md.js.map +1 -0
  33. package/dist/cli.d.ts +9 -0
  34. package/dist/cli.d.ts.map +1 -0
  35. package/dist/cli.js +511 -0
  36. package/dist/cli.js.map +1 -0
  37. package/dist/differ.d.ts +18 -0
  38. package/dist/differ.d.ts.map +1 -0
  39. package/dist/differ.js +23 -0
  40. package/dist/differ.js.map +1 -0
  41. package/dist/index.d.ts +17 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +23 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/node/blob-store.d.ts +16 -0
  46. package/dist/node/blob-store.d.ts.map +1 -0
  47. package/dist/node/blob-store.js +47 -0
  48. package/dist/node/blob-store.js.map +1 -0
  49. package/dist/node/fs-adapter.d.ts +17 -0
  50. package/dist/node/fs-adapter.d.ts.map +1 -0
  51. package/dist/node/fs-adapter.js +110 -0
  52. package/dist/node/fs-adapter.js.map +1 -0
  53. package/dist/node/git-snapshot.d.ts +46 -0
  54. package/dist/node/git-snapshot.d.ts.map +1 -0
  55. package/dist/node/git-snapshot.js +282 -0
  56. package/dist/node/git-snapshot.js.map +1 -0
  57. package/dist/node/session-launcher.d.ts +14 -0
  58. package/dist/node/session-launcher.d.ts.map +1 -0
  59. package/dist/node/session-launcher.js +28 -0
  60. package/dist/node/session-launcher.js.map +1 -0
  61. package/dist/node/storage.d.ts +17 -0
  62. package/dist/node/storage.d.ts.map +1 -0
  63. package/dist/node/storage.js +56 -0
  64. package/dist/node/storage.js.map +1 -0
  65. package/dist/sync.d.ts +16 -0
  66. package/dist/sync.d.ts.map +1 -0
  67. package/dist/sync.js +58 -0
  68. package/dist/sync.js.map +1 -0
  69. package/dist/tools/base.d.ts +52 -0
  70. package/dist/tools/base.d.ts.map +1 -0
  71. package/dist/tools/base.js +10 -0
  72. package/dist/tools/base.js.map +1 -0
  73. package/dist/tools/claudecode/adapter.d.ts +26 -0
  74. package/dist/tools/claudecode/adapter.d.ts.map +1 -0
  75. package/dist/tools/claudecode/adapter.js +111 -0
  76. package/dist/tools/claudecode/adapter.js.map +1 -0
  77. package/dist/tools/claudecode/config.d.ts +8 -0
  78. package/dist/tools/claudecode/config.d.ts.map +1 -0
  79. package/dist/tools/claudecode/config.js +34 -0
  80. package/dist/tools/claudecode/config.js.map +1 -0
  81. package/dist/tools/claudecode/index.d.ts +9 -0
  82. package/dist/tools/claudecode/index.d.ts.map +1 -0
  83. package/dist/tools/claudecode/index.js +16 -0
  84. package/dist/tools/claudecode/index.js.map +1 -0
  85. package/dist/tools/claudecode/instructions.d.ts +7 -0
  86. package/dist/tools/claudecode/instructions.d.ts.map +1 -0
  87. package/dist/tools/claudecode/instructions.js +21 -0
  88. package/dist/tools/claudecode/instructions.js.map +1 -0
  89. package/dist/tools/index.d.ts +24 -0
  90. package/dist/tools/index.d.ts.map +1 -0
  91. package/dist/tools/index.js +42 -0
  92. package/dist/tools/index.js.map +1 -0
  93. package/dist/tools/instructions.d.ts +19 -0
  94. package/dist/tools/instructions.d.ts.map +1 -0
  95. package/dist/tools/instructions.js +93 -0
  96. package/dist/tools/instructions.js.map +1 -0
  97. package/dist/tools/opencode/adapter.d.ts +46 -0
  98. package/dist/tools/opencode/adapter.d.ts.map +1 -0
  99. package/dist/tools/opencode/adapter.js +166 -0
  100. package/dist/tools/opencode/adapter.js.map +1 -0
  101. package/dist/tools/opencode/config.d.ts +8 -0
  102. package/dist/tools/opencode/config.d.ts.map +1 -0
  103. package/dist/tools/opencode/config.js +37 -0
  104. package/dist/tools/opencode/config.js.map +1 -0
  105. package/dist/tools/opencode/index.d.ts +9 -0
  106. package/dist/tools/opencode/index.d.ts.map +1 -0
  107. package/dist/tools/opencode/index.js +16 -0
  108. package/dist/tools/opencode/index.js.map +1 -0
  109. package/dist/tools/opencode/instructions.d.ts +10 -0
  110. package/dist/tools/opencode/instructions.d.ts.map +1 -0
  111. package/dist/tools/opencode/instructions.js +26 -0
  112. package/dist/tools/opencode/instructions.js.map +1 -0
  113. package/dist/watcher.d.ts +40 -0
  114. package/dist/watcher.d.ts.map +1 -0
  115. package/dist/watcher.js +87 -0
  116. package/dist/watcher.js.map +1 -0
  117. package/package.json +46 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-snapshot.js","sourceRoot":"","sources":["../../src/node/git-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGlC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEtC,4EAA4E;AAC5E,MAAM,iBAAiB,GAAG;IACxB,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,WAAW;IACX,OAAO;IACP,SAAS;IACT,aAAa;CACd,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEpB,+DAA+D;AAC/D,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CAAC,aAAqB;IACtD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,EACtC,MAAM,CACP,CAAC;QACF,OAAO,kBAAkB,GAAG,6BAA6B,GAAG,SAAS,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,kBAAkB,GAAG,iBAAiB,CAAC;IAChD,CAAC;AACH,CAAC;AAED,MAAM,OAAO,mBAAmB;IACtB,MAAM,GAAkB,IAAI,CAAC;IAC7B,eAAe,GAAG,KAAK,CAAC;IACxB,WAAW,GAAyB,IAAI,CAAC;IACzC,mBAAmB,GAAkB,IAAI,CAAC;IAElD,YAAY,aAAsB;QAChC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,mBAAmB,GAAG,aAAa,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,2EAA2E;IAE3E,KAAK,CAAC,OAAO,CAAC,aAAqB,EAAE,KAAa;QAChD,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,EAAE,sBAAsB,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;YAEvD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE9E,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;gBAC5C,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,KAAK,EAAE;aAClD,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEX,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;gBAC5B,YAAY,EAAE,mBAAmB,MAAM,EAAE,EAAE,MAAM;aAClD,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,aAAqB,EAAE,GAAW;QAC9C,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAErC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACxE,MAAM,OAAO,GAAmB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QAE1E,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAE1E,KAAK,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,OAAO,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBAEpD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;oBACpF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACtC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;qBAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBAC1B,IAAI,CAAC;wBAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;oBAC3C,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAqB,EAAE,GAAW;QAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAErC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAErE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAY;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACxC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAiB,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAErF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE3D,KAAK,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBAC3C,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACnD,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACrF,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,oBAAoB,CAAC,GAAW;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACxC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,2EAA2E;IAEnE,KAAK,CAAC,UAAU,CAAC,aAAqB;QAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO;QACjC,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAE9C,IAAI,CAAC,mBAAmB,GAAG,aAAa,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,aAAqB;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE;gBACpE,GAAG,EAAE,aAAa;aACnB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAE7B,4EAA4E;YAC5E,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,+CAA+C;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAE7C,IAAI,SAAS,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC9C,SAAS,GAAG,KAAK,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7C,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAChC,MAAM,mBAAmB,CAAC,aAAa,CAAC,CACzC,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,iEAAiE;IACzD,KAAK,CAAC,aAAa,CAAC,MAAc,EAAE,OAAe;QACzD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO;YACtC,MAAM,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,2EAA2E;IAEnE,QAAQ,CAAC,aAAqB,EAAE,QAAiC;QACvE,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAElD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,CAAC;YAC3B,GAAG,CAAC,aAAa,GAAG,aAAa,CAAC;QACpC,CAAC;QAED,IAAI,QAAQ;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,GAAG,CACf,aAAqB,EACrB,IAAc,EACd,QAAiC;QAEjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;YAC9C,GAAG,EAAE,aAAa;YAClB,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;YAC3C,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;SAC7B,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sEAAsE;IAC9D,SAAS,CACf,aAAqB,EACrB,IAAc,EACd,QAAiC;QAEjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;gBAC9B,GAAG,EAAE,aAAa;gBAClB,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;aAC5C,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,IAAI,IAAI,KAAK,CAAC;oBAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;;oBAC1C,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4DAA4D;IACpD,KAAK,CAAC,cAAc,CAC1B,aAAqB,EACrB,IAAY,EACZ,IAAY;QAEZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC3C,WAAW,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI;SAC/C,CAAC,CAAC;QAEH,OAAO,MAAM;aACV,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,IAAI,CAAC,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtB,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;aAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;IACP,CAAC;IAED,8CAA8C;IACtC,KAAK,CAAC,aAAa,CAAC,aAAqB,EAAE,GAAW;QAC5D,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC5C,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG;SACpC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1C,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,mHAAmH,CAAC,CAAC;QACvI,CAAC;QACD,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Session launcher — spawns a new OpenCode session with branch context pre-loaded.
3
+ */
4
+ export interface LaunchResult {
5
+ launched: boolean;
6
+ }
7
+ /**
8
+ * Spawns `opencode run` with an initial prompt that reads the branch context file.
9
+ * Uses `stdio: 'inherit'` so OpenCode takes over the current terminal.
10
+ *
11
+ * Returns `{ launched: false }` if the spawn fails (e.g. opencode not on PATH).
12
+ */
13
+ export declare function launchOpenCodeSession(cwd: string): LaunchResult;
14
+ //# sourceMappingURL=session-launcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-launcher.d.ts","sourceRoot":"","sources":["../../src/node/session-launcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAgB/D"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Session launcher — spawns a new OpenCode session with branch context pre-loaded.
3
+ */
4
+ import { spawn } from 'node:child_process';
5
+ const CONTEXT_PROMPT = 'Read the file .variantree/branch-context.md to understand the context of what was done on this branch, then continue working.';
6
+ /**
7
+ * Spawns `opencode run` with an initial prompt that reads the branch context file.
8
+ * Uses `stdio: 'inherit'` so OpenCode takes over the current terminal.
9
+ *
10
+ * Returns `{ launched: false }` if the spawn fails (e.g. opencode not on PATH).
11
+ */
12
+ export function launchOpenCodeSession(cwd) {
13
+ try {
14
+ const child = spawn('opencode', ['run', CONTEXT_PROMPT], {
15
+ cwd,
16
+ stdio: 'inherit',
17
+ detached: false,
18
+ });
19
+ child.on('error', () => {
20
+ // opencode not found or spawn failed — silently handled via the try/catch
21
+ });
22
+ return { launched: true };
23
+ }
24
+ catch {
25
+ return { launched: false };
26
+ }
27
+ }
28
+ //# sourceMappingURL=session-launcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-launcher.js","sourceRoot":"","sources":["../../src/node/session-launcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,cAAc,GAClB,+HAA+H,CAAC;AAMlI;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE;YACvD,GAAG;YACH,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,0EAA0E;QAC5E,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @variantree/watcher — Node.js StorageBackend
3
+ *
4
+ * Persists Variantree workspace state to .variantree/workspace.json
5
+ * in the project directory.
6
+ */
7
+ import type { StorageBackend, Workspace } from '@variantree/core';
8
+ export declare class NodeStorage implements StorageBackend {
9
+ private readonly dir;
10
+ private readonly filePath;
11
+ constructor(workspacePath: string);
12
+ save(workspaceId: string, workspace: Workspace): Promise<void>;
13
+ load(workspaceId: string): Promise<Workspace | null>;
14
+ list(): Promise<string[]>;
15
+ delete(workspaceId: string): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/node/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElE,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,aAAa,EAAE,MAAM;IAK3B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9D,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAUpD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IASzB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQjD"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @variantree/watcher — Node.js StorageBackend
3
+ *
4
+ * Persists Variantree workspace state to .variantree/workspace.json
5
+ * in the project directory.
6
+ */
7
+ import fs from 'node:fs/promises';
8
+ import path from 'node:path';
9
+ export class NodeStorage {
10
+ dir;
11
+ filePath;
12
+ constructor(workspacePath) {
13
+ this.dir = path.join(workspacePath, '.variantree');
14
+ this.filePath = path.join(this.dir, 'workspace.json');
15
+ }
16
+ async save(workspaceId, workspace) {
17
+ await fs.mkdir(this.dir, { recursive: true });
18
+ let data = {};
19
+ try {
20
+ const raw = await fs.readFile(this.filePath, 'utf8');
21
+ data = JSON.parse(raw);
22
+ }
23
+ catch { /* first write */ }
24
+ data[workspaceId] = workspace;
25
+ await fs.writeFile(this.filePath, JSON.stringify(data, null, 2), 'utf8');
26
+ }
27
+ async load(workspaceId) {
28
+ try {
29
+ const raw = await fs.readFile(this.filePath, 'utf8');
30
+ const data = JSON.parse(raw);
31
+ return data[workspaceId] ?? null;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ async list() {
38
+ try {
39
+ const raw = await fs.readFile(this.filePath, 'utf8');
40
+ return Object.keys(JSON.parse(raw));
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ async delete(workspaceId) {
47
+ try {
48
+ const raw = await fs.readFile(this.filePath, 'utf8');
49
+ const data = JSON.parse(raw);
50
+ delete data[workspaceId];
51
+ await fs.writeFile(this.filePath, JSON.stringify(data, null, 2), 'utf8');
52
+ }
53
+ catch { /* nothing to delete */ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/node/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,OAAO,WAAW;IACL,GAAG,CAAS;IACZ,QAAQ,CAAS;IAElC,YAAY,aAAqB;QAC/B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAmB,EAAE,SAAoB;QAClD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,IAAI,GAA8B,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;QAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,IAAI,GAA8B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,IAAI,GAA8B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3E,CAAC;QAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACrC,CAAC;CACF"}
package/dist/sync.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @variantree/watcher — Shared conversation sync
3
+ *
4
+ * Adapter-agnostic syncConversation used by both the MCP server and the CLI.
5
+ *
6
+ * Strategy:
7
+ * 1. If the workspace already has a pinned session ID for any adapter, use
8
+ * that adapter exclusively (prevents cross-adapter message confusion).
9
+ * 2. If no adapter is pinned yet, try each adapter in ALL_TOOLS order and
10
+ * use the first one that discovers an active session for the workspace.
11
+ * 3. Within the chosen adapter, apply the stale-session fallback: if the
12
+ * pinned session returns no messages, re-discover the current session.
13
+ */
14
+ import type { VariantTree } from '@variantree/core';
15
+ export declare function syncConversation(engine: VariantTree, cwd: string): Promise<number>;
16
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAUpD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA4CjB"}
package/dist/sync.js ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @variantree/watcher — Shared conversation sync
3
+ *
4
+ * Adapter-agnostic syncConversation used by both the MCP server and the CLI.
5
+ *
6
+ * Strategy:
7
+ * 1. If the workspace already has a pinned session ID for any adapter, use
8
+ * that adapter exclusively (prevents cross-adapter message confusion).
9
+ * 2. If no adapter is pinned yet, try each adapter in ALL_TOOLS order and
10
+ * use the first one that discovers an active session for the workspace.
11
+ * 3. Within the chosen adapter, apply the stale-session fallback: if the
12
+ * pinned session returns no messages, re-discover the current session.
13
+ */
14
+ import { ALL_TOOLS } from './tools/index.js';
15
+ import { MessageDiffer } from './differ.js';
16
+ /** All adapters registered across ALL_TOOLS, in priority order. */
17
+ function getAdapters() {
18
+ return ALL_TOOLS.flatMap(t => (t.adapter ? [t.adapter] : []));
19
+ }
20
+ export async function syncConversation(engine, cwd) {
21
+ const adapters = getAdapters();
22
+ // If a session ID is already pinned for any adapter, only use that adapter.
23
+ // This prevents mixing messages from OpenCode and Claude Code in the same branch.
24
+ const pinnedAdapter = adapters.find(a => engine.getSessionId(a.name) != null);
25
+ const candidates = pinnedAdapter ? [pinnedAdapter] : adapters;
26
+ for (const adapter of candidates) {
27
+ let sessionId = engine.getSessionId(adapter.name);
28
+ if (!sessionId) {
29
+ const discovered = await adapter.getCurrentSessionId(cwd);
30
+ if (!discovered)
31
+ continue;
32
+ await engine.setSessionId(adapter.name, discovered);
33
+ sessionId = discovered;
34
+ }
35
+ let messages = await adapter.readMessagesAsync(cwd, sessionId);
36
+ // Stale-session fallback: user may have started a new session since last sync.
37
+ if (messages.length === 0) {
38
+ const freshId = await adapter.getCurrentSessionId(cwd);
39
+ if (!freshId || freshId === sessionId)
40
+ continue;
41
+ await engine.setSessionId(adapter.name, freshId);
42
+ sessionId = freshId;
43
+ messages = await adapter.readMessagesAsync(cwd, sessionId);
44
+ }
45
+ if (messages.length === 0)
46
+ continue;
47
+ const existing = engine.getContext();
48
+ const differ = new MessageDiffer();
49
+ differ.diff(existing);
50
+ const newMessages = differ.diff(messages);
51
+ for (const msg of newMessages) {
52
+ await engine.addMessage(msg.role, msg.content, { source: adapter.name });
53
+ }
54
+ return newMessages.length;
55
+ }
56
+ return 0;
57
+ }
58
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mEAAmE;AACnE,SAAS,WAAW;IAClB,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAmB,EACnB,GAAW;IAEX,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,4EAA4E;IAC5E,kFAAkF;IAClF,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE9D,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAElD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU;gBAAE,SAAS;YAC1B,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACpD,SAAS,GAAG,UAAU,CAAC;QACzB,CAAC;QAED,IAAI,QAAQ,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAE/D,+EAA+E;QAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS;gBAAE,SAAS;YAChD,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjD,SAAS,GAAG,OAAO,CAAC;YACpB,QAAQ,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEpC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @variantree/watcher — Tool Integration Interface
3
+ *
4
+ * Each AI coding tool (OpenCode, Claude Code, Cursor, Gemini, Aider…) gets
5
+ * its own folder under src/tools/<toolname>/ which implements this interface.
6
+ *
7
+ * A tool module exports a single object satisfying ToolIntegration.
8
+ */
9
+ import type { Message } from '@variantree/core';
10
+ /**
11
+ * Reads conversation messages from however the tool stores them
12
+ * (SQLite, JSONL, markdown, etc.).
13
+ */
14
+ export interface SessionAdapter {
15
+ /** Machine-readable name used in log metadata, e.g. "opencode" */
16
+ readonly name: string;
17
+ /**
18
+ * Return the session ID (or file path) for the most recently active session
19
+ * at the given workspace directory. Returns null if none found.
20
+ */
21
+ getCurrentSessionId(workspacePath: string): Promise<string | null>;
22
+ /**
23
+ * Read messages from the tool's storage.
24
+ *
25
+ * @param workspacePath - The project directory
26
+ * @param sessionId - If provided, read only from this session (prevents
27
+ * stale-session imports when a project is recreated at the same path).
28
+ */
29
+ readMessagesAsync(workspacePath: string, sessionId?: string): Promise<Message[]>;
30
+ }
31
+ export interface ToolIntegration {
32
+ /** Machine-readable name, e.g. "opencode", "claudecode" */
33
+ readonly name: string;
34
+ /**
35
+ * Session adapter for reading conversation history.
36
+ * Undefined for tools that don't expose readable sessions (e.g. Cursor).
37
+ */
38
+ readonly adapter?: SessionAdapter;
39
+ /**
40
+ * Register the Variantree MCP server in this tool's global config file.
41
+ * Called once by the postinstall script.
42
+ * Should be idempotent — safe to call multiple times.
43
+ */
44
+ registerGlobalMcp?(): void;
45
+ /**
46
+ * Write or update the standing instructions file for this tool in the
47
+ * given project directory (e.g. AGENTS.md, CLAUDE.md, .cursor/rules/).
48
+ * Should be idempotent — safe to call on every session start.
49
+ */
50
+ writeProjectInstructions(projectDir: string): void;
51
+ }
52
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEnE;;;;;;OAMG;IACH,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;CAClF;AAID,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAElC;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,IAAI,CAAC;IAE3B;;;;OAIG;IACH,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpD"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @variantree/watcher — Tool Integration Interface
3
+ *
4
+ * Each AI coding tool (OpenCode, Claude Code, Cursor, Gemini, Aider…) gets
5
+ * its own folder under src/tools/<toolname>/ which implements this interface.
6
+ *
7
+ * A tool module exports a single object satisfying ToolIntegration.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/tools/base.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Claude Code session adapter.
3
+ *
4
+ * Claude Code (Anthropic CLI) stores conversations as JSONL files:
5
+ * ~/.claude/projects/<path-hash>/<session-id>.jsonl
6
+ *
7
+ * Each line is a JSON object:
8
+ * { "type": "user"|"assistant", "message": { "content": [...] }, "timestamp": "..." }
9
+ *
10
+ * The path hash is the workspace path with slashes replaced by hyphens,
11
+ * percent-encoded, stored under ~/.claude/projects/.
12
+ */
13
+ import type { Message } from '@variantree/core';
14
+ import type { SessionAdapter } from '../base.js';
15
+ export declare class ClaudeCodeAdapter implements SessionAdapter {
16
+ readonly name = "claudecode";
17
+ /** Overridable in tests to point at a temp directory. */
18
+ protected getSessionDir(workspacePath: string): string;
19
+ /**
20
+ * Returns the path to the most recently modified JSONL session file,
21
+ * usable as a session ID for subsequent reads.
22
+ */
23
+ getCurrentSessionId(workspacePath: string): Promise<string | null>;
24
+ readMessagesAsync(workspacePath: string, sessionId?: string): Promise<Message[]>;
25
+ }
26
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/tools/claudecode/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkBjD,qBAAa,iBAAkB,YAAW,cAAc;IACtD,QAAQ,CAAC,IAAI,gBAAgB;IAE7B,yDAAyD;IACzD,SAAS,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAItD;;;OAGG;IACG,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBlE,iBAAiB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAqCvF"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Claude Code session adapter.
3
+ *
4
+ * Claude Code (Anthropic CLI) stores conversations as JSONL files:
5
+ * ~/.claude/projects/<path-hash>/<session-id>.jsonl
6
+ *
7
+ * Each line is a JSON object:
8
+ * { "type": "user"|"assistant", "message": { "content": [...] }, "timestamp": "..." }
9
+ *
10
+ * The path hash is the workspace path with slashes replaced by hyphens,
11
+ * percent-encoded, stored under ~/.claude/projects/.
12
+ */
13
+ import fs from 'node:fs';
14
+ import path from 'node:path';
15
+ import os from 'node:os';
16
+ function getProjectsDir() {
17
+ return path.join(os.homedir(), '.claude', 'projects');
18
+ }
19
+ /**
20
+ * Claude Code encodes the workspace path by replacing path separators with
21
+ * hyphens. E.g. /Users/alice/my-project → -Users-alice-my-project
22
+ */
23
+ function encodeProjectPath(workspacePath) {
24
+ return workspacePath.replace(/\//g, '-');
25
+ }
26
+ function getSessionDir(workspacePath) {
27
+ return path.join(getProjectsDir(), encodeProjectPath(workspacePath));
28
+ }
29
+ export class ClaudeCodeAdapter {
30
+ name = 'claudecode';
31
+ /** Overridable in tests to point at a temp directory. */
32
+ getSessionDir(workspacePath) {
33
+ return getSessionDir(workspacePath);
34
+ }
35
+ /**
36
+ * Returns the path to the most recently modified JSONL session file,
37
+ * usable as a session ID for subsequent reads.
38
+ */
39
+ async getCurrentSessionId(workspacePath) {
40
+ const sessionDir = this.getSessionDir(workspacePath);
41
+ try {
42
+ const entries = fs.readdirSync(sessionDir);
43
+ const jsonlFiles = entries
44
+ .filter(f => f.endsWith('.jsonl'))
45
+ .map(f => path.join(sessionDir, f));
46
+ if (jsonlFiles.length === 0)
47
+ return null;
48
+ let newest = jsonlFiles[0];
49
+ let newestMtime = fs.statSync(newest).mtimeMs;
50
+ for (const f of jsonlFiles.slice(1)) {
51
+ const mtime = fs.statSync(f).mtimeMs;
52
+ if (mtime > newestMtime) {
53
+ newest = f;
54
+ newestMtime = mtime;
55
+ }
56
+ }
57
+ return newest;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ async readMessagesAsync(workspacePath, sessionId) {
64
+ try {
65
+ const filePath = sessionId ?? await this.getCurrentSessionId(workspacePath);
66
+ if (!filePath)
67
+ return [];
68
+ const raw = fs.readFileSync(filePath, 'utf8');
69
+ const messages = [];
70
+ for (const line of raw.split('\n')) {
71
+ const trimmed = line.trim();
72
+ if (!trimmed)
73
+ continue;
74
+ try {
75
+ const entry = JSON.parse(trimmed);
76
+ // JSONL format: { type, message: { role, content }, timestamp }
77
+ const role = entry.message?.role ?? entry.type;
78
+ const content = extractContent(entry.message?.content ?? entry.content);
79
+ if (!content)
80
+ continue;
81
+ const ts = entry.timestamp
82
+ ? new Date(entry.timestamp).getTime()
83
+ : Date.now();
84
+ messages.push({
85
+ id: `cc-${messages.length}-${ts}`,
86
+ role: role === 'human' || role === 'user' ? 'user' : 'assistant',
87
+ content,
88
+ timestamp: ts,
89
+ });
90
+ }
91
+ catch { /* skip malformed lines */ }
92
+ }
93
+ return messages;
94
+ }
95
+ catch {
96
+ return [];
97
+ }
98
+ }
99
+ }
100
+ function extractContent(content) {
101
+ if (typeof content === 'string')
102
+ return content;
103
+ if (Array.isArray(content)) {
104
+ return content
105
+ .filter((b) => b.type === 'text' && b.text)
106
+ .map((b) => b.text)
107
+ .join('');
108
+ }
109
+ return '';
110
+ }
111
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/tools/claudecode/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Claude Code global MCP registration.
3
+ *
4
+ * Writes the Variantree MCP server entry into ~/.claude.json under
5
+ * the `mcpServers` key.
6
+ */
7
+ export declare function registerGlobalMcp(): void;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/tools/claudecode/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,wBAAgB,iBAAiB,IAAI,IAAI,CAexC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Claude Code global MCP registration.
3
+ *
4
+ * Writes the Variantree MCP server entry into ~/.claude.json under
5
+ * the `mcpServers` key.
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import os from 'node:os';
10
+ const MCP_ENTRY = {
11
+ command: 'npx',
12
+ args: ['-y', '@variantree/mcp'],
13
+ env: { VARIANTREE_DIR: '.' },
14
+ };
15
+ function getConfigPath() {
16
+ return path.join(os.homedir(), '.claude.json');
17
+ }
18
+ export function registerGlobalMcp() {
19
+ const configPath = getConfigPath();
20
+ let config = {};
21
+ try {
22
+ config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
23
+ }
24
+ catch { }
25
+ if (!config.mcpServers)
26
+ config.mcpServers = {};
27
+ const servers = config.mcpServers;
28
+ if (servers.variantree)
29
+ return; // already registered
30
+ servers.variantree = MCP_ENTRY;
31
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
32
+ console.log('[variantree] Claude Code: MCP server registered in', configPath);
33
+ }
34
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/tools/claudecode/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,SAAS,GAAG;IAChB,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAC/B,GAAG,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE;CAC7B,CAAC;AAEF,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,MAAM,GAA4B,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAqC,CAAC;IAC7D,IAAI,OAAO,CAAC,UAAU;QAAE,OAAO,CAAC,qBAAqB;IAErD,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAC/B,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,oDAAoD,EAAE,UAAU,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Claude Code tool integration.
3
+ */
4
+ import type { ToolIntegration } from '../base.js';
5
+ export { ClaudeCodeAdapter } from './adapter.js';
6
+ export { writeProjectInstructions } from './instructions.js';
7
+ export { registerGlobalMcp } from './config.js';
8
+ export declare const claudecodeTool: ToolIntegration;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/claudecode/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAKlD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,cAAc,EAAE,eAK5B,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Claude Code tool integration.
3
+ */
4
+ import { ClaudeCodeAdapter } from './adapter.js';
5
+ import { writeProjectInstructions } from './instructions.js';
6
+ import { registerGlobalMcp } from './config.js';
7
+ export { ClaudeCodeAdapter } from './adapter.js';
8
+ export { writeProjectInstructions } from './instructions.js';
9
+ export { registerGlobalMcp } from './config.js';
10
+ export const claudecodeTool = {
11
+ name: 'claudecode',
12
+ adapter: new ClaudeCodeAdapter(),
13
+ registerGlobalMcp,
14
+ writeProjectInstructions,
15
+ };
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/claudecode/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,IAAI,iBAAiB,EAAE;IAChC,iBAAiB;IACjB,wBAAwB;CACzB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Claude Code standing instructions — writes/merges into CLAUDE.md.
3
+ *
4
+ * Claude Code reads CLAUDE.md from the project root (and parent directories).
5
+ */
6
+ export declare function writeProjectInstructions(projectDir: string): void;
7
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../../src/tools/claudecode/instructions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAMjE"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Claude Code standing instructions — writes/merges into CLAUDE.md.
3
+ *
4
+ * Claude Code reads CLAUDE.md from the project root (and parent directories).
5
+ */
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import { mergeInstructions, VARIANTREE_MARKER } from '../instructions.js';
9
+ const FILENAME = 'CLAUDE.md';
10
+ export function writeProjectInstructions(projectDir) {
11
+ const filePath = path.join(projectDir, FILENAME);
12
+ let existing = null;
13
+ try {
14
+ existing = fs.readFileSync(filePath, 'utf8');
15
+ }
16
+ catch { }
17
+ if (existing?.includes(VARIANTREE_MARKER))
18
+ return;
19
+ fs.writeFileSync(filePath, mergeInstructions(existing, 'CLAUDE'), 'utf8');
20
+ }
21
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../../src/tools/claudecode/instructions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE1E,MAAM,QAAQ,GAAG,WAAW,CAAC;AAE7B,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAC9D,IAAI,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * All registered tool integrations.
3
+ *
4
+ * To add a new tool: create src/tools/<toolname>/ implementing ToolIntegration,
5
+ * then add it to the ALL_TOOLS array below.
6
+ */
7
+ export type { ToolIntegration, SessionAdapter } from './base.js';
8
+ export { VARIANTREE_MARKER, VARIANTREE_INSTRUCTIONS_SECTION, mergeInstructions } from './instructions.js';
9
+ export { opencodeTool, OpenCodeAdapter, mergeAgentsMd } from './opencode/index.js';
10
+ export { claudecodeTool, ClaudeCodeAdapter } from './claudecode/index.js';
11
+ import type { ToolIntegration } from './base.js';
12
+ /** Every tool Variantree knows about. Used by postinstall and ensureInstructions. */
13
+ export declare const ALL_TOOLS: ToolIntegration[];
14
+ /**
15
+ * Write standing instructions for all tools into the project directory.
16
+ * Called on every MCP session start and `variantree init`.
17
+ */
18
+ export declare function ensureProjectInstructions(projectDir: string): void;
19
+ /**
20
+ * Register MCP server in all tools' global configs.
21
+ * Called once by the postinstall script.
22
+ */
23
+ export declare function registerAllMcp(): void;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE1G,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAI1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,qFAAqF;AACrF,eAAO,MAAM,SAAS,EAAE,eAAe,EAAmC,CAAC;AAE3E;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAQlE;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAQrC"}