Files
homeagent-sdk/tools/hmapdev/sdkmodule.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

62 lines
2.1 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 "strings"
// sdkModulePath 报告 mod 是否为 HomeAgent SDK 的 module path,
// 是则返回规范化的模块名。
//
// # 为何要同时认两个名字(2026-10-08)
//
// SDK 仓已从 gitcode 迁到 GitHub,module 路径随之变成
// `github.com/JianFeeeee/homeagentsdk`。但**存量插件的 go.mod 里写的仍是旧路径**
// `gitcode.com/JianFeeeee/homeagent-sdk` —— 本机实测 qq / vanblog / mcquery /
// fileproc / homeagent-mail-bridge 五个插件工作区全部如此(用户已创建的项目
// 不可能因为我们改了仓就自动更新)。
//
// 所以任何「识别 SDK 模块」的判定都必须**两种都接受**:
// 只认新名 ⇒ 旧插件被当成「这不是 SDK 依赖」⇒ 静默走错分支
// (不写 replace、认不出 SDK 仓、yaegi 找不到 SDK 源码路径)。
//
// 这类失效**不报错**,正是最危险的一种:迁移代码路径改完了,
// 逻辑判定漏改,功能悄悄坏掉而测试仍然绿。
//
// 为何用 Contains 而不是 ==:module 行可能带版本号后缀
// (`gitcode.com/.../v1.3.0`)或是 require 块内的裸写法。
func sdkModulePath(mod string) (string, bool) {
mod = strings.TrimSpace(mod)
if mod == "" {
return "", false
}
for _, name := range []string{
"github.com/JianFeeeee/homeagentsdk",
"gitcode.com/JianFeeeee/homeagent-sdk",
} {
if strings.Contains(mod, name) {
return name, true
}
}
return "", false
}
// isSDKModule 是 sdkModulePath 的布尔形式(调用方不关心规范名时用)。
func isSDKModule(mod string) bool {
_, ok := sdkModulePath(mod)
return ok
}
// containsSDKModule 报告一段文本(如 go.mod 全文)里是否出现 SDK module 名。
//
// 与 isSDKModule 分开:那个判「单个 module path 是不是 SDK」,
// 这个判「整份文件里有没有引用 SDK」——用途不同,别合并。
func containsSDKModule(text string) bool {
for _, name := range []string{
"github.com/JianFeeeee/homeagentsdk",
"gitcode.com/JianFeeeee/homeagent-sdk",
} {
if strings.Contains(text, name) {
return true
}
}
return false
}