@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,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mascot Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Mascot selection overlay using the new Overlay interface.
|
|
5
|
+
* Shows all mascot expressions with live preview.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - All mascot expressions
|
|
9
|
+
* - Live preview
|
|
10
|
+
* - Persists selection to settings
|
|
11
|
+
* - Works with TerminalUI's overlay management
|
|
12
|
+
*/
|
|
13
|
+
import { BaseOverlayV2, isEscape, isEnter, isSpace, isCtrlC, isNavigateUp, isNavigateDown, isClose, renderBorder, } from '../../base/index.js';
|
|
14
|
+
import { getSettings, setSetting } from '../../../settings/index.js';
|
|
15
|
+
import { MASCOT_OPTIONS, MASCOT_LABELS, EXPRESSIONS, } from '../../mascot/index.js';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Mascot Overlay V2 Class
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Mascot overlay using the new Overlay interface.
|
|
21
|
+
* Displays mascot options with live preview.
|
|
22
|
+
*/
|
|
23
|
+
export class MascotOverlayV2 extends BaseOverlayV2 {
|
|
24
|
+
type = 'inline';
|
|
25
|
+
id = 'mascot-overlay-v2';
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
const currentMascot = options.currentMascot ?? getSettings().mascot;
|
|
28
|
+
// Find current mascot in options list
|
|
29
|
+
let selectedIndex = 0;
|
|
30
|
+
const mascotIndex = MASCOT_OPTIONS.findIndex(m => m === currentMascot);
|
|
31
|
+
if (mascotIndex >= 0) {
|
|
32
|
+
selectedIndex = mascotIndex;
|
|
33
|
+
}
|
|
34
|
+
const initialState = {
|
|
35
|
+
selectedIndex,
|
|
36
|
+
currentMascot,
|
|
37
|
+
};
|
|
38
|
+
super(initialState);
|
|
39
|
+
this.minHeight = 20;
|
|
40
|
+
}
|
|
41
|
+
renderContent(context) {
|
|
42
|
+
const s = context.styles;
|
|
43
|
+
const cols = context.width;
|
|
44
|
+
const border = renderBorder(cols, s);
|
|
45
|
+
const lines = [];
|
|
46
|
+
// Get preview lines for side-by-side layout
|
|
47
|
+
const selectedOption = MASCOT_OPTIONS[this.state.selectedIndex];
|
|
48
|
+
let previewLines = [];
|
|
49
|
+
let previewLabel = '';
|
|
50
|
+
if (selectedOption === 'none') {
|
|
51
|
+
previewLabel = '(No mascot)';
|
|
52
|
+
previewLines = ['', '', '', '', '', ''];
|
|
53
|
+
}
|
|
54
|
+
else if (selectedOption === 'random') {
|
|
55
|
+
previewLabel = '(Random on startup)';
|
|
56
|
+
previewLines = EXPRESSIONS.neutral;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
previewLabel = MASCOT_LABELS[selectedOption];
|
|
60
|
+
previewLines = EXPRESSIONS[selectedOption];
|
|
61
|
+
}
|
|
62
|
+
// Header
|
|
63
|
+
lines.push(border);
|
|
64
|
+
lines.push(` ${s.primaryBold('Select Mascot')}`);
|
|
65
|
+
lines.push('');
|
|
66
|
+
// Column widths
|
|
67
|
+
const listColWidth = 28;
|
|
68
|
+
const gap = 4;
|
|
69
|
+
const previewColStart = listColWidth + gap;
|
|
70
|
+
// Build side-by-side layout
|
|
71
|
+
const optionCount = MASCOT_OPTIONS.length;
|
|
72
|
+
const previewHeight = previewLines.length;
|
|
73
|
+
const previewStartRow = Math.max(0, Math.floor((optionCount - previewHeight) / 2));
|
|
74
|
+
for (let i = 0; i < Math.max(optionCount, previewStartRow + previewHeight + 1); i++) {
|
|
75
|
+
let leftPart = '';
|
|
76
|
+
let rightPart = '';
|
|
77
|
+
// Left column: option list
|
|
78
|
+
if (i < optionCount) {
|
|
79
|
+
const option = MASCOT_OPTIONS[i];
|
|
80
|
+
const isSelected = i === this.state.selectedIndex;
|
|
81
|
+
const isCurrent = option === this.state.currentMascot;
|
|
82
|
+
const prefix = isSelected ? s.primary('> ') : ' ';
|
|
83
|
+
const num = `${String(i + 1).padStart(2)}. `;
|
|
84
|
+
const checkmark = isCurrent ? s.success(' (current)') : '';
|
|
85
|
+
const label = isSelected ? s.primary(MASCOT_LABELS[option]) : s.muted(MASCOT_LABELS[option]);
|
|
86
|
+
leftPart = ` ${prefix}${num}${label}${checkmark}`;
|
|
87
|
+
}
|
|
88
|
+
// Right column: preview
|
|
89
|
+
const previewRow = i - previewStartRow;
|
|
90
|
+
if (previewRow === -1) {
|
|
91
|
+
rightPart = s.muted(previewLabel);
|
|
92
|
+
}
|
|
93
|
+
else if (previewRow >= 0 && previewRow < previewHeight) {
|
|
94
|
+
rightPart = s.secondary(previewLines[previewRow]);
|
|
95
|
+
}
|
|
96
|
+
// Combine columns with proper spacing
|
|
97
|
+
// eslint-disable-next-line no-control-regex
|
|
98
|
+
const leftPlain = leftPart.replace(/\x1b\[[0-9;]*m/g, '');
|
|
99
|
+
const padding = ' '.repeat(Math.max(0, previewColStart - leftPlain.length));
|
|
100
|
+
lines.push(leftPart + padding + rightPart);
|
|
101
|
+
}
|
|
102
|
+
// Footer
|
|
103
|
+
lines.push('');
|
|
104
|
+
lines.push(border);
|
|
105
|
+
lines.push(` ${s.muted('up/down/jk Navigate . Enter/Space Select . q/Esc Close')}`);
|
|
106
|
+
lines.push(border);
|
|
107
|
+
return lines;
|
|
108
|
+
}
|
|
109
|
+
handleKey(key) {
|
|
110
|
+
const data = key.raw;
|
|
111
|
+
const maxIndex = MASCOT_OPTIONS.length - 1;
|
|
112
|
+
// Ctrl+C always closes
|
|
113
|
+
if (isCtrlC(data)) {
|
|
114
|
+
return this.cancel();
|
|
115
|
+
}
|
|
116
|
+
// q or Esc closes
|
|
117
|
+
if (isEscape(data) || isClose(data)) {
|
|
118
|
+
return this.cancel();
|
|
119
|
+
}
|
|
120
|
+
// Navigation up
|
|
121
|
+
if (isNavigateUp(data) && this.state.selectedIndex > 0) {
|
|
122
|
+
this.state.selectedIndex--;
|
|
123
|
+
return this.rerender();
|
|
124
|
+
}
|
|
125
|
+
// Navigation down
|
|
126
|
+
if (isNavigateDown(data) && this.state.selectedIndex < maxIndex) {
|
|
127
|
+
this.state.selectedIndex++;
|
|
128
|
+
return this.rerender();
|
|
129
|
+
}
|
|
130
|
+
// Enter/Space to select
|
|
131
|
+
if (isEnter(data) || isSpace(data)) {
|
|
132
|
+
const selectedMascot = MASCOT_OPTIONS[this.state.selectedIndex];
|
|
133
|
+
setSetting('mascot', selectedMascot);
|
|
134
|
+
return this.close({ mascotChanged: selectedMascot });
|
|
135
|
+
}
|
|
136
|
+
return this.noAction();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Model selection overlay using TabbedListOverlayV2 for the new Overlay interface.
|
|
5
|
+
* Works with TerminalUI's overlay management.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Tabs by provider (Claude, OpenAI, Gemini, Ollama)
|
|
9
|
+
* - Hot-swap detection (same provider = immediate, different = restart)
|
|
10
|
+
* - API key status checking
|
|
11
|
+
* - Persists selection to settings
|
|
12
|
+
*/
|
|
13
|
+
import { TabbedListOverlayV2 } from '../../base/index.js';
|
|
14
|
+
interface ModelOption {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
provider: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ModelOverlayV2Options {
|
|
21
|
+
/** Current model ID */
|
|
22
|
+
currentModel?: string;
|
|
23
|
+
/** Current provider (for hot-swap detection) */
|
|
24
|
+
currentProvider?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ModelOverlayV2Result {
|
|
27
|
+
/** Selected model ID (if changed) */
|
|
28
|
+
modelChanged?: string;
|
|
29
|
+
/** Selected provider */
|
|
30
|
+
provider?: string;
|
|
31
|
+
/** Whether restart is required (different provider) */
|
|
32
|
+
requiresRestart?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Model selection overlay using the new Overlay interface.
|
|
36
|
+
* Displays available models in a tabbed list by provider.
|
|
37
|
+
*/
|
|
38
|
+
export declare class ModelOverlayV2 extends TabbedListOverlayV2<ModelOption, ModelOverlayV2Result> {
|
|
39
|
+
readonly type: "inline";
|
|
40
|
+
readonly id = "model-overlay-v2";
|
|
41
|
+
private readonly currentModel;
|
|
42
|
+
private readonly currentProvider;
|
|
43
|
+
constructor(options?: ModelOverlayV2Options);
|
|
44
|
+
/**
|
|
45
|
+
* Override to handle model selection on Enter.
|
|
46
|
+
*/
|
|
47
|
+
protected onItemSelected(item: ModelOption): ModelOverlayV2Result | undefined;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Model selection overlay using TabbedListOverlayV2 for the new Overlay interface.
|
|
5
|
+
* Works with TerminalUI's overlay management.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Tabs by provider (Claude, OpenAI, Gemini, Ollama)
|
|
9
|
+
* - Hot-swap detection (same provider = immediate, different = restart)
|
|
10
|
+
* - API key status checking
|
|
11
|
+
* - Persists selection to settings
|
|
12
|
+
*/
|
|
13
|
+
import { TabbedListOverlayV2, } from '../../base/index.js';
|
|
14
|
+
import { setSetting } from '../../../settings/index.js';
|
|
15
|
+
import { hasApiKey, settingsProviderToCredentialKey } from '../../../utils/credentials.js';
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Constants
|
|
18
|
+
// =============================================================================
|
|
19
|
+
const PAGE_SIZE = 10;
|
|
20
|
+
const PROVIDER_TABS = [
|
|
21
|
+
{ id: 'claude', label: 'Claude' },
|
|
22
|
+
{ id: 'openai', label: 'OpenAI' },
|
|
23
|
+
{ id: 'gemini', label: 'Gemini' },
|
|
24
|
+
{ id: 'ollama', label: 'Ollama' },
|
|
25
|
+
];
|
|
26
|
+
const MODEL_OPTIONS = [
|
|
27
|
+
// Claude
|
|
28
|
+
{ id: 'claude-sonnet-4-20250514', name: 'Sonnet 4', description: 'Best for everyday tasks', provider: 'claude' },
|
|
29
|
+
{ id: 'claude-opus-4-20250514', name: 'Opus 4', description: 'Most capable for complex work', provider: 'claude' },
|
|
30
|
+
{ id: 'claude-3-5-haiku-20241022', name: 'Haiku 3.5', description: 'Fastest for quick answers', provider: 'claude' },
|
|
31
|
+
// OpenAI
|
|
32
|
+
{ id: 'gpt-4o', name: 'GPT-4o', description: 'Best overall', provider: 'openai' },
|
|
33
|
+
{ id: 'gpt-4o-mini', name: 'GPT-4o Mini', description: 'Fast and affordable', provider: 'openai' },
|
|
34
|
+
// Gemini
|
|
35
|
+
{ id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', description: 'Fast multimodal', provider: 'gemini' },
|
|
36
|
+
{ id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', description: 'Latest stable flash', provider: 'gemini' },
|
|
37
|
+
{ id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', description: 'Most capable Gemini', provider: 'gemini' },
|
|
38
|
+
// Ollama
|
|
39
|
+
{ id: 'llama3.2', name: 'Llama 3.2', description: 'Local model', provider: 'ollama' },
|
|
40
|
+
{ id: 'mistral', name: 'Mistral', description: 'Local model', provider: 'ollama' },
|
|
41
|
+
{ id: 'codellama', name: 'Code Llama', description: 'Code-focused local model', provider: 'ollama' },
|
|
42
|
+
];
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// Model Overlay V2 Class
|
|
45
|
+
// =============================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Model selection overlay using the new Overlay interface.
|
|
48
|
+
* Displays available models in a tabbed list by provider.
|
|
49
|
+
*/
|
|
50
|
+
export class ModelOverlayV2 extends TabbedListOverlayV2 {
|
|
51
|
+
type = 'inline';
|
|
52
|
+
id = 'model-overlay-v2';
|
|
53
|
+
currentModel;
|
|
54
|
+
currentProvider;
|
|
55
|
+
constructor(options = {}) {
|
|
56
|
+
const currentModel = options.currentModel ?? 'claude-sonnet-4-20250514';
|
|
57
|
+
const currentProvider = options.currentProvider ?? 'claude';
|
|
58
|
+
// Find the initial tab based on current provider
|
|
59
|
+
const initialTabIndex = PROVIDER_TABS.findIndex((t) => t.id === currentProvider);
|
|
60
|
+
super({
|
|
61
|
+
title: 'Select Model',
|
|
62
|
+
tabs: PROVIDER_TABS,
|
|
63
|
+
items: MODEL_OPTIONS,
|
|
64
|
+
pageSize: PAGE_SIZE,
|
|
65
|
+
filterByTab: (item, tabId) => item.provider === tabId,
|
|
66
|
+
getSearchText: (item) => `${item.name} ${item.description} ${item.id}`,
|
|
67
|
+
renderItem: (item, isSelected, styles) => {
|
|
68
|
+
const isCurrent = item.id === currentModel;
|
|
69
|
+
const prefix = isSelected ? styles.primary(' > ') : ' ';
|
|
70
|
+
// Check API key status for this provider
|
|
71
|
+
const providerType = item.provider;
|
|
72
|
+
const credKey = settingsProviderToCredentialKey(providerType);
|
|
73
|
+
const hasKey = item.provider === 'ollama' || hasApiKey(credKey);
|
|
74
|
+
const keyIndicator = hasKey ? styles.success('●') : styles.error('○');
|
|
75
|
+
const name = isSelected
|
|
76
|
+
? styles.primary(item.name.padEnd(18))
|
|
77
|
+
: styles.muted(item.name.padEnd(18));
|
|
78
|
+
const desc = styles.muted(item.description);
|
|
79
|
+
const currentBadge = isCurrent ? styles.success(' (current)') : '';
|
|
80
|
+
return `${prefix}${keyIndicator} ${name}${desc}${currentBadge}`;
|
|
81
|
+
},
|
|
82
|
+
footerHints: (searchMode) => {
|
|
83
|
+
if (searchMode) {
|
|
84
|
+
return 'Type to filter · ↑↓/jk Navigate · Enter Select · Esc Exit search';
|
|
85
|
+
}
|
|
86
|
+
return 'Tab Provider · ↑↓/jk · / Search · Enter Select · q/Esc Close';
|
|
87
|
+
},
|
|
88
|
+
emptyMessage: 'No models available for this provider.',
|
|
89
|
+
noResultsMessage: 'No models match the search.',
|
|
90
|
+
});
|
|
91
|
+
this.currentModel = currentModel;
|
|
92
|
+
this.currentProvider = currentProvider;
|
|
93
|
+
// Set initial tab based on current provider
|
|
94
|
+
if (initialTabIndex >= 0) {
|
|
95
|
+
this.state.currentTab = initialTabIndex;
|
|
96
|
+
// Re-filter items for the selected tab
|
|
97
|
+
this.state.filteredItems = MODEL_OPTIONS.filter((item) => item.provider === PROVIDER_TABS[initialTabIndex]?.id);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Override to handle model selection on Enter.
|
|
102
|
+
*/
|
|
103
|
+
onItemSelected(item) {
|
|
104
|
+
if (item.id === this.currentModel) {
|
|
105
|
+
// Same model, no change
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
// Save to settings
|
|
109
|
+
setSetting('defaultModel', item.id);
|
|
110
|
+
setSetting('defaultProvider', item.provider);
|
|
111
|
+
const requiresRestart = item.provider !== this.currentProvider;
|
|
112
|
+
return {
|
|
113
|
+
modelChanged: item.id,
|
|
114
|
+
provider: item.provider,
|
|
115
|
+
requiresRestart,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Warning Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Shows a warning when the user runs a command that requires
|
|
5
|
+
* a larger model than they're currently using.
|
|
6
|
+
* Uses BaseOverlayV2 for TerminalUI integration.
|
|
7
|
+
*
|
|
8
|
+
* Offers options to:
|
|
9
|
+
* - Switch to a recommended model
|
|
10
|
+
* - Use a simpler alternative command
|
|
11
|
+
* - Continue anyway
|
|
12
|
+
* - Cancel
|
|
13
|
+
*/
|
|
14
|
+
import { BaseOverlayV2 } from '../../base/index.js';
|
|
15
|
+
import type { RenderContext, OverlayAction, KeyEvent } from '../types.js';
|
|
16
|
+
import type { TierLevel } from '../../../utils/model-tiers.js';
|
|
17
|
+
export interface ModelWarningOptionsV2 {
|
|
18
|
+
/** The command being run (e.g., '/design') */
|
|
19
|
+
command: string;
|
|
20
|
+
/** Current model ID */
|
|
21
|
+
currentModel: string;
|
|
22
|
+
/** Current model's tier */
|
|
23
|
+
currentTier: TierLevel;
|
|
24
|
+
/** Suggested upgrade model (if available) */
|
|
25
|
+
suggestedModel?: string;
|
|
26
|
+
/** Alternative simpler command (e.g., '/sketch') */
|
|
27
|
+
alternativeCommand?: string;
|
|
28
|
+
}
|
|
29
|
+
export type ModelWarningChoiceV2 = 'switch' | 'alternative' | 'continue' | 'cancel';
|
|
30
|
+
interface ModelWarningState {
|
|
31
|
+
selectedIndex: number;
|
|
32
|
+
}
|
|
33
|
+
export declare class ModelWarningOverlayV2 extends BaseOverlayV2<ModelWarningState, ModelWarningChoiceV2> {
|
|
34
|
+
readonly type: "inline";
|
|
35
|
+
readonly id = "model-warning-overlay-v2";
|
|
36
|
+
private readonly options;
|
|
37
|
+
private readonly choiceOptions;
|
|
38
|
+
constructor(options: ModelWarningOptionsV2);
|
|
39
|
+
protected renderContent(context: RenderContext): string[];
|
|
40
|
+
handleKey(key: KeyEvent): OverlayAction<ModelWarningChoiceV2>;
|
|
41
|
+
/**
|
|
42
|
+
* Summary shown after overlay closes.
|
|
43
|
+
*/
|
|
44
|
+
getCloseSummary(result: ModelWarningChoiceV2): string | null;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Warning Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Shows a warning when the user runs a command that requires
|
|
5
|
+
* a larger model than they're currently using.
|
|
6
|
+
* Uses BaseOverlayV2 for TerminalUI integration.
|
|
7
|
+
*
|
|
8
|
+
* Offers options to:
|
|
9
|
+
* - Switch to a recommended model
|
|
10
|
+
* - Use a simpler alternative command
|
|
11
|
+
* - Continue anyway
|
|
12
|
+
* - Cancel
|
|
13
|
+
*/
|
|
14
|
+
import { BaseOverlayV2, renderBorder } from '../../base/index.js';
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Overlay Implementation
|
|
17
|
+
// =============================================================================
|
|
18
|
+
export class ModelWarningOverlayV2 extends BaseOverlayV2 {
|
|
19
|
+
type = 'inline';
|
|
20
|
+
id = 'model-warning-overlay-v2';
|
|
21
|
+
options;
|
|
22
|
+
choiceOptions;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
super({
|
|
25
|
+
selectedIndex: 0,
|
|
26
|
+
});
|
|
27
|
+
this.options = options;
|
|
28
|
+
this.minHeight = 16; // Prevent jitter
|
|
29
|
+
// Build choice options based on what's available
|
|
30
|
+
this.choiceOptions = [];
|
|
31
|
+
if (options.suggestedModel) {
|
|
32
|
+
this.choiceOptions.push({
|
|
33
|
+
key: '1',
|
|
34
|
+
label: `Switch to ${options.suggestedModel} and continue`,
|
|
35
|
+
choice: 'switch',
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (options.alternativeCommand) {
|
|
39
|
+
this.choiceOptions.push({
|
|
40
|
+
key: String(this.choiceOptions.length + 1),
|
|
41
|
+
label: `Use ${options.alternativeCommand} instead (simpler, works with any model)`,
|
|
42
|
+
choice: 'alternative',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
this.choiceOptions.push({
|
|
46
|
+
key: String(this.choiceOptions.length + 1),
|
|
47
|
+
label: 'Continue with current model anyway',
|
|
48
|
+
choice: 'continue',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
renderContent(context) {
|
|
52
|
+
const s = context.styles;
|
|
53
|
+
const lines = [];
|
|
54
|
+
const cols = context.width;
|
|
55
|
+
const border = renderBorder(cols, s);
|
|
56
|
+
// Header
|
|
57
|
+
lines.push(border);
|
|
58
|
+
lines.push(' ' + s.warning('! Model Recommendation'));
|
|
59
|
+
lines.push('');
|
|
60
|
+
// Description
|
|
61
|
+
lines.push(` ${this.options.command} works best with larger models for complex`);
|
|
62
|
+
lines.push(' multi-question workflows.');
|
|
63
|
+
lines.push('');
|
|
64
|
+
// Current and recommended
|
|
65
|
+
lines.push(` Current: ${s.muted(this.options.currentModel)} (${this.options.currentTier} tier)`);
|
|
66
|
+
if (this.options.suggestedModel) {
|
|
67
|
+
lines.push(` Recommended: ${s.primary(this.options.suggestedModel)} (large tier)`);
|
|
68
|
+
}
|
|
69
|
+
lines.push('');
|
|
70
|
+
// Separator
|
|
71
|
+
lines.push(border);
|
|
72
|
+
// Options
|
|
73
|
+
for (let i = 0; i < this.choiceOptions.length; i++) {
|
|
74
|
+
const opt = this.choiceOptions[i];
|
|
75
|
+
const isCursor = this.state.selectedIndex === i;
|
|
76
|
+
const prefix = isCursor ? ' > ' : ' ';
|
|
77
|
+
if (isCursor) {
|
|
78
|
+
lines.push(s.primary(`${prefix}[${opt.key}] ${opt.label}`));
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push(s.muted(`${prefix}[${opt.key}] ${opt.label}`));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Footer
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push(s.muted(' Up/Down Navigate | Enter Select | Esc Cancel'));
|
|
87
|
+
lines.push(border);
|
|
88
|
+
return lines;
|
|
89
|
+
}
|
|
90
|
+
handleKey(key) {
|
|
91
|
+
// Ctrl+C or Escape cancels
|
|
92
|
+
if ((key.ctrl && key.name === 'c') || key.name === 'escape') {
|
|
93
|
+
return this.close('cancel');
|
|
94
|
+
}
|
|
95
|
+
// Navigation
|
|
96
|
+
if (key.name === 'up') {
|
|
97
|
+
this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
|
|
98
|
+
return this.rerender();
|
|
99
|
+
}
|
|
100
|
+
if (key.name === 'down') {
|
|
101
|
+
this.state.selectedIndex = Math.min(this.choiceOptions.length - 1, this.state.selectedIndex + 1);
|
|
102
|
+
return this.rerender();
|
|
103
|
+
}
|
|
104
|
+
if (key.name === 'return') {
|
|
105
|
+
return this.close(this.choiceOptions[this.state.selectedIndex].choice);
|
|
106
|
+
}
|
|
107
|
+
// Number keys 1-9
|
|
108
|
+
if (key.char && key.char >= '1' && key.char <= '9') {
|
|
109
|
+
const numIndex = parseInt(key.char, 10) - 1;
|
|
110
|
+
if (numIndex < this.choiceOptions.length) {
|
|
111
|
+
return this.close(this.choiceOptions[numIndex].choice);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return this.noAction();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Summary shown after overlay closes.
|
|
118
|
+
*/
|
|
119
|
+
getCloseSummary(result) {
|
|
120
|
+
const s = this.getStyles();
|
|
121
|
+
switch (result) {
|
|
122
|
+
case 'switch':
|
|
123
|
+
return s.muted('Model: ') + s.success(`Switching to ${this.options.suggestedModel ?? 'recommended'}`);
|
|
124
|
+
case 'alternative':
|
|
125
|
+
return s.muted('Model: ') + s.primary(`Using ${this.options.alternativeCommand ?? 'alternative'}`);
|
|
126
|
+
case 'continue':
|
|
127
|
+
return s.muted('Model: ') + s.warning('Continuing with current');
|
|
128
|
+
case 'cancel':
|
|
129
|
+
return s.muted('Model: ') + s.error('Cancelled');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* New Project Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for the /new wizard - creates new projects with structured workflow.
|
|
5
|
+
* Uses BaseOverlayV2 for TerminalUI integration.
|
|
6
|
+
*
|
|
7
|
+
* Steps:
|
|
8
|
+
* 0. Project type (new vs existing)
|
|
9
|
+
* 1. Project name
|
|
10
|
+
* 2. Description
|
|
11
|
+
* 3. Repo pattern (single vs two-repo)
|
|
12
|
+
* 4. Tech stack
|
|
13
|
+
* 5. Coding standards
|
|
14
|
+
* 6. Initialize git?
|
|
15
|
+
* 7. Track with project database?
|
|
16
|
+
* 8. Workflow mode (if tracking enabled)
|
|
17
|
+
* 9. Confirmation
|
|
18
|
+
*/
|
|
19
|
+
import { BaseOverlayV2 } from '../../base/index.js';
|
|
20
|
+
import type { RenderContext, OverlayAction, KeyEvent } from '../types.js';
|
|
21
|
+
import { type TechStack, type CodingStandards, type RepoPattern } from '../../../templates/index.js';
|
|
22
|
+
type WizardStep = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
23
|
+
type WorkflowMode = 'flexible' | 'guided';
|
|
24
|
+
interface NewProjectState {
|
|
25
|
+
step: WizardStep;
|
|
26
|
+
projectType: 'new' | 'existing' | null;
|
|
27
|
+
projectName: string;
|
|
28
|
+
description: string;
|
|
29
|
+
repoPattern: RepoPattern | null;
|
|
30
|
+
techStack: TechStack | null;
|
|
31
|
+
codingStandards: CodingStandards | null;
|
|
32
|
+
initGit: boolean;
|
|
33
|
+
trackInDatabase: boolean;
|
|
34
|
+
workflowMode: WorkflowMode;
|
|
35
|
+
selectedIndex: number;
|
|
36
|
+
inputBuffer: string;
|
|
37
|
+
error: string | null;
|
|
38
|
+
isGenerating: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface NewProjectResultV2 {
|
|
41
|
+
created: boolean;
|
|
42
|
+
projectPath?: string;
|
|
43
|
+
docsPath?: string;
|
|
44
|
+
filesCreated?: string[];
|
|
45
|
+
trackInDatabase?: boolean;
|
|
46
|
+
workflowMode?: WorkflowMode;
|
|
47
|
+
projectName?: string;
|
|
48
|
+
description?: string;
|
|
49
|
+
}
|
|
50
|
+
export declare class NewProjectOverlayV2 extends BaseOverlayV2<NewProjectState, NewProjectResultV2> {
|
|
51
|
+
readonly type: "inline";
|
|
52
|
+
readonly id = "new-project-overlay-v2";
|
|
53
|
+
constructor();
|
|
54
|
+
protected renderContent(context: RenderContext): string[];
|
|
55
|
+
private renderGenerating;
|
|
56
|
+
private renderStepFooter;
|
|
57
|
+
private renderSelectionOption;
|
|
58
|
+
private renderStep0;
|
|
59
|
+
private renderStep1;
|
|
60
|
+
private renderStep2;
|
|
61
|
+
private renderStep3;
|
|
62
|
+
private renderStep4;
|
|
63
|
+
private renderStep5;
|
|
64
|
+
private renderStep6;
|
|
65
|
+
private renderStep7;
|
|
66
|
+
private renderStep8;
|
|
67
|
+
private renderStep9;
|
|
68
|
+
handleKey(key: KeyEvent): OverlayAction<NewProjectResultV2> | Promise<OverlayAction<NewProjectResultV2>>;
|
|
69
|
+
private handleSelectionKey;
|
|
70
|
+
private handleSelectionEnter;
|
|
71
|
+
private handleInputKey;
|
|
72
|
+
private nextStep;
|
|
73
|
+
private prevStep;
|
|
74
|
+
private validateInput;
|
|
75
|
+
getCloseSummary(result: NewProjectResultV2): string | null;
|
|
76
|
+
}
|
|
77
|
+
export {};
|