geeto 0.6.5 → 0.9.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 (225) hide show
  1. package/README.md +23 -9
  2. package/lib/api/copilot-adapter.d.ts +14 -5
  3. package/lib/api/copilot-adapter.d.ts.map +1 -1
  4. package/lib/api/copilot-adapter.js +15 -21
  5. package/lib/api/copilot-adapter.js.map +1 -1
  6. package/lib/api/copilot-sdk.d.ts +3 -16
  7. package/lib/api/copilot-sdk.d.ts.map +1 -1
  8. package/lib/api/copilot-sdk.js +166 -441
  9. package/lib/api/copilot-sdk.js.map +1 -1
  10. package/lib/api/copilot.d.ts +3 -4
  11. package/lib/api/copilot.d.ts.map +1 -1
  12. package/lib/api/copilot.js +34 -31
  13. package/lib/api/copilot.js.map +1 -1
  14. package/lib/api/gemini-sdk.d.ts.map +1 -1
  15. package/lib/api/gemini-sdk.js +11 -77
  16. package/lib/api/gemini-sdk.js.map +1 -1
  17. package/lib/api/gemini.d.ts +2 -2
  18. package/lib/api/gemini.d.ts.map +1 -1
  19. package/lib/api/gemini.js +30 -22
  20. package/lib/api/gemini.js.map +1 -1
  21. package/lib/api/github.d.ts.map +1 -1
  22. package/lib/api/github.js +12 -6
  23. package/lib/api/github.js.map +1 -1
  24. package/lib/api/gitlab.d.ts +80 -0
  25. package/lib/api/gitlab.d.ts.map +1 -0
  26. package/lib/api/gitlab.js +192 -0
  27. package/lib/api/gitlab.js.map +1 -0
  28. package/lib/api/openrouter-sdk.d.ts +7 -7
  29. package/lib/api/openrouter-sdk.d.ts.map +1 -1
  30. package/lib/api/openrouter-sdk.js +17 -79
  31. package/lib/api/openrouter-sdk.js.map +1 -1
  32. package/lib/api/openrouter.d.ts.map +1 -1
  33. package/lib/api/openrouter.js +10 -20
  34. package/lib/api/openrouter.js.map +1 -1
  35. package/lib/api/platform.d.ts +78 -0
  36. package/lib/api/platform.d.ts.map +1 -0
  37. package/lib/api/platform.js +218 -0
  38. package/lib/api/platform.js.map +1 -0
  39. package/lib/api/trello.d.ts.map +1 -1
  40. package/lib/api/trello.js +8 -4
  41. package/lib/api/trello.js.map +1 -1
  42. package/lib/cli/input.d.ts +12 -3
  43. package/lib/cli/input.d.ts.map +1 -1
  44. package/lib/cli/input.js +123 -9
  45. package/lib/cli/input.js.map +1 -1
  46. package/lib/cli/menu.d.ts +1 -1
  47. package/lib/cli/menu.d.ts.map +1 -1
  48. package/lib/cli/menu.js +153 -96
  49. package/lib/cli/menu.js.map +1 -1
  50. package/lib/core/copilot-setup.d.ts +8 -7
  51. package/lib/core/copilot-setup.d.ts.map +1 -1
  52. package/lib/core/copilot-setup.js +60 -232
  53. package/lib/core/copilot-setup.js.map +1 -1
  54. package/lib/core/gemini-setup.js +7 -7
  55. package/lib/core/gemini-setup.js.map +1 -1
  56. package/lib/core/gitlab-setup.d.ts +5 -0
  57. package/lib/core/gitlab-setup.d.ts.map +1 -0
  58. package/lib/core/gitlab-setup.js +85 -0
  59. package/lib/core/gitlab-setup.js.map +1 -0
  60. package/lib/core/openrouter-setup.d.ts.map +1 -1
  61. package/lib/core/openrouter-setup.js +17 -0
  62. package/lib/core/openrouter-setup.js.map +1 -1
  63. package/lib/index.js +501 -704
  64. package/lib/index.js.map +1 -1
  65. package/lib/types/index.d.ts +11 -5
  66. package/lib/types/index.d.ts.map +1 -1
  67. package/lib/utils/ai-provider-helpers.d.ts +5 -0
  68. package/lib/utils/ai-provider-helpers.d.ts.map +1 -0
  69. package/lib/utils/ai-provider-helpers.js +23 -0
  70. package/lib/utils/ai-provider-helpers.js.map +1 -0
  71. package/lib/utils/ai-text.d.ts +23 -0
  72. package/lib/utils/ai-text.d.ts.map +1 -0
  73. package/lib/utils/ai-text.js +57 -0
  74. package/lib/utils/ai-text.js.map +1 -0
  75. package/lib/utils/ai-workflow.d.ts +18 -0
  76. package/lib/utils/ai-workflow.d.ts.map +1 -0
  77. package/lib/utils/ai-workflow.js +66 -0
  78. package/lib/utils/ai-workflow.js.map +1 -0
  79. package/lib/utils/branch-naming.d.ts.map +1 -1
  80. package/lib/utils/branch-naming.js +2 -4
  81. package/lib/utils/branch-naming.js.map +1 -1
  82. package/lib/utils/config.d.ts +13 -1
  83. package/lib/utils/config.d.ts.map +1 -1
  84. package/lib/utils/config.js +38 -1
  85. package/lib/utils/config.js.map +1 -1
  86. package/lib/utils/display.d.ts +24 -0
  87. package/lib/utils/display.d.ts.map +1 -1
  88. package/lib/utils/display.js +55 -1
  89. package/lib/utils/display.js.map +1 -1
  90. package/lib/utils/git-ai.d.ts +2 -0
  91. package/lib/utils/git-ai.d.ts.map +1 -1
  92. package/lib/utils/git-ai.js +30 -13
  93. package/lib/utils/git-ai.js.map +1 -1
  94. package/lib/utils/git-errors.d.ts.map +1 -1
  95. package/lib/utils/git-errors.js +4 -10
  96. package/lib/utils/git-errors.js.map +1 -1
  97. package/lib/utils/git.d.ts.map +1 -1
  98. package/lib/utils/git.js +5 -0
  99. package/lib/utils/git.js.map +1 -1
  100. package/lib/utils/github-helpers.d.ts +33 -0
  101. package/lib/utils/github-helpers.d.ts.map +1 -0
  102. package/lib/utils/github-helpers.js +101 -0
  103. package/lib/utils/github-helpers.js.map +1 -0
  104. package/lib/utils/logging.d.ts +8 -0
  105. package/lib/utils/logging.d.ts.map +1 -1
  106. package/lib/utils/logging.js +12 -0
  107. package/lib/utils/logging.js.map +1 -1
  108. package/lib/utils/prompt-loader.d.ts +9 -0
  109. package/lib/utils/prompt-loader.d.ts.map +1 -0
  110. package/lib/utils/prompt-loader.js +42 -0
  111. package/lib/utils/prompt-loader.js.map +1 -0
  112. package/lib/utils/prompts-embedded.d.ts +2 -0
  113. package/lib/utils/prompts-embedded.d.ts.map +1 -0
  114. package/lib/utils/prompts-embedded.js +255 -0
  115. package/lib/utils/prompts-embedded.js.map +1 -0
  116. package/lib/utils/scramble.d.ts +9 -86
  117. package/lib/utils/scramble.d.ts.map +1 -1
  118. package/lib/utils/scramble.js +27 -279
  119. package/lib/utils/scramble.js.map +1 -1
  120. package/lib/version.d.ts +1 -1
  121. package/lib/version.js +1 -1
  122. package/lib/workflows/alias.d.ts.map +1 -1
  123. package/lib/workflows/alias.js +1 -0
  124. package/lib/workflows/alias.js.map +1 -1
  125. package/lib/workflows/amend.d.ts.map +1 -1
  126. package/lib/workflows/amend.js +3 -6
  127. package/lib/workflows/amend.js.map +1 -1
  128. package/lib/workflows/branch-helpers.d.ts.map +1 -1
  129. package/lib/workflows/branch-helpers.js +0 -1
  130. package/lib/workflows/branch-helpers.js.map +1 -1
  131. package/lib/workflows/branch-utils.js +1 -1
  132. package/lib/workflows/branch-utils.js.map +1 -1
  133. package/lib/workflows/cleanup.js +3 -3
  134. package/lib/workflows/cleanup.js.map +1 -1
  135. package/lib/workflows/commit.d.ts.map +1 -1
  136. package/lib/workflows/commit.js +163 -202
  137. package/lib/workflows/commit.js.map +1 -1
  138. package/lib/workflows/doctor.d.ts +7 -0
  139. package/lib/workflows/doctor.d.ts.map +1 -0
  140. package/lib/workflows/doctor.js +284 -0
  141. package/lib/workflows/doctor.js.map +1 -0
  142. package/lib/workflows/history.d.ts.map +1 -1
  143. package/lib/workflows/history.js +2 -1
  144. package/lib/workflows/history.js.map +1 -1
  145. package/lib/workflows/issue.d.ts +1 -1
  146. package/lib/workflows/issue.d.ts.map +1 -1
  147. package/lib/workflows/issue.js +31 -130
  148. package/lib/workflows/issue.js.map +1 -1
  149. package/lib/workflows/main-helpers.d.ts +34 -0
  150. package/lib/workflows/main-helpers.d.ts.map +1 -0
  151. package/lib/workflows/main-helpers.js +346 -0
  152. package/lib/workflows/main-helpers.js.map +1 -0
  153. package/lib/workflows/main-steps.d.ts.map +1 -1
  154. package/lib/workflows/main-steps.js +11 -139
  155. package/lib/workflows/main-steps.js.map +1 -1
  156. package/lib/workflows/main.d.ts +2 -6
  157. package/lib/workflows/main.d.ts.map +1 -1
  158. package/lib/workflows/main.js +43 -365
  159. package/lib/workflows/main.js.map +1 -1
  160. package/lib/workflows/pr.d.ts +2 -2
  161. package/lib/workflows/pr.d.ts.map +1 -1
  162. package/lib/workflows/pr.js +52 -152
  163. package/lib/workflows/pr.js.map +1 -1
  164. package/lib/workflows/prune.d.ts.map +1 -1
  165. package/lib/workflows/prune.js +2 -10
  166. package/lib/workflows/prune.js.map +1 -1
  167. package/lib/workflows/pull.d.ts.map +1 -1
  168. package/lib/workflows/pull.js +2 -24
  169. package/lib/workflows/pull.js.map +1 -1
  170. package/lib/workflows/release-merge.d.ts +12 -0
  171. package/lib/workflows/release-merge.d.ts.map +1 -0
  172. package/lib/workflows/release-merge.js +569 -0
  173. package/lib/workflows/release-merge.js.map +1 -0
  174. package/lib/workflows/release-notes.d.ts +13 -0
  175. package/lib/workflows/release-notes.d.ts.map +1 -0
  176. package/lib/workflows/release-notes.js +141 -0
  177. package/lib/workflows/release-notes.js.map +1 -0
  178. package/lib/workflows/release-recover.d.ts +5 -0
  179. package/lib/workflows/release-recover.d.ts.map +1 -0
  180. package/lib/workflows/release-recover.js +137 -0
  181. package/lib/workflows/release-recover.js.map +1 -0
  182. package/lib/workflows/release-sync.d.ts +7 -0
  183. package/lib/workflows/release-sync.d.ts.map +1 -0
  184. package/lib/workflows/release-sync.js +321 -0
  185. package/lib/workflows/release-sync.js.map +1 -0
  186. package/lib/workflows/release-utils.d.ts +36 -0
  187. package/lib/workflows/release-utils.d.ts.map +1 -0
  188. package/lib/workflows/release-utils.js +150 -0
  189. package/lib/workflows/release-utils.js.map +1 -0
  190. package/lib/workflows/release.d.ts.map +1 -1
  191. package/lib/workflows/release.js +97 -723
  192. package/lib/workflows/release.js.map +1 -1
  193. package/lib/workflows/repo-settings.d.ts +2 -2
  194. package/lib/workflows/repo-settings.d.ts.map +1 -1
  195. package/lib/workflows/repo-settings.js +35 -25
  196. package/lib/workflows/repo-settings.js.map +1 -1
  197. package/lib/workflows/reword.d.ts.map +1 -1
  198. package/lib/workflows/reword.js +159 -167
  199. package/lib/workflows/reword.js.map +1 -1
  200. package/lib/workflows/security-gate.d.ts.map +1 -1
  201. package/lib/workflows/security-gate.js +18 -94
  202. package/lib/workflows/security-gate.js.map +1 -1
  203. package/lib/workflows/settings.d.ts +2 -1
  204. package/lib/workflows/settings.d.ts.map +1 -1
  205. package/lib/workflows/settings.js +289 -19
  206. package/lib/workflows/settings.js.map +1 -1
  207. package/lib/workflows/stash.d.ts.map +1 -1
  208. package/lib/workflows/stash.js +2 -1
  209. package/lib/workflows/stash.js.map +1 -1
  210. package/lib/workflows/trello-menu.d.ts +2 -5
  211. package/lib/workflows/trello-menu.d.ts.map +1 -1
  212. package/lib/workflows/trello-menu.js +67 -228
  213. package/lib/workflows/trello-menu.js.map +1 -1
  214. package/lib/workflows/undo.d.ts.map +1 -1
  215. package/lib/workflows/undo.js +2 -1
  216. package/lib/workflows/undo.js.map +1 -1
  217. package/package.json +3 -6
  218. package/prompts/branch-name-prompt.md +4 -0
  219. package/prompts/commit-message-prompt.md +12 -0
  220. package/prompts/issue-prompt.md +19 -0
  221. package/prompts/issue-review.with-context.prompt.yml +77 -0
  222. package/prompts/pr-prompt.md +14 -0
  223. package/prompts/release-notes-prompt.md +35 -0
  224. package/prompts/repo-description-prompt.md +1 -0
  225. package/prompts/security-gate-prompt.md +80 -0
