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:         skipCheckout: skipCheckout);
    }
  
    init(
        {String gitUri,
        String installDirectory: '.',
        bool skipCheckout: false}) async {
      final Directory installDir = new Directory(installDirectory);
      final ProjectGroup projectGroup =
          await ProjectGroup.init(installDir, gitUri);
  
  //    final executor = new CommandExecutor(projectGroup);
  //    await executor.execute(lifecycle.init(doCheckout: !skipCheckout));
      await (await projectGroup.rootJefeProjects)
          .lifecycle
          .init(doCheckout: !skipCheckout);
    }
  }
  
  class Start extends Command {
    final name = "start";
    final description = 'Sets up for the start of development on a new feature';
  
    Start() {
      argParser.addOption('featureName',
          help: 'The name of the feature to start', abbr: 'f');
      argParser.addOption('rootDirectory',
          help: 'The directory that contains the root of the projecs',
          abbr: 'd',
          defaultsTo: '.');
      argParser.addOption('projects',
          help:
              'A project name filter. Only projects whose name contains the text will run',
          abbr: 'p');
    }
  
    Future run() {
      final featureName = argResults['featureName'];
      final rootDirectory = argResults['rootDirectory'];
      final projects = argResults['projects'];
      return start(featureName, rootDirectory: rootDirectory, projects: projects);
    }
  
  
negative.code: //        .completeFeature();
  //  }
  //
  //  @u.SubCommand(help: 'Runs the given command in all projects')
  //  exec(String command,
  //      @u.Rest() List<String> args,
  //      {@u.Option(help: 'The directory that contains the root of the projecs',
  //          abbr: 'd') String rootDirectory: '.',
  //        @u.Option(
  //            help: 'A project name filter. Only projects whose name contains the text will run',
  //            abbr: 'p') String projects,
  //        @u.Flag(
  //            help: 'Instead of running the commands concurrently on the projects, run only one command on one project at a time',
  //            abbr: 's') bool executeSerially: false}) async {
  //    final graph = await _loadGraph(rootDirectory);
  //
  //    final processCommands = graph
  //        .multiProjectCommands(
  //        projectFilter: projectNameFilter(projects),
  //        defaultConcurrencyMode: executeSerially
  //            ? CommandConcurrencyMode.serialDepthFirst
  //            : CommandConcurrencyMode.concurrentProject)
  //        .processCommands;
  //
  //    final result = await processCommands.execute(command, args);
  //    final output = result.map((r) => r.toReportString()).join('\n');
  //    stdout.write(output);
  //  }
  //
  
  //  @u.SubCommand(help: 'Set dependencies between projects')
  //  setDependencies(
  //      @u.Positional(help: 'The type of dependency to set', allowed: const [
  //        'git',
  //        'path',
  //        'hosted'
  //      ]) String type,
  //      {@u.Option(help: 'The directory that contains the root of the projecs',
  //          abbr: 'd') String rootDirectory: '.',
  //        @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);
  //    final pubSpec = graph
  //        .multiProjectCommands(projectFilter: projectNameFilter(projects))
  //        .pubspecCommands;
  //
  //    switch (type) {
  //      case 'git':
  //        return pubSpec.setToGitDependencies();
  //      case 'hosted':
  //        return pubSpec.setToHostedDependencies();
  //      case 'path':
  //      default:
  //        return pubSpec.setToPathDependencies();
  //    }
  //  }
  //
  //  @u.SubCommand(help: 'Runs tests projects that have tests')
  //  test({@u.Option(help: 'The directory that contains the root of the projecs',
  //      abbr: 'd') String rootDirectory: '.',
  //    @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);
  //    final pub = graph
  //        .multiProjectCommands(projectFilter: projectNameFilter(projects))
  //        .pub;
  //
  //    return pub.test();
  //  }
  //
  
  // ------- up to
  
  //  @u.SubCommand(help: 'Create a release of all the projects')
  