@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,593 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for the /init 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 chalk from 'chalk';
|
|
20
|
+
import { BaseOverlayV2, renderBorder } from '../../base/index.js';
|
|
21
|
+
import { TECH_STACK_LABELS, CODING_STANDARDS_LABELS, REPO_PATTERN_LABELS, generateProject, isValidProjectName, projectExists, } from '../../../templates/index.js';
|
|
22
|
+
import { getProjectsPath, ensureProjectsDirectory } from '../../../settings/paths.js';
|
|
23
|
+
// =============================================================================
|
|
24
|
+
// Constants
|
|
25
|
+
// =============================================================================
|
|
26
|
+
const TECH_STACK_OPTIONS = ['react-node-pg', 'react-python-pg', 'vue-node-pg', 'custom'];
|
|
27
|
+
const CODING_STANDARDS_OPTIONS = ['strict', 'relaxed', 'custom'];
|
|
28
|
+
const REPO_PATTERN_OPTIONS = ['single', 'two-repo'];
|
|
29
|
+
const WORKFLOW_MODE_OPTIONS = ['flexible', 'guided'];
|
|
30
|
+
const WORKFLOW_MODE_LABELS = {
|
|
31
|
+
flexible: 'Flexible (user-driven, exploratory)',
|
|
32
|
+
guided: 'Guided (structured step-by-step workflow)',
|
|
33
|
+
};
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// Step Helpers
|
|
36
|
+
// =============================================================================
|
|
37
|
+
function getMaxOptionsForStep(step) {
|
|
38
|
+
switch (step) {
|
|
39
|
+
case 0:
|
|
40
|
+
return 2;
|
|
41
|
+
case 3:
|
|
42
|
+
return REPO_PATTERN_OPTIONS.length;
|
|
43
|
+
case 4:
|
|
44
|
+
return TECH_STACK_OPTIONS.length;
|
|
45
|
+
case 5:
|
|
46
|
+
return CODING_STANDARDS_OPTIONS.length;
|
|
47
|
+
case 6:
|
|
48
|
+
return 2;
|
|
49
|
+
case 7:
|
|
50
|
+
return 2;
|
|
51
|
+
case 8:
|
|
52
|
+
return WORKFLOW_MODE_OPTIONS.length;
|
|
53
|
+
case 9:
|
|
54
|
+
return 2;
|
|
55
|
+
default:
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function isSelectionStep(step) {
|
|
60
|
+
return [0, 3, 4, 5, 6, 7, 8, 9].includes(step);
|
|
61
|
+
}
|
|
62
|
+
function isInputStep(step) {
|
|
63
|
+
return [1, 2].includes(step);
|
|
64
|
+
}
|
|
65
|
+
// =============================================================================
|
|
66
|
+
// Init Overlay V2 Implementation
|
|
67
|
+
// =============================================================================
|
|
68
|
+
export class InitOverlayV2 extends BaseOverlayV2 {
|
|
69
|
+
type = 'inline';
|
|
70
|
+
id = 'init-overlay-v2';
|
|
71
|
+
constructor() {
|
|
72
|
+
super({
|
|
73
|
+
step: 0,
|
|
74
|
+
projectType: null,
|
|
75
|
+
projectName: '',
|
|
76
|
+
description: '',
|
|
77
|
+
repoPattern: null,
|
|
78
|
+
techStack: null,
|
|
79
|
+
codingStandards: null,
|
|
80
|
+
initGit: true,
|
|
81
|
+
trackInDatabase: true,
|
|
82
|
+
workflowMode: 'flexible',
|
|
83
|
+
selectedIndex: 0,
|
|
84
|
+
inputBuffer: '',
|
|
85
|
+
error: null,
|
|
86
|
+
isGenerating: false,
|
|
87
|
+
});
|
|
88
|
+
this.minHeight = 20; // Prevent jitter between steps
|
|
89
|
+
}
|
|
90
|
+
// ===========================================================================
|
|
91
|
+
// Rendering
|
|
92
|
+
// ===========================================================================
|
|
93
|
+
renderContent(context) {
|
|
94
|
+
const s = context.styles;
|
|
95
|
+
// Show generating state if applicable
|
|
96
|
+
if (this.state.isGenerating) {
|
|
97
|
+
return this.renderGenerating(s);
|
|
98
|
+
}
|
|
99
|
+
const lines = [];
|
|
100
|
+
const border = renderBorder(context.width, s);
|
|
101
|
+
// Header
|
|
102
|
+
lines.push(border);
|
|
103
|
+
lines.push(' ' + s.primaryBold('Initialize New Project') + s.muted(` [${String(this.state.step)}/9]`));
|
|
104
|
+
lines.push('');
|
|
105
|
+
// Step content
|
|
106
|
+
switch (this.state.step) {
|
|
107
|
+
case 0:
|
|
108
|
+
lines.push(...this.renderStep0(s));
|
|
109
|
+
break;
|
|
110
|
+
case 1:
|
|
111
|
+
lines.push(...this.renderStep1(s));
|
|
112
|
+
break;
|
|
113
|
+
case 2:
|
|
114
|
+
lines.push(...this.renderStep2(s));
|
|
115
|
+
break;
|
|
116
|
+
case 3:
|
|
117
|
+
lines.push(...this.renderStep3(s));
|
|
118
|
+
break;
|
|
119
|
+
case 4:
|
|
120
|
+
lines.push(...this.renderStep4(s));
|
|
121
|
+
break;
|
|
122
|
+
case 5:
|
|
123
|
+
lines.push(...this.renderStep5(s));
|
|
124
|
+
break;
|
|
125
|
+
case 6:
|
|
126
|
+
lines.push(...this.renderStep6(s));
|
|
127
|
+
break;
|
|
128
|
+
case 7:
|
|
129
|
+
lines.push(...this.renderStep7(s));
|
|
130
|
+
break;
|
|
131
|
+
case 8:
|
|
132
|
+
lines.push(...this.renderStep8(s));
|
|
133
|
+
break;
|
|
134
|
+
case 9:
|
|
135
|
+
lines.push(...this.renderStep9(s));
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
// Footer
|
|
139
|
+
lines.push(...this.renderStepFooter(s));
|
|
140
|
+
return lines;
|
|
141
|
+
}
|
|
142
|
+
renderGenerating(s) {
|
|
143
|
+
const lines = [];
|
|
144
|
+
lines.push('');
|
|
145
|
+
lines.push(s.primary(` Creating project "${this.state.projectName}"...`));
|
|
146
|
+
lines.push('');
|
|
147
|
+
return lines;
|
|
148
|
+
}
|
|
149
|
+
renderStepFooter(s) {
|
|
150
|
+
const lines = [];
|
|
151
|
+
lines.push('');
|
|
152
|
+
if (this.state.step === 0) {
|
|
153
|
+
lines.push(s.muted(' Up/Down Navigate | Enter Select | q/Esc Cancel'));
|
|
154
|
+
}
|
|
155
|
+
else if (this.state.step === 9) {
|
|
156
|
+
lines.push(s.muted(' Up/Down Navigate | Enter Confirm | Esc Back'));
|
|
157
|
+
}
|
|
158
|
+
else if (isSelectionStep(this.state.step)) {
|
|
159
|
+
lines.push(s.muted(' Up/Down Navigate | Enter Select | Esc Back'));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
lines.push(s.muted(' Enter Confirm | Esc Back'));
|
|
163
|
+
}
|
|
164
|
+
return lines;
|
|
165
|
+
}
|
|
166
|
+
renderSelectionOption(s, index, label, disabled = false) {
|
|
167
|
+
const isSelected = index === this.state.selectedIndex;
|
|
168
|
+
const prefix = isSelected ? ' > ' : ' ';
|
|
169
|
+
if (disabled) {
|
|
170
|
+
return s.muted(prefix + label + ' (coming soon)');
|
|
171
|
+
}
|
|
172
|
+
return isSelected ? s.primary(prefix + label) : s.muted(prefix + label);
|
|
173
|
+
}
|
|
174
|
+
// ===========================================================================
|
|
175
|
+
// Step Renderers
|
|
176
|
+
// ===========================================================================
|
|
177
|
+
renderStep0(s) {
|
|
178
|
+
const lines = [];
|
|
179
|
+
lines.push(chalk.bold(' What would you like to do?'));
|
|
180
|
+
lines.push('');
|
|
181
|
+
lines.push(this.renderSelectionOption(s, 0, '1. Start a new project'));
|
|
182
|
+
lines.push(this.renderSelectionOption(s, 1, '2. Add workflow to existing project', true));
|
|
183
|
+
lines.push('');
|
|
184
|
+
lines.push(s.muted(' Start fresh with a structured project layout'));
|
|
185
|
+
lines.push(s.muted(' optimized for AI-assisted development.'));
|
|
186
|
+
return lines;
|
|
187
|
+
}
|
|
188
|
+
renderStep1(s) {
|
|
189
|
+
const lines = [];
|
|
190
|
+
lines.push(chalk.bold(' Project name'));
|
|
191
|
+
lines.push('');
|
|
192
|
+
lines.push(` > ${this.state.inputBuffer}|`);
|
|
193
|
+
lines.push('');
|
|
194
|
+
if (this.state.error) {
|
|
195
|
+
lines.push(s.error(` ${this.state.error}`));
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
lines.push(s.muted(' Use lowercase letters, numbers, hyphens (e.g., my-saas-app)'));
|
|
199
|
+
lines.push(s.muted(' 2-50 characters, must start with a letter'));
|
|
200
|
+
}
|
|
201
|
+
return lines;
|
|
202
|
+
}
|
|
203
|
+
renderStep2(s) {
|
|
204
|
+
const lines = [];
|
|
205
|
+
lines.push(chalk.bold(' What are you building?'));
|
|
206
|
+
lines.push('');
|
|
207
|
+
lines.push(` > ${this.state.inputBuffer}|`);
|
|
208
|
+
lines.push('');
|
|
209
|
+
if (this.state.error) {
|
|
210
|
+
lines.push(s.error(` ${this.state.error}`));
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
lines.push(s.muted(' Brief description (1-2 sentences)'));
|
|
214
|
+
lines.push(s.muted(' Example: "A task management SaaS for small teams"'));
|
|
215
|
+
}
|
|
216
|
+
return lines;
|
|
217
|
+
}
|
|
218
|
+
renderStep3(s) {
|
|
219
|
+
const lines = [];
|
|
220
|
+
lines.push(chalk.bold(' Documentation structure'));
|
|
221
|
+
lines.push('');
|
|
222
|
+
for (let i = 0; i < REPO_PATTERN_OPTIONS.length; i++) {
|
|
223
|
+
const pattern = REPO_PATTERN_OPTIONS[i];
|
|
224
|
+
lines.push(this.renderSelectionOption(s, i, `${String(i + 1)}. ${REPO_PATTERN_LABELS[pattern]}`));
|
|
225
|
+
}
|
|
226
|
+
lines.push('');
|
|
227
|
+
lines.push(s.muted(' Single repo: All files in one repository'));
|
|
228
|
+
lines.push(s.muted(' Two repos: Code and docs in separate repositories'));
|
|
229
|
+
return lines;
|
|
230
|
+
}
|
|
231
|
+
renderStep4(s) {
|
|
232
|
+
const lines = [];
|
|
233
|
+
lines.push(chalk.bold(' Tech stack'));
|
|
234
|
+
lines.push('');
|
|
235
|
+
for (let i = 0; i < TECH_STACK_OPTIONS.length; i++) {
|
|
236
|
+
const stack = TECH_STACK_OPTIONS[i];
|
|
237
|
+
lines.push(this.renderSelectionOption(s, i, `${String(i + 1)}. ${TECH_STACK_LABELS[stack]}`));
|
|
238
|
+
}
|
|
239
|
+
lines.push('');
|
|
240
|
+
lines.push(s.muted(' Choose a preset or configure later'));
|
|
241
|
+
return lines;
|
|
242
|
+
}
|
|
243
|
+
renderStep5(s) {
|
|
244
|
+
const lines = [];
|
|
245
|
+
lines.push(chalk.bold(' Coding standards preset'));
|
|
246
|
+
lines.push('');
|
|
247
|
+
for (let i = 0; i < CODING_STANDARDS_OPTIONS.length; i++) {
|
|
248
|
+
const standard = CODING_STANDARDS_OPTIONS[i];
|
|
249
|
+
lines.push(this.renderSelectionOption(s, i, `${String(i + 1)}. ${CODING_STANDARDS_LABELS[standard]}`));
|
|
250
|
+
}
|
|
251
|
+
lines.push('');
|
|
252
|
+
lines.push(s.muted(' Strict: Full TypeScript with strict mode + ESLint'));
|
|
253
|
+
lines.push(s.muted(' Relaxed: TypeScript with basic strict mode'));
|
|
254
|
+
lines.push(s.muted(' Custom: Configure your own standards later'));
|
|
255
|
+
return lines;
|
|
256
|
+
}
|
|
257
|
+
renderStep6(s) {
|
|
258
|
+
const lines = [];
|
|
259
|
+
lines.push(chalk.bold(' Initialize git repository?'));
|
|
260
|
+
lines.push('');
|
|
261
|
+
lines.push(this.renderSelectionOption(s, 0, 'Yes'));
|
|
262
|
+
lines.push(this.renderSelectionOption(s, 1, 'No'));
|
|
263
|
+
lines.push('');
|
|
264
|
+
lines.push(s.muted(' Creates git repo with initial commit'));
|
|
265
|
+
return lines;
|
|
266
|
+
}
|
|
267
|
+
renderStep7(s) {
|
|
268
|
+
const lines = [];
|
|
269
|
+
lines.push(chalk.bold(' Track with project database?'));
|
|
270
|
+
lines.push('');
|
|
271
|
+
lines.push(this.renderSelectionOption(s, 0, 'Yes (recommended)'));
|
|
272
|
+
lines.push(this.renderSelectionOption(s, 1, 'No'));
|
|
273
|
+
lines.push('');
|
|
274
|
+
lines.push(s.muted(' Enables persistent project tracking, backlog management,'));
|
|
275
|
+
lines.push(s.muted(' and workflow features across sessions.'));
|
|
276
|
+
return lines;
|
|
277
|
+
}
|
|
278
|
+
renderStep8(s) {
|
|
279
|
+
const lines = [];
|
|
280
|
+
lines.push(chalk.bold(' Workflow mode'));
|
|
281
|
+
lines.push('');
|
|
282
|
+
for (let i = 0; i < WORKFLOW_MODE_OPTIONS.length; i++) {
|
|
283
|
+
const mode = WORKFLOW_MODE_OPTIONS[i];
|
|
284
|
+
const suffix = i === 0 ? ' (recommended)' : '';
|
|
285
|
+
lines.push(this.renderSelectionOption(s, i, `${String(i + 1)}. ${WORKFLOW_MODE_LABELS[mode]}${suffix}`));
|
|
286
|
+
}
|
|
287
|
+
lines.push('');
|
|
288
|
+
lines.push(s.muted(' Flexible: Work at your own pace, agent responds to requests'));
|
|
289
|
+
lines.push(s.muted(' Guided: Agent suggests next steps, tracks work item progress'));
|
|
290
|
+
return lines;
|
|
291
|
+
}
|
|
292
|
+
renderStep9(s) {
|
|
293
|
+
const lines = [];
|
|
294
|
+
lines.push(chalk.bold(' Ready to create project?'));
|
|
295
|
+
lines.push('');
|
|
296
|
+
lines.push(` Project: ${s.primary(this.state.projectName)}`);
|
|
297
|
+
lines.push(` Location: ${s.primary('./' + this.state.projectName + '/')}`);
|
|
298
|
+
lines.push(` Structure: ${s.primary(this.state.repoPattern === 'single' ? 'Single repo' : 'Two repos')}`);
|
|
299
|
+
lines.push(` Tech: ${s.primary(this.state.techStack ? TECH_STACK_LABELS[this.state.techStack] : 'Not set')}`);
|
|
300
|
+
lines.push(` Standards: ${s.primary(this.state.codingStandards ? CODING_STANDARDS_LABELS[this.state.codingStandards] : 'Not set')}`);
|
|
301
|
+
lines.push(` Git: ${s.primary(this.state.initGit ? 'Yes' : 'No')}`);
|
|
302
|
+
lines.push(` DB Tracking: ${s.primary(this.state.trackInDatabase ? 'Yes' : 'No')}`);
|
|
303
|
+
if (this.state.trackInDatabase) {
|
|
304
|
+
lines.push(` Workflow: ${s.primary(WORKFLOW_MODE_LABELS[this.state.workflowMode])}`);
|
|
305
|
+
}
|
|
306
|
+
if (this.state.repoPattern === 'two-repo') {
|
|
307
|
+
lines.push('');
|
|
308
|
+
lines.push(s.muted(` Docs repo: ./${this.state.projectName}-docs/`));
|
|
309
|
+
}
|
|
310
|
+
lines.push('');
|
|
311
|
+
if (this.state.error) {
|
|
312
|
+
lines.push(s.error(` ${this.state.error}`));
|
|
313
|
+
lines.push('');
|
|
314
|
+
}
|
|
315
|
+
lines.push(this.renderSelectionOption(s, 0, 'Create'));
|
|
316
|
+
lines.push(this.renderSelectionOption(s, 1, 'Cancel'));
|
|
317
|
+
return lines;
|
|
318
|
+
}
|
|
319
|
+
// ===========================================================================
|
|
320
|
+
// Key Handling
|
|
321
|
+
// ===========================================================================
|
|
322
|
+
handleKey(key) {
|
|
323
|
+
// Ctrl+C always cancels
|
|
324
|
+
if (this.isInterruptKey(key)) {
|
|
325
|
+
return this.close({ created: false });
|
|
326
|
+
}
|
|
327
|
+
// 'q' key on step 0 cancels
|
|
328
|
+
if (this.state.step === 0 && key.name === 'q') {
|
|
329
|
+
return this.close({ created: false });
|
|
330
|
+
}
|
|
331
|
+
// Escape on step 0 cancels, otherwise goes back
|
|
332
|
+
if (key.name === 'escape') {
|
|
333
|
+
if (this.state.step === 0) {
|
|
334
|
+
return this.close({ created: false });
|
|
335
|
+
}
|
|
336
|
+
this.prevStep();
|
|
337
|
+
return this.rerender();
|
|
338
|
+
}
|
|
339
|
+
// Handle selection steps
|
|
340
|
+
if (isSelectionStep(this.state.step)) {
|
|
341
|
+
return this.handleSelectionKey(key);
|
|
342
|
+
}
|
|
343
|
+
// Handle input steps
|
|
344
|
+
if (isInputStep(this.state.step)) {
|
|
345
|
+
return this.handleInputKey(key);
|
|
346
|
+
}
|
|
347
|
+
return this.noAction();
|
|
348
|
+
}
|
|
349
|
+
handleSelectionKey(key) {
|
|
350
|
+
const maxOptions = getMaxOptionsForStep(this.state.step);
|
|
351
|
+
// j/k for vim-style navigation
|
|
352
|
+
if (key.name === 'j' && this.state.selectedIndex < maxOptions - 1) {
|
|
353
|
+
this.state.selectedIndex++;
|
|
354
|
+
return this.rerender();
|
|
355
|
+
}
|
|
356
|
+
if (key.name === 'k' && this.state.selectedIndex > 0) {
|
|
357
|
+
this.state.selectedIndex--;
|
|
358
|
+
return this.rerender();
|
|
359
|
+
}
|
|
360
|
+
if (this.isUpKey(key) && this.state.selectedIndex > 0) {
|
|
361
|
+
this.state.selectedIndex--;
|
|
362
|
+
return this.rerender();
|
|
363
|
+
}
|
|
364
|
+
if (this.isDownKey(key) && this.state.selectedIndex < maxOptions - 1) {
|
|
365
|
+
this.state.selectedIndex++;
|
|
366
|
+
return this.rerender();
|
|
367
|
+
}
|
|
368
|
+
if (this.isEnterKey(key)) {
|
|
369
|
+
return this.handleSelectionEnter();
|
|
370
|
+
}
|
|
371
|
+
return this.noAction();
|
|
372
|
+
}
|
|
373
|
+
async handleSelectionEnter() {
|
|
374
|
+
// Step 0 - only allow "new" option
|
|
375
|
+
if (this.state.step === 0 && this.state.selectedIndex === 1) {
|
|
376
|
+
this.state.error = 'This option is coming soon';
|
|
377
|
+
return this.rerender();
|
|
378
|
+
}
|
|
379
|
+
// Step 9 - confirmation
|
|
380
|
+
if (this.state.step === 9) {
|
|
381
|
+
if (this.state.selectedIndex === 1) {
|
|
382
|
+
// Cancel
|
|
383
|
+
return this.close({ created: false });
|
|
384
|
+
}
|
|
385
|
+
// Verify all required fields are set
|
|
386
|
+
if (!this.state.repoPattern || !this.state.techStack || !this.state.codingStandards) {
|
|
387
|
+
this.state.error = 'Missing configuration values';
|
|
388
|
+
return this.rerender();
|
|
389
|
+
}
|
|
390
|
+
// Show generating state
|
|
391
|
+
this.state.isGenerating = true;
|
|
392
|
+
// Create project
|
|
393
|
+
const config = {
|
|
394
|
+
name: this.state.projectName,
|
|
395
|
+
description: this.state.description,
|
|
396
|
+
repoPattern: this.state.repoPattern,
|
|
397
|
+
techStack: this.state.techStack,
|
|
398
|
+
codingStandards: this.state.codingStandards,
|
|
399
|
+
initGit: this.state.initGit,
|
|
400
|
+
};
|
|
401
|
+
try {
|
|
402
|
+
// Ensure projects directory exists and create project there
|
|
403
|
+
ensureProjectsDirectory();
|
|
404
|
+
const projectsPath = getProjectsPath();
|
|
405
|
+
const result = await generateProject(config, projectsPath);
|
|
406
|
+
if (result.success) {
|
|
407
|
+
return this.close({
|
|
408
|
+
created: true,
|
|
409
|
+
projectPath: result.projectPath,
|
|
410
|
+
docsPath: result.docsPath,
|
|
411
|
+
filesCreated: result.filesCreated,
|
|
412
|
+
trackInDatabase: this.state.trackInDatabase,
|
|
413
|
+
workflowMode: this.state.workflowMode,
|
|
414
|
+
projectName: this.state.projectName,
|
|
415
|
+
description: this.state.description,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
this.state.isGenerating = false;
|
|
420
|
+
this.state.error = result.error ?? 'Unknown error';
|
|
421
|
+
return this.rerender();
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
this.state.isGenerating = false;
|
|
426
|
+
this.state.error = error.message;
|
|
427
|
+
return this.rerender();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
this.nextStep();
|
|
431
|
+
return this.rerender();
|
|
432
|
+
}
|
|
433
|
+
handleInputKey(key) {
|
|
434
|
+
if (this.isEnterKey(key)) {
|
|
435
|
+
if (this.validateInput()) {
|
|
436
|
+
this.nextStep();
|
|
437
|
+
}
|
|
438
|
+
return this.rerender();
|
|
439
|
+
}
|
|
440
|
+
if (key.name === 'backspace') {
|
|
441
|
+
this.state.inputBuffer = this.state.inputBuffer.slice(0, -1);
|
|
442
|
+
this.state.error = null;
|
|
443
|
+
return this.rerender();
|
|
444
|
+
}
|
|
445
|
+
// Regular character input
|
|
446
|
+
if (key.char && key.char.length === 1 && key.char >= ' ' && key.char <= '~') {
|
|
447
|
+
this.state.inputBuffer += key.char;
|
|
448
|
+
this.state.error = null;
|
|
449
|
+
return this.rerender();
|
|
450
|
+
}
|
|
451
|
+
return this.noAction();
|
|
452
|
+
}
|
|
453
|
+
// ===========================================================================
|
|
454
|
+
// Step Navigation
|
|
455
|
+
// ===========================================================================
|
|
456
|
+
nextStep() {
|
|
457
|
+
switch (this.state.step) {
|
|
458
|
+
case 0:
|
|
459
|
+
if (this.state.selectedIndex === 0) {
|
|
460
|
+
this.state.projectType = 'new';
|
|
461
|
+
this.state.step = 1;
|
|
462
|
+
this.state.inputBuffer = '';
|
|
463
|
+
this.state.selectedIndex = 0;
|
|
464
|
+
}
|
|
465
|
+
break;
|
|
466
|
+
case 1:
|
|
467
|
+
this.state.projectName = this.state.inputBuffer.trim();
|
|
468
|
+
this.state.step = 2;
|
|
469
|
+
this.state.inputBuffer = '';
|
|
470
|
+
break;
|
|
471
|
+
case 2:
|
|
472
|
+
this.state.description = this.state.inputBuffer.trim();
|
|
473
|
+
this.state.step = 3;
|
|
474
|
+
this.state.selectedIndex = 0;
|
|
475
|
+
break;
|
|
476
|
+
case 3:
|
|
477
|
+
this.state.repoPattern = REPO_PATTERN_OPTIONS[this.state.selectedIndex];
|
|
478
|
+
this.state.step = 4;
|
|
479
|
+
this.state.selectedIndex = 0;
|
|
480
|
+
break;
|
|
481
|
+
case 4:
|
|
482
|
+
this.state.techStack = TECH_STACK_OPTIONS[this.state.selectedIndex];
|
|
483
|
+
this.state.step = 5;
|
|
484
|
+
this.state.selectedIndex = 0;
|
|
485
|
+
break;
|
|
486
|
+
case 5:
|
|
487
|
+
this.state.codingStandards = CODING_STANDARDS_OPTIONS[this.state.selectedIndex];
|
|
488
|
+
this.state.step = 6;
|
|
489
|
+
this.state.selectedIndex = 0;
|
|
490
|
+
break;
|
|
491
|
+
case 6:
|
|
492
|
+
this.state.initGit = this.state.selectedIndex === 0;
|
|
493
|
+
this.state.step = 7;
|
|
494
|
+
this.state.selectedIndex = 0;
|
|
495
|
+
break;
|
|
496
|
+
case 7:
|
|
497
|
+
this.state.trackInDatabase = this.state.selectedIndex === 0;
|
|
498
|
+
// If tracking in DB, ask for workflow mode; otherwise skip to confirmation
|
|
499
|
+
this.state.step = this.state.trackInDatabase ? 8 : 9;
|
|
500
|
+
this.state.selectedIndex = 0;
|
|
501
|
+
break;
|
|
502
|
+
case 8:
|
|
503
|
+
this.state.workflowMode = WORKFLOW_MODE_OPTIONS[this.state.selectedIndex];
|
|
504
|
+
this.state.step = 9;
|
|
505
|
+
this.state.selectedIndex = 0;
|
|
506
|
+
break;
|
|
507
|
+
}
|
|
508
|
+
this.state.error = null;
|
|
509
|
+
}
|
|
510
|
+
prevStep() {
|
|
511
|
+
switch (this.state.step) {
|
|
512
|
+
case 1:
|
|
513
|
+
this.state.step = 0;
|
|
514
|
+
this.state.selectedIndex = 0;
|
|
515
|
+
break;
|
|
516
|
+
case 2:
|
|
517
|
+
this.state.step = 1;
|
|
518
|
+
this.state.inputBuffer = this.state.projectName;
|
|
519
|
+
break;
|
|
520
|
+
case 3:
|
|
521
|
+
this.state.step = 2;
|
|
522
|
+
this.state.inputBuffer = this.state.description;
|
|
523
|
+
break;
|
|
524
|
+
case 4:
|
|
525
|
+
this.state.step = 3;
|
|
526
|
+
this.state.selectedIndex = this.state.repoPattern ? REPO_PATTERN_OPTIONS.indexOf(this.state.repoPattern) : 0;
|
|
527
|
+
break;
|
|
528
|
+
case 5:
|
|
529
|
+
this.state.step = 4;
|
|
530
|
+
this.state.selectedIndex = this.state.techStack ? TECH_STACK_OPTIONS.indexOf(this.state.techStack) : 0;
|
|
531
|
+
break;
|
|
532
|
+
case 6:
|
|
533
|
+
this.state.step = 5;
|
|
534
|
+
this.state.selectedIndex = this.state.codingStandards ? CODING_STANDARDS_OPTIONS.indexOf(this.state.codingStandards) : 0;
|
|
535
|
+
break;
|
|
536
|
+
case 7:
|
|
537
|
+
this.state.step = 6;
|
|
538
|
+
this.state.selectedIndex = this.state.initGit ? 0 : 1;
|
|
539
|
+
break;
|
|
540
|
+
case 8:
|
|
541
|
+
this.state.step = 7;
|
|
542
|
+
this.state.selectedIndex = this.state.trackInDatabase ? 0 : 1;
|
|
543
|
+
break;
|
|
544
|
+
case 9:
|
|
545
|
+
// Go back to workflow mode if DB tracking is on, otherwise go to DB tracking step
|
|
546
|
+
this.state.step = this.state.trackInDatabase ? 8 : 7;
|
|
547
|
+
this.state.selectedIndex = this.state.trackInDatabase
|
|
548
|
+
? WORKFLOW_MODE_OPTIONS.indexOf(this.state.workflowMode)
|
|
549
|
+
: 1;
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
this.state.error = null;
|
|
553
|
+
}
|
|
554
|
+
validateInput() {
|
|
555
|
+
if (this.state.step === 1) {
|
|
556
|
+
const name = this.state.inputBuffer.trim();
|
|
557
|
+
if (!name) {
|
|
558
|
+
this.state.error = 'Project name is required';
|
|
559
|
+
return false;
|
|
560
|
+
}
|
|
561
|
+
if (!isValidProjectName(name)) {
|
|
562
|
+
this.state.error = 'Invalid name. Use lowercase letters, numbers, hyphens (2-50 chars, start with letter)';
|
|
563
|
+
return false;
|
|
564
|
+
}
|
|
565
|
+
if (projectExists(name)) {
|
|
566
|
+
this.state.error = `Directory "${name}" already exists`;
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
if (this.state.step === 2) {
|
|
571
|
+
const desc = this.state.inputBuffer.trim();
|
|
572
|
+
if (!desc) {
|
|
573
|
+
this.state.error = 'Description is required';
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
576
|
+
if (desc.length < 10) {
|
|
577
|
+
this.state.error = 'Description too short (min 10 characters)';
|
|
578
|
+
return false;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
// ===========================================================================
|
|
584
|
+
// Close Summary
|
|
585
|
+
// ===========================================================================
|
|
586
|
+
getCloseSummary(result) {
|
|
587
|
+
const s = this.getStyles();
|
|
588
|
+
if (!result.created) {
|
|
589
|
+
return s.warning('Init cancelled');
|
|
590
|
+
}
|
|
591
|
+
return null;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Init Setup Overlay V2 (Placeholder)
|
|
3
|
+
*
|
|
4
|
+
* Shows current CLI configuration status and directs users to /config.
|
|
5
|
+
* This is a placeholder - full setup wizard will be implemented in a future session.
|
|
6
|
+
*
|
|
7
|
+
* Displays:
|
|
8
|
+
* - API key status for each provider
|
|
9
|
+
* - Current settings summary
|
|
10
|
+
* - Instructions for configuration
|
|
11
|
+
*/
|
|
12
|
+
import { BaseOverlayV2 } from '../../base/overlay-base-v2.js';
|
|
13
|
+
import type { OverlayAction, KeyEvent, RenderContext } from '../types.js';
|
|
14
|
+
type InitSetupState = Record<string, never>;
|
|
15
|
+
export interface InitSetupResultV2 {
|
|
16
|
+
dismissed: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class InitSetupOverlayV2 extends BaseOverlayV2<InitSetupState, InitSetupResultV2> {
|
|
19
|
+
readonly type: "inline";
|
|
20
|
+
readonly id = "init-setup-overlay-v2";
|
|
21
|
+
constructor();
|
|
22
|
+
protected renderContent(_context: RenderContext): string[];
|
|
23
|
+
handleKey(_key: KeyEvent): OverlayAction<InitSetupResultV2>;
|
|
24
|
+
}
|
|
25
|
+
export {};
|