@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,287 @@
1
+ /**
2
+ * Overlay Commands
3
+ *
4
+ * Commands that primarily show overlays without complex logic:
5
+ * - agents, anchors, backlog, commands, docs, help, keys, tutorial
6
+ */
7
+ import * as conversation from '../../ui/conversation.js';
8
+ import * as overlays from '../../ui/overlays.js';
9
+ import { showAgentsOverlay } from '../../ui/agents-overlay.js';
10
+ import { showAnchorsOverlay } from '../../ui/anchors-overlay.js';
11
+ import { showBacklogOverlay } from '../../ui/backlog-overlay.js';
12
+ import { showCommandsOverlay } from '../../ui/commands-overlay.js';
13
+ import { showDocsOverlay } from '../../ui/docs-overlay.js';
14
+ import { showKeysOverlay } from '../../ui/keys-overlay.js';
15
+ import { showTutorialOverlay } from '../../ui/tutorial-overlay.js';
16
+ import { showThemeOverlay } from '../../ui/theme-overlay.js';
17
+ import { showModelOverlay } from '../../ui/model-overlay.js';
18
+ import { showMascotOverlay } from '../../ui/mascot-overlay.js';
19
+ import { showConfigOverlay } from '../../ui/config-overlay.js';
20
+ import { debugLog } from '../../utils/debug-log.js';
21
+ // =============================================================================
22
+ // Agents Command
23
+ // =============================================================================
24
+ export const agentsCommand = {
25
+ name: 'agents',
26
+ description: 'View available sub-agent types',
27
+ async execute(_args, _ctx) {
28
+ await showAgentsOverlay();
29
+ return true;
30
+ },
31
+ };
32
+ // =============================================================================
33
+ // Anchors Command
34
+ // =============================================================================
35
+ export const anchorsCommand = {
36
+ name: 'anchors',
37
+ description: 'View and manage context anchors',
38
+ async execute(_args, _ctx) {
39
+ await showAnchorsOverlay();
40
+ return true;
41
+ },
42
+ };
43
+ // =============================================================================
44
+ // Backlog Command
45
+ // =============================================================================
46
+ export const backlogCommand = {
47
+ name: 'backlog',
48
+ description: 'View and manage the project backlog',
49
+ async execute(_args, _ctx) {
50
+ const result = await showBacklogOverlay();
51
+ if (result.modified) {
52
+ conversation.printSuccess('Backlog updated.');
53
+ }
54
+ return true;
55
+ },
56
+ };
57
+ // =============================================================================
58
+ // Commands Command
59
+ // =============================================================================
60
+ export const commandsCommand = {
61
+ name: 'commands',
62
+ description: 'View custom commands',
63
+ async execute(_args, _ctx) {
64
+ await showCommandsOverlay();
65
+ return true;
66
+ },
67
+ };
68
+ // =============================================================================
69
+ // Docs Command
70
+ // =============================================================================
71
+ export const docsCommand = {
72
+ name: 'docs',
73
+ description: 'View project documentation',
74
+ async execute(_args, _ctx) {
75
+ await showDocsOverlay();
76
+ return true;
77
+ },
78
+ };
79
+ // =============================================================================
80
+ // Help Command
81
+ // =============================================================================
82
+ export const helpCommand = {
83
+ name: 'help',
84
+ aliases: ['?'],
85
+ description: 'Show available commands and help',
86
+ async execute(_args, _ctx) {
87
+ await overlays.showHelp();
88
+ return true;
89
+ },
90
+ };
91
+ // =============================================================================
92
+ // Keys Command
93
+ // =============================================================================
94
+ export const keysCommand = {
95
+ name: 'keys',
96
+ description: 'Manage API keys',
97
+ async execute(_args, _ctx) {
98
+ debugLog('REPL:keys', 'calling showKeysOverlay');
99
+ const result = await showKeysOverlay();
100
+ debugLog('REPL:keys', 'showKeysOverlay returned');
101
+ if (result.changed) {
102
+ conversation.printSuccess('API keys updated.');
103
+ conversation.printInfo('Restart the CLI to use the new keys.');
104
+ }
105
+ return true;
106
+ },
107
+ };
108
+ // =============================================================================
109
+ // Tutorial Command
110
+ // =============================================================================
111
+ export const tutorialCommand = {
112
+ name: 'tutorial',
113
+ description: 'Interactive tutorial',
114
+ async execute(_args, _ctx) {
115
+ await showTutorialOverlay();
116
+ return true;
117
+ },
118
+ };
119
+ // =============================================================================
120
+ // Tools Command
121
+ // =============================================================================
122
+ export const toolsCommand = {
123
+ name: 'tools',
124
+ description: 'View available tools',
125
+ async execute(_args, ctx) {
126
+ await ctx.showTools();
127
+ return true;
128
+ },
129
+ };
130
+ // =============================================================================
131
+ // Theme Command
132
+ // =============================================================================
133
+ export const themeCommand = {
134
+ name: 'theme',
135
+ description: 'Change the color theme',
136
+ async execute(_args, ctx) {
137
+ // Result may be undefined if user cancelled with Esc (base overlay casts undefined to TResult)
138
+ const themeResult = await showThemeOverlay();
139
+ // Theme is already persisted by the overlay
140
+ if (themeResult?.themeChanged) {
141
+ ctx.footer.clearForOutput();
142
+ conversation.printSuccess(`Theme changed to: ${themeResult.themeName ?? themeResult.themeChanged}`);
143
+ ctx.footer.refreshPrompt();
144
+ ctx.footer.forceRender();
145
+ }
146
+ return true;
147
+ },
148
+ };
149
+ // =============================================================================
150
+ // Model Command
151
+ // =============================================================================
152
+ export const modelCommand = {
153
+ name: 'model',
154
+ description: 'Change the AI model',
155
+ async execute(_args, ctx) {
156
+ // Result may be undefined if user cancelled with Esc (base overlay casts undefined to TResult)
157
+ const modelResult = await showModelOverlay({
158
+ currentModel: ctx.currentModel,
159
+ currentProvider: ctx.provider,
160
+ });
161
+ // Handle model change result
162
+ if (modelResult?.modelChanged) {
163
+ ctx.setModel(modelResult.modelChanged);
164
+ // Clear footer, print message, re-render footer
165
+ ctx.footer.clearForOutput();
166
+ if (modelResult.requiresRestart) {
167
+ conversation.printWarning(`Model set to: ${modelResult.modelChanged} (restart required)`);
168
+ }
169
+ else {
170
+ conversation.printSuccess(`Model switched to: ${modelResult.modelChanged}`);
171
+ }
172
+ ctx.footer.forceRender();
173
+ }
174
+ return true;
175
+ },
176
+ };
177
+ // =============================================================================
178
+ // Mascot Command
179
+ // =============================================================================
180
+ export const mascotCommand = {
181
+ name: 'mascot',
182
+ description: 'Change the mascot character',
183
+ async execute(_args, ctx) {
184
+ // Result may be undefined if user cancelled with Esc (base overlay casts undefined to TResult)
185
+ const mascotResult = await showMascotOverlay();
186
+ // Mascot is already persisted by the overlay
187
+ if (mascotResult?.mascotChanged) {
188
+ ctx.footer.clearForOutput();
189
+ conversation.printSuccess(`Mascot changed to: ${mascotResult.mascotChanged}`);
190
+ ctx.footer.forceRender();
191
+ }
192
+ return true;
193
+ },
194
+ };
195
+ // =============================================================================
196
+ // Config Command
197
+ // =============================================================================
198
+ export const configCommand = {
199
+ name: 'config',
200
+ description: 'View settings and configuration',
201
+ async execute(_args, ctx) {
202
+ // Get context stats for usage tab
203
+ const contextManager = ctx.agent.getContextManager();
204
+ const history = ctx.agent.getHistory();
205
+ let contextUsed = 0;
206
+ let contextMax = 200000;
207
+ if (contextManager) {
208
+ const stats = contextManager.getStats(history.length);
209
+ contextUsed = stats.currentTokens;
210
+ contextMax = stats.maxTokens;
211
+ }
212
+ // Loop to handle sub-overlay requests (user can return to config after sub-overlay)
213
+ let continueConfig = true;
214
+ while (continueConfig) {
215
+ const configResult = await showConfigOverlay({
216
+ version: ctx.version,
217
+ cwd: process.cwd(),
218
+ model: ctx.currentModel,
219
+ provider: ctx.provider,
220
+ toolCount: ctx.agent.getToolDefinitions().length,
221
+ startTime: ctx.startTime,
222
+ // Usage stats
223
+ inputTokens: ctx.sessionInputTokens,
224
+ outputTokens: ctx.sessionOutputTokens,
225
+ requests: ctx.sessionRequests,
226
+ contextUsed,
227
+ contextMax,
228
+ messageCount: history.length,
229
+ // Model change callback for hot-switch
230
+ onModelChange: (model) => {
231
+ ctx.setModel(model);
232
+ },
233
+ });
234
+ // Handle sub-overlay requests
235
+ if (configResult.requestSubOverlay === 'theme') {
236
+ const themeResult = await showThemeOverlay();
237
+ if (themeResult.themeChanged) {
238
+ ctx.footer.refreshPrompt();
239
+ }
240
+ // Continue loop to return to config overlay
241
+ }
242
+ else if (configResult.requestSubOverlay === 'model') {
243
+ const modelResult = await showModelOverlay({
244
+ currentModel: ctx.currentModel,
245
+ currentProvider: ctx.provider,
246
+ });
247
+ if (modelResult.modelChanged) {
248
+ ctx.setModel(modelResult.modelChanged);
249
+ }
250
+ // Continue loop to return to config overlay
251
+ }
252
+ else if (configResult.requestSubOverlay === 'mascot') {
253
+ await showMascotOverlay();
254
+ // Continue loop to return to config overlay
255
+ }
256
+ else {
257
+ // No sub-overlay requested, exit the loop
258
+ continueConfig = false;
259
+ // Handle model change result (for hot-switch)
260
+ if (configResult.modelChanged) {
261
+ ctx.setModel(configResult.modelChanged);
262
+ }
263
+ }
264
+ }
265
+ // Refresh prompt in case theme changed
266
+ ctx.footer.refreshPrompt();
267
+ return true;
268
+ },
269
+ };
270
+ // =============================================================================
271
+ // Export All Overlay Commands
272
+ // =============================================================================
273
+ export const overlayCommands = [
274
+ agentsCommand,
275
+ anchorsCommand,
276
+ backlogCommand,
277
+ commandsCommand,
278
+ configCommand,
279
+ docsCommand,
280
+ helpCommand,
281
+ keysCommand,
282
+ mascotCommand,
283
+ modelCommand,
284
+ themeCommand,
285
+ toolsCommand,
286
+ tutorialCommand,
287
+ ];
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Project Commands
3
+ *
4
+ * Commands related to project management:
5
+ * - init: Initialize a new project
6
+ * - projects: Switch between projects
7
+ */
8
+ import type { CommandHandler } from '../handler-types.js';
9
+ export declare const newCommand: CommandHandler;
10
+ export declare const projectsCommand: CommandHandler;
11
+ export declare const projectCommands: CommandHandler[];
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Project Commands
3
+ *
4
+ * Commands related to project management:
5
+ * - init: Initialize a new project
6
+ * - projects: Switch between projects
7
+ */
8
+ import * as conversation from '../../ui/conversation.js';
9
+ import { showNewProjectOverlay } from '../../ui/new-overlay.js';
10
+ import { showProjectsOverlay } from '../../ui/projects-overlay.js';
11
+ import { showWorkflowOverlay } from '../../ui/workflow-overlay.js';
12
+ import { showBacklogOverlay } from '../../ui/backlog-overlay.js';
13
+ import { showAnchorsOverlay } from '../../ui/anchors-overlay.js';
14
+ import { showDocsOverlay } from '../../ui/docs-overlay.js';
15
+ import { projectRepository } from '../../db/repositories/index.js';
16
+ import { setActiveProject, getActiveProject } from '../../tools/project-db.js';
17
+ // =============================================================================
18
+ // New Command
19
+ // =============================================================================
20
+ export const newCommand = {
21
+ name: 'new',
22
+ description: 'Create a new project',
23
+ async execute(_args, ctx) {
24
+ // Pause footer during overlay (command overlay - we handle footer ourselves)
25
+ ctx.footer.pauseAnimation();
26
+ // Result may be undefined if user cancelled with Esc
27
+ const newProjectResult = await showNewProjectOverlay();
28
+ // Resume footer if user cancelled (no project created)
29
+ if (!newProjectResult?.created) {
30
+ ctx.footer.resumeAnimation();
31
+ return true;
32
+ }
33
+ // Project was created - continue with success handling
34
+ // Show success message with created files info
35
+ conversation.printSuccess(`Project created: ${newProjectResult.projectPath ?? ''}`);
36
+ if (newProjectResult.docsPath) {
37
+ conversation.printSuccess(`Docs repo created: ${newProjectResult.docsPath}`);
38
+ }
39
+ // Register project in database if tracking is enabled
40
+ if (newProjectResult.trackInDatabase && newProjectResult.projectName && newProjectResult.projectPath) {
41
+ try {
42
+ const project = projectRepository.create({
43
+ name: newProjectResult.projectName,
44
+ display_name: newProjectResult.projectName.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()),
45
+ description: newProjectResult.description,
46
+ path: newProjectResult.projectPath,
47
+ type: 'general',
48
+ workflow_mode: newProjectResult.workflowMode ?? 'flexible',
49
+ });
50
+ setActiveProject({ id: project.id, name: project.name, displayName: project.displayName, path: project.path });
51
+ conversation.printSuccess(`Project tracked in database (${newProjectResult.workflowMode ?? 'flexible'} mode)`);
52
+ }
53
+ catch (dbError) {
54
+ conversation.printWarning(`Could not register in database: ${dbError.message}`);
55
+ }
56
+ }
57
+ conversation.printInfo('');
58
+ conversation.printInfo('Next steps:');
59
+ conversation.printInfo(` cd ${newProjectResult.projectPath?.split('/').pop() ?? 'project'}`);
60
+ conversation.printInfo(' npm install');
61
+ conversation.printInfo(' npm run dev');
62
+ conversation.printInfo('');
63
+ // Resume footer animation before processing message
64
+ ctx.footer.resumeAnimation();
65
+ // Ask agent to read the COMPILR.md and understand the project
66
+ const compilrMdPath = newProjectResult.docsPath
67
+ ? `${newProjectResult.docsPath}/COMPILR.md`
68
+ : `${newProjectResult.projectPath ?? '.'}/COMPILR.md`;
69
+ await ctx.processMessage(`I just created a new project using /new. Please read ${compilrMdPath} to understand the project context and confirm you're ready to help me build it.
70
+
71
+ (Note to user: When you want to define requirements and populate the backlog, type /design)`);
72
+ return true;
73
+ },
74
+ };
75
+ // =============================================================================
76
+ // Projects Command
77
+ // =============================================================================
78
+ export const projectsCommand = {
79
+ name: 'projects',
80
+ description: 'Switch between projects',
81
+ async execute(_args, ctx) {
82
+ // Remember old project for anchor cleanup
83
+ const oldProject = getActiveProject();
84
+ const oldProjectId = oldProject ? String(oldProject.id) : null;
85
+ // Loop between projects and workflow overlays
86
+ // User can: projects → workflow → back to projects → workflow → etc.
87
+ let stayInProjects = true;
88
+ while (stayInProjects) {
89
+ const projectsResult = await showProjectsOverlay();
90
+ if (projectsResult.action === 'open-workflow' && projectsResult.projectId) {
91
+ // Inner loop: workflow → view command → back to workflow
92
+ let stayInWorkflow = true;
93
+ while (stayInWorkflow) {
94
+ const workflowResult = await showWorkflowOverlay(projectsResult.projectId);
95
+ if (workflowResult.command) {
96
+ const cmd = workflowResult.command.replace(/^\//, '');
97
+ // Handle "view" commands within workflow loop
98
+ if (cmd === 'backlog') {
99
+ await showBacklogOverlay();
100
+ // After backlog closes, loop back to workflow
101
+ }
102
+ else if (cmd === 'anchors') {
103
+ await showAnchorsOverlay();
104
+ // After anchors closes, loop back to workflow
105
+ }
106
+ else if (cmd === 'docs') {
107
+ await showDocsOverlay();
108
+ // After docs closes, loop back to workflow
109
+ }
110
+ else {
111
+ // Other commands (design, build, scaffold, etc.) - set project and handle
112
+ const project = projectRepository.getById(projectsResult.projectId);
113
+ if (project) {
114
+ // Set as active project
115
+ setActiveProject({
116
+ id: project.id,
117
+ name: project.name,
118
+ displayName: project.displayName,
119
+ path: project.path,
120
+ });
121
+ projectRepository.touch(project.id);
122
+ // Update footer with new project name
123
+ ctx.footer.setProjectName(project.displayName);
124
+ // Reload project-specific anchors (hot-reload)
125
+ ctx.reloadProjectAnchors(oldProjectId, String(project.id));
126
+ conversation.printSuccess(`Project "${project.displayName}" set as active`);
127
+ conversation.printInfo('');
128
+ // Handle the command
129
+ await ctx.handleCommand(cmd, '');
130
+ }
131
+ stayInWorkflow = false;
132
+ stayInProjects = false;
133
+ }
134
+ }
135
+ else if (workflowResult.action) {
136
+ // Handle manage actions (edit, delete)
137
+ const project = projectRepository.getById(projectsResult.projectId);
138
+ if (workflowResult.action === 'delete' && project) {
139
+ conversation.printWarning(`Delete "${project.displayName}" via /projects (x to archive, d to delete)`);
140
+ }
141
+ else if (workflowResult.action === 'edit' && project) {
142
+ conversation.printInfo(`Edit is not yet implemented. Use /projects to manage projects.`);
143
+ }
144
+ stayInWorkflow = false;
145
+ stayInProjects = false;
146
+ }
147
+ else {
148
+ // Workflow cancelled (Esc), go back to projects list
149
+ stayInWorkflow = false;
150
+ }
151
+ }
152
+ }
153
+ else {
154
+ // Projects cancelled (Esc), exit loop
155
+ stayInProjects = false;
156
+ }
157
+ }
158
+ return true;
159
+ },
160
+ };
161
+ // =============================================================================
162
+ // Export All Project Commands
163
+ // =============================================================================
164
+ export const projectCommands = [
165
+ newCommand,
166
+ projectsCommand,
167
+ ];
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Simple Commands
3
+ *
4
+ * Handles straightforward commands that don't require complex logic:
5
+ * - exit/quit/q - Exit the REPL
6
+ * - plan - Switch to plan mode
7
+ */
8
+ import type { CommandHandler } from '../handler-types.js';
9
+ export declare const exitCommand: CommandHandler;
10
+ export declare const planCommand: CommandHandler;
11
+ export declare const menuCommand: CommandHandler;
12
+ export declare const clearCommand: CommandHandler;
13
+ export declare const statusCommand: CommandHandler;
14
+ export declare const tokensCommand: CommandHandler;
15
+ export declare const contextCommand: CommandHandler;
16
+ export declare const todosCommand: CommandHandler;
17
+ export declare const compactCommand: CommandHandler;
18
+ export declare const exportCommand: CommandHandler;
19
+ export declare const simpleCommands: CommandHandler[];
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Simple Commands
3
+ *
4
+ * Handles straightforward commands that don't require complex logic:
5
+ * - exit/quit/q - Exit the REPL
6
+ * - plan - Switch to plan mode
7
+ */
8
+ import * as conversation from '../../ui/conversation.js';
9
+ import * as terminal from '../../ui/terminal.js';
10
+ import { getActiveProject } from '../../tools/project-db.js';
11
+ // =============================================================================
12
+ // Exit Command
13
+ // =============================================================================
14
+ export const exitCommand = {
15
+ name: 'exit',
16
+ aliases: ['quit', 'q'],
17
+ description: 'Exit the REPL',
18
+ execute(_args, _ctx) {
19
+ // Return false to signal REPL should exit
20
+ return Promise.resolve(false);
21
+ },
22
+ };
23
+ // =============================================================================
24
+ // Plan Command
25
+ // =============================================================================
26
+ export const planCommand = {
27
+ name: 'plan',
28
+ description: 'Switch to Plan mode (agent creates plans without executing)',
29
+ execute(_args, ctx) {
30
+ ctx.footer.setMode('plan');
31
+ if (ctx.onModeChange) {
32
+ ctx.onModeChange('plan');
33
+ }
34
+ conversation.printInfo('📋 Switched to Plan mode');
35
+ conversation.printInfo('The agent will create execution plans without performing actions.');
36
+ conversation.printInfo('Use Shift+Tab to switch back to Normal or Auto-accept mode.');
37
+ return Promise.resolve(true);
38
+ },
39
+ };
40
+ // =============================================================================
41
+ // Menu Command
42
+ // =============================================================================
43
+ export const menuCommand = {
44
+ name: 'menu',
45
+ description: 'Return to the startup menu',
46
+ execute(_args, ctx) {
47
+ // Signal that we want to return to the startup menu
48
+ ctx.setShouldReturnToMenu(true);
49
+ return Promise.resolve(false); // Exit REPL to return to menu
50
+ },
51
+ };
52
+ // =============================================================================
53
+ // Clear Command
54
+ // =============================================================================
55
+ export const clearCommand = {
56
+ name: 'clear',
57
+ description: 'Clear the screen',
58
+ execute(_args, ctx) {
59
+ terminal.clearScreen();
60
+ conversation.printWelcome(ctx.model, ctx.version, getActiveProject()?.displayName ?? null);
61
+ return Promise.resolve(true);
62
+ },
63
+ };
64
+ // =============================================================================
65
+ // Status Command
66
+ // =============================================================================
67
+ export const statusCommand = {
68
+ name: 'status',
69
+ description: 'Show session status',
70
+ execute(_args, ctx) {
71
+ ctx.showStatus();
72
+ return Promise.resolve(true);
73
+ },
74
+ };
75
+ // =============================================================================
76
+ // Tokens Command
77
+ // =============================================================================
78
+ export const tokensCommand = {
79
+ name: 'tokens',
80
+ description: 'Show token usage',
81
+ execute(_args, ctx) {
82
+ ctx.showTokens();
83
+ return Promise.resolve(true);
84
+ },
85
+ };
86
+ // =============================================================================
87
+ // Context Command
88
+ // =============================================================================
89
+ export const contextCommand = {
90
+ name: 'context',
91
+ description: 'Show context statistics',
92
+ execute(_args, ctx) {
93
+ ctx.showContext();
94
+ return Promise.resolve(true);
95
+ },
96
+ };
97
+ // =============================================================================
98
+ // Todos Command
99
+ // =============================================================================
100
+ export const todosCommand = {
101
+ name: 'todos',
102
+ description: 'Show current todo list',
103
+ execute(_args, ctx) {
104
+ ctx.showTodos();
105
+ return Promise.resolve(true);
106
+ },
107
+ };
108
+ // =============================================================================
109
+ // Compact Command
110
+ // =============================================================================
111
+ export const compactCommand = {
112
+ name: 'compact',
113
+ description: 'Compact the conversation context',
114
+ async execute(_args, ctx) {
115
+ await ctx.handleCompact();
116
+ return true;
117
+ },
118
+ };
119
+ // =============================================================================
120
+ // Export Command
121
+ // =============================================================================
122
+ export const exportCommand = {
123
+ name: 'export',
124
+ description: 'Export the conversation',
125
+ async execute(args, ctx) {
126
+ await ctx.handleExport(args);
127
+ return true;
128
+ },
129
+ };
130
+ // =============================================================================
131
+ // Export All Simple Commands
132
+ // =============================================================================
133
+ export const simpleCommands = [
134
+ exitCommand,
135
+ planCommand,
136
+ menuCommand,
137
+ clearCommand,
138
+ statusCommand,
139
+ tokensCommand,
140
+ contextCommand,
141
+ todosCommand,
142
+ compactCommand,
143
+ exportCommand,
144
+ ];
@@ -3,5 +3,6 @@
3
3
  *
4
4
  * Exports custom command types and registry.
5
5
  */
6
- export { CustomCommand, CommandLocation, PROJECT_COMMANDS_DIR, USER_COMMANDS_DIR, isValidCommandName, } from './types.js';
6
+ export type { CustomCommand, CommandLocation } from './types.js';
7
+ export { PROJECT_COMMANDS_DIR, USER_COMMANDS_DIR, isValidCommandName, } from './types.js';
7
8
  export { CustomCommandRegistry, getCustomCommandRegistry, resetCustomCommandRegistry, expandArguments, } from './custom-registry.js';