ajhahn.de
← eeco
Go 46 lines
package projecttype

// prompt.go builds the Layer 4 AI detection prompt. The prompt text itself is
// the canonical `get-project-type` entry in the prompt library
// (internal/prompts); this file only maps the catalog + tree + description into
// the library's render input so there is a single reviewable source of truth
// for the instruction string (auditable via `eeco show prompt get-project-type`).

import (
	"strings"

	"github.com/ajhahnde/eeco/internal/prompts"
)

// buildDetectPrompt renders the full Layer 4 prompt: instructions + the
// canonical-layouts catalog + the tree listing + optional operator free-text.
// It is deterministic for a given (catalog, tree, description) triple so the
// prompt_test.go golden stays stable.
func buildDetectPrompt(cat *Catalog, tree []string, description string) (string, error) {
	data := prompts.GetProjectTypeData{
		Categories:  toPromptCategories(cat),
		Tree:        tree,
		Description: strings.TrimSpace(description),
	}
	return prompts.Render(prompts.GetProjectType, data)
}

// toPromptCategories maps the embedded catalog into the prompt library's
// render input shape (decoupled so the prompts package takes no projecttype
// dependency). Categories are walked in the catalog's sorted order so the
// rendered prompt is deterministic.
func toPromptCategories(cat *Catalog) []prompts.Category {
	cats := cat.Categories()
	out := make([]prompts.Category, 0, len(cats))
	for _, c := range cats {
		e, _ := cat.Get(c)
		out = append(out, prompts.Category{
			Category:    string(e.Category),
			Description: e.Description,
			PickWhen:    e.PickWhen,
			Dirs:        e.Dirs,
		})
	}
	return out
}