@compilr-dev/cli 0.5.0 → 0.5.2

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 (587) hide show
  1. package/LICENSE +108 -0
  2. package/README.md +237 -69
  3. package/dist/.tsbuildinfo.app +1 -0
  4. package/dist/.tsbuildinfo.data +1 -0
  5. package/dist/.tsbuildinfo.domain +1 -0
  6. package/dist/.tsbuildinfo.foundation +1 -0
  7. package/dist/agent.d.ts +61 -4
  8. package/dist/agent.js +241 -245
  9. package/dist/anchors/index.d.ts +1 -1
  10. package/dist/anchors/index.js +1 -1
  11. package/dist/anchors/project-anchors.d.ts +2 -2
  12. package/dist/anchors/project-anchors.js +1 -1
  13. package/dist/auth/api-client.d.ts +124 -0
  14. package/dist/auth/api-client.js +261 -0
  15. package/dist/auth/index.d.ts +172 -0
  16. package/dist/auth/index.js +545 -0
  17. package/dist/auth/storage.d.ts +52 -0
  18. package/dist/auth/storage.js +118 -0
  19. package/dist/changelog/index.d.ts +16 -0
  20. package/dist/changelog/index.js +24 -0
  21. package/dist/changelog/releases.d.ts +17 -0
  22. package/dist/changelog/releases.js +63 -0
  23. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  24. package/dist/commands-v2/handlers/auth.js +118 -0
  25. package/dist/commands-v2/handlers/background.d.ts +14 -0
  26. package/dist/commands-v2/handlers/background.js +276 -0
  27. package/dist/commands-v2/handlers/context.js +286 -81
  28. package/dist/commands-v2/handlers/core.d.ts +1 -0
  29. package/dist/commands-v2/handlers/core.js +133 -8
  30. package/dist/commands-v2/handlers/debug.js +18 -0
  31. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  32. package/dist/commands-v2/handlers/delegations.js +29 -0
  33. package/dist/commands-v2/handlers/files.d.ts +8 -0
  34. package/dist/commands-v2/handlers/files.js +162 -0
  35. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  36. package/dist/commands-v2/handlers/filter.js +130 -0
  37. package/dist/commands-v2/handlers/games.d.ts +7 -0
  38. package/dist/commands-v2/handlers/games.js +57 -0
  39. package/dist/commands-v2/handlers/index.d.ts +13 -0
  40. package/dist/commands-v2/handlers/index.js +39 -0
  41. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  42. package/dist/commands-v2/handlers/mcp.js +39 -0
  43. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  44. package/dist/commands-v2/handlers/notifications.js +34 -0
  45. package/dist/commands-v2/handlers/project.js +295 -31
  46. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  47. package/dist/commands-v2/handlers/reset.js +118 -0
  48. package/dist/commands-v2/handlers/session.d.ts +161 -0
  49. package/dist/commands-v2/handlers/session.js +805 -0
  50. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  51. package/dist/commands-v2/handlers/settings.js +217 -35
  52. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  53. package/dist/commands-v2/handlers/tasks.js +36 -0
  54. package/dist/commands-v2/handlers/team.d.ts +9 -0
  55. package/dist/commands-v2/handlers/team.js +549 -0
  56. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  57. package/dist/commands-v2/handlers/terminals.js +34 -0
  58. package/dist/commands-v2/index.d.ts +3 -2
  59. package/dist/commands-v2/index.js +4 -1
  60. package/dist/commands-v2/registry.d.ts +15 -0
  61. package/dist/commands-v2/registry.js +34 -0
  62. package/dist/commands-v2/types.d.ts +81 -3
  63. package/dist/commands.js +13 -0
  64. package/dist/compilr-diff-companion.vsix +0 -0
  65. package/dist/db/index.js +98 -4
  66. package/dist/db/repositories/document-repository.d.ts +2 -0
  67. package/dist/db/repositories/document-repository.js +6 -1
  68. package/dist/db/repositories/index.d.ts +2 -0
  69. package/dist/db/repositories/index.js +1 -0
  70. package/dist/db/repositories/plan-repository.d.ts +101 -0
  71. package/dist/db/repositories/plan-repository.js +275 -0
  72. package/dist/db/repositories/project-repository.d.ts +6 -0
  73. package/dist/db/repositories/project-repository.js +41 -0
  74. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  75. package/dist/db/repositories/work-item-repository.js +69 -4
  76. package/dist/db/schema.d.ts +40 -3
  77. package/dist/db/schema.js +66 -3
  78. package/dist/episodes/index.d.ts +20 -0
  79. package/dist/episodes/index.js +27 -0
  80. package/dist/episodes/recorder.d.ts +51 -0
  81. package/dist/episodes/recorder.js +195 -0
  82. package/dist/episodes/significant-work.d.ts +21 -0
  83. package/dist/episodes/significant-work.js +56 -0
  84. package/dist/episodes/store.d.ts +38 -0
  85. package/dist/episodes/store.js +199 -0
  86. package/dist/episodes/types.d.ts +35 -0
  87. package/dist/episodes/types.js +6 -0
  88. package/dist/episodes/work-at-risk.d.ts +12 -0
  89. package/dist/episodes/work-at-risk.js +38 -0
  90. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  91. package/dist/episodes/work-summary-anchor.js +73 -0
  92. package/dist/games/coins.d.ts +66 -0
  93. package/dist/games/coins.js +165 -0
  94. package/dist/games/game-base.d.ts +84 -0
  95. package/dist/games/game-base.js +204 -0
  96. package/dist/games/index.d.ts +16 -0
  97. package/dist/games/index.js +49 -0
  98. package/dist/games/scores.d.ts +69 -0
  99. package/dist/games/scores.js +191 -0
  100. package/dist/games/tetris/board.d.ts +59 -0
  101. package/dist/games/tetris/board.js +170 -0
  102. package/dist/games/tetris/index.d.ts +109 -0
  103. package/dist/games/tetris/index.js +610 -0
  104. package/dist/games/tetris/pieces.d.ts +44 -0
  105. package/dist/games/tetris/pieces.js +271 -0
  106. package/dist/games/tetris/renderer.d.ts +26 -0
  107. package/dist/games/tetris/renderer.js +77 -0
  108. package/dist/guide/guide-content.d.ts +23 -0
  109. package/dist/guide/guide-content.js +196 -0
  110. package/dist/guide/index.d.ts +8 -0
  111. package/dist/guide/index.js +7 -0
  112. package/dist/guide/shared-content.d.ts +37 -0
  113. package/dist/guide/shared-content.js +1272 -0
  114. package/dist/guide/tutorial-helpers.d.ts +57 -0
  115. package/dist/guide/tutorial-helpers.js +147 -0
  116. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  117. package/dist/handlers/ask-user-handlers.js +104 -0
  118. package/dist/handlers/delegation-handlers.d.ts +34 -0
  119. package/dist/handlers/delegation-handlers.js +291 -0
  120. package/dist/handlers/permission-handler.d.ts +30 -0
  121. package/dist/handlers/permission-handler.js +205 -0
  122. package/dist/index.d.ts +11 -1
  123. package/dist/index.js +448 -271
  124. package/dist/input-handlers/memory-handler.d.ts +1 -1
  125. package/dist/input-handlers/memory-handler.js +2 -1
  126. package/dist/models/index.d.ts +10 -0
  127. package/dist/models/index.js +12 -0
  128. package/dist/models/model-registry.d.ts +38 -0
  129. package/dist/models/model-registry.js +69 -0
  130. package/dist/models/model-tiers.d.ts +28 -0
  131. package/dist/models/model-tiers.js +71 -0
  132. package/dist/models/model-validation.d.ts +25 -0
  133. package/dist/models/model-validation.js +291 -0
  134. package/dist/models/ollama-models.d.ts +73 -0
  135. package/dist/models/ollama-models.js +178 -0
  136. package/dist/models/provider-types.d.ts +6 -0
  137. package/dist/models/provider-types.js +1 -0
  138. package/dist/models/providers.d.ts +35 -0
  139. package/dist/models/providers.js +58 -0
  140. package/dist/models/types.d.ts +4 -0
  141. package/dist/models/types.js +4 -0
  142. package/dist/multi-agent/activity.d.ts +21 -0
  143. package/dist/multi-agent/activity.js +34 -0
  144. package/dist/multi-agent/agent-selection.d.ts +55 -0
  145. package/dist/multi-agent/agent-selection.js +90 -0
  146. package/dist/multi-agent/artifacts.d.ts +197 -0
  147. package/dist/multi-agent/artifacts.js +379 -0
  148. package/dist/multi-agent/checkpointer.d.ts +138 -0
  149. package/dist/multi-agent/checkpointer.js +471 -0
  150. package/dist/multi-agent/collision-utils.d.ts +16 -0
  151. package/dist/multi-agent/collision-utils.js +28 -0
  152. package/dist/multi-agent/context-resolver.d.ts +97 -0
  153. package/dist/multi-agent/context-resolver.js +316 -0
  154. package/dist/multi-agent/custom-agents.d.ts +83 -0
  155. package/dist/multi-agent/custom-agents.js +227 -0
  156. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  157. package/dist/multi-agent/delegation-tracker.js +243 -0
  158. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  159. package/dist/multi-agent/file-lock-hook.js +97 -0
  160. package/dist/multi-agent/file-locks.d.ts +58 -0
  161. package/dist/multi-agent/file-locks.js +194 -0
  162. package/dist/multi-agent/index.d.ts +24 -0
  163. package/dist/multi-agent/index.js +30 -0
  164. package/dist/multi-agent/mention-parser.d.ts +64 -0
  165. package/dist/multi-agent/mention-parser.js +146 -0
  166. package/dist/multi-agent/notification-manager.d.ts +84 -0
  167. package/dist/multi-agent/notification-manager.js +224 -0
  168. package/dist/multi-agent/pending-requests.d.ts +122 -0
  169. package/dist/multi-agent/pending-requests.js +155 -0
  170. package/dist/multi-agent/session-registry.d.ts +139 -0
  171. package/dist/multi-agent/session-registry.js +514 -0
  172. package/dist/multi-agent/shared-context.d.ts +293 -0
  173. package/dist/multi-agent/shared-context.js +671 -0
  174. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  175. package/dist/multi-agent/skill-requirements.js +178 -0
  176. package/dist/multi-agent/task-assignment.d.ts +69 -0
  177. package/dist/multi-agent/task-assignment.js +123 -0
  178. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  179. package/dist/multi-agent/task-suggestion.js +72 -0
  180. package/dist/multi-agent/team-agent.d.ts +201 -0
  181. package/dist/multi-agent/team-agent.js +488 -0
  182. package/dist/multi-agent/team.d.ts +286 -0
  183. package/dist/multi-agent/team.js +610 -0
  184. package/dist/multi-agent/tool-config.d.ts +110 -0
  185. package/dist/multi-agent/tool-config.js +661 -0
  186. package/dist/multi-agent/types.d.ts +211 -0
  187. package/dist/multi-agent/types.js +617 -0
  188. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  189. package/dist/prompts/plan-mode-prompt.js +95 -0
  190. package/dist/repl-helpers.js +5 -2
  191. package/dist/repl-v2.d.ts +401 -2
  192. package/dist/repl-v2.js +2588 -65
  193. package/dist/session/index.d.ts +6 -0
  194. package/dist/session/index.js +6 -0
  195. package/dist/session/project-session-manager.d.ts +158 -0
  196. package/dist/session/project-session-manager.js +650 -0
  197. package/dist/settings/index.d.ts +133 -13
  198. package/dist/settings/index.js +329 -24
  199. package/dist/settings/mcp-config.d.ts +76 -0
  200. package/dist/settings/mcp-config.js +143 -0
  201. package/dist/settings/paths.d.ts +4 -0
  202. package/dist/settings/paths.js +6 -0
  203. package/dist/shared-handlers.d.ts +62 -0
  204. package/dist/shared-handlers.js +48 -0
  205. package/dist/system-prompt/builder.d.ts +5 -0
  206. package/dist/system-prompt/builder.js +4 -0
  207. package/dist/system-prompt/index.d.ts +18 -0
  208. package/dist/system-prompt/index.js +18 -0
  209. package/dist/system-prompt/modules.d.ts +5 -0
  210. package/dist/system-prompt/modules.js +4 -0
  211. package/dist/tabbed-menu.js +2 -1
  212. package/dist/templates/compilr-md-import.d.ts +16 -0
  213. package/dist/templates/compilr-md-import.js +241 -0
  214. package/dist/templates/compilr-md.js +10 -61
  215. package/dist/templates/config-json.d.ts +1 -25
  216. package/dist/templates/index.d.ts +2 -0
  217. package/dist/templates/index.js +34 -73
  218. package/dist/tool-names.d.ts +113 -0
  219. package/dist/tool-names.js +239 -0
  220. package/dist/tools/ask-user-simple.d.ts +1 -1
  221. package/dist/tools/ask-user-simple.js +2 -1
  222. package/dist/tools/ask-user.d.ts +1 -1
  223. package/dist/tools/ask-user.js +2 -1
  224. package/dist/tools/backlog.d.ts +2 -2
  225. package/dist/tools/backlog.js +1 -1
  226. package/dist/tools/db-tools.d.ts +13 -61
  227. package/dist/tools/db-tools.js +12 -13
  228. package/dist/tools/delegate-background.d.ts +27 -0
  229. package/dist/tools/delegate-background.js +115 -0
  230. package/dist/tools/delegate.d.ts +22 -0
  231. package/dist/tools/delegate.js +97 -0
  232. package/dist/tools/delegation-status.d.ts +16 -0
  233. package/dist/tools/delegation-status.js +128 -0
  234. package/dist/tools/guide-tool.d.ts +12 -0
  235. package/dist/tools/guide-tool.js +59 -0
  236. package/dist/tools/handoff.d.ts +25 -0
  237. package/dist/tools/handoff.js +99 -0
  238. package/dist/tools/meta-tools.d.ts +26 -0
  239. package/dist/tools/meta-tools.js +47 -0
  240. package/dist/tools/platform-adapter.d.ts +35 -0
  241. package/dist/tools/platform-adapter.js +404 -0
  242. package/dist/tools/project-db.d.ts +5 -73
  243. package/dist/tools/project-db.js +5 -336
  244. package/dist/tools.d.ts +67 -2
  245. package/dist/tools.js +240 -48
  246. package/dist/ui/autocomplete-controller.d.ts +42 -0
  247. package/dist/ui/autocomplete-controller.js +384 -0
  248. package/dist/ui/base/index.d.ts +1 -1
  249. package/dist/ui/base/index.js +1 -1
  250. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  251. package/dist/ui/base/overlay-base-v2.js +14 -0
  252. package/dist/ui/base/render-utils.d.ts +19 -0
  253. package/dist/ui/base/render-utils.js +25 -0
  254. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  255. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  256. package/dist/ui/constants/labels.d.ts +14 -0
  257. package/dist/ui/constants/labels.js +52 -0
  258. package/dist/ui/conversation-store.d.ts +55 -0
  259. package/dist/ui/conversation-store.js +107 -0
  260. package/dist/ui/conversation.js +11 -13
  261. package/dist/ui/diff.d.ts +7 -1
  262. package/dist/ui/diff.js +85 -48
  263. package/dist/ui/ephemeral.js +3 -9
  264. package/dist/ui/file-autocomplete.d.ts +24 -0
  265. package/dist/ui/file-autocomplete.js +56 -0
  266. package/dist/ui/footer-renderer.d.ts +69 -0
  267. package/dist/ui/footer-renderer.js +431 -0
  268. package/dist/ui/footer.d.ts +74 -7
  269. package/dist/ui/footer.js +173 -16
  270. package/dist/ui/input-controller.d.ts +51 -0
  271. package/dist/ui/input-controller.js +176 -0
  272. package/dist/ui/input-prompt.d.ts +19 -0
  273. package/dist/ui/input-prompt.js +206 -14
  274. package/dist/ui/keyboard-handler.d.ts +57 -0
  275. package/dist/ui/keyboard-handler.js +557 -0
  276. package/dist/ui/live-region-facade.d.ts +42 -0
  277. package/dist/ui/live-region-facade.js +205 -0
  278. package/dist/ui/live-region.d.ts +0 -4
  279. package/dist/ui/live-region.js +6 -14
  280. package/dist/ui/mascot/renderer.d.ts +1 -1
  281. package/dist/ui/mascot/renderer.js +37 -2
  282. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  283. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  284. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  285. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  286. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  287. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  288. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  289. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  290. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  291. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  292. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  293. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  294. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  295. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  296. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  297. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  298. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  299. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  300. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  301. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  302. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  303. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  304. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  305. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  306. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  307. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  308. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  309. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  310. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  311. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  312. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  313. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  314. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  315. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  316. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  317. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  318. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  319. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  320. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  321. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  322. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  323. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  324. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  325. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  326. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  327. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  328. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  329. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  330. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  331. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  332. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  333. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  334. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  335. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  336. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  337. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  338. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  339. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  340. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  341. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  342. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  343. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  344. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  345. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  346. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  347. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  348. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  349. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  350. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  351. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  352. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  353. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  354. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  355. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  356. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  357. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  358. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  359. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  360. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  361. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  362. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  363. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  364. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  365. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  366. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  367. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  368. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  369. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  370. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  371. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  372. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  373. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  374. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  375. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  376. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  377. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  378. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  379. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  380. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  381. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  382. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  383. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  384. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  385. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  386. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  387. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  388. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  389. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  390. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  391. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  392. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  393. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  394. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  395. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  396. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  397. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  398. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  399. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  400. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  401. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  402. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  403. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  404. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  405. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  406. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  407. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  408. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  409. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  410. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  411. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
  412. package/dist/ui/overlay/impl/workflow-overlay-v2.js +10 -4
  413. package/dist/ui/overlay/index.d.ts +20 -1
  414. package/dist/ui/overlay/index.js +19 -0
  415. package/dist/ui/overlay/types.d.ts +5 -0
  416. package/dist/ui/overlay-manager.d.ts +43 -0
  417. package/dist/ui/overlay-manager.js +238 -0
  418. package/dist/ui/overlays.js +4 -16
  419. package/dist/ui/permission-overlay.js +6 -5
  420. package/dist/ui/status-bar-controller.d.ts +33 -0
  421. package/dist/ui/status-bar-controller.js +99 -0
  422. package/dist/ui/subagent-renderer.js +3 -19
  423. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  424. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  425. package/dist/ui/terminal-line-builders.d.ts +17 -0
  426. package/dist/ui/terminal-line-builders.js +42 -0
  427. package/dist/ui/terminal-render-item.d.ts +16 -0
  428. package/dist/ui/terminal-render-item.js +267 -0
  429. package/dist/ui/terminal-renderer.d.ts +7 -8
  430. package/dist/ui/terminal-renderer.js +7 -8
  431. package/dist/ui/terminal-types.d.ts +179 -0
  432. package/dist/ui/terminal-types.js +34 -0
  433. package/dist/ui/terminal-ui.d.ts +144 -276
  434. package/dist/ui/terminal-ui.js +384 -1861
  435. package/dist/ui/todo-zone.d.ts +19 -1
  436. package/dist/ui/todo-zone.js +71 -13
  437. package/dist/ui/tool-formatters.js +696 -1
  438. package/dist/ui/turn-metrics.d.ts +56 -0
  439. package/dist/ui/turn-metrics.js +75 -0
  440. package/dist/ui/types.d.ts +28 -0
  441. package/dist/ui/types.js +1 -0
  442. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  443. package/dist/ui/vscode-diff-ipc.js +385 -0
  444. package/dist/utils/credentials.d.ts +24 -5
  445. package/dist/utils/credentials.js +123 -9
  446. package/dist/utils/format-tokens.d.ts +13 -0
  447. package/dist/utils/format-tokens.js +18 -0
  448. package/dist/utils/git-config.d.ts +26 -0
  449. package/dist/utils/git-config.js +54 -0
  450. package/dist/utils/message-utils.d.ts +61 -0
  451. package/dist/utils/message-utils.js +72 -0
  452. package/dist/utils/model-tiers.d.ts +8 -1
  453. package/dist/utils/model-tiers.js +38 -16
  454. package/dist/utils/open-browser.d.ts +5 -0
  455. package/dist/utils/open-browser.js +32 -0
  456. package/dist/utils/path-safety.js +3 -2
  457. package/dist/utils/project-detection.d.ts +58 -0
  458. package/dist/utils/project-detection.js +424 -0
  459. package/dist/utils/project-memory.js +2 -1
  460. package/dist/utils/project-status.d.ts +2 -2
  461. package/dist/utils/startup-perf.d.ts +18 -0
  462. package/dist/utils/startup-perf.js +60 -0
  463. package/dist/utils/token-tracker.d.ts +62 -0
  464. package/dist/utils/token-tracker.js +150 -0
  465. package/dist/utils/token-types.d.ts +23 -0
  466. package/dist/utils/token-types.js +18 -0
  467. package/dist/utils/types/config-types.d.ts +32 -0
  468. package/dist/utils/types/config-types.js +8 -0
  469. package/dist/utils/update-checker.d.ts +28 -0
  470. package/dist/utils/update-checker.js +106 -0
  471. package/dist/utils/version.d.ts +7 -0
  472. package/dist/utils/version.js +10 -0
  473. package/dist/utils/vscode-detect.d.ts +39 -0
  474. package/dist/utils/vscode-detect.js +137 -0
  475. package/package.json +27 -13
  476. package/dist/commands/handler-types.d.ts +0 -68
  477. package/dist/commands/handler-types.js +0 -8
  478. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  479. package/dist/commands/handlers/agent-commands.js +0 -305
  480. package/dist/commands/handlers/design-commands.d.ts +0 -15
  481. package/dist/commands/handlers/design-commands.js +0 -334
  482. package/dist/commands/handlers/index.d.ts +0 -20
  483. package/dist/commands/handlers/index.js +0 -43
  484. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  485. package/dist/commands/handlers/overlay-commands.js +0 -287
  486. package/dist/commands/handlers/project-commands.d.ts +0 -11
  487. package/dist/commands/handlers/project-commands.js +0 -167
  488. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  489. package/dist/commands/handlers/simple-commands.js +0 -144
  490. package/dist/commands/registry.d.ts +0 -50
  491. package/dist/commands/registry.js +0 -75
  492. package/dist/index.old.d.ts +0 -7
  493. package/dist/index.old.js +0 -1014
  494. package/dist/repl.d.ts +0 -149
  495. package/dist/repl.js +0 -1151
  496. package/dist/templates/claude-md.d.ts +0 -7
  497. package/dist/templates/claude-md.js +0 -189
  498. package/dist/test-autocomplete.d.ts +0 -7
  499. package/dist/test-autocomplete.js +0 -85
  500. package/dist/test-tabbed-menu.d.ts +0 -7
  501. package/dist/test-tabbed-menu.js +0 -25
  502. package/dist/tool-selector.d.ts +0 -71
  503. package/dist/tool-selector.js +0 -184
  504. package/dist/tools/anchor-tools.d.ts +0 -31
  505. package/dist/tools/anchor-tools.js +0 -255
  506. package/dist/tools/backlog-wrappers.d.ts +0 -54
  507. package/dist/tools/backlog-wrappers.js +0 -338
  508. package/dist/tools/document-db.d.ts +0 -43
  509. package/dist/tools/document-db.js +0 -220
  510. package/dist/tools/workitem-db.d.ts +0 -103
  511. package/dist/tools/workitem-db.js +0 -549
  512. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  513. package/dist/ui/agents-overlay-v2.js +0 -809
  514. package/dist/ui/agents-overlay.d.ts +0 -12
  515. package/dist/ui/agents-overlay.js +0 -863
  516. package/dist/ui/anchors-overlay.d.ts +0 -12
  517. package/dist/ui/anchors-overlay.js +0 -775
  518. package/dist/ui/arch-type-overlay.d.ts +0 -15
  519. package/dist/ui/arch-type-overlay.js +0 -201
  520. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  521. package/dist/ui/ask-user-overlay-v2.js +0 -555
  522. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  523. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  524. package/dist/ui/backlog-overlay.d.ts +0 -32
  525. package/dist/ui/backlog-overlay.js +0 -652
  526. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  527. package/dist/ui/commands-overlay-v2.js +0 -441
  528. package/dist/ui/commands-overlay.d.ts +0 -16
  529. package/dist/ui/commands-overlay.js +0 -439
  530. package/dist/ui/config-overlay.d.ts +0 -35
  531. package/dist/ui/config-overlay.js +0 -707
  532. package/dist/ui/docs-overlay.d.ts +0 -17
  533. package/dist/ui/docs-overlay.js +0 -303
  534. package/dist/ui/footer-v2.d.ts +0 -222
  535. package/dist/ui/footer-v2.js +0 -1349
  536. package/dist/ui/help-overlay-v2.d.ts +0 -34
  537. package/dist/ui/help-overlay-v2.js +0 -309
  538. package/dist/ui/help-overlay.d.ts +0 -16
  539. package/dist/ui/help-overlay.js +0 -316
  540. package/dist/ui/init-overlay-v2.d.ts +0 -34
  541. package/dist/ui/init-overlay-v2.js +0 -600
  542. package/dist/ui/init-overlay.d.ts +0 -34
  543. package/dist/ui/init-overlay.js +0 -604
  544. package/dist/ui/input-prompt-v2.d.ts +0 -180
  545. package/dist/ui/input-prompt-v2.js +0 -999
  546. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  547. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  548. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  549. package/dist/ui/keys-overlay-v2.js +0 -248
  550. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  551. package/dist/ui/mascot-overlay-v2.js +0 -138
  552. package/dist/ui/mascot-overlay.d.ts +0 -21
  553. package/dist/ui/mascot-overlay.js +0 -146
  554. package/dist/ui/model-overlay-v2.d.ts +0 -49
  555. package/dist/ui/model-overlay-v2.js +0 -118
  556. package/dist/ui/model-overlay.d.ts +0 -27
  557. package/dist/ui/model-overlay.js +0 -221
  558. package/dist/ui/model-warning-overlay.d.ts +0 -30
  559. package/dist/ui/model-warning-overlay.js +0 -169
  560. package/dist/ui/new-overlay.d.ts +0 -34
  561. package/dist/ui/new-overlay.js +0 -604
  562. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  563. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  564. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  565. package/dist/ui/overlay/overlay-types.js +0 -22
  566. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  567. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  568. package/dist/ui/overlays/index.d.ts +0 -11
  569. package/dist/ui/overlays/index.js +0 -11
  570. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  571. package/dist/ui/permission-overlay-v2.js +0 -380
  572. package/dist/ui/projects-overlay.d.ts +0 -19
  573. package/dist/ui/projects-overlay.js +0 -484
  574. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  575. package/dist/ui/theme-overlay-v2.js +0 -135
  576. package/dist/ui/theme-overlay.d.ts +0 -24
  577. package/dist/ui/theme-overlay.js +0 -127
  578. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  579. package/dist/ui/tools-overlay-v2.js +0 -218
  580. package/dist/ui/tools-overlay.d.ts +0 -34
  581. package/dist/ui/tools-overlay.js +0 -230
  582. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  583. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  584. package/dist/ui/tutorial-overlay.d.ts +0 -11
  585. package/dist/ui/tutorial-overlay.js +0 -1034
  586. package/dist/ui/workflow-overlay.d.ts +0 -22
  587. package/dist/ui/workflow-overlay.js +0 -636
@@ -1,10 +1,20 @@
1
1
  /**
2
2
  * Tutorial Overlay V2
3
3
  *
4
- * Interactive tutorial using the new Overlay interface.
5
- * Supports guided sequential tour and topic-based navigation.
4
+ * Interactive tutorial with guided walkthroughs.
5
+ * Extends TabbedListOverlayV2 for consistent UI with other overlays.
6
+ *
7
+ * Features:
8
+ * - 5 tabs: Basics, Projects, Planning, Teams, Config
9
+ * - Searchable tutorial list
10
+ * - Multi-page detail view for each tutorial
6
11
  */
7
- import { BaseOverlayV2, BaseScreen, ScreenStack, stay, pushScreen, popScreen, closeOverlay, isEscape, isEnter, isCtrlC, isClose, isNavigateUp, isNavigateDown, isLeftArrow, isRightArrow, isVimLeft, isVimRight, isBackspace, renderBorder, } from '../../base/index.js';
12
+ import { TabbedListOverlayV2, BaseScreen, stay, popScreen, closeOverlay, isEscape, isEnter, isCtrlC, isQuit, isLeftArrow, isRightArrow, isVimLeft, isVimRight, isBackspace, renderBorder, } from '../../base/index.js';
13
+ import { buildTutorialContent, } from '../data/tutorial-content.js';
14
+ // =============================================================================
15
+ // Constants
16
+ // =============================================================================
17
+ const PAGE_SIZE = 8;
8
18
  // =============================================================================
9
19
  // Helper
10
20
  // =============================================================================
@@ -13,864 +23,41 @@ function stripAnsi(str) {
13
23
  return str.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, '');
14
24
  }
15
25
  // =============================================================================
16
- // Content
17
- // =============================================================================
18
- function buildTopics(s) {
19
- return [
20
- // =========================================================================
21
- // Topic 1: Workflow Overview
22
- // =========================================================================
23
- {
24
- id: 'overview',
25
- name: 'Workflow Overview',
26
- description: 'The philosophy and stages',
27
- pages: [
28
- {
29
- title: 'Philosophy',
30
- lines: [
31
- '',
32
- ` ${s.primaryBold('compilr.dev')} is built on five core principles:`,
33
- '',
34
- ` ${s.primary('1. Structured')}`,
35
- ` Follow an organized workflow instead of ad-hoc coding.`,
36
- ` Every project has clear phases and documentation.`,
37
- '',
38
- ` ${s.primary('2. Disciplined')}`,
39
- ` Move through clear phases from design to delivery.`,
40
- ` Don't skip steps - each builds on the previous.`,
41
- '',
42
- ` ${s.primary('3. Intentional')}`,
43
- ` Every feature starts with requirements, not code.`,
44
- ` Know what you're building before you build it.`,
45
- '',
46
- ],
47
- },
48
- {
49
- title: 'Philosophy (continued)',
50
- lines: [
51
- '',
52
- ` ${s.primary('4. Engineering-First')}`,
53
- ` Follow best practices: testing, documentation, code review.`,
54
- ` Build software that's maintainable long-term.`,
55
- '',
56
- ` ${s.primary('5. Flexible')}`,
57
- ` Adapt the workflow to your needs.`,
58
- ` Use what works, skip what doesn't.`,
59
- '',
60
- ` The AI assistant guides you through each stage, helping you build`,
61
- ` projects with ${s.primary('structure')} and ${s.primary('discipline')} - not just generating random code.`,
62
- '',
63
- ` ${s.muted('The goal: sustainable development with AI assistance.')}`,
64
- '',
65
- ],
66
- },
67
- {
68
- title: 'The Workflow Stages',
69
- lines: [
70
- '',
71
- ` The development workflow has five main stages:`,
72
- '',
73
- ` ${s.primary('/new')} Set up your project structure`,
74
- ` Creates project in database with configuration`,
75
- '',
76
- ` ${s.primary('/design')} Gather requirements and create a PRD`,
77
- ` Documents stored in database for persistence`,
78
- '',
79
- ` ${s.primary('/backlog')} Manage your work items`,
80
- ` Track status, prioritize, break down tasks`,
81
- '',
82
- ` ${s.primary('/build')} Implement features from the backlog`,
83
- ` AI-assisted coding with your approval`,
84
- '',
85
- ` ${s.primary('/workflow')} Check progress and next steps`,
86
- ` See where you are and what's next`,
87
- '',
88
- ],
89
- },
90
- {
91
- title: 'Project Management',
92
- lines: [
93
- '',
94
- ` ${s.secondary('Track Your Progress')}`,
95
- '',
96
- ` ${s.primaryBold('/projects')}`,
97
- ` View all your projects in one place.`,
98
- ` Filter by status: Active, Paused, Completed, Archived.`,
99
- ` Switch between projects or open project directories.`,
100
- '',
101
- ` ${s.primaryBold('/workflow')}`,
102
- ` See your current project's workflow status.`,
103
- ` Shows which phases are complete and what's next.`,
104
- ` Quick actions to jump to the right command.`,
105
- '',
106
- ` ${s.primaryBold('/docs')}`,
107
- ` Browse documents created during design.`,
108
- ` View PRDs, architecture docs, and notes.`,
109
- '',
110
- ],
111
- },
112
- ],
113
- },
114
- // =========================================================================
115
- // Topic 2: Initialize
116
- // =========================================================================
117
- {
118
- id: 'init',
119
- name: 'Initialize',
120
- description: 'Setting up a new project',
121
- pages: [
122
- {
123
- title: '/new Command',
124
- lines: [
125
- '',
126
- ` ${s.primaryBold('/new')} creates your project foundation through an 8-step wizard.`,
127
- '',
128
- ` ${s.secondary('What it creates:')}`,
129
- '',
130
- ` ${s.success('+')} ${s.primary('Project in database')} - Tracked for easy management`,
131
- ` ${s.success('+')} ${s.primary('COMPILR.md')} - Context file for the AI assistant`,
132
- ` ${s.success('+')} ${s.primary('.compilr/config.json')} - Project configuration`,
133
- ` ${s.success('+')} Tech stack setup based on your choices`,
134
- '',
135
- ` ${s.secondary('The wizard asks about:')}`,
136
- ` - Project name and description`,
137
- ` - Project type (web, api, cli, fullstack)`,
138
- ` - Tech stack preferences`,
139
- ` - Workflow mode (flexible or guided)`,
140
- '',
141
- ],
142
- },
143
- {
144
- title: '/new - Database Tracking',
145
- lines: [
146
- '',
147
- ` ${s.secondary('Project Database')}`,
148
- ` All projects are tracked in a local SQLite database.`,
149
- ` This enables: multi-project switching, progress tracking,`,
150
- ` and persistent work item management.`,
151
- '',
152
- ` ${s.secondary('View Your Projects')}`,
153
- ` Use ${s.primary('/projects')} to see all your projects.`,
154
- ` Use ${s.primary('/workflow')} to see current project status.`,
155
- '',
156
- ` ${s.muted('Tip: Run /new in an empty directory to start fresh.')}`,
157
- '',
158
- ` After /new completes, the AI reads your COMPILR.md to understand`,
159
- ` your project context. You're ready for the next step: ${s.primary('/design')}`,
160
- '',
161
- ],
162
- },
163
- ],
164
- },
165
- // =========================================================================
166
- // Topic 3: Design
167
- // =========================================================================
168
- {
169
- id: 'design',
170
- name: 'Design Your Project',
171
- description: 'Requirements gathering',
172
- pages: [
173
- {
174
- title: '/design Command',
175
- lines: [
176
- '',
177
- ` ${s.primaryBold('/design')} is comprehensive requirements gathering through conversation.`,
178
- '',
179
- ` The AI guides you through three phases:`,
180
- '',
181
- ` ${s.primary('Phase 1: Vision & Goals')}`,
182
- ` - What problem are you solving?`,
183
- ` - Who is your target user?`,
184
- ` - What does success look like?`,
185
- '',
186
- ` ${s.primary('Phase 2: Features & Scope')}`,
187
- ` - What are the core features?`,
188
- ` - What's nice-to-have vs essential?`,
189
- ` - What's explicitly out of scope?`,
190
- '',
191
- ` ${s.primary('Phase 3: Technical Context')}`,
192
- ` - What constraints exist?`,
193
- ` - What integrations are needed?`,
194
- ` - What are your preferences?`,
195
- '',
196
- ],
197
- },
198
- {
199
- title: '/design - Output',
200
- lines: [
201
- '',
202
- ` ${s.secondary('What /design creates:')}`,
203
- '',
204
- ` ${s.success('+')} ${s.primary('Product Requirements Document (PRD)')}`,
205
- ` Stored in the database for persistence.`,
206
- ` Use ${s.primary('/docs')} to view it anytime.`,
207
- '',
208
- ` ${s.success('+')} ${s.primary('5-15 Backlog Items')}`,
209
- ` Stored in database with status tracking.`,
210
- ` Use ${s.primary('/backlog')} to manage them.`,
211
- '',
212
- ` ${s.success('+')} ${s.primary('Clear Acceptance Criteria')}`,
213
- ` Each backlog item has defined done criteria`,
214
- ` so you know when it's complete.`,
215
- '',
216
- ` ${s.muted('Best for: serious projects that need thorough planning upfront.')}`,
217
- '',
218
- ],
219
- },
220
- {
221
- title: '/sketch Command',
222
- lines: [
223
- '',
224
- ` ${s.primaryBold('/sketch')} is a quick alternative to /design.`,
225
- '',
226
- ` Instead of a long conversation, it asks 6 simple questions:`,
227
- '',
228
- ` ${s.muted('1.')} What are you building?`,
229
- ` ${s.muted('2.')} Who is it for?`,
230
- ` ${s.muted('3.')} What are the 3-5 main features?`,
231
- ` ${s.muted('4.')} What tech stack?`,
232
- ` ${s.muted('5.')} Any constraints or requirements?`,
233
- ` ${s.muted('6.')} What's the MVP scope?`,
234
- '',
235
- ` ${s.secondary('Output:')} 3-8 backlog items, ready to build.`,
236
- '',
237
- ` ${s.muted('Best for: small projects, prototypes, or when you just')}`,
238
- ` ${s.muted('want to get started quickly without detailed planning.')}`,
239
- '',
240
- ],
241
- },
242
- {
243
- title: '/refine Command',
244
- lines: [
245
- '',
246
- ` ${s.primaryBold('/refine')} improves existing backlog items.`,
247
- '',
248
- ` ${s.secondary('Use it to:')}`,
249
- '',
250
- ` ${s.muted('+')} Break down large items into smaller, actionable tasks`,
251
- ` ${s.muted('+')} Add acceptance criteria to vague items`,
252
- ` ${s.muted('+')} Clarify ambiguous requirements`,
253
- ` ${s.muted('+')} Add technical details discovered during work`,
254
- '',
255
- ` ${s.secondary('Usage:')}`,
256
- ` ${s.primary('/refine')} Let the AI suggest what to refine`,
257
- ` ${s.primary('/refine REQ-003')} Refine a specific item`,
258
- '',
259
- ` ${s.muted('Best for: after initial design when you discover items')}`,
260
- ` ${s.muted('are too big or need more detail before building.')}`,
261
- '',
262
- ],
263
- },
264
- {
265
- title: '/arch Command',
266
- lines: [
267
- '',
268
- ` ${s.primaryBold('/arch')} creates architecture documentation.`,
269
- '',
270
- ` ${s.secondary('Document types you can create:')}`,
271
- '',
272
- ` ${s.muted('1.')} ${s.primary('ADR')} - Architecture Decision Record`,
273
- ` Document key technical decisions and their rationale`,
274
- '',
275
- ` ${s.muted('2.')} ${s.primary('System Diagram')} - Visual system overview`,
276
- ` Components, connections, data flow`,
277
- '',
278
- ` ${s.muted('3.')} ${s.primary('Data Model')} - Database/entity design`,
279
- ` Tables, relationships, constraints`,
280
- '',
281
- ` ${s.muted('4.')} ${s.primary('API Design')} - Endpoint documentation`,
282
- ` Routes, methods, request/response formats`,
283
- '',
284
- ` ${s.muted('5.')} ${s.primary('Component Overview')} - Module documentation`,
285
- ` How pieces fit together`,
286
- '',
287
- ],
288
- },
289
- {
290
- title: '/prd Command',
291
- lines: [
292
- '',
293
- ` ${s.primaryBold('/prd')} lets you update your Product Requirements Document.`,
294
- '',
295
- ` After /design creates your PRD, use /prd to amend it as`,
296
- ` your understanding evolves.`,
297
- '',
298
- ` ${s.secondary('Usage:')}`,
299
- ` ${s.primary('/prd')} Interactive section selection`,
300
- ` ${s.primary('/prd vision')} Update vision section directly`,
301
- ` ${s.primary('/prd scope')} Update scope section directly`,
302
- ` ${s.primary('/prd features')} Update features section directly`,
303
- '',
304
- ` ${s.secondary('Sections you can update:')}`,
305
- ` - Vision and goals`,
306
- ` - Features and scope`,
307
- ` - Technical context`,
308
- ` - Non-functional requirements`,
309
- '',
310
- ],
311
- },
312
- ],
313
- },
314
- // =========================================================================
315
- // Topic 4: Backlog
316
- // =========================================================================
317
- {
318
- id: 'backlog',
319
- name: 'Manage Backlog',
320
- description: 'Track and prioritize work',
321
- pages: [
322
- {
323
- title: '/backlog Command',
324
- lines: [
325
- '',
326
- ` ${s.primaryBold('/backlog')} opens an interactive overlay to manage your work items.`,
327
- '',
328
- ` ${s.secondary('Navigation:')}`,
329
- ` ${s.primary('↑/↓')} Navigate through items`,
330
- ` ${s.primary('←/→')} Navigate pages (if many items)`,
331
- ` ${s.primary('Tab')} Switch filter (All, Feature, Bug, etc.)`,
332
- ` ${s.primary('/')} Search items`,
333
- ` ${s.primary('Enter')} View/edit item details`,
334
- '',
335
- ` ${s.secondary('Actions:')}`,
336
- ` ${s.primary('n')} Create new item`,
337
- ` ${s.primary('Space')} Toggle item status`,
338
- ` ${s.primary('p')} Change priority`,
339
- ` ${s.primary('Esc')} Close overlay`,
340
- '',
341
- ],
342
- },
343
- {
344
- title: '/backlog - Status Workflow',
345
- lines: [
346
- '',
347
- ` Items move through three statuses:`,
348
- '',
349
- ` ${s.warning('backlog')} Not started yet`,
350
- ` ${s.muted('↓')}`,
351
- ` ${s.primary('in-progress')} Currently being worked on`,
352
- ` ${s.muted('↓')}`,
353
- ` ${s.success('completed')} Done!`,
354
- '',
355
- ` ${s.secondary('Item Types:')}`,
356
- ` ${s.muted('Feature')} New functionality to build`,
357
- ` ${s.muted('Bug')} Something broken to fix`,
358
- ` ${s.muted('Tech-Debt')} Code improvements needed`,
359
- ` ${s.muted('Chore')} Maintenance tasks`,
360
- '',
361
- ` Items are stored in the ${s.primary('database')} and persist across sessions.`,
362
- '',
363
- ],
364
- },
365
- ],
366
- },
367
- // =========================================================================
368
- // Topic 5: Build
369
- // =========================================================================
370
- {
371
- id: 'build',
372
- name: 'Build',
373
- description: 'Scaffold and implement',
374
- pages: [
375
- {
376
- title: '/scaffold Command',
377
- lines: [
378
- '',
379
- ` ${s.primaryBold('/scaffold')} creates your project's foundation structure.`,
380
- '',
381
- ` ${s.secondary('What it creates:')}`,
382
- '',
383
- ` ${s.success('+')} Directory structure (src/, tests/, etc.)`,
384
- ` ${s.success('+')} Configuration files (package.json, tsconfig, etc.)`,
385
- ` ${s.success('+')} Dependencies installation`,
386
- ` ${s.success('+')} Basic boilerplate code`,
387
- ` ${s.success('+')} Development scripts`,
388
- '',
389
- ` The agent reads your ${s.primary('COMPILR.md')} to understand your tech stack`,
390
- ` and creates an appropriate project structure.`,
391
- '',
392
- ` ${s.muted('When to use: before implementing features, when starting')}`,
393
- ` ${s.muted('from an empty project directory.')}`,
394
- '',
395
- ],
396
- },
397
- {
398
- title: '/build Command',
399
- lines: [
400
- '',
401
- ` ${s.primaryBold('/build')} implements backlog items.`,
402
- '',
403
- ` ${s.secondary('Usage:')}`,
404
- ` ${s.primary('/build')} Pick the highest priority pending item`,
405
- ` ${s.primary('/build REQ-003')} Build a specific item by ID`,
406
- ` ${s.primary('/build scaffold')} Same as /scaffold`,
407
- '',
408
- ` ${s.secondary('The agent will:')}`,
409
- ` ${s.muted('1.')} Read and analyze the requirement`,
410
- ` ${s.muted('2.')} Plan the implementation approach`,
411
- ` ${s.muted('3.')} Write the code (with your approval)`,
412
- ` ${s.muted('4.')} Run tests if available`,
413
- ` ${s.muted('5.')} Update the backlog status to done`,
414
- '',
415
- ],
416
- },
417
- {
418
- title: '/build - Permissions',
419
- lines: [
420
- '',
421
- ` During /build, you'll see permission prompts for:`,
422
- '',
423
- ` ${s.warning('File changes')}`,
424
- ` The AI shows exactly what will be changed`,
425
- ` with a diff view before you approve.`,
426
- '',
427
- ` ${s.warning('Shell commands')}`,
428
- ` Commands like npm install or running tests`,
429
- ` require your explicit approval.`,
430
- '',
431
- ` ${s.secondary('Review carefully before approving!')}`,
432
- ` The AI shows exactly what will happen so you stay in control.`,
433
- '',
434
- ` ${s.muted('Tip: If /build detects an empty project, it will')}`,
435
- ` ${s.muted('suggest running /scaffold first.')}`,
436
- '',
437
- ],
438
- },
439
- ],
440
- },
441
- // =========================================================================
442
- // Topic 6: Configuration
443
- // =========================================================================
444
- {
445
- id: 'config',
446
- name: 'Configuration',
447
- description: 'Settings, keys, and themes',
448
- pages: [
449
- {
450
- title: '/config Command',
451
- lines: [
452
- '',
453
- ` ${s.primaryBold('/config')} opens the settings panel.`,
454
- '',
455
- ` ${s.secondary('Tabs:')}`,
456
- ` ${s.primary('Status')} Version, model, session info`,
457
- ` ${s.primary('Config')} Interactive settings`,
458
- ` ${s.primary('Usage')} Token usage statistics`,
459
- '',
460
- ` ${s.secondary('Settings you can change:')}`,
461
- ` ${s.muted('Model')} Switch AI model/provider`,
462
- ` ${s.muted('Theme')} Choose from 400+ terminal themes`,
463
- ` ${s.muted('Permissions')} Control approval prompts`,
464
- ` ${s.muted('Output')} Verbose or minimal mode`,
465
- ` ${s.muted('Auto-compact')} Automatic context management`,
466
- '',
467
- ],
468
- },
469
- {
470
- title: '/keys Command',
471
- lines: [
472
- '',
473
- ` ${s.primaryBold('/keys')} manages your API keys for LLM providers.`,
474
- '',
475
- ` ${s.secondary('Supported providers:')}`,
476
- ` ${s.primary('Claude')} Anthropic's models (best reasoning)`,
477
- ` ${s.primary('OpenAI')} GPT-4o and other models`,
478
- ` ${s.primary('Gemini')} Google AI models`,
479
- ` ${s.primary('Ollama')} Local models (no API key needed)`,
480
- '',
481
- ` Keys are encrypted and stored locally in:`,
482
- ` ${s.muted('~/.compilr-dev/credentials.enc')}`,
483
- '',
484
- ` ${s.muted('The CLI automatically opens /keys on first run')}`,
485
- ` ${s.muted('if no API key is configured.')}`,
486
- '',
487
- ],
488
- },
489
- ],
490
- },
491
- // =========================================================================
492
- // Topic 7: Working with the Agent
493
- // =========================================================================
494
- {
495
- id: 'agent',
496
- name: 'Working with the Agent',
497
- description: 'Chat, permissions, tips',
498
- pages: [
499
- {
500
- title: 'Chatting with the AI',
501
- lines: [
502
- '',
503
- ` Just type naturally. The AI understands context and can help with:`,
504
- '',
505
- ` ${s.muted('+')} Answering questions about your code`,
506
- ` ${s.muted('+')} Explaining how something works`,
507
- ` ${s.muted('+')} Writing new code or features`,
508
- ` ${s.muted('+')} Debugging issues`,
509
- ` ${s.muted('+')} Refactoring existing code`,
510
- ` ${s.muted('+')} Running commands and tests`,
511
- '',
512
- ` ${s.secondary('File References')}`,
513
- ` Type ${s.primary('@')} to autocomplete file paths.`,
514
- ` Example: ${s.muted('"Fix the bug in @src/utils.ts"')}`,
515
- '',
516
- ` The AI will read the file and understand the context.`,
517
- '',
518
- ],
519
- },
520
- {
521
- title: 'Permissions',
522
- lines: [
523
- '',
524
- ` The agent asks permission before:`,
525
- '',
526
- ` ${s.warning('+')} Modifying or creating files`,
527
- ` ${s.warning('+')} Running shell commands`,
528
- ` ${s.warning('+')} Making git commits`,
529
- '',
530
- ` ${s.secondary('For each action, you can:')}`,
531
- ` ${s.primary('Allow')} Approve this specific action`,
532
- ` ${s.primary('Allow Always')} Auto-approve this tool for the session`,
533
- ` ${s.primary('Deny')} Reject this action`,
534
- '',
535
- ` For file edits, you'll see a diff showing exactly what changes.`,
536
- ` Review carefully - you're always in control.`,
537
- '',
538
- ],
539
- },
540
- {
541
- title: 'Suggestions',
542
- lines: [
543
- '',
544
- ` After completing tasks, the AI suggests next actions.`,
545
- '',
546
- ` ${s.secondary('How it works:')}`,
547
- ` Suggestions appear as ${s.muted('ghost text')} in your input prompt.`,
548
- ` Press ${s.primary('Tab')} to accept the suggestion.`,
549
- ` Or just keep typing to ignore it.`,
550
- '',
551
- ` ${s.secondary('Common suggestions:')}`,
552
- ` ${s.muted('"run the tests"')}`,
553
- ` ${s.muted('"commit the changes"')}`,
554
- ` ${s.muted('"build the next item"')}`,
555
- '',
556
- ` Suggestions help maintain workflow momentum.`,
557
- '',
558
- ],
559
- },
560
- {
561
- title: 'Context Management',
562
- lines: [
563
- '',
564
- ` The AI has a limited context window. When it fills up:`,
565
- '',
566
- ` ${s.primaryBold('/compact')}`,
567
- ` Summarizes old messages to free up space.`,
568
- ` The AI creates a summary and removes old messages.`,
569
- '',
570
- ` ${s.primaryBold('/context')}`,
571
- ` Shows current context usage (tokens used / available).`,
572
- '',
573
- ` ${s.primaryBold('/tokens')}`,
574
- ` Shows token usage statistics for the session.`,
575
- '',
576
- ` ${s.muted('Tip: Auto-compact is enabled by default in settings.')}`,
577
- ` ${s.muted('The AI will automatically summarize when needed.')}`,
578
- '',
579
- ],
580
- },
581
- {
582
- title: 'Anchors - Persistent Context',
583
- lines: [
584
- '',
585
- ` ${s.secondary('Anchors')} are critical pieces of information that survive`,
586
- ` context compaction. They're always included at the top of context.`,
587
- '',
588
- ` ${s.primaryBold('/anchors')}`,
589
- ` View and manage your anchors.`,
590
- ` Add, edit, or remove persistent context.`,
591
- '',
592
- ` ${s.secondary('When to use anchors:')}`,
593
- ` ${s.muted('+')} Project context that must never be forgotten`,
594
- ` ${s.muted('+')} Key architectural decisions`,
595
- ` ${s.muted('+')} User preferences for code style`,
596
- ` ${s.muted('+')} Important constraints or requirements`,
597
- '',
598
- ` ${s.secondary('Scope:')}`,
599
- ` ${s.primary('Global')} - Persists across all projects`,
600
- ` ${s.primary('Project')} - Specific to current project`,
601
- '',
602
- ],
603
- },
604
- ],
605
- },
606
- // =========================================================================
607
- // Topic 8: Tips & Tricks
608
- // =========================================================================
609
- {
610
- id: 'tips',
611
- name: 'Tips & Tricks',
612
- description: 'Shortcuts and best practices',
613
- pages: [
614
- {
615
- title: 'Keyboard Shortcuts',
616
- lines: [
617
- '',
618
- ` ${s.secondary('Input:')}`,
619
- ` ${s.primary('Tab')} Accept suggestion or autocomplete`,
620
- ` ${s.primary('Esc')} Cancel current operation`,
621
- ` ${s.primary('Ctrl+C')} Stop the agent or exit`,
622
- '',
623
- ` ${s.secondary('In Overlays:')}`,
624
- ` ${s.primary('↑/↓')} Navigate options`,
625
- ` ${s.primary('←/→')} Navigate pages or tabs`,
626
- ` ${s.primary('Tab')} Switch tabs (where applicable)`,
627
- ` ${s.primary('Enter')} Confirm selection`,
628
- ` ${s.primary('Esc')} Go back or close`,
629
- '',
630
- ` ${s.secondary('Special:')}`,
631
- ` ${s.primary('@')} Start file autocomplete`,
632
- ` ${s.primary('/')} Start command autocomplete`,
633
- '',
634
- ],
635
- },
636
- {
637
- title: 'Useful Commands',
638
- lines: [
639
- '',
640
- ` ${s.secondary('Information:')}`,
641
- ` ${s.primary('/help')} Full command reference`,
642
- ` ${s.primary('/status')} Version, model, mode info`,
643
- ` ${s.primary('/tools')} List available tools`,
644
- '',
645
- ` ${s.secondary('Session:')}`,
646
- ` ${s.primary('/note')} Create session documentation`,
647
- ` ${s.primary('/export')} Export conversation`,
648
- ` ${s.primary('/clear')} Clear the screen`,
649
- '',
650
- ` ${s.secondary('Mode:')}`,
651
- ` ${s.primary('/plan')} Switch to planning mode`,
652
- ` (focus on design, not implementation)`,
653
- '',
654
- ],
655
- },
656
- {
657
- title: 'Best Practices',
658
- lines: [
659
- '',
660
- ` ${s.primary('1.')} Start with ${s.primaryBold('/new')}, then ${s.primaryBold('/design')} or ${s.primaryBold('/sketch')}`,
661
- ` Don't skip planning - it pays off later.`,
662
- '',
663
- ` ${s.primary('2.')} Keep backlog items small and focused`,
664
- ` Break large features into smaller tasks.`,
665
- '',
666
- ` ${s.primary('3.')} Review AI suggestions before approving`,
667
- ` You're in control - understand what's changing.`,
668
- '',
669
- ` ${s.primary('4.')} Use ${s.primaryBold('/arch')} to document key decisions`,
670
- ` Future you will thank present you.`,
671
- '',
672
- ` ${s.primary('5.')} Try ${s.primaryBold('Ollama')} for offline development`,
673
- ` No API key needed, runs locally.`,
674
- '',
675
- ],
676
- },
677
- ],
678
- },
679
- ];
680
- }
681
- // =============================================================================
682
- // Screens
26
+ // Viewing Screen (Multi-page Tutorial Content)
683
27
  // =============================================================================
