Files
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

50 lines
1.4 KiB
Go

package providerregistry
import "strings"
// ComposerSkillProjection is the provider-authored invocation contract for one
// discovered skill. Discovery adapters supply identity and plugin ownership;
// the registry owns how that skill is presented and invoked.
type ComposerSkillProjection struct {
Trigger string
Invocation SkillInvocation
}
// ProjectComposerSkill resolves the canonical trigger and invocation strategy
// for a discovered skill. Callers must not reconstruct these values from
// provider identity.
func ProjectComposerSkill(providerID, name, pluginName string) (ComposerSkillProjection, bool) {
descriptor, ok := Find(providerID)
if !ok {
return ComposerSkillProjection{}, false
}
name = strings.TrimSpace(name)
if name == "" {
return ComposerSkillProjection{}, false
}
skill := descriptor.ComposerProfile.Skills
trigger := ""
switch skill.Kind {
case SkillKindCodex, SkillKindCursor:
trigger = "$" + name
case SkillKindClaudeCode:
pluginName = strings.TrimSpace(pluginName)
if pluginName != "" {
trigger = "/" + pluginName + ":" + name
} else {
trigger = "/" + name
}
case SkillKindOpenCode:
trigger = "/" + name
default:
return ComposerSkillProjection{}, false
}
if skill.Invocation == "" {
return ComposerSkillProjection{}, false
}
return ComposerSkillProjection{
Trigger: trigger,
Invocation: skill.Invocation,
}, true
}