{
"$schema": "https://cmn.dev/schemas/v1/spore-core.json",
"id": "agent-first-data",
"name": "Agent-First Data",
"version": "0.34.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 Markdown structure 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 kind discriminator (result, error, progress, or log), a payload field named after that kind, and 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 the atomic file installation — private same-directory temporary file, fsync, atomic install, parent-directory fsync — into one shared sequence, so skill install gains the parent fsync it was missing and no longer reports success while the new directory entry can still be lost to a power cut; a failure that leaves the file installed but its durability unconfirmed now says so",
"Refuse to reach a skill file or a bundled asset through a symlinked directory below the skills root on install, uninstall and status, closing the path where a linked skills subdirectory redirects a fixed-name write and lets uninstall delete wherever it pointed; --force no longer offers itself as the remedy, because it permits replacing an unmanaged file inside the root, not writing outside it",
"Return asset-removal failures from skill uninstall instead of reporting removed while a managed file survived, and add assets_removed and directory_retained so a half-removed target is visible to the next status, which reads a SKILL.md that is already gone",
"Read a prompted secret through the terminal API directly rather than spawning stty from PATH, read back what tcsetattr actually applied, announce a failed restore on the terminal where the damage is, and refuse the prompt source in a build without the libc feature rather than reading with echo left on",
"Support the prompt value source on Windows, which previously refused it: the prompt goes to the process's own console so a redirected stdout keeps the structured stream clean, echo comes off through SetConsoleMode and is verified by reading the mode back, and the line is read with ReadConsoleW so a secret holding anything outside the console's code page round-trips losslessly instead of arriving as different bytes",
"Fix four things only a Windows run would have failed on: an enum variant and an import that are dead there, which -D warnings turns into errors; a test asserting a POSIX separator against a message that names the local path; a gate check that executed a shell script directly, which CreateProcess cannot do because it reads an executable's header rather than a shebang; and a published checksum file that Git Bash spells with a binary-mode marker where every other platform writes two spaces",
"Add reference_note to CommandSpec and the v1 CLI-spec schema for the paragraph that belongs to no single argument, so prose in a generated reference survives regeneration instead of being hand-written into a file whose own header says not to edit it",
"Rewrite the generated error-handling promise so it says what it means: a message never quotes a value from an argument able to carry a credential, and does quote a path, dot-path or session name, replacing an absolute rule the tool itself could not follow",
"Require ShellCheck at one pinned version through install-shellcheck.sh, lint every shell script in the checkout instead of two hand-named files, refuse rather than silently skip where upstream publishes no build, provision the same pin in CI, and prove the gate finishes with its caller's stdin left open",
"Verify a release build's HEAD is the tag's own commit before building and again at upload, compare an existing asset byte for byte — identical is an idempotent success, different is refused — and discard only an asset GitHub reports as never uploaded, so published hashes cannot be quietly replaced",
"Upgrade noyalib 0.0.18 to 0.0.27, and pin the release workflow's action versions and runner images"
],
"bonds": [],
"tree": {
"algorithm": "blob_tree_blake3_nfc",
"exclude_names": [
".git",
".cmn"
],
"follow_rules": [
".gitignore"
]
}
}