anchor.diff:            bool autoUpdateHostedVersions: false}) async {
       final graph = await _loadGraph(rootDirectory);
   
  -//    final executor = await _load(rootDirectory);
  +    final lifecycle = graph
  +        .multiProjectCommands(projectFilter: projectNameFilter(projects))
  +        .lifecycle;
  +
       // TODO: would be nice to leverage grinder here (command dependencies)
       // somehow
  +
       if (!skipPreRelease) {
  -      await graph.lifecycle.preRelease(
  +      await lifecycle.preRelease(
             type: type, autoUpdateHostedVersions: autoUpdateHostedVersions);
       }
   
       if (!preReleaseOnly) {
  -      await graph.lifecycle.release(
  +      await lifecycle.release(
             type: type, autoUpdateHostedVersions: autoUpdateHostedVersions);
       } else {
         print('-------');
  
positive.code:       @u.Option(help: 'A project name filter. Only projects whose name contains the text will run', abbr: 'p')
            String projects}) async {
      final graph = await _loadGraph(rootDirectory);
      return graph.lifecycle.startNewFeature(featureName);
  //    await executor.execute(lifecycle.startNewFeature(featureName),
  //        filter: projectNameFilter(projects));
    }
  
    @u.SubCommand(help: 'Completes feature and returns to development branch')
  
negative.code:       @u.Option(help: 'A project name filter. Only projects whose name contains the text will run', abbr: 'p')
            String projects}) async {
      final graph = await _loadGraph(rootDirectory);
      return graph
          .multiProjectCommands(projectFilter: projectNameFilter(projects))
          .lifecycle
          .completeFeature();
    }
  
    @u.SubCommand(help: 'Create a release of all the projects')
  