fix(skill): always refresh bundled skills

This commit is contained in:
玉澜
2026-08-11 18:13:44 +08:00
parent c38e988b14
commit e0fd344a26
13 changed files with 143 additions and 311 deletions
+72 -4
View File
@@ -1073,10 +1073,16 @@ func TestInstallScriptBackupFailureKeepsOriginalDir(t *testing.T) {
t.Fatalf("mono run must keep the original dws/ untouched on backup failure (data=%q, err=%v)\noutput:\n%s", string(data), err, out)
}
out = runInstallScript(t, fixture.scriptPath, fixture.envWithSkillMode("multi",
cmd := exec.Command("sh", fixture.scriptPath)
cmd.Env = fixture.envWithSkillMode("multi",
"DWS_INSTALL_DIR="+installDir,
"DWS_NO_SKILLS=0",
))
)
output, runErr := cmd.CombinedOutput()
if runErr == nil {
t.Fatalf("multi install unexpectedly succeeded after backup failure:\n%s", output)
}
out = string(output)
if !strings.Contains(out, "保留原目录") {
t.Fatalf("expected backup-failure warning in multi output:\n%s", out)
}
@@ -1125,8 +1131,12 @@ install_multi_skills_to_root "$DWS_TEST_MULTI" "$DWS_TEST_ROOT"
"DWS_TEST_MULTI="+multi,
"DWS_TEST_ROOT="+root,
)
if output, err := cmd.CombinedOutput(); err != nil {
t.Fatalf("install-skills harness failed: %v\n%s", err, output)
output, runErr := cmd.CombinedOutput()
if runErr == nil {
t.Fatalf("install-skills harness unexpectedly succeeded after backup failure:\n%s", output)
}
if !strings.Contains(string(output), "所有检测到的 Agent 目标均失败") {
t.Fatalf("install-skills aggregate failure missing:\n%s", output)
}
if data, err := os.ReadFile(filepath.Join(base, "dws", "SKILL.md")); err != nil || string(data) != "old mono\n" {
t.Fatalf("mono changed after backup failure (data=%q, err=%v)", string(data), err)
@@ -1246,6 +1256,64 @@ fi
}
}
func TestInstallerShellMultiCopyFailureReturnsFailure(t *testing.T) {
for _, scriptName := range []string{"install.sh", "install-skills.sh"} {
scriptName := scriptName
t.Run(scriptName, func(t *testing.T) {
t.Parallel()
scriptPath, err := filepath.Abs(filepath.Join("..", "..", "scripts", scriptName))
if err != nil {
t.Fatal(err)
}
data, err := os.ReadFile(scriptPath)
if err != nil {
t.Fatal(err)
}
cut := strings.LastIndex(string(data), "\nmain\n")
if cut < 0 {
t.Fatalf("%s final main invocation not found", scriptName)
}
library := filepath.Join(t.TempDir(), scriptName+"-lib.sh")
mustWriteFile(t, library, data[:cut], 0o755)
home := t.TempDir()
source := filepath.Join(t.TempDir(), "multi")
base := filepath.Join(home, ".agents", "skills")
mustWriteFile(t, filepath.Join(source, "dingtalk-test", "SKILL.md"), []byte("new skill\n"), 0o644)
installCall := `install_multi_skills_to_homes "$DWS_TEST_SOURCE"`
if scriptName == "install-skills.sh" {
installCall = `install_multi_skills_to_root "$DWS_TEST_SOURCE" "$HOME"`
}
harness := `. "$DWS_TEST_LIBRARY"
cp() { return 1; }
if ` + installCall + `; then
exit 2
fi
`
cmd := exec.Command("sh", "-c", harness)
cmd.Env = append(os.Environ(),
"HOME="+home,
"DWS_TEST_LIBRARY="+library,
"DWS_TEST_SOURCE="+source,
)
output, err := cmd.CombinedOutput()
if err != nil {
t.Fatalf("%s copy-failure harness failed: %v\n%s", scriptName, err, output)
}
if strings.Contains(string(output), "✅ Skills") {
t.Fatalf("%s reported success after copy failure:\n%s", scriptName, output)
}
if !strings.Contains(string(output), "所有检测到的 Agent 目标均失败") {
t.Fatalf("%s did not report aggregate install failure:\n%s", scriptName, output)
}
if _, err := os.Stat(filepath.Join(base, "dingtalk-test", "SKILL.md")); !os.IsNotExist(err) {
t.Fatalf("%s left a completed Skill after copy failure: %v", scriptName, err)
}
})
}
}
func TestInstallPowerShellCacheCopyFailurePreservesOldCache(t *testing.T) {
pwsh, err := exec.LookPath("pwsh")
if err != nil {