  * MODを適応します
  * @param {"add"|"delete"} type 適応するか解除するか
  * @param {string} mod "{repo: {type: repoType, name: repo}, name: name}"
- * @param {Function} callback 適応完了時に実行
+ * @param {Function} progress 進捗報告
  * @return {Promise}
  ###
-applyMod = (type, mod, callback) ->
+applyMod = (type, mod, progress) ->
   pathType = config.get("blitzPathType")
   if pathType is "folder"
     outputFolder = path.normalize(config.get("blitzPath"))
   else
     outputFolder = TEMP_FOLDER
+
+  log = (phase) ->
+    return progress(phase, type, mod)
+
   try
     pathList = new Set()
     await fs.ensureDir(outputFolder)

      when "add" then folder = "install"
      when "delete" then folder = "remove"
      else throw new Error("Unknown type")

    log = (phase) ->
      return callback(phase, type, mod)

    if mod.repo.type is "remote"
      stream = _getFromRemote(folder, mod, log)

    )

    if pathType is "file"
      log("tempdone")
      log("zipcompress")
      blitzPath = path.normalize(config.get("blitzPath"))
      switch config.get("platform")
        when "a" then prefix = "assets"
