@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.
- package/README.md +30 -12
- package/dist/agent.d.ts +74 -1
- package/dist/agent.js +259 -76
- package/dist/anchors/index.d.ts +9 -0
- package/dist/anchors/index.js +9 -0
- package/dist/anchors/project-anchors.d.ts +79 -0
- package/dist/anchors/project-anchors.js +202 -0
- package/dist/commands/handler-types.d.ts +68 -0
- package/dist/commands/handler-types.js +8 -0
- package/dist/commands/handlers/agent-commands.d.ts +13 -0
- package/dist/commands/handlers/agent-commands.js +305 -0
- package/dist/commands/handlers/design-commands.d.ts +15 -0
- package/dist/commands/handlers/design-commands.js +334 -0
- package/dist/commands/handlers/index.d.ts +20 -0
- package/dist/commands/handlers/index.js +43 -0
- package/dist/commands/handlers/overlay-commands.d.ts +21 -0
- package/dist/commands/handlers/overlay-commands.js +287 -0
- package/dist/commands/handlers/project-commands.d.ts +11 -0
- package/dist/commands/handlers/project-commands.js +167 -0
- package/dist/commands/handlers/simple-commands.d.ts +19 -0
- package/dist/commands/handlers/simple-commands.js +144 -0
- package/dist/commands/index.d.ts +2 -1
- package/dist/commands/registry.d.ts +50 -0
- package/dist/commands/registry.js +75 -0
- package/dist/commands-v2/handlers/context.d.ts +13 -0
- package/dist/commands-v2/handlers/context.js +348 -0
- package/dist/commands-v2/handlers/core.d.ts +13 -0
- package/dist/commands-v2/handlers/core.js +165 -0
- package/dist/commands-v2/handlers/debug.d.ts +11 -0
- package/dist/commands-v2/handlers/debug.js +159 -0
- package/dist/commands-v2/handlers/index.d.ts +12 -0
- package/dist/commands-v2/handlers/index.js +24 -0
- package/dist/commands-v2/handlers/project.d.ts +22 -0
- package/dist/commands-v2/handlers/project.js +814 -0
- package/dist/commands-v2/handlers/settings.d.ts +15 -0
- package/dist/commands-v2/handlers/settings.js +235 -0
- package/dist/commands-v2/index.d.ts +13 -0
- package/dist/commands-v2/index.js +15 -0
- package/dist/commands-v2/registry.d.ts +37 -0
- package/dist/commands-v2/registry.js +80 -0
- package/dist/commands-v2/types.d.ts +75 -0
- package/dist/commands-v2/types.js +7 -0
- package/dist/commands.js +110 -7
- package/dist/index.js +288 -29
- package/dist/input-handlers/index.d.ts +7 -0
- package/dist/input-handlers/index.js +7 -0
- package/dist/input-handlers/memory-handler.d.ts +26 -0
- package/dist/input-handlers/memory-handler.js +68 -0
- package/dist/repl-helpers.d.ts +63 -0
- package/dist/repl-helpers.js +318 -0
- package/dist/repl-v2.d.ts +155 -0
- package/dist/repl-v2.js +774 -0
- package/dist/repl.d.ts +32 -4
- package/dist/repl.js +250 -977
- package/dist/settings/index.d.ts +23 -0
- package/dist/settings/index.js +48 -0
- package/dist/settings/paths.d.ts +110 -0
- package/dist/settings/paths.js +264 -0
- package/dist/templates/compilr-md.js +7 -4
- package/dist/templates/index.js +3 -4
- package/dist/themes/colors.js +3 -1
- package/dist/themes/registry.d.ts +5 -36
- package/dist/themes/registry.js +11 -95
- package/dist/themes/types.d.ts +3 -38
- package/dist/themes/types.js +2 -2
- package/dist/tools/anchor-tools.d.ts +31 -0
- package/dist/tools/anchor-tools.js +255 -0
- package/dist/tools/backlog-wrappers.d.ts +54 -0
- package/dist/tools/backlog-wrappers.js +338 -0
- package/dist/tools/backlog.js +1 -1
- package/dist/tools/db-tools.d.ts +65 -0
- package/dist/tools/db-tools.js +19 -0
- package/dist/tools/document-db.d.ts +43 -0
- package/dist/tools/document-db.js +220 -0
- package/dist/tools/project-db.d.ts +102 -0
- package/dist/tools/project-db.js +370 -0
- package/dist/tools/workitem-db.d.ts +103 -0
- package/dist/tools/workitem-db.js +549 -0
- package/dist/tools.js +13 -3
- package/dist/ui/agents-overlay-v2.d.ts +43 -0
- package/dist/ui/agents-overlay-v2.js +809 -0
- package/dist/ui/agents-overlay.d.ts +5 -5
- package/dist/ui/agents-overlay.js +782 -420
- package/dist/ui/anchors-overlay.d.ts +12 -0
- package/dist/ui/anchors-overlay.js +775 -0
- package/dist/ui/arch-type-overlay.d.ts +1 -6
- package/dist/ui/arch-type-overlay.js +175 -203
- package/dist/ui/ask-user-overlay-v2.d.ts +26 -0
- package/dist/ui/ask-user-overlay-v2.js +555 -0
- package/dist/ui/ask-user-overlay.d.ts +2 -2
- package/dist/ui/ask-user-overlay.js +443 -535
- package/dist/ui/ask-user-simple-overlay-v2.d.ts +25 -0
- package/dist/ui/ask-user-simple-overlay-v2.js +215 -0
- package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
- package/dist/ui/ask-user-simple-overlay.js +182 -209
- package/dist/ui/backlog-overlay.d.ts +16 -1
- package/dist/ui/backlog-overlay.js +525 -659
- package/dist/ui/base/index.d.ts +26 -0
- package/dist/ui/base/index.js +33 -0
- package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
- package/dist/ui/base/inline-overlay-utils.js +320 -0
- package/dist/ui/base/inline-overlay.d.ts +159 -0
- package/dist/ui/base/inline-overlay.js +257 -0
- package/dist/ui/base/key-utils.d.ts +15 -0
- package/dist/ui/base/key-utils.js +30 -0
- package/dist/ui/base/overlay-base-v2.d.ts +193 -0
- package/dist/ui/base/overlay-base-v2.js +246 -0
- package/dist/ui/base/overlay-base.d.ts +156 -0
- package/dist/ui/base/overlay-base.js +238 -0
- package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
- package/dist/ui/base/overlay-lifecycle.js +159 -0
- package/dist/ui/base/overlay-types.d.ts +185 -0
- package/dist/ui/base/overlay-types.js +7 -0
- package/dist/ui/base/render-utils.d.ts +8 -0
- package/dist/ui/base/render-utils.js +11 -0
- package/dist/ui/base/screen-stack.d.ts +148 -0
- package/dist/ui/base/screen-stack.js +184 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +103 -0
- package/dist/ui/base/tabbed-list-overlay-v2.js +317 -0
- package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
- package/dist/ui/base/tabbed-list-overlay.js +369 -0
- package/dist/ui/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/commands-overlay-v2.js +441 -0
- package/dist/ui/commands-overlay.d.ts +7 -2
- package/dist/ui/commands-overlay.js +384 -355
- package/dist/ui/config-overlay.d.ts +5 -4
- package/dist/ui/config-overlay.js +243 -513
- package/dist/ui/conversation.d.ts +75 -4
- package/dist/ui/conversation.js +374 -161
- package/dist/ui/docs-overlay.d.ts +17 -0
- package/dist/ui/docs-overlay.js +303 -0
- package/dist/ui/ephemeral.d.ts +1 -1
- package/dist/ui/ephemeral.js +1 -1
- package/dist/ui/features/index.d.ts +34 -0
- package/dist/ui/features/index.js +34 -0
- package/dist/ui/features/input-feature.d.ts +85 -0
- package/dist/ui/features/input-feature.js +238 -0
- package/dist/ui/features/list-feature.d.ts +155 -0
- package/dist/ui/features/list-feature.js +244 -0
- package/dist/ui/features/pagination-feature.d.ts +154 -0
- package/dist/ui/features/pagination-feature.js +238 -0
- package/dist/ui/features/search-feature.d.ts +148 -0
- package/dist/ui/features/search-feature.js +185 -0
- package/dist/ui/features/tab-feature.d.ts +194 -0
- package/dist/ui/features/tab-feature.js +307 -0
- package/dist/ui/footer-v2.d.ts +222 -0
- package/dist/ui/footer-v2.js +1349 -0
- package/dist/ui/footer.d.ts +107 -0
- package/dist/ui/footer.js +359 -67
- package/dist/ui/guardrail-overlay.d.ts +29 -0
- package/dist/ui/guardrail-overlay.js +145 -0
- package/dist/ui/help-overlay-v2.d.ts +34 -0
- package/dist/ui/help-overlay-v2.js +309 -0
- package/dist/ui/help-overlay.d.ts +16 -0
- package/dist/ui/help-overlay.js +316 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -3
- package/dist/ui/init-overlay-v2.d.ts +34 -0
- package/dist/ui/init-overlay-v2.js +600 -0
- package/dist/ui/init-overlay.d.ts +12 -2
- package/dist/ui/init-overlay.js +349 -270
- package/dist/ui/input-prompt-v2.d.ts +1 -0
- package/dist/ui/input-prompt-v2.js +14 -6
- package/dist/ui/input-prompt.d.ts +116 -33
- package/dist/ui/input-prompt.js +536 -337
- package/dist/ui/iteration-limit-overlay-v2.d.ts +21 -0
- package/dist/ui/iteration-limit-overlay-v2.js +114 -0
- package/dist/ui/iteration-limit-overlay.d.ts +2 -2
- package/dist/ui/iteration-limit-overlay.js +92 -128
- package/dist/ui/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/keys-overlay-v2.js +248 -0
- package/dist/ui/keys-overlay.d.ts +1 -0
- package/dist/ui/keys-overlay.js +203 -141
- package/dist/ui/line-utils.d.ts +88 -0
- package/dist/ui/line-utils.js +150 -0
- package/dist/ui/live-region.d.ts +161 -0
- package/dist/ui/live-region.js +387 -0
- package/dist/ui/mascot/expressions.d.ts +32 -0
- package/dist/ui/mascot/expressions.js +213 -0
- package/dist/ui/mascot/index.d.ts +8 -0
- package/dist/ui/mascot/index.js +8 -0
- package/dist/ui/mascot/renderer.d.ts +19 -0
- package/dist/ui/mascot/renderer.js +97 -0
- package/dist/ui/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/mascot-overlay-v2.js +138 -0
- package/dist/ui/mascot-overlay.d.ts +21 -0
- package/dist/ui/mascot-overlay.js +146 -0
- package/dist/ui/model-overlay-v2.d.ts +49 -0
- package/dist/ui/model-overlay-v2.js +118 -0
- package/dist/ui/model-overlay.d.ts +27 -0
- package/dist/ui/model-overlay.js +221 -0
- package/dist/ui/model-warning-overlay.js +3 -5
- package/dist/ui/new-overlay.d.ts +34 -0
- package/dist/ui/new-overlay.js +604 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +825 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +783 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +584 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +642 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +441 -0
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +100 -0
- package/dist/ui/overlay/impl/config-overlay-v2.js +654 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +55 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +359 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1071 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +34 -0
- package/dist/ui/overlay/impl/help-overlay-v2.js +309 -0
- package/dist/ui/overlay/impl/init-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/init-overlay-v2.js +593 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
- package/dist/ui/overlay/impl/model-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/model-overlay-v2.js +118 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +77 -0
- package/dist/ui/overlay/impl/new-overlay-v2.js +593 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +499 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +218 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +31 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +1035 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +637 -0
- package/dist/ui/overlay/index.d.ts +33 -0
- package/dist/ui/overlay/index.js +35 -0
- package/dist/ui/overlay/key-utils.d.ts +6 -0
- package/dist/ui/overlay/key-utils.js +6 -0
- package/dist/ui/overlay/overlay-types.d.ts +128 -0
- package/dist/ui/overlay/overlay-types.js +22 -0
- package/dist/ui/overlay/types.d.ts +135 -0
- package/dist/ui/overlay/types.js +22 -0
- package/dist/ui/overlays/help-overlay-v2.d.ts +28 -0
- package/dist/ui/overlays/help-overlay-v2.js +198 -0
- package/dist/ui/overlays/index.d.ts +11 -0
- package/dist/ui/overlays/index.js +11 -0
- package/dist/ui/overlays.d.ts +0 -4
- package/dist/ui/overlays.js +0 -444
- package/dist/ui/permission-overlay-v2.d.ts +36 -0
- package/dist/ui/permission-overlay-v2.js +380 -0
- package/dist/ui/permission-overlay.d.ts +1 -1
- package/dist/ui/permission-overlay.js +186 -298
- package/dist/ui/projects-overlay.d.ts +19 -0
- package/dist/ui/projects-overlay.js +484 -0
- package/dist/ui/providers/types.d.ts +178 -0
- package/dist/ui/providers/types.js +9 -0
- package/dist/ui/render-modes.d.ts +36 -0
- package/dist/ui/render-modes.js +44 -0
- package/dist/ui/startup-menu.d.ts +36 -0
- package/dist/ui/startup-menu.js +236 -0
- package/dist/ui/subagent-renderer.d.ts +117 -0
- package/dist/ui/subagent-renderer.js +334 -0
- package/dist/ui/terminal-codes.d.ts +94 -0
- package/dist/ui/terminal-codes.js +124 -0
- package/dist/ui/terminal-renderer.d.ts +221 -0
- package/dist/ui/terminal-renderer.js +751 -0
- package/dist/ui/terminal-ui.d.ts +463 -0
- package/dist/ui/terminal-ui.js +2296 -0
- package/dist/ui/terminal.d.ts +20 -0
- package/dist/ui/terminal.js +72 -0
- package/dist/ui/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/theme-overlay-v2.js +135 -0
- package/dist/ui/theme-overlay.d.ts +24 -0
- package/dist/ui/theme-overlay.js +127 -0
- package/dist/ui/todo-zone.js +53 -25
- package/dist/ui/tool-formatters.d.ts +16 -0
- package/dist/ui/tool-formatters.js +516 -0
- package/dist/ui/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/tools-overlay-v2.js +218 -0
- package/dist/ui/tools-overlay.d.ts +10 -2
- package/dist/ui/tools-overlay.js +172 -220
- package/dist/ui/tutorial-overlay-v2.d.ts +31 -0
- package/dist/ui/tutorial-overlay-v2.js +1035 -0
- package/dist/ui/tutorial-overlay.d.ts +1 -0
- package/dist/ui/tutorial-overlay.js +400 -302
- package/dist/ui/workflow-overlay.d.ts +22 -0
- package/dist/ui/workflow-overlay.js +636 -0
- package/dist/utils/debug-log.d.ts +28 -0
- package/dist/utils/debug-log.js +57 -0
- package/dist/utils/model-tiers.js +1 -1
- package/dist/utils/path-safety.d.ts +56 -0
- package/dist/utils/path-safety.js +239 -0
- package/dist/workflow/guided-mode-injector.d.ts +42 -0
- package/dist/workflow/guided-mode-injector.js +191 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/step-criteria.d.ts +62 -0
- package/dist/workflow/step-criteria.js +150 -0
- package/dist/workflow/step-tracker.d.ts +92 -0
- package/dist/workflow/step-tracker.js +141 -0
- 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>;
|