fix install_skill registry metadata normalization
This commit is contained in:
parent
4da7494c7e
commit
f0e96d25c2
4 changed files with 51 additions and 4 deletions
|
|
@ -73,6 +73,14 @@ func (r *GitHubRegistry) ResolveInstallDirName(target string) (string, error) {
|
||||||
return githubInstallDirNameWithBaseURL(target, r.webBase)
|
return githubInstallDirNameWithBaseURL(target, r.webBase)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *GitHubRegistry) NormalizeInstallTarget(target string) string {
|
||||||
|
normalized, err := canonicalGitHubRegistrySlugWithBaseURL(target, r.webBase)
|
||||||
|
if err != nil {
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
return normalized
|
||||||
|
}
|
||||||
|
|
||||||
func (r *GitHubRegistry) SkillURL(target, version string) string {
|
func (r *GitHubRegistry) SkillURL(target, version string) string {
|
||||||
defaultRef := strings.TrimSpace(version)
|
defaultRef := strings.TrimSpace(version)
|
||||||
ref, err := parseGitHubRefWithBaseURL(target, r.webBase, defaultRef)
|
ref, err := parseGitHubRefWithBaseURL(target, r.webBase, defaultRef)
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,27 @@ type SkillRegistry interface {
|
||||||
DownloadAndInstall(ctx context.Context, slug, version, targetDir string) (*InstallResult, error)
|
DownloadAndInstall(ctx context.Context, slug, version, targetDir string) (*InstallResult, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// InstallTargetNormalizer is implemented by registries that can canonicalize
|
||||||
|
// user-provided install targets into a stable slug for origin metadata.
|
||||||
|
type InstallTargetNormalizer interface {
|
||||||
|
NormalizeInstallTarget(target string) string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NormalizeInstallTargetForRegistryInstance(registry SkillRegistry, target string) string {
|
||||||
|
if registry == nil || target == "" {
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
normalizer, ok := registry.(InstallTargetNormalizer)
|
||||||
|
if !ok {
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
normalized := normalizer.NormalizeInstallTarget(target)
|
||||||
|
if normalized == "" {
|
||||||
|
return target
|
||||||
|
}
|
||||||
|
return normalized
|
||||||
|
}
|
||||||
|
|
||||||
// RegistryConfig holds configuration for all skill registries.
|
// RegistryConfig holds configuration for all skill registries.
|
||||||
// This is the input to NewRegistryManagerFromConfig.
|
// This is the input to NewRegistryManagerFromConfig.
|
||||||
type RegistryConfig struct {
|
type RegistryConfig struct {
|
||||||
|
|
|
||||||
|
|
@ -198,18 +198,19 @@ type originMeta struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeOriginMeta(targetDir string, registry skills.SkillRegistry, slug, version string) error {
|
func writeOriginMeta(targetDir string, registry skills.SkillRegistry, slug, version string) error {
|
||||||
|
normalizedSlug := skills.NormalizeInstallTargetForRegistryInstance(registry, slug)
|
||||||
registryName := ""
|
registryName := ""
|
||||||
registryURL := ""
|
registryURL := ""
|
||||||
if registry != nil {
|
if registry != nil {
|
||||||
registryName = registry.Name()
|
registryName = registry.Name()
|
||||||
registryURL = registry.SkillURL(slug, version)
|
registryURL = registry.SkillURL(normalizedSlug, version)
|
||||||
}
|
}
|
||||||
|
|
||||||
meta := originMeta{
|
meta := originMeta{
|
||||||
Version: 1,
|
Version: 1,
|
||||||
OriginKind: "third_party",
|
OriginKind: "third_party",
|
||||||
Registry: registryName,
|
Registry: registryName,
|
||||||
Slug: slug,
|
Slug: normalizedSlug,
|
||||||
RegistryURL: registryURL,
|
RegistryURL: registryURL,
|
||||||
InstalledVersion: version,
|
InstalledVersion: version,
|
||||||
InstalledAt: time.Now().UnixMilli(),
|
InstalledAt: time.Now().UnixMilli(),
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,19 @@ func (m *mockGitHubInstallRegistry) DownloadAndInstall(
|
||||||
return &skills.InstallResult{Version: "main"}, nil
|
return &skills.InstallResult{Version: "main"}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type stubGitHubInstallRegistry struct {
|
||||||
|
*skills.GitHubRegistry
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *stubGitHubInstallRegistry) DownloadAndInstall(
|
||||||
|
context.Context,
|
||||||
|
string,
|
||||||
|
string,
|
||||||
|
string,
|
||||||
|
) (*skills.InstallResult, error) {
|
||||||
|
return &skills.InstallResult{Version: "main"}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func TestInstallSkillToolName(t *testing.T) {
|
func TestInstallSkillToolName(t *testing.T) {
|
||||||
tool := NewInstallSkillTool(skills.NewRegistryManager(), t.TempDir())
|
tool := NewInstallSkillTool(skills.NewRegistryManager(), t.TempDir())
|
||||||
assert.Equal(t, "install_skill", tool.Name())
|
assert.Equal(t, "install_skill", tool.Name())
|
||||||
|
|
@ -166,8 +179,12 @@ func TestInstallSkillToolMissingRegistry(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestInstallSkillToolAllowsGitHubURLSlug(t *testing.T) {
|
func TestInstallSkillToolAllowsGitHubURLSlug(t *testing.T) {
|
||||||
|
registry := skills.GitHubRegistryConfig{Enabled: true, BaseURL: "https://github.com"}.BuildRegistry()
|
||||||
|
githubRegistry, ok := registry.(*skills.GitHubRegistry)
|
||||||
|
require.True(t, ok)
|
||||||
|
|
||||||
registryMgr := skills.NewRegistryManager()
|
registryMgr := skills.NewRegistryManager()
|
||||||
registryMgr.AddRegistry(&mockGitHubInstallRegistry{})
|
registryMgr.AddRegistry(&stubGitHubInstallRegistry{GitHubRegistry: githubRegistry})
|
||||||
workspace := t.TempDir()
|
workspace := t.TempDir()
|
||||||
tool := NewInstallSkillTool(registryMgr, workspace)
|
tool := NewInstallSkillTool(registryMgr, workspace)
|
||||||
|
|
||||||
|
|
@ -187,7 +204,7 @@ func TestInstallSkillToolAllowsGitHubURLSlug(t *testing.T) {
|
||||||
require.NoError(t, json.Unmarshal(data, &meta))
|
require.NoError(t, json.Unmarshal(data, &meta))
|
||||||
assert.Equal(t, "third_party", meta.OriginKind)
|
assert.Equal(t, "third_party", meta.OriginKind)
|
||||||
assert.Equal(t, "github", meta.Registry)
|
assert.Equal(t, "github", meta.Registry)
|
||||||
assert.Equal(t, slug, meta.Slug)
|
assert.Equal(t, "synthetic-lab/octofriend/.agents/skills/pr-review", meta.Slug)
|
||||||
assert.Equal(t, slug, meta.RegistryURL)
|
assert.Equal(t, slug, meta.RegistryURL)
|
||||||
assert.Equal(t, "main", meta.InstalledVersion)
|
assert.Equal(t, "main", meta.InstalledVersion)
|
||||||
assert.NotZero(t, meta.InstalledAt)
|
assert.NotZero(t, meta.InstalledAt)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue