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
- 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).
- If ValidateArtifact failed, re-run `multica plugin init` and diff your manifest against the fresh scaffold to find missing/invalid fields.
- Rebuild the zip cleanly (`zip -r` from the plugin root) and re-validate.
- 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
- Run validate in CI immediately after pack so failures surface at build time.
- Keep a scaffolded reference manifest and diff yours against it.
- Always unzip -t archives before trusting them.
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
- plugin directory %q is not empty
- plugin source %q is not a directory or regular ZIP
- plugin archive exceeds %d bytes
- validate Plugin before install: %w
- invalid direction %q (want \"up\" or \"down\")
AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15).
Data as JSON: /api/errors/ab541dd318d6b358.
Report an issue: GitHub.