@compilr-dev/cli 0.5.0 → 0.5.1

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 (591) hide show
  1. package/README.md +236 -68
  2. package/dist/.tsbuildinfo.app +1 -0
  3. package/dist/.tsbuildinfo.data +1 -0
  4. package/dist/.tsbuildinfo.domain +1 -0
  5. package/dist/.tsbuildinfo.foundation +1 -0
  6. package/dist/agent.d.ts +61 -4
  7. package/dist/agent.js +241 -245
  8. package/dist/anchors/index.d.ts +1 -1
  9. package/dist/anchors/index.js +1 -1
  10. package/dist/anchors/project-anchors.d.ts +2 -2
  11. package/dist/anchors/project-anchors.js +1 -1
  12. package/dist/auth/api-client.d.ts +124 -0
  13. package/dist/auth/api-client.js +261 -0
  14. package/dist/auth/index.d.ts +172 -0
  15. package/dist/auth/index.js +545 -0
  16. package/dist/auth/storage.d.ts +52 -0
  17. package/dist/auth/storage.js +118 -0
  18. package/dist/changelog/index.d.ts +16 -0
  19. package/dist/changelog/index.js +24 -0
  20. package/dist/changelog/releases.d.ts +17 -0
  21. package/dist/changelog/releases.js +63 -0
  22. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  23. package/dist/commands-v2/handlers/auth.js +118 -0
  24. package/dist/commands-v2/handlers/background.d.ts +14 -0
  25. package/dist/commands-v2/handlers/background.js +276 -0
  26. package/dist/commands-v2/handlers/context.js +266 -81
  27. package/dist/commands-v2/handlers/core.d.ts +1 -0
  28. package/dist/commands-v2/handlers/core.js +133 -8
  29. package/dist/commands-v2/handlers/debug.js +18 -0
  30. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  31. package/dist/commands-v2/handlers/delegations.js +29 -0
  32. package/dist/commands-v2/handlers/files.d.ts +8 -0
  33. package/dist/commands-v2/handlers/files.js +162 -0
  34. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  35. package/dist/commands-v2/handlers/filter.js +130 -0
  36. package/dist/commands-v2/handlers/games.d.ts +7 -0
  37. package/dist/commands-v2/handlers/games.js +57 -0
  38. package/dist/commands-v2/handlers/index.d.ts +13 -0
  39. package/dist/commands-v2/handlers/index.js +39 -0
  40. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  41. package/dist/commands-v2/handlers/mcp.js +39 -0
  42. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  43. package/dist/commands-v2/handlers/notifications.js +34 -0
  44. package/dist/commands-v2/handlers/project.js +244 -23
  45. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  46. package/dist/commands-v2/handlers/reset.js +118 -0
  47. package/dist/commands-v2/handlers/session.d.ts +161 -0
  48. package/dist/commands-v2/handlers/session.js +805 -0
  49. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  50. package/dist/commands-v2/handlers/settings.js +217 -35
  51. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  52. package/dist/commands-v2/handlers/tasks.js +36 -0
  53. package/dist/commands-v2/handlers/team.d.ts +9 -0
  54. package/dist/commands-v2/handlers/team.js +549 -0
  55. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  56. package/dist/commands-v2/handlers/terminals.js +34 -0
  57. package/dist/commands-v2/index.d.ts +3 -2
  58. package/dist/commands-v2/index.js +4 -1
  59. package/dist/commands-v2/registry.d.ts +15 -0
  60. package/dist/commands-v2/registry.js +34 -0
  61. package/dist/commands-v2/types.d.ts +81 -3
  62. package/dist/commands.js +13 -0
  63. package/dist/compilr-diff-companion.vsix +0 -0
  64. package/dist/db/index.js +98 -4
  65. package/dist/db/repositories/document-repository.d.ts +2 -0
  66. package/dist/db/repositories/document-repository.js +5 -1
  67. package/dist/db/repositories/index.d.ts +2 -0
  68. package/dist/db/repositories/index.js +1 -0
  69. package/dist/db/repositories/plan-repository.d.ts +101 -0
  70. package/dist/db/repositories/plan-repository.js +275 -0
  71. package/dist/db/repositories/project-repository.d.ts +6 -0
  72. package/dist/db/repositories/project-repository.js +41 -0
  73. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  74. package/dist/db/repositories/work-item-repository.js +69 -4
  75. package/dist/db/schema.d.ts +40 -3
  76. package/dist/db/schema.js +66 -3
  77. package/dist/episodes/index.d.ts +20 -0
  78. package/dist/episodes/index.js +27 -0
  79. package/dist/episodes/recorder.d.ts +51 -0
  80. package/dist/episodes/recorder.js +195 -0
  81. package/dist/episodes/significant-work.d.ts +21 -0
  82. package/dist/episodes/significant-work.js +56 -0
  83. package/dist/episodes/store.d.ts +38 -0
  84. package/dist/episodes/store.js +199 -0
  85. package/dist/episodes/types.d.ts +35 -0
  86. package/dist/episodes/types.js +6 -0
  87. package/dist/episodes/work-at-risk.d.ts +12 -0
  88. package/dist/episodes/work-at-risk.js +38 -0
  89. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  90. package/dist/episodes/work-summary-anchor.js +73 -0
  91. package/dist/games/coins.d.ts +66 -0
  92. package/dist/games/coins.js +165 -0
  93. package/dist/games/game-base.d.ts +84 -0
  94. package/dist/games/game-base.js +204 -0
  95. package/dist/games/index.d.ts +16 -0
  96. package/dist/games/index.js +49 -0
  97. package/dist/games/scores.d.ts +69 -0
  98. package/dist/games/scores.js +191 -0
  99. package/dist/games/tetris/board.d.ts +59 -0
  100. package/dist/games/tetris/board.js +170 -0
  101. package/dist/games/tetris/index.d.ts +109 -0
  102. package/dist/games/tetris/index.js +610 -0
  103. package/dist/games/tetris/pieces.d.ts +44 -0
  104. package/dist/games/tetris/pieces.js +271 -0
  105. package/dist/games/tetris/renderer.d.ts +26 -0
  106. package/dist/games/tetris/renderer.js +77 -0
  107. package/dist/guide/guide-content.d.ts +23 -0
  108. package/dist/guide/guide-content.js +196 -0
  109. package/dist/guide/index.d.ts +8 -0
  110. package/dist/guide/index.js +7 -0
  111. package/dist/guide/shared-content.d.ts +37 -0
  112. package/dist/guide/shared-content.js +1272 -0
  113. package/dist/guide/tutorial-helpers.d.ts +57 -0
  114. package/dist/guide/tutorial-helpers.js +147 -0
  115. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  116. package/dist/handlers/ask-user-handlers.js +104 -0
  117. package/dist/handlers/delegation-handlers.d.ts +34 -0
  118. package/dist/handlers/delegation-handlers.js +291 -0
  119. package/dist/handlers/permission-handler.d.ts +30 -0
  120. package/dist/handlers/permission-handler.js +205 -0
  121. package/dist/index.d.ts +11 -1
  122. package/dist/index.js +448 -271
  123. package/dist/input-handlers/memory-handler.d.ts +1 -1
  124. package/dist/input-handlers/memory-handler.js +2 -1
  125. package/dist/models/index.d.ts +10 -0
  126. package/dist/models/index.js +12 -0
  127. package/dist/models/model-registry.d.ts +38 -0
  128. package/dist/models/model-registry.js +69 -0
  129. package/dist/models/model-tiers.d.ts +28 -0
  130. package/dist/models/model-tiers.js +71 -0
  131. package/dist/models/model-validation.d.ts +25 -0
  132. package/dist/models/model-validation.js +291 -0
  133. package/dist/models/ollama-models.d.ts +73 -0
  134. package/dist/models/ollama-models.js +178 -0
  135. package/dist/models/provider-types.d.ts +6 -0
  136. package/dist/models/provider-types.js +1 -0
  137. package/dist/models/providers.d.ts +35 -0
  138. package/dist/models/providers.js +58 -0
  139. package/dist/models/types.d.ts +4 -0
  140. package/dist/models/types.js +4 -0
  141. package/dist/multi-agent/activity.d.ts +21 -0
  142. package/dist/multi-agent/activity.js +34 -0
  143. package/dist/multi-agent/agent-selection.d.ts +55 -0
  144. package/dist/multi-agent/agent-selection.js +90 -0
  145. package/dist/multi-agent/artifacts.d.ts +197 -0
  146. package/dist/multi-agent/artifacts.js +379 -0
  147. package/dist/multi-agent/checkpointer.d.ts +138 -0
  148. package/dist/multi-agent/checkpointer.js +471 -0
  149. package/dist/multi-agent/collision-utils.d.ts +16 -0
  150. package/dist/multi-agent/collision-utils.js +28 -0
  151. package/dist/multi-agent/context-resolver.d.ts +97 -0
  152. package/dist/multi-agent/context-resolver.js +316 -0
  153. package/dist/multi-agent/custom-agents.d.ts +83 -0
  154. package/dist/multi-agent/custom-agents.js +227 -0
  155. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  156. package/dist/multi-agent/delegation-tracker.js +243 -0
  157. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  158. package/dist/multi-agent/file-lock-hook.js +97 -0
  159. package/dist/multi-agent/file-locks.d.ts +58 -0
  160. package/dist/multi-agent/file-locks.js +194 -0
  161. package/dist/multi-agent/index.d.ts +24 -0
  162. package/dist/multi-agent/index.js +30 -0
  163. package/dist/multi-agent/mention-parser.d.ts +64 -0
  164. package/dist/multi-agent/mention-parser.js +146 -0
  165. package/dist/multi-agent/notification-manager.d.ts +84 -0
  166. package/dist/multi-agent/notification-manager.js +224 -0
  167. package/dist/multi-agent/pending-requests.d.ts +122 -0
  168. package/dist/multi-agent/pending-requests.js +155 -0
  169. package/dist/multi-agent/session-registry.d.ts +139 -0
  170. package/dist/multi-agent/session-registry.js +514 -0
  171. package/dist/multi-agent/shared-context.d.ts +293 -0
  172. package/dist/multi-agent/shared-context.js +671 -0
  173. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  174. package/dist/multi-agent/skill-requirements.js +178 -0
  175. package/dist/multi-agent/task-assignment.d.ts +69 -0
  176. package/dist/multi-agent/task-assignment.js +123 -0
  177. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  178. package/dist/multi-agent/task-suggestion.js +72 -0
  179. package/dist/multi-agent/team-agent.d.ts +201 -0
  180. package/dist/multi-agent/team-agent.js +488 -0
  181. package/dist/multi-agent/team.d.ts +286 -0
  182. package/dist/multi-agent/team.js +610 -0
  183. package/dist/multi-agent/tool-config.d.ts +110 -0
  184. package/dist/multi-agent/tool-config.js +661 -0
  185. package/dist/multi-agent/types.d.ts +211 -0
  186. package/dist/multi-agent/types.js +617 -0
  187. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  188. package/dist/prompts/plan-mode-prompt.js +95 -0
  189. package/dist/repl-helpers.js +3 -2
  190. package/dist/repl-v2.d.ts +401 -2
  191. package/dist/repl-v2.js +2577 -65
  192. package/dist/session/index.d.ts +6 -0
  193. package/dist/session/index.js +6 -0
  194. package/dist/session/project-session-manager.d.ts +158 -0
  195. package/dist/session/project-session-manager.js +650 -0
  196. package/dist/settings/index.d.ts +133 -13
  197. package/dist/settings/index.js +329 -24
  198. package/dist/settings/mcp-config.d.ts +76 -0
  199. package/dist/settings/mcp-config.js +143 -0
  200. package/dist/settings/paths.d.ts +4 -0
  201. package/dist/settings/paths.js +6 -0
  202. package/dist/shared-handlers.d.ts +62 -0
  203. package/dist/shared-handlers.js +48 -0
  204. package/dist/system-prompt/builder.d.ts +5 -0
  205. package/dist/system-prompt/builder.js +4 -0
  206. package/dist/system-prompt/index.d.ts +18 -0
  207. package/dist/system-prompt/index.js +18 -0
  208. package/dist/system-prompt/modules.d.ts +5 -0
  209. package/dist/system-prompt/modules.js +4 -0
  210. package/dist/tabbed-menu.js +2 -1
  211. package/dist/templates/compilr-md-import.d.ts +16 -0
  212. package/dist/templates/compilr-md-import.js +241 -0
  213. package/dist/templates/compilr-md.js +10 -61
  214. package/dist/templates/config-json.d.ts +1 -25
  215. package/dist/templates/index.d.ts +2 -0
  216. package/dist/templates/index.js +34 -73
  217. package/dist/tool-names.d.ts +108 -0
  218. package/dist/tool-names.js +227 -0
  219. package/dist/tools/anchor-tools.d.ts +4 -4
  220. package/dist/tools/anchor-tools.js +1 -1
  221. package/dist/tools/artifact-tools.d.ts +42 -0
  222. package/dist/tools/artifact-tools.js +328 -0
  223. package/dist/tools/ask-user-simple.d.ts +1 -1
  224. package/dist/tools/ask-user-simple.js +2 -1
  225. package/dist/tools/ask-user.d.ts +1 -1
  226. package/dist/tools/ask-user.js +2 -1
  227. package/dist/tools/backlog-wrappers.d.ts +5 -3
  228. package/dist/tools/backlog-wrappers.js +16 -1
  229. package/dist/tools/backlog.d.ts +2 -2
  230. package/dist/tools/backlog.js +1 -1
  231. package/dist/tools/db-tools.d.ts +8 -61
  232. package/dist/tools/db-tools.js +8 -13
  233. package/dist/tools/delegate-background.d.ts +27 -0
  234. package/dist/tools/delegate-background.js +115 -0
  235. package/dist/tools/delegate.d.ts +22 -0
  236. package/dist/tools/delegate.js +97 -0
  237. package/dist/tools/delegation-status.d.ts +16 -0
  238. package/dist/tools/delegation-status.js +128 -0
  239. package/dist/tools/document-db.d.ts +5 -5
  240. package/dist/tools/document-db.js +1 -1
  241. package/dist/tools/guide-tool.d.ts +12 -0
  242. package/dist/tools/guide-tool.js +59 -0
  243. package/dist/tools/handoff.d.ts +25 -0
  244. package/dist/tools/handoff.js +99 -0
  245. package/dist/tools/meta-tools.d.ts +26 -0
  246. package/dist/tools/meta-tools.js +47 -0
  247. package/dist/tools/plan-tools.d.ts +54 -0
  248. package/dist/tools/plan-tools.js +338 -0
  249. package/dist/tools/platform-adapter.d.ts +29 -0
  250. package/dist/tools/platform-adapter.js +394 -0
  251. package/dist/tools/project-db.d.ts +5 -73
  252. package/dist/tools/project-db.js +5 -336
  253. package/dist/tools/recall-work-tool.d.ts +18 -0
  254. package/dist/tools/recall-work-tool.js +82 -0
  255. package/dist/tools/workitem-db.d.ts +43 -11
  256. package/dist/tools/workitem-db.js +186 -5
  257. package/dist/tools.d.ts +67 -2
  258. package/dist/tools.js +237 -47
  259. package/dist/ui/autocomplete-controller.d.ts +42 -0
  260. package/dist/ui/autocomplete-controller.js +384 -0
  261. package/dist/ui/base/index.d.ts +1 -1
  262. package/dist/ui/base/index.js +1 -1
  263. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  264. package/dist/ui/base/overlay-base-v2.js +14 -0
  265. package/dist/ui/base/render-utils.d.ts +19 -0
  266. package/dist/ui/base/render-utils.js +25 -0
  267. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  268. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  269. package/dist/ui/constants/labels.d.ts +14 -0
  270. package/dist/ui/constants/labels.js +51 -0
  271. package/dist/ui/conversation-store.d.ts +55 -0
  272. package/dist/ui/conversation-store.js +107 -0
  273. package/dist/ui/conversation.js +11 -13
  274. package/dist/ui/diff.d.ts +7 -1
  275. package/dist/ui/diff.js +85 -48
  276. package/dist/ui/ephemeral.js +3 -9
  277. package/dist/ui/file-autocomplete.d.ts +24 -0
  278. package/dist/ui/file-autocomplete.js +56 -0
  279. package/dist/ui/footer-renderer.d.ts +69 -0
  280. package/dist/ui/footer-renderer.js +431 -0
  281. package/dist/ui/footer.d.ts +74 -7
  282. package/dist/ui/footer.js +173 -16
  283. package/dist/ui/input-controller.d.ts +51 -0
  284. package/dist/ui/input-controller.js +176 -0
  285. package/dist/ui/input-prompt.d.ts +19 -0
  286. package/dist/ui/input-prompt.js +206 -14
  287. package/dist/ui/keyboard-handler.d.ts +57 -0
  288. package/dist/ui/keyboard-handler.js +557 -0
  289. package/dist/ui/live-region-facade.d.ts +42 -0
  290. package/dist/ui/live-region-facade.js +205 -0
  291. package/dist/ui/live-region.d.ts +0 -4
  292. package/dist/ui/live-region.js +6 -14
  293. package/dist/ui/mascot/renderer.d.ts +1 -1
  294. package/dist/ui/mascot/renderer.js +37 -2
  295. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  296. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  297. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  298. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  299. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  300. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  301. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  302. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  303. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  304. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  305. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  306. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  307. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  308. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  309. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  310. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  311. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  312. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  313. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  314. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  315. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  316. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  317. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  318. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  319. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  320. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  321. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  322. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  323. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  324. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  325. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  326. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  327. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  328. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  329. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  330. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  331. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  332. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  333. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  334. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  335. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  336. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  337. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  338. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  339. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  340. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  341. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  342. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  343. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  344. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  345. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  346. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  347. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  348. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  349. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  350. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  351. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  352. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  353. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  354. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  355. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  356. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  357. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  358. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  359. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  360. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  361. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  362. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  363. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  364. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  365. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  366. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  367. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  368. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  369. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  370. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  371. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  372. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  373. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  374. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  375. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  376. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  377. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  378. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  379. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  380. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  381. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  382. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  383. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  384. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  385. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  386. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  387. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  388. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  389. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  390. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  391. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  392. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  393. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  394. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  395. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  396. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  397. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  398. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  399. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  400. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  401. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  402. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  403. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  404. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  405. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  406. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  407. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  408. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  409. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  410. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  411. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  412. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  413. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  414. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  415. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  416. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  417. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  418. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  419. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  420. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  421. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  422. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  423. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  424. package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -1
  425. package/dist/ui/overlay/index.d.ts +20 -1
  426. package/dist/ui/overlay/index.js +19 -0
  427. package/dist/ui/overlay/types.d.ts +5 -0
  428. package/dist/ui/overlay-manager.d.ts +43 -0
  429. package/dist/ui/overlay-manager.js +238 -0
  430. package/dist/ui/overlays.js +4 -16
  431. package/dist/ui/permission-overlay.js +6 -5
  432. package/dist/ui/status-bar-controller.d.ts +33 -0
  433. package/dist/ui/status-bar-controller.js +99 -0
  434. package/dist/ui/subagent-renderer.js +3 -19
  435. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  436. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  437. package/dist/ui/terminal-line-builders.d.ts +17 -0
  438. package/dist/ui/terminal-line-builders.js +42 -0
  439. package/dist/ui/terminal-render-item.d.ts +16 -0
  440. package/dist/ui/terminal-render-item.js +267 -0
  441. package/dist/ui/terminal-renderer.d.ts +7 -8
  442. package/dist/ui/terminal-renderer.js +7 -8
  443. package/dist/ui/terminal-types.d.ts +179 -0
  444. package/dist/ui/terminal-types.js +34 -0
  445. package/dist/ui/terminal-ui.d.ts +144 -276
  446. package/dist/ui/terminal-ui.js +384 -1861
  447. package/dist/ui/todo-zone.d.ts +19 -1
  448. package/dist/ui/todo-zone.js +71 -13
  449. package/dist/ui/tool-formatters.js +512 -1
  450. package/dist/ui/turn-metrics.d.ts +56 -0
  451. package/dist/ui/turn-metrics.js +75 -0
  452. package/dist/ui/types.d.ts +28 -0
  453. package/dist/ui/types.js +1 -0
  454. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  455. package/dist/ui/vscode-diff-ipc.js +385 -0
  456. package/dist/utils/credentials.d.ts +24 -5
  457. package/dist/utils/credentials.js +123 -9
  458. package/dist/utils/format-tokens.d.ts +13 -0
  459. package/dist/utils/format-tokens.js +18 -0
  460. package/dist/utils/git-config.d.ts +26 -0
  461. package/dist/utils/git-config.js +54 -0
  462. package/dist/utils/message-utils.d.ts +61 -0
  463. package/dist/utils/message-utils.js +72 -0
  464. package/dist/utils/model-tiers.d.ts +8 -1
  465. package/dist/utils/model-tiers.js +38 -16
  466. package/dist/utils/open-browser.d.ts +5 -0
  467. package/dist/utils/open-browser.js +32 -0
  468. package/dist/utils/path-safety.js +3 -2
  469. package/dist/utils/project-detection.d.ts +58 -0
  470. package/dist/utils/project-detection.js +424 -0
  471. package/dist/utils/project-memory.js +2 -1
  472. package/dist/utils/project-status.d.ts +2 -2
  473. package/dist/utils/startup-perf.d.ts +18 -0
  474. package/dist/utils/startup-perf.js +60 -0
  475. package/dist/utils/token-tracker.d.ts +62 -0
  476. package/dist/utils/token-tracker.js +150 -0
  477. package/dist/utils/token-types.d.ts +23 -0
  478. package/dist/utils/token-types.js +18 -0
  479. package/dist/utils/types/config-types.d.ts +32 -0
  480. package/dist/utils/types/config-types.js +8 -0
  481. package/dist/utils/update-checker.d.ts +28 -0
  482. package/dist/utils/update-checker.js +106 -0
  483. package/dist/utils/version.d.ts +7 -0
  484. package/dist/utils/version.js +10 -0
  485. package/dist/utils/vscode-detect.d.ts +39 -0
  486. package/dist/utils/vscode-detect.js +137 -0
  487. package/package.json +25 -12
  488. package/dist/commands/handler-types.d.ts +0 -68
  489. package/dist/commands/handler-types.js +0 -8
  490. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  491. package/dist/commands/handlers/agent-commands.js +0 -305
  492. package/dist/commands/handlers/design-commands.d.ts +0 -15
  493. package/dist/commands/handlers/design-commands.js +0 -334
  494. package/dist/commands/handlers/index.d.ts +0 -20
  495. package/dist/commands/handlers/index.js +0 -43
  496. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  497. package/dist/commands/handlers/overlay-commands.js +0 -287
  498. package/dist/commands/handlers/project-commands.d.ts +0 -11
  499. package/dist/commands/handlers/project-commands.js +0 -167
  500. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  501. package/dist/commands/handlers/simple-commands.js +0 -144
  502. package/dist/commands/registry.d.ts +0 -50
  503. package/dist/commands/registry.js +0 -75
  504. package/dist/index.old.d.ts +0 -7
  505. package/dist/index.old.js +0 -1014
  506. package/dist/repl.d.ts +0 -149
  507. package/dist/repl.js +0 -1151
  508. package/dist/templates/claude-md.d.ts +0 -7
  509. package/dist/templates/claude-md.js +0 -189
  510. package/dist/test-autocomplete.d.ts +0 -7
  511. package/dist/test-autocomplete.js +0 -85
  512. package/dist/test-tabbed-menu.d.ts +0 -7
  513. package/dist/test-tabbed-menu.js +0 -25
  514. package/dist/tool-selector.d.ts +0 -71
  515. package/dist/tool-selector.js +0 -184
  516. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  517. package/dist/ui/agents-overlay-v2.js +0 -809
  518. package/dist/ui/agents-overlay.d.ts +0 -12
  519. package/dist/ui/agents-overlay.js +0 -863
  520. package/dist/ui/anchors-overlay.d.ts +0 -12
  521. package/dist/ui/anchors-overlay.js +0 -775
  522. package/dist/ui/arch-type-overlay.d.ts +0 -15
  523. package/dist/ui/arch-type-overlay.js +0 -201
  524. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  525. package/dist/ui/ask-user-overlay-v2.js +0 -555
  526. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  527. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  528. package/dist/ui/backlog-overlay.d.ts +0 -32
  529. package/dist/ui/backlog-overlay.js +0 -652
  530. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  531. package/dist/ui/commands-overlay-v2.js +0 -441
  532. package/dist/ui/commands-overlay.d.ts +0 -16
  533. package/dist/ui/commands-overlay.js +0 -439
  534. package/dist/ui/config-overlay.d.ts +0 -35
  535. package/dist/ui/config-overlay.js +0 -707
  536. package/dist/ui/docs-overlay.d.ts +0 -17
  537. package/dist/ui/docs-overlay.js +0 -303
  538. package/dist/ui/footer-v2.d.ts +0 -222
  539. package/dist/ui/footer-v2.js +0 -1349
  540. package/dist/ui/help-overlay-v2.d.ts +0 -34
  541. package/dist/ui/help-overlay-v2.js +0 -309
  542. package/dist/ui/help-overlay.d.ts +0 -16
  543. package/dist/ui/help-overlay.js +0 -316
  544. package/dist/ui/init-overlay-v2.d.ts +0 -34
  545. package/dist/ui/init-overlay-v2.js +0 -600
  546. package/dist/ui/init-overlay.d.ts +0 -34
  547. package/dist/ui/init-overlay.js +0 -604
  548. package/dist/ui/input-prompt-v2.d.ts +0 -180
  549. package/dist/ui/input-prompt-v2.js +0 -999
  550. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  551. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  552. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  553. package/dist/ui/keys-overlay-v2.js +0 -248
  554. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  555. package/dist/ui/mascot-overlay-v2.js +0 -138
  556. package/dist/ui/mascot-overlay.d.ts +0 -21
  557. package/dist/ui/mascot-overlay.js +0 -146
  558. package/dist/ui/model-overlay-v2.d.ts +0 -49
  559. package/dist/ui/model-overlay-v2.js +0 -118
  560. package/dist/ui/model-overlay.d.ts +0 -27
  561. package/dist/ui/model-overlay.js +0 -221
  562. package/dist/ui/model-warning-overlay.d.ts +0 -30
  563. package/dist/ui/model-warning-overlay.js +0 -169
  564. package/dist/ui/new-overlay.d.ts +0 -34
  565. package/dist/ui/new-overlay.js +0 -604
  566. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  567. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  568. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  569. package/dist/ui/overlay/overlay-types.js +0 -22
  570. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  571. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  572. package/dist/ui/overlays/index.d.ts +0 -11
  573. package/dist/ui/overlays/index.js +0 -11
  574. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  575. package/dist/ui/permission-overlay-v2.js +0 -380
  576. package/dist/ui/projects-overlay.d.ts +0 -19
  577. package/dist/ui/projects-overlay.js +0 -484
  578. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  579. package/dist/ui/theme-overlay-v2.js +0 -135
  580. package/dist/ui/theme-overlay.d.ts +0 -24
  581. package/dist/ui/theme-overlay.js +0 -127
  582. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  583. package/dist/ui/tools-overlay-v2.js +0 -218
  584. package/dist/ui/tools-overlay.d.ts +0 -34
  585. package/dist/ui/tools-overlay.js +0 -230
  586. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  587. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  588. package/dist/ui/tutorial-overlay.d.ts +0 -11
  589. package/dist/ui/tutorial-overlay.js +0 -1034
  590. package/dist/ui/workflow-overlay.d.ts +0 -22
  591. 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
+ }