A couple of thoughts after having played with IConstructionAware...
I think IExecutable or IRunnable would probably be a better name.
The really nice thing about IConstructionAware is that each helper method in BuiltIns can now become a separate class. Rather than:
msbuild("foo.sln", { @configuration: "release", @foo: "bar" })
...I can now do this:
msbuild("foo.sln", Configuration: "release", Params: { "foo": "bar" })
...where msbuild is a class by itself rather than a globally-scoped static method. As this is now a regular class, you can also use the "with" syntax if you don't want it all on one line:
with MSBuild("foo.sln"):
.Configuration = "release"
.Params = { "foo", "bar" }
.Constructed()
...and this works without any modification. It's probably also possible to modify "with" to implicitly call .Constructed (or whatever we rename it to) at the end of the With block.
The only thing I don't really like is the removal of @ for symbols. Is it possible to use a different character for escaping? Underscore maybe?
Jeremy