Skip to content

feat: open-plugins generalization + skills - #9112

Merged
alexhancock merged 1 commit into
mainfrom
alexhancock/hooks-and-skills
May 19, 2026
Merged

feat: open-plugins generalization + skills#9112
alexhancock merged 1 commit into
mainfrom
alexhancock/hooks-and-skills

Conversation

@alexhancock

Copy link
Copy Markdown
Collaborator

Summary

Testing

TODO

Related Issues

N/A

Screenshots/Demos (for UX changes)

TODO

@alexhancock
alexhancock requested a review from jamadeo May 8, 2026 18:48
@alexhancock
alexhancock force-pushed the alexhancock/hooks-and-skills branch from 7c988d6 to fea1c7c Compare May 8, 2026 18:58
@alexhancock
alexhancock marked this pull request as ready for review May 11, 2026 13:14
@alexhancock
alexhancock force-pushed the alexhancock/hooks-and-skills branch from fea1c7c to bcb1880 Compare May 11, 2026 13:18

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +142 to +146
if let Ok(test_root) = std::env::var("GOOSE_PATH_ROOT") {
return Some(
PathBuf::from(test_root)
.join(".config")
.join("goose")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

Base automatically changed from alexhancock/hooks to main May 11, 2026 16:16
@alexhancock
alexhancock force-pushed the alexhancock/hooks-and-skills branch from bcb1880 to e07bd60 Compare May 11, 2026 16:51

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +365 to +369
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)?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@alexhancock
alexhancock force-pushed the alexhancock/hooks-and-skills branch from e07bd60 to d9c4adf Compare May 12, 2026 15:23

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +106 to +110
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));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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 👍 / 👎.

@DOsinga DOsinga added the needs_human label to set when a robot looks at a PR and can't handle it label May 12, 2026
@alexhancock
alexhancock force-pushed the alexhancock/hooks-and-skills branch from d9c4adf to a8e4c5c Compare May 19, 2026 18:26

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +47 to 50
let has_component = has_component_marker(checkout_dir);

if !has_manifest && !has_hooks {
if !has_manifest && !has_component {
return Err(FormatNotSupported.into());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 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>
@alexhancock
alexhancock force-pushed the alexhancock/hooks-and-skills branch from a8e4c5c to 7e017fc Compare May 19, 2026 19:07

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +49 to 50
if !has_manifest && !has_component {
return Err(FormatNotSupported.into());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@alexhancock
alexhancock added this pull request to the merge queue May 19, 2026
Merged via the queue into main with commit 20a832a May 19, 2026
23 checks passed
@alexhancock
alexhancock deleted the alexhancock/hooks-and-skills branch May 19, 2026 21:16
lifeizhou-ap added a commit that referenced this pull request May 20, 2026
* 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)
  ...
lifeizhou-ap added a commit that referenced this pull request May 22, 2026
* 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)
  ...
shafqatevo pushed a commit to shafqatevo/goose that referenced this pull request Aug 7, 2026
Co-authored-by: Jack Amadeo <jackamadeo@block.xyz>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs_human label to set when a robot looks at a PR and can't handle it

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants