     commands = []
     commands.push(@installNode)
     commands.push (callback) => @installModules(options, callback)
+    if options.argv.dev
+      commands.push (callback) => @installDevDependencies(options, callback)
+
+    async.waterfall commands, callback
+
+  isAtomPackageWithDevDependencies: (packagePath) ->
+    try
+      metadata = fs.readFileSync(path.join(packagePath, 'package.json'), 'utf8')
+      {engines, devDependencies} = JSON.parse(metadata) ? {}
+      engines?.atom? and devDependencies and Object.keys(devDependencies).length > 0
+    catch error
+      false
+
+  installDevDependencies: (options, callback) ->
+    commands = []
+    modulesDirectory = path.resolve('node_modules')
+    for child in fs.readdirSync(modulesDirectory)
+      packagePath = path.join(modulesDirectory, child)
+      continue unless @isAtomPackageWithDevDependencies(packagePath)
+      do (child, packagePath) =>
+        commands.push (callback) =>
+          options.cwd = packagePath
+          @forkInstallCommand options, (code, stderr='', stdout='') =>
+            if code is 0
+              callback()
+            else
+              callback(stdout.red + stderr.red)
 
     async.waterfall commands, callback
 

      directory.
    """
    options.alias('h', 'help').describe('help', 'Print this usage message')
    options.boolean('silent').describe('silent', 'Minimize output')

  showHelp: (argv) -> @parseOptions(argv).showHelp()

  installModules: (options, callback) =>
    process.stdout.write 'Installing modules '

    @forkInstallCommand options, (code, stderr='', stdout='') =>
      if code is 0
        process.stdout.write '\u2713\n'.green
        callback()
      else
        process.stdout.write '\u2717\n'.red
        callback(stdout.red + stderr.red)

  forkInstallCommand: (options, callback) ->
    installArgs = ['--userconfig', config.getUserConfigPath(), 'install']
    installArgs.push("--target=#{config.getNodeVersion()}")
    installArgs.push('--arch=ia32')
