From d9bdc10866701c647aa0fb21a13250d0a4e5c529 Mon Sep 17 00:00:00 2001 From: bgreenier Date: Tue, 7 Jul 2026 21:50:53 -0700 Subject: [PATCH] chore: doc updates --- README.md | 27 +++- packages/claude-status/README.md | 5 +- packages/client/README.md | 157 +------------------- packages/gh-prs-inbox/README.md | 4 +- packages/low-battery-switch/README.md | 4 +- packages/now-playing-inbox/README.md | 5 +- packages/now-playing-inbox/docs/preview.png | Bin 33416 -> 0 bytes 7 files changed, 28 insertions(+), 174 deletions(-) delete mode 100644 packages/now-playing-inbox/docs/preview.png diff --git a/README.md b/README.md index b306ffd..048edac 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,24 @@ # webhook-objects -A monorepo for working with webhook objects from a Gather user perspective. +> Note: These examples are built with AI, and are designed to be "food for thought", not recommendations that are fit for production use. -See the individual packages for more info: +A collection of quick examples for using Webhook Objects within [Gather 2.0](https://gather.town). -- [`@webhook-objects/client`](./packages/client) -- [`@webhook-objects/now-playing-inbox`](./packages/now-playing-inbox) -- [`@webhook-objects/gh-prs-inbox`](./packages/gh-prs-inbox) -- [`@webhook-objects/claude-status`](./packages/claude-status) -- [`@webhook-objects/low-battery-switch`](./packages/low-battery-switch) +## Getting Started + +To get started, you can explore our individual packages: + +* [`@webhook-objects/now-playing-inbox`](./packages/now-playing-inbox) +* [`@webhook-objects/gh-prs-inbox`](./packages/gh-prs-inbox) +* [`@webhook-objects/claude-status`](./packages/claude-status) +* [`@webhook-objects/low-battery-switch`](./packages/low-battery-switch) + +## Support + +We're committed to helping you get the most out of webhook-objects. That said, the examples provided here are just that - examples. We recommend using these as a jumping off point, not a recipe for production-quality solutions. + +Further - While PRs are welcome, they're reviewed on a best-effort basis. If you have specific questions, please reach out to our support team directly via [gather.town/contact-us](https://gather.town/contact-us). + +## License + +This project is dual licensed under MIT and Apache 2.0. diff --git a/packages/claude-status/README.md b/packages/claude-status/README.md index 72a162e..25d970b 100644 --- a/packages/claude-status/README.md +++ b/packages/claude-status/README.md @@ -1,10 +1,11 @@ # @webhook-objects/claude-status -PoC. Mirrors a Claude Code session's live status into a `status` webhook object, -driven by Claude's own hooks (no polling). +Mirrors a Claude Code session's live status into a `status` webhook object, driven by Claude Hooks. ## Usage +> Note: This example has a unique installation flow, due to challenges with `PATH` when running from within Claude. As a result, we don't use `tsx` to run this. + ```sh pnpm --filter @webhook-objects/claude-status build diff --git a/packages/client/README.md b/packages/client/README.md index a96d3f6..0fe904d 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -1,156 +1 @@ -# @webhook-objects/client - -A typed client for dispatching [Standard Webhooks](https://www.standardwebhooks.com/)-signed events to Gather webhook objects, plus the full set of TypeScript types describing every event, capability, preset, and response. - -The client signs each request (HMAC over `id`, `timestamp`, and body), `POST`s it to your object's webhook URL, and returns a strongly-typed response body. - -## Installation - -```bash -npm install @webhook-objects/client -# or -pnpm add @webhook-objects/client -``` - -### Runtime & `fetch` - -- **Browser / Node 18+**: nothing extra needed — the global `fetch` is used by default. -- **Older Node / explicit `undici`**: install [`undici`](https://github.com/nodejs/undici) (an optional peer dependency) and import from `@webhook-objects/client/node`, which defaults `fetchImpl` to undici's `fetch` and falls back to the global `fetch` when undici isn't present. - -```bash -pnpm add undici # only needed for the /node entry point's undici-backed default -``` - -## Entry points - -| Import | Use case | Default `fetch` | -| --------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------ | -| `@webhook-objects/client` | Auto-resolves to the browser build (and node build under the `node` condition) | global `fetch` | -| `@webhook-objects/client/browser` | Explicit browser build | global `fetch` | -| `@webhook-objects/client/node` | Node build | `undici` (lazy import), falling back to global `fetch` | -| `@webhook-objects/client/objects` | Types only — no client | n/a | - -## Usage - -### Send a capability event - -```ts -import { Client } from "@webhook-objects/client/node"; - -const client = new Client({ - url: "https://api.gather.town/api/v2/hooks/spaces//objects/", - secret: "whsec_...", -}); - -const res = await client.send({ - type: "counter.set", - timestamp: new Date().toISOString(), - data: { count: 1 }, -}); - -if (res.status === "dispatched" || res.status === "space_idle") { - // applied -} -``` - -The `event` argument is a discriminated union: the `type` (`"."`) determines the exact shape required for `data`. Unknown properties and mismatched payloads are rejected at compile time. - -### Probe object metadata (`webhook.ping`) - -```ts -const meta = await client.requestMetadata(); - -meta.status; // "pong" -meta.objectId; // string -meta.spaceId; // string -meta.preset; // "counter" | "switch" | "inbox" | "status" | null -meta.capabilities; // declared capability state for the preset -``` - -### Browser - -```ts -import { Client } from "@webhook-objects/client/browser"; - -const client = new Client({ url, secret }); -``` - -## API - -### `new Client(options)` - -| Option | Type | Description | -| -------------- | ---------------- | ---------------------------------------------------------------- | -| `url` | `URL \| string` | The object's webhook receiver URL. | -| `secret` | `string` | Standard Webhooks signing secret (`whsec_...`). | -| `signOptions?` | `WebhookOptions` | Passed through to `standardwebhooks`. | -| `fetchImpl?` | `FetchImpl` | Override the `fetch` used. Defaults per entry point. | -| `idImpl?` | `IdImpl` | Override webhook id generation. Defaults to `msg_${Date.now()}`. | - -> The `/node` `Client` accepts the same options; it only changes the default `fetchImpl`. - -### `client.send(event, init?)` - -Signs and `POST`s a capability event. Returns `Promise` (`{ status: "dispatched" }` or `{ status: "space_idle" }`). The optional `init` is a `RequestInit` minus `body`, `method`, and `window` (those are controlled by the client) — use it for custom headers, `signal`, etc. - -### `client.requestMetadata()` - -Sends a `webhook.ping` and returns `Promise` describing the object's preset and current capability state. - -### Errors - -`send` / `requestMetadata` reject with an `Error` when: - -- the response status is not `2xx` — `cause` is `{ response }`. -- the body isn't valid JSON — `cause` is `{ error, response }`. - -## Capabilities, methods & presets - -Events are addressed as `"."`. The capabilities and their method payloads: - -| Capability | Method | `data` | -| ---------- | ----------- | ---------------------------------------------------------------- | -| `info` | `set` | `{ name?, description? }` | -| `counter` | `set` | `{ count: number }` | -| `counter` | `increment` | `{ by?: number }` | -| `counter` | `reset` | `{}` | -| `switch` | `set_state` | `{ on: boolean }` | -| `switch` | `toggle` | `{}` | -| `status` | `set` | `{ state: "off" \| "on" \| "question" \| "alert" \| "working" }` | -| `status` | `reset` | `{}` | -| `activity` | `add` | `{ id, text, url? }` | -| `activity` | `remove` | `{ id }` | -| `activity` | `clear` | `{}` | - -Presets compose a fixed set of capabilities (every preset also includes `info`): - -| Preset | Capabilities | -| --------- | ----------------------------- | -| `counter` | `info`, `counter` | -| `switch` | `info`, `switch` | -| `inbox` | `info`, `activity`, `counter` | -| `status` | `info`, `status`, `activity` | - -## Types - -All event, capability, preset, and response types are exported from the package root and from `@webhook-objects/client/objects`. Notable ones: - -- `WebhookEvent` — the union of all sendable capability events. -- `PresetWebhookEvent

