{"_id":"@3030-labs/wotw","_rev":"2-3e2493120efbce41248931a7d95f0ec0","name":"@3030-labs/wotw","dist-tags":{"latest":"0.9.0"},"versions":{"0.8.4":{"name":"@3030-labs/wotw","version":"0.8.4","keywords":["llm-wiki","knowledge-base","obsidian","mcp","model-context-protocol","provenance","attestation","chain-hash","compliance","ai-daemon","ai-agent","knowledge-management","byok","local-first","claude","anthropic","openai","ollama","markdown-wiki","agpl"],"author":{"name":"3030 Labs LLC","email":"support@3030labs.io"},"license":"AGPL-3.0-or-later","_id":"@3030-labs/wotw@0.8.4","maintainers":[{"name":"jbgoodman","email":"jbgoodman@live.com"}],"homepage":"https://wotw.dev","bugs":{"url":"https://github.com/3030-Labs/watcher-on-the-wall/issues"},"bin":{"wotw":"dist/cli/index.js"},"dist":{"shasum":"744851d51104ca5d6f6fedb1b9595b08d6877ae0","tarball":"https://registry.npmjs.org/@3030-labs/wotw/-/wotw-0.8.4.tgz","fileCount":23,"integrity":"sha512-vfxM5dI3+b4p0VU5L3TqaTNoqL5ixemdv+xGtudJIMgQ8/K2RY6JszErSTyMKYmQztCxB9xa3aq/JprDB5hZWA==","signatures":[{"sig":"MEYCIQCc8xrDrSeAuR00wZT6BMktE2MmKvB0NAe8kUZhLqP0BgIhAOvlpdO7uOwjsJ/TSSiC9GaQacjBZ4RC5nRb5rcjdH9C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3139485},"main":"./dist/index.js","pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"8adedad4fe382f214ca6e93bb53e3a7a38143a81","scripts":{"dev":"tsup --watch","lint":"eslint src test --ext .ts","test":"vitest run","build":"tsup","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","prepare":"husky","lint:fix":"eslint src test --ext .ts --fix","test:unit":"vitest run test/unit","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","prepublishOnly":"pnpm build","test:integration":"vitest run test/integration"},"_npmUser":{"name":"jbgoodman","email":"jbgoodman@live.com"},"repository":{"url":"git+https://github.com/3030-Labs/watcher-on-the-wall.git","type":"git"},"_npmVersion":"10.9.2","description":"Self-bootstrapping AI knowledge daemon that turns a folder of raw files into a persistent, compounding LLM wiki with provenance signing, MCP serving, and zero manual maintenance.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"test/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"22.16.0","dependencies":{"ora":"^8.1.1","zod":"^4.3.6","pino":"^9.5.0","yaml":"^2.6.1","boxen":"^8.0.1","chalk":"^5.4.1","openai":"^6.39.0","p-queue":"^8.0.1","chokidar":"^4.0.3","commander":"^12.1.0","minisearch":"^7.1.1","simple-git":"^3.27.0","cosmiconfig":"^9.0.0","gray-matter":"^4.0.3","pino-pretty":"^13.0.0","@clack/prompts":"^1.2.0","better-sqlite3":"^12.10.0","proper-lockfile":"^4.1.2","@anthropic-ai/sdk":"^0.82.0","@google/generative-ai":"^0.24.1","@anthropic-ai/claude-code":"^2.1.138","@modelcontextprotocol/sdk":"^1.0.4","@anthropic-ai/claude-agent-sdk":"^0.2.138"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","husky":"^9.1.7","eslint":"^9.17.0","vitest":"^2.1.8","globals":"^15.15.0","prettier":"^3.4.2","@eslint/js":"^9.39.4","typescript":"^5.7.2","@types/node":"^22.10.2","lint-staged":"^16.4.0","@types/better-sqlite3":"^7.6.13","@types/proper-lockfile":"^4.1.4","@typescript-eslint/parser":"^8.18.2","@typescript-eslint/eslint-plugin":"^8.18.2"},"_npmOperationalInternal":{"tmp":"tmp/wotw_0.8.4_1780088519239_0.3392340602387296","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@3030-labs/wotw","version":"0.9.0","description":"Self-bootstrapping AI knowledge daemon that turns a folder of raw files into a persistent, compounding LLM wiki with provenance signing, MCP serving, and zero manual maintenance.","type":"module","bin":{"wotw":"dist/cli/index.js"},"main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","test:unit":"vitest run test/unit","test:integration":"vitest run test/integration","lint":"eslint src test --ext .ts","lint:fix":"eslint src test --ext .ts --fix","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\" \"test/**/*.ts\"","typecheck":"tsc --noEmit","prepublishOnly":"pnpm build","prepare":"husky"},"keywords":["llm-wiki","knowledge-base","obsidian","mcp","model-context-protocol","provenance","attestation","chain-hash","compliance","ai-daemon","ai-agent","knowledge-management","byok","local-first","claude","anthropic","openai","ollama","markdown-wiki","agpl"],"author":{"name":"3030 Labs LLC","email":"support@3030labs.io"},"license":"AGPL-3.0-or-later","homepage":"https://wotw.dev","repository":{"type":"git","url":"git+https://github.com/3030-Labs/watcher-on-the-wall.git"},"bugs":{"url":"https://github.com/3030-Labs/watcher-on-the-wall/issues"},"engines":{"node":">=20"},"dependencies":{"@anthropic-ai/claude-agent-sdk":"^0.2.138","@anthropic-ai/claude-code":"^2.1.138","@anthropic-ai/sdk":"^0.82.0","@clack/prompts":"^1.2.0","@google/generative-ai":"^0.24.1","@modelcontextprotocol/sdk":"^1.0.4","better-sqlite3":"^12.10.0","boxen":"^8.0.1","chalk":"^5.4.1","chokidar":"^4.0.3","commander":"^12.1.0","cosmiconfig":"^9.0.0","gray-matter":"^4.0.3","minisearch":"^7.1.1","openai":"^6.39.0","ora":"^8.1.1","p-queue":"^8.0.1","pino":"^9.5.0","pino-pretty":"^13.0.0","proper-lockfile":"^4.1.2","simple-git":"^3.27.0","yaml":"^2.6.1","zod":"^4.3.6"},"devDependencies":{"@eslint/js":"^9.39.4","@types/better-sqlite3":"^7.6.13","@types/node":"^22.10.2","@types/proper-lockfile":"^4.1.4","@typescript-eslint/eslint-plugin":"^8.18.2","@typescript-eslint/parser":"^8.18.2","eslint":"^9.17.0","globals":"^15.15.0","husky":"^9.1.7","lint-staged":"^16.4.0","prettier":"^3.4.2","tsup":"^8.3.5","tsx":"^4.19.2","typescript":"^5.7.2","vitest":"^2.1.8"},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"test/**/*.ts":["prettier --write","eslint --fix"]},"pnpm":{"onlyBuiltDependencies":["better-sqlite3"]},"_id":"@3030-labs/wotw@0.9.0","gitHead":"fe8abc7049aaf75f691fcca190ff8beeadbf4fb1","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-XB3kHW1UoP9HrHpfRVFrthY8yo2cXg2Zg78GI4Z1qOcwdzG9xahty+p7GhIX4sdE6WYSCeEHOoK1QPzurPGpUg==","shasum":"0b49444b3eefe6b9e8279a2fea35be365a2619ea","tarball":"https://registry.npmjs.org/@3030-labs/wotw/-/wotw-0.9.0.tgz","fileCount":23,"unpackedSize":3285607,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCPymjgXxwbrCCntUrkx426nOTwcks+GuGf40XmdSt/ywIhAKH7zh+Q57vRrieXCdlI0PSbIQQMWxqZa1kjHAEhBc93"}]},"_npmUser":{"name":"jbgoodman","email":"jbgoodman@live.com"},"directories":{},"maintainers":[{"name":"jbgoodman","email":"jbgoodman@live.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wotw_0.9.0_1780283819790_0.04433973143354697"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-29T21:01:59.111Z","modified":"2026-06-01T03:17:00.104Z","0.8.4":"2026-05-29T21:01:59.413Z","0.9.0":"2026-06-01T03:16:59.969Z"},"bugs":{"url":"https://github.com/3030-Labs/watcher-on-the-wall/issues"},"author":{"name":"3030 Labs LLC","email":"support@3030labs.io"},"license":"AGPL-3.0-or-later","homepage":"https://wotw.dev","keywords":["llm-wiki","knowledge-base","obsidian","mcp","model-context-protocol","provenance","attestation","chain-hash","compliance","ai-daemon","ai-agent","knowledge-management","byok","local-first","claude","anthropic","openai","ollama","markdown-wiki","agpl"],"repository":{"type":"git","url":"git+https://github.com/3030-Labs/watcher-on-the-wall.git"},"description":"Self-bootstrapping AI knowledge daemon that turns a folder of raw files into a persistent, compounding LLM wiki with provenance signing, MCP serving, and zero manual maintenance.","maintainers":[{"name":"jbgoodman","email":"jbgoodman@live.com"}],"readme":"# watcher-on-the-wall\n\n> A local-first AI knowledge daemon. Drops files in, persistent wiki out.\n> Every operation cryptographically signed. Served to any MCP-capable agent.\n\n`wotw` is a small background process. You feed it raw notes, transcripts, and\ndocuments; it writes you an interlinked Obsidian-compatible wiki, refreshes it\nas your inputs change, and proves to you (and to auditors) exactly which model\nwrote which page from which source at what cost.\n\nIt runs entirely on your machine. Your data never leaves unless you wire it\nto a hosted LLM yourself (Anthropic, OpenAI, Gemini, or Ollama for fully\noffline). Reads happen over MCP, so any agent that speaks Model Context\nProtocol — Claude Code, Claude Desktop, Cursor — can query your wiki as a\nmemory tier.\n\n## Install\n\n```bash\nnpm install -g @3030-labs/wotw\nwotw init        # interactive: pick a vault, configure runtime\nwotw start       # daemon goes to the background\n```\n\nRequires **Node.js ≥ 20**. macOS arm64 / amd64, Linux amd64, Windows amd64.\n\n> **Run from source** (for contributors, or to run an unreleased change\n> before it lands on npm):\n>\n> ```bash\n> git clone https://github.com/3030-Labs/watcher-on-the-wall.git\n> cd watcher-on-the-wall\n> npm install          # use npm, NOT pnpm — see note below\n> npm run build\n> npm install -g .     # global install from the local checkout\n> ```\n>\n> **Use `npm`, not `pnpm`, for a from-source install.** pnpm 10+ installs\n> dependencies through a global content-addressable store and, with\n> `pnpm link --global`, splits the dependency tree in a way that leaves\n> native addons (`better-sqlite3`, the bundled `claude` binary) unreachable\n> at runtime. `npm install -g .` avoids this entirely. (Tracked in\n> `PASS-023-DOGFOOD-FINDINGS.md`.)\n\n## 30-second quickstart\n\n```bash\n$ wotw init\n┌  watcher-on-the-wall — setup wizard\n│\n◇  Where should your wiki live?\n│  ~/Obsidian/research (detected)\n│\n◇  Which LLM runtime?\n│  claude CLI (free with subscription)\n│\n│  Runtime ─ CLI mode (claude binary found at /usr/local/bin/claude)\n│  Next steps ─\n│    1. Drop files in ~/Obsidian/research/raw/\n│    2. wotw start\n│    3. wotw candidates  →  wotw approve  →  pages land in wiki/\n│\n└  Done! Your wiki is ready.\n\n$ wotw start\ndaemon running (pid 18412). logs: ~/.wotw/daemon.log\n\n$ cp ~/Downloads/meeting-transcript.md ~/Obsidian/research/raw/\n# daemon ingests it + synthesizes related concept pages into candidates/\n\n$ wotw candidates          # list pages awaiting review\n$ wotw approve <page>      # promote a candidate into wiki/\n# (set ingestion.staging: false in wotw.yaml to auto-approve instead)\n```\n\n**Generated pages land in `candidates/` first, not directly in `wiki/`.**\nBy default `wotw` stages every page for human review — run `wotw candidates`\nto list them and `wotw approve <page>` to promote one into `wiki/`. Approval\nappends a provenance record attributing the decision to you (`model=user`).\nSet `ingestion.staging: false` in `wotw.yaml` to skip review and write\nstraight to `wiki/`.\n\nOpen the vault in Obsidian to see approved pages rendered as linked notes.\nThe daemon batches subsequent file drops, refreshes stale pages, and signs\nevery operation into a provenance chain you verify with `wotw audit`.\n\n## What you get\n\n- **Compounding wiki.** Drop a transcript, get categorized markdown with\n  YAML frontmatter, internal links, and a generated index. Drop ten more\n  on the same topic, get synthesis pages.\n- **Provenance you can prove.** Every write — content + model + cost +\n  source — appended to a SHA-256 chain. `wotw audit` walks it and reports\n  tampering. Cryptographic attestation under tenant-managed keys (G5).\n- **MCP-served.** Ten tools over streamable HTTP: search, query, define,\n  relate, cite_sources, query_progressive, query_facts, read_page, get_page,\n  list_pages. Bearer-token auth, per-IP rate limiting.\n- **Local-first, BYOK.** Pick your provider (Anthropic / OpenAI / Gemini /\n  Ollama / claude CLI). Your Anthropic key never leaves your machine. The\n  wiki and its provenance chain are yours.\n- **Token-efficient retrieval.** Context-efficiency Pass A + B ship\n  86-99% fewer tokens than naive query retrieval on benchmark fixtures.\n  Pure BM25, no embeddings.\n- **Audit-ready.** Compliance Pack export (CT4.01) bundles your chain\n  with encrypted DEKs for offline verification via the separately\n  distributed [wotw-verify](https://github.com/3030-Labs/wotw-verify) Go\n  binary. Single statically-linked customer-side verifier, no daemon needed.\n\n## Documentation\n\n| | |\n|---|---|\n| Up and running | [docs/init-walkthrough.md](docs/init-walkthrough.md) |\n| Configuration knobs | [docs/configuration.md](docs/configuration.md) |\n| CLI commands | [docs/cli-reference.md](docs/cli-reference.md) |\n| MCP tools | [docs/mcp-tools.md](docs/mcp-tools.md) |\n| Architecture | [docs/architecture.md](docs/architecture.md) |\n| BYOK + LLM providers | [docs/self-hosted-byok.md](docs/self-hosted-byok.md) |\n| Fact extraction gating | [docs/llm-provider-auto-resolution.md](docs/llm-provider-auto-resolution.md) |\n| Provenance chain format | [docs/provenance.md](docs/provenance.md) |\n| Compliance Pack wire format | [docs/pack-format-daemon.md](docs/pack-format-daemon.md) |\n| Knowledge health + auto-heal | [docs/knowledge-health.md](docs/knowledge-health.md) |\n| Obsidian integration | [docs/obsidian-setup.md](docs/obsidian-setup.md) |\n| Multi-user + per-tenant tokens | [docs/multi-user.md](docs/multi-user.md) |\n| Retrieval design (BM25 rationale) | [docs/retrieval-hardening.md](docs/retrieval-hardening.md) |\n| Opt-in telemetry | [docs/telemetry.md](docs/telemetry.md) |\n\n## Project status\n\n`wotw` is pre-1.0. The substrate (ingestion, provenance, MCP, Compliance\nPack format) is stable and exercised by 900+ tests across 7 build gates;\nthe npm package is `@3030-labs/wotw`. Breaking changes are possible at\nminor-version bumps until 1.0; see [CHANGELOG.md](CHANGELOG.md).\n\n## License\n\n[AGPL-3.0-or-later](LICENSE) — see [LICENSE-NOTICES.md](LICENSE-NOTICES.md)\nfor the plain-English summary (what counts as a derivative work, how a\nservice offering must comply, what competitors can fork).\n\n## Links\n\n- Reporting a vulnerability: [SECURITY.md](SECURITY.md)\n- Contributing: [CONTRIBUTING.md](CONTRIBUTING.md)\n- Verifier binary: [3030-Labs/wotw-verify](https://github.com/3030-Labs/wotw-verify)\n- Marketing + docs site: [wotw.dev](https://wotw.dev)\n- Maintainer: [3030 Labs LLC](https://3030labs.io)\n","readmeFilename":"README.md"}