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/init.go b/core/installer/tasks/init.go
index f898a1f..e6dd47e 100644
--- a/core/installer/tasks/init.go
+++ b/core/installer/tasks/init.go
@@ -11,10 +11,23 @@
 
 func SetupConfigRepoTask(env Env, st *state) Task {
 	return newSequentialParentTask(
-		"Configuration repository",
-		NewCreateConfigRepoTask(env, st),
-		CreateGitClientTask(env, st),
+		"Configure Git repository for new environment",
+		true,
+		newSequentialParentTask(
+			"Start up Git server",
+			false,
+			NewCreateConfigRepoTask(env, st),
+			CreateGitClientTask(env, st),
+		),
 		NewInitConfigRepoTask(env, st),
+		NewActivateEnvTask(env, st),
+		newSequentialParentTask(
+			"Create initial commit",
+			false,
+			CreateRepoClient(env, st),
+			CommitEnvironmentConfiguration(env, st),
+			ConfigureFirstAccount(env, st),
+		),
 	)
 }
 
@@ -85,7 +98,7 @@
 }
 
 func NewInitConfigRepoTask(env Env, st *state) Task {
-	t := newLeafTask("Create Git repository for environment configuration", func() error {
+	t := newLeafTask("Configure access control lists", func() error {
 		st.fluxUserName = fmt.Sprintf("flux-%s", env.Name)
 		keys, err := installer.NewSSHKeyPair(st.fluxUserName)
 		if err != nil {
@@ -100,7 +113,23 @@
 			return err
 		}
 		repoIO := installer.NewRepoIO(repo, st.ssClient.Signer)
-		if err := repoIO.WriteCommitAndPush("README.md", fmt.Sprintf("# %s PCloud environment", env.Name), "readme"); err != nil {
+		if err := func() error {
+			w, err := repoIO.Writer("README.md")
+			if err != nil {
+				return err
+			}
+			defer w.Close()
+			if _, err := fmt.Fprintf(w, "# %s PCloud environment", env.Name); err != nil {
+				return err
+			}
+			return nil
+		}(); err != nil {
+			return err
+		}
+		if err := repoIO.WriteKustomization("kustomization.yaml", installer.NewKustomization()); err != nil {
+			return err
+		}
+		if err := repoIO.CommitAndPush("init"); err != nil {
 			return err
 		}
 		if err := st.ssClient.AddUser(st.fluxUserName, keys.AuthorizedKey()); err != nil {