@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,43 @@
1
+ /**
2
+ * Guardrail Confirmation Overlay V2
3
+ *
4
+ * Shows when a guardrail with action='confirm' is triggered.
5
+ * User must approve or deny the risky operation.
6
+ * Uses BaseOverlayV2 for TerminalUI integration.
7
+ */
8
+ import { BaseOverlayV2 } from '../../base/index.js';
9
+ import type { RenderContext, OverlayAction, KeyEvent } from '../types.js';
10
+ interface GuardrailState {
11
+ selectedIndex: number;
12
+ }
13
+ export interface GuardrailConfirmOptionsV2 {
14
+ /** Guardrail name */
15
+ name: string;
16
+ /** Guardrail description/message */
17
+ message: string;
18
+ /** Action type (for display) */
19
+ action: 'warn' | 'confirm' | 'block';
20
+ /** Tool that triggered the guardrail */
21
+ toolName: string;
22
+ /** The input that matched the pattern */
23
+ matchedInput: string;
24
+ /** Category (e.g., 'git', 'filesystem', 'database') */
25
+ category?: string;
26
+ }
27
+ export interface GuardrailConfirmResultV2 {
28
+ /** Whether to proceed with the operation */
29
+ approved: boolean;
30
+ }
31
+ export declare class GuardrailOverlayV2 extends BaseOverlayV2<GuardrailState, GuardrailConfirmResultV2> {
32
+ readonly type: "inline";
33
+ readonly id = "guardrail-overlay-v2";
34
+ private readonly options;
35
+ constructor(options: GuardrailConfirmOptionsV2);
36
+ protected renderContent(context: RenderContext): string[];
37
+ handleKey(key: KeyEvent): OverlayAction<GuardrailConfirmResultV2>;
38
+ /**
39
+ * Summary shown after overlay closes.
40
+ */
41
+ getCloseSummary(result: GuardrailConfirmResultV2): string | null;
42
+ }
43
+ export {};
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Guardrail Confirmation Overlay V2
3
+ *
4
+ * Shows when a guardrail with action='confirm' is triggered.
5
+ * User must approve or deny the risky operation.
6
+ * Uses BaseOverlayV2 for TerminalUI integration.
7
+ */
8
+ import chalk from 'chalk';
9
+ import { BaseOverlayV2, renderBorder, wrapText } from '../../base/index.js';
10
+ // =============================================================================
11
+ // Overlay Implementation
12
+ // =============================================================================
13
+ export class GuardrailOverlayV2 extends BaseOverlayV2 {
14
+ type = 'inline';
15
+ id = 'guardrail-overlay-v2';
16
+ options;
17
+ constructor(options) {
18
+ super({
19
+ selectedIndex: 0, // Default to Deny (safer)
20
+ });
21
+ this.options = options;
22
+ this.minHeight = 15; // Prevent jitter
23
+ }
24
+ renderContent(context) {
25
+ const s = context.styles;
26
+ const lines = [];
27
+ const cols = context.width;
28
+ const border = renderBorder(cols, s);
29
+ // Header with warning icon
30
+ lines.push(border);
31
+ lines.push(' ' + s.warning('! Risky Operation Detected'));
32
+ lines.push('');
33
+ // Guardrail info
34
+ const category = this.options.category ? `[${this.options.category}]` : '';
35
+ lines.push(s.muted(` ${category} `) + chalk.bold(this.options.name));
36
+ lines.push('');
37
+ // Message
38
+ const msgLines = wrapText(this.options.message, cols - 4);
39
+ for (const line of msgLines) {
40
+ lines.push(' ' + s.muted(line));
41
+ }
42
+ lines.push('');
43
+ // Tool and matched input
44
+ lines.push(s.muted(' Tool: ') + s.primary(this.options.toolName));
45
+ // Show truncated matched input
46
+ const maxInputLen = cols - 12;
47
+ let displayInput = this.options.matchedInput;
48
+ if (displayInput.length > maxInputLen) {
49
+ displayInput = displayInput.substring(0, maxInputLen - 3) + '...';
50
+ }
51
+ // Replace newlines with visible markers
52
+ displayInput = displayInput.replace(/\n/g, '↵');
53
+ lines.push(s.muted(' Match: ') + s.warning(displayInput));
54
+ lines.push('');
55
+ // Action buttons
56
+ const denyLabel = this.state.selectedIndex === 0
57
+ ? s.error(' > Deny ')
58
+ : s.muted(' Deny ');
59
+ const allowLabel = this.state.selectedIndex === 1
60
+ ? s.warning(' > Allow ')
61
+ : s.muted(' Allow ');
62
+ lines.push(' ' + denyLabel + ' ' + allowLabel);
63
+ lines.push('');
64
+ // Footer
65
+ lines.push(s.muted(' Left/Right Select | Enter Confirm | Esc Deny'));
66
+ lines.push(border);
67
+ return lines;
68
+ }
69
+ handleKey(key) {
70
+ // Ctrl+C or Escape = Deny
71
+ if ((key.ctrl && key.name === 'c') || key.name === 'escape') {
72
+ return this.close({ approved: false });
73
+ }
74
+ // Left arrow or h for Deny
75
+ if (key.name === 'left' || key.char === 'h') {
76
+ this.state.selectedIndex = 0;
77
+ return this.rerender();
78
+ }
79
+ // Right arrow or l for Allow
80
+ if (key.name === 'right' || key.char === 'l') {
81
+ this.state.selectedIndex = 1;
82
+ return this.rerender();
83
+ }
84
+ // Tab to toggle
85
+ if (key.name === 'tab') {
86
+ this.state.selectedIndex = this.state.selectedIndex === 0 ? 1 : 0;
87
+ return this.rerender();
88
+ }
89
+ // Enter to confirm selection
90
+ if (key.name === 'return') {
91
+ return this.close({ approved: this.state.selectedIndex === 1 });
92
+ }
93
+ // 'd' or 'n' for Deny
94
+ const keyChar = key.char?.toLowerCase() ?? '';
95
+ if (keyChar === 'd' || keyChar === 'n') {
96
+ return this.close({ approved: false });
97
+ }
98
+ // 'a' or 'y' for Allow
99
+ if (keyChar === 'a' || keyChar === 'y') {
100
+ return this.close({ approved: true });
101
+ }
102
+ return this.noAction();
103
+ }
104
+ /**
105
+ * Summary shown after overlay closes.
106
+ */
107
+ getCloseSummary(result) {
108
+ const s = this.getStyles();
109
+ if (result.approved) {
110
+ return s.muted('Guardrail: ') + s.warning('Allowed ') + s.muted(this.options.name);
111
+ }
112
+ return s.muted('Guardrail: ') + s.error('Denied ') + s.muted(this.options.name);
113
+ }
114
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Help Overlay V2
3
+ *
4
+ * Displays available commands in a searchable, categorized list.
5
+ * Uses TabbedListOverlayV2 for the new Overlay interface.
6
+ *
7
+ * Features:
8
+ * - Tabs: All, Built-in, Custom
9
+ * - Search with / toggle
10
+ * - Detail view for full command information
11
+ * - Works with TerminalUI's overlay management
12
+ */
13
+ import { TabbedListOverlayV2, BaseScreen } from '../../base/index.js';
14
+ interface HelpItem {
15
+ name: string;
16
+ description: string;
17
+ type: 'builtin' | 'custom';
18
+ /** For custom commands */
19
+ prompt?: string;
20
+ location?: 'project' | 'personal';
21
+ /** Index in COMMANDS array for built-in commands */
22
+ commandIndex?: number;
23
+ }
24
+ /**
25
+ * Help overlay using the new Overlay interface.
26
+ * Displays available commands in a searchable, tabbed list.
27
+ */
28
+ export declare class HelpOverlayV2 extends TabbedListOverlayV2<HelpItem> {
29
+ readonly type: "inline";
30
+ readonly id = "help-overlay-v2";
31
+ constructor();
32
+ protected createDetailScreen(item: HelpItem): BaseScreen | null;
33
+ }
34
+ export {};
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Help Overlay V2
3
+ *
4
+ * Displays available commands in a searchable, categorized list.
5
+ * Uses TabbedListOverlayV2 for the new Overlay interface.
6
+ *
7
+ * Features:
8
+ * - Tabs: All, Built-in, Custom
9
+ * - Search with / toggle
10
+ * - Detail view for full command information
11
+ * - Works with TerminalUI's overlay management
12
+ */
13
+ import chalk from 'chalk';
14
+ import * as terminal from '../../terminal.js';
15
+ import { getHelpCommands, getCommandByIndex } from '../../../commands.js';
16
+ import { getCustomCommandRegistry } from '../../../commands/index.js';
17
+ import { TabbedListOverlayV2, BaseScreen, stay, popScreen, closeOverlay, isEscape, isCtrlC, isClose, renderBorder, wrapText, } from '../../base/index.js';
18
+ // =============================================================================
19
+ // Constants
20
+ // =============================================================================
21
+ const VERSION = 'compilr.dev/agent';
22
+ const PAGE_SIZE = 10;
23
+ const TABS = [
24
+ { id: 'all', label: 'All' },
25
+ { id: 'builtin', label: 'Built-in' },
26
+ { id: 'custom', label: 'Custom' },
27
+ ];
28
+ // =============================================================================
29
+ // Detail Screens
30
+ // =============================================================================
31
+ /**
32
+ * Built-in command detail screen
33
+ */
34
+ class CommandDetailScreen extends BaseScreen {
35
+ item;
36
+ styles;
37
+ constructor(item, styles) {
38
+ super();
39
+ this.item = item;
40
+ this.styles = styles;
41
+ }
42
+ render() {
43
+ const s = this.styles;
44
+ const cols = terminal.getTerminalWidth();
45
+ const maxLineWidth = cols - 2;
46
+ const border = renderBorder(cols, s);
47
+ const cmd = this.item.commandIndex !== undefined
48
+ ? getCommandByIndex(this.item.commandIndex)
49
+ : null;
50
+ const lines = [];
51
+ lines.push(border);
52
+ lines.push(' ' + s.primaryBold('Command Reference'));
53
+ lines.push('');
54
+ if (!cmd) {
55
+ lines.push(s.error(' Command not found'));
56
+ lines.push(border);
57
+ lines.push(` ${s.muted('q/Esc Back')}`);
58
+ lines.push(border);
59
+ return lines;
60
+ }
61
+ // Helper to truncate
62
+ const truncate = (line, max = maxLineWidth) => {
63
+ // eslint-disable-next-line no-control-regex
64
+ const stripped = line.replace(/\x1b\[[0-9;]*m/g, '');
65
+ if (stripped.length <= max)
66
+ return line;
67
+ let visibleLen = 0;
68
+ let cutIndex = 0;
69
+ for (let i = 0; i < line.length; i++) {
70
+ if (line[i] === '\x1b') {
71
+ const end = line.indexOf('m', i);
72
+ if (end !== -1) {
73
+ i = end;
74
+ continue;
75
+ }
76
+ }
77
+ visibleLen++;
78
+ if (visibleLen >= max - 3) {
79
+ cutIndex = i + 1;
80
+ break;
81
+ }
82
+ }
83
+ return line.slice(0, cutIndex) + '...';
84
+ };
85
+ // Command name
86
+ lines.push(chalk.bold(` /${cmd.name}`));
87
+ lines.push('');
88
+ // Description
89
+ lines.push(' ' + s.primary('DESCRIPTION'));
90
+ lines.push(truncate(' ' + cmd.description));
91
+ lines.push('');
92
+ // Details
93
+ if (cmd.details) {
94
+ lines.push(' ' + s.primary('ABOUT'));
95
+ const maxWidth = Math.min(cols - 6, 70);
96
+ const words = cmd.details.split(' ');
97
+ let currentLine = ' ';
98
+ for (const word of words) {
99
+ if (currentLine.length + word.length + 1 > maxWidth) {
100
+ lines.push(truncate(currentLine));
101
+ currentLine = ' ' + word;
102
+ }
103
+ else {
104
+ currentLine += (currentLine.length > 3 ? ' ' : '') + word;
105
+ }
106
+ }
107
+ if (currentLine.length > 3) {
108
+ lines.push(truncate(currentLine));
109
+ }
110
+ lines.push('');
111
+ }
112
+ // Aliases
113
+ if (cmd.aliases && cmd.aliases.length > 0) {
114
+ lines.push(' ' + s.primary('ALIASES'));
115
+ lines.push(truncate(' ' + cmd.aliases.map((a) => `/${a}`).join(', ')));
116
+ lines.push('');
117
+ }
118
+ // Examples
119
+ if (cmd.examples && cmd.examples.length > 0) {
120
+ lines.push(' ' + s.primary('EXAMPLES'));
121
+ for (const example of cmd.examples) {
122
+ if (example.description) {
123
+ const paddedCode = example.code.padEnd(22);
124
+ const exLine = ` ${s.muted(paddedCode)}${s.muted('·')} ${example.description}`;
125
+ lines.push(truncate(exLine));
126
+ }
127
+ else {
128
+ lines.push(truncate(' ' + s.muted(example.code)));
129
+ }
130
+ }
131
+ lines.push('');
132
+ }
133
+ // Interactions
134
+ if (cmd.interactions && cmd.interactions.length > 0) {
135
+ lines.push(' ' + s.primary('INTERACTIONS'));
136
+ for (const hint of cmd.interactions) {
137
+ lines.push(truncate(' ' + s.muted('• ' + hint)));
138
+ }
139
+ lines.push('');
140
+ }
141
+ // Footer
142
+ lines.push(border);
143
+ lines.push(` ${s.muted('q/Esc Back')}`);
144
+ lines.push(border);
145
+ return lines;
146
+ }
147
+ handleKey(data) {
148
+ if (isCtrlC(data)) {
149
+ return closeOverlay(undefined);
150
+ }
151
+ if (isEscape(data) || isClose(data)) {
152
+ return popScreen();
153
+ }
154
+ return stay(false);
155
+ }
156
+ /**
157
+ * Minimum height for stable rendering.
158
+ * Covers: header(3) + name(2) + desc(3) + about(5) + aliases(3) + examples(6) + interactions(4) + footer(3) = 29
159
+ */
160
+ getMinHeight() {
161
+ return 25;
162
+ }
163
+ }
164
+ /**
165
+ * Custom command detail screen
166
+ */
167
+ class CustomCommandDetailScreen extends BaseScreen {
168
+ item;
169
+ styles;
170
+ constructor(item, styles) {
171
+ super();
172
+ this.item = item;
173
+ this.styles = styles;
174
+ }
175
+ render() {
176
+ const s = this.styles;
177
+ const cols = terminal.getTerminalWidth();
178
+ const border = renderBorder(cols, s);
179
+ const registry = getCustomCommandRegistry();
180
+ const lines = [];
181
+ lines.push(border);
182
+ lines.push(' ' + s.primaryBold('Custom Command Details'));
183
+ lines.push('');
184
+ // Command name
185
+ lines.push(chalk.bold(` /${this.item.name}`));
186
+ lines.push('');
187
+ // Location
188
+ lines.push(' ' + s.primary('LOCATION'));
189
+ const loc = this.item.location ?? 'personal';
190
+ lines.push(` ${loc === 'project' ? 'Project' : 'Personal'} (${loc})`);
191
+ lines.push('');
192
+ // File path
193
+ lines.push(' ' + s.primary('FILE'));
194
+ const basePath = loc === 'project'
195
+ ? registry.getProjectDir()
196
+ : registry.getUserDir();
197
+ lines.push(s.muted(` ${basePath}/${this.item.name}.md`));
198
+ lines.push('');
199
+ // Description
200
+ lines.push(' ' + s.primary('DESCRIPTION'));
201
+ lines.push(...wrapText(this.item.description, cols - 6, ' '));
202
+ lines.push('');
203
+ // Prompt
204
+ if (this.item.prompt) {
205
+ lines.push(' ' + s.primary('PROMPT TEMPLATE'));
206
+ lines.push(...wrapText(this.item.prompt, cols - 6, ' '));
207
+ lines.push('');
208
+ }
209
+ // Footer
210
+ lines.push(border);
211
+ lines.push(` ${s.muted('q/Esc Back')}`);
212
+ lines.push(border);
213
+ return lines;
214
+ }
215
+ handleKey(data) {
216
+ if (isCtrlC(data)) {
217
+ return closeOverlay(undefined);
218
+ }
219
+ if (isEscape(data) || isClose(data)) {
220
+ return popScreen();
221
+ }
222
+ return stay(false);
223
+ }
224
+ /**
225
+ * Minimum height for stable rendering.
226
+ * Covers: header(3) + name(2) + location(3) + file(3) + desc(5) + prompt(5) + footer(3) = 24
227
+ */
228
+ getMinHeight() {
229
+ return 22;
230
+ }
231
+ }
232
+ // =============================================================================
233
+ // Help Overlay V2 Class
234
+ // =============================================================================
235
+ /**
236
+ * Help overlay using the new Overlay interface.
237
+ * Displays available commands in a searchable, tabbed list.
238
+ */
239
+ export class HelpOverlayV2 extends TabbedListOverlayV2 {
240
+ type = 'inline';
241
+ id = 'help-overlay-v2';
242
+ constructor() {
243
+ // Build unified items list
244
+ const items = [];
245
+ // Add built-in commands
246
+ const helpCommands = getHelpCommands();
247
+ for (let i = 0; i < helpCommands.length; i++) {
248
+ const cmd = helpCommands[i];
249
+ items.push({
250
+ name: cmd.name,
251
+ description: cmd.description,
252
+ type: 'builtin',
253
+ commandIndex: i,
254
+ });
255
+ }
256
+ // Add custom commands
257
+ const registry = getCustomCommandRegistry();
258
+ const customCommands = registry.getAll();
259
+ for (const cmd of customCommands) {
260
+ items.push({
261
+ name: `/${cmd.name}`,
262
+ description: cmd.description,
263
+ type: 'custom',
264
+ prompt: cmd.prompt,
265
+ location: cmd.location,
266
+ });
267
+ }
268
+ super({
269
+ title: VERSION,
270
+ tabs: TABS,
271
+ items,
272
+ pageSize: PAGE_SIZE,
273
+ filterByTab: (item, tabId) => {
274
+ if (tabId === 'all')
275
+ return true;
276
+ if (tabId === 'builtin')
277
+ return item.type === 'builtin';
278
+ if (tabId === 'custom')
279
+ return item.type === 'custom';
280
+ return true;
281
+ },
282
+ getSearchText: (item) => `${item.name} ${item.description}`,
283
+ renderItem: (item, isSelected, styles) => {
284
+ const prefix = isSelected ? styles.primary(' > ') : ' ';
285
+ const name = isSelected
286
+ ? styles.primary(item.name.padEnd(20))
287
+ : styles.muted(item.name.padEnd(20));
288
+ const desc = styles.muted(item.description);
289
+ const badge = item.type === 'custom' ? styles.muted(' (custom)') : '';
290
+ return prefix + name + desc + badge;
291
+ },
292
+ footerHints: (searchMode) => {
293
+ if (searchMode) {
294
+ return 'Type to filter · ↑↓/jk Navigate · Enter Details · Esc Exit search';
295
+ }
296
+ return 'Tab Filter · ↑↓/jk · ←→/hl Pages · / Search · Enter Details · q/Esc Close';
297
+ },
298
+ emptyMessage: 'No commands available.',
299
+ noResultsMessage: 'No commands match the search.',
300
+ });
301
+ }
302
+ createDetailScreen(item) {
303
+ const styles = this.getStyles();
304
+ if (item.type === 'builtin') {
305
+ return new CommandDetailScreen(item, styles);
306
+ }
307
+ return new CustomCommandDetailScreen(item, styles);
308
+ }
309
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Init Overlay V2
3
+ *
4
+ * Modal overlay for the /init wizard - creates new projects with structured workflow.
5
+ * Uses BaseOverlayV2 for TerminalUI integration.
6
+ *
7
+ * Steps:
8
+ * 0. Project type (new vs existing)
9
+ * 1. Project name
10
+ * 2. Description
11
+ * 3. Repo pattern (single vs two-repo)
12
+ * 4. Tech stack
13
+ * 5. Coding standards
14
+ * 6. Initialize git?
15
+ * 7. Track with project database?
16
+ * 8. Workflow mode (if tracking enabled)
17
+ * 9. Confirmation
18
+ */
19
+ import { BaseOverlayV2 } from '../../base/index.js';
20
+ import type { RenderContext, OverlayAction, KeyEvent } from '../types.js';
21
+ import { type TechStack, type CodingStandards, type RepoPattern } from '../../../templates/index.js';
22
+ type WizardStep = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
23
+ type WorkflowMode = 'flexible' | 'guided';
24
+ interface InitState {
25
+ step: WizardStep;
26
+ projectType: 'new' | 'existing' | null;
27
+ projectName: string;
28
+ description: string;
29
+ repoPattern: RepoPattern | null;
30
+ techStack: TechStack | null;
31
+ codingStandards: CodingStandards | null;
32
+ initGit: boolean;
33
+ trackInDatabase: boolean;
34
+ workflowMode: WorkflowMode;
35
+ selectedIndex: number;
36
+ inputBuffer: string;
37
+ error: string | null;
38
+ isGenerating: boolean;
39
+ }
40
+ export interface InitResultV2 {
41
+ created: boolean;
42
+ projectPath?: string;
43
+ docsPath?: string;
44
+ filesCreated?: string[];
45
+ trackInDatabase?: boolean;
46
+ workflowMode?: WorkflowMode;
47
+ projectName?: string;
48
+ description?: string;
49
+ }
50
+ export declare class InitOverlayV2 extends BaseOverlayV2<InitState, InitResultV2> {
51
+ readonly type: "inline";
52
+ readonly id = "init-overlay-v2";
53
+ constructor();
54
+ protected renderContent(context: RenderContext): string[];
55
+ private renderGenerating;
56
+ private renderStepFooter;
57
+ private renderSelectionOption;
58
+ private renderStep0;
59
+ private renderStep1;
60
+ private renderStep2;
61
+ private renderStep3;
62
+ private renderStep4;
63
+ private renderStep5;
64
+ private renderStep6;
65
+ private renderStep7;
66
+ private renderStep8;
67
+ private renderStep9;
68
+ handleKey(key: KeyEvent): OverlayAction<InitResultV2> | Promise<OverlayAction<InitResultV2>>;
69
+ private handleSelectionKey;
70
+ private handleSelectionEnter;
71
+ private handleInputKey;
72
+ private nextStep;
73
+ private prevStep;
74
+ private validateInput;
75
+ getCloseSummary(result: InitResultV2): string | null;
76
+ }
77
+ export {};