Install the "stash-supply-chain-security" agent skill from https://github.com/cipherstash/stack/tree/main/skills/stash-supply-chain-security into .claude/skills/stash-supply-chain-security/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "stash-supply-chain-security", then confirm the skill loads.
Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Type this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
skills CLI
$ npx skills add cipherstash/stack --skill stash-supply-chain-security -a codex
Project install goes to .agents/skills/; add -g for ~/.codex/skills/.
Install the "stash-supply-chain-security" agent skill from https://github.com/cipherstash/stack/tree/main/skills/stash-supply-chain-security into .agents/skills/stash-supply-chain-security/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "stash-supply-chain-security", then confirm the skill loads.
Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add cipherstash/stack --skill stash-supply-chain-security -a cursor
Project install goes to .agents/skills/; add -g for ~/.cursor/skills/.
Install the "stash-supply-chain-security" agent skill from https://github.com/cipherstash/stack/tree/main/skills/stash-supply-chain-security into .cursor/skills/stash-supply-chain-security/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "stash-supply-chain-security", then confirm the skill loads.
Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
skills CLI
$ npx skills add cipherstash/stack --skill stash-supply-chain-security -a gemini-cli
Project install goes to .agents/skills/; add -g for ~/.gemini/skills/.
Install the "stash-supply-chain-security" agent skill from https://github.com/cipherstash/stack/tree/main/skills/stash-supply-chain-security into .gemini/skills/stash-supply-chain-security/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "stash-supply-chain-security", then confirm the skill loads.
Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Installs for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
skills CLI
$ npx skills add cipherstash/stack --skill stash-supply-chain-security -a github-copilot
Project install goes to .agents/skills/; add -g for ~/.copilot/skills/.
Install the "stash-supply-chain-security" agent skill from https://github.com/cipherstash/stack/tree/main/skills/stash-supply-chain-security into .github/skills/stash-supply-chain-security/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "stash-supply-chain-security", then confirm the skill loads.
GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
skills CLI
$ npx skills add cipherstash/stack --skill stash-supply-chain-security -a opencode
OpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
Install the "stash-supply-chain-security" agent skill from https://github.com/cipherstash/stack/tree/main/skills/stash-supply-chain-security into .opencode/skills/stash-supply-chain-security/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "stash-supply-chain-security", then confirm the skill loads.
OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
Facts
Skill name
stash-supply-chain-security
GitHub stars
157
Token cost
~5.2k tokens
SKILL.md length
2,602 words
Files
1
Skills in repo
14
Repo updated
First seen
Licence
MIT
At a glance
Supply-chain security controls for the @cipherstash/stack monorepo.
Works in 7 steps: Post-install scripts disabled by default… → Install cooldown — practice #2 → Lockfile injection prevented — practices… → …
Modifying CI workflows
SKILL.md covers When to Use This Skill, What's Enforced (Config + Test…, What's Documented but Not… and Publishing — OIDC trusted…, plus 2 more sections
Calls npm, pnpm and changeset; reaches github.com and registry.npmjs.org; needs NPM_TOKEN and GITHUB_TOKEN
What it does
Stash Supply Chain Security is an agent skill from cipherstash/stack. Supply-chain security controls for the @cipherstash/stack monorepo. Covers post-install script policy (onlyBuiltDependencies), install cooldown (minimumReleaseAge), lockfile integrity (blockExoticSubdeps + lockfile registry check), frozen-lockfile CI, registry pinning (.npmrc), Dependabot cooldown, CODEOWNERS, and npm OIDC trusted publishing / provenance (including claiming a new package name). Use when modifying CI workflows, pnpm config, dependency updates, .github/dependabot.yml, release.yml, publishing a…
Its SKILL.md is about 5.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Dependency management and Supply chain security. It works with npm, pnpm, GitHub and PostgreSQL. The repository describes itself as: Searchable, application-level encryption for building privacy-first apps. The licence is MIT.
When your agent uses it
Modifying CI workflows
Dependency updates
.github/dependabot.yml
Publishing a package to npm for the first time
Example prompts
“/stash-supply-chain-security”
Requirements
Docker
A credential in NPM_TOKEN
A credential in GITHUB_TOKEN
Workflow steps
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4c2fe08. It shows what the files ask for, not the result of running them.
Tool permissions
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Runs code
Shell commands in SKILL.md call:
npm
pnpm
changeset
git
From the folder's file list and the shell code blocks in SKILL.md.
Network
Hosts in commands or code, which the agent is likely to contact:
github.com
registry.npmjs.org
Also links to:
socket.dev
From URLs in SKILL.md, links to its own repository left out.
Credentials
Names these keys or tokens, usually read from environment variables:
NPM_TOKEN
GITHUB_TOKEN
NODE_AUTH_TOKEN
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Context cost
Stash Supply Chain Security loads about 5.2k tokens when it runs. Until then it costs about 158 tokens; SKILL.md has 2,602 words of instructions outside code blocks.
Always· name and description, kept in context so the agent knows when to use it
~158
When it runs· the whole SKILL.md, loaded when a task matches
~5.2k
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
Safety
Auto-check: warnings
The automated check found patterns that need a careful read before installing.
WarningMentions a credentials file (SSH keys, cloud or package-manager tokens)SKILL.md:3
WarningMentions a credentials file (SSH keys, cloud or package-manager tokens)SKILL.md:13
yaml`, `package.json` `pnpm` block, or `.npmrc`
WarningMentions a credentials file (SSH keys, cloud or package-manager tokens)SKILL.md:77
`.npmrc` pins both the default registry and the `@cipherstash` scope to `https://registry.npmjs.org/`. Auth tokens stay
WarningMentions a credentials file (SSH keys, cloud or package-manager tokens)SKILL.md:79
- **Test asserts**: `.npmrc` contains both pin lines and no `_authToken` / `NPM_TOKEN`
NoteMentions a .env fileSKILL.md:123
`tests.yml` writes `.env` files at CI time from GitHub Secrets. This is acceptable: secrets are never committed, scoped
NoteMentions a .env fileSKILL.md:125
Do **not** commit any `.env` file to the repo.
WarningMentions a credentials file (SSH keys, cloud or package-manager tokens)SKILL.md:156
.** `changesets/action` writes a token `.npmrc` when it sees one, which shadows OIDC and fails every publish with E404 (
WarningMentions a credentials file (SSH keys, cloud or package-manager tokens)SKILL.md:212
what writes an `_authToken` line into `.npmrc`), and
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
Download SKILL.mdSave it as .claude/skills/stash-supply-chain-security/SKILL.md (or your agent's skills folder).
name
stash-supply-chain-security
description
Supply-chain security controls for the @cipherstash/stack monorepo. Covers post-install script policy (onlyBuiltDependencies), install cooldown (minimumReleaseAge), lockfile integrity (blockExoticSubdeps + lockfile registry check), frozen-lockfile CI, registry pinning (.npmrc), Dependabot cooldown, CODEOWNERS, and npm OIDC trusted publishing / provenance (including claiming a new package name). Use when modifying CI workflows, pnpm config, dependency updates, .github/dependabot.yml, release.yml, publishing a package to npm for the first time, or anything that touches how packages enter the build.
Supply Chain Security
Controls applied in this repo to limit blast radius from compromised npm packages, lockfile injection, dependency confusion, and rushed dependency upgrades. Sourced from lirantal/npm-security-best-practices and adapted for our pnpm workspace.
When to Use This Skill
Modifying any file under .github/workflows/
Editing pnpm-workspace.yaml, package.jsonpnpm block, or .npmrc
Updating .github/dependabot.yml or .github/CODEOWNERS
Adding a dependency that needs a build script (i.e. node-gyp, node-pty, prebuilt binaries)
Bypassing the install cooldown for a security fix
Publishing a package to npm under a name that has never been published before
Reviewing a PR that touches any of the above
What's Enforced (Config + Test Gate)
Each control below is validated by e2e/tests/supply-chain.e2e.test.ts — the test suite fails CI if a control regresses, so silent removal isn't possible.
1. Post-install scripts disabled by default — practice #1
pnpm 10+ disables lifecycle scripts globally and only runs them for packages on the onlyBuiltDependencies allowlist.
Where: package.jsonpnpm.onlyBuiltDependencies
Current allowlist: ["node-pty"] (PTY tests need the native module built)
Test asserts: allowlist length ≤ 3 — adding a fourth entry forces explicit review
2. Install cooldown — practice #2
New package versions wait 7 days before they're eligible for install. Mirrors the Dependabot cooldown so manual + automated updates have the same community-discovery window.
pnpm-workspace.yamlblockExoticSubdeps: true — pnpm refuses to install transitive deps that come from git or direct tarballs (pnpm ≥ 10.26)
A test parses pnpm-lock.yaml and asserts every resolved tarball URL starts with https://registry.npmjs.org/
(Why not lockfile-lint? It only supports npm/yarn lockfiles. The pnpm-native test gives us the same protection.)
4. Frozen lockfile in CI — practice #5
CI uses pnpm install --frozen-lockfile. If pnpm-lock.yaml and any package.json drift, the install aborts — no silent registry fetches that bypass the locked versions.
Where: every workflow under .github/workflows/, and every local composite action under .github/actions/
Test asserts: no pnpm install step anywhere in that graph is missing --frozen-lockfile
The check used to read tests.yml alone, and release.yml — the one workflow
that publishes to npm — ran a bare pnpm install the whole time. The single
install allowed to resolve outside the lockfile was the one whose output goes to
the registry.
5. Cooldown'd auto-updates — practice #6
Dependabot opens grouped, cooldown'd PRs (7 days minor/patch) for npm, cargo, gomod, github-actions and docker (the digest of the Alpine image the musl binaries are built in). Major bumps are not proposed at all — every entry ignores version-update:semver-major, so majors are reviewed and applied by hand.
There is deliberately no semver-major-days cooldown on any entry. It would delay major version update PRs, which the ignore above means Dependabot never opens, and cooldown does not reach the security path either ("the cooldown option is only available for version updates, not security updates"). Don't add one back as a safety net for the day the ignore is dropped — dead config reads as policy, and the test below fails on the pair.
cargo covers the in-tree Rust workspace at languages/typescript/packages/protect-ffi (not the repo root — that is where Cargo.toml/Cargo.lock live). It runs monthly rather than weekly because each bump costs a native rebuild to validate, and it ignores the exact-pinned CipherStash crates (cipherstash-client, cts-common, stack-auth, stack-profile, eql-bindings, vitaminc) — they share a release train with the @cipherstash/auth catalog and must be bumped together, manually.
Where: .github/dependabot.yml
Test asserts: cooldown ≥ 3 days on every entry; the sentence above names every monitored ecosystem; every entry ignores version-update:semver-major for *and sets no semver-major-days (both ends, so neither half can drift alone); every lockfile present in the repo maps to a monitored package-ecosystem; every entry's directory actually contains the manifest its ecosystem reads
The ecosystem-coverage assertion is derived from the filesystem, so adding a lockfile for a new language fails the suite until dependabot.yml covers it. Two lockfiles are exempt because Dependabot has no ecosystem for them (e2e/wasm/deno.lock, .flox/env/manifest.lock); both are named with their reason in the test.
Note that ignore conditions suppress Dependabot security PRs too, not just version updates. The compensating control is OSV: .github/workflows/osv-scanner.yml scans --recursive ./, which reaches every lockfile in the tree (including Cargo.lock) and reports to code scanning.
6. Registry pinning — practice #16
.npmrc pins both the default registry and the @cipherstash scope to https://registry.npmjs.org/. Auth tokens stay in user-level ~/.npmrc or env vars — never committed.
Test asserts: .npmrc contains both pin lines and no _authToken / NPM_TOKEN
7. Governance (CODEOWNERS)
.github/CODEOWNERS requires @cipherstash/developers review for every supply-chain critical file. Combined with branch protection (configured in repo settings, not in this repo), this prevents single-actor changes to the chain.
Test asserts: CODEOWNERS lists each critical path
What's Documented but Not Enforced
These controls depend on developer environment or org-level configuration — we describe them here but don't gate CI on them.
Harden installs locally — practice #3
For local installs of new packages, consider running them through one of:
Neither is required, but they're cheap insurance when adding a new direct dependency.
2FA on npm accounts — practice #10
Every maintainer with publish access to @cipherstash/* should have:
bash
npm profile enable-2fa auth-and-writes
Releases no longer depend on this — release.yml publishes via OIDC and holds no
long-lived token (see "Publishing" below). 2FA still matters for the manual
publishes that OIDC can't cover: claiming a new package name, npm deprecate,
and npm dist-tag changes.
Reduce dependency tree — practice #13
Before adding a new direct dep, ask:
Does Node ≥ 22 (our minimum) already provide this?
Is the package actively maintained? Check Snyk's database (security.snyk.io) — practice #14
What does npm pack <pkg> show in the actual tarball? (npmjs.org's web view can lie — practice #15)
Secrets in CI
tests.yml writes .env files at CI time from GitHub Secrets. This is acceptable: secrets are never committed, scoped to the runner, and rotate via the GitHub UI. The .env files exist only for the lifetime of the job.
Do not commit any .env file to the repo.
Treat OIDC as a transport, not as a synonym for publishing. A non-publishing
workload-identity exchange still needs job-level id-token: write, but it must
be classified separately from registry publishers in
scripts/__tests__/workflow-publish-permissions.test.mjs, with the audience and
reason recorded there. Keep its static credential inputs absent and grant only
the repository permissions the job actually needs.
A job's permissions: block limits only that job's GITHUB_TOKEN. Some actions
use the OIDC token to obtain a different GitHub token instead —
anthropics/claude-code-action, given no github_token input, exchanges it for
a Claude GitHub App installation token with write access to contents, pull
requests and issues. Check which token an action actually uses, and pass
github_token: ${{ secrets.GITHUB_TOKEN }} where the action accepts one, so the
grants you reviewed are the grants that apply.
.github/workflows/release.yml publishes to npm with no NPM_TOKEN. It
authenticates via npm OIDC trusted publishing, and provenance attestations are
generated automatically as a side effect. Verify any published version with:
Constraints baked into that workflow — don't undo them:
permissions: id-token: write is what mints the OIDC token. Without it every publish fails — but it belongs on the publishing jobs, never at the workflow level. A trusted publisher is registered against a repository and a workflow filename, so once release.yml is the registered publisher, npm accepts a token minted by any job in that file: the registry cannot tell the cheap every-push gate apart from the publish job. Declared at the top, it reaches every job that does not override it, including the one added next month by someone who never read this page. release.yml therefore grants contents: read at the workflow level and escalates per job, so a new job has to ask for the credential in its own diff. Enforced by scripts/__tests__/workflow-publish-permissions.test.mjs, which also holds the list of jobs allowed to hold it.
runs-on: ubuntu-latest, not a self-hosted/Blacksmith runner. npm rejects provenance from non-GitHub-hosted runners with E422.
Never set NPM_TOKEN.changesets/action writes a token .npmrc when it sees one, which shadows OIDC and fails every publish with E404 (npm/cli#8976).
npm ≥ 11.5.1 and Node ≥ 22.14. Node 22 ships npm 10.x, so the workflow installs npm@^11.5.1 explicitly before publishing.
No Actions cache in this workflow (no cache:, package-manager-cache: false, pnpm/action-setup with cache: false). A poisoned cache entry would execute in a credential-bearing job. Enforced by scripts/lint-no-workflow-caching.mjs, which also follows any local composite action or reusable workflow the job reaches — the rule is about the whole call tree, not the one file.
Every published uses: must be in that script's AUDITED_ACTIONS allowlist. The gate cannot open a published action to check whether it caches, and the ones that do are not all named "cache" — a setup-<tool> action that caches by default has no cache: input and no telling name. So the list is what is permitted, and an action it has never met fails by default. Adding a step to release.yml, _build-ffi-artifacts.yml or tests-supply-chain.yml means auditing the action and adding it there with the reason, in the same PR.
Three actions must disable caching explicitly, and the input differs for each. Allowlisting an action is not the same as it being safe by default:
Action
Input
Its default
Required
pnpm/action-setup
cache
false
cache: false
actions/setup-node
package-manager-cache
true
package-manager-cache: false
jdx/mise-action
cache
true
cache: false
yaml
- uses: jdx/mise-action@<sha> # v3.6.3
with:
install: true
working_directory: languages/typescript/packages/protect-ffi
cache: false # defaults to TRUE — omitting this restores the Actions cache
Omitting the key is not "no caching" for the bottom two, it is caching spelled invisibly. The gate's generic rule only fires on a truthycache: value, so a missing key is invisible to it — which is exactly how a mise-action step with no cache: passed until each action got its own explicit-false assertion.
Show full SKILL.md (1,049 more words)Show less
The native-binding publish path
@cipherstash/protect-ffi and its six @cipherstash/protect-ffi-<platform>
packages ship compiled binaries, which changeset publish cannot produce: it
packs from the workspace, where index.node is a build output. So release.yml
publishes them itself, before changesets runs, and the same constraints apply to
that job — GitHub-hosted runner, id-token: write, no NPM_TOKEN,
npm ≥ 11.5.1, no Actions cache.
scripts/release-gate.mjs asks the registry which committed versions are
missing. It is not a cost optimisation: if it wrongly reports nothing to
publish, changesets publishes six platform packages with no binary in them.
Every failure mode in it throws rather than answering "nothing to publish".
_build-ffi-artifacts.yml is a reusable workflow, and only builds. npm
validates a trusted publish against the entry-point workflow's filename,
and its docs call out workflow_call as a known issue: "validation checks
the calling workflow's name instead of the workflow that actually contains the
publish command, which can cause configuration mismatches", with
id-token: write required in both parent and child. A publish inside a
reusable workflow is therefore validated against whichever workflow called it.
Keeping it in release.yml — the registered filename, as an entry-point job
rather than a call — is correct whichever way that resolves. The reusable
workflow is on the no-caching gate's target list for the same reason
release.yml is: everything it produces gets published.
Platform packages publish before the wrapper. The wrapper's six
optionalDependencies are exact versions, so publishing it first exposes a
version whose binaries do not exist yet.
ffi-preflight.yml is the dry run — changeset publish has no --dry-run.
Dispatch it against a Version Packages branch and it builds the real tarballs,
checks each binary's architecture and libc, installs the host pair and loads
it. It cannot publish, and "no id-token" is only half of why: that closes
the OIDC path, while a plain NPM_TOKEN would still authenticate one. Both
are absent — the workflow grants contents: read, passes no secrets (no
secrets: inherit on its call into the build workflow), sets no
registry-url (which is what writes an _authToken line into .npmrc), and
names no NPM_TOKEN or NODE_AUTH_TOKEN. Keep it that way; adding any one of
them turns a dry run into a publisher.
Trusted publishing is configured per package on npmjs.com (package settings →
Trusted publisher → GitHub Actions): owner/repo cipherstash/stack, workflow
filename release.yml (filename only, with extension — not a path), environment
blank. npm does not validate this on save, so a typo only surfaces as a failed
publish. For configurations created after 2026-05-20 npm also requires an
explicit Allowed actions selection — pick npm publish.
repository.url must exactly match the publishing repository
(https://github.com/cipherstash/stack). npm checks it on a trusted publish and
rejects a mismatch; nothing warns beforehand. A package moved between
repositories needs its manifest updated in the same change as its publisher —
and for a package published from a subdirectory, repository.directory is
resolved from that repository's root, so it moves too.
Publishing a package name for the first time
A trusted publisher can only be attached to a package that already exists on the
registry, so a brand-new name can't be released by release.yml on its own —
the first publish has to be manual. This is why @cipherstash/stack-drizzle and
@cipherstash/stack-supabase each carry a 0.0.0 placeholder version.
Do this before the release that would first publish the name:
npm login as a maintainer with publish rights on the @cipherstash scope.
Publish a placeholder to claim the name. Use pnpm publish, not npm publish — workspace packages depend on each other via workspace:* and only pnpm rewrites that protocol on pack:
bash
pnpm --filter <pkg> build
cd packages/<dir>
npm version 0.0.0 --no-git-tag-version
pnpm publish --tag bootstrap --access public --no-git-checks
git checkout package.json # restore the real version
This publish has no provenance — it predates the trusted-publisher config by
definition. That's expected and is the only unattested version.
Register the trusted publisher on npmjs.com as described above.
npm deprecate <pkg>@0.0.0 "Placeholder package" so nothing installs it silently.
After the real release lands, clean up the placeholder tags — changeset publish never removes a tag it didn't create:
bash
npm dist-tag rm <pkg> bootstrap
The first publish also sets latest to 0.0.0 regardless of --tag, so keep the
gap between the placeholder and the real release short, and confirm
npm view <pkg> dist-tags afterwards.
Also confirm the package's package.json has "publishConfig": {"access": "public"} —
.changeset/config.json sets access: "restricted" repo-wide, and the per-package
field is what overrides it.
Common Operations
Add a dependency that needs a build script
Vet the package: latest version, active maintenance, reasonable download counts, source visible on GitHub.
Run npm pack <pkg> and inspect the tarball — confirm the install script is what you expect.
Add to package.jsonpnpm.onlyBuiltDependencies:json
Update the supply-chain test's allowlist threshold if you'd be adding the 4th entry — and explain in the PR why the count needs to grow.
Run pnpm install to confirm the build script executes.
Bypass the install cooldown for a security fix
When CVE response needs a patch faster than 7 days:
Pin the exact patched version (a pnpm override scoped to the vulnerable
range for transitive deps, or the manifest for direct deps) so the bypass
run can only admit that one release.
Run a one-off install with the cooldown disabled for that single run
(pnpm ≥ 10 has no dedicated flag; the CLI config override is the one-off
equivalent and does not persist — kebab-case is the canonical form,
though pnpm 10.x accepts the camelCase spelling too):
bash
pnpm install --config.minimum-release-age=0
Once the patched version is in pnpm-lock.yaml, normal and
--frozen-lockfile installs succeed without any bypass — locked versions are
not re-age-checked. Do NOT add third-party packages to
minimumReleaseAgeExclude: that list is for first-party packages only and a
name-scoped entry exempts every future release of the package until removed.
Document the bypass in the PR description (CVE ID, why the cooldown was the bottleneck) so the next reviewer can follow the reasoning.
Add a new dev dependency
No special steps — Dependabot will pick it up on the next weekly run (after the cooldown window). For immediate use, just pnpm add -D <pkg>.
Change a CI workflow
CODEOWNERS will request review from @cipherstash/developers. The supply-chain test will fail if the change drops --frozen-lockfile or downgrades Node.
Stash Supply Chain Security next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
Stash Supply Chain Security compared with similar skills
Skill
Stars
Used in
Tokens
Auto-check
Licence
Repo updated
Stash Supply Chain Security this skillcipherstash/stack
Safely plan and execute dependency maintenance for JavaScript/TypeScript (npm, pnpm) and GitHub Actions, including npm lockfiles, pnpm workspaces, catalogs, overrides, SHA-pinned action versions…
Fix a PR that is failing due to security or vulnerability issues — npm/pnpm/yarn/bun audit failures, CVE alerts, Dependabot merge conflicts, Snyk failures, or GitHub security advisory blocks.
A skill your agent uses when the user says 'dependency audit', 'npm audit', 'pip audit', 'cargo audit', 'security vulnerabilities', 'outdated packages', 'supply chain', or needs to scan project…
Sequences safe dependency upgrades: read the changelog, verify the version exists upstream, pin it, and keep major bumps in separate commits behind a full gate run.
How an agent files a GitHub issue on cipherstash repos — required structure (Background / Problem / Proposal), dumbed-down wording rules, and pre-filing checks.
How an agent authors branches, commits, and pull requests on cipherstash/stack — naming, signed commits, the changeset/skills/meta-file checklist, and PR body structure with dumbed-down wording.
Deploy a CipherStash encryption rollout to a live environment without losing data — the multi-deploy ladder (schema-add + dual-write → backfill → read cutover → stop dual-writes → drop plaintext)…
Run CipherStash encryption on edge and non-Node runtimes with the @cipherstash/stack/wasm-inline entry — Deno, Supabase Edge Functions, Cloudflare Workers, and Bun.
Supply-chain security controls for the @cipherstash/stack monorepo. Stash Supply Chain Security is an agent skill from cipherstash/stack. Supply-chain security controls for the @cipherstash/stack monorepo.
When should I use Stash Supply Chain Security?
Stash Supply Chain Security fits situations like: modifying CI workflows; dependency updates; .github/dependabot.yml; publishing a package to npm for the first time.
How do I install Stash Supply Chain Security in Claude Code?
Run `npx skills add cipherstash/stack --skill stash-supply-chain-security -a claude-code`. Or copy the skill folder (skills/stash-supply-chain-security in cipherstash/stack) into .claude/skills/stash-supply-chain-security in your project. Claude Code loads it when a task matches its description.
How do I install Stash Supply Chain Security in Codex?
Run `npx skills add cipherstash/stack --skill stash-supply-chain-security -a codex`. Or copy the skill folder (skills/stash-supply-chain-security in cipherstash/stack) into .agents/skills/stash-supply-chain-security in your project. Codex loads it when a task matches its description.
Can I use Stash Supply Chain Security in Cursor, Gemini CLI or GitHub Copilot?
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cipherstash/stack --skill stash-supply-chain-security -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/stash-supply-chain-security, .gemini/skills/stash-supply-chain-security, .github/skills/stash-supply-chain-security and .opencode/skills/stash-supply-chain-security in your project.
What does Stash Supply Chain Security need to run?
Going by SKILL.md and its folder, Stash Supply Chain Security needs the command-line tools its instructions call (npm, pnpm, changeset and git) and credentials named NPM_TOKEN, GITHUB_TOKEN and NODE_AUTH_TOKEN. Our summary lists: Docker; A credential in NPM_TOKEN; A credential in GITHUB_TOKEN.
Does Stash Supply Chain Security access the network?
SKILL.md names 3 domains. In commands or code: github.com and registry.npmjs.org; the agent is likely to contact these when it follows the instructions. As links in the text: socket.dev. This is read from the text; nothing was executed.
Is Stash Supply Chain Security safe to install?
Our automated static check of SKILL.md flagged 6 warning(s): mentions a credentials file (ssh keys, cloud or package-manager tokens). Read the flagged lines before installing; the check is not a guarantee either way.
What licence does Stash Supply Chain Security use?
Stash Supply Chain Security is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
How many tokens does Stash Supply Chain Security use?
About 5.2k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
What are the alternatives to Stash Supply Chain Security?
Skills that share tags, products or a category with Stash Supply Chain Security: Linea Dependency Maintenance (Consensys-Incorporated/linea-attestation-registry, 177 stars), npm Supply Chain Security (bodadotsh/npm-security-best-practices, 858 stars), Fix Security PR (unional/typescript-blackbook, 133 stars) and Interlinked Supply Chain (QuentinCody/interlinked-cli, 178 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Who maintains Stash Supply Chain Security?
cipherstash (a GitHub organization) maintains it in cipherstash/stack, which has 157 GitHub stars. The repository holds 14 skills in this directory. The repository was last updated on October 9, 2026.
Source: cipherstash/stack on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.