Release and publishing
August 19, 2026 ยท View on GitHub
This is the release runbook for @securstack/dsh-plugin. The complementary infrastructure source of truth is ../securstack-infra/docs/deepseek-harness-plugin.md in the standard SecurStack sibling-repository layout.
Required identities
- npm releases must be authenticated as the npm user
securstack. - Public GitHub pushes must be authenticated as the GitHub account
securstack. - Personal accounts must not publish the npm package or push public releases.
- Tokens and PATs must stay outside Git, documentation, scripts, environment examples, and persisted remote URLs.
In the standard sibling-repository layout, the canonical local npm credential is stored in the ignored file ../securstack-infra/.env.npm-publish, using the SECURSTACK_NPM_TOKEN variable. Its committed template is ../securstack-infra/.env.npm-publish.example. The real value must never be committed.
The npm scope @securstack belongs to the npm user securstack; a separate npm organization is neither required nor expected for this package.
Repository remotes
originis the private Bitbucket repository and the normal destination for local commits.githubis the public repository athttps://github.com/securstack/securstack-dsh-plugin.- GitHub publication requires a fine-grained PAT from the
securstackaccount withContents: Read and writefor this repository, or another approved authentication mechanism for that account. - Never force-push merely to reconcile the Bitbucket and GitHub histories. Publish the same reviewed change on each existing history without rewriting either remote.
Compatibility guard
@deepseek-ai/dsh-tools must remain in peerDependencies and devDependencies, aligned with the supported DSH runtime. It must not be placed in dependencies: installing a private runtime copy can shadow the DSH Desktop tool registry and cause tool calls to fail before their results are recorded.
After packing the plugin, install the tarball into a disposable DSH profile and confirm that the profile does not contain its own node_modules/@deepseek-ai/dsh-tools copy.
The managedCliVersion declared in src/cli-manager.ts must already exist at
downloads.securstack.io for every supported platform before this plugin is
published. Test a clean-machine download and checksum failure path; never
publish a plugin that points at a pending CLI release.
Release checklist
-
Confirm the intended version in
package.jsonandpackage-lock.json. -
Confirm npm authentication before doing any publish work:
set -a source ../securstack-infra/.env.npm-publish set +a npm config set //registry.npmjs.org/:_authToken "$SECURSTACK_NPM_TOKEN" unset SECURSTACK_NPM_TOKEN npm whoami --registry https://registry.npmjs.org/The command must print exactly
securstack. Stop if it prints another user or returns an authentication error. -
Validate the package:
npm run typecheck npm test npm pack --dry-run -
Commit generated
dist/artifacts whenever source or generated declarations change. Git-based DSH installation requiresdist/index.mjsto exist in the repository. -
Push the reviewed commit to
origin main. -
Push the equivalent reviewed change to
github main, authenticated as GitHubsecurstack. Do not use a personal account and do not force-push. -
Publish the public npm package:
npm publish --access public --registry https://registry.npmjs.org/publishConfigalso pins public access and the official npm registry, but the explicit flags make the release intent auditable. -
Verify the registry result:
npm view @securstack/dsh-plugin version dist-tags --json \ --registry https://registry.npmjs.org/ -
Reinstall the registry version in a disposable DSH profile and validate the composed profile configuration before announcing the release.
Marketplace requirement
The DSH Desktop community market installs verified npm targets. The published package must therefore keep its repository backlink to https://github.com/securstack/securstack-dsh-plugin, and the marketplace catalog must identify @securstack/dsh-plugin as a verified npm install method.