knishio
Unified CLI for orchestrating the KnishIO validator stack — production deployment, Docker control, cell management, database management, benchmarks, embeddings, and health checks.
Quick Start
# Install the CLI
# Start the validator stack
# Create a cell and check health
# Run a benchmark
# Tear it all down
Production Quick Start
# One-time setup: generates secrets, config, TLS certs
# Launch the production stack
# Seed your cell
# Verify everything
Installation
From crates.io (recommended)
This installs the knishio binary into ~/.cargo/bin/.
From source
Requires Rust 1.70+.
The binary is at target/release/knishio. Optionally copy it onto your PATH:
Prerequisites
- Docker with the
composeplugin (v2) - Running validator stack for cell, health, backup, and embed commands
- openssl for TLS certificate generation (
knishio init --tls)
Configuration
The CLI uses a layered configuration system. Values are resolved in this order (highest priority wins):
- CLI flags (
--url, etc.) - Environment variables (
KNISHIO_URL, etc.) - Config file (
knishio.toml, auto-discovered) - Built-in defaults
Config File
Place a knishio.toml anywhere in the project tree — the CLI walks up from your current directory to find it.
[]
= "https://localhost:8080"
= false # set to true for self-signed certs
[]
= "docker-compose.standalone.yml"
= "knishio-postgres"
= "knishio-validator"
[]
= "knishio"
= "knishio"
For production, knishio init generates a knishio.toml that points to docker-compose.production.yml instead.
Environment Variables
| Variable | Config Field | Default |
|---|---|---|
KNISHIO_URL |
validator.url |
https://localhost:8080 |
KNISHIO_PG_CONTAINER |
docker.postgres_container |
knishio-postgres |
KNISHIO_VALIDATOR_CONTAINER |
docker.validator_container |
knishio-validator |
KNISHIO_DB_USER |
database.user |
knishio |
KNISHIO_DB_NAME |
database.name |
knishio |
KNISHIO_INSECURE_TLS |
validator.insecure_tls |
false |
Global CLI Flags
--url <URL> Validator base URL for health commands [default: https://localhost:8080]
-h, --help Print help
-V, --version Print version
The --url flag applies to health, ready, full, and db commands. TLS certificates are validated by default. To accept self-signed certificates (e.g., local dev), set insecure_tls = true in knishio.toml or KNISHIO_INSECURE_TLS=true. All health requests have a 30-second timeout.
Production Deployment
init
Initialize a production deployment. Generates secrets, configuration, and optionally TLS certificates.
| Flag | Description |
|---|---|
--tls |
Generate self-signed TLS certificates (valid 365 days) |
--cors <ORIGINS> |
Set CORS_ORIGINS in the generated .env.production |
What it creates:
| File/Directory | Contents |
|---|---|
secrets/jwt_secret |
Random 64-character hex string |
secrets/db_password |
Random 32-character alphanumeric password |
secrets/db_url |
Full Postgres connection string with generated password |
knishio.toml |
CLI config pointing to docker-compose.production.yml |
.env.production |
Environment config (CORS origins, feature flags) |
certs/ |
Self-signed TLS certificate and key (if --tls) |
backups/ |
Empty directory for database backups |
models/ |
Empty directory for GGUF model files |
All secret files are created with 600 permissions and the secrets/ directory with 700.
# Full production init
# Without TLS (bring your own certs)
Running init again is safe — it skips files that already exist.
Production vs Standalone
The production compose (docker-compose.production.yml) differs from standalone in:
- Secrets injected via Docker
_FILEconvention (not environment variables) KNISHIO_ENV=production(enforces strong JWT secret)- Rate limiting and rule enforcement enabled
- JSON structured logging
- Resource limits on containers (memory + CPU)
- Log rotation (50MB max, 5 files)
restart: always
Docker Control
All Docker commands locate the compose file automatically by walking up from your current directory (see Path Discovery). When using docker-compose.production.yml, the CLI automatically loads .env.production as the env file.
start
Start the validator stack (Postgres + validator).
| Flag | Description |
|---|---|
--build |
Build images before starting |
-d, --detach |
Run in detached mode (background) |
# Interactive foreground
# Detached with rebuild
stop
Stop all containers without removing them.
destroy
Remove containers and networks. Optionally remove volumes (all data).
| Flag | Description |
|---|---|
--volumes |
Also remove volumes — all data will be lost |
rebuild
Full no-cache rebuild of the validator image, then restart in detached mode.
Equivalent to:
update
Pull or build the latest version, restart the stack, and verify health before declaring success.
| Flag | Description |
|---|---|
--build |
Rebuild from source instead of pulling images |
--rollback |
Revert to the previous image version |
The update process:
- Pulls latest images (or rebuilds from source with
--build) - Restarts only changed services (Postgres keeps running)
- Polls
/readyzuntil it returns 200 (up to 120-second timeout) - Reports before/after version numbers from
/health - If health check fails: prints recent logs and suggests next steps
# Pull latest image and restart
# Rebuild from source
# Roll back after a failed update
logs
Show container logs.
| Flag | Description |
|---|---|
-f, --follow |
Follow log output in real time |
--tail <N> |
Show only the last N lines |
# Follow logs, last 100 lines
status
Show running container status (equivalent to docker compose ps).
Cell Management
Manage cells (application-specific sub-ledgers) in the validator's database. Commands execute SQL via docker exec into the knishio-postgres container.
cell create
Create a new cell or update an existing one.
| Argument/Flag | Description | Default |
|---|---|---|
<SLUG> |
Cell slug identifier (required) | — |
--name |
Human-readable display name | Same as slug |
--status |
Initial status | active |
If the slug already exists, the cell's name and status are updated (upsert).
Validation Rules
| Field | Constraints |
|---|---|
| Slug | 1-64 characters, alphanumeric + dashes + underscores only ([a-zA-Z0-9_-]) |
| Name | 1-256 characters, no null bytes or control characters |
| Status | Must be one of: active, paused, archived |
Invalid input is rejected before any database operation runs.
cell list
List all cells with their status and creation time.
Output:
Cells
SLUG NAME STATUS CREATED
--------------------------------------------------------------------------------
public Public Cell active 1773423688
TESTCELL Test Cell active 1773423694
cell activate / pause / archive
Change a cell's status.
# Pause a cell (molecules targeting it will be rejected)
# Reactivate it
# Archive (soft-delete)
Database Management
backup create
Create a database backup using pg_dump via the postgres container.
| Flag | Description | Default |
|---|---|---|
-o, --output |
Output file path | backups/knishio_YYYYMMDD_HHMMSS.sql |
# Default timestamped backup
# Custom output path
Output includes file size:
ℹ Backing up database to backups/knishio_20260406_174028.sql...
✓ Backup complete: backups/knishio_20260406_174028.sql (0.1 MB)
backup list
List available backups in the backups/ directory, sorted newest-first.
Output:
ℹ Found 3 backup(s):
backups/knishio_20260406_174028.sql (89 KB)
backups/knishio_20260405_120000.sql (85 KB)
backups/knishio_20260404_090000.sql (82 KB)
restore
Restore the database from a backup file. Drops and recreates the database, then verifies consistency via /db-check.
| Argument/Flag | Description |
|---|---|
<PATH> |
Path to the backup SQL file (required) |
--skip-verify |
Skip the post-restore /db-check verification |
# Restore with automatic verification
# Restore without verification (faster, for development)
The restore process:
- Terminates existing database connections
- Drops and recreates the database
- Pipes the SQL backup into
psql - Runs
/db-checkto verify migrations and schema integrity
psql
Open an interactive psql session or run a single SQL command against the validator's database.
| Flag | Description |
|---|---|
-c, --command |
Run a single SQL command instead of interactive mode |
# Interactive session
# Single query
# Check table sizes
Benchmarks
Benchmark commands generate ContinuID-compliant pre-signed molecules and submit them to the validator. Plans are stored as SQLite files for reproducibility.
bench run
Generate a benchmark plan and execute it in one shot. The temporary plan file is cleaned up automatically (unless --keep is set).
| Flag | Type | Default | Description |
|---|---|---|---|
--identities |
int | 50 | Number of test identities |
--types |
CSV | meta |
Molecule types: meta, value-transfer, rule, burn |
--metas-per-identity |
int | 100 | Meta mutations per identity |
--transfers-per-identity |
int | 10 | Value transfers per identity |
--rules-per-identity |
int | 5 | Rule molecules per identity |
--burns-per-identity |
int | 5 | Burn molecules per identity |
--token-amount |
float | 1000000.0 | Initial token supply for value transfers |
--endpoint |
URL | https://localhost:8080 |
Validator GraphQL endpoint |
--concurrency |
int | 5 | Concurrent molecule submissions |
--cell-slug |
string | (none) | Target cell slug |
--keep |
flag | false | Retain benchmark data in DB after execution |
# Quick meta-only benchmark
# Mixed isotope benchmark
# High-throughput stress test (keep data for inspection)
bench generate
Generate a pre-signed benchmark plan file (SQLite) without executing it. Useful for reproducible benchmarks.
| Flag | Type | Default | Description |
|---|---|---|---|
-o, --output |
path | (required) | Output SQLite plan file |
--identities |
int | 50 | Number of test identities |
--types |
CSV | meta |
Molecule types |
--metas-per-identity |
int | 100 | Meta mutations per identity |
--transfers-per-identity |
int | 10 | Value transfers per identity |
--rules-per-identity |
int | 5 | Rule molecules per identity |
--burns-per-identity |
int | 5 | Burn molecules per identity |
--token-amount |
float | 1000000.0 | Initial token supply |
bench execute
Execute a previously generated plan file against the validator.
| Flag | Type | Default | Description |
|---|---|---|---|
<PLAN> |
path | (required) | Path to SQLite plan file |
--endpoint |
URL | https://localhost:8080 |
Validator endpoint |
--concurrency |
int | 5 | Concurrent submissions |
--cell-slug |
string | (none) | Target cell slug |
--keep |
flag | false | Retain benchmark data after execution |
# Execute with high concurrency
bench clean
Clean up benchmark data from the database. Only cells prefixed with BENCH_CLI_ can be purged (safety guard).
| Flag | Description |
|---|---|
--cell-slug |
Purge a specific benchmark cell |
--all |
Purge ALL benchmark cells (BENCH_CLI_*) |
# Clean up a specific benchmark cell
# Clean up all benchmark data
Embedding Management
Manage the DataBraid VKG (Vector Knowledge Graph) embedding system. Requires EMBEDDING_ENABLED=true on the validator.
embed status
Show embedding coverage statistics — how many metadata records have embeddings, which models are in use, and coverage percentages.
embed reset
Clear embeddings so the validator's automatic backfill worker re-embeds them. Useful after changing embedding models or dimensions.
| Flag | Description |
|---|---|
--model |
Clear only embeddings from a specific model |
--all |
Clear ALL embeddings (nuclear option) |
-y, --yes |
Skip confirmation prompt |
# Clear embeddings from a specific model
# Clear everything
embed search
Run semantic (vector similarity) search against DAG metadata from the terminal.
| Flag | Type | Default | Description |
|---|---|---|---|
<QUERY> |
string | (required) | Natural language search query |
--limit |
int | 10 | Maximum number of results |
--threshold |
float | 0.7 | Minimum cosine similarity (0.0 to 1.0) |
--meta-type |
string | (none) | Filter results by meta_type |
embed ask
Ask a natural language question about DAG data using RAG (Retrieval-Augmented Generation). Requires GENERATION_ENABLED=true on the validator.
| Flag | Type | Default | Description |
|---|---|---|---|
<QUESTION> |
string | (required) | Natural language question |
--max-results |
int | 20 | Maximum source records to consider |
--threshold |
float | 0.5 | Minimum cosine similarity |
--meta-type |
string | (none) | Filter by meta_type |
Health Checks
HTTP GET requests to the validator's health endpoints. TLS certificates are validated by default (30-second timeout). Set insecure_tls = true in config to accept self-signed certificates for local development.
health
Quick liveness check.
# ✓ Healthy (https://localhost:8080)
Hits GET /healthz. Returns success on HTTP 200.
ready
Readiness check (is the validator ready to accept traffic?).
# ✓ Ready
Hits GET /readyz. Returns success on HTTP 200.
full
Readiness check with full detail — prints the JSON response body.
# ✓ Ready
# {
# "status": "ready",
# "database": { "status": "connected", "latency_ms": 3 },
# "migrations": { "applied": 40, "expected": 34, "is_current": true },
# "cache": { "entries": 0, "hit_ratio": "0.00" },
# "version": "0.2.0"
# }
db
Database consistency check — migrations, schema integrity, and issue reporting.
# ✓ Database consistency check passed
#
# Migrations
# Applied: 40 / 34 expected
# Up to date
If issues are found:
# ✗ Database consistency check FAILED
#
# Migrations
# Applied: 36 / 38 expected
# Migrations pending!
#
# Issues
# • Missing table: cells
# • Missing trigger: cascade_on_bond_insert
Hits GET /db-check. Reports migration status, missing tables, and missing triggers.
Path Discovery
The CLI automatically finds required files by walking up the directory tree from your current working directory.
Docker Compose file — checks in order:
./<compose_file>(fromknishio.tomlor default)./knishio-validator-rust/<compose_file>./servers/knishio-validator-rust/<compose_file>
The default compose file is docker-compose.standalone.yml. After running knishio init, the generated knishio.toml points to docker-compose.production.yml instead.
Env file auto-loading — when the compose file name contains "production" and a .env.production file exists in the same directory, the CLI automatically passes --env-file .env.production to Docker Compose.
Config file — checks in order:
./knishio.toml./knishio-validator-rust/knishio.toml./servers/knishio-validator-rust/knishio.toml- (walks up parent directories repeating the above)
This means the CLI works whether you run it from inside the validator dir, the servers dir, or the monorepo root.
Example Workflows
Development
# 1. Start the stack
# 2. Wait for readiness
# 3. Create a test cell
# 4. Check database state
# 5. Run a mixed benchmark
# 6. Check DAG explorer
# Open https://localhost:8080/dag in your browser
# 7. View logs if something looks wrong
# 8. Rebuild after code changes
# 9. Clean up when done
Production Deployment
# 1. First-time setup
# 2. Launch production stack
# 3. Seed your application cell
# 4. Verify health
# 5. Create initial backup
Ongoing Operations
# Before any upgrade, take a backup
# Pull latest and restart (health-gated)
# If something goes wrong
# List available backups
# Restore from backup if needed
# Quick database query
# Check embedding coverage
# Semantic search
Output Symbols
| Symbol | Meaning |
|---|---|
| ✓ | Success (green) |
| ℹ | Informational (blue) |
| ⚠ | Warning (yellow) |
| ✗ | Error (red) |