` — events accepted by an object of preset `P`. -- `WebhookEventResponseBody`, `PingResponseBody` — success bodies. -- `WebhookHttpResponse`, `WebhookErrorResponse`, `WebhookErrorCode` — the full receiver response surface. - -## Development - -```bash -pnpm test # vitest + coverage (node + chromium projects) -pnpm build # vite build (JS) + tsc (.d.ts into dist/types) -``` - -Tests run in two projects: `node` (all specs) and `chromium` (browser-safe specs, -via `@vitest/browser` + Playwright). Target one with `vitest run --project node` -or `vitest run --project chromium`. - -## License - -Apache-2.0 OR MIT +TODO: Remove in favor of 1P SDK. diff --git a/packages/gh-prs-inbox/README.md b/packages/gh-prs-inbox/README.md index 38e1aee..4cfbe10 100644 --- a/packages/gh-prs-inbox/README.md +++ b/packages/gh-prs-inbox/README.md @@ -1,8 +1,6 @@ # @webhook-objects/gh-prs-inbox -PoC. Polls GitHub for PRs awaiting your review and mirrors them into an `inbox` -webhook object — one activity entry per PR, plus a counter of how many are -waiting. +Uses the GitHub CLI to poll for PRs awaiting your review, mirroring them to an `inbox` webhook object. Requires the [`gh`](https://cli.github.com) CLI, authenticated (`gh auth login`). diff --git a/packages/low-battery-switch/README.md b/packages/low-battery-switch/README.md index e6ce166..ff37269 100644 --- a/packages/low-battery-switch/README.md +++ b/packages/low-battery-switch/README.md @@ -1,8 +1,6 @@ # @webhook-objects/low-battery-switch -PoC. Polls macOS power state and mirrors "running low" into a `switch` webhook -object — on when you're on battery at/below a threshold, off otherwise. A shared -"might drop off the call" light for the space. +Updates a `switch` webhook object based on the current macOS power state. Turned on when your battery is running low. macOS only — reads power via the built-in `pmset` (no extra deps). diff --git a/packages/now-playing-inbox/README.md b/packages/now-playing-inbox/README.md index c2e880e..8d2ac5e 100644 --- a/packages/now-playing-inbox/README.md +++ b/packages/now-playing-inbox/README.md @@ -1,9 +1,8 @@ # @webhook-objects/now-playing-inbox -macOS-only PoC. Watches what's playing (Spotify, then Music) and posts each new -track to an `inbox` webhook object's activity feed. +Watches your system for playing music (via Spotify, Applie Music), posting any new tracks to an `inbox` webhook object. -An inbox webhook object showing recently played songs +macOS only — Uses Apple Script to parse music application state. ## Usage diff --git a/packages/now-playing-inbox/docs/preview.png b/packages/now-playing-inbox/docs/preview.png deleted file mode 100644 index 423c5831679386efaf4437b9be8c8547aa9f899d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33416 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 PuRms2fjdsLv| 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