@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.
Files changed (315) hide show
  1. package/README.md +30 -12
  2. package/dist/agent.d.ts +74 -1
  3. package/dist/agent.js +259 -76
  4. package/dist/anchors/index.d.ts +9 -0
  5. package/dist/anchors/index.js +9 -0
  6. package/dist/anchors/project-anchors.d.ts +79 -0
  7. package/dist/anchors/project-anchors.js +202 -0
  8. package/dist/commands/handler-types.d.ts +68 -0
  9. package/dist/commands/handler-types.js +8 -0
  10. package/dist/commands/handlers/agent-commands.d.ts +13 -0
  11. package/dist/commands/handlers/agent-commands.js +305 -0
  12. package/dist/commands/handlers/design-commands.d.ts +15 -0
  13. package/dist/commands/handlers/design-commands.js +334 -0
  14. package/dist/commands/handlers/index.d.ts +20 -0
  15. package/dist/commands/handlers/index.js +43 -0
  16. package/dist/commands/handlers/overlay-commands.d.ts +21 -0
  17. package/dist/commands/handlers/overlay-commands.js +287 -0
  18. package/dist/commands/handlers/project-commands.d.ts +11 -0
  19. package/dist/commands/handlers/project-commands.js +167 -0
  20. package/dist/commands/handlers/simple-commands.d.ts +19 -0
  21. package/dist/commands/handlers/simple-commands.js +144 -0
  22. package/dist/commands/index.d.ts +2 -1
  23. package/dist/commands/registry.d.ts +50 -0
  24. package/dist/commands/registry.js +75 -0
  25. package/dist/commands-v2/handlers/context.d.ts +13 -0
  26. package/dist/commands-v2/handlers/context.js +348 -0
  27. package/dist/commands-v2/handlers/core.d.ts +13 -0
  28. package/dist/commands-v2/handlers/core.js +165 -0
  29. package/dist/commands-v2/handlers/debug.d.ts +11 -0
  30. package/dist/commands-v2/handlers/debug.js +159 -0
  31. package/dist/commands-v2/handlers/index.d.ts +12 -0
  32. package/dist/commands-v2/handlers/index.js +24 -0
  33. package/dist/commands-v2/handlers/project.d.ts +22 -0
  34. package/dist/commands-v2/handlers/project.js +814 -0
  35. package/dist/commands-v2/handlers/settings.d.ts +15 -0
  36. package/dist/commands-v2/handlers/settings.js +235 -0
  37. package/dist/commands-v2/index.d.ts +13 -0
  38. package/dist/commands-v2/index.js +15 -0
  39. package/dist/commands-v2/registry.d.ts +37 -0
  40. package/dist/commands-v2/registry.js +80 -0
  41. package/dist/commands-v2/types.d.ts +75 -0
  42. package/dist/commands-v2/types.js +7 -0
  43. package/dist/commands.js +110 -7
  44. package/dist/index.js +288 -29
  45. package/dist/input-handlers/index.d.ts +7 -0
  46. package/dist/input-handlers/index.js +7 -0
  47. package/dist/input-handlers/memory-handler.d.ts +26 -0
  48. package/dist/input-handlers/memory-handler.js +68 -0
  49. package/dist/repl-helpers.d.ts +63 -0
  50. package/dist/repl-helpers.js +318 -0
  51. package/dist/repl-v2.d.ts +155 -0
  52. package/dist/repl-v2.js +774 -0
  53. package/dist/repl.d.ts +32 -4
  54. package/dist/repl.js +250 -977
  55. package/dist/settings/index.d.ts +23 -0
  56. package/dist/settings/index.js +48 -0
  57. package/dist/settings/paths.d.ts +110 -0
  58. package/dist/settings/paths.js +264 -0
  59. package/dist/templates/compilr-md.js +7 -4
  60. package/dist/templates/index.js +3 -4
  61. package/dist/themes/colors.js +3 -1
  62. package/dist/themes/registry.d.ts +5 -36
  63. package/dist/themes/registry.js +11 -95
  64. package/dist/themes/types.d.ts +3 -38
  65. package/dist/themes/types.js +2 -2
  66. package/dist/tools/anchor-tools.d.ts +31 -0
  67. package/dist/tools/anchor-tools.js +255 -0
  68. package/dist/tools/backlog-wrappers.d.ts +54 -0
  69. package/dist/tools/backlog-wrappers.js +338 -0
  70. package/dist/tools/backlog.js +1 -1
  71. package/dist/tools/db-tools.d.ts +65 -0
  72. package/dist/tools/db-tools.js +19 -0
  73. package/dist/tools/document-db.d.ts +43 -0
  74. package/dist/tools/document-db.js +220 -0
  75. package/dist/tools/project-db.d.ts +102 -0
  76. package/dist/tools/project-db.js +370 -0
  77. package/dist/tools/workitem-db.d.ts +103 -0
  78. package/dist/tools/workitem-db.js +549 -0
  79. package/dist/tools.js +13 -3
  80. package/dist/ui/agents-overlay-v2.d.ts +43 -0
  81. package/dist/ui/agents-overlay-v2.js +809 -0
  82. package/dist/ui/agents-overlay.d.ts +5 -5
  83. package/dist/ui/agents-overlay.js +782 -420
  84. package/dist/ui/anchors-overlay.d.ts +12 -0
  85. package/dist/ui/anchors-overlay.js +775 -0
  86. package/dist/ui/arch-type-overlay.d.ts +1 -6
  87. package/dist/ui/arch-type-overlay.js +175 -203
  88. package/dist/ui/ask-user-overlay-v2.d.ts +26 -0
  89. package/dist/ui/ask-user-overlay-v2.js +555 -0
  90. package/dist/ui/ask-user-overlay.d.ts +2 -2
  91. package/dist/ui/ask-user-overlay.js +443 -535
  92. package/dist/ui/ask-user-simple-overlay-v2.d.ts +25 -0
  93. package/dist/ui/ask-user-simple-overlay-v2.js +215 -0
  94. package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
  95. package/dist/ui/ask-user-simple-overlay.js +182 -209
  96. package/dist/ui/backlog-overlay.d.ts +16 -1
  97. package/dist/ui/backlog-overlay.js +525 -659
  98. package/dist/ui/base/index.d.ts +26 -0
  99. package/dist/ui/base/index.js +33 -0
  100. package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
  101. package/dist/ui/base/inline-overlay-utils.js +320 -0
  102. package/dist/ui/base/inline-overlay.d.ts +159 -0
  103. package/dist/ui/base/inline-overlay.js +257 -0
  104. package/dist/ui/base/key-utils.d.ts +15 -0
  105. package/dist/ui/base/key-utils.js +30 -0
  106. package/dist/ui/base/overlay-base-v2.d.ts +193 -0
  107. package/dist/ui/base/overlay-base-v2.js +246 -0
  108. package/dist/ui/base/overlay-base.d.ts +156 -0
  109. package/dist/ui/base/overlay-base.js +238 -0
  110. package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
  111. package/dist/ui/base/overlay-lifecycle.js +159 -0
  112. package/dist/ui/base/overlay-types.d.ts +185 -0
  113. package/dist/ui/base/overlay-types.js +7 -0
  114. package/dist/ui/base/render-utils.d.ts +8 -0
  115. package/dist/ui/base/render-utils.js +11 -0
  116. package/dist/ui/base/screen-stack.d.ts +148 -0
  117. package/dist/ui/base/screen-stack.js +184 -0
  118. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +103 -0
  119. package/dist/ui/base/tabbed-list-overlay-v2.js +317 -0
  120. package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
  121. package/dist/ui/base/tabbed-list-overlay.js +369 -0
  122. package/dist/ui/commands-overlay-v2.d.ts +33 -0
  123. package/dist/ui/commands-overlay-v2.js +441 -0
  124. package/dist/ui/commands-overlay.d.ts +7 -2
  125. package/dist/ui/commands-overlay.js +384 -355
  126. package/dist/ui/config-overlay.d.ts +5 -4
  127. package/dist/ui/config-overlay.js +243 -513
  128. package/dist/ui/conversation.d.ts +75 -4
  129. package/dist/ui/conversation.js +374 -161
  130. package/dist/ui/docs-overlay.d.ts +17 -0
  131. package/dist/ui/docs-overlay.js +303 -0
  132. package/dist/ui/ephemeral.d.ts +1 -1
  133. package/dist/ui/ephemeral.js +1 -1
  134. package/dist/ui/features/index.d.ts +34 -0
  135. package/dist/ui/features/index.js +34 -0
  136. package/dist/ui/features/input-feature.d.ts +85 -0
  137. package/dist/ui/features/input-feature.js +238 -0
  138. package/dist/ui/features/list-feature.d.ts +155 -0
  139. package/dist/ui/features/list-feature.js +244 -0
  140. package/dist/ui/features/pagination-feature.d.ts +154 -0
  141. package/dist/ui/features/pagination-feature.js +238 -0
  142. package/dist/ui/features/search-feature.d.ts +148 -0
  143. package/dist/ui/features/search-feature.js +185 -0
  144. package/dist/ui/features/tab-feature.d.ts +194 -0
  145. package/dist/ui/features/tab-feature.js +307 -0
  146. package/dist/ui/footer-v2.d.ts +222 -0
  147. package/dist/ui/footer-v2.js +1349 -0
  148. package/dist/ui/footer.d.ts +107 -0
  149. package/dist/ui/footer.js +359 -67
  150. package/dist/ui/guardrail-overlay.d.ts +29 -0
  151. package/dist/ui/guardrail-overlay.js +145 -0
  152. package/dist/ui/help-overlay-v2.d.ts +34 -0
  153. package/dist/ui/help-overlay-v2.js +309 -0
  154. package/dist/ui/help-overlay.d.ts +16 -0
  155. package/dist/ui/help-overlay.js +316 -0
  156. package/dist/ui/index.d.ts +1 -1
  157. package/dist/ui/index.js +1 -3
  158. package/dist/ui/init-overlay-v2.d.ts +34 -0
  159. package/dist/ui/init-overlay-v2.js +600 -0
  160. package/dist/ui/init-overlay.d.ts +12 -2
  161. package/dist/ui/init-overlay.js +349 -270
  162. package/dist/ui/input-prompt-v2.d.ts +1 -0
  163. package/dist/ui/input-prompt-v2.js +14 -6
  164. package/dist/ui/input-prompt.d.ts +116 -33
  165. package/dist/ui/input-prompt.js +536 -337
  166. package/dist/ui/iteration-limit-overlay-v2.d.ts +21 -0
  167. package/dist/ui/iteration-limit-overlay-v2.js +114 -0
  168. package/dist/ui/iteration-limit-overlay.d.ts +2 -2
  169. package/dist/ui/iteration-limit-overlay.js +92 -128
  170. package/dist/ui/keys-overlay-v2.d.ts +41 -0
  171. package/dist/ui/keys-overlay-v2.js +248 -0
  172. package/dist/ui/keys-overlay.d.ts +1 -0
  173. package/dist/ui/keys-overlay.js +203 -141
  174. package/dist/ui/line-utils.d.ts +88 -0
  175. package/dist/ui/line-utils.js +150 -0
  176. package/dist/ui/live-region.d.ts +161 -0
  177. package/dist/ui/live-region.js +387 -0
  178. package/dist/ui/mascot/expressions.d.ts +32 -0
  179. package/dist/ui/mascot/expressions.js +213 -0
  180. package/dist/ui/mascot/index.d.ts +8 -0
  181. package/dist/ui/mascot/index.js +8 -0
  182. package/dist/ui/mascot/renderer.d.ts +19 -0
  183. package/dist/ui/mascot/renderer.js +97 -0
  184. package/dist/ui/mascot-overlay-v2.d.ts +41 -0
  185. package/dist/ui/mascot-overlay-v2.js +138 -0
  186. package/dist/ui/mascot-overlay.d.ts +21 -0
  187. package/dist/ui/mascot-overlay.js +146 -0
  188. package/dist/ui/model-overlay-v2.d.ts +49 -0
  189. package/dist/ui/model-overlay-v2.js +118 -0
  190. package/dist/ui/model-overlay.d.ts +27 -0
  191. package/dist/ui/model-overlay.js +221 -0
  192. package/dist/ui/model-warning-overlay.js +3 -5
  193. package/dist/ui/new-overlay.d.ts +34 -0
  194. package/dist/ui/new-overlay.js +604 -0
  195. package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
  196. package/dist/ui/overlay/impl/agents-overlay-v2.js +825 -0
  197. package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
  198. package/dist/ui/overlay/impl/anchors-overlay-v2.js +783 -0
  199. package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
  200. package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
  201. package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
  202. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +584 -0
  203. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
  204. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
  205. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +49 -0
  206. package/dist/ui/overlay/impl/backlog-overlay-v2.js +642 -0
  207. package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
  208. package/dist/ui/overlay/impl/commands-overlay-v2.js +441 -0
  209. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +100 -0
  210. package/dist/ui/overlay/impl/config-overlay-v2.js +654 -0
  211. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +55 -0
  212. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +359 -0
  213. package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
  214. package/dist/ui/overlay/impl/docs-overlay-v2.js +114 -0
  215. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +77 -0
  216. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1071 -0
  217. package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
  218. package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
  219. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +34 -0
  220. package/dist/ui/overlay/impl/help-overlay-v2.js +309 -0
  221. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +77 -0
  222. package/dist/ui/overlay/impl/init-overlay-v2.js +593 -0
  223. package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
  224. package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
  225. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
  226. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
  227. package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
  228. package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
  229. package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
  230. package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
  231. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +49 -0
  232. package/dist/ui/overlay/impl/model-overlay-v2.js +118 -0
  233. package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
  234. package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
  235. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +77 -0
  236. package/dist/ui/overlay/impl/new-overlay-v2.js +593 -0
  237. package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
  238. package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
  239. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +36 -0
  240. package/dist/ui/overlay/impl/projects-overlay-v2.js +499 -0
  241. package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
  242. package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
  243. package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
  244. package/dist/ui/overlay/impl/tools-overlay-v2.js +218 -0
  245. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +31 -0
  246. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +1035 -0
  247. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
  248. package/dist/ui/overlay/impl/workflow-overlay-v2.js +637 -0
  249. package/dist/ui/overlay/index.d.ts +33 -0
  250. package/dist/ui/overlay/index.js +35 -0
  251. package/dist/ui/overlay/key-utils.d.ts +6 -0
  252. package/dist/ui/overlay/key-utils.js +6 -0
  253. package/dist/ui/overlay/overlay-types.d.ts +128 -0
  254. package/dist/ui/overlay/overlay-types.js +22 -0
  255. package/dist/ui/overlay/types.d.ts +135 -0
  256. package/dist/ui/overlay/types.js +22 -0
  257. package/dist/ui/overlays/help-overlay-v2.d.ts +28 -0
  258. package/dist/ui/overlays/help-overlay-v2.js +198 -0
  259. package/dist/ui/overlays/index.d.ts +11 -0
  260. package/dist/ui/overlays/index.js +11 -0
  261. package/dist/ui/overlays.d.ts +0 -4
  262. package/dist/ui/overlays.js +0 -444
  263. package/dist/ui/permission-overlay-v2.d.ts +36 -0
  264. package/dist/ui/permission-overlay-v2.js +380 -0
  265. package/dist/ui/permission-overlay.d.ts +1 -1
  266. package/dist/ui/permission-overlay.js +186 -298
  267. package/dist/ui/projects-overlay.d.ts +19 -0
  268. package/dist/ui/projects-overlay.js +484 -0
  269. package/dist/ui/providers/types.d.ts +178 -0
  270. package/dist/ui/providers/types.js +9 -0
  271. package/dist/ui/render-modes.d.ts +36 -0
  272. package/dist/ui/render-modes.js +44 -0
  273. package/dist/ui/startup-menu.d.ts +36 -0
  274. package/dist/ui/startup-menu.js +236 -0
  275. package/dist/ui/subagent-renderer.d.ts +117 -0
  276. package/dist/ui/subagent-renderer.js +334 -0
  277. package/dist/ui/terminal-codes.d.ts +94 -0
  278. package/dist/ui/terminal-codes.js +124 -0
  279. package/dist/ui/terminal-renderer.d.ts +221 -0
  280. package/dist/ui/terminal-renderer.js +751 -0
  281. package/dist/ui/terminal-ui.d.ts +463 -0
  282. package/dist/ui/terminal-ui.js +2296 -0
  283. package/dist/ui/terminal.d.ts +20 -0
  284. package/dist/ui/terminal.js +72 -0
  285. package/dist/ui/theme-overlay-v2.d.ts +42 -0
  286. package/dist/ui/theme-overlay-v2.js +135 -0
  287. package/dist/ui/theme-overlay.d.ts +24 -0
  288. package/dist/ui/theme-overlay.js +127 -0
  289. package/dist/ui/todo-zone.js +53 -25
  290. package/dist/ui/tool-formatters.d.ts +16 -0
  291. package/dist/ui/tool-formatters.js +516 -0
  292. package/dist/ui/tools-overlay-v2.d.ts +47 -0
  293. package/dist/ui/tools-overlay-v2.js +218 -0
  294. package/dist/ui/tools-overlay.d.ts +10 -2
  295. package/dist/ui/tools-overlay.js +172 -220
  296. package/dist/ui/tutorial-overlay-v2.d.ts +31 -0
  297. package/dist/ui/tutorial-overlay-v2.js +1035 -0
  298. package/dist/ui/tutorial-overlay.d.ts +1 -0
  299. package/dist/ui/tutorial-overlay.js +400 -302
  300. package/dist/ui/workflow-overlay.d.ts +22 -0
  301. package/dist/ui/workflow-overlay.js +636 -0
  302. package/dist/utils/debug-log.d.ts +28 -0
  303. package/dist/utils/debug-log.js +57 -0
  304. package/dist/utils/model-tiers.js +1 -1
  305. package/dist/utils/path-safety.d.ts +56 -0
  306. package/dist/utils/path-safety.js +239 -0
  307. package/dist/workflow/guided-mode-injector.d.ts +42 -0
  308. package/dist/workflow/guided-mode-injector.js +191 -0
  309. package/dist/workflow/index.d.ts +8 -0
  310. package/dist/workflow/index.js +8 -0
  311. package/dist/workflow/step-criteria.d.ts +62 -0
  312. package/dist/workflow/step-criteria.js +150 -0
  313. package/dist/workflow/step-tracker.d.ts +92 -0
  314. package/dist/workflow/step-tracker.js +141 -0
  315. package/package.json +12 -5
