@doriandev/devcc 0.1.2 → 0.2.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 (136) hide show
  1. package/README.md +556 -386
  2. package/bin/devcc.mjs +50 -23
  3. package/dist/devcc/agents/agents.d.ts +112 -0
  4. package/dist/devcc/agents/agents.d.ts.map +1 -0
  5. package/dist/devcc/agents/agents.js +179 -0
  6. package/dist/devcc/agents/agents.js.map +1 -0
  7. package/dist/devcc/app/App.d.ts +15 -0
  8. package/dist/devcc/app/App.d.ts.map +1 -1
  9. package/dist/devcc/app/App.js +326 -17
  10. package/dist/devcc/app/App.js.map +1 -1
  11. package/dist/devcc/app/controlPlaneCommands.d.ts +14 -0
  12. package/dist/devcc/app/controlPlaneCommands.d.ts.map +1 -0
  13. package/dist/devcc/app/controlPlaneCommands.js +179 -0
  14. package/dist/devcc/app/controlPlaneCommands.js.map +1 -0
  15. package/dist/devcc/app/keymap.d.ts.map +1 -1
  16. package/dist/devcc/app/keymap.js +24 -3
  17. package/dist/devcc/app/keymap.js.map +1 -1
  18. package/dist/devcc/automation.d.ts +31 -0
  19. package/dist/devcc/automation.d.ts.map +1 -0
  20. package/dist/devcc/automation.js +202 -0
  21. package/dist/devcc/automation.js.map +1 -0
  22. package/dist/devcc/cli.d.ts.map +1 -1
  23. package/dist/devcc/cli.js +46 -3
  24. package/dist/devcc/cli.js.map +1 -1
  25. package/dist/devcc/components/Sidebar.d.ts.map +1 -1
  26. package/dist/devcc/components/Sidebar.js +1 -0
  27. package/dist/devcc/components/Sidebar.js.map +1 -1
  28. package/dist/devcc/components/primitives.d.ts.map +1 -1
  29. package/dist/devcc/components/primitives.js +3 -0
  30. package/dist/devcc/components/primitives.js.map +1 -1
  31. package/dist/devcc/core/commands.d.ts +25 -0
  32. package/dist/devcc/core/commands.d.ts.map +1 -1
  33. package/dist/devcc/core/commands.js.map +1 -1
  34. package/dist/devcc/core/config.d.ts +69 -3
  35. package/dist/devcc/core/config.d.ts.map +1 -1
  36. package/dist/devcc/core/config.js +185 -5
  37. package/dist/devcc/core/config.js.map +1 -1
  38. package/dist/devcc/core/state.d.ts +19 -1
  39. package/dist/devcc/core/state.d.ts.map +1 -1
  40. package/dist/devcc/core/state.js +6 -0
  41. package/dist/devcc/core/state.js.map +1 -1
  42. package/dist/devcc/environment/EnvironmentService.d.ts +58 -0
  43. package/dist/devcc/environment/EnvironmentService.d.ts.map +1 -0
  44. package/dist/devcc/environment/EnvironmentService.js +159 -0
  45. package/dist/devcc/environment/EnvironmentService.js.map +1 -0
  46. package/dist/devcc/environment/integrations.d.ts +52 -0
  47. package/dist/devcc/environment/integrations.d.ts.map +1 -0
  48. package/dist/devcc/environment/integrations.js +94 -0
  49. package/dist/devcc/environment/integrations.js.map +1 -0
  50. package/dist/devcc/environment/tools.d.ts +51 -0
  51. package/dist/devcc/environment/tools.d.ts.map +1 -0
  52. package/dist/devcc/environment/tools.js +99 -0
  53. package/dist/devcc/environment/tools.js.map +1 -0
  54. package/dist/devcc/git/GitService.d.ts +26 -0
  55. package/dist/devcc/git/GitService.d.ts.map +1 -1
  56. package/dist/devcc/git/GitService.js +71 -2
  57. package/dist/devcc/git/GitService.js.map +1 -1
  58. package/dist/devcc/git/worktrees.d.ts +88 -0
  59. package/dist/devcc/git/worktrees.d.ts.map +1 -0
  60. package/dist/devcc/git/worktrees.js +226 -0
  61. package/dist/devcc/git/worktrees.js.map +1 -0
  62. package/dist/devcc/index.d.ts +13 -3
  63. package/dist/devcc/index.d.ts.map +1 -1
  64. package/dist/devcc/index.js +11 -1
  65. package/dist/devcc/index.js.map +1 -1
  66. package/dist/devcc/platform/launch.d.ts +30 -0
  67. package/dist/devcc/platform/launch.d.ts.map +1 -0
  68. package/dist/devcc/platform/launch.js +93 -0
  69. package/dist/devcc/platform/launch.js.map +1 -0
  70. package/dist/devcc/services/ServiceManager.d.ts +10 -2
  71. package/dist/devcc/services/ServiceManager.d.ts.map +1 -1
  72. package/dist/devcc/services/ServiceManager.js +18 -4
  73. package/dist/devcc/services/ServiceManager.js.map +1 -1
  74. package/dist/devcc/services/ollama.d.ts +64 -5
  75. package/dist/devcc/services/ollama.d.ts.map +1 -1
  76. package/dist/devcc/services/ollama.js +118 -17
  77. package/dist/devcc/services/ollama.js.map +1 -1
  78. package/dist/devcc/services/remote.d.ts +90 -0
  79. package/dist/devcc/services/remote.d.ts.map +1 -0
  80. package/dist/devcc/services/remote.js +233 -0
  81. package/dist/devcc/services/remote.js.map +1 -0
  82. package/dist/devcc/services/types.d.ts +8 -1
  83. package/dist/devcc/services/types.d.ts.map +1 -1
  84. package/dist/devcc/services/types.js.map +1 -1
  85. package/dist/devcc/utils/exec.d.ts +6 -0
  86. package/dist/devcc/utils/exec.d.ts.map +1 -1
  87. package/dist/devcc/utils/exec.js +12 -2
  88. package/dist/devcc/utils/exec.js.map +1 -1
  89. package/dist/devcc/verify/verify.d.ts +107 -0
  90. package/dist/devcc/verify/verify.d.ts.map +1 -0
  91. package/dist/devcc/verify/verify.js +203 -0
  92. package/dist/devcc/verify/verify.js.map +1 -0
  93. package/dist/devcc/views/OverviewView.d.ts.map +1 -1
  94. package/dist/devcc/views/OverviewView.js +55 -1
  95. package/dist/devcc/views/OverviewView.js.map +1 -1
  96. package/dist/devcc/views/ServicesView.d.ts +2 -0
  97. package/dist/devcc/views/ServicesView.d.ts.map +1 -1
  98. package/dist/devcc/views/ServicesView.js +15 -0
  99. package/dist/devcc/views/ServicesView.js.map +1 -1
  100. package/dist/devcc/views/SystemView.d.ts +10 -1
  101. package/dist/devcc/views/SystemView.d.ts.map +1 -1
  102. package/dist/devcc/views/SystemView.js +127 -19
  103. package/dist/devcc/views/SystemView.js.map +1 -1
  104. package/dist/devcc/views/WorktreesView.d.ts +48 -0
  105. package/dist/devcc/views/WorktreesView.d.ts.map +1 -0
  106. package/dist/devcc/views/WorktreesView.js +235 -0
  107. package/dist/devcc/views/WorktreesView.js.map +1 -0
  108. package/package.json +1 -1
  109. package/src/devcc/agents/agents.ts +282 -0
  110. package/src/devcc/app/App.ts +376 -20
  111. package/src/devcc/app/controlPlaneCommands.ts +197 -0
  112. package/src/devcc/app/keymap.ts +24 -3
  113. package/src/devcc/automation.ts +242 -0
  114. package/src/devcc/cli.ts +45 -3
  115. package/src/devcc/components/Sidebar.ts +1 -0
  116. package/src/devcc/components/primitives.ts +3 -0
  117. package/src/devcc/core/commands.ts +26 -0
  118. package/src/devcc/core/config.ts +271 -11
  119. package/src/devcc/core/state.ts +25 -0
  120. package/src/devcc/environment/EnvironmentService.ts +215 -0
  121. package/src/devcc/environment/integrations.ts +133 -0
  122. package/src/devcc/environment/tools.ts +151 -0
  123. package/src/devcc/git/GitService.ts +104 -2
  124. package/src/devcc/git/worktrees.ts +256 -0
  125. package/src/devcc/index.ts +57 -2
  126. package/src/devcc/platform/launch.ts +125 -0
  127. package/src/devcc/services/ServiceManager.ts +15 -3
  128. package/src/devcc/services/ollama.ts +162 -19
  129. package/src/devcc/services/remote.ts +306 -0
  130. package/src/devcc/services/types.ts +9 -1
  131. package/src/devcc/utils/exec.ts +26 -2
  132. package/src/devcc/verify/verify.ts +316 -0
  133. package/src/devcc/views/OverviewView.ts +76 -1
  134. package/src/devcc/views/ServicesView.ts +17 -0
  135. package/src/devcc/views/SystemView.ts +144 -22
  136. package/src/devcc/views/WorktreesView.ts +270 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnvironmentService.js","sourceRoot":"","sources":["../../../src/devcc/environment/EnvironmentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,OAAO,EACL,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,GAGZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,SAAS,GAKV,MAAM,YAAY,CAAA;AAWnB,MAAM,CAAC,MAAM,iBAAiB,GAAwB;IACpD,KAAK,EAAE,EAAE;IACT,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxC,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/D,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,KAAK;CAChB,CAAA;AAkBD;;;;;;GAMG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAsC;IAO/C;IANrB,QAAQ,GAAwB,iBAAiB,CAAA;IACjD,OAAO,GAAwC,IAAI,CAAA;IAC1C,GAAG,CAAM;IACT,KAAK,CAAO;IACZ,GAAG,CAAmB;IAEvC,YAA6B,OAAkC;QAC7D,KAAK,EAAE,CAAA;QADoB,YAAO,GAAP,OAAO,CAA2B;QAE7D,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;QACrC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAA;QAC9B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;IAC3F,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,yDAAyD;IACzD,OAAO;QACL,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACrC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YACxC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACrB,CAAC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;IACjE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;QAClD,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAA;QACrF,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;YACzD,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YACzB,SAAS,EAAE,MAAM;YACjB,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,UAAU,CAAC;gBACnB,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,qBAAqB;gBAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS;aAC1C,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,aAAa,CAAA;QACvD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAC7B,UAAU,CAAC,UAAU,EAAE;YACrB,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAC9B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACtE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;SAClC,CAAC,CACH,CACF,CAAA;QAED,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;QAC1F,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;SACvC,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,sBAAsB,EAAE;YACjD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;SACzE,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IACtF,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,SAAkB;QACzC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE;YAC/C,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YACzB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK;YAC1C,mFAAmF;YACnF,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;SAC5B,CAAC,CAAA;QACF,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAA;QACnG,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAA;QAChG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAA;IAClE,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,SAAkB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,UAAU,CAAA;QAChD,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;aAC/C,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAE/B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,SAAS;gBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBAC9B,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC;oBAChC,CAAC,CAAC,qDAAqD;oBACvD,CAAC,CAAC,SAAS;aACd,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG;YACd,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YACzB,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,KAAK;YAC1C,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;SAC5B,CAAA;QACD,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;QACpE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;QAC1F,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,SAAS;gBACnB,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE,MAAM,CAAC,QAAQ;oBACpB,CAAC,CAAC,+BAA+B;oBACjC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,sBAAsB,CAAC;aACzD,CAAA;QACH,CAAC;QAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC/C,OAAO;YACL,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACrD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;SACvE,CAAA;IACH,CAAC;IAEO,OAAO,CAAC,QAA6B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAA;QAC1C,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Pure parsers for mise and direnv. Both tools offer machine-readable output,
