Personal Agentic Workspace¶
A tool-agnostic AI collaboration workspace. Organized by function — find what you need by what you want to do.
Getting started¶
Prerequisites: Python 3.11+, uv, git. Optional, only for the capabilities that need them: Calibre + Ollama (library/), Ollama (research/), Node.js/npm (AnyType MCP via npx), the AnyType desktop app (PKM).
- Clone and enable the drift-check hook:
- Configure — review
tool-chest.tomland adjust paths (e.g.calibre_library) for your machine, and set any secrets in your shell profile (never in the file itself). Details: Configuration. - Generate client configs and verify the clone is clean:
- Open the repo in Cursor or Claude Code. Skills and rules load automatically from
.cursor/skills//.cursor/rules/(symlinked fromshared/) — no extra install step. - Set up whichever standalone tools you want, each self-contained via
uv: cd library && uv sync— e-book RAG (needs Calibre + Ollama)cd research && uv sync— Anthropic research RAG (needs Ollama)cd local-agent && uv run local-agent --help— local org-navigator (no external deps)- Browse these docs as a site (optional), via Zensical
(Material for MkDocs' successor — classic mkdocs' maintainer situation has
stalled, and mkdocs-material never shipped support for the interim 2.0 rewrite):
Config:
pip install -r requirements.txt make docs-serve # exports tracked files to docs-build/, then serves at http://127.0.0.1:8000zensical.toml, fully generated — don't hand-edit it. Nav is derived from every tracked markdown file (make docs-config-sync/make docs-config-check, part ofmake check) — add a new doc and it appears on next sync.make docs-buildwrites the static site tosite/. Note: Zensical is alpha software as of this writing.
Capability map¶
| I want to… | Go to |
|---|---|
| Capture an idea, task, or person | shared/skills/pkm-capture/ or knowledge/anytype-integration/ |
| Delegate a task to an agent | workflow/delegation/ |
| Find or add a skill | shared/skills/ |
| Look up stored context or research | knowledge/agent-wiki/ |
| Add a long-form note or article | knowledge/anytype-integration/ (AnyType PKM) |
| See my open commitments / tasks | AnyType → Tasks database |
| Run the default task loop | workflow/task-loop.md |
| Hand off or onboard a project | workflow/handoff/ |
| Bootstrap rules for a new project | shared/rules/ + shared/skills/rules-bootstrap/ |
| Review an agent's work | workflow/delegation/audit-log.md |
| Run a security review | governance/security-sandbox/ |
| Publish or document something | governance/docs-publish/ |
| Check metrics / friction log | instrumentation/ |
| Search my e-book library semantically | library/ (calibre-librarian, MCP) |
| Search Anthropic's published research | research/ (anthropic-research, MCP) |
| Look up who I know / org relationships (local-only) | local-agent/ |
Layout¶
.
├── shared/ Canonical tool-agnostic resources (skills, rules, agents)
├── knowledge/ Information stores
│ ├── agent-wiki/ Machine-readable context for agents
│ └── anytype-integration/ AnyType PKM config and bridging
├── workflow/ How work gets done
│ ├── task-loop.md Default bounded task loop
│ ├── delegation/ Agent delegation templates and audit log
│ └── handoff/ Project handoff protocol
├── governance/ Policies, audit, security sandbox, docs/publish
├── instrumentation/ Metrics and friction logging
├── library/ calibre-librarian — local RAG over a Calibre e-book library (MCP)
├── research/ anthropic-research — local RAG archive of Anthropic's published research (MCP)
├── local-agent/ Local-first org-navigator: capture/query working relationships (no cloud)
├── integrations/ Bridges between library/research and PKM (e.g. agent-wiki logging)
├── assets/ Static assets (icon, images)
├── scripts/ Config generation and drift-check scripts (see Configuration below)
└── .cursor/ Cursor-specific config (references shared/ where possible)
Operating principles¶
- Single source of truth. Canonical assets live in
shared/. Tool configs reference it. - Capture everything, triage later. Use
pkm-captureor AnyType inbox; don't let things fall through. - Delegate with a paper trail. Every agent task gets a delegation template and an audit log entry.
- Privacy by default. Sensitive data stays local; cloud only with explicit opt-in.
- One capability at a time. Add skills when a real need surfaces, not speculatively.
Configuration¶
All user-facing preferences live in tool-chest.toml at the repo root — one file to edit.
[local_agent]
model = "mistral:7b" # local Ollama model for chat capture
[local_agent.ollama]
base_url = "http://localhost:11434"
[anytype]
api_base_url = "http://127.0.0.1:31009"
Scripts and launchers read from this file automatically (via scripts/config_loader.py). Shell environment variables override config values, so you can do LOCAL_AGENT_MODEL=foo ./chat for one-off overrides without editing the file.
Secrets never go in tool-chest.toml. Set them in your shell profile:
# Anytype MCP authentication (SPB-09: never commit tokens)
export ANYTYPE_OPENAPI_MCP_HEADERS='{"Authorization":"Bearer <key>","Anytype-Version":"2025-11-08"}'
To make the Anytype MCP URL available when Cursor starts, source the loader in your shell profile:
MCP servers¶
Claude Code and Cursor read different files and use incompatible placeholder
syntax (${NAME} vs ${env:NAME}, ${CLAUDE_PROJECT_DIR} vs
${workspaceFolder}), so they cannot share one config. Instead, both are
generated from the [mcp.*] section of tool-chest.toml:
make mcp-config # regenerate .mcp.json and .cursor/mcp.json
make mcp-check # fail if either has drifted from tool-chest.toml
make mcp-install-user # install scope="user" servers into ~/.claude.json
# and ~/.cursor/mcp.json, so they load in any repo
Add or change a server by editing tool-chest.toml and re-running
make mcp-config — never by editing the generated files, which
make mcp-check will flag. Restart the client for changes to attach.
A server's scope decides where it lands. scope = "project" servers go in the
committed project configs and load only inside tool-chest. scope = "user"
servers are installed globally by make mcp-install-user and deliberately left
out of the project configs — Claude Code resolves name collisions as
local > project > user, so listing a server in both places lets the project
entry shadow the user one rather than fall back to it.
Shared rules¶
.cursor/rules/ is composed from shared/rules/ according to
rules-manifest.yaml (validated against
shared/rules/bootstrap/manifest.schema.json):
make rules-sync # re-render .cursor/rules/ from the manifest
make rules-check # fail if .cursor/rules/ has drifted from the manifest
Edit rules in shared/rules/, or change which slices this project inherits in
rules-manifest.yaml, then re-run make rules-sync. Never hand-edit
.cursor/rules/ — the entries are symlinks, and make rules-check flags a
file that has become a copy or that no manifest layer declares.
The manifest's rendered.mode is symlink here rather than copy, since the
composed files are byte-identical to their sources: drift is then structurally
impossible instead of merely detected. This matches .cursor/skills/, which
already symlinks into shared/skills/.
make check runs every drift gate (mcp-check + rules-check), and
make hooks installs the pre-commit hook that runs it. Do that once per clone.
Tool setup¶
- Claude Code: Skills at
~/.claude/skills/; definitions documented inshared/skills/ - Cursor: Skills at
.cursor/skills/; rules at.cursor/rules/(both symlinked fromshared/) - AnyType: Local instance with MCP access; config at
knowledge/anytype-integration/
Phase roadmap¶
| Phase | What | Status |
|---|---|---|
| A | Structural reorganization | done |
| B | Skills canonicalization (.cursor/skills/ symlinked from shared/skills/) |
done |
| C | AnyType Tasks + delegation depth | next |
| D | People/org mapping (post job-start) | deferred |
Icon Attribution & Credit: Toolbox by Muhammad Nur Auliady Pamungkas from Noun Project (CC BY 3.0)