assist v0.286
Reaching Windows sessions and reshaping the PR commands
The bigger half of today went into reaching sessions that live on the Windows side of a WSL split. The daemon can now proxy Windows sessions over TCP — the WSL daemon talks to its Windows-host counterpart on a known port (windowsDaemonPort) instead of assuming everything runs locally — and a companion change lets it discover those Windows-origin sessions so they show up in the dashboard alongside the Linux ones. It’s the groundwork for treating a two-host setup as a single pool of sessions rather than two disconnected worlds.
The other big piece was reshaping the PR commands. assist prs create became assist prs raise, and a new assist prs edit lets me rewrite an existing PR’s title and body — both built on shared helpers (buildPrBody, parsePrBody, editPrBody) so raising and editing produce the same well-formed output. To make the wrapper stick, I added a built-in cli-hook deny for gh pr edit (mirroring the existing gh pr create deny), so edits go through the validated assist path instead of raw gh. Alongside it, a new /prs-slack slash command posts a PR’s title and URL to a configured Slack channel — it reads the channel from prs.slack, refuses to post if that’s unset, and confirms the exact message before sending via the MCP Slack tools.
A few smaller things rounded out the day. I hardened the cli-hook to fail closed when a deny is buried in a compound command rather than letting it slip through, fixed starting a session with an empty prompt, and refactored the news feeds out of their own standalone web app and into the sessions web UI and database — folding fetchFeeds, parseFeed, groupByDate and friends under sessions/web/ui/news so there’s one web server and one data store instead of two.