package/lib/cli/input.js CHANGED
@@ -46,15 +46,124 @@ export const highlightDiff = (diff) => {
46
46
  .replaceAll(/^(\s.*)$/gm, '\u001B[37m$1\u001B[0m'); // Context lines (white)
47
47
  };
48
48
  /**
49
- * Ask a yes/no confirmation question
49
+ * Ask a yes/no confirmation question with interactive arrow-key toggle.
50
+ *
51
+ * Shortcuts:
52
+ * - ↑ / ↓ → cycle between Y and N (wraps around)
53
+ * - y / Y → immediately confirm yes
54
+ * - n / N → immediately confirm no
55
+ * - Enter → confirm current selection
56
+ * - Ctrl+C → exit
57
+ *
58
+ * Falls back to plain text input when stdin is not a TTY.
50
59
  */
51
60
  export const confirm = (question, defaultYes = true) => {
52
- const suffix = defaultYes ? ' (Y/n): ' : ' (y/N): ';
53
- const answer = askQuestion(`${question}${suffix}`);
54
- if (answer === '') {
55
- return defaultYes;
61
+ // Ensure cursor is visible and raw mode is off before we start
62
+ if (process.stdin.isTTY && process.stdin.isRaw) {
63
+ process.stdin.setRawMode(false);
64
+ }
65
+ process.stdout.write('\u001B[?25h');
66
+ // Non-TTY fallback — plain text input
67
+ if (!process.stdin.isTTY) {
68
+ const suffix = defaultYes ? ' (Y/n): ' : ' (y/N): ';
69
+ const answer = askQuestion(`${question}${suffix}`);
70
+ if (answer === '')
71
+ return defaultYes;
72
+ return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
73
+ }
74
+ let selected = null; // null = no selection yet, use defaultYes on Enter
75
+ const suffix = defaultYes ? '(Y/n)' : '(y/N)';
76
+ // Strip leading newlines from question — render them once as spacing, not on every redraw
77
+ const leadingNewlines = question.match(/^\n+/)?.[0] ?? '';
78
+ const cleanQuestion = question.slice(leadingNewlines.length);
79
+ /** Render the interactive prompt line (single-line overwrite). */
80
+ const render = () => {
81
+ const answer = selected === null
82
+ ? ''
83
+ : selected
84
+ ? '\u001B[36m\u001B[1mY\u001B[0m'
85
+ : '\u001B[36m\u001B[1mN\u001B[0m';
86
+ const line = `${cleanQuestion} ${suffix} ${answer}`;
87
+ process.stdout.write(`\r${line}\u001B[K`);
88
+ };
89
+ /** Render the final confirmed state and move to next line. */
90
+ const renderFinal = (label) => {
91
+ const line = `${cleanQuestion} ${suffix} \u001B[36m${label}\u001B[0m`;
92
+ process.stdout.write(`\r${line}\u001B[K\n`);
93
+ };
94
+ // Write leading newlines once, then initial render on the new line
95
+ process.stdout.write(leadingNewlines + '\n');
96
+ render();
97
+ // Enter raw mode for key-by-key reading
98
+ rl.pause();
99
+ process.stdin.setRawMode(true);
100
+ const buf = Buffer.alloc(16);
101
+ try {
102
+ for (;;) {
103
+ let n;
104
+ try {
105
+ n = fs.readSync(0, buf, 0, buf.length, null);
106
+ }
107
+ catch {
108
+ break;
109
+ }
110
+ if (n === 0)
111
+ break;
112
+ const b = buf[0];
113
+ if (b === undefined)
114
+ break;
115
+ // Ctrl+C → exit
116
+ if (b === 3) {
117
+ process.stdout.write('\u001B[?25h\n');
118
+ process.exit(0);
119
+ }
120
+ // Escape (standalone, not arrow sequence) → cancel, return false
121
+ if (b === 27 && (n === 1 || buf[1] !== 0x5b)) {
122
+ renderFinal('N');
123
+ return false;
124
+ }
125
+ // Enter → confirm current selection (null = use default)
126
+ if (b === 13 || b === 10) {
127
+ const result = selected ?? defaultYes;
128
+ renderFinal(result ? 'Y' : 'N');
129
+ return result;
130
+ }
131
+ // y / Y → immediately yes
132
+ if (b === 0x79 || b === 0x59) {
133
+ renderFinal('Y');
134
+ return true;
135
+ }
136
+ // n / N → immediately no
137
+ if (b === 0x6e || b === 0x4e) {
138
+ renderFinal('N');
139
+ return false;
140
+ }
141
+ // ESC sequences — arrow keys
142
+ if (b === 27 && n >= 3 && buf[1] === 0x5b) {
143
+ const arrow = buf[2];
144
+ // UP (0x41) or DOWN (0x42) → toggle
145
+ if (arrow === 0x41 || arrow === 0x42) {
146
+ if (selected === null) {
147
+ // First arrow press: UP → Y, DOWN → N
148
+ selected = arrow === 0x41;
149
+ }
150
+ else {
151
+ selected = !selected;
152
+ }
153
+ render();
154
+ }
155
+ continue;
156
+ }
157
+ }
158
+ }
159
+ finally {
160
+ if (process.stdin.isTTY) {
161
+ process.stdin.setRawMode(false);
162
+ }
163
+ process.stdout.write('\u001B[?25h'); // Show cursor
164
+ rl.resume();
56
165
  }
57
- return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';
166
+ return selected ?? defaultYes;
58
167
  };
59
168
  /**
60
169
  * Interactive multiline text input with editing support.
@@ -146,6 +255,11 @@ export const askMultiline = (question, initialText = '') => {
146
255
  process.stdout.write('\n');
147
256
  return null;
148
257
  }
258
+ // Escape (standalone, not arrow sequence) → cancel
259
+ if (b === 27 && (n === 1 || buf[1] !== 0x5b)) {
260
+ process.stdout.write('\n');
261
+ return null;
262
+ }
149
263
  // Ctrl+D → submit
150
264
  if (b === 4) {
151
265
  process.stdout.write('\n');
@@ -223,8 +337,8 @@ export const askMultiline = (question, initialText = '') => {
223
337
  return text || null;
224
338
  };
225
339
  /**
226
- * Inline multi-line text editor using the system's built-in terminal editor.
227
- * Opens nano (macOS/Linux) or notepad (Windows) with the initial text.
340
+ * Inline multi-line text editor using the system's terminal editor.
341
+ * Opens vim (macOS/Linux) or notepad (Windows) with the initial text.
228
342
  *
229
343
  * Kept async (returns Promise) so all existing callers using
230
344
  * `await editInline(...)` continue to work without changes.
@@ -243,7 +357,7 @@ export const editInline = (initialText, label = 'Edit Message', _syntax = '') =>
243
357
  catch {
244
358
  return Promise.resolve(null);
245
359
  }
246
- const editor = process.platform === 'win32' ? 'notepad' : 'nano';
360
+ const editor = process.platform === 'win32' ? 'notepad' : 'vim';
247
361
  try {
248
362
  spawnSync(editor, [tmpPath], { stdio: 'inherit' });
249
363
  const edited = fs.readFileSync(tmpPath, { encoding: 'utf8' }).trim();
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/cli/input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/cli/input.ts"],"names":[],"mappings":"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"}
package/lib/cli/menu.d.ts CHANGED
@@ -9,5 +9,5 @@ export declare const select: (question: string, options: SelectOption[]) => Prom
9
9
  /**
10
10
  * Interactive multi-select menu with checkboxes (Space to toggle, Enter to confirm)
11
11
  */
12
- export declare const multiSelect: (question: string, options: SelectOption[]) => Promise<string[]>;
12
+ export declare const multiSelect: (question: string, options: SelectOption[], preSelected?: string[]) => Promise<string[]>;
13
13
  //# sourceMappingURL=menu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/cli/menu.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMrD;;GAEG;AACH,eAAO,MAAM,MAAM,GAAU,UAAU,MAAM,EAAE,SAAS,YAAY,EAAE,KAAG,OAAO,CAAC,MAAM,CA+TtF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,GAAU,UAAU,MAAM,EAAE,SAAS,YAAY,EAAE,KAAG,OAAO,CAAC,MAAM,EAAE,CAgd7F,CAAA"}
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/cli/menu.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMrD;;GAEG;AACH,eAAO,MAAM,MAAM,GAAU,UAAU,MAAM,EAAE,SAAS,YAAY,EAAE,KAAG,OAAO,CAAC,MAAM,CA2VtF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,EAChB,SAAS,YAAY,EAAE,EACvB,cAAc,MAAM,EAAE,KACrB,OAAO,CAAC,MAAM,EAAE,CAwdlB,CAAA"}
package/lib/cli/menu.js CHANGED
@@ -14,6 +14,23 @@ export const select = async (question, options) => {
14
14
  let searchMode = false;
15
15
  let searchQuery = '';
16
16
  let filteredOptions = options;
17
+ /** Skip disabled items when navigating */
18
+ const skipDisabled = (dir) => {
19
+ const len = filteredOptions.length;
20
+ for (let i = 0; i < len; i++) {
21
+ selectedIndex += dir;
22
+ if (selectedIndex < 0)
23
+ selectedIndex = len - 1;
24
+ if (selectedIndex >= len)
25
+ selectedIndex = 0;
26
+ if (!filteredOptions[selectedIndex]?.disabled)
27
+ break;
28
+ }
29
+ };
30
+ // Skip initial disabled items
31
+ if (filteredOptions[selectedIndex]?.disabled) {
32
+ skipDisabled(1);
33
+ }
17
34
  const filterOptions = (query) => {
18
35
  if (!query) {
19
36
  return options;
@@ -37,6 +54,10 @@ export const select = async (question, options) => {
37
54
  */
38
55
  const stripAnsi = (str) => str.replaceAll(/\u001B\[\d*;?\d*m|\u001B\]8;;[^\u0007]*\u0007/g, '');
39
56
  const renderItem = (opt, idx) => {
57
+ // Disabled items render as section headers (non-selectable)
58
+ if (opt.disabled) {
59
+ return ` ${colors.bright}${opt.label}${colors.reset}`;
60
+ }
40
61
  const prefix = idx === selectedIndex ? `${colors.cyan}❯${colors.reset}` : ' ';
41
62
  // Truncate label to terminal width
42
63
  const cols = process.stdout.columns || 80;
@@ -100,7 +121,7 @@ export const select = async (question, options) => {
100
121
  linesRendered++;
101
122
  const hintText = searchMode
102
123
  ? ` (Esc cancel search, Enter select)`
103
- : ` (↑↓/jk arrows, / search, Enter select, 'c' clear, 'q' quit)`;
124
+ : ` (↑↓/jk arrows, / search, Enter select, Esc back, 'c' clear, 'q' quit)`;
104
125
  console.log(`${colors.gray}${hintText}${colors.reset}`);
105
126
  linesRendered++;
106
127
  if (searchMode) {
@@ -213,6 +234,12 @@ export const select = async (question, options) => {
213
234
  }
214
235
  // Normal navigation mode
215
236
  switch (keyStr) {
237
+ case '\u001B': {
238
+ // Escape key - back to parent menu
239
+ cleanup();
240
+ resolve('back');
241
+ break;
242
+ }
216
243
  case '/': {
217
244
  searchMode = true;
218
245
  renderMenu();
@@ -220,18 +247,20 @@ export const select = async (question, options) => {
220
247
  }
221
248
  case '\u001B[A':
222
249
  case 'k': {
223
- selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : filteredOptions.length - 1;
250
+ skipDisabled(-1);
224
251
  renderMenu();
225
252
  break;
226
253
  }
227
254
  case '\u001B[B':
228
255
  case 'j': {
229
- selectedIndex = selectedIndex < filteredOptions.length - 1 ? selectedIndex + 1 : 0;
256
+ skipDisabled(1);
230
257
  renderMenu();
231
258
  break;
232
259
  }
233
260
  case '\r':
234
261
  case '\n': {
262
+ if (filteredOptions[selectedIndex]?.disabled)
263
+ break;
235
264
  cleanup();
236
265
  resolve(filteredOptions[selectedIndex]?.value ?? '');
237
266
  break;
@@ -272,7 +301,7 @@ export const select = async (question, options) => {
272
301
  }
273
302
  console.log('');
274
303
  clearLines++;
275
- console.log(`${colors.gray} (↑↓/jk arrows, / search, Enter select, 'c' clear, 'q' quit)${colors.reset}`);
304
+ console.log(`${colors.gray} (↑↓/jk arrows, / search, Enter select, Esc back, 'c' clear, 'q' quit)${colors.reset}`);
276
305
  clearLines++;
277
306
  lastRenderedLines = clearLines;
278
307
  break;
@@ -286,9 +315,15 @@ export const select = async (question, options) => {
286
315
  /**
287
316
  * Interactive multi-select menu with checkboxes (Space to toggle, Enter to confirm)
288
317
  */
289
- export const multiSelect = async (question, options) => {
318
+ export const multiSelect = async (question, options, preSelected) => {
290
319
  return new Promise((resolve) => {
291
320
  let selectedIndex = 0;
321
+ // Skip initial disabled items (but allow group headers with children)
322
+ while (selectedIndex < options.length &&
323
+ options[selectedIndex]?.disabled &&
324
+ !options[selectedIndex]?.children) {
325
+ selectedIndex++;
326
+ }
292
327
  const maxVisibleItems = 15;
293
328
  let scrollOffset = 0;
294
329
  let searchMode = false;
@@ -296,7 +331,33 @@ export const multiSelect = async (question, options) => {
296
331
  let searchQuery = '';
297
332
  let rangeQuery = '';
298
333
  let filteredOptions = options;
299
- const checked = new Set();
334
+ const checked = new Set((preSelected ?? []).filter((v) => options.some((o) => o.value === v)));
335
+ const totalSelectable = options.filter((o) => !o.disabled && !o.children).length;
336
+ let lastRenderedLines = 0;
337
+ /** Group header values to filter out from results */
338
+ const groupValues = new Set(options.filter((o) => o.children).map((o) => o.value));
339
+ /** Get checked values excluding group header values */
340
+ const getResult = () => [...checked].filter((v) => !groupValues.has(v));
341
+ /** Skip over disabled items when navigating (group headers with children are NOT skipped) */
342
+ const skipDisabled = (dir) => {
343
+ while (filteredOptions[selectedIndex]?.disabled &&
344
+ !filteredOptions[selectedIndex]?.children &&
345
+ selectedIndex >= 0 &&
346
+ selectedIndex < filteredOptions.length) {
347
+ selectedIndex += dir;
348
+ }
349
+ // Clamp
350
+ if (selectedIndex < 0)
351
+ selectedIndex = 0;
352
+ if (selectedIndex >= filteredOptions.length)
353
+ selectedIndex = filteredOptions.length - 1;
354
+ // If still on disabled (and not a group header), find nearest enabled
355
+ if (filteredOptions[selectedIndex]?.disabled && !filteredOptions[selectedIndex]?.children) {
356
+ const idx = filteredOptions.findIndex((o) => !o.disabled || (o.children && o.children.length > 0));
357
+ if (idx !== -1)
358
+ selectedIndex = idx;
359
+ }
360
+ };
300
361
  const filterOptions = (query) => {
301
362
  if (!query)
302
363
  return options;
@@ -318,15 +379,37 @@ export const multiSelect = async (question, options) => {
318
379
  */
319
380
  const stripAnsi = (str) => str.replaceAll(/\u001B\[\d*;?\d*m|\u001B\]8;;[^\u0007]*\u0007/g, '');
320
381
  const renderItem = (opt, idx) => {
382
+ // Group header (folder) — selectable, toggles children
383
+ if (opt.children && opt.children.length > 0) {
384
+ const checkedCount = opt.children.filter((v) => checked.has(v)).length;
385
+ const total = opt.children.length;
386
+ const cursor = idx === selectedIndex ? `${colors.cyan}❯${colors.reset}` : ' ';
387
+ let box;
388
+ if (checkedCount === total) {
389
+ box = `${colors.green}◉${colors.reset}`;
390
+ }
391
+ else if (checkedCount > 0) {
392
+ box = `${colors.yellow}◐${colors.reset}`;
393
+ }
394
+ else {
395
+ box = `${colors.gray}○${colors.reset}`;
396
+ }
397
+ const label = idx === selectedIndex
398
+ ? `${colors.cyan}${colors.bright}${opt.label}${colors.reset}`
399
+ : `${colors.bright}${opt.label}${colors.reset}`;
400
+ return `${cursor} ${box} ${label}`;
401
+ }
402
+ // Disabled items are non-interactive separators
403
+ if (opt.disabled) {
404
+ return ` ${colors.bright}${opt.label}${colors.reset}`;
405
+ }
321
406
  const cursor = idx === selectedIndex ? `${colors.cyan}❯${colors.reset}` : ' ';
322
407
  const box = checked.has(opt.value)
323
408
  ? `${colors.green}◉${colors.reset}`
324
409
  : `${colors.gray}○${colors.reset}`;
325
- // Show 1-based number for quick range selection
326
- const num = `${colors.gray}${String(idx + 1).padStart(2, ' ')}${colors.reset}`;
327
410
  // Truncate label to fit terminal width
328
411
  const cols = process.stdout.columns || 80;
329
- const prefixLen = 5 + Math.max(2, String(idx + 1).length); // "❯ ◉ XX "
412
+ const prefixLen = 5; // "❯ ◉ "
330
413
  const maxLabelLen = cols - prefixLen - 1;
331
414
  const visibleLabel = stripAnsi(opt.label);
332
415
  let displayLabel = opt.label;
@@ -344,18 +427,14 @@ export const multiSelect = async (question, options) => {
344
427
  ? `${colors.cyan}${colors.bright}${opt.label}${colors.reset}`
345
428
  : `${colors.gray}${opt.label}${colors.reset}`;
346
429
  }
347
- return `${cursor} ${box} ${num} ${displayLabel}`;
430
+ return `${cursor} ${box} ${displayLabel}`;
348
431
  };
349
- // Track how many lines the previous render produced (for accurate clearing)
350
- let lastRenderedLines = 0;
351
432
  const renderMenu = () => {
352
433
  const { start, end } = getVisibleRange();
353
- // If range mode, cursor is on the range input line (no newline was written)
354
- // First clear current line, then go up for the rest
434
+ // Clear previous render by moving cursor up line-by-line (reliable across all terminals)
355
435
  if (rangeMode) {
356
436
  process.stdout.write('\u001B[2K\r'); // Clear current range input line
357
437
  }
358
- // Clear exactly the number of lines the PREVIOUS render produced
359
438
  for (let i = 0; i < lastRenderedLines; i++) {
360
439
  process.stdout.write('\u001B[1A\u001B[2K');
361
440
  }
@@ -364,8 +443,7 @@ export const multiSelect = async (question, options) => {
364
443
  console.log(`${colors.cyan}/ search:${colors.reset} ${searchQuery}`);
365
444
  linesRendered++;
366
445
  }
367
- // Count line
368
- console.log(`${colors.gray} Selected: ${colors.cyan}${checked.size}${colors.gray}/${options.length}${colors.reset}`);
446
+ console.log(`${colors.gray} Selected: ${colors.cyan}${checked.size}${colors.gray}/${totalSelectable}${colors.reset}`);
369
447
  linesRendered++;
370
448
  // Scroll indicator: items above
371
449
  const above = start;
@@ -397,7 +475,7 @@ export const multiSelect = async (question, options) => {
397
475
  ? ` (Type numbers: "1 3 5" or "1-10", Enter apply, Esc cancel)`
398
476
  : searchMode
399
477
  ? ` (Esc cancel search, Space toggle, Enter confirm)`
400
- : ` (↑↓/jk Space toggle, 'a' all, 'n' none, '#' range, / search, Enter confirm, 'q' quit)`;
478
+ : ` (↑↓/jk Space toggle, 'a' all, 'n' none, '#' range, / search, Enter confirm, Esc back, 'q' quit)`;
401
479
  console.log(`${colors.gray}${hintText}${colors.reset}`);
402
480
  linesRendered++;
403
481
  // Range input at the very bottom (no newline so cursor stays at end)
@@ -406,42 +484,10 @@ export const multiSelect = async (question, options) => {
406
484
  }
407
485
  lastRenderedLines = linesRendered;
408
486
  };
409
- // Initial render
487
+ // Print question line
410
488
  console.log(`${colors.cyan}?${colors.reset} ${question}`);
411
- {
412
- let initLines = 0;
413
- console.log(`${colors.gray} Selected: ${colors.cyan}${checked.size}${colors.gray}/${options.length}${colors.reset}`);
414
- initLines++;
415
- const { start, end } = getVisibleRange();
416
- const above = start;
417
- if (above > 0) {
418
- console.log(`${colors.gray} ↑ ${above} more above${colors.reset}`);
419
- initLines++;
420
- }
421
- console.log('');
422
- initLines++;
423
- for (let idx = start; idx < end; idx++) {
424
- const opt = filteredOptions[idx];
425
- if (!opt)
426
- continue;
427
- console.log(renderItem(opt, idx));
428
- initLines++;
429
- }
430
- // Scroll indicator: items below
431
- const below = filteredOptions.length - end;
432
- if (below > 0) {
433
- console.log('');
434
- initLines++;
435
- console.log(`${colors.gray} ↓ ${below} more below${colors.reset}`);
436
- initLines++;
437
- }
438
- // Hint at bottom
439
- console.log('');
440
- initLines++;
441
- console.log(`${colors.gray} (↑↓/jk Space toggle, 'a' all, 'n' none, '#' range, / search, Enter confirm, 'q' quit)${colors.reset}`);
442
- initLines++;
443
- lastRenderedLines = initLines;
444
- }
489
+ // Initial render
490
+ renderMenu();
445
491
  if (process.stdin.isTTY) {
446
492
  process.stdin.setRawMode(true);
447
493
  }
@@ -541,12 +587,25 @@ export const multiSelect = async (question, options) => {
541
587
  }
542
588
  if (keyStr === ' ') {
543
589
  const opt = filteredOptions[selectedIndex];
544
- if (opt) {
545
- if (checked.has(opt.value)) {
546
- checked.delete(opt.value);
590
+ if (opt && !opt.disabled) {
591
+ if (opt.children && opt.children.length > 0) {
592
+ const allChecked = opt.children.every((v) => checked.has(v));
593
+ if (allChecked) {
594
+ for (const v of opt.children)
595
+ checked.delete(v);
596
+ }
597
+ else {
598
+ for (const v of opt.children)
599
+ checked.add(v);
600
+ }
547
601
  }
548
602
  else {
549
- checked.add(opt.value);
603
+ if (checked.has(opt.value)) {
604
+ checked.delete(opt.value);
605
+ }
606
+ else {
607
+ checked.add(opt.value);
608
+ }
550
609
  }
551
610
  }
552
611
  renderMenu();
@@ -554,24 +613,27 @@ export const multiSelect = async (question, options) => {
554
613
  }
555
614
  if (keyStr === '\r' || keyStr === '\n') {
556
615
  cleanup();
557
- resolve([...checked]);
616
+ resolve(getResult());
558
617
  return;
559
618
  }
560
619
  if (keyStr === '\u007F' || keyStr === '\b') {
561
620
  searchQuery = searchQuery.slice(0, -1);
562
621
  filteredOptions = filterOptions(searchQuery);
563
622
  selectedIndex = 0;
623
+ skipDisabled(1);
564
624
  scrollOffset = 0;
565
625
  renderMenu();
566
626
  return;
567
627
  }
568
628
  if (keyStr === '\u001B[A' || keyStr === 'k') {
569
629
  selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : filteredOptions.length - 1;
630
+ skipDisabled(-1);
570
631
  renderMenu();
571
632
  return;
572
633
  }
573
634
  if (keyStr === '\u001B[B' || keyStr === 'j') {
574
635
  selectedIndex = selectedIndex < filteredOptions.length - 1 ? selectedIndex + 1 : 0;
636
+ skipDisabled(1);
575
637
  renderMenu();
576
638
  return;
577
639
  }
@@ -591,6 +653,12 @@ export const multiSelect = async (question, options) => {
591
653
  }
592
654
  // Normal navigation mode
593
655
  switch (keyStr) {
656
+ case '\u001B': {
657
+ // Escape key - cancel/back
658
+ cleanup();
659
+ resolve([]);
660
+ break;
661
+ }
594
662
  case '#': {
595
663
  rangeMode = true;
596
664
  renderMenu();
@@ -604,24 +672,40 @@ export const multiSelect = async (question, options) => {
604
672
  case '\u001B[A':
605
673
  case 'k': {
606
674
  selectedIndex = selectedIndex > 0 ? selectedIndex - 1 : filteredOptions.length - 1;
675
+ skipDisabled(-1);
607
676
  renderMenu();
608
677
  break;
609
678
  }
610
679
  case '\u001B[B':
611
680
  case 'j': {
612
681
  selectedIndex = selectedIndex < filteredOptions.length - 1 ? selectedIndex + 1 : 0;
682
+ skipDisabled(1);
613
683
  renderMenu();
614
684
  break;
615
685
  }
616
686
  case ' ': {
617
- // Toggle current item
687
+ // Toggle current item (skip disabled)
618
688
  const opt = filteredOptions[selectedIndex];
619
- if (opt) {
620
- if (checked.has(opt.value)) {
621
- checked.delete(opt.value);
689
+ if (opt && !opt.disabled) {
690
+ if (opt.children && opt.children.length > 0) {
691
+ // Group header: toggle all children
692
+ const allChecked = opt.children.every((v) => checked.has(v));
693
+ if (allChecked) {
694
+ for (const v of opt.children)
695
+ checked.delete(v);
696
+ }
697
+ else {
698
+ for (const v of opt.children)
699
+ checked.add(v);
700
+ }
622
701
  }
623
702
  else {
624
- checked.add(opt.value);
703
+ if (checked.has(opt.value)) {
704
+ checked.delete(opt.value);
705
+ }
706
+ else {
707
+ checked.add(opt.value);
708
+ }
625
709
  }
626
710
  }
627
711
  renderMenu();
@@ -629,9 +713,10 @@ export const multiSelect = async (question, options) => {
629
713
  }
630
714
  case 'a':
631
715
  case 'A': {
632
- // Select all
716
+ // Select all (only non-disabled, non-group-header)
633
717
  for (const opt of options) {
634
- checked.add(opt.value);
718
+ if (!opt.disabled && !opt.children)
719
+ checked.add(opt.value);
635
720
  }
636
721
  renderMenu();
637
722
  break;
@@ -646,7 +731,7 @@ export const multiSelect = async (question, options) => {
646
731
  case '\r':
647
732
  case '\n': {
648
733
  cleanup();
649
- resolve([...checked]);
734
+ resolve(getResult());
650
735
  break;
651
736
  }
652
737
  case 'q':
@@ -660,36 +745,8 @@ export const multiSelect = async (question, options) => {
660
745
  case 'C': {
661
746
  console.clear();
662
747
  console.log(`${colors.cyan}?${colors.reset} ${question}`);
663
- let clearLines = 0;
664
- console.log(`${colors.gray} Selected: ${colors.cyan}${checked.size}${colors.gray}/${options.length}${colors.reset}`);
665
- clearLines++;
666
- const { start, end } = getVisibleRange();
667
- const aboveC = start;
668
- if (aboveC > 0) {
669
- console.log(`${colors.gray} ↑ ${aboveC} more above${colors.reset}`);
670
- clearLines++;
671
- }
672
- console.log('');
673
- clearLines++;
674
- for (let idx = start; idx < end; idx++) {
675
- const opt = filteredOptions[idx];
676
- if (!opt)
677
- continue;
678
- console.log(renderItem(opt, idx));
679
- clearLines++;
680
- }
681
- const belowC = filteredOptions.length - end;
682
- if (belowC > 0) {
683
- console.log('');
684
- clearLines++;
685
- console.log(`${colors.gray} ↓ ${belowC} more below${colors.reset}`);
686
- clearLines++;
687
- }
688
- console.log('');
689
- clearLines++;
690
- console.log(`${colors.gray} (↑↓/jk Space toggle, 'a' all, 'n' none, '#' range, / search, Enter confirm, 'q' quit)${colors.reset}`);
691
- clearLines++;
692
- lastRenderedLines = clearLines;
748
+ lastRenderedLines = 0;
749
+ renderMenu();
693
750
  break;
694
751
  }
695
752
  }