init

init is a command for Claude Code from galando/temper. It costs 19 tokens per session (3,877 once invoked), scanned A, original, MIT.

A setup command for the Temper development workflow. It creates Temper's configuration and working folders and installs a commit check that can block Git commits while required checks are failing.

In plain words
What is it for?
Setting up a project for Temper, re-creating missing setup files, and installing or checking the project's commit gate.
Why use it?
It removes the need to prepare these files and safeguards manually. It can be run repeatedly without replacing an existing configuration.

Command for Claude Code

Written for Claude Code: ${CLAUDE_PLUGIN_ROOT} variable. Also seen: mentions Claude Code.

Runs only inside its plugin — its command needs a path that Claude Code sets for a plugin’s own hooks and for nothing else. Install the plugin, not this.

Part of the temper plugin — 5 skills, 11 commands, 11 agents, 2 hooks shipped together

Good fit Setting up a project for Temper, re-creating missing setup files, and installing or checking the project's commit gate.

Compare 6 commands from other repositories ↓
Install

Getting it into your agent

This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.

Claude Code
/plugin marketplace add galando/temper
Claude Code
/plugin install temper

Made for: Claude Code.

Or install temper, the plugin that ships this one along with the rest of its 5 skills, 11 commands, 11 agents, 2 hooks.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for init

