lib/epm/fs-explorer.js
function fileStatus(prev, stat, filename, dir, fn) {
  var fullname = path.join(dir, filename)

  // is a deleted file?
  /*if (!fs.existsSync(fullname)) {
    return fn && fn(null, { stats: undefined, code: -1});
  }*/

  // is a file added?
  if (prev === undefined || prev === null) {

    fn && fn(null, { stats: {mtime: stat.mtime, size: stat.size}, code: 1});

    return;
  }

  var mtimeChange = stat.mtime.valueOf() != prev.stats.mtime.valueOf();
  var sizeChange = stat.size != prev.stats.size;

  // has changes ?
  if (!mtimeChange && !sizeChange) {
    return fn && fn(null, { stats: {mtime: stat.mtime, size: stat.size}, code: 0});
  }

  // the file has change
  fn && fn(null, { stats: {mtime: stat.mtime, size: stat.size}, code: 2});

}
function fileStatus(prev, stat, filename, dir, fn) {
  var fullname = path.join(dir, filename)

  // is a deleted file?
  /*if (!fs.existsSync(fullname)) {
    return fn && fn(null, { stats: undefined, code: -1});
  }*/

  // is a file added?
  if (prev === undefined || prev === null) {

    fn && fn(null, { stats: {mtime: stat.mtime, size: stat.size}, code: 1});

    return;
  }

  var mtimeChange = stat.mtime.valueOf() != prev.stats.mtime.valueOf();
  var sizeChange = stat.size != prev.stats.size;

  // has changes ?
  if (!mtimeChange && !sizeChange) {
    return fn && fn(null, { stats: {mtime: stat.mtime, size: stat.size}, code: 0});
  }

  // the file has change
  fn && fn(null, { stats: {mtime: stat.mtime, size: stat.size}, code: 2});

}
Get the file status code

and returns async on fn:
-1: file deleted
0: file unchange
1: file added
2: file has changes

@param {Object} prev current file status
@param {String} filename
@param {String} dir file folder
@param {requestCallback} fn callbacks