[workspace]
members = ["xtask"]
[package]
name = "atomwrite"
version = "0.1.37"
edition = "2024"
rust-version = "1.90"
description = "Atomic file operations CLI for LLM agents — read, write, edit, search, replace with NDJSON output"
authors = ["Danilo Aguiar <daniloaguiarbr@proton.me>"]
license = "MIT OR Apache-2.0"
readme = "README.md"
repository = "https://github.com/danilo-aguiar-br/atomwrite"
homepage = "https://github.com/danilo-aguiar-br/atomwrite"
documentation = "https://docs.rs/atomwrite"
keywords = ["cli", "atomic-write", "llm", "ndjson", "file-operations"]
categories = ["command-line-utilities", "filesystem"]
exclude = [
".claude/",
".vscode/",
"docs-prd/",
"docs_prd/",
"docs_rules/",
"/CLAUDE.md",
"/AGENTS.md",
"/MEMORY.md",
"**/graphrag.sqlite",
"**/graphrag.sqlite-shm",
"**/graphrag.sqlite-wal",
"**/.enrich-queue.sqlite",
"**/.enrich-queue.sqlite-shm",
"**/.enrich-queue.sqlite-wal",
"**/.ingest-queue.sqlite",
"**/.ingest-queue.sqlite-shm",
"**/.ingest-queue.sqlite-wal",
".setting.cyber/",
"*.7z",
"*.log",
"*.env",
"*.png",
"*.jpg",
"*.bak",
"*.bak.*",
"*.*.bak",
"*.*.bak.*",
"*.tmp",
"*.tmp.*",
"*.*.tmp",
"*.*.tmp.*",
"*.journal",
"*.journal.*",
"*.*.journal",
"*.*.journal.*",
"*.atomwrite_tmp",
"*.atomwrite_tmp.*",
"*atomwrite_tmp*",
"*_tmp*",
"*.atomwrite-*",
"/*atomwrite-*",
"*.atom_*",
"/*atom_*",
"*.atom-*",
"/*atom-*",
"*._agent_tmp*",
"._agent_tmp*",
"*agent_tmp*",
"*.tmp_*",
"*.*.tmp_*",
"**/gaps.md",
"graphrag.sqlite",
"graphrag.sqlite.enrich-queue.sqlite",
"**/graphrag.sqlite.enrich-queue.sqlite",
"graphrag.sqlite-wal",
".enrich-queue.sqlite",
".enrich-queue.sqlite-shm",
".ingest-queue.sqlite-shm",
".ingest-queue.sqlite-wal",
".commit_hash",
"**/.commit_hash",
"base_*/**",
"docs_rules*/**",
".atomwrite_*/**",
".atomwrite-*/**",
".atomwrite*/**",
".tmp*/**",
".atom_*/**",
".atom-*/**",
".agent_*/**",
"_agent_*/**",
".staging*/**",
".tmp_*/**",
".setting.cyber/**",
"docs_rules_ingest/**",
".claude/**",
".skill-build/**",
".enrich-overnight/**",
".archive/**",
"uploads/**",
"docs_bugs/**",
"*atomwrite-*",
"*atom_*",
"*atom-*",
"gaps.md",
"CLAUDE.md",
"docs-prd/**",
"docs_prd/**",
]
[dependencies]
notify = { version = "8", optional = true }
clap = { version = "4", features = ["derive", "wrap_help", "string", "color", "suggestions", "cargo"] }
clap_complete = "4"
serde = { version = "1", features = ["derive"] }
serde_json = { version = "1", features = ["preserve_order"] }
serde_path_to_error = "0.1"
mimalloc = { version = "0.1", default-features = false }
memchr = "2"
schemars = "1"
thiserror = "2"
fastrand = "2"
anyhow = "1"
tempfile = "3"
blake3 = { version = "1", features = ["mmap", "rayon"] }
rayon = "1"
crossbeam-channel = "0.5"
regex = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", default-features = false, features = ["env-filter", "json", "fmt", "ansi", "std", "registry", "tracing-log"] }
tracing-appender = "0.2"
tracing-error = "0.2"
memmap2 = "0.9"
grep-regex = "0.1"
grep-searcher = "0.1"
grep-matcher = "0.1"
ignore = "0.4"
globset = "0.4"
similar = "3"
filetime = "0.2"
human-panic = "2"
grex = "1.4"
fend-core = "1.5"
ast-grep-core = { version = "0.51", optional = true }
ast-grep-language = { version = "0.51", optional = true }
same-file = "1"
unicode-normalization = "0.1"
sys-locale = "0.3"
rust-i18n = "4.2"
reflink-copy = "0.1"
content_inspector = "0.2"
strsim = "0.11"
heck = "0.5"
serde-saphyr = { version = "1.3", optional = true }
directories = "6"
toml = "0.8"
toml_edit = "0.22"
tree-sitter-language-pack = { version = "1.22.1", default-features = false, features = ["download", "dynamic-loading"], optional = true }
tree-sitter = { version = "0.27", optional = true }
unic-langid = "0.9"
fluent-langneg = "0.14"
zip = { version = "9.0.5", default-features = false, features = ["deflate-flate2"] }
flate2 = { version = "1", default-features = false, features = ["rust_backend"] }
quick-xml = { version = "0.42", default-features = false }
imagesize = { version = "0.14", default-features = false, features = [
"png",
"jpeg",
"gif",
"bmp",
"webp",
"tiff",
"ico",
] }
lopdf = { version = "0.44", default-features = false }
[target.'cfg(unix)'.dependencies]
nix = { version = "0.31", features = ["fs", "signal", "process"] }
libc = "0.2"
signal-hook = "0.4"
xattr = "1"
[target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.61", features = ["Win32_Foundation", "Win32_Storage_FileSystem", "Win32_System_Console"] }
ctrlc = { version = "3.5", features = ["termination"] }
[target.'cfg(target_os = "linux")'.dependencies]
rustix = { version = "0.38", features = ["fs"] }
nix = { version = "0.31", features = ["fs", "signal", "process"] }
libc = "0.2"
signal-hook = "0.4"
[dev-dependencies]
assert_cmd = "2"
predicates = "3"
tempfile = "3"
insta = { version = "1", features = ["json"] }
proptest = "1"
regex = "1"
criterion = { version = "0.5", features = ["html_reports"] }
tracing-test = "0.2"
filetime = "0.2"
[[bench]]
name = "hash_benchmark"
harness = false
[[bench]]
name = "read_benchmark"
harness = false
[profile.release]
opt-level = 3
lto = "fat"
codegen-units = 1
strip = "symbols"
panic = "abort"
overflow-checks = true
debug = false
[profile.bench]
inherits = "release"
[profile.min-size]
inherits = "release"
opt-level = "z"
[profile.release.build-override]
opt-level = 0
codegen-units = 16
[profile.dev.build-override]
opt-level = 0
[profile.dev.package."*"]
opt-level = 2
[profile.dev]
opt-level = 1
[package.metadata.docs.rs]
all-features = true
default-target = "x86_64-unknown-linux-gnu"
targets = [
"x86_64-unknown-linux-gnu",
"x86_64-apple-darwin",
"aarch64-apple-darwin",
"x86_64-pc-windows-msvc",
]
rustdoc-args = ["--cfg", "docsrs"]
[package.metadata.cargo-machete]
ignored = ["flate2"]
[badges.maintenance]
status = "actively-developed"
[features]
default = ["core", "ast", "lang-rust", "lang-ts", "lang-py"]
core = []
ast = ["dep:ast-grep-core", "dep:ast-grep-language", "dep:tree-sitter", "dep:tree-sitter-language-pack", "dep:serde-saphyr"]
lang-rust = []
lang-ts = []
lang-py = []
lang-go = []
lang-full = ["lang-rust", "lang-ts", "lang-py", "lang-go"]
watch = ["dep:notify"]
full = ["default", "lang-full", "watch"]
slow-tests = []
i18n-cjk = []
i18n-rtl = []
i18n-europe = []
i18n-full = ["i18n-cjk", "i18n-rtl", "i18n-europe"]