684
28
  /**
685
- * Welcome screen - shows entry options (guided tour or topic list)
686
- */
687
- class WelcomeScreen extends BaseScreen {
688
- state;
689
- styles;
690
- topics;
691
- getWidth;
692
- selectedIndex = 0;
693
- constructor(state, styles, topics, getWidth) {
694
- super();
695
- this.state = state;
696
- this.styles = styles;
697
- this.topics = topics;
698
- this.getWidth = getWidth;
699
- }
700
- render() {
701
- const s = this.styles;
702
- const cols = this.getWidth();
703
- const border = renderBorder(cols, s);
704
- const lines = [];
705
- lines.push(border);
706
- lines.push(` ${s.primaryBold('compilr.dev Tutorial')}`);
707
- lines.push('');
708
- lines.push(` Learn the AI-powered development workflow that takes you`);
709
- lines.push(` from idea to implementation with structure and discipline.`);
710
- lines.push('');
711
- lines.push(` This tutorial covers: initialization, design, backlog`);
712
- lines.push(` management, building, configuration, and best practices.`);
713
- lines.push('');
714
- lines.push(` ${s.muted('How would you like to explore?')}`);
715
- lines.push('');
716
- const options = [
717
- { label: 'Start Guided Tour', desc: 'Step-by-step walkthrough (recommended)' },
718
- { label: 'Jump to Topic', desc: 'Go directly to a specific topic' },
719
- ];
720
- for (let i = 0; i < options.length; i++) {
721
- const opt = options[i];
722
- const selected = i === this.selectedIndex;
723
- const prefix = selected ? s.primary(' > ') : ' ';
724
- const label = selected ? s.primary(opt.label) : opt.label;
725
- const desc = s.muted(opt.desc);
726
- lines.push(`${prefix}${label.padEnd(22)} ${desc}`);
727
- }
728
- lines.push('');
729
- lines.push(border);
730
- lines.push(s.muted(' ↑↓/jk Navigate · Enter Select · q/Esc Exit'));
731
- return lines;
732
- }
733
- handleKey(data) {
734
- // Close keys
735
- if (isCtrlC(data) || isClose(data)) {
736
- return closeOverlay({ completed: false });
737
- }
738
- // Navigation
739
- if (isNavigateUp(data) && this.selectedIndex > 0) {
740
- this.selectedIndex--;
741
- return stay();
742
- }
743
- if (isNavigateDown(data) && this.selectedIndex < 1) {
744
- this.selectedIndex++;
745
- return stay();
746
- }
747
- // Enter - select option
748
- if (isEnter(data)) {
749
- if (this.selectedIndex === 0) {
750
- // Guided mode
751
- this.state.isGuidedMode = true;
752
- this.state.currentTopicIndex = 0;
753
- this.state.currentPageIndex = 0;
754
- return pushScreen(new ViewingScreen(this.state, this.styles, this.topics, this.getWidth));
755
- }
756
- else {
757
- // Topic list mode
758
- return pushScreen(new TopicListScreen(this.state, this.styles, this.topics, this.getWidth));
759
- }
760
- }
761
- return stay(false);
762
- }
763
- }
764
- /**
765
- * Topic list screen - shows all topics to choose from
766
- */
767
- class TopicListScreen extends BaseScreen {
768
- state;
769
- styles;
770
- topics;
771
- getWidth;
772
- constructor(state, styles, topics, getWidth) {
773
- super();
774
- this.state = state;
775
- this.styles = styles;
776
- this.topics = topics;
777
- this.getWidth = getWidth;
778
- }
779
- render() {
780
- const s = this.styles;
781
- const cols = this.getWidth();
782
- const border = renderBorder(cols, s);
783
- const lines = [];
784
- lines.push(border);
785
- lines.push(` ${s.primaryBold('Tutorial Topics')}`);
786
- lines.push('');
787
- for (let i = 0; i < this.topics.length; i++) {
788
- const topic = this.topics[i];
789
- const selected = i === this.state.topicListIndex;
790
- const prefix = selected ? s.primary(' > ') : ' ';
791
- const name = selected ? s.primary(topic.name) : topic.name;
792
- const desc = s.muted(topic.description);
793
- const pages = s.muted(`(${String(topic.pages.length)} ${topic.pages.length === 1 ? 'page' : 'pages'})`);
794
- lines.push(`${prefix}${name.padEnd(26)} ${desc.padEnd(30)} ${pages}`);
795
- }
796
- lines.push('');
797
- lines.push(border);
798
- lines.push(s.muted(' ↑↓/jk Navigate · Enter View · q/Esc Close'));
799
- return lines;
800
- }
801
- handleKey(data) {
802
- // Ctrl+C or q closes overlay
803
- if (isCtrlC(data)) {
804
- return closeOverlay({ completed: false });
805
- }
806
- // Escape goes back to welcome
807
- if (isEscape(data)) {
808
- return popScreen();
809
- }
810
- // Navigation
811
- if (isNavigateUp(data) && this.state.topicListIndex > 0) {
812
- this.state.topicListIndex--;
813
- return stay();
814
- }
815
- if (isNavigateDown(data) && this.state.topicListIndex < this.topics.length - 1) {
816
- this.state.topicListIndex++;
817
- return stay();
818
- }
819
- // Enter - view topic
820
- if (isEnter(data)) {
821
- this.state.isGuidedMode = false;
822
- this.state.currentTopicIndex = this.state.topicListIndex;
823
- this.state.currentPageIndex = 0;
824
- return pushScreen(new ViewingScreen(this.state, this.styles, this.topics, this.getWidth));
825
- }
826
- return stay(false);
827
- }
828
- }
829
- /**
830
- * Viewing screen - shows a page from a topic with navigation
29
+ * Shows a page from a tutorial with navigation.
30
+ * Allows navigating through multiple pages with ←/→.
831
31
  */
