@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
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Work Summary Anchor
3
+ *
4
+ * Manages an auto-generated anchor that summarizes work done in the current session.
5
+ * Updated automatically after each episode batch is flushed.
6
+ */
7
+ const ANCHOR_TAG = 'episode-work-summary';
8
+ /**
9
+ * Build the anchor content string from the store's work summary.
10
+ * Returns null when there are no episodes to summarize.
11
+ */
12
+ export function buildWorkSummaryContent(summary) {
13
+ if (summary.episodeCount === 0)
14
+ return null;
15
+ const lines = ['[Session Work Summary]'];
16
+ lines.push(`Episodes: ${String(summary.episodeCount)}, Effort: ${summary.totalEffort}, Time: ${formatMs(summary.timeSpentMs)}`);
17
+ if (summary.agentBreakdown.length > 0) {
18
+ const agents = summary.agentBreakdown
19
+ .map(a => `${a.agentId}(${String(a.episodeCount)})`)
20
+ .join(', ');
21
+ lines.push(`Agents: ${agents}`);
22
+ }
23
+ if (summary.topFiles.length > 0) {
24
+ const files = summary.topFiles.slice(0, 5)
25
+ .map(f => f.path.split('/').pop() ?? f.path)
26
+ .join(', ');
27
+ lines.push(`Top files: ${files}`);
28
+ }
29
+ if (summary.uncommittedWork.length > 0) {
30
+ lines.push(`Uncommitted: ${String(summary.uncommittedWork.length)} episode(s)`);
31
+ }
32
+ return lines.join('\n');
33
+ }
34
+ /**
35
+ * Update the work summary anchor for a project.
36
+ * Removes existing anchor (if any) and adds updated one.
37
+ */
38
+ export function updateWorkSummaryAnchor(config) {
39
+ const { store, projectId, getAnchorManager: getManager } = config;
40
+ const manager = getManager(projectId);
41
+ const summary = store.getWorkSummary();
42
+ const content = buildWorkSummaryContent(summary);
43
+ // Remove existing work summary anchor
44
+ const existing = manager.getAll().find((a) => a.tags?.includes(ANCHOR_TAG));
45
+ if (existing)
46
+ manager.remove(existing.id);
47
+ // Add new anchor if there's content
48
+ if (content) {
49
+ manager.add({
50
+ content,
51
+ priority: 'info',
52
+ scope: 'persistent',
53
+ tags: [ANCHOR_TAG],
54
+ projectId,
55
+ });
56
+ }
57
+ }
58
+ /**
59
+ * Format milliseconds to a human-readable string (e.g., "2h 15m", "45s").
60
+ */
61
+ function formatMs(ms) {
62
+ if (ms < 1000)
63
+ return `${String(ms)}ms`;
64
+ const totalSeconds = Math.floor(ms / 1000);
65
+ if (totalSeconds < 60)
66
+ return `${String(totalSeconds)}s`;
67
+ const minutes = Math.floor(totalSeconds / 60);
68
+ if (minutes < 60)
69
+ return `${String(minutes)}m`;
70
+ const hours = Math.floor(minutes / 60);
71
+ const remainingMinutes = minutes % 60;
72
+ return remainingMinutes > 0 ? `${String(hours)}h ${String(remainingMinutes)}m` : `${String(hours)}h`;
73
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Coin System
3
+ *
4
+ * Manages arcade coins for the games easter egg.
5
+ * Coins are earned through productive CLI usage and spent to play games.
6
+ */
7
+ export interface CoinData {
8
+ coins: number;
9
+ totalEarned: number;
10
+ totalSpent: number;
11
+ lastDailyBonus: string | null;
12
+ }
13
+ export declare const COIN_COST_START_GAME = 1;
14
+ export declare const COIN_COST_CONTINUE = 2;
15
+ export declare const COIN_REWARD_WORK_ITEM = 1;
16
+ export declare const COIN_REWARD_FIRST_PROJECT = 3;
17
+ export declare const COIN_REWARD_DAILY_BONUS = 1;
18
+ export declare const COIN_REWARD_HIGH_SCORE = 2;
19
+ /**
20
+ * Get current coin data
21
+ */
22
+ export declare function getCoinData(): CoinData;
23
+ /**
24
+ * Get current coin balance
25
+ */
26
+ export declare function getCoins(): number;
27
+ /**
28
+ * Check if player has enough coins
29
+ */
30
+ export declare function hasCoins(amount: number): boolean;
31
+ /**
32
+ * Spend coins (returns true if successful)
33
+ */
34
+ export declare function spendCoins(amount: number): boolean;
35
+ /**
36
+ * Earn coins
37
+ */
38
+ export declare function earnCoins(amount: number, reason?: string): void;
39
+ /**
40
+ * Check and award daily bonus if eligible
41
+ */
42
+ export declare function checkDailyBonus(): boolean;
43
+ /**
44
+ * Award coins for completing a work item
45
+ */
46
+ export declare function awardWorkItemCompletion(): void;
47
+ /**
48
+ * Award coins for creating first project
49
+ */
50
+ export declare function awardFirstProject(): void;
51
+ /**
52
+ * Award coins for achieving a high score
53
+ */
54
+ export declare function awardHighScore(): void;
55
+ /**
56
+ * Clear cache (for testing)
57
+ */
58
+ export declare function clearCoinCache(): void;
59
+ /**
60
+ * Format coins for display (e.g., "●●●○○" for 3/5)
61
+ */
62
+ export declare function formatCoinsDisplay(current: number, max?: number): string;
63
+ /**
64
+ * Get a short coin display string
65
+ */
66
+ export declare function getCoinsDisplayShort(): string;
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Coin System
3
+ *
4
+ * Manages arcade coins for the games easter egg.
5
+ * Coins are earned through productive CLI usage and spent to play games.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import * as os from 'os';
10
+ // =============================================================================
11
+ // Constants
12
+ // =============================================================================
13
+ const CONFIG_DIR = path.join(os.homedir(), '.compilr-dev');
14
+ const GAMES_FILE = path.join(CONFIG_DIR, 'games.json');
15
+ const DEFAULT_COIN_DATA = {
16
+ coins: 3, // Start with 3 free coins!
17
+ totalEarned: 3,
18
+ totalSpent: 0,
19
+ lastDailyBonus: null,
20
+ };
21
+ // Coin costs
22
+ export const COIN_COST_START_GAME = 1;
23
+ export const COIN_COST_CONTINUE = 2;
24
+ // Coin rewards
25
+ export const COIN_REWARD_WORK_ITEM = 1;
26
+ export const COIN_REWARD_FIRST_PROJECT = 3;
27
+ export const COIN_REWARD_DAILY_BONUS = 1;
28
+ export const COIN_REWARD_HIGH_SCORE = 2;
29
+ // =============================================================================
30
+ // In-memory cache
31
+ // =============================================================================
32
+ let coinCache = null;
33
+ // =============================================================================
34
+ // Persistence
35
+ // =============================================================================
36
+ function loadFromDisk() {
37
+ try {
38
+ if (fs.existsSync(GAMES_FILE)) {
39
+ const data = fs.readFileSync(GAMES_FILE, 'utf-8');
40
+ const parsed = JSON.parse(data);
41
+ return { ...DEFAULT_COIN_DATA, ...parsed };
42
+ }
43
+ }
44
+ catch {
45
+ // Ignore errors
46
+ }
47
+ return { ...DEFAULT_COIN_DATA };
48
+ }
49
+ function saveToDisk(data) {
50
+ try {
51
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
52
+ fs.writeFileSync(GAMES_FILE, JSON.stringify(data, null, 2), 'utf-8');
53
+ }
54
+ catch (error) {
55
+ console.error('Failed to save coin data:', error);
56
+ }
57
+ }
58
+ // =============================================================================
59
+ // Public API
60
+ // =============================================================================
61
+ /**
62
+ * Get current coin data
63
+ */
64
+ export function getCoinData() {
65
+ if (coinCache) {
66
+ return coinCache;
67
+ }
68
+ coinCache = loadFromDisk();
69
+ return coinCache;
70
+ }
71
+ /**
72
+ * Get current coin balance
73
+ */
74
+ export function getCoins() {
75
+ return getCoinData().coins;
76
+ }
77
+ /**
78
+ * Check if player has enough coins
79
+ */
80
+ export function hasCoins(amount) {
81
+ return getCoins() >= amount;
82
+ }
83
+ /**
84
+ * Spend coins (returns true if successful)
85
+ */
86
+ export function spendCoins(amount) {
87
+ const data = getCoinData();
88
+ if (data.coins < amount) {
89
+ return false;
90
+ }
91
+ data.coins -= amount;
92
+ data.totalSpent += amount;
93
+ coinCache = data;
94
+ saveToDisk(data);
95
+ return true;
96
+ }
97
+ /**
98
+ * Earn coins
99
+ */
100
+ export function earnCoins(amount, reason) {
101
+ const data = getCoinData();
102
+ data.coins += amount;
103
+ data.totalEarned += amount;
104
+ coinCache = data;
105
+ saveToDisk(data);
106
+ // Log for debugging (could be made optional)
107
+ if (reason) {
108
+ // Silent for now - could add notification later
109
+ }
110
+ }
111
+ /**
112
+ * Check and award daily bonus if eligible
113
+ */
114
+ export function checkDailyBonus() {
115
+ const data = getCoinData();
116
+ const today = new Date().toISOString().split('T')[0];
117
+ if (data.lastDailyBonus !== today) {
118
+ data.lastDailyBonus = today;
119
+ data.coins += COIN_REWARD_DAILY_BONUS;
120
+ data.totalEarned += COIN_REWARD_DAILY_BONUS;
121
+ coinCache = data;
122
+ saveToDisk(data);
123
+ return true;
124
+ }
125
+ return false;
126
+ }
127
+ /**
128
+ * Award coins for completing a work item
129
+ */
130
+ export function awardWorkItemCompletion() {
131
+ earnCoins(COIN_REWARD_WORK_ITEM, 'work_item_completed');
132
+ }
133
+ /**
134
+ * Award coins for creating first project
135
+ */
136
+ export function awardFirstProject() {
137
+ earnCoins(COIN_REWARD_FIRST_PROJECT, 'first_project');
138
+ }
139
+ /**
140
+ * Award coins for achieving a high score
141
+ */
142
+ export function awardHighScore() {
143
+ earnCoins(COIN_REWARD_HIGH_SCORE, 'high_score');
144
+ }
145
+ /**
146
+ * Clear cache (for testing)
147
+ */
148
+ export function clearCoinCache() {
149
+ coinCache = null;
150
+ }
151
+ /**
152
+ * Format coins for display (e.g., "●●●○○" for 3/5)
153
+ */
154
+ export function formatCoinsDisplay(current, max = 10) {
155
+ const filled = Math.min(current, max);
156
+ const empty = Math.max(0, max - filled);
157
+ return '●'.repeat(filled) + '○'.repeat(empty);
158
+ }
159
+ /**
160
+ * Get a short coin display string
161
+ */
162
+ export function getCoinsDisplayShort() {
163
+ const coins = getCoins();
164
+ return `${String(coins)} coin${coins !== 1 ? 's' : ''}`;
165
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Base class for terminal games
3
+ *
4
+ * Handles alternate screen, raw input, game loop, and clean exit.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ export interface GameConfig {
8
+ title: string;
9
+ minWidth: number;
10
+ minHeight: number;
11
+ targetFps: number;
12
+ }
13
+ export declare abstract class GameBase extends EventEmitter {
14
+ protected config: GameConfig;
15
+ protected running: boolean;
16
+ protected paused: boolean;
17
+ protected gameLoopInterval: ReturnType<typeof setInterval> | null;
18
+ protected lastFrameTime: number;
19
+ protected stdin: NodeJS.ReadStream;
20
+ protected stdout: NodeJS.WriteStream;
21
+ constructor(config: GameConfig);
22
+ /**
23
+ * Check if terminal is large enough
24
+ */
25
+ protected checkTerminalSize(): {
26
+ ok: boolean;
27
+ message?: string;
28
+ };
29
+ /**
30
+ * Enter alternate screen buffer
31
+ */
32
+ protected enterAlternateScreen(): void;
33
+ /**
34
+ * Exit alternate screen buffer
35
+ */
36
+ protected exitAlternateScreen(): void;
37
+ /**
38
+ * Set up raw input mode
39
+ */
40
+ protected setupInput(): void;
41
+ /**
42
+ * Restore normal input mode
43
+ */
44
+ protected restoreInput(): void;
45
+ /**
46
+ * Handle raw input data
47
+ */
48
+ private handleInput;
49
+ /**
50
+ * Start the game loop
51
+ */
52
+ protected startGameLoop(): void;
53
+ /**
54
+ * Stop the game loop
55
+ */
56
+ protected stopGameLoop(): void;
57
+ /**
58
+ * Move cursor to position
59
+ */
60
+ protected moveCursor(x: number, y: number): void;
61
+ /**
62
+ * Write text at position
63
+ */
64
+ protected writeAt(x: number, y: number, text: string): void;
65
+ /**
66
+ * Clear screen
67
+ */
68
+ protected clearScreen(): void;
69
+ /**
70
+ * Start the game
71
+ */
72
+ start(): Promise<void>;
73
+ /**
74
+ * Quit the game
75
+ */
76
+ quit(): void;
77
+ protected abstract onStart(): void;
78
+ protected abstract onQuit(): void;
79
+ protected abstract onPause(): void;
80
+ protected abstract onResume(): void;
81
+ protected abstract onKeyPress(key: string, raw: Buffer): void;
82
+ protected abstract update(delta: number): void;
83
+ protected abstract render(): void;
84
+ }
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Base class for terminal games
3
+ *
4
+ * Handles alternate screen, raw input, game loop, and clean exit.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ export class GameBase extends EventEmitter {
8
+ config;
9
+ running = false;
10
+ paused = false;
11
+ gameLoopInterval = null;
12
+ lastFrameTime = 0;
13
+ stdin;
14
+ stdout;
15
+ constructor(config) {
16
+ super();
17
+ this.config = config;
18
+ this.stdin = process.stdin;
19
+ this.stdout = process.stdout;
20
+ }
21
+ /**
22
+ * Check if terminal is large enough
23
+ */
24
+ checkTerminalSize() {
25
+ const cols = this.stdout.columns || 80;
26
+ const rows = this.stdout.rows || 24;
27
+ if (cols < this.config.minWidth || rows < this.config.minHeight) {
28
+ return {
29
+ ok: false,
30
+ message: `Terminal too small. Need ${String(this.config.minWidth)}x${String(this.config.minHeight)}, got ${String(cols)}x${String(rows)}`,
31
+ };
32
+ }
33
+ return { ok: true };
34
+ }
35
+ /**
36
+ * Enter alternate screen buffer
37
+ */
38
+ enterAlternateScreen() {
39
+ // Save cursor position and switch to alternate buffer
40
+ this.stdout.write('\x1b[?1049h');
41
+ // Hide cursor
42
+ this.stdout.write('\x1b[?25l');
43
+ // Clear screen
44
+ this.stdout.write('\x1b[2J');
45
+ // Move to top-left
46
+ this.stdout.write('\x1b[H');
47
+ }
48
+ /**
49
+ * Exit alternate screen buffer
50
+ */
51
+ exitAlternateScreen() {
52
+ // Clear the alternate screen first to prevent flash
53
+ this.stdout.write('\x1b[2J\x1b[H');
54
+ // Show cursor
55
+ this.stdout.write('\x1b[?25h');
56
+ // Restore main buffer
57
+ this.stdout.write('\x1b[?1049l');
58
+ }
59
+ /**
60
+ * Set up raw input mode
61
+ */
62
+ setupInput() {
63
+ if (this.stdin.isTTY) {
64
+ this.stdin.setRawMode(true);
65
+ }
66
+ this.stdin.resume();
67
+ this.stdin.on('data', this.handleInput.bind(this));
68
+ }
69
+ /**
70
+ * Restore normal input mode
71
+ */
72
+ restoreInput() {
73
+ this.stdin.removeAllListeners('data');
74
+ // Pause to prevent any buffered input from leaking
75
+ this.stdin.pause();
76
+ if (this.stdin.isTTY) {
77
+ this.stdin.setRawMode(false);
78
+ }
79
+ }
80
+ /**
81
+ * Handle raw input data
82
+ */
83
+ handleInput(data) {
84
+ const key = data.toString();
85
+ // Check for quit keys first
86
+ // q or Ctrl+C always quit
87
+ if (key === 'q' || key === '\x03') {
88
+ this.quit();
89
+ return;
90
+ }
91
+ // Standalone Escape quits (but not escape sequences like arrow keys \x1b[A)
92
+ // Escape is a single byte (0x1b), arrow keys are 3+ bytes
93
+ if (data.length === 1 && data[0] === 0x1b) {
94
+ this.quit();
95
+ return;
96
+ }
97
+ // Pause/unpause
98
+ if (key === 'p') {
99
+ this.paused = !this.paused;
100
+ if (this.paused) {
101
+ this.onPause();
102
+ }
103
+ else {
104
+ this.onResume();
105
+ }
106
+ return;
107
+ }
108
+ // Pass to game-specific handler
109
+ if (!this.paused) {
110
+ this.onKeyPress(key, data);
111
+ }
112
+ }
113
+ /**
114
+ * Start the game loop
115
+ */
116
+ startGameLoop() {
117
+ const frameInterval = 1000 / this.config.targetFps;
118
+ this.lastFrameTime = Date.now();
119
+ this.gameLoopInterval = setInterval(() => {
120
+ if (!this.paused && this.running) {
121
+ const now = Date.now();
122
+ const delta = now - this.lastFrameTime;
123
+ this.lastFrameTime = now;
124
+ this.update(delta);
125
+ this.render();
126
+ }
127
+ }, frameInterval);
128
+ }
129
+ /**
130
+ * Stop the game loop
131
+ */
132
+ stopGameLoop() {
133
+ if (this.gameLoopInterval) {
134
+ clearInterval(this.gameLoopInterval);
135
+ this.gameLoopInterval = null;
136
+ }
137
+ }
138
+ /**
139
+ * Move cursor to position
140
+ */
141
+ moveCursor(x, y) {
142
+ this.stdout.write(`\x1b[${String(y)};${String(x)}H`);
143
+ }
144
+ /**
145
+ * Write text at position
146
+ */
147
+ writeAt(x, y, text) {
148
+ this.moveCursor(x, y);
149
+ this.stdout.write(text);
150
+ }
151
+ /**
152
+ * Clear screen
153
+ */
154
+ clearScreen() {
155
+ this.stdout.write('\x1b[2J\x1b[H');
156
+ }
157
+ /**
158
+ * Start the game
159
+ */
160
+ async start() {
161
+ // Check terminal size
162
+ const sizeCheck = this.checkTerminalSize();
163
+ if (!sizeCheck.ok) {
164
+ console.log(sizeCheck.message);
165
+ return;
166
+ }
167
+ // Set up signal handlers for clean exit
168
+ const cleanup = () => {
169
+ this.quit();
170
+ };
171
+ process.on('SIGINT', cleanup);
172
+ process.on('SIGTERM', cleanup);
173
+ try {
174
+ this.running = true;
175
+ this.enterAlternateScreen();
176
+ this.setupInput();
177
+ this.onStart();
178
+ this.startGameLoop();
179
+ // Wait for game to end
180
+ await new Promise((resolve) => {
181
+ this.once('quit', resolve);
182
+ });
183
+ }
184
+ finally {
185
+ process.removeListener('SIGINT', cleanup);
186
+ process.removeListener('SIGTERM', cleanup);
187
+ this.stopGameLoop();
188
+ this.restoreInput();
189
+ this.exitAlternateScreen();
190
+ // Small delay to ensure terminal state is fully restored
191
+ await new Promise((resolve) => setTimeout(resolve, 50));
192
+ }
193
+ }
194
+ /**
195
+ * Quit the game
196
+ */
197
+ quit() {
198
+ if (this.running) {
199
+ this.running = false;
200
+ this.onQuit();
201
+ this.emit('quit');
202
+ }
203
+ }
204
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Games Module
3
+ *
4
+ * Entry point for the terminal games easter egg.
5
+ */
6
+ export { playTetris, TetrisGame } from './tetris/index.js';
7
+ export { getCoins, hasCoins, spendCoins, earnCoins, checkDailyBonus, formatCoinsDisplay, getCoinsDisplayShort, COIN_COST_START_GAME, COIN_COST_CONTINUE } from './coins.js';
8
+ export { getHighScores, isLeaderboardScore, isNewHighScore, getBestScore, formatScore, formatHighScoreEntry } from './scores.js';
9
+ export interface GameInfo {
10
+ id: string;
11
+ name: string;
12
+ description: string;
13
+ available: boolean;
14
+ play: () => Promise<void>;
15
+ }
16
+ export declare function getAvailableGames(): GameInfo[];
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Games Module
3
+ *
4
+ * Entry point for the terminal games easter egg.
5
+ */
6
+ export { playTetris, TetrisGame } from './tetris/index.js';
7
+ export { getCoins, hasCoins, spendCoins, earnCoins, checkDailyBonus, formatCoinsDisplay, getCoinsDisplayShort, COIN_COST_START_GAME, COIN_COST_CONTINUE } from './coins.js';
8
+ export { getHighScores, isLeaderboardScore, isNewHighScore, getBestScore, formatScore, formatHighScoreEntry } from './scores.js';
9
+ export function getAvailableGames() {
10
+ return [
11
+ {
12
+ id: 'tetris',
13
+ name: 'TETRIS',
14
+ description: 'Classic block-stacking puzzle',
15
+ available: true,
16
+ play: async () => {
17
+ const { playTetris } = await import('./tetris/index.js');
18
+ await playTetris();
19
+ },
20
+ },
21
+ {
22
+ id: 'snake',
23
+ name: 'SNAKE',
24
+ description: 'Eat food, grow longer',
25
+ available: false,
26
+ play: async () => {
27
+ // Coming soon
28
+ },
29
+ },
30
+ {
31
+ id: 'invaders',
32
+ name: 'SPACE INVADERS',
33
+ description: 'Defend Earth from aliens',
34
+ available: false,
35
+ play: async () => {
36
+ // Coming soon
37
+ },
38
+ },
39
+ {
40
+ id: 'breakout',
41
+ name: 'BREAKOUT',
42
+ description: 'Break all the bricks',
43
+ available: false,
44
+ play: async () => {
45
+ // Coming soon
46
+ },
47
+ },
48
+ ];
49
+ }