codeable_cli 1.0.38
codeable_cli: ^1.0.38 copied to clipboard
A CLI tool that scaffolds production-ready Flutter projects with Clean Architecture, BLoC/Cubit, Dio, Hive, GoRouter, multi-flavor builds, and Firebase integration.
Changelog #
1.0.38 #
Removed Spell Check from CI Pipeline #
- Removed cspell spell-check job from generated
pr_quality_gate.yaml— was producing false positives on domain-specific terms (e.g.,favorited,gorouter,imageset,snackbars) - Removed
.github/cspell.jsonfrom generated project files - Removed
cspellTemplate()function from CI templates - Existing projects: delete
.github/cspell.jsonand remove thespell-checkjob from.github/workflows/pr_quality_gate.yaml
1.0.37 #
Deployment CI/CD Integration #
- New —
make deploy-setupcommand added to Makefile for one-command CI/CD setup - Integrates with codeable-flutter-deploy for automated TestFlight (iOS) and Firebase App Distribution (Android) builds
- Auto-clones the deploy tool if not already installed
- README updated with deployment section explaining the automated CI/CD workflow
- Push to
develop-releasefor dev builds,productionfor prod builds — both platforms build automatically
1.0.36 #
CI/CD Pipeline — Built-in Quality Gate #
- New — every generated project now ships with a full CI/CD pipeline out of the box
- GitHub Actions workflow (
pr_quality_gate.yaml) runs on PRs todevelop/dev/developmentwith 5 jobs: semantic PR title, format check, flutter analyze, custom code quality rules, and build verification - Code quality script (
scripts/code_quality_check.sh) enforces 33 project-specific rules across 9 categories: state management, view/widget structure, resource disposal, architecture, enums/type safety, custom components, code quality, imports, and naming conventions - PR template with type-of-change checkboxes and quality checklist
- Dependabot config for weekly dependency updates (GitHub Actions + pub)
make checktarget added to Makefile — runs format + analyze + quality script in one command- Script only checks changed files in PRs (not the entire codebase), so existing projects can adopt incrementally
- Pre-push hook only blocks pushes to
develop/dev/development— feature branches are unrestricted - GitHub Actions annotations: violations appear inline on PR diffs
Rules Enforced #
- No
setState()(use Cubit), no try-catch in cubits,buildWhen/listenWhenrequired - No
_buildXyz()methods or private classes in views, view files under 1000 lines - Controllers/timers must have
dispose() - No raw
AlertDialog,ElevatedButton,SnackBar,DateFormat,print(),Color(0x...) - No
// ignore:suppressions, one class per file, repos must useexecute() - Package imports only, snake_case file names
- Warnings for large files, duplicate widgets, commented-out code, cross-feature imports
1.0.35 #
CustomButton — Single Widget, Five Factories #
- Removed
CustomOutlineButton— folded intoCustomButton.tertiary. Generated apps now have a single button widget with five named factories instead of three separate widgets CustomButton.primary— black filled, default brand action (unchanged)CustomButton.secondary(new) — filled inAppColors.secondaryMain, alternate brand actionCustomButton.tertiary— outlined (white bg, black border), takes the slot the oldCustomButton.secondaryused to fillCustomButton.danger(new) — red filled for destructive actions (delete, leave, cancel subscription)CustomButton.text— text-only ghost button (was previouslyCustomButton.tertiary)- Removed redundant
loadingColorfield — usestextColordirectly - Added
alignPrefixStartandcenterContentflags for finer layout control - Smarter disabled fallbacks:
disabledBackgroundColor ?? backgroundColor.withValues(alpha: 0.4)instead of hardcodedblackPrimary - All factories are now
const-correct socialAuthButtonTemplateupdated to use.tertiary(the new outlined slot)
CustomTextField — Cleaner API & Focus Shadow #
- Removed the
TextFieldIconConfigindirection — prefix/suffix are now inlineWidget?props - Added subtle focus shadow via
DecoratedBox(blackPrimaryglow at 15% alpha) to signal active state without changing the fill color - Smart
textCapitalization(none for emails, sentences elsewhere) and smarttextInputAction(multiline → newline, search → search, else done) - Password eye toggle now uses
Icons.visibility/Icons.visibility_offinstead of the brokendummyIconplaceholder - Border-radius default dropped from
100(pill) →12(rounded rect); description multi-line stays18 - Border palette:
borderPrimary(idle/disabled) →blackPrimary(focused) →error. Removed the focus-bg-swap totextFieldBackground— focus is signaled by border + shadow - Fixed broken
context.captionreference (didn't exist in the dual-font setup) — now usescontext.captionMedium
New Widgets — UserAvatar & Improved CachedImage #
- Added
UserAvatar— circular avatar with deterministic gradient (seeded byuser.idso each user gets a stable color), optional photo viaCustomCachedImageWidget, andisLoadingoverlay for upload state. Falls back to initials when the photo URL is invalid or fails to load CustomCachedImageWidgetgained anerrorFallback: Widget?parameter so callers (likeUserAvatar) can render a custom widget on load failure instead of the generic placeholder. Empty-URL and image-error fallbacks now both useSvgPicture.asset(AssetPaths.imageIcon)with aneutral700color filter- Bundled
image_icon.svgintolib/src/assets/svgs/so the error fallback ships out of the box — no missing-asset crashes in fresh projects
App Theming — Android 15 SafeArea & Theme Polish #
AppViewis now aStatefulWidgetthat queriesdevice_info_pluson launch — on Android SDK 35+ (Android 15, edge-to-edge by default) it wraps theMaterialApp.routercontent inSafeAreaso content doesn't draw under the status/nav bars. iOS and older Android keep their existing layout- Added
canvasColor: AppColors.backgroundPrimarytoThemeDataso page transitions don't flash white
AppColors Additions #
secondaryMain(#454545) — fill forCustomButton.secondary; swap to brand accentblackPrimaryShade(#000000) — darker companion for blackPrimary gradientsneutral700(#979A9C) — mid-dark gray for icons on placeholdersavatarGradients— six gradient pairs used byUserAvatar(first is brand default, rest deterministically picked byseed.hashCode)
API Layer — Cancel Token Support #
- All
ApiServicemethods (get,post,put,patch,patchMultipart,delete) now accept an optionalCancelToken? cancelToken._handleRequestrethrowsDioExceptionType.cancelinstead of wrapping it inAppApiException deletenow also accepts an optionaldatabodyRepositoryResponsegained anisCancelledflag;execute()catchesDioExceptionof typecanceland returnsRepositoryResponse(isSuccess: false, isCancelled: true)so cubits can no-op cancelled requests cleanlyRepositoryResponseandAppApiExceptionnow carry an optionaldetails: List<dynamic>?field for structured error payloads- Generated
featureCubitTemplateships with a_cancelTokenfield,close()override, and an example cancellation pattern in comments
ToastHelper — Match Holos Exactly #
- All three toasts (
error,success,info) now hide the close-X chip viacloseButton: const ToastCloseButton(showType: CloseButtonShowType.none)sincecloseOnClickanddragToClosealready handle dismissal - Error toast's SVG icon now wears
colorFilter: ColorFilter.mode(AppColors.white, BlendMode.srcIn)so it renders white on the red background - Outer padding switched from
EdgeInsets.symmetrictoEdgeInsetsDirectional.symmetricfor proper RTL handling
AppLogger — Headers & Auth Token #
- Added
AppLogger.authToken(String?)— pretty-prints the bearer token in a boxed format for debug-only flows - API request logging now omits the
Authorizationheader entirely instead of partially masking it (xxx...) — cleaner request logs DataState<T>gained amap<R>(R Function(T))transformer for cubit-side projection without losing status/error context
FirebaseNotificationService — Cleanup #
- Replaced all
debugPrintcalls withAppLogger.info/AppLogger.error(with stack traces) - Added
onTokenRefreshstream getter andhandleInitialMessage()for cold-start notification taps - Foreground messages now route through
LocalNotificationServiceso banners actually show — previously left as a TODO - Removed
setForegroundNotificationPresentationOptionscall on iOS — was causing duplicate banners (system + flutter_local_notifications)
Generated .gitignore — Mirror Holos #
- New
gitignore_template.dartoverwrites Flutter's default.gitignoreafterflutter createwith the holos-standard set:.swiftpm/,.history,migrate_working_dir/,app.*.symbols,app.*.map.json,/android/app/{debug,profile,release},/coverage/,/env/,**/*.jks,**/*.keystore,**/android/key.properties, etc. - The CLI's existing
.idea/runConfigurations/whitelist append still runs on top, preserving the IDE-config-commit behavior
Text Style System — Dual Font with Weight Variants #
- Switched the text-style extension to a structured size + weight system across two fonts (
AppFonts.heading= BBBPoppins fordisplay/h1–h5,AppFonts.body= SFProRounded forp1/p2/caption/overline) - Each size has three weight variants:
h1/h1Medium/h1Bold,p1/p1Medium/p1Bold,caption/captionMedium/captionBold - Added
display(43, w400, heading font),overline(10, w400, body font), andletterSpacingparameter to the private style builders - New text style modifiers:
.primary,.secondary,.light,.hint(replaces the old.secondary/.tertiarypair) - All template references migrated from old
b1/b2/l2getters to newp1Medium/p2/captionMedium
New Generated File — String Extensions #
- Added
lib/utils/extensions/string_extensions.dartwith atitleCasegetter (splits on_or whitespace, capitalizes each word)
AI Config (CLAUDE.md / .cursorrules) — Major Enrichment #
Pulled in everything generated apps were previously missing:
- Layer Rules — explicit dependency direction (
presentation → domain ← data) - When to Create a Separate Feature decision rule
- Shared Models —
core/models/common/for cross-feature models - Full State Pattern code example —
Equatable+DataState<T>wrapping +copyWithtemplate - Custom Components — MANDATORY section listing every banned raw widget/API and the required replacement, including the new
CustomCachedImageWidgetandUserAvatarbans - Full Enums & Extensions code example with
displayName/color/fromStringswitch patterns - Naming conventions — file/class/variable/constant/enum casing rules
- Imports — package imports only, no relative paths
- AppLogger.error requirement in repository error handling
- SafeArea documentation — explains the
AppViewAndroid 15 behavior so AI doesn't add manualSafeAreaper screen - Quick Reference Checklist — 22-item review checklist for self-audit
- Updated
CustomButtonfactory list (5 variants) andCustomTextFieldfactory list across both AI configs - Updated text-style docs to reflect the dual-font setup with all size + weight variants enumerated
CLI Commands #
create: app-name prompt now defaults to Title Case (my_app→ "My App") instead of PascalCase ("MyApp"), matching what users typically type for the human-readable display namechange-app-name: now scanslib/l10n/recursively for.arbfiles instead of just the top level — picks up files inarb/subfolders that the new project layout uses- Added
TemplateEngine.toTitleCase()helper
Dependency Updates (generated pubspec.yaml) #
bloc^9.2.0 → ^9.2.1dio^5.9.1 → ^5.9.2go_router^17.2.0 → ^17.2.3firebase_core^4.6.0 → ^4.8.0firebase_messaging^16.1.3 → ^16.2.1firebase_remote_config^6.3.0 → ^6.5.0sign_in_with_apple^7.0.1 → ^8.0.0 (major)purchases_flutter^9.16.1 → ^10.0.2 (major)flutter_svg^2.2.4 → ^2.3.0image_picker^1.2.1 → ^1.2.2toastification^3.1.0 → ^3.2.0device_info_plus^12.3.0 → ^12.4.0build_runner^2.11.1 → ^2.15.0envied_generator^1.3.4 → ^1.3.5- Removed:
firebase_auth,cloud_firestore,firebase_storage(add per project) - Removed:
lottie,blur,flutter_swipe_button(add per project)
1.0.34 #
iOS Signing — Strip Host Machine's DEVELOPMENT_TEAM #
- Fixed
flutter createbaking the host machine'sDEVELOPMENT_TEAMID into every Runner build configuration of the generatedproject.pbxproj. Previously this leaked whichever Apple Developer Team was active on the machine that ran the CLI into all 9 flavor configs (Debug/Release/Profile × production/staging/development), pinning every developer who later opened the project to a team they didn't own - The flavor build-configuration generator now strips the
DEVELOPMENT_TEAM = ...;line when it duplicates the original Runner blocks, so each flavor opens in Xcode withTeam: Noneand developers can pick their own team via "Automatically manage signing"
1.0.33 #
Logging Overhaul — Zero-Dependency AppLogger #
- Replaced the
loggerpackage-basedAppLoggerwith a zero-dependency implementation usingdebugPrintdirectly — no external packages needed AppLoggernow includes API-specific logging methods:apiRequest(),apiResponse(),apiError()with pretty-printed JSON, box-drawing borders, elapsed time display, and authorization header masking (first 15 chars only)- General logging uses
debugPrint(notprint) to avoid dropped lines on Android, with filtered stack traces (excludesdart:,flutter/,bloc/,dio/frames, max 5 frames) - Removed
logger: ^2.6.2from generated project dependencies
Log Interceptor — Uses AppLogger API Methods #
- Replaced raw
print()calls inLoggingInterceptorwithAppLogger.apiRequest/apiResponse/apiErrormethods - Added request timestamp tracking via
_timestampsmap for elapsed time calculation on every response/error - Added smart error message extraction: checks
response.data.error.message, thenresponse.data.message, thenerr.message
API Response Parser — Enhanced with Key Access & Value Parsing #
- Added private
_extractData()helper to DRY up data extraction from the{"data": ...}envelope parse()andparseList()now accept an optionalkeyparameter for accessing nested objects/lists within the data envelope (e.g.response.data.data.profile)- Added
parseValue<T>()method for extracting single primitive values by key (e.g.total_count,has_more)
Dependency Updates #
- Removed
loggerpackage (replaced by zero-dependency AppLogger) flutter_local_notifications^20.1.0 → ^21.0.0 (major)camera^0.11.4 → ^0.12.0+1 (minor)firebase_core^4.4.0 → ^4.6.0firebase_messaging^16.1.1 → ^16.1.3firebase_remote_config^6.1.4 → ^6.3.0go_router^17.1.0 → ^17.2.0purchases_flutter^9.12.2 → ^9.16.1envied/envied_generator^1.1.1 → ^1.3.4toastification^3.0.3 → ^3.1.0flutter_svg^2.2.3 → ^2.2.4lottie^3.3.2 → ^3.3.3video_player^2.11.0 → ^2.11.1
1.0.32 #
iOS UIScene Lifecycle — Use Official Flutter APIs #
- Breaking fix: Replaced manual
FlutterEnginecreation inAppDelegate.swiftwith the official Flutter 3.41+FlutterImplicitEngineDelegateprotocol — the previous approach caused a black screen on startup because the engine wasn't connected to the Flutter view AppDelegatenow conforms toFlutterImplicitEngineDelegateand registers plugins viadidInitializeImplicitFlutterEngine(_:)instead of manually indidFinishLaunchingWithOptionsSceneDelegatenow subclassesFlutterSceneDelegate(a single empty subclass) instead of manually creatingFlutterViewControllerand wiring the engine — Flutter handles this internally- Info.plist
UIApplicationSceneManifestunchanged (already correct from 1.0.31) - Reference: https://docs.flutter.dev/release/breaking-changes/uiscenedelegate
1.0.31 #
iOS UIScene Lifecycle Migration #
- Added
AppDelegate.swifttemplate — creates aFlutterEngineeagerly and registers plugins, replacing the default Flutter-generated AppDelegate that uses the oldUIApplicationDelegatelifecycle - Added
SceneDelegate.swifttemplate — implementsUIWindowSceneDelegateto manage the app window viaUIWindowScene, using the FlutterEngine from AppDelegate - Info.plist already included
UIApplicationSceneManifestwith SceneDelegate reference (added in a prior version) — now the corresponding Swift files are generated to match - This ensures all new projects are compatible with upcoming iOS versions that require UIScene lifecycle support (see https://flutter.dev/to/uiscene-migration)
1.0.30 #
Bug Fixes #
change-id: iOS bundle identifier update now preserves flavor suffixes (.dev,.stg, etc.) across Debug/Release/Profile configurations instead of collapsing every flavor to the same new id. The command detects the current base bundle id (shortest Runner entry) and rebases it on the new id while keeping the per-flavor suffix and the.RunnerTestssuffix intact.
1.0.29 #
IDE & Build Configuration #
- Fixed
.idea/runConfigurations— removed leading newline from XML templates that prevented Android Studio/IntelliJ from parsing run configurations for development, staging, and production flavors - Added
Makefileto generated projects with--obfuscate --split-debug-info=build/debug-infoflags on all release builds (APK, App Bundle, IPA for all flavors) - Makefile includes
make help, run/build/clean/lint/format/test targets, and code generation commands (gen-l10n,gen-splash,gen-icons)
New CLI Command: bottom-sheet #
- Added
codeable_cli bottom-sheet <name> --feature <path> --type <type>command - Generates a bottom sheet widget inside an existing feature's
presentation/widgets/directory - Four types:
action(list of actions),confirmation(confirm/cancel),form(with inputs),custom(empty template) - Auto-discovers features via interactive picker when
--featureis not provided - Uses the project's
CustomBottomSheetcore widget
Project Structure Improvements #
- Added
.gitkeeptofirebase/{development,staging,production}/directories so they're tracked by git /env/folder is gitignored —.env.development,.env.staging,.env.productionfiles are created locally but not committed.idea/runConfigurations/is whitelisted in.gitignoreso development, staging, and production run configs are committed and available on clone
1.0.27 #
New Core Widgets #
- Added
FormBuilderwidget — drives button disabled state reactively fromTextEditingControllerlist usingListenableBuilder+Listenable.merge(no setState, no cubit needed for form validity) - Default validation: all fields non-empty. Custom validation via optional
validatorcallback - Added
CustomOtpFieldwidget — single hidden TextField approach for zero keyboard flicker, auto-paste support, blinking cursor, configurable length/size/colors/haptics - Added
form_builder.dartandotp_input_field.dartto core widgets export barrel
CustomTextField Fixes #
- Removed hidden
errorStyle(TextStyle(height: 0, fontSize: 0)) that suppressed Flutter's native validation error messages - Removed custom
ValueListenableBuildererror display below the field - Validation now uses Flutter's native
Form+TextFormFieldsystem — error messages appear automatically when_formKey.currentState!.validate()is called
1.0.26 #
Envied-Based Secret Management #
- Replaced
ApiEnvironmentenum withenvied-basedAppEnvpattern - Per-flavor
.envfiles in gitignoredenv/folder (env/.env.development,env/.env.staging,env/.env.production) - Per-flavor env dart files in
lib/config/env/with@Enviedannotations and XOR obfuscation for API keys AppEnvresolver class picks the correct env based on current flavor- Added
enviedto dependencies andenvied_generatorto dev_dependencies
Build Security & Obfuscation #
- Added
Makefilewith--obfuscate --split-debug-info=build/debug-infofor all release build targets - Android release builds now use
shrinkResources trueandproguard-android-optimize.txt - Consistent build commands:
make apk-prod,make bundle-prod,make ipa-prod
Template Updates #
EndpointsandSocketServicetemplates now useAppEnvinstead ofApiEnvironment- Updated README template with envied setup documentation
- Updated AI config templates (CLAUDE.md, .cursorrules) with new env pattern
1.0.25 #
Centralized execute() Error Handling #
- Added
execute()helper function toRepositoryResponsetemplate for unified error handling in repositories - Repository implementation templates now use
execute()pattern — no manual try-catch needed - Callbacks return
Tdirectly;execute()wraps the result inRepositoryResponse<T> execute()catchesAppApiExceptionfor expected errors and logs unexpected errors viaAppLogger
ApiService Logging #
- Replaced
debugPrintwithAppLogger.errorinApiService._handleRequestand_handleDioError - Removed
flutter/material.dartimport from ApiService (was only needed fordebugPrint) - Added
logger_helper.dartimport to ApiService template
AI Config #
- Updated CLAUDE.md and .cursorrules templates with
execute()pattern documentation
New Utility Helpers #
- Added
haptic_helper.dart— semantic haptic feedback (success, error, tap, toggle, destructive) - Added
url_helper.dart— launch maps with coordinates (iOS/Android), launch websites - Added
responsive_helper.dart— device type detection, responsive values, font/padding/spacing scaling, context extensions - Added
image_conversion_helper.dart— convert XFile images to base64 data URIs - Added
phone_number_parser.dart— parse international phone numbers into country code + national number - Added
extract_file_from_url_helper.dart— extract filename from URL - Added
price_formatter.dart— format price (strips .00, keeps decimals otherwise)
1.0.23 #
Error Handling #
- Network errors (no WiFi, DNS failure, timeout) now show user-friendly messages instead of raw Dio/SocketException text
ApiService._handleDioError()mapsDioExceptionTypeto clean messages (connection timeout, no internet, cancelled)- Backend error messages pass through unchanged — only system-level errors are sanitized
- Repository pattern enforced: only catch
AppApiException, no genericcatch (e)blocks - Cubits no longer have try-catch — error handling belongs exclusively in the repository layer
Resilient List Parsing #
- List parsing in
fromJsonnow uses safe pattern:whereType<Map<String, dynamic>>()+ per-item try/catch - If 1 item in a list of 100 has bad data, the other 99 parse successfully — no more full-list crashes
- Updated
ResponseDataParser, AI config templates, and all model generation instructions
Claude Plugin #
- Updated error-handling and dio-patterns skills with new patterns
- Updated add-api, add-model, add-pagination, and add-cache commands with safe list parsing
1.0.22 #
WebSocket Support #
- Added
SocketServicewith auto-reconnect, token-based auth, room join/leave, and typed broadcast streams (lib/core/socket_service/) - Added
SocketStatusenum (disconnected,connecting,connected,reconnecting,error) SocketServiceauto-registered as singleton in DI viaAppModule._setupSocketService()- Added
socketUrlfield toApiEnvironment— per-flavor WebSocket URLs configured out of the box - Added
web_socket_channel: ^3.0.3to generated pubspec dependencies
Logger Upgrade #
- Replaced basic
PrettyPrinterwith custom_AppLogPrinter— emoji level indicators, ANSI color codes, timestamps, and tree-style stack traces - Log levels: TRACE, DEBUG, INFO, WARN, ERROR, FATAL with distinct colors
- Automatic filtering:
DevelopmentFilterin debug,ProductionFilterin release
AI Config #
- CLAUDE.md and .cursorrules now document WebSocket and logging patterns
- Added
websocket-patternsskill to Codeable Claude Plugin
1.0.21 #
Branding #
- PNG banner with raw GitHub URL for pub.dev rendering (SVGs not supported on pub.dev)
1.0.20 #
Branding #
- Added branded banner SVG matching Codeable design system (dark purple gradient, logo, lime accent pills)
1.0.19 #
Fixes #
- Plugin marketplace source now uses HTTPS URL instead of SSH — plugin installs on any machine without SSH key setup
- Updated plugin version to 1.1.1
1.0.18 #
New CLI Commands #
- Added
doctorcommand — checks project health (cubit registration, route wiring, import consistency, localization key parity across ARB files) - Added
remove-featurecommand — safely removes a feature and unwires its cubit, routes, and imports (inverse offeature) - Added
add-localecommand — adds a new language/locale ARB file with TODO placeholders from the English reference
Branding #
- Updated README with Codeable branding (lime/purple badge strip, dynamic pub.dev version badge, wordmark footer with dark/light mode)
- Added Codeable wordmark SVG assets
New Claude Plugin Skills (10 skill templates) #
add-model— Generate data models with fromJson/toJson/copyWith/Equatableadd-pagination— Wire paginated API calls using PaginationModel in cubit state with PaginatedListViewadd-form— Generate validated form screens with CustomTextField, FieldValidators, and cubit submissionadd-di— Register services/repositories in GetIt dependency injectionadd-hive-model— Generate Hive TypeAdapter models with auto TypeId assignmentadd-test— Generate cubit and repository unit tests with mocktail and bloc_testadd-bottom-nav— Wire bottom navigation with GoRouter ShellRouteadd-interceptor— Add custom Dio interceptors to ApiServiceimplement-screen— Build screens from description/Figma using core widgets and project patternsadd-firebase-config— Configure Firebase for all 3 flavors usingflutterfire configure
1.0.17 #
- Auto-install Codeable Flutter CLI Claude Plugin in generated projects via
.claude/settings.json - New projects get all commands, skills, agents, and hooks from the plugin automatically — no manual setup needed
- Removed inline
.claude/commands/files (localize, fix-rtl, add-api, add-cubit-state) — the plugin now provides these and more
1.0.16 #
- Added
pageTransitionsThemetoThemeDatawithFadeForwardsPageTransitionsBuilderfor smooth Android page transitions
1.0.15 #
featurecommand no longer auto-prompts for role selection when multiple role directories exist- Role selection is now opt-in: use
--role <name>to specify a role directly, or--pick-role(-R) to interactively choose from existing role directories - Without
--roleor--pick-role, features are created directly inlib/features/ - Added
Localizationstatic service (lib/l10n/localization_service.dart) for accessing localized strings withoutBuildContext Localization.keyNameworks anywhere (validators, formatters, models);context.l10n.keyNameremains preferred in widgetsl10n.dartbarrel file now exportslocalization_service.dartso a single import gives access to bothcontext.l10nandLocalizationAppViewbuilder auto-updates theLocalizationservice on every locale change- Added
/localizeClaude Code slash command (.claude/commands/localize.md) that auto-localizes an entire feature directory - Fixed all remaining
EdgeInsets.only(left/right)andEdgeInsets.fromLTRBin templates to useEdgeInsetsDirectionalfor proper RTL support - Added
/fix-rtlClaude Code command to migrateEdgeInsetstoEdgeInsetsDirectionalin existing projects - Added
/add-apiClaude Code command to wire up a new API endpoint end-to-end through all architecture layers - Added
/add-cubit-stateClaude Code command to add new state fields and cubit methods to existing features - Updated CLAUDE.md and .cursorrules templates with localization pattern documentation
1.0.14 #
- Chucker Flutter network inspector is now only active in the development flavor (disabled in staging and production)
1.0.13 #
- Suppressed Java 8 source/target deprecation warnings globally via root
build.gradle.kts - Disabled automatic signing in iOS (ProvisioningStyle = Manual) so Xcode doesn't pre-select a team
1.0.12 #
- Added
change-app-namecommand to update app display name across Android, iOS, l10n, and constants - Updated all dependency versions to latest (Firebase 4.x, GoRouter 17.x, get_it 9.x, etc.)
- Fixed staging/development flavors using PascalCase instead of app display name
- Moved
updatecommand documentation near Installation in README
1.0.11 #
- Added
--app-nameoption tocreatecommand for setting the app display name separately from the project name - Toast helper now uses custom SVG icons (success, error, info) instead of Material Icons
- Removed
showWarningToastfrom toast helper CustomSocialAuthButton.iconPathis now required- Login screen includes emblem logo and social auth icons out of the box
- Bundled all SVG assets (search, filter, dropdown, tick, star, social auth, emblem, codeable logo)
- Cleaned up
AssetPaths— removed unused entries, fixed duplicateerrorIcon - README code blocks split for easier copying
1.0.8 #
- Flavor display names now use suffix format:
MyApp [DEV],MyApp [STG] - Added
kotlin-stdlib:2.2.10dependency to Android build.gradle.kts - Suppressed Java 8 source/target deprecation warnings from dependencies
- Removed home screen navigation from splash (logs auth token only)
1.0.7 #
- Added shell navigation scaffolding (StatefulShellRoute, AppNavigation, NavItem model) — commented out with placeholder values for easy activation
- Added bundled
arrow_left_icon.svgfor app bar back button - iOS flavor builds fully configured (xcschemes, 27 build configurations, per-flavor bundle IDs and app names)
- Per-flavor app icons for iOS (AppIcon-dev, AppIcon-stg) and Android (development/staging source sets)
- Bundled BBBPoppins (headings) and SFProRounded (body) fonts with updated text styles
- Run configurations moved to
.idea/runConfigurations/withbuildFlavoroption for Android Studio - Fixed app crash from MainActivity namespace mismatch (
_relocateMainActivity) - Added
UIApplicationSceneManifestandITSAppUsesNonExemptEncryptionto Info.plist - Firebase packages kept active in pubspec (initialization remains commented out in DI)
- Centered app bar title by default, no leading image when back button is hidden
1.0.6 #
- Fixed
--versionflag to report correct version - Keystore now uses
<project_name>-keystore.jksfilename and<project_name>-alias - Keystore password set to
androidby default
1.0.5 #
- Fixed repository and issue tracker URLs to point to the correct GitHub repo
- Shortened package description to meet pub.dev guidelines (60-180 characters)
- Added example file for pub.dev documentation score
1.0.4 #
- All Codeable links now point to gocodeable.com
- Added custom Codeable logo to README badge
1.0.2 #
- Revamped README with Table of Contents, FAQ, contributors section, and improved formatting
- Updated project structure docs (removed deprecated guards directory)
- Updated feature command docs to reflect auto-wiring behavior
1.0.1 #
featurecommand now auto-wires everything: registers cubit inapp_page.dart, adds route togo_router, and adds route constants- Generated feature screens include
customAppBarandBlocBuilderout of the box - Repository implementations now include both
ApiServiceandAppPreferences(cache) - Removed deprecated
legacyCustomAppBarfrom templates - Removed unnecessary
.gitkeepfrom feature widgets folder
1.0.0 #
- Initial release
createcommand: Scaffold a complete Flutter project with Clean Architecture, BLoC/Cubit, Dio, Hive, GoRouter, and multi-flavor buildsfeaturecommand: Generate feature modules with data/domain/presentation layersrenamecommand: Rename the project across all files and configurationschange-idcommand: Update the app/bundle identifiersamplecommand: Add sample features with pre-built UI components- 30+ production-ready reusable UI components
- Firebase setup with per-flavor configuration
- Android keystore generation
- AI-assisted development config (CLAUDE.md, .cursorrules)
- Localization support with ARB files