{"record":{"id":"e134d0da8a6de594","repo":"denoland/deno","slug":"invalid-package-name-package-name-must-be-in","errorCode":null,"errorMessage":"Invalid package name '{}'. Package name must be in the format '@scope/name'","messagePattern":"Invalid package name '(.+?)'\\. Package name must be in the format '@scope/name'","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/tools/pack/mod.rs","lineNumber":108,"sourceCode":"            .license\n            .as_ref()\n            .and_then(|l| l.as_str().map(|s| s.to_string())),\n          should_publish: true,\n        });\n      }\n      None => {\n        bail!(\"No deno.json found in current directory\");\n      }\n    }\n  }\n\n  let module_graph_creator = cli_factory.module_graph_creator().await?;\n  let parsed_source_cache = cli_factory.parsed_source_cache()?;\n\n  for package in packages {\n    // Validate package name format\n    if !package.name.starts_with('@') || !package.name.contains('/') {\n      bail!(\n        \"Invalid package name '{}'. Package name must be in the format '@scope/name'\",\n        package.name\n      );\n    }\n\n    log::info!(\n      \"{} {}\",\n      colors::green(\"Packing\"),\n      colors::intense_blue(&package.name)\n    );\n\n    // Determine version\n    let version = if let Some(ref v) = pack_flags.set_version {\n      if deno_semver::Version::parse_standard(v).is_err() {\n        bail!(\n          \"Invalid semver version '{}'. Please provide a valid semver version (e.g., 1.0.0)\",\n          v\n        );","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/denoland/deno/blob/9ad36f7a2cce60488e6ec52283efb32efddaf93a/cli/tools/pack/mod.rs#L90-L126","documentation":"`deno pack` validates that each package name is JSR-style scoped: it must start with `@` and contain a `/`. The check `!package.name.starts_with('@') || !package.name.contains('/')` rejects unscoped names such as `mypkg` or malformed ones like `@scope` because JSR requires `@scope/name`.","triggerScenarios":"Any packed package (workspace member or standalone deno.json) whose `name` lacks the `@scope/name` shape — e.g. `\"name\": \"my-package\"` or `\"name\": \"@scope\"`.","commonSituations":"Names copied from npm habits (npm allows unscoped names); typos dropping the slash; using a personal handle without converting it to a scope.","solutions":["Change the name to `@scope/name`, e.g. `\"name\": \"@luca/flag\"`.","Create/choose a JSR scope matching your account or org, then prefix it.","For local-only linking (no publish), consider `deno link` with the name field instead of packing."],"exampleFix":"// deno.json (before)\n{\n  \"name\": \"my-package\"\n}\n// deno.json (after)\n{\n  \"name\": \"@scope/my-package\"\n}","handlingStrategy":"validation","validationCode":"const JSR_NAME = /^@[a-z0-9-]+\\/[a-z0-9-]+$/;\nconst cfg = JSON.parse(readFileSync(\"deno.json\", \"utf8\"));\nif (!JSR_NAME.test(cfg.name ?? \"\")) {\n  console.error(`\"${cfg.name}\" is not a @scope/name package name`);\n  process.exit(1);\n}","typeGuard":"const isScopedPackageName = (name: string): boolean =>\n  /^@[a-z0-9][a-z0-9.-]*\\/[a-z0-9][a-z0-9.-]*$/.test(name);","tryCatchPattern":null,"preventionTips":["Register a JSR scope once and prefix every package name with it.","Add a CI lint for package names matching /^@scope\\//.","Remember: unlike npm, JSR has no unscoped names."],"tags":["pack","package-name","jsr","validation"],"backgroundTag":"invalid-package-name","analyzedSha":"9ad36f7a2cce60488e6ec52283efb32efddaf93a","analyzedAt":"2026-08-20T13:07:44.778Z","contentChangedAt":"2026-08-20T13:07:44.778Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}