{"record":{"id":"c85527655a77101d","repo":"yarnpkg/yarn","slug":"invalidpackagename-c85527","errorCode":null,"errorMessage":"invalidPackageName","messagePattern":"invalidPackageName","errorType":"exception","errorClass":"MessageError","httpStatus":null,"severity":"error","filePath":"src/cli/commands/tag.js","lineNumber":22,"sourceCode":"import type Config from '../../config.js';\nimport buildSubCommands from './_build-sub-commands.js';\nimport {getToken} from './login.js';\nimport NpmRegistry from '../../registries/npm-registry.js';\nimport {MessageError} from '../../errors.js';\nimport {normalizePattern} from '../../util/normalize-pattern.js';\nimport {isValidPackageName} from '../../util/normalize-manifest/validate.js';\n\nexport async function getName(args: Array<string>, config: Config): Promise<string> {\n  let name = args.shift();\n\n  if (!name) {\n    const pkg = await config.readRootManifest();\n    name = pkg.name;\n  }\n\n  if (name) {\n    if (!isValidPackageName(name)) {\n      throw new MessageError(config.reporter.lang('invalidPackageName'));\n    }\n\n    return NpmRegistry.escapeName(name);\n  } else {\n    throw new MessageError(config.reporter.lang('unknownPackageName'));\n  }\n}\n\nasync function list(config: Config, reporter: Reporter, flags: Object, args: Array<string>): Promise<void> {\n  const name = await getName(args, config);\n\n  reporter.step(1, 1, reporter.lang('gettingTags'));\n  const tags = await config.registries.npm.request(`-/package/${name}/dist-tags`);\n\n  if (tags) {\n    reporter.info(`Package ${name}`);\n    for (const name in tags) {\n      reporter.info(`${name}: ${tags[name]}`);","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/yarnpkg/yarn/blob/c2dda503f3759b5be5f0e24ecd9cf5c97a540147/src/cli/commands/tag.js#L4-L40","documentation":"Thrown by getName() in 'yarn tag' when the resolved package name fails npm's package-name validation (isValidPackageName). The name is resolved from the first positional arg, falling back to the root manifest's 'name' field; if that name violates npm naming rules (lowercase only, no leading '.'/'_', <=214 chars, no spaces), the command aborts before contacting the registry.","triggerScenarios":"Running 'yarn tag', 'yarn tag add', or 'yarn tag rm' where args[0] (or pkg.name from readRootManifest) is e.g. 'My.Pkg', 'foo bar', or exceeds 214 characters, so isValidPackageName(name) returns false.","commonSituations":"package.json 'name' contains uppercase letters, spaces, or a leading dot/underscore; user passes a scoped name with bad formatting (@scope/x is fine, '@Scope/x' is not); copy-pasted name from a non-npm source.","solutions":["Edit package.json and set a valid npm 'name' (lowercase, no spaces, dashes/underscores allowed, no leading '.' or '_', <=214 chars).","Pass a valid name explicitly as the first CLI argument: 'yarn tag <valid-name>'.","If scoped, ensure the format is '@scope/name' with lowercase scope and name."],"exampleFix":"// before (package.json)\n{ \"name\": \"My.App\" }\n// after\n{ \"name\": \"my-app\" }","handlingStrategy":"validation","validationCode":"import {isValidPackageName} from '../../util/normalize-manifest/validate.js';\n\nfunction assertValidName(name: string) {\n  if (!isValidPackageName(name)) {\n    throw new Error(`Refusing to run 'yarn tag': invalid package name \"${name}\"`);\n  }\n}\n// before calling getName / tag:\nassertValidName(nameFromArgOrManifest);","typeGuard":"const NPM_NAME_RE = /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/;\nfunction isValidNpmName(name: unknown): name is string {\n  return typeof name === 'string'\n    && name.length > 0\n    && name.length <= 214\n    && !name.startsWith('.') && !name.startsWith('_')\n    && NPM_NAME_RE.test(name);\n}","tryCatchPattern":null,"preventionTips":["Lint package.json 'name' at commit time (e.g. via a CI check or npm-package-arg validation).","Always pass an explicit, validated name to 'yarn tag' rather than relying on the manifest.","Keep names lowercase and dash-separated by convention."],"tags":["validation","package-name","npm","cli-args"],"backgroundTag":null,"analyzedSha":"c2dda503f3759b5be5f0e24ecd9cf5c97a540147","analyzedAt":"2026-08-13T04:17:06.305Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}