@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,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry for command handlers. Commands are registered
|
|
5
|
+
* at startup and executed by REPL.handleCommand().
|
|
6
|
+
*/
|
|
7
|
+
import type { CommandHandler, CommandContext, CommandResult } from './handler-types.js';
|
|
8
|
+
declare class CommandRegistry {
|
|
9
|
+
private readonly handlers;
|
|
10
|
+
/**
|
|
11
|
+
* Register a command handler.
|
|
12
|
+
* Registers both the primary name and any aliases.
|
|
13
|
+
*/
|
|
14
|
+
register(handler: CommandHandler): void;
|
|
15
|
+
/**
|
|
16
|
+
* Register multiple handlers at once.
|
|
17
|
+
*/
|
|
18
|
+
registerAll(handlers: CommandHandler[]): void;
|
|
19
|
+
/**
|
|
20
|
+
* Execute a command by name.
|
|
21
|
+
*
|
|
22
|
+
* @param command - Command name (without leading slash)
|
|
23
|
+
* @param args - Arguments string
|
|
24
|
+
* @param ctx - Command context
|
|
25
|
+
* @returns true to continue REPL, false to exit, null if not found
|
|
26
|
+
*/
|
|
27
|
+
execute(command: string, args: string, ctx: CommandContext): Promise<CommandResult>;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a command is registered.
|
|
30
|
+
*/
|
|
31
|
+
has(command: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get a handler by name.
|
|
34
|
+
*/
|
|
35
|
+
get(command: string): CommandHandler | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Get all unique handlers (no duplicates from aliases).
|
|
38
|
+
*/
|
|
39
|
+
getAll(): CommandHandler[];
|
|
40
|
+
/**
|
|
41
|
+
* Get all registered command names (including aliases).
|
|
42
|
+
*/
|
|
43
|
+
getCommandNames(): string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Global command registry instance.
|
|
47
|
+
* Use this to register and execute commands.
|
|
48
|
+
*/
|
|
49
|
+
export declare const commandRegistry: CommandRegistry;
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Command Registry
|
|
3
|
+
*
|
|
4
|
+
* Central registry for command handlers. Commands are registered
|
|
5
|
+
* at startup and executed by REPL.handleCommand().
|
|
6
|
+
*/
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Command Registry Class
|
|
9
|
+
// =============================================================================
|
|
10
|
+
class CommandRegistry {
|
|
11
|
+
handlers = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Register a command handler.
|
|
14
|
+
* Registers both the primary name and any aliases.
|
|
15
|
+
*/
|
|
16
|
+
register(handler) {
|
|
17
|
+
this.handlers.set(handler.name, handler);
|
|
18
|
+
handler.aliases?.forEach((alias) => this.handlers.set(alias, handler));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Register multiple handlers at once.
|
|
22
|
+
*/
|
|
23
|
+
registerAll(handlers) {
|
|
24
|
+
handlers.forEach((h) => {
|
|
25
|
+
this.register(h);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Execute a command by name.
|
|
30
|
+
*
|
|
31
|
+
* @param command - Command name (without leading slash)
|
|
32
|
+
* @param args - Arguments string
|
|
33
|
+
* @param ctx - Command context
|
|
34
|
+
* @returns true to continue REPL, false to exit, null if not found
|
|
35
|
+
*/
|
|
36
|
+
async execute(command, args, ctx) {
|
|
37
|
+
const handler = this.handlers.get(command);
|
|
38
|
+
if (!handler) {
|
|
39
|
+
return null; // Not found
|
|
40
|
+
}
|
|
41
|
+
return handler.execute(args, ctx);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if a command is registered.
|
|
45
|
+
*/
|
|
46
|
+
has(command) {
|
|
47
|
+
return this.handlers.has(command);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get a handler by name.
|
|
51
|
+
*/
|
|
52
|
+
get(command) {
|
|
53
|
+
return this.handlers.get(command);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get all unique handlers (no duplicates from aliases).
|
|
57
|
+
*/
|
|
58
|
+
getAll() {
|
|
59
|
+
return [...new Set(this.handlers.values())];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get all registered command names (including aliases).
|
|
63
|
+
*/
|
|
64
|
+
getCommandNames() {
|
|
65
|
+
return [...this.handlers.keys()];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// =============================================================================
|
|
69
|
+
// Singleton Export
|
|
70
|
+
// =============================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Global command registry instance.
|
|
73
|
+
* Use this to register and execute commands.
|
|
74
|
+
*/
|
|
75
|
+
export const commandRegistry = new CommandRegistry();
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Commands for REPL V2
|
|
3
|
+
*
|
|
4
|
+
* Commands for context management: compact, context, tokens, status, todos, export
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandHandlerV2 } from '../types.js';
|
|
7
|
+
export declare const compactCommand: CommandHandlerV2;
|
|
8
|
+
export declare const contextCommand: CommandHandlerV2;
|
|
9
|
+
export declare const tokensCommand: CommandHandlerV2;
|
|
10
|
+
export declare const statusCommand: CommandHandlerV2;
|
|
11
|
+
export declare const todosCommand: CommandHandlerV2;
|
|
12
|
+
export declare const exportCommand: CommandHandlerV2;
|
|
13
|
+
export declare const contextCommands: CommandHandlerV2[];
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Commands for REPL V2
|
|
3
|
+
*
|
|
4
|
+
* Commands for context management: compact, context, tokens, status, todos, export
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import pc from 'picocolors';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Helper: Progress Bar
|
|
11
|
+
// =============================================================================
|
|
12
|
+
function renderProgressBar(ratio, width) {
|
|
13
|
+
const clamped = Math.max(0, Math.min(1, ratio));
|
|
14
|
+
const filled = Math.round(clamped * width);
|
|
15
|
+
const empty = width - filled;
|
|
16
|
+
const color = clamped > 0.9 ? pc.red : clamped > 0.7 ? pc.yellow : pc.green;
|
|
17
|
+
return color('█'.repeat(filled)) + pc.dim('░'.repeat(empty));
|
|
18
|
+
}
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Compact Command
|
|
21
|
+
// =============================================================================
|
|
22
|
+
export const compactCommand = {
|
|
23
|
+
name: 'compact',
|
|
24
|
+
description: 'Summarize old messages to free context',
|
|
25
|
+
async execute(_args, ctx) {
|
|
26
|
+
// Check if agent is available
|
|
27
|
+
if (!ctx.agent) {
|
|
28
|
+
ctx.ui.print({ type: 'warning', message: 'Agent not available for compaction' });
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const contextManager = ctx.getContextManager?.();
|
|
32
|
+
if (!contextManager) {
|
|
33
|
+
ctx.ui.print({ type: 'warning', message: 'Context manager not available' });
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
const history = ctx.getHistory?.() ?? [];
|
|
37
|
+
if (history.length === 0) {
|
|
38
|
+
ctx.ui.print({ type: 'info', message: 'No conversation history to compact' });
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
// Show current stats
|
|
42
|
+
const stats = contextManager.getStats(history.length);
|
|
43
|
+
const pct = (stats.utilization * 100).toFixed(1);
|
|
44
|
+
ctx.ui.print({
|
|
45
|
+
type: 'info',
|
|
46
|
+
message: `Current: ${stats.currentTokens.toLocaleString()} tokens (${pct}%), ${String(history.length)} messages`,
|
|
47
|
+
});
|
|
48
|
+
// Start compaction (user explicitly requested via /compact)
|
|
49
|
+
ctx.ui.print({ type: 'info', message: 'Compacting context...' });
|
|
50
|
+
try {
|
|
51
|
+
// Use the agent's compact() method
|
|
52
|
+
const result = (await ctx.agent.compact());
|
|
53
|
+
if (!result.success) {
|
|
54
|
+
ctx.ui.print({ type: 'warning', message: 'Compaction not available' });
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
// Build status message
|
|
58
|
+
const newHistory = ctx.getHistory?.() ?? [];
|
|
59
|
+
const statusParts = [];
|
|
60
|
+
// Token reduction
|
|
61
|
+
const originalTokens = result.originalTokens ?? 0;
|
|
62
|
+
const summaryTokens = result.summaryTokens ?? 0;
|
|
63
|
+
const reduction = originalTokens > 0 ? Math.round((1 - summaryTokens / originalTokens) * 100) : 0;
|
|
64
|
+
statusParts.push(`Compacted: ${originalTokens.toLocaleString()} → ${summaryTokens.toLocaleString()} tokens (-${String(reduction)}%)`);
|
|
65
|
+
// Message count
|
|
66
|
+
statusParts.push(`Messages: ${String(history.length)} → ${String(newHistory.length)} (${String(result.messagesPreserved ?? 0)} preserved)`);
|
|
67
|
+
// Category actions
|
|
68
|
+
if (result.categoryStats) {
|
|
69
|
+
const actions = [];
|
|
70
|
+
if (result.categoryStats.toolResults.action === 'compacted') {
|
|
71
|
+
actions.push('tool results → files');
|
|
72
|
+
}
|
|
73
|
+
if (result.categoryStats.history.action === 'summarized') {
|
|
74
|
+
actions.push('history → summary');
|
|
75
|
+
}
|
|
76
|
+
if (actions.length > 0) {
|
|
77
|
+
statusParts.push(`Actions: ${actions.join(', ')}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Files created
|
|
81
|
+
if (result.filesCreated && result.filesCreated.length > 0) {
|
|
82
|
+
statusParts.push(`Files created: ${String(result.filesCreated.length)}`);
|
|
83
|
+
}
|
|
84
|
+
// Restoration hints
|
|
85
|
+
if (result.restorationHintsInjected) {
|
|
86
|
+
statusParts.push('File tracking hints injected');
|
|
87
|
+
}
|
|
88
|
+
// Tool results repaired
|
|
89
|
+
if (result.toolResultsRepaired && result.toolResultsRepaired > 0) {
|
|
90
|
+
statusParts.push(`Orphaned tool results removed: ${String(result.toolResultsRepaired)}`);
|
|
91
|
+
}
|
|
92
|
+
// Print results
|
|
93
|
+
for (const part of statusParts) {
|
|
94
|
+
ctx.ui.print({ type: 'success', message: part });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
ctx.ui.print({ type: 'error', message: `Compaction failed: ${error.message}` });
|
|
99
|
+
}
|
|
100
|
+
return true;
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
// =============================================================================
|
|
104
|
+
// Context Command
|
|
105
|
+
// =============================================================================
|
|
106
|
+
export const contextCommand = {
|
|
107
|
+
name: 'context',
|
|
108
|
+
description: 'Show context window usage',
|
|
109
|
+
execute(_args, ctx) {
|
|
110
|
+
const lines = [];
|
|
111
|
+
lines.push('');
|
|
112
|
+
lines.push(pc.bold('Context Usage'));
|
|
113
|
+
lines.push(pc.dim('─'.repeat(40)));
|
|
114
|
+
const contextManager = ctx.getContextManager?.();
|
|
115
|
+
const history = ctx.getHistory?.() ?? [];
|
|
116
|
+
if (contextManager) {
|
|
117
|
+
const stats = contextManager.getStats(history.length);
|
|
118
|
+
const pct = (stats.utilization * 100).toFixed(1);
|
|
119
|
+
const bar = renderProgressBar(stats.utilization, 20);
|
|
120
|
+
lines.push(` Usage: ${bar} ${pct}%`);
|
|
121
|
+
lines.push(` Tokens: ${pc.cyan(stats.currentTokens.toLocaleString())} / ${pc.dim(stats.maxTokens.toLocaleString())}`);
|
|
122
|
+
lines.push(` Messages: ${pc.cyan(String(stats.messageCount))}`);
|
|
123
|
+
lines.push(` Turns: ${pc.cyan(String(stats.turnCount))}`);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Fallback to session tracking
|
|
127
|
+
const inputTokens = ctx.sessionInputTokens ?? 0;
|
|
128
|
+
const outputTokens = ctx.sessionOutputTokens ?? 0;
|
|
129
|
+
const total = inputTokens + outputTokens;
|
|
130
|
+
const maxTokens = 200000;
|
|
131
|
+
const utilization = total / maxTokens;
|
|
132
|
+
const pct = (utilization * 100).toFixed(1);
|
|
133
|
+
const bar = renderProgressBar(utilization, 20);
|
|
134
|
+
lines.push(` Usage: ${bar} ${pct}%`);
|
|
135
|
+
lines.push(` Tokens: ${pc.cyan(total.toLocaleString())} / ${pc.dim(maxTokens.toLocaleString())}`);
|
|
136
|
+
lines.push(` Input: ${pc.cyan(inputTokens.toLocaleString())}`);
|
|
137
|
+
lines.push(` Output: ${pc.cyan(outputTokens.toLocaleString())}`);
|
|
138
|
+
lines.push(` Messages: ${pc.cyan(String(history.length))}`);
|
|
139
|
+
}
|
|
140
|
+
lines.push('');
|
|
141
|
+
ctx.ui.print({ type: 'raw-lines', lines });
|
|
142
|
+
return Promise.resolve(true);
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
// =============================================================================
|
|
146
|
+
// Tokens Command
|
|
147
|
+
// =============================================================================
|
|
148
|
+
export const tokensCommand = {
|
|
149
|
+
name: 'tokens',
|
|
150
|
+
description: 'Show token usage',
|
|
151
|
+
execute(_args, ctx) {
|
|
152
|
+
const lines = [];
|
|
153
|
+
lines.push('');
|
|
154
|
+
lines.push(pc.bold('Token Usage'));
|
|
155
|
+
lines.push(pc.dim('─'.repeat(40)));
|
|
156
|
+
const inputTokens = ctx.sessionInputTokens ?? 0;
|
|
157
|
+
const outputTokens = ctx.sessionOutputTokens ?? 0;
|
|
158
|
+
const total = inputTokens + outputTokens;
|
|
159
|
+
lines.push(` Input: ${pc.cyan(inputTokens.toLocaleString())} tokens`);
|
|
160
|
+
lines.push(` Output: ${pc.cyan(outputTokens.toLocaleString())} tokens`);
|
|
161
|
+
lines.push(pc.dim(' ─'.repeat(20)));
|
|
162
|
+
lines.push(` Total: ${pc.bold(pc.cyan(total.toLocaleString()))} tokens`);
|
|
163
|
+
lines.push('');
|
|
164
|
+
ctx.ui.print({ type: 'raw-lines', lines });
|
|
165
|
+
return Promise.resolve(true);
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
// =============================================================================
|
|
169
|
+
// Status Command
|
|
170
|
+
// =============================================================================
|
|
171
|
+
export const statusCommand = {
|
|
172
|
+
name: 'status',
|
|
173
|
+
description: 'Show session status',
|
|
174
|
+
execute(_args, ctx) {
|
|
175
|
+
const lines = [];
|
|
176
|
+
lines.push('');
|
|
177
|
+
lines.push(pc.bold('Status'));
|
|
178
|
+
lines.push(pc.dim('─'.repeat(40)));
|
|
179
|
+
lines.push(` Version: ${pc.cyan(ctx.version)}`);
|
|
180
|
+
lines.push(` Model: ${pc.cyan(ctx.model ?? 'not set')}`);
|
|
181
|
+
lines.push(` Provider: ${pc.cyan(ctx.provider ?? 'not set')}`);
|
|
182
|
+
const contextManager = ctx.getContextManager?.();
|
|
183
|
+
const history = ctx.getHistory?.() ?? [];
|
|
184
|
+
if (contextManager) {
|
|
185
|
+
const stats = contextManager.getStats(history.length);
|
|
186
|
+
const pct = (stats.utilization * 100).toFixed(1);
|
|
187
|
+
const bar = renderProgressBar(stats.utilization, 20);
|
|
188
|
+
lines.push(` Context: ${bar} ${pct}%`);
|
|
189
|
+
lines.push(` Messages: ${pc.cyan(String(stats.messageCount))}`);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
const inputTokens = ctx.sessionInputTokens ?? 0;
|
|
193
|
+
const outputTokens = ctx.sessionOutputTokens ?? 0;
|
|
194
|
+
const total = inputTokens + outputTokens;
|
|
195
|
+
lines.push(` Tokens: ${pc.cyan(total.toLocaleString())}`);
|
|
196
|
+
lines.push(` Messages: ${pc.cyan(String(history.length))}`);
|
|
197
|
+
}
|
|
198
|
+
lines.push(` Requests: ${pc.cyan(String(ctx.sessionRequests ?? 0))}`);
|
|
199
|
+
lines.push('');
|
|
200
|
+
ctx.ui.print({ type: 'raw-lines', lines });
|
|
201
|
+
return Promise.resolve(true);
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
// =============================================================================
|
|
205
|
+
// Todos Command
|
|
206
|
+
// =============================================================================
|
|
207
|
+
export const todosCommand = {
|
|
208
|
+
name: 'todos',
|
|
209
|
+
description: 'Show current todo list',
|
|
210
|
+
execute(_args, ctx) {
|
|
211
|
+
const todos = ctx.ui.getTodos();
|
|
212
|
+
const lines = [];
|
|
213
|
+
lines.push('');
|
|
214
|
+
if (todos.length === 0) {
|
|
215
|
+
lines.push(pc.dim('No todos. The agent will create todos when working on tasks.'));
|
|
216
|
+
lines.push('');
|
|
217
|
+
ctx.ui.print({ type: 'raw-lines', lines });
|
|
218
|
+
return Promise.resolve(true);
|
|
219
|
+
}
|
|
220
|
+
lines.push(pc.bold('Todos'));
|
|
221
|
+
lines.push(pc.dim('─'.repeat(40)));
|
|
222
|
+
for (const todo of todos) {
|
|
223
|
+
let icon;
|
|
224
|
+
let style;
|
|
225
|
+
switch (todo.status) {
|
|
226
|
+
case 'completed':
|
|
227
|
+
icon = pc.green('✓');
|
|
228
|
+
style = pc.strikethrough;
|
|
229
|
+
break;
|
|
230
|
+
case 'in_progress':
|
|
231
|
+
icon = pc.yellow('●');
|
|
232
|
+
style = pc.bold;
|
|
233
|
+
break;
|
|
234
|
+
default:
|
|
235
|
+
icon = pc.dim('○');
|
|
236
|
+
style = (s) => s;
|
|
237
|
+
}
|
|
238
|
+
lines.push(` ${icon} ${style(todo.content)}`);
|
|
239
|
+
}
|
|
240
|
+
lines.push('');
|
|
241
|
+
ctx.ui.print({ type: 'raw-lines', lines });
|
|
242
|
+
return Promise.resolve(true);
|
|
243
|
+
},
|
|
244
|
+
};
|
|
245
|
+
// =============================================================================
|
|
246
|
+
// Export Command
|
|
247
|
+
// =============================================================================
|
|
248
|
+
export const exportCommand = {
|
|
249
|
+
name: 'export',
|
|
250
|
+
description: 'Export conversation to file',
|
|
251
|
+
execute(args, ctx) {
|
|
252
|
+
const history = ctx.getHistory?.() ?? [];
|
|
253
|
+
if (history.length === 0) {
|
|
254
|
+
ctx.ui.print({ type: 'warning', message: 'No conversation to export' });
|
|
255
|
+
return Promise.resolve(true);
|
|
256
|
+
}
|
|
257
|
+
// Format conversation as markdown
|
|
258
|
+
const markdown = formatConversationAsMarkdown(history, ctx.model ?? 'unknown');
|
|
259
|
+
// Determine filename
|
|
260
|
+
let filename;
|
|
261
|
+
if (args.trim()) {
|
|
262
|
+
filename = args.trim();
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
// Default: conversation-YYYY-MM-DD-HHMMSS.md
|
|
266
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
267
|
+
filename = `conversation-${timestamp}.md`;
|
|
268
|
+
}
|
|
269
|
+
const filepath = path.isAbsolute(filename) ? filename : path.join(process.cwd(), filename);
|
|
270
|
+
try {
|
|
271
|
+
fs.writeFileSync(filepath, markdown, 'utf-8');
|
|
272
|
+
ctx.ui.print({ type: 'success', message: `Exported ${String(history.length)} messages to ${filepath}` });
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
ctx.ui.print({ type: 'error', message: `Failed to export: ${error.message}` });
|
|
276
|
+
}
|
|
277
|
+
return Promise.resolve(true);
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
// =============================================================================
|
|
281
|
+
// Helper: Format Conversation as Markdown
|
|
282
|
+
// =============================================================================
|
|
283
|
+
function formatConversationAsMarkdown(history, model) {
|
|
284
|
+
const lines = [];
|
|
285
|
+
const timestamp = new Date().toISOString().split('T')[0];
|
|
286
|
+
lines.push(`# Conversation Export`);
|
|
287
|
+
lines.push('');
|
|
288
|
+
lines.push(`**Model:** ${model}`);
|
|
289
|
+
lines.push(`**Date:** ${timestamp}`);
|
|
290
|
+
lines.push(`**Messages:** ${String(history.length)}`);
|
|
291
|
+
lines.push('');
|
|
292
|
+
lines.push('---');
|
|
293
|
+
lines.push('');
|
|
294
|
+
for (const msg of history) {
|
|
295
|
+
const role = msg.role === 'user' ? '👤 User' : '🤖 Assistant';
|
|
296
|
+
lines.push(`## ${role}`);
|
|
297
|
+
lines.push('');
|
|
298
|
+
if (typeof msg.content === 'string') {
|
|
299
|
+
lines.push(msg.content);
|
|
300
|
+
}
|
|
301
|
+
else if (Array.isArray(msg.content)) {
|
|
302
|
+
// Handle content blocks (tool calls, etc.)
|
|
303
|
+
for (const block of msg.content) {
|
|
304
|
+
if (typeof block === 'object' && block !== null) {
|
|
305
|
+
const b = block;
|
|
306
|
+
if (b.type === 'text' && typeof b.text === 'string') {
|
|
307
|
+
lines.push(b.text);
|
|
308
|
+
}
|
|
309
|
+
else if (b.type === 'tool_use') {
|
|
310
|
+
const toolName = typeof b.name === 'string' ? b.name : String(b.name);
|
|
311
|
+
lines.push(`**Tool:** \`${toolName}\``);
|
|
312
|
+
if (b.input) {
|
|
313
|
+
lines.push('```json');
|
|
314
|
+
lines.push(JSON.stringify(b.input, null, 2));
|
|
315
|
+
lines.push('```');
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else if (b.type === 'tool_result') {
|
|
319
|
+
lines.push(`**Tool Result:**`);
|
|
320
|
+
if (typeof b.content === 'string') {
|
|
321
|
+
lines.push('```');
|
|
322
|
+
lines.push(b.content.slice(0, 500) + (b.content.length > 500 ? '...' : ''));
|
|
323
|
+
lines.push('```');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
else if (msg.content !== null && typeof msg.content === 'object') {
|
|
330
|
+
lines.push('```json');
|
|
331
|
+
lines.push(JSON.stringify(msg.content, null, 2));
|
|
332
|
+
lines.push('```');
|
|
333
|
+
}
|
|
334
|
+
lines.push('');
|
|
335
|
+
}
|
|
336
|
+
return lines.join('\n');
|
|
337
|
+
}
|
|
338
|
+
// =============================================================================
|
|
339
|
+
// Export All Context Commands
|
|
340
|
+
// =============================================================================
|
|
341
|
+
export const contextCommands = [
|
|
342
|
+
compactCommand,
|
|
343
|
+
contextCommand,
|
|
344
|
+
tokensCommand,
|
|
345
|
+
statusCommand,
|
|
346
|
+
todosCommand,
|
|
347
|
+
exportCommand,
|
|
348
|
+
];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Commands for REPL V2
|
|
3
|
+
*
|
|
4
|
+
* Essential commands: exit, clear, help
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandHandlerV2 } from '../types.js';
|
|
7
|
+
export declare const exitCommand: CommandHandlerV2;
|
|
8
|
+
export declare const clearCommand: CommandHandlerV2;
|
|
9
|
+
export declare const helpCommand: CommandHandlerV2;
|
|
10
|
+
export declare const tutorialCommand: CommandHandlerV2;
|
|
11
|
+
export declare const commandsCommand: CommandHandlerV2;
|
|
12
|
+
export declare const menuCommand: CommandHandlerV2;
|
|
13
|
+
export declare const coreCommands: CommandHandlerV2[];
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Commands for REPL V2
|
|
3
|
+
*
|
|
4
|
+
* Essential commands: exit, clear, help
|
|
5
|
+
*/
|
|
6
|
+
import { HelpOverlayV2, TutorialOverlayV2, CommandsOverlayV2, DashboardOverlayV2, } from '../../ui/overlay/index.js';
|
|
7
|
+
import { executeCommand } from '../registry.js';
|
|
8
|
+
import { projectRepository } from '../../db/repositories/index.js';
|
|
9
|
+
import { setCurrentProject } from '../../tools/project-db.js';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Exit Command
|
|
12
|
+
// =============================================================================
|
|
13
|
+
export const exitCommand = {
|
|
14
|
+
name: 'exit',
|
|
15
|
+
aliases: ['quit', 'q'],
|
|
16
|
+
description: 'Exit the REPL',
|
|
17
|
+
execute(_args, ctx) {
|
|
18
|
+
ctx.ui.stop();
|
|
19
|
+
console.log('\nGoodbye!\n');
|
|
20
|
+
return Promise.resolve(false);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
// =============================================================================
|
|
24
|
+
// Clear Command
|
|
25
|
+
// =============================================================================
|
|
26
|
+
export const clearCommand = {
|
|
27
|
+
name: 'clear',
|
|
28
|
+
aliases: ['cls'],
|
|
29
|
+
description: 'Clear the screen',
|
|
30
|
+
execute(_args, ctx) {
|
|
31
|
+
ctx.printWelcome();
|
|
32
|
+
return Promise.resolve(true);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
// =============================================================================
|
|
36
|
+
// Help Command
|
|
37
|
+
// =============================================================================
|
|
38
|
+
export const helpCommand = {
|
|
39
|
+
name: 'help',
|
|
40
|
+
aliases: ['h', '?'],
|
|
41
|
+
description: 'Show available commands',
|
|
42
|
+
async execute(_args, ctx) {
|
|
43
|
+
const helpOverlay = new HelpOverlayV2();
|
|
44
|
+
await ctx.ui.showOverlay(helpOverlay);
|
|
45
|
+
return true;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
// =============================================================================
|
|
49
|
+
// Tutorial Command
|
|
50
|
+
// =============================================================================
|
|
51
|
+
export const tutorialCommand = {
|
|
52
|
+
name: 'tutorial',
|
|
53
|
+
description: 'Interactive workflow tutorial',
|
|
54
|
+
async execute(_args, ctx) {
|
|
55
|
+
const tutorialOverlay = new TutorialOverlayV2();
|
|
56
|
+
const result = await ctx.ui.showOverlay(tutorialOverlay);
|
|
57
|
+
if (result?.completed) {
|
|
58
|
+
ctx.ui.print({ type: 'success', message: 'Tutorial completed!' });
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
// =============================================================================
|
|
64
|
+
// Commands Command
|
|
65
|
+
// =============================================================================
|
|
66
|
+
export const commandsCommand = {
|
|
67
|
+
name: 'commands',
|
|
68
|
+
description: 'Manage custom commands',
|
|
69
|
+
async execute(_args, ctx) {
|
|
70
|
+
const commandsOverlay = new CommandsOverlayV2();
|
|
71
|
+
const result = await ctx.ui.showOverlay(commandsOverlay);
|
|
72
|
+
if (result?.created) {
|
|
73
|
+
ctx.ui.print({ type: 'success', message: `Created command: /${result.created}` });
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
// =============================================================================
|
|
79
|
+
// Menu Command - Returns to Project Dashboard
|
|
80
|
+
// =============================================================================
|
|
81
|
+
export const menuCommand = {
|
|
82
|
+
name: 'menu',
|
|
83
|
+
description: 'Return to the Project Dashboard',
|
|
84
|
+
async execute(_args, ctx) {
|
|
85
|
+
// Print logo to scrolling area (stays visible while overlays render below)
|
|
86
|
+
ctx.printLogo();
|
|
87
|
+
// Dashboard loop - returns to dashboard after sub-commands until user exits or continues
|
|
88
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
89
|
+
while (true) {
|
|
90
|
+
const dashboard = new DashboardOverlayV2();
|
|
91
|
+
const result = await ctx.ui.showOverlay(dashboard);
|
|
92
|
+
if (!result) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
// Handle dashboard result actions
|
|
96
|
+
switch (result.action) {
|
|
97
|
+
case 'exit':
|
|
98
|
+
ctx.ui.stop();
|
|
99
|
+
console.log('\nGoodbye!\n');
|
|
100
|
+
return false;
|
|
101
|
+
case 'continue':
|
|
102
|
+
// Switch to selected project if different from current
|
|
103
|
+
if (result.projectId) {
|
|
104
|
+
const project = projectRepository.getById(result.projectId);
|
|
105
|
+
if (project) {
|
|
106
|
+
setCurrentProject({
|
|
107
|
+
id: project.id,
|
|
108
|
+
name: project.name,
|
|
109
|
+
displayName: project.displayName,
|
|
110
|
+
path: project.path,
|
|
111
|
+
});
|
|
112
|
+
ctx.ui.setProjectName(project.displayName);
|
|
113
|
+
ctx.ui.print({ type: 'success', message: `Switched to project: ${project.displayName}` });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return true; // Exit loop, return to REPL
|
|
117
|
+
case 'chat':
|
|
118
|
+
// Clear current project for quick chat mode
|
|
119
|
+
setCurrentProject(null);
|
|
120
|
+
ctx.ui.setProjectName(null);
|
|
121
|
+
ctx.ui.print({ type: 'warning', message: 'Quick Chat mode - no project context. Use /menu to select a project.' });
|
|
122
|
+
return true; // Exit loop, return to REPL
|
|
123
|
+
case 'new':
|
|
124
|
+
await executeCommand('new', '', ctx);
|
|
125
|
+
// Loop back to dashboard after /new completes
|
|
126
|
+
break;
|
|
127
|
+
case 'projects':
|
|
128
|
+
await executeCommand('projects', '', ctx);
|
|
129
|
+
// Loop back to dashboard after /projects completes
|
|
130
|
+
break;
|
|
131
|
+
case 'workflow':
|
|
132
|
+
await executeCommand('workflow', '', ctx);
|
|
133
|
+
// Loop back to dashboard after /workflow completes
|
|
134
|
+
break;
|
|
135
|
+
case 'help':
|
|
136
|
+
await executeCommand('help', '', ctx);
|
|
137
|
+
// Loop back to dashboard after /help closes
|
|
138
|
+
break;
|
|
139
|
+
case 'config':
|
|
140
|
+
await executeCommand('config', '', ctx);
|
|
141
|
+
// Loop back to dashboard after /config closes
|
|
142
|
+
break;
|
|
143
|
+
case 'about':
|
|
144
|
+
ctx.ui.print({ type: 'info', message: '@compilr-dev/cli v0.4.0' });
|
|
145
|
+
ctx.ui.print({ type: 'info', message: 'AI-powered coding assistant using @compilr-dev/agents' });
|
|
146
|
+
ctx.ui.print({ type: 'info', message: 'https://github.com/compilr-dev/cli' });
|
|
147
|
+
// Loop back to dashboard after showing about info
|
|
148
|
+
break;
|
|
149
|
+
default:
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
// =============================================================================
|
|
156
|
+
// Export All Core Commands
|
|
157
|
+
// =============================================================================
|
|
158
|
+
export const coreCommands = [
|
|
159
|
+
exitCommand,
|
|
160
|
+
clearCommand,
|
|
161
|
+
helpCommand,
|
|
162
|
+
tutorialCommand,
|
|
163
|
+
commandsCommand,
|
|
164
|
+
menuCommand,
|
|
165
|
+
];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug Commands for REPL V2
|
|
3
|
+
*
|
|
4
|
+
* Commands for testing and debugging: todos, suggest, bash, subagent
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandHandlerV2 } from '../types.js';
|
|
7
|
+
export declare const sampleTodosCommand: CommandHandlerV2;
|
|
8
|
+
export declare const suggestCommand: CommandHandlerV2;
|
|
9
|
+
export declare const bashCommand: CommandHandlerV2;
|
|
10
|
+
export declare const subagentCommand: CommandHandlerV2;
|
|
11
|
+
export declare const debugCommands: CommandHandlerV2[];
|