@g-abhishek/gitx 0.1.1 β†’ 0.1.4

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 (161) hide show
  1. package/README.md +374 -3
  2. package/dist/ai/claudeAi.d.ts +35 -0
  3. package/dist/ai/claudeAi.d.ts.map +1 -0
  4. package/dist/ai/claudeAi.js +396 -0
  5. package/dist/ai/claudeAi.js.map +1 -0
  6. package/dist/ai/claudeCliAi.d.ts +27 -0
  7. package/dist/ai/claudeCliAi.d.ts.map +1 -0
  8. package/dist/ai/claudeCliAi.js +312 -0
  9. package/dist/ai/claudeCliAi.js.map +1 -0
  10. package/dist/ai/localClaudeAi.d.ts +2 -0
  11. package/dist/ai/localClaudeAi.d.ts.map +1 -0
  12. package/dist/ai/localClaudeAi.js +4 -0
  13. package/dist/ai/localClaudeAi.js.map +1 -0
  14. package/dist/ai/mockAi.d.ts +8 -1
  15. package/dist/ai/mockAi.d.ts.map +1 -1
  16. package/dist/ai/mockAi.js +57 -0
  17. package/dist/ai/mockAi.js.map +1 -1
  18. package/dist/ai/openAiAi.d.ts +33 -0
  19. package/dist/ai/openAiAi.d.ts.map +1 -0
  20. package/dist/ai/openAiAi.js +388 -0
  21. package/dist/ai/openAiAi.js.map +1 -0
  22. package/dist/ai/reviewHelpers.d.ts +66 -0
  23. package/dist/ai/reviewHelpers.d.ts.map +1 -0
  24. package/dist/ai/reviewHelpers.js +559 -0
  25. package/dist/ai/reviewHelpers.js.map +1 -0
  26. package/dist/ai/types.d.ts +247 -0
  27. package/dist/ai/types.d.ts.map +1 -1
  28. package/dist/ai/types.js.map +1 -1
  29. package/dist/cli/commands/ask.d.ts +27 -0
  30. package/dist/cli/commands/ask.d.ts.map +1 -0
  31. package/dist/cli/commands/ask.js +230 -0
  32. package/dist/cli/commands/ask.js.map +1 -0
  33. package/dist/cli/commands/commit.d.ts +16 -0
  34. package/dist/cli/commands/commit.d.ts.map +1 -0
  35. package/dist/cli/commands/commit.js +163 -0
  36. package/dist/cli/commands/commit.js.map +1 -0
  37. package/dist/cli/commands/config.d.ts +4 -0
  38. package/dist/cli/commands/config.d.ts.map +1 -0
  39. package/dist/cli/commands/config.js +666 -0
  40. package/dist/cli/commands/config.js.map +1 -0
  41. package/dist/cli/commands/implement.d.ts.map +1 -1
  42. package/dist/cli/commands/implement.js +149 -28
  43. package/dist/cli/commands/implement.js.map +1 -1
  44. package/dist/cli/commands/init.d.ts +4 -0
  45. package/dist/cli/commands/init.d.ts.map +1 -1
  46. package/dist/cli/commands/init.js +7 -54
  47. package/dist/cli/commands/init.js.map +1 -1
  48. package/dist/cli/commands/port.d.ts +32 -0
  49. package/dist/cli/commands/port.d.ts.map +1 -0
  50. package/dist/cli/commands/port.js +554 -0
  51. package/dist/cli/commands/port.js.map +1 -0
  52. package/dist/cli/commands/pr/close.d.ts +15 -0
  53. package/dist/cli/commands/pr/close.d.ts.map +1 -0
  54. package/dist/cli/commands/pr/close.js +71 -0
  55. package/dist/cli/commands/pr/close.js.map +1 -0
  56. package/dist/cli/commands/pr/create.d.ts +17 -0
  57. package/dist/cli/commands/pr/create.d.ts.map +1 -1
  58. package/dist/cli/commands/pr/create.js +209 -5
  59. package/dist/cli/commands/pr/create.js.map +1 -1
  60. package/dist/cli/commands/pr/fixComments.d.ts.map +1 -1
  61. package/dist/cli/commands/pr/fixComments.js +77 -5
  62. package/dist/cli/commands/pr/fixComments.js.map +1 -1
  63. package/dist/cli/commands/pr/index.d.ts.map +1 -1
  64. package/dist/cli/commands/pr/index.js +4 -0
  65. package/dist/cli/commands/pr/index.js.map +1 -1
  66. package/dist/cli/commands/pr/list.d.ts.map +1 -1
  67. package/dist/cli/commands/pr/list.js +26 -3
  68. package/dist/cli/commands/pr/list.js.map +1 -1
  69. package/dist/cli/commands/pr/merge.d.ts +23 -0
  70. package/dist/cli/commands/pr/merge.d.ts.map +1 -0
  71. package/dist/cli/commands/pr/merge.js +191 -0
  72. package/dist/cli/commands/pr/merge.js.map +1 -0
  73. package/dist/cli/commands/pr/review.d.ts.map +1 -1
  74. package/dist/cli/commands/pr/review.js +123 -5
  75. package/dist/cli/commands/pr/review.js.map +1 -1
  76. package/dist/cli/commands/push.d.ts +16 -0
  77. package/dist/cli/commands/push.d.ts.map +1 -0
  78. package/dist/cli/commands/push.js +166 -0
  79. package/dist/cli/commands/push.js.map +1 -0
  80. package/dist/cli/commands/sync.d.ts +24 -0
  81. package/dist/cli/commands/sync.d.ts.map +1 -0
  82. package/dist/cli/commands/sync.js +414 -0
  83. package/dist/cli/commands/sync.js.map +1 -0
  84. package/dist/cli/index.d.ts.map +1 -1
  85. package/dist/cli/index.js +34 -6
  86. package/dist/cli/index.js.map +1 -1
  87. package/dist/config/config.d.ts +20 -3
  88. package/dist/config/config.d.ts.map +1 -1
  89. package/dist/config/config.js +103 -24
  90. package/dist/config/config.js.map +1 -1
  91. package/dist/config/schema.d.ts.map +1 -1
  92. package/dist/config/schema.js +70 -9
  93. package/dist/config/schema.js.map +1 -1
  94. package/dist/core/context.d.ts +13 -0
  95. package/dist/core/context.d.ts.map +1 -0
  96. package/dist/core/context.js +2 -0
  97. package/dist/core/context.js.map +1 -0
  98. package/dist/core/gitx.d.ts +47 -0
  99. package/dist/core/gitx.d.ts.map +1 -1
  100. package/dist/core/gitx.js +204 -9
  101. package/dist/core/gitx.js.map +1 -1
  102. package/dist/index.d.ts +1 -5
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +4 -1
  105. package/dist/index.js.map +1 -1
  106. package/dist/providers/azure.d.ts +26 -0
  107. package/dist/providers/azure.d.ts.map +1 -0
  108. package/dist/providers/azure.js +256 -0
  109. package/dist/providers/azure.js.map +1 -0
  110. package/dist/providers/base.d.ts +104 -0
  111. package/dist/providers/base.d.ts.map +1 -0
  112. package/dist/providers/base.js +5 -0
  113. package/dist/providers/base.js.map +1 -0
  114. package/dist/providers/factory.d.ts +8 -0
  115. package/dist/providers/factory.d.ts.map +1 -0
  116. package/dist/providers/factory.js +25 -0
  117. package/dist/providers/factory.js.map +1 -0
  118. package/dist/providers/github.d.ts +19 -0
  119. package/dist/providers/github.d.ts.map +1 -0
  120. package/dist/providers/github.js +291 -0
  121. package/dist/providers/github.js.map +1 -0
  122. package/dist/providers/gitlab.d.ts +19 -0
  123. package/dist/providers/gitlab.d.ts.map +1 -0
  124. package/dist/providers/gitlab.js +186 -0
  125. package/dist/providers/gitlab.js.map +1 -0
  126. package/dist/types/config.d.ts +53 -9
  127. package/dist/types/config.d.ts.map +1 -1
  128. package/dist/types/config.js.map +1 -1
  129. package/dist/utils/azureAuth.d.ts +51 -0
  130. package/dist/utils/azureAuth.d.ts.map +1 -0
  131. package/dist/utils/azureAuth.js +172 -0
  132. package/dist/utils/azureAuth.js.map +1 -0
  133. package/dist/utils/git.d.ts +22 -0
  134. package/dist/utils/git.d.ts.map +1 -1
  135. package/dist/utils/git.js +63 -7
  136. package/dist/utils/git.js.map +1 -1
  137. package/dist/utils/gitOps.d.ts +118 -0
  138. package/dist/utils/gitOps.d.ts.map +1 -0
  139. package/dist/utils/gitOps.js +380 -0
  140. package/dist/utils/gitOps.js.map +1 -0
  141. package/dist/utils/lockFile.d.ts +13 -0
  142. package/dist/utils/lockFile.d.ts.map +1 -0
  143. package/dist/utils/lockFile.js +54 -0
  144. package/dist/utils/lockFile.js.map +1 -0
  145. package/dist/utils/retry.d.ts +10 -0
  146. package/dist/utils/retry.d.ts.map +1 -0
  147. package/dist/utils/retry.js +31 -0
  148. package/dist/utils/retry.js.map +1 -0
  149. package/dist/workflows/implement.d.ts +41 -0
  150. package/dist/workflows/implement.d.ts.map +1 -0
  151. package/dist/workflows/implement.js +219 -0
  152. package/dist/workflows/implement.js.map +1 -0
  153. package/dist/workflows/pr.d.ts +41 -0
  154. package/dist/workflows/pr.d.ts.map +1 -0
  155. package/dist/workflows/pr.js +285 -0
  156. package/dist/workflows/pr.js.map +1 -0
  157. package/dist/workflows/prAddress.d.ts +55 -0
  158. package/dist/workflows/prAddress.d.ts.map +1 -0
  159. package/dist/workflows/prAddress.js +349 -0
  160. package/dist/workflows/prAddress.js.map +1 -0
  161. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGhD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,iFAAiF;AAEjF,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAC7D,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAU,CAAC;AAKjE,SAAS,aAAa,CAAC,GAAW;IAChC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAQ,YAAkC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,EAAE,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAkB;IACtC,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;YAC5B,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3G,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAA4B,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9D,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,YAAY;YACjC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;YACvB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/G,CAAC;IACD,OAAO;QACL,GAAG,MAAM;QACT,SAAS;QACT,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,EAAE,EAAE,SAAS;KACd,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,0DAA0D;QAC1D,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEL,8EAA8E;IAC9E,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,GAAe,CAAC;QACpB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,oCAAoC;QACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7E,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,QAAQ,MAAM,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC7E,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAwB,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,KAAK,CAAC;YAChD,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,QAAQ,gCAAgC,CAAC,CAAC;YAC1E,CAAC;iBAAM,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,QAAQ,4BAA4B,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,iDAAiD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAiE,CAAC;QACxH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,iBAAiB,KAAK,IAAI,CAAC;gBACjD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC;oBAClD,MAAM,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,MAAM,MAAM,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACnH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,qBAAqB,aAAa,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEL,6EAA6E;IAC7E,+DAA+D;IAC/D,MAAM;SACH,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CACV,sEAAsE;QACtE,sDAAsD;QACtD,iDAAiD;QACjD,mCAAmC,CACpC;SACA,QAAQ,CAAC,OAAO,EAAE,kEAAkE,CAAC;SACrF,QAAQ,CAAC,SAAS,EAAE,mEAAmE,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,QAAiB,EAAE,EAAE;QAC/C,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,SAAS,CACjB,iBAAiB,GAAG,kEAAkE,EACtF,EAAE,QAAQ,EAAE,CAAC,EAAE,CAChB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,4EAA4E;IAC5E,MAAM;SACH,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,QAAQ,CAAC,YAAY,EAAE,qDAAqD,CAAC;SAC7E,MAAM,CAAC,KAAK,EAAE,WAAoB,EAAE,EAAE;QACrC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEL,4EAA4E;IAC5E,MAAM;SACH,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,4BAA4B,CAAC;SACzC,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QAC/B,MAAM,EAAE,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,EAAE,KAAK,IAAI;YAAE,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAe,EAAE,GAAG,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1E,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,cAAc,CAAC,QAAwB,EAAE,QAAiB;IACvE,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IAErC,yCAAyC;IACzC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAqD;QAC9D,MAAM,EAAE,sDAAsD;QAC9D,MAAM,EAAE,0DAA0D;KACnE,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3D,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM;QACnC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjB,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAoB;YACxC;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,aAAa,QAAQ,GAAG;gBACjC,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC;aACpC;SACF,CAAC,CAAC,CAAC,KAAK,CAAC;IAEd,MAAM,OAAO,GAAe;QAC1B,GAAG,QAAQ;QACX,SAAS,EAAE,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;KAC5D,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,iBAAiB,CAAC,CAAC;AACjD,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,gBAAgB,CAAC,QAAoB,EAAE,QAAiB;IACrE,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,IAAI,KAAK,CAAC;IAEpE,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAClD,MAAM,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAEjG,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAgC;QAC1E;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,wBAAwB;YACjC,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,2DAA2D,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,EAAE;oBAC7H,KAAK,EAAE,KAAK;iBACb;gBACD;oBACE,IAAI,EAAE,8BAA8B,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE;oBAClF,KAAK,EAAE,KAAK;iBACb;aACF;YACD,OAAO,EAAE,aAAa;SACvB;KACF,CAAC,CAAC;IAEH,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAoB;IAC/C,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;IACtF,MAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;IAEhG,qDAAqD;IACrD,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,GAAG,EAAE,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC9B,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IAEnC,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAkB;QACrD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,yCAAyC;YAClD,OAAO,EAAE,WAAW;YACpB,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC;SACvC;KACF,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,aAAa,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA0B;YACpE;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,6EAA6E;gBACtF,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAe;QAC1B,GAAG,QAAQ;QACX,SAAS,EAAE;YACT,GAAG,QAAQ,CAAC,SAAS;YACrB,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;SAC7B;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;IAChE,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;AACpF,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAoB,EAAE,QAAiB;IAClE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;IAC7F,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM;QACnC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;QACjB,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAoB;YACxC;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,yBAAyB;gBAClC,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC;aACpC;SACF,CAAC,CAAC,CAAC,KAAK,CAAC;IAEd,MAAM,OAAO,GAAe;QAC1B,GAAG,QAAQ;QACX,SAAS,EAAE;YACT,GAAG,QAAQ,CAAC,SAAS;YACrB,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;SACpC;KACF,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;AACpD,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,aAAa,CAAC,UAAyB,EAAE,MAAe;IACrE,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IAErC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,2CAA2C;QAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,gCAAgC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAEzC,MAAM,OAAO,GAAe;YAC1B,GAAG,QAAQ;YACX,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;YAClE,iBAAiB,EAAE,YAAY;SAChC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,6CAA6C,QAAQ,GAAG,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;IAED,oCAAoC;IACpC,MAAM,KAAK,GAA2B;QACpC,MAAM,EAAE,kCAAkC;QAC1C,MAAM,EAAE,gCAAgC;KACzC,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAE3D,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM;QAClC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;QACf,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAqB;YACzC;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,eAAe,UAAU,GAAG;gBACrC,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,gBAAgB,CAAC,SAAS,CAAC;aACtC;SACF,CAAC,CAAC,CAAC,MAAM,CAAC;IAEf,MAAM,OAAO,GAAe;QAC1B,GAAG,QAAQ;QACX,WAAW,EAAE;YACX,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;YAC/B,CAAC,UAAU,CAAC,EAAE;gBACZ,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM;aACP;SACF;QACD,iBAAiB,EAAE,UAA4B;KAChD,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,6CAA6C,CAAC,CAAC;IAC7E,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;AAClF,CAAC;AAED,iFAAiF;AAEjF,KAAK,UAAU,YAAY,CAAC,WAAoB;IAC9C,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAoB,CAAC;IAE9E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,IAAI,MAAsB,CAAC;IAE3B,IAAI,WAAW,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,WAA4B,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,IAAI,WAAW,iDAAiD,WAAW,EAAE,CAAC,CAAC;YAC3F,OAAO;QACT,CAAC;QACD,MAAM,GAAG,WAA6B,CAAC;IACzC,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,sDAAsD;QACtD,MAAM,GAAG,UAAU,CAAC,CAAC,CAAmB,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,8CAA8C,MAAM,eAAe,CAAC,CAAC;IACnF,CAAC;SAAM,CAAC;QACN,qCAAqC;QACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACzB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,YAAY,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC9C,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAC1D,CAAC;YACD,MAAM,SAAS,GAAG,QAAQ,CAAC,iBAAiB,KAAK,CAAC,CAAC;YACnD,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9D,KAAK,EAAE,CAAmB;aAC3B,CAAC;QACJ,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA+B;YACjE;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,0CAA0C;gBACnD,OAAO;gBACP,OAAO,EAAE,QAAQ,CAAC,iBAAiB;aACpC;SACF,CAAC,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAAe,EAAE,GAAG,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IACvE,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE/B,mCAAmC;IACnC,IAAI,gBAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,GAAG,EAAE,CAAC;YACR,gBAAgB,GAAG,GAAG,CAAC,QAAQ,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC;IAEjD,4EAA4E;IAC5E,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAElF,MAAM,UAAU,GAAG;QACjB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAwB,EAAE;QACnD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAwB,EAAE;QACnD,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAuB,EAAE;KACzD,CAAC;IAEF,wCAAwC;IACxC,MAAM,mBAAmB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,8DAA8D;IAC9D,CAAC,CAAU,CAAC;IAEZ,gEAAgE;IAChE,IAAI,iBAAiB,EAAE,CAAC;QACtB,mBAAmB,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iCAAiC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA4C;QAC1F;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,iBAAiB;gBACxB,CAAC,CAAC,sDAAsD;gBACxD,CAAC,CAAC,qCAAqC;YACzC,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,gBAAgB,IAAI,QAAQ;SACtC;KACF,CAAC,CAAC;IAEH,MAAM,aAAa,GAAiC;QAClD,MAAM,EAAE,sDAAsD;QAC9D,MAAM,EAAE,0DAA0D;QAClE,KAAK,EAAE,qFAAqF;KAC7F,CAAC;IAEF,uCAAuC;IACvC,IAAI,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC;IAE1C,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;SAAM,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QACtC,gFAAgF;QAChF,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACjC,iEAAiE;QACjE,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;QACrC,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,cAAc,CAAC;QAChC,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;QAE1D,IAAI,aAAa,EAAE,CAAC;YAClB,oEAAoE;YACpE,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9F,MAAM,CAAC,IAAI,CAAC,QAAQ,QAAQ,8BAA8B,MAAM,EAAE,CAAC,CAAC;YAEpE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA4B;gBACxE;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,wBAAwB,QAAQ,SAAS;oBAClD,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YAEH,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,0BAA0B,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAoB;oBACtD;wBACE,IAAI,EAAE,UAAU;wBAChB,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,OAAO,QAAQ,gBAAgB;wBACxC,IAAI,EAAE,GAAG;wBACT,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC;qBACpC;iBACF,CAAC,CAAC;gBACH,gBAAgB,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,oEAAoE;YACtE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,0BAA0B,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAoB;gBACtD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,QAAQ,gBAAgB;oBACpC,IAAI,EAAE,GAAG;oBACT,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC;iBACpC;aACF,CAAC,CAAC;YACH,gBAAgB,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QACpF,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAE/C,IAAI,QAAQ;QAAE,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAExE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;QAC9D;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,wEAAwE;YACjF,OAAO,EAAE,IAAI;SACd;KACF,CAAC,CAAC;IAEH,IAAI,cAAc,GAA8B,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;IAC3E,IAAI,YAAY,GAA+B,QAAQ,CAAC,iBAAiB,CAAC;IAE1E,IAAI,OAAO,EAAE,CAAC;QACZ,2CAA2C;QAC3C,MAAM,SAAS,GAAG;YAChB,GAAG,CAAC,QAAQ;gBACV,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,4CAA4C,QAAQ,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,YAA8B,EAAE,CAAC;gBACnL,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,uDAAuD,EAAE,KAAK,EAAE,YAA8B,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC7H;YACD;gBACE,IAAI,EAAE,yBAAyB,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,0BAA0B,EAAE;gBACzH,KAAK,EAAE,QAA0B;aAClC;YACD;gBACE,IAAI,EAAE,kBAAkB,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1F,KAAK,EAAE,QAA0B;aAClC;YACD,IAAI,QAAQ,CAAC,SAAS,EAAE;YACxB,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,MAAmC,EAAE;SACvF,CAAC;QAEF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA0C;YACpF;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,+CAA+C;gBACxD,OAAO,EAAE,SAAS;gBAClB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,CAAC;aAC5E;SACF,CAAC,CAAC;QAEH,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YAC/E,qFAAqF;QACvF,CAAC;aAAM,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YACvC,6BAA6B;YAC7B,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;YAC/D,CAAC;YACD,cAAc,GAAG,EAAE,GAAG,cAAc,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;YACzD,YAAY,GAAG,YAAY,CAAC;QAE9B,CAAC;aAAM,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC9D,MAAM,KAAK,GAA2B;gBACpC,MAAM,EAAE,kCAAkC;gBAC1C,MAAM,EAAE,gCAAgC;aACzC,CAAC;YACF,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;YAE/D,IAAI,WAAW,EAAE,CAAC;gBAChB,8DAA8D;gBAC9D,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC/F,MAAM,CAAC,IAAI,CAAC,QAAQ,UAAU,gCAAgC,SAAS,EAAE,CAAC,CAAC;gBAE3E,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAA0B;oBACpE;wBACE,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,YAAY;wBAClB,OAAO,EAAE,wBAAwB,UAAU,WAAW;wBACtD,OAAO,EAAE,KAAK;qBACf;iBACF,CAAC,CAAC;gBAEH,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC3D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAqB;wBACvD;4BACE,IAAI,EAAE,UAAU;4BAChB,IAAI,EAAE,QAAQ;4BACd,OAAO,EAAE,OAAO,UAAU,iCAAiC;4BAC3D,IAAI,EAAE,GAAG;yBACV;qBACF,CAAC,CAAC;oBACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC1B,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;wBACrD,cAAc,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;oBACzH,CAAC;yBAAM,CAAC;wBACN,cAAc,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;wBACzH,YAAY,GAAG,UAAU,CAAC;oBAC5B,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;oBAC1C,cAAc,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;oBACvH,YAAY,GAAG,UAAU,CAAC;gBAC5B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAqB;oBACvD;wBACE,IAAI,EAAE,UAAU;wBAChB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,GAAG,UAAU,iCAAiC;wBACvD,IAAI,EAAE,GAAG;qBACV;iBACF,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACN,cAAc,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;oBACzH,YAAY,GAAG,UAAU,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,MAAM,MAAM,GAAe;QACzB,SAAS,EAAE,gBAAgB;QAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,OAAO,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IAEhD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,iBAAiB,IAAI,gBAAgB,EAAE,CAAC,CAAC;IACjF,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;AACxF,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport ora from \"ora\";\nimport { logger } from \"../../logger/logger.js\";\nimport type { GitxConfig, AiProviderKind } from \"../../types/config.js\";\nimport type { ProviderKind } from \"../../types/provider.js\";\nimport { loadConfig, saveConfig, getConfigPath } from \"../../config/config.js\";\nimport { GitxError } from \"../../utils/errors.js\";\nimport { validateNonEmpty } from \"../../utils/validators.js\";\nimport { Gitx } from \"../../core/gitx.js\";\nimport { ClaudeCliAi } from \"../../ai/claudeCliAi.js\";\nimport { verifyGcmSetup } from \"../../utils/azureAuth.js\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst GIT_PROVIDERS = [\"github\", \"gitlab\", \"azure\"] as const;\nconst AI_PROVIDERS = [\"claude\", \"openai\", \"claude-cli\"] as const;\n\ntype GitProviderKey = typeof GIT_PROVIDERS[number];\ntype AiProviderKey = typeof AI_PROVIDERS[number];\n\nfunction isGitProvider(key: string): key is GitProviderKey {\n return (GIT_PROVIDERS as readonly string[]).includes(key);\n}\n\nfunction isAiProvider(key: string): key is AiProviderKey {\n return (AI_PROVIDERS as readonly string[]).includes(key);\n}\n\nasync function loadOrEmpty(): Promise<GitxConfig> {\n try {\n return await loadConfig();\n } catch {\n return { providers: {} };\n }\n}\n\nfunction redactConfig(config: GitxConfig): unknown {\n const providers: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(config.providers)) {\n if (v?.authMethod === \"gcm\") {\n providers[k] = { authMethod: \"gcm\" };\n } else {\n providers[k] = v?.token ? { token: v.token.slice(0, 6) + \"***\", authMethod: v.authMethod ?? \"pat\" } : {};\n }\n }\n const aiProviders: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(config.aiProviders ?? {})) {\n aiProviders[k] = k === \"claude-cli\"\n ? { type: \"local CLI\" }\n : { apiKey: v?.apiKey ? v.apiKey.slice(0, 6) + \"***\" : \"(none)\", ...(v?.model ? { model: v.model } : {}) };\n }\n return {\n ...config,\n providers,\n ...(Object.keys(aiProviders).length ? { aiProviders } : {}),\n ai: undefined,\n };\n}\n\n// ─── Register command ─────────────────────────────────────────────────────────\n\nexport function registerConfigCommand(program: Command): void {\n const config = program\n .command(\"config\")\n .description(\"βš™οΈ Configure gitx (runs setup wizard when called with no subcommand)\")\n .action(async () => {\n // `gitx config` with no subcommand β†’ run the setup wizard\n await runSetup();\n });\n\n // ── gitx config show ───────────────────────────────────────────────────────\n config\n .command(\"show\")\n .description(\"πŸ” Show current gitx config\")\n .action(async () => {\n let cfg: GitxConfig;\n try {\n cfg = await loadConfig();\n } catch {\n logger.warn(\"No config found. Run `gitx config` to get started.\");\n return;\n }\n\n // Auto-detect current repo provider\n const gitx = await Gitx.fromCwd().catch(() => null);\n const detected = gitx ? await gitx.detectProvider().catch(() => null) : null;\n if (detected) {\n logger.info(`πŸ”Ž Current repo: ${detected.repoSlug} (${detected.provider})`);\n const provCfg = cfg.providers[detected.provider as ProviderKind];\n const authMethod = provCfg?.authMethod ?? \"pat\";\n if (authMethod === \"gcm\") {\n logger.success(` ${detected.provider}: configured via GCM (OAuth) βœ“`);\n } else if (provCfg?.token) {\n logger.success(` ${detected.provider} token: configured (PAT) βœ“`);\n } else {\n logger.warn(` ${detected.provider} token: NOT configured β€” run: gitx config set ${detected.provider}`);\n }\n }\n\n // Show all AI providers\n logger.info(\"\\nπŸ€– AI Providers:\");\n const aiEntries = Object.entries(cfg.aiProviders ?? {}) as Array<[AiProviderKind, { apiKey?: string; model?: string }]>;\n if (aiEntries.length === 0) {\n logger.warn(\" none configured β€” run: gitx config set claude|openai|claude-cli\");\n } else {\n for (const [kind] of aiEntries) {\n const isDefault = cfg.defaultAiProvider === kind;\n const marker = isDefault ? \" (default)\" : \"\";\n if (kind === \"claude-cli\") {\n const available = await ClaudeCliAi.isAvailable();\n logger.info(` ${isDefault ? \"βœ“\" : \"β—‹\"} claude-cli${marker} β€” ${available ? \"installed βœ“\" : \"not detected βœ—\"}`);\n } else {\n logger.info(` ${isDefault ? \"βœ“\" : \"β—‹\"} ${kind}${marker}`);\n }\n }\n }\n\n logger.info(`\\nπŸ“ Config file: ${getConfigPath()}`);\n logger.info(JSON.stringify(redactConfig(cfg), null, 2));\n });\n\n // ── gitx config set <KEY> [value] ─────────────────────────────────────────\n // KEY = github | gitlab | azure | claude | openai | claude-cli\n config\n .command(\"set\")\n .description(\n \"πŸ”‘ Set a provider token or AI key (also sets it as the default AI)\\n\" +\n \" Git: gitx config set github|gitlab|azure [token]\\n\" +\n \" AI: gitx config set claude|openai [apiKey]\\n\" +\n \" gitx config set claude-cli\"\n )\n .argument(\"<key>\", \"Provider: github | gitlab | azure | claude | openai | claude-cli\")\n .argument(\"[value]\", \"Token or API key (prompted if omitted; not needed for claude-cli)\")\n .action(async (key: string, valueArg?: string) => {\n if (isGitProvider(key)) {\n await setGitProvider(key, valueArg);\n } else if (isAiProvider(key)) {\n await setAiProvider(key, valueArg);\n } else {\n throw new GitxError(\n `Unknown key: \"${key}\". Use one of: github, gitlab, azure, claude, openai, claude-cli`,\n { exitCode: 2 }\n );\n }\n });\n\n // ── gitx config set-default-ai [provider] ────────────────────────────────\n config\n .command(\"set-default-ai\")\n .description(\"⭐ Switch which AI provider gitx uses by default\")\n .argument(\"[provider]\", \"AI provider to set as default (prompted if omitted)\")\n .action(async (providerArg?: string) => {\n await setDefaultAi(providerArg);\n });\n\n // ── gitx config set-default-branch <branch> ──────────────────────────────\n config\n .command(\"set-default-branch\")\n .description(\"🌿 Set default base branch\")\n .argument(\"<branch>\", \"Branch name (e.g. main)\")\n .action(async (branch: string) => {\n const ok = validateNonEmpty(\"Default branch\")(branch);\n if (ok !== true) throw new GitxError(String(ok), { exitCode: 2 });\n\n const existing = await loadOrEmpty();\n const updated: GitxConfig = { ...existing, defaultBranch: branch.trim() };\n const spinner = ora(\"Saving…\").start();\n const path = await saveConfig(updated);\n spinner.succeed(`Saved to ${path}`);\n logger.success(\"βœ… Default branch updated.\");\n });\n}\n\n// ─── Set git provider ─────────────────────────────────────────────────────────\n\nasync function setGitProvider(provider: GitProviderKey, tokenArg?: string): Promise<void> {\n const existing = await loadOrEmpty();\n\n // Azure DevOps: offer GCM (OAuth) or PAT\n if (provider === \"azure\") {\n await setAzureProvider(existing, tokenArg);\n return;\n }\n\n const hints: Record<Exclude<GitProviderKey, \"azure\">, string> = {\n github: \"github.com/settings/tokens β†’ New token β†’ scope: repo\",\n gitlab: \"gitlab.com/-/profile/personal_access_tokens β†’ scope: api\",\n };\n logger.info(` ℹ️ Get a token at: ${hints[provider]}\\n`);\n\n const token = tokenArg?.trim().length\n ? tokenArg.trim()\n : (await inquirer.prompt<{ token: string }>([\n {\n type: \"password\",\n name: \"token\",\n message: `Token for ${provider}:`,\n mask: \"*\",\n validate: validateNonEmpty(\"Token\"),\n },\n ])).token;\n\n const updated: GitxConfig = {\n ...existing,\n providers: { ...existing.providers, [provider]: { token } },\n };\n\n const spinner = ora(\"Saving…\").start();\n const path = await saveConfig(updated);\n spinner.succeed(`Saved to ${path}`);\n logger.success(`βœ… ${provider} token updated.`);\n}\n\n// ─── Azure DevOps: GCM or PAT ─────────────────────────────────────────────────\n\nasync function setAzureProvider(existing: GitxConfig, tokenArg?: string): Promise<void> {\n const currentMethod = existing.providers.azure?.authMethod ?? \"pat\";\n\n logger.info(\"\\nπŸ” Azure DevOps authentication\\n\");\n logger.info(\" Your company may restrict PAT tokens. GCM (OAuth) is the recommended method.\\n\");\n\n const { authMethod } = await inquirer.prompt<{ authMethod: \"gcm\" | \"pat\" }>([\n {\n type: \"list\",\n name: \"authMethod\",\n message: \"Authentication method:\",\n choices: [\n {\n name: `GCM β€” Git Credential Manager (OAuth, no token to manage)${currentMethod === \"gcm\" ? \" βœ“ current\" : \" ← recommended\"}`,\n value: \"gcm\",\n },\n {\n name: `PAT β€” Personal Access Token${currentMethod === \"pat\" ? \" βœ“ current\" : \"\"}`,\n value: \"pat\",\n },\n ],\n default: currentMethod,\n },\n ]);\n\n if (authMethod === \"gcm\") {\n await setupAzureGcm(existing);\n } else {\n await setupAzurePat(existing, tokenArg);\n }\n}\n\nasync function setupAzureGcm(existing: GitxConfig): Promise<void> {\n logger.info(\"\\n── GCM setup\\n\");\n logger.info(\" GCM uses `git credential fill` to obtain a short-lived OAuth token.\");\n logger.info(\" No token is stored in the gitx config β€” GCM is the secure credential store.\\n\");\n\n // Try to detect the org from the current repo remote\n let detectedOrg: string | undefined;\n try {\n const gitx = await Gitx.fromCwd();\n const det = await gitx.detectProvider();\n if (det?.provider === \"azure\") {\n detectedOrg = det.repoSlug.split(\"/\")[0];\n }\n } catch { /* not in a git repo */ }\n\n const { org } = await inquirer.prompt<{ org: string }>([\n {\n type: \"input\",\n name: \"org\",\n message: \"Azure DevOps org name (e.g. MyCompany):\",\n default: detectedOrg,\n validate: validateNonEmpty(\"Org name\"),\n },\n ]);\n\n const verifySpinner = ora(\"Verifying GCM setup…\").start();\n const result = await verifyGcmSetup(org);\n\n if (result.ok) {\n verifySpinner.succeed(\"GCM is correctly configured and a token was fetched successfully βœ“\");\n } else {\n verifySpinner.warn(\"GCM setup has issues:\");\n result.issues.forEach((issue) => logger.warn(` βœ— ${issue}`));\n if (result.fixes.length > 0) {\n logger.info(\"\\n Run these commands to fix the issues:\");\n result.fixes.forEach((fix) => logger.info(` $ ${fix}`));\n }\n logger.info(\"\");\n\n const { saveAnyway } = await inquirer.prompt<{ saveAnyway: boolean }>([\n {\n type: \"confirm\",\n name: \"saveAnyway\",\n message: \"Save GCM config anyway? (you can fix the issues and it will work next time)\",\n default: false,\n },\n ]);\n if (!saveAnyway) {\n logger.info(\" Cancelled β€” no changes saved.\");\n return;\n }\n }\n\n const updated: GitxConfig = {\n ...existing,\n providers: {\n ...existing.providers,\n azure: { authMethod: \"gcm\" },\n },\n };\n\n const spinner = ora(\"Saving…\").start();\n const path = await saveConfig(updated);\n spinner.succeed(`Saved to ${path}`);\n logger.success(\"βœ… Azure DevOps configured to use GCM (OAuth).\");\n logger.info(\" gitx will call `git credential fill` automatically when needed.\");\n}\n\nasync function setupAzurePat(existing: GitxConfig, tokenArg?: string): Promise<void> {\n logger.info(\"\\n── PAT setup\\n\");\n logger.info(\" ℹ️ Get a PAT at: dev.azure.com β†’ User settings β†’ Personal access tokens\\n\");\n logger.info(\" Scope required: Code (Read & write)\\n\");\n\n const token = tokenArg?.trim().length\n ? tokenArg.trim()\n : (await inquirer.prompt<{ token: string }>([\n {\n type: \"password\",\n name: \"token\",\n message: \"Azure DevOps PAT token:\",\n mask: \"*\",\n validate: validateNonEmpty(\"Token\"),\n },\n ])).token;\n\n const updated: GitxConfig = {\n ...existing,\n providers: {\n ...existing.providers,\n azure: { token, authMethod: \"pat\" },\n },\n };\n\n const spinner = ora(\"Saving…\").start();\n const path = await saveConfig(updated);\n spinner.succeed(`Saved to ${path}`);\n logger.success(\"βœ… Azure DevOps PAT token saved.\");\n}\n\n// ─── Set AI provider ──────────────────────────────────────────────────────────\n\nasync function setAiProvider(aiProvider: AiProviderKey, keyArg?: string): Promise<void> {\n const existing = await loadOrEmpty();\n\n if (aiProvider === \"claude-cli\") {\n // No key needed β€” just detect and register\n const spinner = ora(\"Checking for local Claude CLI…\").start();\n const available = await ClaudeCliAi.isAvailable();\n if (!available) {\n spinner.fail(\"claude-cli not found on PATH.\");\n logger.warn(\"Install Claude Code from https://claude.ai/download and try again.\");\n return;\n }\n spinner.succeed(\"claude-cli detected βœ“\");\n\n const updated: GitxConfig = {\n ...existing,\n aiProviders: { ...(existing.aiProviders ?? {}), \"claude-cli\": {} },\n defaultAiProvider: \"claude-cli\",\n };\n const savePath = await saveConfig(updated);\n logger.success(`βœ… claude-cli set as default AI. (saved to ${savePath})`);\n return;\n }\n\n // claude / openai β€” need an API key\n const hints: Record<string, string> = {\n claude: \"console.anthropic.com β†’ API Keys\",\n openai: \"platform.openai.com β†’ API keys\",\n };\n logger.info(` ℹ️ Get a key at: ${hints[aiProvider]}\\n`);\n\n const apiKey = keyArg?.trim().length\n ? keyArg.trim()\n : (await inquirer.prompt<{ apiKey: string }>([\n {\n type: \"password\",\n name: \"apiKey\",\n message: `API key for ${aiProvider}:`,\n mask: \"*\",\n validate: validateNonEmpty(\"API key\"),\n },\n ])).apiKey;\n\n const updated: GitxConfig = {\n ...existing,\n aiProviders: {\n ...(existing.aiProviders ?? {}),\n [aiProvider]: {\n ...(existing.aiProviders?.[aiProvider] ?? {}),\n apiKey,\n },\n },\n defaultAiProvider: aiProvider as AiProviderKind,\n };\n\n const spinner = ora(\"Saving…\").start();\n const path = await saveConfig(updated);\n spinner.succeed(`Saved to ${path}`);\n logger.success(`βœ… ${aiProvider} configured and set as default AI provider.`);\n logger.info(\" Note: ANTHROPIC_API_KEY env var always overrides stored keys.\");\n}\n\n// ─── Switch default AI ────────────────────────────────────────────────────────\n\nasync function setDefaultAi(providerArg?: string): Promise<void> {\n const existing = await loadOrEmpty();\n const configured = Object.keys(existing.aiProviders ?? {}) as AiProviderKey[];\n\n if (configured.length === 0) {\n logger.warn(\"No AI providers configured yet.\");\n logger.info(\"Run `gitx config set claude|openai|claude-cli` to add one.\");\n return;\n }\n\n let chosen: AiProviderKind;\n\n if (providerArg && isAiProvider(providerArg)) {\n if (!configured.includes(providerArg as AiProviderKey)) {\n logger.warn(`\"${providerArg}\" is not yet configured. Run: gitx config set ${providerArg}`);\n return;\n }\n chosen = providerArg as AiProviderKind;\n } else if (configured.length === 1) {\n // Only one provider β€” set it silently, no need to ask\n chosen = configured[0] as AiProviderKind;\n logger.info(`Only one AI provider configured β€” setting \"${chosen}\" as default.`);\n } else {\n // Multiple providers β€” show a picker\n const choices = await Promise.all(\n configured.map(async (k) => {\n let suffix = \"\";\n if (k === \"claude-cli\") {\n const avail = await ClaudeCliAi.isAvailable();\n suffix = avail ? \" (installed βœ“)\" : \" (not detected βœ—)\";\n }\n const isDefault = existing.defaultAiProvider === k;\n return {\n name: `${k}${suffix}${isDefault ? \" ← current default\" : \"\"}`,\n value: k as AiProviderKind,\n };\n })\n );\n\n const result = await inquirer.prompt<{ provider: AiProviderKind }>([\n {\n type: \"list\",\n name: \"provider\",\n message: \"Which AI provider should be the default?\",\n choices,\n default: existing.defaultAiProvider,\n },\n ]);\n chosen = result.provider;\n }\n\n const updated: GitxConfig = { ...existing, defaultAiProvider: chosen };\n const spinner = ora(\"Saving…\").start();\n const path = await saveConfig(updated);\n spinner.succeed(`Saved to ${path}`);\n logger.success(`βœ… Default AI provider set to: ${chosen}`);\n}\n\n// ─── Setup wizard ─────────────────────────────────────────────────────────────\n\nexport async function runSetup(): Promise<void> {\n logger.info(\"πŸš€ gitx setup\\n\");\n\n // Detect current repo git provider\n let detectedProvider: string | undefined;\n try {\n const gitx = await Gitx.fromCwd();\n const det = await gitx.detectProvider();\n if (det) {\n detectedProvider = det.provider;\n logger.info(`πŸ”Ž Detected repo provider: ${det.provider} (${det.repoSlug})\\n`);\n }\n } catch { /* not in a git repo */ }\n\n const existing = await loadOrEmpty();\n const cliAvail = await ClaudeCliAi.isAvailable();\n\n // ── Step 1: Git provider ─────────────────────────────────────────────────\n logger.info(\"── Step 1 of 2: Git provider\\n\");\n\n const hasAnyGitProvider = Object.values(existing.providers).some((v) => v?.token);\n\n const gitChoices = [\n { name: \"GitHub\", value: \"github\" as ProviderKind },\n { name: \"GitLab\", value: \"gitlab\" as ProviderKind },\n { name: \"Azure DevOps\", value: \"azure\" as ProviderKind },\n ];\n\n // Annotate already-configured providers\n const annotatedGitChoices = gitChoices.map((c) => {\n const hasToken = Boolean(existing.providers[c.value]?.token);\n return hasToken ? { ...c, name: `${c.name} βœ“ already configured` } : c;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any[];\n\n // Only show Skip if at least one provider is already configured\n if (hasAnyGitProvider) {\n annotatedGitChoices.push(new inquirer.Separator());\n annotatedGitChoices.push({ name: \"Skip β€” keep existing git config\", value: \"skip\" });\n }\n\n const { providerOrSkip } = await inquirer.prompt<{ providerOrSkip: ProviderKind | \"skip\" }>([\n {\n type: \"list\",\n name: \"providerOrSkip\",\n message: hasAnyGitProvider\n ? \"Which git provider? (select Skip to leave unchanged)\"\n : \"Which git provider is this repo on?\",\n choices: annotatedGitChoices,\n default: detectedProvider ?? \"github\",\n },\n ]);\n\n const providerHints: Record<ProviderKind, string> = {\n github: \"github.com/settings/tokens β†’ New token β†’ scope: repo\",\n gitlab: \"gitlab.com/-/profile/personal_access_tokens β†’ scope: api\",\n azure: \"dev.azure.com β†’ User settings β†’ Personal access tokens β†’ scope: Code (Read & write)\",\n };\n\n // Track what to save for git providers\n let updatedProviders = existing.providers;\n\n if (providerOrSkip === \"skip\") {\n logger.info(\" Skipping git provider setup β€” existing config unchanged.\\n\");\n } else if (providerOrSkip === \"azure\") {\n // Azure DevOps β€” delegate to the full GCM/PAT wizard which saves its own config\n await setAzureProvider(existing);\n // Reload providers so the merged save below reflects any changes\n const reloaded = await loadOrEmpty();\n updatedProviders = reloaded.providers;\n } else {\n const provider = providerOrSkip;\n const existingToken = existing.providers[provider]?.token;\n\n if (existingToken) {\n // Already configured β€” show masked value and ask to keep or replace\n const masked = existingToken.slice(0, 6) + \"β€’\".repeat(Math.min(existingToken.length - 6, 20));\n logger.info(` βœ“ ${provider} token already configured: ${masked}`);\n\n const { replaceToken } = await inquirer.prompt<{ replaceToken: boolean }>([\n {\n type: \"confirm\",\n name: \"replaceToken\",\n message: `Replace the existing ${provider} token?`,\n default: false,\n },\n ]);\n\n if (replaceToken) {\n logger.info(` ℹ️ Get a token at: ${providerHints[provider]}\\n`);\n const answer = await inquirer.prompt<{ token: string }>([\n {\n type: \"password\",\n name: \"token\",\n message: `New ${provider} access token:`,\n mask: \"*\",\n validate: validateNonEmpty(\"Token\"),\n },\n ]);\n updatedProviders = { ...existing.providers, [provider]: { token: answer.token } };\n } else {\n logger.info(\" Keeping existing token.\\n\");\n // updatedProviders already has existing.providers, no change needed\n }\n } else {\n logger.info(` ℹ️ Get a token at: ${providerHints[provider]}\\n`);\n const answer = await inquirer.prompt<{ token: string }>([\n {\n type: \"password\",\n name: \"token\",\n message: `${provider} access token:`,\n mask: \"*\",\n validate: validateNonEmpty(\"Token\"),\n },\n ]);\n updatedProviders = { ...existing.providers, [provider]: { token: answer.token } };\n }\n }\n\n // ── Step 2: AI provider ──────────────────────────────────────────────────\n logger.info(\"\\n── Step 2 of 2: AI provider\\n\");\n\n if (cliAvail) logger.info(\" βœ“ Claude CLI detected on your system.\\n\");\n\n const { setupAi } = await inquirer.prompt<{ setupAi: boolean }>([\n {\n type: \"confirm\",\n name: \"setupAi\",\n message: \"Configure an AI provider? (needed for implement, review, fix-comments)\",\n default: true,\n },\n ]);\n\n let newAiProviders: GitxConfig[\"aiProviders\"] = existing.aiProviders ?? {};\n let newDefaultAi: AiProviderKind | undefined = existing.defaultAiProvider;\n\n if (setupAi) {\n // Annotate already-configured AI providers\n const aiChoices = [\n ...(cliAvail\n ? [{ name: `Claude CLI (free, uses your Claude login)${existing.aiProviders?.[\"claude-cli\"] ? \" βœ“ already configured\" : \" ← detected!\"}`, value: \"claude-cli\" as AiProviderKind }]\n : [{ name: \"Claude CLI (not detected β€” install Claude Code first)\", value: \"claude-cli\" as AiProviderKind, disabled: true }]\n ),\n {\n name: `Claude API (Anthropic)${existing.aiProviders?.[\"claude\"] ? \" βœ“ already configured\" : \" β€” recommended for CI/CD\"}`,\n value: \"claude\" as AiProviderKind,\n },\n {\n name: `OpenAI (GPT-4o)${existing.aiProviders?.[\"openai\"] ? \" βœ“ already configured\" : \"\"}`,\n value: \"openai\" as AiProviderKind,\n },\n new inquirer.Separator(),\n { name: \"Skip β€” keep existing AI config\", value: \"skip\" as unknown as AiProviderKind },\n ];\n\n const { aiProvider } = await inquirer.prompt<{ aiProvider: AiProviderKind | \"skip\" }>([\n {\n type: \"list\",\n name: \"aiProvider\",\n message: \"AI provider: (select Skip to leave unchanged)\",\n choices: aiChoices,\n default: cliAvail ? \"claude-cli\" : (existing.defaultAiProvider ?? \"claude\"),\n },\n ]);\n\n if (aiProvider === \"skip\") {\n logger.info(\" Skipping AI provider setup β€” existing AI config unchanged.\\n\");\n // newAiProviders and newDefaultAi stay as their current values, fall through to save\n } else if (aiProvider === \"claude-cli\") {\n // Claude CLI β€” no key needed\n if (existing.aiProviders?.[\"claude-cli\"]) {\n logger.info(\" βœ“ Claude CLI already configured β€” keeping as is.\\n\");\n } else {\n logger.success(\" Using Claude CLI β€” no API key needed.\\n\");\n }\n newAiProviders = { ...newAiProviders, \"claude-cli\": {} };\n newDefaultAi = \"claude-cli\";\n\n } else if (aiProvider === \"claude\" || aiProvider === \"openai\") {\n const hints: Record<string, string> = {\n claude: \"console.anthropic.com β†’ API Keys\",\n openai: \"platform.openai.com β†’ API keys\",\n };\n const existingKey = existing.aiProviders?.[aiProvider]?.apiKey;\n\n if (existingKey) {\n // Already configured β€” show masked and ask to keep or replace\n const maskedKey = existingKey.slice(0, 10) + \"β€’\".repeat(Math.min(existingKey.length - 10, 20));\n logger.info(` βœ“ ${aiProvider} API key already configured: ${maskedKey}`);\n\n const { replaceKey } = await inquirer.prompt<{ replaceKey: boolean }>([\n {\n type: \"confirm\",\n name: \"replaceKey\",\n message: `Replace the existing ${aiProvider} API key?`,\n default: false,\n },\n ]);\n\n if (replaceKey) {\n logger.info(` ℹ️ Get a key at: ${hints[aiProvider]}\\n`);\n const answer = await inquirer.prompt<{ apiKey: string }>([\n {\n type: \"password\",\n name: \"apiKey\",\n message: `New ${aiProvider} API key (leave blank to skip):`,\n mask: \"*\",\n },\n ]);\n if (!answer.apiKey.trim()) {\n logger.info(\" Skipping β€” keeping existing key.\\n\");\n newAiProviders = { ...newAiProviders, [aiProvider]: { ...(newAiProviders?.[aiProvider] ?? {}), apiKey: existingKey } };\n } else {\n newAiProviders = { ...newAiProviders, [aiProvider]: { ...(newAiProviders?.[aiProvider] ?? {}), apiKey: answer.apiKey } };\n newDefaultAi = aiProvider;\n }\n } else {\n logger.info(\" Keeping existing key.\\n\");\n newAiProviders = { ...newAiProviders, [aiProvider]: { ...(newAiProviders?.[aiProvider] ?? {}), apiKey: existingKey } };\n newDefaultAi = aiProvider;\n }\n } else {\n logger.info(` ℹ️ Get a key at: ${hints[aiProvider]}\\n`);\n const answer = await inquirer.prompt<{ apiKey: string }>([\n {\n type: \"password\",\n name: \"apiKey\",\n message: `${aiProvider} API key (leave blank to skip):`,\n mask: \"*\",\n },\n ]);\n if (!answer.apiKey.trim()) {\n logger.info(\" Skipping β€” no key entered, AI provider not saved.\\n\");\n } else {\n newAiProviders = { ...newAiProviders, [aiProvider]: { ...(newAiProviders?.[aiProvider] ?? {}), apiKey: answer.apiKey } };\n newDefaultAi = aiProvider;\n }\n }\n }\n }\n\n // ── Save ─────────────────────────────────────────────────────────────────\n const merged: GitxConfig = {\n providers: updatedProviders,\n ...(Object.keys(newAiProviders).length ? { aiProviders: newAiProviders } : {}),\n ...(newDefaultAi ? { defaultAiProvider: newDefaultAi } : {}),\n ...(existing.defaultBranch ? { defaultBranch: existing.defaultBranch } : {}),\n };\n\n const spinner = ora(\"\\nSaving config…\").start();\n const savedPath = await saveConfig(merged);\n spinner.succeed(`Config saved to ${savedPath}`);\n\n const allProviders = Object.keys(merged.providers).join(\", \");\n logger.success(`\\nβœ… gitx is ready!`);\n logger.info(` Git providers: ${allProviders}`);\n logger.info(` Default AI: ${merged.defaultAiProvider ?? \"not configured\"}`);\n if (merged.aiProviders && Object.keys(merged.aiProviders).length > 1) {\n logger.info(` All AI: ${Object.keys(merged.aiProviders).join(\", \")}`);\n logger.info(` Switch AI: gitx config set-default-ai`);\n }\n logger.info(`\\nRun \\`gitx pr list\\` or \\`gitx implement \"<task>\"\\` in any git repo.`);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+C/D"}
