multica-ai/multica · error

write Plugin archive: %w

Error message

write Plugin archive: %w

What it means

Wrap in runPluginPack (cmd_plugin.go:199): the archive was built and validated successfully, but writing it to the cleaned --output path failed. This is a pure filesystem error at the final step — unwritable directory, path is a directory, disk full, or permission denied.

Source

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

	_, 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")
	return printPluginDigest(cmd, pluginDigestResult(artifact), format)
}

func pluginWorkspaceID(cmd *cobra.Command) (string, error) {
	workspace, _ := cmd.Flags().GetString("workspace")
	if workspace == "" {
		return requireWorkspaceID(cmd)
	}
	ctx, cancel := cli.APIContext(context.Background())
	defer cancel()
	resolved, err := resolveWorkspaceRef(ctx, cmd, workspace)
	if err != nil {
		return "", err
	}
	return resolved.ID, nil
}

View on GitHub (pinned to 2c0912b6ec)

Solutions

  1. Create the parent directory: `mkdir -p $(dirname <output>)`.
  2. Check the path is free: `ls -ld <output>` — remove it if it is an existing directory.
  3. Verify write permission and disk space (`df -h .`), then retry.

Example fix

// before
multica plugin pack . --output ./dist/plugin.zip   // dist/ absent -> write Plugin archive: no such file or directory

// after
mkdir -p dist && multica plugin pack . --output ./dist/plugin.zip
Defensive patterns

Strategy: validation

Validate before calling

if err := os.MkdirAll(filepath.Dir(outputPath), 0o755); err != nil { return err }
if fi, err := os.Stat(outputPath); err == nil && fi.IsDir() { return fmt.Errorf("output %s is a directory", outputPath) }

Prevention

When it happens

Trigger: --output points into a non-existent directory; output path is itself a directory; no write permission; ENOSPC; read-only filesystem.

Common situations: Forgetting `mkdir -p dist`; running as a user without write access to the target; CI container with a read-only mount at the output location.

Related errors


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