installer: appmanager cmd
diff --git a/core/installer/cmd/app_manager.go b/core/installer/cmd/app_manager.go
new file mode 100644
index 0000000..1fc6d64
--- /dev/null
+++ b/core/installer/cmd/app_manager.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+	"os"
+
+	"github.com/giolekva/pcloud/core/installer"
+	"github.com/spf13/cobra"
+	"golang.org/x/crypto/ssh"
+)
+
+var appManagerFlags struct {
+	sshKey   string
+	repoAddr string
+}
+
+func appManagerCmd() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:  "appmanager",
+		RunE: installCmdRun,
+	}
+	cmd.Flags().StringVar(
+		&installFlags.sshKey,
+		"ssh-key",
+		"",
+		"",
+	)
+	cmd.Flags().StringVar(
+		&installFlags.repoAddr,
+		"repo-addr",
+		"",
+		"",
+	)
+	return cmd
+}
+
+func appManagerCmdRun(cmd *cobra.Command, args []string) error {
+	sshKey, err := os.ReadFile(installFlags.sshKey)
+	if err != nil {
+		return err
+	}
+	signer, err := ssh.ParsePrivateKey(sshKey)
+	if err != nil {
+		return err
+	}
+	repo, err := cloneRepo(installFlags.repoAddr, signer)
+	if err != nil {
+		return err
+	}
+	_, err = installer.NewAppManager(repo, signer)
+	if err != nil {
+		return err
+	}
+	// TODO(gio): start server
+	return nil
+}
diff --git a/core/installer/cmd/apps.go b/core/installer/cmd/apps.go
index b96ac6f..0a58be2 100644
--- a/core/installer/cmd/apps.go
+++ b/core/installer/cmd/apps.go
@@ -1,28 +1,22 @@
 package main
 
 import (
-	"fmt"
-	"io/ioutil"
 	"net"
 	"os"
-	"time"
 
 	"github.com/giolekva/pcloud/core/installer"
 	"github.com/go-git/go-billy/v5/memfs"
 	"github.com/go-git/go-git/v5"
-	"github.com/go-git/go-git/v5/plumbing/object"
 	gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
 	"github.com/go-git/go-git/v5/storage/memory"
 	"github.com/spf13/cobra"
 	"golang.org/x/crypto/ssh"
-	"sigs.k8s.io/yaml"
 )
 
 const appDirName = "apps"
 
 var installFlags struct {
 	sshKey   string
-	config   string
 	appName  string
 	repoAddr string
 }
@@ -39,12 +33,6 @@
 		"",
 	)
 	cmd.Flags().StringVar(
-		&installFlags.config,
-		"config",
-		"",
-		"",
-	)
-	cmd.Flags().StringVar(
 		&installFlags.appName,
 		"app",
 		"",
@@ -59,30 +47,7 @@
 	return cmd
 }
 
-type inMemoryAppRepository struct {
-	apps []installer.App
-}
-
-func NewInMemoryAppRepository(apps []installer.App) installer.AppRepository {
-	return &inMemoryAppRepository{
-		apps,
-	}
-}
-
-func (r inMemoryAppRepository) Find(name string) (*installer.App, error) {
-	for _, a := range r.apps {
-		if a.Name == name {
-			return &a, nil
-		}
-	}
-	return nil, fmt.Errorf("Application not found: %s", name)
-}
-
 func installCmdRun(cmd *cobra.Command, args []string) error {
-	cfg, err := readConfig(installFlags.config)
-	if err != nil {
-		return err
-	}
 	sshKey, err := os.ReadFile(installFlags.sshKey)
 	if err != nil {
 		return err
@@ -95,58 +60,19 @@
 	if err != nil {
 		return err
 	}
-	wt, err := repo.Worktree()
-	if err != nil {
-		return err
-	}
-	appRoot, err := wt.Filesystem.Chroot(appDirName)
-	if err != nil {
-		return err
-	}
 	m, err := installer.NewAppManager(
-		appRoot,
-		cfg,
-		NewInMemoryAppRepository(installer.CreateAllApps()),
+		repo,
+		signer,
 	)
 	if err != nil {
 		return err
 	}
-	if err := m.Install(installFlags.appName); err != nil {
-		return err
-	}
-	if st, err := wt.Status(); err != nil {
-		return err
-	} else {
-		fmt.Printf("%+v\n", st)
-	}
-	wt.AddGlob("*")
-	if st, err := wt.Status(); err != nil {
-		return err
-	} else {
-		fmt.Printf("%+v\n", st)
-	}
-	if _, err := wt.Commit(fmt.Sprintf("install: %s", installFlags.appName), &git.CommitOptions{
-		Author: &object.Signature{
-			Name: "pcloud-appmanager",
-			When: time.Now(),
-		},
-	}); err != nil {
-		return err
-	}
-	return repo.Push(&git.PushOptions{
-		RemoteName: "origin",
-		Auth:       auth(signer),
-	})
-}
-
-func readConfig(config string) (installer.Config, error) {
-	var cfg installer.Config
-	inp, err := ioutil.ReadFile(config)
+	appRepo := installer.NewInMemoryAppRepository(installer.CreateAllApps())
+	app, err := appRepo.Find(installFlags.appName)
 	if err != nil {
-		return cfg, err
+		return err
 	}
-	err = yaml.UnmarshalStrict(inp, &cfg)
-	return cfg, err
+	return m.Install(*app)
 }
 
 func cloneRepo(address string, signer ssh.Signer) (*git.Repository, error) {