Issue #524

/// Any task that uses command line
public protocol UsesCommandLine: AnyObject {
    var program: String { get }
    var arguments: Set<String> { get set }
}

public extension UsesCommandLine {
    func run() throws {
        let command = "\(program) \(arguments.joined(separator: " "))"
        Log.command(command)
        _ = try Process().run(command: command)
    }
}

class Build: UsesCommandLine {
    public func run() throws {
        arguments.insert("build")
        try (self as UsesCommandLine).run()
    }
}