---
name: opentofu-initialisieren
description: Initialisiert in einem neuen oder bestehenden Projekt eine schlanke, testbare OpenTofu-/Terraform-/k3d-Grundstruktur mit Frontend-Modul, Projekt-README und geteilten Taskfiles. Verwenden bei einem ausdrücklichen Aufruf mit $opentofu-initialisieren, einer eindeutigen Bitte um ein solches Gerüst oder als Standardprofil von projekt-initialisieren für ein neues Codeprojekt; nicht für allgemeine OpenTofu-, Terraform- oder Kubernetes-Beratung.
---

# OpenTofu initialisieren

Erzeuge einen kleinen technischen Vertical Slice, der später lokal auf k3d
angewendet und über HTTP geprüft werden kann. Starte keinen allgemeinen
Projektfragekatalog und ergänze keine vorsorglichen Plattformfunktionen.

Der Skill kann eigenständig oder als technisches Standardprofil von
`projekt-initialisieren` laufen. Im zweiten Fall ist die fachliche
Projektinitialisierung bereits bestätigt; verwende den besonderen
Template-Modus, damit projektspezifische Root-Dokumentation erhalten bleibt.

## Grundlage

- [CNCF – Cloud Native Definition](https://github.com/cncf/toc/blob/main/DEFINITION.md)
  Deklarative APIs und robuste Automation erlauben es, wirkungsvolle Änderungen
  häufig, vorhersehbar und mit minimalem Aufwand auszuliefern.
- [OpenGitOps – GitOps Principles](https://opengitops.dev/)
  Der gewünschte Zustand ist deklarativ beschrieben, versioniert und
  unveränderlich abgelegt, wird automatisch übernommen und kontinuierlich mit
  dem tatsächlichen Zustand abgeglichen.
- [OpenTofu – Creating Modules](https://opentofu.org/docs/language/modules/develop/)
  Module beschreiben Infrastruktur auf der Ebene ihrer Architektur statt
  einzelner physischer Objekte. Ein gutes Modul hebt die Abstraktion, indem es
  einen neuen Begriff dieser Architektur einführt.
- [Kubernetes – Object Management](https://kubernetes.io/docs/concepts/overview/working-with-objects/object-management/)
  Ein Kubernetes-Objekt wird mit genau einer Technik verwaltet. Das Mischen
  von Techniken am selben Objekt führt zu undefiniertem Verhalten.

Die erzeugte Ordner- und Taskfile-Aufteilung ist eine DigiEstate-Konvention.
Das Root-`Taskfile.yml` enthält nur öffentliche Einstiege, Includes und kurze
gemeinsame Laufzeitwerte. Die ausführbare Logik steht direkt in den nach
Verantwortung getrennten Dateien unter `taskfiles/`. Erzeuge im Zielprojekt
erst dann ein zusätzliches Skript, wenn dieselbe Logik von mehreren Taskfiles
geteilt wird, unabhängig von Task sinnvoll ausführbar ist oder als
Taskfile-Block nicht mehr verständlich bleibt.

## Ablauf

1. Bestimme das Zielverzeichnis. Verwende ohne andere Angabe das aktuelle
   Arbeitsverzeichnis. Frage nur nach, wenn das Ziel tatsächlich mehrdeutig
   ist.
2. Leite den Projektnamen aus dem Zielverzeichnis ab. Ein ausdrücklich
   genannter Name hat Vorrang und wird als `--project-name` übergeben.
3. Wenn Python 3 fehlt, melde das fehlende Werkzeug und stoppe ohne
   Installation.
4. Führe den Generator aus dem Skill-Verzeichnis aus. Beim eigenständigen
   Aufruf gilt:

   ```text
   python3 scripts/initialize.py <zielverzeichnis>
   ```

   Optional kann `--project-name <name>` ergänzt werden. Der Generator prüft
   alle Zielpfade vor dem ersten Schreibzugriff. Bei einer Kollision nichts
   manuell überschreiben oder teilweise nachbauen, sondern die genannten
   Pfade mit dem Benutzer klären.
   Wird der Skill von `projekt-initialisieren` in einer Template-Kopie
   verwendet, rufe stattdessen auf:

   ```text
   python3 scripts/initialize.py <zielverzeichnis> --project-name <name> --template-project
   ```

   Dieser Modus verlangt eine erkennbare Template-Kopie, bewahrt eine
   vorhandene Root-`README.md` und ergänzt `.gitignore` um den vollständigen
   Schutzblock in seiner vorgesehenen Reihenfolge. Dieser Block hat Vorrang
   vor bestehenden Gegenregeln; Ausnahmen wie `.env.example` bleiben erlaubt.
   Ein unveränderter zweiter Lauf ergänzt keinen weiteren Block. Abweichende übrige Zieldateien und Symlinks bleiben Konflikte.
5. Prüfe die Ausgabe und nenne die Root-README, das Frontend-Modul sowie die
   öffentlichen Einstiege `task up`, `task verify` und `task down`.
   Cluster- und Imagename werden beim Task-Aufruf automatisch aus Projektname
   und Projektpfad abgeleitet; verlange sie nicht als tfvars-Eingaben. Prüfe,
   dass die ausführbare Logik in den zuständigen Taskfiles liegt und das
   erzeugte Gerüst keinen vorsorglichen `scripts/`-Ordner enthält.
6. Starte Cluster, Container-Build oder OpenTofu-Anwendung nur, wenn der
   Benutzer dies zusätzlich verlangt. Fehlende Werkzeuge werden gemeldet und
   nie ungefragt installiert.
7. OpenTofu ist der Standard. Wenn der Benutzer Terraform verlangt, verwende
   für den vollständigen Zyklus `IAC_COMMAND=terraform`; andere Werte sind
   nicht zulässig. Das Gerüst und seine README erklären beide Varianten.

## Grenzen

- Erzeuge keine SOPS-, OpenBao-, ESO-, Observability-, Backend- oder
  CI/CD-Konfiguration.
- Erzeuge keine echten Secrets und übernimm keine Secret-Werte in
  OpenTofu-Variablen oder State.
- Behandle einen abweichenden vorhandenen Inhalt oder einen Symlink innerhalb
  der Zielstruktur als Konflikt. Ein identischer zweiter Lauf ist erlaubt und
  ändert nichts. Nur `--template-project` darf eine reguläre `.gitignore`
  erhaltend ergänzen und eine vorhandene reguläre Root-`README.md` bewahren.
- Ein ausdrückliches «nur Struktur» oder «ohne Frontend» begrenzt den Auftrag.
  Entferne in diesem Fall nur eindeutig nicht gewünschte Teile aus dem
  geplanten Dateisatz, ohne daraus einen allgemeinen Modus oder Fragekatalog
  zu machen.
- Wenn das Ziel eine noch uninitialisierte Kopie des DigiEstate-Templates ist,
  bewahre deren `template_status`. Dieser fokussierte Skill ersetzt die spätere
  vollständige Projektinitialisierung nicht.
