Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,30 @@ All notable changes to shelldeck are listed here. The format follows [Keep a Cha

## [Unreleased]

## [0.0.15] - 2026-11-12

### Added

- Workspaces: group projects under a name and show one group at a time with the picker in the *Projects* header; *Move to workspace…* in a project's menu sets it.
- VS Code `.code-workspace` files show up in the folder browser; adding one makes each local folder in it a project, in a workspace named after the file.
- Hand-offs on the AI agents page are a flow of cards: each sender, then the tasks it gave out on connecting lines, with chains (an agent passing part of its task on) nested to the right. A card opens the whole task and result.
- *Hand off a task…* in a running agent's Actions menu, and *Cancel hand-off* on an open one (the agent is told to stop, the sender is told).
- Hand-offs and how they ended are recorded in the project's context: `sd context` and the Context page's activity show them, and the Context page lists the project's open hand-offs.
- `sd open X.code-workspace` (or `sd X.code-workspace`) imports a VS Code workspace file.

### Changed

- The Context page follows the sidebar's machine and workspace, opens on the project of the terminal you were in, tells apart projects with the same name, and has a refresh button.
- Hand-offs on the AI agents page follow the picked machine and workspace.
- The AI agents page is four tabs (Running, Hand-offs, Launch, Setup) instead of one long page; agent cards are a model picker and Launch, and agents that aren't installed fold away.
- The Context page is quieter: the side column is one card, *Add* opens a field instead of an input under every list, and it shows only hand-offs still in progress.
- The agent skill and the hand-off file tell agents to save what they learned (`sd remember`) before `sd done`.
- The README is reorganised into feature tables with diagrams, and has new screenshots of hand-offs and the Context page.

### Fixed

- Adding a `.code-workspace` file: a path pasted with quotes (Explorer's *Copy as path*) is accepted, a double-click on the file imports it, folders that no longer exist are listed instead of dropped silently, and an unreadable file says so instead of "not a workspace file".

## [0.0.14] - 2026-10-12

### Added
Expand Down Expand Up @@ -257,7 +281,8 @@ First public release.
- Mandatory password with per-browser logins, idle lock, and HTTPS or SSH-tunnel remote access.
- `sd` CLI with a startup banner, `sd search` (LLM-free code search), and one-line installers for Windows and Linux.

[Unreleased]: https://github.com/codejunction/shelldeck/compare/v0.0.14...HEAD
[Unreleased]: https://github.com/codejunction/shelldeck/compare/v0.0.15...HEAD
[0.0.15]: https://github.com/codejunction/shelldeck/releases/tag/v0.0.15
[0.0.14]: https://github.com/codejunction/shelldeck/releases/tag/v0.0.14
[0.0.13]: https://github.com/codejunction/shelldeck/releases/tag/v0.0.13
[0.0.12]: https://github.com/codejunction/shelldeck/releases/tag/v0.0.12
Expand Down
4 changes: 3 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ uv tool install --force -e . # global sd/shelldeck from this checkout (th
- Added from the UI through the folder browser (`/api/fs/dirs`).
- Each gets a palette slot (`projects.color`, 0–7, least-used on add) for the sidebar dot, the pane top line, and the terminal background tint.
- Sidebar order lives in localStorage.
- **Workspaces:** `projects.workspace` (a label, NULL = none; a workspace exists while a project has it). `PATCH /api/projects/{id} {workspace}` moves one (`_workspace_name`: one line, 64 chars), `POST /api/projects` takes `workspace` too. `POST /api/workspaces/import {path}` reads a `.code-workspace` (`_jsonc`: comments and trailing commas; `uri` folders skipped) and adds its local folders under the file's name; `/api/fs/dirs` lists those files as `files`. It returns `skipped` (folders not found); `_path_arg` strips pasted quotes; `sd open X.code-workspace` imports too. UI: `S.workspace` (localStorage, per machine) is checked inside `onMachine()`, so the sidebar, agents page and counts follow it; `#workspace` picker in the Projects header.
- **Layouts:**
- **tiled** (default): a split tree. New terminals split the largest pane (sideways only if both halves stay ≥380px, else stacked). Panes have a fixed default `min-height: var(--pane-h, 340px)` and `#layout` scrolls vertically only.
- Opening terminals must not animate (user request); only chrome such as the sidebar, views and dialogs animates.
Expand Down Expand Up @@ -117,7 +118,8 @@ uv tool install --force -e . # global sd/shelldeck from this checkout (th
- `SPAWN` (agent -> model flag, args before the prompt) and `spawn_line()`/`kickoff()`: the kickoff prompt is limited to `SAFE_PROMPT` characters so one double-quoted string works in pwsh, cmd, bash, zsh and fish; the task itself lives in a file.
- `write_files()`: `<project>/.shelldeck/handoffs/<id>.md` per hand-off plus the `handoff.md` index, rendered from the `handoffs` table (the DB is the source of truth); `.shelldeck/.gitignore` is `*`.
- `install()`: the `SKILL` text as `~/.claude|.codex|.config/devin/skills/shelldeck/SKILL.md`, or a `<!-- SHELLDECK_START -->` block in other agents' global instruction files (`TARGETS`; only claude/codex/devin/gemini/opencode paths are verified). The server runs it on start unless `SHELLDECK_HOME` is set or the `agent_skills` setting is `off` (`sd install-skill --remove`).
- Server: `/api/spawn` (refuses a parent that has a parent, i.e. sub-agents can't spawn; new session in the project root; `_start_agent` types the command after the shell's first `OSC 133;A`, up to 10s), `/api/handoffs` (target must run an agent, since typed text in a bare shell would execute), `/api/handoffs/{id}/done`. `_tell_sender` toasts every browser (`_broadcast` over the alarm socket) and types into the sender only when an agent runs there. `_pump`'s exit marks open hand-offs to that terminal `exited` (`_orphan`); `STOPPING` silences the messages at shutdown.
- Server: `/api/spawn` (refuses a parent that has a parent, i.e. sub-agents can't spawn; new session in the project root; `_start_agent` types the command after the shell's first `OSC 133;A`, up to 10s), `/api/handoffs` (target must run an agent, since typed text in a bare shell would execute), `/api/handoffs/{id}/done`. `_tell_sender` toasts every browser (`_broadcast` over the alarm socket) and types into the sender only when an agent runs there. `_pump`'s exit marks open hand-offs to that terminal `exited` (`_orphan`); `STOPPING` silences the messages at shutdown. `done` also takes `cancelled` (the user, from the page: the receiver is told to stop). `_handoff_files` runs on every create/close and also records a `HANDOFF` / `HANDOFF_DONE` context event (`context._handoff_note` puts it in `sd context`'s recent events).
- UI: `handoffSection()` in agents.js draws the flow (`.ho-flow`: sender `.ho-node`, `.ho-card` per hand-off on CSS tree lines; a hand-off nests under the newest earlier hand-off to its sender; closed ones fold to `HO_RECENT` per sender). No animation: the page re-renders every 5s. `handoffDialog` shows one in full. The page is tabs (`TABS`, `tab` in localStorage `agentsTab`; `panes` in `renderAgents` builds only the picked one). context.js `delegated()` lists the project's open ones, `adder()` is a section heading whose *Add* opens its field (a `<details>`); its picker uses project ids and `machineProjects()`.
- **File editor.** `/api/fs/file` GET/PUT (2 MB cap, NUL = binary, non-UTF-8 is read-only, CRLF/BOM round-trip, `mtime` as a `st_mtime_ns` string and 409 `changed_on_disk` unless `force`), `/api/fs/raw` (raster images only: SVG or HTML served on this origin would run script), `/api/fs/show` (broadcasts `open_file` for `sd edit/view`; the CLI falls back to `/?file=` when no browser is listening). Relative paths start at the session's cwd (`_abs`).
- **Scratchpad.** `scratch` table (`id`, `body`, times; the title is the first line), `/api/scratch` CRUD, `static/scratch.js` (autosave 500ms, flushed when switching notes).
- `shelldeck/auth.py`: password, setup code, browser sessions (5s cache, idle expiry, throttled `last_seen` writes), CLI token, login rate limit, `reset()`. `scheduler.py` / `runner.py`: APScheduler cron jobs and reminders; jobs run via `subprocess.run` with the default shell.
Expand Down
Loading
Loading