maxsim-flutter 1.26.0 → 1.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/cli/commands/plan.d.ts +3 -0
  2. package/dist/cli/commands/plan.d.ts.map +1 -0
  3. package/dist/cli/commands/plan.js +76 -0
  4. package/dist/cli/commands/plan.js.map +1 -0
  5. package/dist/cli/index.js +2 -0
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/plan/architecture-generator.d.ts +8 -0
  8. package/dist/plan/architecture-generator.d.ts.map +1 -0
  9. package/dist/plan/architecture-generator.js +222 -0
  10. package/dist/plan/architecture-generator.js.map +1 -0
  11. package/dist/plan/brief-template-generator.d.ts +6 -0
  12. package/dist/plan/brief-template-generator.d.ts.map +1 -0
  13. package/dist/plan/brief-template-generator.js +47 -0
  14. package/dist/plan/brief-template-generator.js.map +1 -0
  15. package/dist/plan/config-writer.d.ts +6 -0
  16. package/dist/plan/config-writer.d.ts.map +1 -0
  17. package/dist/plan/config-writer.js +18 -0
  18. package/dist/plan/config-writer.js.map +1 -0
  19. package/dist/plan/journey-to-stories.d.ts +7 -0
  20. package/dist/plan/journey-to-stories.d.ts.map +1 -0
  21. package/dist/plan/journey-to-stories.js +111 -0
  22. package/dist/plan/journey-to-stories.js.map +1 -0
  23. package/dist/plan/plan-orchestrator.d.ts +3 -0
  24. package/dist/plan/plan-orchestrator.d.ts.map +1 -0
  25. package/dist/plan/plan-orchestrator.js +31 -0
  26. package/dist/plan/plan-orchestrator.js.map +1 -0
  27. package/dist/plan/skill-generator.d.ts +2 -0
  28. package/dist/plan/skill-generator.d.ts.map +1 -0
  29. package/dist/plan/skill-generator.js +53 -0
  30. package/dist/plan/skill-generator.js.map +1 -0
  31. package/dist/plan/types.d.ts +11 -0
  32. package/dist/plan/types.d.ts.map +1 -0
  33. package/dist/plan/types.js +6 -0
  34. package/dist/plan/types.js.map +1 -0
  35. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function createPlanCommand(): Command;
3
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,iBAAiB,IAAI,OAAO,CAiB3C"}
@@ -0,0 +1,76 @@
1
+ import { Command } from 'commander';
2
+ import { join } from 'node:path';
3
+ import * as p from '@clack/prompts';
4
+ import { runPlan } from '../../plan/plan-orchestrator.js';
5
+ import { isValidSnakeCase } from '../../plan/types.js';
6
+ export function createPlanCommand() {
7
+ const cmd = new Command('plan');
8
+ cmd
9
+ .description('Bootstrap a planning workspace for a new Flutter app with AI-guided setup')
10
+ .argument('[app-name]', 'Name of the Flutter application (snake_case)')
11
+ .option('--description <text>', 'Short description of your app (1-2 sentences)')
12
+ .action(async (appName, options) => {
13
+ try {
14
+ await runPlanCommand(appName, options);
15
+ }
16
+ catch (err) {
17
+ p.log.error(err instanceof Error ? err.message : String(err));
18
+ process.exit(1);
19
+ }
20
+ });
21
+ return cmd;
22
+ }
23
+ async function runPlanCommand(appName, options) {
24
+ p.intro('maxsim-flutter — Bootstrap a planning workspace');
25
+ // Prompt for project name if not provided
26
+ let name = appName;
27
+ if (!name) {
28
+ const nameResult = await p.text({
29
+ message: 'What is your project name? (snake_case)',
30
+ placeholder: 'my_flutter_app',
31
+ validate: (value) => {
32
+ if (!isValidSnakeCase(value)) {
33
+ return 'Project name must be snake_case (lowercase letters, digits, and underscores only)';
34
+ }
35
+ return undefined;
36
+ },
37
+ });
38
+ if (p.isCancel(nameResult)) {
39
+ p.cancel('Planning cancelled.');
40
+ process.exit(0);
41
+ }
42
+ name = nameResult;
43
+ }
44
+ else if (!isValidSnakeCase(name)) {
45
+ p.log.error(`Invalid project name "${name}". Must be snake_case (e.g., my_app).`);
46
+ process.exit(1);
47
+ }
48
+ // Prompt for description if not provided
49
+ let description = options.description;
50
+ if (!description) {
51
+ const descResult = await p.text({
52
+ message: 'Briefly describe your app (1-2 sentences):',
53
+ placeholder: 'A productivity app that helps teams collaborate on daily tasks.',
54
+ validate: (value) => {
55
+ if (!value.trim())
56
+ return 'Description cannot be empty';
57
+ return undefined;
58
+ },
59
+ });
60
+ if (p.isCancel(descResult)) {
61
+ p.cancel('Planning cancelled.');
62
+ process.exit(0);
63
+ }
64
+ description = descResult;
65
+ }
66
+ const outputDir = join(process.cwd(), name);
67
+ p.log.info(`Creating planning workspace in ./${name}/`);
68
+ const result = await runPlan({ name, description, outputDir });
69
+ p.log.success(`Created ${result.filesCreated.length} files`);
70
+ p.outro(`Planning workspace ready! Next steps:\n\n` +
71
+ ` 1. cd ${name}\n` +
72
+ ` 2. Fill in docs/project-brief-template.md\n` +
73
+ ` 3. Open Claude Code: claude\n` +
74
+ ` 4. Run the planning skill: /plan-app\n`);
75
+ }
76
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/cli/commands/plan.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -6,6 +6,7 @@ import { createAddCommand } from './commands/add.js';
6
6
  import { createMigrateCommand } from './commands/migrate.js';
