You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/architecture/backends.md
+4-2Lines changed: 4 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -73,13 +73,13 @@ Reads `llm.backend` from `adjutant.yaml` (via `load_typed_config()`) and returns
73
73
74
74
Wraps the existing `core/opencode.py` module. Delegates to `opencode_run()` for async calls and `_find_opencode()` for binary lookup. Parses NDJSON output via `lib/ndjson.py`.
Invokes `claude -p --output-format json` directly. Parses JSON output via `lib/claude_json.py`. Handles agent prompts by stripping YAML frontmatter from `.opencode/agents/*.md` and passing the body via `--system-prompt-file`.
The web server is managed by `lifecycle/control.py`:
256
-
-**Start**: `start_backend_service()` dispatches to `start_opencode_web()` or `_start_cloudcli_web()` based on the active backend
257
-
-**Stop**: `restart()` and `emergency_kill()` terminate both web servers (handles mid-switch state)
258
-
-**Watchdog**: `listener.py` checks the PID file every ~5 minutes and restarts if dead
259
-
-**Backend switch**: `_handle_backend_switch()` kills the old backend's web server
260
-
261
-
CloudCLI receives `WORKSPACES_ROOT` (set to `adj_dir`) and `CLAUDE_CLI_PATH` (set to the `claude` binary) as environment variables so it discovers the correct project directory and CLI binary.
248
+
Backend-native web servers are retired on both backends. Adjutant's browser UI is the `web/` app in this monorepo, started with `adjutant web` during development.
CloudCLI provides a browser-based web UI for the Claude CLI backend, equivalent to `opencode web` for the OpenCode backend. It starts automatically when the `claude-cli` backend is active.
93
-
94
-
```bash
95
-
npm install -g @siteboon/claude-code-ui
96
-
```
97
-
98
-
Verify it's installed:
99
-
100
-
```bash
101
-
cloudcli version
102
-
```
103
-
104
-
**Configuration** (optional — defaults work out of the box):
105
-
106
-
| Environment variable | Default | Description |
107
-
|---------------------|---------|-------------|
108
-
| `CLOUDCLI_PORT` | `3001` | Port for the CloudCLI web server |
109
-
| `CLOUDCLI_BIN` | auto-detected from PATH | Explicit path to the `cloudcli` binary |
110
-
111
-
Adjutant sets `WORKSPACES_ROOT` and `CLAUDE_CLI_PATH` automatically so CloudCLI sees the correct project directory and Claude binary.
112
-
113
-
### 4. Configure Adjutant
89
+
### 3. Configure Adjutant
114
90
115
91
```yaml
116
92
# adjutant.yaml
117
93
llm:
118
94
backend: "claude-cli"
119
95
```
120
96
121
-
### 5. Verify
97
+
### 4. Verify
122
98
123
99
```bash
124
100
adjutant doctor
125
101
```
126
102
127
103
The doctor command checks that the `claude` binary is on PATH, hooks are executable, and the backend is healthy.
128
104
129
-
### 6. Access the web UI
105
+
### 5. Access the web UI
130
106
131
-
After `adjutant start`, CloudCLI is available at `http://localhost:3001` (or your configured `CLOUDCLI_PORT`). Access it over VPN or local network to develop on Adjutant remotely from another device.
107
+
Use `adjutant web` to start Adjutant's own web dashboard from the monorepo checkout. Backend-native web servers are retired on both backends.
Copy file name to clipboardExpand all lines: docs/guides/commands.md
+1-2Lines changed: 1 addition & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -202,7 +202,6 @@ Dependencies:
202
202
jq OK (jq-1.7)
203
203
python3 OK (Python 3.12.0)
204
204
claude OK (/opt/homebrew/bin/claude) # or opencode, depending on llm.backend
205
-
cloudcli OK (/opt/homebrew/bin/cloudcli) # claude-cli backend only
206
205
207
206
Optional:
208
207
playwright not installed (needed for screenshot)
@@ -221,6 +220,6 @@ State:
221
220
Listener: Running (PID 12345)
222
221
```
223
222
224
-
The backend-specific binaries shown depend on `llm.backend` in `adjutant.yaml`. With `opencode`, doctor checks for the `opencode` binary. With `claude-cli`, it checks for `claude` and `cloudcli`.
223
+
The backend-specific binaries shown depend on `llm.backend` in `adjutant.yaml`. With `opencode`, doctor checks for the `opencode` binary. With `claude-cli`, it checks for `claude`.
225
224
226
225
If `adjutant doctor` reports missing dependencies or configuration, run `adjutant setup --repair` to fix them interactively.
Copy file name to clipboardExpand all lines: docs/guides/configuration.md
+3-5Lines changed: 3 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -61,6 +61,7 @@ features:
61
61
enabled: false
62
62
vision:
63
63
enabled: false
64
+
model: "cheap"# must be cheap|medium|expensive
64
65
search:
65
66
enabled: false # requires BRAVE_API_KEY in .env
66
67
usage_tracking:
@@ -171,17 +172,14 @@ The `.env` file is never `source`d directly — Adjutant uses grep-based extract
171
172
172
173
### Backend environment variables
173
174
174
-
These are optional overrides for backend binary paths and web server configuration. They're set in `.env` or your shell environment, not in `adjutant.yaml`.
175
+
These are optional overrides for backend binary paths. They're set in `.env` or your shell environment, not in `adjutant.yaml`.
175
176
176
177
| Variable | Default | Description |
177
178
|----------|---------|-------------|
178
179
| `OPENCODE_BIN` | auto-detected | Explicit path to the `opencode` binary |
179
-
| `OPENCODE_WEB_PORT` | `4096` | Port for the OpenCode web server |
180
180
| `CLAUDE_CODE_BIN` | auto-detected | Explicit path to the `claude` binary |
181
-
| `CLOUDCLI_BIN` | auto-detected | Explicit path to the `cloudcli` binary |
182
-
| `CLOUDCLI_PORT` | `3001` | Port for the CloudCLI web server (claude-cli backend) |
183
181
184
-
Adjutant auto-detects binaries from PATH. Only set these if the binary is installed in a non-standard location or you need to override the default port.
182
+
Adjutant auto-detects binaries from PATH. Only set these if the binary is installed in a non-standard location.
Copy file name to clipboardExpand all lines: docs/guides/memory.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,7 @@ Adjutant has persistent long-term memory stored as plain Markdown files. The mem
6
6
7
7
Memory is stored under `memory/` in the Adjutant directory. Each category has its own file. When you tell Adjutant to remember something, it auto-classifies the content and appends it to the right file with a timestamp.
8
8
9
-
The agent loads `memory/memory.md`(the index) at startup so it knows what's available. Individual memory files are loaded on demand when relevant to the current conversation.
9
+
The agent loads `memory/memory.md`on demand when a conversation touches past decisions, corrections, preferences, or other memory-backed topics. Individual memory files are then loaded as needed.
Copy file name to clipboardExpand all lines: docs/reference/2026-04-14-deployment-readiness.md
+8Lines changed: 8 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -202,13 +202,15 @@ working local install via the published setup or installer path.
202
202
`src/adjutant/messaging/telegram/commands.py`
203
203
-**Action:** Align public command docs to actual shipped handlers, or
204
204
implement the missing commands before release.
205
+
-**Resolved 2026-04-18:** Aligned the public command surface to the actual Telegram dispatcher and handlers. Removed stale `/models`, `/memory`, and `/news` references from `README.md` and `docs/getting-started/first-message.md`, and documented the shipped `/brief`, `/recall`, and `/digest` commands instead.
205
206
206
207
2.**Release and install story is not coherent end-to-end**
-**Action:** Pick one supported public install path and document it
210
211
consistently. If the Python installer is the intended story, wire and
211
212
publish it as such. If not, stop presenting it as part of release readiness.
213
+
-**Resolved 2026-04-18:** Promoted the installer to the canonical public path. Added a repo-root `install.py` entrypoint so a fresh clone or extracted release tarball can run `python3 install.py` directly, updated `src/adjutant/setup/install.py` to create `.venv` and install Adjutant into it before launching the wizard, and rewrote the release body plus getting-started docs to use that single flow consistently.
212
214
213
215
3.**Shell-based scheduled command execution needs hardening before public ship**
214
216
-**Files:**`src/adjutant/cli.py`,
@@ -217,11 +219,13 @@ working local install via the published setup or installer path.
217
219
-**Action:** Replace shell-string execution with argument-list execution where
218
220
possible, or constrain and validate command generation so no user- or
-**Resolved 2026-04-18:** Reworked scheduled-command resolution around structured argv. `schedule.manage.resolve_command_argv()` now parses `script:` entries safely, `schedule.install.run_now()` and `notify_wrap.py` execute argv lists instead of `shell=True`, `adjutant schedule run` now uses the shared runner, and the schedule wizard now installs jobs through the same hardened schedule API. Cron entries still use `/bin/bash -lc`, but only to execute a fully quoted command built from structured argv plus explicit env assignments, not a raw user-derived shell string.
220
223
221
224
4.**Release gate requires a clearly recorded clean full test run**
222
225
-**Files:**`tests/`, release/testing docs, backend and schedule test paths
223
226
-**Action:** Run the full suite, resolve any failures, and make a clean full
224
227
pass the explicit release gate before tagging.
228
+
-**Resolved 2026-04-18:** Ran `.venv/bin/pytest tests/ -q` and got `1428 passed, 73 skipped, 1 warning in 8.02s`. Also updated `docs/development/testing.md` to stop advertising the stale lower approximate test counts.
225
229
226
230
### P1 — degrades quality
227
231
@@ -230,22 +234,26 @@ working local install via the published setup or installer path.
230
234
`docs/guides/configuration.md`, `README.md`
231
235
-**Action:** Remove CloudCLI or opencode-web-era references and align docs to
232
236
the current `web/` architecture.
237
+
-**Resolved 2026-04-18:** Removed backend-native web-server guidance from `docs/guides/backends.md`, `docs/guides/configuration.md`, `docs/guides/troubleshooting.md`, `docs/guides/commands.md`, and `docs/development/backend-guide.md`, and replaced it with the current `adjutant web` / `web/` dashboard architecture where relevant.
233
238
234
239
2.**Unused runtime dependency likely remains**
235
240
-**Files:**`pyproject.toml`
236
241
-**Action:** Remove `rich` if it is truly unused, or add the missing usage
237
242
intentionally.
243
+
-**Resolved 2026-04-18:** Removed `rich` from `pyproject.toml` after confirming there are no runtime imports in `src/`.
-**Action:** Promote these helpers to public APIs or stop importing
243
249
underscore-prefixed functions across modules.
250
+
-**Resolved 2026-04-18:** Promoted `resolve_path()` in `schedule.manage` and `get_kb()` in `kb.run` to public helpers, then updated the importing modules to use the public names instead of underscore-prefixed internals.
244
251
245
252
4.**Exception swallowing remains high**
246
253
-**Files:** distributed across `src/`
247
254
-**Action:** Review silent-swallow and fallback-default cases, especially
248
255
around config, filesystem, and subprocess branches.
256
+
-**Status 2026-04-18:** Not addressed in this pass. The release-blocking and release-facing issues above were fixed first; broad exception-audit work remains follow-up debt rather than a blocker for the corrected deployment path.
0 commit comments