Install Shaka manually
Run the installation yourself when you want to read what will run before it runs. You need Ruby 3.4 or later, Git 2.41 or later, and an authenticated GitHub CLI. To let your coding agent do this instead, use the installation prompt.
What the installer changes
Shaka installs as one Git checkout that you keep only for Shaka, outside the
repositories your agent edits. The installer, bin/install,
is a Ruby script that uses only Ruby's standard library. It makes these changes:
- Skill links. It adds a
shakasymbolic link in your coding agent's skills directory, pointing into the checkout. Nothing is copied. - Installation records. It writes the checkout's origin, branch, and selected
agents, plus the path of the Ruby that ran it, inside the checkout's
.gitdirectory. Shaka then runs with that Ruby in every project. - Lock files. It leaves an empty
.shaka-install.lockfile in each skills directory it links.
It does not use sudo, edit your shell profile or PATH, or install gems.
It refuses a checkout or skills directory that other accounts can write to.
Afterward, each Shaka command adds a line to a timing log at
~/.local/state/shaka/calls.jsonl. The log holds no paths or task text. It names
only the repository, issue or PR number, commit, reviewer model, and, for a
validation run, the hash of the files it tested. The file stays on your machine, but a PR's description lists the PR's own
validation, review, and checkpoint times from it, as
Understanding PR timings describes. Set
SHAKA_CALL_LOG=off to stop recording.
Install
Clone the source. To install somewhere else, such as ~/agent-tools/shaka,
change SHAKA_DIR on the first line. Keep it out of ~/.agents/, which holds
settings; the installer refuses any folder there:
SHAKA_DIR="$HOME/.local/share/shaka/source"
umask 022
mkdir -p "$(dirname "$SHAKA_DIR")"
git clone https://github.com/shakacode/shaka.git "$SHAKA_DIR"
Read the source and bin/install, then run the installer in the same terminal.
It records the first ruby on your PATH, and --directory makes it register
the checkout you just read:
"$SHAKA_DIR/bin/install" --directory "$SHAKA_DIR" --agent codex
Replace codex with your coding agent, and repeat --agent to select several.
Each one adds this link:
--agent | Skill link |
|---|---|
codex | ~/.agents/skills/shaka |
claude | ~/.claude/skills/shaka |
cursor | ~/.cursor/skills/shaka |
opencode | ~/.config/opencode/skills/shaka |
Pi has no option of its own; it loads the shared skill linked for codex.
bin/install --help lists the remaining options.
When it finishes, the installer prints where everything lives: the source
checkout and its commit, each skills folder it linked, and your settings. The
source checkout is not configuration. Settings live in each project's
.agents/shaka/ folder and in ~/.agents/trusted-github-actors.yml.
Start a new chat and look for Shaka. Coding agents shows how to start a task in each one. Then continue with setup.
Install your own fork
The commands above install ShakaCode's repository. To run a version you can
change, follow Fork Shaka and make it yours. Pass
--repository with your fork's exact origin URL.
Verify and update
Check the installation at any time, using the directory you installed into. This command changes nothing in the checkout or your skill links:
"$HOME/.local/share/shaka/source/skills/shaka/scripts/shaka" install --verify
It confirms that the checkout comes from the recorded origin, has no local changes, and is the target of each skill link, and that the recorded Ruby still exists.
When verification or an update refuses, or you are not sure which checkout your agents use, ask for the installation state. It also changes nothing and works offline:
"$HOME/.local/share/shaka/source/skills/shaka/scripts/shaka" install --status
It names the state, where it found it, and the one command for you to run next, or the decision you need to make. For example:
- After a
git pullinside the checkout, it namesinstall --update. - When an older checkout still holds an install record that your links no longer use, it names the command that renames that record aside.
- When your links point into a linked Git worktree, which disappears when its
branch is cleaned up, it names the command that reinstalls Shaka into
~/.local/share/shaka/source, or what to decide when one command cannot. - When Shaka is installed at the old default,
~/.agents/shaka, it names the command that clones Shaka into~/.local/share/shaka/sourceand moves your links there. Every install action names the same command until you run it. If~/.local/share/shaka/sourcealready holds something else, it says what to move aside instead. The old checkout stays where it is; delete it once the new one works.
Below the state it lists the links, checkouts, and PR trials it found.
shaka doctor reports the same state.
To have Shaka run those steps for you, ask it to repair the installation:
"$HOME/.local/share/shaka/source/skills/shaka/scripts/shaka" install --repair
Repair handles a pull, an unfinished update, a removed Ruby, a missing or
broken link, an install record nothing uses, local commits in the checkout, and
links split between two checkouts. Split links move to the checkout whose install
record changed last, which install --status names; when other steps run
first, repair stops so you can check again. Local commits move to a
kept-<commit> branch first, which you then decide what to do with, and a
record it replaces is renamed aside, so nothing is deleted. It stops when a step
needs your decision and shows that state. Running it again changes nothing.
Shaka tells you when an update is available once your installation is three
commits behind, or when the oldest change you lack is a day old, so a busy
day on main does not interrupt every new chat. Each update-check answer is
saved in ~/.local/share/shaka/update-check.json. Any later Shaka command reads
that file, without a network request, and prints one line to standard error at
most once a day when it says to update, says the checkout moved, or is missing or over a day old.
A command run from a different Shaka checkout than your skill links point to
prints one line naming the linked one.
Two more reminders show at most once a day. A command run in a repository with no
Shaka settings names the missing file and the two setup choices, so a first task
starts by choosing individual or team setup.
Until shaka doctor has run on your machine, a command suggests running it. Doctor
records each run in ~/.local/share/shaka/doctor-ran, and the reminder times are
kept in ~/.local/share/shaka/notices.json. Set SHAKA_NOTICES=off to silence every
notice; doctor then records nothing.
To have each new Claude Code chat start with the saved answer, add --session-hook
to bin/install --agent claude. The chat then hears about an update, a moved
checkout, or a check over a day old, without a network request that would slow
its start. That adds one SessionStart hook to ~/.claude/settings.json;
installing with --agent claude again without the flag removes it.
When an update is due, finish active Shaka chats, fetch and apply it, then start a new chat:
"$HOME/.local/share/shaka/source/skills/shaka/scripts/shaka" install --update
The update stops without changing the checkout when it finds local changes or
history that diverged from the recorded branch. To read an update before you
apply it, run git fetch in the checkout and compare HEAD with the recorded
branch, which is origin/main unless you chose another.
Develop Shaka in a separate clone
Your coding agent runs Shaka straight from the folder you installed, so keep that folder for Shaka alone. If you also work on Shaka, do it in a second clone.
The installer stops when the folder:
- is a Git worktree. Worktrees are often deleted after their branch merges, and Shaka would disappear with it.
- has other branches or worktrees.
install --verifyandinstall --updateonly warn about these.
Move Shaka out of a clone you develop in
Run this inside the clone you develop in. It makes a fresh clone for Shaka and points your coding agents at it:
./bin/install --directory ~/.local/share/shaka/source --take-over
Your old clone keeps its files, branches, and worktrees; it only stops being
the installed copy. If the move fails partway, your agents keep using the old
clone, and the installer lists anything it could not put back. When you run the
command from a different clone and your skills live in a custom folder, add
--skills-dir DIR.
If the installer is force-stopped (kill -9) at the wrong moment, no clone
counts as installed. To fix it, rename the newest
.git/shaka-install.retired-*.json in the old clone to
.git/shaka-install.json, then run the command again.