skillhub

package
v1.1.67 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 15, 2026 License: MIT Imports: 15 Imported by: 0

Documentation

Overview

Package skillhub provides marketplace clients and safe local installation for skills.

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrLocalSkillExists = errors.New("skill directory already exists and is not managed by SkillHub")
	ErrInvalidArchive   = errors.New("skill archive is invalid")
)

Functions

This section is empty.

Types

type Category

type Category struct {
	Key      string     `json:"key"`
	Name     string     `json:"name"`
	NameEn   string     `json:"nameEn,omitempty"`
	Children []Category `json:"children,omitempty"`
}

type ClawHubClient

type ClawHubClient struct {
	// contains filtered or unexported fields
}

func NewClawHubClient

func NewClawHubClient(baseURL string, client *http.Client) *ClawHubClient

func (*ClawHubClient) Categories

func (c *ClawHubClient) Categories(context.Context) ([]Category, error)

func (*ClawHubClient) Detail

func (c *ClawHubClient) Detail(ctx context.Context, id SkillID) (SkillDetail, error)

func (*ClawHubClient) Download

func (c *ClawHubClient) Download(ctx context.Context, id SkillID, version string) (io.ReadCloser, DownloadMeta, error)

func (*ClawHubClient) DownloadSources

func (c *ClawHubClient) DownloadSources(id SkillID, version string) []DownloadSource

func (*ClawHubClient) Evaluation

func (c *ClawHubClient) Evaluation(context.Context, SkillID) (any, error)

func (*ClawHubClient) Files

func (c *ClawHubClient) Files(ctx context.Context, id SkillID, version string) ([]SkillFile, error)

func (*ClawHubClient) Market

func (c *ClawHubClient) Market() MarketInfo

func (*ClawHubClient) Search

func (*ClawHubClient) UserSkills

func (c *ClawHubClient) UserSkills(ctx context.Context, handle string, q UserSkillsQuery) (SearchPage, error)

UserSkills is not available from the public ClawHub API. Search supports author filtering.

type DownloadMeta

type DownloadMeta struct {
	SourceURL string `json:"sourceUrl"`
	Filename  string `json:"filename,omitempty"`
}

type DownloadSource

type DownloadSource struct {
	URL      string `json:"url"`
	Kind     string `json:"kind"`
	Fallback bool   `json:"fallback,omitempty"`
}

type InstallMetadata

type InstallMetadata struct {
	Market      Market    `json:"market"`
	ID          string    `json:"id"`
	Slug        string    `json:"slug"`
	Version     string    `json:"version"`
	InstalledAt time.Time `json:"installedAt"`
	SourceURL   string    `json:"sourceURL"`
}

type InstallRequest

type InstallRequest struct {
	Market    Market
	ID        string
	Version   string
	Scope     string
	TargetDir string
	Overwrite bool
}

type InstallResult

type InstallResult struct {
	Name             string   `json:"name"`
	Market           Market   `json:"market"`
	Version          string   `json:"version"`
	Scope            string   `json:"scope"`
	Dir              string   `json:"dir"`
	Installed        bool     `json:"installed"`
	AlreadyInstalled bool     `json:"alreadyInstalled,omitempty"`
	Warnings         []string `json:"warnings,omitempty"`
}

func Install

func Install(ctx context.Context, client MarketClient, request InstallRequest) (InstallResult, error)

type InstalledState

type InstalledState struct {
	Installed       bool   `json:"installed"`
	Scope           string `json:"scope"`
	Dir             string `json:"dir"`
	Version         string `json:"version,omitempty"`
	Active          bool   `json:"active,omitempty"`
	UpdateAvailable bool   `json:"updateAvailable,omitempty"`
}

type LocalIndex

type LocalIndex struct {
	// contains filtered or unexported fields
}

func NewLocalIndex

func NewLocalIndex(globalDir string, projectDirs []string) (*LocalIndex, error)

func (*LocalIndex) Apply

func (i *LocalIndex) Apply(items []SkillSummary)

func (*LocalIndex) List

func (i *LocalIndex) List() []InstalledState

func (*LocalIndex) State

func (i *LocalIndex) State(market Market, id string) *InstalledState

type Market

type Market string
const (
	MarketSkillHub Market = "skillhub.cn"
	MarketClawHub  Market = "clawhub.ai"
)

type MarketCapabilities

type MarketCapabilities struct {
	Search, List, CursorPagination, PagePagination bool
	Categories, Showcase, AuthorFilter, UserSkills bool
	FileList, FileContent, Evaluation              bool
}

type MarketInfo

type MarketInfo struct {
	ID           Market             `json:"id"`
	Name         string             `json:"name"`
	SiteURL      string             `json:"siteUrl"`
	Capabilities MarketCapabilities `json:"capabilities"`
}

type SearchPage

