Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Make skill discovery less strict: support nested skills/ directories#13235

Merged
SamMorrowDrums merged 1 commit into
trunkfrom
sammorrowdrums/fix-skill-install-discovery
Apr 21, 2026
Merged

Make skill discovery less strict: support nested skills/ directories#13235
SamMorrowDrums merged 1 commit into
trunkfrom
sammorrowdrums/fix-skill-install-discovery

Conversation

@SamMorrowDrums
Copy link
Copy Markdown
Contributor

Problem

Repositories like hashicorp/agent-skills organize skills under nested prefixes:

terraform/code-generation/skills/terraform-style-guide/SKILL.md
packer/builders/skills/packer-builder/SKILL.md

Our current discovery logic only matched skills/ at the repository root, so these were never found by gh skill install.

Changes

Relaxes skill discovery to recognize skills/ directories at any depth in the tree:

  • matchSkillConventions: Adds checks for <prefix>/skills/<name>/SKILL.md and <prefix>/skills/<ns>/<name>/SKILL.md at any depth, after the existing root-level and plugins checks
  • isSkillPath: Also matches paths containing /skills/ or /plugins/ (not just starting with), enabling direct path-based install like gh skill install hashicorp/agent-skills terraform/code-generation/skills/terraform-style-guide
  • DiscoverSkillByPath: Fixes namespace detection to find the skills segment anywhere in the path rather than assuming parts[0] == "skills"
  • Error messages and help text: Updated to mention nested skills/ directories

Tests added

  • TestMatchSkillConventions: nested skills dir, deeply nested, nested namespaced, single prefix, root-level priority preserved
  • TestDiscoverSkills: nested skills in tree, mixed root-level and nested skills
  • TestDiscoverSkillByPath: deeply nested path, deeply nested namespaced path
  • TestDiscoverLocalSkills: nested local skills directory
  • TestMatchesSkillPath / TestMatchSkillPath: nested conventions
  • Test_isSkillPath: new test covering all path patterns (empty, plain name, SKILL.md, root skills/, nested skills/, nested plugins/, substring)
  • TestInstallRun: integration test for nested path-based install
  • Fixed stubSkillByPath to properly URL-encode parent paths with slashes

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Relaxes skill discovery and path-based installation to support repositories that place skills/ directories under nested prefixes (e.g. terraform/code-generation/skills/...), and expands tests to cover the new conventions.

Changes:

  • Extend discovery matching to recognize skills/<name>/SKILL.md and skills/<ns>/<name>/SKILL.md at any depth.
  • Treat args containing /skills/ or /plugins/ as path-based installs (skipping full tree discovery).
  • Add/adjust tests for nested discovery, nested path-based install, and URL-escaped contents lookups.
Show a summary per file
File Description
pkg/cmd/skills/install/install.go Updates CLI help text and broadens isSkillPath detection to include nested skills/ and plugins/ segments.
pkg/cmd/skills/install/install_test.go Fixes stubs to match URL-escaped parent paths and adds integration/unit tests for nested path installs and isSkillPath.
internal/skills/discovery/discovery.go Adds nested skills/ convention matching, improves error message text, and updates namespace detection for path-based lookups.
internal/skills/discovery/discovery_test.go Adds coverage for nested skills/ discovery (remote + local) and nested path-based lookup behavior.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (1)

