@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,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High Scores System
|
|
3
|
+
*
|
|
4
|
+
* Manages high scores for all games.
|
|
5
|
+
*/
|
|
6
|
+
export interface HighScore {
|
|
7
|
+
name: string;
|
|
8
|
+
score: number;
|
|
9
|
+
level: number;
|
|
10
|
+
date: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ScoresData {
|
|
13
|
+
[gameId: string]: HighScore[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get all scores data
|
|
17
|
+
*/
|
|
18
|
+
export declare function getScoresData(): ScoresData;
|
|
19
|
+
/**
|
|
20
|
+
* Get high scores for a specific game
|
|
21
|
+
*/
|
|
22
|
+
export declare function getHighScores(gameId: string): HighScore[];
|
|
23
|
+
/**
|
|
24
|
+
* Check if a score qualifies for the leaderboard (top 10)
|
|
25
|
+
*/
|
|
26
|
+
export declare function isLeaderboardScore(gameId: string, score: number): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a score beats the current high score (#1)
|
|
29
|
+
* This is the "NEW HIGH SCORE!" condition for coin award
|
|
30
|
+
*/
|
|
31
|
+
export declare function isNewHighScore(gameId: string, score: number): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Check if a score qualifies for the leaderboard
|
|
34
|
+
* @deprecated Use isLeaderboardScore for top-10 check, isNewHighScore for #1 check
|
|
35
|
+
*/
|
|
36
|
+
export declare function isHighScore(gameId: string, score: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Get the rank a score would achieve (1-based, or null if not a high score)
|
|
39
|
+
*/
|
|
40
|
+
export declare function getScoreRank(gameId: string, score: number): number | null;
|
|
41
|
+
/**
|
|
42
|
+
* Add a new high score
|
|
43
|
+
* Returns the rank achieved (1-based) or null if didn't make the leaderboard
|
|
44
|
+
*/
|
|
45
|
+
export declare function addHighScore(gameId: string, name: string, score: number, level: number): number | null;
|
|
46
|
+
/**
|
|
47
|
+
* Get the player's best score for a game
|
|
48
|
+
*/
|
|
49
|
+
export declare function getBestScore(gameId: string): HighScore | null;
|
|
50
|
+
/**
|
|
51
|
+
* Clear high scores for a game (for testing)
|
|
52
|
+
*/
|
|
53
|
+
export declare function clearHighScores(gameId: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* Clear all high scores (for testing)
|
|
56
|
+
*/
|
|
57
|
+
export declare function clearAllHighScores(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Clear cache (for testing)
|
|
60
|
+
*/
|
|
61
|
+
export declare function clearScoresCache(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Format a score number with commas
|
|
64
|
+
*/
|
|
65
|
+
export declare function formatScore(score: number): string;
|
|
66
|
+
/**
|
|
67
|
+
* Format a high score entry for display
|
|
68
|
+
*/
|
|
69
|
+
export declare function formatHighScoreEntry(rank: number, entry: HighScore, maxScoreWidth?: number): string;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High Scores System
|
|
3
|
+
*
|
|
4
|
+
* Manages high scores for all games.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
// =============================================================================
|
|
10
|
+
// Constants
|
|
11
|
+
// =============================================================================
|
|
12
|
+
const CONFIG_DIR = path.join(os.homedir(), '.compilr-dev');
|
|
13
|
+
const SCORES_FILE = path.join(CONFIG_DIR, 'highscores.json');
|
|
14
|
+
const MAX_SCORES_PER_GAME = 10;
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// In-memory cache
|
|
17
|
+
// =============================================================================
|
|
18
|
+
let scoresCache = null;
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Persistence
|
|
21
|
+
// =============================================================================
|
|
22
|
+
function loadFromDisk() {
|
|
23
|
+
try {
|
|
24
|
+
if (fs.existsSync(SCORES_FILE)) {
|
|
25
|
+
const data = fs.readFileSync(SCORES_FILE, 'utf-8');
|
|
26
|
+
return JSON.parse(data);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Ignore errors
|
|
31
|
+
}
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
function saveToDisk(data) {
|
|
35
|
+
try {
|
|
36
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
37
|
+
fs.writeFileSync(SCORES_FILE, JSON.stringify(data, null, 2), 'utf-8');
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error('Failed to save high scores:', error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// Public API
|
|
45
|
+
// =============================================================================
|
|
46
|
+
/**
|
|
47
|
+
* Get all scores data
|
|
48
|
+
*/
|
|
49
|
+
export function getScoresData() {
|
|
50
|
+
if (scoresCache) {
|
|
51
|
+
return scoresCache;
|
|
52
|
+
}
|
|
53
|
+
scoresCache = loadFromDisk();
|
|
54
|
+
return scoresCache;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get high scores for a specific game
|
|
58
|
+
*/
|
|
59
|
+
export function getHighScores(gameId) {
|
|
60
|
+
const data = getScoresData();
|
|
61
|
+
return data[gameId] ?? [];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if a score qualifies for the leaderboard (top 10)
|
|
65
|
+
*/
|
|
66
|
+
export function isLeaderboardScore(gameId, score) {
|
|
67
|
+
const scores = getHighScores(gameId);
|
|
68
|
+
if (scores.length < MAX_SCORES_PER_GAME) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const lowestScore = scores[scores.length - 1].score;
|
|
72
|
+
return score > lowestScore;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if a score beats the current high score (#1)
|
|
76
|
+
* This is the "NEW HIGH SCORE!" condition for coin award
|
|
77
|
+
*/
|
|
78
|
+
export function isNewHighScore(gameId, score) {
|
|
79
|
+
const scores = getHighScores(gameId);
|
|
80
|
+
if (scores.length === 0) {
|
|
81
|
+
return true; // First score is always a high score
|
|
82
|
+
}
|
|
83
|
+
return score > scores[0].score; // Must beat #1
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a score qualifies for the leaderboard
|
|
87
|
+
* @deprecated Use isLeaderboardScore for top-10 check, isNewHighScore for #1 check
|
|
88
|
+
*/
|
|
89
|
+
export function isHighScore(gameId, score) {
|
|
90
|
+
return isLeaderboardScore(gameId, score);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the rank a score would achieve (1-based, or null if not a high score)
|
|
94
|
+
*/
|
|
95
|
+
export function getScoreRank(gameId, score) {
|
|
96
|
+
const scores = getHighScores(gameId);
|
|
97
|
+
// Find where this score would be inserted
|
|
98
|
+
let rank = 1;
|
|
99
|
+
for (const existing of scores) {
|
|
100
|
+
if (score > existing.score) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
rank++;
|
|
104
|
+
}
|
|
105
|
+
// Check if it makes the leaderboard
|
|
106
|
+
if (rank > MAX_SCORES_PER_GAME) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
return rank;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Add a new high score
|
|
113
|
+
* Returns the rank achieved (1-based) or null if didn't make the leaderboard
|
|
114
|
+
*/
|
|
115
|
+
export function addHighScore(gameId, name, score, level) {
|
|
116
|
+
const data = getScoresData();
|
|
117
|
+
const partialData = data;
|
|
118
|
+
const scores = partialData[gameId] ?? [];
|
|
119
|
+
const newScore = {
|
|
120
|
+
name: name.toUpperCase().slice(0, 3).padEnd(3, ' '),
|
|
121
|
+
score,
|
|
122
|
+
level,
|
|
123
|
+
date: new Date().toISOString().split('T')[0],
|
|
124
|
+
};
|
|
125
|
+
// Insert in sorted order (descending by score)
|
|
126
|
+
let insertIndex = 0;
|
|
127
|
+
for (let i = 0; i < scores.length; i++) {
|
|
128
|
+
if (score > scores[i].score) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
insertIndex++;
|
|
132
|
+
}
|
|
133
|
+
scores.splice(insertIndex, 0, newScore);
|
|
134
|
+
// Keep only top scores
|
|
135
|
+
if (scores.length > MAX_SCORES_PER_GAME) {
|
|
136
|
+
scores.length = MAX_SCORES_PER_GAME;
|
|
137
|
+
}
|
|
138
|
+
data[gameId] = scores;
|
|
139
|
+
scoresCache = data;
|
|
140
|
+
saveToDisk(data);
|
|
141
|
+
// Return rank if made the leaderboard
|
|
142
|
+
if (insertIndex < MAX_SCORES_PER_GAME) {
|
|
143
|
+
return insertIndex + 1;
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get the player's best score for a game
|
|
149
|
+
*/
|
|
150
|
+
export function getBestScore(gameId) {
|
|
151
|
+
const scores = getHighScores(gameId);
|
|
152
|
+
return scores.length > 0 ? scores[0] : null;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Clear high scores for a game (for testing)
|
|
156
|
+
*/
|
|
157
|
+
export function clearHighScores(gameId) {
|
|
158
|
+
const data = getScoresData();
|
|
159
|
+
// Create a new object without the specified gameId
|
|
160
|
+
const { [gameId]: _removed, ...rest } = data;
|
|
161
|
+
scoresCache = rest;
|
|
162
|
+
saveToDisk(rest);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Clear all high scores (for testing)
|
|
166
|
+
*/
|
|
167
|
+
export function clearAllHighScores() {
|
|
168
|
+
scoresCache = {};
|
|
169
|
+
saveToDisk({});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Clear cache (for testing)
|
|
173
|
+
*/
|
|
174
|
+
export function clearScoresCache() {
|
|
175
|
+
scoresCache = null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Format a score number with commas
|
|
179
|
+
*/
|
|
180
|
+
export function formatScore(score) {
|
|
181
|
+
return score.toLocaleString();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Format a high score entry for display
|
|
185
|
+
*/
|
|
186
|
+
export function formatHighScoreEntry(rank, entry, maxScoreWidth = 10) {
|
|
187
|
+
const rankStr = String(rank).padStart(2, ' ');
|
|
188
|
+
const scoreStr = formatScore(entry.score).padStart(maxScoreWidth, '.');
|
|
189
|
+
const levelStr = `Lv.${String(entry.level).padStart(2, ' ')}`;
|
|
190
|
+
return `${rankStr}. ${entry.name} ${scoreStr} ${levelStr} ${entry.date}`;
|
|
191
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tetris Board
|
|
3
|
+
*
|
|
4
|
+
* Game board logic - collision detection, line clearing, etc.
|
|
5
|
+
*/
|
|
6
|
+
import type { Piece } from './pieces.js';
|
|
7
|
+
export declare const BOARD_WIDTH = 10;
|
|
8
|
+
export declare const BOARD_HEIGHT = 20;
|
|
9
|
+
export declare const HIDDEN_ROWS = 2;
|
|
10
|
+
export interface Position {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
}
|
|
14
|
+
export type Board = number[][];
|
|
15
|
+
/**
|
|
16
|
+
* Create an empty board
|
|
17
|
+
*/
|
|
18
|
+
export declare function createBoard(): Board;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a position is within bounds
|
|
21
|
+
*/
|
|
22
|
+
export declare function isInBounds(x: number, y: number): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a piece can be placed at a position
|
|
25
|
+
*/
|
|
26
|
+
export declare function canPlace(board: Board, piece: Piece, position: Position): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Place a piece on the board (mutates board)
|
|
29
|
+
*/
|
|
30
|
+
export declare function placePiece(board: Board, piece: Piece, position: Position): void;
|
|
31
|
+
/**
|
|
32
|
+
* Check for and clear completed lines
|
|
33
|
+
* Returns the number of lines cleared
|
|
34
|
+
*/
|
|
35
|
+
export declare function clearLines(board: Board): number;
|
|
36
|
+
/**
|
|
37
|
+
* Get the spawn position for a new piece
|
|
38
|
+
*/
|
|
39
|
+
export declare function getSpawnPosition(piece: Piece): Position;
|
|
40
|
+
/**
|
|
41
|
+
* Get the ghost piece position (where piece would land)
|
|
42
|
+
*/
|
|
43
|
+
export declare function getGhostPosition(board: Board, piece: Piece, position: Position): Position;
|
|
44
|
+
/**
|
|
45
|
+
* Check if the game is over (piece can't spawn)
|
|
46
|
+
*/
|
|
47
|
+
export declare function isGameOver(board: Board, piece: Piece): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Calculate drop distance for hard drop scoring
|
|
50
|
+
*/
|
|
51
|
+
export declare function getDropDistance(board: Board, piece: Piece, position: Position): number;
|
|
52
|
+
/**
|
|
53
|
+
* Clone a board (for preview/undo)
|
|
54
|
+
*/
|
|
55
|
+
export declare function cloneBoard(board: Board): Board;
|
|
56
|
+
/**
|
|
57
|
+
* Get the board with current piece overlaid (for rendering)
|
|
58
|
+
*/
|
|
59
|
+
export declare function getBoardWithPiece(board: Board, piece: Piece | null, position: Position | null, showGhost?: boolean): Board;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tetris Board
|
|
3
|
+
*
|
|
4
|
+
* Game board logic - collision detection, line clearing, etc.
|
|
5
|
+
*/
|
|
6
|
+
// =============================================================================
|
|
7
|
+
// Constants
|
|
8
|
+
// =============================================================================
|
|
9
|
+
export const BOARD_WIDTH = 10;
|
|
10
|
+
export const BOARD_HEIGHT = 20;
|
|
11
|
+
export const HIDDEN_ROWS = 2; // Extra rows above visible area for spawning
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Board Functions
|
|
14
|
+
// =============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Create an empty board
|
|
17
|
+
*/
|
|
18
|
+
export function createBoard() {
|
|
19
|
+
const board = [];
|
|
20
|
+
for (let row = 0; row < BOARD_HEIGHT + HIDDEN_ROWS; row++) {
|
|
21
|
+
board.push(new Array(BOARD_WIDTH).fill(0));
|
|
22
|
+
}
|
|
23
|
+
return board;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check if a position is within bounds
|
|
27
|
+
*/
|
|
28
|
+
export function isInBounds(x, y) {
|
|
29
|
+
return x >= 0 && x < BOARD_WIDTH && y >= 0 && y < BOARD_HEIGHT + HIDDEN_ROWS;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if a piece can be placed at a position
|
|
33
|
+
*/
|
|
34
|
+
export function canPlace(board, piece, position) {
|
|
35
|
+
for (let row = 0; row < piece.shape.length; row++) {
|
|
36
|
+
for (let col = 0; col < piece.shape[row].length; col++) {
|
|
37
|
+
if (piece.shape[row][col]) {
|
|
38
|
+
const boardX = position.x + col;
|
|
39
|
+
const boardY = position.y + row;
|
|
40
|
+
// Check bounds
|
|
41
|
+
if (!isInBounds(boardX, boardY)) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
// Check collision with existing pieces
|
|
45
|
+
if (board[boardY][boardX] !== 0) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Place a piece on the board (mutates board)
|
|
55
|
+
*/
|
|
56
|
+
export function placePiece(board, piece, position) {
|
|
57
|
+
for (let row = 0; row < piece.shape.length; row++) {
|
|
58
|
+
for (let col = 0; col < piece.shape[row].length; col++) {
|
|
59
|
+
if (piece.shape[row][col]) {
|
|
60
|
+
const boardX = position.x + col;
|
|
61
|
+
const boardY = position.y + row;
|
|
62
|
+
if (isInBounds(boardX, boardY)) {
|
|
63
|
+
board[boardY][boardX] = piece.color;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check for and clear completed lines
|
|
71
|
+
* Returns the number of lines cleared
|
|
72
|
+
*/
|
|
73
|
+
export function clearLines(board) {
|
|
74
|
+
let linesCleared = 0;
|
|
75
|
+
// Check from bottom to top
|
|
76
|
+
for (let row = BOARD_HEIGHT + HIDDEN_ROWS - 1; row >= 0; row--) {
|
|
77
|
+
if (isLineFull(board, row)) {
|
|
78
|
+
// Remove the line
|
|
79
|
+
board.splice(row, 1);
|
|
80
|
+
// Add a new empty line at the top
|
|
81
|
+
board.unshift(new Array(BOARD_WIDTH).fill(0));
|
|
82
|
+
linesCleared++;
|
|
83
|
+
// Check the same row again (since we shifted down)
|
|
84
|
+
row++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return linesCleared;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if a line is full
|
|
91
|
+
*/
|
|
92
|
+
function isLineFull(board, row) {
|
|
93
|
+
return board[row].every(cell => cell !== 0);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get the spawn position for a new piece
|
|
97
|
+
*/
|
|
98
|
+
export function getSpawnPosition(piece) {
|
|
99
|
+
// Center horizontally
|
|
100
|
+
const x = Math.floor((BOARD_WIDTH - piece.shape[0].length) / 2);
|
|
101
|
+
// Start at top (in hidden area)
|
|
102
|
+
const y = 0;
|
|
103
|
+
return { x, y };
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the ghost piece position (where piece would land)
|
|
107
|
+
*/
|
|
108
|
+
export function getGhostPosition(board, piece, position) {
|
|
109
|
+
let ghostY = position.y;
|
|
110
|
+
while (canPlace(board, piece, { x: position.x, y: ghostY + 1 })) {
|
|
111
|
+
ghostY++;
|
|
112
|
+
}
|
|
113
|
+
return { x: position.x, y: ghostY };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if the game is over (piece can't spawn)
|
|
117
|
+
*/
|
|
118
|
+
export function isGameOver(board, piece) {
|
|
119
|
+
const spawnPos = getSpawnPosition(piece);
|
|
120
|
+
return !canPlace(board, piece, spawnPos);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Calculate drop distance for hard drop scoring
|
|
124
|
+
*/
|
|
125
|
+
export function getDropDistance(board, piece, position) {
|
|
126
|
+
const ghostPos = getGhostPosition(board, piece, position);
|
|
127
|
+
return ghostPos.y - position.y;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Clone a board (for preview/undo)
|
|
131
|
+
*/
|
|
132
|
+
export function cloneBoard(board) {
|
|
133
|
+
return board.map(row => [...row]);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get the board with current piece overlaid (for rendering)
|
|
137
|
+
*/
|
|
138
|
+
export function getBoardWithPiece(board, piece, position, showGhost = true) {
|
|
139
|
+
const display = cloneBoard(board);
|
|
140
|
+
if (piece && position) {
|
|
141
|
+
// Draw ghost piece first (if enabled)
|
|
142
|
+
if (showGhost) {
|
|
143
|
+
const ghostPos = getGhostPosition(board, piece, position);
|
|
144
|
+
for (let row = 0; row < piece.shape.length; row++) {
|
|
145
|
+
for (let col = 0; col < piece.shape[row].length; col++) {
|
|
146
|
+
if (piece.shape[row][col]) {
|
|
147
|
+
const boardX = ghostPos.x + col;
|
|
148
|
+
const boardY = ghostPos.y + row;
|
|
149
|
+
if (isInBounds(boardX, boardY) && display[boardY][boardX] === 0) {
|
|
150
|
+
display[boardY][boardX] = -piece.color; // Negative for ghost
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Draw actual piece
|
|
157
|
+
for (let row = 0; row < piece.shape.length; row++) {
|
|
158
|
+
for (let col = 0; col < piece.shape[row].length; col++) {
|
|
159
|
+
if (piece.shape[row][col]) {
|
|
160
|
+
const boardX = position.x + col;
|
|
161
|
+
const boardY = position.y + row;
|
|
162
|
+
if (isInBounds(boardX, boardY)) {
|
|
163
|
+
display[boardY][boardX] = piece.color;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return display;
|
|
170
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tetris Game
|
|
3
|
+
*
|
|
4
|
+
* The main Tetris game implementation.
|
|
5
|
+
*/
|
|
6
|
+
import { GameBase } from "../game-base.js";
|
|
7
|
+
import { type Board, type Position } from "./board.js";
|
|
8
|
+
import { type Piece, type PieceType } from "./pieces.js";
|
|
9
|
+
export interface TetrisState {
|
|
10
|
+
board: Board;
|
|
11
|
+
currentPiece: Piece | null;
|
|
12
|
+
nextPiece: Piece | null;
|
|
13
|
+
heldPiece: Piece | null;
|
|
14
|
+
canHold: boolean;
|
|
15
|
+
position: Position;
|
|
16
|
+
rotation: number;
|
|
17
|
+
score: number;
|
|
18
|
+
level: number;
|
|
19
|
+
lines: number;
|
|
20
|
+
gameOver: boolean;
|
|
21
|
+
pieceBag: PieceType[];
|
|
22
|
+
}
|
|
23
|
+
export declare class TetrisGame extends GameBase {
|
|
24
|
+
private readonly state;
|
|
25
|
+
private dropTimer;
|
|
26
|
+
private dropInterval;
|
|
27
|
+
private readonly colors;
|
|
28
|
+
private softDropping;
|
|
29
|
+
private enteringInitials;
|
|
30
|
+
private initials;
|
|
31
|
+
private initialIndex;
|
|
32
|
+
private finalScore;
|
|
33
|
+
private finalLevel;
|
|
34
|
+
private showingPreGame;
|
|
35
|
+
private isNewRecord;
|
|
36
|
+
constructor();
|
|
37
|
+
/**
|
|
38
|
+
* Create initial game state
|
|
39
|
+
*/
|
|
40
|
+
private createInitialState;
|
|
41
|
+
/**
|
|
42
|
+
* Get next piece from bag (refill if empty)
|
|
43
|
+
*/
|
|
44
|
+
private getNextPiece;
|
|
45
|
+
/**
|
|
46
|
+
* Spawn a new piece
|
|
47
|
+
*/
|
|
48
|
+
private spawnPiece;
|
|
49
|
+
/**
|
|
50
|
+
* Move piece horizontally
|
|
51
|
+
*/
|
|
52
|
+
private move;
|
|
53
|
+
/**
|
|
54
|
+
* Move piece down (soft drop)
|
|
55
|
+
*/
|
|
56
|
+
private moveDown;
|
|
57
|
+
/**
|
|
58
|
+
* Rotate piece
|
|
59
|
+
*/
|
|
60
|
+
private rotate;
|
|
61
|
+
/**
|
|
62
|
+
* Hard drop - instantly place piece
|
|
63
|
+
*/
|
|
64
|
+
private hardDrop;
|
|
65
|
+
/**
|
|
66
|
+
* Lock piece in place and check for line clears
|
|
67
|
+
* Returns true if game ended
|
|
68
|
+
*/
|
|
69
|
+
private lockPiece;
|
|
70
|
+
/**
|
|
71
|
+
* Hold piece
|
|
72
|
+
*/
|
|
73
|
+
private holdPiece;
|
|
74
|
+
/**
|
|
75
|
+
* Update drop speed based on level
|
|
76
|
+
*/
|
|
77
|
+
private updateDropSpeed;
|
|
78
|
+
/**
|
|
79
|
+
* Handle game over - check for high score
|
|
80
|
+
*/
|
|
81
|
+
private handleGameOver;
|
|
82
|
+
/**
|
|
83
|
+
* Submit high score
|
|
84
|
+
*/
|
|
85
|
+
private submitHighScore;
|
|
86
|
+
protected onStart(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Start the actual game (after pre-game screen)
|
|
89
|
+
*/
|
|
90
|
+
private startGame;
|
|
91
|
+
protected onQuit(): void;
|
|
92
|
+
protected onPause(): void;
|
|
93
|
+
protected onResume(): void;
|
|
94
|
+
protected onKeyPress(key: string, raw: Buffer): void;
|
|
95
|
+
private handleInitialsInput;
|
|
96
|
+
protected update(delta: number): void;
|
|
97
|
+
protected render(): void;
|
|
98
|
+
private drawBoard;
|
|
99
|
+
private drawSidePanel;
|
|
100
|
+
private drawPiecePreview;
|
|
101
|
+
private drawPauseOverlay;
|
|
102
|
+
private drawGameOverOverlay;
|
|
103
|
+
private drawHighScoreEntry;
|
|
104
|
+
private drawPreGameScreen;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Launch Tetris game
|
|
108
|
+
*/
|
|
109
|
+
export declare function playTetris(): Promise<void>;
|