Document the settings card and the status pre-flight

Including the part that matters operationally: a client half's bytes are
snapshotted at activation, so the card only appears after the profile restarts.
Without it the namespace still works — settings.yaml and the `configure` action —
there is simply no form drawn.
This commit is contained in:
dsh-slopo agent committed 2026-09-22 07:22:03 +01:00
1 parent 0028349d53
commit 534efa8b50
1 file changed
+30 -5
+30 -5
View File
@@ -6,7 +6,7 @@ detector — as a DeepSeek Harness bundle.
Slopo finds non-obvious duplicated logic: similar implementations of the same Slopo finds non-obvious duplicated logic: similar implementations of the same
problem that are not copy-paste, and that a human reviewer, a coding agent and a problem that are not copy-paste, and that a human reviewer, a coding agent and a
clone detector all miss. This bundle gives you three user-triggered skills and clone detector all miss. This bundle gives you three user-triggered skills and
one configuration-aware tool, so you can run it against whichever workspace you one configuration-aware tool, and a settings card. Run it against whichever workspace you
are in without remembering flags. are in without remembering flags.
## What it adds ## What it adds
@@ -17,8 +17,8 @@ are in without remembering flags.
| `/slopo-analyze-ignore` | Triages the whole codebase's clusters, writing the obvious false positives into the ignore file. | | `/slopo-analyze-ignore` | Triages the whole codebase's clusters, writing the obvious false positives into the ignore file. |
| `/slopo-analyze-one` | Reports one cluster at a time — optionally by hash — and judges whether it is worth acting on. | | `/slopo-analyze-one` | Reports one cluster at a time — optionally by hash — and judges whether it is worth acting on. |
| the `slopo` tool | Resolves the CLI, materialises the config, runs the work, and turns slopo's terse failures into something actionable. | | the `slopo` tool | Resolves the CLI, materialises the config, runs the work, and turns slopo's terse failures into something actionable. |
| the `dsh-slopo` settings namespace | The embedding backend and per-workspace state, editable at runtime. | | the `dsh-slopo` settings namespace | The embedding backend and per-workspace state, registered on the Host. |
| the settings card | A form for all of it, in Settings → Plugins → Plugin configuration. |
All three skills are **user-invocable and deliberately not model-invocable**, All three skills are **user-invocable and deliberately not model-invocable**,
matching slopo's own agent configs. Typing `/slopo-review` anywhere in a message matching slopo's own agent configs. Typing `/slopo-review` anywhere in a message
injects that skill; the model will not reach for one on its own. Every one of injects that skill; the model will not reach for one on its own. Every one of
@@ -30,13 +30,30 @@ these commands can spend minutes embedding, so the human decides when.
dsh plugin --profile web add git+https://git.notexpectedyet.com/Not-Expected-Yet/dsh-slopo.git dsh plugin --profile web add git+https://git.notexpectedyet.com/Not-Expected-Yet/dsh-slopo.git
``` ```
Then restart the profile — a new bundle's modules are resolved at startup. Then restart the profile. A new bundle's modules are resolved at startup, and a
client half's bytes are snapshotted at activation — so the settings card only
appears after that restart.
Plain ESM, no build step, and therefore no `prepare` script and no `allowBuilds` Plain ESM, no build step, and therefore no `prepare` script and no `allowBuilds`
entry to authorise. That is deliberate: `dsh plugin add git+…` fetches the source entry to authorise. That is deliberate: `dsh plugin add git+…` fetches the source
tree rather than build output, so a `prepare` script would make every user tree rather than build output, so a `prepare` script would make every user
allowlist a build before the first install can succeed. allowlist a build before the first install can succeed.
## Settings
The plugin contributes a card to **Settings → Plugins → Plugin configuration**,
keyed on the `dsh-slopo` settings namespace the Host registers. Every setting in
the table below is editable there, overridden fields are marked, and Reset
returns a field to the deployment default rather than to empty.
The card is the bundle's second half — the browser half. It needs no build step
and ships as plain ESM in the module-loader wrapper, but the platform snapshots
client bundles at activation, so **a client half only appears after the profile
restarts.** Without it the namespace still works — it is editable in
`$DSH_HOME/settings.yaml` and through the tool's `configure` action — there is
simply no form drawn for it, because the tab renders the intersection of served
namespaces and registered cards.
## Configure it ## Configure it
Nothing is defaulted. Slopo itself requires a source directory, an embedding Nothing is defaulted. Slopo itself requires a source directory, an embedding
@@ -118,7 +135,7 @@ Or drive the tool directly:
| Action | What it does | | Action | What it does |
| --- | --- | | --- | --- |
| `status` | Resolved settings, index state, binary, and what is still missing. | | `status` | Everything: resolved settings, index state, the binary and its version, plus a live pre-flight against the embedding endpoint. |
| `configure` | Patch the settings namespace. | | `configure` | Patch the settings namespace. |
| `prepare` | `slopo index` then `slopo embed` — the slow, possibly costly phase. | | `prepare` | `slopo index` then `slopo embed` — the slow, possibly costly phase. |
| `review` | Similar code involving Git changes (`base` defaults to `HEAD`). | | `review` | Similar code involving Git changes (`base` defaults to `HEAD`). |
@@ -228,6 +245,14 @@ that silently does nothing. Two real bugs were caught this way: a config
renderer that would write the API key to disk if handed one, and `--config-version` renderer that would write the API key to disk if handed one, and `--config-version`
placed before the subcommand, which slopo rejects with a usage error. placed before the subcommand, which slopo rejects with a usage error.
The browser half has no browser to run in, so its tests evaluate the bundle the
way the real module loader does — inside `window.__ModuleLoader__.load` — with a
fake `require` that answers `react` and throws on anything else. That last part is
deliberate: it checks the card stays inside the platform's seed table, which is
the constraint a hand-written client half is most likely to break. The card is
then rendered and its handlers driven, which is not a substitute for looking at
it but does cover the wiring it cannot work without.
`node_modules/@deepseek-ai` is a local symlink to the installed harness so the `node_modules/@deepseek-ai` is a local symlink to the installed harness so the
`@deepseek-ai/*` imports resolve during tests. It is gitignored and is not a `@deepseek-ai/*` imports resolve during tests. It is gitignored and is not a
declared dependency — an out-of-tree bundle that depended on an in-box package declared dependency — an out-of-tree bundle that depended on an in-box package