@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
@@ -65,6 +65,17 @@ export declare function clearLinesAbove(count: number): void;
65
65
  * Clear entire screen
66
66
  */
67
67
  export declare function clearScreen(): void;
68
+ /**
69
+ * Enter alternate screen buffer.
70
+ * Content shown here doesn't go to main scrollback.
71
+ * Used for modal UIs like menus, editors.
72
+ */
73
+ export declare function enterAlternateScreen(): void;
74
+ /**
75
+ * Leave alternate screen buffer.
76
+ * Returns to main screen (previous content restored).
77
+ */
78
+ export declare function leaveAlternateScreen(): void;
68
79
  /**
69
80
  * Calculate how many physical (visual) lines a string occupies
70
81
  * given terminal width and starting column.
@@ -94,6 +105,15 @@ export declare function calculateCursorPosition(text: string, cursorPos: number,
94
105
  * @returns String of repeated characters
95
106
  */
96
107
  export declare function horizontalLine(char?: string): string;
108
+ /**
109
+ * Calculate total physical lines for an array of strings (joined with newlines).
110
+ * Each array entry is a logical line; this returns total physical lines.
111
+ *
112
+ * @param lines - Array of lines (may contain ANSI escape codes)
113
+ * @param termWidth - Terminal width in columns
114
+ * @returns Total physical line count
115
+ */
116
+ export declare function totalPhysicalLines(lines: string[], termWidth: number): number;
97
117
  /**
98
118
  * Enable raw mode for stdin
99
119
  * In raw mode, input is available character by character
@@ -120,6 +120,26 @@ export function clearLinesAbove(count) {
120
120
  export function clearScreen() {
121
121
  process.stdout.write('\x1b[2J\x1b[H');
122
122
  }
123
+ /**
124
+ * Enter alternate screen buffer.
125
+ * Content shown here doesn't go to main scrollback.
126
+ * Used for modal UIs like menus, editors.
127
+ */
128
+ export function enterAlternateScreen() {
129
+ // Enter alternate screen and disable mouse tracking
130
+ // \x1b[?1049h - alternate screen
131
+ // \x1b[?1000l - disable mouse click tracking
132
+ // \x1b[?1002l - disable mouse drag tracking
133
+ // \x1b[?1003l - disable all mouse tracking
134
+ process.stdout.write('\x1b[?1049h\x1b[?1000l\x1b[?1002l\x1b[?1003l');
135
+ }
136
+ /**
137
+ * Leave alternate screen buffer.
138
+ * Returns to main screen (previous content restored).
139
+ */
140
+ export function leaveAlternateScreen() {
141
+ process.stdout.write('\x1b[?1049l');
142
+ }
123
143
  // =============================================================================
124
144
  // Line Calculations
125
145
  // =============================================================================
@@ -193,6 +213,58 @@ export function horizontalLine(char = '─') {
193
213
  return char.repeat(getTerminalWidth());
194
214
  }
195
215
  // =============================================================================
