{"record":{"id":"c631de0f64382d38","repo":"aaif-goose/goose","slug":"extension-not-found","errorCode":null,"errorMessage":"Extension '{}' not found","messagePattern":"Extension '(.+?)' not found","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/goose-cli/src/session/mod.rs","lineNumber":486,"sourceCode":"        );\n        self.add_and_persist_extensions(vec![config]).await\n    }\n\n    pub async fn add_builtin(&mut self, builtin_name: String) -> Result<()> {\n        let configs = Self::parse_builtin_extensions(&builtin_name);\n        self.add_and_persist_extensions(configs).await\n    }\n\n    pub async fn list_prompts(\n        &mut self,\n        extension: Option<String>,\n    ) -> Result<HashMap<String, Vec<String>>> {\n        let prompts = self.agent.list_extension_prompts(&self.session_id).await;\n\n        // Early validation if filtering by extension\n        if let Some(filter) = &extension {\n            if !prompts.contains_key(filter) {\n                return Err(anyhow::anyhow!(\"Extension '{}' not found\", filter));\n            }\n        }\n\n        // Convert prompts into filtered map of extension names to prompt names\n        Ok(prompts\n            .into_iter()\n            .filter(|(ext, _)| extension.as_ref().is_none_or(|f| f == ext))\n            .map(|(extension, prompt_list)| {\n                let names = prompt_list.into_iter().map(|p| p.name).collect();\n                (extension, names)\n            })\n            .collect())\n    }\n\n    pub async fn get_prompt_info(&mut self, name: &str) -> Result<Option<output::PromptInfo>> {\n        let prompts = self.agent.list_extension_prompts(&self.session_id).await;\n\n        // Find which extension has this prompt","sourceCodeStart":468,"sourceCodeEnd":504,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose-cli/src/session/mod.rs#L468-L504","documentation":"list_prompts filters extension prompts by name and validates the filter up front against the map of extensions that actually expose prompts. A filter matching no key — unknown, disabled, or an extension that defines no prompts — yields \"Extension '{name}' not found\".","triggerScenarios":"goose prompt list --extension NAME (or the prompts API) where NAME is not among the loaded extensions that expose prompts: not configured, disabled, misspelled, or prompt-free.","commonSituations":"Typos and casing errors; extension added but not enabled in config; extension loaded but implements no prompts; different configuration profile active.","solutions":["Run goose prompt list without --extension to see the exact names available","Enable the extension (goose configure) so it loads","Check spelling and case of the extension name against the listed keys"],"exampleFix":"# before\ngoose prompt list --extension devloper\n# after\ngoose prompt list                     # see real names first\ngoose prompt list --extension developer","handlingStrategy":"validation","validationCode":"let prompts = session.list_prompts(None).await?;\nlet known: Vec<&String> = prompts.keys().collect();\nif let Some(f) = &extension_filter {\n    assert!(known.contains(&f), \"unknown extension '{}'; known: {:?}\", f, known);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["List prompts unfiltered first and match names exactly, including case","Confirm the extension is enabled before filtering by it","Remember an extension with no prompts never appears as a key"],"tags":["extension","prompts","validation","cli"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}