{"_id":"@boy_grid/dsh-mfw","name":"@boy_grid/dsh-mfw","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@boy_grid/dsh-mfw","version":"0.1.0","description":"One-command launcher for DeepSeek Harness with multi-folder workspaces: prepares a patched runtime, its own profile and the plugin, then hands every argument to dsh","keywords":["dsh-plugin","deepseek-harness","dsh","cli","launcher","workspace","multi-folder"],"homepage":"https://github.com/Boy-Grid/dsh-multi-folder-workspace#readme","repository":{"type":"git","url":"git+https://github.com/Boy-Grid/dsh-multi-folder-workspace.git","directory":"packages/dsh-mfw"},"bugs":{"url":"https://github.com/Boy-Grid/dsh-multi-folder-workspace/issues"},"author":{"name":"Boy-Grid","url":"https://github.com/Boy-Grid"},"license":"MIT","type":"module","bin":{"dsh-mfw":"lib/bin.js"},"engines":{"node":">=22"},"publishConfig":{"access":"public"},"scripts":{"assets":"node scripts/sync-assets.mjs","prepack":"node scripts/sync-assets.mjs --verify"},"dshMfw":{"baseVersion":"0.1.1-rc.2","plugin":"@boy_grid/multi-folder-workspace@0.1.0","pnpm":"11.7.0","profile":"mfw","bundles":["@deepseek-ai/dsh-base","@deepseek-ai/dsh-web-app"],"patchedPackages":["dsh-client-connection","dsh-client-runtime","dsh-client-ui-workspace","dsh-host-apiproxy","dsh-sandbox-local","dsh-sandbox-policy","dsh-sandbox-windows-acl","dsh-sandbox","dsh-session","dsh-workspace"]},"_id":"@boy_grid/dsh-mfw@0.1.0","gitHead":"60de315c30e5d0d66e0bcb40c63c8c4980422a4a","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-VgeOmFZ5lT9b4YbWhE8o1neKK1cIYFxAi8/jBmItIgLpVIYx8OqpcM8INSogDcgl/DQgFORq/+yBe0zMqpa36w==","shasum":"fd036dd7d9cb5365be36c2a9d81c8ba04431c45e","tarball":"https://registry.npmjs.org/@boy_grid/dsh-mfw/-/dsh-mfw-0.1.0.tgz","fileCount":20,"unpackedSize":115366,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC25hR8V4BQwWskgoL+RjPZitRr8f4IPhFbQn79PJojugIhAP47TbVtcam80VHk1LlNeniojKKDCgcGgUeUJpawEpTa"}]},"_npmUser":{"name":"boy_grid","email":"grid_boy@petalmail.com"},"directories":{},"maintainers":[{"name":"boy_grid","email":"grid_boy@petalmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-mfw_0.1.0_1787433395760_0.0076815482341714425"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-22T21:16:35.636Z","0.1.0":"2026-08-22T21:16:35.913Z","modified":"2026-08-22T21:16:36.096Z"},"maintainers":[{"name":"boy_grid","email":"grid_boy@petalmail.com"}],"description":"One-command launcher for DeepSeek Harness with multi-folder workspaces: prepares a patched runtime, its own profile and the plugin, then hands every argument to dsh","homepage":"https://github.com/Boy-Grid/dsh-multi-folder-workspace#readme","keywords":["dsh-plugin","deepseek-harness","dsh","cli","launcher","workspace","multi-folder"],"repository":{"type":"git","url":"git+https://github.com/Boy-Grid/dsh-multi-folder-workspace.git","directory":"packages/dsh-mfw"},"author":{"name":"Boy-Grid","url":"https://github.com/Boy-Grid"},"bugs":{"url":"https://github.com/Boy-Grid/dsh-multi-folder-workspace/issues"},"license":"MIT","readme":"# @boy_grid/dsh-mfw\n\nOne command to run [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH) with **multi-folder workspaces**: one workspace made of several folders that live in different places, where sessions can read and write every member folder.\n\n```bash\nnpx @boy_grid/dsh-mfw web\n```\n\nThat is the whole install. Part of [dsh-multi-folder-workspace](https://github.com/Boy-Grid/dsh-multi-folder-workspace) — see that repository for the design, the patch set and the manual install route.\n\n## What it does\n\nThe multi-folder feature needs changes **inside** DSH's core packages: upstream models a workspace as exactly one folder (`path: string`), and that assumption reaches into the persisted record, the sandbox policy, the RPC payloads and the directory-picker contract. Those packages import each other as plain ESM, so the change cannot be a plugin alone and cannot be applied at run time — it has to exist in an install tree.\n\nThis launcher owns such a tree:\n\n1. **Provisions a patched runtime** in your cache directory: a pnpm install of the pinned `@deepseek-ai/dsh` with the 10-package patch set applied through `patchedDependencies`. Keyed by baseline + patch payload, so it is only built once per release.\n2. **Prepares its own DSH profile** (`mfw`) and installs `@boy_grid/multi-folder-workspace` into it.\n3. **Boots dsh** from that tree with a patch overlay that swaps the native directory picker for the multi-select flow, and forwards every remaining argument untouched.\n\nSecond and later runs skip straight to step 3.\n\n```bash\nnpx @boy_grid/dsh-mfw web --port 8080     # arguments go to dsh unchanged\nnpx @boy_grid/dsh-mfw web --no-open\n```\n\n## What it does not touch\n\n- **Your `web` profile.** The launcher uses a profile of its own, so plain `dsh web` keeps working exactly as before and both can live in one DSH home. Nothing is written to your profile's `cordis.patch.yml` — the overlay is passed on the command line instead.\n- **Your DSH data.** Sessions, credentials and settings stay in `$DSH_HOME` (default `~/.dsh`), shared with your normal `dsh`, so history and logins carry over both ways.\n- **Your global package manager state.** The runtime tree is self-contained in the cache directory.\n\n## Commands\n\n| Command | What it does |\n| --- | --- |\n| `dsh-mfw [web] [dsh args…]` | Provision if needed, then boot the web UI. Arguments after the launcher's own flags go to dsh. |\n| `dsh-mfw provision` | Do the slow part and stop — warming the cache before going offline, or in CI. |\n| `dsh-mfw doctor` | Print what was resolved: baseline, plugin state, pnpm, DSH home, profile, cache paths. |\n| `dsh-mfw clean` | Remove the current runtime tree. `--all` removes every cached tree. Your DSH data and profile stay. |\n\nLauncher flags are namespaced so they can never collide with dsh's own:\n\n| Flag | Meaning |\n| --- | --- |\n| `--mfw-profile <name>` | Use a different DSH profile (default `mfw`) |\n| `--mfw-force` | Reprovision the runtime and reinstall the plugin |\n| `--mfw-help` | This launcher's help. Plain `--help` goes to the booted app. |\n\n## Environment\n\n| Variable | Default | Purpose |\n| --- | --- | --- |\n| `DSH_HOME` | `~/.dsh` | Where DSH keeps sessions, credentials and profiles. Same variable upstream reads. |\n| `DSH_MFW_CACHE` | `~/.cache/dsh-mfw`, `$XDG_CACHE_HOME/dsh-mfw`, or `%LOCALAPPDATA%\\dsh-mfw` | Where runtime trees live |\n| `DSH_MFW_PLUGIN` | the pinned release | Install the plugin from another spec or a local path (development) |\n\n## Requirements\n\n- **Node >= 22.**\n- **pnpm 11+**, taken from `PATH` if new enough, otherwise fetched through corepack (which ships with Node 22). `patchedDependencies` is what makes the patch set cover every copy of a package in the tree, including peer edges; npm has no equivalent.\n- **Network and ~300 MB of disk** for the first run. Provisioning takes roughly 10–30 seconds depending on the connection; later runs start in about a second.\n\n## Security note\n\nA multi-folder workspace **widens the agent's write surface**. In `workspace-write` mode a session in such a workspace can write to every member folder, not just its own working directory. The patch set extends DSH's sandbox accordingly (union of member roots, per-platform multi-directory grants), paths outside the member set are still denied, and every membership change is recorded as a session event. Read the [security note](https://github.com/Boy-Grid/dsh-multi-folder-workspace#security-note) before installing — if you only ever work in one folder at a time, you do not need this.\n\n## Uninstalling\n\n```bash\nnpx @boy_grid/dsh-mfw clean --all      # drop the cached runtime trees\nrm -rf \"${DSH_HOME:-$HOME/.dsh}/profiles/mfw\"\n```\n\nYour sessions and credentials are untouched, and a stock `dsh` still starts: records written by the patched side keep `path` pointing at the primary member, so multi-folder workspaces appear as ordinary single-folder ones. That degradation is one-way — stock DSH drops the extra member list the first time it writes a record. Back up `$DSH_HOME/storages/workspace.json` first if you want to keep it.\n\n**On Windows there is one more thing to clean up.** Write access to member folders is granted by putting an ACE for a capability SID on the folder itself, and those ACEs live in the file system rather than in `DSH_HOME` — deleting the cache and the profile does not remove them. They grant nothing once no process carries the matching SID, but if you want the folders back to their original ACLs:\n\n```powershell\nforeach ($d in @('C:\\path\\to\\member-1', 'C:\\path\\to\\member-2')) {\n  $acl = Get-Acl $d\n  foreach ($rule in @($acl.Access)) {\n    if (-not $rule.IsInherited -and $rule.IdentityReference.Value -like 'S-1-4-*') {\n      [void]$acl.RemoveAccessRule($rule)\n    }\n  }\n  Set-Acl -Path $d -AclObject $acl\n}\n```\n\n## Version pinning\n\nEach release of this launcher pins one DSH baseline (currently `0.1.1-rc.2`), one plugin version and the exact patch payload; `dsh-mfw doctor` prints all three. Upstream packages reference each other with `^` ranges that would drift to a newer prerelease and leave the patches unused, so the baseline is exact by design and moves only when the patch set is rebased.\n\n## License\n\n[MIT](LICENSE). The patch set is derived from the MIT-licensed upstream `@deepseek-ai/dsh-*` npm artifacts. This is an independent community project, not affiliated with or endorsed by DeepSeek.\n","readmeFilename":"README.md","_rev":"1-f7647565c5f479ad219180f78197912f"}