README.md
[![agentmods](https://agentmods.dev/badge/commands/galando/temper/init/github.svg)](https://agentmods.dev/commands/galando/temper/init)
Your own site
<a href="https://agentmods.dev/commands/galando/temper/init"><img src="https://agentmods.dev/badge/commands/galando/temper/init/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for init

Your own site · 80×15
<a href="https://agentmods.dev/commands/galando/temper/init"><img src="https://agentmods.dev/badge/commands/galando/temper/init.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 19 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 3,877 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00019 $0.03877
Opus 5.5 $0.00008 $0.01551
Sonnet 5.5 $0.00004 $0.00775
Haiku 4.5 $0.00002 $0.00388

Measured 5d ago against content hash 3ed0dab181d6, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

init scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

commands/init.md · 214 lines

How it starts

The opening of the file, as written. The whole thing — 214 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Temper: Set Up This Project

Goal: get a project fully set up in one command. Seeds .claude/temper.config, scaffolds .temper/, and installs the native commit gate — the one control that physically blocks git commit while a gate is red. Idempotent: safe to run any number of times; an existing config is never overwritten.

/temper runs this automatically the first time it's used in an un-set-up project, so most people never call /temper:init by hand — it's here for an explicit re-run.

Uninstall

When the arguments hold --uninstall, do nothing else: run ${CLAUDE_PLUGIN_ROOT}/scripts/temper guards uninstall, print what it says, and stop. It removes the Temper commit hook and its folder; the person runs it in a terminal while no run is active.

Steps

1. Paths. Plugin folder: the folder that holds ${CLAUDE_PLUGIN_ROOT}/scripts/temper (that
   path with /scripts/temper taken off); wherever a reference page writes the
   CLAUDE_PLUGIN_ROOT variable, use this folder. If that file does not exist, stop and
   say "Cannot locate the Temper plugin folder. Reinstall the plugin." Never search the
   disk for another copy. Every path below that is not in the plugin folder is in the
   user's project, the current directory. Nothing here writes into the plugin folder.
   Before anything is written, check the project folder, in this order:
   a. When it is the home folder, stop and say in one line: "The project folder is your
      home folder, which holds Claude Code's own files and is never a project. Run
      /temper:init from a project folder."
   b. Run ${CLAUDE_PLUGIN_ROOT}/scripts/temper status. When it prints a line that starts
      with "FAIL: run temper from a project folder", the CLI refused this folder (the
      home folder, an installed copy of the plugin, or a folder inside the plugin
      folder): stop and show that line, and write nothing. Any other result, "FAIL: no
      intent.md to report on" among them, means go on.

2. Config — .claude/temper.config:
   a. EXISTS → report "Temper config already present" and do NOT overwrite it (it's the
      user's). Check for retired blocks and keys and report what's now ignored:
        grep -nE '^(tokens|observability|capabilities|eval):' .claude/temper.config
      then, as two separate calls:
        ${CLAUDE_PLUGIN_ROOT}/scripts/temper config get models.routing
        ${CLAUDE_PLUGIN_ROOT}/scripts/temper config get models.tiers
      Print one "NOTE: '{key}:' block found, retired, now ignored" line per grep match,
      and one "NOTE: 'models.routing' found (the v6 routing table), retired, now
      ignored" line (or 'models.tiers') for each of the two calls that prints anything.
      A flat models: block (models.plan, models.build and so on) is the live per-stage
      model override, so it is never flagged. If nothing matches, print nothing.
      Read-only: never edits the file.
   b. MISSING → mkdir -p .claude, copy
      ${CLAUDE_PLUGIN_ROOT}/templates/temper.config.default → .claude/temper.config,
      report "Created .claude/temper.config from the default template."

3. Scaffold — run `${CLAUDE_PLUGIN_ROOT}/scripts/temper init` (creates .temper/: gates
   ledger, overrides log, feedback-loops registry). Idempotent.

4. Commit gate — the headline guarantee. Run:
      bash "${CLAUDE_PLUGIN_ROOT}/scripts/guards/install.sh"
   It installs a native git pre-commit hook that runs the secret scan and
   `${CLAUDE_PLUGIN_ROOT}/scripts/temper gate commit` on every commit, and fails open
   if Temper isn't in use for a commit. It keeps that hook in `temper-gate/pre-commit`
   in the repository's git folder (the folder `git rev-parse --git-common-dir` names,
   which every worktree of the repository shares; never committed, never in the plugin
   folder), written through a new file moved into place, and runs
   `git config --local core.hooksPath` with that folder's absolute path, so git runs
   the hook in every worktree. The `pre-commit` file in the folder `git rev-parse --git-path hooks`
   names, the file git runs as the pre-commit hook, is then the kept hook. It never writes into a
   folder named `hooks`: not git's own hooks folder, not the folder
   `git rev-parse --git-path hooks` names, and not a `core.hooksPath` folder that is
   not Temper's. It only reads the hooks there to decide. Its one other write is the
   file `temper-pre-commit` in the git folder, made current only when the user's hook
   holds the line Temper 9.6.5 printed.
   Once `core.hooksPath` is set, git stops running the hooks in its own hooks folder,
   so install.sh leaves `core.hooksPath` as it is when that would switch hooks of the
   user's off: when git's own hooks folder holds an executable hook under any of git's
   hook names (a `commit-msg`, git-lfs's `pre-push`, the pre-commit framework's or
   lefthook's hooks; an older Temper `pre-commit` does not count) or a
   `pre-commit.bak.<timestamp>` that an older installer set aside, and when
   `core.hooksPath` already names another tool's folder (husky's `.husky/_`,
   lefthook, a team folder). It still keeps the Temper hook, and the user's own
   pre-commit hook needs one line, with no path of this machine in it, to run it: the
   `pre-commit` file in git's hooks folder or in that tool's folder (for husky,
   `.husky/pre-commit`). A hook that holds that line, or the line Temper 9.6.5 printed
   (which runs `temper-pre-commit`), with no line before it that starts with `exit` or
   `exec`, calls the Temper hook: install.sh makes the kept hook current, says so and
   exits 0. When an `exit` or `exec` line comes first, the Temper line never runs, so
   install.sh refuses and says to move it above that line.
   A `core.hooksPath` that holds Temper's older folder (`.git/hooks-temper`, set by
   `--global` from 5.5.0 to 9.6.4; `.git/temper-git-hooks`, set by `--global` in
   9.6.5; or the `temper-gate` folder of where the repository used to be) is pointed
   at `temper-gate`, with a note naming the old value, unless that folder holds other
   hooks git runs (`git lfs install` writes its hooks into the folder `core.hooksPath`
   names): then it stays as it is, as for git's own hooks folder (a relative value is set
   to this repository's own older folder by its absolute path, so linked worktrees, and a
   moved or copied repository, reach it), and the
   `pre-commit` there needs the line. When that folder is the `temper-gate` folder of
   another repository that is still there (a copy), it refuses and says to point
   `core.hooksPath` at this repository's own folder, never to change that repository's
   hook. A host hook counts only when git can run it (executable; for husky v9, husky's own
   hook in `.husky/_` must be there and executable instead), and for the pre-commit
   framework and lefthook, a config file at the repository's top that holds the line
   outside a comment counts too (its text only, which the installer's line says). When husky's `.husky/_`
   holds a `pre-commit` from an older Temper, it refuses and says to run `npx husky`. When it installs while an older Temper hook sits in git's own
   hooks folder, it notes that git no longer runs that file and that it can be
   deleted. When it refuses while git still runs a `pre-commit` from an older Temper
   (next to other hooks, or in another tool's folder), it warns that git runs that
   hook in place of the kept one, with the stale plugin path it carries, and the hint
   says to replace all of its lines with `#!/bin/sh` and the line. `core.hooksPath`
   holds an absolute path, so every worktree finds the folder; after the repository,
   or a folder above it, is moved or renamed, git runs no pre-commit hook until
   `/temper` or `/temper:init` runs install.sh again, which points it at the new
   place. Re-running is idempotent: it makes the
   kept hook current, and says when it updated the plugin paths in it (as after a
   plugin upgrade, which moves the plugin folder). When an older version set a hook
   that was not Temper's aside as `pre-commit.bak.<timestamp>`, it names that file in
   a warning and says how to bring it back: move it back to `pre-commit` in git's
   hooks folder, then add to it the line it prints between its BEGIN and END lines.
   `--global` does the same as the default, with a note. It also prints how to
   uninstall: `temper guards uninstall` (or `/temper:init --uninstall`, or `install.sh --uninstall`) removes the Temper
   hook and the `temper-gate` folder (and any `temper-pre-commit` that 9.6.5 left), unsets `core.hooksPath` when it points
   at that folder and no other hook is left there, and names a Temper line in the user's own hook, which the user removes.
   A second run changes nothing. A hook tool added
   later needs `core.hooksPath` unset first: the pre-commit framework refuses to install
   while it is set, and lefthook installs into the folder it names, which is Temper's. The
   next `/temper` or `/temper:init` then keeps the Temper hook and prints the line to add.
   If a tool already wrote its `pre-commit` into Temper's folder, the installer refuses and
   its hint says how to move it out.
   Report by how it ended:
   a. Exit 0 → the gate is installed, was already installed (or was updated to the
      current plugin paths), or the user's own hook calls the Temper hook, which is
      now current; carry its line about that into the report. Carry each `Note:` and
      `Warning:` line it printed into the report too, with the restore steps and the
      line it printed after a warning about an old `pre-commit.bak.<timestamp>` file,
      in a fenced code block.
   b. Exit 1 with "FAIL: not inside a git repository" → report "not a git repo yet; run
      /temper:init again after `git init` to install the commit gate" and continue (the
      config + scaffold still succeeded).
   c. Any other non-zero exit → the commit gate is not installed. Report "commit gate
      not installed: {the FAIL reason}", or, when its output has no FAIL line, "commit
      gate not installed" followed by its whole output in a fenced code block. When its
      output says "The Temper hook is kept in {file}", say that install.sh kept the
      Temper hook in that file, in the repository's git folder (never committed), and
      wrote nothing else; otherwise say that it wrote nothing. Then, when it printed
      lines between its BEGIN and END lines, show them verbatim in a fenced code block,
      so the user has them to copy: one line that runs the Temper hook kept in the git
      folder, or, when it refused before it knew the git folder, the Temper hook's own
      lines in a subshell, so that their exits end only the subshell. Never only say
      that it printed them. Then carry each `Warning:` line it printed (a hook an older
      version set aside, or a `pre-commit` from an older Temper that git still runs,
      with its stale plugin path). Then give its `Hint:` line as it printed it. The
      hint says where the line goes: husky: `.husky/pre-commit`, safe to commit
      because the line holds no path of this machine; the pre-commit framework: a
      local hook in `.pre-commit-config.yaml` whose entry is `sh -c '<the line>'`, as
      the hint prints it, because the framework runs that entry with no shell;
      lefthook: a pre-commit command in `lefthook.yml`, because lefthook writes its
      hook again; a hook from an older Temper: in place of all of its lines, after
      `#!/bin/sh`; any other hook: its start or its end, because the line keeps that
      hook's own result (the hint says to create that file, executable, when it does
      not exist).
      install.sh refuses and exits 1 when git's own hooks folder holds hooks that git
      would stop running if `core.hooksPath` pointed at Temper's folder (its FAIL line
      names them), or a hook an older version set aside, and the `pre-commit` there
      does not call the Temper hook; when `core.hooksPath` names another tool's folder,
      or Temper's older folder that holds other hooks git runs, and the pre-commit hook
      there does not call the Temper hook; when the `pre-commit` in Temper's own folder is not
      Temper's (a hook tool such as lefthook wrote it there; the installer never writes over it,
      and its hint says how to move it out); when the user's hook holds the Temper line after an
      `exit` or `exec` line; when the repository, or a place it would write once
      symlinks are followed, lies inside the plugin's own folder; and when a folder or
      file it needs cannot be made. It ignores GIT_DIR, GIT_WORK_TREE and GIT_CONFIG,
      so it always works on the repository that holds the current folder. Continue (the
      config + scaffold still succeeded).

