Skip to content
Project type detection library for Node.JS using declarative heuristic predicates
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


Gumshoe picture

Project type detection library using declarative heuristic predicates.

Say you have a Git repo on disk, and you want to figure out what kind of language it is written in, what framework it uses, etc. With simple heuristics such as looking for a package.json file in the project root, this can be easily deduced.

Gumshoe makes it easy to specify these heuristics declaritively using predicates:

// Detect a node.js project
var rules = [
    {filename:"package.json", exists:true, language:"node.js"}

More complicated example:

// Detect a node.js project using connect, express or null frameworks
var rules = [
    {filename:"package.json", grep:/express/i, language:"node.js", framework:"express"},
    {filename:"package.json", grep:/connect/i, language:"node.js", framework:"connect"},
    {filename:"package.json", exists:true, language:"node.js", framework:null}

Rule Structure

As shown above, rules are merely objects with some properties. Gumshoe provides a set of special, reserved property names which are evaluated as predicates:

  • filename: This is the filename relative to the baseDir to look for. Each rule must have a filename property or Gumshoe will complain. Value may be a glob as supported by the node-glob library.
  • grep: filename must exist and content must match the regular expression provided as value to grep
  • exists: Boolean value. true means filename must exist, false means filename must not exist. This does not care what kind of file it is.
  • jsonKeyExists: String value. This is the name of a key in the JSON data which must exist in filename. Nested keys can be specified using dot notation. For example, "" would match {"foo":{"bar":1}}.

When a rule succeeds and is matched, it is copied with all properties except for the reserved properties. Hence you are free to use any key names you wish like framework, language or foobar - they will be handed back to you in the result object.


Gumshoe is available in NPM. npm install gumshoe


  var gumshoe = require('gumshoe')

  // Use current working dir
  var baseDir = process.cwd()
  // Detect a node.js project
  var rules = [
      {filename:"package.json", exists:true, language:"node.js"}
  ], rules, function(err, res) {
    if (err) {
        console.log("Detection error: %s", err)
    console.log("Detected language: %s", res.language)


Gumshoe comes with tests. To run, simply execute npm test.


Gumshoe is released under a BSD license.


Picture of Legoman gumshoe CC-BY David Anderson from

You can’t perform that action at this time.