Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add commands/cloudnative-co/claude-code-starter-kit/update-kitgit clone --depth 1 https://github.com/cloudnative-co/claude-code-starter-kitWhat 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.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00000 | $0.05660 |
| Opus 5 | $0.00000 | $0.02830 |
| Sonnet 5 | $0.00000 | $0.01132 |
| Haiku 4.5 | $0.00000 | $0.00566 |
Grade E, and why
update-kit scanned grade E with 4 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 2d 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.
Asks for rootmediumPrivilege escalation
A mod that escalates privileges can change anything on the machine, not only the project.
chmod 600 "$pending_snapshot" || exit 1 Downloads and executes remote codehighSupply chain
curl | sh runs whatever the server returns today, which is not necessarily what it returned when this was reviewed.
`curl -fsSL https://raw.githubusercontent.com/cloudnative-co/claude-code-starter-kit/main/install.sh | bash`. Reads agent configuration directoriesmediumAgent snooping
.claude/, .codex/, .gemini/ hold keys, settings and other credentials a mod has no legitimate need for.
- To restore: `BACKUP=$(cat ~/.claude/.starter-kit-last-backup) && mv ~/.claude ~/.claude.broken && cp -a "$BACKUP" ~/.claude` Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
`curl -fsSL https://raw.githubusercontent.com/cloudnative-co/claude-code-starter-kit/main/install.sh | bash`. How it starts
The opening of the file, as written. The whole thing — 424 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/update-kit - Manually Update Starter Kit
Manually update the Claude Code Starter Kit to the latest version.
Instructions
Run the following block as one Bash invocation. A current non-MDM manifest
binds the checkout to the exact config used at install time; otherwise the
strict KIT_REPO="..." entry in ~/.claude-starter-kit.conf is used, without
sourcing or evaluating either file. It validates that the absolute path is the
root of a Git worktree containing this kit, and then updates it. A legacy config
without KIT_REPO (or no config) falls back to ~/.claude-starter-kit.
An invalid explicit binding or KIT_REPO is an error — do not silently fall
back to a different checkout.
set -euo pipefail
default_config_file="$HOME/.claude-starter-kit.conf"
config_file="$default_config_file"
default_kit_repo="$HOME/.claude-starter-kit"
kit_repo="$default_kit_repo"
manifest_file="$HOME/.claude/.starter-kit-manifest.json"
manifest_bound=false
if [ -e "$manifest_file" ] || [ -L "$manifest_file" ]; then
if [ -L "$manifest_file" ] || [ ! -f "$manifest_file" ]; then
printf '%s\n' "Invalid starter-kit manifest: $manifest_file" >&2
exit 1
fi
manifest_binding="$(jq -cse '
if length == 1 and (.[0] | type == "object") then
.[0]
| if (has("kit_repo") or has("config_file")) then
if (has("kit_repo") and has("config_file")
and (.mdm_managed == false)
and ((.kit_repo | type) == "string")
and ((.config_file | type) == "string")
and (.kit_repo | startswith("/"))
and (.config_file | startswith("/"))
and ((.kit_repo | test("[\\x00-\\x1f\\x7f]")) | not)
and ((.config_file | test("[\\x00-\\x1f\\x7f]")) | not))
then [.kit_repo, .config_file]
else error("invalid runtime binding")
end
else []
end
else error("invalid manifest")
end
' "$manifest_file" 2>/dev/null)" || {
printf '%s\n' "Invalid starter-kit manifest binding" >&2
exit 1
}
if [ "$manifest_binding" != "[]" ]; then
kit_repo="$(printf '%s' "$manifest_binding" | jq -r '.[0]')" || exit 1
config_file="$(printf '%s' "$manifest_binding" | jq -r '.[1]')" || exit 1
manifest_bound=true
fi
fi
if [ -e "$config_file" ] || [ -L "$config_file" ]; then
if [ -L "$config_file" ] || [ ! -f "$config_file" ] \
|| [ ! -r "$config_file" ]; then
printf '%s\n' "Invalid starter-kit config: $config_file" >&2
exit 1
fi
kit_repo_count="$(awk '
/^[[:space:]]*KIT_REPO[[:space:]]*=/ { count++ }
END { print count + 0 }
' "$config_file")" || {
printf '%s\n' "Could not read starter-kit config" >&2
exit 1
}
if [ "$kit_repo_count" -gt 1 ]; then
printf '%s\n' "Multiple KIT_REPO entries in starter-kit config" >&2
exit 1
fi
if [ "$kit_repo_count" -eq 1 ]; then
kit_repo_line="$(awk '
/^[[:space:]]*KIT_REPO[[:space:]]*=/ { print }
' "$config_file")" || exit 1
if [ "${kit_repo_line#KIT_REPO=\"}" = "$kit_repo_line" ] \
|| [ "${kit_repo_line%\"}" = "$kit_repo_line" ]; then
printf '%s\n' "Invalid KIT_REPO entry in starter-kit config" >&2
exit 1
fi
config_kit_repo="${kit_repo_line#KIT_REPO=\"}"
config_kit_repo="${config_kit_repo%\"}"
case "$config_kit_repo" in
/*) ;;
*)
printf '%s\n' "Invalid KIT_REPO entry in starter-kit config" >&2
exit 1
;;
esac
case "$config_kit_repo" in
*'"'*)
printf '%s\n' "Invalid KIT_REPO entry in starter-kit config" >&2
exit 1
;;
esac
if printf '%s' "$config_kit_repo" | LC_ALL=C grep -q '[[:cntrl:]]'; then
printf '%s\n' "Invalid KIT_REPO entry in starter-kit config" >&2
exit 1
fi
if [ "$manifest_bound" = true ] && [ "$config_kit_repo" != "$kit_repo" ]; then
printf '%s\n' "Manifest binding does not match starter-kit config" >&2
exit 1
fi
kit_repo="$config_kit_repo"
elif [ "$manifest_bound" = true ]; then
printf '%s\n' "Manifest-bound config has no KIT_REPO entry" >&2
exit 1
fi
elif [ "$manifest_bound" = true ]; then
printf '%s\n' "Manifest-bound config not found: $config_file" >&2
exit 1
fi
kit_repo_physical="$(cd "$kit_repo" 2>/dev/null && pwd -P)" || {
printf '%s\n' "Starter-kit checkout not found: $kit_repo" >&2
exit 1
}
repo_top="$(git -C "$kit_repo_physical" rev-parse --show-toplevel 2>/dev/null)" || {
printf '%s\n' "Not a Git checkout: $kit_repo_physical" >&2
exit 1
}
repo_top_physical="$(cd "$repo_top" 2>/dev/null && pwd -P)" || exit 1
if [ "$kit_repo_physical" != "$repo_top_physical" ] \
|| [ ! -e "$kit_repo_physical/.git" ] \
|| [ ! -f "$kit_repo_physical/setup.sh" ] \
|| [ ! -f "$kit_repo_physical/lib/features.sh" ] \
|| [ ! -f "$kit_repo_physical/config/plugins.json" ]; then
printf '%s\n' "KIT_REPO is not a starter-kit repository root" >&2
exit 1
fi
printf 'Resolved kit repo: %s\n' "$kit_repo_physical"
printf 'Resolved config file: %s\n' "$config_file"
repo_status="$(git -C "$kit_repo_physical" status --porcelain)" || {
printf '%s\n' "Could not inspect starter-kit checkout" >&2
exit 1
}
if [ -n "$repo_status" ]; then
printf '%s\n' "Local changes found; review them before updating" >&2
exit 1
fi
previous_version="$(git -C "$kit_repo_physical" describe --tags --abbrev=0 \
2>/dev/null || printf 'unknown')"
git -C "$kit_repo_physical" fetch --tags
git -C "$kit_repo_physical" pull --ff-only
setup_args=(--update)
if [ "$manifest_bound" = true ]; then
setup_args+=("--config=$config_file")
fi
(cd "$kit_repo_physical" && bash setup.sh "${setup_args[@]}")
new_version="$(git -C "$kit_repo_physical" describe --tags --abbrev=0 \
2>/dev/null || printf 'unknown')"
printf 'Starter kit version: %s -> %s\n' "$previous_version" "$new_version"
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.
- 2d ago First seen · 424 lines · 0 tokens per session scan E 60603a532cf7
update-kit is a command published in the GitHub repository cloudnative-co/claude-code-starter-kit (147 stars, last pushed 8d ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 5,660 tokens. A static security scan graded it E with 4 findings (asks for root, downloads and executes remote code, reads agent configuration directories). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other commands, from other repositories
merge
Finalize work on a branch: verify docs + tree are clean, merge to main, clean up. Supports both standard git checkout -b branches and git worktree flows — auto-detected at pre-flight.
expect
Diff-aware AI browser testing — reads the git diff, maps changes to affected pages via the route map, generates a targeted test plan, and executes it via agent-browser (Rust daemon + CDP, ARIA-tree-first) with pass/fail reporting. Use when testing UI changes, verifying PRs before merge, or running regression checks on…
speckit.tasks
Generate an actionable, dependency-ordered tasks.md for the feature based on available design artifacts.
dev
Runs Vendure in development mode. By default it starts three processes: the GraphQL server (ts-node ./src/index.ts), the worker (ts-node ./src/index-worker.ts), and the dashboard (a Vite dev server).
start
Runs a project that has already been compiled with vendure build.
pipeline-undo
Undo a pipeline run's result. With worktree isolation (the current engine), this is clean and low-risk: a run never touches your checkout — its result lives only on a pipeline/ branch (and, for a --push run, on the remote). "Undo" therefore means deleting that branch and its worktree, not reverting your working tree.