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