feat: open-plugins generalization + skills - #9112
Conversation
7c988d6 to
fea1c7c
Compare
6626ed7 to
efed233
Compare
fea1c7c to
bcb1880
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fea1c7c20d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| if let Ok(test_root) = std::env::var("GOOSE_PATH_ROOT") { | ||
| return Some( | ||
| PathBuf::from(test_root) | ||
| .join(".config") | ||
| .join("goose") |
There was a problem hiding this comment.
Load plugin settings from the shared config path
user_settings_path now hard-codes ~/.config/goose/settings.json (and <GOOSE_PATH_ROOT>/.config/goose/settings.json) instead of using the app’s canonical config resolver (Paths::config_dir() / Paths::in_config_dir). This breaks settings lookup in environments that rely on GOOSE_PATH_ROOT (which maps config to <root>/config) and on non-Linux platforms where Goose config is not under ~/.config, so enabledPlugins/disabledPlugins are silently ignored.
Useful? React with 👍 / 👎.
bcb1880 to
e07bd60
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e07bd601ff
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| for entry in fs::read_dir(skill_root)? { | ||
| let entry = entry?; | ||
| let path = entry.path(); | ||
| if path.is_dir() { | ||
| collect_skill_candidate(plugin_dir, &path, skills)?; |
There was a problem hiding this comment.
Recurse through nested skill directories before namespacing
collect_skill_candidates only inspects skill_root and its immediate child directories, so SKILL.md files nested deeper (for example skills/lang/rust/SKILL.md) are skipped during install. Those deeper skills are still discoverable at runtime because skill loading walks directories recursively in crates/goose/src/skills/mod.rs, which means they are loaded without rewrite_skill_name applying the plugin namespace and may collide with non-plugin skill names. This also makes PluginInstall.skills incomplete for plugins that organize skills hierarchically.
Useful? React with 👍 / 👎.
e07bd60 to
d9c4adf
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d9c4adff44
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| let default_skills_dir = plugin_dir.join("skills"); | ||
| if default_skills_dir.is_dir() { | ||
| skill_dirs.push(default_skills_dir); | ||
| } | ||
| skill_dirs.extend(formats::open_plugins::installed_skill_dirs(&plugin_dir)); |
There was a problem hiding this comment.
Respect Open Plugins exclusive skills setting
Do not always include plugins/<name>/skills in global skill discovery. The new Open Plugins manifest parsing supports skills.exclusive=true and custom skill roots, but this unconditional push still scans the default skills/ directory, so plugins that intentionally opt out can have unintended or un-namespaced skills loaded (and potentially collide with namespaced ones). This is observable whenever a plugin ships both a legacy skills/ tree and an exclusive custom path.
Useful? React with 👍 / 👎.
d9c4adf to
a8e4c5c
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a8e4c5ced8
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| let has_component = has_component_marker(checkout_dir); | ||
|
|
||
| if !has_manifest && !has_hooks { | ||
| if !has_manifest && !has_component { | ||
| return Err(FormatNotSupported.into()); |
There was a problem hiding this comment.
Restrict Open Plugins marker detection before install
try_install_from_manifest_at_root now claims Open Plugins format whenever commands/ or agents/ exists, even without an Open Plugins manifest. Because install_from_checkout_at_root tries Open Plugins first and only falls back on FormatNotSupported, any other Open-only validation error here prevents the Gemini installer from running. A valid Gemini extension that includes commands/ can therefore fail goose plugins install (for example when inferred Open Plugin name validation fails), which is a regression from the previous format detection behavior.
Useful? React with 👍 / 👎.
Co-authored-by: Jack Amadeo <jackamadeo@block.xyz>
a8e4c5c to
7e017fc
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7e017fc725
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| if !has_manifest && !has_component { | ||
| return Err(FormatNotSupported.into()); |
There was a problem hiding this comment.
Reject manifest-only repos without plugin components
try_install_from_manifest_at_root now treats any repo with an Open Plugins manifest as installable even when it has no plugin components, because the guard only checks !has_manifest && !has_component and install_from_manifest no longer enforces skills/hooks presence. In this case goose plugins install succeeds but installs an inert plugin, which is a regression from fail-fast behavior and makes accidental installs of non-plugin repos with a plugin.json much harder to detect.
Useful? React with 👍 / 👎.
* main: (70 commits) Feat/summon subagent instructions (#9325) feat: open-plugins generalization + skills (#9112) feat(hooks): PreToolUse denial (#9304) Add support for optional api_key configuration for declarative openai-engine providers (#9202) fix(cli): use plain '> ' prompt instead of goose emoji (#9305) flag for login shell PATH (#9313) Remove popular chat topics from new chat screen (#9307) fix: stop killing goosed when a window closes (#9302) Remove vendored Windows binaries (#9318) Add Linux musl CLI builds (#9240) feat(acp): paginate session list (#9199) docs: reorganize (#9310) Structured per-provider config block, non-destructive provider switching (#8977) feat(cli): add `goose review` local code review command (#9114) feat(tui): diff viewer (#9260) fix(otel): emit trace_output as span attribute instead of event (#9255) docs: add guide for connecting goose Desktop to a remote goosed server (#9275) fix(config): check file fallback when keyring has no entry (#9279) fix(desktop): ScheduleModal error message styling (#9278) fix(ui): align sidebar hamburger in macOS fullscreen (#9257) ...
* main: (38 commits) [Prompt injection mitigation] Update pattern-based detection to reduce FPs (#9350) feat: add Harbor eval runner (#9138) chore(release): bump version to 1.35.0 (minor) (#9150) Include request URL in provider error messages (#9232) fix(databricks): ensure parallel tool image responses don't interleave tool results (#9241) Surface resolved Databricks model metadata (#9206) Add unified thinking effort control across all providers (#9242) Add Linux desktop Vulkan packages (#9323) chore: update canonical model registry (#9331) feat: slash commands (built-in, skill, recipe) in acp server (#9238) feat: add /goal command for agent self-evaluation before finishing (#9069) Feat/summon subagent instructions (#9325) feat: open-plugins generalization + skills (#9112) feat(hooks): PreToolUse denial (#9304) Add support for optional api_key configuration for declarative openai-engine providers (#9202) fix(cli): use plain '> ' prompt instead of goose emoji (#9305) flag for login shell PATH (#9313) Remove popular chat topics from new chat screen (#9307) fix: stop killing goosed when a window closes (#9302) Remove vendored Windows binaries (#9318) ...
Co-authored-by: Jack Amadeo <jackamadeo@block.xyz>
Summary
Testing
TODO
Related Issues
N/A
Screenshots/Demos (for UX changes)
TODO