@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,50 @@
1
+ /**
2
+ * Command Registry
3
+ *
4
+ * Central registry for command handlers. Commands are registered
5
+ * at startup and executed by REPL.handleCommand().
6
+ */
7
+ import type { CommandHandler, CommandContext, CommandResult } from './handler-types.js';
8
+ declare class CommandRegistry {
9
+ private readonly handlers;
10
+ /**
11
+ * Register a command handler.
12
+ * Registers both the primary name and any aliases.
13
+ */
14
+ register(handler: CommandHandler): void;
15
+ /**
16
+ * Register multiple handlers at once.
17
+ */
18
+ registerAll(handlers: CommandHandler[]): void;
19
+ /**
20
+ * Execute a command by name.
21
+ *
22
+ * @param command - Command name (without leading slash)
23
+ * @param args - Arguments string
24
+ * @param ctx - Command context
25
+ * @returns true to continue REPL, false to exit, null if not found
26
+ */
27
+ execute(command: string, args: string, ctx: CommandContext): Promise<CommandResult>;
28
+ /**
29
+ * Check if a command is registered.
30
+ */
31
+ has(command: string): boolean;
32
+ /**
33
+ * Get a handler by name.
34
+ */
35
+ get(command: string): CommandHandler | undefined;
36
+ /**
37
+ * Get all unique handlers (no duplicates from aliases).
38
+ */
39
+ getAll(): CommandHandler[];
40
+ /**
41
+ * Get all registered command names (including aliases).
42
+ */
43
+ getCommandNames(): string[];
44
+ }
45
+ /**
46
+ * Global command registry instance.
47
+ * Use this to register and execute commands.
48
+ */
49
+ export declare const commandRegistry: CommandRegistry;
50
+ export {};
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Command Registry
3
+ *
4
+ * Central registry for command handlers. Commands are registered
5
+ * at startup and executed by REPL.handleCommand().
6
+ */
7
+ // =============================================================================
8
+ // Command Registry Class
9
+ // =============================================================================
10
+ class CommandRegistry {
11
+ handlers = new Map();
12
+ /**
13
+ * Register a command handler.
14
+ * Registers both the primary name and any aliases.
15
+ */
16
+ register(handler) {
17
+ this.handlers.set(handler.name, handler);
18
+ handler.aliases?.forEach((alias) => this.handlers.set(alias, handler));
19
+ }
20
+ /**
21
+ * Register multiple handlers at once.
22
+ */
23
+ registerAll(handlers) {
24
+ handlers.forEach((h) => {
25
+ this.register(h);
26
+ });
27
+ }
28
+ /**
29
+ * Execute a command by name.
30
+ *
31
+ * @param command - Command name (without leading slash)
32
+ * @param args - Arguments string
33
+ * @param ctx - Command context
34
+ * @returns true to continue REPL, false to exit, null if not found
35
+ */
36
+ async execute(command, args, ctx) {
37
+ const handler = this.handlers.get(command);
38
+ if (!handler) {
39
+ return null; // Not found
40
+ }
41
+ return handler.execute(args, ctx);
42
+ }
43
+ /**
44
+ * Check if a command is registered.
45
+ */
46
+ has(command) {
47
+ return this.handlers.has(command);
48
+ }
49
+ /**
50
+ * Get a handler by name.
51
+ */
52
+ get(command) {
53
+ return this.handlers.get(command);
54
+ }
55
+ /**
56
+ * Get all unique handlers (no duplicates from aliases).
57
+ */
58
+ getAll() {
59
+ return [...new Set(this.handlers.values())];
60
+ }
61
+ /**
62
+ * Get all registered command names (including aliases).
63
+ */
64
+ getCommandNames() {
65
+ return [...this.handlers.keys()];
66
+ }
67
+ }
68
+ // =============================================================================
69
+ // Singleton Export
70
+ // =============================================================================
71
+ /**
72
+ * Global command registry instance.
73
+ * Use this to register and execute commands.
74
+ */
75
+ export const commandRegistry = new CommandRegistry();
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Context Commands for REPL V2
3
+ *
4
+ * Commands for context management: compact, context, tokens, status, todos, export
5
+ */
6
+ import type { CommandHandlerV2 } from '../types.js';
7
+ export declare const compactCommand: CommandHandlerV2;
8
+ export declare const contextCommand: CommandHandlerV2;
9
+ export declare const tokensCommand: CommandHandlerV2;
10
+ export declare const statusCommand: CommandHandlerV2;
11
+ export declare const todosCommand: CommandHandlerV2;
12
+ export declare const exportCommand: CommandHandlerV2;
13
+ export declare const contextCommands: CommandHandlerV2[];
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Context Commands for REPL V2
3
+ *
4
+ * Commands for context management: compact, context, tokens, status, todos, export
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import pc from 'picocolors';
9
+ // =============================================================================
10
+ // Helper: Progress Bar
11
+ // =============================================================================
12
+ function renderProgressBar(ratio, width) {
13
+ const clamped = Math.max(0, Math.min(1, ratio));
14
+ const filled = Math.round(clamped * width);
15
+ const empty = width - filled;
16
+ const color = clamped > 0.9 ? pc.red : clamped > 0.7 ? pc.yellow : pc.green;
17
+ return color('█'.repeat(filled)) + pc.dim('░'.repeat(empty));
18
+ }
19
+ // =============================================================================
20
+ // Compact Command
21
+ // =============================================================================
22
+ export const compactCommand = {
23
+ name: 'compact',
24
+ description: 'Summarize old messages to free context',
25
+ async execute(_args, ctx) {
26
+ // Check if agent is available
27
+ if (!ctx.agent) {
28
+ ctx.ui.print({ type: 'warning', message: 'Agent not available for compaction' });
29
+ return true;
30
+ }
31
+ const contextManager = ctx.getContextManager?.();
32
+ if (!contextManager) {
33
+ ctx.ui.print({ type: 'warning', message: 'Context manager not available' });
34
+ return true;
35
+ }
36
+ const history = ctx.getHistory?.() ?? [];
37
+ if (history.length === 0) {
38
+ ctx.ui.print({ type: 'info', message: 'No conversation history to compact' });
39
+ return true;
40
+ }
41
+ // Show current stats
42
+ const stats = contextManager.getStats(history.length);
43
+ const pct = (stats.utilization * 100).toFixed(1);
44
+ ctx.ui.print({
45
+ type: 'info',
46
+ message: `Current: ${stats.currentTokens.toLocaleString()} tokens (${pct}%), ${String(history.length)} messages`,
47
+ });
48
+ // Start compaction (user explicitly requested via /compact)
49
+ ctx.ui.print({ type: 'info', message: 'Compacting context...' });
50
+ try {
51
+ // Use the agent's compact() method
52
+ const result = (await ctx.agent.compact());
53
+ if (!result.success) {
54
+ ctx.ui.print({ type: 'warning', message: 'Compaction not available' });
55
+ return true;
56
+ }
57
+ // Build status message
58
+ const newHistory = ctx.getHistory?.() ?? [];
59
+ const statusParts = [];
60
+ // Token reduction
61
+ const originalTokens = result.originalTokens ?? 0;
62
+ const summaryTokens = result.summaryTokens ?? 0;
63
+ const reduction = originalTokens > 0 ? Math.round((1 - summaryTokens / originalTokens) * 100) : 0;
64
+ statusParts.push(`Compacted: ${originalTokens.toLocaleString()} → ${summaryTokens.toLocaleString()} tokens (-${String(reduction)}%)`);
65
+ // Message count
66
+ statusParts.push(`Messages: ${String(history.length)} → ${String(newHistory.length)} (${String(result.messagesPreserved ?? 0)} preserved)`);
67
+ // Category actions
68
+ if (result.categoryStats) {
69
+ const actions = [];
70
+ if (result.categoryStats.toolResults.action === 'compacted') {
71
+ actions.push('tool results → files');
72
+ }
73
+ if (result.categoryStats.history.action === 'summarized') {
74
+ actions.push('history → summary');
75
+ }
76
+ if (actions.length > 0) {
77
+ statusParts.push(`Actions: ${actions.join(', ')}`);
78
+ }
79
+ }
80
+ // Files created
81
+ if (result.filesCreated && result.filesCreated.length > 0) {
82
+ statusParts.push(`Files created: ${String(result.filesCreated.length)}`);
83
+ }
84
+ // Restoration hints
85
+ if (result.restorationHintsInjected) {
86
+ statusParts.push('File tracking hints injected');
87
+ }
88
+ // Tool results repaired
89
+ if (result.toolResultsRepaired && result.toolResultsRepaired > 0) {
90
+ statusParts.push(`Orphaned tool results removed: ${String(result.toolResultsRepaired)}`);
91
+ }
92
+ // Print results
93
+ for (const part of statusParts) {
94
+ ctx.ui.print({ type: 'success', message: part });
95
+ }
96
+ }
97
+ catch (error) {
98
+ ctx.ui.print({ type: 'error', message: `Compaction failed: ${error.message}` });
99
+ }
100
+ return true;
101
+ },
102
+ };
103
+ // =============================================================================
104
+ // Context Command
105
+ // =============================================================================
106
+ export const contextCommand = {
107
+ name: 'context',
108
+ description: 'Show context window usage',
109
+ execute(_args, ctx) {
110
+ const lines = [];
111
+ lines.push('');
112
+ lines.push(pc.bold('Context Usage'));
113
+ lines.push(pc.dim('─'.repeat(40)));
114
+ const contextManager = ctx.getContextManager?.();
115
+ const history = ctx.getHistory?.() ?? [];
116
+ if (contextManager) {
117
+ const stats = contextManager.getStats(history.length);
118
+ const pct = (stats.utilization * 100).toFixed(1);
119
+ const bar = renderProgressBar(stats.utilization, 20);
120
+ lines.push(` Usage: ${bar} ${pct}%`);
121
+ lines.push(` Tokens: ${pc.cyan(stats.currentTokens.toLocaleString())} / ${pc.dim(stats.maxTokens.toLocaleString())}`);
122
+ lines.push(` Messages: ${pc.cyan(String(stats.messageCount))}`);
123
+ lines.push(` Turns: ${pc.cyan(String(stats.turnCount))}`);
124
+ }
125
+ else {
126
+ // Fallback to session tracking
127
+ const inputTokens = ctx.sessionInputTokens ?? 0;
128
+ const outputTokens = ctx.sessionOutputTokens ?? 0;
129
+ const total = inputTokens + outputTokens;
130
+ const maxTokens = 200000;
131
+ const utilization = total / maxTokens;
132
+ const pct = (utilization * 100).toFixed(1);
133
+ const bar = renderProgressBar(utilization, 20);
134
+ lines.push(` Usage: ${bar} ${pct}%`);
135
+ lines.push(` Tokens: ${pc.cyan(total.toLocaleString())} / ${pc.dim(maxTokens.toLocaleString())}`);
136
+ lines.push(` Input: ${pc.cyan(inputTokens.toLocaleString())}`);
137
+ lines.push(` Output: ${pc.cyan(outputTokens.toLocaleString())}`);
138
+ lines.push(` Messages: ${pc.cyan(String(history.length))}`);
139
+ }
140
+ lines.push('');
141
+ ctx.ui.print({ type: 'raw-lines', lines });
142
+ return Promise.resolve(true);
143
+ },
144
+ };
145
+ // =============================================================================
146
+ // Tokens Command
147
+ // =============================================================================
148
+ export const tokensCommand = {
149
+ name: 'tokens',
150
+ description: 'Show token usage',
151
+ execute(_args, ctx) {
152
+ const lines = [];
153
+ lines.push('');
154
+ lines.push(pc.bold('Token Usage'));
155
+ lines.push(pc.dim('─'.repeat(40)));
156
+ const inputTokens = ctx.sessionInputTokens ?? 0;
157
+ const outputTokens = ctx.sessionOutputTokens ?? 0;
158
+ const total = inputTokens + outputTokens;
159
+ lines.push(` Input: ${pc.cyan(inputTokens.toLocaleString())} tokens`);
160
+ lines.push(` Output: ${pc.cyan(outputTokens.toLocaleString())} tokens`);
161
+ lines.push(pc.dim(' ─'.repeat(20)));
162
+ lines.push(` Total: ${pc.bold(pc.cyan(total.toLocaleString()))} tokens`);
163
+ lines.push('');
164
+ ctx.ui.print({ type: 'raw-lines', lines });
165
+ return Promise.resolve(true);
166
+ },
167
+ };
168
+ // =============================================================================
169
+ // Status Command
170
+ // =============================================================================
171
+ export const statusCommand = {
172
+ name: 'status',
173
+ description: 'Show session status',
174
+ execute(_args, ctx) {
175
+ const lines = [];
176
+ lines.push('');
177
+ lines.push(pc.bold('Status'));
178
+ lines.push(pc.dim('─'.repeat(40)));
179
+ lines.push(` Version: ${pc.cyan(ctx.version)}`);
180
+ lines.push(` Model: ${pc.cyan(ctx.model ?? 'not set')}`);
181
+ lines.push(` Provider: ${pc.cyan(ctx.provider ?? 'not set')}`);
182
+ const contextManager = ctx.getContextManager?.();
183
+ const history = ctx.getHistory?.() ?? [];
184
+ if (contextManager) {
185
+ const stats = contextManager.getStats(history.length);
186
+ const pct = (stats.utilization * 100).toFixed(1);
187
+ const bar = renderProgressBar(stats.utilization, 20);
188
+ lines.push(` Context: ${bar} ${pct}%`);
189
+ lines.push(` Messages: ${pc.cyan(String(stats.messageCount))}`);
190
+ }
191
+ else {
192
+ const inputTokens = ctx.sessionInputTokens ?? 0;
193
+ const outputTokens = ctx.sessionOutputTokens ?? 0;
194
+ const total = inputTokens + outputTokens;
195
+ lines.push(` Tokens: ${pc.cyan(total.toLocaleString())}`);
196
+ lines.push(` Messages: ${pc.cyan(String(history.length))}`);
197
+ }
198
+ lines.push(` Requests: ${pc.cyan(String(ctx.sessionRequests ?? 0))}`);
199
+ lines.push('');
200
+ ctx.ui.print({ type: 'raw-lines', lines });
201
+ return Promise.resolve(true);
202
+ },
203
+ };
204
+ // =============================================================================
205
+ // Todos Command
206
+ // =============================================================================
207
+ export const todosCommand = {
208
+ name: 'todos',
209
+ description: 'Show current todo list',
210
+ execute(_args, ctx) {
211
+ const todos = ctx.ui.getTodos();
212
+ const lines = [];
213
+ lines.push('');
214
+ if (todos.length === 0) {
215
+ lines.push(pc.dim('No todos. The agent will create todos when working on tasks.'));
216
+ lines.push('');
217
+ ctx.ui.print({ type: 'raw-lines', lines });
218
+ return Promise.resolve(true);
219
+ }
220
+ lines.push(pc.bold('Todos'));
221
+ lines.push(pc.dim('─'.repeat(40)));
222
+ for (const todo of todos) {
223
+ let icon;
224
+ let style;
225
+ switch (todo.status) {
226
+ case 'completed':
227
+ icon = pc.green('✓');
228
+ style = pc.strikethrough;
229
+ break;
230
+ case 'in_progress':
231
+ icon = pc.yellow('●');
232
+ style = pc.bold;
233
+ break;
234
+ default:
235
+ icon = pc.dim('○');
236
+ style = (s) => s;
237
+ }
238
+ lines.push(` ${icon} ${style(todo.content)}`);
239
+ }
240
+ lines.push('');
241
+ ctx.ui.print({ type: 'raw-lines', lines });
242
+ return Promise.resolve(true);
243
+ },
244
+ };
245
+ // =============================================================================
246
+ // Export Command
247
+ // =============================================================================
248
+ export const exportCommand = {
249
+ name: 'export',
250
+ description: 'Export conversation to file',
251
+ execute(args, ctx) {
252
+ const history = ctx.getHistory?.() ?? [];
253
+ if (history.length === 0) {
254
+ ctx.ui.print({ type: 'warning', message: 'No conversation to export' });
255
+ return Promise.resolve(true);
256
+ }
257
+ // Format conversation as markdown
258
+ const markdown = formatConversationAsMarkdown(history, ctx.model ?? 'unknown');
259
+ // Determine filename
260
+ let filename;
261
+ if (args.trim()) {
262
+ filename = args.trim();
263
+ }
264
+ else {
265
+ // Default: conversation-YYYY-MM-DD-HHMMSS.md
266
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
267
+ filename = `conversation-${timestamp}.md`;
268
+ }
269
+ const filepath = path.isAbsolute(filename) ? filename : path.join(process.cwd(), filename);
270
+ try {
271
+ fs.writeFileSync(filepath, markdown, 'utf-8');
272
+ ctx.ui.print({ type: 'success', message: `Exported ${String(history.length)} messages to ${filepath}` });
273
+ }
274
+ catch (error) {
275
+ ctx.ui.print({ type: 'error', message: `Failed to export: ${error.message}` });
276
+ }
277
+ return Promise.resolve(true);
278
+ },
279
+ };
280
+ // =============================================================================
281
+ // Helper: Format Conversation as Markdown
282
+ // =============================================================================
283
+ function formatConversationAsMarkdown(history, model) {
284
+ const lines = [];
285
+ const timestamp = new Date().toISOString().split('T')[0];
286
+ lines.push(`# Conversation Export`);
287
+ lines.push('');
288
+ lines.push(`**Model:** ${model}`);
289
+ lines.push(`**Date:** ${timestamp}`);
290
+ lines.push(`**Messages:** ${String(history.length)}`);
291
+ lines.push('');
292
+ lines.push('---');
293
+ lines.push('');
294
+ for (const msg of history) {
295
+ const role = msg.role === 'user' ? '👤 User' : '🤖 Assistant';
296
+ lines.push(`## ${role}`);
297
+ lines.push('');
298
+ if (typeof msg.content === 'string') {
299
+ lines.push(msg.content);
300
+ }
301
+ else if (Array.isArray(msg.content)) {
302
+ // Handle content blocks (tool calls, etc.)
303
+ for (const block of msg.content) {
304
+ if (typeof block === 'object' && block !== null) {
305
+ const b = block;
306
+ if (b.type === 'text' && typeof b.text === 'string') {
307
+ lines.push(b.text);
308
+ }
309
+ else if (b.type === 'tool_use') {
310
+ const toolName = typeof b.name === 'string' ? b.name : String(b.name);
311
+ lines.push(`**Tool:** \`${toolName}\``);
312
+ if (b.input) {
313
+ lines.push('```json');
314
+ lines.push(JSON.stringify(b.input, null, 2));
315
+ lines.push('```');
316
+ }
317
+ }
318
+ else if (b.type === 'tool_result') {
319
+ lines.push(`**Tool Result:**`);
320
+ if (typeof b.content === 'string') {
321
+ lines.push('```');
322
+ lines.push(b.content.slice(0, 500) + (b.content.length > 500 ? '...' : ''));
323
+ lines.push('```');
324
+ }
325
+ }
326
+ }
327
+ }
328
+ }
329
+ else if (msg.content !== null && typeof msg.content === 'object') {
330
+ lines.push('```json');
331
+ lines.push(JSON.stringify(msg.content, null, 2));
332
+ lines.push('```');
333
+ }
334
+ lines.push('');
335
+ }
336
+ return lines.join('\n');
337
+ }
338
+ // =============================================================================
339
+ // Export All Context Commands
340
+ // =============================================================================
341
+ export const contextCommands = [
342
+ compactCommand,
343
+ contextCommand,
344
+ tokensCommand,
345
+ statusCommand,
346
+ todosCommand,
347
+ exportCommand,
348
+ ];
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Core Commands for REPL V2
3
+ *
4
+ * Essential commands: exit, clear, help
5
+ */
6
+ import type { CommandHandlerV2 } from '../types.js';
7
+ export declare const exitCommand: CommandHandlerV2;
8
+ export declare const clearCommand: CommandHandlerV2;
9
+ export declare const helpCommand: CommandHandlerV2;
10
+ export declare const tutorialCommand: CommandHandlerV2;
11
+ export declare const commandsCommand: CommandHandlerV2;
12
+ export declare const menuCommand: CommandHandlerV2;
13
+ export declare const coreCommands: CommandHandlerV2[];
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Core Commands for REPL V2
3
+ *
4
+ * Essential commands: exit, clear, help
5
+ */
6
+ import { HelpOverlayV2, TutorialOverlayV2, CommandsOverlayV2, DashboardOverlayV2, } from '../../ui/overlay/index.js';
7
+ import { executeCommand } from '../registry.js';
8
+ import { projectRepository } from '../../db/repositories/index.js';
9
+ import { setCurrentProject } from '../../tools/project-db.js';
10
+ // =============================================================================
11
+ // Exit Command
12
+ // =============================================================================
13
+ export const exitCommand = {
14
+ name: 'exit',
15
+ aliases: ['quit', 'q'],
16
+ description: 'Exit the REPL',
17
+ execute(_args, ctx) {
18
+ ctx.ui.stop();
19
+ console.log('\nGoodbye!\n');
20
+ return Promise.resolve(false);
21
+ },
22
+ };
23
+ // =============================================================================
24
+ // Clear Command
25
+ // =============================================================================
26
+ export const clearCommand = {
27
+ name: 'clear',
28
+ aliases: ['cls'],
29
+ description: 'Clear the screen',
30
+ execute(_args, ctx) {
31
+ ctx.printWelcome();
32
+ return Promise.resolve(true);
33
+ },
34
+ };
35
+ // =============================================================================
36
+ // Help Command
37
+ // =============================================================================
38
+ export const helpCommand = {
39
+ name: 'help',
40
+ aliases: ['h', '?'],
41
+ description: 'Show available commands',
42
+ async execute(_args, ctx) {
43
+ const helpOverlay = new HelpOverlayV2();
44
+ await ctx.ui.showOverlay(helpOverlay);
45
+ return true;
46
+ },
47
+ };
48
+ // =============================================================================
49
+ // Tutorial Command
50
+ // =============================================================================
51
+ export const tutorialCommand = {
52
+ name: 'tutorial',
53
+ description: 'Interactive workflow tutorial',
54
+ async execute(_args, ctx) {
55
+ const tutorialOverlay = new TutorialOverlayV2();
56
+ const result = await ctx.ui.showOverlay(tutorialOverlay);
57
+ if (result?.completed) {
58
+ ctx.ui.print({ type: 'success', message: 'Tutorial completed!' });
59
+ }
60
+ return true;
61
+ },
62
+ };
63
+ // =============================================================================
64
+ // Commands Command
65
+ // =============================================================================
66
+ export const commandsCommand = {
67
+ name: 'commands',
68
+ description: 'Manage custom commands',
69
+ async execute(_args, ctx) {
70
+ const commandsOverlay = new CommandsOverlayV2();
71
+ const result = await ctx.ui.showOverlay(commandsOverlay);
72
+ if (result?.created) {
73
+ ctx.ui.print({ type: 'success', message: `Created command: /${result.created}` });
74
+ }
75
+ return true;
76
+ },
77
+ };
78
+ // =============================================================================
79
+ // Menu Command - Returns to Project Dashboard
80
+ // =============================================================================
81
+ export const menuCommand = {
82
+ name: 'menu',
83
+ description: 'Return to the Project Dashboard',
84
+ async execute(_args, ctx) {
85
+ // Print logo to scrolling area (stays visible while overlays render below)
86
+ ctx.printLogo();
87
+ // Dashboard loop - returns to dashboard after sub-commands until user exits or continues
88
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
89
+ while (true) {
90
+ const dashboard = new DashboardOverlayV2();
91
+ const result = await ctx.ui.showOverlay(dashboard);
92
+ if (!result) {
93
+ return true;
94
+ }
95
+ // Handle dashboard result actions
96
+ switch (result.action) {
97
+ case 'exit':
98
+ ctx.ui.stop();
99
+ console.log('\nGoodbye!\n');
100
+ return false;
101
+ case 'continue':
102
+ // Switch to selected project if different from current
103
+ if (result.projectId) {
104
+ const project = projectRepository.getById(result.projectId);
105
+ if (project) {
106
+ setCurrentProject({
107
+ id: project.id,
108
+ name: project.name,
109
+ displayName: project.displayName,
110
+ path: project.path,
111
+ });
112
+ ctx.ui.setProjectName(project.displayName);
113
+ ctx.ui.print({ type: 'success', message: `Switched to project: ${project.displayName}` });
114
+ }
115
+ }
116
+ return true; // Exit loop, return to REPL
117
+ case 'chat':
118
+ // Clear current project for quick chat mode
119
+ setCurrentProject(null);
120
+ ctx.ui.setProjectName(null);
121
+ ctx.ui.print({ type: 'warning', message: 'Quick Chat mode - no project context. Use /menu to select a project.' });
122
+ return true; // Exit loop, return to REPL
123
+ case 'new':
124
+ await executeCommand('new', '', ctx);
125
+ // Loop back to dashboard after /new completes
126
+ break;
127
+ case 'projects':
128
+ await executeCommand('projects', '', ctx);
129
+ // Loop back to dashboard after /projects completes
130
+ break;
131
+ case 'workflow':
132
+ await executeCommand('workflow', '', ctx);
133
+ // Loop back to dashboard after /workflow completes
134
+ break;
135
+ case 'help':
136
+ await executeCommand('help', '', ctx);
137
+ // Loop back to dashboard after /help closes
138
+ break;
139
+ case 'config':
140
+ await executeCommand('config', '', ctx);
141
+ // Loop back to dashboard after /config closes
142
+ break;
143
+ case 'about':
144
+ ctx.ui.print({ type: 'info', message: '@compilr-dev/cli v0.4.0' });
145
+ ctx.ui.print({ type: 'info', message: 'AI-powered coding assistant using @compilr-dev/agents' });
146
+ ctx.ui.print({ type: 'info', message: 'https://github.com/compilr-dev/cli' });
147
+ // Loop back to dashboard after showing about info
148
+ break;
149
+ default:
150
+ return true;
151
+ }
152
+ }
153
+ },
154
+ };
155
+ // =============================================================================
156
+ // Export All Core Commands
157
+ // =============================================================================
158
+ export const coreCommands = [
159
+ exitCommand,
160
+ clearCommand,
161
+ helpCommand,
162
+ tutorialCommand,
163
+ commandsCommand,
164
+ menuCommand,
165
+ ];
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Debug Commands for REPL V2
3
+ *
4
+ * Commands for testing and debugging: todos, suggest, bash, subagent
5
+ */
6
+ import type { CommandHandlerV2 } from '../types.js';
7
+ export declare const sampleTodosCommand: CommandHandlerV2;
8
+ export declare const suggestCommand: CommandHandlerV2;
9
+ export declare const bashCommand: CommandHandlerV2;
10
+ export declare const subagentCommand: CommandHandlerV2;
11
+ export declare const debugCommands: CommandHandlerV2[];