fix(bootstrap-instance): generar content/_index.md (portada)

Sin la portada, zola build fallaba en toda instancia recién creada:
get_url no podía resolver @/_index.md desde section.html. Encontrado
al probar bootstrap-instance de extremo a extremo (zola build real,
no sólo validate --skip-zola) para sembrar el repo motor.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-27 00:20:19 -06:00
co-authored by Claude Sonnet 5
parent 4afb85bb9e
commit 5240cfd8c2
3 changed files with 38 additions and 4 deletions
+16 -4
View File
@@ -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,
@@ -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)
@@ -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.