cli-jaw 2.17.61 → 2.17.62
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/README.ja.md +376 -339
- package/README.ko.md +338 -393
- package/README.md +163 -508
- package/README.zh-CN.md +365 -376
- package/dist/server.js +3 -0
- package/dist/server.js.map +1 -1
- package/dist/src/agent/pi-runtime.js +37 -18
- package/dist/src/agent/pi-runtime.js.map +1 -1
- package/dist/src/agent/runtime/acp/permissions.js +2 -3
- package/dist/src/agent/runtime/acp/permissions.js.map +1 -1
- package/dist/src/agent/runtime/pi-turn.js +7 -0
- package/dist/src/agent/runtime/pi-turn.js.map +1 -1
- package/dist/src/agent/spawn/line-buffer.js +84 -13
- package/dist/src/agent/spawn/line-buffer.js.map +1 -1
- package/dist/src/agent/spawn.js +26 -15
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/code-mode/host.js +34 -5
- package/dist/src/code-mode/host.js.map +1 -1
- package/dist/src/code-mode/manager.js +24 -7
- package/dist/src/code-mode/manager.js.map +1 -1
- package/dist/src/code-mode/providers/provider-live-models.js +3 -1
- package/dist/src/code-mode/providers/provider-live-models.js.map +1 -1
- package/dist/src/code-mode/store.js +31 -6
- package/dist/src/code-mode/store.js.map +1 -1
- package/dist/src/core/config.js +119 -17
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/runtime-settings.js +7 -1
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-merge.js +9 -0
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/core/settings-watch.js +19 -1
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/discord/bot.js +6 -4
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/send-only-client.js +37 -3
- package/dist/src/discord/send-only-client.js.map +1 -1
- package/dist/src/manager/memory/embedding/sync.js +6 -0
- package/dist/src/manager/memory/embedding/sync.js.map +1 -1
- package/dist/src/manager/routes/dashboard-memory.js +20 -7
- package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
- package/dist/src/manager/server.js +8 -0
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/shutdown.js +29 -3
- package/dist/src/manager/shutdown.js.map +1 -1
- package/dist/src/manager/worker-events.js +70 -8
- package/dist/src/manager/worker-events.js.map +1 -1
- package/dist/src/routes/code-native.js +23 -3
- package/dist/src/routes/code-native.js.map +1 -1
- package/dist/src/routes/events.js +4 -0
- package/dist/src/routes/events.js.map +1 -1
- package/dist/src/routes/settings.js +45 -1
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/sse-connections.js +31 -0
- package/dist/src/routes/sse-connections.js.map +1 -0
- package/dist/src/shared/permissions.js +47 -0
- package/dist/src/shared/permissions.js.map +1 -0
- package/package.json +1 -1
- package/public/dist/.vite/manifest.json +31 -31
- package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +1 -0
- package/public/dist/assets/Agent-DnbZJP7b.js +1 -0
- package/public/dist/assets/{ChannelEnablementControl-B2tq8Ji4.js → ChannelEnablementControl-Dl0uYx38.js} +5 -5
- package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +1 -0
- package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +1 -0
- package/public/dist/assets/{ChannelsSlack-B9FV0ftr.js → ChannelsSlack-BryC2Ahr.js} +1 -1
- package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +1 -0
- package/public/dist/assets/CodeCanvas-DpkFi5Au.js +2 -0
- package/public/dist/assets/Permissions-BwiMEoTV.js +1 -0
- package/public/dist/assets/Permissions-CodIW-Yd.js +1 -0
- package/public/dist/assets/{manager-C5cU1joU.js → manager-Bi_xw7TW.js} +2 -2
- package/public/dist/assets/{settings-CA2LQDGh.js → settings-W4KG9ivu.js} +1 -1
- package/public/dist/assets/{settings-embedding-oGvFayh-.js → settings-embedding-BfWzWKMM.js} +1 -1
- package/public/dist/manager/index.html +1 -1
- package/public/dist/settings/index.html +1 -1
- package/public/js/features/settings-discord.ts +39 -5
- package/public/js/features/settings-telegram.ts +38 -4
- package/public/js/features/settings-types.ts +2 -0
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/App.tsx +4 -1
- package/public/manager/src/code/code-controller-runtime.ts +13 -6
- package/public/manager/src/code/code-session-client.ts +1 -1
- package/public/manager/src/code/session-order.ts +6 -7
- package/public/manager/src/dashboard-url-state.ts +8 -0
- package/public/manager/src/settings/pages/AdvancedExport.tsx +2 -0
- package/public/manager/src/settings/pages/Agent.tsx +13 -5
- package/public/manager/src/settings/pages/ChannelsDiscord.tsx +27 -4
- package/public/manager/src/settings/pages/ChannelsTelegram.tsx +26 -4
- package/public/manager/src/settings/pages/Permissions.tsx +50 -27
- package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +4 -3
- package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +10 -2
- package/public/dist/assets/AdvancedExport-BNMjYkw6.js +0 -1
- package/public/dist/assets/Agent-D4g8TPjm.js +0 -1
- package/public/dist/assets/ChannelSetupEntry-zKYImWXx.js +0 -1
- package/public/dist/assets/ChannelsDiscord-CWRKV-Zl.js +0 -1
- package/public/dist/assets/ChannelsTelegram-BdK-fTPI.js +0 -1
- package/public/dist/assets/CodeCanvas-D5jp8-t5.js +0 -2
- package/public/dist/assets/Permissions-Bh947tUG.js +0 -1
- package/public/dist/assets/Permissions-DzNJCt8K.js +0 -1
package/README.md
CHANGED
|
@@ -1,21 +1,80 @@
|
|
|
1
|
-
<
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/assets/readme/banner.jpg" alt="CLI-JAW — your personal AI agent. Every AI CLI, one dashboard." width="100%">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<p align="center"><b>One assistant, one memory, one dashboard for the AI coding CLIs you already pay for.</b><br>
|
|
6
|
+
Claude, Codex, Cursor, Grok, Copilot, OpenCode, Kiro, Antigravity and Pi — working together as a team.</p>
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://npmjs.com/package/cli-jaw"><img src="https://img.shields.io/npm/v/cli-jaw?color=cb3837&label=npm&logo=npm" alt="npm version"></a>
|
|
10
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/github/v/release/lidge-jun/cli-jaw?label=release" alt="latest release"></a>
|
|
11
|
+
<img src="https://img.shields.io/badge/node-%3E%3D22.4-339933?logo=node.js&logoColor=white" alt="Node.js 22.4+">
|
|
12
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license"></a>
|
|
13
|
+
</p>
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
15
|
+
```bash
|
|
16
|
+
# existing users who want minimal changes: JAW_SAFE=1 npm install -g cli-jaw
|
|
17
|
+
npm install -g cli-jaw
|
|
18
|
+
jaw dashboard
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
<p align="center">
|
|
22
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/badge/macOS-.dmg-24292f?logo=apple&logoColor=white" alt="Download for macOS (.dmg)"></a>
|
|
23
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/badge/Windows-.exe-24292f?logo=windows&logoColor=white" alt="Download for Windows (.exe)"></a>
|
|
24
|
+
<a href="https://github.com/lidge-jun/cli-jaw/releases/latest"><img src="https://img.shields.io/badge/Linux-.AppImage-24292f?logo=linux&logoColor=white" alt="Download for Linux (.AppImage)"></a>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
<table>
|
|
28
|
+
<tr>
|
|
29
|
+
<td width="50%" valign="middle">
|
|
30
|
+
|
|
31
|
+
### Every agent in one place
|
|
32
|
+
|
|
33
|
+
Start, stop and preview every running instance from the manager dashboard.
|
|
34
|
+
|
|
35
|
+
</td>
|
|
36
|
+
<td width="50%"><img src="docs/screenshots/manager-dashboard-light.png" alt="CLI-JAW manager dashboard" width="100%"></td>
|
|
37
|
+
</tr>
|
|
38
|
+
<tr>
|
|
39
|
+
<td width="50%" valign="middle">
|
|
40
|
+
|
|
41
|
+
### A board for the work
|
|
42
|
+
|
|
43
|
+
Kanban lanes, a priority matrix and reminders track what each session is doing.
|
|
44
|
+
|
|
45
|
+
</td>
|
|
46
|
+
<td width="50%"><img src="docs/screenshots/dashboard-kanban.png" alt="Kanban board of agent sessions" width="100%"></td>
|
|
47
|
+
</tr>
|
|
48
|
+
<tr>
|
|
49
|
+
<td width="50%" valign="middle">
|
|
50
|
+
|
|
51
|
+
### Notes that agents can read
|
|
52
|
+
|
|
53
|
+
A built-in Markdown workspace with WYSIWYG editing, math and Mermaid diagrams.
|
|
13
54
|
|
|
14
|
-
|
|
55
|
+
</td>
|
|
56
|
+
<td width="50%"><img src="docs/screenshots/notes-wysiwyg.png" alt="Notes editor" width="100%"></td>
|
|
57
|
+
</tr>
|
|
58
|
+
</table>
|
|
15
59
|
|
|
16
|
-
|
|
60
|
+
<p align="center">
|
|
61
|
+
<b>English</b> · <a href="README.ko.md">한국어</a> · <a href="README.zh-CN.md">中文</a> · <a href="README.ja.md">日本語</a> · 📖 <a href="https://lidge-jun.github.io/cli-jaw/"><b>Website</b></a> · <a href="https://lidge-jun.github.io/cli-jaw/dev/">Docs</a>
|
|
62
|
+
</p>
|
|
17
63
|
|
|
18
|
-
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## What is CLI-JAW?
|
|
67
|
+
|
|
68
|
+
CLI-JAW unifies the AI coding CLIs you already use into **one assistant with one memory and one dashboard**. Your main CLI (the "Boss") calls the others as "employees", so you stop copy-pasting between apps and give orders from a single place.
|
|
69
|
+
|
|
70
|
+
- **No API keys needed** — routes through subscriptions you already pay for
|
|
71
|
+
- **No per-token billing** — flat monthly cost, same as what you already have
|
|
72
|
+
- **Runs locally** — your code never leaves your machine
|
|
73
|
+
- **Reach it anywhere** — Web, desktop app, terminal, Telegram, Discord or Slack
|
|
74
|
+
|
|
75
|
+
The native Code API (`/api/code`) provides isolated Codex, Claude, Cursor, and Grok sessions with durable transcripts and native resume. See [native Code sessions](structure/runtime-integration.md#native-code-sessions).
|
|
76
|
+
|
|
77
|
+
---
|
|
19
78
|
|
|
20
79
|
## Install
|
|
21
80
|
|
|
@@ -76,7 +135,8 @@ jaw dashboard
|
|
|
76
135
|
> npm install -g cli-jaw --allow-scripts=cli-jaw
|
|
77
136
|
> ```
|
|
78
137
|
|
|
79
|
-
|
|
138
|
+
<details>
|
|
139
|
+
<summary><b>Windows npm install recovery</b> — npm 12+ blocked scripts or PowerShell execution policy</summary>
|
|
80
140
|
|
|
81
141
|
npm 12+ may finish a global install while blocking CLI-JAW's dependency
|
|
82
142
|
`postinstall`. Approve only this package and reinstall, or save the approval for
|
|
@@ -103,27 +163,13 @@ node "$(npm prefix -g)\node_modules\cli-jaw\dist\bin\cli-jaw.js" doctor
|
|
|
103
163
|
leftover npm staging directories, and the current PowerShell policy; it also
|
|
104
164
|
prints the matching recovery guidance.
|
|
105
165
|
|
|
166
|
+
</details>
|
|
167
|
+
|
|
106
168
|
That's it. Open **http://localhost:24576** for the manager dashboard. Per-instance agent Web UIs still run from **http://localhost:3457** when you start `jaw serve`. Requires [Node.js 22.4+](https://nodejs.org).
|
|
107
169
|
|
|
108
170
|
> **First time?** The default npm install initializes CLI-JAW and attempts native Claude setup. Other AI CLIs are optional; install them all during npm setup with `CLI_JAW_INSTALL_CLI_TOOLS=1 npm install -g cli-jaw` on macOS/Linux. On Windows, use the WSL install path below.
|
|
109
171
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
Jawcode SDK, ACP child, TUI bundles and installer integration have been removed.
|
|
113
|
-
Use Code for native Codex, Claude, Cursor or Grok sessions. A saved `jwc` runtime
|
|
114
|
-
selection remains visible as retired and cannot execute; choose an available
|
|
115
|
-
runtime explicitly. Existing external installations and saved user files are
|
|
116
|
-
left intact. `jaw jwc` reports retirement and performs no installation or cleanup.
|
|
117
|
-
|
|
118
|
-
### Retired Claude E and AI-E runtimes
|
|
119
|
-
|
|
120
|
-
The Claude E helper (`claude-e`, including `native/claude-e`, compatibility
|
|
121
|
-
`claude-exec`, and legacy `jaw-claude-i`) and the AI-E multiplexer (`ai-e`,
|
|
122
|
-
`@bitkyc08/ai-e`) have been removed. Use `claude` for Claude Code. A saved
|
|
123
|
-
`claude-e` or `ai-e` runtime selection remains visible as retired and cannot
|
|
124
|
-
execute; choose an available runtime explicitly. Existing settings, session
|
|
125
|
-
buckets and user files are left intact. Execution reports
|
|
126
|
-
`retired_runtime:claude-e` or `retired_runtime:ai-e` before fallback.
|
|
172
|
+
> **Retired runtimes.** Claude E (`claude-e`) and the AI-E multiplexer (`ai-e`) have been removed. A saved selection stays visible as retired and cannot execute; choose an available runtime. Details: [runtime integration](structure/runtime-integration.md).
|
|
127
173
|
|
|
128
174
|
<details>
|
|
129
175
|
<summary><b>macOS one-click</b> — don't have Node.js? This installs everything</summary>
|
|
@@ -341,24 +387,6 @@ docker compose up -d # → http://localhost:3457
|
|
|
341
387
|
|
|
342
388
|
---
|
|
343
389
|
|
|
344
|
-
## What is CLI-JAW?
|
|
345
|
-
|
|
346
|
-
CLI-JAW is an open-source platform that unifies the AI coding CLIs you already use — Pi, Claude, Antigravity, Codex, Codex App, Cursor, Grok, Kiro, OpenCode, and Copilot — into **one assistant with one memory and one dashboard**.
|
|
347
|
-
|
|
348
|
-
Your main CLI (the “Boss”) calls the others as “employees.” You stop copy-pasting between apps and start giving orders from a single place.
|
|
349
|
-
|
|
350
|
-
- **No API keys needed** — routes through subscriptions you already pay for
|
|
351
|
-
- **No per-token billing** — flat monthly cost, same as what you already have
|
|
352
|
-
- **Runs locally** — your code never leaves your machine
|
|
353
|
-
|
|
354
|
-
<div align="center">
|
|
355
|
-
|
|
356
|
-

