[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-77429":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":18,"compositeScore":19,"rankGlobal":8,"rankLanguage":8,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":8,"pushedAt":8,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":14,"starSnapshotCount":14,"syncStatus":28,"lastSyncTime":29,"discoverSource":30},77429,"watchmen","firstbatchxyz\u002Fwatchmen","firstbatchxyz",null,"Python",223,19,1,7,0,3,30,114,9,3.9,"MIT License",false,"main",true,[],"2026-06-12 02:03:43","\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fimages\u002Fhero.png\" alt=\"watchmen\" width=\"100%\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">watchmen\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cem>Watchmen turns every coding session into the skill bundles you’d never sit down and write yourself.\u003C\u002Fem>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#install\">Install\u003C\u002Fa> ·\n  \u003Ca href=\"#what-watchmen-actually-does\">What it does\u003C\u002Fa> ·\n  \u003Ca href=\"#mission-control\">Mission control\u003C\u002Fa> ·\n  \u003Ca href=\"#how-it-works\">How it works\u003C\u002Fa> ·\n  \u003Ca href=\"#cost--privacy\">Cost &amp; privacy\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\nReusable skills and workspace briefs, built from what you actually do, carried\nacross Claude Code, Codex, and pi.dev. You install it once and never change how\nyou work.\n\nThe manual fix is writing a `CLAUDE.md` or `AGENTS.md` by hand, but that's you\ndoing the learning on behalf of the agent. That's backwards.\n\nwatchmen sits behind **Claude Code**, **Codex**, and **pi.dev**. It silently\nwatches your sessions, mines what you actually do, and writes skill bundles +\nworkspace briefs (`CLAUDE.md` \u002F `AGENTS.md`) so your next session is smarter\nthan your last. Same skills follow you across agents — switch between Claude\nCode and Codex on the same repo and they pick up where the other left off.\n\n## Why it matters\n\n- **Fewer tokens burned re-explaining yourself.** Your agent stops\n  rediscovering the same procedures every session. The skill is already on\n  disk, so context that used to be spent re-deriving it isn't.\n- **Fewer tool errors per session.** watchmen's own impact card tracks median\n  tool errors before and after a project's skills land, on a 16-week curve.\n- **Unified context layer across every agent.** Switch from Claude Code to\n  Codex in the middle of development and the skills you need will follow. No\n  need to re-onboard the new agent.\n\n**Local storage, cross-agent, continuous.**\n\nwatchmen stores transcripts, metrics, analyses, and generated bundles on your\nmachine. Analysis runs send selected session excerpts to your chosen LLM\nprovider (OpenRouter, OpenAI, or Anthropic) using your own API key; nothing\nis uploaded outside those explicit LLM calls.\n\n## What watchmen actually does\n\nWhile you work, it:\n\n- 🤖 **Captures sessions from every agent** — Claude Code (`~\u002F.claude\u002Fprojects\u002F`), Codex (`~\u002F.codex\u002Fsessions\u002F`), pi.dev. One corpus across tools.\n- 📚 **Auto-curates skills** — recurring procedures get turned into runnable skill bundles your agent can call: `SKILL.md` + scripts + references.\n- ✍️ **Auto-writes CLAUDE.md + AGENTS.md** — workspace brief, identical content for both, refreshed continuously.\n- 📈 **Surfaces what's working** — mission control web UI, per-project impact tracking, friction signals, action queue.\n- 💡 **Retrospective skill hints** — when you could've used an existing skill, the next statusLine update tells you. Never modifies your agent's context. Never blocks you.\n\nYou install it. It runs. Your agents get better every day you use them.\n\n## The CLI\n\n```\nwatchmen init\n```\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fimages\u002Fcli-banner.png\" alt=\"watchmen onboarding banner\" width=\"100%\">\n\u003C\u002Fp>\n\nSix steps. Most run in seconds; the LLM passes (analyze + curate) are the only slow ones — you see the cost estimate before they run. Stop at any confirmation gate; nothing partial is left behind.\n\n## Mission control\n\nA local web dashboard at `http:\u002F\u002F127.0.0.1:8979` — no hosted account or remote\ndashboard. Top-of-page tells you:\n\n- **Skill calls this week vs last week** — are your curated skills being invoked?\n- **Tool errors per session** — is friction going up or down?\n- **Active repos** — what's getting work this week?\n- **Skill leaderboard** — which repo's skills are firing most\n- **Status tiles** — traffic-light health per project (healthy \u002F stale \u002F uncurated)\n- **Next actions** — ranked queue, e.g. \"kai-bench has 28 prompts to analyze · Run\"\n\n### Per-project impact\n\nDrill into any tracked repo and you get a **before\u002Fafter** view scoped to that project. 16-week chart of tool errors per session with a dashed annotation at the date the curator first landed. Pre\u002Fpost comparison table: sessions, median tool errors, median prompts, median cost. Honest empty states when there isn't enough post-treatment data yet — never silently disappears.\n\nSubtitle reads \"Correlation only — not a controlled experiment.\" We don't oversell the signal.\n\n### Three themes\n\nLight comic-pulp newsprint by default. **Doomsday** noir mode for the dark-mode crowd. **Rorschach** sepia-typewriter for diary-mode fans. Switch instantly at `\u002Fsettings` — picker persists per browser via `localStorage`, no reload.\n\n> Dashboard + impact-card screenshots ship with v0.6 — generated against a mock corpus so no real project data leaks into the docs.\n\n## Install\n\nThree commands and a wizard. Total wall time ~10 min + 30–90 min per project of LLM passes.\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Ffirstbatchxyz\u002Fwatchmen.git\ncd watchmen\nuv sync && uv tool install --editable .\nwatchmen init\n```\n\nThe wizard handles everything: asks which LLM provider you'd like to use (OpenRouter \u002F OpenAI \u002F Anthropic), prompts for that provider's API key (saves to `~\u002F.config\u002Fwatchmen\u002F.env`, chmod 600), ingests your `~\u002F.claude\u002Fprojects\u002F` history, lets you pick which projects to analyze, previews the cost, runs analyze + curate with live progress, installs the daemon + viewer into the host's scheduler (launchd \u002F systemd --user \u002F Task Scheduler) for autostart, and shows you the exact `\u002Fplugin` commands to paste inside Claude Code.\n\nRuntime data lives under `~\u002F.watchmen\u002F` (`state.db`, `corpus.db`, `analyses\u002F`, `bundles\u002F`, event logs). Set `WATCHMEN_HOME=\u002Fpath\u002Fto\u002Fdir` for an alternate location.\n\n`watchmen doctor` does a one-screen ✓\u002F✗ check across API key, corpus, daemon, viewer, and hooks if anything looks off.\n\n### Plugins\n\nAfter `watchmen init`, install the plugins inside each agent. **Claude Code:**\n\n```\n\u002Fplugin marketplace add firstbatchxyz\u002Fwatchmen\n\u002Fplugin install watchmen@watchmen\n\u002Freload-plugins\n```\n\nThen wire the statusLine (one-time):\n\n```bash\nwatchmen statusline install\n```\n\n**Codex:**\n\n```\n\u002Fplugins marketplace add github:firstbatchxyz\u002Fwatchmen\n\u002Fplugins install watchmen\n```\n\nYou then get `\u002Fskills brief` (or `$brief`) inside Codex with the same workspace digest behavior as `\u002Fwatchmen:brief` in Claude Code. Codex has no statusline, so the live skill-suggestion hint is on-demand `brief` instead.\n\n## Requirements\n\n- macOS, Linux, or Windows 10\u002F11\n- [`uv`](https:\u002F\u002Fgithub.com\u002Fastral-sh\u002Fuv) (Python toolchain) — Python 3.11+\n- A credential for **one** of the providers below\n- At least one supported coding agent in active use\n\nDefault model per provider: `deepseek\u002Fdeepseek-v4-flash` (OpenRouter) ·\n`gpt-5-mini` (OpenAI) · `claude-haiku-4-5-20251001` (Anthropic). Configurable\nper command via `--model`, globally via `WATCHMEN_DEFAULT_MODEL`.\n\n### Provider auth\n\nPick whichever account you already pay for — `watchmen init` walks you through\nit on first run. Switch anytime without losing other credentials:\n\n```bash\nwatchmen settings provider                            # status: active provider + per-provider credential state\nwatchmen settings provider claude-pro                 # switch active provider (incl. OAuth ones)\nwatchmen settings api-key --provider anthropic        # set an API key (live-validated against the provider's API)\n```\n\n**API-key providers** — paste a key once, lives in `~\u002F.config\u002Fwatchmen\u002F.env`\n(chmod 0600):\n\n| Provider | Where to get a key | Default model |\n|---|---|---|\n| **OpenRouter** | [openrouter.ai\u002Fkeys](https:\u002F\u002Fopenrouter.ai\u002Fkeys) — one key, many models, cheapest curator runs | `deepseek\u002Fdeepseek-v4-flash` |\n| **OpenAI** | [platform.openai.com\u002Fapi-keys](https:\u002F\u002Fplatform.openai.com\u002Fapi-keys) — billed per-token against your org | `gpt-5-mini` |\n| **Anthropic** | [console.anthropic.com\u002Fsettings\u002Fkeys](https:\u002F\u002Fconsole.anthropic.com\u002Fsettings\u002Fkeys) — billed per-token against your org | `claude-haiku-4-5-20251001` |\n\n**OAuth providers (macOS, subscription-quota)** — no paste step. If you're\nalready signed in via the upstream CLI, watchmen reuses that credential\ndirectly and bills against your existing subscription instead of your API\ncredit:\n\n| Provider | How | Default model |\n|---|---|---|\n| **Claude Pro \u002F Team \u002F Max** (`claude-pro`) | Sign in to Claude Code (`claude` CLI). watchmen reads the OAuth token from the macOS keychain. **Billed against your Claude subscription quota.** | `claude-haiku-4-5-20251001` |\n| **ChatGPT** (`chatgpt`, experimental) | Sign in to Codex (`codex login`) with your ChatGPT account. watchmen reads the OAuth token from `~\u002F.codex\u002Fauth.json` and calls the Codex Responses API. Restricted model whitelist. | `gpt-5.4-mini` |\n\nOAuth on Linux \u002F Windows isn't yet supported (Claude Code stores\ncredentials differently outside macOS); the OAuth providers don't appear\nin the picker there.\n\nCodex api-key bonus: if you've previously run `codex login --api-key\nsk-...`, the `openai` provider falls back to reusing that key — you don't\nneed to paste it into watchmen separately.\n\n`WATCHMEN_PROVIDER` controls which provider is active. Shell env wins\nover the on-disk file, so CI runs that set `OPENROUTER_API_KEY=...`\ninline still just work.\n\n## How it works\n\n```\n┌────────────────────────────────────────────────────────────────┐\n│  Hook layer (real-time capture, deterministic, no LLM)         │\n│   ~\u002F.claude\u002Fsettings.json → hooks\u002Fwatchmen_observe.sh          │\n│   → POST to localhost:8765 → events.db + events.jsonl          │\n└────────────────────────────────────────────────────────────────┘\n                                │\n                                ▼\n┌────────────────────────────────────────────────────────────────┐\n│  Corpus layer (batch ingest)                                   │\n│   corpus.py walks ~\u002F.claude\u002Fprojects\u002F*.jsonl                   │\n│   → corpus.db (sessions, prompts, tool_calls)                  │\n└────────────────────────────────────────────────────────────────┘\n                                │\n                                ▼\n┌────────────────────────────────────────────────────────────────┐\n│  Analyst (per-day LLM agent with carry-forward thesis)         │\n│   analyze.py: for each day in order, agent reads prior thesis  │\n│   + today's sessions → refined thesis                          │\n│   Output: analyses\u002F\u003Cproject>\u002F\u003Cdate>.md, _running.md            │\n└────────────────────────────────────────────────────────────────┘\n                                │\n                                ▼\n┌────────────────────────────────────────────────────────────────┐\n│  Curator (4-stage, multi-turn agents with critic sub-agent)    │\n│   1. candidate-finder reads thesis + scans repo                │\n│   2. per-skill curator drafts SKILL.md + scripts, refines      │\n│   3. CLAUDE.md author reads thesis + skills + infra files      │\n│   4. Index writer                                              │\n│   Output: bundles\u002F\u003Cproject>\u002F                                   │\n└────────────────────────────────────────────────────────────────┘\n                                │\n                                ▼\n┌────────────────────────────────────────────────────────────────┐\n│  Viewer + daemon                                               │\n│   FastAPI mission control at 127.0.0.1:8979                    │\n│   launchd \u002F systemd daemon — incremental every 2h, full 2×day  │\n└────────────────────────────────────────────────────────────────┘\n```\n\nThree lanes by latency budget:\n\n| Lane | Latency | Triggers | What |\n|---|---|---|---|\n| Blocking real-time | \u003C200ms | Hooks: SessionStart, UserPromptSubmit | Reserved for future context injection (no LLM allowed) |\n| Async real-time | seconds | Hooks: PostToolUse, Stop | Logging only |\n| Batch | minutes-hours | Daemon schedule | Analyst + curator (LLM-heavy) |\n\n## What lands on disk\n\nFor each tracked repo:\n\n```\nbundles\u002F\u003Crepo>\u002F\n  CLAUDE.md                # workspace brief auto-generated from session evidence\n  AGENTS.md                # identical mirror for Codex\n  skills\u002F\n    \u003Cskill-name>\u002F\n      SKILL.md             # frontmatter + trigger phrases + procedure + examples\n      scripts\u002F             # actual runnable Python\u002Fbash extracted from your repo\n      references\u002F          # supporting docs\n  _curation_log.md         # agent's decisions + critic feedback\n  _candidates.json         # which skills were considered, which got built\n  _index.md                # summary of generated artifacts\n\nanalyses\u002F\u003Crepo>\u002F\n  2026-04-09.md            # day-by-day thesis snapshots\n  2026-04-10.md            # each refines the running thesis with that day's sessions\n  ...\n  _running.md              # latest aggregated thesis\n```\n\nBoth are gitignored — they're your data, not the source.\n\n## Continuous mode\n\nOnce installed via `watchmen init` (or by hand):\n\n```bash\nwatchmen daemon install                      # autostart on login\nwatchmen viewer install                      # autostart the viewer at :8979\nwatchmen launchd status                      # verify (also reports systemd --user \u002F Task Scheduler state)\n```\n\nSame CLI on every platform; under the hood it installs a launchd agent on macOS, a systemd `--user` unit on Linux, or a Task Scheduler task on Windows. On Linux, run `sudo loginctl enable-linger $USER` once if you want the daemon to outlive your login session.\n\nDefault cadence:\n\n| What | When |\n|---|---|\n| Re-ingest all coding-agent transcripts + incremental analyst | Every **2 hours** |\n| `CLAUDE.md` regen (light) | After an analyst run if last regen >24h ago |\n| **Full curator** (skill bundles + CLAUDE.md, expensive) | **02:00 and 14:00 local**, min 8h between runs per project |\n\n## Steering the curator\n\nAutonomous by default. When you want override:\n\n- **`watchmen pin \u003Cproject> \u003Cskill>`** — hand-edited a SKILL.md and want it preserved. Curator treats pinned skills as forced cache hits.\n- **`watchmen drop \u003Cproject> \u003Cskill>`** — keeps proposing a skill you don't want. Drop removes the bundle AND adds the slug to `_blocklist.json`. Stays gone.\n- **`watchmen unpin` \u002F `watchmen restore`** — reverse either decision.\n- **`watchmen review \u003Cproject>`** — interactive walk over every skill: keep \u002F drop \u002F pin \u002F skip \u002F view \u002F quit. Audit trail at `bundles\u002F\u003Cproject>\u002Freview.md`.\n\nState lives in `bundles\u002F\u003Cproject>\u002F_pinned.json` and `_blocklist.json`. Git-tracked, so pin\u002Fdrop state syncs across machines if you sync the bundle.\n\n### Logs\n\n```\n# macOS (launchd)\n~\u002FLibrary\u002FLogs\u002Fwatchmen.log                          # primary daemon log\n~\u002FLibrary\u002FLogs\u002Fwatchmen.daemon.{out,err}.log         # launchd stdout\u002Fstderr\n~\u002FLibrary\u002FLogs\u002Fwatchmen.viewer.{out,err}.log         # viewer logs\n\n# Linux (systemd --user)\n~\u002F.watchmen\u002Flogs\u002Fdaemon.{out,err}.log                # systemd stdout\u002Fstderr\n~\u002F.watchmen\u002Flogs\u002Fviewer.{out,err}.log                # viewer logs\n# also: `journalctl --user -u watchmen-daemon.service`\n\n# Windows (Task Scheduler)\n%LOCALAPPDATA%\\watchmen\\logs\\watchmen.log            # primary daemon log\n%LOCALAPPDATA%\\watchmen\\logs\\daemon.{out,err}.log    # scheduler stdout\u002Fstderr\n%LOCALAPPDATA%\\watchmen\\logs\\viewer.{out,err}.log    # viewer logs\n```\n\n### Approval mode\n\n```bash\nwatchmen settings set my-project approval_required true\n```\n\nNew bundles route to `bundles\u002F\u003Cproject>\u002F_pending\u002F\u003Cslug>\u002F` instead of `skills\u002F\u003Cslug>\u002F`. Already-approved skills keep updating in place — only first-time additions are gated. `watchmen review` walks `_pending\u002F` first.\n\n### Harness awareness\n\nThe candidate finder reads `~\u002F.claude\u002Fskills\u002F*\u002FSKILL.md` and prefers proposing an **enhancement** of an existing skill when the trigger overlaps. Each candidate may carry `enhancement_of: \u003Cslug>` — when set, Stage 2 prepends an ENHANCEMENT MODE preamble so the new bundle is framed as a delta. To drop overlapping candidates entirely instead:\n\n```bash\nwatchmen curate kai-frontend --skip-overlap\n# or persistently:\nwatchmen settings set kai-frontend skip_overlapping_skills true\n```\n\n## vs Claude Code's `\u002Finsights`\n\nClaude Code shipped `\u002Finsights` in v2.1.117 (Apr 2026) — LLM-narrated HTML report from your transcripts. It's good. watchmen is **complementary**:\n\n| | `\u002Finsights` | watchmen |\n|---|---|---|\n| **Output** | One-shot HTML report | Git-tracked skill bundles + CLAUDE.md |\n| **Adapters** | Claude Code only | Claude Code + Codex + pi.dev |\n| **Scope** | Global, flat aggregate | Per-project bundles + cross-repo digest |\n| **Cadence** | On-demand, manual | Continuous via daemon |\n| **Provenance** | No traceable source | `watchmen why \u003Cskill>` → source sessions with adapter tags |\n| **Privacy** | LLM call on full corpus | Local storage; selected excerpts sent to your chosen LLM provider (OpenRouter \u002F OpenAI \u002F Anthropic) for analysis |\n\nBoth are useful. Run both.\n\n## Command reference\n\nRun `watchmen --help` for the grouped overview; `watchmen \u003Ccommand> -h` for per-command flags.\n\n```\n# Get started\nwatchmen init                    Interactive setup wizard\nwatchmen doctor                  ✓\u002F✗ check of API key, corpus, services\nwatchmen settings api-key        Set or check the active provider's key (--provider \u003Cname> to target another)\nwatchmen settings provider       Get or set the active LLM provider (openrouter\u002Fopenai\u002Fanthropic)\nwatchmen settings port [N]       Get or set the viewer port (default 8979)\n\n# Pipeline\nwatchmen status                  Dashboard view of tracked projects\nwatchmen analyze \u003Ckey>           Run analyst (incremental, only new days)\nwatchmen analyze \u003Ckey> --full    Full re-run (ignores prior thesis)\nwatchmen curate \u003Ckey>            Full curator: candidates → skills → CLAUDE.md\nwatchmen curate \u003Ckey> --regen-claude    Stage 3 only (regenerate CLAUDE.md)\nwatchmen runs                    Recent run history\nwatchmen metrics                 Global rollup across all projects + adapter breakdown\nwatchmen metrics \u003Ckey>           Daily token\u002Fcost\u002Fuptake for one project\n\n# Project inventory\nwatchmen list                    Auto-detect projects from corpus\nwatchmen track \u003Ckey> --repo \u003Cpath>\nwatchmen ingest                  Re-scan agent transcripts → corpus.db\nwatchmen sync                    Bootstrap state from on-disk artifacts (no LLM calls)\n\n# Inspect\nwatchmen show                    List every curated project + skill count\nwatchmen show \u003Ckey>              List a project's artifacts\nwatchmen show \u003Ckey> \u003Cskill>      Dump a single SKILL.md\nwatchmen why \u003Ckey> \u003Cskill>       Provenance: source sessions with adapter tags\nwatchmen recent [\u003Ckey>]          Git log of curator runs\nwatchmen insights                Cross-repo digest — pairs with Anthropic's \u002Finsights\nwatchmen open [\u003Ckey>]            Open viewer in browser (jumps to project page)\nwatchmen logs [daemon|viewer]    Tail scheduler logs (-f to follow)\n\n# Control\nwatchmen pin \u003Ckey> \u003Cskill>       Freeze a skill — next curator run skips it\nwatchmen unpin \u003Ckey> \u003Cskill>     Remove from pin list\nwatchmen drop \u003Ckey> \u003Cskill>      Remove bundle + blocklist the slug\nwatchmen restore \u003Ckey> \u003Cskill>   Allow a blocked slug to be re-proposed\nwatchmen learn \u003Ckey>             Fast cycle: analyze + CLAUDE.md refresh (~$0.50)\nwatchmen learn \u003Ckey> --full      With full curator (Stage 1+2+3)\nwatchmen review \u003Ckey>            Interactive walk: pending then approved\n\n# Services\nwatchmen daemon run              Scheduling loop (foreground)\nwatchmen daemon run --once       Single cycle (testing)\nwatchmen viewer run              FastAPI viewer (foreground)\nwatchmen {hooks,daemon,viewer,statusline} install\nwatchmen {hooks,daemon,viewer,statusline} uninstall\n```\n\n## Cost & privacy\n\n**Cost.** Per project, a full curator run (analyst + 6-8 skill bundles + CLAUDE.md) is `$3-8` in deepseek-v4-flash. Incremental daemon cycles are `$0.10-0.50` since they only process new days. `watchmen insights` cross-repo digest: ~$0.05-0.10 per regeneration.\n\n**Privacy.** Runtime state lives locally. Your session transcripts already live\nin `~\u002F.claude\u002Fprojects\u002F` \u002F `~\u002F.codex\u002Fsessions\u002F` — Anthropic and OpenAI put them\nthere. watchmen reads them, builds a SQLite corpus on your disk, and sends only\nthe chunks needed for analysis to your chosen LLM provider (OpenRouter, OpenAI, or Anthropic) during\nanalyst, curator, and insights runs. The artifacts it generates (`bundles\u002F`,\n`analyses\u002F`) stay on your disk.\n\nIf you don't want certain repos analyzed, just don't track them — auto-detect only suggests, `watchmen track` is opt-in.\n\n## Adapter roadmap\n\n| Source | Status | Notes |\n|---|---|---|\n| Claude Code **CLI** | ✅ shipped | Hooks + transcript ingest both work |\n| Claude Code **desktop** (Mac\u002FWindows) | ✅ shipped | Same `~\u002F.claude\u002Fprojects\u002F` + `~\u002F.claude\u002Fsettings.json` |\n| **Codex** (CLI \u002F desktop) | ✅ shipped | `cd` adapter — `~\u002F.codex\u002Fsessions\u002F` |\n| **pi.dev** (CLI) | ✅ shipped | `pi` adapter — pi.dev's session export |\n| **Cursor** | 🤔 considering | SQLite sessions, **no hooks** — post-session polling only |\n| **OpenCode** | 🤔 considering | Clean `opencode export` CLI; straightforward adapter |\n| **Codex Cloud \u002F Claude.ai web** | ❌ out of scope | No local files, no hooks |\n\n## Limitations + caveats\n\n- **Hook server must run in a separate terminal.** It's a Python+FastAPI process; killing the terminal stops hook capture. Run via `tmux`\u002F`screen`, a launchd job, a systemd `--user` unit, a Task Scheduler task, or `watchmen daemon install`.\n- **Some skill curators occasionally run long (20+ min)** without calling the `finish_skill` terminal tool. Bundle still lands on disk; just no clean signal. ~15-20% hit this.\n- **Project-key auto-detection is heuristic.** Some path-encoded names (e.g., `my-business\u002Fmarketing` vs `my-business-marketing`) can resolve ambiguously. Use `watchmen track \u003Ckey> --repo \u003Cabs-path>` to be explicit.\n\n## Layout\n\n```\nwatchmen\u002F\n├── src\u002Fwatchmen\u002F             # Python package\n│   ├── cli.py                # `watchmen` CLI entry\n│   ├── agent.py              # shared OpenRouter tool-calling agent loop\n│   ├── state.py              # state.db schema + helpers\n│   ├── analyze.py            # longitudinal per-day analyst\n│   ├── curate.py             # 4-stage skill + CLAUDE.md curator\n│   ├── corpus.py             # ingest agent transcripts → corpus.db\n│   ├── server.py             # hook capture server\n│   ├── daemon.py             # scheduling loop\n│   ├── viewer\u002F               # FastAPI mission control + impact card\n│   ├── adapters\u002F             # cc \u002F cd \u002F pi adapters\n│   ├── hooks\u002F                # observe.sh \u002F observe.ps1 → POSTs hook stdin → localhost:8765\n│   ├── service.py            # platform-dispatched install\u002Funinstall (launchd ↔ systemd ↔ schtasks)\n│   ├── launchd_setup.py      # macOS backend: ~\u002FLibrary\u002FLaunchAgents\u002F*.plist\n│   ├── systemd_setup.py      # Linux backend: ~\u002F.config\u002Fsystemd\u002Fuser\u002F*.service\n│   └── schtasks_setup.py     # Windows backend: Task Scheduler XML via schtasks\n├── plugin\u002F                   # Claude Code plugin\n├── plugin-codex\u002F             # Codex plugin\n├── .agents\u002Fplugins\u002F          # Codex marketplace manifest\n├── .claude-plugin\u002F           # Claude Code marketplace manifest\n├── tests\u002F                    # pytest smoke + regression suite\n├── docs\u002Fimages\u002F              # screenshots + hero\n└── pyproject.toml\n```\n\n## Tests\n\n```bash\nuv sync --extra dev          # install pytest + pytest-cov once\nuv run pytest tests\u002F         # full suite (~4s)\nuv run pytest --cov=watchmen # with coverage\n```\n\nCI runs `pytest tests\u002F` on every push to `main` and every PR (`.github\u002Fworkflows\u002Fci.yml`) across ubuntu × macos × py3.11\u002F3.12.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","watchmen 是一个用于提升编程会话效率的工具，能够自动从你的实际操作中提取并生成可复用的技能包和工作区简报。其核心功能包括自动捕获来自Claude Code、Codex及pi.dev等不同代理的会话内容，自动生成技能文件如`CLAUDE.md`\u002F`AGENTS.md`以及相关脚本，同时提供了一个任务控制界面来追踪项目影响和优化建议。适用于需要频繁切换开发环境或希望提高AI辅助编码效率的开发者。通过本地存储数据并仅在明确调用时与外部LLM交互，保证了用户的隐私安全。",2,"2026-06-11 03:55:27","CREATED_QUERY"]