{"record":{"id":"1c96f3803de7cdb9","repo":"nodejs/node","slug":"tag-name-must-not-be-a-valid-semver-range-t","errorCode":null,"errorMessage":"Tag name must not be a valid SemVer range: ${t}","messagePattern":"Tag name must not be a valid SemVer range: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"deps/npm/lib/commands/dist-tag.js","lineNumber":101,"sourceCode":"\n  async add (spec, tag, opts) {\n    spec = npa(spec || '')\n    const version = spec.rawSpec\n    const defaultTag = tag || this.npm.config.get('tag')\n\n    log.verbose('dist-tag add', defaultTag, 'to', spec.name + '@' + version)\n\n    // make sure new spec with tag is valid, this will throw if invalid\n    npa(`${spec.name}@${defaultTag}`)\n\n    if (!spec.name || !version || !defaultTag) {\n      throw this.usageError('must provide a spec with a name and version, and a tag to add')\n    }\n\n    const t = defaultTag.trim()\n\n    if (semver.validRange(t)) {\n      throw new Error('Tag name must not be a valid SemVer range: ' + t)\n    }\n\n    const tags = await this.fetchTags(spec, opts)\n    if (tags[t] === version) {\n      log.warn('dist-tag add', t, 'is already set to version', version)\n      return\n    }\n    tags[t] = version\n    const url =\n      `/-/package/${spec.escapedName}/dist-tags/${encodeURIComponent(t)}`\n    const reqOpts = {\n      ...opts,\n      method: 'PUT',\n      body: JSON.stringify(version),\n      headers: {\n        'content-type': 'application/json',\n      },\n      spec,","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/nodejs/node/blob/1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e/deps/npm/lib/commands/dist-tag.js#L83-L119","documentation":"When adding a dist-tag, npm rejects tag names that semver.validRange considers a valid range, because such names would collide with version selectors and make `pkg@tag` ambiguous. Only non-range names (next, beta, etc.) are permitted.","triggerScenarios":"Running `npm dist-tag add pkg@1.0.0 <tag>` where <tag> looks like a version or range: '2.x', '>=2', '1.0.0', '^3'. Edge: some bare versions are also valid ranges and are blocked.","commonSituations":"Trying to tag a release with the target version number; machine-generated tag names derived from versions.","solutions":["Choose an alphabetic symbolic name (next, beta, release-2, lts)","Verify your candidate with require('semver').validRange(name) — it must be null"],"exampleFix":"# before\nnpm dist-tag add mypkg@1.0.0 '2.x'\n\n# after\nnpm dist-tag add mypkg@1.0.0 next","handlingStrategy":"validation","validationCode":"const semver = require('semver')\nfunction assertTagName(name) {\n  if (semver.validRange(name.trim())) {\n    throw new Error(`Refusing to use '${name}' as a dist-tag: it is a valid semver range`)\n  }\n}","typeGuard":"function isSafeDistTagName(name) {\n  return !semver.validRange(String(name).trim())\n}","tryCatchPattern":null,"preventionTips":["Use symbolic tag names (next, beta, lts) by convention","Never derive a tag name from a version string","Validate with semver.validRange in publish pipelines"],"tags":["dist-tag","semver","cli","publishing"],"backgroundTag":null,"analyzedSha":"1b2de5e052fc0fb95fd7fb6846dcec4ade598e9e","analyzedAt":"2026-08-13T00:53:24.642Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}