{
"$schema": "https://cmn.dev/schemas/v1/spore-core.json",
"id": "agent-first-data",
"name": "Agent-First Data",
"version": "0.20.0",
"domain": "agentfirstkit.com",
"key": "ed25519.BwbSzqdDYyMN1pPW5snRk3afrJAovHn8aueMvDpfNKVw",
"synopsis": "A naming convention that lets AI agents understand your data without being told what it means, plus a CLI and library for reading and safely editing structured JSON, TOML, YAML, dotenv, and INI documents.",
"intent": [
"Encode all semantic information in the field name itself so agents parse structured data without external schemas, documentation, or type systems — _ms/_s/_epoch_ms for time, _msats/_sats/_usd_cents for currency, _bytes for size, _secret for auto-redaction",
"Define a JSONL output protocol where every line carries a code field (startup for config state, tool-defined for status/progress, ok/error for results) plus a trace object for execution context (duration, token counts, cost, data source) — same structure whether the transport is CLI stdout, HTTP response body, MCP tool result, or SSE stream",
"Provide three output formats via --output json|yaml|plain: JSON is the canonical lossless format, YAML preserves structure with quoted strings and --- separators, plain applies suffix-driven human formatting (epoch_ms → RFC 3339, _bytes → human-readable, _secret → ***, _ms ≥ 1000 → seconds)"
],
"license": "MIT",
"mutations": [
"Move source-preserving editing onto the in-memory Document — set/unset/add/remove edit a string in place with no file — and reduce DocumentFile to a thin file adapter adding open, an atomic guarded save, and an edit() commit closure.",
"Stop auto-persisting document edits: the verbs stage in memory and a new public save() is the single atomic commit point, so callers can batch edits and validate the result before anything is written.",
"Grow sparse and nested documents in place — the source editor creates missing intermediate parents (JSON deep object chains, TOML tables) and the JSON backend sets or replaces collection values — matching the in-memory set_path.",
"Make Document::unset idempotent, returning whether it removed anything, so clearing an optional key needs no existence pre-check; the afdata unset CLI keeps its strict error-on-missing behavior.",
"Fix a JSON unset that took a comma belonging to an enclosing container when deleting the sole or last member of a nested object, which produced invalid JSON."
],
"bonds": [],
"tree": {
"algorithm": "blob_tree_blake3_nfc",
"exclude_names": [
".git",
".cmn"
],
"follow_rules": [
".gitignore"
]
}
}