Repository navigation
v3.8.4 — Secrets stop reaching the log, and static analysis runs on every commit
Security
The logger no longer writes secrets in clear text (CodeQL js/clear-text-logging).
logger.js serialised its structured data to JSON with no filter, into two places outside your control: ~/.ssh-manager.log and stderr, which your MCP host captures. One call site handing it a whole server config would have persisted a production password on disk, in two copies.
Redaction now happens inside the logger, not at each call site — any key matching password / passphrase / secret / token / credential / private_key / api_key / auth becomes [redacted], at any depth, inside arrays, whatever the casing. Cyclic objects are marked rather than followed, so a self-referencing config cannot hang a log call. Guarded by npm run test:redaction and verified by mutation.
No action needed — no configuration or API changes.
Added
- CodeQL analysis on every push and pull request (
security-and-quality). For a server that turns model output into shell commands on production hosts, "we read it carefully" is not an answer. Every fix in this release came out of its first run, andsrc/now has zero open findings.
Changed
- Every GitHub action pinned to a commit SHA, including
trufflesecurity/trufflehog, which tracked the movingmainbranch inside a workflow with read access to the whole repository. Closes 17 of the 22 OpenSSF Scorecard findings. - Dependabot alerts and automated security fixes enabled — they were switched off.
- The
Releaseworkflow is re-runnable: it skips publishing when the version is already on the registry, and creates the GitHub release if the SBOM step finds none.
Fixed
examples/backup-workflow.jsnever parsed — a cron expression (*/6) inside a/* */block closed the comment early — and calledcreateBackup(...), a function that exists nowhere. It was documentation of conversations with the agent, not a JavaScript API, and it shipped inside the npm tarball. It is nowexamples/backup-workflow.md.scripts/validate.shchecks all 49 tracked.jsfiles instead of only two, which is how the above stayed broken for months. The guard is itself verified by deliberately breaking a file.- Three time-of-check/time-of-use races in
ssh-key-manager.jsandconfig-loader.js.
Full changelog: https://github.com/bvisible/mcp-ssh-manager/blob/main/CHANGELOG.md#384---2026-08-28