Skip to content

Commit 59971d2

Browse files
authored
docs: update AGENTS.md and README for platform reorg (#381)
* docs: update AGENTS.md and README for platform reorg and Slack outbox C&C * docs: cover Google Workspace, Linear, and Jira integrations in README
1 parent 43f9324 commit 59971d2

2 files changed

Lines changed: 34 additions & 15 deletions

File tree

AGENTS.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ cmd/pigeon/main.go → cli.Execute()
4444
4545
internal/hub Routes incoming messages to connected Claude Code sessions via SSE
4646
47-
internal/listener/* Platform-specific listeners (slack, whatsapp) — write to store, observe identity
48-
internal/gws/* Google Workspace pollers (drive, gmail, calendar)
49-
internal/linear/* Linear issue poller
50-
internal/jira/* Jira issue poller
47+
internal/platform/* Per-platform adapters, each with its own manager/poller/auth subpackages:
48+
slack, whatsapp — listeners that write to store, observe identity
49+
gws — Google Workspace pollers (drive, gmail, calendar)
50+
linear, jira — issue pollers, split into issue.jsonl/comments.jsonl
5151
5252
internal/store Store interface + JSONL protocol v1 implementation (modelv1/)
5353
internal/identity Cross-platform contact identity (Observer/Resolver pattern)
@@ -66,7 +66,7 @@ cmd/pigeon/main.go → cli.Execute()
6666

6767
- **MCP Server** (`internal/mcp/server`): Runs inside Claude Code as a channel server. Connects to the daemon's SSE endpoint and delivers messages as channel notifications.
6868

69-
- **Outbox** (`internal/outbox`): Queues outgoing messages from Claude for human review. `pigeon review` opens a Bubble Tea TUI for approve/reject.
69+
- **Outbox** (`internal/outbox`): Queues outgoing messages from Claude for human review. By default, review happens as command-and-control in Slack — the daemon posts a message to the owner's DM with approve/dismiss/send-mode/feedback actions (`internal/platform/slack/interactive.go`). `pigeon review` (hidden from help, still functional) opens a Bubble Tea TUI for the same approve/reject flow.
7070

7171
- **Paths** (`internal/paths`): XDG-compliant directory resolution. Env overrides: `PIGEON_CONFIG_DIR`, `PIGEON_DATA_DIR`, `PIGEON_STATE_DIR`. Defaults: `~/.config/pigeon/`, `~/.local/share/pigeon/`, `~/.local/state/pigeon/`.
7272

@@ -111,7 +111,7 @@ Both are scoped by `read.SearchDirs(workspace, platform, account)` which resolve
111111
2. Pollers receive GWS/Linear/Jira updates → write JSONL/content files through the store and typed paths
112112
3. Hub picks up new messages → pushes to connected MCP sessions via SSE
113113
4. Claude Code receives channel notifications → can read/search/reply via CLI
114-
5. Outgoing replies go to the outbox → human approves via `pigeon review` → sent via `api.Send()`
114+
5. Outgoing replies go to the outbox → human approves via Slack command-and-control (or `pigeon review`) → sent via `api.Send()`
115115

116116
## Error Handling
117117

README.md

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,38 @@
11
# Pigeon
22

3-
Pigeon is a local-first messaging bridge for AI agents. It mirrors your messaging history as plain text files and lets AI agents read, search, and reply to messages through a CLI, or receive them in real time through Claude Code.
3+
Pigeon is a local-first bridge between AI agents and your messaging and workspace tools. It mirrors Slack and WhatsApp conversations, Gmail, Calendar, and Drive activity, and Linear and Jira issues as plain text files, and lets AI agents read, search, and reply through a CLI — with Slack and WhatsApp messages also delivered in real time through Claude Code.
44

55
## The Idea
66

7-
Messaging platforms generate a constant stream of context that AI agents could act on, but these platforms are designed for humans, not programmatic access. Pigeon solves this by maintaining a local mirror of your messaging history and providing a CLI that agents can use to navigate and search that history.
7+
Messaging and workspace platforms generate a constant stream of context that AI agents could act on, but these platforms are designed for humans, not programmatic access. Pigeon solves this by maintaining a local mirror of that history — Slack and WhatsApp conversations, Gmail/Calendar/Drive activity, Linear and Jira issues — and providing a CLI that agents can use to navigate and search across all of it.
88

9-
When connected to Claude Code, pigeon delivers messages in real time via channel notifications. Claude can then react to incoming messages, gather context from other tools, and draft replies, all while keeping a human in the loop for anything outgoing.
9+
When connected to Claude Code, pigeon delivers Slack and WhatsApp messages in real time via channel notifications. Claude can then react to an incoming message, pull context from a related Linear ticket, Jira issue, or Google Doc, draft a reply, and queue it for your approval, all while keeping a human in the loop for anything outgoing.
1010

11-
This becomes powerful when combined with other agent-facing CLIs like [linear-cli](https://github.com/schpet/linear-cli) for issue tracking or [Google Workspace CLI](https://github.com/googleworkspace/cli) for docs and email. The agent can correlate a Slack question with a Linear ticket, pull context from a Google Doc, draft a reply, and queue it for your approval. Pigeon provides the messaging layer; the agent orchestrates across all of them.
11+
Pigeon builds on top of [linear-cli](https://github.com/schpet/linear-cli), [jira-cli](https://github.com/ankitpokhrel/jira-cli), and the [Google Workspace CLI](https://github.com/googleworkspace/cli): you authenticate through those tools, and pigeon uses that same auth to poll and mirror your issues and workspace activity locally.
1212

1313
## How It Works
1414

1515
**Listeners** connect to messaging platforms (Slack, WhatsApp) and append incoming messages to local text files, organized by date. They run as a background daemon.
1616

17+
**Pollers** sync Google Workspace (Gmail, Calendar, Drive), Linear, and Jira on a schedule, mirroring issues and workspace activity to local files the same way listeners mirror messages.
18+
1719
**The CLI** lets agents (or humans) list conversations, read history, search across platforms, and send replies. `pigeon help` describes everything.
1820

19-
**Channels** deliver messages to Claude Code in real time via MCP channel notifications. When a new message arrives, Claude gets pinged and can react immediately.
21+
**Channels** deliver Slack and WhatsApp messages to Claude Code in real time via MCP channel notifications. When a new message arrives, Claude gets pinged and can react immediately. Workspace and issue data from pollers is searched on demand rather than pushed live.
2022

21-
**The Outbox** holds outgoing messages from Claude for human review. `pigeon review` opens a terminal UI to approve, reject, or provide feedback before anything is sent.
23+
**The Outbox** holds outgoing messages from Claude for human review. By default, review happens right in Slack: the daemon DMs you the pending message with buttons to approve, dismiss, or leave feedback. `pigeon review` opens a terminal UI for the same flow.
2224

2325
## Prerequisites
2426

2527
- **[ripgrep](https://github.com/BurntSushi/ripgrep#installation)** (`rg`) — required for search, read, and file discovery. Install via `brew install ripgrep`, `apt install ripgrep`, or see the [ripgrep installation guide](https://github.com/BurntSushi/ripgrep#installation).
2628
- **[uv](https://docs.astral.sh/uv/getting-started/installation/)** — required for the embedding sidecar used by workstream routing. Install via `curl -LsSf https://astral.sh/uv/install.sh | sh`.
2729

30+
Optional, only needed for the integrations you use:
31+
32+
- **[Google Workspace CLI](https://github.com/googleworkspace/cli)** (`gws`) — for `pigeon setup-gws` (Gmail, Calendar, Drive). Run `gws auth login` first.
33+
- **[linear-cli](https://github.com/schpet/linear-cli)** — for `pigeon setup-linear`. Run `linear auth login` first.
34+
- **[jira-cli](https://github.com/ankitpokhrel/jira-cli)** — for `pigeon setup-jira`. Run `jira init` and export `JIRA_API_TOKEN` first.
35+
2836
## Installation
2937

3038
Download the latest release for your platform:
@@ -67,11 +75,20 @@ pigeon daemon start
6775
pigeon claude
6876
```
6977

78+
Set up Google Workspace, Linear, or Jira to mirror them for search (no live Claude Code delivery):
79+
80+
```bash
81+
pigeon setup-gws # after `gws auth login`
82+
pigeon setup-linear # after `linear auth login`
83+
pigeon setup-jira # after `jira init` + JIRA_API_TOKEN
84+
pigeon daemon start
85+
```
86+
7087
Run `pigeon help` for the full list of commands.
7188

7289
## Multi-Account
7390

74-
Pigeon supports multiple Slack workspaces and WhatsApp numbers simultaneously. Each account gets its own listener, message store, and session binding. The daemon manages all of them, and `pigeon claude` lets you pick which account to connect.
91+
Pigeon supports multiple accounts per platform — several Slack workspaces, WhatsApp numbers, Google Workspace accounts, Linear workspaces, and Jira configurations simultaneously. Each gets its own store under the data root, and the `--workspace` flag scopes CLI operations to a subset of accounts. Slack and WhatsApp accounts additionally get a session binding: the daemon manages all of them, and `pigeon claude` lets you pick which one to connect.
7592

7693
## Architecture
7794

@@ -91,8 +108,10 @@ Pigeon supports multiple Slack workspaces and WhatsApp numbers simultaneously. E
91108
(storage) (via MCP channel)
92109
```
93110

94-
The **daemon** runs all platform listeners, serves a Unix socket API, routes messages to connected Claude Code sessions, and manages the outbox.
111+
The **daemon** runs all platform listeners and pollers, serves a Unix socket API, routes Slack/WhatsApp messages to connected Claude Code sessions, and manages the outbox.
95112

96-
The **hub** routes incoming messages to the right Claude Code session. One session per account. Handles session lifecycle: connect, disconnect, and handoff when a new session replaces an old one.
113+
The **hub** routes incoming Slack and WhatsApp messages to the right Claude Code session. One session per account. Handles session lifecycle: connect, disconnect, and handoff when a new session replaces an old one.
97114

98115
The **MCP server** runs inside Claude Code as a channel server. It receives messages from the daemon via SSE and delivers them as channel notifications that Claude can act on.
116+
117+
Google Workspace, Linear, and Jira pollers run inside the same daemon and write to the same text-file storage on a schedule, but they don't go through the hub — that real-time push to Claude Code is Slack/WhatsApp only. Their history is searched on demand via the CLI instead.

0 commit comments

Comments
 (0)