Repository navigation
Installs that work — on DeepSeek Harness 0.2.1, on Windows, on profiles made
before 0.2.1, and with a clear answer when something is missing — plus a fix
that stops a backslash from hiding a control character from permission rules.
Fixed
- Install without pnpm always failed, now it says why. The profile depends
on the app through alink:path, which npm rejects
(EUNSUPPORTEDPROTOCOL), so the installer's npm fallback never worked: a
machine without pnpm ended with a broken profile. The installer now stops
with a message naming pnpm and how to install it. - Windows. The installer found
dshthrough/bin/sh, which Windows does
not have, so no Harness packages were linked and the app could not boot. It
now searchesPATHwithPATHEXTitself, finds dsh's package next to npm's
dsh.cmdshim, and links with junctions, which need neither Developer Mode
nor an elevated shell. Themoqilauncher runs dsh's own entry script with
Node instead of spawningdsh.cmd, which Node refuses without a shell. moqi installrepairs profiles made before dsh 0.2.1. Their
pnpm-workspace.yamllackedautoInstallPeers: false, so pnpm put plugins'
@deepseek-ai/*peers into the profile, where they shadowed the Harness's
own and could stop dsh from starting ("required plugin did not activate").
The installer now adds or corrects that one line, keeping the rest of the
file, and deletes the stale copies together withpnpm-lock.yamlso the
install re-resolves without them. It prints a line for each repair, and
nothing when the profile is fine.
Security
- A backslash can no longer slip a control character past a permission
rule. The command matcher refuses any command containing control
characters, but a bash backslash directly before one consumed it unchecked,
so a rule such asbash(echo *)could auto-allow a command carrying raw
terminal escape sequences. Control characters are now refused over the whole
command, in every quoting context and in rule patterns too; commands without
control characters match exactly as before.
Changed
- pnpm is required to install the profile (
npm install -g pnpm, or
corepack enable pnpmon Node 22/24). The Harness's own plugin manager
needs it too.
Documentation
docs/install.mdand the README cover pnpm, Windows, the dsh desktop app
(nodshonPATH, so moqi needs the CLI; what to do if the app stops
starting after a plugin install), upgrading a profile made before dsh 0.2.1,
Node version managers, and npm 11's "install scripts skipped" warning
(harmless).
Internal
- CI installs moqi the way a user does, on Linux, macOS and Windows: dsh
atlatest, the packed tarball,moqi install, boot to--dump-config, and
no@deepseek-ai/*copy left in the profile. A guard fails the build if a
Harness package is ever listed underdependencies. - A watch on every dsh release. Every three hours
dsh-compat.ymlchecks
npm for a new@deepseek-ai/dshonlatest/nextand tests moqi and its
three plugins against it — published and frommain— recording results in
a "dsh compatibility" issue and opening one issue per break. - SonarCloud at zero. The 55 findings 0.5 introduced are cleared:
complexity splits in the permission rules parser, the git workspace, memory,
and the app shell, each pinned by tests written against the old code first;
no behavior change. Two sequential git loops keepawaitin the loop on
purpose and say why. npm testfinds its suites.scripts/run-tests.mjsruns every
tests/*-smoke.{ts,mjs}, thenfunctional.tsandpty.ts, each in its
own process; adding a suite no longer editspackage.json.npm test -- <filter>runs a subset and--listprints the set.- Workflows are linted. CI runs actionlint on every workflow, since GitHub
only parses a scheduled or manual one when it runs — which is how the dsh
watch first shipped with a job-levelrunner.tempit refused to start.
Install: npm install -g @deepseek-ai/dsh pnpm moqi-tui@0.5.1, then moqi.