mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-15 12:15:16 +00:00
## 背景 仓库早已迁移到 GitHub(`github.com/JianFeeeee/HomeAgent`,CI/CD 都在那边跑), gitcode 保留为**国内只读镜像**(`ci.yml` 的 sync-gitcode-main 快进推送)。 但 go.mod 的 module 路径一直是 `gitcode.com/JianFeeeee/...` —— 既与权威源 不符,`meta.SourceURL`(AGPL §13 的源码提供入口)也指向镜像而非实际运行的代码。 ## 关键区分(这是本次改动安全的前提) 两个 module 是**不同**的,影响面差一个数量级: | module | 谁依赖 | 改它的后果 | |---|---|---| | `.../HomeAgent`(主仓) | **只有主仓自己** | 内部重构,零外部影响 | | `.../homeagent-sdk`(SDK 仓) | 主仓 49 文件 + 所有外部插件 | 需重编插件 | ★ 实测确认:**插件不 import 主仓 module**(`strings qq/plugin.bin | grep HomeAgent` = 0), 只依赖 SDK 仓。而插件与内核的边界是 **RPC 方法名字符串** (`plugin.init` / `tool.invoke`…,见 proc/protocol.go),**与 Go module 名无关**。 ⇒ module 改名**不改变任何 wire 协议**,现网已装的插件照常运行。 SDK 的 GitHub 仓名是 `homeagentsdk`(无连字符),module 路径必须与之精确匹配, 否则 `go get` 会因路径不符失败,故取 `github.com/JianFeeeee/homeagentsdk`。 ## 改动 - `go.mod` / `go.sum`:两个 module 路径 + require/replace - 277 个 Go 文件 + Makefile + 打包脚本的 import 与 ldflags 路径 - SDK 仓 `meta.CoreModule`、`tools/hmapdev` 的 module 声明与工程模板 - 对外文档/链接的仓库地址(README、PLUGIN_DEV、OVERVIEW 等) ## 明确**保留** gitcode 的地方(镜像机制,不能动) - `GITCODE_TOKEN`、`GC_URL="…@gitcode.com"`(CI 同步 job) - `gitcode.com/api/v5/...`(release 附件上传) - git remote `gitcode`(镜像拉取/推送) - `docs/zh/ci-cd-runbook.md`(整篇讲镜像运维) ## 验证 - `go build ./...` / `go vet ./...` 绿 - `go test ./... -count=1` → 48 包 ok / 0 FAIL - hmapdev 工具链编译通过(`third_party/homeagent-sdk/tools/hmapdev`) - 全仓残留检查:module 形态的 `gitcode.com/JianFeeeee` = 0 - 镜像机制抽验:GC_URL / @gitcode / api/v5 / remote 均完好 ## 顺带修正 `hmapdev/templates.go` 的注释此前写「gitcode 的模块不在 proxy.golang.org 上」—— module 已迁 GitHub,该论断不再成立。改为如实说明**为何仍默认 replace 到本机 SDK**: 离线可构建、避免版本漂移、内网可用。理由与托管地无关,故 replace 保留。
101 lines
3.2 KiB
Go
101 lines
3.2 KiB
Go
// Command homed-kb-migrate 迁移存量知识库的目录名到规范名。
|
||
//
|
||
// 背景:旧版 Add 对名字**整串** sanitize、对路径**逐段** sanitize,
|
||
// 于是知识名(内存键 / LLM 可见的名字)与盘上目录从第一次落盘起就对不上。
|
||
// 典型残留:
|
||
//
|
||
// tech/_go_/note 分类段内的空格未被 TrimSpace 掉
|
||
// Tech/Upper 未小写化
|
||
// a/b with space 空格未替换成下划线
|
||
//
|
||
// 迁移把它们重命名到规范名,使三者一致。
|
||
//
|
||
// 安全设计:
|
||
// 1. **默认只报告**(-apply 才真改名)。批量 os.Rename 不可逆。
|
||
// 2. 检出目标名冲突则**整批拒绝**,不做部分迁移——半迁移状态比不迁移更难收拾。
|
||
// 3. 单条失败不中断整体,最后统一报告;执行前再查一次目标越界。
|
||
//
|
||
// 与 homed 启动时的关系:`homed` 启动会调同一个 PlanMigration 并**只报告**
|
||
// (见 cmd/homed/bootstrap.go 的 defaultApply)。本命令是人工确认后真正执行
|
||
// 的那一步。两者共用 internal/knowledge 里的同一份实现,避免口径漂移。
|
||
//
|
||
// 用法:
|
||
//
|
||
// homed-kb-migrate -root /data/homeagent/knowledge # 报告
|
||
// homed-kb-migrate -root /data/homeagent/knowledge -apply # 执行
|
||
package main
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"os"
|
||
"path/filepath"
|
||
|
||
"github.com/JianFeeeee/HomeAgent/internal/knowledge"
|
||
)
|
||
|
||
func main() {
|
||
root := flag.String("root", "", "知识库根目录(必填)")
|
||
apply := flag.Bool("apply", false, "真正执行重命名(缺省只报告)")
|
||
dryRun := flag.Bool("dry-run", false, "只报告(显式写法,与默认相同)")
|
||
limit := flag.Int("limit", 0, "单次最多改名条数,0 = 不限")
|
||
flag.Parse()
|
||
|
||
if *root == "" {
|
||
fmt.Fprintln(os.Stderr, "错误:必须指定 -root <知识库根目录>")
|
||
flag.Usage()
|
||
os.Exit(2)
|
||
}
|
||
if *apply && *dryRun {
|
||
fmt.Fprintln(os.Stderr, "错误:-apply 与 -dry-run 互斥")
|
||
os.Exit(2)
|
||
}
|
||
|
||
abs, err := filepath.Abs(*root)
|
||
if err != nil {
|
||
fmt.Fprintf(os.Stderr, "错误:%v\n", err)
|
||
os.Exit(1)
|
||
}
|
||
abs = filepath.Clean(abs)
|
||
|
||
items, err := knowledge.PlanMigration(abs)
|
||
if err != nil {
|
||
fmt.Fprintf(os.Stderr, "错误:无法读取 %s:%v\n", abs, err)
|
||
os.Exit(1)
|
||
}
|
||
if len(items) == 0 {
|
||
fmt.Printf("未发现任何知识条目(%s)\n", abs)
|
||
return
|
||
}
|
||
|
||
var need, illegal int
|
||
for _, it := range items {
|
||
switch {
|
||
case it.Illegal:
|
||
illegal++
|
||
fmt.Printf(" [非法] %-40s 含 .. / 点段 / 隐藏段;写入与删除均已拒绝,需人工处理\n", it.OldName)
|
||
case it.NewName != "":
|
||
need++
|
||
fmt.Printf(" [迁移] %-40s → %s\n", it.OldName, it.NewName)
|
||
}
|
||
}
|
||
fmt.Printf("\n共 %d 条:需迁移 %d,已规范 %d,非法 %d\n",
|
||
len(items), need, len(items)-need-illegal, illegal)
|
||
|
||
if !*apply {
|
||
if need == 0 {
|
||
fmt.Println("\n无需迁移。加 -apply 不会改变任何东西。")
|
||
return
|
||
}
|
||
fmt.Println("\n这是报告(未改动任何文件)。确认无误后加 -apply 执行。")
|
||
return
|
||
}
|
||
|
||
applied, failed := knowledge.ApplyMigration(abs, items, *limit)
|
||
fmt.Printf("\n迁移完成:成功 %d,失败 %d\n", applied, failed)
|
||
if failed > 0 {
|
||
fmt.Fprintln(os.Stderr, "存在失败项。若为名称冲突,请先人工处理冲突的目录再重跑。")
|
||
os.Exit(1)
|
||
}
|
||
}
|