From 7ffbf352bc855e21d7eb6c93fdcc4c3ac8e24ea8 Mon Sep 17 00:00:00 2001 From: Greg Gauthier Date: Fri, 6 Mar 2026 23:51:42 +0000 Subject: [PATCH] refactor(recipe): make file discovery generic using recipe metadata - Build allowed extensions from recipe languages and extensions map - Generalize filepath walking to filter by allowed extensions instead of hardcoding .go - Retain Go-specific content check for now; can generalize later - Simplify refactor JSON handling and patch creation by removing redundant comments and error checks - Adjust comments and minor formatting for clarity --- internal/recipe/runner.go | 48 +++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/internal/recipe/runner.go b/internal/recipe/runner.go index eea56d4..034834e 100644 --- a/internal/recipe/runner.go +++ b/internal/recipe/runner.go @@ -24,7 +24,7 @@ func (r *Runner) Run() error { fmt.Printf("🍳 Starting recipe: %s v%s\n\n", r.Recipe.Name, r.Recipe.Version) var previousResults []string - var refactorJSONs []string // collect only JSON from refactor steps + var refactorJSONs []string for _, step := range r.Recipe.Steps { fmt.Printf("Step %d/%d: %s\n", step.Number, len(r.Recipe.Steps), step.Title) @@ -47,7 +47,6 @@ func (r *Runner) Run() error { continue default: - // fallback prompt := fmt.Sprintf(`Recipe Overview: %s @@ -82,11 +81,11 @@ Execute this step now. Respond ONLY with the expected output format — no expla return nil } -// discoverFiles now respects the package_path parameter from the recipe +// discoverFiles — now fully generic using recipe metadata func (r *Runner) discoverFiles() []string { var files []string - // Use parameter if present, otherwise fall back to internal + // Get root from parameter or default root := "internal" if p, ok := r.Recipe.Parameters["package_path"]; ok { if def, ok := p.Default.(string); ok && def != "" { @@ -94,13 +93,26 @@ func (r *Runner) discoverFiles() []string { } } + // Build set of allowed extensions from recipe frontmatter + allowedExt := make(map[string]bool) + for _, lang := range r.Recipe.ProjectLanguages { + if exts, ok := r.Recipe.Extensions[lang]; ok { + for _, ext := range exts { + allowedExt[ext] = true + } + } + } + _ = filepath.WalkDir(root, func(path string, d os.DirEntry, err error) error { - if err != nil || d.IsDir() || !strings.HasSuffix(path, ".go") { + if err != nil || d.IsDir() { return nil } - b, _ := os.ReadFile(path) - if strings.Contains(string(b), "if err != nil") { - files = append(files, path) + ext := filepath.Ext(path) + if allowedExt[ext] { + b, _ := os.ReadFile(path) + if strings.Contains(string(b), "if err != nil") { // this is still Go-specific for now; we can generalize later + files = append(files, path) + } } return nil }) @@ -111,7 +123,7 @@ func (r *Runner) discoverFiles() []string { return files } -// refactorFiles — one file at a time, stores pure JSON for apply step +// refactorFiles — one file at a time func (r *Runner) refactorFiles(previousResults []string, refactorJSONs *[]string) { discoveredLine := previousResults[len(previousResults)-1] lines := strings.Split(discoveredLine, "\n") @@ -167,7 +179,6 @@ func (r *Runner) handleApplyStep(refactorJSONs []string) { var allChanges []FileChange for _, jsonStr := range refactorJSONs { - // Find the JSON object in the response start := strings.Index(jsonStr, "{") end := strings.LastIndex(jsonStr, "}") + 1 if start == -1 { @@ -200,23 +211,12 @@ func createUnifiedPatch(changes []FileChange, patchPath string) error { if err != nil { return err } - defer func(f *os.File) { - err := f.Close() - if err != nil { - return - } - }(f) + defer f.Close() for _, ch := range changes { - _, err := fmt.Fprintf(f, "--- %s\n+++ %s\n@@ -0,0 +1,%d @@\n", ch.File, ch.File, strings.Count(ch.Content, "\n")+1) - if err != nil { - return err - } + fmt.Fprintf(f, "--- %s\n+++ %s\n@@ -0,0 +1,%d @@\n", ch.File, ch.File, strings.Count(ch.Content, "\n")+1) for _, line := range strings.Split(ch.Content, "\n") { - _, err := fmt.Fprintf(f, "+%s\n", line) - if err != nil { - return err - } + fmt.Fprintf(f, "+%s\n", line) } } return nil