diff --git a/cmd/picoclaw/internal/onboard/helpers.go b/cmd/picoclaw/internal/onboard/helpers.go index 626698fec..a5628f9cd 100644 --- a/cmd/picoclaw/internal/onboard/helpers.go +++ b/cmd/picoclaw/internal/onboard/helpers.go @@ -193,6 +193,9 @@ func copyEmbeddedToTarget(targetDir string) error { if err != nil { return fmt.Errorf("Failed to get relative path for %s: %v\n", path, err) } + if new_path == "AGENTS.md" || new_path == "IDENTITY.md" { + return nil + } // Build target file path targetPath := filepath.Join(targetDir, new_path) diff --git a/pkg/tools/skills_install.go b/pkg/tools/skills_install.go index b7532fac5..e73692fc2 100644 --- a/pkg/tools/skills_install.go +++ b/pkg/tools/skills_install.go @@ -157,7 +157,7 @@ func (t *InstallSkillTool) Execute(ctx context.Context, args map[string]any) *To } // Write origin metadata. - if err := writeOriginMeta(targetDir, registry.Name(), slug, result.Version); err != nil { + if err := writeOriginMeta(targetDir, registry, slug, result.Version); err != nil { logger.ErrorCF("tool", "Failed to write origin metadata", map[string]any{ "tool": "install_skill", @@ -189,17 +189,28 @@ func (t *InstallSkillTool) Execute(ctx context.Context, args map[string]any) *To // originMeta tracks which registry a skill was installed from. type originMeta struct { Version int `json:"version"` + OriginKind string `json:"origin_kind,omitempty"` Registry string `json:"registry"` Slug string `json:"slug"` + RegistryURL string `json:"registry_url,omitempty"` InstalledVersion string `json:"installed_version"` InstalledAt int64 `json:"installed_at"` } -func writeOriginMeta(targetDir, registryName, slug, version string) error { +func writeOriginMeta(targetDir string, registry skills.SkillRegistry, slug, version string) error { + registryName := "" + registryURL := "" + if registry != nil { + registryName = registry.Name() + registryURL = registry.SkillURL(slug, version) + } + meta := originMeta{ Version: 1, + OriginKind: "third_party", Registry: registryName, Slug: slug, + RegistryURL: registryURL, InstalledVersion: version, InstalledAt: time.Now().UnixMilli(), } diff --git a/pkg/tools/skills_install_test.go b/pkg/tools/skills_install_test.go index 2bbd239d6..fdf42f11d 100644 --- a/pkg/tools/skills_install_test.go +++ b/pkg/tools/skills_install_test.go @@ -2,6 +2,7 @@ package tools import ( "context" + "encoding/json" "os" "path/filepath" "testing" @@ -167,13 +168,27 @@ func TestInstallSkillToolMissingRegistry(t *testing.T) { func TestInstallSkillToolAllowsGitHubURLSlug(t *testing.T) { registryMgr := skills.NewRegistryManager() registryMgr.AddRegistry(&mockGitHubInstallRegistry{}) - tool := NewInstallSkillTool(registryMgr, t.TempDir()) + workspace := t.TempDir() + tool := NewInstallSkillTool(registryMgr, workspace) + slug := "https://github.com/synthetic-lab/octofriend/tree/main/.agents/skills/pr-review" result := tool.Execute(context.Background(), map[string]any{ - "slug": "https://github.com/synthetic-lab/octofriend/tree/main/.agents/skills/pr-review", + "slug": slug, "registry": "github", }) assert.False(t, result.IsError) assert.Contains(t, result.ForLLM, `Successfully installed skill`) + + data, err := os.ReadFile(filepath.Join(workspace, "skills", "pr-review", ".skill-origin.json")) + require.NoError(t, err) + + var meta originMeta + require.NoError(t, json.Unmarshal(data, &meta)) + assert.Equal(t, "third_party", meta.OriginKind) + assert.Equal(t, "github", meta.Registry) + assert.Equal(t, slug, meta.Slug) + assert.Equal(t, slug, meta.RegistryURL) + assert.Equal(t, "main", meta.InstalledVersion) + assert.NotZero(t, meta.InstalledAt) }