The Gaffa command line tool for setting your AI coding tools up with the Gaffa skills.
No install needed, run it through npx:
npx @gaffa-dev/cli --help
npx @gaffa-dev/cli --version
doctor reports which of the supported tools are on your machine, where each
keeps its config, and whether the gaffa skills are already set up in it. It reads
only and writes nothing.
npx @gaffa-dev/cli doctor
npx @gaffa-dev/cli doctor --json
Supported tools: Claude Code, Codex, GitHub Copilot, Cursor and Antigravity.
Each is detected by its config directory rather than a binary on the path, since
an IDE may put nothing on the path. --json prints the same result as structured
output for scripts.
install copies the gaffa skills into the tools you pick and writes a receipt
next to them, so a later uninstall knows exactly what it wrote.
npx @gaffa-dev/cli install
npx @gaffa-dev/cli install --tools=claude-code,codex --scope=personal
With no flags it asks which tools (defaulting to the ones it detects) and which
scope. Pass --tools, --scope and -y to run it unattended, for example in
CI. --scope=project writes into the working directory so you can commit the
skills with the repo, --scope=personal writes into your home config. A second
install refreshes to the current skills and drops any it wrote before that no
longer exist.
Until the skills are published to npm, point install at a local checkout with
--skills-dir or GAFFA_SKILLS_DIR.
uninstall removes the skills a previous install wrote, for a scope. A skill you
have edited since is left in place and reported, so your own changes are never
lost.
npx @gaffa-dev/cli uninstall --scope=project
npm install
npm run build
npm test
npm run lint
The entry point is src/cli.ts, compiled to dist/cli.js by tsc. Tests run
the built binary and check its output, so npm test builds first.
Pushing a version tag runs the publish workflow, which lints, builds, tests, then publishes to npm with provenance.
Main only takes pull requests, so bump package.json on a branch and deliver it
as a pull request. Once that merges, tag the merge commit on main and push the
tag. Tagging the branch commit instead would leave the tag pointing at a commit
the squash merge discards.
git tag v0.0.2 <merge commit>
git push origin v0.0.2
A plain tag (v0.0.1) publishes under latest. A prerelease tag (v0.0.1-rc.1)
publishes under next, so it is opt-in and a bad one can be dropped without
touching anyone on latest. Every pull request runs npm pack --dry-run on
Windows, macOS and Linux, so packaging problems show up before a real release.
The final package name is not fixed. gaffa is taken on npm, so the skeleton
uses @gaffa-dev/cli for now.