aipk.dev — site, docs, demo video
Internal preview — no public binary releases yet.
Package trustworthy AI expertise into one portable file.
A .aipk package carries a domain expert's knowledge, policies, skills, and tools as one versioned, signed artifact — decoupled from any specific model. Point it at Ollama, vLLM, llama.cpp, LM Studio, or a cloud OpenAI-compatible endpoint, and every factual sentence it produces can be traced back to a reviewed, canonical claim and the exact source span that backs it.
Portable — the expert package outlives any one model; swap Llama for Qwen or a cloud API without losing the knowledge or policies. Governed — every claim has an explicit lifecycle (extracted → reviewed → canonical → deprecated) and an audit trail of who approved it. Verifiable — sentence-level provenance ties every factual claim in an answer back to its source document and exact span.
Documents + Policies + Skills + Tools
↓
legal-expert.aipk
↓
Ollama / vLLM / Cloud LLM
↓
Answer → Claim → Source → Exact span
A 4 MB Rust binary. No vector database. No setup beyond ollama.
Who it's for — teams building internal AI assistants on sensitive corporate documents who need local execution, version-controlled knowledge, and an audit trail on every answer. Best fit today: legal, compliance, insurance, fintech, and enterprise operations teams.
| Problem | Solution | Details |
|---|---|---|
| Sharing a "smart agent" means sharing a complex setup | One .aipk file contains everything |
docs |
| RAG pipelines need separate vector databases | Vectors are embedded inside the package | docs |
| No standard way to audit what an LLM actually said | Sentence-level provenance via aipk verify |
docs |
| LLMs hallucinate even with good context | Strict-render mode: model is prompted to cite a verified claim per sentence; every response reports which sentences weren't grounded, and --enforce block can withhold ungrounded answers outright (experimental) |
docs |
| Claims live in a black box | Explicit claim lifecycle: extracted → reviewed → canonical → deprecated | docs |
Full write-ups with worked examples: docs/use-cases/.
Three steps: build a package from documents, review what it knows, serve it and get a verifiable answer. Everything past this point (Beyond the MVP) is real and shipped, but secondary to getting this loop working first.
Requires ollama.
# Build from source (cargo 1.75+) — no pre-built binaries yet
git clone <repository-url> aipk && cd aipk
cargo build --release # binary at: target/release/aipk# 1. Init project
aipk init legal-assistant --dir ./legal-assistant
cd legal-assistant
# 2. Add documents (embeds with ollama)
aipk add-docs contracts.pdf regulations.md \
--embed-model nomic-embed-text \
--llm-url http://localhost:11434
# 3. Add a skill (triggered when user mentions "review")
aipk add-skill skills/contract-review.md
# 4. Build
aipk build -o legal-assistant.aipk
# 5. Inspect
aipk info legal-assistant.aipkaipk serve legal-assistant.aipk \
--model llama3.2 \
--llm-url http://localhost:11434 \
--port 8080
# Force response language (overrides model's language choice)
aipk serve legal-assistant.aipk --model llama3.2 --lang ruPoint any OpenAI-compatible client at http://localhost:8080/v1/ — Continue.dev, Open WebUI, Cursor, or curl. Streaming (stream: true) is fully supported. A built-in chat UI is served at http://localhost:8080/.
aipk up # detect ollama/vLLM/LM Studio/llama.cpp, serve hub packages + chat UI
aipk up legal.aipk gdpr.aipk # or explicit packagesGeneration goes through the standard /v1/chat/completions, embeddings speak
both the ollama API (/api/embed) and the OpenAI API (/v1/embeddings) with
automatic detection — so vLLM, SGLang, llama.cpp and LM Studio work out of the box:
vllm serve Qwen/Qwen2.5-7B-Instruct --port 8000
aipk serve pkg.aipk --llm-url http://localhost:8000 --model Qwen/Qwen2.5-7B-Instruct \
--embed-url http://localhost:11434 # embeddings from ollama, generation from vLLMNo local GPU? Every command that talks to an LLM — add-docs, add-git,
add-web, extract-claims, pipeline, claims embed,
claims check-conflicts, serve, run — accepts --llm-url and
--llm-api-key, so the same package-building workflow above works
unchanged against a hosted OpenAI-compatible endpoint:
aipk pipeline contracts.pdf regulations.md --dir ./legal-assistant \
--llm-url https://api.openai.com \
--llm-api-key "$OPENAI_API_KEY" \
--model gpt-4o-mini --embed-model text-embedding-3-small \
--auto-promote -o legal-assistant.aipkAny provider that speaks the OpenAI API works the same way — OpenAI, Mistral, xAI/Grok, DeepSeek, Together, or a company's own internal LLM gateway connect directly, no adapter needed.
Anthropic Claude and Google Gemini don't expose an OpenAI-compatible endpoint natively — route through OpenRouter instead, and the exact same commands work unchanged, one API key for all of them:
aipk pipeline contracts.pdf regulations.md --dir ./legal-assistant \
--llm-url https://openrouter.ai/api/v1 \
--llm-api-key "$OPENROUTER_API_KEY" \
--model anthropic/claude-3.5-sonnet --embed-model text-embedding-3-small \
--auto-promote -o legal-assistant.aipkSwap --model for google/gemini-2.0-flash, openai/gpt-4o,
mistralai/mistral-large, x-ai/grok-2, or any other model OpenRouter
carries — nothing else in the command changes. aipk serve/aipk run take
the same two flags, so a package built against one provider can be served
against a completely different one without rebuilding it.
AIPK goes beyond RAG. The CLMS section stores atomic facts extracted from your documents, each with a source reference and a lifecycle status (extracted → reviewed → canonical → deprecated). This enables two strict operating modes and post-hoc verification — the second and third steps of the core loop.
aipk extract-claims regulations.pdf contracts.pdf \
--model llama3.2 \
--dir ./legal-assistantClaims are written to claims.jsonl with status extracted. Review and promote them with the aipk claims subcommands (see CLI Reference).
For sources under a license that doesn't permit reproducing excerpts
(proprietary or CC-BY-NC/ND material), --digest rewrites each claim as a
new sentence in the model's own words instead of quoting the source
verbatim — a package built this way is closer to cited study notes than to
a redistributed copy. Pair it with --source-map to attach a real citation
instead of a bare filename:
aipk extract-claims handbook.pdf --dir ./ops-assistant --digest \
--source-map sources.json # {"handbook.pdf": "Ops Handbook, 3rd ed."}aipk verify legal-assistant.aipk \
"Data retention must not exceed 5 years under Article 17." \
--json{
"package": "legal-assistant",
"sentences": [
{
"text": "Data retention must not exceed 5 years under Article 17.",
"verdict": "grounded",
"claim_id": "regs_0012",
"claim_text": "Article 17 limits data retention to 5 years.",
"source": "regulations.pdf",
"span": "retention period shall not exceed five years",
"score": 0.71
}
],
"summary": {
"total": 1,
"grounded": 1,
"coverage": 1.0,
"unsupported_sentences": []
}
}Exit codes (CI/pipeline ready):
0— all sentences grounded1— unsupported sentences found2— package or runtime error
# strict-verify: model is instructed to answer only from canonical claims and say
# "I don't have verified information" if none match — a soft prompt constraint,
# not an enforced refusal (falls back to general knowledge if the package has no claims at all).
# --enforce does not change strict-verify's own behavior — see below.
aipk serve legal-assistant.aipk --strict-verify --model llama3.2
# strict-render: LLM is prompted to cite [claim_id] after every factual sentence;
# by default (--enforce observe) the response is reported on, not blocked — see below
aipk serve legal-assistant.aipk --strict-render --model llama3.2strict-render always prompts the model to cite claims and reports grounding as _aipk metadata on every response. What happens to an ungrounded response depends on --enforce:
--enforce observe(default) — report only, same as before this flag existed. The caller decides what to do withfully_grounded: false.--enforce warn— return the answer, but set_aipk.flagged: trueso it's easy to surface a banner without inspectingcoverageyourself.--enforce block— withhold the ungrounded answer entirely;contentbecomes a refusal message instead.aipk run --strict-render --enforce blockalso exits non-zero, so scripts/CI can detect a block.
{
"_aipk": {
"mode": "strict-render",
"coverage": 0.87,
"canonical_claims_used": 4,
"uncited_sentences": 1,
"invalid_claim_ids": [],
"unsupported_sentences": ["This sentence had no citation."],
"fully_grounded": false,
"verdict": "warn",
"enforce": "warn"
}
}EXPERIMENTAL, read narrowly:
--enforce blockgates on the same singlefully_groundedsignal shown above — citation validity + sentence coverage. It does not check claim freshness, semantic entailment (does the cited claim actually support the sentence?), or contradictions between canonical claims. Treat it as "ungrounded sentences withheld," not "hallucinations eliminated."
# Add a filesystem MCP server to the package
aipk add-tool filesystem \
--command npx \
--args "-y @modelcontextprotocol/server-filesystem /workspace" \
--dir ./legal-assistantTools are launched automatically on aipk serve and exposed to the LLM via OpenAI tool-calling protocol.
Security note:
aipk serve/run/up/mcp/hub serveprint every MCP command a package declares, each server's signature status, and ask for confirmation before launching any of it.--yestrusts the whole package with no prompt;--allow <server>(repeatable) pre-approves specific servers by name without a blanket--yes— once every declared server is covered by--allow, the prompt is skipped, otherwise the remaining servers still get one combined y/N.--allow-tool <server>:<tool>(repeatable) additionally restricts which tools on an approved server can actually be called, rejecting everything else. Running non-interactively without--yes/full--allowcoverage refuses to launch.The signature line shown at the prompt (
integrity OK, unknown publisher (fingerprint SHA256:...)orUNSIGNED) only answers "has this package's bytes changed since some key signed it" — it does not mean the package is safe or that you should trust its publisher. AIPK's signing (aipk sign/aipk keygen) is TOFU (trust-on-first-use): there's no certificate authority, no publisher-identity verification, and no revocation. Read "signed" as integrity, not trust.None of the above is a sandbox. There's still no filesystem/network isolation, no per-tool resource limits, and no timeout enforcement — a command or tool call you approve runs with your full user permissions. Treat an untrusted
.aipkpackage like you'd treat an untrusted shell script, not like an untrusted document. Real process isolation (seccomp/containers) is on the roadmap, not implemented today.
Everything below is real, tested, and shipped — but secondary to the core loop above (build → review claims → serve a verified answer). Reach for it once that loop works for your use case.
# Merge knowledge from multiple packages; RAG results are globally re-ranked
aipk serve legal.aipk gdpr.aipk contracts.aipk \
--model llama3.2 --port 8080
# Graph mode: each query is routed to the best-matching package
# (requires thkg.md in each package describing its domain)
aipk serve legal.aipk medical.aipk finance.aipk \
--model llama3.2 --graph --port 8080Package-as-model dispatch: with multiple packages loaded, /v1/models
lists every package as a "model". A client that sets "model": "legal"
talks to that package only (its persona, knowledge, and policies); any other
model name is forwarded to the backend unchanged.
A dataset is a directory of raw materials, independent from any package:
one dataset can feed many packages. Files dropped into the directory are
picked up automatically (Markdown, PDF, DOCX, CSV/TSV, HTML, JSON, …);
sources.toml links external sources.
aipk dataset init second_me_developer # creates ~/Datasets/second_me_developer/
# drop files into the directory, and/or declare links:# ~/Datasets/second_me_developer/sources.toml
[dataset]
name = "second_me_developer"
[[link]] # local dir (e.g. an Obsidian vault) — read live
type = "dir"
path = "~/Documents/Obsidian/SecondMe"
ext = ["md"]
[[link]] # web pages / sitemap — cached by `dataset sync`
type = "web"
url = "https://docs.example.com/sitemap.xml"
sitemap = true
[[link]] # git repo — cached by `dataset sync`
type = "git"
url = "https://github.com/org/second-me"aipk dataset sync second_me_developer # mirror web/git links into .cache/
aipk add-dataset second_me_developer --dir ./my-project # chunk + embed into the project
aipk build --dir ./my-project -o second_me.aipkDatasets store raw text only — embeddings belong to the package and are
computed at ingest time, so the same dataset works with any embedding model.
Secrets never go into sources.toml; reference environment variables instead.
aipk keygen --name author
aipk seal pkg.aipk --key ~/.aipk/keys/author.pemA sealed package behaves like model weights: serve/run/mcp work
normally, but the file is opaque — contents are AES-256-GCM encrypted, and
aipk extract / aipk export are blocked. Integrity is real cryptography:
the package is Ed25519-signed and the runtime refuses to load a sealed
package that fails verification, so modifying it requires the author's
private key (aipk unseal). License and copyright terms live in the LICN
section (license.toml), which stays readable even when sealed — recipients
always see the terms, aipk info shows them.
Honest scope note: sealing protects against casual reading and against any undetected modification. It is not DRM — a determined attacker with the open-source runtime can recover the plaintext.
If a package is built from people's own contributions — onboarding notes,
wiki pages, Slack exports — it needs to answer both sides of a data subject
request: "give me a copy of what you have on me" (Art. 15/20) and "delete
everything about me" (Art. 17). Both operate on the same underlying unit —
a source — and both can act on a single file or on every file belonging
to one person at once, via a --subject-map ({"filename": "subject id"}):
aipk gdpr list-sources acme-kb.aipk
# Right of access — export everything tied to one person, without changing the package
aipk gdpr snapshot acme-kb.aipk \
--subject alice@acme.com --subject-map subjects.json \
-o alice-snapshot.json
# Right to erasure — remove every source belonging to that person in one call
aipk gdpr erase acme-kb.aipk \
--subject alice@acme.com --subject-map subjects.json
# Single-file shortcut for either command, no map needed
aipk gdpr erase acme-kb.aipk --source alice-onboarding.md --dry-runsnapshot writes a self-contained JSON export (source metadata + every
matching KNOW chunk + every matching CLMS claim) — a portable answer to a
subject access request. erase rebuilds the package with those sections
removed. aipk gdpr report summarizes what personal data a package holds
and flags packages that should be encrypted before distribution.
.aipk sections map 1:1 onto harness concepts, so a package can be unpacked
into the native layout of your agent tool:
aipk export pkg.aipk --to claude-code # CLAUDE.md + .claude/skills/ + .mcp.json + knowledge/
aipk export pkg.aipk --to openclaw # SOUL.md + skills/ + mcp-servers.json + knowledge/
aipk export pkg.aipk --to generic # persona.md + skills/ + tools.json + knowledge/Claims and strict verification have no harness equivalent — keep serving via
aipk serve (or aipk mcp) when you need grounded, auditable answers.
| Command | Description |
|---|---|
aipk doctor |
Check the environment: inference backend reachable, models available, current directory writable |
aipk info <file> |
Inspect package sections and metadata |
aipk init <name> |
Create a new project directory |
aipk init-base |
Create a ready-to-use behavioral base package (small-model friendly) |
aipk add-docs <files> |
Chunk documents and embed (Markdown/PDF/DOCX/CSV/HTML/…) |
aipk dataset init/list/sync |
Manage reusable dataset directories (~/Datasets, $AIPK_DATASETS) |
aipk add-dataset <name> |
Ingest a dataset (own files + dir/web/git links) into a project |
aipk add-git <url|path> |
Import a git repo as knowledge base (shallow clone, filters by extension) |
aipk add-web <url> |
Import web pages or a sitemap as knowledge base (HTML stripped, --sitemap) |
aipk add-skill <file> |
Add a markdown skill with frontmatter trigger |
aipk add-tool <name> |
Add an MCP stdio server |
aipk extract-claims <files> |
Extract atomic claims with LLM |
aipk claims list |
List claims filtered by status |
aipk claims stats |
Claim count distribution per status |
aipk claims promote <id> |
Promote claim to canonical with audit trail |
aipk claims reject <id> |
Mark claim deprecated with audit trail |
aipk claims review |
Interactive y/n/s/q review of pending claims |
aipk claims promote-all |
Bulk-promote all claims of a given status |
aipk claims check-conflicts |
NLI-based conflict detection between canonical claims via LLM |
aipk pipeline <files> |
Full pipeline: embed + extract + review + build in one command |
aipk lint [path] |
Static analysis: injection patterns, homoglyphs, language directive check |
aipk build |
Assemble .aipk from project directory |
aipk extract <file> |
Unpack .aipk back into a project directory |
aipk run <pkg> <query> |
One-shot query (--strict-verify / --strict-render, --embed-url, --enforce observe|warn|block, --allow <server>, --allow-tool <server:tool>) |
aipk serve <pkgs...> |
OpenAI-compatible server (multi-package, streaming, chat UI at /, package-as-model dispatch, --embed-url, --enforce observe|warn|block, --allow <server>, --allow-tool <server:tool>) |
aipk up [pkgs...] |
Turnkey start: autodetect backend, serve hub packages + chat UI |
aipk export <pkg> --to <t> |
Unpack into a harness layout: claude-code / openclaw / generic |
aipk seal <pkg> --key <pem> |
Seal: encrypt contents + Ed25519 sign (opaque, author-locked) |
aipk unseal <pkg> --key <pem> |
Unseal back to an editable package (author's key only) |
aipk verify <pkg> <answer> |
Sentence-level provenance check (--min-coverage for CI) |
aipk bench-scale --sizes <n,...> |
Synthetic-vector benchmark: KNOW section build/load time, size, retrieval latency at scale |
aipk mcp <pkg> |
Expose package as MCP stdio server (--allow <server>, --allow-tool <server:tool>) |
aipk hub install <path|url> |
Install a package into the local hub |
aipk hub list |
List installed hub packages |
aipk hub search <query> |
Search hub by name, description, or tag |
aipk hub publish <pkg> |
Publish a local package to the hub |
aipk hub serve [names...] |
Serve all (or selected) hub packages via OpenAI-compatible API |
aipk hub info <name> |
Show hub package details |
aipk hub remove <name> |
Remove a package from the hub |
aipk hub update [name] |
Re-download URL-sourced packages |
aipk hub status |
Show hub directory and disk usage |
aipk v2-init [dir] |
Create Epistemic v2 template files (IDTY/ANSP/PLCY/NKNW) |
aipk keygen [--name <n>] |
Generate Ed25519 keypair → ~/.aipk/keys/ |
aipk sign <pkg> --key <key.pem> |
Sign package (appends SIGN section, sets SIGNED flag) |
aipk verify-sig <pkg> [--key <pub>] |
Verify Ed25519 signature (exit 0=valid, 1=invalid) |
aipk test <pkg> [--model <m>] |
Run static checks + live LLM tests from TEST section |
aipk encrypt <pkg> --key <passphrase> |
Encrypt content sections with AES-256-GCM |
aipk decrypt <pkg> --key <passphrase> |
Decrypt a previously encrypted package |
aipk gdpr list-sources <pkg> |
List all source documents embedded in the package |
aipk gdpr snapshot <pkg> --source|--subject |
Export everything held about a source/person (KNOW + CLMS + SRCS), unmodified |
aipk gdpr erase <pkg> --source|--subject |
Remove all data from a source, or every source of one person (KNOW + CLMS + SRCS) |
aipk gdpr report <pkg> |
Generate a GDPR compliance report |
.aipk is a binary format: 96-byte header followed by typed sections, with an INDX section at the end listing every section's tag, offset, and size.
The INDX directory exists for external tools to inspect the file layout without a full parse — aipk itself still reads section headers sequentially rather than jumping via INDX, which costs little given how few sections a package has, and sidesteps a real gap: aipk sign appends the SIGN section after INDX is built without updating the directory, so INDX isn't guaranteed complete for signed packages. None of this is about semantic search speed, which is a separate question. Retrieval is a brute-force cosine scan by default: O(n) per query, comfortable through ~100k chunks (~123ms p50). For packages built with more than 20,000 KNOW chunks, aipk build/pipeline also build an HNSW index (via instant-distance) and embed it as an ANNX section — retrieval then drops to low-single-digit milliseconds regardless of package size (~1.3ms p50 at 100k chunks, ~95x faster than brute force there), at the cost of roughly doubling package size and taking noticeably longer to build (the index build itself is O(n log n)-ish and only happens once, at build time — never on aipk run/serve/test load, since those can reload a package once per query). Packages below the threshold, or built before ANNX existed, fall back to brute force. See bench/scale-results.md, reproducible with aipk bench-scale.
[MAGIC "AIPK" | version u32 | name u8[64] | created_at u64 | section_count u32 | flags u32 | indx_offset u64]
[Section: tag u8[4] | flags u32 | size u64 | data] × N
[INDX: section directory]
| Section | Contents |
|---|---|
META |
TOML: name, version, author, description |
PERS |
Plain text persona / system prompt |
KNOW |
24-byte header + gzip(JSONL chunks) + raw float32 vectors |
SKIL |
JSON manifest + markdown skill files |
TOOL |
JSON MCP server configuration |
CLMS |
JSONL: atomic claims with id, text, source, span, status |
CLMV |
float32 vectors for claims (parallel to CLMS; enables semantic matching) |
SRCS |
JSONL: source document registry |
IDTY |
JSON: identity contract (name, role, owner — injected into system prompt) |
ANSP |
JSON: answerability gate (domain keywords, confidence threshold, messages) |
PLCY |
JSON: answer policy (citation_required, forbidden behaviors) |
NKNW |
JSONL: negative knowledge (forbidden topics, acknowledged unknowns) |
THKG |
Plain text domain description for graph routing (aipk serve --graph) |
LICN |
TOML: license / copyright terms — always plaintext, readable even when sealed |
SEAL |
Seal salt (18 bytes) for author-locked packages |
TEST |
JSON: CI test suite (static checks + live LLM assertions) |
SIGN |
Ed25519 signature (98 bytes: 32B pubkey + 64B sig + 2B reserved) |
INDX |
Section directory |
PKDF |
Argon2id salt + params (30 bytes) for passphrase-encrypted packages; present only while encrypted, dropped on aipk decrypt |
Content sections (PERS, KNOW, SKIL, CLMS, CLMV, SRCS, IDTY, ANSP, PLCY, NKNW, TOOL, THKG, TEST) can be encrypted with AES-256-GCM using aipk encrypt, which derives the key from your passphrase with Argon2id (a fresh random salt per encryption, stored in PKDF). META, INDX, SIGN, and PKDF are always stored in plaintext.
Full specification: SPEC.md
Skills are markdown files with YAML frontmatter:
---
name: Contract Review
trigger: review
---
Review the following contract for:
1. Missing termination clauses
2. Liability caps
3. GDPR compliance
Flag any issues with severity (HIGH / MEDIUM / LOW).When the user message contains the trigger word, the skill is injected into the system prompt.
Works with any OpenAI-compatible client — no changes required:
| Tool | How |
|---|---|
| Continue.dev | apiBase: "http://localhost:8080/v1" in config.yaml |
| Open WebUI | Settings → Connections → add URL |
| Cursor | Settings → Models → OpenAI base URL |
| curl / any HTTP client | POST /v1/chat/completions |
- Any LLM backend with
/v1/chat/completions: ollama, vLLM, SGLang, llama.cpp, LM Studio - Embeddings: ollama
/api/embedor any OpenAI-compatible/v1/embeddings(auto-detected;--embed-urlto split from generation) - Recommended models:
llama3.2(generation),nomic-embed-text(embeddings) - Rust 1.75+ to build from source
-
aipk claims list / promote / reject / review / promote-all— explicit claim lifecycle CLI with audit trail -
aipk extract— unpack.aipkcontents to directory - Streaming responses in
aipk serve(stream: true) -
aipk lint— static persona analysis (injection patterns, homoglyphs) -
aipk init-base— ready-to-use behavioral base package for small models -
--langflag inaipk serve— force response language - Semantic claim matching via
CLMV(cosine similarity, cross-language) -
aipk hub— local package registry (install, search, publish, serve, update) - Ed25519 signing —
aipk keygen/aipk sign/aipk verify-sig, SIGN section, tamper detection -
aipk test— TEST section CI harness (static checks + live LLM queries with contains/grounded assertions) - Epistemic v2 — IDTY/ANSP/PLCY/NKNW sections, answerability gate, identity contract, answer policy
-
aipk v2-init— scaffold Epistemic v2 template files -
aipk claims check-conflicts— NLI conflict detection between canonical claims - Graph mode — multi-package routing via THKG embeddings (
aipk serve --graph) -
aipk add-git— import a git repository as knowledge base -
aipk add-web— import web pages or a sitemap as knowledge base - AES-256-GCM encryption —
aipk encrypt/aipk decrypt, transparent--keyin serve/run - GDPR tooling —
aipk gdpr list-sources/snapshot/erase/report, right of access + right-to-erasure at source or subject (person) level - Backend abstraction — dual-API embeddings (ollama + OpenAI
/v1/embeddings),--embed-url - Package-as-model dispatch — select a package per request via the
modelfield - Datasets —
aipk dataset init/list/sync,aipk add-dataset, sources.toml (dir/web/git links) - Document parsers — PDF, DOCX, CSV/TSV, HTML in
add-docsand datasets - Sealed packages —
aipk seal/unseal, opaque content + Ed25519-enforced immutability -
LICNsection — license/copyright terms (license.toml), readable even when sealed -
aipk export— unpack into Claude Code / OpenClaw / generic harness layouts -
aipk up— autodetect backend, serve hub packages, built-in chat UI at/ -
aipk bench-scale— synthetic-vector benchmark for KNOW section I/O and both retrieval strategies at scale - ANN index for retrieval —
aipk build/pipelineembed a pre-built HNSW index (ANNXsection) for packages above 20,000 KNOW chunks; built once at package-build time, not on load (see bench/scale-results.md) - Hard verification gate —
--enforce observe|warn|blockonrun/serve/hub serve, withholds ungrounded strict-render answers instead of only reporting them (experimental — see Strict serving modes) - Per-server/per-tool MCP allowlisting —
--allow <server>,--allow-tool <server:tool>, plus signature status shown at the trust prompt (integrity only, not a publisher-trust chain — see MCP Tools) -
aipk doctor— checks backend reachability, model availability, and directory write access before a new user hits a confusing error - Narrower default
--help— 22 secondary subcommands hidden from the top-level listing (#[command(hide = true)]); all remain fully functional viaaipk <command> --help, listed in full in this CLI Reference
Business Source License 1.1 — free for evaluation, and for individuals or organizations with fewer than 10 employees and under $1M in annual revenue. Converts to Apache License 2.0 on 2030-07-29. See LICENSING.md for what needs a commercial license. Contact: support@aipk.dev.