From faa27bc168d081335d6851052924ee32e910520c Mon Sep 17 00:00:00 2001 From: meh Date: Wed, 29 Jul 2026 01:47:22 +0700 Subject: [PATCH] Prepare crates.io metadata for the first release The `description` is the blurb shown in search results and at the top of the crate page, so it now says what the crate is and carries the words someone would search for. Added `llm` as a keyword over `cli`, since that is how this gets found by someone who does not already know it exists, and the `api-bindings` and `asynchronous` categories alongside `development-tools`. Excluded tests, CI config and the agent working agreement from the package. Tests that spawn real agents would fail for a consumer with none of the three CLIs installed, and the rest is repo furniture rather than library. `docs/` stays in, because the README links to it. README gains the badge header, an install snippet and the one-line statement of what makes this crate different: the mappings are verified against the CLIs rather than taken from their documentation. --- Cargo.toml | 18 +++++++++++++++--- README.md | 20 ++++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e64cd1c..5797164 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,12 +5,24 @@ edition = "2024" # The floor edition 2024 requires, and where the strictest dependencies (uuid, # getrandom) sit. Derived from the dependency graph rather than compile-tested. rust-version = "1.85" -description = "Drive Claude Code, Codex and Copilot CLIs headlessly from Rust, as a library." +description = "Drive the Claude Code, Codex and GitHub Copilot CLIs headlessly from Rust. One request type, one event stream and one session model across all three, with resume and fork." license = "MIT" repository = "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/pathscale/RustAgentAbstraction" readme = "README.md" -keywords = ["agent", "claude", "codex", "copilot", "cli"] -categories = ["development-tools"] +# The published package is the library. Tests that spawn real agents, CI config +# and repo docs are noise in a downloaded crate and would fail for a consumer +# who has none of the three CLIs installed. +exclude = [ + "tests/**", + ".github/**", + "AGENTS.md", + "CLAUDE.md", +] +# Five is the crates.io maximum. "llm" earns a slot over "cli" because it is how +# someone finds this without already knowing the crate exists; the three agent +# names are the other searches that should land here. +keywords = ["agent", "claude", "codex", "copilot", "llm"] +categories = ["development-tools", "api-bindings", "asynchronous"] # Library only, by design. There is no binary: the consumer (an agencyzero GUI, # a service, a test) links this crate and spawns the agent directly, so nothing diff --git a/README.md b/README.md index 61427b4..8bcc2ca 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,20 @@ -# RustAgentAbstraction +# agent-abstraction -`agent-abstraction` drives **Claude Code**, **Codex** and **GitHub Copilot** headlessly from -Rust: one request type, one event vocabulary, one session model across three CLIs that agree -on none of those things. +[![crates.io](https://img.shields.io/crates/v/agent-abstraction.svg)](https://crates.io/crates/agent-abstraction) +[![docs.rs](https://img.shields.io/docsrs/agent-abstraction)](https://docs.rs/agent-abstraction) +[![license](https://img.shields.io/crates/l/agent-abstraction.svg)](LICENSE) + +Drive **Claude Code**, **Codex** and **GitHub Copilot** headlessly from Rust: one request +type, one event vocabulary, one session model across three CLIs that agree on none of those +things. + +```toml +[dependencies] +agent-abstraction = "0.1" +``` + +Every flag mapping and output shape here was verified against the installed CLIs rather than +taken from documentation, which is the part that keeps being wrong. It is a **library, not a CLI**. Your program links it and spawns the agent directly, so nothing marshals a request through a command line and back out of stdout twice.