Skip to content
Back to skills

Add Tool

ASecurity

Decide where a new tool slots into the chezmoi bootstrap and README. Use when adding a CLI/binary to the host bootstrap so it lands in the right install pass and the right README block. Routes auth-required tools to "Interactive logins" and fire-and-forget binaries to "PATH check".

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 1, 2026
toolsgobashgitapibackend

Works with

  • cli
  • api

Security analysis

A92/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro shows the line behind each finding and how to fix it

Scanned October 7, 2026

npx -y skills add alunduil/alunduil-chezmoi --skill add-tool --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Add Tool?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Add Tool
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/alunduil-add-tool/badge)](https://www.skillsdirectory.com/skills/alunduil-add-tool)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: add-tool
description: Decide where a new tool slots into the chezmoi bootstrap and README. Use when adding a CLI/binary to the host bootstrap so it lands in the right install pass and the right README block. Routes auth-required tools to "Interactive logins" and fire-and-forget binaries to "PATH check".
---

# Add a tool to bootstrap

First check the tool belongs on the host, then make two decisions
independently.

## Libraries with no console script

`uv tool install` needs an executable, so a PyPI library takes one of
two shapes:

1. An installed tool imports it (plugins, optional backends): add it
   as a pinned `--with` extra on that tool, as `beets` carries
   `pyacoustid`.
2. Otherwise, keep it off the host. The caller runs
   `uv run --with <pkg>==<version> <script>` and owns the pin. Stop
   here: no bootstrap change, no README line.

Install a CLI front-end that wraps the library only when its command
is itself wanted.

## Auth axis

Does the tool need interactive auth (login, browser flow, API token)
to do real work?

- **Yes** (gh, claude, gcx, readwise, tailscale): list in README
  "Interactive logins" with a config-path comment so a fresh-host
  bootstrap surfaces where state lands. No PATH-check line — running
  the login command itself proves reachability. Auth state is
  runtime, never managed by chezmoi.
- **No** (zellij, lazygit, act, gh-poi): list in README "PATH
  check" line.

## Install mechanism

All passes live under `.chezmoiscripts/`.

Pick the canonical installer for the ecosystem:

| Source                | Where                                 | Pattern                        |
| --------------------- | ------------------------------------- | ------------------------------ |
| Debian package        | `.chezmoidata/packages.yaml`          | append to `packages.apt`       |
| Pinned binary release | `.chezmoiexternal.toml`               | external entry below           |
| npm package           | `run_before_03`                       | `npm install -g`, `command -v` |
| Cargo crate           | `run_before_09`                       | `cargo install`, `command -v`  |
| `gh` extension        | `run_before_05`                       | `gh extension install --pin`   |
| PyPI package          | `run_after_install-via-externals`     | mirror the `beets` block       |

A release binary that needs more than a download (signature check,
source build) gets a `script/install/<tool>` script, called from
`run_before_02` instead; mirror `script/install/signal-cli`.

Auth and install axes are independent: `gcx` is auth-required *and*
a chezmoi external; `gh-poi` is fire-and-forget *and* uses
`gh extension install`.

## Pin the version

Annotate each `*_VERSION` pin on the line directly above it:

| Source                | Annotation                                                              |
| --------------------- | ----------------------------------------------------------------------- |
| Script-installed tool | `# renovate: datasource=github-releases depName=<owner>/<tool>`         |
| PyPI package          | `# renovate: datasource=pypi depName=<pkg>`, one per `--with` extra too |

An external needs no annotation: its version lives in the download URL.

## External entry

Add an entry to `.chezmoiexternal.toml`, mirroring `vale` or `lazygit`.
Write the literal release URL, version included wherever the asset name
repeats it:

```toml
[".local/bin/<tool>"]
    type = "archive-file"
    url = "https://github.com/<owner>/<tool>/releases/download/vX.Y.Z/<tool>_X.Y.Z_<arch>.tar.gz"
    path = "<tool>"
    executable = true
```

Renovate bumps every copy of the version in the URL. Use
`type = "file"` for a raw binary asset. A release asset carries no
checksum (ADR 0008); a GitHub source-archive tarball
(`archive/refs/tags/…`) pins `checksum.sha256`.

A pass that runs the new binary is `run_after_`, since externals deploy
during apply.

## Procedure

1. For a library with no console script, settle its shape first; stop
   if it stays off the host.
2. Identify the auth axis and install mechanism.
3. Wire the installer into the right `.chezmoiscripts/` pass, or add
   the external entry.
4. Update README:
   - Auth-required → add to "Interactive logins" with config-path comment
   - Fire-and-forget → add to "PATH check" line
5. Annotate every pin per [Pin the version](#pin-the-version).
6. Run sensors before claiming done:

   ```bash
   pre-commit run --all-files
   bats --recursive dot_local dot_claude script
   script/checks/chezmoi-apply
   ```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.