Все вы делаете так, но watch-таск делает очень много лишней работы. У вас он смотрит на директорию с исходниками и при изменении любого файла, запускает все таски, а не один нужный.
Для начала вам стоит разбить watch на таргеты для независимой компиляции разных типов файлов. Также у меня есть сомнения по поводу необходимости указывать таргет files у самого livereload - уберите его. Вот пример моего таска с livereload:
watch: {
options: {
livereload: true
},
gruntfile: {
files: ['Gruntfile.js'],
tasks: ['build:dev']
},
js: {
files: '<%= path.assets %>/javascripts/{,**/}*.js',
tasks: 'concat'
},
compass: {
files: '<%= path.assets %>/stylesheets/{,**/}*.{scss,sass}',
tasks: ['compass:dev', 'autoprefixer']
},
jade: {
files: '<%= path.assets %>/views/{,**/}*.jade',
tasks: ['jade:dev']
}
}
Также не забудьте вставить скрипт для livereload в свой html:
<script src="//localhost:35729/livereload.js"></script>