diff --git a/internal/clusterlog/commands_bootstrap.go b/internal/clusterlog/commands_bootstrap.go index 18dbe0d..2c497b3 100644 --- a/internal/clusterlog/commands_bootstrap.go +++ b/internal/clusterlog/commands_bootstrap.go @@ -85,6 +85,22 @@ func (a *App) runBootstrapInstance(args []string) error { func writeScaffold(root, productName, baseURL string) ([]string, error) { created := []string{} + title := "Bitácora Operativa" + if strings.TrimSpace(productName) != "" { + title = productName + } + + homeTmpl, err := scaffoldFS.ReadFile(scaffoldRoot + "/content/_index.md.tmpl") + if err != nil { + return nil, NewError(ExitInternal, "internal", "plantilla de portada faltante", err.Error()) + } + homeContent := renderScaffoldTemplate(string(homeTmpl), map[string]string{"TITLE": title}) + homePath := filepath.Join(root, "content", "_index.md") + if err := writeFileAtomic(homePath, []byte(homeContent), 0o644); err != nil { + return nil, NewError(ExitInternal, "internal", err.Error(), homePath) + } + created = append(created, homePath) + for _, section := range scaffoldSections { src := scaffoldRoot + "/content/" + section + "/_index.md" data, err := scaffoldFS.ReadFile(src) @@ -102,10 +118,6 @@ func writeScaffold(root, productName, baseURL string) ([]string, error) { if err != nil { return nil, NewError(ExitInternal, "internal", "plantilla zola.toml faltante", err.Error()) } - title := "Bitácora Operativa" - if strings.TrimSpace(productName) != "" { - title = productName - } zolaContent := renderScaffoldTemplate(string(zolaTmpl), map[string]string{ "BASE_URL": baseURL, "TITLE": title, diff --git a/internal/clusterlog/commands_bootstrap_test.go b/internal/clusterlog/commands_bootstrap_test.go index 2b75110..0a0f589 100644 --- a/internal/clusterlog/commands_bootstrap_test.go +++ b/internal/clusterlog/commands_bootstrap_test.go @@ -30,6 +30,14 @@ func TestBootstrapInstanceCreatesExpectedFiles(t *testing.T) { } } + homeData, err := os.ReadFile(filepath.Join(out, "content", "_index.md")) + if err != nil { + t.Fatalf("falta la portada content/_index.md (necesaria para que zola build no falle): %v", err) + } + if !strings.Contains(string(homeData), `title = "Bitácora de Prueba"`) { + t.Fatalf("la portada no sustituyó TITLE: %s", homeData) + } + zolaData, err := os.ReadFile(filepath.Join(out, "zola.toml")) if err != nil { t.Fatal(err) diff --git a/internal/clusterlog/scaffold/content/_index.md.tmpl b/internal/clusterlog/scaffold/content/_index.md.tmpl new file mode 100644 index 0000000..e252dc8 --- /dev/null +++ b/internal/clusterlog/scaffold/content/_index.md.tmpl @@ -0,0 +1,14 @@ ++++ +title = "{{TITLE}}" +description = "Punto único para entender, operar y revisar los cambios técnicos del clúster." +sort_by = "date" +template = "index.html" ++++ + +La bitácora reúne conocimiento estable y actividad operativa en un mismo sitio, sin mezclar sus ciclos de vida: + +- **Documentación** explica cómo está construido el clúster. +- **Manuales** indican cómo ejecutar procedimientos repetibles. +- **Memorias** registran qué se cambió, quién lo hizo y cómo se validó. +- **Proyectos** agrupan objetivos, alcance e hitos. +- **Tareas** muestran trabajo pendiente, responsables y tiempo real.