     }
 
     public struct TaskUpToDateInfo {
-        let targetID: Int?
-        let taskSignature: String
-        let parentTaskID: Int?
+        public let targetID: Int?
+        public let taskSignature: String
+        public let parentTaskID: Int?
     }
 
     public struct TaskStartedInfo {
-        let taskID: Int
-        let targetID: Int?
-        let taskSignature: String
-        let parentTaskID: Int?
-        let ruleInfo: String
-        let interestingPath: AbsolutePath?
-        let commandLineDisplayString: String?
-        let executionDescription: String
+        public let taskID: Int
+        public let targetID: Int?
+        public let taskSignature: String
+        public let parentTaskID: Int?
+        public let ruleInfo: String
+        public let interestingPath: AbsolutePath?
+        public let commandLineDisplayString: String?
+        public let executionDescription: String
     }
 
     public struct TaskDiagnosticInfo {
-        let taskID: Int
-        let targetID: Int?
-        let message: String
+        public let taskID: Int
+        public let targetID: Int?
+        public let message: String
     }
 
     public struct TaskOutputInfo {
-        let taskID: Int
-        let data: String
+        public let taskID: Int
+        public let data: String
     }
 
     public struct TaskCompleteInfo {

    }
}

extension XCBuildMessage.TaskOutputInfo: Decodable, Equatable {
    enum CodingKeys: String, CodingKey {
        case taskID
        case data

    }
}

extension XCBuildMessage.TaskCompleteInfo.Result: Codable, Equatable {}
extension XCBuildMessage.TaskCompleteInfo: Codable, Equatable {
    enum CodingKeys: String, CodingKey {
        case taskID = "id"
        case result
