feat(pipeline): write into wiki/<wing>/{sources,facts}/ when Config.Wing is set (#205 S2)
Sources -> wiki/<wing>/sources, concepts/entities -> wiki/<wing>/facts with kind: frontmatter; inventory, title resolution and back-references are confined to the target wing. Empty Wing keeps the retired layout unchanged. Mutation-checked: widening the inventory beyond the wing fails the cross-wing back-reference test; a non-plain wing name is rejected. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -23,7 +23,7 @@ func injectSourceRefs(pages []wiki.Page, inventory map[wiki.PageType][]wiki.Entr
|
||||
|
||||
var sourceContent string
|
||||
for _, p := range pages {
|
||||
if strings.HasPrefix(p.Path, "wiki/sources/") &&
|
||||
if isSourcePath(p.Path) &&
|
||||
strings.TrimSuffix(filepath.Base(p.Path), ".md") == sourceSlug {
|
||||
sourceContent = p.Content
|
||||
break
|
||||
@@ -35,7 +35,7 @@ func injectSourceRefs(pages []wiki.Page, inventory map[wiki.PageType][]wiki.Entr
|
||||
|
||||
bySlug := make(map[string]int, len(pages))
|
||||
for i, p := range pages {
|
||||
if !strings.HasPrefix(p.Path, "wiki/sources/") {
|
||||
if !isSourcePath(p.Path) {
|
||||
bySlug[strings.TrimSuffix(filepath.Base(p.Path), ".md")] = i
|
||||
}
|
||||
}
|
||||
@@ -52,12 +52,13 @@ func injectSourceRefs(pages []wiki.Page, inventory map[wiki.PageType][]wiki.Entr
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
b, err := readBrainFile(brainDir, "wiki/"+string(pt)+"/"+slug+".md")
|
||||
path := entryPath(slug, pt, inventory)
|
||||
b, err := readBrainFile(brainDir, path)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
page := wiki.Page{
|
||||
Path: "wiki/" + string(pt) + "/" + slug + ".md",
|
||||
Path: path,
|
||||
Content: string(b),
|
||||
}
|
||||
pages = append(pages, addSourceRef(page, sourceRef))
|
||||
@@ -88,7 +89,7 @@ func extractWikilinks(content string) map[string]bool {
|
||||
// findSourcePage returns the slug and title of the first wiki/sources/ page in pages.
|
||||
func findSourcePage(pages []wiki.Page) (slug, title string, found bool) {
|
||||
for _, p := range pages {
|
||||
if strings.HasPrefix(p.Path, "wiki/sources/") {
|
||||
if isSourcePath(p.Path) {
|
||||
slug = strings.TrimSuffix(filepath.Base(p.Path), ".md")
|
||||
title = extractTitle(p.Content)
|
||||
if title == "" {
|
||||
@@ -111,3 +112,27 @@ func findInInventory(slug string, inventory map[wiki.PageType][]wiki.Entry) (wik
|
||||
}
|
||||
return "", false
|
||||
}
|
||||
|
||||
// isSourcePath reports whether path is a source page in either layout:
|
||||
// wiki/sources/<slug>.md or wiki/<wing>/sources/<slug>.md.
|
||||
func isSourcePath(path string) bool {
|
||||
parts := strings.Split(filepath.ToSlash(path), "/")
|
||||
switch {
|
||||
case len(parts) == 3 && parts[0] == "wiki" && parts[1] == "sources":
|
||||
return true
|
||||
case len(parts) == 4 && parts[0] == "wiki" && parts[2] == "sources":
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// entryPath is the brain-relative path of an inventory page: the recorded Path
|
||||
// for a wing-layout entry, else the retired wiki/<type>/<slug>.md.
|
||||
func entryPath(slug string, pt wiki.PageType, inventory map[wiki.PageType][]wiki.Entry) string {
|
||||
for _, e := range inventory[pt] {
|
||||
if e.Slug == slug && e.Path != "" {
|
||||
return e.Path
|
||||
}
|
||||
}
|
||||
return "wiki/" + string(pt) + "/" + slug + ".md"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user