diff --git a/orchestrator/orchestrator-test.ts b/orchestrator/orchestrator-test.ts
new file mode 100644
index 000000000..af9af745c
--- /dev/null
+++ b/orchestrator/orchestrator-test.ts
@@ -0,0 +1,106 @@
+///
+///
+
+'use strict';
+
+import Orchestrator from 'orchestrator';
+
+var orchestrator = new Orchestrator();
+
+
+// API:
+
+//
+// orchestrator.add(name[, deps][, function]);
+//
+
+orchestrator.add('thing1', function() {
+ // do stuff
+});
+orchestrator.add('thing2', function() {
+ // do stuff
+});
+orchestrator.add('mytask', ['array', 'of', 'task', 'names'], function() {
+ // Do stuff
+});
+orchestrator.add('thing2', function(callback){
+ var err: any = null;
+ // do stuff
+ callback(err);
+});
+
+
+var Q = require('q');
+
+orchestrator.add('thing3', function(){
+ var deferred = Q.defer();
+
+ // do async stuff
+ setTimeout(function () {
+ deferred.resolve();
+ }, 1);
+
+ return deferred.promise;
+});
+
+
+//TODO: map-stream currently not on DefinitelyTyped
+//var map = require('map-stream');
+//
+//orchestrator.add('thing4', function(){
+// var stream = map(function (args, cb) {
+// cb(null, args);
+// });
+// // do stream stuff
+// return stream;
+//});
+
+//
+// orchestrator.hasTask(name);
+//
+
+orchestrator.hasTask('thing1');
+
+//
+// orchestrator.start(tasks...[, cb]);
+//
+
+orchestrator.start('thing1', 'thing2', 'thing3', 'thing4', function (err) {
+ // all done
+});
+orchestrator.start(['thing1','thing2'], ['thing3','thing4']);
+
+
+//
+// orchestrator.stop()
+//
+
+orchestrator.stop();
+
+//
+// orchestrator.on(event, cb);
+//
+
+orchestrator.on('task_start', function (e) {
+ var message: string = e.message;
+ var task: string = e.task;
+ var err: any = e.err;
+});
+orchestrator.on('task_stop', function (e) {
+ var message: string = e.message;
+ var task: string = e.task;
+ var duration: number = e.duration;
+});
+
+//
+// orchestrator.onAll(cb);
+//
+
+orchestrator.onAll(function (e) {
+ var message: string = e.message;
+ var task: string = e.task;
+ var err: any = e.err;
+ var src: string = e.src;
+});
+
+
diff --git a/orchestrator/orchestrator.d.ts b/orchestrator/orchestrator.d.ts
new file mode 100644
index 000000000..2948aa927
--- /dev/null
+++ b/orchestrator/orchestrator.d.ts
@@ -0,0 +1,122 @@
+// Type definitions for Orchestrator
+// Project: https://github.com/orchestrator/orchestrator
+// Definitions by: Qubo
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare type Strings = string|string[];
+
+export interface AddMethodCallback {
+ /**
+ * Accept a callback
+ * @param callback
+ */
+ (callback?: Function): any;
+ /**
+ * Return a promise
+ */
+ (): Q.Promise;
+ /**
+ * Return a stream: (task is marked complete when stream ends)
+ */
+ (): any; //TODO: stream type should be here e.g. map-stream
+}
+
+/**
+ * Define a task
+ */
+export interface AddMethod {
+ /**
+ * Define a task
+ * @param name The name of the task.
+ * @param deps An array of task names to be executed and completed before your task will run.
+ * @param fn The function that performs the task's operations. For asynchronous tasks, you need to provide a hint when the task is complete:
+ *
+ * - Take in a callback
+ * - Return a stream or a promise
+ *
+ */
+ (name: string, deps?: string[], fn?: AddMethodCallback|Function): Orchestrator;
+ /**
+ * Define a task
+ * @param name The name of the task.
+ * @param fn The function that performs the task's operations. For asynchronous tasks, you need to provide a hint when the task is complete:
+ *
+ * - Take in a callback
+ * - Return a stream or a promise
+ *
+ */
+ (name: string, fn?: AddMethodCallback|Function): Orchestrator;
+}
+
+/**
+ * Start running the tasks
+ */
+export interface StartMethod {
+ /**
+ * Start running the tasks
+ * @param tasks Tasks to be executed. You may pass any number of tasks as individual arguments.
+ * @param cb Callback to call after run completed.
+ */
+ (tasks: Strings, cb?: (error?: any) => any): Orchestrator;
+ /**
+ * Start running the tasks
+ * @param tasks Tasks to be executed. You may pass any number of tasks as individual arguments.
+ * @param cb Callback to call after run completed.
+ */
+ (...tasks: Strings[]/*, cb?: (error: any) => any */): Orchestrator;
+ //TODO: TypeScript 1.5.3 cannot express varargs followed by callback as a last argument...
+ (task1: Strings, task2: Strings, cb?: (error?: any) => any): Orchestrator;
+ (task1: Strings, task2: Strings, task3: Strings, cb?: (error?: any) => any): Orchestrator;
+ (task1: Strings, task2: Strings, task3: Strings, task4: Strings, cb?: (error?: any) => any): Orchestrator;
+ (task1: Strings, task2: Strings, task3: Strings, task4: Strings, task5: Strings, cb?: (error?: any) => any): Orchestrator;
+ (task1: Strings, task2: Strings, task3: Strings, task4: Strings, task5: Strings, task6: Strings, cb?: (error?: any) => any): Orchestrator;
+}
+
+export interface OnCallbackEvent {
+ message: string;
+ task: string;
+ err: any;
+ duration?: number;
+}
+
+export interface OnAllCallbackEvent extends OnCallbackEvent {
+ src: string;
+}
+
+declare class Orchestrator {
+ add: AddMethod;
+ /**
+ * Have you defined a task with this name?
+ * @param name The task name to query
+ */
+ hasTask(name: string): boolean;
+ start: StartMethod;
+ stop(): void;
+
+ /**
+ * Listen to orchestrator internals
+ * @param event Event name to listen to:
+ *
+ * - start: from start() method, shows you the task sequence
+ *
- stop: from stop() method, the queue finished successfully
+ *
- err: from stop() method, the queue was aborted due to a task error
+ *
- task_start: from _runTask() method, task was started
+ *
- task_stop: from _runTask() method, task completed successfully
+ *
- task_err: from _runTask() method, task errored
+ *
- task_not_found: from start() method, you're trying to start a task that doesn't exist
+ *
- task_recursion: from start() method, there are recursive dependencies in your task list
+ *
+ * @param cb Passes single argument: e: event details
+ */
+ on(event: string, cb: (e: OnCallbackEvent) => any): Orchestrator;
+
+ /**
+ * Listen to all orchestrator events from one callback
+ * @param cb Passes single argument: e: event details
+ */
+ onAll(cb: (e: OnAllCallbackEvent) => any): void;
+}
+
+export default Orchestrator;