agentrecall
Keep skills, global instructions, a small permission policy, and searchable project history in one place: ~/.agents.
The CLI is agentrecall (previously dotagents). Cursor, Codex, and OpenCode already read ~/.agents; Claude Code does not, so this CLI links only where a tool cannot see it. Permissions are translated from a small YAML policy, not copied from each tool's approval history.
What syncs
| Thing | Shared? | How |
|---|---|---|
Skills (SKILL.md) |
Yes | Canonical ~/.agents/skills/. Directory symlink into ~/.claude/skills/. |
| Global instructions | Yes | Canonical ~/.agents/AGENTS.md. File symlink (or hardlink) to ~/.claude/CLAUDE.md and ~/.codex/AGENTS.md. |
| Project instructions | Yes, with a shim | Repo AGENTS.md is the source. agentrecall project writes CLAUDE.md containing @AGENTS.md if that file is missing. |
| Chats | Search only | Native JSONL stays put. SQLite FTS index at ~/.agents/history/index.sqlite. |
| Permissions | Partial | Canonical permissions.yaml. Shell/fetch rules for every agent, plus external_write extra roots for Claude, Codex, and OpenCode. Cursor CLI gets allowlisted commands only. |
| MCP ids, YOLO modes, full OS sandbox profiles | No | Product-specific; not copied. |
| Cursor User Rules | No | They live in the Cursor UI, not a documented file. Paste the same text into Customize → Rules. |
Why not copy?
Copying ~/.agents/skills into every agent directory is how files go stale. On one machine, ~/.agents/skills/dev-browser was current while ~/.claude/skills/dev-browser was months old. agentrecall uses live links instead.
Skill folders are directory symlinks (POSIX cannot hardlink directories). Instruction files try a symlink first, then a hardlink with --link-mode hardlink or when a symlink cannot be created on the same volume.
Install
macOS and Linux. Python 3.11+. uv on PATH. The PyPI package is agentrecall-cli (agentrecall is taken). That install puts the agentrecall command on PATH.
uv tool install agentrecall-cli
agentrecall skills --apply
agentrecall permissions init --apply
agentrecall permissions --apply
That puts agentrecall on PATH, links the bundled search-project-history skill into ~/.agents/skills (and into Claude Code), and grants ~/.agents/history to Claude, Codex, and OpenCode so the search index can update. Cursor, Codex, and OpenCode already read ~/.agents/skills.
One-off without installing: uvx --from agentrecall-cli agentrecall status. From unreleased main: uv tool install git+https://github.com/bluearpit/agentrecall.git.
Then, in a project, build the index once:
agentrecall history reindex --cwd .
The CLI checks GitHub at most once a day and prints a notice when a newer release exists. It does not upgrade by itself. agentrecall upgrade is dry-run; agentrecall upgrade --apply installs that version from PyPI. Agents should ask before applying.
From a checkout:
uv tool install -e .
# or, for development:
uv sync --group dev
uv run agentrecall status
Commands
Write commands are dry-run unless --apply.
agentrecall status
agentrecall upgrade # dry-run
agentrecall upgrade --apply # install that version from PyPI
agentrecall skills # dry-run
agentrecall skills --apply # link ~/.agents/skills into Claude Code
agentrecall skills --apply adopt
agentrecall instructions --apply
agentrecall project --apply # CLAUDE.md -> @AGENTS.md
agentrecall history reindex --cwd .
agentrecall history search "the decision about X" --cwd .
agentrecall history search "the decision about X" --cwd ~/work/other-app
agentrecall history search "the decision about X" --all
agentrecall history search "the decision about X" --cwd . --sort recent
agentrecall history show ~/.claude/projects/.../sess.jsonl --grep "the decision"
agentrecall history list --cwd .
agentrecall history list --cwd . --since 2026-08-01
agentrecall history commands --cwd .
agentrecall history commands --cwd . --kind test
agentrecall permissions init --apply
agentrecall permissions # dry-run mapping
agentrecall permissions --apply # user ~/.agents/permissions.yaml -> user agent files
agentrecall permissions init --cwd . --apply
agentrecall permissions --cwd . --apply # project .agents/permissions.yaml -> project files
--link-mode auto|symlink|hardlink applies to files. Skill folders always symlink.
Layout
~/.agents/
AGENTS.md # global instructions (source of truth)
skills/<name>/SKILL.md # user skills
permissions.yaml # portable allow/deny policy
history/index.sqlite # search index only; not full transcripts
| Agent | Skills | Global instructions | Transcripts (search) |
|---|---|---|---|
| Claude Code | ~/.claude/skills (needs link) |
~/.claude/CLAUDE.md |
~/.claude/projects/**/*.jsonl |
| Cursor | reads ~/.agents/skills |
User Rules in the UI | ~/.cursor/projects/**/agent-transcripts/**/*.jsonl |
| Codex | reads ~/.agents/skills |
~/.codex/AGENTS.md |
~/.codex/sessions/**/*.jsonl |
| OpenCode | reads ~/.agents/skills |
— | not indexed |
CLAUDE_CONFIG_DIR, CODEX_HOME, and XDG_CONFIG_HOME are honored.
History is keyed by project directory (and git root when present). Search, list, and commands default to the current project (--cwd .). Pass --cwd /path/to/project for one other repo, or --all for every indexed project. It is not stored in the git repo. Do not commit ~/.agents/history/. Searching chats is not the same as resuming a Claude session inside Cursor.
The bundled skill search-project-history is installed into ~/.agents/skills on agentrecall skills --apply, then linked into Claude Code like any other skill. Agents should run agentrecall history search "<query>" --cwd . to triage the current repo (or --cwd <path> / --all when the question is not about this repo), then agentrecall history show <source_path> --grep "<term>" to verify, instead of scraping transcript files themselves.
Permissions
Write a small policy, not a dump of every command you ever approved:
allow_shell:
- git status
- git diff
- agentrecall
deny_shell:
- git push --force
allow_fetch:
- github.com
workspace_write: true
external_write:
- ~/.agents/history
agentrecall permissions --apply turns that into:
| Agent | File | What is written |
|---|---|---|
| Claude Code | ~/.claude/settings.json or project .claude/settings.json |
Bash(git status:*), WebFetch(domain:github.com), optional Edit/Write, additionalDirectories, sandbox.filesystem.allowWrite |
| Cursor CLI | ~/.cursor/cli-config.json |
Shell(git status), Shell(agentrecall), WebFetch(github.com) (user-global only; no extra-root mapping) |
| Codex | ~/.codex/rules/agentrecall.rules or project .codex/rules/agentrecall.rules |
prefix_rule allow/forbidden |
| Codex | ~/.codex/config.toml or project .codex/config.toml |
sandbox_workspace_write.writable_roots for external_write |
| OpenCode | opencode.json |
permission.bash / webfetch / edit / external_directory |
The default policy allowlists agentrecall and grants ~/.agents/history so history search can update the index without a one-off sandbox prompt. Add more paths under external_write if you also want ~/.agents/skills writable.
Existing unrelated allow rules are kept. Previously generated agentrecall rules are replaced on the next apply (tracked in permissions.managed.json, not for git).
Not translated: MCP ids (mcp__plugin_...), one-off heredoc approvals, bypassPermissions / run-everything modes, Cursor's sandbox prompt for writes outside the project, or full Seatbelt/Bubblewrap profiles.
See examples/permissions.yaml.
Development
See CONTRIBUTING.md for setup, checks, and how PRs merge.
uv sync --group dev
uv run ruff check src tests
uv run ruff format --check src tests
uv run pytest
CI runs the same lint and tests on Python 3.11–3.13, then builds and smoke-tests the wheel and source distribution. The ci job is the merge gate: it is green only when every check passes. Tests always set HOME to a temporary directory.
A published GitHub release also uploads to PyPI as agentrecall-cli. The workflow uses Trusted Publishing (no API token). GitHub environment pypi; workflow publish.yml.
Related tools
npx skills— install skills from GitHub into agent directories- cc_transcript_viewer — GUI for the same local JSONL files
License
MIT
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 agentrecall_cli-0.2.1.tar.gz.
File metadata
- Download URL: agentrecall_cli-0.2.1.tar.gz
- Upload date:
- Size: 51.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc72de5bae0239cbc9e4956edb3ac6480170925ed0ef20ea90e508ac2d209c87
|
|
| MD5 |
c28c2c8d175c2cbbe30c258841038097
|
|
| BLAKE2b-256 |
cd6739afc0c28f2f4edc8cff34ec7eed39ce8dc9994d2257d8bd824f46bd5b08
|
File details
Details for the file agentrecall_cli-0.2.1-py3-none-any.whl.
File metadata
- Download URL: agentrecall_cli-0.2.1-py3-none-any.whl
- Upload date:
- Size: 35.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d7fd8159d16853c3994a57e1286688aa12cc29f7ee222c1c68246e71a3a3852e
|
|
| MD5 |
1c8724b11a6b2190abb84b6e6d6a3bc9
|
|
| BLAKE2b-256 |
23fb15421ca8512999c62a3b89c6ede5a4d4c0b07540f4fab0bc7f67886ea586
|