Knowledge-Befehle
Lokale Hybrid-Suche über Dateien und Web-Quellen, gebaut auf der @processcube-io/knowledge-sdk (FTS5 + bm25 über bun:sqlite). pc knowledge legt einen lokalen SQLite-Index an, indiziert Markdown-Dateien und URL-Listen und liefert Treffer per CLI oder REST-Server.
Das pc-Binary deckt FTS5 + LLM-Reranking ab. Vektor-Hybrid (sqlite-vec) und ein Crawler mit Playwright laufen als separate Node-Prozesse — Plugin-Skelette gibt es über pc platform create-extension.
Empfohlenes Setup
Es gibt drei realistische Topologien — wählt nach Konsument:
Setup A: Lokaler Developer / AI-Agent per CLI (empfohlen für Einstieg)
Der Konsument (CLI-User oder Agent als Subprozess) ruft das pc-Binary auf. FTS5 + LLM-Reranking als Default-Pipeline:
# Einmalig
export VOYAGE_API_KEY=…
pc knowledge init
pc knowledge add-source filesystem ./docs
pc knowledge index
# Pro Suche (auch für Agent-Aufrufe)
pc knowledge search "<frage>" --rerank --limit 10 -o json- ✅ funktioniert im Binary, kein Node-Setup
- ✅ Rerank deckt semantische Token-Mismatches ab
- ✅ ~0,5 ct pro Query bei
voyage rerank-2 - ❌ Vektor-Hybrid steht nicht zur Verfügung
Für AI-Agents empfohlen, solange ihr im ersten Schritt direkt per CLI integriert und keinen Server zwischenhängt.
Setup B: Plugin-Cron schreibt, Binary liest
Plugins (docs-crawler, github-source, ingest-worker) laufen als Node-Cron und schreiben FTS-Body in die geteilte SQLite. Das Binary liest. Optional schreiben die Plugins zusätzlich Embeddings (*_EMBED=1), aber das Binary kann sie nicht nutzen — sinnvoll nur als Vorbereitung auf Setup C.
Setup C: Zentraler Node-Server, Agents/Browser hitten REST/MCP
Sobald ihr mehr als CLI-Konsumenten habt (Browser-UI, mehrere Agents, Cross-Org-Search), wechselt der Reader auf einen Node-Prozess:
# Server-Maschine, Node-Runtime
npm install sqlite-vec
node dist/pc.js knowledge serve --hybrid --rerankDann profitieren alle Clients — auch CLI-Aufrufe gegen den Server-Endpoint — von voller Hybrid-Suche.
Vom Setup-Pfad A → C ist es kein Flag-Flip, sondern eine Deployment-Entscheidung (Runtime + Service). Plant das bewusst ein, wenn euer Setup über lokales CLI hinauswächst.
Schnellstart
# Index initialisieren (legt knowledge.config.json + .knowledge/index.sqlite an)
pc knowledge init
# Quelle registrieren (Dateipfad oder URL)
pc knowledge add-source filesystem ./docs
pc knowledge add-source web https://example.com/handbook.html
# Indizieren
pc knowledge index # alle Filesystem-Quellen
pc knowledge sync # zusätzlich Web-Quellen
# Suchen
pc knowledge search "timer event"
pc knowledge search "deploy" --source docs --limit 5
pc knowledge search "userTask" -o json | jq '.result.hits[].title'Index anlegen
# Config + leere SQLite anlegen
pc knowledge init
# Bestehende Config überschreiben
pc knowledge init --forceErzeugt im aktuellen Verzeichnis:
knowledge.config.json— Sources + Tokenizer-Wahl.knowledge/index.sqlite— leere FTS5-Datenbank, WAL-Modus aktiv
Der DB-Pfad ist über die Env-Variable KNOWLEDGE_DB_PATH überschreibbar.
Quellen verwalten
# Dateipfad als Quelle registrieren
pc knowledge add-source filesystem ./docs --name docs
# Web-URL als Quelle (für sync)
pc knowledge add-source web https://example.com/handbook.html
# Mit explizitem Namen (sonst wird ein Default abgeleitet)
pc knowledge add-source web https://example.com --name handbookIndizieren
# Alle Filesystem-Quellen aus der Config indizieren
pc knowledge index
# Ad-hoc-Pfad (ohne Config-Eintrag)
pc knowledge index ./notes
# Nur eine bestimmte Quelle
pc knowledge index --source docs
# Mit Reconcile (Orphan-Removal, aktuell best-effort)
pc knowledge index --reconcileDie Indizierung ist inkrementell: Unveränderter Inhalt (gleiche SHA-256 über den Body) wird übersprungen. Ein zweiter Lauf direkt nach dem ersten meldet upserted=0, unchanged=N.
# Filesystem + Web in einem Rutsch (inkl. fetch der Web-URLs)
pc knowledge sync
pc knowledge sync --source handbookSuchen
# Volltext-Suche per FTS5 + bm25
pc knowledge search "timer event"
# Auf eine Quelle einschränken
pc knowledge search "deploy" --source docs --limit 5
# Präfix-Matching (Token wird zu Token*)
pc knowledge search "user" --prefixGlobales Flag -o text|json steuert die Ausgabe (siehe Erste Schritte). Für Pipes:
pc knowledge search "userTask" -o json | jq '.result.hits[].title'Hybrid-Suche (FTS + Vektor)
--mode hybrid kombiniert die FTS-Suche mit Vektor-Ähnlichkeit über sqlite-vec . Die beiden Kandidatenlisten werden per Reciprocal Rank Fusion zusammengeführt (k=60). Sinnvoll für Anfragen, deren Schlüsselbegriffe nicht wörtlich in den Dokumenten stehen.
Voraussetzung: Der Index muss Embeddings enthalten. Einmalig mit --embed indizieren:
# sqlite-vec installieren (Node-only, einmalig im pc-Verzeichnis)
npm install sqlite-vec
# Index neu aufbauen, diesmal mit Embeddings
VOYAGE_API_KEY=… pc knowledge sync --embed
# oder gezielt:
VOYAGE_API_KEY=… pc knowledge index --embed
# Suche im Hybrid-Modus
VOYAGE_API_KEY=… pc knowledge search "scheduled job" --mode hybrid| Env | Default | Zweck |
|---|---|---|
EMBED_PROVIDER | voyage | Aktuell nur voyage. Andere Provider folgen mit dem nächsten Adapter. |
EMBED_MODEL | voyage-3 | Optional; voyage-3-lite (512 dim), voyage-3-large, voyage-code-3. |
VOYAGE_API_KEY / EMBED_API_KEY | — | Provider-Key |
Hybrid-Suche ist Node-only. Das pc-Binary (Bun) hat kein loadExtension für sqlite-vec. Versucht jemand --embed oder --mode hybrid im Binary, bricht der Befehl mit einer expliziten Meldung ab — die FTS-Suche im Binary läuft weiter normal. Für Hybrid die Datei dist/pc.js mit node aufrufen oder einen Plugin-Cron (docs-crawler, github-source, ingest-worker) als Node-Prozess betreiben. Reader (pc knowledge search im Binary) und Writer (Plugin unter Node) teilen sich die SQLite via WAL.
Optionales LLM-Reranking
--rerank schickt die FTS-Top-N durch einen Cross-Encoder und sortiert die Treffer neu. Sinnvoll, wenn die Begriffe der Suchanfrage nicht wörtlich in den Dokumenten stehen.
# Voyage als Provider (Default)
VOYAGE_API_KEY=… pc knowledge search "BPMN scheduled workflow" --rerank
# Cohere alternativ
RERANK_PROVIDER=cohere COHERE_API_KEY=… pc knowledge search "BPMN scheduled workflow" --rerank| Env | Default | Zweck |
|---|---|---|
RERANK_PROVIDER | voyage | voyage oder cohere |
RERANK_MODEL | rerank-2 (voyage), rerank-multilingual-v3.0 (cohere) | Override |
VOYAGE_API_KEY / COHERE_API_KEY | — | Provider-spezifischer Key |
RERANK_API_KEY | — | Fallback, wenn provider-spezifischer Key fehlt |
Die Standard-Pipeline: FTS holt 5 × Limit (mindestens 20) Kandidaten, der Reranker bewertet sie, der Server schneidet auf das gewünschte limit ab. Spalten in der Tabellen-Ausgabe sind dann rerank (höher = relevanter) und rank (bm25, kleiner = relevanter) parallel.
Treffer anzeigen
# Document-ID aus dem search-Output nehmen
pc knowledge show "docs:/abs/path/to/file.md"
# Im Redirect-Modus (Web-Quelle ohne Body) öffnet show die URL im Browser.
# Mit --no-open bleibt es nur Anzeige:
pc knowledge show "<id>" --no-open
# JSON-Output liefert das Dokument plus found-Flag
pc knowledge show "<id>" -o jsonMarkdown-Bodies werden über den eingebauten Terminal-Renderer ausgegeben.
Server-Modus
# REST-Server starten (Default: 127.0.0.1:51344)
pc knowledge serve
# Eigener Port und Interface
pc knowledge serve --port 8080 --host 0.0.0.0REST-Endpoints:
| Methode | Pfad | Zweck |
|---|---|---|
GET | /health | Liveness — {ok:true} |
GET | /api/search?q=&source=&limit=&prefix= | Volltext-Suche |
GET | /api/sources | Liste der Quellen mit Count |
GET | /api/document?id= | Einzelnes Dokument abrufen (ID per Query, weil sie / enthält) |
POST | /api/sync mit {source?} | Sync auslösen |
Mit --rerank läuft die LLM-Pipeline auch hinter /api/search. --hybrid aktiviert die Vektor-Suche, sofern der Index Embeddings hat:
# Vollausstattung: FTS + Vektor + Rerank
VOYAGE_API_KEY=… pc knowledge serve --hybrid --rerankPro-Request-Overrides: ?rerank=1/?rerank=0 und ?mode=fts/?mode=hybrid. Im MCP-Tool knowledge_search greift dasselbe über die rerank- und mode-Argumente.
MCP-Endpoint für AI-Agents
Der Server exponiert die Suche zusätzlich als Model Context Protocol Endpoint, sodass Claude Code, Codex oder eigene Agents den Index ohne CLI-Aufruf abfragen können:
POST /mcp Streamable HTTP (JSON-RPC 2.0)Drei Tools:
| Tool | Argumente | Zweck |
|---|---|---|
knowledge_search | query, source?, limit?, prefix? | Volltextsuche, gleiches Schema wie der CLI-Befehl |
knowledge_get_document | id | Einzeldokument abrufen |
knowledge_list_sources | — | Quellen + Counts |
Einbinden z.B. in Claude Code per claude mcp add pc-knowledge http://127.0.0.1:51344/mcp --transport http.
Der Server ist ein langlebiger Prozess und macht SIGINT/SIGTERM-Shutdown sauber. Reader und Writer können dieselbe SQLite-Datei parallel nutzen (WAL).
Plugins als Cron
Crawler und External-Task-Worker laufen als eigenständige Node-Prozesse und schreiben via WAL in dieselbe SQLite, die pc knowledge liest. Das macht sie cron-tauglich:
# docs-crawler nightly, 3 Uhr
0 3 * * * cd /opt/docs-crawler && KNOWLEDGE_DB_PATH=/var/lib/knowledge/.knowledge/index.sqlite node dist/index.js >> /var/log/docs-crawler.log 2>&1
# github-source stündlich
0 * * * * cd /opt/github-source && KNOWLEDGE_DB_PATH=/var/lib/knowledge/.knowledge/index.sqlite GITHUB_OWNER=5minds GITHUB_REPO=ProcessCube.App.SDK GITHUB_TOKEN=$(cat /etc/secrets/gh) node dist/index.js >> /var/log/github-source.log 2>&1Robustheit:
- Single-Instance-Lock (
.knowledge/crawl.lock) — überlappende Runs werden übersprungen. - Idempotenz via
contentHash— unveränderte Inhalte werden geskippt,pc knowledge searchläuft daneben weiter. - Sauberer Exit auch im Fehlerfall (Browser/Connections werden geschlossen).
Auf Kubernetes:
apiVersion: batch/v1
kind: CronJob
metadata:
name: docs-crawler
spec:
schedule: "0 3 * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: crawler
image: ghcr.io/example/docs-crawler:latest
env:
- { name: KNOWLEDGE_DB_PATH, value: /data/.knowledge/index.sqlite }
volumeMounts:
- { name: data, mountPath: /data }
volumes:
- name: data
persistentVolumeClaim:
claimName: knowledge-pvcconcurrencyPolicy: Forbid ist hier doppelte Sicherheit zum Lockfile.
Erweitern: eigene Plugins
pc knowledge ist Read-Pfad und liefert die Built-in-Sources filesystem und web (einfaches HTTP-fetch). Für eigene Quellen, JavaScript-gerenderte Seiten und Support-Loops liefert pc platform create-extension drei Templates:
# Eigene KnowledgeSource (z.B. Notion, Confluence, GitHub)
pc platform create-extension my-source -t knowledge-source
# Crawler-Plugin mit Playwright, cron-tauglich
pc platform create-extension docs-crawler -t knowledge-crawler
# Generischer Ingest-Worker — Default-Trigger HTTP-Webhook,
# BPMN/Agent/Mail-Varianten als Patterns im README
pc platform create-extension support-loop -t ingest-worker
# BPMN-spezifischer External-Task-Worker (engere Variante)
pc platform create-extension support-bpmn -t external-taskDer ingest-worker ist der empfohlene Einstieg, wenn Trigger und Pipeline getrennt sind: drei Bibliotheks-Funktionen (anonymize, curationGate, ingest) werden vom Default-HTTP-Webhook aufgerufen — eigene Trigger (BPMN External Task, AI-Agent, Mail-Poll) importieren processIngest() aus dist/pipeline.js und rufen es aus dem eigenen Loop auf.
Crawler und External-Task-Worker laufen als eigenständige Node-Prozesse und schreiben via WAL in dieselbe SQLite, die pc knowledge liest.
Plugins mit Embedding: Beide Referenz-Plugins akzeptieren ein optionales *_EMBED=1-Env, das parallel zum FTS-Eintrag ein Embedding schreibt — dann ist die Suche im Hybrid-Modus auch ohne zusätzlichen pc knowledge sync --embed-Schritt direkt einsatzbereit:
DOCS_EMBED=1 VOYAGE_API_KEY=… node examples/docs-crawler/dist/index.js
GITHUB_EMBED=1 VOYAGE_API_KEY=… GITHUB_OWNER=… GITHUB_REPO=… node examples/github-source/dist/index.jsWas pc knowledge nicht macht
- Kein Crawler. URL-Discovery (Sitemap, Frontier-Queue, robots.txt) gehört in ein Crawler-Plugin (
knowledge-crawler-Template). - Keine Hybrid-Suche. Vektor und LLM-Reranking laufen Server-seitig und werden mit der Indexer-Migration des SDK später aktiviert.
- Keine Anonymisierung beim Ingest. Wer aus Support-Tickets indiziert, nutzt das
external-task-Template — dort ist die Pipelineanonymize → curation-gate → upsertDocumenterzwungen.
Env-Variablen
| Variable | Default | Zweck |
|---|---|---|
KNOWLEDGE_DB_PATH | .knowledge/index.sqlite | Override des DB-Pfads |
KNOWLEDGE_TOKENIZER | unicode61 | Tokenizer-Wahl (unicode61 oder trigram) |
Befehlsübersicht
Index & Quellen
| Befehl | Beschreibung |
|---|---|
pc knowledge init [--force] | Config + leere SQLite anlegen |
pc knowledge add-source <filesystem|web> <target> [--name] | Quelle registrieren |
pc knowledge index [path] [--source] [--reconcile] | Filesystem indizieren (inkrementell) |
pc knowledge sync [--source] | Filesystem + Web in einem Rutsch |
Suchen & Anzeigen
| Befehl | Beschreibung |
|---|---|
pc knowledge search <query> [--source] [--limit] [--prefix] | Volltext-Suche per FTS5 + bm25 |
pc knowledge show <id> [--no-open] | Dokument anzeigen oder URL öffnen |
Server
| Befehl | Beschreibung |
|---|---|
pc knowledge serve [--port] [--host] | Lokaler REST-Server (langlebig) |