@arach/lattices 0.2.1 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +144 -69
- package/apps/mac/Info.plist +43 -0
- package/apps/mac/Lattices.app/Contents/Info.plist +43 -0
- package/apps/mac/Lattices.app/Contents/MacOS/Lattices +0 -0
- package/apps/mac/Lattices.app/Contents/Resources/AppIcon.icns +0 -0
- package/apps/mac/Lattices.app/Contents/Resources/docs/assistant-knowledge.md +130 -0
- package/apps/mac/Lattices.app/Contents/Resources/tap.wav +0 -0
- package/apps/mac/Lattices.app/Contents/_CodeSignature/CodeResources +150 -0
- package/apps/mac/Lattices.entitlements +21 -0
- package/apps/mac/Resources/Pets/assistant-spark/pet.json +62 -0
- package/apps/mac/Resources/Pets/assistant-spark/spritesheet.webp +0 -0
- package/apps/mac/Resources/Pets/scout-ranger/pet.json +6 -0
- package/apps/mac/Resources/Pets/scout-ranger/spritesheet.webp +0 -0
- package/apps/mac/Resources/tap.wav +0 -0
- package/assets/AppIcon.icns +0 -0
- package/bin/assistant-intelligence.ts +912 -0
- package/bin/cli/capture.ts +252 -0
- package/bin/cli/daemon.ts +22 -0
- package/bin/cli/helpers.ts +105 -0
- package/bin/cli/layer.ts +178 -0
- package/bin/cli/runs.ts +43 -0
- package/bin/cli/search.ts +141 -0
- package/bin/cli/session.ts +32 -0
- package/bin/client.ts +17 -0
- package/bin/cua.ts +26 -0
- package/bin/{daemon-client.js → daemon-client.ts} +49 -30
- package/bin/handsoff-infer.ts +96 -0
- package/bin/handsoff-worker.ts +531 -0
- package/bin/infer.ts +424 -0
- package/bin/keychain.ts +75 -0
- package/bin/lattices-app.ts +655 -0
- package/bin/lattices-build +125 -0
- package/bin/lattices-build-env.ts +77 -0
- package/bin/lattices-dev +362 -0
- package/bin/lattices.ts +3260 -0
- package/bin/project-twin.ts +645 -0
- package/docs/agent-execution-plan.md +562 -0
- package/docs/agent-layer-guide.md +207 -0
- package/docs/agents.md +233 -0
- package/docs/ai-chat-ux-review.md +416 -0
- package/docs/api.md +1041 -47
- package/docs/app.md +96 -13
- package/docs/assistant-knowledge.md +130 -0
- package/docs/companion-deck.md +209 -0
- package/docs/component-extraction-roadmap.md +392 -0
- package/docs/concepts.md +13 -12
- package/docs/config.md +83 -10
- package/docs/gesture-customization-proposal.md +520 -0
- package/docs/handsoff-test-scenarios.md +84 -0
- package/docs/hyperspace-grid-snappiness.md +210 -0
- package/docs/layers.md +176 -28
- package/docs/mouse-gestures.md +244 -0
- package/docs/ocr.md +21 -9
- package/docs/overview.md +42 -23
- package/docs/presentation-execution-review.md +491 -0
- package/docs/prompts/hands-off-system.md +382 -0
- package/docs/prompts/hands-off-turn.md +30 -0
- package/docs/prompts/voice-advisor.md +31 -0
- package/docs/prompts/voice-fallback.md +23 -0
- package/docs/proposals/LAT-001-gesture-visual-customization.md +522 -0
- package/docs/proposals/LAT-002-shared-overlay-canvas.md +353 -0
- package/docs/proposals/LAT-003-menu-bar-controller-architecture.md +291 -0
- package/docs/proposals/LAT-004-interactive-overlay-actors.md +534 -0
- package/docs/proposals/LAT-005-action-runtime-product-spine.md +914 -0
- package/docs/proposals/LAT-006-followup-gaps.md +103 -0
- package/docs/proposals/LAT-006-runs-and-capture-in-lattices.md +566 -0
- package/docs/proposals/LAT-007-unified-app-shell.md +128 -0
- package/docs/quickstart.md +8 -12
- package/docs/reference/dewey.config.ts +74 -0
- package/docs/reference/install-agent.md +79 -0
- package/docs/release.md +172 -0
- package/docs/repo-structure.md +100 -0
- package/docs/terminal-kit.md +87 -0
- package/docs/tiling-reference.md +224 -0
- package/docs/twins.md +138 -0
- package/docs/voice-command-protocol.md +278 -0
- package/docs/voice-error-model.md +73 -0
- package/docs/voice.md +221 -0
- package/package.json +69 -16
- package/packages/npm/sdk/cua.d.mts +1 -0
- package/packages/npm/sdk/cua.d.ts +188 -0
- package/packages/npm/sdk/cua.mjs +376 -0
- package/app/Lattices.app/Contents/Info.plist +0 -24
- package/app/Package.swift +0 -13
- package/app/Sources/ActionRow.swift +0 -61
- package/app/Sources/App.swift +0 -10
- package/app/Sources/AppDelegate.swift +0 -234
- package/app/Sources/AppShellView.swift +0 -62
- package/app/Sources/AppTypeClassifier.swift +0 -70
- package/app/Sources/AppWindowShell.swift +0 -63
- package/app/Sources/CheatSheetHUD.swift +0 -332
- package/app/Sources/CommandModeState.swift +0 -1362
- package/app/Sources/CommandModeView.swift +0 -1405
- package/app/Sources/CommandModeWindow.swift +0 -192
- package/app/Sources/CommandPaletteView.swift +0 -307
- package/app/Sources/CommandPaletteWindow.swift +0 -134
- package/app/Sources/DaemonProtocol.swift +0 -101
- package/app/Sources/DaemonServer.swift +0 -414
- package/app/Sources/DesktopModel.swift +0 -121
- package/app/Sources/DesktopModelTypes.swift +0 -71
- package/app/Sources/DiagnosticLog.swift +0 -271
- package/app/Sources/EventBus.swift +0 -30
- package/app/Sources/HotkeyManager.swift +0 -250
- package/app/Sources/HotkeyStore.swift +0 -338
- package/app/Sources/InventoryManager.swift +0 -35
- package/app/Sources/InventoryPath.swift +0 -43
- package/app/Sources/KeyRecorderView.swift +0 -210
- package/app/Sources/LatticesApi.swift +0 -1125
- package/app/Sources/MainView.swift +0 -467
- package/app/Sources/MainWindow.swift +0 -83
- package/app/Sources/OcrModel.swift +0 -309
- package/app/Sources/OcrStore.swift +0 -295
- package/app/Sources/OmniSearchState.swift +0 -283
- package/app/Sources/OmniSearchView.swift +0 -288
- package/app/Sources/OmniSearchWindow.swift +0 -105
- package/app/Sources/OrphanRow.swift +0 -129
- package/app/Sources/PaletteCommand.swift +0 -419
- package/app/Sources/PermissionChecker.swift +0 -125
- package/app/Sources/Preferences.swift +0 -92
- package/app/Sources/ProcessModel.swift +0 -199
- package/app/Sources/ProcessQuery.swift +0 -151
- package/app/Sources/Project.swift +0 -28
- package/app/Sources/ProjectRow.swift +0 -368
- package/app/Sources/ProjectScanner.swift +0 -121
- package/app/Sources/ScreenMapState.swift +0 -2387
- package/app/Sources/ScreenMapView.swift +0 -2820
- package/app/Sources/ScreenMapWindowController.swift +0 -89
- package/app/Sources/SessionManager.swift +0 -72
- package/app/Sources/SettingsView.swift +0 -1053
- package/app/Sources/SettingsWindow.swift +0 -20
- package/app/Sources/TabGroupRow.swift +0 -178
- package/app/Sources/Terminal.swift +0 -259
- package/app/Sources/TerminalQuery.swift +0 -156
- package/app/Sources/TerminalSynthesizer.swift +0 -200
- package/app/Sources/Theme.swift +0 -163
- package/app/Sources/TilePickerView.swift +0 -209
- package/app/Sources/TmuxModel.swift +0 -53
- package/app/Sources/TmuxQuery.swift +0 -81
- package/app/Sources/WindowTiler.swift +0 -1755
- package/app/Sources/WorkspaceManager.swift +0 -434
- package/bin/lattices-app.js +0 -221
- package/bin/lattices.js +0 -1418
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Mouse Gestures
|
|
3
|
+
description: Hold a mouse button, draw a shape or direction, release — runs matched actions like a window manager power-user shortcut system.
|
|
4
|
+
order: 4.2
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Mouse Gestures
|
|
8
|
+
|
|
9
|
+
## Concept
|
|
10
|
+
|
|
11
|
+
Mouse gestures are a user-level shortcut system for the macOS app. Hold a
|
|
12
|
+
configured mouse button, draw a direction or shape, then release to run the
|
|
13
|
+
matched action.
|
|
14
|
+
|
|
15
|
+
The app code owns the recognizer, action dispatcher, and JSON schema. The
|
|
16
|
+
gesture mappings are data, so agents can define or change hotkeys without
|
|
17
|
+
adding a named action in Swift. Your actual gesture mappings live in:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
~/.lattices/mouse-shortcuts.json
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
That file is machine-local preference data. It is not project config, and it
|
|
24
|
+
should not be committed to this repository unless you are intentionally adding
|
|
25
|
+
an example fixture or changing the schema.
|
|
26
|
+
|
|
27
|
+
## Config Ownership
|
|
28
|
+
|
|
29
|
+
There are two layers:
|
|
30
|
+
|
|
31
|
+
- **Code defaults** in `MouseGestureConfig.swift` provide a minimal starter
|
|
32
|
+
config when no user file exists.
|
|
33
|
+
- **User rules** in `~/.lattices/mouse-shortcuts.json` are the source of truth
|
|
34
|
+
after the file has been created.
|
|
35
|
+
|
|
36
|
+
Do not add personal shortcuts by changing `MouseGestureConfig.swift`. Add them
|
|
37
|
+
to the user JSON file instead. The Settings UI can open that file from
|
|
38
|
+
**Settings -> Shortcuts -> Mouse Gestures -> Configure...**.
|
|
39
|
+
|
|
40
|
+
Agents should usually write these rules through the daemon:
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
await daemonCall('mouse.shortcuts.upsert', { rule })
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The daemon persists the rule, snapshots the old config, and refreshes the
|
|
47
|
+
running app immediately. If a tool edits `~/.lattices/mouse-shortcuts.json`
|
|
48
|
+
directly, call `mouse.shortcuts.reload` afterward; no app restart is required.
|
|
49
|
+
|
|
50
|
+
## Lightweight History
|
|
51
|
+
|
|
52
|
+
Lattices keeps local snapshots of your mouse shortcut config before risky
|
|
53
|
+
changes:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
~/.lattices/mouse-shortcuts.history/
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Snapshots are written before external edits are reloaded and before Settings
|
|
60
|
+
restores defaults or restores a previous snapshot. The newest 40 snapshots are
|
|
61
|
+
kept. Use **History** in Settings to open the folder, or **Undo Last** to
|
|
62
|
+
restore the latest snapshot.
|
|
63
|
+
|
|
64
|
+
## Button Names
|
|
65
|
+
|
|
66
|
+
The config accepts these common button names:
|
|
67
|
+
|
|
68
|
+
| Config value | Meaning |
|
|
69
|
+
|---|---|
|
|
70
|
+
| `middle` | Middle button / wheel click |
|
|
71
|
+
| `back` | Back side button, often mouse button 4 |
|
|
72
|
+
| `forward` | Forward side button, often mouse button 5 |
|
|
73
|
+
| `right` | Right mouse button |
|
|
74
|
+
| `buttonN` | Explicit numbered button fallback |
|
|
75
|
+
|
|
76
|
+
Normal clicks pass through when a configured button is only being watched for
|
|
77
|
+
drag or shape gestures. Once movement crosses the gesture threshold and matches
|
|
78
|
+
a real gesture, Lattices claims the interaction.
|
|
79
|
+
|
|
80
|
+
Browser frontmost apps are bypassed so native middle-click, Back, and Forward
|
|
81
|
+
button behavior stays intact. This avoids half-claimed side-button gestures
|
|
82
|
+
accidentally navigating while you are drawing a shape.
|
|
83
|
+
|
|
84
|
+
## Trigger Kinds
|
|
85
|
+
|
|
86
|
+
Rules match one of three trigger kinds:
|
|
87
|
+
|
|
88
|
+
| Kind | Required fields | Example |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `click` | `button` | Middle click sends paste |
|
|
91
|
+
| `drag` | `button`, `direction` | Middle drag left switches Space |
|
|
92
|
+
| `shape` | `button`, `shape` | Back-button L shape activates iTerm |
|
|
93
|
+
|
|
94
|
+
Directions are `up`, `down`, `left`, and `right`.
|
|
95
|
+
|
|
96
|
+
Useful shapes include:
|
|
97
|
+
|
|
98
|
+
| Shape | Motion |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `l-shape-down-right` | Down, then right |
|
|
101
|
+
| `l-shape-down-left` | Down, then left |
|
|
102
|
+
| `l-shape-up-right` | Up, then right |
|
|
103
|
+
| `l-shape-up-left` | Up, then left |
|
|
104
|
+
| `reverse-l-right-down` | Right, then down |
|
|
105
|
+
| `reverse-l-left-down` | Left, then down |
|
|
106
|
+
| `v-shape` | Down, then up |
|
|
107
|
+
| `reverse-v` | Up, then down |
|
|
108
|
+
| `circle` | A loose closed loop |
|
|
109
|
+
|
|
110
|
+
The circle recognizer is intentionally generous: it looks for broad circular
|
|
111
|
+
motion, a reasonably closed path, and enough turn coverage rather than a
|
|
112
|
+
geometrically perfect circle.
|
|
113
|
+
|
|
114
|
+
## Default: Dictation Gesture
|
|
115
|
+
|
|
116
|
+
New default configs use a plain shortcut action for dictation. The middle-button
|
|
117
|
+
up gesture sends the Lattices voice command hotkey, currently Hyper+D:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"id": "dictation",
|
|
122
|
+
"enabled": true,
|
|
123
|
+
"device": "any",
|
|
124
|
+
"trigger": {
|
|
125
|
+
"button": "middle",
|
|
126
|
+
"kind": "drag",
|
|
127
|
+
"direction": "up"
|
|
128
|
+
},
|
|
129
|
+
"action": {
|
|
130
|
+
"type": "shortcut.send",
|
|
131
|
+
"shortcut": {
|
|
132
|
+
"key": "d",
|
|
133
|
+
"keyCode": 2,
|
|
134
|
+
"modifiers": ["control", "option", "shift", "command"]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Default: Screenshot Area Gesture
|
|
141
|
+
|
|
142
|
+
New default configs include a back-button circle gesture for the macOS
|
|
143
|
+
screenshot area picker (`Command` + `Shift` + `4`):
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"id": "back-circle-screenshot-area",
|
|
148
|
+
"enabled": true,
|
|
149
|
+
"device": "any",
|
|
150
|
+
"trigger": {
|
|
151
|
+
"button": "back",
|
|
152
|
+
"kind": "shape",
|
|
153
|
+
"shape": "circle"
|
|
154
|
+
},
|
|
155
|
+
"action": {
|
|
156
|
+
"type": "shortcut.send",
|
|
157
|
+
"shortcut": {
|
|
158
|
+
"key": "4",
|
|
159
|
+
"keyCode": 21,
|
|
160
|
+
"modifiers": ["command", "shift"]
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"visual": {
|
|
164
|
+
"renderer": "matrix",
|
|
165
|
+
"theme": "lattices"
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
## Actions
|
|
171
|
+
|
|
172
|
+
Supported action types include:
|
|
173
|
+
|
|
174
|
+
| Type | Purpose |
|
|
175
|
+
|---|---|
|
|
176
|
+
| `space.previous` | Switch to the previous macOS Space |
|
|
177
|
+
| `space.next` | Switch to the next macOS Space |
|
|
178
|
+
| `screenmap.toggle` | Open the Screen Map overview |
|
|
179
|
+
| `dictation.start` | Legacy compatibility alias that presses the configured Voice Command hotkey |
|
|
180
|
+
| `shortcut.send` | Send a keyboard shortcut |
|
|
181
|
+
| `app.activate` | Activate an app by name |
|
|
182
|
+
|
|
183
|
+
## Example: Enter Gesture
|
|
184
|
+
|
|
185
|
+
This is a user-level rule, not a code default. Add it to
|
|
186
|
+
`~/.lattices/mouse-shortcuts.json` if you want the back button plus a quick
|
|
187
|
+
down-then-left shape to press Enter:
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"id": "back-down-left-enter",
|
|
192
|
+
"enabled": true,
|
|
193
|
+
"device": "any",
|
|
194
|
+
"trigger": {
|
|
195
|
+
"button": "back",
|
|
196
|
+
"kind": "shape",
|
|
197
|
+
"shape": "l-shape-down-left"
|
|
198
|
+
},
|
|
199
|
+
"action": {
|
|
200
|
+
"type": "shortcut.send",
|
|
201
|
+
"shortcut": {
|
|
202
|
+
"key": "enter",
|
|
203
|
+
"keyCode": 36,
|
|
204
|
+
"modifiers": []
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Visuals
|
|
211
|
+
|
|
212
|
+
Rules may include an optional `visual` block for feedback. Visuals are
|
|
213
|
+
decorative: they must never decide whether a gesture matches or whether an
|
|
214
|
+
action runs. If a visual asset is missing or slow, the gesture should still
|
|
215
|
+
execute through the native action path.
|
|
216
|
+
|
|
217
|
+
Shape gestures can opt into native matrix completion feedback with
|
|
218
|
+
`"visual": { "renderer": "matrix" }`. When enabled, Lattices smooths the
|
|
219
|
+
captured path, replays it briefly inside a small 3x3 rounded-cell matrix, then
|
|
220
|
+
snaps into a compact confirmation glyph and action label. This is feedback
|
|
221
|
+
only; the matched rule has already dispatched.
|
|
222
|
+
|
|
223
|
+
## Implementation
|
|
224
|
+
|
|
225
|
+
- `apps/mac/Sources/Core/Input/MouseGestureController.swift` owns the CGEvent
|
|
226
|
+
tap, gesture session state, passthrough behavior, and action dispatch.
|
|
227
|
+
- `apps/mac/Sources/Core/Input/MouseGestureConfig.swift` defines the Codable
|
|
228
|
+
schema and initial fallback defaults.
|
|
229
|
+
- `apps/mac/Sources/Core/Input/MouseShortcutStore.swift` loads the user-level
|
|
230
|
+
JSON file and provides thread-safe snapshots to the event tap.
|
|
231
|
+
- `apps/mac/Sources/Core/Input/ShapeRecognizer.swift` converts raw gesture
|
|
232
|
+
paths into direction and shape labels.
|
|
233
|
+
|
|
234
|
+
## Safety
|
|
235
|
+
|
|
236
|
+
The controller installs a session-wide CGEvent tap. To avoid blocking the
|
|
237
|
+
system input pipeline:
|
|
238
|
+
|
|
239
|
+
- The tap callback does only cheap work and dispatches heavier work async.
|
|
240
|
+
- A circuit breaker handles OS tap timeout events and pauses gestures when
|
|
241
|
+
needed.
|
|
242
|
+
- Short, unmatched clicks are replayed or passed through so native app behavior
|
|
243
|
+
remains intact.
|
|
244
|
+
- The emergency reset chord clears stuck input capture state.
|
package/docs/ocr.md
CHANGED
|
@@ -59,22 +59,34 @@ contextual snippets.
|
|
|
59
59
|
### From the CLI
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
|
+
# Search windows by title, app, session, and OCR content
|
|
63
|
+
lattices search "error"
|
|
64
|
+
|
|
65
|
+
# Deep search — also inspects terminal tabs and processes
|
|
66
|
+
lattices search "myproject" --deep
|
|
67
|
+
|
|
68
|
+
# Same as --deep (all search sources)
|
|
69
|
+
lattices search "myproject" --all
|
|
70
|
+
|
|
71
|
+
# Search + focus + tile the top result
|
|
72
|
+
lattices place "myproject" left
|
|
73
|
+
|
|
62
74
|
# View current OCR snapshot
|
|
63
|
-
lattices
|
|
75
|
+
lattices scan
|
|
64
76
|
|
|
65
|
-
# Search OCR history
|
|
66
|
-
lattices
|
|
77
|
+
# Search OCR history directly (FTS5 syntax)
|
|
78
|
+
lattices scan search "error OR failed"
|
|
67
79
|
|
|
68
80
|
# Trigger an immediate deep scan
|
|
69
|
-
lattices
|
|
81
|
+
lattices scan deep
|
|
70
82
|
|
|
71
83
|
# View OCR history for a specific window ID
|
|
72
|
-
lattices
|
|
84
|
+
lattices scan history 12345
|
|
73
85
|
```
|
|
74
86
|
|
|
75
|
-
### From the
|
|
87
|
+
### From the agent API
|
|
76
88
|
|
|
77
|
-
Agents can query OCR data through four
|
|
89
|
+
Agents can query OCR data through four API methods:
|
|
78
90
|
|
|
79
91
|
| Method | Description |
|
|
80
92
|
|--------|-------------|
|
|
@@ -88,7 +100,7 @@ Agents can query OCR data through four daemon methods:
|
|
|
88
100
|
Returns the latest OCR results for all on-screen windows.
|
|
89
101
|
|
|
90
102
|
```js
|
|
91
|
-
import { daemonCall } from '@
|
|
103
|
+
import { daemonCall } from '@lattices/cli'
|
|
92
104
|
|
|
93
105
|
const snapshot = await daemonCall('ocr.snapshot')
|
|
94
106
|
// [{ wid, app, title, frame, fullText, blocks, timestamp }, ...]
|
|
@@ -158,7 +170,7 @@ Entries older than 3 days are automatically deleted.
|
|
|
158
170
|
A typical agent workflow: trigger a scan, then search for relevant content.
|
|
159
171
|
|
|
160
172
|
```js
|
|
161
|
-
import { daemonCall } from '@
|
|
173
|
+
import { daemonCall } from '@lattices/cli'
|
|
162
174
|
|
|
163
175
|
// Trigger a fresh scan
|
|
164
176
|
await daemonCall('ocr.scan')
|
package/docs/overview.md
CHANGED
|
@@ -4,9 +4,9 @@ description: What lattices is and who it's for
|
|
|
4
4
|
order: 0
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
lattices is
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
lattices is an agentic window manager for macOS. It provides a programmable
|
|
8
|
+
workspace, smart layout management, and managed tmux sessions — all
|
|
9
|
+
controllable from the CLI or a 35+-method agent API.
|
|
10
10
|
|
|
11
11
|
## The problem
|
|
12
12
|
|
|
@@ -20,60 +20,79 @@ to see what's on screen, arrange windows, or jump between projects.
|
|
|
20
20
|
|
|
21
21
|
## The solution
|
|
22
22
|
|
|
23
|
-
lattices
|
|
23
|
+
lattices addresses both sides with three layers:
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
### Programmable workspace
|
|
26
|
+
|
|
27
|
+
The CLI and agent API expose everything: query what's on screen, search
|
|
28
|
+
window text, tile layouts, manage sessions. Claude Code skills, MCP servers,
|
|
29
|
+
or your own scripts can drive your desktop the same way you do. Your
|
|
30
|
+
workspace becomes infrastructure you can observe and control programmatically.
|
|
31
|
+
|
|
32
|
+
### Smart layout manager
|
|
33
|
+
|
|
34
|
+
A native menu bar app tracks every window across all your monitors. Tile
|
|
35
|
+
with hotkeys, organize into switchable layers, snap to grids. It reads
|
|
36
|
+
your windows too — extracting text from UI elements every 60 seconds and
|
|
37
|
+
running Vision OCR on background windows every 2 hours. Everything is
|
|
38
|
+
searchable.
|
|
39
|
+
|
|
40
|
+
### Managed tmux sessions
|
|
41
|
+
|
|
42
|
+
We make tmux easy. Declare your dev environment in a `.lattices.json`:
|
|
43
|
+
which panes, which commands, what layout. lattices builds it, runs it,
|
|
44
|
+
and keeps it alive. Use your own terminal — sessions survive reboots
|
|
45
|
+
and you can reattach anytime.
|
|
31
46
|
|
|
32
47
|
## What's included
|
|
33
48
|
|
|
34
49
|
| Component | Description |
|
|
35
50
|
|-----------|-------------|
|
|
36
|
-
| **CLI** | The `lattices` command. Tile windows, manage sessions, control the workspace from your terminal |
|
|
37
|
-
| **Menu bar app** | Native macOS companion. Command palette, window tiling, project discovery |
|
|
38
|
-
| **
|
|
39
|
-
| **
|
|
51
|
+
| **CLI** | The `lattices` command. Tile windows, manage sessions, scan screen text, control the workspace from your terminal |
|
|
52
|
+
| **Menu bar app** | Native macOS companion. Command palette, window tiling, project discovery, screen text indexing |
|
|
53
|
+
| **Agent API** | WebSocket server on `ws://127.0.0.1:9399`. 35+ methods, 5 real-time events |
|
|
54
|
+
| **Screen scanner** | Reads text from visible windows using Accessibility API (60s) and Apple Vision OCR (2h), indexes with FTS5 |
|
|
40
55
|
| **Node.js client** | Zero-dependency `daemonCall()` helper for scripting |
|
|
41
56
|
|
|
42
57
|
## Example
|
|
43
58
|
|
|
44
59
|
```bash
|
|
45
|
-
cd ~/my-project && lattices
|
|
60
|
+
cd ~/my-project && lattices start
|
|
46
61
|
```
|
|
47
62
|
|
|
48
63
|
Agents get the same control programmatically:
|
|
49
64
|
|
|
50
65
|
```js
|
|
51
|
-
import { daemonCall } from '@
|
|
66
|
+
import { daemonCall } from '@lattices/cli'
|
|
52
67
|
await daemonCall('session.launch', { path: '/Users/you/dev/frontend' })
|
|
53
|
-
await daemonCall('window.
|
|
68
|
+
await daemonCall('window.place', {
|
|
69
|
+
session: 'frontend-a1b2c3',
|
|
70
|
+
placement: { kind: 'tile', value: 'left' }
|
|
71
|
+
})
|
|
54
72
|
```
|
|
55
73
|
|
|
56
74
|
## Who it's for
|
|
57
75
|
|
|
58
76
|
- Developers who juggle multiple projects and want faster window management
|
|
59
|
-
- People building AI agents that need to control the desktop
|
|
77
|
+
- People building AI agents that need to observe and control the desktop
|
|
60
78
|
- Power users who work across multiple macOS Spaces
|
|
61
|
-
-
|
|
79
|
+
- Anyone who wants persistent, auto-configured terminal sessions
|
|
62
80
|
|
|
63
81
|
## Requirements
|
|
64
82
|
|
|
65
|
-
- macOS
|
|
83
|
+
- macOS 26.0+
|
|
66
84
|
- Node.js 18+
|
|
67
85
|
|
|
68
86
|
### Dev dependencies
|
|
69
87
|
|
|
70
|
-
- Swift
|
|
88
|
+
- Swift 6.2 / Xcode 26+ — only to build the menu bar app from source
|
|
71
89
|
- tmux — needed for persistent terminal sessions (`brew install tmux`)
|
|
72
90
|
|
|
73
91
|
## Next steps
|
|
74
92
|
|
|
75
93
|
- [Quickstart](/docs/quickstart): install and run your first session in 2 minutes
|
|
76
94
|
- [Configuration](/docs/config): `.lattices.json` format and CLI commands
|
|
77
|
-
- [Screen
|
|
95
|
+
- [Screen scanning](/docs/ocr): AX text extraction, Vision OCR, and full-text search
|
|
78
96
|
- [Concepts](/docs/concepts): architecture, glossary, and how it all works
|
|
79
|
-
- [
|
|
97
|
+
- [Agent Guide](/docs/agents): canonical action contracts for voice, CLI, and daemon clients
|
|
98
|
+
- [Agent API](/docs/api): RPC method reference for agents and scripts
|