@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,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render Modes
|
|
3
|
+
*
|
|
4
|
+
* The terminal operates in one of three mutually exclusive modes.
|
|
5
|
+
* Each mode has different rendering behavior and keyboard handling.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Terminal render modes
|
|
9
|
+
*
|
|
10
|
+
* MENU: Full-screen startup menu (no scroll regions)
|
|
11
|
+
* REPL: Scroll zone + footer (normal chat mode)
|
|
12
|
+
* OVERLAY: Full-screen overlay (config, backlog, permissions)
|
|
13
|
+
*/
|
|
14
|
+
export declare enum RenderMode {
|
|
15
|
+
MENU = "MENU",
|
|
16
|
+
REPL = "REPL",
|
|
17
|
+
OVERLAY = "OVERLAY"
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Mode transition events for debugging/logging
|
|
21
|
+
*/
|
|
22
|
+
export interface ModeTransition {
|
|
23
|
+
from: RenderMode;
|
|
24
|
+
to: RenderMode;
|
|
25
|
+
reason: string;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Valid mode transitions
|
|
30
|
+
*
|
|
31
|
+
* MENU -> REPL: User selects option (init, chat, continue, etc.)
|
|
32
|
+
* REPL -> OVERLAY: User triggers overlay (/config, /backlog, permission)
|
|
33
|
+
* OVERLAY -> REPL: User closes overlay (Esc, Enter, etc.)
|
|
34
|
+
* REPL -> MENU: User runs /menu command
|
|
35
|
+
*/
|
|
36
|
+
export declare function isValidTransition(from: RenderMode, to: RenderMode): boolean;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render Modes
|
|
3
|
+
*
|
|
4
|
+
* The terminal operates in one of three mutually exclusive modes.
|
|
5
|
+
* Each mode has different rendering behavior and keyboard handling.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Terminal render modes
|
|
9
|
+
*
|
|
10
|
+
* MENU: Full-screen startup menu (no scroll regions)
|
|
11
|
+
* REPL: Scroll zone + footer (normal chat mode)
|
|
12
|
+
* OVERLAY: Full-screen overlay (config, backlog, permissions)
|
|
13
|
+
*/
|
|
14
|
+
export var RenderMode;
|
|
15
|
+
(function (RenderMode) {
|
|
16
|
+
RenderMode["MENU"] = "MENU";
|
|
17
|
+
RenderMode["REPL"] = "REPL";
|
|
18
|
+
RenderMode["OVERLAY"] = "OVERLAY";
|
|
19
|
+
})(RenderMode || (RenderMode = {}));
|
|
20
|
+
/**
|
|
21
|
+
* Valid mode transitions
|
|
22
|
+
*
|
|
23
|
+
* MENU -> REPL: User selects option (init, chat, continue, etc.)
|
|
24
|
+
* REPL -> OVERLAY: User triggers overlay (/config, /backlog, permission)
|
|
25
|
+
* OVERLAY -> REPL: User closes overlay (Esc, Enter, etc.)
|
|
26
|
+
* REPL -> MENU: User runs /menu command
|
|
27
|
+
*/
|
|
28
|
+
export function isValidTransition(from, to) {
|
|
29
|
+
if (from === to)
|
|
30
|
+
return false;
|
|
31
|
+
switch (from) {
|
|
32
|
+
case RenderMode.MENU:
|
|
33
|
+
// Menu can go to REPL (user selects option) or OVERLAY (e.g., config from menu)
|
|
34
|
+
return to === RenderMode.REPL || to === RenderMode.OVERLAY;
|
|
35
|
+
case RenderMode.REPL:
|
|
36
|
+
// REPL can go to OVERLAY (modal opened) or MENU (/menu command)
|
|
37
|
+
return to === RenderMode.OVERLAY || to === RenderMode.MENU;
|
|
38
|
+
case RenderMode.OVERLAY:
|
|
39
|
+
// Overlay can go back to REPL (closed) or MENU (rare, but valid)
|
|
40
|
+
return to === RenderMode.REPL || to === RenderMode.MENU;
|
|
41
|
+
default:
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup Menu Overlay
|
|
3
|
+
*
|
|
4
|
+
* Provides a guided entry point for users with options to:
|
|
5
|
+
* - Start a new project (/new)
|
|
6
|
+
* - View & manage projects (/projects)
|
|
7
|
+
* - Continue last project
|
|
8
|
+
* - Free-form chat
|
|
9
|
+
* - Configure settings
|
|
10
|
+
* - Show help
|
|
11
|
+
* - Exit
|
|
12
|
+
*
|
|
13
|
+
* Inspired by ATLAS CLI interactiveMenu()
|
|
14
|
+
*/
|
|
15
|
+
export type MenuOption = 'init' | 'projects' | 'continue' | 'chat' | 'config' | 'help' | 'exit';
|
|
16
|
+
export interface StartupMenuResult {
|
|
17
|
+
action: MenuOption;
|
|
18
|
+
project?: {
|
|
19
|
+
id: number;
|
|
20
|
+
name: string;
|
|
21
|
+
displayName: string;
|
|
22
|
+
path: string;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Show the startup menu and return the user's choice
|
|
27
|
+
*/
|
|
28
|
+
export declare function showStartupMenu(version: string): Promise<StartupMenuResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Find the last active project for the "continue" option
|
|
31
|
+
*/
|
|
32
|
+
export declare function findLastActiveProject(): {
|
|
33
|
+
id: number;
|
|
34
|
+
name: string;
|
|
35
|
+
path: string;
|
|
36
|
+
} | null;
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup Menu Overlay
|
|
3
|
+
*
|
|
4
|
+
* Provides a guided entry point for users with options to:
|
|
5
|
+
* - Start a new project (/new)
|
|
6
|
+
* - View & manage projects (/projects)
|
|
7
|
+
* - Continue last project
|
|
8
|
+
* - Free-form chat
|
|
9
|
+
* - Configure settings
|
|
10
|
+
* - Show help
|
|
11
|
+
* - Exit
|
|
12
|
+
*
|
|
13
|
+
* Inspired by ATLAS CLI interactiveMenu()
|
|
14
|
+
*/
|
|
15
|
+
import { getStyles } from '../themes/index.js';
|
|
16
|
+
import * as terminal from './terminal.js';
|
|
17
|
+
import { projectRepository } from '../db/repositories/index.js';
|
|
18
|
+
import { setActiveProject } from '../tools/project-db.js';
|
|
19
|
+
import { printLogo } from './conversation.js';
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Menu Options
|
|
22
|
+
// =============================================================================
|
|
23
|
+
function getMenuOptions(hasLastProject, lastProjectName) {
|
|
24
|
+
return [
|
|
25
|
+
{
|
|
26
|
+
key: 'init',
|
|
27
|
+
label: 'init',
|
|
28
|
+
description: 'Start a new project',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
key: 'projects',
|
|
32
|
+
label: 'projects',
|
|
33
|
+
description: 'View & manage projects',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
key: 'continue',
|
|
37
|
+
label: 'continue',
|
|
38
|
+
description: hasLastProject
|
|
39
|
+
? `Resume: ${lastProjectName ?? 'project'}`
|
|
40
|
+
: 'No recent project',
|
|
41
|
+
disabled: !hasLastProject,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: 'chat',
|
|
45
|
+
label: 'chat',
|
|
46
|
+
description: 'Free-form AI chat',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
key: 'config',
|
|
50
|
+
label: 'config',
|
|
51
|
+
description: 'Configure settings',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
key: 'help',
|
|
55
|
+
label: 'help',
|
|
56
|
+
description: 'Show help and shortcuts',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
key: 'exit',
|
|
60
|
+
label: 'exit',
|
|
61
|
+
description: 'Exit CLI',
|
|
62
|
+
},
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
// =============================================================================
|
|
66
|
+
// Rendering
|
|
67
|
+
// =============================================================================
|
|
68
|
+
function renderMenu(state) {
|
|
69
|
+
const s = getStyles();
|
|
70
|
+
const lines = [];
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push(' What would you like to do?');
|
|
73
|
+
lines.push('');
|
|
74
|
+
// Menu options - left-aligned like /config overlay
|
|
75
|
+
const labelWidth = 14;
|
|
76
|
+
for (let i = 0; i < state.options.length; i++) {
|
|
77
|
+
const opt = state.options[i];
|
|
78
|
+
const isSelected = i === state.selectedIndex;
|
|
79
|
+
const prefix = isSelected ? s.primary(' ❯ ') : ' ';
|
|
80
|
+
const rawLabel = opt.label.padEnd(labelWidth);
|
|
81
|
+
const rawDesc = opt.description;
|
|
82
|
+
let label;
|
|
83
|
+
let description;
|
|
84
|
+
if (opt.disabled) {
|
|
85
|
+
label = s.muted(rawLabel);
|
|
86
|
+
description = s.muted(rawDesc);
|
|
87
|
+
}
|
|
88
|
+
else if (isSelected) {
|
|
89
|
+
label = s.primary(rawLabel);
|
|
90
|
+
description = s.foreground(rawDesc);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
label = s.foreground(rawLabel);
|
|
94
|
+
description = s.muted(rawDesc);
|
|
95
|
+
}
|
|
96
|
+
lines.push(prefix + label + description);
|
|
97
|
+
}
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push(s.muted(' ↑/↓: navigate Enter: select'));
|
|
100
|
+
return lines;
|
|
101
|
+
}
|
|
102
|
+
// =============================================================================
|
|
103
|
+
// Main Function
|
|
104
|
+
// =============================================================================
|
|
105
|
+
/**
|
|
106
|
+
* Show the startup menu and return the user's choice
|
|
107
|
+
*/
|
|
108
|
+
export async function showStartupMenu(version) {
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
// Check for last active project
|
|
111
|
+
let lastProject = null;
|
|
112
|
+
try {
|
|
113
|
+
const result = projectRepository.list({ status: 'active', limit: 1 });
|
|
114
|
+
if (result.projects.length > 0) {
|
|
115
|
+
const p = result.projects[0];
|
|
116
|
+
lastProject = { id: p.id, name: p.name, displayName: p.displayName, path: p.path };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// DB might not exist yet
|
|
121
|
+
}
|
|
122
|
+
const hasLastProject = lastProject !== null;
|
|
123
|
+
const lastProjectName = lastProject?.displayName;
|
|
124
|
+
const state = {
|
|
125
|
+
selectedIndex: 0,
|
|
126
|
+
options: getMenuOptions(hasLastProject, lastProjectName),
|
|
127
|
+
hasLastProject,
|
|
128
|
+
lastProjectName,
|
|
129
|
+
};
|
|
130
|
+
// Enable raw mode for key detection (no readline - it causes echo)
|
|
131
|
+
const wasRawMode = process.stdin.isRaw;
|
|
132
|
+
terminal.enableRawMode();
|
|
133
|
+
terminal.hideCursor();
|
|
134
|
+
let prevLineCount = 0;
|
|
135
|
+
const render = (isInitial = false) => {
|
|
136
|
+
if (isInitial) {
|
|
137
|
+
// First render: print logo and save cursor position
|
|
138
|
+
printLogo(version, lastProject?.displayName ?? null);
|
|
139
|
+
terminal.saveCursor();
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// Subsequent renders: restore cursor and clear to end of screen
|
|
143
|
+
terminal.restoreCursor();
|
|
144
|
+
terminal.clearToEndOfScreen();
|
|
145
|
+
}
|
|
146
|
+
// Render the menu
|
|
147
|
+
const lines = renderMenu(state);
|
|
148
|
+
const termWidth = terminal.getTerminalWidth();
|
|
149
|
+
const physicalLines = terminal.totalPhysicalLines(lines, termWidth);
|
|
150
|
+
// Pad to previous height to prevent shrinking
|
|
151
|
+
for (let i = physicalLines; i < prevLineCount; i++) {
|
|
152
|
+
lines.push('');
|
|
153
|
+
}
|
|
154
|
+
process.stdout.write(lines.join('\n') + '\n');
|
|
155
|
+
prevLineCount = Math.max(prevLineCount, physicalLines);
|
|
156
|
+
};
|
|
157
|
+
// Define handleKey first, then cleanup references it
|
|
158
|
+
const handleKey = (key) => {
|
|
159
|
+
const keyStr = key.toString();
|
|
160
|
+
// Arrow keys
|
|
161
|
+
if (keyStr === '\x1b[A' || keyStr === 'k') {
|
|
162
|
+
// Up
|
|
163
|
+
do {
|
|
164
|
+
state.selectedIndex = (state.selectedIndex - 1 + state.options.length) % state.options.length;
|
|
165
|
+
} while (state.options[state.selectedIndex].disabled);
|
|
166
|
+
render(false);
|
|
167
|
+
}
|
|
168
|
+
else if (keyStr === '\x1b[B' || keyStr === 'j') {
|
|
169
|
+
// Down
|
|
170
|
+
do {
|
|
171
|
+
state.selectedIndex = (state.selectedIndex + 1) % state.options.length;
|
|
172
|
+
} while (state.options[state.selectedIndex].disabled);
|
|
173
|
+
render(false);
|
|
174
|
+
}
|
|
175
|
+
else if (keyStr === '\r' || keyStr === '\n') {
|
|
176
|
+
// Enter
|
|
177
|
+
const selected = state.options[state.selectedIndex];
|
|
178
|
+
if (!selected.disabled) {
|
|
179
|
+
// Cleanup: Remove listener BEFORE changing raw mode to prevent issues
|
|
180
|
+
process.stdin.removeListener('data', handleKey);
|
|
181
|
+
if (!wasRawMode) {
|
|
182
|
+
terminal.disableRawMode();
|
|
183
|
+
}
|
|
184
|
+
terminal.showCursor();
|
|
185
|
+
// Handle continue option - set active project
|
|
186
|
+
if (selected.key === 'continue' && lastProject) {
|
|
187
|
+
setActiveProject({
|
|
188
|
+
id: lastProject.id,
|
|
189
|
+
name: lastProject.name,
|
|
190
|
+
displayName: lastProject.displayName,
|
|
191
|
+
path: lastProject.path,
|
|
192
|
+
});
|
|
193
|
+
resolve({
|
|
194
|
+
action: 'continue',
|
|
195
|
+
project: {
|
|
196
|
+
id: lastProject.id,
|
|
197
|
+
name: lastProject.name,
|
|
198
|
+
displayName: lastProject.displayName,
|
|
199
|
+
path: lastProject.path,
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
resolve({ action: selected.key });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else if (keyStr === '\x03') {
|
|
209
|
+
// Ctrl+C - cleanup and exit
|
|
210
|
+
process.stdin.removeListener('data', handleKey);
|
|
211
|
+
terminal.disableRawMode();
|
|
212
|
+
terminal.showCursor();
|
|
213
|
+
process.exit(0);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
process.stdin.on('data', handleKey);
|
|
217
|
+
// Initial render
|
|
218
|
+
render(true);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Find the last active project for the "continue" option
|
|
223
|
+
*/
|
|
224
|
+
export function findLastActiveProject() {
|
|
225
|
+
try {
|
|
226
|
+
const result = projectRepository.list({ status: 'active', limit: 1 });
|
|
227
|
+
if (result.projects.length > 0) {
|
|
228
|
+
const p = result.projects[0];
|
|
229
|
+
return { id: p.id, name: p.name, path: p.path };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// DB might not exist
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subagent Renderer
|
|
3
|
+
*
|
|
4
|
+
* Renders subagent status in Claude Code style:
|
|
5
|
+
* - Single agent: bullet with status and last action
|
|
6
|
+
* - Multiple agents: tree structure with all agents listed
|
|
7
|
+
* - Live updates as tools execute
|
|
8
|
+
*
|
|
9
|
+
* Visual style:
|
|
10
|
+
* ● Explore(Find CLI entry points)
|
|
11
|
+
* ⎿ Read 67 lines
|
|
12
|
+
* Found 100 files
|
|
13
|
+
* +3 more tool uses (ctrl+o to expand)
|
|
14
|
+
*
|
|
15
|
+
* ● Running 3 Explore agents... (ctrl+o to expand)
|
|
16
|
+
* ├─ Find state management · 3 tool uses · 20.7k tokens
|
|
17
|
+
* │ ⎿ Bash: List TypeScript files
|
|
18
|
+
* └─ Find utility functions · 5 tool uses · 18.9k tokens
|
|
19
|
+
* ⎿ Read: src/utils/project-memory.ts
|
|
20
|
+
*/
|
|
21
|
+
export interface SubagentState {
|
|
22
|
+
id: string;
|
|
23
|
+
type: string;
|
|
24
|
+
description: string;
|
|
25
|
+
status: 'running' | 'done' | 'error';
|
|
26
|
+
toolCount: number;
|
|
27
|
+
tokenCount: number;
|
|
28
|
+
lastAction: string;
|
|
29
|
+
lastActionDetails: string[];
|
|
30
|
+
startTime: number;
|
|
31
|
+
endTime?: number;
|
|
32
|
+
error?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface SubagentRendererOptions {
|
|
35
|
+
/** Max detail lines to show per agent in compact mode (default: 1) */
|
|
36
|
+
maxDetailLines?: number;
|
|
37
|
+
/** Show token counts (default: true) */
|
|
38
|
+
showTokens?: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare class SubagentRenderer {
|
|
41
|
+
private readonly agents;
|
|
42
|
+
private isExpanded;
|
|
43
|
+
private readonly maxDetailLines;
|
|
44
|
+
private readonly showTokens;
|
|
45
|
+
private onUpdate;
|
|
46
|
+
constructor(options?: SubagentRendererOptions);
|
|
47
|
+
/**
|
|
48
|
+
* Called when a subagent starts
|
|
49
|
+
*/
|
|
50
|
+
onSubagentStart(id: string, type: string, description: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Called when a subagent uses a tool
|
|
53
|
+
*/
|
|
54
|
+
onToolUse(agentId: string, toolName: string, summary?: string): void;
|
|
55
|
+
/**
|
|
56
|
+
* Called when a subagent completes
|
|
57
|
+
*/
|
|
58
|
+
onSubagentEnd(id: string, success: boolean, tokenCount: number, error?: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* Toggle expanded/collapsed view (Ctrl+O)
|
|
61
|
+
*/
|
|
62
|
+
toggleExpand(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Check if there are any active subagents
|
|
65
|
+
*/
|
|
66
|
+
hasActiveSubagents(): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Check if there are any subagents to display
|
|
69
|
+
*/
|
|
70
|
+
hasSubagents(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Get count of agents by status
|
|
73
|
+
*/
|
|
74
|
+
getCounts(): {
|
|
75
|
+
running: number;
|
|
76
|
+
done: number;
|
|
77
|
+
error: number;
|
|
78
|
+
total: number;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Get the last agent's stats (for persisting to scrolling zone)
|
|
82
|
+
* Returns null if no agents tracked
|
|
83
|
+
*/
|
|
84
|
+
getLastAgentStats(): {
|
|
85
|
+
type: string;
|
|
86
|
+
description: string;
|
|
87
|
+
toolCount: number;
|
|
88
|
+
tokenCount: number;
|
|
89
|
+
durationMs: number;
|
|
90
|
+
} | null;
|
|
91
|
+
/**
|
|
92
|
+
* Clear all agents (after rendering final output to scrolling zone)
|
|
93
|
+
*/
|
|
94
|
+
clear(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Set callback for state updates
|
|
97
|
+
*/
|
|
98
|
+
setUpdateCallback(callback: (() => void) | null): void;
|
|
99
|
+
/**
|
|
100
|
+
* Render the subagent zone - returns array of lines
|
|
101
|
+
* Only renders running agents - completed agents are shown via printSubagentResponse
|
|
102
|
+
*/
|
|
103
|
+
render(): string[];
|
|
104
|
+
private triggerUpdate;
|
|
105
|
+
/**
|
|
106
|
+
* Render single agent display
|
|
107
|
+
*/
|
|
108
|
+
private renderSingleAgent;
|
|
109
|
+
/**
|
|
110
|
+
* Render multiple agents in tree display
|
|
111
|
+
*/
|
|
112
|
+
private renderMultipleAgents;
|
|
113
|
+
/**
|
|
114
|
+
* Get common type label if all agents are same type, otherwise "mixed"
|
|
115
|
+
*/
|
|
116
|
+
private getCommonTypeLabel;
|
|
117
|
+
}
|