{"record":{"id":"c8ab602fb30b4ce1","repo":"puppetlabs/puppet","slug":"could-not-action-module-name-no-releases","errorCode":null,"errorMessage":"Could not %{action} '%{module_name}'; no releases are available from %{source}","messagePattern":"Could not %(.+?) '%(.+?)'; no releases are available from %(.+?)","errorType":"exception","errorClass":"Puppet::ModuleTool::Errors::NoCandidateReleasesError","httpStatus":null,"severity":"error","filePath":"lib/puppet/module_tool/applications/installer.rb","lineNumber":137,"sourceCode":"            installed_range = \">=#{version} #{version.major}.x\"\n            graph.add_constraint('installed', mod, installed_range) do |node|\n              Puppet::Module.parse_range(installed_range).include? node.version\n            end\n\n            release.mod.dependencies.each do |dep|\n              dep_name = dep['name'].tr('/', '-')\n\n              range = dep['version_requirement']\n              graph.add_constraint(\"#{mod} constraint\", dep_name, range) do |node|\n                Puppet::Module.parse_range(range).include? node.version\n              end\n            end\n          end\n\n          # Ensure that there is at least one candidate release available\n          # for the target package.\n          if graph.dependencies[name].empty?\n            raise NoCandidateReleasesError, results.merge(:module_name => name, :source => module_repository.host, :requested_version => options[:version] || :latest)\n          end\n\n          begin\n            Puppet.info _(\"Resolving dependencies ...\")\n            releases = SemanticPuppet::Dependency.resolve(graph)\n          rescue SemanticPuppet::Dependency::UnsatisfiableGraph => e\n            unsatisfied = nil\n\n            if e.respond_to?(:unsatisfied) && e.unsatisfied\n              constraints = {}\n              # If the module we're installing satisfies all its\n              # dependencies, but would break an already installed\n              # module that depends on it, show what would break.\n              if name == e.unsatisfied\n                graph.constraints[name].each do |mod, range, _|\n                  next unless mod.split.include?('constraint')\n\n                  # If the user requested a specific version or range,","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/module_tool/applications/installer.rb#L119-L155","documentation":"Installer raises Puppet::ModuleTool::NoCandidateReleasesError when the dependency graph built for the target module has no release entries for it — graph.dependencies[name] is empty — meaning the module repository (Forge at module_repository.host) returned nothing installable for that name. The error includes the source host so the user knows where the lookup failed.","triggerScenarios":"`puppet module install <author>-<name>` where the slug is misspelled, the module does not exist on the configured Forge, all releases were deleted/deprecated, or a proxy/firewall made the Forge API return an empty result set that was swallowed into an empty graph.","commonSituations":"Typos in module names in a Puppetfile or CLI; modules removed from the Forge or renamed; pointing module_repository at a private Forge that lacks the module; air-gapped environments where the forge host is unreachable but errors surface as empty results; forgetting the author- prefix on a private forge that requires it.","solutions":["Verify the exact slug on the Forge (https://forgeapi.puppet.com/v3/modules?query=<name>) and correct spelling/author.","If using a private Forge, confirm module_repository / --module_repository points at the host that actually hosts the module.","Check network reachability of the Forge API host from this node (curl the forge URL).","If releases were yanked, pin to an available version or vendor the tarball and install from the local file."],"exampleFix":"# before\npuppet module install puppetlabs-stblib\n\n# after\npuppet module install puppetlabs-stdlib","handlingStrategy":"validation","validationCode":"require 'net/http'\n\nuri = URI(\"#{Puppet.settings[:module_repository]}/api/v1/releases?module=#{slug}\")\nabort 'module not found on forge' unless Net::HTTP.get_response(uri).code == '200'","typeGuard":null,"tryCatchPattern":"begin\n  installer.run\nrescue Puppet::ModuleTool::NoCandidateReleasesError => e\n  abort \"check slug spelling and forge connectivity: #{e.message}\"\nend","preventionTips":["Validate module slugs against the Forge API before batch installs in CI.","Pin exact known-good slugs and versions in Puppetfiles rather than typing names ad hoc.","Verify module_repository setting and egress firewall rules for forge hosts on new nodes."],"tags":["puppet","forge","module-tool","not-found","install"],"backgroundTag":"package-not-found-in-repository","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}