How this skill is triggered — by the user, by Claude, or both
Slash command
/batterie:updateThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
!`python3 << 'PYEOF'
!`python3 << 'PYEOF' import json, os, subprocess, shutil
plugins_path = os.path.join(os.path.expanduser("~"), ".claude", "plugins", "installed_plugins.json") plugins_file = json.load(open(plugins_path)) plugins = plugins_file.get("plugins", {})
batterie = {k: v[0] for k, v in plugins.items() if k.endswith("@batterie")}
if not batterie: print("No batterie plugins installed.") else: print(f"Found {len(batterie)} batterie plugin(s):\n") for key, info in sorted(batterie.items()): name = key.split("@")[0] print(f"- {name}: v{info['version']} (sha: {info['gitCommitSha'][:12]})")
# CLI version check
cli_tools = {"bon": "bon", "passe": "passe", "todoist-gtd": "todoist"}
print("\nCLI tool versions:")
for plugin_name, cli_name in cli_tools.items():
if f"{plugin_name}@batterie" in batterie:
path = shutil.which(cli_name)
if path:
try:
result = subprocess.run([cli_name, "--version"], capture_output=True, text=True, timeout=5)
ver = result.stdout.strip() or result.stderr.strip()
print(f"- {cli_name}: {ver}")
except Exception:
print(f"- {cli_name}: (version check failed)")
else:
print(f"- {cli_name}: NOT IN PATH")
PYEOF`
Update every batterie plugin listed above. Follow these steps exactly:
claude plugin marketplace update batterie
This pulls the latest marketplace index so plugin updates can see new versions. Without this, claude plugin update compares against a stale index.
For each plugin shown above, run:
claude plugin update <name>@batterie
Run them sequentially — each must complete before the next starts. Report the output of each.
After all updates, read ~/.claude/plugins/installed_plugins.json again. For each batterie plugin, compare the version and gitCommitSha against the "before" snapshot above. Report:
JSON structure of installed_plugins.json:
{
"version": "...",
"plugins": {
"bon@batterie": [
{"scope": "user", "installPath": "/path/to/cache/bon/0.8.0", "version": "0.8.0", "gitCommitSha": "..."}
],
...
}
}
Each plugin key maps to a list of installations (one per scope). Use v[0] to get the user-scope entry.
Three batterie plugins ship CLI tools installed via uv tool install:
| Plugin | CLI binary | Extras |
|---|---|---|
| bon | bon | [dolt] |
| passe | passe | |
| todoist-gtd | todoist |
For each installed plugin that has a CLI:
installPath from the JSON above (e.g. plugins["bon@batterie"][0]["installPath"])["version"]uv cache clean <cli_name> --force && uv tool install "<installPath>[<extras>]" --force --reinstall
Always include extras from the table above (e.g. bon is always "<installPath>[dolt]"). PyMySQL is tiny and harmless — always installing it avoids silent breakage when any project uses the Dolt backend.
The --force on uv cache clean prevents blocking on lock contention from other uv processes (e.g. marketplace refresh). Report success or failure. If uv is not available or the install fails, fall back to showing the manual command.If any plugins were updated:
Updates complete. Exit and restart Claude Code (`/exit` then `claude`) to activate changes.
SessionStart hooks only fire on full restart — /reload-plugins won't trigger them.
If nothing changed: just say all plugins are up to date, no restart needed.
npx claudepluginhub spm1001/batterie --plugin batterieCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.