Skip to content

0.4.0

Choose a tag to compare

@Luminoid Luminoid released this 26 May 01:06
· 19 commits to main since this release

[0.4.0] - 2026-05-25

Added

  • --locales flag on new app: comma-separated locale codes for the generated Localizable.xcstrings catalog. First locale is the source language; non-source entries start at state: "new" so the localization audit surfaces them as outstanding work. Default remains ["en"].
  • --category flag on new app: App Store category (e.g. public.app-category.productivity). Defaults to public.app-category.utilities. Emitted both as LSApplicationCategoryType in the Info.plist and INFOPLIST_KEY_LSApplicationCategoryType in build settings, so xcodebuild archive doesn't emit the non-fatal "No App Category is set" warning that App Store Connect rejects on upload.
  • 3-variant AppIcon skeleton: AssetGenerator.generateAppIconContents() emits three entries: no-appearance (light), luminosity: dark, and luminosity: tinted. Adopters drop PNGs in instead of restructuring the asset catalog later.
  • make build-clean target in generated Makefiles: runs xcodebuild clean build to surface warnings that incremental builds hide.
  • Persistence demo test: when SwiftData is enabled, TestGenerator.generateAppTest emits one @Test that exercises TestContext.makeContainer() + TestDataFactory.makeSampleItem(...) so adopters get a green signal on first make test and the helper APIs are referenced.
  • Compact theme via LumiKit 0.9 UIColor.lmk_dynamic: ColorCodeGenerator emits one-liner light/dark colors. Generated themes drop ~56% in line count. Requires DependencyVersion.lumiKit = "0.9.0".
  • InfoPlistGenerator options: urlIdentifier (emits CFBundleURLName in CFBundleURLTypes; defaults to bundleID) and applicationCategoryType (plumbed from --category).
  • Standard bundle-metadata keys in Info.plist: CFBundleIdentifier, CFBundleVersion, CFBundleShortVersionString, CFBundleName, CFBundleDisplayName, CFBundleExecutable, CFBundleDevelopmentRegion, CFBundleInfoDictionaryVersion, CFBundlePackageType, LSRequiresIPhoneOS.

Changed

  • GENERATE_INFOPLIST_FILE: NO in generated XcodeGen YAML when a hand-written INFOPLIST_FILE is also declared. Single source of truth instead of opaque merge precedence.
  • LSApplicationCategoryType lives in both Info.plist and XcodeGen build settings: required by xcodebuild archive to silence the non-fatal "No App Category" warning that App Store Connect rejects.
  • ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor set explicitly alongside the existing ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon so asset wiring is visible in the pbxproj.
  • MacWindow consolidated to AppConstants: SceneDelegate's Mac Catalyst block calls MacWindowConfig.configure(_:); DesignSystemGenerator no longer re-emits enum MacWindow. One canonical home (AppConstants.MacWindow) instead of three copies of the same magic numbers.
  • AppDelegate.modelContainer non-optional + fatalError on init failure: matches Apple's sample-code pattern; surfaces container-init failures at the load site instead of as misleading "no persistent stores" crashes later. The no-tabs SwiftData scaffold drops the now-dead guard modelContainer != nil.
  • disableTestParallelism gated on (coreData || swiftData) && cloudKit: plain SwiftData (no CloudKit) has no shared-repository singleton race, so it no longer pays the serial-test-execution cost.
  • -quiet on every xcodebuild invocation in generated Makefiles; per-file compile output stays out of recipes, warnings/errors still surface.
  • ColorDeriver secondary/tertiary use an analogous palette (±30° hue shift) instead of triadic (+150°/+210°). Reads as "variants of the primary" instead of jarring complementaries.
  • Generated Localizable.xcstrings is multi-locale: when --locales declares more than one, each key emits a localizations entry per locale. Source-language entries are state: "translated"; non-source entries are state: "new".

Removed

  • --features snapKit and --features lookin: removed per the v0.3 deprecation. The auto-translating shim is gone; the CLI now raises a ValidationError listing the migration (snapKit → --use-packages SnapKit, lookin → --use-packages LookinServer). AppFeature.deprecatedPackageFeatureNames replaced by KnownPackages.removedFeatureAliases.
  • monolith add snapKit and monolith add lookin: removed. Existing projects retrofit via Xcode's native Add Package flow (URLs in KnownPackages.registry). monolith add lottie is unaffected.
  • ColorDeriver.DerivedPalette.photoBrowserBackground: every derived value was identical, making the dynamic-color wrapper pointless. LumiKit 0.9's LMKTheme ships a default; generated themes omit the override.
  • DesignSystem.MacWindow: see Changed; canonical home is AppConstants.MacWindow.
  • DataPublisher.swift sample singleton from the combine feature: no real consumers, no integration coverage. generateAsyncService() (the actual reference template for Task cancellation) stays; the combine feature now writes one file.

Tests

  • 774 → 794 tests, 70 → 71 suites, zero regressions. New coverage spans --locales / --category flag plumbing, the 3-variant AppIcon skeleton, the SwiftData persistence demo test, and multi-locale xcstrings emission.