216
+ // ANSI-Aware Utilities (internal)
217
+ // =============================================================================
218
+ /**
219
+ * Strip ANSI escape codes from a string.
220
+ * Used to calculate visual width of styled text.
221
+ * (Not exported to avoid conflicts with other modules)
222
+ */
223
+ function stripAnsiCodes(str) {
224
+ // eslint-disable-next-line no-control-regex
225
+ return str.replace(/\x1b\[[0-9;]*m/g, '');
226
+ }
227
+ /**
228
+ * Get the visual width of a string (excluding ANSI escape codes).
229
+ */
230
+ function visualWidth(str) {
231
+ return stripAnsiCodes(str).length;
232
+ }
233
+ /**
234
+ * Calculate the number of physical terminal lines a string occupies.
235
+ * Accounts for ANSI escape codes (which don't take visual width) and line wrapping.
236
+ *
237
+ * @param text - Text to measure (may contain ANSI escape codes)
238
+ * @param termWidth - Terminal width in columns
239
+ * @returns Number of physical lines
240
+ */
241
+ function physicalLineCount(text, termWidth) {
242
+ if (text.length === 0)
243
+ return 1; // Empty line still takes 1 line
244
+ const visLen = visualWidth(text);
245
+ if (visLen === 0)
246
+ return 1;
247
+ // Number of lines = ceil(visLen / termWidth)
248
+ return Math.ceil(visLen / termWidth);
249
+ }
250
+ /**
251
+ * Calculate total physical lines for an array of strings (joined with newlines).
252
+ * Each array entry is a logical line; this returns total physical lines.
253
+ *
254
+ * @param lines - Array of lines (may contain ANSI escape codes)
255
+ * @param termWidth - Terminal width in columns
256
+ * @returns Total physical line count
257
+ */
258
+ export function totalPhysicalLines(lines, termWidth) {
259
+ if (lines.length === 0)
260
+ return 0;
261
+ let total = 0;
262
+ for (const line of lines) {
263
+ total += physicalLineCount(line, termWidth);
264
+ }
265
+ return total;
266
+ }
267
+ // =============================================================================
196
268
  // Raw Mode
197
269
  // =============================================================================
198
270
  /**
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Theme Overlay V2
3
+ *
4
+ * Theme selection overlay using TabbedListOverlayV2 for the new Overlay interface.
5
+ * Works with TerminalUI's overlay management.
6
+ *
7
+ * Features:
8
+ * - Tabs: Curated (top picks), All, Dark, Light
9
+ * - Search mode with / toggle
10
+ * - Live preview with syntax highlighting
11
+ * - Persists selection to settings
12
+ */
13
+ import { TabbedListOverlayV2 } from './base/index.js';
14
+ import type { KeyEvent, OverlayAction } from './overlay/index.js';
15
+ import { type Theme } from '../themes/index.js';
16
+ export interface ThemeOverlayOptions {
17
+ /** Current theme ID (for highlighting current selection) */
18
+ currentThemeId?: string;
19
+ }
20
+ export interface ThemeOverlayResult {
21
+ /** Selected theme ID (if changed) */
22
+ themeChanged?: string;
23
+ /** Selected theme name */
24
+ themeName?: string;
25
+ }
26
+ /**
27
+ * Theme overlay using the new Overlay interface.
28
+ * Displays available themes in a searchable, tabbed list with preview.
29
+ */
30
+ export declare class ThemeOverlayV2 extends TabbedListOverlayV2<Theme, ThemeOverlayResult> {
31
+ readonly type: "inline";
32
+ readonly id = "theme-overlay-v2";
33
+ private readonly currentThemeId;
34
+ private readonly curatedIds;
35
+ constructor(options?: ThemeOverlayOptions);
36
+ handleKey(key: KeyEvent): OverlayAction<ThemeOverlayResult>;
37
+ private selectTheme;
38
+ /**
39
+ * Optional summary shown after overlay closes.
40
+ */
41
+ getCloseSummary(result: ThemeOverlayResult): string | null;
42
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Theme Overlay V2
3
+ *
4
+ * Theme selection overlay using TabbedListOverlayV2 for the new Overlay interface.
5
+ * Works with TerminalUI's overlay management.
6
+ *
7
+ * Features:
8
+ * - Tabs: Curated (top picks), All, Dark, Light
9
+ * - Search mode with / toggle
10
+ * - Live preview with syntax highlighting
11
+ * - Persists selection to settings
12
+ */
13
+ import chalk from 'chalk';
14
+ import { TabbedListOverlayV2, } from './base/index.js';
15
+ import { getCuratedThemes, getCurrentTheme, setCurrentTheme, getAllThemes, getThemeCount, clearStyleCache, } from '../themes/index.js';
16
+ // =============================================================================
17
+ // Constants
18
+ // =============================================================================
19
+ const PAGE_SIZE = 10;
20
+ const TABS = [
21
+ { id: 'curated', label: 'Curated' },
22
+ { id: 'all', label: 'All' },
23
+ { id: 'dark', label: 'Dark' },
24
+ { id: 'light', label: 'Light' },
25
+ ];
26
+ // =============================================================================
27
+ // Helper Functions
28
+ // =============================================================================
29
+ function renderPreview(theme, styles) {
30
+ const lines = [];
31
+ const colors = theme.colors;
32
+ lines.push(styles.muted(' Preview:'));
33
+ // Use chalk for hex colors in preview
34
+ const primary = chalk.hex(colors.primary);
35
+ const secondary = chalk.hex(colors.secondary || colors.primary);
36
+ const muted = chalk.hex(colors.muted);
37
+ const fg = chalk.hex(colors.foreground);
38
+ lines.push(' ' + primary.bold('function') + ' ' + secondary('greet') + fg('() {'));
39
+ lines.push(' ' + muted('// Say hello'));
40
+ lines.push(' ' + fg('console.') + secondary('log') + fg('("Hello, ') + primary('World') + fg('!");'));
41
+ lines.push(' ' + fg('}'));
42
+ return lines;
43
+ }
44
+ // =============================================================================
45
+ // Theme Overlay V2 Class
46
+ // =============================================================================
47
+ /**
48
+ * Theme overlay using the new Overlay interface.
49
+ * Displays available themes in a searchable, tabbed list with preview.
50
+ */
51
+ export class ThemeOverlayV2 extends TabbedListOverlayV2 {
52
+ type = 'inline';
53
+ id = 'theme-overlay-v2';
54
+ currentThemeId;
55
+ curatedIds;
56
+ constructor(options = {}) {
57
+ const currentTheme = getCurrentTheme();
58
+ const currentThemeId = options.currentThemeId ?? currentTheme.id;
59
+ const curatedThemes = getCuratedThemes();
60
+ const curatedIds = new Set(curatedThemes.map(t => t.id));
61
+ const allThemes = getAllThemes();
62
+ const counts = getThemeCount();
63
+ super({
64
+ title: `Select Theme (${String(counts.total)})`,
65
+ tabs: TABS,
66
+ items: allThemes,
67
+ pageSize: PAGE_SIZE,
68
+ showCount: false, // We show count in title
69
+ filterByTab: (theme, tabId) => {
70
+ switch (tabId) {
71
+ case 'curated':
72
+ return curatedIds.has(theme.id);
73
+ case 'dark':
74
+ return theme.type === 'dark';
75
+ case 'light':
76
+ return theme.type === 'light';
77
+ default:
78
+ return true; // 'all'
79
+ }
80
+ },
81
+ getSearchText: (theme) => {
82
+ return `${theme.name} ${theme.id}`;
83
+ },
84
+ renderItem: (theme, isSelected, styles) => {
85
+ const isCurrent = theme.id === currentThemeId;
86
+ const prefix = isSelected ? styles.primary('> ') : ' ';
87
+ const icon = theme.type === 'dark' ? 'D' : 'L';
88
+ const checkmark = isCurrent ? styles.success(' *') : '';
89
+ // Pad the plain name first, then apply styling (ANSI codes break padEnd)
90
+ const paddedName = theme.name.padEnd(33);
91
+ const label = isSelected ? styles.primary(paddedName) : paddedName;
92
+ return ` ${prefix}${label}${icon}${checkmark}`;
93
+ },
94
+ renderSelectedPreview: (theme, styles) => {
95
+ return renderPreview(theme, styles);
96
+ },
97
+ footerHints: (searchMode) => {
98
+ if (searchMode) {
99
+ return 'Type to filter · ↑↓/jk Navigate · Enter Select · Esc Exit search';
100
+ }
101
+ return 'Tab Filter · ↑↓/jk · ←→/hl Pages · / Search · Enter Select · q/Esc Close';
102
+ },
103
+ emptyMessage: 'No themes available.',
104
+ noResultsMessage: 'No themes match the search.',
105
+ });
106
+ this.currentThemeId = currentThemeId;
107
+ this.curatedIds = curatedIds;
108
+ }
109
+ handleKey(key) {
110
+ // Handle Enter/Space to select theme
111
+ if ((key.name === 'return' || key.name === 'space') && this.state.filteredItems.length > 0) {
112
+ const theme = this.state.filteredItems[this.state.selectedIndex];
113
+ return this.selectTheme(theme);
114
+ }
115
+ // Let parent handle other keys
116
+ return super.handleKey(key);
117
+ }
118
+ selectTheme(theme) {
119
+ setCurrentTheme(theme.id);
120
+ clearStyleCache();
121
+ return this.close({
122
+ themeChanged: theme.id,
123
+ themeName: theme.name,
124
+ });
125
+ }
126
+ /**
127
+ * Optional summary shown after overlay closes.
128
+ */
129
+ getCloseSummary(result) {
130
+ if (result.themeName) {
131
+ return `Theme changed to: ${result.themeName}`;
132
+ }
133
+ return null;
134
+ }
135
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Theme Overlay
3
+ *
4
+ * Standalone theme selection overlay using TabbedListOverlay.
5
+ * Accessible via /theme command or from Config overlay.
6
+ *
7
+ * Features:
8
+ * - Tabs: Curated (top picks), All, Dark, Light
9
+ * - Search mode with / toggle
10
+ * - Live preview with syntax highlighting
11
+ * - Quick select with number keys (1-9,0) in Curated tab
12
+ * - Persists selection to settings
13
+ */
14
+ export interface ThemeOverlayOptions {
15
+ /** Current theme ID (for highlighting current selection) */
16
+ currentThemeId?: string;
17
+ }
18
+ export interface ThemeOverlayResult {
19
+ /** Selected theme ID (if changed) */
20
+ themeChanged?: string;
21
+ /** Selected theme name */
22
+ themeName?: string;
23
+ }
24
+ export declare function showThemeOverlay(options?: ThemeOverlayOptions): Promise<ThemeOverlayResult>;
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Theme Overlay
3
+ *
4
+ * Standalone theme selection overlay using TabbedListOverlay.
5
+ * Accessible via /theme command or from Config overlay.
6
+ *
7
+ * Features:
8
+ * - Tabs: Curated (top picks), All, Dark, Light
9
+ * - Search mode with / toggle
10
+ * - Live preview with syntax highlighting
11
+ * - Quick select with number keys (1-9,0) in Curated tab
12
+ * - Persists selection to settings
13
+ */
14
+ import chalk from 'chalk';
15
+ import { TabbedListOverlay, isEnter, isSpace, } from './base/index.js';
16
+ import { getCuratedThemes, getCurrentTheme, setCurrentTheme, getAllThemes, getThemeCount, clearStyleCache, } from '../themes/index.js';
17
+ // =============================================================================
18
+ // Constants
19
+ // =============================================================================
20
+ const PAGE_SIZE = 10;
21
+ const TABS = [
22
+ { id: 'curated', label: 'Curated' },
23
+ { id: 'all', label: 'All' },
24
+ { id: 'dark', label: 'Dark' },
25
+ { id: 'light', label: 'Light' },
26
+ ];
27
+ // =============================================================================
28
+ // Helper Functions
29
+ // =============================================================================
30
+ function renderPreview(theme, styles) {
31
+ const lines = [];
32
+ const colors = theme.colors;
33
+ lines.push(styles.muted(' Preview:'));
34
+ // Use chalk for hex colors in preview
35
+ const primary = chalk.hex(colors.primary);
36
+ const secondary = chalk.hex(colors.secondary || colors.primary);
37
+ const muted = chalk.hex(colors.muted);
38
+ const fg = chalk.hex(colors.foreground);
39
+ lines.push(' ' + primary.bold('function') + ' ' + secondary('greet') + fg('() {'));
40
+ lines.push(' ' + muted('// Say hello'));
41
+ lines.push(' ' + fg('console.') + secondary('log') + fg('("Hello, ') + primary('World') + fg('!");'));
42
+ lines.push(' ' + fg('}'));
43
+ return lines;
44
+ }
45
+ // =============================================================================
46
+ // Theme Overlay Class
47
+ // =============================================================================
48
+ class ThemeOverlay extends TabbedListOverlay {
49
+ currentThemeId;
50
+ curatedIds;
51
+ constructor(options = {}) {
52
+ const currentTheme = getCurrentTheme();
53
+ const currentThemeId = options.currentThemeId ?? currentTheme.id;
54
+ const curatedThemes = getCuratedThemes();
55
+ const curatedIds = new Set(curatedThemes.map(t => t.id));
56
+ const allThemes = getAllThemes();
57
+ const counts = getThemeCount();
58
+ const config = {
59
+ title: `Select Theme (${String(counts.total)})`,
60
+ tabs: TABS,
61
+ items: allThemes,
62
+ pageSize: PAGE_SIZE,
63
+ showCount: false, // We show count in title
64
+ filterByTab: (theme, tabId) => {
65
+ switch (tabId) {
66
+ case 'curated':
67
+ return curatedIds.has(theme.id);
68
+ case 'dark':
69
+ return theme.type === 'dark';
70
+ case 'light':
71
+ return theme.type === 'light';
72
+ default:
73
+ return true; // 'all'
74
+ }
75
+ },
76
+ getSearchText: (theme) => {
77
+ return `${theme.name} ${theme.id}`;
78
+ },
79
+ renderItem: (theme, isSelected, styles) => {
80
+ const isCurrent = theme.id === currentThemeId;
81
+ const prefix = isSelected ? styles.primary('❯ ') : ' ';
82
+ const icon = theme.type === 'dark' ? '🌙' : '☀️';
83
+ const checkmark = isCurrent ? styles.success(' ✓') : '';
84
+ const label = isSelected ? styles.primary(theme.name) : theme.name;
85
+ return ` ${prefix}${label.padEnd(33)}${icon}${checkmark}`;
86
+ },
87
+ renderSelectedPreview: (theme, styles) => {
88
+ return renderPreview(theme, styles);
89
+ },
90
+ footerHints: (searchMode) => {
91
+ if (searchMode) {
92
+ return 'Type to filter · ↑↓/jk Navigate · Enter Select · Esc Exit search';
93
+ }
94
+ return 'Tab Filter · ↑↓/jk · ←→/hl Pages · / Search · Enter Select · q/Esc Close';
95
+ },
96
+ emptyMessage: 'No themes available.',
97
+ noResultsMessage: 'No themes match the search.',
98
+ };
99
+ super(config);
100
+ this.currentThemeId = currentThemeId;
101
+ this.curatedIds = curatedIds;
102
+ }
103
+ handleKey(data) {
104
+ // Handle Enter/Space to select theme
105
+ if ((isEnter(data) || isSpace(data)) && this.state.filteredItems.length > 0) {
106
+ const theme = this.state.filteredItems[this.state.selectedIndex];
107
+ this.selectTheme(theme);
108
+ return;
109
+ }
110
+ // Let parent handle other keys (including number keys for tab switching)
111
+ super.handleKey(data);
112
+ }
113
+ selectTheme(theme) {
114
+ setCurrentTheme(theme.id);
115
+ clearStyleCache();
116
+ this.close({
117
+ themeChanged: theme.id,
118
+ themeName: theme.name,
119
+ });
120
+ }
121
+ }
122
+ // =============================================================================
123
+ // Export Function
124
+ // =============================================================================
125
+ export async function showThemeOverlay(options = {}) {
126
+ return new ThemeOverlay(options).show();
127
+ }
@@ -13,32 +13,60 @@ import { getStyles } from '../themes/index.js';
13
13
  // =============================================================================
14
14
  // Thinking Words (for random selection when no active todo)
15
15
  // =============================================================================
16
+ // Retro-computing themed thinking words (C64, Amiga, Spectrum era vibes)
16
17
  const THINKING_WORDS = [
17
- 'Thinking',
18
- 'Pondering',
19
- 'Contemplating',
20
- 'Ruminating',
21
- 'Cogitating',
22
- 'Deliberating',
23
- 'Musing',
24
- 'Reflecting',
25
- 'Considering',
26
- 'Analyzing',
27
- 'Processing',
28
- 'Computing',
29
- 'Synthesizing',
30
- 'Extrapolating',
31
- 'Hypothesizing',
32
- 'Discombobulating',
33
- 'Nebulizing',
34
- 'Percolating',
35
- 'Marinating',
36
- 'Simmering',
37
- 'Brewing',
38
- 'Fermenting',
39
- 'Distilling',
40
- 'Crystallizing',
41
- 'Transmuting',
18
+ // Tape/Cassette Era
19
+ 'Rewinding tape',
20
+ 'Loading from cassette',
21
+ 'Seeking track',
22
+ 'Press PLAY on tape',
23
+ 'Fast forwarding',
24
+ // Floppy/Disk Era
25
+ 'Spinning diskette',
26
+ 'Aligning heads',
27
+ 'Seeking sector',
28
+ 'Ejecting floppy',
29
+ 'Formatting track',
30
+ 'Reading FAT',
31
+ // CRT/Old Hardware
32
+ 'Degaussing CRT',
33
+ 'Warming tubes',
34
+ 'Adjusting V-HOLD',
35
+ 'Tuning phosphors',
36
+ 'Calibrating beam',
37
+ 'Syncing scanlines',
38
+ // Memory/System
39
+ 'Paging memory',
40
+ 'Swapping buffers',
41
+ 'Defragmenting',
42
+ 'Poking registers',
43
+ 'Peeking bytes',
44
+ 'Flushing cache',
45
+ 'Allocating heap',
46
+ // Modem/BBS Era
47
+ 'Dialing BBS',
48
+ 'Waiting for carrier',
49
+ 'Handshaking modem',
50
+ 'Negotiating baud',
51
+ 'Detecting ring',
52
+ // Terminal/Shell
53
+ 'Parsing commands',
54
+ 'Piping output',
55
+ 'Forking process',
56
+ 'Grepping logs',
57
+ 'Spawning shell',
58
+ 'Sourcing profile',
59
+ // Classic References
60
+ 'SYS 64738',
61
+ 'LOAD "*",8,1',
62
+ 'Guru meditating',
63
+ 'POKE 53280,0',
64
+ 'RUN/STOP',
65
+ 'Inserting cartridge',
66
+ // Printer/Peripherals
67
+ 'Feeding paper',
68
+ 'Advancing ribbon',
69
+ 'Parking heads',
42
70
  ];
43
71
  // =============================================================================
44
72
  // Formatting Helpers
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tool Result Formatters
3
+ *
4
+ * Extracts content, summary, and success from tool results.
5
+ * Each tool type has its own formatter to produce human-readable output.
6
+ */
7
+ export interface FormattedResult {
8
+ content: string;
9
+ summary: string;
10
+ success: boolean;
11
+ }
12
+ /**
13
+ * Format tool result for display.
14
+ * Handles the agent's structured result format.
15
+ */
16
+ export declare function formatToolResult(toolName: string, result: unknown): FormattedResult;