@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,604 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* New Project Overlay
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for the /new wizard - creates new projects with structured workflow.
|
|
5
|
+
* Uses InlineOverlay base class for consistent lifecycle management.
|
|
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 * as terminal from './terminal.js';
|
|
21
|
+
import { getStyles } from '../themes/index.js';
|
|
22
|
+
import { InlineOverlay } from './base/inline-overlay.js';
|
|
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';
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// Constants
|
|
27
|
+
// =============================================================================
|
|
28
|
+
const TECH_STACK_OPTIONS = ['react-node-pg', 'react-python-pg', 'vue-node-pg', 'custom'];
|
|
29
|
+
const CODING_STANDARDS_OPTIONS = ['strict', 'relaxed', 'custom'];
|
|
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
|
+
};
|
|
36
|
+
// =============================================================================
|
|
37
|
+
// Rendering Helpers
|
|
38
|
+
// =============================================================================
|
|
39
|
+
function renderHeader(step) {
|
|
40
|
+
const s = getStyles();
|
|
41
|
+
const lines = [];
|
|
42
|
+
const cols = terminal.getTerminalWidth();
|
|
43
|
+
lines.push(s.muted('─'.repeat(Math.max(1, cols - 1))));
|
|
44
|
+
lines.push(' ' + s.primaryBold('Initialize New Project') + s.muted(` [${String(step)}/9]`));
|
|
45
|
+
lines.push('');
|
|
46
|
+
return lines;
|
|
47
|
+
}
|
|
48
|
+
function renderFooter(step) {
|
|
49
|
+
const s = getStyles();
|
|
50
|
+
const lines = [];
|
|
51
|
+
lines.push('');
|
|
52
|
+
if (step === 0) {
|
|
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'));
|
|
57
|
+
}
|
|
58
|
+
else if (isSelectionStep(step)) {
|
|
59
|
+
lines.push(s.muted(' ↑↓/jk Navigate · Enter Select · Esc Back'));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
lines.push(s.muted(' Enter Confirm · Esc Back'));
|
|
63
|
+
}
|
|
64
|
+
return lines;
|
|
65
|
+
}
|
|
66
|
+
function renderSelectionOption(index, selectedIndex, label, disabled = false) {
|
|
67
|
+
const s = getStyles();
|
|
68
|
+
const isSelected = index === selectedIndex;
|
|
69
|
+
const prefix = isSelected ? ' ❯ ' : ' ';
|
|
70
|
+
if (disabled) {
|
|
71
|
+
return s.muted(prefix + label + ' (coming soon)');
|
|
72
|
+
}
|
|
73
|
+
return isSelected ? s.primary(prefix + label) : s.muted(prefix + label);
|
|
74
|
+
}
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// Step Renderers
|
|
77
|
+
// =============================================================================
|
|
78
|
+
function renderStep0(state) {
|
|
79
|
+
const s = getStyles();
|
|
80
|
+
const lines = [];
|
|
81
|
+
lines.push(chalk.bold(' What would you like to do?'));
|
|
82
|
+
lines.push('');
|
|
83
|
+
lines.push(renderSelectionOption(0, state.selectedIndex, '1. Start a new project'));
|
|
84
|
+
lines.push(renderSelectionOption(1, state.selectedIndex, '2. Add workflow to existing project', true));
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push(s.muted(' Start fresh with a structured project layout'));
|
|
87
|
+
lines.push(s.muted(' optimized for AI-assisted development.'));
|
|
88
|
+
return lines;
|
|
89
|
+
}
|
|
90
|
+
function renderStep1(state) {
|
|
91
|
+
const s = getStyles();
|
|
92
|
+
const lines = [];
|
|
93
|
+
lines.push(chalk.bold(' Project name'));
|
|
94
|
+
lines.push('');
|
|
95
|
+
lines.push(` > ${state.inputBuffer}█`);
|
|
96
|
+
lines.push('');
|
|
97
|
+
if (state.error) {
|
|
98
|
+
lines.push(s.error(` ${state.error}`));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
lines.push(s.muted(' Use lowercase letters, numbers, hyphens (e.g., my-saas-app)'));
|
|
102
|
+
lines.push(s.muted(' 2-50 characters, must start with a letter'));
|
|
103
|
+
}
|
|
104
|
+
return lines;
|
|
105
|
+
}
|
|
106
|
+
function renderStep2(state) {
|
|
107
|
+
const s = getStyles();
|
|
108
|
+
const lines = [];
|
|
109
|
+
lines.push(chalk.bold(' What are you building?'));
|
|
110
|
+
lines.push('');
|
|
111
|
+
lines.push(` > ${state.inputBuffer}█`);
|
|
112
|
+
lines.push('');
|
|
113
|
+
if (state.error) {
|
|
114
|
+
lines.push(s.error(` ${state.error}`));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
lines.push(s.muted(' Brief description (1-2 sentences)'));
|
|
118
|
+
lines.push(s.muted(' Example: "A task management SaaS for small teams"'));
|
|
119
|
+
}
|
|
120
|
+
return lines;
|
|
121
|
+
}
|
|
122
|
+
function renderStep3(state) {
|
|
123
|
+
const s = getStyles();
|
|
124
|
+
const lines = [];
|
|
125
|
+
lines.push(chalk.bold(' Documentation structure'));
|
|
126
|
+
lines.push('');
|
|
127
|
+
for (let i = 0; i < REPO_PATTERN_OPTIONS.length; i++) {
|
|
128
|
+
const pattern = REPO_PATTERN_OPTIONS[i];
|
|
129
|
+
lines.push(renderSelectionOption(i, state.selectedIndex, `${String(i + 1)}. ${REPO_PATTERN_LABELS[pattern]}`));
|
|
130
|
+
}
|
|
131
|
+
lines.push('');
|
|
132
|
+
lines.push(s.muted(' Single repo: All files in one repository'));
|
|
133
|
+
lines.push(s.muted(' Two repos: Code and docs in separate repositories'));
|
|
134
|
+
return lines;
|
|
135
|
+
}
|
|
136
|
+
function renderStep4(state) {
|
|
137
|
+
const s = getStyles();
|
|
138
|
+
const lines = [];
|
|
139
|
+
lines.push(chalk.bold(' Tech stack'));
|
|
140
|
+
lines.push('');
|
|
141
|
+
for (let i = 0; i < TECH_STACK_OPTIONS.length; i++) {
|
|
142
|
+
const stack = TECH_STACK_OPTIONS[i];
|
|
143
|
+
lines.push(renderSelectionOption(i, state.selectedIndex, `${String(i + 1)}. ${TECH_STACK_LABELS[stack]}`));
|
|
144
|
+
}
|
|
145
|
+
lines.push('');
|
|
146
|
+
lines.push(s.muted(' Choose a preset or configure later'));
|
|
147
|
+
return lines;
|
|
148
|
+
}
|
|
149
|
+
function renderStep5(state) {
|
|
150
|
+
const s = getStyles();
|
|
151
|
+
const lines = [];
|
|
152
|
+
lines.push(chalk.bold(' Coding standards preset'));
|
|
153
|
+
lines.push('');
|
|
154
|
+
for (let i = 0; i < CODING_STANDARDS_OPTIONS.length; i++) {
|
|
155
|
+
const standard = CODING_STANDARDS_OPTIONS[i];
|
|
156
|
+
lines.push(renderSelectionOption(i, state.selectedIndex, `${String(i + 1)}. ${CODING_STANDARDS_LABELS[standard]}`));
|
|
157
|
+
}
|
|
158
|
+
lines.push('');
|
|
159
|
+
lines.push(s.muted(' Strict: Full TypeScript with strict mode + ESLint'));
|
|
160
|
+
lines.push(s.muted(' Relaxed: TypeScript with basic strict mode'));
|
|
161
|
+
lines.push(s.muted(' Custom: Configure your own standards later'));
|
|
162
|
+
return lines;
|
|
163
|
+
}
|
|
164
|
+
function renderStep6(state) {
|
|
165
|
+
const s = getStyles();
|
|
166
|
+
const lines = [];
|
|
167
|
+
lines.push(chalk.bold(' Initialize git repository?'));
|
|
168
|
+
lines.push('');
|
|
169
|
+
lines.push(renderSelectionOption(0, state.selectedIndex, 'Yes'));
|
|
170
|
+
lines.push(renderSelectionOption(1, state.selectedIndex, 'No'));
|
|
171
|
+
lines.push('');
|
|
172
|
+
lines.push(s.muted(' Creates git repo with initial commit'));
|
|
173
|
+
return lines;
|
|
174
|
+
}
|
|
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) {
|
|
203
|
+
const s = getStyles();
|
|
204
|
+
const lines = [];
|
|
205
|
+
lines.push(chalk.bold(' Ready to create project?'));
|
|
206
|
+
lines.push('');
|
|
207
|
+
lines.push(` Project: ${s.primary(state.projectName)}`);
|
|
208
|
+
lines.push(` Location: ${s.primary('./' + state.projectName + '/')}`);
|
|
209
|
+
lines.push(` Structure: ${s.primary(state.repoPattern === 'single' ? 'Single repo' : 'Two repos')}`);
|
|
210
|
+
lines.push(` Tech: ${s.primary(state.techStack ? TECH_STACK_LABELS[state.techStack] : 'Not set')}`);
|
|
211
|
+
lines.push(` Standards: ${s.primary(state.codingStandards ? CODING_STANDARDS_LABELS[state.codingStandards] : 'Not set')}`);
|
|
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
|
+
}
|
|
217
|
+
if (state.repoPattern === 'two-repo') {
|
|
218
|
+
lines.push('');
|
|
219
|
+
lines.push(s.muted(` Docs repo: ./${state.projectName}-docs/`));
|
|
220
|
+
}
|
|
221
|
+
lines.push('');
|
|
222
|
+
if (state.error) {
|
|
223
|
+
lines.push(s.error(` ${state.error}`));
|
|
224
|
+
lines.push('');
|
|
225
|
+
}
|
|
226
|
+
lines.push(renderSelectionOption(0, state.selectedIndex, 'Create'));
|
|
227
|
+
lines.push(renderSelectionOption(1, state.selectedIndex, 'Cancel'));
|
|
228
|
+
return lines;
|
|
229
|
+
}
|
|
230
|
+
function renderGenerating(state) {
|
|
231
|
+
const lines = [];
|
|
232
|
+
lines.push('');
|
|
233
|
+
lines.push(chalk.cyan(` Creating project "${state.projectName}"...`));
|
|
234
|
+
lines.push('');
|
|
235
|
+
return lines;
|
|
236
|
+
}
|
|
237
|
+
// =============================================================================
|
|
238
|
+
// Step Helpers
|
|
239
|
+
// =============================================================================
|
|
240
|
+
function getMaxOptionsForStep(step) {
|
|
241
|
+
switch (step) {
|
|
242
|
+
case 0:
|
|
243
|
+
return 2;
|
|
244
|
+
case 3:
|
|
245
|
+
return REPO_PATTERN_OPTIONS.length;
|
|
246
|
+
case 4:
|
|
247
|
+
return TECH_STACK_OPTIONS.length;
|
|
248
|
+
case 5:
|
|
249
|
+
return CODING_STANDARDS_OPTIONS.length;
|
|
250
|
+
case 6:
|
|
251
|
+
return 2;
|
|
252
|
+
case 7:
|
|
253
|
+
return 2;
|
|
254
|
+
case 8:
|
|
255
|
+
return WORKFLOW_MODE_OPTIONS.length;
|
|
256
|
+
case 9:
|
|
257
|
+
return 2;
|
|
258
|
+
default:
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function isSelectionStep(step) {
|
|
263
|
+
return [0, 3, 4, 5, 6, 7, 8, 9].includes(step);
|
|
264
|
+
}
|
|
265
|
+
function isInputStep(step) {
|
|
266
|
+
return [1, 2].includes(step);
|
|
267
|
+
}
|
|
268
|
+
// =============================================================================
|
|
269
|
+
// Init Overlay Implementation
|
|
270
|
+
// =============================================================================
|
|
271
|
+
class NewProjectOverlayImpl 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) {
|
|
298
|
+
case 0:
|
|
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;
|
|
475
|
+
}
|
|
476
|
+
break;
|
|
477
|
+
case 1:
|
|
478
|
+
this.state.projectName = this.state.inputBuffer.trim();
|
|
479
|
+
this.state.step = 2;
|
|
480
|
+
this.state.inputBuffer = '';
|
|
481
|
+
break;
|
|
482
|
+
case 2:
|
|
483
|
+
this.state.description = this.state.inputBuffer.trim();
|
|
484
|
+
this.state.step = 3;
|
|
485
|
+
this.state.selectedIndex = 0;
|
|
486
|
+
break;
|
|
487
|
+
case 3:
|
|
488
|
+
this.state.repoPattern = REPO_PATTERN_OPTIONS[this.state.selectedIndex];
|
|
489
|
+
this.state.step = 4;
|
|
490
|
+
this.state.selectedIndex = 0;
|
|
491
|
+
break;
|
|
492
|
+
case 4:
|
|
493
|
+
this.state.techStack = TECH_STACK_OPTIONS[this.state.selectedIndex];
|
|
494
|
+
this.state.step = 5;
|
|
495
|
+
this.state.selectedIndex = 0;
|
|
496
|
+
break;
|
|
497
|
+
case 5:
|
|
498
|
+
this.state.codingStandards = CODING_STANDARDS_OPTIONS[this.state.selectedIndex];
|
|
499
|
+
this.state.step = 6;
|
|
500
|
+
this.state.selectedIndex = 0;
|
|
501
|
+
break;
|
|
502
|
+
case 6:
|
|
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;
|
|
517
|
+
break;
|
|
518
|
+
}
|
|
519
|
+
this.state.error = null;
|
|
520
|
+
}
|
|
521
|
+
prevStep() {
|
|
522
|
+
switch (this.state.step) {
|
|
523
|
+
case 1:
|
|
524
|
+
this.state.step = 0;
|
|
525
|
+
this.state.selectedIndex = 0;
|
|
526
|
+
break;
|
|
527
|
+
case 2:
|
|
528
|
+
this.state.step = 1;
|
|
529
|
+
this.state.inputBuffer = this.state.projectName;
|
|
530
|
+
break;
|
|
531
|
+
case 3:
|
|
532
|
+
this.state.step = 2;
|
|
533
|
+
this.state.inputBuffer = this.state.description;
|
|
534
|
+
break;
|
|
535
|
+
case 4:
|
|
536
|
+
this.state.step = 3;
|
|
537
|
+
this.state.selectedIndex = this.state.repoPattern ? REPO_PATTERN_OPTIONS.indexOf(this.state.repoPattern) : 0;
|
|
538
|
+
break;
|
|
539
|
+
case 5:
|
|
540
|
+
this.state.step = 4;
|
|
541
|
+
this.state.selectedIndex = this.state.techStack ? TECH_STACK_OPTIONS.indexOf(this.state.techStack) : 0;
|
|
542
|
+
break;
|
|
543
|
+
case 6:
|
|
544
|
+
this.state.step = 5;
|
|
545
|
+
this.state.selectedIndex = this.state.codingStandards ? CODING_STANDARDS_OPTIONS.indexOf(this.state.codingStandards) : 0;
|
|
546
|
+
break;
|
|
547
|
+
case 7:
|
|
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;
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
this.state.error = null;
|
|
564
|
+
}
|
|
565
|
+
validateInput() {
|
|
566
|
+
if (this.state.step === 1) {
|
|
567
|
+
const name = this.state.inputBuffer.trim();
|
|
568
|
+
if (!name) {
|
|
569
|
+
this.state.error = 'Project name is required';
|
|
570
|
+
return false;
|
|
571
|
+
}
|
|
572
|
+
if (!isValidProjectName(name)) {
|
|
573
|
+
this.state.error = 'Invalid name. Use lowercase letters, numbers, hyphens (2-50 chars, start with letter)';
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
576
|
+
if (projectExists(name)) {
|
|
577
|
+
this.state.error = `Directory "${name}" already exists`;
|
|
578
|
+
return false;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
if (this.state.step === 2) {
|
|
582
|
+
const desc = this.state.inputBuffer.trim();
|
|
583
|
+
if (!desc) {
|
|
584
|
+
this.state.error = 'Description is required';
|
|
585
|
+
return false;
|
|
586
|
+
}
|
|
587
|
+
if (desc.length < 10) {
|
|
588
|
+
this.state.error = 'Description too short (min 10 characters)';
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
return true;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
// =============================================================================
|
|
596
|
+
// Main Export
|
|
597
|
+
// =============================================================================
|
|
598
|
+
/**
|
|
599
|
+
* Show the init wizard overlay
|
|
600
|
+
*/
|
|
601
|
+
export async function showNewProjectOverlay() {
|
|
602
|
+
const overlay = new NewProjectOverlayImpl();
|
|
603
|
+
return overlay.show();
|
|
604
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agents Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for viewing and managing agent configurations.
|
|
5
|
+
* Uses TabbedListOverlayV2 for consistent list/tab/search behavior.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Built-in tab: Lists predefined agent types with detail view
|
|
9
|
+
* - Custom tab: Lists user-defined agents with detail/edit + create new
|
|
10
|
+
* - Wizard mode: Step-by-step agent creation
|
|
11
|
+
*/
|
|
12
|
+
import { TabbedListOverlayV2, BaseScreen } from '../../base/index.js';
|
|
13
|
+
import type { AgentLocation } from '../../../agents/types.js';
|
|
14
|
+
interface AgentItem {
|
|
15
|
+
name: string;
|
|
16
|
+
model: string;
|
|
17
|
+
description: string;
|
|
18
|
+
location?: AgentLocation;
|
|
19
|
+
systemPrompt?: string;
|
|
20
|
+
filePath?: string;
|
|
21
|
+
isBuiltin: boolean;
|
|
22
|
+
isCreateNew?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface AgentsOverlayV2Result {
|
|
25
|
+
/** Name of newly created agent, if any */
|
|
26
|
+
created?: string;
|
|
27
|
+
/** Name of deleted agent, if any */
|
|
28
|
+
deleted?: string;
|
|
29
|
+
/** Name of edited agent, if any */
|
|
30
|
+
edited?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class AgentsOverlayV2 extends TabbedListOverlayV2<AgentItem, AgentsOverlayV2Result> {
|
|
33
|
+
readonly type: "inline";
|
|
34
|
+
readonly id = "agents-overlay-v2";
|
|
35
|
+
private readonly editState;
|
|
36
|
+
constructor();
|
|
37
|
+
private static buildItems;
|
|
38
|
+
private static agentToItem;
|
|
39
|
+
protected createDetailScreen(item: AgentItem): BaseScreen | null;
|
|
40
|
+
/**
|
|
41
|
+
* Refresh items after wizard/edit completes.
|
|
42
|
+
*/
|
|
43
|
+
private refreshItems;
|
|
44
|
+
}
|
|
45
|
+
export {};
|