Skip to content
claudewheel.scratchpad
Edit
On this page

Enumerate per-project scratchpad directories under /tmp/claude-<uid>/, measure tmpfs usage and newest mtime, and classify stale ones.

#claudewheel.scratchpad

#claudewheel.scratchpad

Scan the per-user Claude Code scratchpad tree under /tmp for stale data.

Claude Code sessions write scratchpad data under /tmp/claude-<uid>/<encoded-project>/<session-uuid>/.... Each top-level subdirectory of /tmp/claude-<uid>/ corresponds to one project. This module enumerates those per-project subdirectories, computing for each its real tmpfs block usage and the newest mtime anywhere in its tree, and classifies a directory as "stale" when nothing in it has been touched within :data:SCRATCHPAD_STALE_DAYS.

Size accounting mirrors :func:claudewheel.health._real_disk_usage: it walks with followlinks=False, lstats each entry, counts st_blocks * 512 for regular files only, and never follows symlinks (symlink targets living outside /tmp are never charged against /tmp space).

#tmp_claude_dir

python
def tmp_claude_dir() -> Path

Return the per-user Claude scratchpad root under /tmp.

#ScratchpadDir

One top-level per-project scratchpad directory and its measured facts.

  • size_bytes: real tmpfs block usage (st_blocks * 512) of the regular

files in its tree; symlinks and non-regular files contribute nothing.

  • newest_mtime: the newest lstat mtime of any entry in its tree

(directories and files, including the directory itself). Symlinks are lstat'd (their own mtime), never followed.

#age_days

python
def age_days(self, now: float) -> float

Days since the newest activity in this tree, relative to now (epoch).

#is_stale

python
def is_stale(self, now: float, stale_days: int=SCRATCHPAD_STALE_DAYS) -> bool

True when the newest activity is older than stale_days before now.

#_scan_tree

python
def _scan_tree(root: Path) -> tuple[int, float]

Return (real_block_bytes, newest_mtime) for the tree under root.

Mirrors :func:claudewheel.health._real_disk_usage for the size half: os.walk(followlinks=False) does not descend into symlinked directories, and lstat + S_ISREG counts only regular files (st_blocks * 512). The mtime half considers every directory and file encountered -- including root itself -- and uses each entry's own lstat mtime, so a symlink contributes its own mtime and is never followed to its target.

#scan_scratchpad_dirs

python
def scan_scratchpad_dirs(root: Path) -> list[ScratchpadDir]

Enumerate the top-level per-project subdirectories of root.

Returns one :class:ScratchpadDir per immediate subdirectory (sorted by name), skipping non-directories and top-level symlinks (which are never followed). A missing or non-directory root yields an empty list.

#stale_scratchpad_dirs

python
def stale_scratchpad_dirs(root: Path, now: float, stale_days: int=SCRATCHPAD_STALE_DAYS) -> list[ScratchpadDir]

Return the scratchpad subdirectories of root that are stale at now.

More tools from this site

  • claudestream Drive Claude Code from Python: run it as a subprocess and read its output as typed events, with async and sync sessions, sandbox policies, and tools you define in Python
  • dirstat Fast, single-binary directory statistics CLI: every file under a tree grouped by format, with counts, sizes, and lines of code, as a colored terminal table or as JSON
  • fastware A batteries-included ASGI framework: msgspec JSON, a managed Granian server, dependency injection, SSE, WebSockets, auth, and a test client
  • go-toml-edit Zero-dep TOML editing library for Go with comment preservation
  • howmuchleft The fastest Claude Code statusline: context window, 5-hour, and weekly limit usage as three customizable gradient bars, rendering in about 6 ms
  • orxtra
  • pgdesign
  • predraw Declarative rendering pipeline: describe a scene in JSON and get SVG, PNG and WebP out, with light and dark style tokens, reusable components and text converted to path outlines
  • reposummary Turn a git repository's history into a Markdown journal: pick a time window or revision range and get a readable digest of what changed, optionally narrated by an LLM
  • rlsbl Release orchestration and project scaffolding CLI that bumps versions, validates a structured JSONL changelog, tags only the commit CI verified, and publishes to npm, PyPI, Go and more
  • safegit git wrapper CLI that gives each commit its own temporary index and retries ref updates on conflict, so concurrent agents share one repository
  • saferm Command-line replacement for rm that archives every deletion with a mandatory reason and the context it ran in, so deleted files can be listed, inspected and restored
  • selfdoc Static Site Generator that builds a project's documentation site directly from its source code, so the docs can never drift from the code they describe, with SEO/AEO, first-class blog, search, and cross-project linking built in
  • strictcli
  • stricttest An always-on test-isolation floor: a pytest plugin and a Go env-hygiene module that make a test suite structurally unable to reach real credentials, the real HOME, the network, or the development repository.
  • wesktop A Python framework that turns an ASGI web app into a desktop application, serving it from a local Granian server and displaying it in a native OS window via pywebview
Search