agentscribe
One source of truth for your AI agent instructions.
Write your project's guidance once in AGENTS.md, and let agentscribe generate and
keep in sync every tool-specific variant — CLAUDE.md, Cursor rules, GitHub
Copilot instructions, Gemini, Windsurf, Cline — then lint the source and fail CI
when the copies drift.
The problem
Every AI coding tool reads its instructions from a different file:
| Tool | File it reads |
|---|---|
| OpenAI Codex | AGENTS.md |
| Claude Code | CLAUDE.md |
| Cursor | .cursor/rules/*.mdc (or .cursorrules) |
| GitHub Copilot | .github/copilot-instructions.md |
| Gemini CLI | GEMINI.md |
| Windsurf | .windsurf/rules/ (or .windsurfrules) |
| Cline | .clinerules/ |
If your team uses more than one of these — and most do now — you end up copy-pasting the same rules into five files and watching them rot out of sync.
The fix
Keep one file (AGENTS.md, the emerging open standard that Codex reads) and
generate the rest:
pip install agentscribe
agentscribe init # scaffold an AGENTS.md from your project
agentscribe sync # generate CLAUDE.md, Cursor rules, Copilot instructions, ...
agentscribe check # in CI: fail if any generated file is out of date
agentscribe lint # catch leaked secrets, dead file refs, bloated instructions
Generated files carry a "do not edit" header and are byte-stable, so check
gives you a clean pass/fail in CI.
Quickstart
$ agentscribe init
Created AGENTS.md (detected: Python)
$ agentscribe sync
+ CLAUDE.md (Claude Code)
+ .cursor/rules/agentscribe.mdc (Cursor)
+ .github/copilot-instructions.md (GitHub Copilot)
Updated 3 file(s) from AGENTS.md.
$ agentscribe check
All target files are in sync with AGENTS.md.
Now edit AGENTS.md whenever your conventions change and re-run agentscribe sync.
Commands
| Command | What it does |
|---|---|
agentscribe init |
Detect the project (language, package manager, test command) and write a starter AGENTS.md. |
agentscribe sync |
Generate/update every configured target file. --dry-run to preview, -t claude,cursor to limit targets. |
agentscribe check |
Exit non-zero if any target is missing or out of date. Made for CI. |
agentscribe lint |
Validate the source: leaked secrets (error), unbalanced directives (error), broken relative-path references, oversized files, missing sections. --strict fails on warnings. |
agentscribe list |
Show every target, whether it's enabled, its path, and sync status. |
Run agentscribe <command> --help for all flags.
Configuration
Configuration is optional. Put it in agentscribe.toml:
source = "AGENTS.md"
targets = ["claude", "cursor", "copilot", "gemini"]
[lint]
max_chars = 12000
[cursor]
legacy = false # true -> write .cursorrules instead of .mdc
description = "Project rules"
always_apply = true
…or under [tool.agentscribe] in pyproject.toml. Available target keys:
claude, cursor, copilot, gemini, windsurf, cline.
Scoping content to specific tools
Most guidance is shared, but sometimes one tool needs its own note. Use HTML-comment directives — invisible when the file renders as Markdown:
Shared guidance for every agent.
<!-- agentscribe:only cursor,copilot -->
This paragraph is emitted only into the Cursor and Copilot files.
<!-- agentscribe:end -->
<!-- agentscribe:except claude -->
Goes everywhere except CLAUDE.md.
<!-- agentscribe:end -->
<!-- agentscribe:ignore -->
Private notes that stay in AGENTS.md and are never copied anywhere.
<!-- agentscribe:end -->
Directives may be nested.
Use in CI
Add a check so generated files can never silently drift. GitHub Actions:
- run: pip install agentscribe
- run: agentscribe check # fails the build if CLAUDE.md et al. are stale
- run: agentscribe lint # fails on leaked secrets or malformed instructions
Library API
Everything the CLI does is available programmatically:
from agentscribe import Config, sync, check, lint
cfg = Config.load(".")
sync(cfg) # write all target files
drift = check(cfg) # list of out-of-date targets
findings = lint(cfg) # list of Finding(level, rule, message, line)
How is this different from copy-pasting or a symlink?
- Symlinks don't work: each tool wants a different format and location
(Cursor needs YAML front-matter; Copilot lives under
.github/), and symlinks are fragile on Windows and in Git. - Copy-pasting is exactly the drift problem this tool removes.
- agentscribe transforms one source into each tool's real format, and
checkturns "did someone forget to update a file?" into a CI failure.
Design goals
- Near-zero dependencies. Pure standard library on Python 3.11+ (a single
tomlibackport on 3.9–3.10). - Deterministic output. LF endings, stable ordering — diffs stay clean.
- Conservative linting. Actionable findings over noisy ones.
Contributing
Contributions are welcome — see CONTRIBUTING.md. This project
dogfoods itself: its own CLAUDE.md, Cursor, and Copilot files are generated
from AGENTS.md by agentscribe sync, and CI runs agentscribe check.
License
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 agentscribe-0.1.0.tar.gz.
File metadata
- Download URL: agentscribe-0.1.0.tar.gz
- Upload date:
- Size: 20.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f45da01cf3144562263944573832c54778c9e79c379a2b2ec35d5d6e75b34b40
|
|
| MD5 |
a7af6a0e8fa72a39266b573bb7712908
|
|
| BLAKE2b-256 |
a939f2aecfd452aaba45394d58ab3c3438b85c82050bea4ac6ccee3cb76cdc02
|
Provenance
The following attestation bundles were made for agentscribe-0.1.0.tar.gz:
Publisher:
publish.yml on Lucabiz/agentscribe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentscribe-0.1.0.tar.gz -
Subject digest:
f45da01cf3144562263944573832c54778c9e79c379a2b2ec35d5d6e75b34b40 - Sigstore transparency entry: 2405915819
- Sigstore integration time:
-
Permalink:
Lucabiz/agentscribe@1a47b6f3a1a38da590f59ecfac02b84c2e66c0c9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Lucabiz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1a47b6f3a1a38da590f59ecfac02b84c2e66c0c9 -
Trigger Event:
release
-
Statement type:
File details
Details for the file agentscribe-0.1.0-py3-none-any.whl.
File metadata
- Download URL: agentscribe-0.1.0-py3-none-any.whl
- Upload date:
- Size: 21.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be9457c753bb6fcf498bbb96692f651c83aa167fdf4fcf0498c5b7617b087123
|
|
| MD5 |
d69b15b170458df22580493769bf5d87
|
|
| BLAKE2b-256 |
475893a42804436817a3d0a1b0f65e0c26f39d1d1baa4917d6f7da85f058400d
|
Provenance
The following attestation bundles were made for agentscribe-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on Lucabiz/agentscribe
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agentscribe-0.1.0-py3-none-any.whl -
Subject digest:
be9457c753bb6fcf498bbb96692f651c83aa167fdf4fcf0498c5b7617b087123 - Sigstore transparency entry: 2405915828
- Sigstore integration time:
-
Permalink:
Lucabiz/agentscribe@1a47b6f3a1a38da590f59ecfac02b84c2e66c0c9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Lucabiz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@1a47b6f3a1a38da590f59ecfac02b84c2e66c0c9 -
Trigger Event:
release
-
Statement type: