     [path]
     (string/replace-first (norm-path path) (str root "/") "")))
 
+(defn get-ns-from-source-file-path
+  "Takes a project relative file path and returns an underscored clojure namespace.
+  .ie a file that starts with (ns example.path-finder) -> example.path_finder"
+  [file-path]
+  (try
+    (when (.exists (as-file file-path))
+      (with-open [rdr (io/reader file-path)]
+        (let [forms (ana/forms-seq* rdr file-path)]
+          (second (first forms)))))
+    (catch java.lang.RuntimeException e
+      nil)))
+
 (defn file-changed?
   "Standard md5 check to see if a file actually changed."
   [{:keys [file-md5-atom]} filepath]  

  "Formats a namespace into a map that is ready to be sent to the client."
  [st nm]
  (let [n (-> nm name underscore)] ;; TODO I don't think this is needed
    { :file (str (cbapi/cljs-target-file-from-ns "" nm))
      :namespace (cljs.compiler/munge n)
      :type :namespace}))


   [digest]
   [clj-stacktrace.core :refer [parse-exception]]
   [clj-stacktrace.repl :refer [pst-on]]
   [clojure.pprint :as p]))

;; get rid of fs dependancy
