claude up some atproto stuff
0

Configure Feed

Select the types of activity you want to include in your feed.

add codex plugin support + audit microcosm skills against source

packages protopack as a codex cli plugin alongside the existing claude code
plugin (skills + .mcp.json reused verbatim), and corrects skill drift found
by checking each tool's live API and source.

codex plugin:
- .codex-plugin/plugin.json (mirrors .claude-plugin + codex `interface` block)
- .agents/plugins/marketplace.json (root plugin via `url` source — codex only
discovers plugins in marketplace subdirs, so a self-referential `url` entry
is required; verified end-to-end with codex-cli 0.133)
- README documents `codex plugin marketplace add` / `plugin add`
- .gitignore for vit's local .vit/ ship log

skill audit (verified against live endpoints + at-microcosm/microcosm-rs source):
- ufos: rewrote — there is no `/collection/{nsid}` route; param is `order`
(kebab-case enum dids-estimate|records-created), not `sort`; stats/timeseries/
records/prefix/search are separate endpoints; collection is repeatable; limit
1..=200
- pub-search: `search_semantic`/`search_hybrid` aren't tools — it's one `search`
with a `mode` enum; added real tools (get_popular, discover_focal_post,
describe_cluster, recommended_by_top_authors) + `author` filter
- spacedust: current version emits only operation:"create" (no history → no
deletes/replay); messages include source_rev; limits/prefixes/filter-logic
confirmed against source
- app-patterns + microcosm-api.md: synced ufos section; /links/distinct-dids
takes collection+path (not source); resolveMiniDoc returns handle/pds (not
avatars)

slingshot, constellation, atproto verified correct (unchanged); wisp left as-is
(recently audited from source).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

