DeepSeek Harness Remote
DeepSeek Harness Remote 可将手机或另一台电脑与你运行 DeepSeek Harness 的电脑安全连接,随时随地继续你的工作,方便随时查看进度并继续工作。
AI 翻译
尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Local, autonomous AI agent for knowledge work — works your task queue while you sleep.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗ {o,o}
/)_)
" "
An AI agent for knowledge work. Point Botholomew at your docs, projects, and inboxes and it reads them, remembers them, and works a durable task queue — summarizing, researching, organizing, chasing things down — while you sleep, work, or chat with it. It runs locally (local LLMs included), and it's built around a large memory store rather than a single chat window.
Botholomew has no shell and no access to your real filesystem. The
agent's world is a per-project knowledge store managed by
membot — every read, write,
search, and delete is addressed by logical_path (a DB key, not a
filesystem path), so a prompt-injected attempt to reach ~/.ssh/id_rsa
has nowhere to land. Local files and URLs are brought in through
botholomew membot add. External capabilities (email, Slack, the web,
and hundreds of other services) are granted deliberately, per project,
through MCP servers wired up via
MCPX.
I built the agent I wanted for my own manager-style work — the reading, summarizing, chasing-down, and remembering that fills a week. Nothing on the shelf fit, so Botholomew is opinionated on purpose:
It's also nerdy by design: every prompt, task, thread, and belief is a
plain file I can open, grep, and git diff. — Evan
membot
store with hybrid BM25 + semantic search, append-only versioning, and
history you can diff. Big tool responses get piped into the same store
so the agent can work through megabytes of JSON without burning tokens.--persist worker, or point cron at botholomew worker run.git diff it, check it in (or .gitignore it).vim, grep, and git. The
knowledge store is a single local DuckDB file (index.duckdb,
managed by membot) — append-only,
versioned, queryable with the DuckDB CLI if you ever want to. Model
calls go direct to Anthropic; any further reach is scoped to the MCP
servers you add.logical_path (an opaque DB
string, not a filesystem path); every external capability is an MCP
server you explicitly add. The remaining file-system paths the agent
touches (tasks/, schedules/, prompts/, skills/) all route
through a single sandbox helper (NFC normalization + lstat-walk to
reject symlinks at any level).A full tour of the chat TUI — every tab, slash-command autocomplete, the message queue, tool-call visualization, and the live workers panel:
Prebuilt binary (no Bun required — one self-contained file per platform):
curl -fsSL https://raw.githubusercontent.com/evantahler/botholomew/main/install.sh | sh
macOS (arm64) and Linux (x64); on Windows grab botholomew-windows-x64.exe
from the releases. Then
botholomew upgrade updates it in place.
With Bun (requires Bun 1.1+):
bun install -g botholomew
Either way the CLI installs as both botholomew and bothy — the same binary, two names.
Or run the dev build from a checkout:
git clone https://github.com/evantahler/botholomew
cd botholomew
bun install
bun run dev -- --help
# 1. Initialize a project in the current directory
botholomew init
# 2a. Add your Anthropic key (Claude is the default) to config/config.json, or export it
export ANTHROPIC_API_KEY=sk-ant-...
# Embeddings always run locally.
#
# 2b. ...or initialize for a local Ollama model — no API key required:
# ollama serve & ollama pull llama3.1:8b
# botholomew init --force --provider ollama
# See docs/configuration.md for OpenAI-compatible endpoints (LM Studio, OpenRouter, etc.).
# 3. Queue some work
botholomew task add "Summarize every markdown file in ~/notes"
# 4. Run a worker to process the queue
botholomew worker run # one-shot: claim and run one task
botholomew worker run --persist # long-running: loop until you stop it
# 5. Or chat with the agent interactively
botholomew chat
See docs/automation.md for cron-based setups if you want Botholomew to advance on its own.
Two config/config.json shapes covering the common cases. Full schema in
docs/configuration.md.
{
"models": {
"default": {
"provider": "anthropic",
"model": "claude-opus-4-6",
"api_key": "sk-ant-..."
},
"fast": {
"provider": "anthropic",
"model": "claude-haiku-4-5-20251001",
"api_key": "sk-ant-..."
}
},
"default_model": "default",
"fast_model": "fast"
}
models is a named registry: declare as many as you like, point
default_model / fast_model at two of them, then pick one per run with
--model <name> on chat / worker / dream, or model: in a task's
frontmatter.
Or leave api_key blank and export ANTHROPIC_API_KEY in your shell.
{
"models": {
"default": {
"provider": "ollama",
"model": "qwen2.5:7b",
"base_url": "http://localhost:11434"
}
}
}
Declare a single entry and it becomes both the default and the fast model — no need to name the pointers.
Start Ollama first: ollama serve & then ollama pull qwen2.5:7b. No
API key required. Tool calling is a hard requirement — known-good local
models include qwen2.5:7b, llama3.1:8b, mistral-nemo, and
command-r. For OpenAI-compatible endpoints (LM Studio, OpenRouter,
vLLM, …) see docs/configuration.md.
A project is the directory you ran botholomew init in. Every entity
the agent or worker touches is a real file you can vim, grep, and
git diff:
my-project/
config/config.json # models, tick interval, API keys
prompts/ # markdown files loaded into every system prompt (or keyword-loaded)
goals.md # identity + current goals (agent-editable)
beliefs.md # agent-editable priors
capabilities.md # auto-generated tool inventory
skills/ # slash commands (built-ins + user-defined)
summarize.md
standup.md
capabilities.md
mcpx/servers.json # external MCP servers (Gmail, Slack, …)
index.duckdb # knowledge store (managed by membot)
config.json # membot config (separate from config/config.json)
tasks/ # one markdown file per task
<id>.md # status & metadata in frontmatter
.locks/<id>.lock # O_EXCL claim file (held by a worker)
schedules/ # one markdown file per schedule
<id>.md
.locks/<id>.lock
threads/<YYYY-MM-DD>/<id>.csv # full conversation history
workers/<id>.json # worker pidfile + heartbeat
logs/<YYYY-MM-DD>/<id>.log # per-worker logs
Tasks, schedules, threads, prompts, and skills are plain text — vim,
grep, and git work without ceremony. The agent's knowledge store
lives in index.duckdb, managed end-to-end by the
membot library: ingestion
(PDF/DOCX/HTML → markdown), local WASM embeddings, hybrid BM25 +
semantic search, append-only versioning, and URL refresh all live there.
| Command | Purpose |
|---|---|
botholomew init | Initialize the current directory as a project (--provider anthropic|ollama|openai-compatible to preconfigure the model registry; refuses on iCloud/Dropbox/NFS without --force) |
botholomew status | One-command dashboard: workers, task counts/claims, schedules (with a live "due?" check), quarantined files, store info. --json for scripting, --no-evaluate to skip the LLM schedule check |
botholomew worker run|start | Run a worker (foreground or background); --persist for long-running, --task-id <id> to target one task, --model <name> to pin every task to one configured model, --unsafe to bypass the tool-approval gate |
botholomew worker list|status|stop|kill|reap | Inspect and manage running workers |
botholomew chat | Interactive Ink/React TUI (--model <name> to pick a configured model, --unsafe to bypass the tool-approval gate) |
botholomew dream | Reflect on recent threads — consolidate learnings into the knowledge store and update beliefs/goals (--since, --dry-run, --model <name>); also /dream in chat |
botholomew task list|add|view|update|reset|delete | Manage the task queue (markdown files in tasks/); --model <name> pins a task to a configured model |
botholomew schedule list|add|view|enable|disable|trigger|delete | Recurring work (markdown files in schedules/); --model <name> is inherited by the tasks the schedule spawns |
botholomew approval list|view|approve|deny | Review and decide pending outbound-tool approvals (markdown files in approvals/) |
botholomew membot add|ls|tree|read|write|search|info|versions|diff|refresh|… | Knowledge-store passthrough to membot — --config is resolved from membot_scope (default ) |
All list subcommands support -l, --limit <n> and -o, --offset <n> for pagination.
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Chat │ │ Worker(s) │ │ cron / │
│ (Ink TUI) │ │ (tick loop) │ │ tmux │
│ │ │ │ │ (optional)│
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
│ enqueue tasks │ pidfile + heartbeat │ fire
│ browse history │ claim via O_EXCL lock │ `worker run`
│ spawn_worker tool │ run LLM tool loops │ on a
│ invoke skills │ reap orphan locks │ schedule
│ │ log threads → CSV │
└────────────┬───────────┴────────────┬───────────┘
│ │
┌──────▼────────────────────────▼──────┐
│ <project-root>/ │
│ tasks/<id>.md │
│ schedules/<id>.md │
│ threads/<date>/<id>.csv │
│ workers/<id>.json │
│ prompts/, skills/, mcpx/ │
│ index.duckdb ◄─ membot │
│ (knowledge store) │
└──────────────────┬────────────────────┘
│
▼
MCPX ─► Gmail, Slack, GitHub, Firecrawl, …
See docs/architecture.md for a deeper tour.
The full docs site is published at www.botholomew.com.
Topics worth understanding in detail:
botholomew chat Ink/React terminal UI:
eight tabs, slash-command autocomplete, message queue, tool-call
visualization, and a live workers panel.membot_read/membot_write/membot_edit/membot_run work.prompts/,
strict frontmatter validation, and full CRUD via CLI + agent tools.membot — owns the
knowledge store: ingestion (PDF/DOCX/HTML → markdown), local WASM
embeddings, hybrid BM25 + semantic search over DuckDB, append-only
versioning, URL refresh. Botholomew consumes it as an SDK.bun install
bun test
bun run lint # tsc --noEmit + biome check
See CLAUDE.md for conventions (always use bun, bump the
version in package.json on every merge to main, etc.).
MIT.
O_EXCL lockfiles
and crashed workers get reaped automatically.beliefs.md and
goals.md — it learns, updates its priors, and revises its goals as it
works. It can also author its own slash-command skills mid-conversation,
turning prompts you keep retyping into durable project assets.~/.membotbotholomew membot import-global | Seed the project from ~/.membot (copies index.duckdb + config.json in) |
botholomew capabilities | Rescan built-in + MCPX tools and rewrite prompts/capabilities.md |
botholomew prompts list|show|create|edit|delete|validate | CRUD over the markdown files in prompts/ (with strict frontmatter validation) |
botholomew mcpx servers|list|add|remove|info|search|exec|ping|auth|deauth|import-global|… | Configure external MCP servers (passthrough to mcpx) |
botholomew skill list|show|create|validate | Manage slash-command skills |
botholomew thread list|view|search|delete|follow | Browse and search the agent's conversation history (CSVs in threads/) |
botholomew nuke knowledge|tasks|schedules|threads|all | Bulk-erase project state |
botholomew upgrade | Self-update |
botholomew dream/dreamthread search--unsafe.config.json
and its default.