         project-map (leiningen.core.project/init-project
                       (read-project-clj path))]
     (case cmd
+      "build" (build-project-task path project-map)
+      "clean" (clean-project-task path project-map)
+      "repl" (run-repl-project-task path project-map)
       "run" (run-project-task path project-map)
-      "repl" (run-repl-project-task path project-map)
-      "build" (build-project-task path project-map)
+      "test" (test-project-task path project-map)
       nil))
   (System/exit 0))

  [process thread in out path]
  (stop-process process)
  (stop-thread thread)
  (->> (let [project-map (read-project-clj path)]
         (println (utils/get-string :testing))
         (leiningen.test/test project-map)
         (when (:cljsbuild project-map)
           (leiningen.cljsbuild/cljsbuild project-map "test")))
       (start-thread thread in out)))

(defn clean-project
  [process thread in out path]
  (stop-process process)
  (stop-thread thread)
  (->> (let [project-map (read-project-clj path)]
         (println (utils/get-string :cleaning))
         (leiningen.clean/clean project-map)
         (when (:cljsbuild project-map)
           (leiningen.cljsbuild/cljsbuild project-map "clean")))
       (start-thread thread in out)))

(defn new-project

    (leiningen.droid/droid project-map "release")
    (leiningen.uberjar/uberjar project-map)))

(defn test-project-task
  [path project-map]
  (leiningen.test/test project-map))

(defn clean-project-task
  [path project-map]
  (leiningen.clean/clean project-map))

; high-level commands

(defn run-project
