- 四组并行完成:main/wire*.go、wire_capacity|channels|runtime、channels|persona_*|emotion|observability、 voice|plugins|stream|skills|vision|subagent_tool|extractor|mcp|sessionread_tool|terminal_tool。 - 机械校验(git diff -U0 去 // 行与空行)仅剩 wire_frontend.go:84 一处行尾注释:代码前缀 「\ta.gw = gw 」经 cat -A 与 HEAD 逐字节比对一致(allow 清单已声明)。 - 验收:隔离 worktree(HEAD + 本批 patch)go build/vet 绿、全树 58 包 ok、 linux/amd64 + darwin/arm64 交叉编译绿;gofmt -l 干净。 - 备注:整树两次红均为负载敏感 flake(backthink / orchestration 的 timeout 类用例单独 -count=20 全过)。
36 lines
1.2 KiB
Go
36 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"git.yeij.top/AskaEth/Cyrene_v2/internal/capability/skills"
|
|
"git.yeij.top/AskaEth/Cyrene_v2/internal/logger"
|
|
)
|
|
|
|
// defaultSkillsDir 是技能 YAML 定义的磁盘目录。它是可选的:目录缺失时只告警并
|
|
// 跳过技能加载。
|
|
const defaultSkillsDir = "configs/skills"
|
|
|
|
// wireSkills 从 configs/skills 加载技能定义,并把每个技能以 KindSkill 能力注册进
|
|
// 能力注册表,供插件生态枚举。加载+注册是 M5 的交付物;Runner.Run(端到端执行
|
|
// 技能)落在后续里程碑,目前返回 ErrRunPending。
|
|
func (a *app) wireSkills() {
|
|
log := logger.WithSource(a.log, "cmd/cyrene")
|
|
list, err := skills.NewLoader(a.log).LoadDir(defaultSkillsDir)
|
|
if err != nil {
|
|
log.Warn("skills load skipped", "dir", defaultSkillsDir, "error", err)
|
|
return
|
|
}
|
|
if len(list) == 0 {
|
|
log.Debug("no skills defined", "dir", defaultSkillsDir)
|
|
return
|
|
}
|
|
registered := 0
|
|
for _, s := range list {
|
|
if err := skills.Register(a.caps, s); err != nil {
|
|
log.Warn("skill register skipped", "skill", s.Name(), "error", err)
|
|
continue
|
|
}
|
|
registered++
|
|
}
|
|
log.Info("skills registered", "registered", registered, "loaded", len(list))
|
|
}
|