ShellJS is awesome. It's basically Unix shell commands for Node.js, which is excellent if you want to write a makefile equivalent in JavaScript.
If, on the other hand, you want to execute web developer-centric tasks like concatenation and minification, linting, running of unit tests in pure JavaScript or a headless WebKit instance, or any of the functionality the 90+ plugins I'm aware of provide, check grunt out.
Grunt also works on all platforms, and supports completely arbitrary JavaScript tasks. If you can write it, grunt will execute it.
And because grunt supports arbitrary JavaScript tasks, you can use ShellJS (or any other JavaScript) from within grunt.
var id = 123;
function updateOptionalProperty(obj) {
with (obj) {
id = 456;
}
}
updateOptionalProperty({id: 0});
id // 123
updateOptionalProperty({});
id // 456
There's a built-in "watch" task, along with an open issue to further refine and document it. It's works very well so far, in that a developer can edit arbitrary files and have them all re-linted, unit tested, concatenated, etc as soon as they are saved.
And you could easily have a set of "dev" watch tasks configured, along with "deploy" tasks for minification, etc. There's a lot there, and if you want more just file an issue and we can see what makes sense to implement.