3
+ * so nothing here scrapes their human-oriented formatting.
4
+ */
5
+ export interface RuntimeVersion {
6
+ tool: string;
7
+ version: string;
8
+ /** What the config asked for, e.g. `22` or `lts`. */
9
+ requested?: string;
10
+ /** Config file that pinned it. */
11
+ source?: string;
12
+ installed: boolean;
13
+ active: boolean;
14
+ }
15
+ export interface MiseStatus {
16
+ installed: boolean;
17
+ runtimes: RuntimeVersion[];
18
+ /** Set when mise is installed but could not report (e.g. untrusted config). */
19
+ error?: string;
20
+ }
21
+ /** `mise ls --current --json`: an object keyed by tool name, each an array of version records. */
22
+ export declare const MISE_ARGS: readonly ["ls", "--current", "--json"];
23
+ export declare function parseMiseLs(output: string): RuntimeVersion[];
24
+ /** Turn a failed `mise ls` into a short, actionable message. */
25
+ export declare function miseErrorMessage(stderr: string): string;
26
+ export type DirenvApproval = "allowed" | "not-allowed" | "denied" | "unknown";
27
+ export interface DirenvStatus {
28
+ installed: boolean;
29
+ /** The `.envrc` direnv would load for this project, if any. */
30
+ rcPath?: string;
31
+ approval: DirenvApproval;
32
+ /**
33
+ * Whether devcc's own environment has this `.envrc` loaded (it was started
34
+ * from a direnv-enabled shell in the project). Null when there is nothing to load.
35
+ */
36
+ loaded: boolean | null;
37
+ error?: string;
38
+ }
39
+ /**
40
+ * Parse `direnv status --json`, falling back to the plain `direnv status`
41
+ * text for versions without JSON support.
42
+ */
43
+ export declare function parseDirenvStatus(output: string): {
44
+ rcPath?: string;
45
+ approval: DirenvApproval;
46
+ };
47
+ /**
48
+ * direnv exports `DIRENV_DIR=-<dir>` into shells where it loaded an `.envrc`.
49
+ * If devcc inherited that for this `.envrc`'s directory, the environment is loaded.
50
+ */
51
+ export declare function isDirenvLoaded(rcPath: string, env?: NodeJS.ProcessEnv): boolean;
52
+ //# sourceMappingURL=integrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../src/devcc/environment/integrations.ts"],"names":[],"mappings":"AAGA;;;GAGG;AAMH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,kGAAkG;AAClG,eAAO,MAAM,SAAS,wCAAyC,CAAA;AAE/D,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CA6B5D;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGvD;AAMD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE7E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAA;IAClB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB;;;OAGG;IACH,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAiBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,CAc/F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAI5F"}
@@ -0,0 +1,94 @@
1
+ import { dirname } from "node:path";
2
+ import { firstLine } from "./tools.js";
3
+ /** `mise ls --current --json`: an object keyed by tool name, each an array of version records. */
4
+ export const MISE_ARGS = ["ls", "--current", "--json"];
5
+ export function parseMiseLs(output) {
6
+ let data;
7
+ try {
8
+ data = JSON.parse(output);
9
+ }
10
+ catch {
11
+ return [];
12
+ }
13
+ if (typeof data !== "object" || data === null || Array.isArray(data))
14
+ return [];
15
+ const runtimes = [];
16
+ for (const [tool, records] of Object.entries(data)) {
17
+ if (!Array.isArray(records))
18
+ continue;
19
+ for (const record of records) {
20
+ if (typeof record !== "object" || record === null)
21
+ continue;
22
+ const entry = record;
23
+ const version = typeof entry.version === "string" ? entry.version : undefined;
24
+ if (!version)
25
+ continue;
26
+ const source = entry.source;
27
+ runtimes.push({
28
+ tool,
29
+ version,
30
+ requested: typeof entry.requested_version === "string" ? entry.requested_version : undefined,
31
+ source: typeof source?.path === "string" ? source.path : undefined,
32
+ installed: entry.installed !== false,
33
+ active: entry.active === true,
34
+ });
35
+ }
36
+ }
37
+ return runtimes.sort((a, b) => a.tool.localeCompare(b.tool));
38
+ }
39
+ /** Turn a failed `mise ls` into a short, actionable message. */
40
+ export function miseErrorMessage(stderr) {
41
+ if (/not trusted/iu.test(stderr))
42
+ return "config is not trusted - run `mise trust` if you expect it";
43
+ return firstLine(stderr.replace(/^mise\s+(ERROR|WARN)\s*/imu, "")) ?? "mise ls failed";
44
+ }
45
+ /** direnv's numeric allow states (`internal/cmd/rc.go`). */
46
+ const APPROVAL_CODES = { 0: "allowed", 1: "not-allowed", 2: "denied" };
47
+ function approvalFrom(value) {
48
+ if (typeof value === "number")
49
+ return APPROVAL_CODES[value] ?? "unknown";
50
+ if (typeof value === "boolean")
51
+ return value ? "allowed" : "not-allowed";
52
+ if (typeof value === "string") {
53
+ const numeric = Number(value);
54
+ if (value.trim() !== "" && Number.isInteger(numeric))
55
+ return APPROVAL_CODES[numeric] ?? "unknown";
56
+ if (value === "true")
57
+ return "allowed";
58
+ if (value === "false")
59
+ return "not-allowed";
60
+ }
61
+ return "unknown";
62
+ }
63
+ /**
64
+ * Parse `direnv status --json`, falling back to the plain `direnv status`
65
+ * text for versions without JSON support.
66
+ */
67
+ export function parseDirenvStatus(output) {
68
+ try {
69
+ const data = JSON.parse(output);
70
+ const found = data.state?.foundRC;
71
+ if (!found || typeof found.path !== "string")
72
+ return { approval: "unknown" };
73
+ return { rcPath: found.path, approval: approvalFrom(found.allowed) };
74
+ }
75
+ catch {
76
+ // Not JSON: older direnv. Fall through to the text format.
77
+ }
78
+ const path = /^Found RC path (.+)$/mu.exec(output)?.[1]?.trim();
79
+ if (!path)
80
+ return { approval: "unknown" };
81
+ const allowed = /^Found RC allowed (.+)$/mu.exec(output)?.[1]?.trim();
82
+ return { rcPath: path, approval: allowed === undefined ? "unknown" : approvalFrom(allowed) };
83
+ }
84
+ /**
85
+ * direnv exports `DIRENV_DIR=-<dir>` into shells where it loaded an `.envrc`.
86
+ * If devcc inherited that for this `.envrc`'s directory, the environment is loaded.
87
+ */
88
+ export function isDirenvLoaded(rcPath, env = process.env) {
89
+ const dir = env.DIRENV_DIR;
90
+ if (!dir)
91
+ return false;
92
+ return dir.replace(/^-/u, "") === dirname(rcPath);
93
+ }
94
+ //# sourceMappingURL=integrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrations.js","sourceRoot":"","sources":["../../../src/devcc/environment/integrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { type ExecOptions, type ExecResult } from "../utils/exec.js";
2
+ /**
3
+ * Tool detection for the Environment panel and `devcc env`.
4
+ *
5
+ * Observation only: devcc reports what is installed and whether it answers, it
6
+ * never installs or upgrades anything. A missing tool is a normal state, not
7
+ * an error.
8
+ */
9
+ export type ToolHealth = "ready" | "warning" | "error";
10
+ export interface ToolStatus {
11
+ id: string;
12
+ name: string;
13
+ installed: boolean;
14
+ version?: string;
15
+ /** Resolved executable path. */
16
+ path?: string;
17
+ /** Absent when the tool is not installed. */
18
+ status?: ToolHealth;
19
+ message?: string;
20
+ }
21
+ export interface ToolDefinition {
22
+ id: string;
23
+ name: string;
24
+ command: string;
25
+ /** Arguments that print a version (default `--version`). */
26
+ versionArgs?: string[];
27
+ /** Capture group 1 is the version; defaults to the first dotted number. */
28
+ versionPattern?: RegExp;
29
+ /** Absolute paths to try when the command is not on PATH (e.g. app bundles). */
30
+ fallbackPaths?: string[];
31
+ }
32
+ export declare const DEFAULT_TOOLS: readonly ToolDefinition[];
33
+ export declare const TOOL_TIMEOUT_MS = 3000;
34
+ /** First `x.y[.z…]` version in the output, or the pattern's first group. */
35
+ export declare function parseVersion(output: string, pattern?: RegExp): string | undefined;
36
+ export type Which = (command: string) => string | undefined;
37
+ /** Look a command up on PATH the way a shell would, without running a shell. */
38
+ export declare function findExecutable(command: string, pathEnv?: string, isExecutable?: (path: string) => boolean): string | undefined;
39
+ export type Exec = (command: string, args: readonly string[], options?: ExecOptions) => Promise<ExecResult>;
40
+ export interface DetectToolDeps {
41
+ run?: Exec;
42
+ which?: Which;
43
+ timeoutMs?: number;
44
+ }
45
+ /**
46
+ * Detect one tool: resolve it on PATH, then ask for its version with a hard
47
+ * timeout. Never throws - every failure becomes diagnostic state.
48
+ */
49
+ export declare function detectTool(definition: ToolDefinition, deps?: DetectToolDeps): Promise<ToolStatus>;
50
+ export declare function firstLine(text: string): string | undefined;
51
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/devcc/environment/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE1E;;;;;;GAMG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;AAEtD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,cAAc,EAoBlD,CAAA;AAED,eAAO,MAAM,eAAe,OAAQ,CAAA;AAEpC,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQjF;AAED,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;AAE3D,gFAAgF;AAChF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAA+B,EACxC,YAAY,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACnD,MAAM,GAAG,SAAS,CAQpB;AAWD,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;AAE3G,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,CA+B3G;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM1D"}
@@ -0,0 +1,99 @@
1
+ import { accessSync, constants } from "node:fs";
2
+ import { delimiter, isAbsolute, join } from "node:path";
3
+ import { exec } from "../utils/exec.js";
4
+ export const DEFAULT_TOOLS = [
5
+ { id: "node", name: "Node", command: "node" },
6
+ { id: "pnpm", name: "pnpm", command: "pnpm" },
7
+ { id: "npm", name: "npm", command: "npm" },
8
+ { id: "bun", name: "Bun", command: "bun" },
9
+ { id: "git", name: "Git", command: "git" },
10
+ { id: "mise", name: "mise", command: "mise" },
11
+ { id: "direnv", name: "direnv", command: "direnv", versionArgs: ["version"] },
12
+ { id: "docker", name: "Docker", command: "docker" },
13
+ { id: "cargo", name: "Rust/Cargo", command: "cargo" },
14
+ { id: "claude", name: "Claude Code", command: "claude" },
15
+ { id: "codex", name: "Codex", command: "codex" },
16
+ {
17
+ id: "tailscale",
18
+ name: "Tailscale",
19
+ command: "tailscale",
20
+ versionArgs: ["version"],
21
+ fallbackPaths: ["/Applications/Tailscale.app/Contents/MacOS/Tailscale"],
22
+ },
23
+ { id: "ollama", name: "Ollama", command: "ollama" },
24
+ ];
25
+ export const TOOL_TIMEOUT_MS = 3_000;
26
+ /** First `x.y[.z…]` version in the output, or the pattern's first group. */
27
+ export function parseVersion(output, pattern) {
28
+ const text = output.trim();
29
+ if (text === "")
30
+ return undefined;
31
+ if (pattern) {
32
+ const match = pattern.exec(text);
33
+ if (match?.[1])
34
+ return match[1];
35
+ }
36
+ return /\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?/u.exec(text)?.[0];
37
+ }
38
+ /** Look a command up on PATH the way a shell would, without running a shell. */
39
+ export function findExecutable(command, pathEnv = process.env.PATH ?? "", isExecutable = canExecute) {
40
+ if (command.includes("/"))
41
+ return isAbsolute(command) && isExecutable(command) ? command : undefined;
42
+ for (const dir of pathEnv.split(delimiter)) {
43
+ if (dir === "")
44
+ continue;
45
+ const candidate = join(dir, command);
46
+ if (isExecutable(candidate))
47
+ return candidate;
48
+ }
49
+ return undefined;
50
+ }
51
+ function canExecute(path) {
52
+ try {
53
+ accessSync(path, constants.X_OK);
54
+ return true;
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ /**
61
+ * Detect one tool: resolve it on PATH, then ask for its version with a hard
62
+ * timeout. Never throws - every failure becomes diagnostic state.
63
+ */
64
+ export async function detectTool(definition, deps = {}) {
65
+ const which = deps.which ?? ((command) => findExecutable(command));
66
+ const run = deps.run ?? exec;
67
+ const timeoutMs = deps.timeoutMs ?? TOOL_TIMEOUT_MS;
68
+ const base = { id: definition.id, name: definition.name };
69
+ const path = which(definition.command) ?? definition.fallbackPaths?.find((candidate) => which(candidate) !== undefined);
70
+ if (!path)
71
+ return { ...base, installed: false, message: "not installed" };
72
+ let result;
73
+ try {
74
+ result = await run(path, definition.versionArgs ?? ["--version"], { timeoutMs });
75
+ }
76
+ catch (error) {
77
+ return { ...base, installed: true, path, status: "error", message: String(error) };
78
+ }
79
+ if (result.timedOut) {
80
+ return { ...base, installed: true, path, status: "warning", message: `no answer within ${timeoutMs}ms` };
81
+ }
82
+ if (result.spawnError) {
83
+ return { ...base, installed: true, path, status: "error", message: result.spawnError.message };
84
+ }
85
+ if (!result.ok) {
86
+ const reason = firstLine(result.stderr) ?? firstLine(result.stdout) ?? `exited with code ${result.code ?? "?"}`;
87
+ return { ...base, installed: true, path, status: "error", message: reason };
88
+ }
89
+ const version = parseVersion(result.stdout || result.stderr, definition.versionPattern);
90
+ return { ...base, installed: true, path, version, status: "ready" };
91
+ }
92
+ export function firstLine(text) {
93
+ const line = text
94
+ .split("\n")
95
+ .map((entry) => entry.trim())
96
+ .find((entry) => entry !== "");
97
+ return line;
98
+ }
99
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/devcc/environment/tools.ts"],"names":[],"mappings":"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"}
@@ -2,17 +2,27 @@ import { TypedEmitter } from "../core/events.js";
2
2
  import { DevccError } from "../utils/errors.js";
3
3
  import type { ScopedLogger } from "../utils/logger.js";
4
4
  import { type GitCommit, type GitStatus } from "./parse.js";
5
+ import { type GitWorktree } from "./worktrees.js";
5
6
  export interface GitSnapshot {
6
7
  available: boolean;
7
8
  isRepository: boolean;
8
9
  status: GitStatus;
9
10
  commits: GitCommit[];
11
+ /** Every worktree of the repository, current one flagged. Empty outside a repo. */
12
+ worktrees: GitWorktree[];
10
13
  version: string | null;
11
14
  lastRefreshedAt: Date | null;
12
15
  /** Set when the last refresh failed; the previous snapshot is kept. */
13
16
  error: string | null;
14
17
  }
15
18
  export declare const EMPTY_GIT_SNAPSHOT: GitSnapshot;
19
+ export interface CreateWorktreeInput {
20
+ branch: string;
21
+ /** Start point when the branch does not exist yet (default: HEAD). */
22
+ base?: string;
23
+ /** Absolute destination directory. */
24
+ path: string;
25
+ }
16
26
  export type GitServiceEvents = {
17
27
  "git:changed": [GitSnapshot];
18
28
  "git:error": [DevccError];
@@ -51,9 +61,25 @@ export declare class GitService extends TypedEmitter<GitServiceEvents> {
51
61
  /** Destructive: throws away worktree changes. Callers must confirm first. */
52
62
  discard(paths: readonly string[]): Promise<void>;
53
63
  commit(message: string): Promise<void>;
64
+ /** Fresh worktree list, independent of the polling snapshot. */
65
+ listWorktrees(): Promise<GitWorktree[]>;
66
+ /**
67
+ * Create a worktree. An existing local branch is checked out; otherwise the
68
+ * branch is created from `base` (default HEAD). Input is validated before git
69
+ * runs, and git's own ref check has the final word on the branch name.
70
+ */
71
+ createWorktree(input: CreateWorktreeInput): Promise<string>;
72
+ /**
73
+ * Remove a worktree without `--force`. devcc refuses the main and current
74
+ * worktrees and ones with running work (`busy`); git refuses dirty ones, and
75
+ * that refusal is surfaced verbatim rather than overridden.
76
+ */
77
+ removeWorktree(path: string, busy?: readonly string[]): Promise<void>;
54
78
  /** Read-only diff for the inspect panel. */
55
79
  diff(path: string, staged: boolean): Promise<string>;
56
80
  private mutate;
81
+ /** Real path of the project root, so git's resolved paths compare equal (macOS /var -> /private/var). */
82
+ private currentPath;
57
83
  private git;
58
84
  private publish;
59
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GitService.d.ts","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAKL,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,OAAO,CAAA;IACrB,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,eAAe,EAAE,IAAI,GAAG,IAAI,CAAA;IAC5B,uEAAuE;IACvE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,eAAO,MAAM,kBAAkB,EAAE,WAQhC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,CAAC,WAAW,CAAC,CAAA;IAC5B,WAAW,EAAE,CAAC,UAAU,CAAC,CAAA;CAC1B,CAAA;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,YAAY,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,UAAW,SAAQ,YAAY,CAAC,gBAAgB,CAAC;IAMhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEL,OAAO,EAAE,iBAAiB;IAMvD,WAAW,IAAI,WAAW;IAI1B,qEAAqE;IAC/D,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;YAQvB,SAAS;IA6CvB,kEAAkE;IAC5D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,OAAO,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD,6EAA6E;IACvE,OAAO,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,4CAA4C;IACtC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAQ5C,MAAM;IAiBpB,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,OAAO;CAKhB"}
1
+ {"version":3,"file":"GitService.d.ts","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,16 @@
1
1
  import { TypedEmitter } from "../core/events.js";
2
2
  import { DevccError } from "../utils/errors.js";
3
+ import { existsSync, realpathSync } from "node:fs";
4
+ import { resolve } from "node:path";
3
5
  import { exec } from "../utils/exec.js";
4
6
  import { EMPTY_GIT_STATUS, LOG_FORMAT, parseCommits, parsePorcelainV2, } from "./parse.js";
7
+ import { parseWorktreeList, removalBlocker, validateBranchName, validateRef, validateWorktreePath, worktreeAddArgs, worktreeRemoveArgs, } from "./worktrees.js";
5
8
  export const EMPTY_GIT_SNAPSHOT = {
6
9
  available: false,
7
10
  isRepository: false,
8
11
  status: EMPTY_GIT_STATUS,
9
12
  commits: [],
13
+ worktrees: [],
10
14
  version: null,
11
15
  lastRefreshedAt: null,
12
16
  error: null,
@@ -43,10 +47,11 @@ export class GitService extends TypedEmitter {
43
47
  return this.refreshing;
44
48
  }
45
49
  async doRefresh() {
46
- const [versionResult, statusResult, logResult] = await Promise.all([
50
+ const [versionResult, statusResult, logResult, worktreeResult] = await Promise.all([
47
51
  this.git(["--version"]),
48
52
  this.git(["status", "--porcelain=v2", "--branch", "--untracked-files=all"]),
49
53
  this.git(["log", `--max-count=${this.commitLimit}`, `--pretty=format:${LOG_FORMAT}`]),
54
+ this.git(["worktree", "list", "--porcelain"]),
50
55
  ]);
51
56
  const available = versionResult.spawnError === undefined;
52
57
  if (!available) {
@@ -66,6 +71,7 @@ export class GitService extends TypedEmitter {
66
71
  isRepository: false,
67
72
  status: EMPTY_GIT_STATUS,
68
73
  commits: [],
74
+ worktrees: [],
69
75
  version,
70
76
  lastRefreshedAt: new Date(),
71
77
  error: notARepo ? null : statusResult.stderr.trim() || "git status failed",
@@ -77,6 +83,7 @@ export class GitService extends TypedEmitter {
77
83
  status: parsePorcelainV2(statusResult.stdout),
78
84
  // A fresh repository with no commits fails `git log`; an empty list is correct there.
79
85
  commits: logResult.ok ? parseCommits(logResult.stdout) : [],
86
+ worktrees: worktreeResult.ok ? parseWorktreeList(worktreeResult.stdout, this.currentPath()) : [],
80
87
  version,
81
88
  lastRefreshedAt: new Date(),
82
89
  error: null,
@@ -118,6 +125,55 @@ export class GitService extends TypedEmitter {
118
125
  }
119
126
  await this.mutate(["commit", "--message", trimmed], "git commit");
120
127
  }
128
+ /** Fresh worktree list, independent of the polling snapshot. */
129
+ async listWorktrees() {
130
+ const result = await this.git(["worktree", "list", "--porcelain"]);
131
+ if (!result.ok) {
132
+ throw new DevccError({
133
+ scope: "git",
134
+ message: "git worktree list failed",
135
+ detail: result.stderr.trim() || (result.spawnError ? "git executable not found" : undefined),
136
+ });
137
+ }
138
+ return parseWorktreeList(result.stdout, this.currentPath());
139
+ }
140
+ /**
141
+ * Create a worktree. An existing local branch is checked out; otherwise the
142
+ * branch is created from `base` (default HEAD). Input is validated before git
143
+ * runs, and git's own ref check has the final word on the branch name.
144
+ */
145
+ async createWorktree(input) {
146
+ const branch = input.branch.trim();
147
+ const base = input.base?.trim() || undefined;
148
+ const path = resolve(input.path.trim());
149
+ const problem = validateBranchName(branch) ??
150
+ (base ? validateRef(base) : null) ??
151
+ validateWorktreePath(path, existsSync);
152
+ if (problem)
153
+ throw new DevccError({ scope: "git", message: problem });
154
+ const refCheck = await this.git(["check-ref-format", "--branch", branch]);
155
+ if (!refCheck.ok) {
156
+ throw new DevccError({ scope: "git", message: `"${branch}" is not a valid branch name` });
157
+ }
158
+ const existing = await this.git(["show-ref", "--verify", "--quiet", `refs/heads/${branch}`]);
159
+ const createBranch = !existing.ok;
160
+ await this.mutate(worktreeAddArgs({ path, branch, base: createBranch ? base : undefined, createBranch }), "git worktree add", 60_000);
161
+ return path;
162
+ }
163
+ /**
164
+ * Remove a worktree without `--force`. devcc refuses the main and current
165
+ * worktrees and ones with running work (`busy`); git refuses dirty ones, and
166
+ * that refusal is surfaced verbatim rather than overridden.
167
+ */
168
+ async removeWorktree(path, busy = []) {
169
+ const target = (await this.listWorktrees()).find((worktree) => worktree.path === path);
170
+ if (!target)
171
+ throw new DevccError({ scope: "git", message: `${path} is not a worktree of this repository` });
172
+ const blocker = removalBlocker(target, busy);
173
+ if (blocker)
174
+ throw new DevccError({ scope: "git", message: blocker });
175
+ await this.mutate(worktreeRemoveArgs(target.path), "git worktree remove");
176
+ }
121
177
  /** Read-only diff for the inspect panel. */
122
178
  async diff(path, staged) {
123
179
  const args = ["--no-pager", "diff", "--no-color"];
@@ -132,9 +188,12 @@ export class GitService extends TypedEmitter {
132
188
  if (!result.ok) {
133
189
  const detail = [result.stdout, result.stderr].filter(Boolean).join("\n").trim();
134
190
  this.options.logger.warn(`${label} failed`, { code: result.code, detail });
191
+ // Prefer git's fatal/error line: progress chatter ("Preparing worktree…") can come first.
192
+ const lines = detail.split("\n");
193
+ const reason = (lines.find((line) => /^(fatal|error): /u.test(line)) ?? lines[0])?.replace(/^(fatal|error): /u, "");
135
194
  const error = new DevccError({
136
195
  scope: "git",
137
- message: `${label} failed`,
196
+ message: reason ? `${label} failed: ${reason}` : `${label} failed`,
138
197
  detail: detail || (result.timedOut ? "timed out" : undefined),
139
198
  });
140
199
  this.emit("git:error", error);
@@ -143,10 +202,20 @@ export class GitService extends TypedEmitter {
143
202
  this.options.logger.info(`${label} ok`);
144
203
  await this.refresh();
145
204
  }
205
+ /** Real path of the project root, so git's resolved paths compare equal (macOS /var -> /private/var). */
206
+ currentPath() {
207
+ try {
208
+ return realpathSync(this.options.rootDir);
209
+ }
210
+ catch {
211
+ return resolve(this.options.rootDir);
212
+ }
213
+ }
146
214
  git(args, timeoutMs) {
147
215
  return exec("git", args, {
148
216
  cwd: this.options.rootDir,
149
217
  timeoutMs: timeoutMs ?? this.timeoutMs,
218
+ logger: this.options.logger,
150
219
  // Never let git open an editor or a credential prompt under the TUI.
151
220
  env: { ...process.env, GIT_TERMINAL_PROMPT: "0", GIT_OPTIONAL_LOCKS: "0", GIT_EDITOR: "true" },
152
221
  });
@@ -1 +1 @@
1
- {"version":3,"file":"GitService.js","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GitService.js","sourceRoot":"","sources":["../../../src/devcc/git/GitService.ts"],"names":[],"mappings":"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"}