@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,213 @@
1
+ /**
2
+ * Mascot Expression Library
3
+ *
4
+ * ASCII art expressions for the compilr mascot - a retro CRT monitor
5
+ * with rabbit-ear antennas and a 3D keyboard.
6
+ *
7
+ * Each expression is 6 lines tall and designed to sit alongside the logo.
8
+ */
9
+ // Full mascot expressions (6 lines each)
10
+ // Design elements:
11
+ // - \|/ - Rabbit-ear antennas (retro TV)
12
+ // - ╭══════════╮ - Rounded top with double-line (CRT bezel)
13
+ // - ║ - Double left border (3D depth effect)
14
+ // - ' - Screen glare/reflection
15
+ // - ▐▌ - Rectangular eyes
16
+ // - ╰─═──────═─╯ - Bottom with feet (═)
17
+ // - \________\ - 3D perspective keyboard
18
+ export const EXPRESSIONS = {
19
+ // Standard/default - looking at user
20
+ neutral: [
21
+ ' \\|/',
22
+ ' ╭══════════╮',
23
+ " ║' ▐▌ ▐▌ │",
24
+ ' ║ │',
25
+ ' ╰─═──────═─╯',
26
+ ' \\________\\',
27
+ ],
28
+ // Processing, working on something
29
+ thinking: [
30
+ ' \\|/',
31
+ ' ╭══════════╮',
32
+ " ║' ▐▌ ▐▌ │",
33
+ ' ║ ... │',
34
+ ' ╰─═──────═─╯',
35
+ ' \\________\\',
36
+ ],
37
+ // Glancing left (3D effect switches sides)
38
+ looking_left: [
39
+ ' \\|/',
40
+ ' ╭══════════╮',
41
+ " │ ▐▌ ▐▌ '║",
42
+ ' │ ║',
43
+ ' ╰─═──────═─╯',
44
+ ' \\________\\',
45
+ ],
46
+ // Glancing right (eyes shifted)
47
+ looking_right: [
48
+ ' \\|/',
49
+ ' ╭══════════╮',
50
+ " ║' ▐▌ ▐▌ │",
51
+ ' ║ │',
52
+ ' ╰─═──────═─╯',
53
+ ' \\________\\',
54
+ ],
55
+ // Idle, waiting, inactive
56
+ sleeping: [
57
+ ' \\|/',
58
+ ' ╭══════════╮',
59
+ " ║' __ __ │",
60
+ ' ║ zZ │',
61
+ ' ╰─═──────═─╯',
62
+ ' \\________\\',
63
+ ],
64
+ // Attention needed, important notification
65
+ alert: [
66
+ ' \\|||/',
67
+ ' ╭══════════╮',
68
+ " ║' ▐▌ ▐▌ │",
69
+ ' ║ ! │',
70
+ ' ╰─═──────═─╯',
71
+ ' \\________\\',
72
+ ],
73
+ // Error occurred, confused, problem
74
+ error: [
75
+ ' \\|/',
76
+ ' ╭══════════╮',
77
+ " ║' × × │",
78
+ ' ║ ??? │',
79
+ ' ╰─═──────═─╯',
80
+ ' \\________\\',
81
+ ],
82
+ // Task completed successfully, happy
83
+ success: [
84
+ ' \\|/',
85
+ ' ╭══════════╮',
86
+ " ║' ^ ^ │",
87
+ ' ║ __ │',
88
+ ' ╰─═──────═─╯',
89
+ ' \\________\\',
90
+ ],
91
+ // Success with just happy eyes, no smile
92
+ success_minimal: [
93
+ ' \\|/',
94
+ ' ╭══════════╮',
95
+ " ║' ^ ^ │",
96
+ ' ║ │',
97
+ ' ╰─═──────═─╯',
98
+ ' \\________\\',
99
+ ],
100
+ // Looking for something, scanning
101
+ searching: [
102
+ ' \\|/',
103
+ ' ╭══════════╮',
104
+ " ║' ◐ ◐ │",
105
+ ' ║ ~~~ │',
106
+ ' ╰─═──────═─╯',
107
+ ' \\________\\',
108
+ ],
109
+ // Doubtful, questioning, side-eye
110
+ skeptical: [
111
+ ' \\|/',
112
+ ' ╭══════════╮',
113
+ " ║' > > │",
114
+ ' ║ │',
115
+ ' ╰─═──────═─╯',
116
+ ' \\________\\',
117
+ ],
118
+ };
119
+ // Inline mascot expressions (single line) for status updates
120
+ export const EXPRESSIONS_INLINE = {
121
+ neutral: '[•_•]',
122
+ thinking: '[•_•]...',
123
+ looking_left: '[<_<]',
124
+ looking_right: '[>_>]',
125
+ sleeping: '[-_-]zZ',
126
+ alert: '[•!•]',
127
+ error: '[×_×]',
128
+ success: '[^_^]',
129
+ success_minimal: '[^_^]',
130
+ searching: '[◐_◐]',
131
+ skeptical: '[>_>]',
132
+ };
133
+ // All expression codes for iteration
134
+ export const EXPRESSION_CODES = [
135
+ 'neutral',
136
+ 'thinking',
137
+ 'looking_left',
138
+ 'looking_right',
139
+ 'sleeping',
140
+ 'alert',
141
+ 'error',
142
+ 'success',
143
+ 'success_minimal',
144
+ 'searching',
145
+ 'skeptical',
146
+ ];
147
+ // All mascot setting options (for config menu)
148
+ export const MASCOT_OPTIONS = [
149
+ 'none',
150
+ 'random',
151
+ ...EXPRESSION_CODES,
152
+ ];
153
+ // Human-readable labels for mascot options
154
+ export const MASCOT_LABELS = {
155
+ none: 'None',
156
+ random: 'Random',
157
+ neutral: 'Neutral',
158
+ thinking: 'Thinking',
159
+ looking_left: 'Looking Left',
160
+ looking_right: 'Looking Right',
161
+ sleeping: 'Sleeping',
162
+ alert: 'Alert',
163
+ error: 'Error',
164
+ success: 'Success',
165
+ success_minimal: 'Success (Minimal)',
166
+ searching: 'Searching',
167
+ skeptical: 'Skeptical',
168
+ };
169
+ /**
170
+ * Get a random expression code
171
+ */
172
+ export function getRandomExpression() {
173
+ const index = Math.floor(Math.random() * EXPRESSION_CODES.length);
174
+ return EXPRESSION_CODES[index];
175
+ }
176
+ // Session-level cache for random expression (selected once at startup)
177
+ let sessionRandomExpression = null;
178
+ /**
179
+ * Get the cached session expression, or generate one if not set
180
+ */
181
+ function getSessionExpression() {
182
+ if (sessionRandomExpression === null) {
183
+ sessionRandomExpression = getRandomExpression();
184
+ }
185
+ return sessionRandomExpression;
186
+ }
187
+ /**
188
+ * Reset the session expression (for next startup or when settings change)
189
+ */
190
+ export function resetSessionExpression() {
191
+ sessionRandomExpression = null;
192
+ }
193
+ /**
194
+ * Get expression lines for a mascot setting
195
+ * Returns null for 'none', picks random for 'random', otherwise returns the expression
196
+ */
197
+ export function getExpressionForSetting(setting) {
198
+ if (setting === 'none') {
199
+ return null;
200
+ }
201
+ if (setting === 'random') {
202
+ // Use cached session expression for consistency within a session
203
+ return EXPRESSIONS[getSessionExpression()];
204
+ }
205
+ return EXPRESSIONS[setting];
206
+ }
207
+ /**
208
+ * Get the width of the mascot (for layout calculations)
209
+ */
210
+ export function getMascotWidth() {
211
+ // All expressions have the same width - use neutral as reference
212
+ return Math.max(...EXPRESSIONS.neutral.map((line) => line.length));
213
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Mascot Module
3
+ *
4
+ * Exports for the compilr mascot system.
5
+ * The mascot is a retro CRT monitor that displays expressions.
6
+ */
7
+ export { type ExpressionCode, type MascotSetting, EXPRESSIONS, EXPRESSIONS_INLINE, EXPRESSION_CODES, MASCOT_OPTIONS, MASCOT_LABELS, getRandomExpression, getExpressionForSetting, getMascotWidth, resetSessionExpression, } from './expressions.js';
8
+ export { renderMascotWithLogo, combineHorizontally } from './renderer.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Mascot Module
3
+ *
4
+ * Exports for the compilr mascot system.
5
+ * The mascot is a retro CRT monitor that displays expressions.
6
+ */
7
+ export { EXPRESSIONS, EXPRESSIONS_INLINE, EXPRESSION_CODES, MASCOT_OPTIONS, MASCOT_LABELS, getRandomExpression, getExpressionForSetting, getMascotWidth, resetSessionExpression, } from './expressions.js';
8
+ export { renderMascotWithLogo, combineHorizontally } from './renderer.js';
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Mascot Renderer
3
+ *
4
+ * Handles rendering the mascot alongside the logo and applying colors.
5
+ */
6
+ import { type MascotSetting } from './expressions.js';
7
+ /**
8
+ * Combine two sets of lines horizontally with a gap
9
+ */
10
+ export declare function combineHorizontally(left: string[], right: string[], gap: number): string[];
11
+ /**
12
+ * Render mascot with logo side by side
13
+ * Returns the combined lines ready for output
14
+ *
15
+ * @param mascotSetting - The mascot setting (expression or 'none'/'random')
16
+ * @param version - Version string to append to logo
17
+ * @param projectName - Optional active project name to show
18
+ */
19
+ export declare function renderMascotWithLogo(mascotSetting: MascotSetting, version: string, projectName?: string | null): string[];
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Mascot Renderer
3
+ *
4
+ * Handles rendering the mascot alongside the logo and applying colors.
5
+ */
6
+ import { getStyles } from '../../themes/index.js';
7
+ import { getExpressionForSetting } from './expressions.js';
8
+ // The compilr logo (6 lines to match mascot height)
9
+ const LOGO_LINES = [
10
+ " ___ ___ _ __ ___ _ __ (_) |_ __",
11
+ " / __|/ _ \\| '_ ` _ \\| '_ \\| | | '__|",
12
+ " | (__| (_) | | | | | | |_) | | | |",
13
+ " \\___|\\___/|_| |_| |_| .__/|_|_|_|",
14
+ " | | .dev",
15
+ " |_|",
16
+ ];
17
+ /**
18
+ * Combine two sets of lines horizontally with a gap
19
+ */
20
+ export function combineHorizontally(left, right, gap) {
21
+ const maxLines = Math.max(left.length, right.length);
22
+ const leftWidth = Math.max(...left.map((l) => l.length));
23
+ const result = [];
24
+ for (let i = 0; i < maxLines; i++) {
25
+ const leftLine = (left[i] || '').padEnd(leftWidth);
26
+ const rightLine = right[i] || '';
27
+ result.push(leftLine + ' '.repeat(gap) + rightLine);
28
+ }
29
+ return result;
30
+ }
31
+ /**
32
+ * Render mascot with logo side by side
33
+ * Returns the combined lines ready for output
34
+ *
35
+ * @param mascotSetting - The mascot setting (expression or 'none'/'random')
36
+ * @param version - Version string to append to logo
37
+ * @param projectName - Optional active project name to show
38
+ */
39
+ export function renderMascotWithLogo(mascotSetting, version, projectName) {
40
+ const s = getStyles();
41
+ // Get mascot expression (or null for 'none')
42
+ const mascotLines = getExpressionForSetting(mascotSetting);
43
+ // Create logo lines with version
44
+ const logoWithVersion = [...LOGO_LINES];
45
+ logoWithVersion[5] = ` |_| v${version}`;
46
+ // Add tagline and project info below logo
47
+ const tagline = '@compilr-dev/cli - AI-powered coding assistant';
48
+ let result;
49
+ if (mascotLines) {
50
+ // Combine mascot + logo horizontally (5 space gap)
51
+ result = combineHorizontally(mascotLines, logoWithVersion, 5);
52
+ // Add empty line and tagline
53
+ result.push('');
54
+ result.push(tagline);
55
+ }
56
+ else {
57
+ // No mascot - just show logo
58
+ result = [...logoWithVersion];
59
+ result.push('');
60
+ result.push(tagline);
61
+ }
62
+ // Add project info if available
63
+ if (projectName) {
64
+ result.push('');
65
+ result.push(`Project: ${projectName}`);
66
+ }
67
+ // Apply colors: mascot gets secondary color, logo gets accent
68
+ return result.map((line, index) => {
69
+ if (!mascotLines) {
70
+ // No mascot - color the logo with accent
71
+ if (index < logoWithVersion.length) {
72
+ return s.primary(line);
73
+ }
74
+ // Tagline and project info get muted color
75
+ if (line.startsWith('Project:')) {
76
+ return s.muted(line);
77
+ }
78
+ return s.muted(line);
79
+ }
80
+ // With mascot - split the line at the gap point
81
+ const mascotWidth = Math.max(...mascotLines.map((l) => l.length));
82
+ const gap = 5;
83
+ if (index < mascotLines.length) {
84
+ // Lines that have mascot + logo
85
+ const mascotPart = line.slice(0, mascotWidth);
86
+ const logoPart = line.slice(mascotWidth + gap);
87
+ return s.secondary(mascotPart) + ' '.repeat(gap) + s.primary(logoPart);
88
+ }
89
+ else if (line.startsWith('Project:')) {
90
+ return s.muted(line);
91
+ }
92
+ else if (line === tagline) {
93
+ return s.muted(line);
94
+ }
95
+ return line;
96
+ });
97
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Mascot Overlay V2
3
+ *
4
+ * Mascot selection overlay using the new Overlay interface.
5
+ * Shows all mascot expressions with live preview.
6
+ *
7
+ * Features:
8
+ * - All mascot expressions
9
+ * - Live preview
10
+ * - Persists selection to settings
11
+ * - Works with TerminalUI's overlay management
12
+ */
13
+ import { BaseOverlayV2 } from './base/index.js';
14
+ import { type MascotSetting } from './mascot/index.js';
15
+ import type { RenderContext, OverlayAction, KeyEvent } from './overlay/index.js';
16
+ export interface MascotOverlayV2Options {
17
+ /** Current mascot setting (for highlighting current selection) */
18
+ currentMascot?: MascotSetting;
19
+ }
20
+ export interface MascotOverlayV2Result {
21
+ /** Selected mascot (if changed) */
22
+ mascotChanged?: MascotSetting;
23
+ }
24
+ interface MascotState {
25
+ /** Selected mascot index */
26
+ selectedIndex: number;
27
+ /** Current mascot for checkmark display */
28
+ currentMascot: MascotSetting;
29
+ }
30
+ /**
31
+ * Mascot overlay using the new Overlay interface.
32
+ * Displays mascot options with live preview.
33
+ */
34
+ export declare class MascotOverlayV2 extends BaseOverlayV2<MascotState, MascotOverlayV2Result> {
35
+ readonly type: "inline";
36
+ readonly id = "mascot-overlay-v2";
37
+ constructor(options?: MascotOverlayV2Options);
38
+ protected renderContent(context: RenderContext): string[];
39
+ handleKey(key: KeyEvent): OverlayAction<MascotOverlayV2Result>;
40
+ }
41
+ export {};
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Mascot Overlay V2
3
+ *
4
+ * Mascot selection overlay using the new Overlay interface.
5
+ * Shows all mascot expressions with live preview.
6
+ *
7
+ * Features:
8
+ * - All mascot expressions
9
+ * - Live preview
10
+ * - Persists selection to settings
11
+ * - Works with TerminalUI's overlay management
12
+ */
13
+ import { BaseOverlayV2, isEscape, isEnter, isSpace, isCtrlC, isNavigateUp, isNavigateDown, isClose, renderBorder, } from './base/index.js';
14
+ import { getSettings, setSetting } from '../settings/index.js';
15
+ import { MASCOT_OPTIONS, MASCOT_LABELS, EXPRESSIONS, } from './mascot/index.js';
16
+ // =============================================================================
17
+ // Mascot Overlay V2 Class
18
+ // =============================================================================
19
+ /**
20
+ * Mascot overlay using the new Overlay interface.
21
+ * Displays mascot options with live preview.
22
+ */
23
+ export class MascotOverlayV2 extends BaseOverlayV2 {
24
+ type = 'inline';
25
+ id = 'mascot-overlay-v2';
26
+ constructor(options = {}) {
27
+ const currentMascot = options.currentMascot ?? getSettings().mascot;
28
+ // Find current mascot in options list
29
+ let selectedIndex = 0;
30
+ const mascotIndex = MASCOT_OPTIONS.findIndex(m => m === currentMascot);
31
+ if (mascotIndex >= 0) {
32
+ selectedIndex = mascotIndex;
33
+ }
34
+ const initialState = {
35
+ selectedIndex,
36
+ currentMascot,
37
+ };
38
+ super(initialState);
39
+ this.minHeight = 20;
40
+ }
41
+ renderContent(context) {
42
+ const s = context.styles;
43
+ const cols = context.width;
44
+ const border = renderBorder(cols, s);
45
+ const lines = [];
46
+ // Get preview lines for side-by-side layout
47
+ const selectedOption = MASCOT_OPTIONS[this.state.selectedIndex];
48
+ let previewLines = [];
49
+ let previewLabel = '';
50
+ if (selectedOption === 'none') {
51
+ previewLabel = '(No mascot)';
52
+ previewLines = ['', '', '', '', '', ''];
53
+ }
54
+ else if (selectedOption === 'random') {
55
+ previewLabel = '(Random on startup)';
56
+ previewLines = EXPRESSIONS.neutral;
57
+ }
58
+ else {
59
+ previewLabel = MASCOT_LABELS[selectedOption];
60
+ previewLines = EXPRESSIONS[selectedOption];
61
+ }
62
+ // Header
63
+ lines.push(border);
64
+ lines.push(` ${s.primaryBold('Select Mascot')}`);
65
+ lines.push('');
66
+ // Column widths
67
+ const listColWidth = 28;
68
+ const gap = 4;
69
+ const previewColStart = listColWidth + gap;
70
+ // Build side-by-side layout
71
+ const optionCount = MASCOT_OPTIONS.length;
72
+ const previewHeight = previewLines.length;
73
+ const previewStartRow = Math.max(0, Math.floor((optionCount - previewHeight) / 2));
74
+ for (let i = 0; i < Math.max(optionCount, previewStartRow + previewHeight + 1); i++) {
75
+ let leftPart = '';
76
+ let rightPart = '';
77
+ // Left column: option list
78
+ if (i < optionCount) {
79
+ const option = MASCOT_OPTIONS[i];
80
+ const isSelected = i === this.state.selectedIndex;
81
+ const isCurrent = option === this.state.currentMascot;
82
+ const prefix = isSelected ? s.primary('> ') : ' ';
83
+ const num = `${String(i + 1).padStart(2)}. `;
84
+ const checkmark = isCurrent ? s.success(' (current)') : '';
85
+ const label = isSelected ? s.primary(MASCOT_LABELS[option]) : s.muted(MASCOT_LABELS[option]);
86
+ leftPart = ` ${prefix}${num}${label}${checkmark}`;
87
+ }
88
+ // Right column: preview
89
+ const previewRow = i - previewStartRow;
90
+ if (previewRow === -1) {
91
+ rightPart = s.muted(previewLabel);
92
+ }
93
+ else if (previewRow >= 0 && previewRow < previewHeight) {
94
+ rightPart = s.secondary(previewLines[previewRow]);
95
+ }
96
+ // Combine columns with proper spacing
97
+ // eslint-disable-next-line no-control-regex
98
+ const leftPlain = leftPart.replace(/\x1b\[[0-9;]*m/g, '');
99
+ const padding = ' '.repeat(Math.max(0, previewColStart - leftPlain.length));
100
+ lines.push(leftPart + padding + rightPart);
101
+ }
102
+ // Footer
103
+ lines.push('');
104
+ lines.push(border);
105
+ lines.push(` ${s.muted('up/down/jk Navigate . Enter/Space Select . q/Esc Close')}`);
106
+ lines.push(border);
107
+ return lines;
108
+ }
109
+ handleKey(key) {
110
+ const data = key.raw;
111
+ const maxIndex = MASCOT_OPTIONS.length - 1;
112
+ // Ctrl+C always closes
113
+ if (isCtrlC(data)) {
114
+ return this.cancel();
115
+ }
116
+ // q or Esc closes
117
+ if (isEscape(data) || isClose(data)) {
118
+ return this.cancel();
119
+ }
120
+ // Navigation up
121
+ if (isNavigateUp(data) && this.state.selectedIndex > 0) {
122
+ this.state.selectedIndex--;
123
+ return this.rerender();
124
+ }
125
+ // Navigation down
126
+ if (isNavigateDown(data) && this.state.selectedIndex < maxIndex) {
127
+ this.state.selectedIndex++;
128
+ return this.rerender();
129
+ }
130
+ // Enter/Space to select
131
+ if (isEnter(data) || isSpace(data)) {
132
+ const selectedMascot = MASCOT_OPTIONS[this.state.selectedIndex];
133
+ setSetting('mascot', selectedMascot);
134
+ return this.close({ mascotChanged: selectedMascot });
135
+ }
136
+ return this.noAction();
137
+ }
138
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Mascot Overlay
3
+ *
4
+ * Standalone mascot selection overlay.
5
+ * Accessible via /mascot command or from Config overlay.
6
+ *
7
+ * Features:
8
+ * - All mascot expressions
9
+ * - Live preview
10
+ * - Persists selection to settings
11
+ */
12
+ import { type MascotSetting } from './mascot/index.js';
13
+ export interface MascotOverlayOptions {
14
+ /** Current mascot setting (for highlighting current selection) */
15
+ currentMascot?: MascotSetting;
16
+ }
17
+ export interface MascotOverlayResult {
18
+ /** Selected mascot (if changed) */
19
+ mascotChanged?: MascotSetting;
20
+ }
21
+ export declare function showMascotOverlay(options?: MascotOverlayOptions): Promise<MascotOverlayResult>;