dsh-plugin-shop 0.1.2 → 0.1.4
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 +133 -39
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,64 +1,158 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
1
3
|
# dsh-plugin-shop
|
|
2
4
|
|
|
5
|
+
**The plugin store for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)** — browse a catalog of
|
|
6
|
+
dsh plugins, install one with a single confirmation, and manage what you have, from a tab inside Settings.
|
|
7
|
+
|
|
8
|
+
[](https://www.npmjs.com/package/dsh-plugin-shop)
|
|
9
|
+
[](https://github.com/LivXue/dsh-plugin-shop/blob/main/LICENSE)
|
|
10
|
+
[](https://github.com/LivXue/dsh-plugin-shop/actions/workflows/plugin.yml)
|
|
11
|
+
[](https://github.com/LivXue/dsh-plugin-shop/actions/workflows/daily.yml)
|
|
12
|
+
|
|
3
13
|
English | [中文](https://github.com/LivXue/dsh-plugin-shop/blob/main/packages/dsh-plugin-shop/docs/README.zh.md)
|
|
4
14
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 🖼️ Screenshots
|
|
20
|
+
|
|
21
|
+
<div align="center">
|
|
22
|
+
<img src="https://raw.githubusercontent.com/LivXue/dsh-plugin-shop/main/docs/images/shelf-light.png" alt="The plugin store shelf inside dsh Settings" width="860">
|
|
23
|
+
</div>
|
|
24
|
+
|
|
25
|
+
<table>
|
|
26
|
+
<tr>
|
|
27
|
+
<td width="50%"><img src="https://raw.githubusercontent.com/LivXue/dsh-plugin-shop/main/docs/images/gate-light.png" alt="Installing an unreviewed plugin requires an explicit acknowledgement"></td>
|
|
28
|
+
<td width="50%"><img src="https://raw.githubusercontent.com/LivXue/dsh-plugin-shop/main/docs/images/shelf-dark.png" alt="The same shelf in the dark theme"></td>
|
|
29
|
+
</tr>
|
|
30
|
+
<tr>
|
|
31
|
+
<td align="center"><sub>Installing an unreviewed plugin requires an explicit acknowledgement</sub></td>
|
|
32
|
+
<td align="center"><sub>The same shelf in the dark theme</sub></td>
|
|
33
|
+
</tr>
|
|
34
|
+
</table>
|
|
35
|
+
|
|
36
|
+
## 📦 Install
|
|
37
|
+
|
|
38
|
+
Two tracks below. They do the same thing; pick the one that matches who is reading.
|
|
39
|
+
|
|
40
|
+
### 🧑 For people
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
dsh plugin --profile web add dsh-plugin-shop
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Replace `web` with your profile if you use another one. Then restart `dsh` once — a
|
|
47
|
+
newly added bundle is not applied to a running process — and open
|
|
48
|
+
|
|
49
|
+
> **Settings → Plugins → Plugin store**
|
|
50
|
+
|
|
51
|
+
You land on a shelf of plugin cards with a search box. The first load reads the catalog
|
|
52
|
+
over the network and can take a few seconds; a shimmering skeleton stands in until the
|
|
53
|
+
cards arrive.
|
|
54
|
+
|
|
55
|
+
### 🤖 For agents
|
|
9
56
|
|
|
10
|
-
|
|
57
|
+
Non-interactive, no prompts, nothing to confirm. `--profile` is **mandatory** —
|
|
58
|
+
without it `dsh plugin` exits with
|
|
59
|
+
`error: required option '--profile <name>' not specified`.
|
|
60
|
+
|
|
61
|
+
**1. Resolve a profile name.** Profiles are directories under `$DSH_HOME/profiles`
|
|
62
|
+
(`$DSH_HOME` defaults to `~/.dsh`). `node_modules` appears there too and is *not* a
|
|
63
|
+
profile.
|
|
64
|
+
|
|
65
|
+
```sh
|
|
66
|
+
ls -1 "${DSH_HOME:-$HOME/.dsh}/profiles" | grep -v '^node_modules$'
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**2. Install.**
|
|
70
|
+
|
|
71
|
+
```sh
|
|
72
|
+
dsh plugin --profile <profile> add dsh-plugin-shop
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**3. Verify — do not skip this.** A zero exit from step 2 means pnpm resolved the
|
|
76
|
+
package, not that the profile will load it. Assert on the bundle list:
|
|
11
77
|
|
|
12
78
|
```sh
|
|
13
|
-
dsh plugin --profile <
|
|
79
|
+
dsh plugin --profile <profile> list --depth 0
|
|
14
80
|
```
|
|
15
81
|
|
|
16
|
-
|
|
82
|
+
`dsh-plugin-shop` must appear with a resolved version. If you would rather read the
|
|
83
|
+
manifest directly, the same fact lives at
|
|
84
|
+
`$DSH_HOME/profiles/<profile>/package.json` under `dsh.profile.bundles`.
|
|
17
85
|
|
|
18
|
-
|
|
86
|
+
**4. Restart the profile** — `dsh --profile <profile>`, or `dsh web` for the web
|
|
87
|
+
profile. Enabling or disabling an *already installed* plugin is hot; adding a new
|
|
88
|
+
bundle is not.
|
|
19
89
|
|
|
20
|
-
|
|
21
|
-
`dsh-plugin` keyword, with the author's own summary when they declared one.
|
|
22
|
-
- **Install** with one confirmation. An unreviewed plugin requires an explicit
|
|
23
|
-
acknowledgement first, because an installed plugin holds the same privileges as
|
|
24
|
-
a built-in one: your files, your shell, and the requests sent to the model.
|
|
25
|
-
- **Enable / disable** an installed plugin without a restart.
|
|
26
|
-
- **Spot outdated installs** against the catalog's current version.
|
|
90
|
+
#### Failure modes
|
|
27
91
|
|
|
28
|
-
|
|
92
|
+
| What you see | What it means | What to do |
|
|
93
|
+
|---|---|---|
|
|
94
|
+
| `error: required option '--profile <name>' not specified` | `--profile` was omitted | Pass it; there is no default |
|
|
95
|
+
| A version older than npm's `latest` gets installed | pnpm 11 holds back very recently published versions | Expected, not an error; the newest lands once its cooldown passes |
|
|
96
|
+
| `client bundles not found ... lib/client.js` | the copy on disk was built without its browser half | Install from npm rather than from a source checkout, or run `pnpm build` in that checkout |
|
|
97
|
+
| `no profile directory found above <path>` | the plugin could not locate its profile | Please report it — this is resolved from `ctx.baseUrl` and should not fail |
|
|
98
|
+
| The tab is missing after a restart | the bundle is not in the profile's `bundles` | Re-run step 3; if it is absent, step 2 did not complete |
|
|
29
99
|
|
|
30
|
-
|
|
100
|
+
## ✨ What it does
|
|
31
101
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
102
|
+
| | |
|
|
103
|
+
|---|---|
|
|
104
|
+
| **Browse & search** | 1800+ packages harvested from npm by the `dsh-plugin` keyword, shown with the author's own summary when they declared one |
|
|
105
|
+
| **Install** | One confirmation. An unreviewed plugin requires an explicit acknowledgement first — an installed plugin holds the same privileges as a built-in one |
|
|
106
|
+
| **Enable / disable** | Applies to an installed plugin without a restart |
|
|
107
|
+
| **Outdated installs** | Compared against the catalog's current version |
|
|
38
108
|
|
|
39
|
-
##
|
|
109
|
+
## 🧩 How it is put together
|
|
110
|
+
|
|
111
|
+
Two halves ship in this one package, and the split between them is the security
|
|
112
|
+
boundary:
|
|
113
|
+
|
|
114
|
+
| Half | Entry | Can reach | Cannot reach |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| **Host** | `dsh-plugin-shop` | The network (catalog fetch and sha256 verify), the filesystem (cache), `dsh plugin add` under a per-profile mutex | — |
|
|
117
|
+
| **Client** | `dsh-plugin-shop/client` | Exactly five `store/*` Remote methods | The network, the filesystem |
|
|
118
|
+
|
|
119
|
+
Compromising the browser half buys an attacker those five calls and nothing more.
|
|
120
|
+
|
|
121
|
+
## ⚙️ Configuration
|
|
122
|
+
|
|
123
|
+
| Variable | Effect |
|
|
124
|
+
|---|---|
|
|
125
|
+
| `DSH_STORE_CATALOG_URL` | Point the store at your own catalog mirror instead of the public one |
|
|
126
|
+
|
|
127
|
+
## 📚 The catalog
|
|
40
128
|
|
|
41
129
|
Built daily from the public npm registry and published as static JSON:
|
|
42
130
|
|
|
43
|
-
- `https://LivXue.github.io/dsh-plugin-shop/v1/index.json
|
|
44
|
-
|
|
45
|
-
|
|
131
|
+
- [`/v1/index.json`](https://LivXue.github.io/dsh-plugin-shop/v1/index.json) — the pointer, carrying `schemaVersion`, `builtAt`, and the content hash
|
|
132
|
+
- `/v1/plugins.<sha256>.json` — the data, content-addressed and safe to cache indefinitely
|
|
133
|
+
|
|
134
|
+
The pointer is small enough to poll. The store verifies the data file's sha256 against
|
|
135
|
+
the pointer before trusting a byte of it.
|
|
136
|
+
|
|
137
|
+
## ⚠️ What it does not claim
|
|
46
138
|
|
|
47
|
-
|
|
139
|
+
A listing is not an endorsement.
|
|
48
140
|
|
|
49
|
-
|
|
141
|
+
`capabilities` is whatever the author wrote about their own package. **There is no
|
|
142
|
+
sandbox in v0**, and the interface never renders that field as an enforced permission
|
|
143
|
+
list. The `verified` tier means a human read *that exact version*; a newer publish
|
|
144
|
+
downgrades it to `verified-stale` and keeps the review pinned to the version it was
|
|
145
|
+
actually given — so passing review once cannot buy trust for every future release.
|
|
50
146
|
|
|
51
|
-
|
|
52
|
-
their own package — there is no sandbox in v0, and the UI never renders it as an
|
|
53
|
-
enforced permission list. The `verified` tier means a human read that exact
|
|
54
|
-
version; a newer publish downgrades to `verified-stale` and keeps the review
|
|
55
|
-
pinned to the version it was given.
|
|
147
|
+
## 🏷️ For plugin authors
|
|
56
148
|
|
|
57
|
-
|
|
149
|
+
Add `"keywords": ["dsh-plugin"]` to `package.json` and publish. The daily build finds
|
|
150
|
+
you; nothing is submitted to this project. Declare a `dsh.catalog` section to control
|
|
151
|
+
your own category, summary and capabilities — or omit it, and the catalog derives a
|
|
152
|
+
listing from your npm `description`.
|
|
58
153
|
|
|
59
|
-
|
|
60
|
-
[docs/schema.md](https://github.com/LivXue/dsh-plugin-shop/blob/main/docs/schema.md).
|
|
154
|
+
Full reference: [docs/schema.md](https://github.com/LivXue/dsh-plugin-shop/blob/main/docs/schema.md).
|
|
61
155
|
|
|
62
|
-
## License
|
|
156
|
+
## 📄 License
|
|
63
157
|
|
|
64
|
-
MIT
|
|
158
|
+
[MIT](https://github.com/LivXue/dsh-plugin-shop/blob/main/LICENSE) © LivXue
|
package/package.json
CHANGED