1
+ {"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmJ/D"}
@@ -4,45 +4,166 @@ import { logger } from "../../logger/logger.js";
4
4
  import { Gitx } from "../../core/gitx.js";
5
5
  import { assertValid, validateNonEmpty } from "../../utils/validators.js";
6
6
  import { parseAutonomyMode } from "../../utils/modes.js";
7
+ import { runImplementWorkflow } from "../../workflows/implement.js";
8
+ import { isWorkingTreeDirty } from "../../utils/gitOps.js";
7
9
  export function registerImplementCommand(program) {
8
10
  program
9
11
  .command("implement")
10
- .description("πŸ› οΈ Implement a task with AI assistance")
12
+ .description("πŸ› οΈ Implement a task with AI assistance")
11
13
  .argument("<task>", "Task description")
12
14
  .option("--mode <mode>", "plan|guided|semi-auto|auto", "guided")
13
- .option("--dry-run", "Simulate execution (no changes)", false)
15
+ .option("--dry-run", "Simulate execution β€” no files changed, no commits", false)
14
16
  .action(async (task, options) => {
15
17
  assertValid(validateNonEmpty("Task")(task), "Task");
16
18
  const mode = parseAutonomyMode(options.mode);
17
- const gitx = await Gitx.fromCwd();
18
- const spinner = ora("🧠 Analyzing task…").start();
19
- const analysis = await gitx.ai.analyzeTask(task);
20
- spinner.succeed("Task analyzed");
21
- logger.info("🧾 Summary");
22
- logger.info(JSON.stringify(analysis, null, 2));
23
- const planSpinner = ora("πŸ—ΊοΈ Generating plan…").start();
24
- const plan = await gitx.ai.generatePlan({ task, analysis });
25
- planSpinner.succeed("Plan generated");
26
- logger.info("🧩 Plan");
27
- logger.info(JSON.stringify(plan, null, 2));
28
- if (mode !== "auto") {
29
- const { proceed } = await inquirer.prompt([
30
- {
31
- type: "confirm",
32
- name: "proceed",
33
- message: options.dryRun
34
- ? "Proceed with dry-run execution?"
35
- : "Proceed with execution (branch + commit + PR)?",
36
- default: false
19
+ const dryRun = options.dryRun;
20
+ const initSpinner = ora("Loading config & repo context…").start();
21
+ let gitx;
22
+ try {
23
+ gitx = await Gitx.fromCwd();
24
+ const ctx = await gitx.getRepoContext();
25
+ initSpinner.succeed(`Repo: ${ctx.repoSlug} Provider: ${ctx.provider}`);
26
+ }
27
+ catch (err) {
28
+ initSpinner.fail("Failed to load context");
29
+ throw err;
30
+ }
31
+ // ── Guard: warn if AI is not available ─────────────────────────────────
32
+ if (!process.env["ANTHROPIC_API_KEY"]) {
33
+ logger.warn("⚠️ ANTHROPIC_API_KEY is not set. AI responses will be mocked placeholders.\n" +
34
+ " Export it to use real Claude: export ANTHROPIC_API_KEY=sk-ant-...");
35
+ if (mode !== "plan") {
36
+ const { continueAnyway } = await (await import("inquirer")).default.prompt([
37
+ { type: "confirm", name: "continueAnyway", message: "Continue with mock AI anyway?", default: false },
38
+ ]);
39
+ if (!continueAnyway) {
40
+ logger.warn("Cancelled.");
41
+ return;
42
+ }
43
+ }
44
+ }
45
+ // ── Guard: uncommitted changes would be lost when we create a branch ───
46
+ if (mode !== "plan" && !options.dryRun) {
47
+ const dirty = await isWorkingTreeDirty(gitx.cwd);
48
+ if (dirty) {
49
+ logger.warn("⚠️ You have uncommitted changes in your working tree.");
50
+ const { action } = await (await import("inquirer")).default.prompt([
51
+ {
52
+ type: "list",
53
+ name: "action",
54
+ message: "How do you want to handle them?",
55
+ choices: [
56
+ { name: "Stash them (git stash) and continue", value: "stash" },
57
+ { name: "Cancel and handle them manually", value: "cancel" },
58
+ ],
59
+ },
60
+ ]);
61
+ if (action === "cancel") {
62
+ logger.warn("Cancelled.");
63
+ return;
37
64
  }
38
- ]);
39
- if (!proceed) {
40
- logger.warn("⏹️ Cancelled");
41
- return;
65
+ const { execFile } = await import("node:child_process");
66
+ const { promisify } = await import("node:util");
67
+ await promisify(execFile)("git", ["stash", "--include-untracked"], { cwd: gitx.cwd });
68
+ logger.success("Changes stashed. Run `git stash pop` to restore them after.");
42
69
  }
43
70
  }
44
- logger.warn("⚠️ implement flow execution is not wired yet (providers + git ops in next step).");
45
- logger.info(`Mode: ${mode}, dry-run: ${options.dryRun ? "yes" : "no"}`);
71
+ // ── mode: plan ─────────────────────────────────────────────────────────
72
+ if (mode === "plan") {
73
+ const spinner = ora("🧠 Analyzing task…").start();
74
+ const analysis = await gitx.ai.analyzeTask(task);
75
+ spinner.succeed("Task analyzed");
76
+ printAnalysis(analysis);
77
+ const planSpinner = ora("πŸ—ΊοΈ Generating plan…").start();
78
+ const plan = await gitx.ai.generatePlan({ task, analysis });
79
+ planSpinner.succeed("Plan generated");
80
+ printPlan(plan);
81
+ logger.info("\nπŸ’‘ Run with --mode=guided or --mode=auto to execute.");
82
+ return;
83
+ }
84
+ // ── modes: guided / semi-auto / auto ──────────────────────────────────
85
+ const result = await runImplementWorkflow(gitx, {
86
+ task,
87
+ mode,
88
+ dryRun,
89
+ onAnalysis: async (analysis) => {
90
+ printAnalysis(analysis);
91
+ if (mode === "guided") {
92
+ const { proceed } = await inquirer.prompt([
93
+ {
94
+ type: "confirm",
95
+ name: "proceed",
96
+ message: "Continue with this analysis and generate a plan?",
97
+ default: true,
98
+ },
99
+ ]);
100
+ return proceed;
101
+ }
102
+ return true;
103
+ },
104
+ onPlan: async (plan) => {
105
+ printPlan(plan);
106
+ if (mode === "guided" || mode === "semi-auto") {
107
+ const { proceed } = await inquirer.prompt([
108
+ {
109
+ type: "confirm",
110
+ name: "proceed",
111
+ message: dryRun
112
+ ? "Proceed with dry-run (preview diffs only)?"
113
+ : "Proceed with execution (create branch + commit + push + PR)?",
114
+ default: false,
115
+ },
116
+ ]);
117
+ return proceed;
118
+ }
119
+ return true;
120
+ },
121
+ });
122
+ // ── Show result ────────────────────────────────────────────────────────
123
+ if (result.dryRun) {
124
+ logger.info("\n🏁 Dry-run complete. No real changes were made.");
125
+ if (result.appliedSteps.length > 0) {
126
+ logger.info(`Would have applied steps: ${result.appliedSteps.join(", ")}`);
127
+ }
128
+ return;
129
+ }
130
+ if (!result.commitSha) {
131
+ logger.warn("\n⚠️ No changes were committed. AI did not produce applicable diffs.");
132
+ return;
133
+ }
134
+ logger.success("\nβœ… Implementation complete!");
135
+ logger.info(`Branch: ${result.branchName}`);
136
+ logger.info(`Commit: ${result.commitSha?.slice(0, 8) ?? "–"}`);
137
+ if (result.pr) {
138
+ logger.success(`PR: ${result.pr.url}`);
139
+ }
140
+ if (result.failedSteps.length > 0) {
141
+ logger.warn(`\n⚠️ Some steps failed to apply:`);
142
+ for (const f of result.failedSteps) {
143
+ logger.warn(` β€’ ${f.stepId}: ${f.error}`);
144
+ }
145
+ }
146
+ });
147
+ }
148
+ // ─── Display helpers ──────────────────────────────────────────────────────────
149
+ function printAnalysis(analysis) {
150
+ logger.info(`\n🧾 Analysis`);
151
+ logger.info(` Intent: ${analysis.intent}`);
152
+ logger.info(` Summary: ${analysis.summary}`);
153
+ if (analysis.assumptions.length > 0) {
154
+ logger.info(` Assumptions:`);
155
+ analysis.assumptions.forEach((a) => logger.info(` β€’ ${a}`));
156
+ }
157
+ if (analysis.risks.length > 0) {
158
+ logger.info(` Risks:`);
159
+ analysis.risks.forEach((r) => logger.warn(` ⚠ ${r}`));
160
+ }
161
+ }
162
+ function printPlan(plan) {
163
+ logger.info(`\n🧩 Plan (${plan.steps.length} steps)`);
164
+ plan.steps.forEach((s, i) => {
165
+ logger.info(` ${i + 1}. [${s.id}] ${s.title}`);
166
+ logger.info(` ${s.description}`);
46
167
  });
47
168
  }
48
169
  //# sourceMappingURL=implement.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../src/cli/commands/implement.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,yCAAyC,CAAC;SACtD,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;SACtC,MAAM,CAAC,eAAe,EAAE,4BAA4B,EAAE,QAAQ,CAAC;SAC/D,MAAM,CAAC,WAAW,EAAE,iCAAiC,EAAE,KAAK,CAAC;SAC7D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAgD,EAAE,EAAE;QAC/E,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAEjC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/C,MAAM,WAAW,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAEtC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAuB;gBAC9D;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,OAAO,CAAC,MAAM;wBACrB,CAAC,CAAC,iCAAiC;wBACnC,CAAC,CAAC,gDAAgD;oBACpD,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QAChG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,cAAc,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport ora from \"ora\";\nimport { logger } from \"../../logger/logger.js\";\nimport type { AutonomyMode } from \"../../types/modes.js\";\nimport { Gitx } from \"../../core/gitx.js\";\nimport { assertValid, validateNonEmpty } from \"../../utils/validators.js\";\nimport { parseAutonomyMode } from \"../../utils/modes.js\";\n\nexport function registerImplementCommand(program: Command): void {\n program\n .command(\"implement\")\n .description(\"πŸ› οΈ Implement a task with AI assistance\")\n .argument(\"<task>\", \"Task description\")\n .option(\"--mode <mode>\", \"plan|guided|semi-auto|auto\", \"guided\")\n .option(\"--dry-run\", \"Simulate execution (no changes)\", false)\n .action(async (task: string, options: { mode: AutonomyMode; dryRun: boolean }) => {\n assertValid(validateNonEmpty(\"Task\")(task), \"Task\");\n const mode = parseAutonomyMode(options.mode);\n\n const gitx = await Gitx.fromCwd();\n\n const spinner = ora(\"🧠 Analyzing task…\").start();\n const analysis = await gitx.ai.analyzeTask(task);\n spinner.succeed(\"Task analyzed\");\n\n logger.info(\"🧾 Summary\");\n logger.info(JSON.stringify(analysis, null, 2));\n\n const planSpinner = ora(\"πŸ—ΊοΈ Generating plan…\").start();\n const plan = await gitx.ai.generatePlan({ task, analysis });\n planSpinner.succeed(\"Plan generated\");\n\n logger.info(\"🧩 Plan\");\n logger.info(JSON.stringify(plan, null, 2));\n\n if (mode !== \"auto\") {\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message: options.dryRun\n ? \"Proceed with dry-run execution?\"\n : \"Proceed with execution (branch + commit + PR)?\",\n default: false\n }\n ]);\n if (!proceed) {\n logger.warn(\"⏹️ Cancelled\");\n return;\n }\n }\n\n logger.warn(\"⚠️ implement flow execution is not wired yet (providers + git ops in next step).\");\n logger.info(`Mode: ${mode}, dry-run: ${options.dryRun ? \"yes\" : \"no\"}`);\n });\n}\n"]}
1
+ {"version":3,"file":"implement.js","sourceRoot":"","sources":["../../../src/cli/commands/implement.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport ora from \"ora\";\nimport { logger } from \"../../logger/logger.js\";\nimport type { AutonomyMode } from \"../../types/modes.js\";\nimport { Gitx } from \"../../core/gitx.js\";\nimport { assertValid, validateNonEmpty } from \"../../utils/validators.js\";\nimport { parseAutonomyMode } from \"../../utils/modes.js\";\nimport { runImplementWorkflow } from \"../../workflows/implement.js\";\nimport { isWorkingTreeDirty } from \"../../utils/gitOps.js\";\nimport type { AiAnalyzeTaskResponse, AiGeneratePlanResponse } from \"../../ai/types.js\";\n\nexport function registerImplementCommand(program: Command): void {\n program\n .command(\"implement\")\n .description(\"πŸ› οΈ Implement a task with AI assistance\")\n .argument(\"<task>\", \"Task description\")\n .option(\"--mode <mode>\", \"plan|guided|semi-auto|auto\", \"guided\")\n .option(\"--dry-run\", \"Simulate execution β€” no files changed, no commits\", false)\n .action(async (task: string, options: { mode: string; dryRun: boolean }) => {\n assertValid(validateNonEmpty(\"Task\")(task), \"Task\");\n const mode = parseAutonomyMode(options.mode) as AutonomyMode;\n const dryRun = options.dryRun;\n\n const initSpinner = ora(\"Loading config & repo context…\").start();\n let gitx: Gitx;\n try {\n gitx = await Gitx.fromCwd();\n const ctx = await gitx.getRepoContext();\n initSpinner.succeed(`Repo: ${ctx.repoSlug} Provider: ${ctx.provider}`);\n } catch (err) {\n initSpinner.fail(\"Failed to load context\");\n throw err;\n }\n\n // ── Guard: warn if AI is not available ─────────────────────────────────\n if (!process.env[\"ANTHROPIC_API_KEY\"]) {\n logger.warn(\n \"⚠️ ANTHROPIC_API_KEY is not set. AI responses will be mocked placeholders.\\n\" +\n \" Export it to use real Claude: export ANTHROPIC_API_KEY=sk-ant-...\"\n );\n if (mode !== \"plan\") {\n const { continueAnyway } = await (await import(\"inquirer\")).default.prompt<{ continueAnyway: boolean }>([\n { type: \"confirm\", name: \"continueAnyway\", message: \"Continue with mock AI anyway?\", default: false },\n ]);\n if (!continueAnyway) { logger.warn(\"Cancelled.\"); return; }\n }\n }\n\n // ── Guard: uncommitted changes would be lost when we create a branch ───\n if (mode !== \"plan\" && !options.dryRun) {\n const dirty = await isWorkingTreeDirty(gitx.cwd);\n if (dirty) {\n logger.warn(\"⚠️ You have uncommitted changes in your working tree.\");\n const { action } = await (await import(\"inquirer\")).default.prompt<{ action: string }>([\n {\n type: \"list\",\n name: \"action\",\n message: \"How do you want to handle them?\",\n choices: [\n { name: \"Stash them (git stash) and continue\", value: \"stash\" },\n { name: \"Cancel and handle them manually\", value: \"cancel\" },\n ],\n },\n ]);\n if (action === \"cancel\") { logger.warn(\"Cancelled.\"); return; }\n const { execFile } = await import(\"node:child_process\");\n const { promisify } = await import(\"node:util\");\n await promisify(execFile)(\"git\", [\"stash\", \"--include-untracked\"], { cwd: gitx.cwd });\n logger.success(\"Changes stashed. Run `git stash pop` to restore them after.\");\n }\n }\n\n // ── mode: plan ─────────────────────────────────────────────────────────\n if (mode === \"plan\") {\n const spinner = ora(\"🧠 Analyzing task…\").start();\n const analysis = await gitx.ai.analyzeTask(task);\n spinner.succeed(\"Task analyzed\");\n printAnalysis(analysis);\n\n const planSpinner = ora(\"πŸ—ΊοΈ Generating plan…\").start();\n const plan = await gitx.ai.generatePlan({ task, analysis });\n planSpinner.succeed(\"Plan generated\");\n printPlan(plan);\n\n logger.info(\"\\nπŸ’‘ Run with --mode=guided or --mode=auto to execute.\");\n return;\n }\n\n // ── modes: guided / semi-auto / auto ──────────────────────────────────\n const result = await runImplementWorkflow(gitx, {\n task,\n mode,\n dryRun,\n\n onAnalysis: async (analysis: AiAnalyzeTaskResponse): Promise<boolean> => {\n printAnalysis(analysis);\n if (mode === \"guided\") {\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message: \"Continue with this analysis and generate a plan?\",\n default: true,\n },\n ]);\n return proceed;\n }\n return true;\n },\n\n onPlan: async (plan: AiGeneratePlanResponse): Promise<boolean> => {\n printPlan(plan);\n if (mode === \"guided\" || mode === \"semi-auto\") {\n const { proceed } = await inquirer.prompt<{ proceed: boolean }>([\n {\n type: \"confirm\",\n name: \"proceed\",\n message: dryRun\n ? \"Proceed with dry-run (preview diffs only)?\"\n : \"Proceed with execution (create branch + commit + push + PR)?\",\n default: false,\n },\n ]);\n return proceed;\n }\n return true;\n },\n });\n\n // ── Show result ────────────────────────────────────────────────────────\n if (result.dryRun) {\n logger.info(\"\\n🏁 Dry-run complete. No real changes were made.\");\n if (result.appliedSteps.length > 0) {\n logger.info(`Would have applied steps: ${result.appliedSteps.join(\", \")}`);\n }\n return;\n }\n\n if (!result.commitSha) {\n logger.warn(\"\\n⚠️ No changes were committed. AI did not produce applicable diffs.\");\n return;\n }\n\n logger.success(\"\\nβœ… Implementation complete!\");\n logger.info(`Branch: ${result.branchName}`);\n logger.info(`Commit: ${result.commitSha?.slice(0, 8) ?? \"–\"}`);\n\n if (result.pr) {\n logger.success(`PR: ${result.pr.url}`);\n }\n\n if (result.failedSteps.length > 0) {\n logger.warn(`\\n⚠️ Some steps failed to apply:`);\n for (const f of result.failedSteps) {\n logger.warn(` β€’ ${f.stepId}: ${f.error}`);\n }\n }\n });\n}\n\n// ─── Display helpers ──────────────────────────────────────────────────────────\n\nfunction printAnalysis(analysis: AiAnalyzeTaskResponse): void {\n logger.info(`\\n🧾 Analysis`);\n logger.info(` Intent: ${analysis.intent}`);\n logger.info(` Summary: ${analysis.summary}`);\n if (analysis.assumptions.length > 0) {\n logger.info(` Assumptions:`);\n analysis.assumptions.forEach((a) => logger.info(` β€’ ${a}`));\n }\n if (analysis.risks.length > 0) {\n logger.info(` Risks:`);\n analysis.risks.forEach((r) => logger.warn(` ⚠ ${r}`));\n }\n}\n\nfunction printPlan(plan: AiGeneratePlanResponse): void {\n logger.info(`\\n🧩 Plan (${plan.steps.length} steps)`);\n plan.steps.forEach((s, i) => {\n logger.info(` ${i + 1}. [${s.id}] ${s.title}`);\n logger.info(` ${s.description}`);\n });\n}\n"]}
@@ -1,3 +1,7 @@
1
1
  import type { Command } from "commander";
2
+ /**
3
+ * `gitx init` is an alias for `gitx config setup`.
4
+ * Kept for discoverability and muscle memory.
5
+ */
2
6
  export declare function registerInitCommand(program: Command): void;
3
7
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgE1D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO1D"}
@@ -1,61 +1,14 @@
1
- import inquirer from "inquirer";
2
- import ora from "ora";
3
- import { logger } from "../../logger/logger.js";
4
- import { saveConfig } from "../../config/config.js";
5
- import { validateNonEmpty, validateOptionalRepoSlug } from "../../utils/validators.js";
6
- import { resolveRepoSlugFromCwd } from "../../utils/git.js";
1
+ import { runSetup } from "./config.js";
2
+ /**
3
+ * `gitx init` is an alias for `gitx config setup`.
4
+ * Kept for discoverability and muscle memory.
5
+ */
7
6
  export function registerInitCommand(program) {
8
7
  program
9
8
  .command("init")
10
- .description("πŸš€ Initialize gitx configuration")
9
+ .description("πŸš€ Alias for `gitx config setup`")
11
10
  .action(async () => {
12
- logger.info("πŸ“„ gitx init");
13
- const inferredRepo = await resolveRepoSlugFromCwd();
14
- const answers = await inquirer.prompt([
15
- {
16
- type: "list",
17
- name: "provider",
18
- message: "Choose a Git provider",
19
- choices: [
20
- { name: "GitHub", value: "github" },
21
- { name: "GitLab", value: "gitlab" },
22
- { name: "Azure DevOps", value: "azure" }
23
- ]
24
- },
25
- {
26
- type: "password",
27
- name: "token",
28
- message: "Enter an access token",
29
- mask: "*",
30
- validate: validateNonEmpty("Token")
31
- },
32
- {
33
- type: "input",
34
- name: "repo",
35
- message: "Repo (optional; e.g. owner/name). Leave blank to infer from current git repo.",
36
- default: inferredRepo,
37
- validate: validateOptionalRepoSlug
38
- },
39
- {
40
- type: "input",
41
- name: "defaultBranch",
42
- message: "Default branch",
43
- default: "main",
44
- validate: validateNonEmpty("Default branch")
45
- }
46
- ]);
47
- const repo = answers.repo.trim().length > 0 ? answers.repo.trim() : undefined;
48
- const config = {
49
- provider: answers.provider,
50
- token: answers.token,
51
- ...(repo ? { repo } : {}),
52
- defaultBranch: answers.defaultBranch
53
- };
54
- const spinner = ora("Saving config…").start();
55
- await saveConfig(config);
56
- spinner.succeed("Config saved");
57
- logger.success("βœ… gitx is ready");
58
- logger.info("Next: run `gitx implement \"<task>\" --mode=plan`");
11
+ await runSetup();
59
12
  });
60
13
  }
61
14
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE5B,MAAM,YAAY,GAAG,MAAM,sBAAsB,EAAE,CAAC;QAEpD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAKlC;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,uBAAuB;gBAChC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;oBACnC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE;iBACzC;aACF;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,uBAAuB;gBAChC,IAAI,EAAE,GAAG;gBACT,QAAQ,EAAE,gBAAgB,CAAC,OAAO,CAAC;aACpC;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,+EAA+E;gBACxF,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,wBAAwB;aACnC;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,gBAAgB;gBACzB,OAAO,EAAE,MAAM;gBACf,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9E,MAAM,MAAM,GAAe;YACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC9C,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEhC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport ora from \"ora\";\nimport { logger } from \"../../logger/logger.js\";\nimport { saveConfig } from \"../../config/config.js\";\nimport type { GitxConfig } from \"../../types/config.js\";\nimport type { ProviderKind } from \"../../types/provider.js\";\nimport { validateNonEmpty, validateOptionalRepoSlug } from \"../../utils/validators.js\";\nimport { resolveRepoSlugFromCwd } from \"../../utils/git.js\";\n\nexport function registerInitCommand(program: Command): void {\n program\n .command(\"init\")\n .description(\"πŸš€ Initialize gitx configuration\")\n .action(async () => {\n logger.info(\"πŸ“„ gitx init\");\n\n const inferredRepo = await resolveRepoSlugFromCwd();\n\n const answers = await inquirer.prompt<{\n provider: ProviderKind;\n token: string;\n repo: string;\n defaultBranch: string;\n }>([\n {\n type: \"list\",\n name: \"provider\",\n message: \"Choose a Git provider\",\n choices: [\n { name: \"GitHub\", value: \"github\" },\n { name: \"GitLab\", value: \"gitlab\" },\n { name: \"Azure DevOps\", value: \"azure\" }\n ]\n },\n {\n type: \"password\",\n name: \"token\",\n message: \"Enter an access token\",\n mask: \"*\",\n validate: validateNonEmpty(\"Token\")\n },\n {\n type: \"input\",\n name: \"repo\",\n message: \"Repo (optional; e.g. owner/name). Leave blank to infer from current git repo.\",\n default: inferredRepo,\n validate: validateOptionalRepoSlug\n },\n {\n type: \"input\",\n name: \"defaultBranch\",\n message: \"Default branch\",\n default: \"main\",\n validate: validateNonEmpty(\"Default branch\")\n }\n ]);\n\n const repo = answers.repo.trim().length > 0 ? answers.repo.trim() : undefined;\n\n const config: GitxConfig = {\n provider: answers.provider,\n token: answers.token,\n ...(repo ? { repo } : {}),\n defaultBranch: answers.defaultBranch\n };\n\n const spinner = ora(\"Saving config…\").start();\n await saveConfig(config);\n spinner.succeed(\"Config saved\");\n\n logger.success(\"βœ… gitx is ready\");\n logger.info(\"Next: run `gitx implement \\\"<task>\\\" --mode=plan`\");\n });\n}\n"]}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["import type { Command } from \"commander\";\nimport { runSetup } from \"./config.js\";\n\n/**\n * `gitx init` is an alias for `gitx config setup`.\n * Kept for discoverability and muscle memory.\n */\nexport function registerInitCommand(program: Command): void {\n program\n .command(\"init\")\n .description(\"πŸš€ Alias for `gitx config setup`\")\n .action(async () => {\n await runSetup();\n });\n}\n"]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * gitx port <target1> [target2...]
3
+ *
4
+ * Cherry-pick all commits from the current branch onto one or more target
5
+ * branches, with AI-assisted conflict resolution, then push and open PRs.
6
+ *
7
+ * Smart incremental detection via `git cherry`:
8
+ * - First run β†’ creates port/<source>-to-<target>, ports all commits
9
+ * - Re-run β†’ detects which commits are NEW since the last port, ports only those
10
+ * - Up to date β†’ tells you nothing to do
11
+ *
12
+ * Flow (per target branch):
13
+ * 1. Detect base branch β†’ collect commits on current branch (base..HEAD)
14
+ * 2. If port branch exists β†’ run `git cherry` to find unported commits only
15
+ * 3. Create (or checkout) port/<source>-to-<target> from origin/<target>
16
+ * 4. Cherry-pick commits oldest→newest with -x flag (records source SHA)
17
+ * 5. On conflict β†’ AI resolves β†’ stage β†’ cherry-pick --continue
18
+ * 6. On unresolvable β†’ pause, print manual instructions, `gitx port --continue`
19
+ * 7. Push β†’ create PR
20
+ *
21
+ * Usage:
22
+ * gitx port release/v2 # port to one branch
23
+ * gitx port release/v2 hotfix/v1 # port to multiple branches
24
+ * gitx port release/v2 --base develop # override base branch
25
+ * gitx port release/v2 --no-pr # skip PR creation
26
+ * gitx port release/v2 --draft # create draft PRs
27
+ * gitx port --continue # after manually resolving conflicts
28
+ * gitx port --abort # abort a stuck cherry-pick
29
+ */
30
+ import type { Command } from "commander";
31
+ export declare function registerPortCommand(program: Command): void;
32
+ //# sourceMappingURL=port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/port.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8fzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqL1D"}