@compilr-dev/cli 0.4.0 → 0.5.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 (315) hide show
  1. package/README.md +30 -12
  2. package/dist/agent.d.ts +74 -1
  3. package/dist/agent.js +259 -76
  4. package/dist/anchors/index.d.ts +9 -0
  5. package/dist/anchors/index.js +9 -0
  6. package/dist/anchors/project-anchors.d.ts +79 -0
  7. package/dist/anchors/project-anchors.js +202 -0
  8. package/dist/commands/handler-types.d.ts +68 -0
  9. package/dist/commands/handler-types.js +8 -0
  10. package/dist/commands/handlers/agent-commands.d.ts +13 -0
  11. package/dist/commands/handlers/agent-commands.js +305 -0
  12. package/dist/commands/handlers/design-commands.d.ts +15 -0
  13. package/dist/commands/handlers/design-commands.js +334 -0
  14. package/dist/commands/handlers/index.d.ts +20 -0
  15. package/dist/commands/handlers/index.js +43 -0
  16. package/dist/commands/handlers/overlay-commands.d.ts +21 -0
  17. package/dist/commands/handlers/overlay-commands.js +287 -0
  18. package/dist/commands/handlers/project-commands.d.ts +11 -0
  19. package/dist/commands/handlers/project-commands.js +167 -0
  20. package/dist/commands/handlers/simple-commands.d.ts +19 -0
  21. package/dist/commands/handlers/simple-commands.js +144 -0
  22. package/dist/commands/index.d.ts +2 -1
  23. package/dist/commands/registry.d.ts +50 -0
  24. package/dist/commands/registry.js +75 -0
  25. package/dist/commands-v2/handlers/context.d.ts +13 -0
  26. package/dist/commands-v2/handlers/context.js +348 -0
  27. package/dist/commands-v2/handlers/core.d.ts +13 -0
  28. package/dist/commands-v2/handlers/core.js +165 -0
  29. package/dist/commands-v2/handlers/debug.d.ts +11 -0
  30. package/dist/commands-v2/handlers/debug.js +159 -0
  31. package/dist/commands-v2/handlers/index.d.ts +12 -0
  32. package/dist/commands-v2/handlers/index.js +24 -0
  33. package/dist/commands-v2/handlers/project.d.ts +22 -0
  34. package/dist/commands-v2/handlers/project.js +814 -0
  35. package/dist/commands-v2/handlers/settings.d.ts +15 -0
  36. package/dist/commands-v2/handlers/settings.js +235 -0
  37. package/dist/commands-v2/index.d.ts +13 -0
  38. package/dist/commands-v2/index.js +15 -0
  39. package/dist/commands-v2/registry.d.ts +37 -0
  40. package/dist/commands-v2/registry.js +80 -0
  41. package/dist/commands-v2/types.d.ts +75 -0
  42. package/dist/commands-v2/types.js +7 -0
  43. package/dist/commands.js +110 -7
  44. package/dist/index.js +288 -29
  45. package/dist/input-handlers/index.d.ts +7 -0
  46. package/dist/input-handlers/index.js +7 -0
  47. package/dist/input-handlers/memory-handler.d.ts +26 -0
  48. package/dist/input-handlers/memory-handler.js +68 -0
  49. package/dist/repl-helpers.d.ts +63 -0
  50. package/dist/repl-helpers.js +318 -0
  51. package/dist/repl-v2.d.ts +155 -0
  52. package/dist/repl-v2.js +774 -0
  53. package/dist/repl.d.ts +32 -4
  54. package/dist/repl.js +250 -977
  55. package/dist/settings/index.d.ts +23 -0
  56. package/dist/settings/index.js +48 -0
  57. package/dist/settings/paths.d.ts +110 -0
  58. package/dist/settings/paths.js +264 -0
  59. package/dist/templates/compilr-md.js +7 -4
  60. package/dist/templates/index.js +3 -4
  61. package/dist/themes/colors.js +3 -1
  62. package/dist/themes/registry.d.ts +5 -36
  63. package/dist/themes/registry.js +11 -95
  64. package/dist/themes/types.d.ts +3 -38
  65. package/dist/themes/types.js +2 -2
  66. package/dist/tools/anchor-tools.d.ts +31 -0
  67. package/dist/tools/anchor-tools.js +255 -0
  68. package/dist/tools/backlog-wrappers.d.ts +54 -0
  69. package/dist/tools/backlog-wrappers.js +338 -0
  70. package/dist/tools/backlog.js +1 -1
  71. package/dist/tools/db-tools.d.ts +65 -0
  72. package/dist/tools/db-tools.js +19 -0
  73. package/dist/tools/document-db.d.ts +43 -0
  74. package/dist/tools/document-db.js +220 -0
  75. package/dist/tools/project-db.d.ts +102 -0
  76. package/dist/tools/project-db.js +370 -0
  77. package/dist/tools/workitem-db.d.ts +103 -0
  78. package/dist/tools/workitem-db.js +549 -0
  79. package/dist/tools.js +13 -3
  80. package/dist/ui/agents-overlay-v2.d.ts +43 -0
  81. package/dist/ui/agents-overlay-v2.js +809 -0
  82. package/dist/ui/agents-overlay.d.ts +5 -5
  83. package/dist/ui/agents-overlay.js +782 -420
  84. package/dist/ui/anchors-overlay.d.ts +12 -0
  85. package/dist/ui/anchors-overlay.js +775 -0
  86. package/dist/ui/arch-type-overlay.d.ts +1 -6
  87. package/dist/ui/arch-type-overlay.js +175 -203
  88. package/dist/ui/ask-user-overlay-v2.d.ts +26 -0
  89. package/dist/ui/ask-user-overlay-v2.js +555 -0
  90. package/dist/ui/ask-user-overlay.d.ts +2 -2
  91. package/dist/ui/ask-user-overlay.js +443 -535
  92. package/dist/ui/ask-user-simple-overlay-v2.d.ts +25 -0
  93. package/dist/ui/ask-user-simple-overlay-v2.js +215 -0
  94. package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
  95. package/dist/ui/ask-user-simple-overlay.js +182 -209
  96. package/dist/ui/backlog-overlay.d.ts +16 -1
  97. package/dist/ui/backlog-overlay.js +525 -659
  98. package/dist/ui/base/index.d.ts +26 -0
  99. package/dist/ui/base/index.js +33 -0
  100. package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
  101. package/dist/ui/base/inline-overlay-utils.js +320 -0
  102. package/dist/ui/base/inline-overlay.d.ts +159 -0
  103. package/dist/ui/base/inline-overlay.js +257 -0
  104. package/dist/ui/base/key-utils.d.ts +15 -0
  105. package/dist/ui/base/key-utils.js +30 -0
  106. package/dist/ui/base/overlay-base-v2.d.ts +193 -0
  107. package/dist/ui/base/overlay-base-v2.js +246 -0
  108. package/dist/ui/base/overlay-base.d.ts +156 -0
  109. package/dist/ui/base/overlay-base.js +238 -0
  110. package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
  111. package/dist/ui/base/overlay-lifecycle.js +159 -0
  112. package/dist/ui/base/overlay-types.d.ts +185 -0
  113. package/dist/ui/base/overlay-types.js +7 -0
  114. package/dist/ui/base/render-utils.d.ts +8 -0
  115. package/dist/ui/base/render-utils.js +11 -0
  116. package/dist/ui/base/screen-stack.d.ts +148 -0
  117. package/dist/ui/base/screen-stack.js +184 -0
  118. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +103 -0
  119. package/dist/ui/base/tabbed-list-overlay-v2.js +317 -0
  120. package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
  121. package/dist/ui/base/tabbed-list-overlay.js +369 -0
  122. package/dist/ui/commands-overlay-v2.d.ts +33 -0
  123. package/dist/ui/commands-overlay-v2.js +441 -0
  124. package/dist/ui/commands-overlay.d.ts +7 -2
  125. package/dist/ui/commands-overlay.js +384 -355
  126. package/dist/ui/config-overlay.d.ts +5 -4
  127. package/dist/ui/config-overlay.js +243 -513
  128. package/dist/ui/conversation.d.ts +75 -4
  129. package/dist/ui/conversation.js +374 -161
  130. package/dist/ui/docs-overlay.d.ts +17 -0
  131. package/dist/ui/docs-overlay.js +303 -0
  132. package/dist/ui/ephemeral.d.ts +1 -1
  133. package/dist/ui/ephemeral.js +1 -1
  134. package/dist/ui/features/index.d.ts +34 -0
  135. package/dist/ui/features/index.js +34 -0
  136. package/dist/ui/features/input-feature.d.ts +85 -0
  137. package/dist/ui/features/input-feature.js +238 -0
  138. package/dist/ui/features/list-feature.d.ts +155 -0
  139. package/dist/ui/features/list-feature.js +244 -0
  140. package/dist/ui/features/pagination-feature.d.ts +154 -0
  141. package/dist/ui/features/pagination-feature.js +238 -0
  142. package/dist/ui/features/search-feature.d.ts +148 -0
  143. package/dist/ui/features/search-feature.js +185 -0
  144. package/dist/ui/features/tab-feature.d.ts +194 -0
  145. package/dist/ui/features/tab-feature.js +307 -0
  146. package/dist/ui/footer-v2.d.ts +222 -0
  147. package/dist/ui/footer-v2.js +1349 -0
  148. package/dist/ui/footer.d.ts +107 -0
  149. package/dist/ui/footer.js +359 -67
  150. package/dist/ui/guardrail-overlay.d.ts +29 -0
  151. package/dist/ui/guardrail-overlay.js +145 -0
  152. package/dist/ui/help-overlay-v2.d.ts +34 -0
  153. package/dist/ui/help-overlay-v2.js +309 -0
  154. package/dist/ui/help-overlay.d.ts +16 -0
  155. package/dist/ui/help-overlay.js +316 -0
  156. package/dist/ui/index.d.ts +1 -1
  157. package/dist/ui/index.js +1 -3
  158. package/dist/ui/init-overlay-v2.d.ts +34 -0
  159. package/dist/ui/init-overlay-v2.js +600 -0
  160. package/dist/ui/init-overlay.d.ts +12 -2
  161. package/dist/ui/init-overlay.js +349 -270
  162. package/dist/ui/input-prompt-v2.d.ts +1 -0
  163. package/dist/ui/input-prompt-v2.js +14 -6
  164. package/dist/ui/input-prompt.d.ts +116 -33
  165. package/dist/ui/input-prompt.js +536 -337
  166. package/dist/ui/iteration-limit-overlay-v2.d.ts +21 -0
  167. package/dist/ui/iteration-limit-overlay-v2.js +114 -0
  168. package/dist/ui/iteration-limit-overlay.d.ts +2 -2
  169. package/dist/ui/iteration-limit-overlay.js +92 -128
  170. package/dist/ui/keys-overlay-v2.d.ts +41 -0
  171. package/dist/ui/keys-overlay-v2.js +248 -0
  172. package/dist/ui/keys-overlay.d.ts +1 -0
  173. package/dist/ui/keys-overlay.js +203 -141
  174. package/dist/ui/line-utils.d.ts +88 -0
  175. package/dist/ui/line-utils.js +150 -0
  176. package/dist/ui/live-region.d.ts +161 -0
  177. package/dist/ui/live-region.js +387 -0
  178. package/dist/ui/mascot/expressions.d.ts +32 -0
  179. package/dist/ui/mascot/expressions.js +213 -0
  180. package/dist/ui/mascot/index.d.ts +8 -0
  181. package/dist/ui/mascot/index.js +8 -0
  182. package/dist/ui/mascot/renderer.d.ts +19 -0
  183. package/dist/ui/mascot/renderer.js +97 -0
  184. package/dist/ui/mascot-overlay-v2.d.ts +41 -0
  185. package/dist/ui/mascot-overlay-v2.js +138 -0
  186. package/dist/ui/mascot-overlay.d.ts +21 -0
  187. package/dist/ui/mascot-overlay.js +146 -0
  188. package/dist/ui/model-overlay-v2.d.ts +49 -0
  189. package/dist/ui/model-overlay-v2.js +118 -0
  190. package/dist/ui/model-overlay.d.ts +27 -0
  191. package/dist/ui/model-overlay.js +221 -0
  192. package/dist/ui/model-warning-overlay.js +3 -5
  193. package/dist/ui/new-overlay.d.ts +34 -0
  194. package/dist/ui/new-overlay.js +604 -0
  195. package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
  196. package/dist/ui/overlay/impl/agents-overlay-v2.js +825 -0
  197. package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
  198. package/dist/ui/overlay/impl/anchors-overlay-v2.js +783 -0
  199. package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
  200. package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
  201. package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
  202. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +584 -0
  203. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
  204. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
  205. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +49 -0
  206. package/dist/ui/overlay/impl/backlog-overlay-v2.js +642 -0
  207. package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
  208. package/dist/ui/overlay/impl/commands-overlay-v2.js +441 -0
  209. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +100 -0
  210. package/dist/ui/overlay/impl/config-overlay-v2.js +654 -0
  211. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +55 -0
  212. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +359 -0
  213. package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
  214. package/dist/ui/overlay/impl/docs-overlay-v2.js +114 -0
  215. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +77 -0
  216. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1071 -0
  217. package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
  218. package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
  219. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +34 -0
  220. package/dist/ui/overlay/impl/help-overlay-v2.js +309 -0
  221. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +77 -0
  222. package/dist/ui/overlay/impl/init-overlay-v2.js +593 -0
  223. package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
  224. package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
  225. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
  226. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
  227. package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
  228. package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
  229. package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
  230. package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
  231. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +49 -0
  232. package/dist/ui/overlay/impl/model-overlay-v2.js +118 -0
  233. package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
  234. package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
  235. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +77 -0
  236. package/dist/ui/overlay/impl/new-overlay-v2.js +593 -0
  237. package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
  238. package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
  239. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +36 -0
  240. package/dist/ui/overlay/impl/projects-overlay-v2.js +499 -0
  241. package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
  242. package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
  243. package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
  244. package/dist/ui/overlay/impl/tools-overlay-v2.js +218 -0
  245. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +31 -0
  246. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +1035 -0
  247. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
  248. package/dist/ui/overlay/impl/workflow-overlay-v2.js +637 -0
  249. package/dist/ui/overlay/index.d.ts +33 -0
  250. package/dist/ui/overlay/index.js +35 -0
  251. package/dist/ui/overlay/key-utils.d.ts +6 -0
  252. package/dist/ui/overlay/key-utils.js +6 -0
  253. package/dist/ui/overlay/overlay-types.d.ts +128 -0
  254. package/dist/ui/overlay/overlay-types.js +22 -0
  255. package/dist/ui/overlay/types.d.ts +135 -0
  256. package/dist/ui/overlay/types.js +22 -0
  257. package/dist/ui/overlays/help-overlay-v2.d.ts +28 -0
  258. package/dist/ui/overlays/help-overlay-v2.js +198 -0
  259. package/dist/ui/overlays/index.d.ts +11 -0
  260. package/dist/ui/overlays/index.js +11 -0
  261. package/dist/ui/overlays.d.ts +0 -4
  262. package/dist/ui/overlays.js +0 -444
  263. package/dist/ui/permission-overlay-v2.d.ts +36 -0
  264. package/dist/ui/permission-overlay-v2.js +380 -0
  265. package/dist/ui/permission-overlay.d.ts +1 -1
  266. package/dist/ui/permission-overlay.js +186 -298
  267. package/dist/ui/projects-overlay.d.ts +19 -0
  268. package/dist/ui/projects-overlay.js +484 -0
  269. package/dist/ui/providers/types.d.ts +178 -0
  270. package/dist/ui/providers/types.js +9 -0
  271. package/dist/ui/render-modes.d.ts +36 -0
  272. package/dist/ui/render-modes.js +44 -0
  273. package/dist/ui/startup-menu.d.ts +36 -0
  274. package/dist/ui/startup-menu.js +236 -0
  275. package/dist/ui/subagent-renderer.d.ts +117 -0
  276. package/dist/ui/subagent-renderer.js +334 -0
  277. package/dist/ui/terminal-codes.d.ts +94 -0
  278. package/dist/ui/terminal-codes.js +124 -0
  279. package/dist/ui/terminal-renderer.d.ts +221 -0
  280. package/dist/ui/terminal-renderer.js +751 -0
  281. package/dist/ui/terminal-ui.d.ts +463 -0
  282. package/dist/ui/terminal-ui.js +2296 -0
  283. package/dist/ui/terminal.d.ts +20 -0
  284. package/dist/ui/terminal.js +72 -0
  285. package/dist/ui/theme-overlay-v2.d.ts +42 -0
  286. package/dist/ui/theme-overlay-v2.js +135 -0
  287. package/dist/ui/theme-overlay.d.ts +24 -0
  288. package/dist/ui/theme-overlay.js +127 -0
  289. package/dist/ui/todo-zone.js +53 -25
  290. package/dist/ui/tool-formatters.d.ts +16 -0
  291. package/dist/ui/tool-formatters.js +516 -0
  292. package/dist/ui/tools-overlay-v2.d.ts +47 -0
  293. package/dist/ui/tools-overlay-v2.js +218 -0
  294. package/dist/ui/tools-overlay.d.ts +10 -2
  295. package/dist/ui/tools-overlay.js +172 -220
  296. package/dist/ui/tutorial-overlay-v2.d.ts +31 -0
  297. package/dist/ui/tutorial-overlay-v2.js +1035 -0
  298. package/dist/ui/tutorial-overlay.d.ts +1 -0
  299. package/dist/ui/tutorial-overlay.js +400 -302
  300. package/dist/ui/workflow-overlay.d.ts +22 -0
  301. package/dist/ui/workflow-overlay.js +636 -0
  302. package/dist/utils/debug-log.d.ts +28 -0
  303. package/dist/utils/debug-log.js +57 -0
  304. package/dist/utils/model-tiers.js +1 -1
  305. package/dist/utils/path-safety.d.ts +56 -0
  306. package/dist/utils/path-safety.js +239 -0
  307. package/dist/workflow/guided-mode-injector.d.ts +42 -0
  308. package/dist/workflow/guided-mode-injector.js +191 -0
  309. package/dist/workflow/index.d.ts +8 -0
  310. package/dist/workflow/index.js +8 -0
  311. package/dist/workflow/step-criteria.d.ts +62 -0
  312. package/dist/workflow/step-criteria.js +150 -0
  313. package/dist/workflow/step-tracker.d.ts +92 -0
  314. package/dist/workflow/step-tracker.js +141 -0
  315. package/package.json +12 -5
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Ask User Simple Overlay V2
3
+ *
4
+ * Simplified modal overlay for single-question input.
5
+ * Uses BaseOverlayV2 for TerminalUI integration.
6
+ *
7
+ * Features:
8
+ * - Single question (no tabs, no navigation)
9
+ * - Options to select from with arrow keys
10
+ * - Custom text input option
11
+ * - Simple, clean UI
12
+ */
13
+ import chalk from 'chalk';
14
+ import { BaseOverlayV2, renderBorder } from '../../base/index.js';
15
+ // =============================================================================
16
+ // Overlay Implementation
17
+ // =============================================================================
18
+ export class AskUserSimpleOverlayV2 extends BaseOverlayV2 {
19
+ type = 'inline';
20
+ id = 'ask-user-simple-overlay-v2';
21
+ question;
22
+ choices;
23
+ allowCustom;
24
+ constructor(options) {
25
+ // Determine initial state
26
+ const choices = options.options ?? [];
27
+ const allowCustom = options.allowCustom ?? true;
28
+ const autoTyping = choices.length === 0 && allowCustom;
29
+ super({
30
+ selectedIndex: 0,
31
+ inputBuffer: '',
32
+ isTypingCustom: autoTyping,
33
+ });
34
+ this.question = options.question;
35
+ this.choices = choices;
36
+ this.allowCustom = allowCustom;
37
+ this.minHeight = 10; // Prevent jitter
38
+ }
39
+ renderContent(context) {
40
+ const s = context.styles;
41
+ const lines = [];
42
+ const border = renderBorder(context.width, s);
43
+ // Header
44
+ lines.push(border);
45
+ lines.push(' ' + s.primaryBold('Question'));
46
+ lines.push('');
47
+ // Question
48
+ lines.push(chalk.bold(` ${this.question}`));
49
+ lines.push('');
50
+ // Options
51
+ const customIndex = this.choices.length;
52
+ for (let i = 0; i < this.choices.length; i++) {
53
+ const isCursor = this.state.selectedIndex === i && !this.state.isTypingCustom;
54
+ const prefix = isCursor ? ' > ' : ' ';
55
+ const num = `${String(i + 1)}. `;
56
+ if (isCursor) {
57
+ lines.push(s.primary(prefix + num + this.choices[i]));
58
+ }
59
+ else {
60
+ lines.push(s.muted(prefix + num + this.choices[i]));
61
+ }
62
+ }
63
+ // Custom input option (if allowed)
64
+ if (this.allowCustom) {
65
+ const isCursor = this.state.selectedIndex === customIndex && !this.state.isTypingCustom;
66
+ const prefix = isCursor ? ' > ' : ' ';
67
+ const num = `${String(this.choices.length + 1)}. `;
68
+ if (this.state.isTypingCustom) {
69
+ // Show input field with cursor
70
+ lines.push(s.primary(prefix + num + 'Custom: ') + s.primaryBold(this.state.inputBuffer + '_'));
71
+ }
72
+ else if (isCursor) {
73
+ lines.push(s.primary(prefix + num + 'Type something else...'));
74
+ }
75
+ else {
76
+ lines.push(s.muted(prefix + num + 'Type something else...'));
77
+ }
78
+ }
79
+ // Footer
80
+ lines.push('');
81
+ if (this.state.isTypingCustom) {
82
+ lines.push(s.muted(' Enter Submit | Esc Cancel'));
83
+ }
84
+ else {
85
+ lines.push(s.muted(' Up/Down Navigate | Enter Select | s Skip | Esc Cancel'));
86
+ }
87
+ // Bottom border
88
+ lines.push(border);
89
+ return lines;
90
+ }
91
+ handleKey(key) {
92
+ const customIndex = this.choices.length;
93
+ const optionCount = this.allowCustom ? this.choices.length + 1 : this.choices.length;
94
+ // Ctrl+C always cancels
95
+ if (key.ctrl && key.name === 'c') {
96
+ return this.close({ answer: '', skipped: true });
97
+ }
98
+ // If typing custom input
99
+ if (this.state.isTypingCustom) {
100
+ if (key.name === 'escape') {
101
+ // Cancel custom input, return to navigation
102
+ this.state.isTypingCustom = false;
103
+ this.state.inputBuffer = '';
104
+ return this.rerender();
105
+ }
106
+ if (key.name === 'up' && this.choices.length > 0) {
107
+ // Exit typing mode and navigate up (only if there are other options)
108
+ this.state.isTypingCustom = false;
109
+ this.state.inputBuffer = '';
110
+ this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
111
+ return this.rerender();
112
+ }
113
+ if (key.name === 'down') {
114
+ // Custom is last option, down arrow does nothing
115
+ return this.noAction();
116
+ }
117
+ if (key.name === 'return') {
118
+ // Submit custom input
119
+ const custom = this.state.inputBuffer.trim();
120
+ if (custom) {
121
+ return this.close({ answer: custom, skipped: false });
122
+ }
123
+ // Empty - stay in custom mode
124
+ return this.noAction();
125
+ }
126
+ if (key.name === 'backspace') {
127
+ this.state.inputBuffer = this.state.inputBuffer.slice(0, -1);
128
+ return this.rerender();
129
+ }
130
+ // Printable character
131
+ if (key.char && key.char.length === 1 && !key.ctrl && !key.meta) {
132
+ this.state.inputBuffer += key.char;
133
+ return this.rerender();
134
+ }
135
+ return this.noAction();
136
+ }
137
+ // Navigation mode
138
+ if (key.name === 'escape') {
139
+ return this.close({ answer: '', skipped: true });
140
+ }
141
+ // Skip question (s key)
142
+ if (key.char === 's' || key.char === 'S') {
143
+ return this.close({ answer: '', skipped: true });
144
+ }
145
+ if (key.name === 'up') {
146
+ this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
147
+ // Auto-enable typing when navigating to custom option
148
+ if (this.allowCustom && this.state.selectedIndex === customIndex) {
149
+ this.state.isTypingCustom = true;
150
+ }
151
+ return this.rerender();
152
+ }
153
+ if (key.name === 'down') {
154
+ this.state.selectedIndex = Math.min(optionCount - 1, this.state.selectedIndex + 1);
155
+ // Auto-enable typing when navigating to custom option
156
+ if (this.allowCustom && this.state.selectedIndex === customIndex) {
157
+ this.state.isTypingCustom = true;
158
+ }
159
+ return this.rerender();
160
+ }
161
+ if (key.name === 'return') {
162
+ if (this.state.selectedIndex < this.choices.length) {
163
+ // Selected a predefined option
164
+ return this.close({ answer: this.choices[this.state.selectedIndex], skipped: false });
165
+ }
166
+ else if (this.allowCustom && this.state.selectedIndex === customIndex) {
167
+ // Enter custom input mode
168
+ this.state.isTypingCustom = true;
169
+ return this.rerender();
170
+ }
171
+ }
172
+ // Number keys 1-9
173
+ if (key.char && key.char >= '1' && key.char <= '9') {
174
+ const numIndex = parseInt(key.char, 10) - 1; // 0-indexed
175
+ if (numIndex < optionCount) {
176
+ if (numIndex < this.choices.length) {
177
+ // Select predefined option directly
178
+ return this.close({ answer: this.choices[numIndex], skipped: false });
179
+ }
180
+ else if (this.allowCustom && numIndex === customIndex) {
181
+ // Enter custom mode
182
+ this.state.selectedIndex = customIndex;
183
+ this.state.isTypingCustom = true;
184
+ return this.rerender();
185
+ }
186
+ }
187
+ }
188
+ return this.noAction();
189
+ }
190
+ /**
191
+ * Summary shown after overlay closes.
192
+ */
193
+ getCloseSummary(result) {
194
+ const s = this.getStyles();
195
+ if (result.skipped) {
196
+ return s.muted('Question: ') + s.warning('Skipped');
197
+ }
198
+ // Truncate long answers
199
+ const displayAnswer = result.answer.length > 50
200
+ ? result.answer.substring(0, 47) + '...'
201
+ : result.answer;
202
+ return s.muted('Question: ') + s.success(displayAnswer);
203
+ }
204
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Backlog Overlay V2
3
+ *
4
+ * Modal overlay for viewing and managing the project backlog.
5
+ * Uses TabbedListOverlayV2 for consistent list/tab/search behavior.
6
+ *
7
+ * Features:
8
+ * - Search by title/description
9
+ * - Filter tabs by type (All/Feature/Bug/Tech-Debt/Chore)
10
+ * - Pagination for large backlogs
11
+ * - Quick status toggle with Space
12
+ * - Add new items with wizard
13
+ * - Database-backed with project isolation
14
+ */
15
+ import { TabbedListOverlayV2, BaseScreen } from '../../base/index.js';
16
+ import type { OverlayAction, KeyEvent } from '../types.js';
17
+ import type { WorkItemType, WorkItemPriority } from '../../../db/schema.js';
18
+ export type BacklogType = WorkItemType;
19
+ export type BacklogPriority = WorkItemPriority;
20
+ export type BacklogStatus = '📋' | '🚧' | '✅';
21
+ export interface BacklogItem {
22
+ id: string;
23
+ dbId: number;
24
+ type: BacklogType;
25
+ status: BacklogStatus;
26
+ priority: BacklogPriority;
27
+ title: string;
28
+ description: string;
29
+ commit?: string;
30
+ }
31
+ export interface BacklogOverlayV2Result {
32
+ modified: boolean;
33
+ }
34
+ export declare class BacklogOverlayV2 extends TabbedListOverlayV2<BacklogItem, BacklogOverlayV2Result> {
35
+ readonly type: "inline";
36
+ readonly id = "backlog-overlay-v2";
37
+ private readonly editState;
38
+ /**
39
+ * @param projectId - Optional project ID to view backlog for.
40
+ * If not provided, uses the active project.
41
+ * Pass this when opening from workflow overlay for a specific project.
42
+ */
43
+ constructor(projectId?: number);
44
+ protected createDetailScreen(item: BacklogItem): BaseScreen | null;
45
+ /**
46
+ * Override handleKey to add custom behavior (Space toggle, 'a' add).
47
+ */
48
+ handleKey(key: KeyEvent): OverlayAction<BacklogOverlayV2Result>;
49
+ }