From 2e29e03a8efc9efe864fc35a4a54d92fb7c5f034 Mon Sep 17 00:00:00 2001 From: mika kuns Date: Fri, 2 Oct 2026 14:34:34 +0200 Subject: [PATCH] docs(ssh): document ssh workspace sessions --- docs/explore-notes/conpty-sessions.md | 3 ++- docs/open.md | 8 ++++++++ src/ClaudeDo.Worker/CLAUDE.md | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/explore-notes/conpty-sessions.md b/docs/explore-notes/conpty-sessions.md index b64a8dd0..8240c2b6 100644 --- a/docs/explore-notes/conpty-sessions.md +++ b/docs/explore-notes/conpty-sessions.md @@ -11,7 +11,7 @@ process hosts (real `claude` TUI in a Mission Control tile). Autonomous queue tasks are **not** covered here — they stay on the stream-json path via `TaskRunner`. See [worker-task-pipeline.md](worker-task-pipeline.md). -## The four session kinds +## The five session kinds | Kind | Hub spec method | Notes | |---|---|---| @@ -19,6 +19,7 @@ Autonomous queue tasks are **not** covered here — they stay on the stream-json | Ad-hoc | `GetAdHocLaunchSpec` | No `--effort` — CLI default | | Planning | (planning start/resume) | No `--effort`; uses `--permission-mode default`, **not** `plan` | | List handler | `GetMergeHelperLaunchSpec` / `GetMergeHelperHandoffLaunchSpec` | Model + effort fixed per role (`ModelRegistry.HandlerTriageAlias`/`HandlerWaitAlias`/`HandlerMergeAlias`), **not** from list config; `--permission-mode` via `PermissionModeResolver` (unattended) | +| SSH workspace | `GetSshLaunchSpec` | Exe is `ssh.exe`, not claude: `-R :127.0.0.1:` + one remote shell command that base64-decodes a `claudedo` MCP config (per-session token) to `~/.claudedo/mcp-.json` and runs claude. **Not** recorded in `mission_control_sessions`, no `claudedo_pane`/handoff hint. Workspaces: `app_settings.ssh_workspaces`, Settings → SSH-Workspaces | ## ⚠️ Gotcha: never pass task free-text as a CLI argument diff --git a/docs/open.md b/docs/open.md index 54528851..27f504f0 100644 --- a/docs/open.md +++ b/docs/open.md @@ -302,6 +302,14 @@ Weitere Punkte, gebaut + unit-getestet auf `main`, aber **nicht visuell verifizi `ClaudeProcess`/`ClaudeCliPreflight` den Shim über `cmd.exe /c` tatsächlich startet, nicht nur, dass der Check ihn findet). +## Offene Verifikation (2026-10-02, SSH-Workspaces) + +- [ ] Sichtprüfung Settings → SSH-Workspaces: Reiter wählt richtig, Zeilen-Layout, Host-Vorschläge aus `~/.ssh/config`, Papierkorb-Hover, Fehlermeldung bei ungültiger Zeile. +- [ ] VPS-Eintrag im Quick-Session-Menü startet eine Kachel; ssh-Prompts (Host-Key, Passphrase) erscheinen in der Kachel. +- [ ] In der Remote-Session zeigt `/mcp` `claudedo` verbunden, `list_task_lists` funktioniert. +- [ ] Kachel schließen baut den Tunnel ab (Port auf der VPS frei), zwei parallele Kacheln auf denselben Host gehen. +- [ ] Worker nach Update neu starten — erst dann lauscht der Remote-Listener auf 47823. + --- ## Bewusst verworfen (nicht erneut vorschlagen) diff --git a/src/ClaudeDo.Worker/CLAUDE.md b/src/ClaudeDo.Worker/CLAUDE.md index 5263ce29..134911b2 100644 --- a/src/ClaudeDo.Worker/CLAUDE.md +++ b/src/ClaudeDo.Worker/CLAUDE.md @@ -276,6 +276,9 @@ non-obvious, behaviour-changing. A fixed bug is git history, not a finding. - `worktree_root_strategy` (`sibling` | `central`), `central_worktree_root` - `queue_backstop_interval_ms` (30000) — also the gate/throttle recovery timer - `company_remote_pattern` (`/_git/`) — Teilstring der origin-URL, an dem `CompanyRepo` ein Firmen-Repo erkennt; nur per Hand editierbar. Schaltet Fetch vor dem Unit-Root, Approve = Push + Draft-PR und Commits ohne Trailer (siehe Azure DevOps). +- `remote_mcp_port` (47823, 0 = SSH sessions off) — second loopback listener of the external MCP app that SSH + tiles reverse-tunnel to. `ExternalMcpAuthMiddleware` accepts **only** a `RemoteSessionTokenRegistry` token + (`X-ClaudeDo-Remote-Token`) there — never loopback trust or the API key, since tunnelled traffic is loopback too. - `signalr_port` (47821), `claude_bin`, `ticket_api_base_url` — the two UI-writable fields (`claude_bin`: Settings → Dateien → CLAUDE CLI, hub `GetClaudeBin`/`SetClaudeBin`; `ticket_api_base_url`: Settings → Externe Dienste, hub `GetTicketSettings`/`SetTicketApiBaseUrl`).