Skip to content
This repository was archived by the owner on Sep 29, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions .changeset/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ https://github.com/changesets/changesets for the format):
Short description of the change.
```

Use `patch` for fixes, `minor` for features. `pipes` is private and never
publishes to npm; changesets only manages the version number and
`CHANGELOG.md`. Merging the Version Packages PR bumps the version — shipping
Use `patch` for fixes, `minor` for features. `pipes` (in `packages/pipes`)
is the release package: it is private and never publishes to npm.
All workspace packages move in lockstep via the `fixed` group in
`config.json`, so there is a single version number everywhere.
`packages/pipes/CHANGELOG.md` carries the release notes.
Merging the Version Packages PR bumps the version — shipping
binaries still happens by pushing a matching tag (`git tag vX.Y.Z`), which
triggers the release workflow.
2 changes: 1 addition & 1 deletion .changeset/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"fixed": [],
"fixed": [["pipes", "@pipes/mcp", "@pipes/protocol", "@pipes/server", "@pipes/tui"]],
"linked": [],
"access": "restricted",
"baseBranch": "main",
Expand Down
5 changes: 5 additions & 0 deletions .changeset/connections-show-active.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'pipes': patch
---

Manage → Connections now lists the repositories already connected to pipes above a compact single-line choice list for adding new ones.
5 changes: 5 additions & 0 deletions .changeset/lowercase-pipes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'pipes': patch
---

Use lowercase `pipes` consistently in user-facing copy.
4 changes: 4 additions & 0 deletions .changeset/olive-geese-shake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Extract the daemon into the `@pipes/server` package. No user-facing changes.
5 changes: 5 additions & 0 deletions .changeset/tidy-choice-rows.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'pipes': patch
---

Keep TUI choice and repository rows on a single line so narrow panes clip instead of overlapping.
4 changes: 4 additions & 0 deletions .changeset/tidy-monorepo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Split the repository into a Bun workspace monorepo with `@pipes/protocol`, `@pipes/mcp`, and `@pipes/tui` packages. No user-facing changes.
14 changes: 14 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: ci
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
- run: bun install
- run: bun run check
6 changes: 6 additions & 0 deletions .pipes/config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
export default {
github: {
assigned_to_me: true,
repository: 'peelar/pipes',
state: 'open',
workflow: 'plan-implement-review',
},
workflows: {
'plan-implement-review': {
steps: [
Expand Down
57 changes: 36 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Pipes
# pipes

```text
╭───┬───╮ ╭┬─────┬╮ ╭───┬───╮ ╭───┬───╮ ╭───┬───╮
Expand All @@ -12,7 +12,13 @@

A terminal-based personal software factory built to protect your attention.

Pipes lets you codify how you work depending on where you work. For each repository and source of intake (GitHub, Linear, Sentry, etc.) that you maintain, define a TypeScript workflow (pipe):
![pipes terminal UI showing the task queue, workflow steps, and task activity](docs/pipes.png)

---

Each source of software development tasks has its own process and definition of done. pipes lets you codify them and forward the boring work to the agents, without you babysitting them.

You start by defining a TypeScript workflow (pipe):

```ts
import { pipe } from "pipes";
Expand All @@ -38,39 +44,48 @@ export default pipe({
});
```

Then, you attach it to your source of intake (GitHub, Linear, Sentry, etc.):

```ts
import { pipe } from "pipes";

export default pipe({
github: {
assigned_to_me: true,
repository: 'peelar/pipes',
state: 'open',
workflow: 'plan-implement-review',
},
...
});
```

and run `pipes` to start the server + TUI.

After initial configuration, pipes pulls tasks from your configured sources and moves each through its assigned
sequence of pipes. Each pipe runs a detached agent to carry out its step.

You can monitor the work through TUI, jump into an agent session when you want to take the wheel, or use MCP to ask for tasks that require your attention.

## Features

- A keyboard-first terminal UI with live agent messages, tool activity, and step progress.
- Work that keeps running in the background, with tasks and history saved locally in SQLite.
- TypeScript workflows with model, reasoning, and prompt settings for each step. Start with plan → implement → review and make it yours.
- TypeScript workflows with model, reasoning, and prompt settings for each step.
- Separate Git worktrees for each run, with results saved to local branches.
- Interactive takeover: jump into a task's Codex session when you want to take the wheel.
- Run a detached agent session or jump into a task's agent session when you want to take the wheel.
- Work intake from connected tools: GitHub today, with more sources such as Linear and Sentry planned.
- MCP access for delegating work from your coding agent.
- Bundled agent adapter with guided setup — bring your own Codex CLI on PATH.
- Planned: human review and follow-up runs before accepting finished work.

> [!NOTE]
> Currently, pipes only supports Codex as the agent and GitHub as the work intake source.

## Run

Install the single binary (macOS and Linux; Windows users can use WSL).
Requires the Codex CLI and Git.

```sh
curl -fsSL https://raw.githubusercontent.com/peelar/pipes/main/scripts/install.sh | sh
pipes
```

Setup walks you through connecting a repository and creating your first workflow.
If Codex needs you to sign in, run `pipes agent login`.

From a source checkout instead (requires Bun 1.4.2+):

```sh
bun install
bun run pipes
```

