Skip to content
CAI
Software that uses CAICheck a score

MobileNativeFoundation/XCLogParser

51.9

Adequate · 1 October 2026

8.3k

lines of production code

Swift

with JavaScript

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

XCLogParser is a command-line tool and library designed to parse, analyze, and visualize Xcode build logs. It extracts detailed performance metrics, such as Swift type-checking and linker statistics, while sanitizing build-specific data to facilitate log grouping. The system generates comprehensive HTML reports, JSON summaries, and issue lists to help developers identify build bottlenecks and errors.

Features

HTML report now includes Swift type-checking and function compilation metrics

The generated HTML report has been updated to display detailed Swift compilation performance data. Users can now view specific tables for Swift type-checking durations and function compilation times, allowing for deeper analysis of build bottlenecks. The report also includes visual styling for Swift and Objective-C files and provides warnings if the necessary compiler flags (such as \-debug-time-function-bodies\) were not used during the build.

Sources/XCLogParser/generated · high confidence

Initial CI automation with linting, building, and testing

Added a new CI pipeline (ci/ci.sh) that automates the project's continuous integration workflow. The script installs SwiftLint and xcpretty, runs strict linting checks, builds the project in release mode, and executes the test suite, ensuring code quality and stability are enforced in every commit.

ci · high confidence

New Issues and Summary JSON reporters, HTML report restructuring, and Chrome Tracer precision fix

The reporter module introduces two new output formats: an Issues reporter that generates a JSON file containing build warnings and errors, and a Summary JSON reporter that outputs a summarized build view. The existing HTML reporter has been refactored to generate a pre-computed, static report structure (separate main and target files) instead of using server-side template rendering, and it now supports a root output path to control the report directory. Additionally, the Chrome Tracer reporter has been updated to output timestamps in microseconds for higher precision, and all reporters now accept a rootOutput parameter to allow specifying the output directory.

Sources/XCLogParser/reporter · high confidence

New version command and expanded parsing options for log reports

The tool now includes a dedicated version command to display the current release number (0.2.49). Parsing and reporting capabilities have been extended with several new options: users can now omit warnings or notes details from the output, truncate large issue lists to 100 items, and remove build-specific information to facilitate log grouping. Additionally, a custom machine name can be provided for build identifiers, and a strict project naming mode is available. HTML reports can now be saved to a specific root folder using the new root output option.

Sources/XCLogParser/commands · high confidence

Swift type-check timing data and cache status added to build reports

The HTML build reports now display a new table showing Swift type-check durations, occurrences, and cumulative times, alongside existing function compilation metrics. This data is populated from the \-debug-time-expression-type-checking\ flag and includes a warning if no type-check times are found. Additionally, the report now indicates whether files were compiled or fetched from Xcode's cache, and displays the path to the clang time-trace file.

Resources/js · high confidence

Behavioural changes

CLI rewritten with ArgumentParser and new report filtering options

The command-line interface has been migrated from the Commandant library to Apple's ArgumentParser, introducing a structured subcommand model (parse, dump, manifest, version) and replacing the old CommonCommand options with native property wrappers. This change adds several new capabilities to the parse command, including flags to omit warnings (--omit\_warnings), omit notes (--omit\_notes), and truncate large issue lists (--trunc\_large\_issues) to reduce report size and memory usage. It also introduces --strictProjectName for precise project matching, --without\_build\_specific\_information to sanitize build paths, and --machine\_name to control build identifiers. Additionally, the tool now supports a --rootOutput option to store HTML reports in a specified path, and the underlying XcodeHasher has been updated to support Swift 5's stricter memory access patterns.

Sources/XCLogParserApp · high confidence

Enhanced build log parsing with linker statistics, Swift timing, and improved error handling

The parser now extracts detailed ld64 linker statistics (including time breakdowns, paging info, and file counts) when the \-print\_statistics\ flag is present, and parses Swift function and type-checking times from \-debug-time-function-bodies\ and \-debug-time-expression-type-checking\ flags. It also flattens whole-module Swift compilation steps for clearer reporting, groups flat Xcode 11+ log sections by target, sanitizes build status strings, and improves the accuracy of Swift error/warning parsing and deprecation detection.

