tasks/growl.js
function initGrowlStatus() {
    grunt.util.hooker.hook(grunt.log, 'write', function(msg){
      if( grunt.log.uncolor(msg).match(/Waiting.../) ) { flushMessages('ok'); }
    });

    grunt.util.hooker.hook(grunt.log, 'header', function(msg){
      msg = grunt.log.uncolor(msg);

      if( ignoreWatch && msg.match(/"watch" task/) ) { return; }

      if( msg.match(/".+:.+"/) ) { return; }

      if( !ignoreWatch && msg.match(/"watch" task/) ) {
        msg += ' for ' + path.basename(process.cwd());
        ignoreWatch = true;
      }

      messages.push(msg);
    });

    grunt.util.hooker.hook(grunt.log, 'ok', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
      }
    });

    grunt.util.hooker.hook(grunt, 'warn', function(error){
      var warning = [];

      if( typeof error !== 'undefined' ) {
        warning.push(messages[0]);
        warning.push(messages[messages.length-1]);
        warning.push(String(error.message || error));
        messages = warning;
        flushMessages('error');
      }
    });

    grunt.util.hooker.hook(grunt.log, 'error', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
       flushMessages('error');
      }
    });
  }
function initGrowlStatus() {
    grunt.util.hooker.hook(grunt.log, 'write', function(msg){
      if( grunt.log.uncolor(msg).match(/Waiting.../) ) { flushMessages('ok'); }
    });

    grunt.util.hooker.hook(grunt.log, 'header', function(msg){
      msg = grunt.log.uncolor(msg);

      if( ignoreWatch && msg.match(/"watch" task/) ) { return; }

      if( msg.match(/".+:.+"/) ) { return; }

      if( !ignoreWatch && msg.match(/"watch" task/) ) {
        msg += ' for ' + path.basename(process.cwd());
        ignoreWatch = true;
      }

      messages.push(msg);
    });

    grunt.util.hooker.hook(grunt.log, 'ok', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
      }
    });

    grunt.util.hooker.hook(grunt, 'warn', function(error){
      var warning = [];

      if( typeof error !== 'undefined' ) {
        warning.push(messages[0]);
        warning.push(messages[messages.length-1]);
        warning.push(String(error.message || error));
        messages = warning;
        flushMessages('error');
      }
    });

    grunt.util.hooker.hook(grunt.log, 'error', function(msg){
      if( typeof msg === 'string' ) {
       messages.push(grunt.log.uncolor(msg));
       flushMessages('error');
      }
    });
  }
========================================================================== DEFAULT NOTIFICATIONS ==========================================================================