anchor.diff:  import 'dart:async';
   import 'dart:io';
   
  +import 'package:args/command_runner.dart';
   import 'package:jefe/jefe.dart' hide Command;
   import 'package:jefe/src/project/jefe_project.dart';
  -import 'package:logging/logging.dart';
  -import 'package:path/path.dart' as p;
   import 'package:stack_trace/stack_trace.dart';
  -
  -//import 'package:unscripted/unscripted.dart' as u;
  -import 'package:args/args.dart';
  -import 'package:args/command_runner.dart';
   
   main(List<String> arguments) {
     final runner =
  -      CommandRunner('jefe', 'Manages a set of related Dart projects');
  -  runner
  -    ..addCommand(Install())
  -    ..addCommand(Init())
  -    ..addCommand(Jefetise())
  -    ..addCommand(Start())
  -    ..addCommand(Finish())
  -    ..addCommand(Exec());
  +  CommandRunner('jefe', 'Manages a set of related Dart projects');
  +  runner..addCommand(Install())..addCommand(Init())..addCommand(
  +      Jefetise())..addCommand(Start())..addCommand(Finish())..addCommand(
  +      Exec())..addCommand(SetDependencies())..addCommand(Test());
   
     Chain.capture(() {
       runner.run(arguments);
  
positive.code:   }
  }
  
  class Init extends Command {
    final name = "init";
    final description = 'Installs or updates a group of projects';
  
    Init() {
      argParser.addOption('gitUri',
          help: 'The git Uri containing the jefe.yaml.', abbr: 'g');
      argParser.addOption('installDirectory',
          help: 'The directory to install into', abbr: 'd', defaultsTo: '.');
      argParser.addFlag('skipCheckout',
          help: 'Skips the checkout of the develop branch',
          abbr: 's',
          defaultsTo: false);
    }
  
    Future run() {
      final gitUri = argResults['gitUri'];
      final installDirectory = argResults['installDirectory'];
      final skipCheckout = argResults['skipCheckout'];
      return init(
          gitUri: gitUri,
  
negative.code:   });
  }
  
  abstract class BaseJefeCommand extends Command {
    addGitUri() =>
        argParser.addOption('gitUri',
            help: 'The git Uri containing the jefe.yaml.', abbr: 'g');
  
    addInstallDirectory() =>
        argParser.addOption('installDirectory',
            help: 'The directory to install into', abbr: 'd', defaultsTo: '.');
  
    addContainerDirectory() =>
        argParser.addOption('containerDirectory',
            help: 'The directory that contains the projects',
            abbr: 'd',
            defaultsTo: '.');
  
    addSkipCheckout() =>
        argParser.addFlag('skipCheckout',
            help: 'Skips the checkout of the develop branch',
            abbr: 's',
            defaultsTo: false);
  
    addRootDirectory() =>
        argParser.addOption('rootDirectory',
            help: 'The directory that contains the root of the projecs',
            abbr: 'd',
            defaultsTo: '.');
  
    addProjects() =>
        argParser.addOption('projects',
            help:
            'A project name filter. Only projects whose name contains the text will run',
            abbr: 'p');
  
    String get gitUri() => argResults['gitUri'];
  
    String get installDirectory() => argResults['installDirectory'];
  
    String get containerDirectory() => argResults['containerDirectory'];
  
    String get rootDirectory() => argResults['rootDirectory'];
  
    bool get skipCheckout() => argResults['skipCheckout'];
  
    String get projects() => argResults['projects'];
  }
  
  class Install extends BaseJefeCommand {
    final name = "install";
    final description = "Installs a group of projects";
  
    Install() {
      addGitUri();
      addInstallDirectory();
    }
  
    Future run() {
      return install(gitUri, installDirectory: installDirectory);
    }
  
    Future install(String gitUri, {String installDirectory: '.'}) async {
      final Directory installDir = new Directory(installDirectory);
      final ProjectGroup projectGroup =
      await ProjectGroup.install(installDir, gitUri);
  
      await (await projectGroup.rootJefeProjects).lifecycle.init();
    }
  }
  
  class Jefetise extends BaseJefeCommand {
    final name = "jefetise";
    final description = 'Converts a directory of projects into a jefe group. '
        'WARNING renames the current directory to append _root to name';
  
    Jefetise() {
      addContainerDirectory();
    }
  
    Future run() {
      return jefetise(containerDirectory: containerDirectory);
    }
  
  