# claude-playground A tiny todo CLI that exists to try out [Claude Code](https://docs.claude.com/en/docs/claude-code) features. ```sh npm install # once per clone: turns on the git hooks in .githooks/ npm test npm start -- add "try Claude Code" npm start -- done 1 npm start -- ls ``` ## What's set up | File | Claude Code feature | | --- | --- | | `CLAUDE.md` | Project memory, loaded into every session | | `.claude/settings.json` | Shared permissions + a hook that syntax-checks `.js` files after every edit | | `.claude/skills/changelog/` | A custom skill — run `/changelog` | | `.claude/agents/test-writer.md` | A custom subagent — "use the test-writer agent to…" | ### Protecting `main` Changes reach `main` only through a PR that a human merges. Three layers, strongest first: 1. **Gitea branch protection** on `main` (set in the repo settings on code.westerkam.org): the only layer that can't be bypassed from a clone. 2. **Git hooks** in `.githooks/` (enabled by `npm install`): `pre-push` rejects any push that would update `main`, however it's spelled; `pre-commit` / `pre-merge-commit` refuse commits while `main` is checked out. `--no-verify` skips them. 3. **Claude Code deny rules** in `.claude/settings.json` for `git push … main`: a quick early stop, but they match command text, so they're easy to get around. ## Things to try - *"There's a bug in how ids are assigned after removing a todo — find it and fix it with a test."* - *"Use the test-writer agent to cover `src/todo.js`."* - *"Add a `--json` flag to `ls`."* then `/code-review` - `/changelog` after a few commits - Press `shift+tab` to cycle permission modes (e.g. plan mode before a bigger change) - `/memory` to edit CLAUDE.md, `/agents` and `/hooks` to inspect the setup