multica-ai/multica · error

validate Plugin: %w

Error message

validate Plugin: %w

What it means

Top-level wrap in runPluginValidate (cmd_plugin.go:183): `multica plugin validate <source>` failed in loadPluginSource — which covers stat errors, non-dir/non-regular sources (564), oversize archives (565), read failures, or plugincontract.ValidateArtifact rejecting the archive (bad zip, missing/invalid manifest, digest mismatch). The %w chain preserves which one.

Source

Thrown at server/cmd/multica/cmd_plugin.go:183

		ManifestDigest: plugincontract.DigestBytes(artifact.CanonicalManifest), ArchiveDigest: artifact.ArchiveDigest,
		ArtifactDigest: artifact.ArtifactDigest, SizeBytes: artifact.SizeBytes, FileCount: len(artifact.Files),
	}
}

func printPluginDigest(cmd *cobra.Command, result pluginDigestOutput, output string) error {
	if output == "json" {
		return cli.PrintJSON(cmd.OutOrStdout(), result)
	}
	cli.PrintTable(cmd.OutOrStdout(), []string{"PLUGIN", "VERSION", "MANIFEST", "ARCHIVE", "ARTIFACT"}, [][]string{{
		result.PluginKey, result.Version, result.ManifestDigest, result.ArchiveDigest, result.ArtifactDigest,
	}})
	return nil
}

func runPluginValidate(cmd *cobra.Command, args []string) error {
	_, artifact, err := loadPluginSource(args[0])
	if err != nil {
		return fmt.Errorf("validate Plugin: %w", err)
	}
	output, _ := cmd.Flags().GetString("output")
	return printPluginDigest(cmd, pluginDigestResult(artifact), output)
}

func runPluginPack(cmd *cobra.Command, args []string) error {
	outputPath, _ := cmd.Flags().GetString("output")
	if outputPath == "" {
		return fmt.Errorf("--output is required")
	}
	archive, artifact, err := plugincontract.PackDirectory(args[0])
	if err != nil {
		return fmt.Errorf("pack Plugin: %w", err)
	}
	if err := os.WriteFile(filepath.Clean(outputPath), archive, 0o644); err != nil {
		return fmt.Errorf("write Plugin archive: %w", err)
	}
	format, _ := cmd.Flags().GetString("format")

View on GitHub (pinned to 2c0912b6ec)

Solutions

  1. Read the wrapped cause in the message — it identifies the exact sub-failure (not-empty-style checks are upstream; here it is stat/size/validate).
  2. If ValidateArtifact failed, re-run `multica plugin init` and diff your manifest against the fresh scaffold to find missing/invalid fields.
  3. Rebuild the zip cleanly (`zip -r` from the plugin root) and re-validate.
  4. Verify integrity: `unzip -t plugin.zip`.

Example fix

// before
multica plugin validate ./dist/plugin.zip   // validate Plugin: manifest: missing required field "key"

// after: fix plugin.yaml
# metadata.key: com.example.my-plugin
multica plugin validate ./dist/plugin.zip
Defensive patterns

Strategy: validation

Validate before calling

if _, _, err := loadPluginSource(src); err != nil {
    return fmt.Errorf("pre-flight failed, not invoking CLI: %w", err)
}

Try / catch

err := runPluginValidate(cmd, args)
if err != nil {
    if strings.Contains(err.Error(), "exceeds") { /* shrink archive */ } else if strings.Contains(err.Error(), "manifest") { /* fix yaml */ }
}

Prevention

When it happens

Trigger: Validating a directory whose manifest fails contract validation; validating a corrupt or truncated zip; any of the loadPluginSource preconditions failing.

Common situations: Editing plugin.yaml by hand and breaking required fields; a zip transferred in text mode (corrupted); validating the folder before the scaffold finished writing files.

Related errors


AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15). Data as JSON: /api/errors/ab541dd318d6b358. Report an issue: GitHub.