Purse-first package repo of MCP servers and CLI tools.
Status:
caldavis the only active MCP package. Batman (the fence-based BATS test runner and bats helper libs) was extracted toamarbel-llc/batsand is consumed here as a flake input; the other packages are small standalone tools or dormant.
Each package's Nix derivation self-produces its
share/purse-first/<name>/ layout (plugin manifest + hooks) via its own
generate-plugin subcommand; clown's circus loads caldav from that path.
The flake's default output is a symlinkJoin of caldav plus the
non-MCP packages.
| Package | What it is | Status |
|---|---|---|
caldav |
CalDAV MCP server — tasks, calendars, and VTODO management (Go) | active |
potato |
Pomodoro break timer CLI; counts down a rest break, 5 minutes by default (Go) | built, standalone |
sandcastle |
Sandbox runtime wrapping filesystem/network restrictions around processes — bubblewrap + seccomp on Linux, sandbox-exec on macOS (Node) |
dormant — no longer wired into the bats test wrapper (superseded by fence) |
and-so-can-you-repo |
Interactive script that scaffolds a new nix-flake-backed repo (bash + gum + gh) | built, standalone |
polkadots |
Section-7 man pages documenting dev conventions (justfile design patterns, nix flake conventions, man pages, nix binary wrapping, dev test workspaces) | built, docs only |
The flake also re-exports batman / bats-libs from the
amarbel-llc/bats input, and builds probe-fence-sandbox, a regression
check that fence's bubblewrap keeps working inside Nix's build sandbox.
packages/spinclass/ contains only empty directories — leftover scaffolding,
not built by the flake.
nix build # default bundle: caldav + non-MCP packages
nix build .#caldav # individual packages: caldav, potato, sandcastle,
# and-so-can-you-repo, polkadots, batman, ...
./result/bin/caldav --helpThe caldav MCP server speaks stdio and is configured via environment
variables: CALDAV_URL, CALDAV_USERNAME, CALDAV_PASSWORD.
Every Go MCP package's main.go dispatches on its first argument:
generate-plugin <dir>— build-time: writesplugin.json,mappings.json, andhooks/hook— Claude Code PreToolUse handler: denies built-in tools when an MCP tool should be used instead- no args — runtime: starts the MCP server
Currently caldav is the only package using this convention; its
generate-plugin runs as a postInstall step so the built derivation
already carries its plugin layout.
Justfile recipes are the paved paths:
just build # nix build (caldav + non-MCP packages)
just test # all tests: Go + BATS lanes + validate-mcp
just test-caldav # Go tests for packages/caldav only
just test-bats # BATS integration lanes (run inside the nix sandbox)
just fmt # format Go code
just lint # go vet across every workspace module
just vendor # after ANY Go module change: re-vendor + recompute
# the goVendorHash in flake.nixAll Go packages share a single go.work workspace and a single
goVendorHash in flake.nix. The vendor/ directory is intentionally
gitignored — it exists only for local tooling and for computing the Nix
vendor hash. See CLAUDE.md for the full Go-workspace and vendor-hash
workflow.