All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Checkpoint and rollback: Automatically create checkpoints before session execution, enabling rollback to restore files to their pre-execution state
- Original file content stored as blob files in
~/.local/share/shannot/sessions/{id}/checkpoint/ - Conflict detection via post-exec hash comparison (bypass with
--force) - Support for both local and remote (SSH) rollback
- Large directory handling with limits (100 files / 50MB) and partial checkpoint warnings
- New session status:
rolled_back
- Original file content stored as blob files in
- Add
shannot rollback <session_id>command with--forceand--dry-runoptions - Add
shannot checkpoint listto list sessions with available checkpoints - Add
shannot checkpoint show <session_id>to display checkpoint details
- Fix self-test creating pending session on macOS (avoid
uname -psubprocess) - Fix self-test output showing summary message instead of script output
- Fix SSL certificate verification for Nuitka binaries on macOS
- Fix macOS stdlib download URL (use PyPy 3.8 v7.3.11)
- Auto-download sandbox binary:
shannot runnow automatically downloads the PyPy sandbox binary on first run (with graceful failure for unsupported platforms) - macOS runtime support: Platform-specific PyPy versions (Linux: PyPy 3.6, macOS: PyPy 3.8) with automatic detection and download
- Deletion tracking:
shutil.rmtree()and file deletions are now queued for approval- Full support for fd-based directory operations (fdopendir, dirfd, unlinkat)
- Deletions displayed in approve TUI with file/directory counts
- Audit logging for deletion events
- Add PyPy sandbox support for macOS ARM64
- Add slash commands for changelog, pr, and release skills
- Mount home directory read-only in sandbox VFS
- Add
SHANNOT_SANDBOX=1environment variable for sandbox detection by scripts - Add darwin/arm64 struct sizes to validation
- Add
check_outputto subprocess stub forplatform.node()support - Add
pwdstub and populate environ with HOME/USER forexpanduser()support - Add
_bootlocalestub for text I/O encoding support - Add missing syscall signatures (W* macros, dirfd, sendfile, mach_absolute_time, ftime)
- Fix misleading sandbox binary path in status message
- Fix Unicode output handling - preserve UTF-8 characters in sandbox output
- Improve startup speed with lazy version loading (~88ms savings per CLI invocation)
- Fix self-test regression: use
--codeinstead of removed-cflag
- Improve CLI help with quick start guide and clearer description
- Remove
-calias for--codeflag (avoids Nuitka conflict, more self-documenting)
- Use absolute path for shannot-mcp in Claude Desktop config (fixes PATH resolution issues)
- Improve devcontainer post-create experience
- Use explicit
shannot setup runtimecommand - Add
shannot statusverification step - Auto-activate venv in shell rc files for direct
shannotaccess - Replace generic welcome with step-by-step "Try it out" tutorial
- Use explicit
- Overlay commit model for file writes: File writes are now captured during dry-run and committed to the filesystem after approval, rather than being blocked
- Execution tracking: Commands and file writes are tracked during execution with per-item success/failure status
- Colorized execution summary: After execution, shows what commands ran and what files were written with ✓/✗ indicators
- Conflict detection: SHA256 hash of original file content is stored; commits fail if file was modified between dry-run and execution
- Large file handling: 50MB hard limit blocks excessive writes at capture time; 5MB threshold shows ⚠ warning in approval TUI
- Remote SSH file writes:
commit_writes_remote()writes approved files to remote filesystem via SSH with conflict detection - Conflict warnings in TUI: Show write conflicts prominently on Results view after execution
- Consolidated CLI commands: Merged
shannot executeintoshannot run --session=ID shannot run script.pynow always uses dry-run mode (removed explicit--dry-runflag)
- Fix session execution for Nuitka binary by calling directly instead of subprocess
- Fix sandbox exit code by waiting for natural process exit before terminating
- Fix bytes/str type mismatch in remote conflict detection
- Fix
fstat64handling for write-mode files in VFS - Fix basedpyright type errors in cli.py and mix_subprocess.py
- Implement modular remote runtime deployment
- Deploy three separate artifacts: CLI binary, PyPy sandbox, PyPy stdlib
- Auto-download artifacts from GitHub releases and python.org
- Local caching at
~/.local/share/shannot/cache/ - Incremental updates: only changed components are re-deployed
- CLI from
corv89/shannotreleases - PyPy sandbox from
corv89/pypyreleases (with SHA256 verification) - PyPy stdlib from official
downloads.python.org/pypy(with SHA256 verification)
- Fix remote execution commands to use correct
--pypy-sandboxand--lib-patharguments
- Add macOS binary builds for both Intel (x86_64) and Apple Silicon (arm64)
- Binaries:
shannot-darwin-x86_64,shannot-darwin-arm64 - Built with Nuitka
--onefilemode (same as Linux)
- Binaries:
- Auto-download Linux binaries from GitHub releases for remote deployment
- No longer requires local binary for
shannot setup remote test - Binaries cached locally in
~/.local/share/shannot/binaries/
- No longer requires local binary for
- Fix broken binaries caused by UPX compression (SIGSEGV on startup)
- UPX is incompatible with Nuitka's
--onefilemode (double compression) - Keep LTO and module exclusions for size optimization
- UPX is incompatible with Nuitka's
- Add UPX compression to reduce binary size by 50-70%
- Simplify release workflow to use bare binaries instead of tarballs
- Add LTO (Link Time Optimization) to Nuitka build
- Add more stdlib exclusions (unittest, pydoc, doctest)
- Fix release workflow to create gzip tarballs for remote deployment
- Binary releases now use format:
shannot-{version}-linux-{arch}.tar.gz - Add
--clobberflag to handle workflow re-runs - Normalize architecture naming to
arm64consistently
- Binary releases now use format:
- Add
-c/--codeflag to run inline Python code without a script file- Scripts are injected directly into VFS (no temp files needed)
- Works for both local and remote execution
- Add built-in self-test to
shannot statusandshannot setup remote test- Status command runs minimal script through sandbox when runtime is available
- Remote test deploys runtime if missing, then verifies sandbox execution
- Self-test exercises full sandbox path with
platform.node()call
- Implement
unamesyscall for sandbox (closes #69)- Enables
os.uname(),platform.node(),platform.machine() - Returns virtualized system info: sysname="Linux", nodename="sandbox"
- Machine architecture detected dynamically from host
- Enables
- Add real-time danger highlighting to approval TUI
- Safe commands (dim green): matches
auto_approvepatterns - Caution commands (yellow): state-modifying (chmod, mount, service)
- Danger commands (red): destructive (rm, kill, dd, mkfs)
- Unknown commands: no color
- Safe commands (dim green): matches
- Expand default
auto_approvelist (20 → 70+ commands)- Filesystem, file viewing, search, text processing
- Process, system, user, network diagnostics
- Service status, checksums, help commands
- Expand default
always_denylist (5 → 25+ patterns)- Recursive destruction, disk destruction, fork bombs
- Remote code execution (curl/wget | sh)
- Permission bombs, history destruction, system shutdown
- Add interactive arrow-key menu for
shannot setup - Restructure CLI: reduce top-level commands to 4 (run, approve, status, setup)
- Move
remoteandmcpcommands undersetupsubcommand - Hide
executecommand from help (internal use only) - Auto-detect MCP CLI path at
~/.claude/localfor installation - Add TTY-aware menu utilities with fallback to numbered input
- Update all docs to use unified
config.tomlformat - Replace
profile.jsonandremotes.tomlreferences
- Fix arrow keys not working reliably in approval TUI on some terminals (Ghostty)
- Use
os.read()instead ofsys.stdin.read()to bypass Python's buffered I/O
- Use
- Configuration consolidated to single
config.tomlfile- Replaces:
profile.json,remotes.toml,audit.json - Project-local:
.shannot/config.toml(for profile and audit) - Global:
~/.config/shannot/config.toml(for all settings including remotes)
- Replaces:
- Remotes remain global-only (not read from project-local config)
Remotedataclass no longer hasnamefield (name is the dict key)
- Unified TOML configuration with sections:
[profile],[audit],[remotes.*] - Human-editable config with comments support
- Consistent precedence: project-local overrides global
- Add append-only JSONL audit logging for security-relevant operations
- Log session lifecycle, command decisions, file writes, approvals, and remote events
- Per-file sequence numbers for tamper detection
- fcntl file locking for concurrent write safety
- Daily log rotation with configurable retention
- Audit status shown in
shannot statusoutput
- Add automatic sandbox binary download to
shannot setup - Download pre-built PyPy sandbox from GitHub releases with SHA256 verification
- Support Linux amd64 and arm64 platforms
shannot setup --statusshows both stdlib and sandbox status- Graceful failure on unsupported platforms with build-from-source instructions
- Fix ruff lint errors and apply formatting
- Bump version to 0.5.1
- Update MCP documentation for v0.5.0
- Add MCP integration to SKILL.md and update README
- Add .ruff_cache to .gitignore
- Add MCP support for remote SSH targets
- Bump version to 0.5.0
- Add session TTL and expiry management
- Add MCP protocol implementation with zero dependencies
- Add MCP server infrastructure and request routing
- Add Shannot MCP server with script-based execution
- Add MCP entry point and CLI integration
- Add comprehensive MCP test suite
- Fix until pypy-c-sandbox and pypy3-c-sandbox load again
- Fix ruff linter errors
- Fix additional ruff linter errors
- Fix code quality issues across codebase
- Improve code quality and test coverage
- Update documentation for v0.4.0 PyPy architecture
- Update CI/CD and project metadata for v0.4.0
- Add support for select and socket modules
- Add --raw-stdout
- Add MIT license
- Add virtual /proc and /sys filesystems to VFS
- Add tiered subprocess security mixin
- Add command queue persistence and interactive approval CLI
- Add session-based approval workflow
- Add PyPy lib_pypy stubs and OverlayDir for VFS
- Add shannot CLI with runtime setup and auto-detection
- Add SSH remote support for sandboxed script execution
- Add README and SKILL documentation
- Add remote-first execution architecture
- Add CLI subcommands for SSH remote management
- Add status subcommand for system health checks
- Add Nuitka standalone binary build support
- Fix import order in test_config.py (ruff format)
- Fix type errors in test_config.py by adding isinstance checks
- Fix ruff line length violations in error messages
- Bump github/codeql-action from 3 to 4 (#5)
- Bump actions/setup-python from 5 to 6 (#3)
- Bump actions/github-script from 7 to 8 (#24)
- Bump actions/download-artifact from 5 to 6 (#26)
- Bump actions/upload-pages-artifact from 3 to 4 (#28)
- Bump astral-sh/setup-uv from 5 to 7 (#27)
- Bump actions/checkout from 4 to 5 (#31)
- Bump sigstore/gh-action-sigstore-python from 3.0.1 to 3.1.0 (#34)
- Bump actions/upload-artifact from 4 to 5 (#33)
- Bump actions/setup-python from 5 to 6 (#32)
- Improve error messages
- Update GitHub Actions to use pip instead of removed install.sh
- Update license format in pyproject.toml
- Update tests for granular namespace isolation flags
- Improve README.md for clarity and user focus
- Improve formatting in README.md
- Improve README formatting for MCP integration
- Improve DX via Makefile (#20)
- Improve Validation (#38)
- Add configuration system with TOML and remote execution
- Add UV support and improve installation experience
- Add configurable user namespace isolation and enhanced error diagnostics
- Add comprehensive troubleshooting guide and improve README
- Add --version flag to CLI and bump version to 0.1.1
- Add remote MCP support (#14)
- Add security policy and changelog (#22)
- Add Prompts (#30)
- Fix GitHub Release: Update sigstore action to v3 and add checkout step
- Bump actions/download-artifact from 4 to 5
- Bump actions/checkout from 4 to 5
- Fix ruff and type checking issues
- Fix CI: Install MCP and remote extras for tests
- Fix circular import between execution.py and sandbox.py
- Fix CodeQL warnings
- Fix CI: test-installation only verifies CLI, not sandbox execution
- Bump sigstore/gh-action-sigstore-python from 2.1.1 to 3.0.1
- Update Python requirement to 3.10+ and add asyncssh dependency
- Update GitHub Actions to Python 3.10+
- Add CI/CD, Codespaces, enhanced testing infrastructure
- Add executor abstraction for local and remote execution
- Add comprehensive executor tests and improve test fixtures
- Add Lima VM configuration for testing
- Add manual SSH executor test script for Lima VM