" [--pin] [--path ] [--tag ] [--update ]`
[Section titled “weaver note "\" \[--pin\] \[--path \\] \[--tag \\] \[--update \\]”](#weaver-note-text---pin---path-p---tag-t---update-id)
Record a durable, repo-scoped learning. `--pin` surfaces it prominently in `status`. `--update ` replaces an existing note: the old note disappears from all listings and the new one takes its place (ids are shown by `weaver notes`). A pinned note stays pinned across updates unless you say otherwise.
```sh
weaver note "integration tests need docker pg on :5433" --tag testing
weaver note "integration tests need docker pg on :5434 since #42" --update 17
```
### `weaver log ""`
[Section titled “weaver log \ \ "\"”](#weaver-log-kind-path-summary)
Record an activity event. `kind` is one of `edit`, `create`, `delete`, `run`, etc. (an unknown kind is recorded as `run` with a warning).
```sh
weaver log edit src/auth/login.ts "extracted refreshToken into AuthService"
```
### `weaver done`
[Section titled “weaver done”](#weaver-done)
End your session and release its claims.
## Observer commands
[Section titled “Observer commands”](#observer-commands)
The commands **you** run as a human. Read-only — they never register you as a participant.
### `weaver status [--json] [--full]`
[Section titled “weaver status \[--json\] \[--full\]”](#weaver-status---json---full)
The current picture: other live sessions, active claims, recent activity, and notes. **Silent when nothing is relevant.** `--json` for machine consumption; `--full` removes the caps.
### `weaver check `
[Section titled “weaver check \”](#weaver-check-path)
Is anyone else working on this path/area? Exits `0` if clear, `1` on a conflict, and prints the conflicting session’s context. Observer-safe — works even without a resolved session. By default it refreshes the caller’s heartbeat if the caller already has a live session; use `--no-touch` for strict read-only checks.
### `weaver preflight [paths…|--staged|--upstream|--base []`
[Section titled “weaver preflight \[paths…|--staged|--upstream|--base \][\]”](#weaver-preflight-paths--staged--upstream--base-ref)
A bounded commit/push/PR risk check. It checks only the supplied or inferred paths, never polls, never waits for another session to run `done`, and never refreshes heartbeats. Relevant soft/hard overlaps are a pause signal for the agent to ask the user what to do.
```sh
weaver preflight --staged --operation commit
weaver preflight --upstream --operation push
weaver preflight --base main --operation pr --json
```
Exit policy defaults to `--fail-on soft`: exit `1` for relevant soft or hard overlaps, `0` for clear/stale/unrelated sessions, and `2` for tooling/input errors. Use `--fail-on hard` to pause only on active claims, or `--fail-on never` for report-only automation.
Human and JSON output are capped by default; `--json` includes `counts` and `truncated` metadata. Use `--full` to include every checked path and overlap.
### `weaver forget "" [--undo]`
[Section titled “weaver forget \ "\" \[--undo\]”](#weaver-forget-id-why---undo)
Retire a note that turned out to be wrong or has become noise. Removal is **soft, audited, and reversible**: the note disappears from `status`/`notes`/dashboard, a `forget` event (with your reason) lands in the activity feed, the reason is kept on the note itself, and `weaver forget --undo ` brings it back. A reason is required — curation always leaves a why. For learnings that are *outdated* rather than wrong, prefer `weaver note --update ` with the correction.
```sh
weaver forget 12 "npm distribution was removed; this no longer applies"
weaver forget --undo 12
```
### `weaver notes [--full] [--all]`
[Section titled “weaver notes \[--full\] \[--all\]”](#weaver-notes---full---all)
List durable notes with their ids (pinned first, newest first). Superseded and retired notes are hidden — only the current picture appears. `--all` shows the full curation history, marking retired notes (with their reason) and superseded ones.
### `weaver activity [--json] [--full]`
[Section titled “weaver activity \[--json\] \[--full\]”](#weaver-activity---json---full)
The recent activity feed across sessions.
### `weaver doctor`
[Section titled “weaver doctor”](#weaver-doctor)
Diagnostics: resolved session key + source, repo id, store path, runtime/binding, enabled state, active session count.
## Lifecycle & maintenance
[Section titled “Lifecycle & maintenance”](#lifecycle--maintenance)
### `weaver init [--project|--global] [--hooks|--no-hooks]`
[Section titled “weaver init \[--project|--global\] \[--hooks|--no-hooks\]”](#weaver-init---project--global---hooks--no-hooks)
Install the agent instruction block into either project files (`./CLAUDE.md`, `./AGENTS.md`) or global files (`~/.claude/CLAUDE.md`, `~/.config/opencode/AGENTS.md`, `~/.codex/AGENTS.md`). On a TTY, `init` prompts with project files as the first/default choice. Non-interactive runs default to project files. `--project` and `--global` are mutually exclusive.
`init` can also install [Claude Code hooks](/weaver/guides/claude-code-hooks/) into the repo’s `.claude/settings.json` (always project-scoped). On a TTY it asks (default yes); non-interactive runs install them only with an explicit `--hooks`.
Project scope covers the current checkout only — run `init` in each repo you want covered. Global scope is a one-time setup that covers every repo where your agents read their global instruction files — no per-repo `init` is needed afterwards. In both cases there is no per-repo database setup: a repo’s store is created automatically the first time an agent runs a weaver command there.
### `weaver disable` / `weaver enable`
[Section titled “weaver disable / weaver enable”](#weaver-disable--weaver-enable)
Pause / resume agent writes for this repo. While disabled, mutating commands no-op quietly (reads and `done` still work).
### `weaver deinit [--project|--global] [--purge]`
[Section titled “weaver deinit \[--project|--global\] \[--purge\]”](#weaver-deinit---project--global---purge)
Remove the instruction block from project files by default, or from global files with `--global`. Project-scope deinit also removes Weaver’s Claude Code hook entries from `.claude/settings.json`. `--purge` also deletes the current repo’s store.
### `weaver hook `
[Section titled “weaver hook \”](#weaver-hook-pre-editpost-edit)
The Claude Code hook endpoint — registered by `weaver init`, not meant to be run by hand. Reads the hook payload JSON on stdin. `pre-edit` emits an advisory warning (never a block) when the target file overlaps another live session; `post-edit` records the edit and refreshes the session’s heartbeat. Always exits `0`; problems are silently ignored so a hook can never break an agent. See [Claude Code hooks](/weaver/guides/claude-code-hooks/).
### `weaver config [ []]`
[Section titled “weaver config \[\ \[\\]\]”](#weaver-config-key-seconds)
View or set tunable TTLs. See [Configuration](/weaver/guides/configuration/).
### `weaver upgrade [--check]`
[Section titled “weaver upgrade \[--check\]”](#weaver-upgrade---check)
Update the installed binary to the latest release (`--check` only checks). See [Install](/weaver/getting-started/install/).
## Common flags
[Section titled “Common flags”](#common-flags)
| Flag | Applies to | Meaning |
| ------------------------ | ------------------------------------------ | -------------------------------------------------------- |
| `--json` | `status`, `activity`, `preflight` | machine-readable output |
| `--full` | `status`, `notes`, `activity`, `preflight` | remove output caps |
| `--color` | supported human output | force ANSI colors (`--color=always`, `auto`, or `never`) |
| `--no-color` | supported human output | disable ANSI colors |
| `--staged` | `preflight` | check staged paths |
| `--upstream` | `preflight` | check `@{upstream}...HEAD` paths |
| `--base` | `preflight` | check `][...HEAD` paths |
| `--fail-on` | `preflight` | exit threshold: `soft`, `hard`, or `never` |
| `--project` | `init`, `deinit` | use project instruction files |
| `--global` | `init`, `deinit` | use global instruction files |
| `--hooks` / `--no-hooks` | `init` | install / skip Claude Code hooks |
| `--update` | `note` | supersede an existing note by id |
| `--all` | `notes` | include retired and superseded notes |
| `--undo` | `forget` | restore a retired note |
| `--no-touch` | `check` | do not refresh heartbeat |
| `--reason` | `claim` | why you’re claiming the area |
| `--ttl` | `claim` | claim lifetime (`90s`, `30m`, `2h`, `1d`) |
| `--pin` | `note` | surface the note prominently |
| `--session` | any | explicit session id (overrides auto-detection) |
# Troubleshooting & FAQ
> Common issues and how to diagnose them with weaver doctor.
## Start with `weaver doctor`
[Section titled “Start with weaver doctor”](#start-with-weaver-doctor)
```sh
weaver doctor
```
It prints the resolved session key + source, repo id, store path, runtime/binding, and enabled state — the fastest way to see what Weaver thinks is going on.
## Common issues
[Section titled “Common issues”](#common-issues)
### ”no session identity” when running an agent command
[Section titled “”no session identity” when running an agent command”](#no-session-identity-when-running-an-agent-command)
The mutating commands (`task`, `claim`, …) need a stable session identity. If your harness doesn’t expose one and there’s no TTY, set it explicitly:
```sh
export WEAVER_SESSION=my-session
```
Observer commands (`status`, `check`) work without identity.
### Agents aren’t coordinating
[Section titled “Agents aren’t coordinating”](#agents-arent-coordinating)
* Did you run `weaver init` in the repo? Check that the block exists in the project or global instruction files you selected.
* Is it disabled? `weaver doctor` shows `enabled`. Re-enable with `weaver enable`.
* Are the agents actually in the **same repo**? `weaver doctor` shows the `repo` id — it should match across sessions.
* For Claude Code, install [hooks](/weaver/guides/claude-code-hooks/) (`weaver init --hooks`) — coordination then happens around every edit automatically instead of relying on the agent remembering to run weaver commands. Hooks need a weaver binary new enough to have the `hook` command (`weaver upgrade`); older binaries no-op silently.
### A crashed agent’s claim seems stuck
[Section titled “A crashed agent’s claim seems stuck”](#a-crashed-agents-claim-seems-stuck)
It isn’t — claims from stale sessions are treated as free (they show as `stale`, not active) and expire on their TTL. See the [conflict model](/weaver/concepts/conflicts/).
### Preflight paused a commit or push
[Section titled “Preflight paused a commit or push”](#preflight-paused-a-commit-or-push)
`weaver preflight` should only pause on relevant soft/hard overlaps with the paths being committed or pushed. Unrelated active sessions are informational. If preflight reports a relevant overlap, ask the user whether to continue, wait briefly, or coordinate first; do not silently poll for the other session to run `weaver done` unless the user explicitly asked to wait.
If preflight reports your own work as another session, the hook or agent likely lost its session identity. Set `WEAVER_SESSION` consistently, or run `weaver doctor` to inspect identity resolution.
### `weaver upgrade` says it’s not applicable
[Section titled “weaver upgrade says it’s not applicable”](#weaver-upgrade-says-its-not-applicable)
`upgrade` only works on the standalone (curl-installed) binary. If you’re running from source or a dev link, that’s expected — re-install via `install.sh` to get an upgradeable binary.
### Two sessions of the same harness show as one
[Section titled “Two sessions of the same harness show as one”](#two-sessions-of-the-same-harness-show-as-one)
They shouldn’t — each session has a distinct harness session id. If they collapse, you may have set the same `WEAVER_SESSION` in both; unset it and let auto-detection run, or give each a unique value.
## FAQ
[Section titled “FAQ”](#faq)
**Does Weaver send my code anywhere?** No. Everything is local under `~/.weaver/`. Nothing is transmitted.
**Does it work offline?** Yes — except `weaver upgrade`, which fetches the latest release.
**Can I use just one agent?** Sure, but Weaver shines with several at once. With one it’s mostly a durable notebook (notes survive across sessions).
# Releasing
> How Weaver releases are cut and distributed.
Releases are automated with **release-please + Conventional Commits**. The full playbook is in the repo: [`RELEASING.md`](https://github.com/sean35mm/weaver/blob/main/RELEASING.md).
## In short
[Section titled “In short”](#in-short)
1. Land `feat:` / `fix:` commits on `main`. (`fix:` → patch, `feat:` → minor.)
2. release-please opens a **“chore: release vX.Y.Z”** PR with the version bump + changelog.
3. **Merge that PR.** That tags the release, builds the standalone binaries for every platform (each stamped with the version) and attaches them.
4. `install.sh` and `weaver upgrade` serve the new binaries automatically.
You don’t hand-pick versions or write the changelog — they come from the commit messages.
## Distribution
[Section titled “Distribution”](#distribution)
Weaver is distributed as a **standalone binary** via `curl | sh` and `weaver upgrade`. See [Install](/weaver/getting-started/install/) and [Architecture](/weaver/reference/architecture/).
# Roadmap
> Where Weaver is headed — what's in flight now, what's coming next, and the directional bets for later.
This is a living view of where Weaver is going, grouped by **horizon** rather than dates. Items move up a tier as they progress. It’s a direction, not a contract — priorities shift as the project (and the way people run agents) evolves.
▸ Recently shipped
* **Claude Code hooks** — coordination is now structural for Claude Code: an advisory warning before any edit that overlaps another live session, and automatic presence after every edit. See the [hooks guide](/weaver/guides/claude-code-hooks/).
* **Note lifecycle** — notes have ids and `weaver note --update ` supersedes stale learnings.
▸ Now — in flight
What’s actively being worked on.
* **Docs & landing polish** — homepage redesign, typography, and this roadmap.
* **Real-world dogfooding** — running Weaver on its own repo across Claude Code and OpenCode, folding the findings back in.
* **Tighten cross-harness session identity** — more reliable detection of distinct sessions across Claude Code, Codex, OpenCode, and Pi.
▸ Next — committed, soon
Lined up and likely to land in the near term.
* **Hook coverage for more harnesses** — bring the structural pre/post-edit coordination to other agents as their hook systems allow.
* **More harness coverage** — Cursor, Gemini CLI, and Aider recognized out of the box.
* **Notes & activity search** — query and filter notes and history instead of scanning the whole log.
* **Dashboard & watch upgrades** — a richer live view, with filtering by area or agent.
▸ Later — directional
Bets we’re interested in but haven’t committed to. Feedback shapes what makes the cut.
* **Optional shared / remote commons** — opt-in sync so agents on *different machines* can share context. The core stays local-first and serverless; this would be strictly additive.
* **Harness-native packaging** — ship Weaver as a Claude Code plugin / skill (and equivalents) for one-step setup.
* **Smarter conflict advisories** — suggest *how* to split overlapping work, not just flag the collision.
* **Richer query layer** — revisit a graph-style query over the commons, if demand warrants.
* **Native Windows support** — today Windows runs via WSL2; native binaries if demand shows up.
▸ Shape the roadmap
Weaver is open source and the roadmap is meant to be influenced.
* **Have an idea or a pain point?** [Open an issue](https://github.com/sean35mm/weaver/issues).
* **Want something prioritized?** 👍 the issue — reactions are a real signal.
* **Want to build it?** See [Contributing](/weaver/contributing/). Changes land through pull requests.]