internal/skills/discovery/discovery.go:804

  • Similarly, the local discovery "no skills found" error message mentions {prefix}/skills/*/SKILL.md but omits the nested namespaced form {prefix}/skills/{namespace}/*/SKILL.md, even though it’s now supported. Updating the message will make troubleshooting easier.
		return nil, fmt.Errorf(
			"no skills found in %s\n"+
				"  Expected SKILL.md in the directory, or skills in skills/*/SKILL.md,\n"+
				"  skills/{scope}/*/SKILL.md, {prefix}/skills/*/SKILL.md,\n"+
				"  */SKILL.md, or plugins/*/skills/*/SKILL.md",
			dir,
  • Files reviewed: 4/4 changed files
  • Comments generated: 4

Comment thread internal/skills/discovery/discovery.go Outdated
Comment thread pkg/cmd/skills/install/install.go Outdated
Comment thread internal/skills/discovery/discovery.go
Comment thread internal/skills/discovery/discovery.go Outdated
@SamMorrowDrums SamMorrowDrums force-pushed the sammorrowdrums/fix-skill-install-discovery branch from 3518d85 to e94892e Compare April 20, 2026 09:14
@SamMorrowDrums SamMorrowDrums force-pushed the sammorrowdrums/fix-skill-install-discovery branch from e94892e to 0647686 Compare April 20, 2026 09:44
@SamMorrowDrums SamMorrowDrums added the gh-skill relating to the gh skill command label Apr 20, 2026
Copy link
Copy Markdown
Contributor

@tommaso-moro tommaso-moro left a comment

Choose a reason for hiding this comment

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

some copilot comments, but aside from those lgtm

@BagToad
Copy link
Copy Markdown
Member

BagToad commented Apr 20, 2026

👋 @SamMorrowDrums, I pushed a commit (d9f0305) with some acceptance test changes (one was failing and one new one to cover the new behavior):

Details
  • New test: acceptance/testdata/skills/skills-install-nested-discovery.txtar exercises the relaxed skills/ discovery rules end-to-end:

    • direct path-based install of a deeply nested skill (<prefix>/skills/<name>)
    • direct path-based install of a deeply nested namespaced skill (<prefix>/skills/<ns>/<name>)
    • name-based discovery resolving a deeply nested skill
  • Fix to skills-publish-dry-run.txtar: The negative case ran gh skill publish --dry-run $WORK and asserted no skills found in. The test's own testdata writes $WORK/test-repo/skills/hello-world/SKILL.md, which is now discoverable from $WORK thanks to nested skills/ matching, so the assertion stopped holding. Pointed it at a fresh empty subdirectory so it tests what it claims to.

Copy link
Copy Markdown
Member

@BagToad BagToad left a comment

Choose a reason for hiding this comment

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

LGTM after copilot comments resolved

Relax skill discovery to recognize skills/ directories at any depth
in the repository tree, not just at the root. This enables repos like
hashicorp/agent-skills that organize skills under prefixes such as
terraform/code-generation/skills/*/SKILL.md.

Changes:
- matchSkillConventions: add checks for <prefix>/skills/<name>/SKILL.md
  and <prefix>/skills/<ns>/<name>/SKILL.md at any depth
- isSkillPath: also match paths containing /skills/ for direct
  path-based install
- DiscoverSkillByPath: fix namespace detection to find the skills
  segment anywhere in the path
- Update error messages and help text to mention nested conventions

Co-authored-by: Copilot <[email protected]>
@SamMorrowDrums SamMorrowDrums force-pushed the sammorrowdrums/fix-skill-install-discovery branch from d9f0305 to 9a368f4 Compare April 20, 2026 19:07
@SamMorrowDrums SamMorrowDrums merged commit a67f4f7 into trunk Apr 21, 2026
11 checks passed
@SamMorrowDrums SamMorrowDrums deleted the sammorrowdrums/fix-skill-install-discovery branch April 21, 2026 08:01
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request May 8, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [cli/cli](https://github.com/cli/cli) | minor | `v2.90.0` → `v2.92.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>cli/cli (cli/cli)</summary>

### [`v2.92.0`](https://github.com/cli/cli/releases/tag/v2.92.0): GitHub CLI 2.92.0

[Compare Source](cli/cli@v2.91.0...v2.92.0)

#### Support GitHub Enterprise Cloud (GHEC) in `skill` commandset

Now `gh skill` subcommands (`install`, `preview`, `publish`, `search`, `update`) are able to work with [GHEC](https://docs.github.com/en/enterprise-cloud@latest/admin/overview/about-github-enterprise-cloud) hosts with data residency.

#### Add `--allow-hidden-dirs` flag to `skill preview`

Following the addition of `--allow-hidden-dirs` to `skill install` in the previous release, now the flag is also supported in `skill preview`, allowing users to preview skills located in hidden (dot-prefixed) directories such as `.claude/skills/`, `.agents/skills/`, and `.github/skills/`.

#### What's Changed

##### ✨ Features

- feat(skills): add --allow-hidden-dirs flag to preview command by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13265](cli/cli#13265)
- feat(skills): support GHEC with data residency hosts by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13264](cli/cli#13264)

##### 🐛 Fixes

- Fix SetSampleRate not updating sample\_rate dimension by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13259](cli/cli#13259)
- Fix log terminal injection by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13272](cli/cli#13272)
- Add "Resource not accessible" to ProjectsV2IgnorableError by [@&#8203;maxbeizer](https://github.com/maxbeizer) in [#&#8203;13281](cli/cli#13281)

##### 📚 Docs & Chores

- fix: using variable interpolation \`${{ in deployment.yml... by [@&#8203;orbisai0security](https://github.com/orbisai0security) in [#&#8203;13258](cli/cli#13258)
- docs: correct typo in Linux Homebrew copy by [@&#8203;cassidyjames](https://github.com/cassidyjames) in [#&#8203;13273](cli/cli#13273)
- Install skills flat by Name, not namespaced InstallName by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13266](cli/cli#13266)
- chore: fix zsh completion on debian by [@&#8203;babakks](https://github.com/babakks) in [#&#8203;13274](cli/cli#13274)
- Add trust disclaimer to extension help text by [@&#8203;travellertales](https://github.com/travellertales) in [#&#8203;13296](cli/cli#13296)
- Bump Go to 1.26.2 by [@&#8203;github-actions](https://github.com/github-actions)\[bot] in [#&#8203;13301](cli/cli#13301)

##### :dependabot: Dependencies

- chore(deps): bump github.com/mattn/go-isatty from 0.0.20 to 0.0.21 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13161](cli/cli#13161)
- chore(deps): bump github.com/google/go-containerregistry from 0.21.4 to 0.21.5 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13162](cli/cli#13162)
- chore(deps): bump charm.land/lipgloss/v2 from 2.0.2 to 2.0.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13163](cli/cli#13163)
- chore(deps): bump charm.land/bubbletea/v2 from 2.0.2 to 2.0.6 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13206](cli/cli#13206)
- chore(deps): bump github.com/gdamore/tcell/v2 from 2.13.8 to 2.13.9 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13241](cli/cli#13241)
- chore(deps): bump github.com/mattn/go-isatty from 0.0.21 to 0.0.22 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;13298](cli/cli#13298)

#### New Contributors

- [@&#8203;orbisai0security](https://github.com/orbisai0security) made their first contribution in [#&#8203;13258](cli/cli#13258)
- [@&#8203;cassidyjames](https://github.com/cassidyjames) made their first contribution in [#&#8203;13273](cli/cli#13273)
- [@&#8203;travellertales](https://github.com/travellertales) made their first contribution in [#&#8203;13296](cli/cli#13296)

**Full Changelog**: <cli/cli@v2.91.0...v2.92.0>

### [`v2.91.0`](https://github.com/cli/cli/releases/tag/v2.91.0): GitHub CLI 2.91.0

[Compare Source](cli/cli@v2.90.0...v2.91.0)

#### GitHub CLI now collects pseudonymous telemetry

To better understand how features are used in practice, especially as agentic adoption grows, GitHub CLI now sends pseudonymous telemetry.

See [Telemetry](https://cli.github.com/telemetry) for more details on what's collected, why, and how to opt out.

#### Support more agents in `gh skill`

Thanks to community feedback, `gh` now supports a large number of agent hosts. Run `gh skill install --help` for the list of available agents.

#### Improve skill discovery

`gh skill install` now adds the `--allow-hidden-dirs` flag to support discovering skills in hidden (dot-prefixed) directories such as `.claude/skills/`, `.agents/skills/`, and `.github/skills/`.

#### Detect skills re-published from other sources

GitHut CLI now detects if the skill to be installed is re-published from an upstream source and offers the option to install it from there. The `--upstream` flag is also added for non-interactive use cases.

#### What's Changed

##### ✨ Features

- Add support for installation in multiple agent hosts in `gh skills install` by [@&#8203;tommaso-moro](https://github.com/tommaso-moro) in [#&#8203;13209](cli/cli#13209)
- Add --allow-hidden-dirs flag to gh skill install by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13213](cli/cli#13213)
- Make skill discovery less strict: support nested `skills/` directories by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13235](cli/cli#13235)
- feat(skills): detect re-published skills and offer upstream install by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13236](cli/cli#13236)

##### 🐛 Fixes

- Fix `skills publish --fix` to not publish by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13237](cli/cli#13237)
- fix(skills): match skills by install name in preview command by [@&#8203;SamMorrowDrums](https://github.com/SamMorrowDrums) in [#&#8203;13249](cli/cli#13249)

##### 📚 Docs & Chores

- Remove misleading text by [@&#8203;tommaso-moro](https://github.com/tommaso-moro) in [#&#8203;13203](cli/cli#13203)
- Add sampled command telemetry by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13191](cli/cli#13191)
- Do not send telemetry for aliases by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13192](cli/cli#13192)
- Add skills specific telemetry by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13204](cli/cli#13204)
- Record CI context in telemetry by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13210](cli/cli#13210)
- Record official extension telemetry by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13205](cli/cli#13205)
- Add telemetry command by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13253](cli/cli#13253)
- Log when there is no telemetry by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13255](cli/cli#13255)
- docs(skills): add gh and gh-skill agent skills by [@&#8203;BagToad](https://github.com/BagToad) in [#&#8203;13244](cli/cli#13244)
- Enable telemetry without env var by [@&#8203;williammartin](https://github.com/williammartin) in [#&#8203;13254](cli/cli#13254)

**Full Changelog**: <cli/cli@v2.90.0...v2.91.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xNjkuNCIsInVwZGF0ZWRJblZlciI6IjQzLjE2OS40IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gh-skill relating to the gh skill command

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants