Skip to content

Commit 51c1015

Browse files
author
Paul Kyle
committed
release: sync public v0.8.6
1 parent d979243 commit 51c1015

9 files changed

Lines changed: 309 additions & 68 deletions

File tree

PROGRAM.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ What's stuck and why. (Clear this when resolved.)
188188
## Key Decisions
189189
Link to decision files or inline summaries of major architectural/creative choices.
190190
- [decision/langgraph-adoption] — why LangGraph
191-
- [decision/port-dont-rewrite] — ADR-070
191+
- [decision/port-dont-rewrite] — why the port changed
192192

193193
## Lessons Learned
194194
Things this project has taught us. (Fed by consolidation from insights.)

docs/CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@ All notable changes to Palinode. Format follows [Keep a Changelog](https://keepa
44

55
## Unreleased
66

7-
## [0.8.5] — 2026-04-28
7+
## [0.8.6] — 2026-04-29
88

99
### Added
1010

11+
- `pyproject.toml` bumped to **v0.8.6** and `[tool.setuptools] packages` list corrected: `palinode.diagnostics`, `palinode.diagnostics.checks`, `palinode.import_`, and `palinode.lint` were missing and would have been silently omitted from the wheel. All declared packages now match on-disk layout.
12+
- `palinode mcp-config --diagnose` now covers **Roo Cline** (`rooveterinaryinc.roo-cline`) in addition to the original Cline extension. Roo Cline uses a different extension ID and settings filename (`mcp_settings.json` instead of `cline_mcp_settings.json`).
13+
- `docs/MCP-INSTALL-RECIPES.md` — new **JetBrains AI Assistant** section (section 6): stdio and HTTP snippets, settings UI path, Settings Sync note, troubleshooting table. Covers IntelliJ IDEA, PyCharm, WebStorm, GoLand, Rider, CLion, DataGrip, RubyMine.
14+
- `docs/MCP-INSTALL-RECIPES.md` — transport quick reference expanded into a "which transport?" decision block with use-when guidance.
15+
- `docs/MCP-CONFIG-HOMES.md` — JetBrains section added (UI-first, version-specific path caveat) and Roo Cline paths added. Closes public #24.
1116
- `tests/integration/test_mcp_e2e.py` — E2E test suite for the MCP client flow: exercises every major MCP tool (search, save, session_end, status, read, history, doctor, list) via in-process FastAPI dispatch with no Ollama required (#122).
1217
- `tests/integration/test_security.py` — Security test suite covering OWASP top-10: path traversal, null bytes, symlink escape, SQL injection, SSRF, CORS enforcement, rate limiting, request size limit, no stack traces, YAML injection, CRLF header injection, and XSS/script injection (#123).
1318
- `palinode_cluster_neighbors` / `palinode cluster-neighbors` / `POST /cluster-neighbors` — given a memory file path, returns the top-K semantically related files that are NOT already wikilinked to or from it; surfaces implicit relationships for the LLM to propose new cross-links (#235).
@@ -42,6 +47,7 @@ All notable changes to Palinode. Format follows [Keep a Changelog](https://keepa
4247

4348
### Fixed
4449

50+
- `palinode init` HOOK_SCRIPT (the scaffolded SessionEnd hook) now uses `jq -s` slurp extraction for both MSG_COUNT and FIRST_PROMPT, eliminating the SIGPIPE class entirely. #257 fixed the same bug pattern in `examples/hooks/palinode-session-end.sh` but the scaffolded version in `palinode/cli/init.py` was missed; #267 closes that gap so `palinode init` produces a non-buggy hook on fresh installs.
4551
- Default `audit.log_path` is now resolved to an absolute path under `memory_dir` at config load time, eliminating the spurious `audit_log_writable` doctor warning on every fresh install (#254).
4652
- `mcp_config_homes` doctor check no longer reports a misleading "run \`palinode init\`" message when palinode is running over SSH stdio — detects `SSH_CONNECTION` and returns an informational result explaining the remote context (#255).
4753
- `0.0.0.0` binding warning is now suppressed when `PALINODE_API_BIND_INTENT=public` is set, allowing intentional network-exposed deployments (e.g., Tailscale) to start quietly. The systemd API service template sets this by default (#253).

docs/MCP-CONFIG-HOMES.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ JSON shape: `{ "mcpServers": { "palinode": { ... } } }` — same as Claude Deskt
8282
| Linux | `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` |
8383
| Windows | `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json` |
8484

85+
### Roo Cline (VS Code extension — fork of Cline)
86+
87+
Roo Cline uses a different extension ID (`rooveterinaryinc.roo-cline`) and a different settings filename (`mcp_settings.json`). Same JSON shape as Cline.
88+
89+
| Platform | Path |
90+
|----------|------|
91+
| macOS | `~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json` |
92+
| Linux | `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json` |
93+
| Windows | `%APPDATA%\Code\User\globalStorage\rooveterinaryinc.roo-cline\settings\mcp_settings.json` |
94+
8595
### Zed
8696

8797
Zed stores MCP servers under the `context_servers` key in its settings file — **not** `mcpServers`.
@@ -93,6 +103,23 @@ JSON shape: `{ "context_servers": { "palinode": { ... } } }`.
93103
| macOS (older builds fallback) | `~/Library/Application Support/Zed/settings.json` |
94104
| Linux | `~/.config/zed/settings.json` |
95105

106+
### JetBrains IDEs (AI Assistant)
107+
108+
JetBrains does not use a hand-edited file with a fixed path. MCP servers are
109+
configured via the IDE settings UI:
110+
111+
**Settings → Tools → AI Assistant → Model Context Protocol (MCP)**
112+
113+
The underlying config directory varies by product and version
114+
(`~/Library/Application Support/JetBrains/<Product><Version>/` on macOS,
115+
`~/.config/JetBrains/<Product><Version>/` on Linux). Use the settings panel
116+
rather than editing the directory directly. `palinode mcp-config --diagnose`
117+
does not cover JetBrains for this reason — verify the connection status in
118+
the IDE's MCP settings panel instead.
119+
120+
Available in IntelliJ IDEA, PyCharm, WebStorm, GoLand, Rider, CLion, DataGrip,
121+
and RubyMine. Requires AI Assistant 2025.1+ (bundled in 2025.2).
122+
96123
### Other clients
97124

98125
| Client | Config path |

docs/MCP-INSTALL-RECIPES.md

Lines changed: 180 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,29 @@ reports which ones contain a `palinode` entry. See
1515

1616
---
1717

18-
## Transport quick reference
18+
## Which transport should I use?
1919

20-
| Transport | Best for | Key field |
21-
|-----------|----------|-----------|
22-
| **stdio** | Palinode installed on the same machine as the IDE | `"command": "palinode-mcp"` |
23-
| **Streamable HTTP** | Palinode on a remote server, or any IDE that supports it | `"url": "http://host:6341/mcp/"` |
20+
| Transport | Config field | Use when |
21+
|-----------|-------------|----------|
22+
| **stdio** | `"command": "palinode-mcp"` | Palinode is installed on the **same machine** as the IDE |
23+
| **Streamable HTTP** | `"url": "http://host:6341/mcp/"` | Palinode runs on a **remote server** (homelab, VPS, dev box), or when multiple IDEs or team members share one instance |
2424

25-
For remote HTTP setups, start `palinode-mcp-sse` *(serves streamable-HTTP at
26-
`/mcp/` — name is historical)* on the server before configuring the client.
27-
Clients should use `"type": "http"` (not `"type": "sse"`) and always include
28-
the trailing slash: `"url": "http://host:6341/mcp/"`. For stdio, `palinode-mcp`
29-
must be on PATH (`which palinode-mcp`).
25+
**Use stdio if:**
26+
- You ran `pip install palinode` on your laptop and want a single-user local setup.
27+
- `which palinode-mcp` prints a path.
28+
29+
**Use HTTP if:**
30+
- Palinode lives on a separate machine and you connect over a network.
31+
- Multiple IDEs or team members should share the same memory store.
32+
- You want to switch IDEs without re-configuring the server.
33+
34+
For HTTP setups, start `palinode-mcp-sse` on the server first (despite the
35+
name, it serves Streamable HTTP at `/mcp/`). Always include the trailing slash
36+
in the URL. Confirm the server is reachable before editing the IDE config:
37+
38+
```bash
39+
curl http://your-server:6341/mcp/
40+
```
3041

3142
---
3243

@@ -266,29 +277,52 @@ palinode mcp-config --diagnose
266277

267278
---
268279

269-
## 4. Cline (VS Code)
280+
## 4. Cline / Roo Cline (VS Code)
281+
282+
**Cline docs:** [docs.cline.bot/mcp/configuring-mcp-servers](https://docs.cline.bot/mcp/configuring-mcp-servers)
270283

271-
**Docs verified:** [docs.cline.bot/mcp/configuring-mcp-servers](https://docs.cline.bot/mcp/configuring-mcp-servers)
284+
Both Cline and its fork **Roo Cline** use the same `mcpServers` JSON shape.
285+
They differ only in extension ID, config file path, and filename — pick the
286+
table row that matches the extension you have installed.
272287

273-
Cline stores MCP server config in a per-extension settings file whose path
274-
varies by platform:
288+
> **Which extension do you have?** In VS Code, open the Extensions sidebar
289+
> (`Cmd+Shift+X` / `Ctrl+Shift+X`) and search "cline". The publisher field
290+
> confirms the fork: **saoudrizwan** = Cline, **RooVeterinaryInc** = Roo Cline.
291+
292+
### Config file paths
293+
294+
**Cline** (`saoudrizwan.claude-dev`) — file: `cline_mcp_settings.json`
275295

276296
| Platform | Path |
277297
|----------|------|
278298
| macOS | `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` |
279299
| Linux | `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` |
280300
| Windows | `%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json` |
281301

282-
The easiest way to open the file is from within VS Code:
302+
**Roo Cline** (`rooveterinaryinc.roo-cline`) — file: `mcp_settings.json`
303+
304+
| Platform | Path |
305+
|----------|------|
306+
| macOS | `~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json` |
307+
| Linux | `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json` |
308+
| Windows | `%APPDATA%\Code\User\globalStorage\rooveterinaryinc.roo-cline\settings\mcp_settings.json` |
283309

284-
1. Open the Cline sidebar.
285-
2. Click the **MCP Servers** icon (plug icon) in Cline's top navigation bar.
310+
The easiest way to open the file without navigating manually:
311+
312+
1. Click the extension's icon in the VS Code Activity Bar to open its sidebar.
313+
2. Click the **MCP Servers** icon (plug icon) in the top navigation bar.
286314
3. Select the **Installed** tab.
287-
4. Click **Configure MCP Servers** — this opens `cline_mcp_settings.json`
315+
4. Click **Configure MCP Servers** — this opens the correct settings file
288316
directly in the editor.
289317

318+
> **Note:** the settings file does not exist until you open the MCP settings
319+
> panel at least once. Use the UI path above to let the extension create it
320+
> before editing.
321+
290322
### stdio (local install)
291323

324+
Use this when Palinode is installed on the same machine as VS Code.
325+
292326
```json
293327
{
294328
"mcpServers": {
@@ -307,9 +341,9 @@ The easiest way to open the file is from within VS Code:
307341

308342
### HTTP (remote server)
309343

310-
Cline uses `"url"` for remote MCP endpoints. `palinode-mcp-sse` serves
311-
streamable-HTTP at `/mcp/` (the binary name is historical). Always include
312-
the trailing slash in the URL:
344+
Use this when Palinode runs on a separate machine. Both forks use `"url"` for
345+
the HTTP endpoint. `palinode-mcp-sse` serves streamable-HTTP at `/mcp/` (the
346+
binary name is historical). Always include the trailing slash:
313347

314348
```json
315349
{
@@ -323,42 +357,76 @@ the trailing slash in the URL:
323357
}
324358
```
325359

360+
Replace `your-server` with your server's hostname or IP (`localhost` for a
361+
local HTTP server, or a stable hostname / IP for remote). Confirm the MCP
362+
server is reachable before configuring the client:
363+
364+
```bash
365+
curl http://your-server:6341/mcp/
366+
```
367+
326368
### Restart sequence
327369

328-
Cline picks up config changes without a VS Code restart. After saving
329-
`cline_mcp_settings.json`:
370+
Both forks pick up config changes without a VS Code restart:
330371

331-
1. Return to the Cline sidebar → MCP Servers tab.
332-
2. The `palinode` entry should appear. If it shows an error badge, click
372+
1. Save the settings file.
373+
2. Return to the extension sidebar → **MCP Servers** tab.
374+
3. The `palinode` entry should appear. If it shows an error badge, click
333375
**Restart Server**.
334-
3. No full VS Code restart is needed.
376+
4. No full VS Code restart is needed.
335377

336378
### Verification
337379

338380
```bash
339381
palinode mcp-config --diagnose
340382
```
341383

342-
The diagnose command does not currently know Cline's globalStorage path; it
343-
will not report this file. Instead, verify directly in the Cline sidebar —
344-
the server should show as connected (green) and the tool list should expand
345-
to show all palinode tools.
384+
The diagnose command knows both Cline and Roo Cline paths — it will report
385+
whichever file is present. Also verify in the sidebar: the server should show
386+
as connected (green) and the tool list should expand to show all palinode tools.
346387

347-
Then in a Cline conversation:
388+
Then in a conversation with the extension:
348389

349390
```
350391
Use palinode_status to check memory health
351392
```
352393

394+
### Reducing approval prompts
395+
396+
Both forks prompt for approval on every MCP tool call by default. To
397+
pre-approve the tools you use most often, add their names to `alwaysAllow`:
398+
399+
```json
400+
{
401+
"mcpServers": {
402+
"palinode": {
403+
"url": "http://your-server:6341/mcp/",
404+
"disabled": false,
405+
"alwaysAllow": [
406+
"palinode_search",
407+
"palinode_save",
408+
"palinode_status",
409+
"palinode_read",
410+
"palinode_list",
411+
"palinode_history"
412+
]
413+
}
414+
}
415+
}
416+
```
417+
418+
See [MCP-SETUP.md](MCP-SETUP.md) for the full tool list.
419+
353420
### Troubleshooting
354421

355422
| Symptom | Fix |
356423
|---------|-----|
357-
| Server shows error badge immediately | `palinode-mcp` not found on PATH. Set `"command"` to the absolute path: open a VS Code terminal, activate your palinode venv, run `which palinode-mcp` |
358-
| `cline_mcp_settings.json` not found | The file does not exist until you open Cline's MCP settings at least once. Use the UI path above to let Cline create it |
359-
| Tools appear but all fail | Palinode API not running. Run `curl http://127.0.0.1:6340/status` from a terminal |
360-
| HTTP: `url` field ignored | Confirm the key is lowercase `"url"` — Cline does not accept `serverUrl` |
361-
| `alwaysAllow` prompts every tool call | Add the tool names to the `alwaysAllow` array: `["palinode_search", "palinode_save", "palinode_status"]` |
424+
| Server shows error badge immediately | `palinode-mcp` not found on PATH. Open a VS Code terminal, activate your palinode venv, run `which palinode-mcp` — use that absolute path as `"command"` |
425+
| Settings file not found | Open the MCP settings panel from the extension UI (step 4 above) to let the extension create it, then edit |
426+
| Tools appear but all fail | Palinode API not running. `curl http://127.0.0.1:6340/status` should return JSON |
427+
| HTTP: `url` field ignored | Confirm the key is lowercase `"url"` — neither fork accepts `serverUrl` |
428+
| HTTP: cannot connect to remote | Confirm `palinode-mcp-sse` is running on the server: `curl http://your-server:6341/mcp/` |
429+
| Wrong file edited — change had no effect | Run `palinode mcp-config --diagnose` to see which file your installed extension reads |
362430

363431
---
364432

@@ -455,9 +523,84 @@ Use palinode_status to check memory health
455523

456524
---
457525

526+
## 6. JetBrains IDEs (AI Assistant)
527+
528+
**Docs:** [jetbrains.com/help/ai-assistant/configure-an-mcp-server.html](https://www.jetbrains.com/help/ai-assistant/configure-an-mcp-server.html)
529+
530+
The MCP client is built into the **AI Assistant** plugin, available in
531+
IntelliJ IDEA, PyCharm, WebStorm, GoLand, Rider, CLion, DataGrip, and
532+
RubyMine. It is bundled in 2025.2+; for 2025.1 install the AI Assistant
533+
plugin from the marketplace.
534+
535+
> **JetBrains is UI-first.** MCP servers are configured via the IDE settings
536+
> panel, not a hand-edited file. The underlying config directory varies by
537+
> product and version — use the UI path below rather than editing files
538+
> directly.
539+
540+
### Add via settings UI
541+
542+
1. Open **Settings** (`Cmd+,` on macOS / `Ctrl+Alt+S` on Windows/Linux).
543+
2. Navigate to **Tools → AI Assistant → Model Context Protocol (MCP)**.
544+
3. Click **+** (Add) and choose **As JSON**.
545+
4. Paste the appropriate snippet below.
546+
5. Click **Apply** — this starts the server immediately. No restart needed.
547+
548+
> **Settings Sync:** If you use JetBrains Settings Sync, the MCP config
549+
> propagates automatically to all your other JetBrains IDEs.
550+
551+
### stdio (local install)
552+
553+
```json
554+
{
555+
"mcpServers": {
556+
"palinode": {
557+
"command": "palinode-mcp",
558+
"args": [],
559+
"env": {
560+
"PALINODE_API_HOST": "127.0.0.1",
561+
"PALINODE_API_PORT": "6340"
562+
}
563+
}
564+
}
565+
}
566+
```
567+
568+
### HTTP (remote server)
569+
570+
```json
571+
{
572+
"mcpServers": {
573+
"palinode": {
574+
"url": "http://your-server:6341/mcp/"
575+
}
576+
}
577+
}
578+
```
579+
580+
### Verification
581+
582+
After clicking Apply, open the AI Assistant chat panel. In Agent mode, the
583+
tool list should include all palinode tools. Then run:
584+
585+
```
586+
Use palinode_status to check memory health
587+
```
588+
589+
### Troubleshooting
590+
591+
| Symptom | Fix |
592+
|---------|-----|
593+
| Server entry saves but tools never appear | Re-open **Settings → Tools → AI Assistant → MCP** and confirm the entry is enabled |
594+
| stdio server fails immediately | Replace `"command": "palinode-mcp"` with the absolute path returned by `which palinode-mcp` in the same shell environment the IDE inherits |
595+
| HTTP server fails immediately | Confirm the server is reachable first: `curl http://your-server:6341/mcp/` |
596+
| Config seems to disappear across IDEs | Check whether JetBrains Settings Sync is enabled and overwriting the MCP entry from another machine |
597+
| Unsure where the config lives on disk | Use the settings UI; the path is product- and version-specific, which is why `palinode mcp-config --diagnose` does not try to manage it |
598+
599+
---
600+
458601
## Environment variable reference
459602

460-
All five clients above can pass env vars to the stdio `palinode-mcp` process.
603+
All six clients above can pass env vars to the stdio `palinode-mcp` process.
461604
The full variable set:
462605

463606
| Variable | Default | Purpose |

0 commit comments

Comments
 (0)