claude-code-stats CLAUDE.md

Project instructions for ClaudeCodeStats, a macOS menu bar app that displays Claude Code usage limits, service health, and command-line updates. They describe how to build, install, and relaunch the app safely.

In plain words
What is it for?
They help build the SwiftUI app with Xcode, identify the exact output application, copy it to Applications, and restart it.
Why use it?
They prevent developers from copying an old build by mistake when Xcode stores several versions in its build folders.

Instructions file

Install

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.

agentmods
npx agentmods add instructions/dmelo/claude-code-stats/claude-md
Clone the repo
git clone --depth 1 https://github.com/dmelo/claude-code-stats
Per session 1,669 This file is loaded in full into every session.
When invoked 1,669 The same file — it is already loaded in full.
Security scan C 1 finding. Scan, not verified.
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 $0.01669 $0.01669
Opus 5 $0.00834 $0.00834
Sonnet 5 $0.00334 $0.00334
Haiku 4.5 $0.00167 $0.00167

Measured 3d ago against content hash 142dded34170, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade C, and why

claude-code-stats CLAUDE.md scanned grade C with 1 finding 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 3d 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.

Recursive force deletehighDestructive command

rm -rf with a variable or a broad path is one typo away from removing the wrong tree.

rm -rf /Applications/ClaudeCodeStats.app
CLAUDE.md · 97 lines

How it starts

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

CLAUDE.md

Project Overview

ClaudeCodeStats is a native macOS menu bar app (SwiftUI) that shows Claude Code usage limits, Claude service health status, and CLI version update notifications.

Build

cd ClaudeCodeStats
xcodebuild -scheme ClaudeCodeStats -configuration Release build

The built .app is in ~/Library/Developer/Xcode/DerivedData/ClaudeCodeStats-<hash>/Build/Products/Release/.

Resolve that path explicitly — never with a ClaudeCodeStats-* glob. Xcode keeps a separate DerivedData directory per project location, and stale ones are not cleaned up. When more than one exists the glob expands to all of them, so cp -R src1 src2 /Applications/ copies the fresh build and then overwrites it with the stale one, exit 0 and no warning — you end up debugging a binary that is weeks old. ls -dt does not save you either: it sorts by directory mtime, which a previous cp will have touched. The last line xcodebuild prints (lsregister -f -R -trusted <path>) names the directory it actually built into.

To install locally:

# Take the path from xcodebuild's own output, or pick by the *binary's* mtime:
APP=$(ls -dt ~/Library/Developer/Xcode/DerivedData/ClaudeCodeStats-*/Build/Products/Release/ClaudeCodeStats.app/Contents/MacOS/ClaudeCodeStats \
      | head -1 | sed 's#/Contents/MacOS/ClaudeCodeStats##')
echo "installing from: $APP"   # sanity-check this before continuing

# Kill running instance, copy to /Applications, relaunch
pkill -x ClaudeCodeStats; sleep 0.5
rm -rf /Applications/ClaudeCodeStats.app
cp -R "$APP" /Applications/ClaudeCodeStats.app
open /Applications/ClaudeCodeStats.app

If a change you just made doesn't show up, check this first: a rendered colour or string that exists nowhere in the source tree means you are not running the tree.

There are no tests or linters configured, so verifying a change means running the app and looking at it. Three non-obvious traps when doing that from a shell:

  • Launch with open, never &. A .app started as "$BINARY" & from a Bash tool dies when that shell returns, often mid-work — open /Applications/ClaudeCodeStats.app hands it to LaunchServices so it survives. To time a scan or wait on a side effect, poll the artifact (until [ -f "$cost_cache" ]; do sleep 2; done), don't hold the process open.
  • Instrument to a file, not stderr. A menu bar app has no attached terminal, and one you'll pkill loses buffered stdout/stderr — write debug lines to a file (/tmp/…) and cat it after.
  • AppleScript can't open the MenuBarExtra popover (click menu bar item … does nothing). To inspect a view in a specific state or appearance without the running app, compile the real views into a standalone ImageRenderer harness and render at a chosen \.colorScheme + sample data (swiftc main.swift Theme.swift Models.swift Views/*.swift — top-level code needs the file named main.swift). It renders everything except ScrollView content, which comes back blank.

Read the full file on GitHub · 97 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. 3d ago First seen · 97 lines · 1,669 tokens per session scan C 142dded34170

Subscribe to this mod's changes

claude-code-stats CLAUDE.md is an instructions file published in the GitHub repository dmelo/claude-code-stats (23 stars, last pushed 11d ago), licensed MIT. It adds 1,669 tokens to every session, about $0.0083 per session on Opus 5. A static security scan graded it C with 1 finding (recursive force delete). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.