storehound 0.2.0
storehound: ^0.2.0 copied to clipboard
Catch App Store and Google Play rejections in your Flutter project before review. A Dart CLI that lints Info.plist, privacy manifests, entitlements and AndroidManifest in CI.
Changelog #
0.2.0 #
Renamed from imaji_store_preflight. Same rules and CLI; the command is now
storehound.
- The configuration file is
storehound.yaml. An existingimaji_store_preflight.yamlis still read whenstorehound.yamlis absent, with a note to rename it. dart pub global activate storehoundalso installs animaji_store_preflightcommand for this release only; it will be removed in the next minor release.- The library import is
package:storehound/storehound.dart. - Reports name the tool
storehound: the text summary, JSONtool.name, and the SARIF drivernameandinformationUri. push-entitlementreadsCODE_SIGN_ENTITLEMENTSfrom the Xcode project when Debug and Release sign with different entitlements files: a Release file withoutaps-environmentis reported even when the Debug file has it, and so is a project where only Debug configurations sign with entitlements.android-target-sdkandandroid-16kb-page-sizeignore commented-out lines in Gradle scripts, so// targetSdk = 34above the real value is no longer reported.- A production-shaped test fixture (flavors, SwiftPM only, AGP 9, Debug and
Release entitlements, a large commented
Info.plist) that CI checks with--fail-on info. purpose-string-missingreports keys for protected APIs that a bundled native SDK only references (ITMS-90683 is a static check), listed with the newlinked_by_pluginoption or the newlinkedApiReferencestable (empty until a row has binary evidence). A CoreLocation reference asks for bothNSLocationWhenInUseUsageDescriptionandNSLocationAlwaysAndWhenInUseUsageDescription.purpose-string-qualityaccepts an honest "not used" string (says the app does not use the resource and why the key is present) without an example, recognised by its wording (extra_unused_markersadds phrases) or listed under the newlinked_onlyoption. Such a string is an error while a plugin that requests the permission is a direct dependency, and a warning when that plugin is transitive. "Not used." on its own is still an error.
0.1.2 #
- pubspec description mentions entitlements and CI.
- README: a GitHub Actions job with SARIF upload and the exit codes, so the
CI setup is on the pub.dev page; the Actions example uses
actions/checkout@v6andgithub/codeql-action/upload-sarif@v4.
0.1.1 #
Documentation and rule text only; no rule logic or CLI behaviour changes.
-
android-16kb-page-sizestates Google Play's 16 KB requirement as the Android page-sizes guide now does: apps targeting Android 15 (API level 35) or higher must support 16 KB pages on 64-bit devices, and from 1 February 2027 an update without that support cannot be released. The old text said bundles have been refused at upload since 1 November 2025; that date is the requirement's announced start, not a release block. The rule's docs link now points at the guide's "Google Play compatibility requirement" section and the announcement post; the AGP finding no longer claims older versions align to 4 KB, and the fix adds the AGP 8.0-and-olderandroid.bundle.enableUncompressedNativeLibs = falsestep from the guide. -
README: pub.dev version and pub points badges; install pinned to
^0.1.0; the GitHub Actions example activates^0.1.0and explains that a Dart-only runner cannot resolveflutter.targetSdkVersion. -
README rule table corrected against the code:
background-modes-justifiedwants anallowjustification for every mode (a linked plugin only lowers the finding to a warning);export-options-build-numberchecks App Store Connect export methods only;android-16kb-page-sizeis skipped belowtargetSdk35;privacy-manifest-present,tracking-usage-description,purpose-string-missingandpush-entitlementlist what they actually check. -
README command line:
--versionand--helplisted, every exit-code2case named, and the example summary line matches a real run. -
CONTRIBUTING: the CI commands listed as CI runs them.
0.1.0 #
First release.
- Rules engine with per-rule enable/disable (a reason is required), severity
overrides, rule options and
ignoreentries (a reason is required); configuration inimaji_store_preflight.yaml, validated with line numbers. - Text (with why/fix per rule), JSON (
schemaVersion: 1) and SARIF 2.1.0 output; exit codes 0 / 1 / 2;--fail-on,--today,--list-rules,--explain. - XML property list reader with line tracking; binary plists are refused with
a
plutilconversion hint. - iOS rules:
privacy-manifest-present,privacy-manifest-values,privacy-manifest-tracking,privacy-manifest-sdk-data,tracking-usage-description,purpose-string-missing,purpose-string-quality,background-modes-justified,export-options-build-number,bundle-localizations,push-entitlement. - Android rules:
android-picker-queries,android-target-sdk(dated Play deadline table, followsflutter.targetSdkVersioninto the Flutter SDK),android-16kb-page-size. unreadable-filefor configuration files that cannot be parsed.