Files
homeagent-sdk/tools/hmapdev/sdkmodule_test.go
JianFeeeee e0ee0c43bb fix(hmapdev): SDK 模块识别要认新旧两个 module 名(迁移漏改的逻辑判定)
上一提交(b6a6168)只替换了 import 路径,**漏了用旧 module 名做逻辑判定
的五处**。CI 当场抓到一处(`TestPrintVersionReportsInjectedVersion`),
但那是测试断言;另外三处是**产品逻辑**,CI 抓不到,是静默失效。

## 漏改的地方

| 位置 | 原判定 | 失效后果 |
|---|---|---|
| `cmd_build.go` | `Contains(mod,"homeagent-sdk")` | 认不出 SDK 依赖 ⇒ **不写 replace** |
| `cmd_skill.go` | `Contains(gm,"homeagent-sdk")` | 认不出 SDK 仓 ⇒ 不安装 skills |
| `yaegi/interp.go` ×2 | `Contains(line,"homeagent-sdk")` | `findSDKGoPath` 找不到 SDK ⇒ 退化到兜底 |

迁移后这些 `Contains` **恒为假**(新名是 `homeagentsdk`,没有连字符)。
三者都**不报错**,只是行为悄悄变成另一条分支——比直接崩更难发现。

## 关键:不能只认新名

本机实测存量插件工作区的 go.mod **全部仍是旧名**:

```
/home/program/qq-plugin            (无 go.mod)
/home/program/vanblog-plugin       require gitcode.com/JianFeeeee/homeagent-sdk
/home/program/mcquery-plugin       require gitcode.com/JianFeeeee/homeagent-sdk
/home/program/fileproc-plugin      require gitcode.com/JianFeeeee/homeagent-sdk
/home/program/agentmail/plugins/   require gitcode.com/JianFeeeee/homeagent-sdk
```

用户已创建的项目不会因为我们改仓就自动更新。所以判定必须
**两种都接受**,而不是把旧名换成新名(那只是把 bug 从"认不出新"换成"认不出旧")。

## 改动

- `meta` 补 `SDKModule` / `LegacySDKModule` 常量(原注释引用了 `SDKModule`
  但常量并不存在——注释先于实现)
- 新增 `tools/hmapdev/sdkmodule.go`:`isSDKModule` / `sdkModulePath` /
  `containsSDKModule`
- 新增 `tools/hmapdev/yaegi/sdkmodule.go`:同语义的最小副本
  (yaegi 是独立子包,不能 import 父包)
- 三处逻辑判定改用上述助手

## 判据(可杀变异,逐个实测)

`sdkmodule_test.go` + `yaegi/sdkmodule_test.go`:覆盖新名/旧名/带版本号的
旧名/空串/核心仓(`HomeAgent`,不是 SDK)/无关模块。

这三个判定点**此前零测试覆盖**——这正是它们能静默失效的原因。

变异验证:
- 只认新名 → FAIL「旧名漏认会让存量插件静默走错分支」
- `containsSDKModule` 只认新名 → FAIL「必须认旧名」

## 验证

- SDK 根 module + hmapdev module:`go build` / `go test` 全通过
- 20 个 example `go vet` 全通过
- `go mod verify` → all modules verified
2026-10-09 07:32:00 +08:00

59 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import "testing"
// sdkModule 识别必须**同时认新旧两个 module 名**。
//
// # 为何这条判据重要(2026-10-08)
//
// SDK 仓从 gitcode 迁到 GitHub 后 module 路径变成
// `github.com/JianFeeeee/homeagentsdk`。我(AI)做迁移时只替换了 import 路径,
// **漏了用旧名做逻辑判定的地方**——`cmd_build.go` 用
// `strings.Contains(mod, "homeagent-sdk")` 判断「这是不是 SDK 依赖」,
// 迁移后恒为假。
//
// 后果是**静默**的:不写 replace、认不出 SDK 仓,没有任何报错。
// 这类失效只有实测才会暴露,而当时没有任何测试覆盖这三个判定点。
//
// 存量插件的 go.mod 里写的仍是旧名(本机实测 qq / vanblog / mcquery /
// fileproc / mail-bridge 五个工作区全是 `gitcode.com/...`),
// 所以**旧名必须继续被认**,不能简单换名字。
func TestSDKModulePathAcceptsBothNames(t *testing.T) {
cases := []struct {
mod string
want bool
}{
// 当前名
{"github.com/JianFeeeee/homeagentsdk", true},
{"github.com/JianFeeeee/homeagentsdk/sdk", true},
// 迁移前旧名(存量插件仍在用,必须继续认)
{"gitcode.com/JianFeeeee/homeagent-sdk", true},
{"gitcode.com/JianFeeeee/homeagent-sdk/sdk", true},
{"gitcode.com/JianFeeeee/homeagent-sdk v1.3.0", true},
// 不应误判
{"", false},
{"github.com/JianFeeeee/HomeAgent", false}, // 核心仓,不是 SDK
{"github.com/other/sdk", false},
{" ", false},
}
for _, c := range cases {
if got := isSDKModule(c.mod); got != c.want {
t.Errorf("isSDKModule(%q) = %v, want %v\n"+
" 旧名漏认会让存量插件静默走错分支(不写 replace / 找不到 SDK 路径)",
c.mod, got, c.want)
}
}
}
func TestContainsSDKModuleAcceptsBothNames(t *testing.T) {
if !containsSDKModule("module foo\nrequire github.com/JianFeeeee/homeagentsdk v0.0.0\n") {
t.Error("containsSDKModule 必须认当前名")
}
if !containsSDKModule("require gitcode.com/JianFeeeee/homeagent-sdk v0.0.0\n") {
t.Error("containsSDKModule 必须认旧名(存量插件 go.mod 仍是旧名)")
}
if containsSDKModule("module foo\n\ngo 1.21\n") {
t.Error("不含 SDK 依赖的 go.mod 不应被误认为 SDK 仓")
}
}