Sources/XCLogParser/parser · high confidence

Enhanced build report with Swift type-checking data and cache status

The HTML build report now displays Swift type-checking times and distinguishes between compiled and cached files. The main index page includes new sections for Swift function and type-checking build times, while the C and Swift file cards now show separate counts for compiled versus total files. The step detail view adds a 'Fetched from cache' indicator to show if files were retrieved from Xcode's internal cache and includes a link to the clang time-trace file path. The report title has also been updated to 'XCLogParser build report'.

Resources · high confidence

Enhanced parsing for newer Xcode logs and new log types

The activity parser now handles structural changes in Xcode activity logs, including skipping section attachments for logs older than version 11, tolerating new integer tokens in Xcode 26.2+ and 27.0+, and parsing \IDEActivityLogSectionAttachment\ lists. It also adds support for parsing \DBGConsoleLog\ entries and \StaticAnalyzer\ results (via \IDEActivityLogAnalyzerResultMessage\), and allows users to strip build-specific information (like DerivedData paths) from logs to facilitate grouping.

Sources/XCLogParser/activityparser · high confidence

Improved log location resolution and error messaging

The log parser now provides clearer, user-friendly error messages when logs cannot be found, helping users understand how to use options like --derived\_data or --file. It also fixes a bug where logs generated by xcodebuild with a custom -derivedDataPath were not found, and adds a --strictProjectName option to enforce exact project name matching in DerivedData directories. Additionally, log file contents are now decoded using UTF-8 instead of ASCII, preventing read failures for logs containing non-ASCII characters.

Sources/XCLogParser/loglocation · high confidence

LogManifest now supports direct initialization

The LogManifest struct now exposes a public initializer, allowing users to instantiate the object directly rather than relying solely on the existing getWithLogOptions method. This change enables more flexible composition and testing of the log manifest logic within the XCLogParser tool.

Sources/XCLogParser/logmanifest · high confidence

New lexer components and support for JSON token type

The lexer module introduces a new \Scanner\ class for improved string parsing performance, a \LogRedactor\ protocol with a \LexRedactor\ implementation to handle user directory redaction, and a \String\ extension to remove build-specific identifiers and hexadecimal numbers from logs. Additionally, the \TokenType\ enum and \Token\ model now include a new \json\ case, enabling the parser to recognize and handle JSON-formatted log entries.

Sources/XCLogParser/lexer · high confidence

Renamed Error enum to XCLogParserError

The generic Error enum in the XCLogParser module has been renamed to XCLogParserError to prevent naming collisions with Swift.Error. This change also adopts the LocalizedError protocol, providing a standardized errorDescription property for better integration with Swift's error handling mechanisms.

Sources/XCLogParser · high confidence

Update file path resolution and error handling in FileOutput

The FileOutput component now uses the PathKit library instead of Path for file path operations, changing how absolute paths are resolved via the new .absolute() method. Additionally, error throwing has been updated to use the specific XCLogParserError type instead of a generic Error type, ensuring more precise error identification when report creation or file writing fails.

Sources/XCLogParser/output · high confidence

XCLogParser adds new report types, flags, and Linux/Docker support

The tool now supports additional report formats including \summaryJson\ and \issues\, and introduces new command-line flags such as \--strictProjectName\, \--without\_build\_specific\_info\, \--omit\_warnings\, \--omit\_notes\, and \--trunc\_large\_issues\ to refine output and reduce report size. It also exposes Swift 5.5 type-checking times and supports Linux via a new Dockerfile and build scripts, while updating the Swift Package Manager manifests to support Swift 4.2 and 5.0 with modern dependencies like \swift-argument-parser\.

(repo-wide) · high confidence

Test coverage

Expanded test coverage for XCLogParser parsing and sanitization logic; Update Linux test runner to use XCLogParserTests.

Dependencies

Upgrade to Swift 5.5 and migrate command-line argument parsing

