@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,36 @@
1
+ /**
2
+ * Render Modes
3
+ *
4
+ * The terminal operates in one of three mutually exclusive modes.
5
+ * Each mode has different rendering behavior and keyboard handling.
6
+ */
7
+ /**
8
+ * Terminal render modes
9
+ *
10
+ * MENU: Full-screen startup menu (no scroll regions)
11
+ * REPL: Scroll zone + footer (normal chat mode)
12
+ * OVERLAY: Full-screen overlay (config, backlog, permissions)
13
+ */
14
+ export declare enum RenderMode {
15
+ MENU = "MENU",
16
+ REPL = "REPL",
17
+ OVERLAY = "OVERLAY"
18
+ }
19
+ /**
20
+ * Mode transition events for debugging/logging
21
+ */
22
+ export interface ModeTransition {
23
+ from: RenderMode;
24
+ to: RenderMode;
25
+ reason: string;
26
+ timestamp: number;
27
+ }
28
+ /**
29
+ * Valid mode transitions
30
+ *
31
+ * MENU -> REPL: User selects option (init, chat, continue, etc.)
32
+ * REPL -> OVERLAY: User triggers overlay (/config, /backlog, permission)
33
+ * OVERLAY -> REPL: User closes overlay (Esc, Enter, etc.)
34
+ * REPL -> MENU: User runs /menu command
35
+ */
36
+ export declare function isValidTransition(from: RenderMode, to: RenderMode): boolean;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Render Modes
3
+ *
4
+ * The terminal operates in one of three mutually exclusive modes.
5
+ * Each mode has different rendering behavior and keyboard handling.
6
+ */
7
+ /**
8
+ * Terminal render modes
9
+ *
10
+ * MENU: Full-screen startup menu (no scroll regions)
11
+ * REPL: Scroll zone + footer (normal chat mode)
12
+ * OVERLAY: Full-screen overlay (config, backlog, permissions)
13
+ */
14
+ export var RenderMode;
15
+ (function (RenderMode) {
16
+ RenderMode["MENU"] = "MENU";
17
+ RenderMode["REPL"] = "REPL";
18
+ RenderMode["OVERLAY"] = "OVERLAY";
19
+ })(RenderMode || (RenderMode = {}));
20
+ /**
21
+ * Valid mode transitions
22
+ *
23
+ * MENU -> REPL: User selects option (init, chat, continue, etc.)
24
+ * REPL -> OVERLAY: User triggers overlay (/config, /backlog, permission)
25
+ * OVERLAY -> REPL: User closes overlay (Esc, Enter, etc.)
26
+ * REPL -> MENU: User runs /menu command
27
+ */
28
+ export function isValidTransition(from, to) {
29
+ if (from === to)
30
+ return false;
31
+ switch (from) {
32
+ case RenderMode.MENU:
33
+ // Menu can go to REPL (user selects option) or OVERLAY (e.g., config from menu)
34
+ return to === RenderMode.REPL || to === RenderMode.OVERLAY;
35
+ case RenderMode.REPL:
36
+ // REPL can go to OVERLAY (modal opened) or MENU (/menu command)
37
+ return to === RenderMode.OVERLAY || to === RenderMode.MENU;
38
+ case RenderMode.OVERLAY:
39
+ // Overlay can go back to REPL (closed) or MENU (rare, but valid)
40
+ return to === RenderMode.REPL || to === RenderMode.MENU;
41
+ default:
42
+ return false;
43
+ }
44
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Startup Menu Overlay
3
+ *
4
+ * Provides a guided entry point for users with options to:
5
+ * - Start a new project (/new)
6
+ * - View & manage projects (/projects)
7
+ * - Continue last project
8
+ * - Free-form chat
9
+ * - Configure settings
10
+ * - Show help
11
+ * - Exit
12
+ *
13
+ * Inspired by ATLAS CLI interactiveMenu()
14
+ */
15
+ export type MenuOption = 'init' | 'projects' | 'continue' | 'chat' | 'config' | 'help' | 'exit';
16
+ export interface StartupMenuResult {
17
+ action: MenuOption;
18
+ project?: {
19
+ id: number;
20
+ name: string;
21
+ displayName: string;
22
+ path: string;
23
+ };
24
+ }
25
+ /**
26
+ * Show the startup menu and return the user's choice
27
+ */
28
+ export declare function showStartupMenu(version: string): Promise<StartupMenuResult>;
29
+ /**
30
+ * Find the last active project for the "continue" option
31
+ */
32
+ export declare function findLastActiveProject(): {
33
+ id: number;
34
+ name: string;
35
+ path: string;
36
+ } | null;
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Startup Menu Overlay
3
+ *
4
+ * Provides a guided entry point for users with options to:
5
+ * - Start a new project (/new)
6
+ * - View & manage projects (/projects)
7
+ * - Continue last project
8
+ * - Free-form chat
9
+ * - Configure settings
10
+ * - Show help
11
+ * - Exit
12
+ *
13
+ * Inspired by ATLAS CLI interactiveMenu()
14
+ */
15
+ import { getStyles } from '../themes/index.js';
16
+ import * as terminal from './terminal.js';
17
+ import { projectRepository } from '../db/repositories/index.js';
18
+ import { setActiveProject } from '../tools/project-db.js';
19
+ import { printLogo } from './conversation.js';
20
+ // =============================================================================
21
+ // Menu Options
22
+ // =============================================================================
23
+ function getMenuOptions(hasLastProject, lastProjectName) {
24
+ return [
25
+ {
26
+ key: 'init',
27
+ label: 'init',
28
+ description: 'Start a new project',
29
+ },
30
+ {
31
+ key: 'projects',
32
+ label: 'projects',
33
+ description: 'View & manage projects',
34
+ },
35
+ {
36
+ key: 'continue',
37
+ label: 'continue',
38
+ description: hasLastProject
39
+ ? `Resume: ${lastProjectName ?? 'project'}`
40
+ : 'No recent project',
41
+ disabled: !hasLastProject,
42
+ },
43
+ {
44
+ key: 'chat',
45
+ label: 'chat',
46
+ description: 'Free-form AI chat',
47
+ },
48
+ {
49
+ key: 'config',
50
+ label: 'config',
51
+ description: 'Configure settings',
52
+ },
53
+ {
54
+ key: 'help',
55
+ label: 'help',
56
+ description: 'Show help and shortcuts',
57
+ },
58
+ {
59
+ key: 'exit',
60
+ label: 'exit',
61
+ description: 'Exit CLI',
62
+ },
63
+ ];
64
+ }
65
+ // =============================================================================
66
+ // Rendering
67
+ // =============================================================================
68
+ function renderMenu(state) {
69
+ const s = getStyles();
70
+ const lines = [];
71
+ lines.push('');
72
+ lines.push(' What would you like to do?');
73
+ lines.push('');
74
+ // Menu options - left-aligned like /config overlay
75
+ const labelWidth = 14;
76
+ for (let i = 0; i < state.options.length; i++) {
77
+ const opt = state.options[i];
78
+ const isSelected = i === state.selectedIndex;
79
+ const prefix = isSelected ? s.primary(' ❯ ') : ' ';
80
+ const rawLabel = opt.label.padEnd(labelWidth);
81
+ const rawDesc = opt.description;
82
+ let label;
83
+ let description;
84
+ if (opt.disabled) {
85
+ label = s.muted(rawLabel);
86
+ description = s.muted(rawDesc);
87
+ }
88
+ else if (isSelected) {
89
+ label = s.primary(rawLabel);
90
+ description = s.foreground(rawDesc);
91
+ }
92
+ else {
93
+ label = s.foreground(rawLabel);
94
+ description = s.muted(rawDesc);
95
+ }
96
+ lines.push(prefix + label + description);
97
+ }
98
+ lines.push('');
99
+ lines.push(s.muted(' ↑/↓: navigate Enter: select'));
100
+ return lines;
101
+ }
102
+ // =============================================================================
103
+ // Main Function
104
+ // =============================================================================
105
+ /**
106
+ * Show the startup menu and return the user's choice
107
+ */
108
+ export async function showStartupMenu(version) {
109
+ return new Promise((resolve) => {
110
+ // Check for last active project
111
+ let lastProject = null;
112
+ try {
113
+ const result = projectRepository.list({ status: 'active', limit: 1 });
114
+ if (result.projects.length > 0) {
115
+ const p = result.projects[0];
116
+ lastProject = { id: p.id, name: p.name, displayName: p.displayName, path: p.path };
117
+ }
118
+ }
119
+ catch {
120
+ // DB might not exist yet
121
+ }
122
+ const hasLastProject = lastProject !== null;
123
+ const lastProjectName = lastProject?.displayName;
124
+ const state = {
125
+ selectedIndex: 0,
126
+ options: getMenuOptions(hasLastProject, lastProjectName),
127
+ hasLastProject,
128
+ lastProjectName,
129
+ };
130
+ // Enable raw mode for key detection (no readline - it causes echo)
131
+ const wasRawMode = process.stdin.isRaw;
132
+ terminal.enableRawMode();
133
+ terminal.hideCursor();
134
+ let prevLineCount = 0;
135
+ const render = (isInitial = false) => {
136
+ if (isInitial) {
137
+ // First render: print logo and save cursor position
138
+ printLogo(version, lastProject?.displayName ?? null);
139
+ terminal.saveCursor();
140
+ }
141
+ else {
142
+ // Subsequent renders: restore cursor and clear to end of screen
143
+ terminal.restoreCursor();
144
+ terminal.clearToEndOfScreen();
145
+ }
146
+ // Render the menu
147
+ const lines = renderMenu(state);
148
+ const termWidth = terminal.getTerminalWidth();
149
+ const physicalLines = terminal.totalPhysicalLines(lines, termWidth);
150
+ // Pad to previous height to prevent shrinking
151
+ for (let i = physicalLines; i < prevLineCount; i++) {
152
+ lines.push('');
153
+ }
154
+ process.stdout.write(lines.join('\n') + '\n');
155
+ prevLineCount = Math.max(prevLineCount, physicalLines);
156
+ };
157
+ // Define handleKey first, then cleanup references it
158
+ const handleKey = (key) => {
159
+ const keyStr = key.toString();
160
+ // Arrow keys
161
+ if (keyStr === '\x1b[A' || keyStr === 'k') {
162
+ // Up
163
+ do {
164
+ state.selectedIndex = (state.selectedIndex - 1 + state.options.length) % state.options.length;
165
+ } while (state.options[state.selectedIndex].disabled);
166
+ render(false);
167
+ }
168
+ else if (keyStr === '\x1b[B' || keyStr === 'j') {
169
+ // Down
170
+ do {
171
+ state.selectedIndex = (state.selectedIndex + 1) % state.options.length;
172
+ } while (state.options[state.selectedIndex].disabled);
173
+ render(false);
174
+ }
175
+ else if (keyStr === '\r' || keyStr === '\n') {
176
+ // Enter
177
+ const selected = state.options[state.selectedIndex];
178
+ if (!selected.disabled) {
179
+ // Cleanup: Remove listener BEFORE changing raw mode to prevent issues
180
+ process.stdin.removeListener('data', handleKey);
181
+ if (!wasRawMode) {
182
+ terminal.disableRawMode();
183
+ }
184
+ terminal.showCursor();
185
+ // Handle continue option - set active project
186
+ if (selected.key === 'continue' && lastProject) {
187
+ setActiveProject({
188
+ id: lastProject.id,
189
+ name: lastProject.name,
190
+ displayName: lastProject.displayName,
191
+ path: lastProject.path,
192
+ });
193
+ resolve({
194
+ action: 'continue',
195
+ project: {
196
+ id: lastProject.id,
197
+ name: lastProject.name,
198
+ displayName: lastProject.displayName,
199
+ path: lastProject.path,
200
+ },
201
+ });
202
+ }
203
+ else {
204
+ resolve({ action: selected.key });
205
+ }
206
+ }
207
+ }
208
+ else if (keyStr === '\x03') {
209
+ // Ctrl+C - cleanup and exit
210
+ process.stdin.removeListener('data', handleKey);
211
+ terminal.disableRawMode();
212
+ terminal.showCursor();
213
+ process.exit(0);
214
+ }
215
+ };
216
+ process.stdin.on('data', handleKey);
217
+ // Initial render
218
+ render(true);
219
+ });
220
+ }
221
+ /**
222
+ * Find the last active project for the "continue" option
223
+ */
224
+ export function findLastActiveProject() {
225
+ try {
226
+ const result = projectRepository.list({ status: 'active', limit: 1 });
227
+ if (result.projects.length > 0) {
228
+ const p = result.projects[0];
229
+ return { id: p.id, name: p.name, path: p.path };
230
+ }
231
+ }
232
+ catch {
233
+ // DB might not exist
234
+ }
235
+ return null;
236
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Subagent Renderer
3
+ *
4
+ * Renders subagent status in Claude Code style:
5
+ * - Single agent: bullet with status and last action
6
+ * - Multiple agents: tree structure with all agents listed
7
+ * - Live updates as tools execute
8
+ *
9
+ * Visual style:
10
+ * ● Explore(Find CLI entry points)
11
+ * ⎿ Read 67 lines
12
+ * Found 100 files
13
+ * +3 more tool uses (ctrl+o to expand)
14
+ *
15
+ * ● Running 3 Explore agents... (ctrl+o to expand)
16
+ * ├─ Find state management · 3 tool uses · 20.7k tokens
17
+ * │ ⎿ Bash: List TypeScript files
18
+ * └─ Find utility functions · 5 tool uses · 18.9k tokens
19
+ * ⎿ Read: src/utils/project-memory.ts
20
+ */
21
+ export interface SubagentState {
22
+ id: string;
23
+ type: string;
24
+ description: string;
25
+ status: 'running' | 'done' | 'error';
26
+ toolCount: number;
27
+ tokenCount: number;
28
+ lastAction: string;
29
+ lastActionDetails: string[];
30
+ startTime: number;
31
+ endTime?: number;
32
+ error?: string;
33
+ }
34
+ export interface SubagentRendererOptions {
35
+ /** Max detail lines to show per agent in compact mode (default: 1) */
36
+ maxDetailLines?: number;
37
+ /** Show token counts (default: true) */
38
+ showTokens?: boolean;
39
+ }
40
+ export declare class SubagentRenderer {
41
+ private readonly agents;
42
+ private isExpanded;
43
+ private readonly maxDetailLines;
44
+ private readonly showTokens;
45
+ private onUpdate;
46
+ constructor(options?: SubagentRendererOptions);
47
+ /**
48
+ * Called when a subagent starts
49
+ */
50
+ onSubagentStart(id: string, type: string, description: string): void;
51
+ /**
52
+ * Called when a subagent uses a tool
53
+ */
54
+ onToolUse(agentId: string, toolName: string, summary?: string): void;
55
+ /**
56
+ * Called when a subagent completes
57
+ */
58
+ onSubagentEnd(id: string, success: boolean, tokenCount: number, error?: string): void;
59
+ /**
60
+ * Toggle expanded/collapsed view (Ctrl+O)
61
+ */
62
+ toggleExpand(): void;
63
+ /**
64
+ * Check if there are any active subagents
65
+ */
66
+ hasActiveSubagents(): boolean;
67
+ /**
68
+ * Check if there are any subagents to display
69
+ */
70
+ hasSubagents(): boolean;
71
+ /**
72
+ * Get count of agents by status
73
+ */
74
+ getCounts(): {
75
+ running: number;
76
+ done: number;
77
+ error: number;
78
+ total: number;
79
+ };
80
+ /**
81
+ * Get the last agent's stats (for persisting to scrolling zone)
82
+ * Returns null if no agents tracked
83
+ */
84
+ getLastAgentStats(): {
85
+ type: string;
86
+ description: string;
87
+ toolCount: number;
88
+ tokenCount: number;
89
+ durationMs: number;
90
+ } | null;
91
+ /**
92
+ * Clear all agents (after rendering final output to scrolling zone)
93
+ */
94
+ clear(): void;
95
+ /**
96
+ * Set callback for state updates
97
+ */
98
+ setUpdateCallback(callback: (() => void) | null): void;
99
+ /**
100
+ * Render the subagent zone - returns array of lines
101
+ * Only renders running agents - completed agents are shown via printSubagentResponse
102
+ */
103
+ render(): string[];
104
+ private triggerUpdate;
105
+ /**
106
+ * Render single agent display
107
+ */
108
+ private renderSingleAgent;
109
+ /**
110
+ * Render multiple agents in tree display
111
+ */
112
+ private renderMultipleAgents;
113
+ /**
114
+ * Get common type label if all agents are same type, otherwise "mixed"
115
+ */
116
+ private getCommonTypeLabel;
117
+ }