aboutsummaryrefslogtreecommitdiffstats
path: root/docs/architecture.md
blob: 4eea4ca99cc071304a37c754614b224f43e01af4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Architecture

```
                    ┌─────────────────────────────────────────┐
                    │              sl0ppij                    │
                    │  (forked zellij: multiplexer + server)   │
                    │                                          │
   pane frames  ───▶│  • per-pane status bar / buttons         │
   pane finder      │  • workspace hints (purpose=)            │
   layouts          │  • responsive + stacked-pane picker      │
                    └───────▲──────────────────────┬───────────┘
                            │  OSC 5577            │ pane stdin
                            │  (pane → mux)        │ (mux → pane)
                    ┌───────┴──────────────────────▼───────────┐
                    │                pi                        │
                    │   (agent process running inside a pane)   │
                    │   + pi-ext extensions (TypeScript)        │
                    └──────────────────────────────────────────┘
```

## The two halves

**sl0ppij** (`sl0ppij/`) is a fork of zellij. Everything it adds is in commits
prefixed `sl0p:`. The parts that matter for integration:

- **OSC 5577** — a private escape sequence a pane can emit to draw a status bar
  *in its own zellij frame*, including clickable buttons whose clicks are
  reported back on the pane's stdin. Spec: [`sl0ppij/sl0p/pane-status-bar.md`](../sl0ppij/sl0p/pane-status-bar.md).
- **Workspace hints** — panes and tabs carry a `purpose=` string so tooling can
  find "the agent pane" vs "the logs pane". Spec:
  [`sl0ppij/sl0p/workspace-hints-proposal.md`](../sl0ppij/sl0p/workspace-hints-proposal.md).
- **zj-pane-finder** — a fuzzy pane finder plugin (wasm), in-tree at
  `sl0ppij/sl0p/zj-pane-finder/`, deliberately its own cargo workspace so its
  size-optimised profile applies.

**sl0pstatus** (`sl0pstatus/`) is a fork of `zjstatus`, the status bar the
default layout uses in place of zellij's stock tab-bar + status-bar. It is a
separate wasm plugin built against the released `zellij-tile`, not part of the
sl0ppij workspace.

**pi-ext** (`pi-ext/`) is the other end of that protocol: TypeScript extensions
loaded by pi. Five of them speak OSC 5577 (`answer-picker`, `last-prompt`,
`sl0p-footer`, `slop-tool-boxes`, `user-prompt-frame`).

Neither half is much use without the other, which is the entire argument for
this monorepo: **the protocol is the product**, and it needs to be versioned and
shipped as one thing.

## What the repo holds

| path | role |
|---|---|
| `sl0ppij/` | the fork. Self-contained: rebases against upstream zellij happen here. |
| `sl0pstatus/` | forked `zjstatus` status bar (wasm plugin) the default layout depends on. |
| `pi-ext/` | pi extensions + `pir` CLI helper. |
| `config/` | the opinionated default environment (keybinds, layouts, themes). |
| `packaging/` | turn the above into a tarball someone else can install. |
| `docs/` | this. |
| `FORKS.md` | what upstream everything is based on. |
| `VERSION` | the single sl0ppi version. |

## Deliberate non-goals (for now)

- Not shipping a forked pi. pi is pinned and redistributed unmodified.
- Not supporting anything but `x86_64-unknown-linux-gnu`/`musl`.
- No CI. Releases are cut from a dev box until the rest works.