+118 -29
+21
.agents/plugins/marketplace.json
··· 1 + { 2 + "name": "protopack", 3 + "interface": { 4 + "displayName": "protopack" 5 + }, 6 + "plugins": [ 7 + { 8 + "name": "protopack", 9 + "source": { 10 + "source": "url", 11 + "url": "https://tangled.org/zzstoatzz.io/protopack.git", 12 + "ref": "main" 13 + }, 14 + "policy": { 15 + "installation": "AVAILABLE", 16 + "authentication": "ON_INSTALL" 17 + }, 18 + "category": "Engineering" 19 + } 20 + ] 21 + }
+31
.codex-plugin/plugin.json
··· 1 + { 2 + "name": "protopack", 3 + "version": "0.1.0", 4 + "description": "AT Protocol development toolkit — Microcosm services, pdsx record operations, and atproto documentation at your fingertips.", 5 + "author": { 6 + "name": "nate", 7 + "url": "https://bsky.app/profile/zzstoatzz.io" 8 + }, 9 + "repository": "https://tangled.org/zzstoatzz.io/protopack", 10 + "homepage": "https://microcosm.blue", 11 + "license": "MIT", 12 + "keywords": ["atproto", "bluesky", "microcosm", "pdsx", "wisp", "decentralized"], 13 + "skills": "./skills/", 14 + "mcpServers": "./.mcp.json", 15 + "interface": { 16 + "displayName": "protopack", 17 + "shortDescription": "Build AT Protocol apps with Codex", 18 + "longDescription": "protopack equips Codex to build on the AT Protocol: query the Constellation backlink index, stream real-time interactions from Spacedust, hydrate records and identities via Slingshot, discover lexicons with UFOs, search published writing across the atmosphere, read/write PDS records with pdsx, and deploy static sites to wisp.place. Bundles MCP servers (pdsx, atproto-mcp, pub-search) run via uvx or hosted HTTP — uv must be installed for the uvx-based servers.", 19 + "developerName": "nate", 20 + "category": "Engineering", 21 + "capabilities": ["Read", "Write"], 22 + "websiteURL": "https://microcosm.blue", 23 + "defaultPrompt": [ 24 + "find who liked and reposted this bluesky post", 25 + "stream real-time follows for an account", 26 + "deploy my static site to wisp.place" 27 + ], 28 + "brandColor": "#0085FF", 29 + "screenshots": [] 30 + } 31 + }
+1
.gitignore
··· 1 + .vit/
+9
README.md
··· 16 16 17 17 ## install 18 18 19 + ### claude code 20 + 19 21 ```bash 20 22 /plugin marketplace add https://tangled.org/zzstoatzz.io/protopack.git 21 23 /plugin install protopack 24 + ``` 25 + 26 + ### codex 27 + 28 + ```bash 29 + codex plugin marketplace add https://tangled.org/zzstoatzz.io/protopack.git 30 + codex plugin add protopack@protopack 22 31 ``` 23 32 24 33 ## what's included
+1 -1
skills/app-patterns/SKILL.md
··· 19 19 ## example: engagement counters 20 20 21 21 1. Fetch like/repost counts from Constellation's `getBacklinksCount` (parallel requests, one per source type per post URI) 22 - 2. Resolve author identities via Slingshot's `resolveMiniDoc` to get handles and avatars 22 + 2. Resolve author identities via Slingshot's `resolveMiniDoc` to get handles and PDS URLs (avatars/display names live in the profile record — fetch it via `getRecordByUri`) 23 23 3. Open a Spacedust WebSocket filtered to the post URIs + wanted sources to increment/decrement counts live 24 24 25 25 ## writes and listRecords
+14 -6
skills/app-patterns/references/microcosm-api.md
··· 24 24 | `/xrpc/blue.microcosm.links.getBacklinksCount` | GET | `subject`, `source` | `{total}` | 25 25 | `/xrpc/blue.microcosm.links.getBacklinks` | GET | `subject`, `source`, `limit`, `cursor` | `{total, records: [{did, collection, rkey}], cursor}` | 26 26 | `/links/all` | GET | `target` (DID) | all collection+path combos linking to this DID with counts | 27 - | `/links/distinct-dids` | GET | `target`, `source` (dot-prefixed: `.subject.uri`) | distinct DIDs | 27 + | `/links/distinct-dids` | GET | `target`, `collection`, `path` (dot-prefixed, e.g. `.subject`) | `{total, linking_dids: [...]}` | 28 28 29 29 - `subject`: AT-URI or bare DID 30 30 - `source` format: `{collection}:{path}` (path omits leading dot) ··· 62 62 63 63 **Message format:** 64 64 ```json 65 - {"kind":"link","origin":"live","link":{"operation":"create","source":"app.bsky.feed.like:subject.uri","source_record":"at://did:plc:.../app.bsky.feed.like/3lv...","subject":"at://did:plc:.../app.bsky.feed.post/3lg..."}} 65 + {"kind":"link","origin":"live","link":{"operation":"create","source":"app.bsky.feed.like:subject.uri","source_record":"at://did:plc:.../app.bsky.feed.like/3lv...","source_rev":"3lv...","subject":"at://did:plc:.../app.bsky.feed.post/3lg..."}} 66 66 ``` 67 + 68 + Current version emits only `operation: "create"` and `origin: "live"` (no history → no deletes, no replay). 67 69 68 70 **Dynamic filter updates** — send on open connection: 69 71 ```json ··· 76 78 77 79 | endpoint | method | params | returns | 78 80 |----------|--------|--------|---------| 79 - | `/collections` | GET | `sort`, `limit`, `prefix` | `{collections: [{nsid, creates, updates, deletes, dids_estimate}]}` | 80 - | `/collection/{nsid}` | GET | — | stats, timeseries, sample records | 81 + | `/collections` | GET | `order`, `limit`, `cursor`, `since`, `until` | `{collections: [{nsid, creates, updates, deletes, dids_estimate}], cursor}` | 82 + | `/prefix` | GET | `prefix` (required), `order`, `limit`, `cursor`, `since`, `until` | `{total: {...}, children: [{type, nsid, creates, updates, deletes, dids_estimate}]}` | 83 + | `/collections/stats` | GET | `collection` (required, repeatable), `since`, `until` | `{<nsid>: {creates, updates, deletes, dids_estimate}}` | 84 + | `/timeseries` | GET | `collection` (required, repeatable), `step`, `since`, `until` | `{range: [timestamps], ...}` | 85 + | `/records` | GET | `collection` (required, repeatable) | `[{collection, did, rkey, record, time_us}]` (sample records) | 86 + | `/search` | GET | `q` (required) | `{matches: [{nsid, creates, updates, deletes, dids_estimate}]}` | 81 87 82 - - `sort`: `dids-estimate` (most users) or `records-created` (most records). Default is alphabetical (useless — returns junk NSIDs). 83 - - `prefix`: filter by namespace, e.g. `prefix=app.bsky` 88 + - `order`: `dids-estimate` (most users) or `records-created` (most records). Default (no `order`) is alphabetical (useless — returns junk NSIDs). Mutually exclusive with `cursor`. 89 + - `limit`: defaults to 100 (32 when ordered), max 200. 90 + - `/timeseries` `step` is in **seconds**, minimum 3600. 91 + - there is no `/collection/{nsid}` route — use `/collections/stats`, `/timeseries`, `/records` with `?collection=`.
+15 -11
skills/pub-search/SKILL.md
··· 14 14 15 15 | tool | what it does | 16 16 |------|-------------| 17 - | `search` | keyword search with BM25 ranking (~9ms) | 18 - | `search_semantic` | meaning-based vector search — finds related content without keyword overlap (~350ms) | 19 - | `search_hybrid` | combines both via reciprocal rank fusion — best default for research | 17 + | `search` | search writing; `mode` picks the strategy (see below) | 20 18 | `get_document` | fetch full text by AT-URI | 21 - | `find_similar` | find related documents to a given URI | 19 + | `find_similar` | find documents semantically similar to a given URI | 22 20 | `get_tags` | list all tags with counts | 23 - | `get_stats` | index statistics | 21 + | `get_stats` | index statistics (document/publication counts) | 22 + | `get_popular` | popular search queries others have run | 23 + | `discover_focal_post` | surface notable posts right now (`sort`: trending/top, `window`) | 24 + | `describe_cluster` | a focal document's semantic neighborhood + cross-platform observations | 25 + | `recommended_by_top_authors` | what the most-recommended writers themselves endorse | 24 26 25 - ## choosing a search mode 27 + ## search modes 26 28 27 - - **keyword**: fast, use when you know the terms 28 - - **semantic**: slower, finds conceptually related content even without matching words 29 - - **hybrid**: best for research — catches both exact and related matches 29 + `search` takes a single `mode` argument (not separate tools): 30 + 31 + - **keyword** (default): fast exact match (~100ms), supports all filters 32 + - **semantic**: meaning-based vector search (~500ms), good for natural-language queries 33 + - **hybrid**: both combined via rank fusion — best default for research; results carry a `source` field 30 34 31 35 ## filters 32 36 33 - `platform`, `tag`, `since` (ISO date), `limit` — available on keyword search. Semantic and hybrid support `platform` and `limit`. 37 + `search` args: `query`, `mode`, `platform` (`leaflet`/`pckt`/`offprint`/`greengale`/`whitewind`/`other`), `author` (DID or handle), `limit` (default 5, max 40). `tag` and `since` (ISO date) are **keyword-mode only**. 34 38 35 39 ## research workflow 36 40 37 - 1. `search_hybrid` for the concept 41 + 1. `search` with `mode="hybrid"` for the concept 38 42 2. `get_document` on the best results to read full text 39 43 3. `find_similar` to expand from a good result
+2 -2
skills/spacedust/SKILL.md
··· 34 34 ## message format 35 35 36 36 ```json 37 - {"kind":"link","origin":"live","link":{"operation":"create","source":"app.bsky.feed.like:subject.uri","source_record":"at://did:plc:.../app.bsky.feed.like/3lv4ouczo2b2a","subject":"at://did:plc:.../app.bsky.feed.post/3lgwdn7vd722r"}} 37 + {"kind":"link","origin":"live","link":{"operation":"create","source":"app.bsky.feed.like:subject.uri","source_record":"at://did:plc:.../app.bsky.feed.like/3lv4ouczo2b2a","source_rev":"3lv4ouczp1x2a","subject":"at://did:plc:.../app.bsky.feed.post/3lgwdn7vd722r"}} 38 38 ``` 39 39 40 - `operation` is `create` or `delete`. 40 + The current (lightweight) version emits only `operation: "create"` — it keeps no history, so it cannot emit `delete` events and offers no replay window (`origin` is always `"live"`). A future overhaul adds a full forward-link index with hydrated deletes and replay. 41 41 42 42 ## dynamic filter updates 43 43
+24 -9
skills/ufos/SKILL.md
··· 18 18 19 19 **List collections** — sorted by activity: 20 20 ```bash 21 - curl "https://ufos-api.microcosm.blue/collections?sort=dids-estimate&limit=20" 22 - # sort options: "dids-estimate" (most users) or "records-created" (most records) 23 - # returns {"collections":[{"nsid":"app.bsky.feed.post","creates":...,"updates":...,"deletes":...,"dids_estimate":...},...]} 21 + curl -m 15 "https://ufos-api.microcosm.blue/collections?order=dids-estimate&limit=20" 22 + # order: "dids-estimate" (most users) or "records-created" (most records) 23 + # returns {"collections":[{"nsid":"app.bsky.feed.post","creates":...,"updates":...,"deletes":...,"dids_estimate":...}],"cursor":"..."} 24 24 ``` 25 25 26 - The default sort is alphabetical, which returns junk/namespace-probing NSIDs. Always specify `sort=dids-estimate` or `sort=records-created`. Use `prefix=` to filter to a known namespace (e.g. `prefix=app.bsky`). 26 + The default (no `order`) is alphabetical, which returns junk/namespace-probing NSIDs — always pass `order`. `order` is mutually exclusive with `cursor` (sorted lists aren't paginated); omit `order` and use `cursor` for a full paginated walk. `limit` defaults to 100 (32 when ordered), max 200. `since`/`until` (UTC datetimes) bound the window. 27 + 28 + **Filter by namespace prefix** — hierarchical browse: 29 + ```bash 30 + curl -m 15 "https://ufos-api.microcosm.blue/prefix?prefix=app.bsky&limit=20" 31 + # returns {"total":{creates,updates,deletes,dids_estimate},"children":[{"type":"collection|prefix","nsid":"...","creates":...,...}]} 32 + ``` 27 33 28 - **Collection detail** — timeseries and sample records: 34 + **Collection stats / timeseries / sample records** — separate endpoints, each takes `collection=<NSID>` (repeatable — pass `collection=` multiple times for several at once): 29 35 ```bash 30 - curl "https://ufos-api.microcosm.blue/collection/app.bsky.feed.post" 31 - # returns stats, timeseries data, and sample records for the collection 36 + curl -m 15 "https://ufos-api.microcosm.blue/collections/stats?collection=app.bsky.feed.post" 37 + # {"app.bsky.feed.post":{"creates":...,"updates":...,"deletes":...,"dids_estimate":...}} 38 + 39 + curl -m 15 "https://ufos-api.microcosm.blue/timeseries?collection=app.bsky.feed.post&step=3600" 40 + # {"range":["2026-...Z",...], ...} — step is SECONDS, minimum 3600; since/until bound the window 41 + 42 + curl -m 15 "https://ufos-api.microcosm.blue/records?collection=app.bsky.feed.post" 43 + # [{"collection":"...","did":"...","rkey":"...","record":{...},"time_us":...}] — recent sample records 32 44 ``` 33 45 34 - **Search collections by prefix:** 46 + **Search lexicons by name:** 35 47 ```bash 36 - curl "https://ufos-api.microcosm.blue/collections?prefix=app.bsky&sort=dids-estimate" 48 + curl -m 15 "https://ufos-api.microcosm.blue/search?q=leaflet" 49 + # {"matches":[{"nsid":"pub.leaflet....","creates":...,...}]} 37 50 ``` 51 + 52 + There is no `/collection/{nsid}` route — use `/collections/stats`, `/timeseries`, and `/records` with `?collection=`.