@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,145 @@
1
+ /**
2
+ * Guardrail Confirmation Overlay
3
+ *
4
+ * Shows when a guardrail with action='confirm' is triggered.
5
+ * User must approve or deny the risky operation.
6
+ */
7
+ import chalk from 'chalk';
8
+ import { getStyles } from '../themes/index.js';
9
+ import { InlineOverlay } from './base/inline-overlay.js';
10
+ // =============================================================================
11
+ // Overlay Implementation
12
+ // =============================================================================
13
+ class GuardrailOverlayImpl extends InlineOverlay {
14
+ options;
15
+ constructor(options) {
16
+ super();
17
+ this.options = options;
18
+ }
19
+ getInitialState() {
20
+ return {
21
+ selectedIndex: 0, // Default to Deny (safer)
22
+ };
23
+ }
24
+ render() {
25
+ const s = getStyles();
26
+ const lines = [];
27
+ const cols = this.getTerminalWidth();
28
+ const border = s.muted('─'.repeat(Math.max(1, cols - 1)));
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 = this.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(' ←/→ Select · Enter Confirm · Esc Deny'));
66
+ lines.push(border);
67
+ return lines;
68
+ }
69
+ handleKey(data) {
70
+ // Ctrl+C or Escape = Deny
71
+ if (this.isCtrlCKey(data) || this.isEscapeKey(data)) {
72
+ return { type: 'close', result: { approved: false } };
73
+ }
74
+ // Left/Right arrows or h/l for navigation
75
+ if (this.isLeftArrowKey(data) || data.toString() === 'h') {
76
+ this.state.selectedIndex = 0;
77
+ return { type: 'continue' };
78
+ }
79
+ if (this.isRightArrowKey(data) || data.toString() === 'l') {
80
+ this.state.selectedIndex = 1;
81
+ return { type: 'continue' };
82
+ }
83
+ // Tab to toggle
84
+ if (this.isTabKey(data)) {
85
+ this.state.selectedIndex = this.state.selectedIndex === 0 ? 1 : 0;
86
+ return { type: 'continue' };
87
+ }
88
+ // Enter to confirm selection
89
+ if (this.isEnterKey(data)) {
90
+ return {
91
+ type: 'close',
92
+ result: { approved: this.state.selectedIndex === 1 },
93
+ };
94
+ }
95
+ // 'd' or 'n' for Deny
96
+ const keyStr = data.toString().toLowerCase();
97
+ if (keyStr === 'd' || keyStr === 'n') {
98
+ return { type: 'close', result: { approved: false } };
99
+ }
100
+ // 'a' or 'y' for Allow
101
+ if (keyStr === 'a' || keyStr === 'y') {
102
+ return { type: 'close', result: { approved: true } };
103
+ }
104
+ return { type: 'continue' };
105
+ }
106
+ getCleanupSummary(result) {
107
+ const s = getStyles();
108
+ if (result.approved) {
109
+ return s.muted('Guardrail: ') + s.warning('Allowed ') + s.muted(this.options.name);
110
+ }
111
+ return s.muted('Guardrail: ') + s.error('Denied ') + s.muted(this.options.name);
112
+ }
113
+ /**
114
+ * Wrap text to fit within maxWidth
115
+ */
116
+ wrapText(text, maxWidth) {
117
+ const words = text.split(' ');
118
+ const lines = [];
119
+ let currentLine = '';
120
+ for (const word of words) {
121
+ if (currentLine.length + word.length + 1 <= maxWidth) {
122
+ currentLine += (currentLine ? ' ' : '') + word;
123
+ }
124
+ else {
125
+ if (currentLine)
126
+ lines.push(currentLine);
127
+ currentLine = word;
128
+ }
129
+ }
130
+ if (currentLine)
131
+ lines.push(currentLine);
132
+ return lines;
133
+ }
134
+ }
135
+ // =============================================================================
136
+ // Main Export
137
+ // =============================================================================
138
+ /**
139
+ * Show the guardrail confirmation overlay.
140
+ * Returns { approved: true } if user allows, { approved: false } if denied.
141
+ */
142
+ export async function showGuardrailOverlay(options) {
143
+ const overlay = new GuardrailOverlayImpl(options);
144
+ return overlay.show();
145
+ }
@@ -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,16 @@
1
+ /**
2
+ * Help Overlay
3
+ *
4
+ * Displays available commands in a searchable, categorized list.
5
+ * Uses TabbedListOverlay for consistent UX patterns.
6
+ *
7
+ * Features:
8
+ * - Tabs: All, Built-in, Custom
9
+ * - Search with / toggle
10
+ * - Detail view for full command information
11
+ * - Info header with shortcuts
12
+ */
13
+ /**
14
+ * Show the help overlay
15
+ */
16
+ export declare function showHelp(): Promise<void>;