diff --git a/shake-ext.cabal b/shake-ext.cabal
--- a/shake-ext.cabal
+++ b/shake-ext.cabal
@@ -1,5 +1,5 @@
 name:                shake-ext
-version:             0.2.0.3
+version:             0.3.0.0
 synopsis:            Helper functions for linting with shake 
 description:         This package provides several linters out of the box, as well as functionality for building ATS source files with [shake](http://shakebuild.com/).
 homepage:            https://hub.darcs.net/vmchale/shake-ext
@@ -27,7 +27,8 @@
                      , Development.Shake.ATS
   build-depends:       base >= 4.10 && < 5
                      , shake
-                     , language-ats 
+                     , language-ats
+                     , composition-prelude
   default-language:    Haskell2010
   if flag(development)
     ghc-options:       -Werror
diff --git a/src/Development/Shake/FileDetect.hs b/src/Development/Shake/FileDetect.hs
--- a/src/Development/Shake/FileDetect.hs
+++ b/src/Development/Shake/FileDetect.hs
@@ -10,7 +10,8 @@
     , getShell
     ) where
 
-import           Data.Semigroup    ((<>))
+import           Control.Composition
+import           Data.Semigroup      ((<>))
 import           Development.Shake
 
 getYml :: Action [FilePath]
@@ -19,8 +20,8 @@
 getToml :: Action [FilePath]
 getToml = getAll ["toml"]
 
-getHs :: Action [FilePath]
-getHs = getAll ["hs", "hs-boot", "hsig", "lhs"]
+getHs :: [FilePath] -> Action [FilePath]
+getHs files = join <$> mapM (`getAllDir` ["hs", "hs-boot", "hsig", "lhs"]) files
 
 getHappy :: Action [FilePath]
 getHappy = getAll ["y", "yl"]
@@ -29,13 +30,16 @@
 getAlex = getAll ["x"]
 
 getShell :: Action [FilePath]
-getShell = getDirectoryFiles "" ["//*.sh"]
+getShell = getAll ["sh"]
 
 get :: String -> Action [FilePath]
 get = getAll . pure
 
 getAll :: [String] -> Action [FilePath]
-getAll ss = getDirectoryFiles "" (("//*." ++) <$> ss)
+getAll = getAllDir ""
+
+getAllDir :: FilePath -> [String] -> Action [FilePath]
+getAllDir dir ss = getDirectoryFiles "" (((dir ++ "//*.") ++) <$> ss)
 
 getSats :: Action [FilePath]
 getSats = get "sats"
diff --git a/src/Development/Shake/Linters.hs b/src/Development/Shake/Linters.hs
--- a/src/Development/Shake/Linters.hs
+++ b/src/Development/Shake/Linters.hs
@@ -19,8 +19,8 @@
 shellcheck :: [FilePath] -> Action ()
 shellcheck = checkFiles "shellcheck"
 
-ghc :: Action ()
-ghc = checkFiles "ghc -Wall -Werror -Wincomplete-uni-patterns -Wincomplete-record-updates -fno-code" =<< getHs
+ghc :: [FilePath] -> Action ()
+ghc dirs = checkFiles "ghc -Wall -Werror -Wincomplete-uni-patterns -Wincomplete-record-updates -fno-code" =<< getHs dirs
 
 -- | Check all @.toml@ files using
 -- [tomlcheck](http://hackage.haskell.org/package/tomlcheck).
@@ -29,8 +29,8 @@
 
 -- | Lint all @.hs@, @.hsig@, and @.hs-boot@ files using
 -- [hlint](http://hackage.haskell.org/package/hlint).
-hlint :: Action ()
-hlint = checkFiles "hlint" =<< getHs
+hlint :: [FilePath] -> Action ()
+hlint dirs = checkFiles "hlint" =<< getHs dirs
 
 -- | Lint all files ending in @yaml@ or @yml@ using
 -- [yamllint](https://pypi.python.org/pypi/yamllint).
