flutist 3.0.6
flutist: ^3.0.6 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.6 - 2026-05-10 #
๐ Bug Fixes #
flutist pub add --versionnow actually pins the version- The
pub addhelp advertised--version <version>and even showedflutist pub add provider --version ^2.0.0as an example, but the flag was never parsed. Arguments were forwarded todart pub addverbatim, so--versionreacheddart pub add(which does not accept it) and the command failed with an unrelated "could not find an option" error from the underlying tool. --version(and--version=<value>) is now parsed up front. It must apply to a single package; combining it with multiple packages is rejected with a clear message. The constraint is forwarded todart pub addusing its nativepackage:constraintsyntax.- The help text for
pub addwas also rewritten to document the multi-package form (flutist pub add http dio bloc) that already worked but was undocumented.
- The
๐งน Internal #
- Removed unreachable
ScaffoldType.custom- The enum value was accepted by
ScaffoldType.fromStringand had switch handlers increate_commandandcreate_templates, but theflutist create --optionsargparser only allowedclean,micro, orlite. The value was unreachable from the CLI, and the init-generated README already dropped it in 3.0.4. The enum value and its dead handlers are now gone.
- The enum value was accepted by
3.0.5 - 2026-05-03 #
๐ Bug Fixes #
flutist <command> --help/-hnow works for every command- The general help screen advertised
flutist <command> --helpas a way to see per-command usage, but onlygraph,test, andscaffoldactually wired the flag into their argparser. Runningflutist create --help,flutist generate --help,flutist check --help, orflutist pub --helpreturned a "Could not find an option named --help" error instead of help text. - Worse,
flutist init --helpdid not error at all. Becauseinitskips argparser and reads from stdin, the flag was silently ignored and the command dropped into the interactive new-project prompt, so a user looking for help could accidentally start scaffolding a project in the current directory. - All five commands (
init,create,generate,check,pub) now short-circuit on--helpor-hand delegate to the existingHelpCommand, matching the behavior ofgraph,test, andscaffold.
- The general help screen advertised
3.0.4 - 2026-04-25 #
๐ Bug Fixes #
-
flutist help create: corrected mismatch with argparser- The help text listed
simpleas a valid--optionsvalue and marked--optionsas required, but the argparser only acceptsclean|micro|liteand treats the flag as optional. Runningflutist create --options simplewould fail despite the help advertising it. - The help now reflects the actual CLI surface:
--optionsis shown as optional,simpleis removed from the listed types, and a note explains that omitting--optionsproduces a single package. The section was also renamed from "MODULE TYPES" to "SCAFFOLD TYPES" to match the internalScaffoldTypeenum and the README.
- The help text listed
-
flutist help check: clarified Clean Architecture direction rule- The rule was previously phrased as
"Clean module layers must follow direction: Presentation โ Data โ
Domain", which implied a strict chain. The checker actually only
forbids reverse arrows:
_domainmust not depend on_data/_presentation, and_datamust not depend on_presentation. Both the parallel auto-wired pattern (presentation โ domain,data โ domain) and the chain pattern are valid. The help now states the precise rule.
- The rule was previously phrased as
"Clean module layers must follow direction: Presentation โ Data โ
Domain", which implied a strict chain. The checker actually only
forbids reverse arrows:
๐ Documentation #
-
flutist init-generated README: removed unsupportedcustomtype- The README written by
flutist initlistedcustomas a module type, butflutist create --options customis rejected by the argparser. New users following the README hit an immediate dead end. The entry is removed.
- The README written by
-
Documentation links now use the stable production alias
- The
documentation:field inpubspec.yamland two README links embedded a Vercel deployment hash (flutist-1pn8eqs9s-seonwookes-projects.vercel.app), which is tied to a specific deployment and would break if that deployment were archived or rotated. Switched to the stable production aliasflutist-web.vercel.app. CHANGELOG entries that reference the old URL in past releases were left untouched to preserve history.
- The
3.0.3 - 2026-04-24 #
๐ง Chore #
-
Automated GitHub Releases on tag push
- Added
.github/workflows/release.ymlthat creates a GitHub Release with auto-generated notes whenever av*tag is pushed. - Version bumps now produce a visible entry on the repository's Releases page.
- Added
-
Updated
documentation:link inpubspec.yaml- The "Documentation" link on pub.dev now points to the dedicated docs site
(
https://flutist-1pn8eqs9s-seonwookes-projects.vercel.app/) instead of the DeepWiki page.
- The "Documentation" link on pub.dev now points to the dedicated docs site
(
3.0.2 - 2026-04-19 #
๐ Bug Fixes #
-
flutist initon existing projects no longer produces an invalidworkspace: []- When migrating an existing project,
initpreviously inserted an emptyworkspace: []intopubspec.yaml, which causedflutter pub getto fail. - The
workspacesection is now left untouched during migration and is created on demand when the first module is added viaflutist create.
- When migrating an existing project,
-
flutist createnow creates theworkspacesection if it's missing- Previously, running
flutist createright after a migration-modeinit(or on any project without aworkspace:section) failed withFailed to traverse to subpath (workspace). CreateCommandnow falls back to creating a block-styleworkspacelist with the new module when the section is absent.
- Previously, running
-
flutist create --path .produces clean workspace entries- Workspace entries are now normalized via POSIX path normalization,
so
--name app --path .yieldsappinstead of./app.
- Workspace entries are now normalized via POSIX path normalization,
so
-
flutist generatenow surfaces a clear warning whenworkspace:is missing or malformed- Previously, a missing or non-list
workspace:caused_buildModulePathMapto silently return an empty map, producing misleading per-module "Could not find module" warnings while still reporting success. - An upfront warning is now emitted, and unparseable module pubspec.yaml files are logged instead of silently skipped.
- Previously, a missing or non-list
-
New-project
pubspec.yamltemplate now seedsworkspace:with- app- The template previously rendered
workspace:with a null value and relied on a downstream catch-and-create fallback. The template now emits the section as a proper block list, removing the fragility.
- The template previously rendered
-
flutist initnow exits with code 1 on failure- Previously, the top-level
catchinInitCommand.executeonly logged the error and let the process exit with code 0, so CI/scripts could not detect init failures. It now matches the other commands (create,generate,test,scaffold) and callsexit(1).
- Previously, the top-level
-
flutist scaffoldnow strips only the trailing.templatesuffix- The previous
replaceAll('.template', '')removed every occurrence in the path, so a file namedwidget.template.dart.templatewould be written aswidget..dart. The suffix is now stripped viaRegExp(r'\.template$').
- The previous
-
flutist testno longer truncates failure output_runModuleTestpreviously attachedlistencallbacks to stdout/stderr and read the buffers immediately afterprocess.exitCode, racing the transform pipeline and sometimes cutting off the last lines of stack traces. The streams are now drained via.join()futures that are awaited after the process exits, guaranteeing full output capture.
๐ Documentation #
- Docs badge now links to the official docs site
- The README
Docsbadge points tohttps://flutist-1pn8eqs9s-seonwookes-projects.vercel.app/docsinstead of the previous deepwiki URL.
- The README
3.0.1 - 2026-04-16 #
๐ Documentation #
- README overhaul: Rewrote and expanded README with full documentation site content
- Added Core Values section (Declarative, Single Source, Rules as Code)
- Added Core Files section (
package.dart,project.dart,flutist_gen.dart) - Added Architecture Validation section (5 rules +
strictMode/compositionRootsconfig) - Expanded Project Structure with
packages/directory example - Fixed Commands table bold+code formatting (
**\command`**`) - Added "Learn more about Flutist!" link to docs site
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