--- name: proof description: Create, edit, comment on, and share markdown documents via Proof's web API and local bridge. Use when asked to "proof", "share a doc", "create a proof doc", "comment on a document", "suggest edits", "review in proof", or when given a proofeditor.ai URL. allowed-tools: - Bash - Read - Write - WebFetch --- # Proof - Collaborative Markdown Editor Proof is a collaborative document editor for humans and agents. It supports two modes: 1. **Web API** - Create and edit shared documents via HTTP (no install needed) 2. **Local Bridge** - Drive the macOS Proof app via localhost:9847 ## Web API (Primary for Sharing) ### Create a Shared Document No authentication required. Returns a shareable URL with access token. ```bash curl -X POST https://www.proofeditor.ai/share/markdown \ -H "Content-Type: application/json" \ -d '{"title":"My Doc","markdown":"# Hello\n\nContent here."}' ``` **Response format:** ```json { "slug": "abc123", "tokenUrl": "https://www.proofeditor.ai/d/abc123?token=xxx", "accessToken": "xxx", "ownerSecret": "yyy", "_links": { "state": "https://www.proofeditor.ai/api/agent/abc123/state", "ops": "https://www.proofeditor.ai/api/agent/abc123/ops" } } ``` Use the `tokenUrl` as the shareable link. The `_links` give you the exact API paths. ### Read a Shared Document ```bash curl -s "https://www.proofeditor.ai/api/agent/{slug}/state" \ -H "x-share-token: " ``` ### Edit a Shared Document All operations go to `POST https://www.proofeditor.ai/api/agent/{slug}/ops` **Note:** Use the `/api/agent/{slug}/ops` path (from `_links` in create response), NOT `/api/documents/{slug}/ops`. **Authentication for protected docs:** - Header: `x-share-token: ` or `Authorization: Bearer ` - Token comes from the URL parameter: `?token=xxx` or the `accessToken` from create response **Comment on text:** ```json {"op": "comment.add", "quote": "text to comment on", "by": "ai:", "text": "Your comment here"} ``` **Reply to a comment:** ```json {"op": "comment.reply", "markId": "", "by": "ai:", "text": "Reply text"} ``` **Resolve a comment:** ```json {"op": "comment.resolve", "markId": "", "by": "ai:"} ``` **Suggest a replacement:** ```json {"op": "suggestion.add", "kind": "replace", "quote": "original text", "by": "ai:", "content": "replacement text"} ``` **Suggest a deletion:** ```json {"op": "suggestion.add", "kind": "delete", "quote": "text to delete", "by": "ai:"} ``` **Bulk rewrite:** ```json {"op": "rewrite.apply", "content": "full new markdown", "by": "ai:"} ``` ### Known Limitations (Web API) - `suggestion.add` with `kind: "insert"` returns Bad Request on the web ops endpoint. Use `kind: "replace"` with a broader quote instead, or use `rewrite.apply` for insertions. - Bridge-style endpoints (`/d/{slug}/bridge/*`) require client version headers (`x-proof-client-version`, `x-proof-client-build`, `x-proof-client-protocol`) and return 426 CLIENT_UPGRADE_REQUIRED without them. Use the `/api/agent/{slug}/ops` endpoint instead. ## Local Bridge (macOS App) Requires Proof.app running. Bridge at `http://localhost:9847`. **Required headers:** - `X-Agent-Id: claude` (identity for presence) - `Content-Type: application/json` - `X-Window-Id: ` (when multiple docs open) ### Key Endpoints | Method | Endpoint | Purpose | |--------|----------|---------| | GET | `/windows` | List open documents | | GET | `/state` | Read markdown, cursor, word count | | GET | `/marks` | List all suggestions and comments | | POST | `/marks/suggest-replace` | `{"quote":"old","by":"ai:","content":"new"}` | | POST | `/marks/suggest-insert` | `{"quote":"after this","by":"ai:","content":"insert"}` | | POST | `/marks/suggest-delete` | `{"quote":"delete this","by":"ai:"}` | | POST | `/marks/comment` | `{"quote":"text","by":"ai:","text":"comment"}` | | POST | `/marks/reply` | `{"markId":"","by":"ai:","text":"reply"}` | | POST | `/marks/resolve` | `{"markId":"","by":"ai:"}` | | POST | `/marks/accept` | `{"markId":""}` | | POST | `/marks/reject` | `{"markId":""}` | | POST | `/rewrite` | `{"content":"full markdown","by":"ai:"}` | | POST | `/presence` | `{"status":"reading","summary":"..."}` | | GET | `/events/pending` | Poll for user actions | ### Presence Statuses `thinking`, `reading`, `idle`, `acting`, `waiting`, `completed` ## Workflow: Review a Shared Document When given a Proof URL like `https://www.proofeditor.ai/d/abc123?token=xxx`: 1. Extract the slug (`abc123`) and token from the URL 2. Read the document state via the API 3. Add comments or suggest edits using the ops endpoint 4. The author sees changes in real-time ```bash # Read curl -s "https://www.proofeditor.ai/api/agent/abc123/state" \ -H "x-share-token: xxx" # Comment curl -X POST "https://www.proofeditor.ai/api/agent/abc123/ops" \ -H "Content-Type: application/json" \ -H "x-share-token: xxx" \ -d '{"op":"comment.add","quote":"text","by":"ai:compound","text":"comment"}' # Suggest edit curl -X POST "https://www.proofeditor.ai/api/agent/abc123/ops" \ -H "Content-Type: application/json" \ -H "x-share-token: xxx" \ -d '{"op":"suggestion.add","kind":"replace","quote":"old","by":"ai:compound","content":"new"}' ``` ## Workflow: Create and Share a New Document ```bash # 1. Create RESPONSE=$(curl -s -X POST https://www.proofeditor.ai/share/markdown \ -H "Content-Type: application/json" \ -d '{"title":"My Doc","markdown":"# Title\n\nContent here."}') # 2. Extract URL and token URL=$(echo "$RESPONSE" | jq -r '.tokenUrl') SLUG=$(echo "$RESPONSE" | jq -r '.slug') TOKEN=$(echo "$RESPONSE" | jq -r '.accessToken') # 3. Share the URL echo "$URL" # 4. Make edits using the ops endpoint curl -X POST "https://www.proofeditor.ai/api/agent/$SLUG/ops" \ -H "Content-Type: application/json" \ -H "x-share-token: $TOKEN" \ -d '{"op":"comment.add","quote":"Content here","by":"ai:compound","text":"Added a note"}' ``` ## Safety - Use `/state` content as source of truth before editing - Prefer suggest-replace over full rewrite for small changes - Don't span table cells in a single replace - Always include `by` field for attribution tracking