@@ -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. Confirmation
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)}/7]`));
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(' ↑↓ Navigate · Enter Select · Esc Cancel'));
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 === 7) {
45
- lines.push(s.muted(' ↑↓ Navigate · Enter Confirm · Esc Go back'));
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 Go back'));
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(...renderHeader(state.step));
191
- switch (state.step) {
192
- case 0:
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 Navigation
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
- * Show the init wizard overlay
257
- */
258
- export async function showInitOverlay() {
259
- const state = {
260
- step: 0,
261
- projectType: null,
262
- projectName: '',
263
- description: '',
264
- repoPattern: null,
265
- techStack: null,
266
- codingStandards: null,
267
- initGit: true,
268
- selectedIndex: 0,
269
- inputBuffer: '',
270
- error: null,
271
- };
272
- let lineCount = 0;
273
- terminal.writeLine('');
274
- terminal.hideCursor();
275
- const wasRawMode = process.stdin.isRaw;
276
- terminal.enableRawMode();
277
- lineCount = render(state, 0);
278
- // Navigate to next step
279
- const nextStep = () => {
280
- switch (state.step) {
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
- // Only "new" option works (index 0)
283
- if (state.selectedIndex === 0) {
284
- state.projectType = 'new';
285
- state.step = 1;
286
- state.inputBuffer = '';
287
- state.selectedIndex = 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;
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
- // Navigate to previous step
324
- const prevStep = () => {
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
- // Validate input for current step
358
- const validateInput = () => {
359
- if (state.step === 1) {
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
- return new Promise((resolve) => {
388
- const cleanup = () => {
389
- terminal.clearLinesAbove(lineCount);
390
- terminal.writeLine('');
391
- terminal.showCursor();
392
- if (!wasRawMode) {
393
- terminal.disableRawMode();
394
- }
395
- process.stdin.removeListener('data', handleData);
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
  }