     grunt.log.writelns res.output
     return false
 
+  grunt.registerTask 'git:push', ->
+    return runSimple 'git push'
+
+  grunt.registerTask 'git:pushTags', ->
+    return runSimple 'git push --tags'
+
   grunt.registerTask 'git:tag:release', ->
-    tag = grunt.config release.options.tagName
-    msg = grunt.config.release.options.tagMessage
-    return runSimple "git tag  #{tag} -m #{msg}"
+    tag = grunt.config 'release.options.tagName'
+    msg = grunt.config 'release.options.tagMessage'
+    return runSimple "git tag  #{tag} -m '#{msg}'"
 
-  _semverSync = 'node_modules/semver-sync/bin/semver-sync'
+
+  grunt.registerTask 'npm:publish', (tag) ->
+    tag = ' -- tag %s' % [tag] if tag
+    return runSimple "npm publish #{tag}"
+
 
   grunt.registerTask 'semver:isSynced', ->
-    res = runSilent "#{_semverSync} --verify"
-    #return false unless res.code == 0
+    res = runSilent "node_modules/.bin/semver-sync --verify"
+    return false unless res.code == 0
     if res.code == 0
       grunt.log.writeln res.output
       return

    type = type || 'patch'
    grunt.task.run 'bumpup:' + type

  grunt.registerTask 'release:git', [
    'git:add:package.json', 'git:commit:release', 'git:tag:release'
  ]

  grunt.registerTask 'release', [ 'release:prep', 'release:bump', 'release:git' ]


  grunt.registerTask 'git:add', (file) ->
    res = runSimple "git add #{file}"


  grunt.registerTask 'git:commit:release', ->
    msg = grunt.config release.options.commitMessage
    return runSimple "git commit -m #{msg}"

  grunt.registerTask 'git:isClean', ->
    res = runSilent 'git status -s'

    return false


# release:
# bump, stage+commit+tag+push, publish
