start = async () => {
  await fse.emptyDir('./dist/data/')
  const hash = version

  console.log('move data files...')
  await fse.copy(DATA_PATH, './dist/data/')

  await buildStory(DATA_PATH)

  console.log('move install.html...')
  await fse.copy('./script/install.html', './dist/install.html')

  await fse.copy('./script/install.alook', './dist/install.alook')

  console.log('move etc...')
  for (let fileName of etcFiles) {
    await fse.move(`./dist/data/etc/${fileName}.csv`, `./dist/data/${fileName}.csv`, { overwrite: true })
  }

  console.log('file md5...')
  const hashes = await md5File()
  await fse.writeJSON('./dist/manifest.json', {
    hash, version, hashes, moduleId,
    cyweb_token, trans_api, language,
    date: getDate(8)
  })

  if (process.env.PUBLISH === 'skip') {
    console.log('data prepared')
    return
  }
  if (process.env.CUSTOM_DOMAIN) {
    await fse.outputFile('./dist/CNAME', 'www.shiny.fun')
  }
  if (process.env.GITHUB_ACTION) {
    return
  }
}
/*,font/*,etc/*,*}.{csv,json,woff2,png,jpg}', {
      nodir: true, cwd: path.resolve(process.cwd(), cwd)
    })
    const prms = files.map(file => {
      return md5(path.resolve(process.cwd(), cwd, file)).then(hash => {
        data[file] = hash.slice(0, 7)
      })
    })
    await Promise.all(prms)
  }

  await doMd5File('./dist/data/')
  await doMd5File('./dist/')

  return data
}

const buildStory = async (DATA_PATH) => {
  console.log('story...')
  await fse.emptyDir('./dist/data/story/')
  const files = await glob.promise(`${DATA_PATH}story/*