docs: function lookupArgs (args, cb) {
    if (!args.length) return readInstalled([], function (er, inst) {
      if (er) return cb(er)
      var a = []
      asyncMap(Object.keys(inst), function (p, cb) {
        cb(null, Object.keys(inst[p]).map(function (v) {
          var o = {}
          o[p] = {}
          o[p][v] = inst[p][v]
          if (o[p][v].active) o[p].active = v
          return o
        }))
      }, cb)
    })
    var req = {}
    args.forEach(function (a) {
      a = a.split("@")
      var n = a.shift()
        , v = a.join("@")
      ;(req[n] = req[n] || []).push(v)
    })
    log.silly(req, "rebuild request")
    readInstalled(Object.keys(req), function (er, inst) {
      asyncMap(Object.keys(inst), function (p, cb) {
        if (!req.hasOwnProperty(p)) return cb()
        var matches = []
        Object.keys(inst[p]).forEach(function (v) {
          req[p].forEach(function (r) {
            var o = {}
            o[p] = {}
            if (inst[p][v].active) o[p].active = v
            if (semver.satisfies(v, r)) o[p][v] = inst[p][v]
            matches.push(o)
          })
        })
        log.verbose(p, "rebuild")
        cb(null, matches)
      }, cb)
    })
  }