7
7
  import { createListCommand } from './commands/list.js';
8
8
  import { createUpgradeCommand } from './commands/upgrade.js';
9
+ import { createPlanCommand } from './commands/plan.js';
9
10
  import { checkForUpdate } from './version-check.js';
10
11
  const program = new Command();
11
12
  program
@@ -18,6 +19,7 @@ program.addCommand(createAddCommand());
18
19
  program.addCommand(createMigrateCommand());
19
20
  program.addCommand(createListCommand());
20
21
  program.addCommand(createUpgradeCommand());
22
+ program.addCommand(createPlanCommand());
21
23
  program.parse();
22
24
  // Non-blocking update nudge (fires after the command completes)
23
25
  const opts = program.opts();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4GAA4G,CAAC;KACzH,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,CAAC;AAE5D,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAE3C,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,gEAAgE;AAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAA4B,CAAC;AACtD,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;IAC/B,cAAc,EAAE;SACb,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;QACtB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC;YAC7C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,uBAAuB,OAAO,MAAM,aAAa,gDAAgD,CAClG,CACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,kBAAkB;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,4GAA4G,CAAC;KACzH,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,CAAC;AAE5D,OAAO,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACvC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC3C,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAExC,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,gEAAgE;AAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAA4B,CAAC;AACtD,IAAI,IAAI,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;IAC/B,cAAc,EAAE;SACb,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;QACtB,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,OAAO,CAAC;YAC7C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,uBAAuB,OAAO,MAAM,aAAa,gDAAgD,CAClG,CACF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,GAAG,EAAE;QACV,kBAAkB;IACpB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ProjectContext } from '../core/context.js';