Press `[n]` to add your first task, then `[s]` to start a workflow. Watch it progress, or press
`[j]` to jump into its Codex session. When you're done watching, `[q]` closes the UI
and leaves Pipes working. Run `bun run pipes` to return, or
`bun run pipes shutdown` to stop the server.
86 changes: 77 additions & 9 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion docs/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ After a successful run is checkpointed, Pipes cleans up its Git worktree while p

## Interactive handoff

The TUI is keyboard-first. Display keyboard shortcuts in brackets. `[m] manage` opens a tabbed modal for repository connections and agent setup. Connections presents one choice list for the current repository, local directory browsing, and GitHub repositories; local and remote are not nested tabs. A configured action such as `O` opens a task in a new terminal pane or window. Terminal launch configuration is separate from harness launch configuration.
The TUI is keyboard-first. Display keyboard shortcuts in brackets. `[m] manage` opens a tabbed modal for repository connections and agent setup. Connections lists the registered repositories and presents one choice list for connecting the current repository, local directory browsing, and GitHub repositories; local and remote are not nested tabs. A configured action such as `O` opens a task in a new terminal pane or window. Terminal launch configuration is separate from harness launch configuration.

Jumping in means interactive takeover: stop the current worker and confirm it has stopped, then hold workflow progression while the human owns the step. For Codex, launch the actual bundled `codex resume` with the saved session ID in the run's worktree. Read-only conversation inspection is a separate action.

Expand Down
10 changes: 5 additions & 5 deletions docs/github.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@ repositories can be selected again to attach intake.

For another GitHub repository, press **[g] GitHub** in the picker and enter
`owner/repo`, an HTTPS URL, or an SSH URL. Confirming clones it under
`<Pipes data directory>/repositories/owner/repo`. Only connect repositories you
trust: Pipes loads executable TypeScript configuration from the checkout.
`<pipes data directory>/repositories/owner/repo`. Only connect repositories you
trust: pipes loads executable TypeScript configuration from the checkout.
Existing managed clones are reused, not fetched or reset.

Pipes identifies your GitHub account, then asks which configured workflow should
pipes identifies your GitHub account, then asks which configured workflow should
receive issues. If none exists, the UI offers the Codex/starter workflow setup.
Confirming creates `.pipes/github.ts` and imports matching issues. Existing
configuration and policy are preserved. Edit policy in code to change it.

Authentication uses the Pipes GitHub App's device flow. The connection UI first
Authentication uses the pipes GitHub App's device flow. The connection UI first
opens GitHub's installation screen, where you choose the account and repositories,
then guides you through sign-in. Use **Manage GitHub access** in the repository
picker to change those grants later.
Expand Down Expand Up @@ -49,7 +49,7 @@ After changing configuration, or to sync immediately, use
The command reports matching observations, including already imported issues.

Polling requires no public endpoint. For faster optional webhook delivery, set
`PIPES_GITHUB_WEBHOOK_SECRET` in the server environment and restart Pipes. The
`PIPES_GITHUB_WEBHOOK_SECRET` in the server environment and restart pipes. The
webhook listener binds to `127.0.0.1:9419`; optionally change
the port with `PIPES_GITHUB_PORT`. Expose that listener through your own HTTPS tunnel
or reverse proxy. In the target GitHub repository's webhook settings, configure:
Expand Down
Binary file added docs/pipes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 12 additions & 21 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,49 +1,40 @@
{
"name": "pipes",
"version": "0.0.1",
"name": "pipes-workspace",
"private": true,
"bin": {
"pipes": "src/cli.ts",
"pipesd": "src/server.ts"
},
"workspaces": [
"packages/*"
],
"type": "module",
"exports": {
"./config": "./src/config.ts"
},
"scripts": {
"reset": "bun scripts/reset.ts",
"dev": "bun --watch src/dev.ts",
"dev": "bun --watch packages/pipes/src/dev.ts",
"build": "bun scripts/build.ts",
"changeset": "changeset",
"version-packages": "changeset version",
"pipes": "bun src/cli.ts",
"pipesd": "bun src/server.ts",
"pipes": "bun packages/pipes/src/cli.ts",
"pipesd": "bun packages/pipes/src/server.ts",
"test": "bun test",
"check": "vp check && tsc --noEmit && bun test",
"typecheck": "tsc --noEmit",
"lint": "vp lint",
"fmt": "vp fmt",
"postinstall": "effect-tsgo patch"
},
"dependencies": {
"devDependencies": {
"@agentclientprotocol/codex-acp": "1.10.0",
"@agentclientprotocol/sdk": "1.4.0",
"@effect/platform-bun": "4.0.0-rc.112",
"@effect/sql-sqlite-bun": "4.0.0-rc.112",
"@opentui/core": "0.5.11",
"@opentui/react": "0.5.11",
"effect": "4.0.0-rc.112",
"react": "19.2.4"
},
"devDependencies": {
"@changesets/cli": "^3.0.2",
"@effect/platform-bun": "4.0.0-rc.112",
"@effect/tsgo": "0.43.0",
"@nkzw/oxlint-config": "2.0.1",
"@openai/codex": "0.153.4",
"@opentui/core-darwin-x64": "0.5.11",
"@opentui/core-linux-arm64": "0.5.11",
"@opentui/core-linux-x64": "0.5.11",
"@pipes/protocol": "workspace:*",
"@types/bun": "latest",
"@types/react": "latest",
"effect": "4.0.0-rc.112",
"oxlint": "1.81.0",
"typescript": "7.0.2",
"vite-plus": "0.3.1"
Expand Down
Loading
Loading