@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.
- package/LICENSE +108 -0
- package/README.md +237 -69
- package/dist/.tsbuildinfo.app +1 -0
- package/dist/.tsbuildinfo.data +1 -0
- package/dist/.tsbuildinfo.domain +1 -0
- package/dist/.tsbuildinfo.foundation +1 -0
- package/dist/agent.d.ts +61 -4
- package/dist/agent.js +241 -245
- package/dist/anchors/index.d.ts +1 -1
- package/dist/anchors/index.js +1 -1
- package/dist/anchors/project-anchors.d.ts +2 -2
- package/dist/anchors/project-anchors.js +1 -1
- package/dist/auth/api-client.d.ts +124 -0
- package/dist/auth/api-client.js +261 -0
- package/dist/auth/index.d.ts +172 -0
- package/dist/auth/index.js +545 -0
- package/dist/auth/storage.d.ts +52 -0
- package/dist/auth/storage.js +118 -0
- package/dist/changelog/index.d.ts +16 -0
- package/dist/changelog/index.js +24 -0
- package/dist/changelog/releases.d.ts +17 -0
- package/dist/changelog/releases.js +63 -0
- package/dist/commands-v2/handlers/auth.d.ts +10 -0
- package/dist/commands-v2/handlers/auth.js +118 -0
- package/dist/commands-v2/handlers/background.d.ts +14 -0
- package/dist/commands-v2/handlers/background.js +276 -0
- package/dist/commands-v2/handlers/context.js +286 -81
- package/dist/commands-v2/handlers/core.d.ts +1 -0
- package/dist/commands-v2/handlers/core.js +133 -8
- package/dist/commands-v2/handlers/debug.js +18 -0
- package/dist/commands-v2/handlers/delegations.d.ts +8 -0
- package/dist/commands-v2/handlers/delegations.js +29 -0
- package/dist/commands-v2/handlers/files.d.ts +8 -0
- package/dist/commands-v2/handlers/files.js +162 -0
- package/dist/commands-v2/handlers/filter.d.ts +9 -0
- package/dist/commands-v2/handlers/filter.js +130 -0
- package/dist/commands-v2/handlers/games.d.ts +7 -0
- package/dist/commands-v2/handlers/games.js +57 -0
- package/dist/commands-v2/handlers/index.d.ts +13 -0
- package/dist/commands-v2/handlers/index.js +39 -0
- package/dist/commands-v2/handlers/mcp.d.ts +8 -0
- package/dist/commands-v2/handlers/mcp.js +39 -0
- package/dist/commands-v2/handlers/notifications.d.ts +9 -0
- package/dist/commands-v2/handlers/notifications.js +34 -0
- package/dist/commands-v2/handlers/project.js +295 -31
- package/dist/commands-v2/handlers/reset.d.ts +11 -0
- package/dist/commands-v2/handlers/reset.js +118 -0
- package/dist/commands-v2/handlers/session.d.ts +161 -0
- package/dist/commands-v2/handlers/session.js +805 -0
- package/dist/commands-v2/handlers/settings.d.ts +2 -0
- package/dist/commands-v2/handlers/settings.js +217 -35
- package/dist/commands-v2/handlers/tasks.d.ts +5 -0
- package/dist/commands-v2/handlers/tasks.js +36 -0
- package/dist/commands-v2/handlers/team.d.ts +9 -0
- package/dist/commands-v2/handlers/team.js +549 -0
- package/dist/commands-v2/handlers/terminals.d.ts +9 -0
- package/dist/commands-v2/handlers/terminals.js +34 -0
- package/dist/commands-v2/index.d.ts +3 -2
- package/dist/commands-v2/index.js +4 -1
- package/dist/commands-v2/registry.d.ts +15 -0
- package/dist/commands-v2/registry.js +34 -0
- package/dist/commands-v2/types.d.ts +81 -3
- package/dist/commands.js +13 -0
- package/dist/compilr-diff-companion.vsix +0 -0
- package/dist/db/index.js +98 -4
- package/dist/db/repositories/document-repository.d.ts +2 -0
- package/dist/db/repositories/document-repository.js +6 -1
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.js +1 -0
- package/dist/db/repositories/plan-repository.d.ts +101 -0
- package/dist/db/repositories/plan-repository.js +275 -0
- package/dist/db/repositories/project-repository.d.ts +6 -0
- package/dist/db/repositories/project-repository.js +41 -0
- package/dist/db/repositories/work-item-repository.d.ts +15 -0
- package/dist/db/repositories/work-item-repository.js +69 -4
- package/dist/db/schema.d.ts +40 -3
- package/dist/db/schema.js +66 -3
- package/dist/episodes/index.d.ts +20 -0
- package/dist/episodes/index.js +27 -0
- package/dist/episodes/recorder.d.ts +51 -0
- package/dist/episodes/recorder.js +195 -0
- package/dist/episodes/significant-work.d.ts +21 -0
- package/dist/episodes/significant-work.js +56 -0
- package/dist/episodes/store.d.ts +38 -0
- package/dist/episodes/store.js +199 -0
- package/dist/episodes/types.d.ts +35 -0
- package/dist/episodes/types.js +6 -0
- package/dist/episodes/work-at-risk.d.ts +12 -0
- package/dist/episodes/work-at-risk.js +38 -0
- package/dist/episodes/work-summary-anchor.d.ts +23 -0
- package/dist/episodes/work-summary-anchor.js +73 -0
- package/dist/games/coins.d.ts +66 -0
- package/dist/games/coins.js +165 -0
- package/dist/games/game-base.d.ts +84 -0
- package/dist/games/game-base.js +204 -0
- package/dist/games/index.d.ts +16 -0
- package/dist/games/index.js +49 -0
- package/dist/games/scores.d.ts +69 -0
- package/dist/games/scores.js +191 -0
- package/dist/games/tetris/board.d.ts +59 -0
- package/dist/games/tetris/board.js +170 -0
- package/dist/games/tetris/index.d.ts +109 -0
- package/dist/games/tetris/index.js +610 -0
- package/dist/games/tetris/pieces.d.ts +44 -0
- package/dist/games/tetris/pieces.js +271 -0
- package/dist/games/tetris/renderer.d.ts +26 -0
- package/dist/games/tetris/renderer.js +77 -0
- package/dist/guide/guide-content.d.ts +23 -0
- package/dist/guide/guide-content.js +196 -0
- package/dist/guide/index.d.ts +8 -0
- package/dist/guide/index.js +7 -0
- package/dist/guide/shared-content.d.ts +37 -0
- package/dist/guide/shared-content.js +1272 -0
- package/dist/guide/tutorial-helpers.d.ts +57 -0
- package/dist/guide/tutorial-helpers.js +147 -0
- package/dist/handlers/ask-user-handlers.d.ts +32 -0
- package/dist/handlers/ask-user-handlers.js +104 -0
- package/dist/handlers/delegation-handlers.d.ts +34 -0
- package/dist/handlers/delegation-handlers.js +291 -0
- package/dist/handlers/permission-handler.d.ts +30 -0
- package/dist/handlers/permission-handler.js +205 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +448 -271
- package/dist/input-handlers/memory-handler.d.ts +1 -1
- package/dist/input-handlers/memory-handler.js +2 -1
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.js +12 -0
- package/dist/models/model-registry.d.ts +38 -0
- package/dist/models/model-registry.js +69 -0
- package/dist/models/model-tiers.d.ts +28 -0
- package/dist/models/model-tiers.js +71 -0
- package/dist/models/model-validation.d.ts +25 -0
- package/dist/models/model-validation.js +291 -0
- package/dist/models/ollama-models.d.ts +73 -0
- package/dist/models/ollama-models.js +178 -0
- package/dist/models/provider-types.d.ts +6 -0
- package/dist/models/provider-types.js +1 -0
- package/dist/models/providers.d.ts +35 -0
- package/dist/models/providers.js +58 -0
- package/dist/models/types.d.ts +4 -0
- package/dist/models/types.js +4 -0
- package/dist/multi-agent/activity.d.ts +21 -0
- package/dist/multi-agent/activity.js +34 -0
- package/dist/multi-agent/agent-selection.d.ts +55 -0
- package/dist/multi-agent/agent-selection.js +90 -0
- package/dist/multi-agent/artifacts.d.ts +197 -0
- package/dist/multi-agent/artifacts.js +379 -0
- package/dist/multi-agent/checkpointer.d.ts +138 -0
- package/dist/multi-agent/checkpointer.js +471 -0
- package/dist/multi-agent/collision-utils.d.ts +16 -0
- package/dist/multi-agent/collision-utils.js +28 -0
- package/dist/multi-agent/context-resolver.d.ts +97 -0
- package/dist/multi-agent/context-resolver.js +316 -0
- package/dist/multi-agent/custom-agents.d.ts +83 -0
- package/dist/multi-agent/custom-agents.js +227 -0
- package/dist/multi-agent/delegation-tracker.d.ts +157 -0
- package/dist/multi-agent/delegation-tracker.js +243 -0
- package/dist/multi-agent/file-lock-hook.d.ts +29 -0
- package/dist/multi-agent/file-lock-hook.js +97 -0
- package/dist/multi-agent/file-locks.d.ts +58 -0
- package/dist/multi-agent/file-locks.js +194 -0
- package/dist/multi-agent/index.d.ts +24 -0
- package/dist/multi-agent/index.js +30 -0
- package/dist/multi-agent/mention-parser.d.ts +64 -0
- package/dist/multi-agent/mention-parser.js +146 -0
- package/dist/multi-agent/notification-manager.d.ts +84 -0
- package/dist/multi-agent/notification-manager.js +224 -0
- package/dist/multi-agent/pending-requests.d.ts +122 -0
- package/dist/multi-agent/pending-requests.js +155 -0
- package/dist/multi-agent/session-registry.d.ts +139 -0
- package/dist/multi-agent/session-registry.js +514 -0
- package/dist/multi-agent/shared-context.d.ts +293 -0
- package/dist/multi-agent/shared-context.js +671 -0
- package/dist/multi-agent/skill-requirements.d.ts +66 -0
- package/dist/multi-agent/skill-requirements.js +178 -0
- package/dist/multi-agent/task-assignment.d.ts +69 -0
- package/dist/multi-agent/task-assignment.js +123 -0
- package/dist/multi-agent/task-suggestion.d.ts +31 -0
- package/dist/multi-agent/task-suggestion.js +72 -0
- package/dist/multi-agent/team-agent.d.ts +201 -0
- package/dist/multi-agent/team-agent.js +488 -0
- package/dist/multi-agent/team.d.ts +286 -0
- package/dist/multi-agent/team.js +610 -0
- package/dist/multi-agent/tool-config.d.ts +110 -0
- package/dist/multi-agent/tool-config.js +661 -0
- package/dist/multi-agent/types.d.ts +211 -0
- package/dist/multi-agent/types.js +617 -0
- package/dist/prompts/plan-mode-prompt.d.ts +11 -0
- package/dist/prompts/plan-mode-prompt.js +95 -0
- package/dist/repl-helpers.js +5 -2
- package/dist/repl-v2.d.ts +401 -2
- package/dist/repl-v2.js +2588 -65
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.js +6 -0
- package/dist/session/project-session-manager.d.ts +158 -0
- package/dist/session/project-session-manager.js +650 -0
- package/dist/settings/index.d.ts +133 -13
- package/dist/settings/index.js +329 -24
- package/dist/settings/mcp-config.d.ts +76 -0
- package/dist/settings/mcp-config.js +143 -0
- package/dist/settings/paths.d.ts +4 -0
- package/dist/settings/paths.js +6 -0
- package/dist/shared-handlers.d.ts +62 -0
- package/dist/shared-handlers.js +48 -0
- package/dist/system-prompt/builder.d.ts +5 -0
- package/dist/system-prompt/builder.js +4 -0
- package/dist/system-prompt/index.d.ts +18 -0
- package/dist/system-prompt/index.js +18 -0
- package/dist/system-prompt/modules.d.ts +5 -0
- package/dist/system-prompt/modules.js +4 -0
- package/dist/tabbed-menu.js +2 -1
- package/dist/templates/compilr-md-import.d.ts +16 -0
- package/dist/templates/compilr-md-import.js +241 -0
- package/dist/templates/compilr-md.js +10 -61
- package/dist/templates/config-json.d.ts +1 -25
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.js +34 -73
- package/dist/tool-names.d.ts +113 -0
- package/dist/tool-names.js +239 -0
- package/dist/tools/ask-user-simple.d.ts +1 -1
- package/dist/tools/ask-user-simple.js +2 -1
- package/dist/tools/ask-user.d.ts +1 -1
- package/dist/tools/ask-user.js +2 -1
- package/dist/tools/backlog.d.ts +2 -2
- package/dist/tools/backlog.js +1 -1
- package/dist/tools/db-tools.d.ts +13 -61
- package/dist/tools/db-tools.js +12 -13
- package/dist/tools/delegate-background.d.ts +27 -0
- package/dist/tools/delegate-background.js +115 -0
- package/dist/tools/delegate.d.ts +22 -0
- package/dist/tools/delegate.js +97 -0
- package/dist/tools/delegation-status.d.ts +16 -0
- package/dist/tools/delegation-status.js +128 -0
- package/dist/tools/guide-tool.d.ts +12 -0
- package/dist/tools/guide-tool.js +59 -0
- package/dist/tools/handoff.d.ts +25 -0
- package/dist/tools/handoff.js +99 -0
- package/dist/tools/meta-tools.d.ts +26 -0
- package/dist/tools/meta-tools.js +47 -0
- package/dist/tools/platform-adapter.d.ts +35 -0
- package/dist/tools/platform-adapter.js +404 -0
- package/dist/tools/project-db.d.ts +5 -73
- package/dist/tools/project-db.js +5 -336
- package/dist/tools.d.ts +67 -2
- package/dist/tools.js +240 -48
- package/dist/ui/autocomplete-controller.d.ts +42 -0
- package/dist/ui/autocomplete-controller.js +384 -0
- package/dist/ui/base/index.d.ts +1 -1
- package/dist/ui/base/index.js +1 -1
- package/dist/ui/base/overlay-base-v2.d.ts +10 -0
- package/dist/ui/base/overlay-base-v2.js +14 -0
- package/dist/ui/base/render-utils.d.ts +19 -0
- package/dist/ui/base/render-utils.js +25 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
- package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
- package/dist/ui/constants/labels.d.ts +14 -0
- package/dist/ui/constants/labels.js +52 -0
- package/dist/ui/conversation-store.d.ts +55 -0
- package/dist/ui/conversation-store.js +107 -0
- package/dist/ui/conversation.js +11 -13
- package/dist/ui/diff.d.ts +7 -1
- package/dist/ui/diff.js +85 -48
- package/dist/ui/ephemeral.js +3 -9
- package/dist/ui/file-autocomplete.d.ts +24 -0
- package/dist/ui/file-autocomplete.js +56 -0
- package/dist/ui/footer-renderer.d.ts +69 -0
- package/dist/ui/footer-renderer.js +431 -0
- package/dist/ui/footer.d.ts +74 -7
- package/dist/ui/footer.js +173 -16
- package/dist/ui/input-controller.d.ts +51 -0
- package/dist/ui/input-controller.js +176 -0
- package/dist/ui/input-prompt.d.ts +19 -0
- package/dist/ui/input-prompt.js +206 -14
- package/dist/ui/keyboard-handler.d.ts +57 -0
- package/dist/ui/keyboard-handler.js +557 -0
- package/dist/ui/live-region-facade.d.ts +42 -0
- package/dist/ui/live-region-facade.js +205 -0
- package/dist/ui/live-region.d.ts +0 -4
- package/dist/ui/live-region.js +6 -14
- package/dist/ui/mascot/renderer.d.ts +1 -1
- package/dist/ui/mascot/renderer.js +37 -2
- package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
- package/dist/ui/overlay/data/tutorial-content.js +9 -0
- package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
- package/dist/ui/overlay/data/tutorial-registry.js +116 -0
- package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
- package/dist/ui/overlay/data/tutorial-types.js +6 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
- package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
- package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
- package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
- package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
- package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
- package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
- package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
- package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
- package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
- package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
- package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
- package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
- package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
- package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
- package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
- package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
- package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
- package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
- package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
- package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
- package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
- package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +10 -4
- package/dist/ui/overlay/index.d.ts +20 -1
- package/dist/ui/overlay/index.js +19 -0
- package/dist/ui/overlay/types.d.ts +5 -0
- package/dist/ui/overlay-manager.d.ts +43 -0
- package/dist/ui/overlay-manager.js +238 -0
- package/dist/ui/overlays.js +4 -16
- package/dist/ui/permission-overlay.js +6 -5
- package/dist/ui/status-bar-controller.d.ts +33 -0
- package/dist/ui/status-bar-controller.js +99 -0
- package/dist/ui/subagent-renderer.js +3 -19
- package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
- package/dist/ui/terminal-autocomplete-utils.js +83 -0
- package/dist/ui/terminal-line-builders.d.ts +17 -0
- package/dist/ui/terminal-line-builders.js +42 -0
- package/dist/ui/terminal-render-item.d.ts +16 -0
- package/dist/ui/terminal-render-item.js +267 -0
- package/dist/ui/terminal-renderer.d.ts +7 -8
- package/dist/ui/terminal-renderer.js +7 -8
- package/dist/ui/terminal-types.d.ts +179 -0
- package/dist/ui/terminal-types.js +34 -0
- package/dist/ui/terminal-ui.d.ts +144 -276
- package/dist/ui/terminal-ui.js +384 -1861
- package/dist/ui/todo-zone.d.ts +19 -1
- package/dist/ui/todo-zone.js +71 -13
- package/dist/ui/tool-formatters.js +696 -1
- package/dist/ui/turn-metrics.d.ts +56 -0
- package/dist/ui/turn-metrics.js +75 -0
- package/dist/ui/types.d.ts +28 -0
- package/dist/ui/types.js +1 -0
- package/dist/ui/vscode-diff-ipc.d.ts +102 -0
- package/dist/ui/vscode-diff-ipc.js +385 -0
- package/dist/utils/credentials.d.ts +24 -5
- package/dist/utils/credentials.js +123 -9
- package/dist/utils/format-tokens.d.ts +13 -0
- package/dist/utils/format-tokens.js +18 -0
- package/dist/utils/git-config.d.ts +26 -0
- package/dist/utils/git-config.js +54 -0
- package/dist/utils/message-utils.d.ts +61 -0
- package/dist/utils/message-utils.js +72 -0
- package/dist/utils/model-tiers.d.ts +8 -1
- package/dist/utils/model-tiers.js +38 -16
- package/dist/utils/open-browser.d.ts +5 -0
- package/dist/utils/open-browser.js +32 -0
- package/dist/utils/path-safety.js +3 -2
- package/dist/utils/project-detection.d.ts +58 -0
- package/dist/utils/project-detection.js +424 -0
- package/dist/utils/project-memory.js +2 -1
- package/dist/utils/project-status.d.ts +2 -2
- package/dist/utils/startup-perf.d.ts +18 -0
- package/dist/utils/startup-perf.js +60 -0
- package/dist/utils/token-tracker.d.ts +62 -0
- package/dist/utils/token-tracker.js +150 -0
- package/dist/utils/token-types.d.ts +23 -0
- package/dist/utils/token-types.js +18 -0
- package/dist/utils/types/config-types.d.ts +32 -0
- package/dist/utils/types/config-types.js +8 -0
- package/dist/utils/update-checker.d.ts +28 -0
- package/dist/utils/update-checker.js +106 -0
- package/dist/utils/version.d.ts +7 -0
- package/dist/utils/version.js +10 -0
- package/dist/utils/vscode-detect.d.ts +39 -0
- package/dist/utils/vscode-detect.js +137 -0
- package/package.json +27 -13
- package/dist/commands/handler-types.d.ts +0 -68
- package/dist/commands/handler-types.js +0 -8
- package/dist/commands/handlers/agent-commands.d.ts +0 -13
- package/dist/commands/handlers/agent-commands.js +0 -305
- package/dist/commands/handlers/design-commands.d.ts +0 -15
- package/dist/commands/handlers/design-commands.js +0 -334
- package/dist/commands/handlers/index.d.ts +0 -20
- package/dist/commands/handlers/index.js +0 -43
- package/dist/commands/handlers/overlay-commands.d.ts +0 -21
- package/dist/commands/handlers/overlay-commands.js +0 -287
- package/dist/commands/handlers/project-commands.d.ts +0 -11
- package/dist/commands/handlers/project-commands.js +0 -167
- package/dist/commands/handlers/simple-commands.d.ts +0 -19
- package/dist/commands/handlers/simple-commands.js +0 -144
- package/dist/commands/registry.d.ts +0 -50
- package/dist/commands/registry.js +0 -75
- package/dist/index.old.d.ts +0 -7
- package/dist/index.old.js +0 -1014
- package/dist/repl.d.ts +0 -149
- package/dist/repl.js +0 -1151
- package/dist/templates/claude-md.d.ts +0 -7
- package/dist/templates/claude-md.js +0 -189
- package/dist/test-autocomplete.d.ts +0 -7
- package/dist/test-autocomplete.js +0 -85
- package/dist/test-tabbed-menu.d.ts +0 -7
- package/dist/test-tabbed-menu.js +0 -25
- package/dist/tool-selector.d.ts +0 -71
- package/dist/tool-selector.js +0 -184
- package/dist/tools/anchor-tools.d.ts +0 -31
- package/dist/tools/anchor-tools.js +0 -255
- package/dist/tools/backlog-wrappers.d.ts +0 -54
- package/dist/tools/backlog-wrappers.js +0 -338
- package/dist/tools/document-db.d.ts +0 -43
- package/dist/tools/document-db.js +0 -220
- package/dist/tools/workitem-db.d.ts +0 -103
- package/dist/tools/workitem-db.js +0 -549
- package/dist/ui/agents-overlay-v2.d.ts +0 -43
- package/dist/ui/agents-overlay-v2.js +0 -809
- package/dist/ui/agents-overlay.d.ts +0 -12
- package/dist/ui/agents-overlay.js +0 -863
- package/dist/ui/anchors-overlay.d.ts +0 -12
- package/dist/ui/anchors-overlay.js +0 -775
- package/dist/ui/arch-type-overlay.d.ts +0 -15
- package/dist/ui/arch-type-overlay.js +0 -201
- package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
- package/dist/ui/ask-user-overlay-v2.js +0 -555
- package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
- package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
- package/dist/ui/backlog-overlay.d.ts +0 -32
- package/dist/ui/backlog-overlay.js +0 -652
- package/dist/ui/commands-overlay-v2.d.ts +0 -33
- package/dist/ui/commands-overlay-v2.js +0 -441
- package/dist/ui/commands-overlay.d.ts +0 -16
- package/dist/ui/commands-overlay.js +0 -439
- package/dist/ui/config-overlay.d.ts +0 -35
- package/dist/ui/config-overlay.js +0 -707
- package/dist/ui/docs-overlay.d.ts +0 -17
- package/dist/ui/docs-overlay.js +0 -303
- package/dist/ui/footer-v2.d.ts +0 -222
- package/dist/ui/footer-v2.js +0 -1349
- package/dist/ui/help-overlay-v2.d.ts +0 -34
- package/dist/ui/help-overlay-v2.js +0 -309
- package/dist/ui/help-overlay.d.ts +0 -16
- package/dist/ui/help-overlay.js +0 -316
- package/dist/ui/init-overlay-v2.d.ts +0 -34
- package/dist/ui/init-overlay-v2.js +0 -600
- package/dist/ui/init-overlay.d.ts +0 -34
- package/dist/ui/init-overlay.js +0 -604
- package/dist/ui/input-prompt-v2.d.ts +0 -180
- package/dist/ui/input-prompt-v2.js +0 -999
- package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
- package/dist/ui/iteration-limit-overlay-v2.js +0 -114
- package/dist/ui/keys-overlay-v2.d.ts +0 -41
- package/dist/ui/keys-overlay-v2.js +0 -248
- package/dist/ui/mascot-overlay-v2.d.ts +0 -41
- package/dist/ui/mascot-overlay-v2.js +0 -138
- package/dist/ui/mascot-overlay.d.ts +0 -21
- package/dist/ui/mascot-overlay.js +0 -146
- package/dist/ui/model-overlay-v2.d.ts +0 -49
- package/dist/ui/model-overlay-v2.js +0 -118
- package/dist/ui/model-overlay.d.ts +0 -27
- package/dist/ui/model-overlay.js +0 -221
- package/dist/ui/model-warning-overlay.d.ts +0 -30
- package/dist/ui/model-warning-overlay.js +0 -169
- package/dist/ui/new-overlay.d.ts +0 -34
- package/dist/ui/new-overlay.js +0 -604
- package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
- package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
- package/dist/ui/overlay/overlay-types.d.ts +0 -128
- package/dist/ui/overlay/overlay-types.js +0 -22
- package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
- package/dist/ui/overlays/help-overlay-v2.js +0 -198
- package/dist/ui/overlays/index.d.ts +0 -11
- package/dist/ui/overlays/index.js +0 -11
- package/dist/ui/permission-overlay-v2.d.ts +0 -36
- package/dist/ui/permission-overlay-v2.js +0 -380
- package/dist/ui/projects-overlay.d.ts +0 -19
- package/dist/ui/projects-overlay.js +0 -484
- package/dist/ui/theme-overlay-v2.d.ts +0 -42
- package/dist/ui/theme-overlay-v2.js +0 -135
- package/dist/ui/theme-overlay.d.ts +0 -24
- package/dist/ui/theme-overlay.js +0 -127
- package/dist/ui/tools-overlay-v2.d.ts +0 -47
- package/dist/ui/tools-overlay-v2.js +0 -218
- package/dist/ui/tools-overlay.d.ts +0 -34
- package/dist/ui/tools-overlay.js +0 -230
- package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
- package/dist/ui/tutorial-overlay-v2.js +0 -1035
- package/dist/ui/tutorial-overlay.d.ts +0 -11
- package/dist/ui/tutorial-overlay.js +0 -1034
- package/dist/ui/workflow-overlay.d.ts +0 -22
- 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
|
+
}
|