5. Agents in the foreground. Claude Code runs each Temper stage agent in the background (since
   v2.1.198; with fork mode on, always), and a run goes on only in the turn Claude Code starts
   when the agent finishes, which an idle session may not get. A plugin cannot change that, and
   Temper never edits a Claude Code settings file for it. Say in one line, in the report, that
   the person can keep agents in the foreground by setting `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS`
   to `1` themselves, as `${CLAUDE_PLUGIN_ROOT}/docs/getting-started.md` ("Stage agents in the
   background") shows, and that any message moves a waiting run on.

6. Report done, and name the one optional add-on in a single line:
   "Set up. Optional: `/temper:pack enable guardrails` prints edit-time guardrails (secret
   blocking, frozen-path protection, auto-format, an approval prompt before overrides)
   for you to add to a project settings file. The commit gate above works without it."

Read the full file on GitHub · 214 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 5d ago Changed · +6 lines 3ed0dab181d6
  2. 16d ago Changed · -32 lines cef028e2aeee
  3. 17d ago Changed 5cef3720fe30
  4. 22d ago Changed · +18 lines 18045d209ce5
  5. 1mo ago Changed · +44 lines 5d458f9b9df7
  6. 1mo ago Changed · +114 lines 9f1910e39750
  7. 2mo ago First seen · 64 lines · 19 tokens per session scan A f2af5bda067a

Subscribe to this mod's changes

init is a command published in the GitHub repository galando/temper (18 stars, last pushed yesterday), licensed MIT. It adds 19 tokens to every session and 3,877 once invoked, about $0.0001 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

init compared with commands from other repositories

init next to 6 commands from other repositories
ModTypeStarsLast pushLicenceScanTokensWorks with
initgalando/temperCommand18yesterdayMITA19Claude Code
checklistgithub/spec-kitCommand148kyesterdayMITA13Claude Code
clarifygithub/spec-kitCommand148kyesterdayMITA27Claude Code
specifygithub/spec-kitCommand148kyesterdayMITA13Claude Code
analyzegithub/spec-kitCommand148kyesterdayMITA26Claude Code
convergegithub/spec-kitCommand148kyesterdayMITA35Claude Code
implementgithub/spec-kitCommand148kyesterdayMITA14Claude Code