# dsh-workspace-mover
**_> Unofficial project, independently developed and maintained by community members._**
## π Table of Contents
- [β¨ Features](#-features)
- [π Install](#-install)
- [πΌοΈ Tour](#οΈ-tour)
- [β¨οΈ Usage](#οΈ-usage)
- [π How it integrates with DSH](#-how-it-integrates-with-dsh)
- [π€ Coexistence with other plugins](#-coexistence-with-other-plugins)
- [π§© Compatibility and uninstall](#-compatibility-and-uninstall)
- [π Security guarantees](#-security-guarantees)
- [β οΈ Known limitations](#οΈ-known-limitations)
- [π Recent version](#-recent-version)
---
## β¨ Features
DeepSeek Harness's sidebar supports drag-to-reorder **within** a workspace, but dropping a session onto **another workspace** is silently ignored. This plugin adds cross-workspace migration:
- **π±οΈ Drag-and-drop move**: drag an idle session row onto a target workspace title row and confirm
- **π¦ Bulk move / group merge**: multi-select with Ctrl/Shift and drag the set, or use a workspace header's "β―" β "Move whole groupβ¦"; an emptied source group can be deleted in one confirmation (up to 50 per batch, failures isolated)
- **π True move Β· zero tokens**: session id and full history are preserved as-is β no duplicates, no context re-injection
- **π Move-home wizard**: after a project folder was moved or renamed, re-point the broken workspace in place; id, title, order, and archive flags stay, and member sessions plus strays migrate together
- **π Session rescue** (Settings β Session Rescue): recover lost / unregistered / misfiled sessions; restore archived sessions; one-click repair and filtering
- **ποΈ Recycle bin and backups**: deletes go to the recycle bin first and can be restored; every move creates a backup you can restore or clean up
- **βͺ Move history and undo**: last 100 cross-workspace moves; bulk operations aggregate into one undoable entry
- **π Empty-group cleanup / open folder**: only truly empty workspaces are listed; open a group directory in your file manager
## π Install
```bash
dsh plugin --profile web add "github:PianoPrince/dsh-workspace-mover"
# Restart dsh web once
```
> **Zero-build install**: pure JavaScript source-as-product (no TypeScript, no build step). Installing from GitHub does **not** require `allowBuilds`.
npm channel
```bash
dsh plugin --profile web add dsh-workspace-mover
```
Local development install
```bash
dsh plugin --profile web add "link:C:/path/to/dsh-workspace-mover"
```
Troubleshooting
| Symptom | What to do |
|---|---|
| Drag does nothing | Use **grouped view** and drop on a **workspace title row**; flat list view has no title rows and stays inactive |
| Session is running | Wait for the current turn to finish, then move |
| Move failed toast | There is a backup and automatic rollback; retry after following the toast. Details are in the host log under `MOVE FAILED` |
| Move succeeded but sidebar didn't regroup | Refresh the page |
| Some sessions vanished from the sidebar | Open **Settings β Session Rescue** to scan and recover them |
## πΌοΈ Tour
> Real UI screenshots (click to enlarge).
### Drag across workspaces
| | |
|---|---|
| **Drag an idle session row onto a target workspace title row** | **Confirm dialog shows the destination path** |
|  |  |
| **Settings β Session Rescue** | |
|  | |
### Bulk move Β· multi-select
| |
|---|
| **Ctrl+click to multi-select (the open session is included automatically), count badge bottom-left; drag any selected row; Esc clears** |
|  |
| **Header "β―" β "Move whole groupβ¦" for group merge** |
|  |
### Move-home wizard Β· walkthrough
A real rename: folder `Test1` β `Test2`, then repair the workspace in place.
| | |
|---|---|
| **Before rename** | **After rename (folder gone on disk)** |
|  |  |
| **Health panel marks the path invalid** | **Confirm old β new path and session count** |
|  |  |
| **Done: group renamed to Test2, history intact** | |
|  | |
## β¨οΈ Usage
### Drag across workspaces
1. After restart, open **grouped view** in the sidebar and hold an idle session row;
2. Drop it on a target workspace title row;
3. Confirm the destination path β **Move**;
4. Toast confirms; refresh the page if the sidebar does not regroup automatically.
Mid-turn sessions are rejected; failed moves roll back automatically.
### Session rescue panel
1. **Settings β Session Rescue** scans on open;
2. **Lost / orphaned**: pick a target workspace β **Move**;
3. **Unregistered**: **Attach** in place to the matching workspace;
4. **Misfiled**: **Home** or **Home all**;
5. **One-click repair** runs fixable items with per-item isolation;
6. Filter by title / session id / path / group;
7. **Archived / recycle bin / backups**: restore archived sessions; restore or purge deleted sessions; restore or clean backups.
### Bulk move
1. **Ctrl/Cmd+click** to select, **Shift+click** for a range, **Esc** to clear;
2. Drag any selected row β **Move all**;
3. Or **"β―" β "Move whole groupβ¦"**; delete an emptied source group to merge.
### Move-home wizard
1. After a folder move/rename, health check marks the group **path invalid**;
2. Enter the folder's current full path β **Move**;
3. Confirm paths and session count; running sessions skip β rerun to finish the rest.
## π How it integrates with DSH
For users, the integration contract is:
1. Mounted through **official DSH extension points** β DSH and dsh-market install files are not modified;
2. Workspace membership changes use the host's **official interfaces** β no forged persistence data;
3. Plugin-owned data (history, backups, recycle bin) lives in a **separate data directory**, apart from session archives;
4. Official same-group sidebar sorting is **left alone** β only cross-workspace drops are handled.
Implementation details: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
## π€ Coexistence with other plugins
Built to coexist: private communication/style namespaces, no rewrites of official install files, official interfaces for membership writes.
| Plugin category | Compatibility | Notes |
| --- | --- | --- |
| Sidebar enhancements / better-sidebar / terminals / cost meters / memory / export & share | β
No conflict | Different panels and data surfaces |
| Archive managers | β
Compatible | Both use official archive data; panel features may overlap |
| Sort / pin plugins | β οΈ Mostly compatible | Moves re-sort "Recently updated" precisely; display order in other plugins may differ slightly |
| Plugins that redraw the sidebar | β οΈ Graceful degradation | If the official sidebar structure is replaced, features may stop triggering β **no data damage** |
| Other session movers | β Pick one | Two drag interceptors can double-handle one drag; this plugin covers move / bulk / merge / homing / archive restore |
## π§© Compatibility and uninstall
- **Verified**: DeepSeek Harness `0.1.5-rc.1`, dsh-market `1.45.1`, Node.js `β₯ 22`. Does not patch DSH source; official extension points only.
- **Marketplace "host requirement unknown"**: GitHub-only packages without an npm manifest may show unknown β that is metadata, not runtime incompatibility. `package.json` declares `engines.dsh` β₯ `0.1.5-rc.1`.
- **Uninstall is reversible**: removing the plugin does not delete session archives, workspaces, or official bookkeeping. Plugin history/tasks/backups/recycle-bin data stay in the plugin data directory (see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)); refresh or restart DSH to clear injected UI.
- **Coexistence**: do not enable a second cross-workspace drag mover; other categories can follow the table above.
Some advanced actions need newer DSH capabilities; when unavailable the UI says so instead of failing silently.
## π Security guarantees
- **Automatic backup before every move**; after landing, the session identity and path are re-checked β mismatch rolls the whole move back;
- **On failure, restore to the pre-move state** (files and bookkeeping together);
- **Deletes go to the recycle bin first** and can be restored to the original spot or any group; permanent delete needs a second confirmation;
- **If automatic recovery is not possible**, the rescue panel flags it for manual review; session files and backups are kept β **never silently discarded**;
- **Recently opened sessions still resident in Harness memory** cannot be deleted until you restart Harness (the UI says so clearly).
> Failure paths prefer keeping your data β sessions are never silently dropped.
> This is **not** a claim that every error auto-recovers: extreme cases need manual action, with data left in place.
## β οΈ Known limitations
- Moving into the "Ungrouped" bucket is not supported;
- Sessions still resident in Harness memory (opened recently) cannot be deleted until you restart Harness;
- If a third-party plugin fully redraws the sidebar, features may stop triggering (**no data damage**);
- Flat list view has no workspace title rows β the plugin stays inactive there;
- Major host upgrades that change internal structures may degrade some actions or require a restart; the move-home wizard aborts before touching files if it cannot write safely.
## π Recent version
### v2.0.2 Β· 2026-09-13
- Fixed GitHub Traffic badge updates when downloads are at or below 10
- Completed the architecture documentation and RPC list, and corrected the documented workspace projection refresh behavior
- Published `.tgz` assets now include the architecture documentation and screenshots, with duplicate historical changelog entries removed
Full history: [CHANGELOG.md](CHANGELOG.md).
Architecture: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
## License
MIT