The project now requires Swift 5.5 and macOS 10.13, replacing the legacy Commandant library with Apple's swift-argument-parser for handling command-line inputs. Several dependencies have been updated or replaced: GzipSwift was upgraded from 4.x to 5.1.0, CryptoSwift to 1.3.3, PathKit replaced Path.swift, and Spectre was updated to 0.10.1. Additionally, the package now exposes XCLogParser as a library product alongside the executable, and test targets now explicitly depend on the Gzip product.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 59 → 52 (-7.2)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 95 → 95 (+0.0)
  • Architecture 100 → 91 (-9.2)
  • Maturity 57 → 57 (+0.0)
  • Readiness 49 → 36 (-13.7)
  • Security 67 → 67 (+0.0)
  • Accessibility 69 → 69 (+0.2)

Resolved (2)

  • Documentation: no installation or build instructions (README.md)
  • Off-boarding risk: anonymized user #1

New (30)

  • Duplicate intent: Both methods appear to return the URL for the log manifest. The naming difference ('With' vs 'URLWith') is confusing and suggests redundancy rather than distinct functionality.
  • Duplicate type intent: Both XCLogParserError and LogError provide an errorDescription property and a description property, suggesting they serve the same role as error types within the same module. Having two distinct error types with identical interfaces is redundant.
  • Inconsistent parameter naming and typing: logsDirectoryForXcodeProject takes a named parameter projectPath: String, while logsDirectoryForWorkspace uses an unnamed String parameter. Additionally, there are two overloads for workspace with inconsistent naming (String vs String, andScheme: String).
  • Low coverage: Sources/XCLogParser/XCLogParserError.swift (Sources/XCLogParser/XCLogParserError.swift)
  • Low coverage: Sources/XCLogParser/activityparser/IDEActivityModel.swift (Sources/XCLogParser/activityparser/IDEActivityModel.swift)
  • Low coverage: Sources/XCLogParser/commands/ActionOptions.swift (Sources/XCLogParser/commands/ActionOptions.swift)
  • Low coverage: Sources/XCLogParser/commands/Command.swift (Sources/XCLogParser/commands/Command.swift)
  • Low coverage: Sources/XCLogParser/commands/CommandHandler.swift (Sources/XCLogParser/commands/CommandHandler.swift)
  • Low coverage: Sources/XCLogParser/extensions/EncodableExtension.swift (Sources/XCLogParser/extensions/EncodableExtension.swift)
  • Low coverage: Sources/XCLogParser/extensions/URLExtension.swift (Sources/XCLogParser/extensions/URLExtension.swift)
  • Low coverage: Sources/XCLogParser/lexer/Index+Offset.swift (Sources/XCLogParser/lexer/Index+Offset.swift)
  • Low coverage: Sources/XCLogParser/lexer/String+BuildSpecificInformationRemoval.swift (Sources/XCLogParser/lexer/String+BuildSpecificInformationRemoval.swift)
  • Low coverage: Sources/XCLogParser/loglocation/LogError.swift (Sources/XCLogParser/loglocation/LogError.swift)
  • Low coverage: Sources/XCLogParser/loglocation/LogFinder.swift (Sources/XCLogParser/loglocation/LogFinder.swift)
  • Low coverage: Sources/XCLogParser/output/FileOutput.swift (Sources/XCLogParser/output/FileOutput.swift)
  • Low coverage: Sources/XCLogParser/output/ReporterOutput.swift (Sources/XCLogParser/output/ReporterOutput.swift)
  • Low coverage: Sources/XCLogParser/output/StandardOutput.swift (Sources/XCLogParser/output/StandardOutput.swift)
  • Low coverage: Sources/XCLogParser/parser/ClangCompilerParser.swift (Sources/XCLogParser/parser/ClangCompilerParser.swift)
  • Low coverage: Sources/XCLogParser/parser/IDEActivityLogSection+Builders.swift (Sources/XCLogParser/parser/IDEActivityLogSection+Builders.swift)
  • Low coverage: Sources/XCLogParser/parser/LinkerStatistics.swift (Sources/XCLogParser/parser/LinkerStatistics.swift)
  • …and 10 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

MobileNativeFoundation/XCLogParser was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit d723980ca700f96414c37d37697f96e8cdeff20f — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.