• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

stacklok / toolhive / 24658066489
66%

Build:
DEFAULT BRANCH: main
Ran 20 Apr 2026 09:12AM UTC
Jobs 1
Files 641
Run time 2min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

20 Apr 2026 09:07AM UTC coverage: 66.295% (-0.04%) from 66.337%
24658066489

push

github

web-flow
Fix skill install for qualified namespace/name references and missing parent directory (#4841)

* Fall back to registry lookup when Install receives a qualified namespace/name

* Create parent directory before acquiring lock in WriteFiles

* Block multi-segment OCI refs from triggering registry fallback

Extend the fallback guard in Install and GetContent to also reject
refs with more than one '/' (e.g. ghcr.io/org/skill). Previously only
':' and '@' were checked, so a tagless multi-segment OCI reference
could silently trigger a registry lookup on pull failure.

Add a Debug log line before the fallback so operators can see when
the fallback path is taken.

Fix installFromResolvedRegistry passing opts.Name (the OCI reference
string) to installAndRegister instead of result.Skill.Metadata.Name,
which caused incorrect group entries and broken rollback.

* Add WriteFiles test for missing parent directory

* Extend OCI fallback tests with digest, multi-segment, and ambiguity cases

Add three new test cases to TestInstallQualifiedNameOCIFallback:
- digest ref (@sha256:...) must not trigger registry fallback
- multi-segment OCI ref (ghcr.io/org/skill) must not trigger fallback
- multiple registry matches must surface a conflict error to the caller

Also pin the Pull mock's third argument in the three qualifying-name
cases to the expected reference string instead of gomock.Any().

* Extract isUnambiguousOCIRef helper for registry-fallback guard

Replace the inlined string-based guard in Install and GetContent with a
named helper that combines parsed-form inspection (name.Digest type
assertion) with string checks for the tag and segment-count cases.

A pure parsed-form check is not sufficient: nameref.ParseReference
normalizes "foo/bar" to "foo/bar:latest" (name.Tag), so the parsed
reference cannot distinguish a user-supplied tag from the default. The
helper documents this constraint and combines both signals.

42 of 50 new or added lines in 2 files covered. (84.0%)

43 existing lines in 6 files now uncovered.

57962 of 87430 relevant lines covered (66.3%)

62.11 hits per line

Uncovered Changes

Lines Coverage ∆ File
6
85.13
-0.03% pkg/skills/skillsvc/skillsvc.go
2
73.33
-2.67% pkg/skills/gitresolver/writer.go

Coverage Regressions

Lines Coverage ∆ File
14
74.44
-5.19% pkg/client/config.go
11
69.23
-14.1% pkg/client/discovery.go
8
23.56
-4.6% pkg/client/manager.go
6
76.15
-5.5% pkg/secrets/keyring/keyctl_linux.go
2
61.97
-1.41% pkg/networking/port.go
2
94.77
-1.31% pkg/vmcp/composer/dag_executor.go
Jobs
ID Job ID Ran Files Coverage
1 24658066489.1 20 Apr 2026 09:12AM UTC 641
66.3
GitHub Action Run
Source Files on build 24658066489
  • Tree
  • List 641
  • Changed 9
  • Source Changed 2
  • Coverage Changed 9
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #24658066489
  • c331aa49 on github
  • Prev Build on main (#24655237604)
  • Next Build on main (#24658578015)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc