First crate of the Pet UI v1 line (feat/pet-ui-v1 branch). Ships: ## Schema (src/schema.rs — 213 LOC) Strongly-typed `PetManifest` covering: - identity (pet_name, user_name, addressing, languages) - voice (tone primary/secondary, humor style + frequency) - edge (profanity, directness, initiative) - appearance (base_shape, size, colours, eyes, expression, accessories) - room (theme, lighting, decor, time_sync) - privacy (public_profile, publish_allowed, share_dreams, share_garden) - interests[] (topic, depth, freshness, vault_path, last_refresh) - routines[] (kind, schedule, template, enabled) - forbidden (topics, tone_patterns) - meta (schema version, timestamps, tune_count) All enums serde-renamed to kebab-case for TOML-native feel. ## Validation (src/validate.rs — 180 LOC) 19-rule validator (R1–R19 per earlier spec). Errors **accumulate** — single validate() call surfaces every issue, not just the first. Covers: - schema version (R1) - name bounds (R2, R2) - languages ISO-639-1 (R4) - tone_secondary cardinality + no-primary-dup (R6) - profanity/language consistency (R10) - interest topic slug-safety (R12) - interest/forbidden contradiction (R14) - schedule grammar: HH:MM, dow-HH:MM, every-Nh, no-commit-for-Nh, N-errors-in-N-calls (R16) - empty-string guards (R18) - ISO-8601 timestamps (R19) - hex-colour sanity on appearance ## Overlay rendering (src/overlay.rs — 128 LOC) Pure function `system_prompt(&PetManifest) -> String`. Deterministic — same manifest → same bytes. Used as prompt-prefix by the runtime at spawn time. ## Identity (src/identity.rs — 117 LOC incl. 5 unit tests) Standard Ed25519 (RFC 8032) via ed25519-dalek. `user_id` = first 16 hex chars of blake3(public_key) — deterministic, 64-bit, URL-safe. Hex-string API for cross-boundary verify. No proprietary crypto, no matrix math. ## CLI (src/bin/kei-pet.rs — 110 LOC) - `kei-pet validate <path>` — parse + run R1–R19 - `kei-pet show <path>` — print rendered overlay - `kei-pet identity new` — generate + store ~/.keisei/identity.key (0600) - `kei-pet identity show` — print public key + user_id - `kei-pet tune` stub (Day 2 — /pet-tune skill lands full implementation) ## Tests - 23/23 integration (tests/validation_tests.rs) — one rejector per rule + accept cases for examples/minimal.toml and examples/full.toml + overlay smoke + multi-error accumulation guard - 5/5 unit (identity module) — keypair roundtrip, user_id determinism, sign/verify, hex API boundary - cargo test -p kei-pet --release: all green ## Examples - examples/minimal.toml — smallest valid manifest - examples/full.toml — every optional section populated ## Scope boundary (enforced by in-file doc comment in lib.rs) NO imports, references, or conceptual mentions of sibling research-grade IP. Identity is standard Ed25519. Cache/projection is standard CQRS. This crate ships as a clean MIT-licensable unit of the KeiSeiKit public surface. Day 2: /pet-setup 7-phase wizard skill that drives this crate via the CLI. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
103 lines
3.4 KiB
TOML
103 lines
3.4 KiB
TOML
[workspace]
|
|
resolver = "2"
|
|
members = [
|
|
"kei-ledger",
|
|
"kei-migrate",
|
|
"kei-changelog",
|
|
"ssh-check",
|
|
"firewall-diff",
|
|
"mock-render",
|
|
"visual-diff",
|
|
"tokens-sync",
|
|
"kei-memory",
|
|
"kei-conflict-scan",
|
|
"kei-refactor-engine",
|
|
"kei-graph-check",
|
|
"kei-store",
|
|
# v0.14 LBM port — 10 new MCP-core primitives
|
|
"kei-router",
|
|
"kei-sage",
|
|
"kei-task",
|
|
"kei-chat-store",
|
|
"kei-crossdomain",
|
|
"kei-search-core",
|
|
"kei-content-store",
|
|
"kei-social-store",
|
|
"kei-curator",
|
|
"kei-auth",
|
|
# v0.15 artifact handoff pipeline
|
|
"kei-artifact",
|
|
# v0.18 exobrain CLI
|
|
"keisei",
|
|
# v1 substrate — local web wizard for scaffolding atoms (Stream A)
|
|
"kei-forge",
|
|
# v1 substrate — atom invocation runtime + schema linter (Stream D)
|
|
"kei-runtime",
|
|
# v1 substrate — shared atom discovery + frontmatter + safe path (Stream E)
|
|
"kei-atom-discovery",
|
|
# agent substrate v1 — phase 3 runtime (Capability trait + registry + compose/spawn/verify)
|
|
"kei-agent-runtime",
|
|
# agent substrate v1 — phase 3 hook-protocol CLI adapter
|
|
"kei-capability",
|
|
# v0.24 unification — unified VPS provisioner (supersedes provision-{hetzner,vultr}.sh)
|
|
"kei-provision",
|
|
# Convergence Layer A — schema-driven verb-template engine for SQLite-CRUD stores
|
|
"kei-entity-store",
|
|
# v1 substrate — atom DAG pipe runtime (topo-sort + JSON piping between atoms)
|
|
"kei-pipe",
|
|
# v1 substrate — deterministic result cache for pure (query/transform) atoms
|
|
"kei-cache",
|
|
# agent substrate v1 — automation envelope: prepare + ledger fork + verify
|
|
"kei-spawn",
|
|
# agent substrate v1 — reconstruct spawn from DNA (ledger row + task.toml + recompose)
|
|
"kei-replay",
|
|
# v0.29 Wave 13 — structural JSON diff primitive (RFC 6902 subset add/remove/replace)
|
|
"kei-diff",
|
|
# v0.29 Wave 13 — durable task scheduler (cron / at / interval) metadata primitive
|
|
"kei-scheduler",
|
|
# v0.29 Wave 13 — filesystem watcher primitive (thin notify wrapper, sync API)
|
|
"kei-watch",
|
|
# v0.30 Wave 14 — bio-inspired pruning (retire idle agents)
|
|
"kei-prune",
|
|
# v0.30 Wave 14 — federated marketplace discovery stub
|
|
"kei-discover",
|
|
# v0.30 Wave 14 — taxonomy graph + lineage stdout visualizer
|
|
"kei-brain-view",
|
|
# v0.30 Wave 14 — whole-brain tar.zst export/import
|
|
"kei-hibernate",
|
|
# v0.30 Wave 14 — ed25519 creator attestation
|
|
"kei-ledger-sign",
|
|
# v0.31 Wave 15 — managed git worktree + ledger lifecycle (fork/collect/gc/rescue)
|
|
"kei-fork",
|
|
# v0.34 Wave 17 — SSoT for DNA format + shared substrate types
|
|
"kei-shared",
|
|
# v0.32 Wave 15 — read-only DNA adjacency/cluster/precedent over kei-ledger
|
|
"kei-dna-index",
|
|
# Pet UI v1 — persona manifest parse/validate + Ed25519 identity + overlay renderer
|
|
"kei-pet",
|
|
]
|
|
|
|
[workspace.package]
|
|
edition = "2021"
|
|
rust-version = "1.75"
|
|
|
|
[workspace.dependencies]
|
|
clap = { version = "4", features = ["derive"] }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
serde_yaml = "0.9"
|
|
sha2 = "0.10"
|
|
image = { version = "0.25", default-features = false, features = ["png"] }
|
|
regex = "1.10"
|
|
rusqlite = { version = "0.31", features = ["bundled"] }
|
|
chrono = { version = "0.4", default-features = false, features = ["clock"] }
|
|
anyhow = "1"
|
|
thiserror = "1"
|
|
tempfile = "3"
|
|
toml = "0.8"
|
|
|
|
[profile.release]
|
|
opt-level = "z"
|
|
lto = true
|
|
strip = true
|
|
codegen-units = 1
|