anchor.diff:  
     void _removeProjectReference(ws.Project project) {
       spark.workspace.unlink(project);
  -  }
  -
  -  String get category => 'resource';
  -
  -  bool appliesTo(Object object) => _isResourceList(object) &&
  -      !_hasTopLevelResource(object);
  -}
  -
  -class ProjectRemoveAction extends SparkAction implements ContextAction {
  -  ProjectRemoveAction(Spark spark) : super(spark, "project-remove", "Remove");
  -
  -  void _invoke([List<ws.Resource> resources]) {
  -    ws.Project project = resources.first;
  -    // If project is on sync filesystem, it can only be deleted.
  -    // It can't be unlinked.
  -    if (project.isSyncResource()) {
  -      _deleteProject(project);
  -      return;
  -    }
  -
  -    SparkDialog _dialog =
  -        spark.createDialog(spark.getDialogElement('#projectRemoveDialog'));
  -    _dialog.element.querySelector("#projectRemoveProjectName").text =
  -        project.name;
  -    _dialog.element.querySelector("#projectRemoveDeleteButton")
  -        .onClick.listen((_) => _deleteProject(project));
  -    _dialog.element.querySelector("#projectRemoveRemoveReferenceButton")
  -        .onClick.listen((_) => _removeProjectReference(project));
  -    _dialog.show();
  -  }
  -
  -  void _deleteProject(ws.Project project) {
  -    spark.askUserOkCancel('''
  -Do you really want to delete "${project.name}"?
  -This will permanently delete the project contents from disk and cannot be undone.
  -''', okButtonLabel: 'Delete', title: 'Delete Project from Disk').then((bool val) {
  -      if (val) {
  -        project.delete().catchError((e) {
  -          spark.showErrorMessage("Error while deleting project", e.toString());
  -        });
  -        spark.workspace.save();
  -      }
  -    });
  -  }
  -
  -  void _removeProjectReference(ws.Project project) {
  -    spark.workspace.unlink(project);
  +    spark.workspace.save();
     }
   
     String get category => 'resource';
  
positive.code:       resources = sel;
      }
  
      ws.Project project = resources.firstWhere((r) => r is ws.Project, orElse: () => null);
      if (project != null) {
        _removeProject(project);
        return;
      }
  
      String message;
      if (resources.length == 1) {
        message = "Do you really want to delete '${resources.first.name}'?\nThis will permanently delete this file from disk and cannot be undone.";
  
negative.code:     });
    }
  
    String get category => 'resource';
  
    bool appliesTo(Object object) => _isResourceList(object) &&
        !_hasTopLevelResource(object);
  }
  
  class ProjectRemoveAction extends SparkAction implements ContextAction {
    ProjectRemoveAction(Spark spark) : super(spark, "project-remove", "Remove");
  
    void _invoke([List<ws.Resource> resources]) {
      ws.Project project = resources.first;
      // If project is on sync filesystem, it can only be deleted.
      // It can't be unlinked.
      if (project.isSyncResource()) {
  