Skip to content

Commit 83a51ca

Browse files
committed
docs: version audit — fix backend capabilities, mark security doc outdated, dual-backend getting-started
- README.md, intro.md, backends.md: Claude CLI now supports vision (via Read tool injection) and model listing — update capability tables - SECURITY_ASSESSMENT.md: mark as outdated (pre-Python rewrite) - getting-started.md: document both OpenCode and Claude CLI prerequisites - backends.md: rewrite behavioral differences for accuracy - site config: add getting-started and web guide to Docusaurus - test_cli.py: update version assertion from 0.1.0 to 0.2.0 - Add docs-version-audit reference doc
1 parent 9d511f3 commit 83a51ca

9 files changed

Lines changed: 135 additions & 21 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ The setup wizard checks prerequisites, configures your LLM backend, prompts for
3535
| | OpenCode | Claude Code CLI |
3636
|---|---|---|
3737
| Auth | Anthropic API key | Claude Pro/Team/Enterprise subscription |
38-
| Vision | Yes | No |
38+
| Vision | Yes | Yes (via Read tool) |
3939
| Cost tracking | No | Yes |
40-
| Model listing | Yes | No |
40+
| Model listing | Yes | Yes |
4141
| Permission modes | N/A | skip / allowlist |
4242

4343
Switch backends by editing `adjutant.yaml`:

SECURITY_ASSESSMENT.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# Security Assessment
22

3-
**Document version**: 1.0.0
4-
**Date**: 2026-03-01
5-
**Scope**: Adjutant v1.0 — single-user personal agent, bash/macOS/Linux, OpenCode backend, Telegram interface
3+
> **OUTDATED** — This document was written against the original bash implementation (pre-0.1.0). The entire codebase was rewritten in Python as of v0.1.0 (2026-03-16). File paths, function names, and control descriptions below reference `scripts/` which no longer exist. Rate limiting (SEC-001) has been implemented. A new security assessment against the Python architecture is needed.
4+
5+
**Document version**: 1.0.0
6+
**Date**: 2026-03-01
7+
**Scope**: Adjutant pre-0.1.0 — single-user personal agent, bash/macOS/Linux, OpenCode backend, Telegram interface
68

79
---
810

docs/guides/backends.md

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@ adjutant setup
2727
### When to use OpenCode
2828

2929
- You have an Anthropic API key
30-
- You need vision/image analysis (Claude CLI does not support native image input)
31-
- You want dynamic model listing (`/models` command)
3230
- You want streaming output
31+
- You want process reaping for orphan cleanup
3332

3433
### When to use Claude Code CLI
3534

3635
- You have a Claude Pro, Team, or Enterprise subscription
37-
- You are rate-limited or blocked from the Anthropic API (e.g. Pro/Team accounts)
36+
- You prefer subscription-based billing over pay-per-token
3837
- You want per-request cost tracking (Claude CLI reports `cost_usd` in JSON output)
3938

4039
---
@@ -62,17 +61,15 @@ No data is lost. You can switch back at any time.
6261

6362
| Capability | OpenCode | Claude CLI |
6463
|-----------|----------|------------|
65-
| Vision (image analysis) | Yes | No |
66-
| Dynamic model listing | Yes | No (static list) |
64+
| Vision (image analysis) | Yes (native) | Yes (via Read tool image injection) |
65+
| Dynamic model listing | Yes | Yes |
6766
| Process reaping | Yes | No (not needed) |
6867
| Web server (remote access) | Yes (`opencode web`) | Yes (CloudCLI) |
69-
| Streaming output | Yes | No |
68+
| Streaming output | Yes | No (single-shot JSON) |
7069
| Cost tracking per request | No | Yes |
7170
| Session resume | Yes (`--session`) | Yes (`--resume`) |
7271

73-
If you use a feature that the current backend doesn't support, Adjutant tells you clearly rather than failing silently. For example, sending an image with Claude CLI returns:
74-
75-
> Vision (image analysis) is not supported on the Claude CLI backend. Switch to the opencode backend for image analysis.
72+
If you use a feature that the current backend doesn't support, Adjutant tells you clearly rather than failing silently.
7673

7774
---
7875

@@ -195,8 +192,8 @@ See `docs/development/backend-guide.md` for the implementation pattern for KB-in
195192

196193
## Known behavioral differences
197194

198-
- **Response style**: Claude CLI responses may feel different from OpenCode responses because OpenCode uses streaming (model sees partial output) while Claude CLI uses single-shot mode.
199-
- **Vision**: Only available on OpenCode. Claude CLI returns `vision_unsupported` error.
195+
- **Response style**: Claude CLI responses may feel different from OpenCode responses because OpenCode uses streaming output while Claude CLI uses single-shot JSON mode. This affects Telegram delivery — OpenCode responses can arrive incrementally, Claude CLI delivers the full response at once.
196+
- **Vision**: OpenCode passes images natively. Claude CLI uses Read tool image injection (the image is read into the prompt context). Both work, but the mechanisms differ.
200197
- **Model names**: OpenCode uses full IDs (`anthropic/claude-sonnet-4-6`), Claude CLI uses short names (`sonnet`). Adjutant translates automatically.
201198
- **Cost tracking**: Only Claude CLI reports `cost_usd`. OpenCode responses have no cost field.
202199
- **Process cleanup**: OpenCode spawns `bash-language-server` child processes that need reaping. Claude CLI does not have this issue.

docs/guides/getting-started.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@ Before installing, make sure you have:
1212

1313
- **macOS or Linux**
1414
- **Python 3.11+**`python3 --version` to check
15-
- **[opencode](https://opencode.ai)** — the AI runtime Adjutant uses for reasoning
15+
- **An LLM backend** — either [OpenCode](https://opencode.ai) or [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code)
1616
- **curl** (installed on every macOS/Linux system by default)
1717

18-
Check opencode is working:
18+
Check your backend is working:
1919

2020
```bash
21+
# OpenCode
2122
opencode --version
23+
24+
# Or Claude Code CLI
25+
claude --version
2226
```
2327

2428
---

docs/intro.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ Adjutant supports two LLM backends, switchable via configuration:
2323

2424
| | OpenCode | Claude Code CLI |
2525
|---|---|---|
26-
| Vision/images | Yes | No |
27-
| Model listing | Yes | No |
26+
| Vision/images | Yes | Yes (via Read tool) |
27+
| Model listing | Yes | Yes |
2828
| Cost tracking | No | Yes |
2929
| Process reaping | Yes | No |
3030
| Permission modes | N/A | skip / allowlist |
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# Documentation & Version Audit — 2026-04-06
2+
3+
Comprehensive audit of all documentation files, version numbers, and cross-references in the Adjutant monorepo. Performed against commit `e877238` (main).
4+
5+
---
6+
7+
## VERSION MISMATCHES
8+
9+
### 1. Test asserts wrong version — `tests/unit/test_cli.py:44`
10+
- Asserted `"0.1.0"` but `VERSION` file says `0.2.0`
11+
- **Status:** FIXED — updated assertion to `"0.2.0"`
12+
13+
### 2. CHANGELOG doesn't document 0.2.0
14+
- `CHANGELOG.md:10` said `[Unreleased] — Post-0.1.0 Hardening` but `VERSION` is already `0.2.0`
15+
- **Status:** FIXED — changed header to `[0.2.0] — Unreleased — Post-0.1.0 Hardening`
16+
17+
### 3. `web/api/package.json` version is `1.0.0`
18+
- `web/app/package.json` is `0.0.0` (placeholder), `site/package.json` is `0.0.0`
19+
- The API was arbitrarily `1.0.0`
20+
- **Status:** FIXED — changed to `0.0.0` for consistency with other workspaces
21+
22+
---
23+
24+
## DOCS vs CODE CONTRADICTIONS
25+
26+
### 4. Vision on Claude CLI — docs said "No", code says `True`
27+
- `backend_claude_cli.py:119` sets `vision=True`
28+
- Commit `2432d92` explicitly enabled this: "feat: enable vision on claude-cli backend via Read tool image injection"
29+
- **Status:** FIXED — updated capability tables in `README.md`, `docs/intro.md`, `docs/guides/backends.md`. Removed stale "vision unsupported" error message example. Updated "when to use" sections and known behavioral differences.
30+
31+
### 5. Model listing on Claude CLI — docs said "No", code says `True`
32+
- `backend_claude_cli.py:120` sets `model_listing=True`
33+
- **Status:** FIXED — updated capability tables in `README.md`, `docs/intro.md`, `docs/guides/backends.md`
34+
35+
### 6. `adjutant doctor` output example was stale — `docs/guides/commands.md`
36+
- Showed sample output listing only `opencode`
37+
- Actual code checks backend-specific binary (`opencode` OR `claude`/`cloudcli`)
38+
- **Status:** FIXED — updated sample output to show `claude`/`cloudcli` with comment explaining backend dependency. Added explanatory paragraph.
39+
40+
### 7. `https://localhost:3021``docs/guides/web.md:13`
41+
- Initially flagged as wrong (assumed Vite serves HTTP), but HTTPS is correct for this project.
42+
- **Status:** NOT A BUG — reverted change, `https://` is correct
43+
44+
### 8. `SECURITY_ASSESSMENT.md` references bash-era architecture
45+
- The entire document (dated 2026-03-01) references the old bash implementation:
46+
- Line 5: "Adjutant v1.0 — single-user personal agent, bash/macOS/Linux"
47+
- References `scripts/messaging/adaptor.sh`, `scripts/common/env.sh`, `scripts/common/logging.sh`, `scripts/common/opencode.sh`
48+
- "Rate Limiting — **Not yet implemented**" — but rate limiting IS implemented in the Python rewrite
49+
- **Status:** FIXED — added deprecation banner at top of file noting the document is outdated and a new assessment against the Python architecture is needed. Changed scope line to "pre-0.1.0".
50+
51+
### 9. `docs/guides/getting-started.md` — only mentioned OpenCode backend
52+
- Lines 15-21: prerequisites only listed `opencode`, showed `opencode --version`
53+
- `docs/getting-started/installation.md` (the Docusaurus version) correctly mentions both backends
54+
- **Status:** FIXED — updated prerequisites to mention both backends with dual code examples, matching `installation.md`
55+
56+
---
57+
58+
## STRUCTURAL ISSUES
59+
60+
### 10. `guides/web.md` was not in the Docusaurus sidebar
61+
- `site/sidebars.ts` listed 10 guides — `web` was missing
62+
- **Status:** FIXED — added `'guides/web'` to sidebar between `news` and `troubleshooting`
63+
64+
### 11. Duplicate getting-started content
65+
- `docs/guides/getting-started.md` — comprehensive guide (182 lines)
66+
- `docs/getting-started/installation.md` + `telegram-setup.md` + `setup-wizard.md` + `first-message.md` — same content split into 4 pages
67+
- The `guides/` version had the stale plist example; neither is excluded from Docusaurus
68+
- **Status:** FIXED — added `guides/getting-started.md` to Docusaurus exclude list in `site/docusaurus.config.ts`. The file is kept for local readers (linked from `docs/README.md`) but no longer published to the docs site, avoiding a competing page. The canonical Docusaurus path is the 4-page split under `getting-started/`.
69+
70+
### 12. `CHANGELOG.md:146` referenced "adjutant-docs" as separate repo
71+
- "Docusaurus documentation site (`adjutant-docs`)" — but after the monorepo consolidation, the docs site lives at `site/`
72+
- **Status:** FIXED — changed to `site/`
73+
74+
### 13. `docs/guides/lifecycle.md:183` claimed `doctor` checks `jq` dependency
75+
- Said: "Checks that all required tools are installed (`bash`, `curl`, `jq`, `python3`, `opencode`)"
76+
- `jq` is not a real runtime dependency of the Python rewrite. Doctor does check it, but nothing uses it.
77+
- **Status:** FIXED — updated text to say "bash, curl, python3, and your configured LLM backend binary". Note: `jq` is still checked by doctor in code (`cli.py:781`) — that's a separate code cleanup item.
78+
79+
---
80+
81+
## AMBIGUITIES / UNCLEARNESS
82+
83+
### 14. LaunchAgent plist name inconsistency
84+
- `docs/guides/getting-started.md:128` uses label `com.adjutant.telegram`
85+
- `docs/guides/lifecycle.md` used filename `adjutant.telegram.plist`
86+
- The wizard (`src/adjutant/setup/steps/service.py:177`) generates `com.adjutant.telegram.plist`
87+
- **Status:** FIXED — updated lifecycle.md to use `com.adjutant.telegram.plist` (matching wizard output)
88+
89+
### 15. `docs/guides/web.md` — port env var clarity
90+
- Line 207: "API port configurable via `--port` flag or `ADJUTANT_WEB_PORT`"
91+
- Verified: `web/api/src/config.ts:5` reads `process.env.ADJUTANT_WEB_PORT`, and `src/adjutant/cli.py:622` passes the `--port` value as `ADJUTANT_WEB_PORT` to the API subprocess.
92+
- **Status:** NOT A BUG — documentation is correct
93+
94+
### 16. `docs/guides/backends.md` — streaming mentioned without context
95+
- Table row: `| Streaming output | Yes | No |`
96+
- **Status:** FIXED — added `(single-shot JSON)` clarification to table, and expanded the "Response style" behavioral difference paragraph to explain how streaming affects Telegram delivery.
97+
98+
---
99+
100+
## SUMMARY
101+
102+
| Priority | Total | Fixed | Not a bug |
103+
|----------|-------|-------|-----------|
104+
| P0 (wrong) | 5 | 5 | 0 |
105+
| P1 (misleading) | 5 | 4 | 1 (#7) |
106+
| P2 (cleanup) | 6 | 5 | 1 (#15) |
107+
| **Total** | **16** | **14** | **2** |
108+
109+
All items resolved.

site/docusaurus.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const config: Config = {
3636
'web/**',
3737
'plans/**',
3838
'README.md',
39+
'guides/getting-started.md',
3940
],
4041
},
4142
blog: false,

site/sidebars.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const sidebars: SidebarsConfig = {
2727
'guides/lifecycle',
2828
'guides/memory',
2929
'guides/news',
30+
'guides/web',
3031
'guides/troubleshooting',
3132
],
3233
},

tests/unit/test_cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class TestVersionAndHelp:
4141
def test_version(self, runner: CliRunner) -> None:
4242
result = runner.invoke(main, ["--version"])
4343
assert result.exit_code == 0
44-
assert "0.1.0" in result.output
44+
assert "0.2.0" in result.output
4545

4646
def test_help(self, runner: CliRunner) -> None:
4747
result = runner.invoke(main, ["--help"])

0 commit comments

Comments
 (0)