From ec798013733db841fdd47b36e4606f95e879c651 Mon Sep 17 00:00:00 2001 From: bigboateng Date: Sat, 1 Aug 2026 23:15:52 +0100 Subject: [PATCH] fix(yield): prepare fresh Go scaffolds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disclosure-Reviewed: reviewed — public-safe only, private facet kept out of this commit --- labs/22-yield/yield/cmd/yskill/main_test.go | 35 +++++++++++++++++-- labs/22-yield/yield/cmd/yskill/scaffold.go | 22 +++++++++++- labs/22-yield/yield/evals/results/latest.json | 4 +-- 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/labs/22-yield/yield/cmd/yskill/main_test.go b/labs/22-yield/yield/cmd/yskill/main_test.go index 3eeb41d7..b4e84ac0 100644 --- a/labs/22-yield/yield/cmd/yskill/main_test.go +++ b/labs/22-yield/yield/cmd/yskill/main_test.go @@ -53,8 +53,17 @@ func TestParseOnePositionalKeepsFlagFirstOrder(t *testing.T) { func TestScaffoldSkillWritesLanguageSpecificEntrypoints(t *testing.T) { previousVersion := version + previousTidyGoModule := tidyGoModule version = "0.1.9" - t.Cleanup(func() { version = previousVersion }) + tidyCalls := 0 + tidyGoModule = func(string) error { + tidyCalls++ + return nil + } + t.Cleanup(func() { + version = previousVersion + tidyGoModule = previousTidyGoModule + }) tests := []struct { language string @@ -64,7 +73,7 @@ func TestScaffoldSkillWritesLanguageSpecificEntrypoints(t *testing.T) { }{ {"typescript", []string{"main.ts", "package.json", "skill.json"}, "npm exec -- yskill run .", `"@operatorstack/yield": "0.1.9"`}, {"python", []string{"main.py", "requirements.txt", "skill.json"}, "python -m yieldskill run .", "yieldskill==0.1.9"}, - {"go", []string{"main.go", "go.mod"}, "yskill run .", "github.com/operatorstack/yield v0.1.9"}, + {"go", []string{"main.go", "go.mod", "skill.json"}, "yskill run .", "github.com/operatorstack/yield v0.1.9"}, {"rust", []string{"src/main.rs", "Cargo.toml", ".cargo/config.toml", "skill.json"}, "yskill run .", `version = "=0.1.9"`}, } for _, tt := range tests { @@ -98,6 +107,28 @@ func TestScaffoldSkillWritesLanguageSpecificEntrypoints(t *testing.T) { } }) } + if tidyCalls != 1 { + t.Fatalf("go mod tidy calls = %d, want 1", tidyCalls) + } +} + +func TestGoScaffoldCanResolveItsPinnedModuleOnFirstRun(t *testing.T) { + previousVersion := version + previousTidyGoModule := tidyGoModule + version = "0.1.9" + tidyGoModule = func(string) error { return nil } + t.Cleanup(func() { + version = previousVersion + tidyGoModule = previousTidyGoModule + }) + dir := filepath.Join(t.TempDir(), "go-skill") + if err := scaffoldSkill(dir, "go", ""); err != nil { + t.Fatal(err) + } + manifest := readTestFile(t, filepath.Join(dir, "skill.json")) + if manifest != "{\"run\":[\"go\",\"run\",\"-mod=readonly\",\".\"]}\n" { + t.Fatalf("skill.json = %q", manifest) + } } func TestPythonScaffoldUsesInvokingInterpreter(t *testing.T) { diff --git a/labs/22-yield/yield/cmd/yskill/scaffold.go b/labs/22-yield/yield/cmd/yskill/scaffold.go index 58bb345a..290342bd 100644 --- a/labs/22-yield/yield/cmd/yskill/scaffold.go +++ b/labs/22-yield/yield/cmd/yskill/scaffold.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os" + "os/exec" "path/filepath" "regexp" "sort" @@ -11,6 +12,16 @@ import ( var releaseVersionPattern = regexp.MustCompile(`^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$`) var unsafePackageCharacter = regexp.MustCompile(`[^a-z0-9_-]+`) +var tidyGoModule = func(dir string) error { + cmd := exec.Command("go", "mod", "tidy") + cmd.Dir = dir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return fmt.Errorf("prepare Go scaffold dependencies: %w", err) + } + return nil +} func defaultLanguage() string { if language := strings.TrimSpace(os.Getenv("YIELD_LANGUAGE")); language != "" { @@ -69,6 +80,11 @@ func scaffoldSkill(dir, language, sdkPath string) error { return err } } + if language == "go" { + if err := tidyGoModule(dir); err != nil { + return err + } + } fmt.Printf("init: %s skill %q scaffolded in %s\n", language, name, dir) return nil } @@ -109,7 +125,11 @@ func scaffoldFiles(name, language, sdkPath string) map[string]string { if sdkPath != "" { gomod += fmt.Sprintf("\nreplace github.com/operatorstack/yield => %s\n", sdkPath) } - return map[string]string{"main.go": mainGo, "go.mod": gomod} + return map[string]string{ + "main.go": mainGo, + "go.mod": gomod, + "skill.json": "{\"run\":[\"go\",\"run\",\"-mod=readonly\",\".\"]}\n", + } } } diff --git a/labs/22-yield/yield/evals/results/latest.json b/labs/22-yield/yield/evals/results/latest.json index a4948a9c..1fcd04c8 100644 --- a/labs/22-yield/yield/evals/results/latest.json +++ b/labs/22-yield/yield/evals/results/latest.json @@ -1,8 +1,8 @@ { "schema_version": 2, "methodology_version": "1.0", - "generated_at": "2026-08-01T21:57:38.190Z", - "source_digest": "8fba9d25376a73e2a2230d8d10cfe8364a9b2db73e61b6974fa39928956ea9ef", + "generated_at": "2026-08-01T22:15:26.319Z", + "source_digest": "18c4620bc76291a4e8580b488f746cfb0085bf06629cf73ac38c5dbbec4bf099", "status": "passed", "workflow_conformance": { "passed": 40,