832
32
  class ViewingScreen extends BaseScreen {
833
- state;
33
+ item;
834
34
  styles;
835
- topics;
836
35
  getWidth;
837
- constructor(state, styles, topics, getWidth) {
36
+ currentPageIndex = 0;
37
+ constructor(item, styles, getWidth) {
838
38
  super();
839
- this.state = state;
39
+ this.item = item;
840
40
  this.styles = styles;
841
- this.topics = topics;
842
41
  this.getWidth = getWidth;
843
42
  }
43
+ getMinHeight() {
44
+ return 24;
45
+ }
844
46
  render() {
845
47
  const s = this.styles;
846
48
  const cols = this.getWidth();
847
49
  const border = renderBorder(cols, s);
848
50
  const lines = [];
849
- const topic = this.topics[this.state.currentTopicIndex];
850
- const page = topic.pages[this.state.currentPageIndex];
851
- const totalPages = topic.pages.length;
852
- // Calculate overall progress for guided mode
853
- let progressText = `[${String(this.state.currentPageIndex + 1)}/${String(totalPages)}]`;
854
- if (this.state.isGuidedMode) {
855
- let totalPagesAll = 0;
856
- let currentPageAll = 0;
857
- for (let i = 0; i < this.topics.length; i++) {
858
- if (i < this.state.currentTopicIndex) {
859
- currentPageAll += this.topics[i].pages.length;
860
- }
861
- else if (i === this.state.currentTopicIndex) {
862
- currentPageAll += this.state.currentPageIndex + 1;
863
- }
864
- totalPagesAll += this.topics[i].pages.length;
865
- }
866
- progressText = `[${String(currentPageAll)}/${String(totalPagesAll)}]`;
867
- }
868
- // Header - calculate padding to right-align progress indicator
51
+ const page = this.item.pages[this.currentPageIndex];
52
+ const totalPages = this.item.pages.length;
53
+ // Progress text
54
+ const progressText = `[${String(this.currentPageIndex + 1)}/${String(totalPages)}]`;
55
+ // Header with progress
869
56
  const titleStyled = s.primaryBold(page.title);
870
57
  const progressStyled = s.muted(progressText);
871
- const titleLen = stripAnsi(titleStyled).length + 1; // +1 for leading space
58
+ const titleLen = stripAnsi(titleStyled).length + 1;
872
59
  const progressLen = stripAnsi(progressStyled).length;
873
- const padding = Math.max(1, cols - titleLen - progressLen - 2); // -2 for margins
60
+ const padding = Math.max(1, cols - titleLen - progressLen - 2);
874
61
  lines.push(border);
875
62
  lines.push(` ${titleStyled}${' '.repeat(padding)}${progressStyled}`);
876
63
  lines.push('');
@@ -884,152 +71,142 @@ class ViewingScreen extends BaseScreen {
884
71
  }
885
72
  // Navigation footer
886
73
  lines.push(border);
887
- if (this.state.isGuidedMode) {
888
- lines.push(s.muted(' ←/→/hl Navigate · Esc Exit Tour'));
889
- }
890
- else {
891
- lines.push(s.muted(' ←/→/hl Navigate · Esc Back to Topics'));
74
+ // Show appropriate hints based on position
75
+ const hints = [];
76
+ if (this.currentPageIndex > 0 || totalPages > 1) {
77
+ hints.push('←/→ navigate');
892
78
  }
79
+ hints.push('q/Esc back');
80
+ lines.push(s.muted(` ${hints.join(' · ')}`));
893
81
  return lines;
894
82
  }
895
83
  handleKey(data) {
896
- // Ctrl+C closes overlay
84
+ // Ctrl+C closes overlay completely
897
85
  if (isCtrlC(data)) {
898
86
  return closeOverlay({ completed: false });
899
87
  }
900
- const topic = this.topics[this.state.currentTopicIndex];
901
- const totalPages = topic.pages.length;
902
- // Escape goes back
903
- if (isEscape(data)) {
88
+ const totalPages = this.item.pages.length;
89
+ // Back to topic list
90
+ if (isEscape(data) || isQuit(data)) {
904
91
  return popScreen();
905
92
  }
906
- // Previous page (left arrow, h, or backspace)
93
+ // Previous page
907
94
  if (isLeftArrow(data) || isVimLeft(data) || isBackspace(data)) {
908
- if (this.state.currentPageIndex > 0) {
909
- this.state.currentPageIndex--;
910
- return stay();
911
- }
912
- else if (this.state.isGuidedMode && this.state.currentTopicIndex > 0) {
913
- this.state.currentTopicIndex--;
914
- this.state.currentPageIndex = this.topics[this.state.currentTopicIndex].pages.length - 1;
95
+ if (this.currentPageIndex > 0) {
96
+ this.currentPageIndex--;
915
97
  return stay();
916
98
  }
917
99
  return stay(false);
918
100
  }
919
- // Next page (right arrow, l, or enter)
101
+ // Next page
920
102
  if (isRightArrow(data) || isVimRight(data) || isEnter(data)) {
921
- if (this.state.currentPageIndex < totalPages - 1) {
922
- this.state.currentPageIndex++;
103
+ if (this.currentPageIndex < totalPages - 1) {
104
+ this.currentPageIndex++;
923
105
  return stay();
924
106
  }
925
- else if (this.state.isGuidedMode) {
926
- if (this.state.currentTopicIndex < this.topics.length - 1) {
927
- this.state.currentTopicIndex++;
928
- this.state.currentPageIndex = 0;
929
- return stay();
930
- }
931
- else {
932
- // End of guided tour - show complete screen
933
- return pushScreen(new CompleteScreen(this.styles, this.getWidth));
934
- }
107
+ // At last page, Enter goes back to list
108
+ if (isEnter(data)) {
109
+ return popScreen();
935
110
  }
936
111
  return stay(false);
937
112
  }
938
113
  return stay(false);
939
114
  }
940
115
  }
941
- /**
942
- * Complete screen - shows completion message
943
- */
944
- class CompleteScreen extends BaseScreen {
945
- styles;
946
- getWidth;
947
- constructor(styles, getWidth) {
948
- super();
949
- this.styles = styles;
950
- this.getWidth = getWidth;
951
- }
952
- render() {
953
- const s = this.styles;
954
- const cols = this.getWidth();
955
- const border = renderBorder(cols, s);
956
- const lines = [];
957
- lines.push(border);
958
- lines.push(` ${s.success('Tutorial Complete!')}`);
959
- lines.push('');
960
- lines.push(` You've learned the compilr.dev workflow!`);
961
- lines.push('');
962
- lines.push(` ${s.secondary('Key commands to remember:')}`);
963
- lines.push('');
964
- lines.push(` ${s.primary('/new')} Start a new project`);
965
- lines.push(` ${s.primary('/design')} Plan your requirements`);
966
- lines.push(` ${s.primary('/backlog')} Manage your work items`);
967
- lines.push(` ${s.primary('/build')} Implement features`);
968
- lines.push(` ${s.primary('/help')} See all commands`);
969
- lines.push('');
970
- lines.push(` ${s.secondary('Ready to start?')}`);
971
- lines.push(` Try ${s.primary('/new')} in a new directory!`);
972
- lines.push('');
973
- lines.push(border);
974
- lines.push(s.muted(' Press any key to exit...'));
975
- return lines;
976
- }
977
- handleKey(_data) {
978
- // Any key closes the overlay with completed = true
979
- return closeOverlay({ completed: true });
980
- }
981
- }
982
116
  // =============================================================================
983
117
  // Tutorial Overlay V2 Class
984
118
  // =============================================================================
985
119
  /**
986
- * Tutorial overlay using the new Overlay interface.
987
- * Multi-screen overlay for interactive tutorial.
120
+ * Tutorial overlay with tabbed topics and multi-page walkthroughs.
121
+ * Extends TabbedListOverlayV2 for consistent look with other overlays.
988
122
  */
989
- export class TutorialOverlayV2 extends BaseOverlayV2 {
123
+ export class TutorialOverlayV2 extends TabbedListOverlayV2 {
990
124
  type = 'inline';
991
125
  id = 'tutorial-overlay-v2';
992
- screenStack;
993
- topics = [];
994
126
  constructor() {
995
- const initialState = {
996
- topicListIndex: 0,
997
- currentTopicIndex: 0,
998
- currentPageIndex: 0,
999
- isGuidedMode: false,
1000
- };
1001
- super(initialState);
1002
- this.minHeight = 24;
1003
- this.screenStack = new ScreenStack();
1004
- // Topics will be built on first render when we have styles
127
+ // We need styles to build content, but we don't have them yet.
128
+ // Build with a placeholder and rebuild on first render.
129
+ // For now, use empty items - they'll be populated on first render.
130
+ const tabs = [
131
+ { id: 'basics', label: 'Basics' },
132
+ { id: 'projects', label: 'Projects' },
133
+ { id: 'plan-build', label: 'Plan & Build' },
134
+ { id: 'teams', label: 'Teams' },
135
+ { id: 'config', label: 'Config' },
136
+ ];
137
+ super({
138
+ title: 'Tutorial',
139
+ tabs,
140
+ items: [], // Will be populated on first render
141
+ pageSize: PAGE_SIZE,
142
+ filterByTab: (item, tabId) => {
143
+ if (tabId === 'all')
144
+ return true;
145
+ return item.tabId === tabId;
146
+ },
147
+ getSearchText: (item) => `${item.title} ${item.description}`,
148
+ renderItem: (item, isSelected, styles) => {
149
+ const prefix = isSelected ? styles.primary(' ► ') : ' ';
150
+ // Pad raw text BEFORE applying styles to ensure consistent column widths
151
+ const titlePadded = item.title.padEnd(28);
152
+ const descPadded = item.description.padEnd(36);
153
+ const pagesText = `(${String(item.pages.length)} ${item.pages.length === 1 ? 'page' : 'pages'})`;
154
+ const pagesPadded = pagesText.padStart(10);
155
+ // Apply styles after padding
156
+ const title = isSelected ? styles.primary(titlePadded) : titlePadded;
157
+ const desc = styles.muted(descPadded);
158
+ const pages = styles.muted(pagesPadded);
159
+ return `${prefix}${title} ${desc} ${pages}`;
160
+ },
161
+ footerHints: (searchMode) => {
162
+ if (searchMode) {
163
+ return 'Type to filter · ↑↓/jk Navigate · Enter View · Esc Exit search';
164
+ }
165
+ return 'Tab Filter · ↑↓/jk · ←→/hl Pages · / Search · Enter View · q/Esc Close';
166
+ },
167
+ emptyMessage: 'No tutorials available.',
168
+ noResultsMessage: 'No tutorials match the search.',
169
+ showCount: false,
170
+ });
171
+ // Override minHeight for tutorial content
172
+ this.minHeight = 22;
1005
173
  }
1006
- renderContent(context) {
1007
- // Build topics on first render (needs styles)
1008
- if (this.topics.length === 0) {
1009
- this.topics = buildTopics(context.styles);
1010
- this.screenStack.push(new WelcomeScreen(this.state, context.styles, this.topics, () => this.termWidth));
174
+ /**
175
+ * Build items on first render when styles are available.
176
+ * This is a workaround since we need styles to build styled content.
177
+ */
178
+ buildItemsIfNeeded() {
179
+ if (this.state.items.length > 0)
180
+ return;
181
+ const styles = this.getStyles();
182
+ const tabs = buildTutorialContent(styles);
183
+ // Flatten tutorials into a single array with tabId
184
+ const items = [];
185
+ for (const tab of tabs) {
186
+ for (const item of tab.items) {
187
+ items.push({
188
+ ...item,
189
+ tabId: tab.id,
190
+ });
191
+ }
1011
192
  }
1012
- const screen = this.screenStack.current();
1013
- return screen?.render() ?? [];
193
+ this.state.items = items;
194
+ this.state.filteredItems = items.filter((item) => this.listConfig.filterByTab(item, this.listConfig.tabs[0]?.id ?? 'basics'));
1014
195
  }
1015
- handleKey(key) {
1016
- const data = key.raw;
1017
- const screen = this.screenStack.current();
1018
- if (!screen) {
1019
- return this.close({ completed: false });
1020
- }
1021
- const result = screen.handleKey(data);
1022
- switch (result.action) {
1023
- case 'stay':
1024
- return result.render ? this.rerender() : this.noAction();
1025
- case 'push':
1026
- this.screenStack.push(result.screen);
1027
- return this.rerender();
1028
- case 'pop':
1029
- this.screenStack.pop();
1030
- return this.rerender();
1031
- case 'close':
1032
- return this.close(result.result);
1033
- }
196
+ /**
197
+ * Override render to build items on first call.
198
+ */
199
+ render(context) {
200
+ // Cache styles first so buildItemsIfNeeded can use them
201
+ this.styles = context.styles;
202
+ this.termWidth = context.width;
203
+ // Build items if not yet built
204
+ this.buildItemsIfNeeded();
205
+ // Render using parent
206
+ return super.render(context);
207
+ }
208
+ createDetailScreen(item) {
209
+ const styles = this.getStyles();
210
+ return new ViewingScreen(item, styles, () => this.termWidth);
1034
211
  }
1035
212
  }