@aide-family/dsh-remote 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,6 +2,96 @@
2
2
 
3
3
  SSH remote-server operations for [DeepSeek Harness](https://www.deepseek.com/harness/) (DSH).
4
4
 
5
+ ## Quick start
6
+
7
+ ### 1. Install DSH
8
+
9
+ `dsh-remote` is a DSH plugin, so install and launch DSH first.
10
+
11
+ **Desktop app (recommended).** Download the official app for
12
+ [macOS or Windows](https://www.deepseek.com/en/download/), open it, and finish the
13
+ first-run sign-in. The desktop app bundles its own `dsh` CLI and Node.js.
14
+
15
+ **CLI / Web UI.** Requires Node.js `>= 24.9.0`:
16
+
17
+ ```sh
18
+ # run without a global install
19
+ npx -y @deepseek-ai/dsh web
20
+
21
+ # or install the CLI once and reuse it
22
+ npm install -g @deepseek-ai/dsh
23
+ dsh web
24
+ ```
25
+
26
+ `dsh web` prints an authenticated local URL (for example
27
+ `http://127.0.0.1:3080/`). Open it in a browser. Then check the version:
28
+
29
+ ```sh
30
+ dsh --version # must be >= 0.2.1-rc.5
31
+ ```
32
+
33
+ > With the Desktop app, `dsh` may not be on your shell `PATH`; either use the
34
+ > app or install the CLI as above. The plugin also needs SSH access to the
35
+ > target hosts: key files, `ssh-agent`, or a password supplied through an
36
+ > environment variable. `~/.ssh/config` settings (`HostName`, `User`, `Port`,
37
+ > `IdentityFile`, `ProxyJump`) are honored.
38
+
39
+ ### 2. Install dsh-remote
40
+
41
+ From npm:
42
+
43
+ ```sh
44
+ dsh plugin --profile desktop add @aide-family/dsh-remote --ignore-scripts
45
+ ```
46
+
47
+ From a local checkout:
48
+
49
+ ```sh
50
+ cd /path/to/dsh-remote
51
+ npm install # once: ssh2 + test devDependencies
52
+ npm run install:profile # packs dist/aide-family-dsh-remote-<version>.tgz and installs
53
+ # it into the "desktop" profile
54
+ ```
55
+
56
+ Or pack and install manually into another profile:
57
+
58
+ ```sh
59
+ npm run pack:plugin
60
+ dsh plugin --profile desktop add file:$PWD/dist/aide-family-dsh-remote-0.6.2.tgz --ignore-scripts
61
+ ```
62
+
63
+ Install into the profile you actually boot: `desktop` for the Desktop app, or
64
+ `web` when you launched `dsh web` (the CLI also accepts `--profile web`).
65
+
66
+ Then fully quit and reopen the DSH Desktop app (a newly installed bundle is
67
+ loaded on the next boot), or boot the CLI profile you installed into. Open the
68
+ **远程运维** panel in the sidebar, or ask the agent to call `remote_hosts`, to
69
+ confirm the plugin loaded.
70
+
71
+ > **`--ignore-scripts` is required with pnpm 11.** pnpm refuses to install
72
+ > packages that declare unapproved install scripts, and `ssh2` declares an
73
+ > install script for its *optional* native cipher-speed addon (`cpu-features`).
74
+ > ssh2's pure-JavaScript implementation is fully functional without it, so
75
+ > skipping the scripts is safe and avoids needing a C toolchain. (Alternatively,
76
+ > add `allowBuilds: [ssh2, cpu-features]` to the profile's `pnpm-workspace.yaml`
77
+ > and install without the flag; that does require a working compiler setup.)
78
+ >
79
+ > **Do not install a development checkout with `link:`.** DSH routes
80
+ > `@deepseek-ai/*` imports only for packages that physically live inside the
81
+ > profile's `node_modules`; a symlink to a directory outside the profile cannot
82
+ > resolve them and the plugin fails to load. Use the tarball (`file:…tgz`) for
83
+ > local installs, or the npm package when published.
84
+
85
+ The plugin is a DSH **bundle**: installing it adds the
86
+ `@aide-family/dsh-remote` package and a `dsh-remote` plugin row to the profile.
87
+ To remove it:
88
+
89
+ ```sh
90
+ dsh plugin --profile desktop remove @aide-family/dsh-remote
91
+ ```
92
+
93
+ ## What dsh-remote does
94
+
5
95
  `dsh-remote` lets the agent in your DSH session actually operate remote servers:
6
96
  list the hosts you already configured in `~/.ssh/config`, probe a box, run
7
97
  non-interactive commands, read and edit remote files over SFTP, and move files
@@ -14,6 +104,37 @@ operations workbench: the same idea that the agent should gather evidence on the
14
104
  real host, one bounded action at a time, with risky commands reviewed before
15
105
  execution.
16
106
 
107
+ ## Screenshots
108
+
109
+ The screenshots below come from an isolated documentation profile: synthetic
110
+ hosts on RFC 5737 documentation addresses, a loopback SSH fixture, and synthetic
111
+ command output. No real host, account, key, or local path is shown.
112
+
113
+ **Remote Ops management page.** Host inventory, per-host detail, live shell
114
+ sessions, and the recent-operation audit trail in one panel.
115
+
116
+ ![Remote Ops management page](https://cdn.jsdelivr.net/gh/aide-family/dsh-remote@v0.6.2/docs/assets/remote-ops.png)
117
+
118
+ **Live terminal mirror.** Every agent command streams into the conversation's
119
+ right sidebar; the same panel opens DSH's native terminal on a chosen host.
120
+
121
+ ![Live terminal mirror](https://cdn.jsdelivr.net/gh/aide-family/dsh-remote@v0.6.2/docs/assets/live-terminal.png)
122
+
123
+ **Host manager.** Add, edit, or remove managed connections. Secrets stay as
124
+ environment-variable names or key paths.
125
+
126
+ ![Host manager](https://cdn.jsdelivr.net/gh/aide-family/dsh-remote@v0.6.2/docs/assets/host-manager.png)
127
+
128
+ **Per-host audit.** Filter by host, expand the full command, or export
129
+ JSON/CSV/TXT.
130
+
131
+ ![Per-host audit](https://cdn.jsdelivr.net/gh/aide-family/dsh-remote@v0.6.2/docs/assets/host-audit.png)
132
+
133
+ **Native remote terminal.** A real xterm attached to the per-conversation SSH
134
+ session; close and re-open the tab to reattach it.
135
+
136
+ ![Native remote terminal](https://cdn.jsdelivr.net/gh/aide-family/dsh-remote@v0.6.2/docs/assets/remote-terminal.png)
137
+
17
138
  ## Features
18
139
 
19
140
  - **Hosts you already have** — discovers every concrete `Host` in
@@ -71,64 +192,6 @@ execution.
71
192
  - **Hard limits** — per-host read-only lock, host allowlist, command deny
72
193
  patterns, output caps, transfer caps, and TOFU host-key verification.
73
194
 
74
- ## Requirements
75
-
76
- - DSH `>= 0.2.1-rc.5` (bundled in the Desktop app and the `dsh` CLI).
77
- - Node.js `^22.19.0 || >=24.0.0` (already bundled with DSH).
78
- - SSH access to the target hosts: key files, `ssh-agent`, or a password supplied
79
- through an environment variable. `~/.ssh/config` settings (`HostName`, `User`,
80
- `Port`, `IdentityFile`, `ProxyJump`) are honored.
81
-
82
- ## Install
83
-
84
- ### From a local tarball (recommended for this checkout)
85
-
86
- ```sh
87
- cd /path/to/dsh-remote
88
- npm install # once: ssh2 + test devDependencies
89
- npm run install:profile # packs dist/aide-family-dsh-remote-<version>.tgz and installs
90
- # it into the "desktop" profile
91
- ```
92
-
93
- Or do the steps manually and choose another profile:
94
-
95
- ```sh
96
- npm run pack:plugin
97
- dsh plugin --profile desktop add file:$PWD/dist/aide-family-dsh-remote-0.5.3.tgz --ignore-scripts
98
- ```
99
-
100
- Then fully quit and reopen the DSH Desktop app (a newly installed bundle is
101
- loaded on the next boot), or boot the CLI profile you installed into.
102
-
103
- > **`--ignore-scripts` is required with pnpm 11.** pnpm refuses to install
104
- > packages that declare unapproved install scripts, and `ssh2` declares an
105
- > install script for its *optional* native cipher-speed addon (`cpu-features`).
106
- > ssh2's pure-JavaScript implementation is fully functional without it, so
107
- > skipping the scripts is safe and avoids needing a C toolchain. (Alternatively,
108
- > add `allowBuilds: [ssh2, cpu-features]` to the profile's `pnpm-workspace.yaml`
109
- > and install without the flag; that does require a working compiler setup.)
110
- >
111
- > **Do not install a development checkout with `link:`.** DSH routes
112
- > `@deepseek-ai/*` imports only for packages that physically live inside the
113
- > profile's `node_modules`; a symlink to a directory outside the profile cannot
114
- > resolve them and the plugin fails to load. Use the tarball (`file:…tgz`) for
115
- > local installs, or the npm package when published.
116
-
117
- ### From npm (when published)
118
-
119
- ```sh
120
- dsh plugin --profile desktop add @aide-family/dsh-remote --ignore-scripts
121
- ```
122
-
123
- ### Where it lands
124
-
125
- The plugin is a DSH **bundle**: installing it adds the `@aide-family/dsh-remote`
126
- package and a `dsh-remote` plugin row to the profile. To remove the package:
127
-
128
- ```sh
129
- dsh plugin --profile desktop remove @aide-family/dsh-remote
130
- ```
131
-
132
195
  ## Configure
133
196
 
134
197
  All settings live on the plugin's row in the profile patch. The desktop profile
@@ -565,7 +628,7 @@ The npm package name is `@aide-family/dsh-remote`; the DSH plugin row id remains
565
628
  `NPM_TOKEN` with publish permission for the `@aide-family` scope. Do not put the
566
629
  token in the repository or a checked-in `.npmrc`.
567
630
 
568
- Pushing a tag that exactly matches the manifest version (for example, `v0.5.3`)
631
+ Pushing a tag that exactly matches the manifest version (for example, `v0.6.2`)
569
632
  starts the [publish workflow](https://github.com/aide-family/dsh-remote/blob/main/.github/workflows/publish-npm.yml).
570
633
  The workflow installs from the lockfile, runs unit tests plus the DSH-independent
571
634
  integration suites, checks the tag/package version match, previews the tarball,
@@ -573,8 +636,8 @@ then publishes publicly with provenance.
573
636
  The publisher must have rights to create packages in the `@aide-family` scope.
574
637
 
575
638
  ```sh
576
- git tag v0.5.3
577
- git push origin v0.5.3
639
+ git tag v0.6.2
640
+ git push origin v0.6.2
578
641
  ```
579
642
 
580
643
  Published versions cannot be reused. If a release has a mistake, fix it and
@@ -650,7 +713,8 @@ test/
650
713
  unit/ pure-module tests
651
714
  integration/ fake-ctx plugin tests + fixture SSH server
652
715
  fixtures/ ssh-server.mjs
653
- scripts/ dev-profile, sync-profile, e2e, dev-web (browser loop), packaging
716
+ scripts/ dev-profile, sync-profile, e2e, dev-web, docs-screenshots
717
+ docs/assets/ README screenshots (generated from the synthetic profile only)
654
718
  ```
655
719
 
656
720
  Attribution: the command-risk classifier in `lib/policy/` is ported from the
@@ -674,9 +738,10 @@ contents before publication; never commit live connection records or secrets.
674
738
  ## Verification
675
739
 
676
740
  ```sh
677
- npm test # 669 tests: unit + real-fixture integration (no external servers)
741
+ npm test # unit + real-fixture integration (no external servers)
678
742
  npm run e2e # real DSH headless run against a fixture SSH server
679
743
  node scripts/dev-web-test.mjs --remote-terminal --docs-shots # real browser loop (v0.5)
744
+ npm run docs:screenshots # regenerate docs/assets/ from an isolated synthetic profile
680
745
  ```
681
746
 
682
747
  The e2e suite proves the model actually calls the tools through the DSH pipeline,
@@ -684,8 +749,12 @@ that read-only remote actions work, that mutating actions fail closed in headles
684
749
  mode, that a persistent PTY shell opens, echoes a command, and closes cleanly,
685
750
  and that an unproven (gray) command now runs without approval. The management page is verified in a real browser against an isolated
686
751
  DSH Web profile (`npm run dev:web` boots it, drives it with headless Chrome, and
687
- writes a local screenshot). Historical screenshots were removed because they
688
- contained real connection details; do not publish unreviewed browser captures.
752
+ writes a local screenshot). `npm run docs:screenshots` regenerates the README
753
+ images from a profile that disables SSH-config discovery, contains only synthetic
754
+ inventory and a loopback fixture, and refuses to write a capture if the page
755
+ shows a real-looking host, account, or local path. Earlier screenshots were
756
+ removed because they contained real connection details; the README now uses
757
+ generated synthetic captures, but still review every image before publishing it.
689
758
  `--emit-live` verifies the v0.4 live mirror (guide entry, auto-open, streamed
690
759
  commands/output, session and host filters, scrolling, Clear). `--remote-terminal`
691
760
  boots the same profile with a real SSH fixture host and verifies v0.5 end to end:
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aide-family/dsh-remote",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "SSH remote-server operations for DeepSeek Harness: host discovery from ~/.ssh/config, remote command execution, SFTP file tools, and Crescent-style command risk review with approval gating.",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
@@ -20,7 +20,8 @@
20
20
  "README.md",
21
21
  "LICENSE",
22
22
  "docs/icon.svg",
23
- "docs/TERMINAL_ACTIONS.md"
23
+ "docs/TERMINAL_ACTIONS.md",
24
+ "docs/assets"
24
25
  ],
25
26
  "keywords": [
26
27
  "dsh",
@@ -57,7 +58,8 @@
57
58
  "pack:plugin": "mkdir -p dist && npm pack --pack-destination dist",
58
59
  "install:profile": "bash scripts/install-into-profile.sh",
59
60
  "dev:screenshot": "node scripts/dev-screenshot.mjs",
60
- "dev:web": "node scripts/dev-web-test.mjs"
61
+ "dev:web": "node scripts/dev-web-test.mjs",
62
+ "docs:screenshots": "node scripts/docs-screenshots.mjs"
61
63
  },
62
64
  "peerDependencies": {
63
65
  "@deepseek-ai/cordis": "^4.0.5",