slickit 0.2.0

Semantic, LLM-Interpretable Component Kit — typed component system
Documentation
# slickit

Semantic, LLM-Interpretable Component Kit. Foundation types for composable components.

## What

Three types that let components be discovered, composed, and instantiated across languages:

- **`Manifest`** — structural surface (type_url, source, requires, provides, relations)
- **`TypedStruct`** — typed data envelope (type_url + opaque JSON value)
- **`TypedRegistry`** — type_url → factory → instance

MSG framework: **Manifest = Mechanics. Skills = Semantics. Governance = external.**

## Install

```bash
# Rust
cargo add slickit --features manifest

# Python
pip install slickit

# TypeScript (npm publish pending)
bun add slickit
```

## Usage

### Rust

```rust
use slick::{Manifest, TypedStruct, TypedRegistryBuilder};
use std::collections::HashMap;

// Describe a component
let manifest = Manifest {
    type_url: "cix.commands.v1.Recon".into(),
    source: "git+https://github.com/mox-labs/tools/recon".into(),
    requires: vec!["cix.v1.Target".into()],
    provides: vec!["cix.v1.ReconReport".into()],
    relations: HashMap::from([
        ("skills".into(), vec!["git+https://github.com/mox-labs/skills/recon".into()]),
    ]),
};

// Register and instantiate
let registry = TypedRegistryBuilder::<String, String>::new()
    .register("example.v1", |value| {
        serde_json::from_value::<String>(value.clone())
            .map_err(|e| e.to_string())
    })
    .build();

let instance = registry.create("example.v1", &serde_json::json!("hello")).unwrap();
```

### Python

```python
from slickit import Manifest, TypedStruct

manifest = Manifest(
    type_url="cix.commands.v1.Recon",
    source="git+https://github.com/mox-labs/tools/recon",
    requires=["cix.v1.Target"],
    provides=["cix.v1.ReconReport"],
    relations={"skills": ["git+https://github.com/mox-labs/skills/recon"]},
)

json_str = manifest.to_json()
manifest2 = Manifest.from_json(json_str)
```

### TypeScript

```typescript
import { Manifest } from "slickit";

const manifest = Manifest.fromObject({
    type_url: "cix.commands.v1.Recon",
    source: "git+https://github.com/mox-labs/tools/recon",
    requires: ["cix.v1.Target"],
    provides: ["cix.v1.ReconReport"],
    relations: { skills: ["git+https://github.com/mox-labs/skills/recon"] },
});

console.log(manifest.typeUrl); // "cix.commands.v1.Recon"
```

## Manifest

Five fields. Pure structure.

```yaml
type_url: cix.commands.v1.Recon
source: git+https://github.com/mox-labs/tools/recon
requires: [cix.v1.Target]
provides: [cix.v1.ReconReport]
relations:
  skills: [git+https://github.com/mox-labs/skills/recon]
  tested_with: [cix.flows.v1.ReconPipeline]
```

- **type_url** — globally unique identity (namespace convention for kind)
- **source** — where it lives (git URL, local path)
- **requires** — input port declarations
- **provides** — output port declarations
- **relations** — extensible typed edges (skills, tested_with, replaces, etc.)

## Dependencies

`serde` + `serde_json`. Nothing else.

## License

Apache-2.0 — see [LICENSE](LICENSE).