|
|
357
|
-
|
|
358
|
-
</div>
|
|
359
|
-
|
|
360
|
-
---
|
|
361
|
-
|
|
362
390
|
## Authenticate
|
|
363
391
|
|
|
364
392
|
You only need **one**. Pick whichever subscription you already have:
|
|
@@ -401,308 +429,56 @@ Check everything at once: `jaw doctor`
|
|
|
401
429
|
|
|
402
430
|
---
|
|
403
431
|
|
|
404
|
-
##
|
|
405
|
-
|
|
406
|
-
The dashboard is your command center. `jaw dashboard` starts the manager at `http://localhost:24576`; individual agent Web UIs are served by `jaw serve` from `http://localhost:3457` and nearby managed ports.
|
|
407
|
-
Live Web/TUI updates use the SSE-first `GET /api/events` channel, with legacy WebSocket fallback only for older servers where SSE never opens.
|
|
408
|
-
|
|
409
|
-
Interactive `jaw chat` defaults to collapsed Activity with a separate final answer.
|
|
410
|
-
Fullscreen: Ctrl+O toggles details; F6 opens read-only history; Enter expands a
|
|
411
|
-
journal record; A shows the exact saved answer. Appearance → Presentation switches
|
|
412
|
-
to Legacy without changing runtime or permission settings. History selection does
|
|
413
|
-
not change the server-active chat targeted by message/Stop. `--simple` and piped
|
|
414
|
-
`--raw` retain their existing behavior. See [TUI controls](structure/commands.md).
|
|
415
|
-
|
|
416
|
-
Codex app-server and Pi RPC also record versioned, redacted runtime events independently of channel delivery. Native terminal handling keeps empty final answers distinct from live previews; final response selection remains independent of presentation. Slack adds a request-owned safe progress observer and explicit failure/delivery distinction; Telegram and Discord retain their existing flow. Classic uses this event stream for its bounded live Activity display.
|
|
417
|
-
|
|
418
|
-
Pi prepares capabilities asynchronously before dispatching a prompt and keeps that decision for the RPC instance. Failed or incomplete preparation cannot dispatch with guessed support. Worker cleanup tracks both RPC and version processes and retains temporary data when closure or directory ownership is uncertain; the older command-discovery step may still block briefly. See [runtime ownership](structure/runtime-integration.md#capability-preparation-and-execution-ownership).
|
|
419
|
-
|
|
420
|
-
Runtime history is persisted in a bounded Activity journal. Discovery uses `GET /api/traces/activity-runs?session=<id>`; replay uses `GET /api/traces/<runId>/activity?session=<id>` with `after`, fixed `through` and `limit` cursors. Owned public traces require the original chat session on raw reads too; Open trace captures that identity from the server. Internal worker records are not public replay. Missing or expired history is explicit and never replaces the final answer; historical decisions cannot be answered from replay. Existing ownerless raw traces retain their compatibility access policy.
|
|
421
|
-
|
|
422
|
-
Print-mode providers also record accepted text, reasoning and tool activity without changing their existing answer selection. Untagged text remains unclassified; the existing lifecycle supplies the application-final answer. Tool status/detail converges across live and saved views, and partially retained history keeps its omission notice. Activity recording failure does not add a retry or channel send. Classic live and retained Activity rendering is layered separately over this observer.
|
|
423
|
-
|
|
424
|
-
Display preferences use `presentation.mode`: `activity` is the default for fresh and upgraded settings without a choice; explicit `legacy` is preserved. Instance settings → Display provides the reversible choice, independently of runtime transport and permissions. Classic groups live tools and intermediate output in a collapsed Activity section while keeping the final answer separate. Open details stay open as updates arrive; limited or incomplete previews are labeled. Live approval/question controls remain available in either mode. Classic restores retained Activity on transcript rows; outside-transcript discovery remains available to the TUI, while the Classic disclosure is removed. Saved final answers come from MESSAGE, not the redacted journal; unavailable reads retain an explicit retry path. Raw Trace uses bounded earlier/later pages. Interactive TUI controls and saved-answer ownership are described above; integrated Electron QA remains a separate gate.
|
|
425
|
-
|
|
426
|
-
Workbench keeps Overview, Preview and Logs as modes. The header gear or Meta+, opens the full Instance settings page; Preview stays mounted and hidden so returning preserves its iframe. Back to workspace or Escape closes settings and returns to Overview. Shared navigation separates Instance and Manager scopes; Classic's header gear opens the same Instance pages. Unsaved changes are guarded when leaving settings, changing categories or changing instance, including keyboard and desktop shortcuts. Retained settings pages keep their own drafts. Activity has a one-row header, grouped tool rows and an Open in Trace footer. Classic's t3 shell supports dark/light themes, visible keyboard focus and reduced motion.
|
|
427
|
-
|
|
428
|
-
For frontend integrations, `ui.instanceSettingsOpen` is a Manager registry preference, separate from instance settings saves. The Vite `public/settings/index.html` entry builds to `public/dist/settings/index.html` and supplies the Classic settings iframe; `npm run build:frontend` includes it.
|
|
429
|
-
|
|
430
|
-
Cursor, Grok and Claude retain `print` compatibility mode. Their optional `perCli.<cli>.transport` setting is validated independently of display preferences; selecting an unimplemented native adapter gives an explicit error, never silently launches print. Existing settings without this field migrate to native once (`nativeTransportMigration`); post-stamp print is operator intent. Native/print session storage is isolated. `/api/cli-status` reports compiled native main/worker support separately from cached binary/authentication readiness.
|
|
431
|
-
|
|
432
|
-
Manager → Model defaults offers native as the default and print reversal for those three runtimes. Saving only the display mode and/or runtime transport through the settings API preserves a running turn; transport applies to the next run, while current completion retains its original session bucket. Combining the save with model, permissions or other execution settings keeps the existing invalidation behavior. Manual settings-file transport changes also retain their existing invalidation policy.
|
|
433
|
-
|
|
434
|
-
Permission selectors display **Auto (YOLO)** for the stored `auto` policy. Automatic approval, permission bypass and **Safe** support vary by runtime and transport; explicit questions may still require an answer. YOLO is a display label here, not an additional policy choice.
|
|
435
|
-
|
|
436
|
-
Auto also enables [full local Jaw API access](docs/slack-tools.md#full-local-api-access): qualified direct-local tools need no manually copied grant or operator token, including Slack history and native/worker callers. Full sends require an explicit destination. Safe/custom policies and forwarded/proxy callers retain their existing credential path. This is instance-wide local-operator authority; provider permissions, task scope and actual account capabilities remain separate.
|
|
437
|
-
|
|
438
|
-
Claude native uses the optional pinned Agent SDK: main turns reuse a sequential session, while each worker assignment owns a fresh query and instruction directory. Stop closes the query; the default mid-run steer policy uses kill/resume with interrupted context, while follow-up mode queues. Native supports Auto (YOLO) / Safe permissions, live approvals/questions, validated image input and foreground child activity. Deny/unknown profiles (including the output-only memory extractor) require print compatibility; background SDK tasks remain unavailable. An unavailable SDK fails the explicit native request without falling back to print.
|
|
439
|
-
|
|
440
|
-
Claude main steering waits for its own interrupted run, not a surviving worker in the same scope. Shutdown still includes workers. A completed answer is separate from physical cleanup; pending or failed cleanup remains tracked within the existing bounded waits.
|
|
441
|
-
|
|
442
|
-
Classic and its Manager/Electron chat surface share a live request panel. It answers only the selected live request's original execution IDs; stream outages retain a visible manual refresh path and never replay a response automatically. Image input is limited to four supported images, 5MiB each/10MiB total; existing staged-file references remain separate. Activity timeline/default/history rollout is independent of this decision surface.
|
|
443
|
-
|
|
444
|
-
Cursor main turns support the native ACP path with explicit `transport: "native"` and literal `permissions: "auto"`; restrictive native permissions and workers are rejected before prompt-file or session preparation. Model/effort use native advertised choices (Composer models may require unset effort). Canonical tool/commentary activity is separate from the full final answer; interrupted text remains available for steer salvage. Native I/O refreshes only its own collector through a private, text-free callback. Display defaults and owned history UI remain separate rollout layers.
|
|
445
|
-
|
|
446
|
-
Grok main also supports native ACP with literal auto permissions, existing CLI authentication and advertised model/effort values. Mid-run steering cancels and drains the original prompt before sending the replacement in the same native session, without Cursor's context reinjection. One logical turn produces one final answer. A replacement already in progress may send later input to the existing queue; Stop cancels pending inputs through the final enqueue decision, while fresh post-Stop input remains admissible. Transport or ownership failures fail the request without an automatic retry. Restrictive Grok policies and native workers remain unavailable.
|
|
447
|
-
|
|
448
|
-
Native Cursor redirects use **cancel-reprompt**, not in-band input: the original prompt's cancelled response and pending updates finish before the replacement is sent in the same native session. cli-jaw restores the original request, accepted redirects and bounded incomplete output as context while keeping current instructions active. `/steer` uses this path; another pending redirect may queue, but a failed or indeterminate dispatch is not automatically retried. `/queue steer <n>` retains its separate interrupt-and-run-now behavior.
|
|
449
|
-
|
|
450
|
-
Native decision APIs are available at `GET /api/runtime/requests?sessionId=...` and `POST /api/runtime/requests/:id`. They use the existing instance authentication policy, exact run/session/scope/turn matching and opaque choice handles. Decisions expire after two minutes; accepting a response records a choice, not tool completion. Provider activation and Activity approval controls remain separate follow-on layers; messaging behavior is unchanged.
|
|
451
|
-
|
|
452
|
-
### Instance Manager
|
|
453
|
-
|
|
454
|
-
See every running AI instance — start, stop, restart with one click. Preview live Web UIs directly in the dashboard.
|
|
455
|
-
|
|
456
|
-
Manager preview embeds the selected instance's regular Web UI. On long-running
|
|
457
|
-
homes with large chat databases, a fresh Chrome tab can briefly allocate more
|
|
458
|
-
memory while the preview loads its recent message window, renders markdown and
|
|
459
|
-
structured cards, and lets Chrome's garbage collector settle. If memory drops
|
|
460
|
-
back after a few minutes, treat it as a cold-load peak rather than a manager
|
|
461
|
-
server leak; the `jaw dashboard` manager process should stay much smaller than
|
|
462
|
-
the embedded browser renderer and the individual `jaw serve` worker processes.
|
|
463
|
-
|
|
464
|
-
<div align="center">
|
|
465
|
-
|
|
466
|
-

|
|
467
|
-
|
|
468
|
-
</div>
|
|
469
|
-
|
|
470
|
-
### Kanban Board
|
|
471
|
-
|
|
472
|
-
Drag instance cards into lanes (Backlog → Ready → In Progress → Review → Done). Track what each AI session is working on.
|
|
473
|
-
|
|
474
|
-
<div align="center">
|
|
475
|
-
|
|
476
|
-

|
|
477
|
-
|
|
478
|
-
</div>
|
|
479
|
-
|
|
480
|
-
### Priority Matrix
|
|
481
|
-
|
|
482
|
-
Eisenhower matrix for your tasks and reminders. Prioritize what matters.
|
|
483
|
-
|
|
484
|
-
<div align="center">
|
|
485
|
-
|
|
486
|
-

|
|
487
|
-
|
|
488
|
-
</div>
|
|
489
|
-
|
|
490
|
-
### Notes
|
|
491
|
-
|
|
492
|
-
A mini-Obsidian inside the dashboard. Folders, visual (WYSIWYG) + raw + split editing, KaTeX (math rendering), Mermaid (diagram-as-code), syntax-highlighted code blocks.
|
|
493
|
-
|
|
494
|
-
<div align="center">
|
|
495
|
-
|
|
496
|
-

|
|
497
|
-
|
|
498
|
-
</div>
|
|
499
|
-
|
|
500
|
-
### Agent Status
|
|
501
|
-
|
|
502
|
-
Monitor each AI engine's health and usage at a glance.
|
|
503
|
-
|
|
504
|
-
<div align="center">
|
|
505
|
-
|
|
506
|
-

|
|
507
|
-
|
|
508
|
-
</div>
|
|
509
|
-
|
|
510
|
-
### Desktop App
|
|
511
|
-
|
|
512
|
-
Prefer a native window to a browser tab? CLI-JAW ships an **Electron desktop shell** that boots the manager dashboard and supervises the underlying `jaw dashboard serve` process for you. Packaged desktop builds include a Node.js sidecar server, so the app can prefer its bundled `jaw` shim before falling back to a global terminal install.
|
|
513
|
-
|
|
514
|
-
The Manager sidebar separates instance selection from session and process actions, and remembers your preferred width when panels temporarily narrow the workspace. Its bottom terminal has named session tabs, keyboard navigation and light/dark/auto theme support. Hiding the panel keeps shells running; closing a terminal session ends that shell. Failed terminal startup offers explicit recovery without discarding existing sessions.
|
|
515
|
-
|
|
516
|
-
For end users, download the desktop artifact from **GitHub Releases**:
|
|
517
|
-
|
|
518
|
-
- **macOS**: download the DMG, drag CLI-JAW into Applications, then launch it. Releases produced by the current workflow are Developer ID signed, notarized and stapled, and so is the DMG itself.
|
|
519
|
-
- **Windows**: download the NSIS installer. It includes the same sidecar server and adds the packaged `jaw` shim to PATH. Windows artifacts are currently unsigned and may show SmartScreen.
|
|
520
|
-
- **Linux**: download the AppImage, make it executable, and run it.
|
|
521
|
-
|
|
522
|
-
After first launch, accept the **Install CLI command** prompt to create the terminal `jaw` command from the bundled sidecar. If you skip the prompt, use the tray menu item **Install CLI to Terminal** later. This path does not require a global npm install for the packaged app or terminal shim.
|
|
523
|
-
|
|
524
|
-
The installed macOS app checks its matching GitHub Release channel in the background and also exposes **CLI-JAW → Check for Updates…**. Preview builds select matching preview tags from the GitHub release feed; stable builds use GitHub's latest stable release. Each selected release carries its own `latest-mac.yml`. Download and restart/install both require explicit confirmation. An existing unsigned install cannot safely bootstrap into this trust chain, so install the first signed DMG manually once; subsequent signed releases can update in-app.
|
|
525
|
-
|
|
526
|
-
Developer build:
|
|
527
|
-
|
|
528
|
-
```bash
|
|
529
|
-
# one-time, from the repo root
|
|
530
|
-
npm install && npm --prefix electron install
|
|
531
|
-
|
|
532
|
-
npm run electron:dev # develop with hot reload
|
|
533
|
-
npm run electron:dist:mac # build macOS arm64 .dmg + .zip with bundled sidecar
|
|
534
|
-
```
|
|
535
|
-
|
|
536
|
-
For a local Developer ID build, configure your signing identity and the `APPLE_ID`, `APPLE_APP_SPECIFIC_PASSWORD` and `APPLE_TEAM_ID` notarization credentials, then run `npm run electron:dist:mac:signed`. This command notarizes and staples both the app and the DMG, and verifies the Developer ID authority, hardened runtime, timestamp, nested signature, Gatekeeper assessment, stapled tickets and update ZIP/DMG metadata and hashes. The ordinary `electron:dist:mac` command disables identity discovery and produces a plain ad-hoc local build, not a rehearsal of the signed path. The canonical GitHub Actions workflow fails closed unless its macOS app and DMG are signed by Team `U9ATA49N28`, notarized, stapled and update-metadata verified.
|
|
537
|
-
|
|
538
|
-
The packaged app lands in `electron/dist/`. The GitHub Actions desktop release workflow builds macOS arm64 DMG/ZIP, Windows x64 NSIS/ZIP, and Linux AppImage artifacts on release publish or manual dispatch. Native modules such as `better-sqlite3` stay in the manager/sidecar server — the Electron main process never imports them.
|
|
539
|
-
|
|
540
|
-
---
|
|
541
|
-
|
|
542
|
-
## How the Employee System Works
|
|
432
|
+
## What you get
|
|
543
433
|
|
|
544
|
-
|
|
434
|
+
### Employees: your CLI calls the others
|
|
545
435
|
|
|
546
|
-
You talk to one AI (the "Boss"). When it needs specialized work, it dispatches tasks to employees — each running
|
|
436
|
+
You talk to one AI (the "Boss"). When it needs specialized work, it dispatches tasks to employees — each running its own CLI and model — and reviews their output before answering you.
|
|
547
437
|
|
|
548
|
-
```
|
|
438
|
+
```text
|
|
549
439
|
You: "Fix the frontend styling and update the API endpoint"
|
|
550
440
|
|
|
551
|
-
Boss (Claude)
|
|
552
|
-
├──
|
|
553
|
-
├──
|
|
441
|
+
Boss (Claude)
|
|
442
|
+
├── Frontend employee (OpenCode) → "Fix the CSS grid layout in dashboard.tsx"
|
|
443
|
+
├── Backend employee (Codex) → "Update /api/users to return pagination metadata"
|
|
554
444
|
└── Synthesizes both results for you
|
|
555
445
|
```
|
|
556
446
|
|
|
557
447
|
```bash
|
|
558
|
-
# Under the hood, it's one command:
|
|
559
|
-
jaw dispatch --agent "Frontend" --task "Fix the CSS grid layout in dashboard.tsx"
|
|
560
448
|
jaw dispatch --agent "Backend" --task "Run read-only verification" --watch
|
|
561
449
|
jaw dispatch --virtual "security" --task "Review this branch for auth and secret leaks" --watch
|
|
562
|
-
jaw worker status Backend
|
|
563
450
|
```
|
|
564
451
|
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
### Employees vs. Sub-agents
|
|
568
|
-
|
|
569
|
-
These are different things:
|
|
452
|
+
### PABCD: plan, audit, build, check, done
|
|
570
453
|
|
|
571
|
-
|
|
572
|
-
|---|---|---|
|
|
573
|
-
| **What** | Other AI CLIs (Codex, OpenCode, etc.) configured as workers | Built-in parallel task tool within a single CLI |
|
|
574
|
-
| **When** | Multi-specialist work across different codebases or domains | Internal research, file reads, parallel analysis |
|
|
575
|
-
| **How** | `jaw dispatch --agent "Name" --task "..."` | Automatic — the CLI spawns them internally |
|
|
576
|
-
|
|
577
|
-
Use employees for "Frontend does CSS, Backend does API." Use sub-agents for "read these 5 files in parallel before deciding."
|
|
578
|
-
|
|
579
|
-
---
|
|
580
|
-
|
|
581
|
-
## AI Runtime Surfaces
|
|
582
|
-
|
|
583
|
-
No per-token API billing. Route through subscriptions you already pay for.
|
|
584
|
-
|
|
585
|
-
| CLI | Default Model | Auth | Cost |
|
|
586
|
-
|---|---|---|---|
|
|
587
|
-
| **Pi** | `grok-composer-2.5-fast` | Settings profile API key, local proxy, or `PI_CODING_AGENT_BIN` | First-class `pi --mode rpc` runtime for local/API endpoints through an isolated `PI_CODING_AGENT_DIR` |
|
|
588
|
-
| **Claude** | `claude-opus-4-8` | `claude auth login` | Claude Pro subscription or higher |
|
|
589
|
-
| **Antigravity** | AGY-selected | checked by `agy` at run time | Experimental AGY print-mode runtime (`agy -p`); optional `--model` is capability-probed (observed in AGY 1.0.12); resume via `--conversation`; no separate effort flag |
|
|
590
|
-
| **Codex** | `gpt-5.5` | `codex login` | ChatGPT Pro subscription or higher |
|
|
591
|
-
| **Codex App** | `gpt-5.5` | `codex login` | ChatGPT Pro subscription or higher |
|
|
592
|
-
| **Cursor** | `composer-2.5` | `cursor-agent login` or `CURSOR_API_KEY` | Cursor subscription; native usage with optional dashboard-session fallback |
|
|
593
|
-
| **Grok** | `grok-build` | `grok login --oauth` | Grok subscription; JSON weekly usage read with native credentials, with gRPC/monthly fallbacks |
|
|
594
|
-
| **Kiro** | registry-selected | `kiro` | AWS Kiro free tier; `kiro-cli chat --no-interactive` runtime |
|
|
595
|
-
| **OpenCode** | `opencode-go/kimi-k2.6` | `opencode` | Free models available |
|
|
596
|
-
| **Copilot** | `claude-sonnet-4.6` | `copilot login` | Free tier available |
|
|
597
|
-
|
|
598
|
-
GPT 5.5 and Claude Opus 4.8 are enabled from Pro-tier subscriptions and higher. Starting in June, select `claude` when you want CLI-JAW to use the Claude allowance bundled with the subscription plan.
|
|
599
|
-
|
|
600
|
-
On a new install, CLI-JAW prefers **Codex App** when the local `app-server` entrypoint and Codex authentication are ready. Existing installations keep their saved runtime until the one-time Settings notice is explicitly accepted; choosing “keep” preserves the current runtime. Set `CLI_JAW_DEFAULT_CLI=claude` to override the clean-install policy.
|
|
601
|
-
|
|
602
|
-
OpenCodex routing remains owned by Codex's root `openai_base_url` setting. CLI-JAW only compares that read-only URL with the live OpenCodex runtime-port and `/healthz` fingerprint for diagnostics; it does not rewrite Codex config or inject an execution endpoint.
|
|
603
|
-
|
|
604
|
-
The quota/status panel keeps the same runtime keyset as the registry. Cold status requests return a neutral “checking” snapshot immediately while binary, authentication, and capability probes run in a bounded child process. Wrapper runtimes (`codex-app`) delegate to their underlying provider, while providers without a measured quota remain status-only. AGY uses native IDE/selected-account quota, Cursor uses its selected native account with explicit cookie compatibility, and OpenCode Go reads usage directly. Grok uses the current CLI auth store for JSON weekly credits, with gRPC weekly and legacy monthly fallbacks. Each provider failure is isolated in the quota response.
|
|
605
|
-
|
|
606
|
-
Native quota readers follow the OpenCodex source contract: Codex window duration/plan policy, Spark and reset-credit metadata; Claude model-scoped windows and credential-scoped cache. Missing measurements remain unknown, 429 alone never means 100%, and upstream bodies are bounded. See `docs/migration/quota-reader-parity.md`.
|
|
607
|
-
|
|
608
|
-
**Fallback chain**: if one engine is rate-limited, the next picks up. Configure with `/fallback [cli1 cli2...]`.
|
|
609
|
-
|
|
610
|
-
**OpenCode wildcard**: connect any model endpoint — OpenRouter, local LLMs (Large Language Models), any OpenAI-compatible API.
|
|
611
|
-
|
|
612
|
-
> Switch engines live: `/cli codex`. Switch models: `/model gpt-5.5`. Works from Web, Terminal, Telegram, Discord, or Slack.
|
|
613
|
-
|
|
614
|
-
**Mid-run steering**: the default policy is `multiSession.midRunPolicy: 'steer'`. Codex App accepts in-flight input; native Cursor cancels and drains the active prompt, then re-prompts in the same session with application-restored context. Other paths interrupt the current run and carry bounded partial output into a new run; this is not a guarantee of complete history retention. Prefer waiting in line? Choose `followup` or `collect` in Settings → Agent.
|
|
615
|
-
|
|
616
|
-
---
|
|
617
|
-
|
|
618
|
-
## PABCD Orchestration (Plan → Audit → Build → Check → Done)
|
|
619
|
-
|
|
620
|
-
For complex tasks, CLI-JAW uses a structured 5-phase workflow. You approve every transition — nothing ships without your OK.
|
|
621
|
-
|
|
622
|
-
```
|
|
623
|
-
P (Plan) → A (Audit) → B (Build) → C (Check) → D (Done) → IDLE
|
|
624
|
-
⛔ ⛔ ⛔ auto auto
|
|
625
|
-
```
|
|
454
|
+
For complex tasks CLI-JAW runs a structured workflow. You approve every transition; read-only workers verify the plan and the result.
|
|
626
455
|
|
|
627
456
|
| Phase | What happens |
|
|
628
457
|
|---|---|
|
|
629
|
-
| **P — Plan** | Boss writes a diff-level plan
|
|
630
|
-
| **A — Audit** |
|
|
631
|
-
| **B — Build** | Boss implements
|
|
632
|
-
| **C — Check** | Type-check
|
|
633
|
-
| **D — Done** | Summary of all changes
|
|
634
|
-
|
|
635
|
-
State is database-persisted and survives restarts. Workers cannot modify files — only verify. Activate with `jaw orchestrate`, `/orchestrate`, or `/pabcd`; resume an active worklog explicitly with `/continue`. Forward phase transitions require evidence attestation, e.g. `jaw orchestrate B --attest '{"from":"A","to":"B","did":"<what you did>"}'` (C→D also needs pasted `checkOutput` and `exitCode`). Workflow helper slash commands include `/plan`, `/interview`, `/deliberate`, `/planaudit`, `/review`, `/search`, `/goal`, `/goalplan`, `/team`, `/task`, `/fork`, and `/gd`; `/plan` is a compatibility guide that explains "this is PABCD P" and points to the right next command instead of creating a second planning mode. `/search <query>` routes search intent through the active search skill: classify local vs external lookup, rewrite focused queries, discover candidate URLs, and only then use browser commands such as `browser fetch` for evidence verification. Bounded automation is expressed as `/goal run ...`, not a separate top-level `/autopilot`. Durable goals — `/goal <objective>` plus `update`/`done`/`cancel`/`pause`/`resume` — are functional and survive restarts, and a goal resume re-fires the work on every interface (Web/CLI included, not just messaging). AI-initiated `goal pause --agent --audit` arms a two-tap gate: one audit/finalizer continuation may run with `pause_gate_pending`, and if that turn exits with the gate still armed, `goal_pause_gate_pending` suppresses further auto-continuation until a productive checkpoint or a second audited pause. `/gd` is shorthand for `/goal done --force` (skips the completion evidence gate). `/goal run` (`preflight`/`start`/`stop`/`status`) is a tracking-only preview: it gates on preflight and tracks turn/dispatch budget, with enforcement still to come.
|
|
636
|
-
|
|
637
|
-
---
|
|
638
|
-
|
|
639
|
-
## Memory
|
|
640
|
-
|
|
641
|
-
Three layers, each covering a different recall horizon.
|
|
642
|
-
|
|
643
|
-
| Layer | What it stores | How it works |
|
|
644
|
-
|---|---|---|
|
|
645
|
-
| **History Block** | Recent session context | Last 10 sessions, max 8000 chars, scoped to working directory. Injected at prompt start |
|
|
646
|
-
| **Memory Flush** | Structured knowledge from conversations | Triggered after threshold (default 10 turns). Extracts episodes, daily logs, semantic notes as markdown |
|
|
647
|
-
| **Soul + Task Snapshot** | Identity and semantic recall | Core values, tone, boundaries. Full-text search index returns up to 4 semantically relevant hits per prompt |
|
|
458
|
+
| **P — Plan** | Boss writes a diff-level plan and stops for your review |
|
|
459
|
+
| **A — Audit** | A read-only worker checks the plan is feasible |
|
|
460
|
+
| **B — Build** | Boss implements; a read-only worker verifies |
|
|
461
|
+
| **C — Check** | Type-check, docs update, consistency check |
|
|
462
|
+
| **D — Done** | Summary of all changes, back to idle |
|
|
648
463
|
|
|
649
|
-
|
|
464
|
+
State survives restarts. Start with `jaw orchestrate` or `/pabcd`, resume with `/continue`, and keep long objectives alive with `/goal`. See [PABCD](https://lidge-jun.github.io/cli-jaw/dev/concepts/pabcd.html).
|
|
650
465
|
|
|
651
|
-
|
|
652
|
-
jaw memory search "how did we set up the API auth?"
|
|
653
|
-
```
|
|
654
|
-
|
|
655
|
-
---
|
|
466
|
+
### Memory, skills and MCP
|
|
656
467
|
|
|
657
|
-
|
|
468
|
+
- **Three memory layers** — recent session history, structured notes flushed from conversations, and a searchable soul/task snapshot: `jaw memory search "how did we set up the API auth?"`
|
|
469
|
+
- **200+ skills** — office documents (PDF, DOCX, XLSX, PPTX, HWP), browser and desktop automation, media, GitHub, Notion and dev guides: `jaw skill install <name>`
|
|
470
|
+
- **One MCP config for every engine** — `jaw mcp install @anthropic/context7` syncs Claude, Codex, Kiro, OpenCode, Copilot and Antigravity at once
|
|
658
471
|
|
|
659
|
-
|
|
472
|
+
### Browser and desktop automation
|
|
660
473
|
|
|
661
|
-
|
|
662
|
-
|---|---|---|
|
|
663
|
-
| **Office** | `jaw-pdf`, `jaw-docx`, `jaw-xlsx`, `jaw-pptx`, `jaw-hwp` | Read, create, edit documents. HWP/HWPX (Korean word-processor formats) supported natively |
|
|
664
|
-
| **Automation** | `jaw-browser`, `vision-click`, `jaw-screen-capture`, `jaw-desktop-control` | Chrome DevTools Protocol (CDP) browser control, structure-first grounding with a coordinate fallback, macOS screenshots, Computer Use |
|
|
665
|
-
| **Media** | `jaw-video`, `imagegen`, `lecture-stt`, `tts` | Remotion video, OpenAI image generation, lecture transcription, text-to-speech |
|
|
666
|
-
| **Integration** | `jaw-github`, `notion`, `jaw-telegram-send`, `jaw-memory` | Issues/PRs/CI, Notion pages, Telegram media delivery, persistent memory |
|
|
667
|
-
| **Visualization** | `jaw-diagram` | SVG diagrams, charts, interactive visualizations rendered in chat |
|
|
668
|
-
| **Content / Writing** | `k-writing` | Korean promotional/content writing: thread, Instagram cardnews, LinkedIn, website/blog, and humanize outputs with mandatory search, hook scoring, and anti-AI checks |
|
|
669
|
-
| **Dev Guides** | `jaw-dev`, `jaw-dev-frontend`, `jaw-dev-backend`, `jaw-dev-data`, `jaw-dev-testing`, `jaw-dev-pabcd` | Engineering guidelines injected into agent prompts |
|
|
474
|
+
Drive Chrome through the DevTools Protocol, click by description with `jaw browser vision-click "Login button"`, control desktop apps through Codex Computer Use on macOS and Windows, and ask ChatGPT, Gemini or Grok web UIs with `jaw browser web-ai`.
|
|
670
475
|
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
```bash
|
|
674
|
-
jaw skill install <name> # activate a reference skill
|
|
675
|
-
jaw skill list # see what's available
|
|
676
|
-
```
|
|
677
|
-
|
|
678
|
-
---
|
|
679
|
-
|
|
680
|
-
## Browser & Desktop Automation
|
|
681
|
-
|
|
682
|
-
| Capability | How it works |
|
|
683
|
-
|---|---|
|
|
684
|
-
| **Chrome DevTools Protocol** | Navigate, click, type, screenshot, evaluate JS, scroll, press keys — remote control for Chrome |
|
|
685
|
-
| **Vision-click** | Describe a target, get it clicked. Asks the browser where its elements are first and clicks a ref when the answer lands on one; falls back to a coordinate for canvas and custom-rendered UI. Declines rather than guessing when the target is ambiguous, covered, or the page moved. `jaw browser vision-click "Login button"` |
|
|
686
|
-
| **Computer Use** | Desktop app automation via Codex Computer Use. Use Safari for localhost and it feels like the Codex app |
|
|
687
|
-
| **Web-AI vendors** | `jaw browser web-ai --vendor chatgpt\|gemini\|grok` with session lifecycle, diagnostics, source-audit/answer-artifact support, and ChatGPT code-mode zip recovery |
|
|
688
|
-
| **Diagram Skill** | Generate SVG diagrams and interactive visualizations, rendered inline in chat |
|
|
689
|
-
|
|
690
|
-
Computer Use lets you control desktop apps — Finder, Safari, System Settings, Xcode on macOS; any window on Windows — through natural language. Point it at your localhost dev server in a browser and you get a full visual testing loop. The two hosts expose different APIs (macOS is app-scoped, Windows is window-scoped), and the `jaw-desktop-control` skill routes between them.
|
|
691
|
-
|
|
692
|
-
---
|
|
693
|
-
|
|
694
|
-
## Messaging
|
|
695
|
-
|
|
696
|
-
### Telegram
|
|
697
|
-
|
|
698
|
-
```
|
|
699
|
-
📱 Telegram ←→ 🦈 CLI-JAW ←→ 🤖 AI Engines
|
|
700
|
-
```
|
|
476
|
+
### Messaging
|
|
701
477
|
|
|
702
|
-
|
|
478
|
+
Chat with your agent from **Telegram** (voice messages, forum topics, scheduled heartbeat jobs), **Discord** and **Slack** (Socket Mode, threads, file relay, mention watching). Enable several channels at once; the home channel receives proactive sends.
|
|
703
479
|
|
|
704
480
|
<details>
|
|
705
|
-
<summary>
|
|
481
|
+
<summary>Telegram setup (3 steps)</summary>
|
|
706
482
|
|
|
707
483
|
1. Message [@BotFather](https://t.me/BotFather) → `/newbot` → copy the token
|
|
708
484
|
2. `jaw init --telegram-token YOUR_TOKEN` or use Web UI settings
|
|
@@ -710,170 +486,91 @@ Text chat, voice messages (auto-transcribed via STT — speech-to-text), file/ph
|
|
|
710
486
|
|
|
711
487
|
</details>
|
|
712
488
|
|
|
713
|
-
### Discord
|
|
714
|
-
|
|
715
|
-
Same capabilities as Telegram — text, files, commands. Channel/thread routing, canonical `/api/channel/send`, and forwarder support for agent result broadcast. Setup via Web UI settings.
|
|
716
|
-
|
|
717
|
-
You can enable multiple inbound channels at once. The manager and Web UI settings separate **enabled channels** from the **home channel**: enabled channels start their transport gateways; the home channel is the fallback for proactive sends and legacy `settings.channel` is a deprecated read-only alias for one major version.
|
|
718
|
-
|
|
719
|
-
### Slack
|
|
720
|
-
|
|
721
|
-
[Trusted bot triggers](docs/slack-tools.md#letting-one-other-bot-start-a-turn) can optionally select an operator-configured `workflowSkill` after the actual sender, channel, bot-user, marker and self-mention match. Only the selected enabled skill is loaded (64 KiB maximum); unverified sender/request context or unavailable or ambiguous skill selection is visibly blocked without model fallback. Existing four-field rules retain legacy behavior and normal approval, tool grants and source permissions still apply. Empty or standalone `SILENT` workflow results show an unconfirmed notice and failure ACK; inspect records before retrying because work may already have begun. There is no automatic rerun, and an AI reply alone does not prove business completion.
|
|
722
|
-
|
|
723
|
-
Opted-in workflow requests use the `followup` queue when busy; never steer or collect them into an unrelated running turn. Read the selected skill at admission and preserve its captured content, hash and source metadata across queueing and restart. Silent outcomes settle the workflow request as unconfirmed/failed while preserving provider/native final text and status; never automatically rerun.
|
|
724
|
-
|
|
725
|
-
Slack text sends preserve Markdown and explicit Block Kit `blocks`, splitting multiple tables into separate messages. `ok:true` means every chunk was posted, independently of rendering verification. Inspect `delivery.verification` (`verified`, `failed`, or `unavailable`) and `delivery.messages` for each posted chunk's timestamp, verification error, table-content status, and feature evidence. A persisted mismatch is `failed`; missing permission, unavailable/malformed readback, or a missing timestamp is `unavailable`. Neither stops remaining posts or triggers reposting. Actual validation/POST failures retain `ok:false`; partial receipts include `postedChunks`, `totalChunks`, and `sent:true, retryable:false`. Never blindly resend posted chunks. `tableContent` compares ordered text, numeric value/display, links and supported styles; ordinary Markdown character references decode once while code and escaped ampersands stay literal. `richContent` and `sourceAccuracy` remain `not_checked`, and readback stays bounded to 1 MiB.
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
Group DMs are supported when the app has joined the conversation and has the `message.mpim` event subscription plus `mpim:history`. Existing apps need these added in Slack and a reinstall to grant the scope; updating cli-jaw alone does not change installed permissions. Group DMs retain the conversation allowlist and mention/thread rules. Missing this scope leaves existing IM/channel messaging available and reports the group-DM capability gap.
|
|
729
|
-
|
|
730
|
-
Slack replies show a bounded native progress plan with recent safe tool activity, queue/wait status and a separate delivery result. Elapsed time refreshes every second in native mode, subject to Slack/network backpressure. Explicit shell tool-call purposes and English action/target summaries distinguish file reads, searches, tests and scripts, including supported shell forms. Known file tools show sanitized project-relative filenames or an outside-project basename; raw commands, host paths, file contents and reasoning stay private. Failure and cancellation do not become successful reactions merely because a message was sent.
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
Socket Mode bot with the same shared command catalog — mentions, DMs, slash commands, file/image relay, thread replies. Each Slack-triggered agent turn receives the current conversation ID and parent thread timestamp explicitly, so history/member lookups and targeted replies do not depend on parsing an internal session label or enabling multi-session.
|
|
734
|
-
|
|
735
|
-
Heartbeat jobs can opt into Slack mention watching with `mentionWatch: { channel: "slack", userId, channelIds, maxHits?, since? }`. This runs inside the existing `runHeartbeatJob`, not a separate daemon: it walks explicitly configured, joined channels backward with `conversations.history` because `search.messages` is a user-token method and bot tokens cannot hold `search:read`. The scan keeps a completed-message frontier and unfinished-walk resume bound, rotates the first channel between ticks, stops the tick on 429, and reports channel IDs beyond the 60-channel ceiling. Before each hit it yields to active PABCD, agent work, queued messages, or pending replay; the agent returns answer text only, then the server posts it to the source thread with `sendChannelOutput` and records the message as seen. Failed sends remain eligible for retry, so delivery is at-least-once. Keep watch jobs disabled (`enabled: false`) until the channel subset and target user are configured; every tick intersects `channelIds` with the current `slack.channelIds` allowlist again.
|
|
736
|
-
|
|
737
|
-
Each answer runs in the chat session bound to the thread it is answering, so the reply shares that conversation's history instead of the shared default session. The execution scope is deliberately a different one (`mention-watch:<remoteKey>`): a background turn registered in the thread's own scope would look busy to the next human message, which Slack then steers into it rather than starting a new run. Because placement is per conversation, the yield check is too — the thread must be PABCD-`IDLE`, its session must have no work in flight, and its lane must be free. The lane is checked and never awaited, since a lane wait has no bound while the heartbeat holds every other job. A session row is created only when a hit is actually being answered, because a remote-bound session cannot be deleted afterwards.
|
|
738
|
-
|
|
739
489
|
<details>
|
|
740
|
-
<summary>
|
|
490
|
+
<summary>Slack setup (guided wizard)</summary>
|
|
741
491
|
|
|
742
|
-
1. `jaw slack setup` — prints the app manifest
|
|
492
|
+
1. `jaw slack setup` — prints the app manifest, opens the Slack app page, validates both tokens live and writes the settings
|
|
743
493
|
2. `/invite @cli-jaw` in each channel the bot should read, then restart `jaw serve`
|
|
744
494
|
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
For Docker/Kubernetes deployments, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `SLACK_TEAM_ID`, and `SLACK_CHANNEL_IDS` are runtime-only owners of their matching fields. While any are present, Settings keeps connection editing/reset read-only as a group and the CLI setup paths refuse mixed input; remove the variables and restart cli-jaw before changing the connection there. Persistence strips only fields owned by configured variables, so environment values are never copied into `settings.json` and metadata-only overrides do not erase file-backed tokens. Delivery preferences such as mention/thread/forwarding behavior remain editable.
|
|
495
|
+
Group DMs need the `message.mpim` event and `mpim:history` scope. For containers, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `SLACK_TEAM_ID` and `SLACK_CHANNEL_IDS` own their fields at runtime. Details: [Slack tools](docs/slack-tools.md).
|
|
748
496
|
|
|
749
497
|
</details>
|
|
750
498
|
|
|
751
|
-
###
|
|
499
|
+
### Desktop app
|
|
752
500
|
|
|
753
|
-
|
|
501
|
+
The Electron app boots the manager dashboard, ships a bundled Node.js sidecar, and lives in your menu bar. Download it from [GitHub Releases](https://github.com/lidge-jun/cli-jaw/releases/latest):
|
|
754
502
|
|
|
755
|
-
|
|
503
|
+
- **macOS (Apple Silicon)** — open the DMG and drag CLI-JAW into Applications. Builds are Developer ID signed, notarized and stapled, and update in-app.
|
|
504
|
+
- **Windows (x64)** — run the Setup `.exe`. It is unsigned, so SmartScreen may ask you to confirm.
|
|
505
|
+
- **Linux (x64)** — make the AppImage executable and run it.
|
|
756
506
|
|
|
757
|
-
|
|
507
|
+
After first launch, accept **Install CLI command** (or use the tray item **Install CLI to Terminal**) to get `jaw` in your terminal without a global npm install.
|
|
758
508
|
|
|
759
|
-
|
|
509
|
+
---
|
|
760
510
|
|
|
761
|
-
|
|
762
|
-
jaw mcp install @anthropic/context7
|
|
763
|
-
# → syncs to Claude, Codex, Kiro, OpenCode, Copilot, and Antigravity config files simultaneously
|
|
764
|
-
```
|
|
511
|
+
## AI runtimes
|
|
765
512
|
|
|
766
|
-
No
|
|
513
|
+
No per-token API billing. Route through subscriptions you already pay for.
|
|
767
514
|
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
515
|
+
| CLI | Default model | Auth | Cost |
|
|
516
|
+
|---|---|---|---|
|
|
517
|
+
| **Pi** | `grok-composer-2.5-fast` | Settings profile API key, local proxy, or `PI_CODING_AGENT_BIN` | Local/API endpoints through an isolated profile |
|
|
518
|
+
| **Claude** | `claude-opus-4-8` | `claude auth login` | Claude Pro subscription or higher |
|
|
519
|
+
| **Antigravity** | AGY-selected | checked by `agy` at run time | Experimental print-mode runtime |
|
|
520
|
+
| **Codex** | `gpt-5.5` | `codex login` | ChatGPT Pro subscription or higher |
|
|
521
|
+
| **Codex App** | `gpt-5.5` | `codex login` | ChatGPT Pro subscription or higher |
|
|
522
|
+
| **Cursor** | `composer-2.5` | `cursor-agent login` or `CURSOR_API_KEY` | Cursor subscription |
|
|
523
|
+
| **Grok** | `grok-build` | `grok login --oauth` | Grok subscription |
|
|
524
|
+
| **Kiro** | registry-selected | `kiro` | AWS Kiro free tier |
|
|
525
|
+
| **OpenCode** | `opencode-go/kimi-k2.6` | `opencode` | Free models available |
|
|
526
|
+
| **Copilot** | `claude-sonnet-4.6` | `copilot login` | Free tier available |
|
|
527
|
+
|
|
528
|
+
If one engine is rate-limited the next picks up (`/fallback`). Switch engines live with `/cli codex` and models with `/model gpt-5.5` — from Web, Terminal, Telegram, Discord, or Slack.
|
|
771
529
|
|
|
772
530
|
---
|
|
773
531
|
|
|
774
|
-
## CLI
|
|
532
|
+
## CLI
|
|
775
533
|
|
|
776
534
|
```bash
|
|
777
535
|
# Core
|
|
778
536
|
jaw dashboard # launch manager dashboard
|
|
779
|
-
jaw serve # start server (http://localhost:3457)
|
|
537
|
+
jaw serve # start an agent server (http://localhost:3457)
|
|
780
538
|
jaw chat # terminal chat UI
|
|
781
|
-
jaw chat search "query" # search chat history
|
|
782
539
|
jaw ask "question" # one prompt, one answer — no TTY needed
|
|
783
|
-
echo "question" | jaw ask - # same, reading the prompt from stdin
|
|
784
540
|
jaw doctor # installation and runtime diagnostics
|
|
785
|
-
jaw slack setup # guided Slack app setup (manifest + token validation)
|
|
786
|
-
jaw messaging ingress list # inspect / replay the durable inbound journal
|
|
787
541
|
|
|
788
542
|
# Instances
|
|
789
|
-
jaw clone ~/project
|
|
790
|
-
jaw --home ~/project serve --port 3458
|
|
791
|
-
jaw service install
|
|
543
|
+
jaw clone ~/project # clone instance to new directory
|
|
544
|
+
jaw --home ~/project serve --port 3458 # run a second instance
|
|
545
|
+
jaw service install # auto-start on boot (macOS launchd / Linux systemd)
|
|
792
546
|
jaw --home ~/project service restart --port 3458 # restart only this instance
|
|
793
|
-
jaw --home ~/project service stop --port 3458 # stop only this instance
|
|
794
|
-
jaw project set ~/repo # set projectDirs for review/orchestration
|
|
795
|
-
jaw lock # protect this instance from stop-all flows
|
|
796
|
-
|
|
797
|
-
# AI & Orchestration
|
|
798
|
-
jaw employee list # list configured + static employees
|
|
799
|
-
jaw dispatch --agent "Backend" --task "..." # dispatch employee
|
|
800
|
-
jaw dispatch --agent "Backend" --task "..." --watch # dispatch and stream safe progress
|
|
801
|
-
jaw dispatch --virtual "testing" --task "..." --watch # one-off virtual employee
|
|
802
|
-
jaw worker status Backend # inspect current/previous employee progress
|
|
803
|
-
jaw orchestrate # enter/control PABCD workflow
|
|
804
|
-
jaw goal status # persistent goal lifecycle
|
|
805
|
-
jaw task list # agent-native task checklist
|
|
806
|
-
# in chat: /continue # explicit worklog/PABCD resume
|
|
807
|
-
|
|
808
|
-
# Skills & MCP
|
|
809
|
-
jaw skill install <name> # activate a skill
|
|
810
|
-
jaw skill list # list available skills
|
|
811
|
-
jaw mcp install <package> # install MCP → syncs supported MCP-aware engines
|
|
812
|
-
jaw mcp sync # re-sync MCP configs
|
|
813
|
-
|
|
814
|
-
# Memory
|
|
815
|
-
jaw memory search <query> # search across all memory layers
|
|
816
|
-
jaw memory save <file> <content> # save to structured memory
|
|
817
|
-
|
|
818
|
-
# Browser
|
|
819
|
-
jaw browser start # launch Chrome automation
|
|
820
|
-
jaw browser fetch "https://example.com" --json --trace # adaptive URL reader
|
|
821
|
-
jaw browser snapshot # capture page state
|
|
822
|
-
jaw browser vision-click "Login" # describe a target; refuses rather than guessing
|
|
823
|
-
jaw browser web-ai status # ChatGPT/Gemini/Grok web-AI session tooling
|
|
824
|
-
jaw browser web-ai code --vendor chatgpt --model thinking --effort heavy --prompt "Build an MVP" --output-zip ./result.zip
|
|
825
|
-
|
|
826
|
-
# Search
|
|
827
|
-
# in chat: /search "npm trusted publishing official docs" # search-skill routing + evidence verification
|
|
828
|
-
|
|
829
|
-
# Dashboard connectors
|
|
830
|
-
jaw dashboard memory search "query" # read-only cross-instance memory search
|
|
831
|
-
jaw dashboard chat search "query" # cross-instance chat search
|
|
832
|
-
jaw connector board add --title "Fix docs"
|
|
833
|
-
jaw reminders add "Follow up tomorrow"
|
|
834
|
-
|
|
835
|
-
# Maintenance
|
|
836
|
-
jaw reset # full reset
|
|
837
|
-
```
|
|
838
|
-
|
|
839
|
-
---
|
|
840
|
-
|
|
841
|
-
## Multi-Instance
|
|
842
|
-
|
|
843
|
-
Run isolated instances with separate settings, memory, and database:
|
|
844
547
|
|
|
845
|
-
|
|
846
|
-
jaw
|
|
847
|
-
jaw --
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
Each instance is fully independent — different working directory, different memory, different MCP config. The manager dashboard sees them all.
|
|
851
|
-
|
|
852
|
-
For a standalone `jaw serve`, use the home-scoped lifecycle commands instead of killing every Node process. The server records verifiable ownership in `<JAW_HOME>/jaw.pid.json`; `stop` and `restart` refuse stale, foreign, or unverifiable records. Registered launchd/systemd instances delegate to their service manager.
|
|
548
|
+
# Agents and workflow
|
|
549
|
+
jaw employee list
|
|
550
|
+
jaw dispatch --agent "Backend" --task "..." --watch
|
|
551
|
+
jaw orchestrate # PABCD workflow
|
|
552
|
+
jaw goal status # persistent goals
|
|
853
553
|
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
jaw
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
jaw --home "$HOME/jaw/worker-a" service stop --port 3458
|
|
554
|
+
# Skills, MCP, memory, browser
|
|
555
|
+
jaw skill list
|
|
556
|
+
jaw mcp install <package>
|
|
557
|
+
jaw memory search <query>
|
|
558
|
+
jaw browser fetch "https://example.com" --json
|
|
860
559
|
```
|
|
861
560
|
|
|
862
|
-
|
|
561
|
+
Each instance created with `jaw clone` has its own settings, memory, database and MCP config, and the manager dashboard sees them all. Remote and headless hosts: [structure/remote-headless.md](structure/remote-headless.md). Full command reference: [CLI docs](https://lidge-jun.github.io/cli-jaw/dev/reference/cli.html).
|
|
863
562
|
|
|
864
|
-
|
|
865
|
-
the desktop application to exit. A successful response acknowledges launch only;
|
|
866
|
-
a headless host still needs a desktop handler to display the file.
|
|
563
|
+
---
|
|
867
564
|
|
|
868
|
-
|
|
869
|
-
files the installer adds `~/.local/bin` to, so `jaw` can work when you log in and still fail
|
|
870
|
-
over SSH with `nohup: failed to run command 'jaw'`. Run `jaw doctor` and check the
|
|
871
|
-
**Non-interactive PATH (ssh)** row, then call jaw by absolute path or export PATH inside the
|
|
872
|
-
remote command.
|
|
565
|
+
## Documentation
|
|
873
566
|
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
567
|
+
| Topic | Where |
|
|
568
|
+
|---|---|
|
|
569
|
+
| Website and quickstart | [lidge-jun.github.io/cli-jaw](https://lidge-jun.github.io/cli-jaw/) |
|
|
570
|
+
| Guides, concepts, reference | [Developer docs](https://lidge-jun.github.io/cli-jaw/dev/) |
|
|
571
|
+
| Architecture | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) · [structure/](structure/) |
|
|
572
|
+
| Slack tools and local API | [docs/slack-tools.md](docs/slack-tools.md) |
|
|
573
|
+
| Runtime integration (including retired runtimes) | [structure/runtime-integration.md](structure/runtime-integration.md) |
|
|
877
574
|
|
|
878
575
|
---
|
|
879
576
|
|
|
@@ -883,38 +580,11 @@ entrypoint or cron. Full guide: [structure/remote-headless.md](structure/remote-
|
|
|
883
580
|
npm run build # tsc → dist/
|
|
884
581
|
npm run build:frontend # vite → public/dist/
|
|
885
582
|
npm run dev # tsx server.ts (hot-reload)
|
|
886
|
-
npm test #
|
|
887
|
-
npm run
|
|
888
|
-
npm run
|
|
889
|
-
npm run gate:all # named release/docs parity gates (incl. doc-drift, strict-baseline, redaction-sinks)
|
|
890
|
-
npm run docs:check # AST commands/routes inventory vs structure docs
|
|
891
|
-
bash structure/check-doc-drift.sh
|
|
583
|
+
npm test # node:test driver (tests/run.mts)
|
|
584
|
+
npm run gate:all # release/docs parity gates
|
|
585
|
+
npm run electron:dev # desktop app with hot reload
|
|
892
586
|
```
|
|
893
587
|
|
|
894
|
-
Architecture details: [ARCHITECTURE.md](docs/ARCHITECTURE.md) · Pre-prompt context hooks: [pre-prompt-context-hooks.md](docs/dev/pre-prompt-context-hooks.md) · Internal structure docs: [structure/](structure/)
|
|
895
|
-
|
|
896
|
-
Desktop QA has an explicit [isolated launch profile](structure/infra.md#isolated-desktop-qa): fixed task-owned homes and ports, no global app registration or Manager lifecycle actions. It requires a prepared, scrubbed launch environment; it is not a sandbox for arbitrary commands or proof that a packaged artifact passed QA.
|
|
897
|
-
|
|
898
|
-
Sidecar builds use [owned staging and target-runtime smoke checks](structure/infra.md#sidecar-build-and-smoke-ownership). Failed builds retain evidence rather than overwriting unknown output; a skipped or timed-out smoke is not verification.
|
|
899
|
-
|
|
900
|
-
---
|
|
901
|
-
|
|
902
|
-
## How It Compares
|
|
903
|
-
|
|
904
|
-
| | CLI-JAW 2.x | Hermes Agent | Claude Code |
|
|
905
|
-
|---|---|---|---|
|
|
906
|
-
| **Model access** | Pi, Antigravity, Claude, Codex, Codex App, Cursor, Gemini, Grok, Kiro, OpenCode, and Copilot through vendor/native auth where supported | API keys (OpenRouter 200+, Nous Portal) | Anthropic only |
|
|
907
|
-
| **Cost model** | Monthly subscriptions you already pay for | Per-token API billing | Anthropic subscription |
|
|
908
|
-
| **Primary UI** | Manager dashboard + Web app + Electron desktop + terminal UI | Terminal only | CLI + IDE plugins |
|
|
909
|
-
| **Dashboard** | Multi-instance manager, Kanban, Notes workspace | None | None |
|
|
910
|
-
| **Messaging** | Telegram (voice) + Discord + Slack | Telegram/Discord/Slack/WhatsApp/Signal | None |
|
|
911
|
-
| **Memory** | 3-layer (History/Flush/Soul) + full-text search | Self-improving loop + Honcho | File-based auto-memory |
|
|
912
|
-
| **Multi-agent** | Employee system (dispatch other CLIs) + PABCD | Subagent spawn | Task tool |
|
|
913
|
-
| **Browser automation** | Chrome DevTools + vision-click + Computer Use | Limited | Via MCP |
|
|
914
|
-
| **Execution** | Local + Docker | Local/Docker/SSH/Daytona/Modal | Local |
|
|
915
|
-
| **Skills** | 200+ reference skills + active runtime skills | Self-creating + agentskills.io | User-configured |
|
|
916
|
-
| **Languages** | English, Korean, Chinese, Japanese | English | English |
|
|
917
|
-
|
|
918
588
|
---
|
|
919
589
|
|
|
920
590
|
## Troubleshooting
|
|
@@ -922,44 +592,29 @@ Sidecar builds use [owned staging and target-runtime smoke checks](structure/inf
|
|
|
922
592
|
| Problem | Solution |
|
|
923
593
|
|---|---|
|
|
924
594
|
| `cli-jaw: command not found` | `npm install -g cli-jaw` again. macOS/Linux/WSL: check `~/.local/bin` or `npm prefix -g` + `/bin` is in `$PATH`. From Windows PowerShell, invoke WSL through a login shell: `wsl.exe -d Ubuntu -- bash -lc "jaw dashboard"`. |
|
|
925
|
-
| `npm warn allow-scripts ...` | npm >= 12 blocks dependency install scripts
|
|
926
|
-
| pnpm/bun blocked build scripts | pnpm 11+: `pnpm add -g --allow-build=cli-jaw cli-jaw
|
|
927
|
-
|
|
|
928
|
-
| Fresh install verifier fails | `scripts/verify-fresh-install.sh` checks both public aliases: `jaw` and `cli-jaw`. Fix the reported PATH or executable-bit issue, then rerun `bash "$(npm root -g)/cli-jaw/scripts/verify-fresh-install.sh"`. |
|
|
595
|
+
| `npm warn allow-scripts ...` | npm >= 12 blocks dependency install scripts: `npm install -g cli-jaw --allow-scripts=cli-jaw`, or persist with `npm config set allow-scripts=cli-jaw --location=user`. Already installed? `jaw init` finishes setup. |
|
|
596
|
+
| pnpm/bun blocked build scripts | pnpm 11+: `pnpm add -g --allow-build=cli-jaw cli-jaw`. bun: `bun add -g --trust cli-jaw`. |
|
|
597
|
+
| Fresh install verifier fails | Fix the reported PATH or executable-bit issue, then rerun `bash "$(npm root -g)/cli-jaw/scripts/verify-fresh-install.sh"`. |
|
|
929
598
|
| `Error: node version` | Upgrade to Node.js 22.4+: `nvm install 22` |
|
|
930
|
-
| `NODE_MODULE_VERSION` mismatch | `npm run ensure:native`
|
|
931
|
-
| `EADDRINUSE: port 3457` | Another instance running. Use `--port 3458` or stop it first |
|
|
599
|
+
| `NODE_MODULE_VERSION` mismatch | `npm run ensure:native` |
|
|
600
|
+
| `EADDRINUSE: port 3457` | Another instance is running. Use `--port 3458` or stop it first |
|
|
932
601
|
| Telegram / Discord / Slack auth fails | Run `jaw doctor`, check tokens, restart `jaw serve` |
|
|
933
|
-
|
|
|
934
|
-
| Employee dispatch hangs | Run `jaw employee list`, ensure the employee CLI is authenticated (`jaw doctor`), then retry with `jaw dispatch --watch` |
|
|
935
|
-
| Employee dispatch returns non-JSON or HTML | The server may be stale or missing the route. Run `npm run build` or restart the manager/dashboard process. |
|
|
936
|
-
| Computer Use not working | macOS or Windows; Codex CLI required. macOS: check Automation permission in System Settings. Windows: run calls inside `node_repl` and keep the Codex desktop app running in the logged-on session — an empty `list_windows()` means you are not on the pipe, not that no windows are open |
|
|
602
|
+
| Employee dispatch hangs | `jaw employee list`, make sure the employee CLI is authenticated (`jaw doctor`), retry with `jaw dispatch --watch` |
|
|
937
603
|
|
|
938
604
|
---
|
|
939
605
|
|
|
940
606
|
## Contributing
|
|
941
607
|
|
|
942
|
-
Public code and product docs live here. Private planning and history live only in a separate sibling clone of [cli-jaw-internal](https://github.com/lidge-jun/cli-jaw-internal); request access through an [issue](https://github.com/lidge-jun/cli-jaw/issues). Do not create private records in this checkout, including `devlog`, `_plan`, `_fin`, or `.jwc` aliases, or include private record paths in public docs/source.
|
|
943
|
-
|
|
944
|
-
Follow [local pre-push setup and checks](CONTRIBUTING.md#local-private-path-check) before uploading changes. CI is a backstop after upload and cannot prevent initial disclosure.
|
|
608
|
+
Public code and product docs live here. Private planning and history live only in a separate sibling clone of [cli-jaw-internal](https://github.com/lidge-jun/cli-jaw-internal); request access through an [issue](https://github.com/lidge-jun/cli-jaw/issues). Do not create private records in this checkout, including `devlog`, `_plan`, `_fin`, or `.jwc` aliases, or include private record paths in public docs/source. Follow [local pre-push setup and checks](CONTRIBUTING.md#local-private-path-check) before uploading changes.
|
|
945
609
|
|
|
946
610
|
1. Fork and branch from `dev`
|
|
947
611
|
2. `npm run build && npm run build:frontend && npm test`
|
|
948
|
-
3. For release-sensitive changes, also run `npm run gate:all`
|
|
612
|
+
3. For release-sensitive changes, also run `npm run gate:all`
|
|
949
613
|
4. Submit a PR
|
|
950
614
|
|
|
951
|
-
Bug reports and feature ideas: [Open an issue](https://github.com/lidge-jun/cli-jaw/issues)
|
|
952
|
-
|
|
953
615
|
---
|
|
954
616
|
|
|
955
|
-
<
|
|
956
|
-
|
|
957
|
-
**[MIT License](LICENSE)** · Built by developers who got tired of tab-switching between AI apps.
|
|
958
|
-
|
|
959
|
-
</div>
|
|
617
|
+
<p align="center"><a href="LICENSE"><b>MIT License</b></a> · Built by developers who got tired of tab-switching between AI apps.</p>
|
|
960
618
|
|
|
961
|
-
Boss turns receive host-local calendar dates and Monday–Sunday week ranges to resolve relative dates; explicit timezone or week conventions take precedence.
|
|
962
619
|
|
|
963
|
-
For opt-in local services that must survive global package updates, see [verified local service builds](docs/pinned-service-artifacts.md).
|
|
964
620
|
|
|
965
|
-
Send a Slack attachment with `jaw slack send C123 --file ./report.pdf --caption "Report" --json` (add `--thread <parent-ts>` for a reply). Inspect the upload receipt; failed uploads do not silently become text-only messages.
|