Opinionated Claude Code wrapper: dangerous perms + non-destructive guardrails + auto Haiku handoffs instead of compacting.
Project description
sclaude
Opinionated Claude Code wrapper for long-running sessions. A Cartage OSS contribution.
What it does:
- Launches
claudewith--dangerously-skip-permissionsso you never see a permission prompt. - Appends a strict non-destructive guardrails system prompt so Claude self-imposes the safety checks the permission gate would have enforced.
- Runs a context-window sidecar. At ~70% context, it asks Haiku to write a
handoff doc and auto-swaps the session: kills the running
claude, respawns it fresh, and types/resume <doc>for you. No mid-flow compacting, no lost state. - Bundles a Claude Code status line showing context %, 5-hour and 7-day usage buckets, and a pace meter.
- Spawns git worktrees with
sclaude <name>— one command, branch + tree- wrapped claude.
Install
pipx install sclaude
Requires Claude Code installed and authed (claude login) — sclaude uses your
existing OAuth session, no API key needed.
Quick start
# launch claude in current cwd (no worktree)
sclaude run
# spawn a worktree at <repo>/.worktrees/my-feature and launch claude in it
sclaude my-feature
sclaude worktree my-feature # explicit form
# remove worktrees whose branches are merged / clean
sclaude prune # dry run
sclaude prune --apply # actually remove
Any argument that isn't a known subcommand is treated as a worktree name. So
sclaude AE-1234 ≡ sclaude worktree AE-1234.
Worktree paths
Default: <repo>/.worktrees/<name>. Override with --path:
sclaude my-feature --path ~/scratch/my-feature
Branch defaults to the worktree name and forks off the detected default branch
(origin/main → origin/master → main → master). Override with
--branch / --base.
Context threshold
Default fires at 70% of the 200k context window. Override:
sclaude --threshold 0.65
To disable the PTY auto-swap and fall back to a banner-only handoff:
sclaude --no-auto-handoff
Status line
On first launch, sclaude composes a settings JSON that points Claude Code's
statusLine at the bundled statusline.sh (cached at
~/.cache/sclaude/statusline.sh). Your existing ~/.claude/settings.json is
preserved — only the statusLine key is added.
The bar shows: context fill % • pace (7d burn-rate vs sustainable) • 5h and 7d usage buckets when either crosses 50%.
Guardrails
See src/sclaude/guardrails.md. Summary: no
force-push, no destructive git/SQL, no editing CI/secrets, always work in a
worktree, commit per chunk, confirm before irreversible ops.
Architecture
sclaude <name>
├── git worktree add <repo>/.worktrees/<name>
├── spawn watcher.py (subprocess, polls ~/.claude/projects/<cwd>/*.jsonl)
└── pexpect-driven PTY around `claude --dangerously-skip-permissions
--append-system-prompt <guardrails>
--settings <bundled-statusline.json>`
When the watcher detects context ≥ threshold, it calls
claude -p --model haiku to write a handoff doc under ~/.claude/handoffs/.
The PTY runner spots the new file, terminates the current claude, respawns
it, and pre-types /resume <doc> as the first user input.
Acknowledgements
Built at Cartage for our own non-technical AO users running multi-day Claude Code sessions. Released as a standalone OSS package in the hope it's useful to anyone else who hates compaction.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sclaude-0.3.0.tar.gz.
File metadata
- Download URL: sclaude-0.3.0.tar.gz
- Upload date:
- Size: 16.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d800951bfe1fce52ac2b888b3ae3bcb258c2d20448dd4afb40469b0ea25785c7
|
|
| MD5 |
4eb1988ae6932f0ef00fdc5d8bf089d8
|
|
| BLAKE2b-256 |
e01749783d03f531b71f24e4d1db87330825db497b72d6e4dbe9a6d097b84a7f
|
File details
Details for the file sclaude-0.3.0-py3-none-any.whl.
File metadata
- Download URL: sclaude-0.3.0-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8387d4b21067bac818f3ccbe60b3018498185ebca6ec88abfe2bb3553e2acab4
|
|
| MD5 |
75d209438763e3beb2c22a806d81895c
|
|
| BLAKE2b-256 |
15d531d2dc3b34aa6761c2b1be08f7928603f2b668cc1f431dc29e577798d4f3
|