appiq-solution 1.0.2 → 1.0.3
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.
- package/appiq-installer.js +698 -143
- package/package.json +1 -1
package/appiq-installer.js
CHANGED
@@ -22,13 +22,20 @@ class AppiqSolutionInstaller {
|
|
22
22
|
this.config = {
|
23
23
|
version: "1.0.0",
|
24
24
|
projectType: null, // 'greenfield' or 'brownfield'
|
25
|
-
techStack: {
|
25
|
+
techStack: {
|
26
|
+
platform: null, // 'flutter', 'web', 'fullstack', 'api'
|
27
|
+
isFlutter: false,
|
28
|
+
hasUI: false,
|
29
|
+
database: null,
|
30
|
+
libraries: []
|
31
|
+
},
|
26
32
|
selectedIDEs: [],
|
27
33
|
projectName: null,
|
28
34
|
projectIdea: null,
|
29
35
|
targetUsers: null,
|
30
36
|
projectPlan: null,
|
31
37
|
planApproved: false,
|
38
|
+
mcpConfigs: {},
|
32
39
|
};
|
33
40
|
}
|
34
41
|
|
@@ -39,8 +46,11 @@ class AppiqSolutionInstaller {
|
|
39
46
|
console.log(chalk.dim("https://github.com/Viktor-Hermann/APPIQ-METHOD\n"));
|
40
47
|
|
41
48
|
try {
|
42
|
-
|
43
|
-
|
49
|
+
// Phase 1: Projekt-Typ Detection
|
50
|
+
await this.detectProjectType();
|
51
|
+
|
52
|
+
// Phase 1.5: Tech Stack Detection (Flutter, Web, etc.)
|
53
|
+
await this.detectTechStack();
|
44
54
|
|
45
55
|
// Phase 2: Projektidee erfassen
|
46
56
|
await this.collectProjectIdea();
|
@@ -54,25 +64,28 @@ class AppiqSolutionInstaller {
|
|
54
64
|
// Phase 5: Plan-Freigabe
|
55
65
|
await this.approvePlan();
|
56
66
|
|
57
|
-
|
58
|
-
|
67
|
+
// Phase 6: Installation
|
68
|
+
await this.performInstallation();
|
59
69
|
|
60
|
-
|
70
|
+
// Phase 7: MCP Configuration Setup
|
71
|
+
await this.setupMCPConfigurations();
|
72
|
+
|
73
|
+
// Phase 8: BMAD Core Configuration Setup
|
61
74
|
await this.setupBMADCoreConfig();
|
62
75
|
|
63
|
-
// Phase
|
76
|
+
// Phase 9: Document Templates & Dependencies
|
64
77
|
await this.setupDocumentTemplates();
|
65
78
|
|
66
|
-
// Phase
|
79
|
+
// Phase 10: Agent Dependencies System (+ Flutter Agents)
|
67
80
|
await this.setupAgentDependencies();
|
68
81
|
|
69
|
-
// Phase
|
82
|
+
// Phase 11: BMAD Orchestration (Full Flow)
|
70
83
|
await this.setupBMADOrchestration();
|
71
84
|
|
72
|
-
// Phase
|
85
|
+
// Phase 12: One-Click Setup
|
73
86
|
await this.setupOneClickWorkflows();
|
74
87
|
|
75
|
-
// Phase
|
88
|
+
// Phase 13: Simple Instructions
|
76
89
|
await this.showSimpleInstructions();
|
77
90
|
} catch (error) {
|
78
91
|
console.error(chalk.red("❌ Installation failed:"), error.message);
|
@@ -189,6 +202,77 @@ class AppiqSolutionInstaller {
|
|
189
202
|
console.log(chalk.green(`✅ IDEs: ${ideNames}\n`));
|
190
203
|
}
|
191
204
|
|
205
|
+
async detectTechStack() {
|
206
|
+
console.log(chalk.yellow("🔍 Tech Stack Detection"));
|
207
|
+
console.log(chalk.gray("Analysiere Projekt-Umgebung und Tech Stack...\n"));
|
208
|
+
|
209
|
+
// Check for Flutter
|
210
|
+
const isFlutter = fs.existsSync(path.join(this.projectRoot, 'pubspec.yaml'));
|
211
|
+
|
212
|
+
// Check for existing web frameworks
|
213
|
+
const hasPackageJson = fs.existsSync(path.join(this.projectRoot, 'package.json'));
|
214
|
+
let webFramework = null;
|
215
|
+
|
216
|
+
if (hasPackageJson) {
|
217
|
+
try {
|
218
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(this.projectRoot, 'package.json'), 'utf8'));
|
219
|
+
if (packageJson.dependencies) {
|
220
|
+
const deps = Object.keys(packageJson.dependencies);
|
221
|
+
if (deps.includes('next')) webFramework = 'next.js';
|
222
|
+
else if (deps.includes('react')) webFramework = 'react';
|
223
|
+
else if (deps.includes('vue')) webFramework = 'vue';
|
224
|
+
else if (deps.includes('@nuxt/core')) webFramework = 'nuxt.js';
|
225
|
+
else if (deps.includes('@angular/core')) webFramework = 'angular';
|
226
|
+
}
|
227
|
+
} catch (e) {
|
228
|
+
// ignore package.json parsing errors
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
// Auto-detect or ask user
|
233
|
+
if (isFlutter) {
|
234
|
+
console.log(chalk.green("✅ Flutter Projekt erkannt!"));
|
235
|
+
this.config.techStack.platform = 'flutter';
|
236
|
+
this.config.techStack.isFlutter = true;
|
237
|
+
this.config.techStack.hasUI = true;
|
238
|
+
console.log(chalk.cyan(" → Dart MCP Server wird konfiguriert"));
|
239
|
+
console.log(chalk.cyan(" → Flutter Clean Architecture Agents werden geladen\n"));
|
240
|
+
} else if (webFramework) {
|
241
|
+
console.log(chalk.green(`✅ ${webFramework} Projekt erkannt!`));
|
242
|
+
this.config.techStack.platform = 'web';
|
243
|
+
this.config.techStack.hasUI = true;
|
244
|
+
console.log(chalk.cyan(" → shadcn/ui + v0.dev Integration wird konfiguriert\n"));
|
245
|
+
} else {
|
246
|
+
// Ask user for platform
|
247
|
+
const { platform } = await inquirer.prompt([
|
248
|
+
{
|
249
|
+
type: "list",
|
250
|
+
name: "platform",
|
251
|
+
message: "🎯 Welchen Tech Stack verwenden Sie?",
|
252
|
+
choices: [
|
253
|
+
{ name: "📱 Flutter Mobile App", value: "flutter" },
|
254
|
+
{ name: "🌐 Web App (React/Next.js/Vue)", value: "web" },
|
255
|
+
{ name: "🚀 Fullstack (Frontend + Backend)", value: "fullstack" },
|
256
|
+
{ name: "⚡ API/Backend Only", value: "api" },
|
257
|
+
{ name: "🤷 Noch nicht sicher", value: "unknown" },
|
258
|
+
],
|
259
|
+
},
|
260
|
+
]);
|
261
|
+
|
262
|
+
this.config.techStack.platform = platform;
|
263
|
+
this.config.techStack.isFlutter = platform === 'flutter';
|
264
|
+
this.config.techStack.hasUI = ['flutter', 'web', 'fullstack'].includes(platform);
|
265
|
+
|
266
|
+
if (platform === 'flutter') {
|
267
|
+
console.log(chalk.cyan(" → Dart MCP Server wird konfiguriert"));
|
268
|
+
console.log(chalk.cyan(" → Flutter Clean Architecture Agents werden geladen"));
|
269
|
+
} else if (platform === 'web' || platform === 'fullstack') {
|
270
|
+
console.log(chalk.cyan(" → shadcn/ui + v0.dev Integration wird konfiguriert"));
|
271
|
+
}
|
272
|
+
console.log('');
|
273
|
+
}
|
274
|
+
}
|
275
|
+
|
192
276
|
async collectProjectIdea() {
|
193
277
|
console.log(chalk.yellow("💡 Projektidee erfassen"));
|
194
278
|
console.log(chalk.gray("Beschreiben Sie Ihr Projekt-Vorhaben:\n"));
|
@@ -316,136 +400,183 @@ ${
|
|
316
400
|
- /deploy → Deployment vorbereiten`;
|
317
401
|
}
|
318
402
|
|
319
|
-
|
320
|
-
|
403
|
+
async setupBMADCoreConfig() {
|
404
|
+
console.log(chalk.yellow("⚙️ BMAD Core Configuration einrichten..."));
|
321
405
|
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
// Create core-config.yaml
|
329
|
-
const coreConfigPath = path.join(bmadCoreDir, 'core-config.yaml');
|
330
|
-
fs.writeFileSync(coreConfigPath, this.generateCoreConfig());
|
406
|
+
// Create .bmad-core directory
|
407
|
+
const bmadCoreDir = path.join(this.appiqPath, ".bmad-core");
|
408
|
+
if (!fs.existsSync(bmadCoreDir)) {
|
409
|
+
fs.mkdirSync(bmadCoreDir, { recursive: true });
|
410
|
+
}
|
331
411
|
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
fs.mkdirSync(techPrefsPath, { recursive: true });
|
336
|
-
}
|
337
|
-
fs.writeFileSync(path.join(techPrefsPath, 'technical-preferences.md'), this.generateTechnicalPreferences());
|
412
|
+
// Create core-config.yaml
|
413
|
+
const coreConfigPath = path.join(bmadCoreDir, "core-config.yaml");
|
414
|
+
fs.writeFileSync(coreConfigPath, this.generateCoreConfig());
|
338
415
|
|
339
|
-
|
416
|
+
// Create technical-preferences.md
|
417
|
+
const techPrefsPath = path.join(bmadCoreDir, "data");
|
418
|
+
if (!fs.existsSync(techPrefsPath)) {
|
419
|
+
fs.mkdirSync(techPrefsPath, { recursive: true });
|
340
420
|
}
|
421
|
+
fs.writeFileSync(
|
422
|
+
path.join(techPrefsPath, "technical-preferences.md"),
|
423
|
+
this.generateTechnicalPreferences()
|
424
|
+
);
|
341
425
|
|
342
|
-
|
343
|
-
|
426
|
+
console.log(chalk.green("✅ BMAD Core Configuration bereit!\n"));
|
427
|
+
}
|
344
428
|
|
345
|
-
|
346
|
-
|
347
|
-
const archDir = path.join(docsDir, 'architecture');
|
348
|
-
const storiesDir = path.join(docsDir, 'stories');
|
429
|
+
async setupDocumentTemplates() {
|
430
|
+
console.log(chalk.yellow("📄 Document Templates & Struktur einrichten..."));
|
349
431
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
});
|
432
|
+
// Create docs directory structure
|
433
|
+
const docsDir = path.join(this.projectRoot, "docs");
|
434
|
+
const archDir = path.join(docsDir, "architecture");
|
435
|
+
const storiesDir = path.join(docsDir, "stories");
|
355
436
|
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
fs.mkdirSync(templatesDir, { recursive: true });
|
437
|
+
[docsDir, archDir, storiesDir].forEach((dir) => {
|
438
|
+
if (!fs.existsSync(dir)) {
|
439
|
+
fs.mkdirSync(dir, { recursive: true });
|
360
440
|
}
|
441
|
+
});
|
361
442
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
// Story Template
|
369
|
-
fs.writeFileSync(path.join(templatesDir, 'story-template.md'), this.generateStoryTemplate());
|
443
|
+
// Create templates
|
444
|
+
const templatesDir = path.join(this.appiqPath, "templates");
|
445
|
+
if (!fs.existsSync(templatesDir)) {
|
446
|
+
fs.mkdirSync(templatesDir, { recursive: true });
|
447
|
+
}
|
370
448
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
449
|
+
// PRD Template
|
450
|
+
fs.writeFileSync(
|
451
|
+
path.join(templatesDir, "prd-template.md"),
|
452
|
+
this.generatePRDTemplate()
|
453
|
+
);
|
454
|
+
|
455
|
+
// Architecture Template
|
456
|
+
fs.writeFileSync(
|
457
|
+
path.join(templatesDir, "architecture-template.md"),
|
458
|
+
this.generateArchitectureTemplate()
|
459
|
+
);
|
375
460
|
|
376
|
-
|
461
|
+
// Story Template
|
462
|
+
fs.writeFileSync(
|
463
|
+
path.join(templatesDir, "story-template.md"),
|
464
|
+
this.generateStoryTemplate()
|
465
|
+
);
|
466
|
+
|
467
|
+
// Create initial PRD if planning is complete
|
468
|
+
if (this.config.planApproved) {
|
469
|
+
fs.writeFileSync(path.join(docsDir, "prd.md"), this.generateInitialPRD());
|
377
470
|
}
|
378
471
|
|
379
|
-
|
380
|
-
|
472
|
+
console.log(chalk.green("✅ Document Templates erstellt!\n"));
|
473
|
+
}
|
381
474
|
|
382
|
-
|
383
|
-
|
384
|
-
const dataDir = path.join(this.appiqPath, 'data');
|
475
|
+
async setupAgentDependencies() {
|
476
|
+
console.log(chalk.yellow("🔗 Agent Dependencies System einrichten..."));
|
385
477
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
fs.mkdirSync(dir, { recursive: true });
|
390
|
-
}
|
391
|
-
});
|
478
|
+
const agentsDir = path.join(this.appiqPath, "agents");
|
479
|
+
const tasksDir = path.join(this.appiqPath, "tasks");
|
480
|
+
const dataDir = path.join(this.appiqPath, "data");
|
392
481
|
|
393
|
-
|
394
|
-
|
482
|
+
// Create directories
|
483
|
+
[tasksDir, dataDir].forEach((dir) => {
|
484
|
+
if (!fs.existsSync(dir)) {
|
485
|
+
fs.mkdirSync(dir, { recursive: true });
|
486
|
+
}
|
487
|
+
});
|
395
488
|
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
489
|
+
// Create BMAD Knowledge Base
|
490
|
+
fs.writeFileSync(
|
491
|
+
path.join(dataDir, "bmad-kb.md"),
|
492
|
+
this.generateBMADKnowledgeBase()
|
493
|
+
);
|
400
494
|
|
401
|
-
|
402
|
-
|
495
|
+
// Create essential tasks
|
496
|
+
fs.writeFileSync(
|
497
|
+
path.join(tasksDir, "create-doc.md"),
|
498
|
+
this.generateCreateDocTask()
|
499
|
+
);
|
500
|
+
fs.writeFileSync(
|
501
|
+
path.join(tasksDir, "shard-doc.md"),
|
502
|
+
this.generateShardDocTask()
|
503
|
+
);
|
504
|
+
fs.writeFileSync(
|
505
|
+
path.join(tasksDir, "validate-story.md"),
|
506
|
+
this.generateValidateStoryTask()
|
507
|
+
);
|
403
508
|
|
404
|
-
|
509
|
+
// Add Flutter-specific agents if Flutter project
|
510
|
+
if (this.config.techStack.isFlutter) {
|
511
|
+
await this.addFlutterAgents();
|
405
512
|
}
|
406
513
|
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
// Create orchestration config based on BMAD Flow
|
411
|
-
const orchestrationConfig = {
|
412
|
-
planningPhase: {
|
413
|
-
agents: ["analyst", "pm", "ux-expert", "architect", "po"],
|
414
|
-
workflow: this.config.projectType === "greenfield" ? "greenfield-planning" : "brownfield-planning"
|
415
|
-
},
|
416
|
-
developmentPhase: {
|
417
|
-
agents: ["sm", "po", "dev", "qa"],
|
418
|
-
workflow: "core-development-cycle"
|
419
|
-
},
|
420
|
-
transitions: {
|
421
|
-
planningToIDE: "document-sharding",
|
422
|
-
criticalCommitPoints: ["before-next-story", "after-qa-approval"]
|
423
|
-
}
|
424
|
-
};
|
514
|
+
// Update agents with proper dependencies
|
515
|
+
await this.updateAgentsWithDependencies();
|
425
516
|
|
426
|
-
|
427
|
-
|
428
|
-
fs.writeFileSync(orchestrationPath, this.generateBMADOrchestration(orchestrationConfig));
|
517
|
+
console.log(chalk.green("✅ Agent Dependencies System bereit!\n"));
|
518
|
+
}
|
429
519
|
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
520
|
+
async setupBMADOrchestration() {
|
521
|
+
console.log(chalk.yellow("🎭 BMAD Full Orchestration einrichten..."));
|
522
|
+
|
523
|
+
// Create orchestration config based on BMAD Flow
|
524
|
+
const orchestrationConfig = {
|
525
|
+
planningPhase: {
|
526
|
+
agents: ["analyst", "pm", "ux-expert", "architect", "po"],
|
527
|
+
workflow:
|
528
|
+
this.config.projectType === "greenfield"
|
529
|
+
? "greenfield-planning"
|
530
|
+
: "brownfield-planning",
|
531
|
+
},
|
532
|
+
developmentPhase: {
|
533
|
+
agents: ["sm", "po", "dev", "qa"],
|
534
|
+
workflow: "core-development-cycle",
|
535
|
+
},
|
536
|
+
transitions: {
|
537
|
+
planningToIDE: "document-sharding",
|
538
|
+
criticalCommitPoints: ["before-next-story", "after-qa-approval"],
|
539
|
+
},
|
540
|
+
};
|
435
541
|
|
436
|
-
|
437
|
-
|
438
|
-
|
542
|
+
// Generate BMAD Orchestration
|
543
|
+
const orchestrationPath = path.join(
|
544
|
+
this.appiqPath,
|
545
|
+
"bmad-orchestration.yaml"
|
546
|
+
);
|
547
|
+
fs.writeFileSync(
|
548
|
+
orchestrationPath,
|
549
|
+
this.generateBMADOrchestration(orchestrationConfig)
|
550
|
+
);
|
439
551
|
|
440
|
-
|
552
|
+
// Create workflow guides
|
553
|
+
const workflowsDir = path.join(this.appiqPath, "workflows");
|
554
|
+
if (!fs.existsSync(workflowsDir)) {
|
555
|
+
fs.mkdirSync(workflowsDir, { recursive: true });
|
441
556
|
}
|
442
557
|
|
558
|
+
fs.writeFileSync(
|
559
|
+
path.join(workflowsDir, "planning-workflow.md"),
|
560
|
+
this.generatePlanningWorkflow()
|
561
|
+
);
|
562
|
+
fs.writeFileSync(
|
563
|
+
path.join(workflowsDir, "development-cycle.md"),
|
564
|
+
this.generateDevelopmentCycle()
|
565
|
+
);
|
566
|
+
fs.writeFileSync(
|
567
|
+
path.join(workflowsDir, "document-sharding.md"),
|
568
|
+
this.generateDocumentSharding()
|
569
|
+
);
|
570
|
+
|
571
|
+
console.log(chalk.green("✅ BMAD Full Orchestration bereit!\n"));
|
572
|
+
}
|
573
|
+
|
443
574
|
generateCoreConfig() {
|
444
575
|
return `# BMAD Core Configuration
|
445
576
|
# Built with ❤️ based on Bmad-Method
|
446
577
|
|
447
578
|
project:
|
448
|
-
name: ${this.config.projectName ||
|
579
|
+
name: ${this.config.projectName || "Unbenanntes Projekt"}
|
449
580
|
type: ${this.config.projectType}
|
450
581
|
created: ${new Date().toISOString()}
|
451
582
|
|
@@ -483,15 +614,50 @@ dependencies:
|
|
483
614
|
|
484
615
|
*Diese Datei hilft PM und Architect dabei, Ihre bevorzugten Design-Patterns und Technologien zu berücksichtigen.*
|
485
616
|
|
486
|
-
## Projekt: ${this.config.projectName ||
|
617
|
+
## Projekt: ${this.config.projectName || "Unbenanntes Projekt"}
|
618
|
+
**Platform:** ${this.config.techStack.platform || 'nicht definiert'}
|
487
619
|
|
488
620
|
### Bevorzugte Technologien
|
489
|
-
${this.config.projectType === 'greenfield' ? `
|
490
|
-
**Frontend:**
|
491
|
-
- Framework: React/Next.js, Vue/Nuxt, Angular
|
492
|
-
- State Management: Zustand, Redux Toolkit, Pinia
|
493
|
-
- Styling: Tailwind CSS, Material-UI, Ant Design
|
494
621
|
|
622
|
+
${this.config.techStack.isFlutter ? `
|
623
|
+
**📱 Flutter Mobile Development:**
|
624
|
+
- **Framework:** Flutter 3.35+ (beta), Dart 3.9+
|
625
|
+
- **Architecture:** Clean Architecture with Feature-based structure
|
626
|
+
- **State Management:** Cubit/BLoC pattern (preferred), Riverpod (alternative)
|
627
|
+
- **Dependency Injection:** GetIt + Injectable
|
628
|
+
- **Code Generation:** Freezed, Build Runner
|
629
|
+
- **Backend Integration:** Firebase, Supabase, REST APIs, GraphQL
|
630
|
+
- **Testing:** Unit Testing, Widget Testing, Integration Testing, Golden Tests
|
631
|
+
|
632
|
+
**🔌 Flutter MCP Integration:**
|
633
|
+
- **Dart MCP Server:** Automatisch konfiguriert für AI-Assistenten
|
634
|
+
- **Hot Reload:** Via MCP für Live-Development
|
635
|
+
- **Package Management:** pub.dev Integration via MCP
|
636
|
+
- **Error Analysis:** Automatische Fehlererkennung via MCP
|
637
|
+
|
638
|
+
**📦 Recommended Packages:**
|
639
|
+
- **UI:** Material 3, Cupertino (iOS-style)
|
640
|
+
- **Navigation:** go_router
|
641
|
+
- **HTTP:** dio
|
642
|
+
- **Local Storage:** shared_preferences, hive
|
643
|
+
- **Image:** cached_network_image
|
644
|
+
` : ''}
|
645
|
+
|
646
|
+
${this.config.techStack.platform === 'web' || this.config.techStack.platform === 'fullstack' ? `
|
647
|
+
**🌐 Web Development:**
|
648
|
+
- **Framework:** React/Next.js, Vue/Nuxt, Angular
|
649
|
+
- **UI Library:** shadcn/ui (preferred), v0.dev components, Material-UI, Chakra UI
|
650
|
+
- **Styling:** Tailwind CSS, CSS-in-JS, SCSS
|
651
|
+
- **AI Design:** v0.dev für Rapid Prototyping
|
652
|
+
|
653
|
+
**🎨 shadcn/ui + v0.dev Integration:**
|
654
|
+
- **Design System:** shadcn/ui als Basis-Komponenten
|
655
|
+
- **AI-Generated Components:** v0.dev für schnelle UI-Erstellung
|
656
|
+
- **Customization:** Tailwind CSS für individuelle Anpassungen
|
657
|
+
- **Accessibility:** Radix-UI Primitives als Basis
|
658
|
+
` : ''}
|
659
|
+
|
660
|
+
${this.config.projectType === "greenfield" && !this.config.techStack.isFlutter ? `
|
495
661
|
**Backend:**
|
496
662
|
- Runtime: Node.js, Python, Go
|
497
663
|
- Framework: Express, FastAPI, Gin
|
@@ -501,33 +667,71 @@ ${this.config.projectType === 'greenfield' ? `
|
|
501
667
|
- Deployment: Vercel, Railway, AWS
|
502
668
|
- CI/CD: GitHub Actions, GitLab CI
|
503
669
|
- Monitoring: Sentry, LogRocket
|
504
|
-
` :
|
670
|
+
` : ''}
|
671
|
+
|
672
|
+
${this.config.projectType === "brownfield" ? `
|
505
673
|
**Bestehende Technologien erweitern:**
|
506
674
|
- Kompatibilität mit bestehender Code-Basis beachten
|
507
675
|
- Minimale neue Dependencies
|
508
676
|
- Schrittweise Migration wenn nötig
|
509
|
-
`}
|
677
|
+
` : ''}
|
510
678
|
|
511
679
|
### Design Patterns
|
680
|
+
${this.config.techStack.isFlutter ? `
|
681
|
+
- **Clean Architecture** (Presentation → Domain → Data)
|
682
|
+
- **Feature-based Structure** (/features/auth, /features/dashboard)
|
683
|
+
- **Repository Pattern** für Datenaccess
|
684
|
+
- **Cubit Pattern** für State Management
|
685
|
+
- **SOLID Principles** anwenden
|
686
|
+
` : `
|
512
687
|
- **Architektur:** Clean Architecture, Hexagonal, MVC
|
513
688
|
- **Code Style:** DRY, SOLID Principles, KISS
|
689
|
+
${this.config.techStack.hasUI ? '- **Design System:** shadcn/ui für konsistente UI' : ''}
|
690
|
+
`}
|
691
|
+
|
692
|
+
### Testing & Quality
|
693
|
+
${this.config.techStack.isFlutter ? `
|
694
|
+
- **Dart Analysis:** Very strict linting rules
|
695
|
+
- **Flutter Lints:** Official Flutter linting package
|
696
|
+
- **Testing:** Minimum 80% code coverage
|
697
|
+
- **Golden Tests:** UI consistency tests
|
698
|
+
- **Integration Tests:** End-to-end testing
|
699
|
+
` : `
|
514
700
|
- **Testing:** TDD/BDD, Unit + Integration Tests
|
515
701
|
- **Documentation:** README-driven, Inline Comments
|
702
|
+
- **Code Quality:** ESLint + Prettier (wenn applicable)
|
703
|
+
${this.config.techStack.hasUI ? '- **Component Testing:** Storybook für Component Documentation' : ''}
|
704
|
+
`}
|
705
|
+
|
706
|
+
### AI-Integration & MCP
|
707
|
+
${this.config.techStack.isFlutter ? `
|
708
|
+
- **Dart MCP Server:** Für direkten AI-Zugriff auf Flutter Tools
|
709
|
+
- **Flutter DevTools:** MCP-basierte AI-Assistenz
|
710
|
+
- **Package Discovery:** AI-gestützte pub.dev Suche
|
711
|
+
- **Code Analysis:** Automatische Fehlererkennung und -behebung
|
712
|
+
` : ''}
|
713
|
+
${this.config.techStack.hasUI && !this.config.techStack.isFlutter ? `
|
714
|
+
- **v0.dev Integration:** AI-generierte UI-Komponenten
|
715
|
+
- **shadcn/ui Library:** KI-optimierte Component Library
|
716
|
+
- **Design Tokens:** Konsistente AI-generierte Designs
|
717
|
+
` : ''}
|
516
718
|
|
517
719
|
### Coding Standards
|
518
|
-
- **Naming:** camelCase für Variablen, PascalCase für Components
|
519
|
-
- **Files:** kebab-case für Dateien, PascalCase für Components
|
720
|
+
- **Naming:** ${this.config.techStack.isFlutter ? 'lowerCamelCase für Variablen, PascalCase für Classes' : 'camelCase für Variablen, PascalCase für Components'}
|
721
|
+
- **Files:** ${this.config.techStack.isFlutter ? 'snake_case für Dart Dateien' : 'kebab-case für Dateien, PascalCase für Components'}
|
520
722
|
- **Functions:** Kleine, fokussierte Funktionen (<50 Zeilen)
|
521
723
|
- **Comments:** Erkläre WARUM, nicht WAS
|
522
724
|
|
523
725
|
### Präferenzen
|
524
726
|
- **Performance:** Optimierung vor Abstraktion
|
525
727
|
- **Security:** Security-by-Design
|
526
|
-
- **Accessibility:** WCAG 2.1 AA Standard
|
728
|
+
- **Accessibility:** ${this.config.techStack.isFlutter ? 'Flutter Accessibility Widget support' : 'WCAG 2.1 AA Standard'}
|
527
729
|
- **Mobile:** Mobile-First Approach
|
528
730
|
|
529
731
|
---
|
530
|
-
*
|
732
|
+
*Platform: ${this.config.techStack.platform}*
|
733
|
+
*MCP Configured: ${this.config.techStack.isFlutter ? 'Dart MCP ✅' : 'Standard'}*
|
734
|
+
*Aktualisiert: ${new Date().toLocaleDateString("de-DE")}*
|
531
735
|
`;
|
532
736
|
}
|
533
737
|
|
@@ -727,7 +931,7 @@ ${this.config.projectType === 'greenfield' ? `
|
|
727
931
|
|
728
932
|
generateInitialPRD() {
|
729
933
|
const { projectName, projectIdea, targetUsers, projectType } = this.config;
|
730
|
-
|
934
|
+
|
731
935
|
return `# Product Requirements Document (PRD)
|
732
936
|
|
733
937
|
## Projekt: ${projectName}
|
@@ -739,7 +943,11 @@ ${projectIdea}
|
|
739
943
|
${targetUsers}
|
740
944
|
|
741
945
|
### 3. Project Type
|
742
|
-
${
|
946
|
+
${
|
947
|
+
projectType === "greenfield"
|
948
|
+
? "✨ Greenfield (Neues Projekt)"
|
949
|
+
: "🔧 Brownfield (Bestehendes Projekt)"
|
950
|
+
}
|
743
951
|
|
744
952
|
### 4. Functional Requirements (FRs)
|
745
953
|
*Diese Sektion wird durch den PM Agent vervollständigt*
|
@@ -756,7 +964,7 @@ ${projectType === 'greenfield' ? '✨ Greenfield (Neues Projekt)' : '🔧 Brownf
|
|
756
964
|
---
|
757
965
|
**Status:** 📋 Planning Phase Complete - Ready for PM Agent
|
758
966
|
**Nächster Schritt:** PM Agent für detaillierte Requirements
|
759
|
-
**Created:** ${new Date().toLocaleDateString(
|
967
|
+
**Created:** ${new Date().toLocaleDateString("de-DE")}
|
760
968
|
|
761
969
|
---
|
762
970
|
*Erstellt mit Appiq Solution - Built with ❤️ based on Bmad-Method*
|
@@ -965,6 +1173,162 @@ Ensure user stories align with PRD, architecture, and project goals.
|
|
965
1173
|
`;
|
966
1174
|
}
|
967
1175
|
|
1176
|
+
async addFlutterAgents() {
|
1177
|
+
console.log(chalk.cyan(" 📱 Adding Flutter-specific agents..."));
|
1178
|
+
|
1179
|
+
const agentsDir = path.join(this.appiqPath, "agents");
|
1180
|
+
const flutterExpansionPath = path.join(__dirname, '..', 'expansion-packs', 'bmad-flutter-mobile-dev', 'agents');
|
1181
|
+
|
1182
|
+
// Check if Flutter expansion pack exists
|
1183
|
+
if (!fs.existsSync(flutterExpansionPath)) {
|
1184
|
+
console.log(chalk.yellow(" ⚠️ Flutter expansion pack not found - creating basic Flutter agents"));
|
1185
|
+
await this.createBasicFlutterAgents();
|
1186
|
+
return;
|
1187
|
+
}
|
1188
|
+
|
1189
|
+
// Copy Flutter agents from expansion pack
|
1190
|
+
const flutterAgents = [
|
1191
|
+
'flutter-ui-agent.md',
|
1192
|
+
'flutter-cubit-agent.md',
|
1193
|
+
'flutter-data-agent.md',
|
1194
|
+
'flutter-domain-agent.md',
|
1195
|
+
'shared-components-agent.md'
|
1196
|
+
];
|
1197
|
+
|
1198
|
+
for (const agentFile of flutterAgents) {
|
1199
|
+
const sourcePath = path.join(flutterExpansionPath, agentFile);
|
1200
|
+
const targetPath = path.join(agentsDir, agentFile);
|
1201
|
+
|
1202
|
+
if (fs.existsSync(sourcePath)) {
|
1203
|
+
fs.copyFileSync(sourcePath, targetPath);
|
1204
|
+
console.log(chalk.green(` ✅ ${agentFile} hinzugefügt`));
|
1205
|
+
}
|
1206
|
+
}
|
1207
|
+
|
1208
|
+
// Create Flutter-specific data files
|
1209
|
+
const dataDir = path.join(this.appiqPath, "data");
|
1210
|
+
const flutterDataPath = path.join(__dirname, '..', 'expansion-packs', 'bmad-flutter-mobile-dev', 'data');
|
1211
|
+
|
1212
|
+
if (fs.existsSync(path.join(flutterDataPath, 'flutter-development-guidelines.md'))) {
|
1213
|
+
fs.copyFileSync(
|
1214
|
+
path.join(flutterDataPath, 'flutter-development-guidelines.md'),
|
1215
|
+
path.join(dataDir, 'flutter-development-guidelines.md')
|
1216
|
+
);
|
1217
|
+
console.log(chalk.green(" ✅ Flutter development guidelines hinzugefügt"));
|
1218
|
+
}
|
1219
|
+
}
|
1220
|
+
|
1221
|
+
async createBasicFlutterAgents() {
|
1222
|
+
console.log(chalk.gray(" 🔨 Creating basic Flutter agents..."));
|
1223
|
+
|
1224
|
+
const agentsDir = path.join(this.appiqPath, "agents");
|
1225
|
+
|
1226
|
+
// Basic Flutter UI Agent
|
1227
|
+
const flutterUIAgent = this.generateBasicFlutterUIAgent();
|
1228
|
+
fs.writeFileSync(path.join(agentsDir, 'flutter-ui-agent.md'), flutterUIAgent);
|
1229
|
+
|
1230
|
+
// Basic Flutter State Management Agent
|
1231
|
+
const flutterStateAgent = this.generateBasicFlutterStateAgent();
|
1232
|
+
fs.writeFileSync(path.join(agentsDir, 'flutter-cubit-agent.md'), flutterStateAgent);
|
1233
|
+
|
1234
|
+
console.log(chalk.green(" ✅ Basic Flutter agents created"));
|
1235
|
+
}
|
1236
|
+
|
1237
|
+
generateBasicFlutterUIAgent() {
|
1238
|
+
return `# Flutter UI Agent
|
1239
|
+
|
1240
|
+
Du bist ein spezialisierter Flutter UI Agent, der sich auf die Erstellung von benutzerfreundlichen und responsive Mobile UI-Komponenten fokussiert.
|
1241
|
+
|
1242
|
+
## Rolle & Verantwortung
|
1243
|
+
|
1244
|
+
- **UI Design & Implementation:** Erstelle schöne, Material 3 konforme Flutter UIs
|
1245
|
+
- **Widget Composition:** Verwende effiziente Widget-Hierarchien
|
1246
|
+
- **Responsive Design:** Sichere Kompatibilität für verschiedene Bildschirmgrößen
|
1247
|
+
- **Accessibility:** Implementiere barrierefreie UI-Komponenten
|
1248
|
+
|
1249
|
+
## Expertise
|
1250
|
+
|
1251
|
+
### Flutter UI Frameworks
|
1252
|
+
- **Material 3:** Modernes Material Design
|
1253
|
+
- **Cupertino:** iOS-native Looks
|
1254
|
+
- **Custom Widgets:** Individuelle UI-Komponenten
|
1255
|
+
|
1256
|
+
### Best Practices
|
1257
|
+
- **Widget Keys:** Für Testability und Performance
|
1258
|
+
- **Const Constructors:** Memory-Optimierung
|
1259
|
+
- **Build Method Optimization:** Verhindere unnecessary rebuilds
|
1260
|
+
- **Theme Integration:** Konsistente Design Systems
|
1261
|
+
|
1262
|
+
## Tech Stack Integration
|
1263
|
+
|
1264
|
+
**Platform:** ${this.config.techStack.platform}
|
1265
|
+
**MCP:** ${this.config.techStack.isFlutter ? 'Dart MCP Server ✅' : 'Standard'}
|
1266
|
+
|
1267
|
+
### Dart MCP Tools
|
1268
|
+
- Hot Reload via MCP
|
1269
|
+
- Widget Inspection via AI
|
1270
|
+
- pub.dev Package Discovery
|
1271
|
+
- Runtime Error Analysis
|
1272
|
+
|
1273
|
+
## Workflow Integration
|
1274
|
+
|
1275
|
+
**Planning Phase:** Arbeite mit UX Expert an UI Specs
|
1276
|
+
**Development Phase:** Implementiere UI basierend auf Cubit State
|
1277
|
+
**Testing Phase:** Golden Tests für UI Consistency
|
1278
|
+
|
1279
|
+
---
|
1280
|
+
*Built with ❤️ based on Bmad-Method*
|
1281
|
+
*Flutter Clean Architecture + Dart MCP Integration*
|
1282
|
+
`;
|
1283
|
+
}
|
1284
|
+
|
1285
|
+
generateBasicFlutterStateAgent() {
|
1286
|
+
return `# Flutter Cubit State Management Agent
|
1287
|
+
|
1288
|
+
Du bist ein spezialisierter Flutter State Management Agent mit Fokus auf Cubit/BLoC Pattern und Clean Architecture.
|
1289
|
+
|
1290
|
+
## Rolle & Verantwortung
|
1291
|
+
|
1292
|
+
- **State Management:** Implementiere Cubit/BLoC Pattern
|
1293
|
+
- **Clean Architecture:** Separation of Concerns (Presentation → Domain → Data)
|
1294
|
+
- **Dependency Injection:** GetIt + Injectable Setup
|
1295
|
+
- **Event Handling:** User Interactions und API Calls
|
1296
|
+
|
1297
|
+
## Expertise
|
1298
|
+
|
1299
|
+
### State Management
|
1300
|
+
- **Cubit:** Simple State Management für UI
|
1301
|
+
- **BLoC:** Complex Business Logic mit Events
|
1302
|
+
- **Riverpod:** Alternative State Management (if needed)
|
1303
|
+
|
1304
|
+
### Architecture Patterns
|
1305
|
+
- **Clean Architecture:** Feature-based Structure
|
1306
|
+
- **Repository Pattern:** Data Access Layer
|
1307
|
+
- **Use Cases:** Business Logic Layer
|
1308
|
+
- **Dependency Injection:** Loose Coupling
|
1309
|
+
|
1310
|
+
## Tech Stack Integration
|
1311
|
+
|
1312
|
+
**Platform:** ${this.config.techStack.platform}
|
1313
|
+
**MCP:** ${this.config.techStack.isFlutter ? 'Dart MCP Server ✅' : 'Standard'}
|
1314
|
+
|
1315
|
+
### Code Generation
|
1316
|
+
- **Freezed:** Immutable Data Classes
|
1317
|
+
- **Injectable:** Dependency Injection Setup
|
1318
|
+
- **Build Runner:** Code Generation Pipeline
|
1319
|
+
|
1320
|
+
## Workflow Integration
|
1321
|
+
|
1322
|
+
**Planning Phase:** Definiere State Structure mit Domain Agent
|
1323
|
+
**Development Phase:** Implementiere Business Logic
|
1324
|
+
**Testing Phase:** Unit Tests für Cubits und Use Cases
|
1325
|
+
|
1326
|
+
---
|
1327
|
+
*Built with ❤️ based on Bmad-Method*
|
1328
|
+
*Flutter Clean Architecture + Dart MCP Integration*
|
1329
|
+
`;
|
1330
|
+
}
|
1331
|
+
|
968
1332
|
async updateAgentsWithDependencies() {
|
969
1333
|
console.log(chalk.gray(" 🔗 Updating agents with BMAD dependencies..."));
|
970
1334
|
|
@@ -973,7 +1337,7 @@ Ensure user stories align with PRD, architecture, and project goals.
|
|
973
1337
|
|
974
1338
|
for (const agentFile of agents) {
|
975
1339
|
const agentPath = path.join(agentsDir, agentFile);
|
976
|
-
let content = fs.readFileSync(agentPath,
|
1340
|
+
let content = fs.readFileSync(agentPath, "utf8");
|
977
1341
|
|
978
1342
|
// Add BMAD dependencies section to each agent
|
979
1343
|
const dependenciesSection = `
|
@@ -1006,12 +1370,12 @@ Ensure user stories align with PRD, architecture, and project goals.
|
|
1006
1370
|
`;
|
1007
1371
|
|
1008
1372
|
// Add dependencies section before the final line
|
1009
|
-
const lines = content.split(
|
1373
|
+
const lines = content.split("\n");
|
1010
1374
|
const lastLine = lines.pop(); // Remove last line
|
1011
1375
|
lines.push(dependenciesSection);
|
1012
1376
|
lines.push(lastLine); // Add last line back
|
1013
1377
|
|
1014
|
-
fs.writeFileSync(agentPath, lines.join(
|
1378
|
+
fs.writeFileSync(agentPath, lines.join("\n"));
|
1015
1379
|
}
|
1016
1380
|
}
|
1017
1381
|
|
@@ -1029,7 +1393,7 @@ project:
|
|
1029
1393
|
planning_phase:
|
1030
1394
|
workflow: ${config.planningPhase.workflow}
|
1031
1395
|
agents:
|
1032
|
-
${config.planningPhase.agents.map(agent => ` - ${agent}`).join(
|
1396
|
+
${config.planningPhase.agents.map((agent) => ` - ${agent}`).join("\n")}
|
1033
1397
|
|
1034
1398
|
flow:
|
1035
1399
|
1: "analyst → research & project brief (optional)"
|
@@ -1051,7 +1415,7 @@ transition:
|
|
1051
1415
|
development_phase:
|
1052
1416
|
workflow: ${config.developmentPhase.workflow}
|
1053
1417
|
agents:
|
1054
|
-
${config.developmentPhase.agents.map(agent => ` - ${agent}`).join(
|
1418
|
+
${config.developmentPhase.agents.map((agent) => ` - ${agent}`).join("\n")}
|
1055
1419
|
|
1056
1420
|
cycle:
|
1057
1421
|
1: "sm → review previous story dev/QA notes"
|
@@ -1068,13 +1432,19 @@ ${config.developmentPhase.agents.map(agent => ` - ${agent}`).join('\n')}
|
|
1068
1432
|
|
1069
1433
|
# Critical Commit Points
|
1070
1434
|
commit_points:
|
1071
|
-
${config.transitions.criticalCommitPoints
|
1435
|
+
${config.transitions.criticalCommitPoints
|
1436
|
+
.map((point) => ` - ${point}`)
|
1437
|
+
.join("\n")}
|
1072
1438
|
|
1073
1439
|
# IDE Integration
|
1074
1440
|
ides:
|
1075
|
-
${this.config.selectedIDEs
|
1441
|
+
${this.config.selectedIDEs
|
1442
|
+
.map(
|
1443
|
+
(ide) => ` - name: ${this.getIDEName(ide)}
|
1076
1444
|
config_path: ${this.getIDEConfig(ide).dir}
|
1077
|
-
file_format: ${this.getIDEConfig(ide).suffix}`
|
1445
|
+
file_format: ${this.getIDEConfig(ide).suffix}`
|
1446
|
+
)
|
1447
|
+
.join("\n")}
|
1078
1448
|
|
1079
1449
|
# Context Management
|
1080
1450
|
context:
|
@@ -1381,6 +1751,171 @@ devLoadAlwaysFiles:
|
|
1381
1751
|
`;
|
1382
1752
|
}
|
1383
1753
|
|
1754
|
+
async setupMCPConfigurations() {
|
1755
|
+
console.log(chalk.yellow("🔌 MCP (Model Context Protocol) Setup"));
|
1756
|
+
console.log(chalk.gray("Konfiguriere MCP Server für AI-Assistenten...\n"));
|
1757
|
+
|
1758
|
+
// Flutter/Dart MCP specific setup
|
1759
|
+
if (this.config.techStack.isFlutter) {
|
1760
|
+
console.log(chalk.cyan("🎯 Dart MCP Server für Flutter wird konfiguriert..."));
|
1761
|
+
await this.setupDartMCPServer();
|
1762
|
+
}
|
1763
|
+
|
1764
|
+
// Web/Fullstack MCP setup
|
1765
|
+
if (this.config.techStack.platform === 'web' || this.config.techStack.platform === 'fullstack') {
|
1766
|
+
console.log(chalk.cyan("🌐 Web MCP Konfiguration..."));
|
1767
|
+
await this.setupWebMCPServer();
|
1768
|
+
}
|
1769
|
+
|
1770
|
+
// Configure MCP for each selected IDE
|
1771
|
+
for (const ide of this.config.selectedIDEs) {
|
1772
|
+
await this.configureMCPForIDE(ide);
|
1773
|
+
}
|
1774
|
+
|
1775
|
+
console.log(chalk.green("✅ MCP Configuration abgeschlossen!\n"));
|
1776
|
+
}
|
1777
|
+
|
1778
|
+
async setupDartMCPServer() {
|
1779
|
+
// Create Dart MCP configuration for Flutter projects
|
1780
|
+
const dartMCPConfig = {
|
1781
|
+
dart: {
|
1782
|
+
command: "dart",
|
1783
|
+
args: [
|
1784
|
+
"mcp-server",
|
1785
|
+
"--experimental-mcp-server"
|
1786
|
+
]
|
1787
|
+
}
|
1788
|
+
};
|
1789
|
+
|
1790
|
+
this.config.mcpConfigs.dart = dartMCPConfig;
|
1791
|
+
|
1792
|
+
// Generate setup instructions
|
1793
|
+
const mcpInstructionsPath = path.join(this.appiqPath, 'mcp-setup-instructions.md');
|
1794
|
+
fs.writeFileSync(mcpInstructionsPath, this.generateDartMCPInstructions());
|
1795
|
+
|
1796
|
+
console.log(chalk.green(" ✅ Dart MCP Server Konfiguration erstellt"));
|
1797
|
+
console.log(chalk.gray(" → mcp-setup-instructions.md mit Anweisungen erstellt"));
|
1798
|
+
}
|
1799
|
+
|
1800
|
+
async setupWebMCPServer() {
|
1801
|
+
// Web/shadcn/v0.dev specific MCP setup if needed
|
1802
|
+
console.log(chalk.green(" ✅ Web MCP Konfiguration vorbereitet"));
|
1803
|
+
}
|
1804
|
+
|
1805
|
+
async configureMCPForIDE(ide) {
|
1806
|
+
const ideConfig = this.getIDEConfig(ide);
|
1807
|
+
const mcpPath = this.getMCPConfigPath(ide);
|
1808
|
+
|
1809
|
+
if (mcpPath && this.config.mcpConfigs.dart) {
|
1810
|
+
// Create IDE-specific MCP config
|
1811
|
+
const ideMCPDir = path.dirname(path.join(this.projectRoot, mcpPath));
|
1812
|
+
if (!fs.existsSync(ideMCPDir)) {
|
1813
|
+
fs.mkdirSync(ideMCPDir, { recursive: true });
|
1814
|
+
}
|
1815
|
+
|
1816
|
+
const mcpConfigContent = this.generateMCPConfigForIDE(ide);
|
1817
|
+
fs.writeFileSync(path.join(this.projectRoot, mcpPath), mcpConfigContent);
|
1818
|
+
|
1819
|
+
console.log(chalk.green(` ✅ ${this.getIDEName(ide)} MCP konfiguriert`));
|
1820
|
+
}
|
1821
|
+
}
|
1822
|
+
|
1823
|
+
getMCPConfigPath(ide) {
|
1824
|
+
const mcpPaths = {
|
1825
|
+
cursor: '.cursor/mcp.json',
|
1826
|
+
'claude-code': null, // Uses Gemini CLI config
|
1827
|
+
windsurf: '.windsurf/mcp.json',
|
1828
|
+
cline: null, // Uses VS Code config
|
1829
|
+
trae: '.trae/mcp.json',
|
1830
|
+
roo: '.roo/mcp.json',
|
1831
|
+
gemini: '.gemini/settings.json',
|
1832
|
+
'github-copilot': null, // Uses VS Code settings
|
1833
|
+
};
|
1834
|
+
return mcpPaths[ide];
|
1835
|
+
}
|
1836
|
+
|
1837
|
+
generateMCPConfigForIDE(ide) {
|
1838
|
+
if (ide === 'gemini') {
|
1839
|
+
return JSON.stringify({
|
1840
|
+
mcpServers: this.config.mcpConfigs
|
1841
|
+
}, null, 2);
|
1842
|
+
} else {
|
1843
|
+
return JSON.stringify({
|
1844
|
+
mcpServers: this.config.mcpConfigs
|
1845
|
+
}, null, 2);
|
1846
|
+
}
|
1847
|
+
}
|
1848
|
+
|
1849
|
+
generateDartMCPInstructions() {
|
1850
|
+
return `# 🚀 Dart MCP Server Setup für Flutter Projekte
|
1851
|
+
|
1852
|
+
*Built with ❤️ based on Bmad-Method*
|
1853
|
+
|
1854
|
+
## ⚡ Was ist der Dart MCP Server?
|
1855
|
+
|
1856
|
+
Der Dart MCP Server ermöglicht AI-Assistenten direkten Zugriff auf:
|
1857
|
+
- **Analyse und Fehlerbehebung** in Ihrem Code
|
1858
|
+
- **Interaktion mit laufender App** (Hot Reload, Widget-Inspektion)
|
1859
|
+
- **pub.dev Suche** nach passenden Packages
|
1860
|
+
- **Dependency Management** in pubspec.yaml
|
1861
|
+
- **Test-Ausführung** und Analyse
|
1862
|
+
|
1863
|
+
## 🔧 Setup für Ihre IDEs
|
1864
|
+
|
1865
|
+
### ${this.config.selectedIDEs.includes('cursor') ? '✅ Cursor' : '❌ Cursor (nicht ausgewählt)'}
|
1866
|
+
${this.config.selectedIDEs.includes('cursor') ? `
|
1867
|
+
**Automatisch konfiguriert!** ✅
|
1868
|
+
- Datei: \`.cursor/mcp.json\`
|
1869
|
+
- Bereit für Verwendung
|
1870
|
+
` : ''}
|
1871
|
+
|
1872
|
+
### ${this.config.selectedIDEs.includes('claude-code') ? '✅ Claude Code CLI' : '❌ Claude Code CLI (nicht ausgewählt)'}
|
1873
|
+
${this.config.selectedIDEs.includes('claude-code') ? `
|
1874
|
+
**Setup-Schritte:**
|
1875
|
+
1. \`gemini\` CLI installieren falls noch nicht vorhanden
|
1876
|
+
2. Konfiguration in \`~/.gemini/settings.json\` bereits erstellt
|
1877
|
+
3. Verwenden Sie: \`/mcp\` um verfügbare Tools anzuzeigen
|
1878
|
+
` : ''}
|
1879
|
+
|
1880
|
+
### ${this.config.selectedIDEs.includes('github-copilot') ? '✅ GitHub Copilot in VS Code' : '❌ GitHub Copilot (nicht ausgewählt)'}
|
1881
|
+
${this.config.selectedIDEs.includes('github-copilot') ? `
|
1882
|
+
**Setup-Schritte:**
|
1883
|
+
1. VS Code Settings öffnen
|
1884
|
+
2. Hinzufügen: \`"dart.mcpServer": true\`
|
1885
|
+
3. Optional: \`"chat.mcp.discovery.enabled": true\`
|
1886
|
+
` : ''}
|
1887
|
+
|
1888
|
+
## 📋 Voraussetzungen
|
1889
|
+
|
1890
|
+
⚠️ **Wichtig:** Dart SDK 3.9+ / Flutter 3.35+ beta erforderlich!
|
1891
|
+
|
1892
|
+
\`\`\`bash
|
1893
|
+
# Flutter auf beta channel wechseln
|
1894
|
+
flutter channel beta
|
1895
|
+
flutter upgrade
|
1896
|
+
\`\`\`
|
1897
|
+
|
1898
|
+
## 🎯 Verwendung
|
1899
|
+
|
1900
|
+
Nach dem Setup können Sie Ihren AI-Assistenten fragen:
|
1901
|
+
|
1902
|
+
- **"Analysiere Fehler in meiner Flutter App"**
|
1903
|
+
- **"Finde ein Package für Karten-Integration"**
|
1904
|
+
- **"Führe Tests aus und zeige Ergebnisse"**
|
1905
|
+
- **"Triggere Hot Reload"**
|
1906
|
+
- **"Was ist das aktuell ausgewählte Widget?"**
|
1907
|
+
|
1908
|
+
## 🔗 Weitere Infos
|
1909
|
+
|
1910
|
+
📖 **Vollständige Dokumentation:**
|
1911
|
+
https://medium.com/flutter/supercharge-your-dart-flutter-development-experience-with-the-dart-mcp-server-2edcc8107b49
|
1912
|
+
|
1913
|
+
---
|
1914
|
+
*Erstellt am: ${new Date().toLocaleDateString('de-DE')}*
|
1915
|
+
*IDEs: ${this.config.selectedIDEs.map(ide => this.getIDEName(ide)).join(', ')}*
|
1916
|
+
`;
|
1917
|
+
}
|
1918
|
+
|
1384
1919
|
async performInstallation() {
|
1385
1920
|
console.log(chalk.yellow("📦 Installation läuft..."));
|
1386
1921
|
|
@@ -1617,7 +2152,9 @@ ${
|
|
1617
2152
|
|
1618
2153
|
## Projekt: ${this.config.projectName || "Unbenanntes Projekt"}
|
1619
2154
|
**Typ:** ${
|
1620
|
-
this.config.projectType === "greenfield"
|
2155
|
+
this.config.projectType === "greenfield"
|
2156
|
+
? "✨ Greenfield (Neues Projekt)"
|
2157
|
+
: "🔧 Brownfield (Bestehendes Projekt)"
|
1621
2158
|
}
|
1622
2159
|
|
1623
2160
|
## 📋 BMAD Planning Workflow (Phase 1)
|
@@ -1682,16 +2219,22 @@ ${
|
|
1682
2219
|
- \`/qa\` → Request review
|
1683
2220
|
- \`/commit\` → Commit changes
|
1684
2221
|
|
1685
|
-
### ${
|
1686
|
-
|
2222
|
+
### ${
|
2223
|
+
this.config.projectType === "greenfield" ? "Greenfield" : "Brownfield"
|
2224
|
+
} Specific:
|
2225
|
+
${
|
2226
|
+
this.config.projectType === "greenfield"
|
2227
|
+
? `
|
1687
2228
|
- \`/start\` → Fresh project setup
|
1688
2229
|
- \`/design\` → Create from scratch
|
1689
2230
|
- \`/build\` → Build step by step
|
1690
|
-
`
|
2231
|
+
`
|
2232
|
+
: `
|
1691
2233
|
- \`/analyze\` → Analyze existing code
|
1692
2234
|
- \`/document\` → Document current state
|
1693
2235
|
- \`/improve\` → Plan improvements
|
1694
|
-
`
|
2236
|
+
`
|
2237
|
+
}
|
1695
2238
|
|
1696
2239
|
## 📊 File Structure
|
1697
2240
|
|
@@ -1748,7 +2291,9 @@ your-project/
|
|
1748
2291
|
- appiq-solution/workflows/document-sharding.md
|
1749
2292
|
|
1750
2293
|
---
|
1751
|
-
**IDEs:** ${this.config.selectedIDEs
|
2294
|
+
**IDEs:** ${this.config.selectedIDEs
|
2295
|
+
.map((ide) => this.getIDEName(ide))
|
2296
|
+
.join(", ")}
|
1752
2297
|
**Created:** ${new Date().toLocaleDateString("de-DE")}
|
1753
2298
|
**Powered by Appiq Solution - Built with ❤️ based on Bmad-Method**
|
1754
2299
|
`;
|
@@ -1851,7 +2396,9 @@ your-project/
|
|
1851
2396
|
|
1852
2397
|
console.log(chalk.yellow("2. 📋 BMAD Planning Workflow:"));
|
1853
2398
|
if (this.config.planApproved) {
|
1854
|
-
console.log(
|
2399
|
+
console.log(
|
2400
|
+
chalk.green(` ✅ Planning Complete - Ready for Development!`)
|
2401
|
+
);
|
1855
2402
|
console.log(chalk.cyan(` → Ihre initial PRD: docs/prd.md`));
|
1856
2403
|
} else {
|
1857
2404
|
console.log(chalk.cyan(` Option A: Web UI (kosteneffizient)`));
|
@@ -1859,11 +2406,19 @@ your-project/
|
|
1859
2406
|
console.log(chalk.cyan(` Option B: Direkt in IDE`));
|
1860
2407
|
console.log(chalk.gray(` → @pm für PRD, @architect für Architecture`));
|
1861
2408
|
}
|
1862
|
-
console.log(
|
2409
|
+
console.log("");
|
1863
2410
|
|
1864
2411
|
console.log(chalk.yellow("3. ⚠️ KRITISCHER ÜBERGANG: Document Sharding"));
|
1865
|
-
console.log(
|
1866
|
-
|
2412
|
+
console.log(
|
2413
|
+
chalk.red(
|
2414
|
+
` → Sagen Sie Ihrer IDE: ${chalk.bold(
|
2415
|
+
'"@po bitte shard die PRD und Architecture Dokumente"'
|
2416
|
+
)}`
|
2417
|
+
)
|
2418
|
+
);
|
2419
|
+
console.log(
|
2420
|
+
chalk.gray(` → Dokumente werden in fokussierte Teile aufgeteilt\n`)
|
2421
|
+
);
|
1867
2422
|
|
1868
2423
|
console.log(chalk.yellow("4. 🚀 BMAD Development Cycle:"));
|
1869
2424
|
console.log(chalk.cyan(` 1. @sm → Story Draft von Sharded Epic`));
|
@@ -1876,7 +2431,7 @@ your-project/
|
|
1876
2431
|
|
1877
2432
|
console.log(chalk.yellow("5. 🎯 Quick Commands (in quick-start.md):"));
|
1878
2433
|
console.log(chalk.cyan(` /plan → Planning starten`));
|
1879
|
-
console.log(chalk.cyan(` /shard → Document Sharding`));
|
2434
|
+
console.log(chalk.cyan(` /shard → Document Sharding`));
|
1880
2435
|
console.log(chalk.cyan(` /story → Nächste Story`));
|
1881
2436
|
console.log(chalk.cyan(` /dev → Development`));
|
1882
2437
|
console.log(chalk.cyan(` /qa → Quality Review`));
|
@@ -1979,7 +2534,7 @@ if (require.main === module) {
|
|
1979
2534
|
|
1980
2535
|
if (args.length === 0 || args[0] === "install") {
|
1981
2536
|
const installer = new AppiqSolutionInstaller();
|
1982
|
-
|
2537
|
+
installer.install().catch(console.error);
|
1983
2538
|
} else {
|
1984
2539
|
console.log(
|
1985
2540
|
chalk.red("❌ Unknown command. Use: npx appiq-solution install")
|
package/package.json
CHANGED