{"id":16694118,"url":"https://github.com/philschatz/puzzlescript","last_synced_at":"2026-02-24T11:02:34.314Z","repository":{"id":32612456,"uuid":"133603107","full_name":"philschatz/puzzlescript","owner":"philschatz","description":":video_game: Play Accessible PuzzleScript games in your terminal or embed them","archived":false,"fork":false,"pushed_at":"2024-08-17T02:39:26.000Z","size":18531,"stargazers_count":32,"open_issues_count":30,"forks_count":11,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-11T17:42:15.247Z","etag":null,"topics":["accessible","game","game-engine","hacktoberfest","puzzle","puzzle-game"],"latest_commit_sha":null,"homepage":"https://philschatz.com/puzzlescript/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/philschatz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-05-16T03:05:59.000Z","updated_at":"2025-09-21T09:40:28.000Z","dependencies_parsed_at":"2024-06-21T15:45:37.062Z","dependency_job_id":"eef70798-7fdd-4e08-bad2-bc1b15bbfb58","html_url":"https://github.com/philschatz/puzzlescript","commit_stats":{"total_commits":713,"total_committers":8,"mean_commits":89.125,"dds":"0.10378681626928477","last_synced_commit":"5f1444f426691fd8e87a817bf5821b6c71742381"},"previous_names":["philschatz/puzzlescript-cli"],"tags_count":63,"template":false,"template_full_name":null,"purl":"pkg:github/philschatz/puzzlescript","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philschatz%2Fpuzzlescript","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philschatz%2Fpuzzlescript/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philschatz%2Fpuzzlescript/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philschatz%2Fpuzzlescript/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/philschatz","download_url":"https://codeload.github.com/philschatz/puzzlescript/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philschatz%2Fpuzzlescript/sbom","scorecard":{"id":731746,"data":{"date":"2025-08-11","repo":{"name":"github.com/philschatz/puzzlescript","commit":"1c61b74cce6a3ad6d1c2378cadfd25d8b9e6cd6b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 2/22 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/philschatz/puzzlescript/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/philschatz/puzzlescript/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/philschatz/puzzlescript/test.yml/main?enable=pin","Warn: containerImage not pinned by hash: packages/puzzlescript-cli/Dockerfile:1: pin your Docker image by updating node:10 to node:10@sha256:59531d2835edd5161c8f9512f9e095b1836f7a1fcb0ab73e005ec46047384911","Warn: npmCommand not pinned by hash: packages/puzzlescript-cli/Dockerfile:17","Warn: npmCommand not pinned by hash: .github/workflows/test.yml:29","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   2 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 19 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"20 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-8hc4-vh64-cxmj","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-w5fc-gj3h-26rx","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T14:38:12.737Z","repository_id":32612456,"created_at":"2025-08-22T14:38:12.737Z","updated_at":"2025-08-22T14:38:12.737Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29780604,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T10:45:18.109Z","status":"ssl_error","status_checked_at":"2026-02-24T10:45:09.911Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessible","game","game-engine","hacktoberfest","puzzle","puzzle-game"],"created_at":"2024-10-12T16:43:50.084Z","updated_at":"2026-02-24T11:02:34.307Z","avatar_url":"https://github.com/philschatz.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Accessible PuzzleScript\n[![NPM version][npm-image]][npm-url]\n[![Downloads][downloads-image]][downloads-url]\n[![Code coverage][coverage-image]][coverage-url]\n\n## Play in a browser or on your mobile device\n\n1. Visit the [website](https://philschatz.com/puzzlescript)\n1. Click the \"Add\" button at the bottom to keep playing even without an internet connection\n1. Plug in a :video_game: controller! (tested with PS3/4/XBox)\n\n\u003cdetails\u003e\n\n\u003csummary\u003eIf you are using \u003cstrong\u003eiOS (Apple phone or tablet)\u003c/strong\u003e click here for instructions\u003c/summary\u003e\n\n1. Visit the [website](https://philschatz.com/puzzlescript)\n1. Click the Share button in Safari\n1. Scroll over and click \"Add to Home Screen\"\n\n![ios-install](https://user-images.githubusercontent.com/253202/53995149-c5bc5800-40f9-11e9-9e54-3f6a0e10b857.gif)\n\n\u003c/details\u003e\n\n\n## Play from the command line terminal\n\n1. Run `npx puzzlescript-cli` to start playing!\n\n# Screencaps\n\nHere are some screencaps of games being played.\n\n### [Pot Wash Panic!](https://philschatz.com/puzzlescript/#/pot-wash-panic) ([source](https://hauntpun.itch.io/pot-wash-panic))\n\n(click to see the ascii screencast)\n\n\u003ca href=\"https://asciinema.org/a/188014?t=25\"\u003e\u003cimg width=\"300\" alt=\"video of install and a couple games\" src=\"https://asciinema.org/a/188014.png\"/\u003e\u003c/a\u003e\n\n\n### [Skipping Stones to Lonely Homes](https://philschatz.com/puzzlescript/#/skipping-stones) ([source](http://www.draknek.org/games/puzzlescript/skipping-stones.php))\n\n\u003ca href=\"https://asciinema.org/a/189279?t=20\"\u003e\u003cimg width=\"300\" alt=\"video of the beginning of Skipping Stones (BIG)\" src=\"https://asciinema.org/a/189279.png\"/\u003e\u003c/a\u003e\n\n\n### [Hack the Net](https://philschatz.com/puzzlescript/#/hack-the-net) ([source](http://www.draknek.org/games/puzzlescript/hack-the-net.php))\n\n\u003ca href=\"https://asciinema.org/a/188016\"\u003e\u003cimg width=\"300\" alt=\"video of a couple levels of Hack-the-Net\" src=\"https://asciinema.org/a/188016.png\"/\u003e\u003c/a\u003e\n\n\n### [Entanglement](https://philschatz.com/puzzlescript/#/entanglement-one) ([source](http://www.richardlocke.co.uk/release/entanglement/chapter-1/))\n\n\u003ca href=\"https://asciinema.org/a/212372?t=18\"\u003e\u003cimg width=\"300\" alt=\"video of the beginning of Entanglement\" src=\"https://asciinema.org/a/212372.png\"/\u003e\u003c/a\u003e\n\n\n### [Mirror Isles](https://philschatz.com/puzzlescript/#/mirror-isles/0) ([source](http://www.draknek.org/games/puzzlescript/mirrors.php))\n\nThis screencast shows playing the game in a terminal using ASCII and ANSI colors.\n\n![mirror-isles](https://user-images.githubusercontent.com/253202/47133542-ce0d1700-d26e-11e8-851f-233d27aaf0b8.gif)\n\n\n# Video games that blind people can play?\n\nPuzzleScript lends itself nicely to be playable by people with low or no vision:\n\n1. each level is small (~10x10)\n1. each sprite has a human-readable name (since the whole game is in 1 text file and the logic refers to the sprites)\n1. a blind person has 2 sets of directions (one to move the player and one to move the “eye” which reads off which sprite is in that spot)\n1. the games do not require quick reflexes and have Undo built-in so it is easy to think and try different options\n1. we can just print to the terminal whenever something needs to be read (presumably the terminal is read aloud to the person)\n\nIf you are blind, you can play the games by running `puzzlescript --no-ui` and use the \u003ckbd\u003eI\u003c/kbd\u003e, \u003ckbd\u003eK\u003c/kbd\u003e, \u003ckbd\u003eJ\u003c/kbd\u003e, \u003ckbd\u003eL\u003c/kbd\u003e, and \u003ckbd\u003eP\u003c/kbd\u003e keys to move the cursor to explore the level.\n\nIf you want to experience what a non-sighted person would experience but still see the level, run `NODE_ENV=development puzzlescript` and use the \u003ckbd\u003eI\u003c/kbd\u003e, \u003ckbd\u003eK\u003c/kbd\u003e, \u003ckbd\u003eJ\u003c/kbd\u003e, \u003ckbd\u003eL\u003c/kbd\u003e, and \u003ckbd\u003eP\u003c/kbd\u003e keys to move the cursor to explore the level.\n\n### Screencap\n\nThis screencap is a visual demonstration of exploring and then playing a level.\n\n\u003ca href=\"https://asciinema.org/a/190028?t=4\"\u003e\u003cimg width=\"600\" alt=\"exploring and playing a level without sight (visual depiction)\" src=\"https://asciinema.org/a/190028.png\"/\u003e\u003c/a\u003e\n\nThis screencap is the **non-visual** version of the same steps as shown above. This is what vision-impaired people will read when they move the Inspector cursor around and then move the player to play the game.\n\n\u003ca href=\"https://asciinema.org/a/193133?t=7\"\u003e\u003cimg width=\"600\" alt=\"exploring and playing a level without sight\" src=\"https://asciinema.org/a/193133.png\"/\u003e\u003c/a\u003e\n\n\n# About\n\nThe goal of this project is to do 3 things:\n\n1. make PuzzleScript easier to embed (like in 404 pages, easter eggs, etc). See [docs](https://philschatz.com/puzzlescript/docs/classes/_engine_.gameengine.html)\n1. allow **blind people to play video games** (by passing the `--no-ui` argument)\n1. use the terminal as a GUI for playing games\n\n\n# Accessibility Notes\n\nTo use https://chromevox.com, table navigation keys on the Mac are \u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eCommand\u003c/kbd\u003e + \u003ckbd\u003eUp\u003c/kbd\u003e.\n\n\n# Development Instructions\n\n1. Install [lerna](https://lerna.js.org)\n1. `lerna bootstrap --force-local`\n1. `lerna run compile`\n1. `lerna run test --stream`\n    - you can run `test:unit` or `test:web` to just run tests specific to a package\n1. `lerna run test:integration --stream` (this runs several games and takes about 30min)\n1. `lerna run start:server --stream` to start up a server\n\n## Maintainer Instructions\n\nTo publish a new version of the packages:\n\n```sh\nlerna publish prerelease\n```\n\n## TODO\n\n- [x] Move to a monorepo\n- [x] Add embedding example\n- [ ] Upgrade dependencies\n- [x] Move CLI code into a separate package\n- [x] Update so that the puzzlescript package (or puzzlescript-web package) has 0 dependencies\n- [x] Get CI tests running again\n- [x] get Codecov reporting\n- [x] Lint again\n- [ ] Support when `\u003ctable\u003e` does not have an aria-live caption (by adding one)\n- [ ] change the web handler to create a different event when a checkpoint occurs (so saving is easier)\n- [ ] change the CLI so that you can specify the path to a puzzlescript game.\n- [ ] get code coverage up to 100% by skipping untested code\n- [ ] Generate ESModules and CJS: https://www.sensedeep.com/blog/posts/2021/how-to-create-single-source-npm-module.html\n- [ ] convert puzzlescript-web to use Cypress and sourcemaps\n- [ ] move the games and solutions into a separate package (`puzzlescript-games`)\n- [ ] :fire: default exports because they are hard on IDEs and make for a confusing API\n\n\n[npm-image]: https://img.shields.io/npm/v/puzzlescript.svg\n[npm-url]: https://npmjs.org/package/puzzlescript\n[downloads-image]: https://img.shields.io/npm/dm/puzzlescript.svg\n[downloads-url]: https://npmjs.org/package/puzzlescript\n[coverage-image]: https://img.shields.io/codecov/c/github/philschatz/puzzlescript.svg\n[coverage-url]: https://codecov.io/gh/philschatz/puzzlescript\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilschatz%2Fpuzzlescript","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphilschatz%2Fpuzzlescript","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilschatz%2Fpuzzlescript/lists"}