# ai-catalog-rust
[](https://securityscorecards.dev/viewer/?uri=github.com/Agent-Card/ai-catalog-rust)
Rust libraries for the [AI Catalog specification](https://ai-catalog.io/).
| Resource | Link |
|---|---|
| Specification | |
| Upstream repository | |
| Command-line tool | |
## Workspace
| Crate | Description |
|---|---|
| [`crates/ai-catalog`](crates/ai-catalog/README.md) | Core types (`AiCatalog`, `CatalogEntry`, `HostInfo`, `Publisher`, `Signature`, `TrustManifest`), parse and serialize helpers |
| [`crates/ai-catalog-validate`](crates/ai-catalog-validate/README.md) | Semantic validation and conformance detection |
| [`crates/ai-catalog-trust`](crates/ai-catalog-trust/README.md) | Digest verification and canonicalization |
| [`crates/ai-catalog-discover`](crates/ai-catalog-discover/README.md) | Find a site's catalog through `Link` headers, HTML `` elements and the well-known URI |
| [`crates/ai-catalog-oci`](crates/ai-catalog-oci/README.md) | OCI artifact-set pack/unpack and standard OCI image layout import/export |
`ai-catalog`, `ai-catalog-validate`, `ai-catalog-trust`, and `ai-catalog-discover`
implement the specification. `ai-catalog-oci` is a convenience for distributing catalogs over
existing registry infrastructure; OCI packaging is not part of the spec.
The `ai-catalog` command-line tool lives in
[`Agent-Card/ai-catalog-cli`](https://github.com/Agent-Card/ai-catalog-cli) and consumes
these crates from crates.io.
### Conformance levels
| Level | Requirements |
|---|---|
| **Minimal** | `specVersion`, and every entry carrying `identifier`, `type`, and exactly one of `url` or `data` |
| **Discoverable** | Minimal + a `host` object identifying the catalog operator |
| **Trusted** | Discoverable + a verified publisher endorsement; only `ai_catalog_validate::verify` reports it, `validate` never verifies signatures |
## Usage
```toml
[dependencies]
ai-catalog = "0.2"
ai-catalog-validate = "0.2"
ai-catalog-trust = "0.2"
```
Parse a catalog and look up entries. Unrecognized fields survive a round-trip:
```rust
let catalog = ai_catalog::parse_file("ai-catalog.json")?;
for entry in catalog.search("finance") {
println!("{}", entry.identifier);
}
let entry = catalog.get_by_id("urn:air:example.com:agent:finance");
```
Validate a document and report its conformance level. Signatures are not
cryptographically verified:
```rust
let result = ai_catalog_validate::validate(&catalog);
for diagnostic in &result.errors {
eprintln!("{} {}: {}", diagnostic.code, diagnostic.path, diagnostic.message);
}
```
Verify an attestation digest against its bytes:
```rust
let matches = ai_catalog_trust::verify_digest("sha256:9f86d081...", bytes)?;
```
Find the catalog of a domain or website (`Link` header, HTML ``, well-known URI):
```rust
let found = ai_catalog_discover::discover("example.com")?;
println!("{} via {}", found.url, found.method);
```
Each crate's README covers its API in more detail.
## Development
```sh
just build # cargo build --workspace
just lint # fmt --check + clippy -D warnings
just test # cargo test --workspace
just coverage # llvm-cov summary
```
## Releases
Crates are published to crates.io by
[release-plz](https://release-plz.dev/) when a release pull request merges to
`main`. Version bumps and changelogs are derived from
[conventional commits](https://www.conventionalcommits.org/).
## Governance
| File | Purpose |
|---|---|
| `LICENSE` | Apache License 2.0 |
| `CONTRIBUTING.md` | Contribution workflow and local checks |
| `CODE_OF_CONDUCT.md` | Collaboration expectations |
| `SECURITY.md` | Vulnerability reporting guidance |
| `GOVERNANCE.md` | Project decision-making and branch policy |