flutist 3.2.0
flutist: ^3.2.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.2.0 - 2026-08-30 #
โจ Features #
- Local and Git packages can be declared in
package.dartDependencycould only describe a package published on pub.dev: a name and a version constraint. A package sitting on disk or living in a Git repository had no representation, so the only way to use one was to edit a module'spubspec.yamlby hand, and that edit did not survive the nextflutist generate(see the fix below).- Two new forms sit alongside the existing one:
Dependency.path(name: 'design_system', path: 'shared/design_system'), Dependency.git( name: 'analytics', url: 'https://github.com/acme/analytics.git', ref: 'main', path: 'packages/analytics', ),refandpathare optional onDependency.git; omitting both emits pub's shortgit: <url>form. - Reference them from
project.dartexactly like any other dependency (package.dependencies.designSystem) and runflutist generate. - A
Dependency.pathis written relative topackage.dart, not relative to the module consuming it. Flutist re-anchors the path for each module when writing itspubspec.yaml, so a single declaration yields../shared/design_systemfor a top-level module and../../../shared/design_systemfor a nested one. This is the part that hand-editing gets wrong most often. Dependency.versionis now nullable, since it is meaningless for the two new kinds. The pub.dev constructor still requires it, so existingpackage.dartfiles need no changes.
๐ Bug Fixes #
-
flutist generateno longer discards hand-written dependencies- Generation rebuilt each module's
dependenciessection from scratch and kept only entries carrying ansdk:key. Every other pre-existing entry was deleted without so much as a warning. A localpath:dependency, agit:dependency, or a package added straight to a module'spubspec.yamlvanished on the nextflutist generate. - Worse,
dev_dependenciesbehaved the opposite way and preserved unmanaged entries, so the two halves of the same file followed contradictory rules. - Preservation is now decided by ownership instead of by shape. A
name declared in
package.dart, or belonging to a module in the workspace, is Flutist's to manage. Anything else belongs to the user and is written back untouched. Both sections follow the rule. - Removing a dependency from
package.dartstill clears it from every module, sopub deleteis unaffected.
- Generation rebuilt each module's
-
flutist pub deleteworks on path and git dependencies- The package.dart lookup assumed a single-line
Dependency(name: '...', version: '...')with the arguments in that exact order, so a path or git declaration was reported as "not found in package.dart" and could not be deleted. Lookup now matches the declaration head and reads the argument list by paren matching, which handles any argument order and the multi-line git form. - After deletion, the dependency also lingered in every module's
pubspec.yaml:generatereadspackage.dartto decide what it owns, and the entry had just been removed from it, so the leftover looked user-authored and was preserved.pub deletenow tellsgeneratewhich names it removed. The same gap affecteddev_dependenciespreviously.
- The package.dart lookup assumed a single-line
-
Commented-out declarations are no longer parsed as real ones
- The
package.dartparser matchedDependencyandModuledeclarations anywhere in the file, comments included. Becauseflutist initwrites itspackage.dartwith commented examples, every project created by Flutist carried phantomintlandtestdependencies. They showed up as accessors influtist_gen.dart, and referencing one produced apubspec.yamlentry pinned to the example's made-up version. - This also collided with the ownership rule above: the phantom
testentry madetestlook like a name Flutist manages, so a module with a hand-writtentest:dev_dependency would have had it removed. - Line comments are now masked before parsing. The mask is
quote-aware, so the
//inside a git URL survives.
- The
-
pub deleteremoves the declaration, not a commented example- The
package.dartlookup scanned raw text and stopped at the first textual match. Deleting a package that also appeared in one of the commented examples removed the comment and left the real declaration untouched, while still reporting success and cleaningproject.dartand every modulepubspec.yaml. The command that exists to keep the workspace consistent left it inconsistent.
- The
-
Dependencies missing from
package.dartare reported- A dependency referenced in
project.dartbut not declared inpackage.dartwas skipped silently, leaving the user to work out why it never appeared in the generatedpubspec.yaml. Generation now names it.
- A dependency referenced in
-
flutist generateno longer drops entries silently- A dependency Flutist owns but that
project.dartdoes not reference is removed from a module'spubspec.yaml. That is by design, sinceproject.dartis the source of truth for what each module depends on, but generation did it without a word. The only signal was the entry being gone, which reads as data loss. - Each dropped name is now reported along with the declaration that
would keep it, and the two cases are distinguished: a workspace
module points at
package.modules.xin the module'smoduleslist, apackage.dartdependency atpackage.dependencies.xin itsdependencieslist. - Removing an entire
dev_dependenciessection is covered too. That was the same gap one level up: a section holding nothing but Flutist-owned names vanished without comment. - Two cases stay quiet on purpose. Names handed over by
pub deletewere already reported by that command. Namesproject.dartdoes declare were dropped for another reason, such as a module missing from the workspace, which generation reports on its own; pointing the user at a declaration that already exists would send them to the wrong file.
- A dependency Flutist owns but that
๐งน Internal #
- The
package.dartdependency parser reads named arguments individually rather than matching one fixed argument order, soDependency(version: '^1.0.0', name: 'http')parses correctly. A declaration missing a required argument is reported and skipped instead of silently disappearing.
๐ Documentation #
- What
flutist generatetouches is now written down- Which entries in a module's
pubspec.yamlsurvive generation was answerable only from the source. README gains a table covering what is kept, what is overwritten, and what is removed, andflutist help generatecarries the same summary. - Both state the two limits that were previously undocumented:
comments inside
dependenciesanddev_dependenciesdo not survive, since those sections are re-serialized in full, and blank lines are normalized to one between sections.
- Which entries in a module's
๐งช Tests #
- Coverage for pubspec.yaml generation
- Ownership-based preservation is the guarantee that lets a team
keep a local path package or a Git fork wired up by hand, and the
commands/directory had no tests at all. The whole pipeline was resting on manual verification. - Both halves of the rule are now covered: sdk, hand-written
path:,git:and hosted entries and non-dependency sections survive, while a name declared inpackage.dartis rewritten from it. Also covered arepath:re-anchoring at two nesting depths, both git emission forms, idempotence across runs, and the drop warnings including their two silent cases.
- Ownership-based preservation is the guarantee that lets a team
keep a local path package or a Git fork wired up by hand, and the
โฌ๏ธ Upgrading from 3.1.0 #
Two things can change in your workspace on the first flutist generate
after upgrading. Both are reported as they happen; neither is silent.
- A
dev_dependenciesentry may be removed. Up to 3.1.0 the two sections followed contradictory rules:dependencieskept onlysdk:entries, whiledev_dependencieskept anything the module'sproject.dartentry did not name. Both now follow the same ownership rule. So a package declared inpackage.dartand written into a module'sdev_dependenciesby hand, but never referenced from that module inproject.dart, is now removed. Generation names it and the one line that keeps it:package.dependencies.<name>in the module'sdevDependencies. flutist_gen.dartmay lose accessors. The parser used to read commented-out declarations as real ones, so apackage.dartwritten byflutist initproduced phantomintlandtestaccessors, and referencing one wrote a nonexistent version intopubspec.yaml. Those accessors are gone. Ifproject.dartreferenced one, uncomment the matching declaration inpackage.dart, or drop the reference.
The dependencies section only gains: entries 3.1.0 deleted, such as a
hand-written path:, git: or pub.dev package, now survive.
3.1.0 - 2026-05-19 #
โจ Features #
flutist pub delete <pkg>โ remove dependencies declarativelyflutist pub addhad no inverse. Removing a dependency meant hand-editingpackage.dart, hunting down everypackage.dependencies.xxxline inproject.dart, regeneratingflutist_gen.dart, and finally runningflutist generateto clean up the per-modulepubspec.yamlfiles. Easy to get wrong; the smallest mistake left dangling references that broke the nextflutist generate.pub deletedoes the whole round trip in one shot. It scansproject.dartfor usages, prints the full plan (theDependencyentry that will leavepackage.dartplus every module reference that will be cleaned), and waits for a y/n confirmation. After the user approves it rewrites both files, regeneratesflutist_gen.dart, and runs the full generate pipeline so every modulepubspec.yamlis back in sync without a follow-up command.- Accepts one or more package names:
flutist pub delete http dio bloc. Each is validated againstpackage.dartup front; requesting an unknown name aborts before any file is touched. --dry-runprints the plan and exits without writing.-y/--yesskips the confirmation prompt for scripts.- The reference cleanup handles both list shapes users actually
write: own-line entries in a multi-line list and inline lists
like
dependencies: [package.dependencies.flutterBloc]. Surrounding indentation and adjacent items keep their formatting. helptext forpubis rewritten to document both subcommands (add,delete) and the new flags.
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