{"record":{"id":"945f0ecae3a1d0cc","repo":"puppetlabs/puppet","slug":"invalid-version-field-in-metadata-json-err","errorCode":null,"errorMessage":"Invalid 'version' field in metadata.json: %{err}","messagePattern":"Invalid 'version' field in metadata\\.json: %(.+?)","errorType":"exception","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"lib/puppet/module_tool/metadata.rb","lineNumber":198,"sourceCode":"            when nil, '', :namespace_missing\n              _(\"the field must be a namespaced module name\")\n            when /[^a-z0-9_]/i\n              _(\"the module name contains non-alphanumeric (or underscore) characters\")\n            when /^[^a-z]/i\n              _(\"the module name must begin with a letter\")\n            else\n              _(\"the namespace contains non-alphanumeric characters\")\n            end\n\n      raise ArgumentError, _(\"Invalid 'name' field in metadata.json: %{err}\") % { err: err }\n    end\n\n    # Validates that the version string can be parsed as per SemVer.\n    def validate_version(version)\n      return if SemanticPuppet::Version.valid?(version)\n\n      err = _(\"version string cannot be parsed as a valid Semantic Version\")\n      raise ArgumentError, _(\"Invalid 'version' field in metadata.json: %{err}\") % { err: err }\n    end\n\n    # Validates that the given _value_ is a symbolic name that starts with a letter\n    # and then contains only letters, digits, or underscore. Will raise an ArgumentError\n    # if that's not the case.\n    #\n    # @param value [Object] The value to be tested\n    def validate_data_provider(value)\n      if value.is_a?(String)\n        unless value =~ /^[a-zA-Z][a-zA-Z0-9_]*$/\n          if value =~ /^[a-zA-Z]/\n            raise ArgumentError, _(\"field 'data_provider' contains non-alphanumeric characters\")\n          else\n            raise ArgumentError, _(\"field 'data_provider' must begin with a letter\")\n          end\n        end\n      else\n        raise ArgumentError, _(\"field 'data_provider' must be a string\")","sourceCodeStart":180,"sourceCodeEnd":216,"githubUrl":"https://github.com/puppetlabs/puppet/blob/e227c27540975c25aa22d533a52424a9d2fc886a/lib/puppet/module_tool/metadata.rb#L180-L216","documentation":"Puppet::ModuleTool::Metadata#validate_version rejects any 'version' string that SemanticPuppet::Version.valid? cannot parse as strict SemVer. The field must be exactly MAJOR.MINOR.PATCH (with optional pre-release/build), so two-segment versions, leading 'v', or 'latest' all fail when the metadata.json is parsed (line 135).","triggerScenarios":"A metadata.json with \"version\": \"1.0\" (two segments), \"2.0.0.0\" (four segments), \"v1.2.3\" (v prefix), \"latest\", or \"1.2.3-beta\" written with an invalid pre-release identifier such as '01'.","commonSituations":"Authors used to Gemfile-style '~> 1.0' or npm-style '^1.2.3' conventions; automation stamping dates or build numbers like '2023.04' into version; missing patch segment when hand-editing.","solutions":["Use full three-segment SemVer: \"version\": \"1.2.3\"","Drop prefixes: 'v1.2.3' → '1.2.3'","Put pre-release/build metadata in proper SemVer form: '1.2.3-beta.1' / '1.2.3+build.4'","Regenerate metadata with `puppet module generate` to confirm the accepted shape"],"exampleFix":"// before - metadata.json\n\"version\": \"v1.2\",\n\n// after\n\"version\": \"1.2.0\",","handlingStrategy":"validation","validationCode":"require 'semantic_puppet'\n\nversion = JSON.parse(File.read('metadata.json'))['version']\nabort \"version '#{version}' is not valid SemVer (MAJOR.MINOR.PATCH)\" unless SemanticPuppet::Version.valid?(version)","typeGuard":null,"tryCatchPattern":"begin\n  Puppet::ModuleTool::Metadata.from_hash('name' => 'acme-foo', 'version' => raw)\nrescue ArgumentError => e\n  raise unless e.message =~ /Invalid 'version' field/\n  raw = normalize_to_semver(raw)  # e.g. 'v1.2' -> '1.2.0'\n  retry\nend","preventionTips":["Bump versions with a SemVer-aware tool (or `puppet module build` validation) rather than by hand","Never prefix versions with 'v' or use two-segment forms in metadata.json","Let the release tooling stamp versions from git tags through a SemVer normalizer"],"tags":["puppet","module-tool","metadata","semver","version","validation"],"backgroundTag":"invalid-semver-version","analyzedSha":"e227c27540975c25aa22d533a52424a9d2fc886a","analyzedAt":"2026-08-21T20:49:46.650Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}