Webweave
Miadi Webweave is the terminal↔Simplenote bridge. Simplenote publishes no API, so the Python package drives a real Chrome over CDP and treats a note as if there were one — an address that follows you to every device, the cheapest shared surface between a human at a terminal, a human on a phone, and an agent. @miadi/webweave is the typed boundary in front of it, and it wraps exactly one verb.
It lives on a branch
packages/webweave lands in commit 438531ba on feat/webweave-ts-facade-252 — one commit ahead of origin/main, nothing behind it. Check that branch out before you expect the directory to exist on disk. The Python implementation carries no such caveat: it is published.One verb: resolving the session
Webweave sessions are directory-based. The CLI finds the active one by looking for .miadi/webweave/session.json in the current directory, then walking up through the parents, then $HOME. Every surface needs that answer — is there a session here, and what is it? — before it can do anything else. This facade mirrors that rule in TypeScript, and defers to the CLI itself when asked for the verdict.
| Export | Purpose |
|---|---|
| resolveSession(dir?) | Walks up for .miadi/webweave/session.json; returns ResolvedSession | null |
| hasSession(dir?) | The boolean form of the same walk |
| sessionInfo(opts?) | Runs miadi-webweave session info; returns its verdict and the typed record |
| sessionSearchPath(dir?) | The candidate paths, nearest first — for diagnostics |
| WebweaveSession | The record as written by the Python package, snake_case preserved |
Eight unit tests prove it end to end with no browser: nearest-session wins over a parent's, a missing session returns null exactly where the CLI exits 1, unknown keys survive the round trip, and a malformed session.json throws rather than quietly reporting “no session”. Field names stay snake_case because they are read verbatim from a file the Python package owns.
The toolset, and its one dotted edge
Solid emerald is proven today. Dotted amber is deliberate absence — drawn, because a docs surface that shows only what works is not a transcription of reality.
No read, no write — and why
Our records store a note address as a bare 32-hex id, or as simplenote://note/<id>. The Python side accepts neither: every call site either hardcodes https://app.simplenote.com/ or expects the /p/<token> publish form. A bare id reaches Chrome and fails with Cannot navigate to invalid URL; the obvious repair, https://app.simplenote.com/note/<id>, returns 404 against the live authenticated browser. The identifier we store is not an identifier the tool consumes, and the translation between them is a lookup nobody has written.
miadi_webweave, not here. The CLI and the 35 MCP tools consume the same lookup; repairing it inside a facade would fix one caller and leave every other one broken. A facade with one working verb is a package — a facade with five unproven ones is a promise.Weave packages name what they will not do
Webweave is not an island. Its neighbours share one habit: each declares a boundary as clearly as it declares a capability, so a caller knows where the package stops before it starts depending on it. Versions read from manifests on 2026-07-26.
Three doors
pip install "miadi-webweave>=0.7.0" — needed only for sessionInfo(); the direct reads need no Python at all.session info stdout is returned unparsed rather than scraped, and why a missing binary throws instead of reporting no session.