flutist 3.0.0
flutist: ^3.0.0 copied to clipboard
A Flutter project management framework inspired by Tuist
Changelog #
All notable changes to Flutist will be documented in this file.
3.0.0 - 2026-04-13 #
๐ฅ Breaking Changes #
-
ModuleTypeโScaffoldTyperenameModuleTypeenum is removed. UseScaffoldTypeinternally (create-time only).ScaffoldTypeis never written toproject.dartorpackage.dart.
-
Module.typefield removed- The
type:field inModule(...)is no longer valid. - If
project.dartcontainstype: ModuleType.xxx, parsing will fail with a migration error. - Migration: Remove all
type: ModuleType.xxx,lines fromproject.dart.
- The
-
--options simpleremoved fromflutist create- Omitting
--optionsnow creates a single package by default (was--options simple). --optionsacceptsclean,micro,liteonly.
- Omitting
โจ New Features #
-
B6: Layer dependency auto-wiring on
flutist create- Layer packages are automatically wired in
project.dartbased on scaffold type:clean:presentation โ domain,data โ domain(both independently depend on domain)micro:implementation/testing โ interface,tests/example โ implementation + testinglite:implementation/testing โ interface,tests โ implementation + testing
- Layer packages are automatically wired in
-
flutist scaffoldenhancement- Custom attribute CLI: Attributes defined in
template.yamlare now passed via--<attribute> value - Filter system:
{{name | snake_case}},{{name | pascal_case}},{{name | camel_case}},{{name | upper_case}}(legacy{{Name}},{{NAME}}shorthands are still supported) - Conditional generation: Items support
if: "attribute == 'value'"to skip files conditionally stringitem type: Define file contents inline intemplate.yamlwithout an external.templatefile--pathfix in simple mode:--pathis now respected as the output base directory
- Custom attribute CLI: Attributes defined in
-
D3:
flutter testvsdart testauto-detectionflutist testautomatically selectsflutter testordart testper module.- Detects Flutter packages by checking the module and its path dependencies recursively โ test-only packages that depend on Flutter implementation packages are correctly identified without requiring
flutter_testin their ownpubspec.yaml.
-
Architecture Checker: explicit tests for
_implementation โ _testingrule- Added tests verifying that
_implementationmust never depend on_testing, even within the same feature (enforced via the existingtesting_referencerule).
- Added tests verifying that
๐ Fixed #
flutist init: Removedtype: ModuleType.simplefrom generatedproject.darttemplateflutist init: Removed hardcoded example dependencies (intl,test) frompackage.darttemplateflutist init: Addedflutter: uses-material-design: trueto rootpubspec.yamlโ without this,Icons.*render as?at runtimeflutist scaffold: Example template replaced with neutral StatelessWidget/StatefulWidget (noflutter_blocdependency)
๐ Migration from 2.x #
Remove type: from all Module(...) entries in project.dart:
// Before (2.x)
Module(
name: 'auth_domain',
type: ModuleType.clean, // โ remove this line
dependencies: [],
modules: [],
),
// After (3.0.0)
Module(
name: 'auth_domain',
dependencies: [],
modules: [],
),
If type: remains, flutist generate / flutist check will print a clear error
pointing to this CHANGELOG.
2.1.0 - 2026-04-07 #
โจ New Features #
flutist init: New/existing project selection- Choose between new project creation or existing project migration during init
- Existing project: skip app module creation, skip workspace app entry, generate empty project.dart/package.dart
flutist pub add: Multi-package support- Add multiple packages at once with
flutist pub add http dio
- Add multiple packages at once with
- Template usage guide comments for existing projects
- Added 3-step workflow comments and examples to
project.dartandpackage.dart
- Added 3-step workflow comments and examples to
๐ Fixed #
flutist create: Fixed missing module name in simple module path (packages/โpackages/core)flutist create: Warn and exit when layer module name suffix is entered redundantlyflutist create: Warn and exit when last path segment matches the module name (nested path detection)flutist create: Auto-generate barrel file (lib/module_name.dart) when creating a moduleflutist generate: Cross-path module dependency resolution โ removed hardcoded basePaths, now resolved dynamically via workspace scanflutist generate: Preserve all SDK dependencies includingflutter,flutter_localizations, etc. (previously onlyflutterwas preserved)flutist init: Do not overwritelib/main.dartif it already existsflutist init: Do not overwriteanalysis_options.yamlif it already existsflutist init: Workspace entries are now added in block style (- path/to/module)flutist pub add: Fixed format corruption where],was appended on the same line on repeated runsflutist pub add: Fixed duplicate output ofGenerated flutist_gen.dartmessageflutist scaffold: Fixed bug where--pathoption existed in docs but did not actually workflutist test: Print full stdout/stderr without keyword filtering on failure- Architecture Checker: Allow
_exampleand_testsof the same feature to depend on_implementationand_testing(Tuist microfeature standard)
๐ง Changed #
strictModebehavior change: Architecture violations are always detected and reported even whenstrictMode: false.strictModeonly controls whether to abort on violationstrue(default): Abort generate/check when violations are found (exit 1)false: Print violations and continue (intended for migration transition period)
๐ Documentation #
- README: Added notes on SDK dependencies and Flutter build configuration
- README: Documented directory structure per module type
- README: Documented init workflow for new and existing projects
2.0.0 - 2026-03-30 #
๐ Breaking Changes #
- Module Type Renaming:
featureโclean(Clean Architecture: Domain / Data / Presentation)libraryโmicro(Microfeature Architecture: Example / Interface / Impl / Tests / Testing)standardโlite(Microfeature lite: Interface / Impl / Tests / Testing)simpleremains unchanged
- Lite module now has 4 layers (was 3):
- Added Interface layer for dependency inversion
- New structure: Interface / Implementation / Tests / Testing
โจ New Features #
-
flutist checkcommand: Validates architecture rules for module dependencies- Implementation direct reference detection (with compositionRoots exception)
- Circular dependency detection
- Testing/Example layer reference restrictions
- Clean module layer direction enforcement
-
ProjectOptionsconfiguration:strictMode(default:true): Enforces architecture rules duringflutist generatecompositionRoots(default:['app']): Modules allowed to reference Implementation directly
-
Architecture validation in
flutist generate:- When
strictMode: true, generation aborts if violations are found - When
strictMode: false, generation proceeds without validation
- When
-
flutist testcommand: Run tests across all modules in parallel- Automatically finds modules with
test/directories --module <name>option to test a specific module- Aggregated pass/fail summary with exit code 1 on failure
- Automatically finds modules with
๐ง Refactored #
- Removed unused
template.dart(Template, Attribute, TemplateItem classes) - Added
ModuleType.fromString()to replace 3 duplicate_parseModuleTypemethods - Added
StringCaseutility class for shared case conversions - Extracted
ProjectParserfromGenerateCommandfor shared parsing - Merged
checker/,generator/,parser/into unifiedengine/directory - Reused
GenFileGenerator.parsePackageDart()across commands
๐งช Tests #
- Added unit test suite (61 tests):
StringCasecase conversion + round-trip verificationModuleType.fromString()validation + old name rejectionArchitectureCheckerall 5 rules + edge casesProjectParserfile I/O + options parsingGenFileGeneratorpackage.dart parsing + round-trip verification
๐ฆ Migration Guide #
Update all references to old module type names:
// Before (1.x)
Module(name: 'login', type: ModuleType.feature)
Module(name: 'network', type: ModuleType.library)
Module(name: 'models', type: ModuleType.standard)
// After (2.0.0)
Module(name: 'login', type: ModuleType.clean)
Module(name: 'network', type: ModuleType.micro)
Module(name: 'models', type: ModuleType.lite)
Update CLI commands:
# Before
flutist create --options feature
# After
flutist create --options clean
1.1.3 - 2025-01-02 #
๐ Documentation #
- Simplified README.md to core content (removed detailed documentation for future docs site)
- Added Docs badge with book icon linking to DeepWiki documentation
- Updated all documentation links to https://deepwiki.com/seonwooke/flutist
- Updated pubspec.yaml documentation field to point to DeepWiki
1.1.2 - 2025-01-02 #
๐ Documentation #
- Updated README.md version badge to reflect current version (1.1.1)
- Fixed project structure documentation:
- Corrected
main.dartlocation toroot/lib/main.dart(was incorrectly shown inapp/lib/main.dart) - Clarified that
app.dartbelongs inapp/lib/app.dart
- Corrected
- Removed
dart testsection from Development Setup (tests not yet implemented) - Fixed duplicate
lib/directory in project structure example
1.1.1 - 2025-01-02 #
โจ Added #
- Clean Architecture example repository:
- Added link to
flutist_clean_architecturerepository in README.md Examples section - Added Real-World Examples section to example/README.md
- Showcases Clean Architecture implementation using Flutist
- Added link to
๐ง Improved #
flutist generatecommand:- Automatically removes deleted modules from
package.dartwhen module files are not found - When a module's pubspec.yaml cannot be found (e.g.,
home_domain), extracts base module name (e.g.,home) and removes it frompackage.dart - Ensures
package.dartstays in sync with actual file system structure - Filters
flutist_gen.dartmodules to only include those present inproject.dart - Modules removed from
project.dartare now also removed fromflutist_gen.dart
- Automatically removes deleted modules from
๐ Fixed #
- Fixed logging message format in generate command
1.1.0 - 2025-01-02 #
๐ Major Changes #
- Project structure update: Moved
main.dartfromapp/lib/main.darttolib/main.dart- Root
lib/main.dartnow imports and runs app frompackage:app/app.dart - App module is automatically added as a path dependency in root
pubspec.yaml - Enables direct execution with
flutter runfrom root directory - Removed
flutist runcommand - useflutter rundirectly instead
- Root
โจ Added #
- Root
lib/main.dartgeneration influtist initcommand - Automatic app module dependency management in root
pubspec.yaml
๐๏ธ Removed #
- BREAKING:
flutist runcommand has been removed- Users should use
flutter rundirectly from the project root - This change simplifies the toolchain and aligns with standard Flutter workflows
- Users should use
๐ง Changed #
flutist initnow createslib/main.dartin root directory instead ofapp/lib/main.dart- Root
pubspec.yamltemplate now includes app module as path dependency - Run command references removed from documentation and help text
1.0.10 - 2025-01-02 #
๐ Fixed #
flutist generatecommand:- Fixed empty dependencies section being converted from
dependencies:todependencies: {} - Now preserves original format when dependencies section is empty
- Empty dependencies sections are formatted as
dependencies:instead ofdependencies: {} - Files with unchanged dependencies no longer show unnecessary format changes
- Fixed empty dependencies section being converted from
1.0.9 - 2025-01-02 #
๐ Fixed #
flutist createcommand:- Fixed incorrect
analysis_options.yamlinclude path for layered modules (feature, library, standard) - Now uses
path.relative()to correctly calculate relative path from module to root directory - Previously calculated depth based on
moduleRelativePath, which was incorrect for layered modules - Example:
features/book_detail/book_detail_domainnow correctly uses../../../analysis_options.yamlinstead of../../analysis_options.yaml
- Fixed incorrect
1.0.8 - 2025-01-02 #
๐ Fixed #
flutist initcommand:- Fixed version detection using
dart pub global listcommand instead of pubspec.yaml lookup global_packagesdirectory doesn't containpubspec.yaml, onlypubspec.lock- Now correctly reads installed flutist version from
dart pub global listoutput - Fixes issue where version detection failed for globally installed packages via
dart pub global activate
- Fixed version detection using
1.0.7 - 2025-01-02 #
๐ Fixed #
flutist initcommand:- Fixed version detection when running
flutist initafterdart pub global activate flutist - Prioritized
global_packageslookup to correctly read installed flutist version - Added package name validation to ensure correct
pubspec.yamlis read - Simplified version detection logic by removing unnecessary directory traversal
- Now correctly adds the installed flutist version to project dependencies instead of fallback version
- Fixed version detection when running
1.0.6 - 2025-01-02 #
๐ง Improved #
flutist initcommand:- Dynamically reads flutist package version from current package's
pubspec.yaml - Uses pub.dev package instead of local path reference
- Automatically reflects version updates when
pubspec.yamlis updated - Changed from hardcoded version to dynamic version reading
- Dynamically reads flutist package version from current package's
1.0.5 - 2025-01-02 #
๐จ Style #
- Applied Dart formatter to example files and codebase
- Formatted
example/flutist/flutist_gen.dart - Formatted
example/package.dart - Applied consistent code formatting across the project
- Formatted
1.0.4 - 2025-01-02 #
๐ Fixed #
- Fixed
flutist runcommand creatingroot/lib/main.dartfile- Added explicit
-tflag to targetapp/lib/main.dartwhen running Flutter - Automatically detects and removes existing
root/lib/main.dartif found - Prevents Flutter from auto-creating
root/lib/main.dartfile
- Added explicit
1.0.3 - 2025-01-02 #
๐ Fixed #
- Fixed
flutist runcommand creating unnecessaryroot/lib/main.dartfile- Removed auto-generation logic that created
root/lib/main.dartwhen missing - Flutter workspace automatically finds
app/lib/main.dartwhen running from root directory - Updated README.md documentation to reflect correct behavior
- Removed auto-generation logic that created
1.0.2 - 2025-01-02 #
โจ Added #
- Example directory for pub.dev with complete project structure demonstration
README.mdwith usage instructions and module type explanationsdirectory_structure.mdwith Microfeature Architecture visualization- Example
package.dartandproject.dartconfiguration files - Example
pubspec.yamlwith workspace configuration - Example
flutist_gen.dartshowing generated code structure
๐ง Improved #
flutist initcommand:- Prevent overwriting existing
README.mdfiles - Merge Flutist configuration into existing
pubspec.yamlinstead of overwriting - Automatically add
workspacesection if missing - Automatically add
appmodule to workspace if not exists - Automatically add
flutistdependency with latest version when merging - Fix
app.dartimport path inmain.dart(use relative import instead of package import)
- Prevent overwriting existing
- README.md:
- Add "Core Commands" section highlighting main 4 commands (
init,create,generate,scaffold) - Add "All Commands" table at the top for quick reference
- Improve command visibility with larger headings and bold text
- Add
scaffoldexample to Quick Start section
- Add "Core Commands" section highlighting main 4 commands (
๐ Fixed #
- Fixed import path in generated
app/lib/main.dart(changed frompackage:app/app.darttoapp.dart) - Fixed dependency getter names in example files (camelCase conversion:
shared_preferencesโsharedPreferences,json_annotationโjsonAnnotation) - Suppressed warnings in example directory with custom
analysis_options.yaml
1.0.1 - 2025-01-02 #
๐ Fixed #
- Fixed README.md banner image loading issue by using GitHub raw URL instead of relative path
1.0.0 - 2025-01-02 #
๐ Initial Release #
Flutist is a Flutter project management framework inspired by Tuist, providing declarative module structure and dependency management.
โจ Features #
Core Commands
flutist init- Initialize project with workspace supportflutist create- Create modules (simple, feature, library, standard)flutist generate- Sync dependencies with type-safe auto-completionflutist scaffold- Generate code from templates (Tuist-style)flutist graph- Visualize module dependencies (Mermaid, DOT, ASCII)flutist run- Run Flutter appflutist pub- Manage packages
๐๏ธ Module Types #
- Simple - Single-layer module
- Feature - 3-layer (Domain, Data, Presentation)
- Library - 5-layer (Example, Interface, Implementation, Testing, Tests)
- Standard - 3-layer (Implementation, Tests, Testing)
๐ฆ What's Included #
- Auto-generated
flutist_gen.dartfor type-safe dependencies - Built-in feature template (BLoC pattern)
- Comprehensive
analysis_options.yaml(100+ lint rules) - Automatic workspace registration
- Smart relative path calculation
๐ Known Issues #
- iOS build requires workspace workaround (Flutter limitation)
- Solution: Use Android/Web for development
๐ Quick Example #
flutist init
flutist create --path features --name login --options library
flutist generate
flutist graph --open
๐ Credits #
Inspired by Tuist