@compilr-dev/cli 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +254 -68
- 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 +134 -4
- package/dist/agent.js +345 -166
- package/dist/anchors/index.d.ts +9 -0
- package/dist/anchors/index.js +9 -0
- package/dist/anchors/project-anchors.d.ts +79 -0
- package/dist/anchors/project-anchors.js +202 -0
- 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/index.d.ts +2 -1
- 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.d.ts +13 -0
- package/dist/commands-v2/handlers/context.js +533 -0
- package/dist/commands-v2/handlers/core.d.ts +14 -0
- package/dist/commands-v2/handlers/core.js +290 -0
- package/dist/commands-v2/handlers/debug.d.ts +11 -0
- package/dist/commands-v2/handlers/debug.js +177 -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 +25 -0
- package/dist/commands-v2/handlers/index.js +63 -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.d.ts +22 -0
- package/dist/commands-v2/handlers/project.js +1035 -0
- 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 +17 -0
- package/dist/commands-v2/handlers/settings.js +417 -0
- 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 +14 -0
- package/dist/commands-v2/index.js +18 -0
- package/dist/commands-v2/registry.d.ts +52 -0
- package/dist/commands-v2/registry.js +114 -0
- package/dist/commands-v2/types.d.ts +153 -0
- package/dist/commands-v2/types.js +7 -0
- package/dist/commands.js +123 -7
- 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 +5 -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 +615 -179
- package/dist/input-handlers/index.d.ts +7 -0
- package/dist/input-handlers/index.js +7 -0
- package/dist/input-handlers/memory-handler.d.ts +26 -0
- package/dist/input-handlers/memory-handler.js +69 -0
- 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.d.ts +63 -0
- package/dist/repl-helpers.js +319 -0
- package/dist/repl-v2.d.ts +554 -0
- package/dist/repl-v2.js +3286 -0
- 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 +156 -13
- package/dist/settings/index.js +377 -24
- package/dist/settings/mcp-config.d.ts +76 -0
- package/dist/settings/mcp-config.js +143 -0
- package/dist/settings/paths.d.ts +114 -0
- package/dist/settings/paths.js +270 -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 -58
- package/dist/templates/config-json.d.ts +1 -25
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.js +35 -75
- package/dist/themes/colors.js +3 -1
- package/dist/themes/registry.d.ts +5 -36
- package/dist/themes/registry.js +11 -95
- package/dist/themes/types.d.ts +3 -38
- package/dist/themes/types.js +2 -2
- package/dist/tool-names.d.ts +108 -0
- package/dist/tool-names.js +227 -0
- package/dist/tools/anchor-tools.d.ts +31 -0
- package/dist/tools/anchor-tools.js +255 -0
- package/dist/tools/artifact-tools.d.ts +42 -0
- package/dist/tools/artifact-tools.js +328 -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-wrappers.d.ts +56 -0
- package/dist/tools/backlog-wrappers.js +353 -0
- package/dist/tools/backlog.d.ts +2 -2
- package/dist/tools/backlog.js +2 -2
- package/dist/tools/db-tools.d.ts +12 -0
- package/dist/tools/db-tools.js +14 -0
- 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/document-db.d.ts +43 -0
- package/dist/tools/document-db.js +220 -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/plan-tools.d.ts +54 -0
- package/dist/tools/plan-tools.js +338 -0
- package/dist/tools/platform-adapter.d.ts +29 -0
- package/dist/tools/platform-adapter.js +394 -0
- package/dist/tools/project-db.d.ts +34 -0
- package/dist/tools/project-db.js +39 -0
- package/dist/tools/recall-work-tool.d.ts +18 -0
- package/dist/tools/recall-work-tool.js +82 -0
- package/dist/tools/workitem-db.d.ts +135 -0
- package/dist/tools/workitem-db.js +730 -0
- package/dist/tools.d.ts +67 -2
- package/dist/tools.js +238 -38
- package/dist/ui/ask-user-overlay.d.ts +2 -2
- package/dist/ui/ask-user-overlay.js +443 -535
- package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
- package/dist/ui/ask-user-simple-overlay.js +182 -209
- package/dist/ui/autocomplete-controller.d.ts +42 -0
- package/dist/ui/autocomplete-controller.js +384 -0
- package/dist/ui/base/index.d.ts +26 -0
- package/dist/ui/base/index.js +33 -0
- package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
- package/dist/ui/base/inline-overlay-utils.js +320 -0
- package/dist/ui/base/inline-overlay.d.ts +159 -0
- package/dist/ui/base/inline-overlay.js +257 -0
- package/dist/ui/base/key-utils.d.ts +15 -0
- package/dist/ui/base/key-utils.js +30 -0
- package/dist/ui/base/overlay-base-v2.d.ts +203 -0
- package/dist/ui/base/overlay-base-v2.js +260 -0
- package/dist/ui/base/overlay-base.d.ts +156 -0
- package/dist/ui/base/overlay-base.js +238 -0
- package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
- package/dist/ui/base/overlay-lifecycle.js +159 -0
- package/dist/ui/base/overlay-types.d.ts +185 -0
- package/dist/ui/base/overlay-types.js +7 -0
- package/dist/ui/base/render-utils.d.ts +27 -0
- package/dist/ui/base/render-utils.js +36 -0
- package/dist/ui/base/screen-stack.d.ts +148 -0
- package/dist/ui/base/screen-stack.js +184 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +118 -0
- package/dist/ui/base/tabbed-list-overlay-v2.js +335 -0
- package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
- package/dist/ui/base/tabbed-list-overlay.js +369 -0
- package/dist/ui/constants/labels.d.ts +14 -0
- package/dist/ui/constants/labels.js +51 -0
- package/dist/ui/conversation-store.d.ts +55 -0
- package/dist/ui/conversation-store.js +107 -0
- package/dist/ui/conversation.d.ts +75 -4
- package/dist/ui/conversation.js +376 -165
- package/dist/ui/diff.d.ts +7 -1
- package/dist/ui/diff.js +85 -48
- package/dist/ui/ephemeral.d.ts +1 -1
- package/dist/ui/ephemeral.js +4 -10
- package/dist/ui/features/index.d.ts +34 -0
- package/dist/ui/features/index.js +34 -0
- package/dist/ui/features/input-feature.d.ts +85 -0
- package/dist/ui/features/input-feature.js +238 -0
- package/dist/ui/features/list-feature.d.ts +155 -0
- package/dist/ui/features/list-feature.js +244 -0
- package/dist/ui/features/pagination-feature.d.ts +154 -0
- package/dist/ui/features/pagination-feature.js +238 -0
- package/dist/ui/features/search-feature.d.ts +148 -0
- package/dist/ui/features/search-feature.js +185 -0
- package/dist/ui/features/tab-feature.d.ts +194 -0
- package/dist/ui/features/tab-feature.js +307 -0
- 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 +181 -7
- package/dist/ui/footer.js +523 -74
- package/dist/ui/guardrail-overlay.d.ts +29 -0
- package/dist/ui/guardrail-overlay.js +145 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -3
- package/dist/ui/input-controller.d.ts +51 -0
- package/dist/ui/input-controller.js +176 -0
- package/dist/ui/input-prompt.d.ts +135 -33
- package/dist/ui/input-prompt.js +728 -337
- package/dist/ui/iteration-limit-overlay.d.ts +2 -2
- package/dist/ui/iteration-limit-overlay.js +92 -128
- package/dist/ui/keyboard-handler.d.ts +57 -0
- package/dist/ui/keyboard-handler.js +557 -0
- package/dist/ui/keys-overlay.d.ts +1 -0
- package/dist/ui/keys-overlay.js +203 -141
- package/dist/ui/line-utils.d.ts +88 -0
- package/dist/ui/line-utils.js +150 -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 +157 -0
- package/dist/ui/live-region.js +379 -0
- package/dist/ui/mascot/expressions.d.ts +32 -0
- package/dist/ui/mascot/expressions.js +213 -0
- package/dist/ui/mascot/index.d.ts +8 -0
- package/dist/ui/mascot/index.js +8 -0
- package/dist/ui/mascot/renderer.d.ts +19 -0
- package/dist/ui/mascot/renderer.js +132 -0
- 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.d.ts +45 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +814 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +749 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
- 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.d.ts +72 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +581 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
- 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 +52 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +681 -0
- 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.d.ts +33 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +439 -0
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +111 -0
- package/dist/ui/overlay/impl/config-overlay-v2.js +718 -0
- 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 +57 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +382 -0
- 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.d.ts +45 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +117 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +84 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1112 -0
- 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/guardrail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +57 -0
- package/dist/ui/overlay/impl/help-overlay-v2.js +287 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
- 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/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -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 +93 -0
- package/dist/ui/overlay/impl/model-overlay-v2.js +1143 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +108 -0
- package/dist/ui/overlay/impl/new-overlay-v2.js +1243 -0
- 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.d.ts +36 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
- 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 +37 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +733 -0
- 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/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +214 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +212 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +641 -0
- package/dist/ui/overlay/index.d.ts +52 -0
- package/dist/ui/overlay/index.js +54 -0
- package/dist/ui/overlay/key-utils.d.ts +6 -0
- package/dist/ui/overlay/key-utils.js +6 -0
- package/dist/ui/overlay/types.d.ts +140 -0
- package/dist/ui/overlay/types.js +22 -0
- package/dist/ui/overlay-manager.d.ts +43 -0
- package/dist/ui/overlay-manager.js +238 -0
- package/dist/ui/overlays.d.ts +0 -4
- package/dist/ui/overlays.js +4 -460
- package/dist/ui/permission-overlay.d.ts +1 -1
- package/dist/ui/permission-overlay.js +189 -300
- package/dist/ui/providers/types.d.ts +178 -0
- package/dist/ui/providers/types.js +9 -0
- package/dist/ui/render-modes.d.ts +36 -0
- package/dist/ui/render-modes.js +44 -0
- package/dist/ui/startup-menu.d.ts +36 -0
- package/dist/ui/startup-menu.js +236 -0
- package/dist/ui/status-bar-controller.d.ts +33 -0
- package/dist/ui/status-bar-controller.js +99 -0
- package/dist/ui/subagent-renderer.d.ts +117 -0
- package/dist/ui/subagent-renderer.js +318 -0
- package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
- package/dist/ui/terminal-autocomplete-utils.js +83 -0
- package/dist/ui/terminal-codes.d.ts +94 -0
- package/dist/ui/terminal-codes.js +124 -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 +220 -0
- package/dist/ui/terminal-renderer.js +750 -0
- package/dist/ui/terminal-types.d.ts +179 -0
- package/dist/ui/terminal-types.js +34 -0
- package/dist/ui/terminal-ui.d.ts +331 -0
- package/dist/ui/terminal-ui.js +819 -0
- package/dist/ui/terminal.d.ts +20 -0
- package/dist/ui/terminal.js +72 -0
- package/dist/ui/todo-zone.d.ts +19 -1
- package/dist/ui/todo-zone.js +124 -38
- package/dist/ui/tool-formatters.d.ts +16 -0
- package/dist/ui/tool-formatters.js +1027 -0
- 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/debug-log.d.ts +28 -0
- package/dist/utils/debug-log.js +57 -0
- 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 +39 -17
- package/dist/utils/open-browser.d.ts +5 -0
- package/dist/utils/open-browser.js +32 -0
- package/dist/utils/path-safety.d.ts +56 -0
- package/dist/utils/path-safety.js +240 -0
- 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/dist/workflow/guided-mode-injector.d.ts +42 -0
- package/dist/workflow/guided-mode-injector.js +191 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/step-criteria.d.ts +62 -0
- package/dist/workflow/step-criteria.js +150 -0
- package/dist/workflow/step-tracker.d.ts +92 -0
- package/dist/workflow/step-tracker.js +141 -0
- package/package.json +32 -12
- package/dist/index.old.d.ts +0 -7
- package/dist/index.old.js +0 -1014
- package/dist/repl.d.ts +0 -121
- package/dist/repl.js +0 -1878
- 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/ui/agents-overlay.d.ts +0 -12
- package/dist/ui/agents-overlay.js +0 -501
- package/dist/ui/arch-type-overlay.d.ts +0 -20
- package/dist/ui/arch-type-overlay.js +0 -229
- package/dist/ui/backlog-overlay.d.ts +0 -17
- package/dist/ui/backlog-overlay.js +0 -786
- package/dist/ui/commands-overlay.d.ts +0 -11
- package/dist/ui/commands-overlay.js +0 -410
- package/dist/ui/config-overlay.d.ts +0 -34
- package/dist/ui/config-overlay.js +0 -977
- package/dist/ui/init-overlay.d.ts +0 -24
- package/dist/ui/init-overlay.js +0 -525
- package/dist/ui/input-prompt-v2.d.ts +0 -179
- package/dist/ui/input-prompt-v2.js +0 -991
- package/dist/ui/model-warning-overlay.d.ts +0 -30
- package/dist/ui/model-warning-overlay.js +0 -171
- package/dist/ui/tools-overlay.d.ts +0 -26
- package/dist/ui/tools-overlay.js +0 -278
- package/dist/ui/tutorial-overlay.d.ts +0 -10
- package/dist/ui/tutorial-overlay.js +0 -936
|
@@ -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
|
+
}
|
|
@@ -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;
|