2
+ /**
3
+ * Generates an architecture.md document for the scaffolded Flutter project.
4
+ * Includes tech stack, module overview, ASCII provider tree, navigation flow,
5
+ * and (conditionally) a database schema outline.
6
+ */
7
+ export declare function generateArchitectureDoc(context: ProjectContext): string;
8
+ //# sourceMappingURL=architecture-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-generator.d.ts","sourceRoot":"","sources":["../../src/plan/architecture-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAevE"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Generates an architecture.md document for the scaffolded Flutter project.
3
+ * Includes tech stack, module overview, ASCII provider tree, navigation flow,
4
+ * and (conditionally) a database schema outline.
5
+ */
6
+ export function generateArchitectureDoc(context) {
7
+ const sections = [
8
+ `# Architecture — ${context.projectName}`,
9
+ '',
10
+ buildTechStackSection(context),
11
+ buildModuleArchitectureSection(context),
12
+ buildProviderTreeSection(context),
13
+ buildNavigationFlowSection(context),
14
+ ];
15
+ if (context.modules.database) {
16
+ sections.push(buildDatabaseSchemaSection(context.modules.database));
17
+ }
18
+ return sections.join('\n') + '\n';
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // Tech Stack
22
+ // ---------------------------------------------------------------------------
23
+ function buildTechStackSection(context) {
24
+ const entries = [
25
+ '| Technology | Purpose | Rationale |',
26
+ '|-----------|---------|-----------|',
27
+ '| Flutter | UI framework | Cross-platform native UI |',
28
+ '| Riverpod | State management | Compile-safe, testable providers |',
29
+ '| go_router | Navigation | Type-safe, declarative routing |',
30
+ '| freezed | Immutable models | Code-gen for value types |',
31
+ '| dio | HTTP client | Interceptor-first, composable |',
32
+ ];
33
+ if (context.modules.auth) {
34
+ const { provider } = context.modules.auth;
35
+ if (provider === 'firebase') {
36
+ entries.push('| Firebase Auth | Authentication | BaaS with Flutter SDK |');
37
+ }
38
+ else if (provider === 'supabase') {
39
+ entries.push('| Supabase | Authentication | Open-source BaaS |');
40
+ }
41
+ else {
42
+ entries.push('| Custom Auth | Authentication | Project-specific auth logic |');
43
+ }
44
+ }
45
+ if (context.modules.database) {
46
+ const { engine } = context.modules.database;
47
+ if (engine === 'drift') {
48
+ entries.push('| Drift | Local database | Type-safe SQLite ORM with code-gen |');
49
+ }
50
+ else if (engine === 'hive') {
51
+ entries.push('| Hive | Local database | Lightweight key-value NoSQL store |');
52
+ }
53
+ else {
54
+ entries.push('| Isar | Local database | High-performance embedded NoSQL |');
55
+ }
56
+ }
57
+ if (context.modules.push) {
58
+ const { provider } = context.modules.push;
59
+ if (provider === 'firebase') {
60
+ entries.push('| Firebase Cloud Messaging | Push notifications | Cross-platform push via Firebase |');
61
+ }
62
+ else {
63
+ entries.push('| OneSignal | Push notifications | Managed push notification service |');
64
+ }
65
+ }
66
+ if (context.modules.i18n) {
67
+ entries.push('| flutter_localizations | Internationalisation | ARB-based i18n with gen-l10n |');
68
+ }
69
+ if (context.modules.analytics) {
70
+ entries.push('| Analytics | Event tracking | Screen views and custom events |');
71
+ }
72
+ return ['## Tech Stack', '', ...entries].join('\n');
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Module Architecture
76
+ // ---------------------------------------------------------------------------
77
+ function buildModuleArchitectureSection(context) {
78
+ const { modules } = context;
79
+ const enabledModules = [];
80
+ if (modules.auth)
81
+ enabledModules.push('auth');
82
+ if (modules.api)
83
+ enabledModules.push('api');
84
+ if (modules.database)
85
+ enabledModules.push('database');
86
+ if (modules.i18n)
87
+ enabledModules.push('i18n');
88
+ if (modules.theme)
89
+ enabledModules.push('theme');
90
+ if (modules.push)
91
+ enabledModules.push('push');
92
+ if (modules.analytics)
93
+ enabledModules.push('analytics');
94
+ if (modules.cicd)
95
+ enabledModules.push('cicd');
96
+ if (modules.deepLinking)
97
+ enabledModules.push('deepLinking');
98
+ const lines = ['## Module Architecture', ''];
99
+ if (enabledModules.length === 0) {
100
+ lines.push('Core-only setup — no optional modules enabled.');
101
+ lines.push('');
102
+ lines.push('Each feature follows Clean Architecture:');
103
+ lines.push('');
104
+ lines.push('```');
105
+ lines.push('lib/features/<feature>/');
106
+ lines.push(' domain/ # entities, repository interfaces, use-cases');
107
+ lines.push(' data/ # repository impls, data sources');
108
+ lines.push(' presentation/ # pages, widgets, providers');
109
+ lines.push('```');
110
+ }
111
+ else {
112
+ lines.push(`Enabled modules: **${enabledModules.join(', ')}**`);
113
+ lines.push('');
114
+ lines.push('Each module lives in `lib/features/<module>/` and follows Clean Architecture:');
115
+ lines.push('');
116
+ lines.push('```');
117
+ lines.push('lib/features/<module>/');
118
+ lines.push(' domain/ # entities, repository interfaces, use-cases');
119
+ lines.push(' data/ # repository impls, data sources');
120
+ lines.push(' presentation/ # pages, widgets, providers');
121
+ lines.push('```');
122
+ }
123
+ lines.push('');
124
+ return lines.join('\n');
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // Provider Tree
128
+ // ---------------------------------------------------------------------------
129
+ function buildProviderTreeSection(context) {
130
+ const { modules } = context;
131
+ const lines = ['## Provider Tree', '', '```'];
132
+ lines.push('ProviderScope');
133
+ lines.push('├── routerProvider');
134
+ const providers = [];
135
+ if (modules.auth)
136
+ providers.push('authRepositoryProvider');
137
+ if (modules.api)
138
+ providers.push('dioClientProvider');
139
+ if (modules.database)
140
+ providers.push('databaseProvider');
141
+ if (modules.push)
142
+ providers.push('pushTokenProvider');
143
+ if (modules.analytics)
144
+ providers.push('analyticsServiceProvider');
145
+ if (modules.theme)
146
+ providers.push('appThemeModeProvider');
147
+ if (modules.i18n)
148
+ providers.push('localeProvider');
149
+ for (let i = 0; i < providers.length; i++) {
150
+ const isLast = i === providers.length - 1;
151
+ lines.push(`${isLast ? '└──' : '├──'} ${providers[i]}`);
152
+ }
153
+ lines.push('```');
154
+ lines.push('');
155
+ return lines.join('\n');
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // Navigation Flow
159
+ // ---------------------------------------------------------------------------
160
+ function buildNavigationFlowSection(context) {
161
+ const { modules } = context;
162
+ const lines = ['## Navigation Flow', '', '```'];
163
+ lines.push('/ (HomeRoute)');
164
+ if (modules.auth) {
165
+ lines.push('├── /login (LoginRoute)');
166
+ lines.push('├── /register (RegisterRoute)');
167
+ }
168
+ if (modules.deepLinking) {
169
+ const { scheme, host } = modules.deepLinking;
170
+ const example = scheme && host ? `${scheme}://${host}` : 'app://host';
171
+ lines.push(`└── [deep-link] ${example} → resolved by go_router`);
172
+ }
173
+ lines.push('```');
174
+ lines.push('');
175
+ return lines.join('\n');
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // Database Schema
179
+ // ---------------------------------------------------------------------------
180
+ function buildDatabaseSchemaSection(database) {
181
+ const { engine } = database;
182
+ const lines = ['## Database Schema', ''];
183
+ if (engine === 'drift') {
184
+ lines.push('Engine: **Drift** (type-safe SQLite ORM with code generation)');
185
+ lines.push('');
186
+ lines.push('```sql');
187
+ lines.push('-- Example Drift table (add your tables in lib/features/database/)');
188
+ lines.push('CREATE TABLE items (');
189
+ lines.push(' id INTEGER PRIMARY KEY AUTOINCREMENT,');
190
+ lines.push(' name TEXT NOT NULL,');
191
+ lines.push(' created_at INTEGER NOT NULL');
192
+ lines.push(');');
193
+ lines.push('```');
194
+ }
195
+ else if (engine === 'hive') {
196
+ lines.push('Engine: **Hive** (lightweight key-value NoSQL)');
197
+ lines.push('');
198
+ lines.push('```dart');
199
+ lines.push('// Example Hive box (define adapters in lib/features/database/)');
200
+ lines.push('@HiveType(typeId: 0)');
201
+ lines.push('class ItemModel extends HiveObject {');
202
+ lines.push(' @HiveField(0)');
203
+ lines.push(' late String name;');
204
+ lines.push('}');
205
+ lines.push('```');
206
+ }
207
+ else {
208
+ lines.push('Engine: **Isar** (high-performance embedded NoSQL)');
209
+ lines.push('');
210
+ lines.push('```dart');
211
+ lines.push('// Example Isar collection (define in lib/features/database/)');
212
+ lines.push('@collection');
213
+ lines.push('class Item {');
214
+ lines.push(' Id id = Isar.autoIncrement;');
215
+ lines.push(' late String name;');
216
+ lines.push('}');
217
+ lines.push('```');
218
+ }
219
+ lines.push('');
220
+ return lines.join('\n');
221
+ }
222
+ //# sourceMappingURL=architecture-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"architecture-generator.js","sourceRoot":"","sources":["../../src/plan/architecture-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface BriefTemplateInput {
2
+ name: string;
3
+ description: string;
4
+ }
5
+ export declare function generateBriefTemplate(input: BriefTemplateInput): string;
6
+ //# sourceMappingURL=brief-template-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief-template-generator.d.ts","sourceRoot":"","sources":["../../src/plan/brief-template-generator.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CA6CvE"}
@@ -0,0 +1,47 @@
1
+ export function generateBriefTemplate(input) {
2
+ return `# Project Brief — ${input.name}
3
+
4
+ > ${input.description}
5
+
6
+ ## Vision
7
+
8
+ <!-- What problem does this app solve? Who is the target user? -->
9
+
10
+ ## Core Features
11
+
12
+ <!-- List the 3-5 most important features. Be specific. -->
13
+
14
+ 1.
15
+ 2.
16
+ 3.
17
+
18
+ ## User Journeys
19
+
20
+ <!-- Describe the key user flows step by step. -->
21
+
22
+ ### Primary Journey
23
+
24
+ 1. User opens the app
25
+ 2.
26
+
27
+ ## Technical Constraints
28
+
29
+ <!-- Platform targets, performance requirements, integrations. -->
30
+
31
+ - Platforms: iOS, Android
32
+ -
33
+
34
+ ## Success Metrics
35
+
36
+ <!-- How will you measure if the app is successful? -->
37
+
38
+ -
39
+
40
+ ## Out of Scope
41
+
42
+ <!-- What are you explicitly NOT building in v1? -->
43
+
44
+ -
45
+ `;
46
+ }
47
+ //# sourceMappingURL=brief-template-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brief-template-generator.js","sourceRoot":"","sources":["../../src/plan/brief-template-generator.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,qBAAqB,CAAC,KAAyB;IAC7D,OAAO,qBAAqB,KAAK,CAAC,IAAI;;IAEpC,KAAK,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCpB,CAAC;AACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface PartialConfigInput {
2
+ name: string;
3
+ description: string;
4
+ }
5
+ export declare function writePartialConfig(outputDir: string, input: PartialConfigInput): Promise<string>;
6
+ //# sourceMappingURL=config-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-writer.d.ts","sourceRoot":"","sources":["../../src/plan/config-writer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBtG"}
@@ -0,0 +1,18 @@
1
+ import { join } from 'node:path';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ export async function writePartialConfig(outputDir, input) {
4
+ await mkdir(outputDir, { recursive: true });
5
+ const content = [
6
+ `project:`,
7
+ ` name: ${input.name}`,
8
+ ` description: >-`,
9
+ ` ${input.description}`,
10
+ ``,
11
+ `# Run maxsim-flutter create to complete your project setup`,
12
+ `# after filling in the project-brief-template.md`,
13
+ ].join('\n');
14
+ const filePath = join(outputDir, 'maxsim.config.yaml');
15
+ await writeFile(filePath, content, 'utf-8');
16
+ return filePath;
17
+ }
18
+ //# sourceMappingURL=config-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/plan/config-writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAOpD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAyB;IACnF,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG;QACd,UAAU;QACV,WAAW,KAAK,CAAC,IAAI,EAAE;QACvB,mBAAmB;QACnB,OAAO,KAAK,CAAC,WAAW,EAAE;QAC1B,EAAE;QACF,4DAA4D;QAC5D,kDAAkD;KACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generates a prompt/template for decomposing user journeys into PRD stories.
3
+ * This prompt is embedded in the plan-app skill to instruct Claude on how
4
+ * to break each user journey into domain → data → presentation → tests layers.
5
+ */
6
+ export declare function generateJourneyDecompositionPrompt(journeys: string[]): string;
7
+ //# sourceMappingURL=journey-to-stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-to-stories.d.ts","sourceRoot":"","sources":["../../src/plan/journey-to-stories.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,kCAAkC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA0G7E"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Generates a prompt/template for decomposing user journeys into PRD stories.
3
+ * This prompt is embedded in the plan-app skill to instruct Claude on how
4
+ * to break each user journey into domain → data → presentation → tests layers.
5
+ */
6
+ export function generateJourneyDecompositionPrompt(journeys) {
7
+ const journeyList = journeys.length > 0
8
+ ? journeys.map((j, i) => `${i + 1}. ${j}`).join('\n')
9
+ : '_No journeys provided. Identify user journeys from the project brief first._';
10
+ return [
11
+ '# Journey-to-Stories Decomposition',
12
+ '',
13
+ 'Decompose each user journey into PRD stories following Clean Architecture layers.',
14
+ '',
15
+ '## User Journeys to Decompose',
16
+ '',
17
+ journeyList,
18
+ '',
19
+ '## Decomposition Rules',
20
+ '',
21
+ 'For each journey, create 2-4 stories following this layer order:',
22
+ '',
23
+ '1. **Domain story** — entities, repository interfaces, use cases (no dependencies)',
24
+ '2. **Data story** — models, data sources, repository implementations (depends on domain story)',
25
+ '3. **Presentation story** — providers, pages, widgets (depends on domain story)',
26
+ '4. **Tests story** (optional) — integration and widget tests for the full feature',
27
+ '',
28
+ '### Dependency Chain',
29
+ '',
30
+ 'Always maintain this dependency ordering:',
31
+ '',
32
+ '```',
33
+ 'domain ← data ← presentation ← tests',
34
+ '```',
35
+ '',
36
+ '- Domain story has no dependencies',
37
+ '- Data story depends on domain story',
38
+ '- Presentation story depends on domain story',
39
+ '- Tests story depends on presentation story (and implicitly all others)',
40
+ '',
41
+ '## Story Format',
42
+ '',
43
+ 'Each story must follow this structure:',
44
+ '',
45
+ '```json',
46
+ '{',
47
+ ' "phase": <number>,',
48
+ ' "priority": "P0" | "P1" | "P2",',
49
+ ' "title": "<imperative verb> <domain concept>",',
50
+ ' "description": "<detailed implementation requirements>",',
51
+ ' "layer": "domain" | "data" | "presentation" | "tests",',
52
+ ' "storyPoints": <Fibonacci: 1, 2, 3, 5, 8>,',
53
+ ' "dependencies": ["<story-id>"],',
54
+ ' "acceptanceCriteria": [',
55
+ ' {',
56
+ ' "description": "<human-readable criterion>",',
57
+ ' "predicate": "<machine-checkable assertion>"',
58
+ ' }',
59
+ ' ]',
60
+ '}',
61
+ '```',
62
+ '',
63
+ '## Acceptance Criteria Requirements',
64
+ '',
65
+ '- Each story must have >= 3 acceptance criteria',
66
+ '- Every criterion must include a `predicate` field (machine-checkable assertion)',
67
+ '- Predicates must be specific and testable (e.g., "authState is AuthStateAuthenticated")',
68
+ '- Predicates use present tense: "UserEntity has id, email, name fields"',
69
+ '',
70
+ '## Story Points (Fibonacci)',
71
+ '',
72
+ '| Layer | Typical Points |',
73
+ '|-------|---------------|',
74
+ '| Domain | 2-3 |',
75
+ '| Data | 3-5 |',
76
+ '| Presentation | 3-8 |',
77
+ '| Tests | 1-3 |',
78
+ '',
79
+ 'Valid values: 1, 2, 3, 5, 8 (Fibonacci sequence only)',
80
+ '',
81
+ '## Example Output',
82
+ '',
83
+ 'For journey "User signs up and logs in":',
84
+ '',
85
+ '1. **Domain** (3pts): Define Auth entities and repository interface',
86
+ ' - `AuthRepository` abstract class with `signUp`, `signIn`, `signOut`',
87
+ ' - `User` entity with freezed',
88
+ ' - No dependencies',
89
+ '',
90
+ '2. **Data** (5pts): Implement auth data source and repository',
91
+ ' - `AuthDataSourceImpl` connecting to backend',
92
+ ' - `AuthRepositoryImpl` implementing domain interface',
93
+ ' - Depends on domain story',
94
+ '',
95
+ '3. **Presentation** (5pts): Build login and register screens',
96
+ ' - `LoginPage` and `RegisterPage` with ConsumerWidget',
97
+ ' - `authNotifierProvider` with AsyncNotifier',
98
+ ' - Depends on domain story',
99
+ '',
100
+ '4. **Tests** (2pts): Integration tests for auth flows',
101
+ ' - Happy path sign-up and login flow',
102
+ ' - Depends on presentation story',
103
+ '',
104
+ '## Output',
105
+ '',
106
+ 'Return a JSON array of story objects for all journeys.',
107
+ 'Maintain dependency ordering within each journey\'s stories.',
108
+ 'Ensure every story ID is unique and referenced correctly in dependencies.',
109
+ ].join('\n');
110
+ }
111
+ //# sourceMappingURL=journey-to-stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journey-to-stories.js","sourceRoot":"","sources":["../../src/plan/journey-to-stories.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,kCAAkC,CAAC,QAAkB;IACnE,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,GAAG,CAAC;QACjB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrD,CAAC,CAAC,8EAA8E,CAAC;IAErF,OAAO;QACL,oCAAoC;QACpC,EAAE;QACF,mFAAmF;QACnF,EAAE;QACF,+BAA+B;QAC/B,EAAE;QACF,WAAW;QACX,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,kEAAkE;QAClE,EAAE;QACF,oFAAoF;QACpF,gGAAgG;QAChG,iFAAiF;QACjF,mFAAmF;QACnF,EAAE;QACF,sBAAsB;QACtB,EAAE;QACF,2CAA2C;QAC3C,EAAE;QACF,KAAK;QACL,sCAAsC;QACtC,KAAK;QACL,EAAE;QACF,oCAAoC;QACpC,sCAAsC;QACtC,8CAA8C;QAC9C,yEAAyE;QACzE,EAAE;QACF,iBAAiB;QACjB,EAAE;QACF,wCAAwC;QACxC,EAAE;QACF,SAAS;QACT,GAAG;QACH,sBAAsB;QACtB,mCAAmC;QACnC,kDAAkD;QAClD,4DAA4D;QAC5D,0DAA0D;QAC1D,8CAA8C;QAC9C,mCAAmC;QACnC,2BAA2B;QAC3B,OAAO;QACP,oDAAoD;QACpD,oDAAoD;QACpD,OAAO;QACP,KAAK;QACL,GAAG;QACH,KAAK;QACL,EAAE;QACF,qCAAqC;QACrC,EAAE;QACF,iDAAiD;QACjD,kFAAkF;QAClF,0FAA0F;QAC1F,yEAAyE;QACzE,EAAE;QACF,6BAA6B;QAC7B,EAAE;QACF,4BAA4B;QAC5B,2BAA2B;QAC3B,kBAAkB;QAClB,gBAAgB;QAChB,wBAAwB;QACxB,iBAAiB;QACjB,EAAE;QACF,uDAAuD;QACvD,EAAE;QACF,mBAAmB;QACnB,EAAE;QACF,0CAA0C;QAC1C,EAAE;QACF,qEAAqE;QACrE,yEAAyE;QACzE,iCAAiC;QACjC,sBAAsB;QACtB,EAAE;QACF,+DAA+D;QAC/D,iDAAiD;QACjD,yDAAyD;QACzD,8BAA8B;QAC9B,EAAE;QACF,8DAA8D;QAC9D,yDAAyD;QACzD,gDAAgD;QAChD,8BAA8B;QAC9B,EAAE;QACF,uDAAuD;QACvD,wCAAwC;QACxC,oCAAoC;QACpC,EAAE;QACF,WAAW;QACX,EAAE;QACF,wDAAwD;QACxD,8DAA8D;QAC9D,2EAA2E;KAC5E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PlanInput, PlanResult } from './types.js';
2
+ export declare function runPlan(input: PlanInput): Promise<PlanResult>;
3
+ //# sourceMappingURL=plan-orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-orchestrator.d.ts","sourceRoot":"","sources":["../../src/plan/plan-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKxD,wBAAsB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CA6BnE"}
@@ -0,0 +1,31 @@
1
+ import { join } from 'node:path';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import { writePartialConfig } from './config-writer.js';
4
+ import { generateBriefTemplate } from './brief-template-generator.js';
5
+ import { generatePlanAppSkill } from './skill-generator.js';
6
+ export async function runPlan(input) {
7
+ const { name, description, outputDir } = input;
8
+ const filesCreated = [];
9
+ // Create project directory
10
+ await mkdir(outputDir, { recursive: true });
11
+ // Write partial maxsim.config.yaml
12
+ const configPath = await writePartialConfig(outputDir, { name, description });
13
+ filesCreated.push(configPath);
14
+ // Write .claude/skills/plan-app.md
15
+ const skillsDir = join(outputDir, '.claude', 'skills');
16
+ await mkdir(skillsDir, { recursive: true });
17
+ const skillPath = join(skillsDir, 'plan-app.md');
18
+ await writeFile(skillPath, generatePlanAppSkill(), 'utf-8');
19
+ filesCreated.push(skillPath);
20
+ // Write docs/project-brief-template.md
21
+ const docsDir = join(outputDir, 'docs');
22
+ await mkdir(docsDir, { recursive: true });
23
+ const briefPath = join(docsDir, 'project-brief-template.md');
24
+ await writeFile(briefPath, generateBriefTemplate({ name, description }), 'utf-8');
25
+ filesCreated.push(briefPath);
26
+ return {
27
+ projectDir: outputDir,
28
+ filesCreated,
29
+ };
30
+ }
31
+ //# sourceMappingURL=plan-orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-orchestrator.js","sourceRoot":"","sources":["../../src/plan/plan-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAgB;IAC5C,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC/C,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,2BAA2B;IAC3B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,mCAAmC;IACnC,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC9E,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE9B,mCAAmC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,SAAS,EAAE,oBAAoB,EAAE,EAAE,OAAO,CAAC,CAAC;IAC5D,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7B,uCAAuC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,SAAS,EAAE,qBAAqB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAClF,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7B,OAAO;QACL,UAAU,EAAE,SAAS;QACrB,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generatePlanAppSkill(): string;
2
+ //# sourceMappingURL=skill-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.d.ts","sourceRoot":"","sources":["../../src/plan/skill-generator.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,IAAI,MAAM,CAmD7C"}
@@ -0,0 +1,53 @@
1
+ export function generatePlanAppSkill() {
2
+ return `---
3
+ description: AI-guided planning for your Flutter app. Leads you through vision, module selection, user journeys, and PRD generation.
4
+ model: claude-opus-4-6
5
+ ---
6
+
7
+ # /plan-app
8
+
9
+ You are helping to plan a Flutter app using the maxsim-flutter framework.
10
+
11
+ ## Instructions
12
+
13
+ Guide the user through the following planning phases:
14
+
15
+ ### Phase 1: Vision & Core Features
16
+
17
+ 1. Read \`docs/project-brief-template.md\` if it exists
18
+ 2. Ask the user to describe their app in 2-3 sentences
19
+ 3. Identify 3-5 core features
20
+ 4. Ask clarifying questions about each feature
21
+
22
+ ### Phase 2: Module Selection
23
+
24
+ Based on the app description, suggest which maxsim-flutter modules to enable:
25
+ - \`auth\` — User authentication
26
+ - \`api\` — Backend API integration
27
+ - \`database\` — Local data persistence
28
+ - \`theme\` — Custom branding & dark mode
29
+ - \`push\` — Push notifications
30
+ - \`analytics\` — Usage analytics
31
+ - \`i18n\` — Internationalization
32
+ - \`deep-linking\` — Deep links & universal links
33
+
34
+ ### Phase 3: User Journeys & Architecture
35
+
36
+ 1. Map the 2-3 primary user journeys
37
+ 2. Identify key screens and navigation flows
38
+ 3. Define the Clean Architecture layers needed
39
+
40
+ ### Phase 4: Generate Artifacts
41
+
42
+ Generate the following:
43
+ 1. Complete \`maxsim.config.yaml\` with selected modules
44
+ 2. \`prd.json\` with user stories for each module
45
+ 3. \`docs/architecture.md\` with system design
46
+
47
+ When ready, tell the user to run:
48
+ \`\`\`
49
+ maxsim-flutter create --config maxsim.config.yaml
50
+ \`\`\`
51
+ `;
52
+ }
53
+ //# sourceMappingURL=skill-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/plan/skill-generator.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDR,CAAC;AACF,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface PlanInput {
2
+ name: string;
3
+ description: string;
4
+ outputDir: string;
5
+ }
6
+ export interface PlanResult {
7
+ projectDir: string;
8
+ filesCreated: string[];
9
+ }
10
+ export declare function isValidSnakeCase(name: string): boolean;
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plan/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGtD"}
@@ -0,0 +1,6 @@
1
+ export function isValidSnakeCase(name) {
2
+ if (!name)
3
+ return false;
4
+ return /^[a-z][a-z0-9_]*$/.test(name);
5
+ }
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plan/types.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "maxsim-flutter",
3
- "version": "1.26.0",
3
+ "version": "1.28.0",
4
4
  "description": "AI-powered Flutter app scaffolding with Clean Architecture, Riverpod, and autonomous development via Ralph",
5
5
  "type": "module",
6
6
  "bin": {