Thank you for your interest in contributing! This guide explains how to get involved.
If you find a bug, please open an issue with:
- Steps to reproduce the problem
- Expected vs. actual behavior (screenshots or logs help)
- Your environment (OS, and relevant runtime/version)
Have an idea? Open a feature request describing the problem you want to solve and your proposed solution.
- Fork the repository and clone your fork:
git clone https://github.com/<your-username>/echook.git cd echook
- Create a branch for your changes:
git checkout -b feature/your-feature-name
- Make your changes and verify them locally (see Development Setup below).
- Commit with a clear message following Conventional Commits:
git commit -m "feat: short description of your change" - Push and open a Pull Request against the
masterbranch.
echook keeps a single canonical source that is synced into the Claude Code plugin layout by a build script. Always edit the canonical files, never the plugins/audio-hooks/ mirror.
echook/
├── .claude-plugin/marketplace.json
├── plugins/audio-hooks/ # plugin layout — MIRROR, populated by build-plugin.sh
│ ├── .claude-plugin/plugin.json
│ ├── hooks/hooks.json # matcher-scoped registration (hand-edited here)
│ ├── runner/run.py
│ ├── skills/audio-hooks/SKILL.md
│ ├── bin/ · audio/ · config/
│ ├── cursor-hooks/ · codex-hooks/
├── hooks/ # CANONICAL: hook_runner.py, invoker.py, user_preferences.py
├── bin/ # CANONICAL: audio-hooks(.py/.cmd) + audio-hooks-statusline
├── audio/ # CANONICAL: default/ (voice) + custom/ (chimes)
├── config/ # default_preferences.json, schema, audio_manifest.json
├── cursor-hooks/hooks.json # CANONICAL: Cursor IDE install template
├── codex-hooks/hooks.json # CANONICAL: Codex CLI install template
├── scripts/ # install / build-plugin / uninstall / bump-version / generate-audio
└── tests/ # unittest suite (Cursor + Codex bridge contracts)
- Edit canonical files (
/hooks/,/bin/,/audio/,/config/,/cursor-hooks/,/codex-hooks/). - Run
bash scripts/build-plugin.shto sync into the plugin layout. - CI verifies in-sync via
bash scripts/build-plugin.sh --check. - Validate:
claude plugin validate plugins/audio-hooks. - Test:
python -m unittest discover -v tests(Ubuntu/Windows/macOS × Python 3.9/3.12/3.13 in CI). Not pytest. - Bump version (when releasing):
bash scripts/bump-version.sh <new_version>— atomically updates all canonical version locations and re-runsbuild-plugin.sh.
See docs/ARCHITECTURE.md for the full system design, hook lifecycle, and how to add a new hook event or audio file.
By participating, you agree to abide by our Code of Conduct. For questions or support, see SUPPORT.md. For security issues, see SECURITY.md.