hashicorp/packer · error

malformed manifest.json for version

Error message

malformed manifest.json for version %s: %w

What it means

resolveProtocolVersion downloads a plugin version's manifest.json and parses it to cache the plugin protocol version used by Validate. This error fires when the fetched manifest is unparseable or structurally invalid (e.g. missing/ill-formed checksum entries), wrapped with the underlying cause. It usually indicates a corrupted or non-standard release published for that plugin version; reinstall the plugin or use a different version.

Solutions

  1. Fix or replace the mirror's manifest.json with the file published on releases.hashicorp.com
  2. Bypass the mirror and install from the official release endpoint
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at packer/plugin-getter/remote/getter.go:203 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


AI-assisted analysis of hashicorp/packer@eb36e3c3e4 (2026-09-05). Data as JSON: /api/errors/195985cd5b195f81. Report an issue: GitHub.

Appendix: source

Thrown at packer/plugin-getter/remote/getter.go:203

			version, idx.pluginType, g.BaseURL, dir)
	}
	return idx, g.BaseURL + "/" + dir + "/" + version, nil
}

// resolveProtocolVersion reads the plugin protocol version from a version's
// manifest.json and caches it for Validate.
func (g *Getter) resolveProtocolVersion(versionURL, pluginType, version string) error {
	if _, ok := g.protVersions[version]; ok {
		return nil
	}
	data, err := g.fetch(versionURL + "/" + pluginType + "_" + version + "_manifest.json")
	if err != nil {
		return fmt.Errorf(
			"%w\nThe checksum entries of this version carry no plugin protocol version in their names, so the mirrored version must include its manifest.json, as published on releases.hashicorp.com", err)
	}
	var meta plugingetter.ManifestMeta
	if err := json.Unmarshal(data, &meta); err != nil {
		return fmt.Errorf("malformed manifest.json for version %s: %w", version, err)
	}
	if meta.Metadata.ProtocolVersion == "" {
		return fmt.Errorf("manifest.json for version %s declares no protocol_version", version)
	}
	if g.protVersions == nil {
		g.protVersions = map[string]string{}
	}
	g.protVersions[version] = "x" + meta.Metadata.ProtocolVersion
	return nil
}

func (g *Getter) Get(what string, opts plugingetter.GetOptions) (io.ReadCloser, error) {
	log.Printf("[TRACE] Getting %s of %s plugin from %s", what, opts.PluginRequirement.Identifier, g.Name)

	switch what {
	case "releases":
		idx, _, err := g.loadIndex(opts)
		if err != nil {

View on GitHub (pinned to eb36e3c3e4)