Fixed gitignore to not exclude part of semantic-ui build system
diff --git a/.gitignore b/.gitignore
index bba8f85..8272c5c 100755
--- a/.gitignore
+++ b/.gitignore
@@ -21,10 +21,10 @@
 npm-debug.log
 .tmp
 /node_modules/*
-build
+/build
 
-static/*
-!static/admin/
+/static/*
+/!static/admin/
 
 archive/*
 
diff --git a/semantic/tasks/build/assets.js b/semantic/tasks/build/assets.js
new file mode 100644
index 0000000..bc37ad9
--- /dev/null
+++ b/semantic/tasks/build/assets.js
@@ -0,0 +1,35 @@
+/*******************************
+          Build Task
+*******************************/
+
+var
+  gulp         = require('gulp'),
+
+  // gulp dependencies
+  chmod        = require('gulp-chmod'),
+  gulpif       = require('gulp-if'),
+
+  // config
+  config       = require('../config/user'),
+  tasks        = require('../config/tasks'),
+
+  // shorthand
+  globs        = config.globs,
+  assets       = config.paths.assets,
+  output       = config.paths.output,
+  source       = config.paths.source,
+
+  log          = tasks.log
+;
+
+module.exports = function(callback) {
+
+  console.info('Building assets');
+
+  // copy assets
+  return gulp.src(source.themes + '/**/assets/**/*.*')
+    .pipe(gulpif(config.hasPermission, chmod(config.permission)))
+    .pipe(gulp.dest(output.themes))
+  ;
+
+};
\ No newline at end of file
diff --git a/semantic/tasks/build/css.js b/semantic/tasks/build/css.js
new file mode 100644
index 0000000..6f579d8
--- /dev/null
+++ b/semantic/tasks/build/css.js
@@ -0,0 +1,113 @@
+/*******************************
+          Build Task
+*******************************/
+
+var
+  gulp         = require('gulp'),
+
+  // node dependencies
+  console      = require('better-console'),
+  fs           = require('fs'),
+
+  // gulp dependencies
+  autoprefixer = require('gulp-autoprefixer'),
+  chmod        = require('gulp-chmod'),
+  clone        = require('gulp-clone'),
+  flatten      = require('gulp-flatten'),
+  gulpif       = require('gulp-if'),
+  less         = require('gulp-less'),
+  minifyCSS    = require('gulp-clean-css'),
+  plumber      = require('gulp-plumber'),
+  print        = require('gulp-print'),
+  rename       = require('gulp-rename'),
+  replace      = require('gulp-replace'),
+  runSequence  = require('run-sequence'),
+
+  // config
+  config       = require('../config/user'),
+  tasks        = require('../config/tasks'),
+  install      = require('../config/project/install'),
+
+  // shorthand
+  globs        = config.globs,
+  assets       = config.paths.assets,
+  output       = config.paths.output,
+  source       = config.paths.source,
+
+  banner       = tasks.banner,
+  comments     = tasks.regExp.comments,
+  log          = tasks.log,
+  settings     = tasks.settings
+;
+
+// add internal tasks (concat release)
+require('../collections/internal')(gulp);
+
+module.exports = function(callback) {
+
+  var
+    tasksCompleted = 0,
+    maybeCallback  = function() {
+      tasksCompleted++;
+      if(tasksCompleted === 2) {
+        callback();
+      }
+    },
+
+    stream,
+    compressedStream,
+    uncompressedStream
+  ;
+
+  console.info('Building CSS');
+
+  if( !install.isSetup() ) {
+    console.error('Cannot build files. Run "gulp install" to set-up Semantic');
+    return;
+  }
+
+  // unified css stream
+  stream = gulp.src(source.definitions + '/**/' + globs.components + '.less')
+    .pipe(plumber(settings.plumber.less))
+    .pipe(less(settings.less))
+    .pipe(autoprefixer(settings.prefix))
+    .pipe(replace(comments.variables.in, comments.variables.out))
+    .pipe(replace(comments.license.in, comments.license.out))
+    .pipe(replace(comments.large.in, comments.large.out))
+    .pipe(replace(comments.small.in, comments.small.out))
+    .pipe(replace(comments.tiny.in, comments.tiny.out))
+    .pipe(flatten())
+  ;
+
+  // two concurrent streams from same source to concat release
+  uncompressedStream = stream.pipe(clone());
+  compressedStream   = stream.pipe(clone());
+
+  // uncompressed component css
+  uncompressedStream
+    .pipe(plumber())
+    .pipe(replace(assets.source, assets.uncompressed))
+    .pipe(gulpif(config.hasPermission, chmod(config.permission)))
+    .pipe(gulp.dest(output.uncompressed))
+    .pipe(print(log.created))
+    .on('end', function() {
+      runSequence('package uncompressed css', maybeCallback);
+    })
+  ;
+
+  // compressed component css
+  compressedStream = stream
+    .pipe(plumber())
+    .pipe(clone())
+    .pipe(replace(assets.source, assets.compressed))
+    .pipe(minifyCSS(settings.minify))
+    .pipe(rename(settings.rename.minCSS))
+    .pipe(gulpif(config.hasPermission, chmod(config.permission)))
+    .pipe(gulp.dest(output.compressed))
+    .pipe(print(log.created))
+    .on('end', function() {
+      runSequence('package compressed css', maybeCallback);
+    })
+  ;
+
+};
diff --git a/semantic/tasks/build/javascript.js b/semantic/tasks/build/javascript.js
new file mode 100644
index 0000000..f99c130
--- /dev/null
+++ b/semantic/tasks/build/javascript.js
@@ -0,0 +1,77 @@
+/*******************************
+          Build Task
+*******************************/
+
+var
+  gulp         = require('gulp'),
+
+  // node dependencies
+  console      = require('better-console'),
+  fs           = require('fs'),
+
+  // gulp dependencies
+  chmod        = require('gulp-chmod'),
+  flatten      = require('gulp-flatten'),
+  gulpif       = require('gulp-if'),
+  plumber      = require('gulp-plumber'),
+  print        = require('gulp-print'),
+  rename       = require('gulp-rename'),
+  replace      = require('gulp-replace'),
+  uglify       = require('gulp-uglify'),
+
+  // config
+  config       = require('../config/user'),
+  tasks        = require('../config/tasks'),
+  install      = require('../config/project/install'),
+
+  // shorthand
+  globs        = config.globs,
+  assets       = config.paths.assets,
+  output       = config.paths.output,
+  source       = config.paths.source,
+
+  banner       = tasks.banner,
+  comments     = tasks.regExp.comments,
+  log          = tasks.log,
+  settings     = tasks.settings
+;
+
+// add internal tasks (concat release)
+require('../collections/internal')(gulp);
+
+module.exports = function(callback) {
+
+  var
+    stream,
+    compressedStream,
+    uncompressedStream
+  ;
+
+  console.info('Building Javascript');
+
+  if( !install.isSetup() ) {
+    console.error('Cannot build files. Run "gulp install" to set-up Semantic');
+    return;
+  }
+
+  // copy source javascript
+  gulp.src(source.definitions + '/**/' + globs.components + '.js')
+    .pipe(plumber())
+    .pipe(flatten())
+    .pipe(replace(comments.license.in, comments.license.out))
+    .pipe(gulp.dest(output.uncompressed))
+    .pipe(gulpif(config.hasPermission, chmod(config.permission)))
+    .pipe(print(log.created))
+    .pipe(uglify(settings.uglify))
+    .pipe(rename(settings.rename.minJS))
+    .pipe(gulp.dest(output.compressed))
+    .pipe(gulpif(config.hasPermission, chmod(config.permission)))
+    .pipe(print(log.created))
+    .on('end', function() {
+      gulp.start('package compressed js');
+      gulp.start('package uncompressed js');
+      callback();
+    })
+  ;
+
+};
\ No newline at end of file