          for output_path in cmd.get("outputs", []):
              url = storage.pull(output_path, command_hash=cmd_hash)
              yield url, output_path
  
          out_locs = [project_dir / out for out in cmd.get("outputs", [])]
          if all(loc.exists() for loc in out_locs):
              update_lockfile(project_dir, cmd)
 
</s> remove     for cmd in config.get("commands", []):
        deps = [project_dir / dep for dep in cmd.get("deps", [])]
        if any(not dep.exists() for dep in deps):
            continue
        cmd_hash = get_command_hash("", "", deps, cmd["script"])
        for output_path in cmd.get("outputs", []):
            url = storage.pull(output_path, command_hash=cmd_hash)
            yield url, output_path
 </s> add     commands = list(config.get("commands", []))
    # We use a while loop here because we don't know how the commands
    # will be ordered. A command might need dependencies from one that's later
    # in the list.
    while commands:
        for i, cmd in enumerate(list(commands)):
            deps = [project_dir / dep for dep in cmd.get("deps", [])]
            if all(dep.exists() for dep in deps):
                cmd_hash = get_command_hash("", "", deps, cmd["script"])
                for output_path in cmd.get("outputs", []):
                    url = storage.pull(output_path, command_hash=cmd_hash)
                    yield url, output_path
                out_locs = [project_dir / out for out in cmd.get("outputs", [])]
                if all(loc.exists() for loc in out_locs):
                    update_lockfile(project_dir, cmd)
                # We remove the command from the list here, and break, so that
                # we iterate over the loop again.
                commands.remove(i)
                break
        else:
            # If we didn't break the for loop, break the while loop.
            break
          for output_path in cmd.get("outputs", []):
              url = storage.pull(output_path, command_hash=cmd_hash)
              yield url, output_path
  
                out_locs = [project_dir / out for out in cmd.get("outputs", [])]
                if all(loc.exists() for loc in out_locs):
                    update_lockfile(project_dir, cmd)
                # We remove the command from the list here, and break, so that
                # we iterate over the loop again.
                commands.remove(i)
                break
        else:
            # If we didn't break the for loop, break the while loop.
            break
                out_locs = [project_dir / out for out in cmd.get("outputs", [])]
                if all(loc.exists() for loc in out_locs):
                    update_lockfile(project_dir, cmd)
                # We remove the command from the list here, and break, so that
                # we iterate over the loop again.
                commands.remove(i)
                break
        else:
            # If we didn't break the for loop, break the while loop.
            break
                out_locs = [project_dir / out for out in cmd.get("outputs", [])]
                if all(loc.exists() for loc in out_locs):
                    update_lockfile(project_dir, cmd)
                # We remove the command from the list here, and break, so that
                # we iterate over the loop again.
                commands.remove(i)
                break
        else:
            # If we didn't break the for loop, break the while loop.
            break
keep keep keep keep replace replace replace
 Make project pull order insensitive (#6131) 
spacy/cli/project/pull.py