From 5c08f945145e585518e8db19ba551ee0b4afb9ff Mon Sep 17 00:00:00 2001 From: kaghni Date: Fri, 10 Apr 2026 00:10:45 -0700 Subject: [PATCH] Redesign README with logo, badges, structured install commands --- README.md | 326 +++++++++++++++------------------- docs/public/hivemind-logo.svg | 6 + 2 files changed, 152 insertions(+), 180 deletions(-) create mode 100644 docs/public/hivemind-logo.svg diff --git a/README.md b/README.md index 9ec9a46..cdafc08 100644 --- a/README.md +++ b/README.md @@ -1,266 +1,232 @@ -# Hivemind β€” Claude Code Plugin - -Persistent, shared memory for Claude Code backed by [Deeplake](https://deeplake.ai). Captures conversation history, tool calls, and responses across sessions and makes them searchable by any agent or user in the same workspace. +

+
+ + Hivemind + +
+ Hivemind +
+

+ +

One brain for every agent on your team.

+ +

+ License + Node + Deeplake +

+ +

+ Persistent, cloud-backed shared memory for AI agents.
+ Captures everything. Recalls anything. Shares across sessions, teammates, and machines. +

+ +--- ## What it does -- **Captures** every session's prompts, tool calls, and responses into a shared Deeplake table -- **Intercepts** file operations targeting `~/.deeplake/memory/` and routes them through a virtual filesystem backed by Deeplake cloud SQL -- **Provides** full-text search across all captured memory via `Grep pattern="keyword" path="~/.deeplake/memory"` -- **Upgrades** gracefully: basic mode (just-bash virtual FS) works out of the box; install the Deeplake CLI for full FUSE mount support +- 🧠 **Captures** every session's prompts, tool calls, and responses into a shared cloud SQL table +- πŸ” **Searches** across all memory with BM25 full-text search (falls back to ILIKE when index unavailable) +- πŸ”— **Shares** memory across sessions, agents, teammates, and machines in real-time +- πŸ“ **Intercepts** file operations on `~/.deeplake/memory/` through a virtual filesystem backed by SQL +- πŸ“ **Summarizes** sessions into AI-generated wiki pages via a background worker at session end + +## Platforms -## Installation +| Platform | Status | Install | +|----------------|---------------|-------------------------------------------------------------| +| **Claude Code** | βœ… Stable | See [Quick start](#quick-start-claude-code) | +| **OpenClaw** | πŸ”§ Beta | See [Quick start](#quick-start-openclaw) | +| **Codex** | πŸ”œ Coming soon | β€” | -### As a Claude Code plugin +## Quick start (Claude Code) -From within Claude Code, run: +Add the marketplace: ``` /plugin marketplace add activeloopai/hivemind -/plugin install hivemind -/reload-plugins -/hivemind:login ``` -### Updating - -The plugin auto-updates by default β€” it checks for new versions on each session start and installs them automatically. You'll see a notice when an update is applied; run `/reload-plugins` to activate it. - -To manually update: +Install the plugin: ``` -/hivemind:update +/plugin install hivemind ``` -To toggle auto-updates: +Reload plugins: ``` -autoupdate off # disable (via org management CLI) -autoupdate on # re-enable -autoupdate # check current status +/reload-plugins ``` -### From source (development) +Log in: -```bash -npm install -npm run build -claude --plugin-dir /path/to/hivemind +``` /hivemind:login ``` -## Authentication +That's it. Your agents now share a brain. -After installing the plugin, run `/hivemind:login` to authenticate. This opens a browser for SSO login via the OAuth Device Authorization Flow (RFC 8628). +### Updating -1. Run `/hivemind:login` in Claude Code -2. Browser opens β€” sign in at Deeplake -3. Select your organization -4. Credentials saved to `~/.deeplake/credentials.json` (permissions: 0600) +The plugin auto-updates on each session start. To manually update: + +``` +/hivemind:update +``` -On subsequent sessions, the plugin detects existing credentials and connects automatically. +## Quick start (OpenClaw) -To re-login or switch organizations: +Install from ClawHub (Telegram, TUI, WhatsApp): ``` -/hivemind:login +openclaw plugins install hivemind ``` -Alternatively, set environment variables directly: +Send a message β€” the plugin sends you an auth link. Click, sign in, done. + +## How it works -```bash -export DEEPLAKE_TOKEN=your-token -export DEEPLAKE_ORG_ID=your-org-id -export DEEPLAKE_WORKSPACE_ID=default # optional ``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Your AI Agent β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ πŸ“₯ Capture (every turn) β”‚ + β”‚ prompts Β· tool calls Β· responses β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ 🧠 Hivemind Cloud β”‚ + β”‚ SQL tables Β· BM25 search β”‚ + β”‚ shared across all agents β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ πŸ” Recall (before each turn) β”‚ + β”‚ search memory Β· inject context β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` -## ⚠️ Data Collection Notice +Every session is captured. Every agent can recall. Teammates in the same org see the same memory. + +## Features -This plugin captures the following data and stores it in your Deeplake workspace: +### πŸ” Natural search -| Data | What | Where | -|-----------------------|------------------------------------|---------------------------| -| User prompts | Every message you send to Claude | Shared Deeplake workspace | -| Tool calls | Tool name + full input | Shared Deeplake workspace | -| Tool responses | Full tool output | Shared Deeplake workspace | -| Assistant responses | Claude's final response text | Shared Deeplake workspace | -| Subagent activity | Subagent tool calls and responses | Shared Deeplake workspace | +Just ask Claude naturally: -**All users with access to your Deeplake workspace can read this data.** +``` +"What was Emanuele working on?" +"Search memory for authentication bugs" +"What did we decide about the API design?" +``` -A DATA NOTICE is displayed at the start of every session when capture is enabled. +### πŸ“ AI-generated session summaries -To opt out of capture: `export DEEPLAKE_CAPTURE=false` +After each session, a background worker generates a wiki summary β€” key decisions, code changes, next steps. Browse them at `~/.deeplake/memory/summaries/`. -## Configuration +### πŸ‘₯ Team sharing -| Variable | Default | Description | -|--------------------------|---------------------------|-------------------------------------------| -| `DEEPLAKE_TOKEN` | β€” | API token (auto-set by device login) | -| `DEEPLAKE_ORG_ID` | β€” | Organization ID (auto-set by device login)| -| `DEEPLAKE_WORKSPACE_ID` | `default` | Workspace name | -| `DEEPLAKE_API_URL` | `https://api.deeplake.ai` | API endpoint | -| `DEEPLAKE_TABLE` | `memory` | SQL table for summaries and virtual FS | -| `DEEPLAKE_SESSIONS_TABLE`| `sessions` | SQL table for per-event session capture | -| `DEEPLAKE_MEMORY_PATH` | `~/.deeplake/memory` | Path that triggers interception | -| `DEEPLAKE_CAPTURE` | `true` | Set to `false` to disable capture | -| `DEEPLAKE_DEBUG` | β€” | Set to `1` for verbose hook debug logs | +Invite teammates to your Deeplake org. Their agents see your memory, your agents see theirs. No setup, no sync, no merge conflicts. -### Debug mode and capture control +### πŸ”’ Privacy controls -```bash -# Enable debug logging (writes to ~/.deeplake/hook-debug.log) -DEEPLAKE_DEBUG=1 claude +Disable capture entirely: -# Disable session capture +```bash DEEPLAKE_CAPTURE=false claude ``` -## Usage - -### Search memory - -In Claude Code, just ask: +Enable debug logging: -``` -"What was Emanuele working on?" -"Search deeplake memory for authentication" -"List files in ~/.deeplake/memory/" +```bash +DEEPLAKE_DEBUG=1 claude ``` -Claude automatically checks both built-in memory and Deeplake memory when recalling information. +## ⚠️ Data collection notice -### Interactive shell +This plugin captures session activity and stores it in your Deeplake workspace: -```bash -npm run shell -# ds:/$ ls / -# ds:/$ cat /session_abc123.jsonl -# ds:/$ echo "note" > /notes.txt -``` +| Data | What's captured | +|-----------------------|------------------------------------| +| User prompts | Every message you send | +| Tool calls | Tool name + full input | +| Tool responses | Full tool output | +| Assistant responses | Claude's final response | +| Subagent activity | Subagent tool calls and responses | -### One-shot commands +**All users in your Deeplake workspace can read this data.** A DATA NOTICE is displayed at the start of every session. -```bash -npm run shell -- -c "ls /" -npm run shell -- -c "cat /CLAUDE.md" -npm run shell -- -c "grep -r 'keyword' /" -``` +## Configuration + +| Variable | Default | Description | +|---------------------------|---------------------------|--------------------------------------------| +| `DEEPLAKE_TOKEN` | β€” | API token (auto-set by login) | +| `DEEPLAKE_ORG_ID` | β€” | Organization ID (auto-set by login) | +| `DEEPLAKE_WORKSPACE_ID` | `default` | Workspace name | +| `DEEPLAKE_API_URL` | `https://api.deeplake.ai` | API endpoint | +| `DEEPLAKE_TABLE` | `memory` | SQL table for summaries and virtual FS | +| `DEEPLAKE_SESSIONS_TABLE` | `sessions` | SQL table for per-event session capture | +| `DEEPLAKE_MEMORY_PATH` | `~/.deeplake/memory` | Path that triggers interception | +| `DEEPLAKE_CAPTURE` | `true` | Set to `false` to disable capture | +| `DEEPLAKE_DEBUG` | β€” | Set to `1` for verbose hook debug logs | ## Architecture -``` -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ Claude Code β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ SessionStart β”‚ -β”‚ Auth login (device flow) + inject context + DATA NOTICE β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ UserPromptSubmit β†’ capture.js β†’ INSERT row into sessions β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ PreToolUse β€” intercept commands on ~/.deeplake/memory/ β”‚ -β”‚ β”‚ -β”‚ β”œβ”€ Read/Grep (fast path) β†’ direct SQL query β”‚ -β”‚ β”œβ”€ safe (cat, ls, jq...) β†’ just-bash + DeeplakeFS β”‚ -β”‚ β”œβ”€ unsafe + CLI installed β†’ real bash + FUSE mount β”‚ -β”‚ β”œβ”€ unsafe + no CLI β†’ deny + install prompt β”‚ -β”‚ └─ deeplake mount/login β†’ pass through β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ PostToolUse (async) β†’ capture.js β†’ INSERT row into sessionsβ”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ Stop β†’ capture.js β†’ INSERT row into sessions β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ SubagentStop (async) β†’ capture.js β†’ INSERT row into sessionsβ”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ SessionEnd β†’ spawns wiki-worker.js in background β”‚ -β”‚ β†’ fetches events, runs claude -p, uploads summary β”‚ -β”‚ β†’ /summaries/*.md + /index.md β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ - β”‚ -β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” -β”‚ Deeplake REST API β”‚ -β”‚ sessions table Β· memory table (summaries, index) β”‚ -β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ -``` +### Hook lifecycle (Claude Code) -### Hook events +| Hook | Purpose | Async | +|---------------------|--------------------------------------------------|-------| +| `SessionStart` | Auth login, inject context, DATA NOTICE | No | +| `UserPromptSubmit` | Capture user message | No | +| `PreToolUse` | Intercept and rewrite memory-targeting commands | No | +| `PostToolUse` | Capture tool call + response | Yes | +| `Stop` | Capture assistant response | No | +| `SubagentStop` | Capture subagent activity | Yes | +| `SessionEnd` | Spawn wiki-worker for AI summary | No | -All capture hooks use a single unified `capture.js` bundle β€” one INSERT per event into the sessions SQL table. +### Monorepo structure -| Hook | Bundle | Purpose | Async | -|---------------------|------------------|-------------------------------------------------|-------| -| `SessionStart` | `session-start` | Auth login, inject context, DATA NOTICE | No | -| `UserPromptSubmit` | `capture` | Capture user message | No | -| `PreToolUse` | `pre-tool-use` | Intercept and rewrite memory-targeting commands | No | -| `PostToolUse` | `capture` | Capture tool call + response | Yes | -| `Stop` | `capture` | Capture assistant response | No | -| `SubagentStop` | `capture` | Capture subagent activity | Yes | -| `SessionEnd` | `session-end` | Spawn wiki-worker for AI summary | No | +``` +hivemind/ +β”œβ”€β”€ src/ ← shared core (API client, auth, config, SQL utils) +β”œβ”€β”€ claude-code/ ← Claude Code plugin (hooks, virtual FS, shell) +β”œβ”€β”€ openclaw/ ← OpenClaw plugin (auto-recall, auto-capture) +└── codex/ ← coming soon +``` ## Security -- SQL values escaped with `sqlStr()`, `sqlLike()`, `sqlIdent()` (see `src/utils/sql.ts`) -- Only 80+ allowlisted builtins run in the virtual FS; unsafe binaries pass through or are denied +- SQL values escaped with `sqlStr()`, `sqlLike()`, `sqlIdent()` +- ~70 allowlisted builtins run in the virtual FS; unrecognized commands are denied - Credentials stored with mode `0600`, config dir with mode `0700` - Device flow login β€” no tokens in environment or code - `DEEPLAKE_CAPTURE=false` fully disables data collection -## Local development - -### Prerequisites - -- **Node.js >= 22** β€” install via [nodejs.org](https://nodejs.org) or a version manager: - ```bash - # nvm - nvm install 22 - - # brew - brew install node - ``` - -### Setup +## Development ```bash git clone https://github.com/activeloopai/hivemind.git cd hivemind npm install -npm run build # tsc + esbuild β†’ bundle/ +npm run build # tsc + esbuild β†’ claude-code/bundle/ + openclaw/dist/ +npm test # vitest ``` -### Commands +Test locally with Claude Code: ```bash -npm run build # TypeScript compile + esbuild bundle -npm run bundle # esbuild bundle only (skip tsc) -npm run dev # TypeScript watch mode -npm test # vitest unit tests -npm run shell # interactive shell against real Deeplake -DEEPLAKE_DEBUG=1 npm run shell # with debug logging +claude --plugin-dir claude-code ``` -### Test the plugin locally with Claude Code +Interactive shell against Deeplake: ```bash -claude --plugin-dir . +npm run shell ``` -After making changes, run `npm run build` and send a new message in Claude Code to pick up the updated hooks. - ## License Apache License 2.0 β€” Β© Activeloop, Inc. See [LICENSE](LICENSE) for details. diff --git a/docs/public/hivemind-logo.svg b/docs/public/hivemind-logo.svg new file mode 100644 index 0000000..1af202c --- /dev/null +++ b/docs/public/hivemind-logo.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file