type SearchPage struct {
	Items      []SkillSummary `json:"items"`
	Total      int64          `json:"total,omitempty"`
	Page       int            `json:"page,omitempty"`
	PageSize   int            `json:"pageSize,omitempty"`
	NextCursor string         `json:"nextCursor,omitempty"`
}

type SearchQuery

type SearchQuery struct {
	Query             string
	Limit             int
	Page              int
	Cursor            string
	Sort              string
	Order             string
	Category          string
	Author            string
	VerifiedOnly      bool
	NonSuspiciousOnly bool
}

type Service

type Service struct {
	// contains filtered or unexported fields
}

func NewService

func NewService(globalDir string, projectDirs []string, officialHandles []string, clients ...MarketClient) *Service

func NewServiceForWorkDir

func NewServiceForWorkDir(globalDir, workDir string, officialHandles []string, clients ...MarketClient) *Service

func (*Service) Categories

func (s *Service) Categories(ctx context.Context, market Market) ([]Category, error)

func (*Service) Detail

func (s *Service) Detail(ctx context.Context, market Market, id string) (SkillDetail, error)

func (*Service) Install

func (s *Service) Install(ctx context.Context, request InstallRequest) (InstallResult, error)

func (*Service) Markets

func (s *Service) Markets() []MarketInfo

func (*Service) Official

func (s *Service) Official(ctx context.Context, query UserSkillsQuery) (SearchPage, error)

func (*Service) Search

func (s *Service) Search(ctx context.Context, market Market, query SearchQuery) (SearchPage, error)

type SkillDetail

type SkillDetail struct {
	SkillSummary
	Files           []SkillFile      `json:"files,omitempty"`
	DownloadSources []DownloadSource `json:"downloadSources,omitempty"`
	Readme          string           `json:"readme,omitempty"`
	SecurityReports any              `json:"securityReports,omitempty"`
	Evaluation      any              `json:"evaluation,omitempty"`
}

type SkillFile

type SkillFile struct {
	Path   string `json:"path"`
	SHA256 string `json:"sha256,omitempty"`
	Size   int64  `json:"size,omitempty"`
}

type SkillHubClient

type SkillHubClient struct {
	// contains filtered or unexported fields
}

func NewSkillHubClient

func NewSkillHubClient(baseURL string, client *http.Client) *SkillHubClient

func (*SkillHubClient) Categories

func (c *SkillHubClient) Categories(ctx context.Context) ([]Category, error)

func (*SkillHubClient) Detail

func (c *SkillHubClient) Detail(ctx context.Context, id SkillID) (SkillDetail, error)

func (*SkillHubClient) Download

func (c *SkillHubClient) Download(ctx context.Context, id SkillID, version string) (io.ReadCloser, DownloadMeta, error)

func (*SkillHubClient) DownloadSources

func (c *SkillHubClient) DownloadSources(id SkillID, version string) []DownloadSource

func (*SkillHubClient) Evaluation

func (c *SkillHubClient) Evaluation(ctx context.Context, id SkillID) (any, error)

func (*SkillHubClient) Files

func (c *SkillHubClient) Files(ctx context.Context, id SkillID, version string) ([]SkillFile, error)

func (*SkillHubClient) Market

func (c *SkillHubClient) Market() MarketInfo

func (*SkillHubClient) Search

func (*SkillHubClient) UserSkills

func (c *SkillHubClient) UserSkills(ctx context.Context, handle string, q UserSkillsQuery) (SearchPage, error)

type SkillID

type SkillID struct {
	Market Market `json:"market"`
	ID     string `json:"id"`
}

type SkillSummary

type SkillSummary struct {
	Market            Market          `json:"market"`
	ID                string          `json:"id"`
	Slug              string          `json:"slug"`
	Name              string          `json:"name"`
	DisplayName       string          `json:"displayName"`
	Description       string          `json:"description"`
	Version           string          `json:"version"`
	Author            string          `json:"author"`
	Category          string          `json:"category"`
	Tags              []string        `json:"tags,omitempty"`
	IconURL           string          `json:"iconUrl,omitempty"`
	Homepage          string          `json:"homepage,omitempty"`
	SourceURL         string          `json:"sourceUrl,omitempty"`
	Source            string          `json:"source,omitempty"`
	PublisherName     string          `json:"publisherName,omitempty"`
	CertifiedName     string          `json:"certifiedName,omitempty"`
	PublisherVerified bool            `json:"publisherVerified,omitempty"`
	Downloads         int64           `json:"downloads,omitempty"`
	Installs          int64           `json:"installs,omitempty"`
	Stars             int64           `json:"stars,omitempty"`
	Score             float64         `json:"score,omitempty"`
	Verified          bool            `json:"verified,omitempty"`
	Suspicious        bool            `json:"suspicious,omitempty"`
	UpdatedAt         time.Time       `json:"updatedAt,omitempty"`
	Installed         *InstalledState `json:"installed,omitempty"`
}

type UserSkillsQuery

type UserSkillsQuery struct {
	Query string
	Limit int
	Page  int
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL