{"_id":"@antogin/werewolf-engine","_rev":"5-51a9a24652247ec986af65ed52faeafe","name":"@antogin/werewolf-engine","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"@antogin/werewolf-engine","version":"1.0.0","_id":"@antogin/werewolf-engine@1.0.0","maintainers":[{"name":"antogin","email":"georges.indrianjafy@gmail.com"}],"dist":{"shasum":"3de3ce24eb775cceb215db5ab6cdc28864b9e6f0","tarball":"https://registry.npmjs.org/@antogin/werewolf-engine/-/werewolf-engine-1.0.0.tgz","fileCount":118,"integrity":"sha512-Nk78wNIsMpV6BAGlQmIQi0XkaKCIe8BB0/7JrcIsBQ0gjSf0uwnnGHAlwDlEEJz/XIG4R7ulcri/TF2+b7XeZw==","signatures":[{"sig":"MEYCIQDYQJJgxR75iHYJFkosTJ+ER/LfHZEtbqxZR/AMWiJ31wIhAPbvlfsxWN2L9mFZf06VITB/t++q/C9GLwIdDU2+dBo3","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143795},"jest":{"roots":["<rootDir>/src"],"preset":"ts-jest","testMatch":["**/__tests__/**/*.test.ts"],"testEnvironment":"node"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"906f9665685cd4c3f2f59485feabca48bdda2358","scripts":{"lint":"eslint . --ext .ts","test":"jest --setupFiles dotenv/config","build":"npm run clean && tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"npm run build","lint:fix":"eslint . --ext .ts --fix","test:watch":"jest --watch --setupFiles dotenv/config","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"antogin","email":"georges.indrianjafy@gmail.com"},"_npmVersion":"10.8.1","description":"Event-sourced werewolf game engine","directories":{},"_nodeVersion":"20.16.0","dependencies":{"uuid":"^11.0.3","dotenv":"^16.4.7","@types/uuid":"^10.0.0","@supabase/supabase-js":"^2.47.10"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.1","rimraf":"^6.0.1","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","npm-run-all":"^4.1.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/werewolf-engine_1.0.0_1735489300853_0.5365180280776027","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@antogin/werewolf-engine","version":"1.0.1","_id":"@antogin/werewolf-engine@1.0.1","maintainers":[{"name":"antogin","email":"georges.indrianjafy@gmail.com"}],"dist":{"shasum":"f4aa60965b461be3bae1027f643c2ccaca5ac69a","tarball":"https://registry.npmjs.org/@antogin/werewolf-engine/-/werewolf-engine-1.0.1.tgz","fileCount":118,"integrity":"sha512-T07/eGvYp1sSkm3G7+w8HNeqEbYy49edjHTtSlbEVK+UVEKHj/cltLYX7Qg0n2uytFtHp9/ucJwrxkud/Fvh8Q==","signatures":[{"sig":"MEQCIAPYLf1SQP2Bw7zwILFXw6cQHnWGHykrsUrRW/sd7cmkAiAWgdor97B+1VZu/xE846hZhehvY6QkMsYhAiOcCeKOqQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":143861},"jest":{"roots":["<rootDir>/src"],"preset":"ts-jest","testMatch":["**/__tests__/**/*.test.ts"],"testEnvironment":"node"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"b84f22761779027f53f520487d222432003b46c9","scripts":{"lint":"eslint . --ext .ts","test":"jest --setupFiles dotenv/config","build":"npm run clean && tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"npm run build","lint:fix":"eslint . --ext .ts --fix","test:watch":"jest --watch --setupFiles dotenv/config","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"antogin","email":"georges.indrianjafy@gmail.com"},"_npmVersion":"10.8.1","description":"Event-sourced werewolf game engine","directories":{},"_nodeVersion":"20.16.0","dependencies":{"uuid":"^11.0.3","dotenv":"^16.4.7","@types/uuid":"^10.0.0","@supabase/supabase-js":"^2.47.10"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.1","rimraf":"^6.0.1","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","npm-run-all":"^4.1.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/werewolf-engine_1.0.1_1735494984481_0.5965498654363472","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@antogin/werewolf-engine","version":"1.0.2","_id":"@antogin/werewolf-engine@1.0.2","maintainers":[{"name":"antogin","email":"georges.indrianjafy@gmail.com"}],"dist":{"shasum":"799c41d864cf911cea0a1fdb3f53a51ad2d594b8","tarball":"https://registry.npmjs.org/@antogin/werewolf-engine/-/werewolf-engine-1.0.2.tgz","fileCount":120,"integrity":"sha512-s8SsTAreKTQL0b0HfOxOGZssjTYhF/dW3+bXqluyM72A2yTy5gmQARE+AE34Y51pc+PrZGtKPkQFj4Qnxlpyzw==","signatures":[{"sig":"MEYCIQDYIT+NOTMg5wyrFd7oEBTAGbMe3k2YnH49FtnBFLyjtgIhAPAlfcz1G72GC4Nnpxi9DgQfOuG7L3BEDaULtQZHyYkw","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145433},"jest":{"roots":["<rootDir>/src"],"preset":"ts-jest","testMatch":["**/__tests__/**/*.test.ts"],"testEnvironment":"node"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c549dc00ec99fbb6de6f42e0ff8d11cbcfa9c235","scripts":{"lint":"eslint . --ext .ts","test":"jest --setupFiles dotenv/config","build":"npm run clean && tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"npm run build","lint:fix":"eslint . --ext .ts --fix","test:watch":"jest --watch --setupFiles dotenv/config","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"antogin","email":"georges.indrianjafy@gmail.com"},"_npmVersion":"10.8.1","description":"Event-sourced werewolf game engine","directories":{},"_nodeVersion":"20.16.0","dependencies":{"uuid":"^11.0.3","dotenv":"^16.4.7","@types/uuid":"^10.0.0","@supabase/supabase-js":"^2.47.10"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.1","rimraf":"^6.0.1","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","npm-run-all":"^4.1.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/werewolf-engine_1.0.2_1735501859150_0.4731338745272313","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@antogin/werewolf-engine","version":"1.0.3","_id":"@antogin/werewolf-engine@1.0.3","maintainers":[{"name":"antogin","email":"georges.indrianjafy@gmail.com"}],"dist":{"shasum":"64837e23b0c91dc16a816ab4a8ec30cb725ee5b6","tarball":"https://registry.npmjs.org/@antogin/werewolf-engine/-/werewolf-engine-1.0.3.tgz","fileCount":120,"integrity":"sha512-rvuoucDLtuE/zuAjzoCxtES80wz+36HOhwzmUUHWXomzngnJ2dKRVhLU9fAFvRKFfI1Tav7Iiugpehea4b9LvQ==","signatures":[{"sig":"MEYCIQC7qNkx0ef0nqQ+jkpn+WvG/qKEAJw6LQKT4JM8st0WrgIhAIjDuZzVo32b1Xc39vlzL7zfyDKFVYPy0nH2LclblqKd","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":145751},"jest":{"roots":["<rootDir>/src"],"preset":"ts-jest","testMatch":["**/__tests__/**/*.test.ts"],"testEnvironment":"node"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"290293e34e20d84e2c70013f96c31c6a6d6b6be3","scripts":{"lint":"eslint . --ext .ts","test":"jest --setupFiles dotenv/config","build":"npm run clean && tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"npm run build","lint:fix":"eslint . --ext .ts --fix","test:watch":"jest --watch --setupFiles dotenv/config","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"antogin","email":"georges.indrianjafy@gmail.com"},"_npmVersion":"10.8.1","description":"Event-sourced werewolf game engine","directories":{},"_nodeVersion":"20.16.0","dependencies":{"uuid":"^11.0.3","dotenv":"^16.4.7","@types/uuid":"^10.0.0","@supabase/supabase-js":"^2.47.10"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.1","rimraf":"^6.0.1","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","npm-run-all":"^4.1.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/werewolf-engine_1.0.3_1735504324737_0.5262339560691616","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@antogin/werewolf-engine","version":"1.0.4","_id":"@antogin/werewolf-engine@1.0.4","maintainers":[{"name":"antogin","email":"georges.indrianjafy@gmail.com"}],"dist":{"shasum":"54496ae306ca66eb29de95a1dc97705ce1ed3aee","tarball":"https://registry.npmjs.org/@antogin/werewolf-engine/-/werewolf-engine-1.0.4.tgz","fileCount":120,"integrity":"sha512-Y1jk2R+cyNMxrtVvzgX90Wta7qNvoXSPEhlL0nt9VH1oooruttuca32DlrwmpFkfTswmigzyzdEv7YwHtVdj5A==","signatures":[{"sig":"MEQCIGw7rLmoWFTtiaNaa+iRqm72yehUW8dBTBWVilnHpufsAiAnxMHgYAsyp8pgj9v6+c+yLDavcdamWi33rq17+5SFdg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":146387},"jest":{"roots":["<rootDir>/src"],"preset":"ts-jest","testMatch":["**/__tests__/**/*.test.ts"],"testEnvironment":"node"},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"290293e34e20d84e2c70013f96c31c6a6d6b6be3","scripts":{"lint":"eslint . --ext .ts","test":"jest --setupFiles dotenv/config","build":"npm run clean && tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"npm run build","lint:fix":"eslint . --ext .ts --fix","test:watch":"jest --watch --setupFiles dotenv/config","format:check":"prettier --check \"src/**/*.ts\""},"_npmUser":{"name":"antogin","email":"georges.indrianjafy@gmail.com"},"_npmVersion":"10.8.1","description":"Event-sourced werewolf game engine","directories":{},"_nodeVersion":"20.16.0","dependencies":{"uuid":"^11.0.3","dotenv":"^16.4.7","@types/uuid":"^10.0.0","@supabase/supabase-js":"^2.47.10"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.1","rimraf":"^6.0.1","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","typescript":"^5.7.2","@types/jest":"^29.5.14","@types/node":"^22.10.2","npm-run-all":"^4.1.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^7.18.0","@typescript-eslint/eslint-plugin":"^7.18.0"},"_npmOperationalInternal":{"tmp":"tmp/werewolf-engine_1.0.4_1735505438714_0.34571424052815214","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@antogin/werewolf-engine","version":"1.0.5","description":"Event-sourced werewolf game engine","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"clean":"rimraf dist","build":"npm run clean && tsc","test":"jest --setupFiles dotenv/config","test:watch":"jest --watch --setupFiles dotenv/config","prepare":"npm run build","lint":"eslint . --ext .ts","lint:fix":"eslint . --ext .ts --fix","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\""},"jest":{"preset":"ts-jest","testEnvironment":"node","roots":["<rootDir>/src"],"testMatch":["**/__tests__/**/*.test.ts"]},"devDependencies":{"@types/jest":"^29.5.14","@types/node":"^22.10.2","@typescript-eslint/eslint-plugin":"^7.18.0","@typescript-eslint/parser":"^7.18.0","eslint":"^8.57.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","jest":"^29.7.0","npm-run-all":"^4.1.5","prettier":"^3.4.2","rimraf":"^6.0.1","ts-jest":"^29.2.5","ts-node":"^10.9.2","typescript":"^5.7.2"},"dependencies":{"@supabase/supabase-js":"^2.47.10","@types/uuid":"^10.0.0","dotenv":"^16.4.7","uuid":"^11.0.3"},"_id":"@antogin/werewolf-engine@1.0.5","gitHead":"290293e34e20d84e2c70013f96c31c6a6d6b6be3","_nodeVersion":"20.16.0","_npmVersion":"10.8.1","dist":{"integrity":"sha512-jE9XT0SvyvBBf7tehHHjeRQAfWsk/hc3IBz90nmBXAmWyqwebT4rXgaUg1uBOksPRklRNm85ZzvM97cihhpVCw==","shasum":"665c5e2ee01e9933430517625b22552fe1844ebf","tarball":"https://registry.npmjs.org/@antogin/werewolf-engine/-/werewolf-engine-1.0.5.tgz","fileCount":120,"unpackedSize":146404,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCexmnX0vV/YTM/+ZtAz9W1GbGOpg/78JZuKlwk3iZ7rgIgViXaWuADWOYcfXq/h6gSLl+b06luvDIyRVjK8nJjhhI="}]},"_npmUser":{"name":"antogin","email":"georges.indrianjafy@gmail.com"},"directories":{},"maintainers":[{"name":"antogin","email":"georges.indrianjafy@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/werewolf-engine_1.0.5_1735574292889_0.2282753467393266"},"_hasShrinkwrap":false}},"time":{"created":"2024-12-29T16:21:40.762Z","modified":"2024-12-30T15:58:13.252Z","1.0.0":"2024-12-29T16:21:41.052Z","1.0.1":"2024-12-29T17:56:24.681Z","1.0.2":"2024-12-29T19:50:59.387Z","1.0.3":"2024-12-29T20:32:04.939Z","1.0.4":"2024-12-29T20:50:38.927Z","1.0.5":"2024-12-30T15:58:13.103Z"},"description":"Event-sourced werewolf game engine","maintainers":[{"name":"antogin","email":"georges.indrianjafy@gmail.com"}],"readme":"# Werewolf Game Engine\n\nWelcome to the Werewolf Game Engine, a sophisticated implementation of the classic social deduction game using Event Sourcing and Command Query Responsibility Segregation (CQRS) patterns. This document explains our architectural decisions and how they enable a robust, scalable, and maintainable game engine.\n\n## Core Architecture\n\nOur Werewolf Game Engine is built on two fundamental architectural patterns: Event Sourcing and CQRS. Let's explore why we chose these patterns and how they benefit our implementation.\n\n### Event Sourcing: Capturing Game State\n\nIn traditional game implementations, you might store the current state of the game in a database. However, Werewolf is a game where the history of actions is crucial. Players need to know what happened during the night, who voted for whom, and how the game progressed. Event Sourcing addresses these needs perfectly by storing every game action as an immutable event.\n\nConsider this example of how events tell the story of a game:\n```typescript\n[\n  { type: \"GameCreated\", timestamp: \"2024-01-01T20:00:00Z\", moderatorId: \"mod1\" },\n  { type: \"PlayerJoined\", timestamp: \"2024-01-01T20:01:00Z\", playerId: \"p1\" },\n  { type: \"RoleAssigned\", timestamp: \"2024-01-01T20:05:00Z\", playerId: \"p1\", role: \"WEREWOLF\" },\n  { type: \"NightPhaseStarted\", timestamp: \"2024-01-01T20:10:00Z\", nightNumber: 1 }\n]\n```\n\nThis approach provides several benefits:\n1. Complete audit trail of the game\n2. Ability to reconstruct game state at any point\n3. Built-in support for game replay and spectator mode\n4. Natural handling of game saves and loading\n\n### CQRS: Separating Game Actions from Views\n\nWerewolf is a game of hidden information. Werewolves know who other werewolves are, the Seer learns player roles gradually, and villagers operate with limited information. CQRS allows us to maintain these different views efficiently by separating how we handle game actions (commands) from how we present information to players (queries).\n\nOur command side handles game actions:\n- Starting the game\n- Casting votes\n- Using special abilities\n- Making accusations\n\nWhile our query side manages different views for:\n- Werewolf team members\n- Individual special roles (Seer, Witch)\n- Villagers\n- Spectators\n- Game moderators\n\n## Event Design Philosophy\n\nOur events are designed around several key principles:\n\n### Complete Information\nEvery event contains all the information needed to understand what happened. For example, a WerewolfVoteCast event includes:\n- Who cast the vote (werewolfId)\n- Who was voted for (targetId)\n- When it happened (timestamp)\n- The game context (gameId)\n\n### Immutable History\nEvents are never modified or deleted. If a player changes their vote, we create a new VoteChanged event rather than modifying the original vote. This preserves the complete game history and allows for accurate replay.\n\n### Temporal Consistency\nAll events include timestamps and version numbers to maintain proper ordering. This is crucial for night actions where the Witch must act after the Werewolves, or for resolving simultaneous day phase votes.\n\n## State Management\n\nThe game state is managed through distinct phases, each with its own set of valid commands and resulting events:\n\n### Game Setup Phase\n- Player joining and role assignment\n- Game configuration and settings\n- Initial state validation\n\n### Night Phase\n- Sequential special role actions\n- Coordinated werewolf voting\n- Death and save resolutions\n\n### Day Phase\n- Discussion and accusation tracking\n- Village voting system\n- Execution resolution\n\n### Win Condition Checking\n- Team balance verification\n- Special win conditions\n- Game end state management\n\n## Handling Edge Cases\n\nOur architecture specifically addresses common game challenges:\n\n### Disconnections\nThe event-sourced nature of our system means players can disconnect and reconnect seamlessly. Their game state is reconstructed from the event stream, ensuring they don't miss any information they're allowed to know.\n\n### Concurrent Actions\nWe handle multiple werewolves voting simultaneously through a two-phase voting system:\n1. Individual votes are recorded as WerewolfVoteCast events\n2. Once all votes are in, a WerewolfVoteCompleted event determines the final victim\n\n### Time Management\nGame phases can have optional time limits, managed through:\n- Phase start events with duration\n- Timer events for phase progression\n- Forced resolution events for expired timers\n\n## Read Models\n\nOur read models are tailored to different player roles and game phases:\n\n### Player-Specific Views\nEach role gets a customized view of the game state. For example:\n- Werewolves see other werewolves but not the Seer's discoveries\n- The Seer accumulates knowledge of player roles over time\n- Villagers only see public information and voting results\n\n### Game Progress Views\n- Current game phase and timer status\n- Player alive/dead status\n- Vote tallies and results\n- Game history for spectators\n\n\n### Game Flow\n\nHere is diagram of the game flow:\n```\nstateDiagram-v2\n    [*] --> GameCreated: CreateGame\n    GameCreated --> PlayersJoining: StartJoining\n    \n    state PlayersJoining {\n        [*] --> WaitingForPlayers\n        WaitingForPlayers --> EnoughPlayers: PlayerJoined\n        EnoughPlayers --> [*]: AssignRoles\n    }\n    \n    PlayersJoining --> NightPhase: GameStarted\n    \n    state NightPhase {\n        [*] --> WerewolvesAction\n        WerewolvesAction --> SeerAction: WerewolvesChoseVictim\n        SeerAction --> WitchAction: SeerCheckedPlayer\n        \n        state WitchAction {\n            [*] --> PotionChoice\n            PotionChoice --> HealingChoice: WitchWakeCalled\n            HealingChoice --> PoisonChoice: WitchHealingDecided\n            PoisonChoice --> [*]: WitchPoisonDecided\n        }\n    }\n    \n    NightPhase --> DayPhase: NightResolved\n    \n    state DayPhase {\n        [*] --> DeathAnnouncement\n        DeathAnnouncement --> Discussion: DeathsAnnounced\n        Discussion --> Voting: DiscussionEnded\n        Voting --> VoteResolution: VotesCast\n        VoteResolution --> [*]: VoteResolved\n    }\n    \n    DayPhase --> WinCheck: DayResolved\n    \n    state WinCheck {\n        [*] --> Counting\n        Counting --> WerewolvesWin: WerewolvesReachedMajority\n        Counting --> VillageWin: AllWerewolvesDead\n        Counting --> GameContinues: NoWinCondition\n    }\n    \n    WinCheck --> NightPhase: NextNightStarted\n    WinCheck --> [*]: GameEnded\n```\n\n## Testing Strategy\n\nOur event-sourced architecture makes testing straightforward:\n\n1. Command Validation Tests\n   - Verify that commands produce expected events\n   - Check that invalid commands are rejected\n\n2. Event Application Tests\n   - Ensure events properly update game state\n   - Verify that event sequences maintain consistency\n\n3. Read Model Tests\n   - Confirm that different roles see appropriate information\n   - Check that game history is properly reconstructed\n\n## Getting Started\n\n[Installation and setup instructions will go here]\n\n## Contributing\n\n[Contribution guidelines will go here]\n\n## License\n\n[License information will go here]","readmeFilename":"README.md"}