@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
package/dist/ui/init-overlay.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Init Overlay
|
|
2
|
+
* Init Overlay (Refactored)
|
|
3
3
|
*
|
|
4
4
|
* Modal overlay for the /init wizard - creates new projects with structured workflow.
|
|
5
|
+
* Uses InlineOverlay base class for consistent lifecycle management.
|
|
6
|
+
*
|
|
5
7
|
* Steps:
|
|
6
8
|
* 0. Project type (new vs existing)
|
|
7
9
|
* 1. Project name
|
|
@@ -10,18 +12,27 @@
|
|
|
10
12
|
* 4. Tech stack
|
|
11
13
|
* 5. Coding standards
|
|
12
14
|
* 6. Initialize git?
|
|
13
|
-
* 7.
|
|
15
|
+
* 7. Track with project database?
|
|
16
|
+
* 8. Workflow mode (if tracking enabled)
|
|
17
|
+
* 9. Confirmation
|
|
14
18
|
*/
|
|
15
19
|
import chalk from 'chalk';
|
|
16
20
|
import * as terminal from './terminal.js';
|
|
17
21
|
import { getStyles } from '../themes/index.js';
|
|
22
|
+
import { InlineOverlay } from './base/inline-overlay.js';
|
|
18
23
|
import { TECH_STACK_LABELS, CODING_STANDARDS_LABELS, REPO_PATTERN_LABELS, generateProject, isValidProjectName, projectExists, } from '../templates/index.js';
|
|
24
|
+
import { getProjectsPath, ensureProjectsDirectory } from '../settings/paths.js';
|
|
19
25
|
// =============================================================================
|
|
20
26
|
// Constants
|
|
21
27
|
// =============================================================================
|
|
22
28
|
const TECH_STACK_OPTIONS = ['react-node-pg', 'react-python-pg', 'vue-node-pg', 'custom'];
|
|
23
29
|
const CODING_STANDARDS_OPTIONS = ['strict', 'relaxed', 'custom'];
|
|
24
30
|
const REPO_PATTERN_OPTIONS = ['single', 'two-repo'];
|
|
31
|
+
const WORKFLOW_MODE_OPTIONS = ['flexible', 'guided'];
|
|
32
|
+
const WORKFLOW_MODE_LABELS = {
|
|
33
|
+
flexible: 'Flexible (user-driven, exploratory)',
|
|
34
|
+
guided: 'Guided (structured step-by-step workflow)',
|
|
35
|
+
};
|
|
25
36
|
// =============================================================================
|
|
26
37
|
// Rendering Helpers
|
|
27
38
|
// =============================================================================
|
|
@@ -30,7 +41,7 @@ function renderHeader(step) {
|
|
|
30
41
|
const lines = [];
|
|
31
42
|
const cols = terminal.getTerminalWidth();
|
|
32
43
|
lines.push(s.muted('─'.repeat(Math.max(1, cols - 1))));
|
|
33
|
-
lines.push(' ' + s.primaryBold('Initialize New Project') + s.muted(` [${String(step)}/
|
|
44
|
+
lines.push(' ' + s.primaryBold('Initialize New Project') + s.muted(` [${String(step)}/9]`));
|
|
34
45
|
lines.push('');
|
|
35
46
|
return lines;
|
|
36
47
|
}
|
|
@@ -39,13 +50,16 @@ function renderFooter(step) {
|
|
|
39
50
|
const lines = [];
|
|
40
51
|
lines.push('');
|
|
41
52
|
if (step === 0) {
|
|
42
|
-
lines.push(s.muted('
|
|
53
|
+
lines.push(s.muted(' ↑↓/jk Navigate · Enter Select · q/Esc Cancel'));
|
|
54
|
+
}
|
|
55
|
+
else if (step === 9) {
|
|
56
|
+
lines.push(s.muted(' ↑↓/jk Navigate · Enter Confirm · Esc Back'));
|
|
43
57
|
}
|
|
44
|
-
else if (step
|
|
45
|
-
lines.push(s.muted('
|
|
58
|
+
else if (isSelectionStep(step)) {
|
|
59
|
+
lines.push(s.muted(' ↑↓/jk Navigate · Enter Select · Esc Back'));
|
|
46
60
|
}
|
|
47
61
|
else {
|
|
48
|
-
lines.push(s.muted(' Enter Confirm · Esc
|
|
62
|
+
lines.push(s.muted(' Enter Confirm · Esc Back'));
|
|
49
63
|
}
|
|
50
64
|
return lines;
|
|
51
65
|
}
|
|
@@ -159,6 +173,33 @@ function renderStep6(state) {
|
|
|
159
173
|
return lines;
|
|
160
174
|
}
|
|
161
175
|
function renderStep7(state) {
|
|
176
|
+
const s = getStyles();
|
|
177
|
+
const lines = [];
|
|
178
|
+
lines.push(chalk.bold(' Track with project database?'));
|
|
179
|
+
lines.push('');
|
|
180
|
+
lines.push(renderSelectionOption(0, state.selectedIndex, 'Yes (recommended)'));
|
|
181
|
+
lines.push(renderSelectionOption(1, state.selectedIndex, 'No'));
|
|
182
|
+
lines.push('');
|
|
183
|
+
lines.push(s.muted(' Enables persistent project tracking, backlog management,'));
|
|
184
|
+
lines.push(s.muted(' and workflow features across sessions.'));
|
|
185
|
+
return lines;
|
|
186
|
+
}
|
|
187
|
+
function renderStep8(state) {
|
|
188
|
+
const s = getStyles();
|
|
189
|
+
const lines = [];
|
|
190
|
+
lines.push(chalk.bold(' Workflow mode'));
|
|
191
|
+
lines.push('');
|
|
192
|
+
for (let i = 0; i < WORKFLOW_MODE_OPTIONS.length; i++) {
|
|
193
|
+
const mode = WORKFLOW_MODE_OPTIONS[i];
|
|
194
|
+
const suffix = i === 0 ? ' (recommended)' : '';
|
|
195
|
+
lines.push(renderSelectionOption(i, state.selectedIndex, `${String(i + 1)}. ${WORKFLOW_MODE_LABELS[mode]}${suffix}`));
|
|
196
|
+
}
|
|
197
|
+
lines.push('');
|
|
198
|
+
lines.push(s.muted(' Flexible: Work at your own pace, agent responds to requests'));
|
|
199
|
+
lines.push(s.muted(' Guided: Agent suggests next steps, tracks work item progress'));
|
|
200
|
+
return lines;
|
|
201
|
+
}
|
|
202
|
+
function renderStep9(state) {
|
|
162
203
|
const s = getStyles();
|
|
163
204
|
const lines = [];
|
|
164
205
|
lines.push(chalk.bold(' Ready to create project?'));
|
|
@@ -169,6 +210,10 @@ function renderStep7(state) {
|
|
|
169
210
|
lines.push(` Tech: ${s.primary(state.techStack ? TECH_STACK_LABELS[state.techStack] : 'Not set')}`);
|
|
170
211
|
lines.push(` Standards: ${s.primary(state.codingStandards ? CODING_STANDARDS_LABELS[state.codingStandards] : 'Not set')}`);
|
|
171
212
|
lines.push(` Git: ${s.primary(state.initGit ? 'Yes' : 'No')}`);
|
|
213
|
+
lines.push(` DB Tracking: ${s.primary(state.trackInDatabase ? 'Yes' : 'No')}`);
|
|
214
|
+
if (state.trackInDatabase) {
|
|
215
|
+
lines.push(` Workflow: ${s.primary(WORKFLOW_MODE_LABELS[state.workflowMode])}`);
|
|
216
|
+
}
|
|
172
217
|
if (state.repoPattern === 'two-repo') {
|
|
173
218
|
lines.push('');
|
|
174
219
|
lines.push(s.muted(` Docs repo: ./${state.projectName}-docs/`));
|
|
@@ -182,51 +227,15 @@ function renderStep7(state) {
|
|
|
182
227
|
lines.push(renderSelectionOption(1, state.selectedIndex, 'Cancel'));
|
|
183
228
|
return lines;
|
|
184
229
|
}
|
|
185
|
-
|
|
186
|
-
// Unified Rendering
|
|
187
|
-
// =============================================================================
|
|
188
|
-
function buildLines(state) {
|
|
230
|
+
function renderGenerating(state) {
|
|
189
231
|
const lines = [];
|
|
190
|
-
lines.push(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
lines.push(...renderStep0(state));
|
|
194
|
-
break;
|
|
195
|
-
case 1:
|
|
196
|
-
lines.push(...renderStep1(state));
|
|
197
|
-
break;
|
|
198
|
-
case 2:
|
|
199
|
-
lines.push(...renderStep2(state));
|
|
200
|
-
break;
|
|
201
|
-
case 3:
|
|
202
|
-
lines.push(...renderStep3(state));
|
|
203
|
-
break;
|
|
204
|
-
case 4:
|
|
205
|
-
lines.push(...renderStep4(state));
|
|
206
|
-
break;
|
|
207
|
-
case 5:
|
|
208
|
-
lines.push(...renderStep5(state));
|
|
209
|
-
break;
|
|
210
|
-
case 6:
|
|
211
|
-
lines.push(...renderStep6(state));
|
|
212
|
-
break;
|
|
213
|
-
case 7:
|
|
214
|
-
lines.push(...renderStep7(state));
|
|
215
|
-
break;
|
|
216
|
-
}
|
|
217
|
-
lines.push(...renderFooter(state.step));
|
|
232
|
+
lines.push('');
|
|
233
|
+
lines.push(chalk.cyan(` Creating project "${state.projectName}"...`));
|
|
234
|
+
lines.push('');
|
|
218
235
|
return lines;
|
|
219
236
|
}
|
|
220
|
-
function render(state, prevLineCount) {
|
|
221
|
-
const lines = buildLines(state);
|
|
222
|
-
// Clear previous content
|
|
223
|
-
terminal.clearLinesAbove(prevLineCount);
|
|
224
|
-
// Write new content
|
|
225
|
-
terminal.write(lines.join('\n'));
|
|
226
|
-
return lines.length;
|
|
227
|
-
}
|
|
228
237
|
// =============================================================================
|
|
229
|
-
// Step
|
|
238
|
+
// Step Helpers
|
|
230
239
|
// =============================================================================
|
|
231
240
|
function getMaxOptionsForStep(step) {
|
|
232
241
|
switch (step) {
|
|
@@ -242,284 +251,354 @@ function getMaxOptionsForStep(step) {
|
|
|
242
251
|
return 2;
|
|
243
252
|
case 7:
|
|
244
253
|
return 2;
|
|
254
|
+
case 8:
|
|
255
|
+
return WORKFLOW_MODE_OPTIONS.length;
|
|
256
|
+
case 9:
|
|
257
|
+
return 2;
|
|
245
258
|
default:
|
|
246
259
|
return 0;
|
|
247
260
|
}
|
|
248
261
|
}
|
|
249
262
|
function isSelectionStep(step) {
|
|
250
|
-
return [0, 3, 4, 5, 6, 7].includes(step);
|
|
263
|
+
return [0, 3, 4, 5, 6, 7, 8, 9].includes(step);
|
|
251
264
|
}
|
|
252
265
|
function isInputStep(step) {
|
|
253
266
|
return [1, 2].includes(step);
|
|
254
267
|
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
268
|
+
// =============================================================================
|
|
269
|
+
// Init Overlay Implementation
|
|
270
|
+
// =============================================================================
|
|
271
|
+
class InitOverlayImpl extends InlineOverlay {
|
|
272
|
+
getInitialState() {
|
|
273
|
+
return {
|
|
274
|
+
step: 0,
|
|
275
|
+
projectType: null,
|
|
276
|
+
projectName: '',
|
|
277
|
+
description: '',
|
|
278
|
+
repoPattern: null,
|
|
279
|
+
techStack: null,
|
|
280
|
+
codingStandards: null,
|
|
281
|
+
initGit: true,
|
|
282
|
+
trackInDatabase: true,
|
|
283
|
+
workflowMode: 'flexible',
|
|
284
|
+
selectedIndex: 0,
|
|
285
|
+
inputBuffer: '',
|
|
286
|
+
error: null,
|
|
287
|
+
isGenerating: false,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
render() {
|
|
291
|
+
// Show generating state if applicable
|
|
292
|
+
if (this.state.isGenerating) {
|
|
293
|
+
return renderGenerating(this.state);
|
|
294
|
+
}
|
|
295
|
+
const lines = [];
|
|
296
|
+
lines.push(...renderHeader(this.state.step));
|
|
297
|
+
switch (this.state.step) {
|
|
281
298
|
case 0:
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
299
|
+
lines.push(...renderStep0(this.state));
|
|
300
|
+
break;
|
|
301
|
+
case 1:
|
|
302
|
+
lines.push(...renderStep1(this.state));
|
|
303
|
+
break;
|
|
304
|
+
case 2:
|
|
305
|
+
lines.push(...renderStep2(this.state));
|
|
306
|
+
break;
|
|
307
|
+
case 3:
|
|
308
|
+
lines.push(...renderStep3(this.state));
|
|
309
|
+
break;
|
|
310
|
+
case 4:
|
|
311
|
+
lines.push(...renderStep4(this.state));
|
|
312
|
+
break;
|
|
313
|
+
case 5:
|
|
314
|
+
lines.push(...renderStep5(this.state));
|
|
315
|
+
break;
|
|
316
|
+
case 6:
|
|
317
|
+
lines.push(...renderStep6(this.state));
|
|
318
|
+
break;
|
|
319
|
+
case 7:
|
|
320
|
+
lines.push(...renderStep7(this.state));
|
|
321
|
+
break;
|
|
322
|
+
case 8:
|
|
323
|
+
lines.push(...renderStep8(this.state));
|
|
324
|
+
break;
|
|
325
|
+
case 9:
|
|
326
|
+
lines.push(...renderStep9(this.state));
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
lines.push(...renderFooter(this.state.step));
|
|
330
|
+
return lines;
|
|
331
|
+
}
|
|
332
|
+
async handleKey(data) {
|
|
333
|
+
// Ctrl+C always cancels
|
|
334
|
+
if (this.isCtrlCKey(data)) {
|
|
335
|
+
return { type: 'close', result: { created: false } };
|
|
336
|
+
}
|
|
337
|
+
// q key on step 0 cancels
|
|
338
|
+
const char = data.length === 1 && data[0] >= 0x20 && data[0] < 0x7f ? String.fromCharCode(data[0]) : null;
|
|
339
|
+
if (this.state.step === 0 && char === 'q') {
|
|
340
|
+
return { type: 'close', result: { created: false } };
|
|
341
|
+
}
|
|
342
|
+
// Escape on step 0 cancels, otherwise goes back
|
|
343
|
+
if (this.isEscapeKey(data)) {
|
|
344
|
+
if (this.state.step === 0) {
|
|
345
|
+
return { type: 'close', result: { created: false } };
|
|
346
|
+
}
|
|
347
|
+
this.prevStep();
|
|
348
|
+
return { type: 'continue' };
|
|
349
|
+
}
|
|
350
|
+
// Handle selection steps
|
|
351
|
+
if (isSelectionStep(this.state.step)) {
|
|
352
|
+
const maxOptions = getMaxOptionsForStep(this.state.step);
|
|
353
|
+
// j/k for vim-style navigation
|
|
354
|
+
if (char === 'j' && this.state.selectedIndex < maxOptions - 1) {
|
|
355
|
+
this.state.selectedIndex++;
|
|
356
|
+
return { type: 'continue' };
|
|
357
|
+
}
|
|
358
|
+
if (char === 'k' && this.state.selectedIndex > 0) {
|
|
359
|
+
this.state.selectedIndex--;
|
|
360
|
+
return { type: 'continue' };
|
|
361
|
+
}
|
|
362
|
+
if (this.isUpArrowKey(data) && this.state.selectedIndex > 0) {
|
|
363
|
+
this.state.selectedIndex--;
|
|
364
|
+
return { type: 'continue' };
|
|
365
|
+
}
|
|
366
|
+
if (this.isDownArrowKey(data) && this.state.selectedIndex < maxOptions - 1) {
|
|
367
|
+
this.state.selectedIndex++;
|
|
368
|
+
return { type: 'continue' };
|
|
369
|
+
}
|
|
370
|
+
if (this.isEnterKey(data)) {
|
|
371
|
+
// Step 0 - only allow "new" option
|
|
372
|
+
if (this.state.step === 0 && this.state.selectedIndex === 1) {
|
|
373
|
+
this.state.error = 'This option is coming soon';
|
|
374
|
+
return { type: 'continue' };
|
|
375
|
+
}
|
|
376
|
+
// Step 9 - confirmation
|
|
377
|
+
if (this.state.step === 9) {
|
|
378
|
+
if (this.state.selectedIndex === 1) {
|
|
379
|
+
// Cancel
|
|
380
|
+
return { type: 'close', result: { created: false } };
|
|
381
|
+
}
|
|
382
|
+
// Verify all required fields are set
|
|
383
|
+
if (!this.state.repoPattern || !this.state.techStack || !this.state.codingStandards) {
|
|
384
|
+
this.state.error = 'Missing configuration values';
|
|
385
|
+
return { type: 'continue' };
|
|
386
|
+
}
|
|
387
|
+
// Show generating state
|
|
388
|
+
this.state.isGenerating = true;
|
|
389
|
+
this.requestRender();
|
|
390
|
+
// Create project
|
|
391
|
+
const config = {
|
|
392
|
+
name: this.state.projectName,
|
|
393
|
+
description: this.state.description,
|
|
394
|
+
repoPattern: this.state.repoPattern,
|
|
395
|
+
techStack: this.state.techStack,
|
|
396
|
+
codingStandards: this.state.codingStandards,
|
|
397
|
+
initGit: this.state.initGit,
|
|
398
|
+
};
|
|
399
|
+
try {
|
|
400
|
+
// Ensure projects directory exists and create project there
|
|
401
|
+
ensureProjectsDirectory();
|
|
402
|
+
const projectsPath = getProjectsPath();
|
|
403
|
+
const result = await generateProject(config, projectsPath);
|
|
404
|
+
if (result.success) {
|
|
405
|
+
return {
|
|
406
|
+
type: 'close',
|
|
407
|
+
result: {
|
|
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
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
this.state.isGenerating = false;
|
|
421
|
+
this.state.error = result.error ?? 'Unknown error';
|
|
422
|
+
return { type: 'continue' };
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
this.state.isGenerating = false;
|
|
427
|
+
this.state.error = error.message;
|
|
428
|
+
return { type: 'continue' };
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
this.nextStep();
|
|
432
|
+
return { type: 'continue' };
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
// Handle input steps
|
|
436
|
+
if (isInputStep(this.state.step)) {
|
|
437
|
+
if (this.isEnterKey(data)) {
|
|
438
|
+
if (this.validateInput()) {
|
|
439
|
+
this.nextStep();
|
|
440
|
+
}
|
|
441
|
+
return { type: 'continue' };
|
|
442
|
+
}
|
|
443
|
+
if (this.isBackspaceKey(data)) {
|
|
444
|
+
this.state.inputBuffer = this.state.inputBuffer.slice(0, -1);
|
|
445
|
+
this.state.error = null;
|
|
446
|
+
return { type: 'continue' };
|
|
447
|
+
}
|
|
448
|
+
// Regular character input
|
|
449
|
+
const inputChar = this.getPrintableChar(data);
|
|
450
|
+
if (inputChar) {
|
|
451
|
+
this.state.inputBuffer += inputChar;
|
|
452
|
+
this.state.error = null;
|
|
453
|
+
return { type: 'continue' };
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return { type: 'continue' };
|
|
457
|
+
}
|
|
458
|
+
getCleanupSummary(result) {
|
|
459
|
+
if (!result.created) {
|
|
460
|
+
return chalk.yellow(' Init cancelled');
|
|
461
|
+
}
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
// ===========================================================================
|
|
465
|
+
// Private Helpers
|
|
466
|
+
// ===========================================================================
|
|
467
|
+
nextStep() {
|
|
468
|
+
switch (this.state.step) {
|
|
469
|
+
case 0:
|
|
470
|
+
if (this.state.selectedIndex === 0) {
|
|
471
|
+
this.state.projectType = 'new';
|
|
472
|
+
this.state.step = 1;
|
|
473
|
+
this.state.inputBuffer = '';
|
|
474
|
+
this.state.selectedIndex = 0;
|
|
288
475
|
}
|
|
289
476
|
break;
|
|
290
477
|
case 1:
|
|
291
|
-
state.projectName = state.inputBuffer.trim();
|
|
292
|
-
state.step = 2;
|
|
293
|
-
state.inputBuffer = '';
|
|
478
|
+
this.state.projectName = this.state.inputBuffer.trim();
|
|
479
|
+
this.state.step = 2;
|
|
480
|
+
this.state.inputBuffer = '';
|
|
294
481
|
break;
|
|
295
482
|
case 2:
|
|
296
|
-
state.description = state.inputBuffer.trim();
|
|
297
|
-
state.step = 3;
|
|
298
|
-
state.selectedIndex = 0;
|
|
483
|
+
this.state.description = this.state.inputBuffer.trim();
|
|
484
|
+
this.state.step = 3;
|
|
485
|
+
this.state.selectedIndex = 0;
|
|
299
486
|
break;
|
|
300
487
|
case 3:
|
|
301
|
-
state.repoPattern = REPO_PATTERN_OPTIONS[state.selectedIndex];
|
|
302
|
-
state.step = 4;
|
|
303
|
-
state.selectedIndex = 0;
|
|
488
|
+
this.state.repoPattern = REPO_PATTERN_OPTIONS[this.state.selectedIndex];
|
|
489
|
+
this.state.step = 4;
|
|
490
|
+
this.state.selectedIndex = 0;
|
|
304
491
|
break;
|
|
305
492
|
case 4:
|
|
306
|
-
state.techStack = TECH_STACK_OPTIONS[state.selectedIndex];
|
|
307
|
-
state.step = 5;
|
|
308
|
-
state.selectedIndex = 0;
|
|
493
|
+
this.state.techStack = TECH_STACK_OPTIONS[this.state.selectedIndex];
|
|
494
|
+
this.state.step = 5;
|
|
495
|
+
this.state.selectedIndex = 0;
|
|
309
496
|
break;
|
|
310
497
|
case 5:
|
|
311
|
-
state.codingStandards = CODING_STANDARDS_OPTIONS[state.selectedIndex];
|
|
312
|
-
state.step = 6;
|
|
313
|
-
state.selectedIndex = 0;
|
|
498
|
+
this.state.codingStandards = CODING_STANDARDS_OPTIONS[this.state.selectedIndex];
|
|
499
|
+
this.state.step = 6;
|
|
500
|
+
this.state.selectedIndex = 0;
|
|
314
501
|
break;
|
|
315
502
|
case 6:
|
|
316
|
-
state.initGit = state.selectedIndex === 0;
|
|
317
|
-
state.step = 7;
|
|
318
|
-
state.selectedIndex = 0;
|
|
503
|
+
this.state.initGit = this.state.selectedIndex === 0;
|
|
504
|
+
this.state.step = 7;
|
|
505
|
+
this.state.selectedIndex = 0;
|
|
506
|
+
break;
|
|
507
|
+
case 7:
|
|
508
|
+
this.state.trackInDatabase = this.state.selectedIndex === 0;
|
|
509
|
+
// If tracking in DB, ask for workflow mode; otherwise skip to confirmation
|
|
510
|
+
this.state.step = this.state.trackInDatabase ? 8 : 9;
|
|
511
|
+
this.state.selectedIndex = 0;
|
|
512
|
+
break;
|
|
513
|
+
case 8:
|
|
514
|
+
this.state.workflowMode = WORKFLOW_MODE_OPTIONS[this.state.selectedIndex];
|
|
515
|
+
this.state.step = 9;
|
|
516
|
+
this.state.selectedIndex = 0;
|
|
319
517
|
break;
|
|
320
518
|
}
|
|
321
|
-
state.error = null;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
switch (state.step) {
|
|
519
|
+
this.state.error = null;
|
|
520
|
+
}
|
|
521
|
+
prevStep() {
|
|
522
|
+
switch (this.state.step) {
|
|
326
523
|
case 1:
|
|
327
|
-
state.step = 0;
|
|
328
|
-
state.selectedIndex = 0;
|
|
524
|
+
this.state.step = 0;
|
|
525
|
+
this.state.selectedIndex = 0;
|
|
329
526
|
break;
|
|
330
527
|
case 2:
|
|
331
|
-
state.step = 1;
|
|
332
|
-
state.inputBuffer = state.projectName;
|
|
528
|
+
this.state.step = 1;
|
|
529
|
+
this.state.inputBuffer = this.state.projectName;
|
|
333
530
|
break;
|
|
334
531
|
case 3:
|
|
335
|
-
state.step = 2;
|
|
336
|
-
state.inputBuffer = state.description;
|
|
532
|
+
this.state.step = 2;
|
|
533
|
+
this.state.inputBuffer = this.state.description;
|
|
337
534
|
break;
|
|
338
535
|
case 4:
|
|
339
|
-
state.step = 3;
|
|
340
|
-
state.selectedIndex = state.repoPattern ? REPO_PATTERN_OPTIONS.indexOf(state.repoPattern) : 0;
|
|
536
|
+
this.state.step = 3;
|
|
537
|
+
this.state.selectedIndex = this.state.repoPattern ? REPO_PATTERN_OPTIONS.indexOf(this.state.repoPattern) : 0;
|
|
341
538
|
break;
|
|
342
539
|
case 5:
|
|
343
|
-
state.step = 4;
|
|
344
|
-
state.selectedIndex = state.techStack ? TECH_STACK_OPTIONS.indexOf(state.techStack) : 0;
|
|
540
|
+
this.state.step = 4;
|
|
541
|
+
this.state.selectedIndex = this.state.techStack ? TECH_STACK_OPTIONS.indexOf(this.state.techStack) : 0;
|
|
345
542
|
break;
|
|
346
543
|
case 6:
|
|
347
|
-
state.step = 5;
|
|
348
|
-
state.selectedIndex = state.codingStandards ? CODING_STANDARDS_OPTIONS.indexOf(state.codingStandards) : 0;
|
|
544
|
+
this.state.step = 5;
|
|
545
|
+
this.state.selectedIndex = this.state.codingStandards ? CODING_STANDARDS_OPTIONS.indexOf(this.state.codingStandards) : 0;
|
|
349
546
|
break;
|
|
350
547
|
case 7:
|
|
351
|
-
state.step = 6;
|
|
352
|
-
state.selectedIndex = state.initGit ? 0 : 1;
|
|
548
|
+
this.state.step = 6;
|
|
549
|
+
this.state.selectedIndex = this.state.initGit ? 0 : 1;
|
|
550
|
+
break;
|
|
551
|
+
case 8:
|
|
552
|
+
this.state.step = 7;
|
|
553
|
+
this.state.selectedIndex = this.state.trackInDatabase ? 0 : 1;
|
|
554
|
+
break;
|
|
555
|
+
case 9:
|
|
556
|
+
// Go back to workflow mode if DB tracking is on, otherwise go to DB tracking step
|
|
557
|
+
this.state.step = this.state.trackInDatabase ? 8 : 7;
|
|
558
|
+
this.state.selectedIndex = this.state.trackInDatabase
|
|
559
|
+
? WORKFLOW_MODE_OPTIONS.indexOf(this.state.workflowMode)
|
|
560
|
+
: 1;
|
|
353
561
|
break;
|
|
354
562
|
}
|
|
355
|
-
state.error = null;
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
const name = state.inputBuffer.trim();
|
|
563
|
+
this.state.error = null;
|
|
564
|
+
}
|
|
565
|
+
validateInput() {
|
|
566
|
+
if (this.state.step === 1) {
|
|
567
|
+
const name = this.state.inputBuffer.trim();
|
|
361
568
|
if (!name) {
|
|
362
|
-
state.error = 'Project name is required';
|
|
569
|
+
this.state.error = 'Project name is required';
|
|
363
570
|
return false;
|
|
364
571
|
}
|
|
365
572
|
if (!isValidProjectName(name)) {
|
|
366
|
-
state.error = 'Invalid name. Use lowercase letters, numbers, hyphens (2-50 chars, start with letter)';
|
|
573
|
+
this.state.error = 'Invalid name. Use lowercase letters, numbers, hyphens (2-50 chars, start with letter)';
|
|
367
574
|
return false;
|
|
368
575
|
}
|
|
369
576
|
if (projectExists(name)) {
|
|
370
|
-
state.error = `Directory "${name}" already exists`;
|
|
577
|
+
this.state.error = `Directory "${name}" already exists`;
|
|
371
578
|
return false;
|
|
372
579
|
}
|
|
373
580
|
}
|
|
374
|
-
if (state.step === 2) {
|
|
375
|
-
const desc = state.inputBuffer.trim();
|
|
581
|
+
if (this.state.step === 2) {
|
|
582
|
+
const desc = this.state.inputBuffer.trim();
|
|
376
583
|
if (!desc) {
|
|
377
|
-
state.error = 'Description is required';
|
|
584
|
+
this.state.error = 'Description is required';
|
|
378
585
|
return false;
|
|
379
586
|
}
|
|
380
587
|
if (desc.length < 10) {
|
|
381
|
-
state.error = 'Description too short (min 10 characters)';
|
|
588
|
+
this.state.error = 'Description too short (min 10 characters)';
|
|
382
589
|
return false;
|
|
383
590
|
}
|
|
384
591
|
}
|
|
385
592
|
return true;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
const handleData = (data) => {
|
|
398
|
-
void onData(data);
|
|
399
|
-
};
|
|
400
|
-
const onData = async (data) => {
|
|
401
|
-
const isEscape = data.length === 1 && data[0] === 0x1b;
|
|
402
|
-
const isUpArrow = data.length === 3 && data[0] === 0x1b && data[1] === 0x5b && data[2] === 0x41;
|
|
403
|
-
const isDownArrow = data.length === 3 && data[0] === 0x1b && data[1] === 0x5b && data[2] === 0x42;
|
|
404
|
-
const isCtrlC = data.length === 1 && data[0] === 0x03;
|
|
405
|
-
const isEnter = data.length === 1 && (data[0] === 0x0d || data[0] === 0x0a);
|
|
406
|
-
const isBackspace = data.length === 1 && (data[0] === 0x7f || data[0] === 0x08);
|
|
407
|
-
// Ctrl+C always cancels
|
|
408
|
-
if (isCtrlC) {
|
|
409
|
-
cleanup();
|
|
410
|
-
resolve({ created: false });
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
// Escape on step 0 cancels, otherwise goes back
|
|
414
|
-
if (isEscape) {
|
|
415
|
-
if (state.step === 0) {
|
|
416
|
-
cleanup();
|
|
417
|
-
resolve({ created: false });
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
prevStep();
|
|
421
|
-
lineCount = render(state, lineCount);
|
|
422
|
-
return;
|
|
423
|
-
}
|
|
424
|
-
// Handle selection steps
|
|
425
|
-
if (isSelectionStep(state.step)) {
|
|
426
|
-
const maxOptions = getMaxOptionsForStep(state.step);
|
|
427
|
-
if (isUpArrow && state.selectedIndex > 0) {
|
|
428
|
-
state.selectedIndex--;
|
|
429
|
-
lineCount = render(state, lineCount);
|
|
430
|
-
return;
|
|
431
|
-
}
|
|
432
|
-
if (isDownArrow && state.selectedIndex < maxOptions - 1) {
|
|
433
|
-
state.selectedIndex++;
|
|
434
|
-
lineCount = render(state, lineCount);
|
|
435
|
-
return;
|
|
436
|
-
}
|
|
437
|
-
if (isEnter) {
|
|
438
|
-
// Step 0 - only allow "new" option
|
|
439
|
-
if (state.step === 0 && state.selectedIndex === 1) {
|
|
440
|
-
state.error = 'This option is coming soon';
|
|
441
|
-
lineCount = render(state, lineCount);
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
// Step 7 - confirmation
|
|
445
|
-
if (state.step === 7) {
|
|
446
|
-
if (state.selectedIndex === 1) {
|
|
447
|
-
// Cancel
|
|
448
|
-
cleanup();
|
|
449
|
-
resolve({ created: false });
|
|
450
|
-
return;
|
|
451
|
-
}
|
|
452
|
-
// Verify all required fields are set (they should be by step 7)
|
|
453
|
-
if (!state.repoPattern || !state.techStack || !state.codingStandards) {
|
|
454
|
-
state.error = 'Missing configuration values';
|
|
455
|
-
lineCount = render(state, lineCount);
|
|
456
|
-
return;
|
|
457
|
-
}
|
|
458
|
-
// Create project
|
|
459
|
-
const config = {
|
|
460
|
-
name: state.projectName,
|
|
461
|
-
description: state.description,
|
|
462
|
-
repoPattern: state.repoPattern,
|
|
463
|
-
techStack: state.techStack,
|
|
464
|
-
codingStandards: state.codingStandards,
|
|
465
|
-
initGit: state.initGit,
|
|
466
|
-
};
|
|
467
|
-
cleanup();
|
|
468
|
-
// Show "creating..." message
|
|
469
|
-
terminal.writeLine(chalk.cyan(' Creating project...'));
|
|
470
|
-
try {
|
|
471
|
-
const result = await generateProject(config);
|
|
472
|
-
if (result.success) {
|
|
473
|
-
resolve({
|
|
474
|
-
created: true,
|
|
475
|
-
projectPath: result.projectPath,
|
|
476
|
-
docsPath: result.docsPath,
|
|
477
|
-
filesCreated: result.filesCreated,
|
|
478
|
-
});
|
|
479
|
-
}
|
|
480
|
-
else {
|
|
481
|
-
terminal.writeLine(chalk.red(` Error: ${result.error ?? 'Unknown error'}`));
|
|
482
|
-
resolve({ created: false });
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
catch (error) {
|
|
486
|
-
terminal.writeLine(chalk.red(` Error: ${error.message}`));
|
|
487
|
-
resolve({ created: false });
|
|
488
|
-
}
|
|
489
|
-
return;
|
|
490
|
-
}
|
|
491
|
-
nextStep();
|
|
492
|
-
lineCount = render(state, lineCount);
|
|
493
|
-
return;
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
// Handle input steps
|
|
497
|
-
if (isInputStep(state.step)) {
|
|
498
|
-
if (isEnter) {
|
|
499
|
-
if (validateInput()) {
|
|
500
|
-
nextStep();
|
|
501
|
-
lineCount = render(state, lineCount);
|
|
502
|
-
}
|
|
503
|
-
else {
|
|
504
|
-
lineCount = render(state, lineCount);
|
|
505
|
-
}
|
|
506
|
-
return;
|
|
507
|
-
}
|
|
508
|
-
if (isBackspace) {
|
|
509
|
-
state.inputBuffer = state.inputBuffer.slice(0, -1);
|
|
510
|
-
state.error = null;
|
|
511
|
-
lineCount = render(state, lineCount);
|
|
512
|
-
return;
|
|
513
|
-
}
|
|
514
|
-
// Regular character input
|
|
515
|
-
const char = data.toString('utf-8');
|
|
516
|
-
if (char.length === 1 && char.charCodeAt(0) >= 32) {
|
|
517
|
-
state.inputBuffer += char;
|
|
518
|
-
state.error = null;
|
|
519
|
-
lineCount = render(state, lineCount);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
};
|
|
523
|
-
process.stdin.on('data', handleData);
|
|
524
|
-
});
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
// =============================================================================
|
|
596
|
+
// Main Export
|
|
597
|
+
// =============================================================================
|
|
598
|
+
/**
|
|
599
|
+
* Show the init wizard overlay
|
|
600
|
+
*/
|
|
601
|
+
export async function showInitOverlay() {
|
|
602
|
+
const overlay = new InitOverlayImpl();
|
|
603
|
+
return overlay.show();
|
|
525
604
|
}
|