env-manager: ui polish (#127)

* env-manager: migrate to pico 2.0.6

* env: option to hide children from ui

* introduce template hierarchy

* style: improve menu styling

* env: reorganize tasks, pull before install

---------

Co-authored-by: Giorgi Lekveishvili <lekva@gl-mbp-m1-max.local>
diff --git a/core/installer/tasks/dns.go b/core/installer/tasks/dns.go
index 0880782..25af486 100644
--- a/core/installer/tasks/dns.go
+++ b/core/installer/tasks/dns.go
@@ -16,7 +16,8 @@
 
 func SetupZoneTask(env Env, ingressIP net.IP, st *state) Task {
 	return newSequentialParentTask(
-		fmt.Sprintf("Setup DNS zone records for %s", env.Domain),
+		"Configure DNS",
+		true,
 		CreateZoneRecords(env.Domain, st.publicIPs, ingressIP, env, st),
 		WaitToPropagate(env.Domain, st.publicIPs),
 	)
@@ -29,7 +30,7 @@
 	env Env,
 	st *state,
 ) Task {
-	t := newLeafTask("Configure DNS", func() error {
+	t := newLeafTask("Generate and publish DNS records", func() error {
 		repo, err := st.ssClient.GetRepo("config")
 		if err != nil {
 			return err
@@ -90,12 +91,17 @@
 			}); err != nil {
 				return err
 			}
-			rootKust := installer.NewKustomization()
-			rootKust.AddResources("dns-zone.yaml")
-			if err := r.WriteKustomization("kustomization.yaml", rootKust); err != nil {
+			rootKust, err := r.ReadKustomization("kustomization.yaml")
+			if err != nil {
 				return err
 			}
-			r.CommitAndPush("configure dns zone")
+			rootKust.AddResources("dns-zone.yaml")
+			if err := r.WriteKustomization("kustomization.yaml", *rootKust); err != nil {
+				return err
+			}
+			if err := r.CommitAndPush("configure dns zone"); err != nil {
+				return err
+			}
 		}
 		return nil
 	})
@@ -106,7 +112,7 @@
 	name string,
 	expected []net.IP,
 ) Task {
-	t := newLeafTask("Propagate DNS records", func() error {
+	t := newLeafTask("Wait to propagate", func() error {
 		ctx := context.TODO()
 		gotExpectedIPs := func(actual []net.IP) bool {
 			for _, a := range actual {