// ingestion/internal/wiki/index.go package wiki import ( "fmt" "os" "path/filepath" "strings" ) // RebuildIndex writes brain/wiki/index.md from the current wiki contents. func RebuildIndex(brainDir, date string) error { inv, err := LoadInventory(brainDir) if err != nil { return fmt.Errorf("load inventory: %w", err) } total := len(inv[PageTypeConcept]) + len(inv[PageTypeEntity]) + len(inv[PageTypeSource]) var sb strings.Builder fmt.Fprintf(&sb, "# Wiki Index\n\n") fmt.Fprintf(&sb, "_Updated: %s — %d pages (%d concepts, %d entities, %d sources)_\n\n", date, total, len(inv[PageTypeConcept]), len(inv[PageTypeEntity]), len(inv[PageTypeSource])) for _, pt := range []PageType{PageTypeConcept, PageTypeEntity, PageTypeSource} { entries := inv[pt] if len(entries) == 0 { continue } label := strings.ToUpper(string(pt)[:1]) + string(pt)[1:] fmt.Fprintf(&sb, "## %s\n\n", label) for _, e := range entries { summary := pageFirstSentence(brainDir, e) if summary != "" { fmt.Fprintf(&sb, "- [[%s|%s]] — %s\n", e.Slug, e.Title, summary) } else { fmt.Fprintf(&sb, "- [[%s|%s]]\n", e.Slug, e.Title) } } sb.WriteString("\n") } dest := filepath.Join(brainDir, "wiki", "index.md") return os.WriteFile(dest, []byte(sb.String()), 0o644) } func pageFirstSentence(brainDir string, e Entry) string { path := filepath.Join(brainDir, "wiki", string(e.Type), e.Slug+".md") content, err := os.ReadFile(path) if err != nil { return "" } parts := strings.SplitN(string(content), "---", 3) body := string(content) if len(parts) == 3 { body = parts[2] } for _, line := range strings.Split(body, "\n") { line = strings.TrimSpace(line) if line == "" || strings.HasPrefix(line, "#") { continue } if len(line) > 100 { return line[:100] + "…" } return line } return "" }