Contributing
Contributions are welcome. Lacy is a bash/zsh plugin — no build step required for core changes.
Dev setup
bash
git clone https://github.com/lacymorrow/lacy.git
cd lacy
# Test ZSH plugin locally:
source lacy.plugin.zsh
# Test Bash plugin locally:
source lacy.plugin.bash
# Test the Node installer:
node packages/lacy/index.mjsNote
Changes to files in the repo do not automatically update ~/.lacy/. The install dir and repo are separate copies — test by sourcing from the repo directly.
Design principles
- Single source of truth — all input classification goes through
lacy_shell_classify_input()inlib/core/detection.sh. Never create parallel detection logic. - No Node in the shell path — core plugin is pure bash. Node is only for the installer UI.
- Zero config to start — defaults work out of the box. Progressive disclosure for advanced settings.
- Shell commands still work — lacy never breaks your shell. Emergency bypass (
!prefix) is always available. - Plugin coexistence — always tag
region_highlightentries withmemo=lacy. Never clear the array directly.
Adding a new AI tool
To add support for a new AI CLI tool:
- Add the tool to
LACY_SUPPORTED_TOOLSinlib/core/constants.sh - Add the command template to
lacy_tool_cmd()inlib/core/mcp.sh - Update the tool table in
CLAUDE.mdand this documentation - Add auto-detection logic in
lib/core/config.shif the tool has a standard install path
Conventional commits
text
feat: add new AI tool support
fix: correct agent word detection for "in" prefix
chore: update dependencies
docs: clarify reroute thresholdPR process
- Open an issue first for significant changes
- Test in both ZSH and Bash 4+ (macOS Bash 3.2 is not supported)
- Verify
lacy doctorpasses after your change - Update
CLAUDE.mdif you change any of the canonical functions or detection logic