Agent skill
publish-npm-package
Quellcode ansehen: yigitkonur/skills-by-yigitkonur
Installation
npx skills add yigitkonur/skills-by-yigitkonur --skill publish-npm-package77
Installationen
EU-hosted inference API
Power your AI agent skills with open-source models.
Drop-in OpenAI-compatible API. No data leaves Europe.
MiniMax
MiniMax M3
$0.40 / $1.40
per M tokens
Z.ai
GLM 5.3 Flash
$0.20 / $0.60
per M tokens
MoonshotAI
Kimi K3
$4.00 / $18.00
per M tokens
DeepSeek
DeepSeek V4.1 Flash
$0.40 / $1.40
per M tokens
Publish npm Package
Set up npmjs publishing via GitHub Actions with a complete, internally consistent release flow: auth, version management, package-manager installs, workflow trigger, provenance, validation, and recovery. Decisions and routing live here; full YAML and tool deep-dives live in references/.
When to use
Use this skill if the request is one of:
- "publish this package to npm", "set up npm publishing", "automate npm releases"
- "npm publish from GitHub Actions", "release workflow for npm", "npm CI/CD"
- "trusted publishing", "OIDC for npm", "NPM_TOKEN provenance", "id-token: write"
- "semantic-release", "changesets", "release-please", "automate version bumps"
- "first publish of a new package", "bootstrap npm package", "link GitHub repo to npm"
- "why is my npm publish failing", "EOTP / ENEEDAUTH / E403 in CI", "npm whoami in Actions"
package.json / repo signals that should pull this skill in:
"name"field plus"version"and arepository.urlpointing at GitHub.github/workflows/*.ymlwithnpm publish,setup-node,id-token: write, orNPM_TOKEN.npmrcwith//registry.npmjs.org/:_authTokenor${NODE_AUTH_TOKEN}- presence of
.releaserc*,release.config.js,.changeset/, or.release-please-*.json - scoped name (
@scope/name) pluspublishConfig.accessdecisions
Do NOT use this skill when:
- deploying apps/services to a runtime (Railway, Vercel, Fly) — use the platform skill (e.g.
run-railway) - writing the package's own runtime code, SDK internals, or APIs — use the relevant
build-*skill - publishing to a non-npm registry (Docker Hub, GHCR, PyPI, crates.io) and npm is not also in scope
- the only ask is which
npm/ package-manager command to run with no CI or release-automation context
Decide auth first, versioning second, then route to the workflow template
Always follow this order. Skipping it produces half-configured release automation.
- Classify the repo (table below).
- Pick auth: OIDC trusted publishing, or token (
NPM_TOKEN→NODE_AUTH_TOKEN). - Pick versioning: semantic-release, changesets, release-please, or manual.
- Route to the exact workflow template in
references/workflows/. - Check package/repo prerequisites and lockfile/package-manager.
- Verify with
npm pack --dry-run, build/test in CI, tool-specific dry runs. - If the repo is mid-migration or already failing, jump to recovery routing at the bottom.
Classify the repo first
Answer these and record the answers — they drive every later decision:
- Public or private package?
- GitHub Actions on a GitHub-hosted runner (vs self-hosted / GHES / non-GitHub CI)?
- Single package or monorepo / workspaces?
- Conventional commits actually used (majority of meaningful commits in
type: descriptionform)? - Auto-publish on every releasable merge, or human-reviewed Release/Version PR?
- Greenfield (never published) or already published with tags/versions?
- Target really
npmjs.org?
Derive answers from package.json + workspace manifests → existing workflows → git remote/tags → npm registry state. If still ambiguous, stop and ask — do not guess.
Decision matrix
| Public? | GH-hosted runner? | Single/Mono | Conv. commits? | Gate | Auth | Versioning |
|---|---|---|---|---|---|---|
| Yes | Yes | Single | Yes | Auto | OIDC | semantic-release |
| Yes | Yes | Single | Yes | Human | OIDC | release-please |
| Yes | Yes | Single | No | Human | OIDC | changesets |
| Yes | Yes | Single | No (greenfield, will adopt) | Human | OIDC | release-please |
| Yes | Yes | Monorepo | Any | Any | OIDC | changesets (default) |
| No | Any | Any | Any | Any | Token | (any) |
| Any | No (self-hosted/GHES) | Any | Any | Any | Token | (any) |
Auth lanes — keep them separate
| Lane | Use when | Requirements | Publish | Provenance |
|---|---|---|---|---|
| OIDC trusted publishing | Public package, public repo, GitHub-hosted runner, package already linked on npm | No npm token, id-token: write, contents: read, npm CLI 11.5.1+, Node 22.14.0+ |
npm publish --access public |
Automatic for eligible public packages — do not add --provenance |
| Token + provenance | Token auth required, public provenance desired | NODE_AUTH_TOKEN, id-token: write, cloud runner, npm CLI 9.5.0+ |
npm publish --provenance --access public |
Explicit flag, NPM_CONFIG_PROVENANCE=true, or tool config |
| Token only | Private package, self-hosted runner, GHES, private registry, bootstrap | NODE_AUTH_TOKEN; no id-token needed |
npm publish --access public |
None |
Auth rules:
- Default to OIDC whenever supported. Trusted publishing means zero npm secrets — if the publish step has
NODE_AUTH_TOKENorNPM_TOKEN, it is token auth, not trusted publishing, even ifid-token: writeis set. - OIDC requires the package to already exist on npm. First publish of a brand-new package always bootstraps with a granular token, then switches to OIDC after linking the repo on npm.
- OIDC does not work on self-hosted runners. Use a granular token there.
- Use
secrets.NPM_TOKENexposed asNODE_AUTH_TOKEN. Do not runnpm loginin CI. Avoid classic automation tokens for new work. - One granular token per repo or workflow surface; rotate on a schedule.
Read the full lane:
references/auth/oidc-trusted-publishing.md— OIDC bootstrap, repo linking, provenance defaultsreferences/auth/granular-tokens.md— granular token creation, scoping, rotation, secret wiring
Local publish vs CI publish — know which mode you're in
Mixing these up is the #1 cause of EOTP / ENEEDAUTH errors.
Guardrail:
NODE_AUTH_TOKENas a bare env var only works when an.npmrccontains${NODE_AUTH_TOKEN}. In GitHub Actions,actions/setup-nodewrites that file whenregistry-urlis set. On a developer machine, npm ignoresNODE_AUTH_TOKENunless the placeholder.npmrcexists.
Local publish (developer terminal)
Check existing auth before issuing tokens:
npm whoami --registry https://registry.npmjs.org
echo "${NPM_TOKEN:+NPM_TOKEN is set}"
cat ~/.npmrc 2>/dev/null | grep -v authToken | head
grep -l 'NPM_TOKEN' ~/.zshrc ~/.bashrc ~/.zprofile ~/.bash_profile 2>/dev/nullWire the token (pick one):
# 1) CLI flag (most reliable locally; do NOT use in CI logs)
npm publish --access public --//registry.npmjs.org/:_authToken="${NPM_TOKEN}"
# 2) Temporary .npmrc (session-scoped)
echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > .npmrc
npm publish --access public
rm .npmrc
# 3) Browser 2FA login (no token needed)
npm login && npm publish --access publicGuardrail:
--//registry.npmjs.org/:_authToken=TOKENis not a security risk on a local terminal. The "wrong" label inreferences/auth/granular-tokens.mdapplies only to CI logs.
CI publish (GitHub Actions)
Pure trusted publishing — no npm secret:
permissions:
contents: read
id-token: write
steps:
- uses: actions/setup-node@v6
with:
node-version: '24'
registry-url: 'https://registry.npmjs.org'
package-manager-cache: false
- run: npm publish --access publicToken auth — NODE_AUTH_TOKEN env on the publish step plus setup-node registry-url:
- uses: actions/setup-node@v6
with:
registry-url: 'https://registry.npmjs.org'
package-manager-cache: false
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}Diagnose "EOTP when token should bypass 2FA"
If a granular automation token with "Bypass 2FA" still gets EOTP:
- npm is not using your token — it has fallen back to interactive session auth.
- Run
npm whoami. A personal username confirms session auth is active. - Fix the wiring (CLI flag locally,
setup-node+NODE_AUTH_TOKENin CI). Do not rotate the token.
npm whoami does not validate trusted publishing. OIDC auth applies only during npm publish itself.
Versioning models — pick the model, not the tool
| Need | Choose | Use when | Avoid when | Read |
|---|---|---|---|---|
| Publish on every releasable merge | semantic-release | Single package, strong conventional-commit discipline, no human gate | Monorepos, weak commits, teams that want a reviewable Release PR | references/versioning/semantic-release.md |
| Reviewable Release PR, publish on merge | release-please | Conventional commits exist, team wants a human merge gate | Untrustworthy commit messages, or zero-handling target | references/versioning/release-please.md |
| Per-PR version intent, batched releases | changesets | Monorepos, single-package without conventional commits, explicit version notes | Repo wants publish-on-merge with no human-authored version data | references/versioning/changesets.md |
| Rare/simple releases | manual trigger + npm version |
Automation would outweigh release frequency | Task explicitly asks for full automation | "Manual Trigger" section of the matching workflow file |
Versioning rules:
- Monorepo default: changesets. Use release-please only when conventional commits already drive the repo.
- changesets is not monorepo-only. Single-package repos without conventional commits that want a human-reviewed Version PR are a valid use case.
- Distinguish greenfield ("team will adopt conventional commits going forward") from existing repo ("commits already lack them"). Existing repos with inconsistent history → changesets, not semantic-release.
- For existing published packages, bootstrap baseline state before the first automated run (initial tag for semantic-release; aligned config + manifest for release-please; initialized config for changesets).
Guardrail: "Current version" in the release-please manifest = the version in
package.json. For greenfield never-published packages, set it to whateverpackage.jsonsays (typically1.0.0or0.1.0). Do not guess0.0.0.
Workflow templates — do not hand-assemble YAML from memory
| Auth | Versioning | Template |
|---|---|---|
| OIDC | semantic-release | references/workflows/oidc-workflows.md → 1. OIDC + semantic-release |
| OIDC | changesets | references/workflows/oidc-workflows.md → 2. OIDC + changesets |
| OIDC | release-please | references/workflows/oidc-workflows.md → 3. OIDC + release-please |
| OIDC | manual trigger | references/workflows/oidc-workflows.md → 4. OIDC + Manual Trigger |
| Token | semantic-release | references/workflows/token-workflows.md → 1. Token + semantic-release |
| Token | changesets | references/workflows/token-workflows.md → 2. Token + changesets |
| Token | release-please | references/workflows/token-workflows.md → 3. Token + release-please |
| Token | manual trigger | references/workflows/token-workflows.md → 4. Token + Manual Trigger |
Monorepos: read references/monorepo-publishing.md before choosing a workspace flow. Prefer the changesets template; fall back to release-please when conventional commits already exist; do not default to semantic-release for monorepos.
Guardrail: The workflow templates are the source of truth for full GitHub Actions YAML. The versioning references explain tool config, customization, and tool-specific failure modes — they are not standalone YAML sources.
Pre-implementation prerequisites
Package + repo
- Code pushed to a GitHub repository.
package.json.repository.urlexactly matches the GitHub repo URL, including casing.- Scoped public packages set
publishConfig.access: "public"(or equivalent). - For pure trusted publishing, do not set
publishConfig.provenance; npm auto-generates provenance for eligible public packages. Provenance config belongs to the token+provenance lane only. - Lockfile committed; CI uses the matching deterministic install.
npm pack --dry-runmatches the intended tarball. If it includessrc/whilemain/module/types/exportspoint atdist/, stop and fix packaging before touching CI.- Packaging shape (
files,exports, types, dual ESM/CJS):references/package-config.md.
Lockfile and package-manager detection
| Lockfile / marker | Install | Notes |
|---|---|---|
package-lock.json or npm-shrinkwrap.json |
npm ci |
Default when no other PM is in use |
pnpm-lock.yaml |
pnpm install --frozen-lockfile |
Enable pnpm via Corepack |
yarn.lock + .yarnrc.yml or packageManager: yarn@… |
yarn install --immutable |
Yarn Berry / modern Yarn |
yarn.lock without Berry markers |
yarn install --frozen-lockfile |
Yarn Classic |
bun.lockb |
bun install --frozen-lockfile |
Only if the repo already uses Bun |
Multiple lockfiles: stop and reconcile the package-manager choice before changing release automation.
CI
actions/setup-nodewithregistry-url: https://registry.npmjs.org.- Build/test runs in the same job (or upstream of) publish.
concurrencyset to avoid publish races.- Permissions least-privilege and explicit.
- Templates use
actions/setup-node@v6, Node 24,package-manager-cache: falseunless the repo deliberately keeps tag-readable examples. - For production: pin actions to full SHAs with tag comments — see
references/supply-chain.md.
First-publish bootstrap (greenfield → OIDC)
Guardrail: Trusted publishing requires the package to already exist on npm. Brand-new packages must bootstrap with token auth before linking trusted publishing.
- Create a granular access token on npmjs.com (
references/auth/granular-tokens.md). - Add it as
NPM_TOKENin GitHub Actions secrets. - Publish once:
npm publish --access public, or use a token-based workflow template for the first release. - On
https://www.npmjs.com/package/<your-package>/access→ Publishing access → Add GitHub Actions to link the repo. - Remove
NPM_TOKENand switch the workflow to pure OIDC.
Migration prerequisites
- semantic-release: full git history (
fetch-depth: 0) and a baseline tag. - release-please: config + manifest aligned to the current
package.jsonversion. - changesets: contributor rule for adding changesets and clear handling of empty changesets.
Guardrails — half-configured release automation is worse than none
- Prefer OIDC over granular tokens; granular tokens over classic automation tokens.
- Prefer changesets over semantic-release for monorepos unless there is a strong existing reason not to.
- Prefer release-please over semantic-release when the team wants a human-reviewed Release PR.
- Prefer workflow templates from the references over inventing YAML from memory.
- Do not pick semantic-release without real conventional commits,
fetch-depth: 0, and a current toolchain that supports the chosen auth. - release-please needs the two-job pattern: one job creates/updates the Release PR, a second publish job runs only when
release_created == 'true'. - Do not assume OIDC works on self-hosted runners.
- Do not commit tokenized
.npmrcfiles. Placeholder-based.npmrcis fine; real tokens are not. - Do not forget scoped public package access;
E403on a scoped package usually meanspublishConfig.access: "public"was never configured. - Do not add
--provenanceto pure trusted-publishing baselines. Use it only for token+provenance lanes. - Do not use
pull_request_targetto expose release secrets to untrusted code. - If the repo is mid-migration, finish auth + versioning + workflow + bootstrap together. Do not ship a half-state.
Validation scripts
Bundled helpers — read the paired .md for flags; do not load script source during normal use.
| Script | Use |
|---|---|
scripts/check-package-json.mjs |
Inspect package.json, detect package manager/lockfile, flag metadata and src/dist mismatches; emits JSON + human output. |
scripts/dry-run-publish.sh |
Run npm pack --dry-run (and optionally npm publish --dry-run) without publishing. |
scripts/check-npm-auth.sh |
Token-auth diagnostic: token env presence + npm whoami when token auth is intended. Does not validate trusted publishing. |
Verification before declaring done
Always run:
scripts/check-package-json.mjs [package-dir](or equivalent in the target repo)scripts/dry-run-publish.sh [package-dir]ornpm pack --dry-run- build + test in the same workflow that publishes
- a check that the chosen versioning tool is wired, not just installed
Auth-specific:
| Check | OIDC | Token |
|---|---|---|
| Runner | GitHub-hosted / supported cloud | Any |
| Permissions | contents: read, id-token: write |
None unless token+provenance |
| Registry | setup-node → registry-url: https://registry.npmjs.org |
Same |
| Secret wiring | None (no NODE_AUTH_TOKEN) |
NPM_TOKEN secret, NODE_AUTH_TOKEN env on publish |
| Auth diagnostic | publish-only; npm whoami does not prove OIDC |
scripts/check-npm-auth.sh --token or npm whoami |
| Post-publish | npm audit signatures |
npm audit signatures only if provenance/signatures expected |
Tool-specific:
| Tool | Dry-run | Key files | Critical check |
|---|---|---|---|
| semantic-release | npx semantic-release --dry-run |
.releaserc / release.config.js |
Full git history, baseline tags, plugin order |
| changesets | npx changeset status |
.changeset/config.json |
Release/version PR path matches template |
| release-please | release-please release-pr --repo-url=<owner/repo> --token=TOKEN --dry-run (optional) |
.release-please-config.json, .release-please-manifest.json |
Manifest version matches package.json; publish gated on release_created == 'true' |
Guardrail: release-please has no built-in dry-run equivalent. Verify config + manifest files and manifest/
package.jsonalignment.
Output contract
When setup or diagnosis is complete, report:
- selected auth lane and versioning model
- files changed
- exact publish workflow trigger
- package name, version, npm dist-tag
- npm package URL (
https://www.npmjs.com/package/<name>) - GitHub release / tag URL when the flow creates one
- validation commands actually run
- provenance / signature verification status
- rollback or recovery note for failed or wrong publishes
Recovery routing
If the task is about an existing failure, jump straight to the narrowest reference.
| Problem | Read first | Focus |
|---|---|---|
| OIDC / provenance failure | references/common-issues.md, then references/auth/oidc-trusted-publishing.md |
missing id-token: write, missing contents: read, wrong repo URL, self-hosted runner, missing npmjs registry config |
| Token auth failure | references/common-issues.md, then references/auth/granular-tokens.md |
expired token, wrong scopes, wrong secret wiring, rotation mistakes |
| semantic-release failure | references/common-issues.md, then references/versioning/semantic-release.md |
shallow clone, missing baseline tag, non-releasable commits, old plugin versions |
| changesets failure | references/common-issues.md, then references/versioning/changesets.md |
forgotten changesets, release PR drift, access/public config, prerelease state |
| release-please failure | references/common-issues.md, then references/versioning/release-please.md |
manifest drift, no releasable commits, duplicate/stuck Release PRs, broken publish gating |
| Published wrong version / broken package | references/common-issues.md |
unpublish within 72h if allowed; otherwise deprecate and patch forward |
| Token leak / security incident | references/supply-chain.md |
revoke, rotate, audit publishes, harden workflow before re-enabling release |
Smallest reading set by scenario
- Public single package, fully automatic:
references/auth/oidc-trusted-publishing.md+references/versioning/semantic-release.md+references/workflows/oidc-workflows.md(#1) +references/supply-chain.md. - Public single package, reviewable gate:
references/auth/oidc-trusted-publishing.md+references/versioning/release-please.mdorreferences/versioning/changesets.md+references/workflows/oidc-workflows.md(#3 or #2) +references/supply-chain.md. - Monorepo / workspaces:
references/monorepo-publishing.md+references/versioning/changesets.md(default) orreferences/versioning/release-please.md+ matching OIDC/token workflow section +references/supply-chain.md. - Private package, self-hosted runner, or non-GitHub CI:
references/auth/granular-tokens.md+ chosen versioning reference + matching section inreferences/workflows/token-workflows.md. - Failing existing workflow:
references/common-issues.md+ auth reference for the current mode + versioning reference for the current tool.
Known traps — quick reference
| Trap | Impact | Fix |
|---|---|---|
NODE_AUTH_TOKEN env var locally without setup-node's .npmrc |
P0 — npm ignores token, falls back to interactive login, EOTP |
Locally use --//registry.npmjs.org/:_authToken=TOKEN; in CI use setup-node + NODE_AUTH_TOKEN together |
EOTP and assuming the token type is wrong |
P0 — misdiagnosis | EOTP means npm is using interactive session auth, not your token. Fix wiring, not the token. |
Not checking ~/.zshrc / ~/.bashrc for existing NPM_TOKEN |
P1 — duplicate token issued | grep NPM_TOKEN ~/.zshrc ~/.bashrc before asking the user for a new one |
NODE_AUTH_TOKEN / NPM_TOKEN set and calling it "OIDC" |
P0 — silent wrong auth | OIDC = zero npm secrets. With a token in scope, it is token auth. |
| First-publish with OIDC on a never-published package | P0 — 404 | Bootstrap with a granular token, then switch to OIDC after linking the repo on npm |
| semantic-release / release-please without conventional commits | P0 — blocked | Use changesets if the team will not adopt conventional commits |
Treating --//registry.npmjs.org/:_authToken=TOKEN as always wrong |
P1 — blocks local publish | The "wrong" label applies to CI logs only; locally the CLI flag is the most reliable form |
| Assuming changesets is monorepo-only | P1 — wrong tool | changesets works for single-package repos and does not require conventional commits |
| Confusing greenfield "will adopt" with existing "does not have" | P1 — wrong guidance | Greenfield can adopt; existing repos without conventional commits need changesets |
| Copying config from a versioning reference instead of the workflow template | P1 — config mismatch | Workflow template is baseline; versioning reference is for customization |
Using @v4 action tags in production |
P1 — supply-chain risk | Pin to full SHAs with tag comments; see references/supply-chain.md |
release-please manifest version not matching package.json |
P1 — release-please misfires | Manifest must match package.json exactly, including for greenfield |
Final reminder
Keep SKILL.md focused on decisions, sequencing, and guardrails. Read only:
- the auth reference,
- the versioning reference,
- the exact workflow-template section,
- and
references/common-issues.md/references/supply-chain.mdonly when needed.
Do not expand into full YAML or packaging deep dives here when the references already cover them.
Installationen
Sicherheitsprüfung
Quellcode ansehen
yigitkonur/skills-by-yigitkonur
Mehr aus dieser Quelle
Give agents clean web context
Search and extract the public web as Markdown or structured JSON through one API or hosted MCP server.
Verwandte Skills
Mehr aus dieser Quelle: yigitkonur/skills-by-yigitkonur
So verwenden Sie diesen Skill
Install publish-npm-package by running npx skills add yigitkonur/skills-by-yigitkonur --skill publish-npm-package in your project directory. Führen Sie den obigen Installationsbefehl in Ihrem Projektverzeichnis aus. Die Skill-Datei wird von GitHub heruntergeladen und in Ihrem Projekt platziert.
Keine Konfiguration erforderlich. Ihr KI-Agent (Claude Code, Cursor, Windsurf usw.) erkennt installierte Skills automatisch und nutzt sie als Kontext bei der Code-Generierung.
Der Skill verbessert das Verständnis Ihres Agenten für publish-npm-package, und hilft ihm, etablierte Muster zu befolgen, häufige Fehler zu vermeiden und produktionsreifen Code zu erzeugen.
Was Sie erhalten
Skills sind Klartext-Anweisungsdateien — kein ausführbarer Code. Sie kodieren Expertenwissen über Frameworks, Sprachen oder Tools, das Ihr KI-Agent liest, um seine Ausgabe zu verbessern. Das bedeutet null Laufzeit-Overhead, keine Abhängigkeitskonflikte und volle Transparenz: Sie können jede Anweisung vor der Installation lesen und prüfen.
Kompatibilität
Dieser Skill funktioniert mit jedem KI-Coding-Agenten, der das skills.sh-Format unterstützt, einschließlich Claude Code (Anthropic), Cursor, Windsurf, Cline, Aider und anderen Tools, die projektbezogene Kontextdateien lesen. Skills sind auf Transportebene framework-agnostisch — der Inhalt bestimmt, für welche Sprache oder welches Framework er gilt.