mono0926/LicensePlist
53.6
Adequate · 1 October 2026
2.9k
lines of production code
Swift
primary language
2
measurements over time
What this system is
LicensePlist is a command-line tool and Xcode plugin ecosystem designed to automate the generation of third-party license acknowledgements for iOS, macOS, watchOS, and tvOS applications. It parses dependency data from Swift Package Manager, CocoaPods, Carthage, and other managers to produce license files in plist, HTML, Markdown, and CSV formats. The system integrates directly into Xcode build processes via command and build tool plugins, allowing developers to automatically copy acknowledgements into their app's Settings bundle without manual configuration.
How it got here
2017 — Distribution automation and API refactoring
13 changes.
This period focused on streamlining the project's distribution and release workflows by introducing SwiftLint, automated packaging scripts, and a dedicated installation mechanism. Significant internal work involved refactoring the GitHub API client to use APIKit and native Decodable, while expanding support for additional dependency managers and enhancing core entity models for license parsing.
2019–2021 — Swift Package Manager integration and testing
6 changes.
The project enhanced its support for Swift Package Manager by introducing an extensible file reader protocol to robustly parse resolution data from SPM, Xcode projects, and workspaces. This architectural improvement was accompanied by comprehensive unit tests and a mixed-dependency test fixture to validate license detection in combined SPM and CocoaPods environments. Additionally, the period saw the restoration of Xcode workspace configurations and the addition of third-party license acknowledgements to ensure compliance and developer usability.
2023 — Xcode plugin integration and macOS release automation
4 changes.
This period focused on enhancing developer experience by introducing Xcode build tool and command plugins to automate the generation and copying of license acknowledgments. Concurrently, the project established automated workflows for distributing macOS binary artifacts, including version extraction and checksum management.
Features
Add 'Copy Acknowledgements' build phase command plugin
A new Xcode command plugin has been added that allows users to automatically add a 'Copy Acknowledgements' build phase to their Xcode project. When executed in Xcode, the plugin locates the project's .xcodeproj file and invokes an internal 'license-plist' tool to perform the script addition, streamlining the process of including open-source license acknowledgements in the build.
Plugins/AddAcknowledgementsCopyScriptCommand · high confidence
Add 'Copy Acknowledgements' build phase to Xcode projects
LicensePlist now includes a new command that automatically modifies an Xcode project file to add a 'Copy Acknowledgements' build phase. This phase copies the generated license acknowledgements into the app's Settings bundle at build time, ensuring users can view legal notices directly within the app's settings without manual configuration.
Sources/LicensePlist · high confidence
Add LicensePlist Xcode build tool plugin
Introduces a new Xcode build tool plugin that automatically generates license acknowledgments during the build process. The plugin locates the \license\_plist.yml\ configuration file, determines the correct \SourcePackages\ directory path (including a workaround for Xcode 16.3's changed working directory structure), and invokes the \license-plist\ tool with sandbox mode enabled to produce the output.
Plugins/LicensePlistBuildTool · high confidence
Add Settings.bundle with version and license display
The app now includes a Settings.bundle that allows users to view the application version (defaulting to 1.0.0) and access third-party license information directly from the system Settings app. Localization support is provided for English and Japanese, enabling the version and license labels to be displayed in the user's preferred language.
Settings.bundle · high confidence
Add Xcode command plugin to generate acknowledgements
Introduces a new Xcode command plugin that allows users to generate acknowledgements directly within Xcode. The plugin locates the 'license-plist' tool and executes it with sandbox mode enabled, automatically determining the correct package sources path to accommodate changes in Xcode 16.3's build directory structure, while filtering out incompatible arguments passed from the Xcode interface.
Plugins/GenerateAcknowledgementsCommand · high confidence
Added third-party license acknowledgements
The application now includes standard third-party license acknowledgements in CSV, HTML, and Markdown formats within the Assets folder. These files list the copyright and license information for dependencies such as SwiftDate, leveldb, swift-composable-architecture, GoogleUtilities, MSAL, and various Firebase libraries, ensuring compliance with open-source licensing requirements.
Assets · high confidence
Introduce SwiftLint and automate release, installation, and packaging workflows
The project now enforces code style via a new SwiftLint configuration (.swiftlint.yml). To support distribution, a Makefile has been added with targets for building, testing, linting, and packaging, including a portable zip and an SPM artifact bundle for macOS. A new release script (release.sh) automates the creation of GitHub Releases, Homebrew formula updates, and CocoaPods trunk pushes. Additionally, an install.sh script allows users to install the tool via a one-liner, and a CocoaPods podspec template (LicensePlist.podspec.tmp) defines the library with updated deployment targets (macOS 12.0, iOS 15.0, watchOS 9.0, tvOS 15.0).
(repo-wide) · high confidence
Introduce extensible file reader protocol for package resolution files
The core library now uses a \FileReader\ protocol to abstract how package resolution data is retrieved, replacing ad-hoc file access with a structured approach. New implementations include \SwiftPackageFileReader\ for reading \Package.swift\ or \Package.resolved\ files, \XcodeProjectFileReader\ which intelligently selects the most recently modified \Package.resolved\ from either the project or workspace scope, and \XcodeWorkspaceFileReader\ for reading resolution data directly from \.xcworkspace\ structures. This change enables more robust handling of Swift Package Manager files within Xcode projects and workspaces.
Sources/LicensePlistCore/Entity/FileReader · high confidence
Unified color handling and new dependency-manager support
The core library now automatically manages terminal color output based on environment variables (NO\_COLOR, TERM) and TTY status, replacing the previous manual --color/--no-color flags with a unified AutoColorMode system. Additionally, the license generation process has been extended to recognize and parse licenses from Mint, Nest, and Mise dependency managers alongside existing CocoaPods, Carthage, and Swift Package Manager support.
Sources/LicensePlistCore · high confidence
Behavioural changes
Added Xcode scheme files for LicensePlist targets
The repository now includes explicit Xcode scheme definitions for the \LicensePlist\, \LicensePlistCore\, \license-plist\, and \LicensePlist-Package\ targets. These new \.xcscheme\ files in \.swiftpm/xcode/xcshareddata/\ configure build, test, launch, and archive actions, ensuring that Xcode can correctly resolve and run these specific targets without relying on auto-generated or missing scheme configurations.
.swiftpm/xcode/xcshareddata · high confidence
Automated macOS binary artifact distribution and versioning
The Tools directory now includes scripts and templates to streamline the release of macOS binaries. A new \get-version\ script extracts the version number from the source code, while \update-artifact-bundle.sh\ automates the update of the Package.swift file with the correct download URL and SHA-256 checksum for the \LicensePlistBinary-macos.artifactbundle.zip\. Additionally, \info-macos.json.template\ defines the artifact metadata for the executable, specifying support for x86\_64 and arm64 macOS architectures.
Tools · high confidence
Core entity models and configuration parsing for license collection
The \Sources/LicensePlistCore/Entity\ module has been restructured to define the core data models and configuration parsing logic for the license generation pipeline. This includes new entity structs for \CocoaPods\, \GitHub\, \Manual\, and \SwiftPackage\ libraries, along with their corresponding license holders (\CocoaPodsLicense\, \GitHubLicense\, \ManualLicense\). The \Config\ struct now handles YAML-based configuration loading, including support for granular exclusion rules via the \Exclude\ entity and manual library definitions. Additionally, \GeneralOptions\ centralizes CLI and config file options (such as output paths, version numbers, and source inclusion), while \LicensePlistHolder\, \LicenseHTMLHolder\, \LicenseMarkdownHolder\, and \LicenseCSVHolder\ manage the serialization of collected licenses into their respective output formats.
Sources/LicensePlistCore/Entity · high confidence
New APIKit-based HTTP client with secure redirect handling
The extension layer now includes a new \APIKit.extension.swift\ that integrates the APIKit library for network requests. This introduces a \GitHubURLSessionAdapter\ that specifically forwards the HTTP Authorization header during same-host redirects, ensuring authenticated requests remain valid when the GitHub API redirects. It also provides synchronous and asynchronous request sending methods via \LicensePlistExtension\ on APIKit's \Session\, replacing previous networking implementations.
Sources/LicensePlistCore/Extension · high confidence
Refactor GitHub API client to use APIKit and native Decodable
The GitHub client implementation has been refactored to replace the previous Himotoki parsing library with Apple's native \Decodable\ protocol and the \APIKit\ networking framework. This change introduces new request structures for repository and license data, updates the base URL headers to use the \drax-preview\ API version, and implements a custom \DataParser\ for JSON decoding. Users will benefit from a more standard Swift networking stack, although this is an internal architectural shift that may affect how API responses are processed.
Sources/LicensePlistCore/GitHubClient · high confidence
Restored Xcode workspace configuration for Swift Package Manager
The project now includes the \.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata\ file, which restores the Xcode workspace structure required for opening the Swift package in Xcode. This change reverts the previous removal of the \.swiftpm\ folder, ensuring that developers can continue to use Xcode for editing and debugging the package.
.swiftpm/xcode/package.xcworkspace · high confidence
Test coverage
Added SwiftPackageManagerTestProject for license testing; Added test coverage for color mode logic, environment variables, and plugin path resolution; Added test resources for license parsing and configuration; Added unit tests for GitHub client repository and search requests; Added unit tests for LicensePlistCore entity parsing and configuration; Added unit tests for Optional and URL extension helpers; Added unit tests for Swift Package Manager and Xcode file readers.
Dependencies
Swift Package Manager dependency and toolchain update
The Swift Package Manager configuration has been updated to require Swift 6.0 and target macOS 15. The dependency list has been refreshed: swift-argument-parser is set to version 1.1.4, Yams to 6.0.2, and swift-html-entities to 4.0.1, while other dependencies like APIKit, HeliumLogger, XcodeEdit, TOMLKit, and SwiftParamTest have also been updated to their latest pinned versions. Additionally, a Package.resolved file has been added to lock these dependency versions for reproducible builds.
(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 54 → 54 (-0.3)
- Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.
Lenses
- Code Health 98 → 98 (-0.1)
- Architecture 100 → 95 (-5.0)
- Maturity 54 → 54 (+0.0)
- Readiness 51 → 54 (+3.5)
- Security 50 → 50 (+0.0)
- Accessibility 49 → 49 (+0.0)
Resolved (1)
- Off-boarding risk: anonymized user #1
New (10)
- Coverage not measured — Swift suite
- Duplicate constructor signatures with different parameter types for the same logical argument ('excludes'). One takes [String] and the other [Exclude]. This forces the caller to know which specific constructor overload to use based on input format, rather than a single entry point handling conversion or a unified type.
- Duplicated block (9 lines × 2) (Sources/LicensePlistCore/Entity/FileReader/XcodeProjectFileReader.swift)
- Inconsistent configuration loading patterns. GeneralOptions has a dedicated static 'load' method taking a Mapping, while Config relies on an initializer taking a raw String (yaml). This splits the responsibility of parsing configuration data between initializers and static factory methods inconsistently across the domain models.
- Off the main sequence: LicensePlistCore
- Off-boarding risk: anonymized user #1
- Outdated: apikit
- Outdated: swift-argument-parser
- Outdated: xcodeedit
- Outdated: yams
Changes since last survey
- 5 commits — 3 feature/other, 2 fixes
By area
- (root) — 3 commits
- Sources/LicensePlistCore — 1 commit
- tmp_licenseplist/LicensePlistBinary.artifactbundle — 1 commit
Notable commits
- fix: fix: CocoaPodsのpodspecテンプレートのdeployment_targetを更新
- fix: fix: 新しいSwiftPMのバイナリ出力パスに対応し、tmp_licenseplistをクリーンアップ
- change: 3.28.3
- change: Allow overriding SourcePackages path in build tool plugin (#263)
- change: release 3.28.3
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
mono0926/LicensePlist 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 5017fc1bbb611d3708daaba3209fdb41b9cd1de7 — 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-cb25ca4feafa.