hunk.code_window:     .map(shortId => shortIdToFullId(shortId, shrinkwrap.registry))
     const newPkgs = R.props<DependencyTreeNode>(newPkgResolvedIds, pkgsToLink)
     await linkAllPkgs(newPkgs, opts)
     if (!opts.force) {
       // add subdependencies that have been updated
       // TODO: no need to relink everything. Can be relinked only what was changed
       for (const shortId of nextPkgResolvedIds) {
  
hunk.labels: keep keep keep keep replace keep keep keep keep keep
hunk.after_edit:   try {
       await linkAllPkgs(linkPkg, newPkgs, opts)
     } catch (err) {
       if (!err.message.startsWith('EXDEV: cross-device link not permitted')) throw err
       logger.warn(err.message)
       logger.info('Falling back to copying packages from store')
       await linkAllPkgs(copyPkg, newPkgs, opts)
     }
  
hunk.file_path: src/link/index.ts
hunk.type: replace
file: import path = require('path')
  import crossSpawn = require('cross-spawn')
  import loadJsonFile = require('load-json-file')
  
  const pkgRoot = path.join(__dirname, '..', '..')
  const pnpmPkg = loadJsonFile.sync(path.join(pkgRoot, 'package.json'))
  const pnpmBin = path.join(pkgRoot, pnpmPkg.bin.pnpm)
  
  export default function (...args: string[]): Promise<void>
  export default async function () {
    const args = Array.prototype.slice.call(arguments)
    await new Promise((resolve, reject) => {
      const proc = crossSpawn.spawn('node', [pnpmBin].concat(args), {stdio: 'inherit'})
  
      proc.on('error', reject)
  
      proc.on('close', (code: number) => {
        if (code > 0) return reject(new Error('Exit code ' + code))
        resolve()
      })
    })
  }
  
  export type ChildProcess = {
    status: number,
    stdout: Object,
    stderr: Object,
  }
  
  export function sync (...args: string[]): ChildProcess
  export function sync (): ChildProcess {
    const args = Array.prototype.slice.call(arguments)
    return crossSpawn.sync('node', [pnpmBin].concat(args))
  }
  