{"record":{"id":"92b16eace22bb6d5","repo":"iOfficeAI/OfficeCLI","slug":"plugin-not-found","errorCode":"plugin_not_found","errorMessage":"Plugin not found: '{target}'","messagePattern":"Plugin not found: '(.+?)'","errorType":"exception","errorClass":"CliException","httpStatus":null,"severity":"error","filePath":"src/officecli/CommandBuilder.Plugins.cs","lineNumber":139,"sourceCode":"    }\n\n    private static Command BuildPluginsInfoCommand(Option<bool> jsonOption)\n    {\n        var nameArg = new Argument<string>(\"name\")\n        {\n            Description = \"Plugin name or path to its executable\",\n        };\n\n        var cmd = new Command(\"info\", \"Show the full manifest for a single plugin\");\n        cmd.Add(nameArg);\n        cmd.Add(jsonOption);\n\n        cmd.SetAction(result => { var json = result.GetValue(jsonOption); return SafeRun(() =>\n        {\n            var target = result.GetValue(nameArg) ?? \"\";\n            var resolved = ResolveByNameOrPath(target);\n            if (resolved is null)\n                throw new CliException($\"Plugin not found: '{target}'\")\n                {\n                    Code = \"plugin_not_found\",\n                    Suggestion = \"Run `officecli plugins list` to see installed plugins, or provide the absolute path to the plugin executable.\",\n                };\n\n            // Re-read the manifest raw rather than re-serializing from our typed\n            // class: this preserves any extra fields the plugin emits beyond\n            // what PluginManifest knows about, so `plugins info` is faithful to\n            // the plugin's actual --info output.\n            using var p = new System.Diagnostics.Process\n            {\n                StartInfo = new System.Diagnostics.ProcessStartInfo\n                {\n                    FileName = resolved.ExecutablePath,\n                    Arguments = \"--info\",\n                    UseShellExecute = false,\n                    RedirectStandardOutput = true,\n                    RedirectStandardError = true,","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/CommandBuilder.Plugins.cs#L121-L157","documentation":"The 'plugins info' command resolves the plugin by name (case-insensitive match against the plugin registry) or by path (absolute/relative existing executable with a readable manifest). This fires when neither resolution path yields a plugin.","triggerScenarios":"'officecli plugins info <name>' where <name> is not installed; or a path that does not exist or is not a valid plugin executable.","commonSituations":"Typo in the plugin name; plugin not installed in the registry path; pointing at a stale path after moving the plugin.","solutions":["List installed plugins to confirm the exact name: 'officecli plugins list'.","Provide the absolute path to the plugin executable.","Reinstall/register the plugin if it should be present."],"exampleFix":"// before\nofficecli plugins info pdfto  # typo\n// after\nofficecli plugins list\nofficecli plugins info pdf-to-docx","handlingStrategy":"validation","validationCode":"var resolved = PluginRegistry.EnumerateAll()\n    .FirstOrDefault(p => string.Equals(p.Manifest.Name, name, StringComparison.OrdinalIgnoreCase));\nif (resolved is null && !File.Exists(name))\n    throw new ArgumentException($\"Unknown plugin '{name}'; run 'plugins list'.\");","typeGuard":"static bool PluginResolvable(string target) =>\n    PluginRegistry.EnumerateAll().Any(p =>\n        string.Equals(p.Manifest.Name, target, StringComparison.OrdinalIgnoreCase))\n    || (File.Exists(target) && PluginRegistry.TryReadManifest(target, out _));","tryCatchPattern":null,"preventionTips":["Always cross-check names against 'plugins list'.","Pin plugins by absolute path in CI to avoid registry drift.","Names match case-insensitively; paths must point at the executable."],"tags":["plugins","not-found","registry"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}