appiq-solution 1.4.2 โ 1.4.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.
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "appiq-solution",
|
3
|
-
"version": "1.4.
|
3
|
+
"version": "1.4.3",
|
4
4
|
"description": "๐ Super einfache KI-Agent Installation mit One-Click Workflows fรผr Web, Mobile (Flutter) & Backend - Built with โค๏ธ based on Bmad-Method",
|
5
5
|
"main": "tools/appiq-installer.js",
|
6
6
|
"bin": {
|
@@ -123,24 +123,29 @@ class AppiqSolutionInstaller {
|
|
123
123
|
console.log(chalk.dim("https://github.com/Viktor-Hermann/APPIQ-METHOD\n"));
|
124
124
|
|
125
125
|
try {
|
126
|
-
// Phase 1:
|
126
|
+
// Phase 1: Project Type Detection
|
127
127
|
await this.detectProjectType();
|
128
128
|
|
129
129
|
// Phase 1.5: Tech Stack Detection (Flutter, Web, etc.)
|
130
130
|
await this.detectTechStack();
|
131
131
|
|
132
|
-
// Phase 2:
|
133
|
-
|
132
|
+
// Phase 2: Project idea collection (only for greenfield projects)
|
133
|
+
if (this.config.projectType === "greenfield") {
|
134
|
+
await this.collectProjectIdea();
|
135
|
+
} else {
|
136
|
+
// For brownfield projects: auto-set project name from directory
|
137
|
+
await this.generateBrownfieldProjectConfig();
|
138
|
+
}
|
134
139
|
|
135
140
|
// Phase 3: IDE Selection (MULTISELECT)
|
136
141
|
await this.selectIDE();
|
137
142
|
|
138
143
|
|
139
144
|
|
140
|
-
// Phase 5:
|
145
|
+
// Phase 5: Create project plan
|
141
146
|
await this.createProjectPlan();
|
142
147
|
|
143
|
-
// Phase 6: Plan
|
148
|
+
// Phase 6: Plan Approval
|
144
149
|
await this.approvePlan();
|
145
150
|
|
146
151
|
// Phase 7: Installation
|
@@ -172,7 +177,7 @@ class AppiqSolutionInstaller {
|
|
172
177
|
}
|
173
178
|
|
174
179
|
async detectProjectType() {
|
175
|
-
console.log(chalk.yellow("๐
|
180
|
+
console.log(chalk.yellow("๐ Project Analysis..."));
|
176
181
|
|
177
182
|
// Auto-Detection
|
178
183
|
const hasPackageJson = fs.existsSync(
|
@@ -185,20 +190,20 @@ class AppiqSolutionInstaller {
|
|
185
190
|
const hasDocumentation = this.hasExistingDocumentation();
|
186
191
|
|
187
192
|
let suggestedType = "greenfield";
|
188
|
-
let reason = "
|
193
|
+
let reason = "New project detected";
|
189
194
|
|
190
195
|
if (hasExistingCode || hasDocumentation) {
|
191
196
|
suggestedType = "brownfield";
|
192
|
-
reason = "
|
197
|
+
reason = "Existing code/documentation found";
|
193
198
|
}
|
194
199
|
|
195
|
-
console.log(chalk.gray(`๐ก
|
200
|
+
console.log(chalk.gray(`๐ก Analysis: ${reason}`));
|
196
201
|
console.log(
|
197
202
|
chalk.gray(
|
198
|
-
`๐
|
203
|
+
`๐ Recommendation: ${
|
199
204
|
suggestedType === "greenfield"
|
200
|
-
? "Greenfield (
|
201
|
-
: "Brownfield (
|
205
|
+
? "Greenfield (New Project)"
|
206
|
+
: "Brownfield (Existing Project)"
|
202
207
|
}`
|
203
208
|
)
|
204
209
|
);
|
@@ -208,17 +213,17 @@ class AppiqSolutionInstaller {
|
|
208
213
|
{
|
209
214
|
type: "list",
|
210
215
|
name: "projectType",
|
211
|
-
message: "๐ฏ
|
216
|
+
message: "๐ฏ What type of project is this?",
|
212
217
|
choices: [
|
213
218
|
{
|
214
|
-
name: `โจ Greenfield -
|
219
|
+
name: `โจ Greenfield - New project (Recommended: ${
|
215
220
|
suggestedType === "greenfield" ? "โ
" : "โ"
|
216
221
|
})`,
|
217
222
|
value: "greenfield",
|
218
223
|
short: "Greenfield",
|
219
224
|
},
|
220
225
|
{
|
221
|
-
name: `๐ง Brownfield -
|
226
|
+
name: `๐ง Brownfield - Enhance existing project (Recommended: ${
|
222
227
|
suggestedType === "brownfield" ? "โ
" : "โ"
|
223
228
|
})`,
|
224
229
|
value: "brownfield",
|
@@ -232,30 +237,30 @@ class AppiqSolutionInstaller {
|
|
232
237
|
this.config.projectType = projectType;
|
233
238
|
console.log(
|
234
239
|
chalk.green(
|
235
|
-
`โ
|
240
|
+
`โ
Project Type: ${
|
236
241
|
projectType === "greenfield"
|
237
|
-
? "Greenfield (
|
238
|
-
: "Brownfield (
|
242
|
+
? "Greenfield (New)"
|
243
|
+
: "Brownfield (Existing)"
|
239
244
|
}\n`
|
240
245
|
)
|
241
246
|
);
|
242
247
|
}
|
243
248
|
|
244
249
|
async selectIDE() {
|
245
|
-
console.log(chalk.yellow("๐ ๏ธ IDE
|
250
|
+
console.log(chalk.yellow("๐ ๏ธ IDE Selection"));
|
246
251
|
console.log(
|
247
252
|
chalk.bold.yellow.bgRed(
|
248
|
-
" โ ๏ธ MULTISELECT:
|
253
|
+
" โ ๏ธ MULTISELECT: Use SPACEBAR to select multiple IDEs! "
|
249
254
|
)
|
250
255
|
);
|
251
|
-
console.log(chalk.gray("
|
256
|
+
console.log(chalk.gray("Select ALL IDEs that you use:\n"));
|
252
257
|
|
253
258
|
const { ides } = await inquirer.prompt([
|
254
259
|
{
|
255
260
|
type: "checkbox",
|
256
261
|
name: "ides",
|
257
262
|
message:
|
258
|
-
"๐ฏ
|
263
|
+
"๐ฏ Which IDEs do you use? (SPACEBAR = select, ENTER = confirm)",
|
259
264
|
choices: [
|
260
265
|
{ name: "๐ต Cursor", value: "cursor" },
|
261
266
|
{ name: "๐ฃ Claude Code CLI", value: "claude-code" },
|
@@ -268,7 +273,7 @@ class AppiqSolutionInstaller {
|
|
268
273
|
],
|
269
274
|
validate: (input) => {
|
270
275
|
if (input.length === 0) {
|
271
|
-
return "
|
276
|
+
return "Please select at least one IDE!";
|
272
277
|
}
|
273
278
|
return true;
|
274
279
|
},
|
@@ -284,7 +289,7 @@ class AppiqSolutionInstaller {
|
|
284
289
|
|
285
290
|
async detectTechStack() {
|
286
291
|
console.log(chalk.yellow("๐ Tech Stack Detection"));
|
287
|
-
console.log(chalk.gray("
|
292
|
+
console.log(chalk.gray("Analyzing project environment and tech stack...\n"));
|
288
293
|
|
289
294
|
// Check for Flutter
|
290
295
|
const isFlutter = fs.existsSync(
|
@@ -317,20 +322,20 @@ class AppiqSolutionInstaller {
|
|
317
322
|
|
318
323
|
// Auto-detect or ask user
|
319
324
|
if (isFlutter) {
|
320
|
-
console.log(chalk.green("โ
Flutter
|
325
|
+
console.log(chalk.green("โ
Flutter project detected!"));
|
321
326
|
this.config.techStack.platform = "flutter";
|
322
327
|
this.config.techStack.isFlutter = true;
|
323
328
|
this.config.techStack.hasUI = true;
|
324
|
-
console.log(chalk.cyan(" โ Dart MCP Server
|
329
|
+
console.log(chalk.cyan(" โ Dart MCP Server will be configured"));
|
325
330
|
console.log(
|
326
|
-
chalk.cyan(" โ Flutter Clean Architecture Agents
|
331
|
+
chalk.cyan(" โ Flutter Clean Architecture Agents will be loaded\n")
|
327
332
|
);
|
328
333
|
} else if (webFramework) {
|
329
|
-
console.log(chalk.green(`โ
${webFramework}
|
334
|
+
console.log(chalk.green(`โ
${webFramework} project detected!`));
|
330
335
|
this.config.techStack.platform = "web";
|
331
336
|
this.config.techStack.hasUI = true;
|
332
337
|
console.log(
|
333
|
-
chalk.cyan(" โ shadcn/ui + v0.dev
|
338
|
+
chalk.cyan(" โ shadcn/ui + v0.dev integration will be configured\n")
|
334
339
|
);
|
335
340
|
} else {
|
336
341
|
// Ask user for platform
|
@@ -338,13 +343,13 @@ class AppiqSolutionInstaller {
|
|
338
343
|
{
|
339
344
|
type: "list",
|
340
345
|
name: "platform",
|
341
|
-
message: "๐ฏ
|
346
|
+
message: "๐ฏ Which tech stack are you using?",
|
342
347
|
choices: [
|
343
348
|
{ name: "๐ฑ Flutter Mobile App", value: "flutter" },
|
344
349
|
{ name: "๐ Web App (React/Next.js/Vue)", value: "web" },
|
345
350
|
{ name: "๐ Fullstack (Frontend + Backend)", value: "fullstack" },
|
346
351
|
{ name: "โก API/Backend Only", value: "api" },
|
347
|
-
{ name: "๐คท
|
352
|
+
{ name: "๐คท Not sure yet", value: "unknown" },
|
348
353
|
],
|
349
354
|
},
|
350
355
|
]);
|
@@ -356,13 +361,13 @@ class AppiqSolutionInstaller {
|
|
356
361
|
);
|
357
362
|
|
358
363
|
if (platform === "flutter") {
|
359
|
-
console.log(chalk.cyan(" โ Dart MCP Server
|
364
|
+
console.log(chalk.cyan(" โ Dart MCP Server will be configured"));
|
360
365
|
console.log(
|
361
|
-
chalk.cyan(" โ Flutter Clean Architecture Agents
|
366
|
+
chalk.cyan(" โ Flutter Clean Architecture Agents will be loaded")
|
362
367
|
);
|
363
368
|
} else if (platform === "web" || platform === "fullstack") {
|
364
369
|
console.log(
|
365
|
-
chalk.cyan(" โ shadcn/ui + v0.dev
|
370
|
+
chalk.cyan(" โ shadcn/ui + v0.dev integration will be configured")
|
366
371
|
);
|
367
372
|
}
|
368
373
|
console.log("");
|
@@ -370,32 +375,49 @@ class AppiqSolutionInstaller {
|
|
370
375
|
}
|
371
376
|
|
372
377
|
async collectProjectIdea() {
|
373
|
-
console.log(chalk.yellow("๐ก
|
374
|
-
|
378
|
+
console.log(chalk.yellow("๐ก Collecting Project Information"));
|
379
|
+
|
380
|
+
// For brownfield projects, skip detailed project idea collection
|
381
|
+
if (this.config.projectType === "brownfield") {
|
382
|
+
console.log(
|
383
|
+
chalk.gray("๐ Detected existing project - using current directory\n")
|
384
|
+
);
|
385
|
+
|
386
|
+
const dirName = path.basename(this.projectRoot);
|
387
|
+
this.config.projectName = dirName;
|
388
|
+
this.config.projectIdea = `Brownfield project: ${dirName}`;
|
389
|
+
this.config.targetUsers = "Existing project users";
|
390
|
+
|
391
|
+
console.log(chalk.green(`โ
Project identified: "${dirName}"\n`));
|
392
|
+
return;
|
393
|
+
}
|
394
|
+
|
395
|
+
// For greenfield projects, collect detailed information
|
396
|
+
console.log(chalk.gray("Describe your project concept:\n"));
|
375
397
|
|
376
398
|
const { projectIdea, projectName, targetUsers } = await inquirer.prompt([
|
377
399
|
{
|
378
400
|
type: "input",
|
379
401
|
name: "projectName",
|
380
|
-
message: "๐ท๏ธ
|
402
|
+
message: "๐ท๏ธ What should your project be called?",
|
381
403
|
validate: (input) =>
|
382
|
-
input.length > 0 ? true : "
|
404
|
+
input.length > 0 ? true : "Please enter a project name!",
|
383
405
|
},
|
384
406
|
{
|
385
407
|
type: "editor",
|
386
408
|
name: "projectIdea",
|
387
|
-
message: "๐ก
|
409
|
+
message: "๐ก Describe your project idea (detailed):",
|
388
410
|
validate: (input) =>
|
389
411
|
input.length > 10
|
390
412
|
? true
|
391
|
-
: "
|
413
|
+
: "Please describe your project in more detail!",
|
392
414
|
},
|
393
415
|
{
|
394
416
|
type: "input",
|
395
417
|
name: "targetUsers",
|
396
|
-
message: "๐ฅ
|
418
|
+
message: "๐ฅ Who are your target groups/users?",
|
397
419
|
validate: (input) =>
|
398
|
-
input.length > 0 ? true : "
|
420
|
+
input.length > 0 ? true : "Please describe your target audience!",
|
399
421
|
},
|
400
422
|
]);
|
401
423
|
|
@@ -403,18 +425,88 @@ class AppiqSolutionInstaller {
|
|
403
425
|
this.config.projectIdea = projectIdea;
|
404
426
|
this.config.targetUsers = targetUsers;
|
405
427
|
|
406
|
-
console.log(chalk.green(`โ
|
428
|
+
console.log(chalk.green(`โ
Project idea captured: "${projectName}"\n`));
|
429
|
+
}
|
430
|
+
|
431
|
+
async generateBrownfieldProjectConfig() {
|
432
|
+
console.log(chalk.yellow("๐ Configuring brownfield project..."));
|
433
|
+
|
434
|
+
// Auto-set project name from directory name
|
435
|
+
const dirName = path.basename(this.projectRoot);
|
436
|
+
this.config.projectName = dirName;
|
437
|
+
|
438
|
+
console.log(chalk.cyan(`๐ท๏ธ Project name: ${dirName}`));
|
439
|
+
console.log(chalk.gray(" โ Using directory name as project name"));
|
440
|
+
|
441
|
+
// Set default values for brownfield projects
|
442
|
+
this.config.projectIdea = `Enhancing existing ${dirName} project with AI agents`;
|
443
|
+
this.config.targetUsers = "Existing project stakeholders and development team";
|
444
|
+
|
445
|
+
// Auto-create docs/prd.md if it doesn't exist
|
446
|
+
const docsDir = path.join(this.projectRoot, "docs");
|
447
|
+
const prdPath = path.join(docsDir, "prd.md");
|
448
|
+
|
449
|
+
if (!fs.existsSync(prdPath)) {
|
450
|
+
if (!fs.existsSync(docsDir)) {
|
451
|
+
fs.mkdirSync(docsDir, { recursive: true });
|
452
|
+
}
|
453
|
+
|
454
|
+
const prdTemplate = this.config.techStack?.isFlutter ?
|
455
|
+
"flutter-mobile-prd-tmpl.yaml" : "prd-tmpl.yaml";
|
456
|
+
|
457
|
+
console.log(chalk.cyan("๐ Creating docs/prd.md automatically"));
|
458
|
+
console.log(chalk.gray(` โ Using template: ${prdTemplate}`));
|
459
|
+
|
460
|
+
const prdContent = `# Product Requirements Document - ${dirName}
|
461
|
+
|
462
|
+
## Project Overview
|
463
|
+
This is a brownfield project enhancement for ${dirName}.
|
464
|
+
|
465
|
+
**Note:** Please fill in your specific requirements, features, and objectives below.
|
466
|
+
|
467
|
+
## Current State Analysis
|
468
|
+
- [ ] Document existing functionality
|
469
|
+
- [ ] Identify technical debt
|
470
|
+
- [ ] List current features
|
471
|
+
- [ ] Note architecture patterns
|
472
|
+
|
473
|
+
## Enhancement Goals
|
474
|
+
- [ ] Define new features to add
|
475
|
+
- [ ] List improvements to make
|
476
|
+
- [ ] Specify performance goals
|
477
|
+
- [ ] Document user experience improvements
|
478
|
+
|
479
|
+
## Technical Requirements
|
480
|
+
- [ ] Document current tech stack
|
481
|
+
- [ ] List required integrations
|
482
|
+
- [ ] Define API requirements
|
483
|
+
- [ ] Specify database changes
|
484
|
+
|
485
|
+
## Next Steps
|
486
|
+
1. Fill in the requirements above
|
487
|
+
2. Run \`@architect\` to analyze current architecture
|
488
|
+
3. Use \`@sm\` to create feature stories
|
489
|
+
4. Start implementation with \`@dev\`
|
490
|
+
`;
|
491
|
+
|
492
|
+
fs.writeFileSync(prdPath, prdContent);
|
493
|
+
console.log(chalk.green("โ
docs/prd.md created successfully"));
|
494
|
+
} else {
|
495
|
+
console.log(chalk.cyan("๐ docs/prd.md already exists"));
|
496
|
+
}
|
497
|
+
|
498
|
+
console.log(chalk.green(`โ
Brownfield project configured: "${dirName}"\n`));
|
407
499
|
}
|
408
500
|
|
409
501
|
async createProjectPlan() {
|
410
|
-
console.log(chalk.yellow("๐
|
411
|
-
console.log(chalk.gray("
|
502
|
+
console.log(chalk.yellow("๐ Creating project plan..."));
|
503
|
+
console.log(chalk.gray("Based on your idea and project type\n"));
|
412
504
|
|
413
|
-
//
|
505
|
+
// Normally team-fullstack.yaml would be used here
|
414
506
|
const plan = this.generateProjectPlan();
|
415
507
|
this.config.projectPlan = plan;
|
416
508
|
|
417
|
-
console.log(chalk.cyan("๐
|
509
|
+
console.log(chalk.cyan("๐ Your Project Plan:"));
|
418
510
|
console.log(chalk.white("โ".repeat(50)));
|
419
511
|
console.log(plan);
|
420
512
|
console.log(chalk.white("โ".repeat(50) + "\n"));
|
@@ -425,26 +517,26 @@ class AppiqSolutionInstaller {
|
|
425
517
|
{
|
426
518
|
type: "confirm",
|
427
519
|
name: "approved",
|
428
|
-
message: "โ
|
520
|
+
message: "โ
Are you satisfied with this plan?",
|
429
521
|
default: true,
|
430
522
|
},
|
431
523
|
{
|
432
524
|
type: "input",
|
433
525
|
name: "changes",
|
434
526
|
message:
|
435
|
-
"๐
|
527
|
+
"๐ What changes would you like? (or ENTER for no changes)",
|
436
528
|
when: (answers) => !answers.approved,
|
437
529
|
},
|
438
530
|
]);
|
439
531
|
|
440
532
|
if (!approved && changes) {
|
441
|
-
console.log(chalk.yellow("๐
|
533
|
+
console.log(chalk.yellow("๐ Adapting plan..."));
|
442
534
|
this.config.planChanges = changes;
|
443
|
-
//
|
444
|
-
console.log(chalk.green("โ
Plan
|
535
|
+
// Plan would be adapted here
|
536
|
+
console.log(chalk.green("โ
Plan has been adapted!\n"));
|
445
537
|
} else {
|
446
538
|
console.log(
|
447
|
-
chalk.green("โ
Plan
|
539
|
+
chalk.green("โ
Plan approved - development can start!\n")
|
448
540
|
);
|
449
541
|
}
|
450
542
|
|
@@ -454,50 +546,50 @@ class AppiqSolutionInstaller {
|
|
454
546
|
generateProjectPlan() {
|
455
547
|
const { projectType, projectName, projectIdea, targetUsers } = this.config;
|
456
548
|
|
457
|
-
return `๐ฏ
|
549
|
+
return `๐ฏ PROJECT PLAN: ${projectName}
|
458
550
|
|
459
|
-
๐
|
551
|
+
๐ PROJECT TYPE: ${
|
460
552
|
projectType === "greenfield"
|
461
|
-
? "Greenfield (
|
462
|
-
: "Brownfield (
|
553
|
+
? "Greenfield (New Project)"
|
554
|
+
: "Brownfield (Existing Project)"
|
463
555
|
}
|
464
|
-
๐ฅ
|
556
|
+
๐ฅ TARGET AUDIENCE: ${targetUsers}
|
465
557
|
|
466
|
-
๐ก
|
558
|
+
๐ก PROJECT IDEA:
|
467
559
|
${projectIdea}
|
468
560
|
|
469
|
-
๐
|
561
|
+
๐ DEVELOPMENT PIPELINE:
|
470
562
|
${
|
471
563
|
projectType === "greenfield"
|
472
564
|
? `
|
473
|
-
1. ๐ PO (Product Owner) โ PRD
|
474
|
-
2. ๐๏ธ Architect โ
|
565
|
+
1. ๐ PO (Product Owner) โ Create PRD
|
566
|
+
2. ๐๏ธ Architect โ Design system architecture
|
475
567
|
3. ๐จ UX Expert โ UI/UX Design
|
476
|
-
4. ๐ Story Master โ
|
477
|
-
5. ๐ป Developer โ
|
478
|
-
6. โ
QA Expert โ Testing &
|
479
|
-
7. ๐ SM (Scrum Master) โ Sprint
|
568
|
+
4. ๐ Story Master โ Break down user stories
|
569
|
+
5. ๐ป Developer โ Implement features
|
570
|
+
6. โ
QA Expert โ Testing & validation
|
571
|
+
7. ๐ SM (Scrum Master) โ Sprint coordination
|
480
572
|
`
|
481
573
|
: `
|
482
|
-
1. ๐ PO โ
|
483
|
-
2. ๐๏ธ Architect โ
|
484
|
-
3. ๐ Story Master โ
|
485
|
-
4. ๐ป Developer โ
|
486
|
-
5. โ
QA Expert โ Regression
|
487
|
-
6. ๐ SM โ Change
|
574
|
+
1. ๐ PO โ Analyze existing documentation
|
575
|
+
2. ๐๏ธ Architect โ Architecture review
|
576
|
+
3. ๐ Story Master โ Plan new features
|
577
|
+
4. ๐ป Developer โ Integrate features into existing base
|
578
|
+
5. โ
QA Expert โ Regression testing
|
579
|
+
6. ๐ SM โ Change management
|
488
580
|
`
|
489
581
|
}
|
490
582
|
|
491
|
-
๐ฎ ONE-CLICK
|
492
|
-
- /start โ
|
493
|
-
- /plan โ
|
494
|
-
- /develop โ
|
495
|
-
- /review โ Code
|
496
|
-
- /deploy โ
|
583
|
+
๐ฎ ONE-CLICK COMMANDS:
|
584
|
+
- /start โ Start entire workflow
|
585
|
+
- /plan โ Detailed planning
|
586
|
+
- /develop โ Begin development
|
587
|
+
- /review โ Code review
|
588
|
+
- /deploy โ Prepare deployment`;
|
497
589
|
}
|
498
590
|
|
499
591
|
async setupBMADCoreConfig() {
|
500
|
-
console.log(chalk.yellow("โ๏ธ BMAD Core Configuration
|
592
|
+
console.log(chalk.yellow("โ๏ธ Setting up BMAD Core Configuration..."));
|
501
593
|
|
502
594
|
// Create .bmad-core directory
|
503
595
|
const bmadCoreDir = path.join(this.appiqPath, ".bmad-core");
|
@@ -565,11 +657,11 @@ ${
|
|
565
657
|
fs.writeFileSync(path.join(docsDir, "prd.md"), this.generateInitialPRD());
|
566
658
|
}
|
567
659
|
|
568
|
-
console.log(chalk.green("โ
Document Templates
|
660
|
+
console.log(chalk.green("โ
Document Templates created!\n"));
|
569
661
|
}
|
570
662
|
|
571
663
|
async setupAgentDependencies() {
|
572
|
-
console.log(chalk.yellow("๐ Agent Dependencies System
|
664
|
+
console.log(chalk.yellow("๐ Setting up Agent Dependencies System..."));
|
573
665
|
|
574
666
|
const agentsDir = path.join(this.appiqPath, "agents");
|
575
667
|
const tasksDir = path.join(this.appiqPath, "tasks");
|
@@ -2164,48 +2256,48 @@ ${
|
|
2164
2256
|
generateBrownfieldWorkflow(config) {
|
2165
2257
|
const workflows = {
|
2166
2258
|
"Appiq Launcher": `
|
2167
|
-
**๐ง
|
2168
|
-
1. \`/analyze\` -
|
2169
|
-
2. **
|
2170
|
-
3. **
|
2259
|
+
**๐ง Quick Start for Existing Project:**
|
2260
|
+
1. \`/analyze\` - Analyzes existing project
|
2261
|
+
2. **Finds:** Existing docs, code structure, tech stack
|
2262
|
+
3. **Creates:** Customized workflows for your project`,
|
2171
2263
|
|
2172
2264
|
"Project Manager": `
|
2173
|
-
**๐
|
2174
|
-
1. **
|
2175
|
-
2. **
|
2176
|
-
3. **
|
2177
|
-
4. **
|
2265
|
+
**๐ Automatic PRD Creation:**
|
2266
|
+
1. **Creates automatically:** \`docs/prd.md\` (if not present)
|
2267
|
+
2. **For Flutter Projects:** Uses flutter-mobile-prd-tmpl.yaml
|
2268
|
+
3. **No project name prompt** - Uses directory name
|
2269
|
+
4. **Next Step:** Architect for architecture review`,
|
2178
2270
|
|
2179
2271
|
"System Architect": `
|
2180
|
-
**๐๏ธ
|
2181
|
-
1. \`/review-architecture\` -
|
2182
|
-
2. **
|
2183
|
-
3. **
|
2272
|
+
**๐๏ธ Architecture Review:**
|
2273
|
+
1. \`/review-architecture\` - Analyzes existing structure
|
2274
|
+
2. **Creates/updates:** \`docs/architecture.md\`
|
2275
|
+
3. **Next Step:** Story Master for new features`,
|
2184
2276
|
|
2185
2277
|
"Story Master": `
|
2186
2278
|
**๐ Feature Stories:**
|
2187
|
-
1. \`/new-feature\` -
|
2188
|
-
2. **
|
2189
|
-
3. **
|
2279
|
+
1. \`/new-feature\` - New story for existing project
|
2280
|
+
2. **File created:** \`docs/stories/feature-XXX.md\`
|
2281
|
+
3. **Considers:** Existing code base`,
|
2190
2282
|
|
2191
2283
|
"Senior Developer": `
|
2192
2284
|
**๐ป Feature Implementation:**
|
2193
|
-
1. \`/add-feature\` -
|
2194
|
-
2. **
|
2195
|
-
3. **
|
2285
|
+
1. \`/add-feature\` - Implements in existing code
|
2286
|
+
2. **Edits:** Existing files safely
|
2287
|
+
3. **Creates:** New files where needed`,
|
2196
2288
|
|
2197
2289
|
"QA Expert": `
|
2198
2290
|
**โ
Regression Testing:**
|
2199
|
-
1. \`/regression-test\` -
|
2200
|
-
2. **
|
2201
|
-
3. **
|
2291
|
+
1. \`/regression-test\` - Tests new features
|
2292
|
+
2. **Validates:** No breaking changes
|
2293
|
+
3. **Creates:** Test reports for existing + new features`,
|
2202
2294
|
};
|
2203
2295
|
|
2204
2296
|
return workflows[config.name] || "Standard Brownfield Workflow";
|
2205
2297
|
}
|
2206
2298
|
|
2207
2299
|
async setupOneClickWorkflows() {
|
2208
|
-
console.log(chalk.yellow("โก One-Click Workflows
|
2300
|
+
console.log(chalk.yellow("โก Setting up One-Click Workflows..."));
|
2209
2301
|
|
2210
2302
|
// Create quick commands
|
2211
2303
|
const commandsDir = path.join(this.appiqPath, "commands");
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "appiq-solution",
|
3
|
-
"version": "1.4.
|
3
|
+
"version": "1.4.3",
|
4
4
|
"description": "๐ Super einfache KI-Agent Installation mit One-Click Workflows fรผr Web, Mobile (Flutter) & Backend - Built with โค๏ธ based on Bmad-Method",
|
5
5
|
"main": "tools/appiq-installer.js",
|
6
6
|
"bin": {
|
package/tools/appiq-installer.js
CHANGED
@@ -123,24 +123,29 @@ class AppiqSolutionInstaller {
|
|
123
123
|
console.log(chalk.dim("https://github.com/Viktor-Hermann/APPIQ-METHOD\n"));
|
124
124
|
|
125
125
|
try {
|
126
|
-
// Phase 1:
|
126
|
+
// Phase 1: Project Type Detection
|
127
127
|
await this.detectProjectType();
|
128
128
|
|
129
129
|
// Phase 1.5: Tech Stack Detection (Flutter, Web, etc.)
|
130
130
|
await this.detectTechStack();
|
131
131
|
|
132
|
-
// Phase 2:
|
133
|
-
|
132
|
+
// Phase 2: Project idea collection (only for greenfield projects)
|
133
|
+
if (this.config.projectType === "greenfield") {
|
134
|
+
await this.collectProjectIdea();
|
135
|
+
} else {
|
136
|
+
// For brownfield projects: auto-set project name from directory
|
137
|
+
await this.generateBrownfieldProjectConfig();
|
138
|
+
}
|
134
139
|
|
135
140
|
// Phase 3: IDE Selection (MULTISELECT)
|
136
141
|
await this.selectIDE();
|
137
142
|
|
138
143
|
|
139
144
|
|
140
|
-
// Phase 5:
|
145
|
+
// Phase 5: Create project plan
|
141
146
|
await this.createProjectPlan();
|
142
147
|
|
143
|
-
// Phase 6: Plan
|
148
|
+
// Phase 6: Plan Approval
|
144
149
|
await this.approvePlan();
|
145
150
|
|
146
151
|
// Phase 7: Installation
|
@@ -172,7 +177,7 @@ class AppiqSolutionInstaller {
|
|
172
177
|
}
|
173
178
|
|
174
179
|
async detectProjectType() {
|
175
|
-
console.log(chalk.yellow("๐
|
180
|
+
console.log(chalk.yellow("๐ Project Analysis..."));
|
176
181
|
|
177
182
|
// Auto-Detection
|
178
183
|
const hasPackageJson = fs.existsSync(
|
@@ -185,20 +190,20 @@ class AppiqSolutionInstaller {
|
|
185
190
|
const hasDocumentation = this.hasExistingDocumentation();
|
186
191
|
|
187
192
|
let suggestedType = "greenfield";
|
188
|
-
let reason = "
|
193
|
+
let reason = "New project detected";
|
189
194
|
|
190
195
|
if (hasExistingCode || hasDocumentation) {
|
191
196
|
suggestedType = "brownfield";
|
192
|
-
reason = "
|
197
|
+
reason = "Existing code/documentation found";
|
193
198
|
}
|
194
199
|
|
195
|
-
console.log(chalk.gray(`๐ก
|
200
|
+
console.log(chalk.gray(`๐ก Analysis: ${reason}`));
|
196
201
|
console.log(
|
197
202
|
chalk.gray(
|
198
|
-
`๐
|
203
|
+
`๐ Recommendation: ${
|
199
204
|
suggestedType === "greenfield"
|
200
|
-
? "Greenfield (
|
201
|
-
: "Brownfield (
|
205
|
+
? "Greenfield (New Project)"
|
206
|
+
: "Brownfield (Existing Project)"
|
202
207
|
}`
|
203
208
|
)
|
204
209
|
);
|
@@ -208,17 +213,17 @@ class AppiqSolutionInstaller {
|
|
208
213
|
{
|
209
214
|
type: "list",
|
210
215
|
name: "projectType",
|
211
|
-
message: "๐ฏ
|
216
|
+
message: "๐ฏ What type of project is this?",
|
212
217
|
choices: [
|
213
218
|
{
|
214
|
-
name: `โจ Greenfield -
|
219
|
+
name: `โจ Greenfield - New project (Recommended: ${
|
215
220
|
suggestedType === "greenfield" ? "โ
" : "โ"
|
216
221
|
})`,
|
217
222
|
value: "greenfield",
|
218
223
|
short: "Greenfield",
|
219
224
|
},
|
220
225
|
{
|
221
|
-
name: `๐ง Brownfield -
|
226
|
+
name: `๐ง Brownfield - Enhance existing project (Recommended: ${
|
222
227
|
suggestedType === "brownfield" ? "โ
" : "โ"
|
223
228
|
})`,
|
224
229
|
value: "brownfield",
|
@@ -232,30 +237,30 @@ class AppiqSolutionInstaller {
|
|
232
237
|
this.config.projectType = projectType;
|
233
238
|
console.log(
|
234
239
|
chalk.green(
|
235
|
-
`โ
|
240
|
+
`โ
Project Type: ${
|
236
241
|
projectType === "greenfield"
|
237
|
-
? "Greenfield (
|
238
|
-
: "Brownfield (
|
242
|
+
? "Greenfield (New)"
|
243
|
+
: "Brownfield (Existing)"
|
239
244
|
}\n`
|
240
245
|
)
|
241
246
|
);
|
242
247
|
}
|
243
248
|
|
244
249
|
async selectIDE() {
|
245
|
-
console.log(chalk.yellow("๐ ๏ธ IDE
|
250
|
+
console.log(chalk.yellow("๐ ๏ธ IDE Selection"));
|
246
251
|
console.log(
|
247
252
|
chalk.bold.yellow.bgRed(
|
248
|
-
" โ ๏ธ MULTISELECT:
|
253
|
+
" โ ๏ธ MULTISELECT: Use SPACEBAR to select multiple IDEs! "
|
249
254
|
)
|
250
255
|
);
|
251
|
-
console.log(chalk.gray("
|
256
|
+
console.log(chalk.gray("Select ALL IDEs that you use:\n"));
|
252
257
|
|
253
258
|
const { ides } = await inquirer.prompt([
|
254
259
|
{
|
255
260
|
type: "checkbox",
|
256
261
|
name: "ides",
|
257
262
|
message:
|
258
|
-
"๐ฏ
|
263
|
+
"๐ฏ Which IDEs do you use? (SPACEBAR = select, ENTER = confirm)",
|
259
264
|
choices: [
|
260
265
|
{ name: "๐ต Cursor", value: "cursor" },
|
261
266
|
{ name: "๐ฃ Claude Code CLI", value: "claude-code" },
|
@@ -268,7 +273,7 @@ class AppiqSolutionInstaller {
|
|
268
273
|
],
|
269
274
|
validate: (input) => {
|
270
275
|
if (input.length === 0) {
|
271
|
-
return "
|
276
|
+
return "Please select at least one IDE!";
|
272
277
|
}
|
273
278
|
return true;
|
274
279
|
},
|
@@ -284,7 +289,7 @@ class AppiqSolutionInstaller {
|
|
284
289
|
|
285
290
|
async detectTechStack() {
|
286
291
|
console.log(chalk.yellow("๐ Tech Stack Detection"));
|
287
|
-
console.log(chalk.gray("
|
292
|
+
console.log(chalk.gray("Analyzing project environment and tech stack...\n"));
|
288
293
|
|
289
294
|
// Check for Flutter
|
290
295
|
const isFlutter = fs.existsSync(
|
@@ -317,20 +322,20 @@ class AppiqSolutionInstaller {
|
|
317
322
|
|
318
323
|
// Auto-detect or ask user
|
319
324
|
if (isFlutter) {
|
320
|
-
console.log(chalk.green("โ
Flutter
|
325
|
+
console.log(chalk.green("โ
Flutter project detected!"));
|
321
326
|
this.config.techStack.platform = "flutter";
|
322
327
|
this.config.techStack.isFlutter = true;
|
323
328
|
this.config.techStack.hasUI = true;
|
324
|
-
console.log(chalk.cyan(" โ Dart MCP Server
|
329
|
+
console.log(chalk.cyan(" โ Dart MCP Server will be configured"));
|
325
330
|
console.log(
|
326
|
-
chalk.cyan(" โ Flutter Clean Architecture Agents
|
331
|
+
chalk.cyan(" โ Flutter Clean Architecture Agents will be loaded\n")
|
327
332
|
);
|
328
333
|
} else if (webFramework) {
|
329
|
-
console.log(chalk.green(`โ
${webFramework}
|
334
|
+
console.log(chalk.green(`โ
${webFramework} project detected!`));
|
330
335
|
this.config.techStack.platform = "web";
|
331
336
|
this.config.techStack.hasUI = true;
|
332
337
|
console.log(
|
333
|
-
chalk.cyan(" โ shadcn/ui + v0.dev
|
338
|
+
chalk.cyan(" โ shadcn/ui + v0.dev integration will be configured\n")
|
334
339
|
);
|
335
340
|
} else {
|
336
341
|
// Ask user for platform
|
@@ -338,13 +343,13 @@ class AppiqSolutionInstaller {
|
|
338
343
|
{
|
339
344
|
type: "list",
|
340
345
|
name: "platform",
|
341
|
-
message: "๐ฏ
|
346
|
+
message: "๐ฏ Which tech stack are you using?",
|
342
347
|
choices: [
|
343
348
|
{ name: "๐ฑ Flutter Mobile App", value: "flutter" },
|
344
349
|
{ name: "๐ Web App (React/Next.js/Vue)", value: "web" },
|
345
350
|
{ name: "๐ Fullstack (Frontend + Backend)", value: "fullstack" },
|
346
351
|
{ name: "โก API/Backend Only", value: "api" },
|
347
|
-
{ name: "๐คท
|
352
|
+
{ name: "๐คท Not sure yet", value: "unknown" },
|
348
353
|
],
|
349
354
|
},
|
350
355
|
]);
|
@@ -356,13 +361,13 @@ class AppiqSolutionInstaller {
|
|
356
361
|
);
|
357
362
|
|
358
363
|
if (platform === "flutter") {
|
359
|
-
console.log(chalk.cyan(" โ Dart MCP Server
|
364
|
+
console.log(chalk.cyan(" โ Dart MCP Server will be configured"));
|
360
365
|
console.log(
|
361
|
-
chalk.cyan(" โ Flutter Clean Architecture Agents
|
366
|
+
chalk.cyan(" โ Flutter Clean Architecture Agents will be loaded")
|
362
367
|
);
|
363
368
|
} else if (platform === "web" || platform === "fullstack") {
|
364
369
|
console.log(
|
365
|
-
chalk.cyan(" โ shadcn/ui + v0.dev
|
370
|
+
chalk.cyan(" โ shadcn/ui + v0.dev integration will be configured")
|
366
371
|
);
|
367
372
|
}
|
368
373
|
console.log("");
|
@@ -370,32 +375,49 @@ class AppiqSolutionInstaller {
|
|
370
375
|
}
|
371
376
|
|
372
377
|
async collectProjectIdea() {
|
373
|
-
console.log(chalk.yellow("๐ก
|
374
|
-
|
378
|
+
console.log(chalk.yellow("๐ก Collecting Project Information"));
|
379
|
+
|
380
|
+
// For brownfield projects, skip detailed project idea collection
|
381
|
+
if (this.config.projectType === "brownfield") {
|
382
|
+
console.log(
|
383
|
+
chalk.gray("๐ Detected existing project - using current directory\n")
|
384
|
+
);
|
385
|
+
|
386
|
+
const dirName = path.basename(this.projectRoot);
|
387
|
+
this.config.projectName = dirName;
|
388
|
+
this.config.projectIdea = `Brownfield project: ${dirName}`;
|
389
|
+
this.config.targetUsers = "Existing project users";
|
390
|
+
|
391
|
+
console.log(chalk.green(`โ
Project identified: "${dirName}"\n`));
|
392
|
+
return;
|
393
|
+
}
|
394
|
+
|
395
|
+
// For greenfield projects, collect detailed information
|
396
|
+
console.log(chalk.gray("Describe your project concept:\n"));
|
375
397
|
|
376
398
|
const { projectIdea, projectName, targetUsers } = await inquirer.prompt([
|
377
399
|
{
|
378
400
|
type: "input",
|
379
401
|
name: "projectName",
|
380
|
-
message: "๐ท๏ธ
|
402
|
+
message: "๐ท๏ธ What should your project be called?",
|
381
403
|
validate: (input) =>
|
382
|
-
input.length > 0 ? true : "
|
404
|
+
input.length > 0 ? true : "Please enter a project name!",
|
383
405
|
},
|
384
406
|
{
|
385
407
|
type: "editor",
|
386
408
|
name: "projectIdea",
|
387
|
-
message: "๐ก
|
409
|
+
message: "๐ก Describe your project idea (detailed):",
|
388
410
|
validate: (input) =>
|
389
411
|
input.length > 10
|
390
412
|
? true
|
391
|
-
: "
|
413
|
+
: "Please describe your project in more detail!",
|
392
414
|
},
|
393
415
|
{
|
394
416
|
type: "input",
|
395
417
|
name: "targetUsers",
|
396
|
-
message: "๐ฅ
|
418
|
+
message: "๐ฅ Who are your target groups/users?",
|
397
419
|
validate: (input) =>
|
398
|
-
input.length > 0 ? true : "
|
420
|
+
input.length > 0 ? true : "Please describe your target audience!",
|
399
421
|
},
|
400
422
|
]);
|
401
423
|
|
@@ -403,18 +425,88 @@ class AppiqSolutionInstaller {
|
|
403
425
|
this.config.projectIdea = projectIdea;
|
404
426
|
this.config.targetUsers = targetUsers;
|
405
427
|
|
406
|
-
console.log(chalk.green(`โ
|
428
|
+
console.log(chalk.green(`โ
Project idea captured: "${projectName}"\n`));
|
429
|
+
}
|
430
|
+
|
431
|
+
async generateBrownfieldProjectConfig() {
|
432
|
+
console.log(chalk.yellow("๐ Configuring brownfield project..."));
|
433
|
+
|
434
|
+
// Auto-set project name from directory name
|
435
|
+
const dirName = path.basename(this.projectRoot);
|
436
|
+
this.config.projectName = dirName;
|
437
|
+
|
438
|
+
console.log(chalk.cyan(`๐ท๏ธ Project name: ${dirName}`));
|
439
|
+
console.log(chalk.gray(" โ Using directory name as project name"));
|
440
|
+
|
441
|
+
// Set default values for brownfield projects
|
442
|
+
this.config.projectIdea = `Enhancing existing ${dirName} project with AI agents`;
|
443
|
+
this.config.targetUsers = "Existing project stakeholders and development team";
|
444
|
+
|
445
|
+
// Auto-create docs/prd.md if it doesn't exist
|
446
|
+
const docsDir = path.join(this.projectRoot, "docs");
|
447
|
+
const prdPath = path.join(docsDir, "prd.md");
|
448
|
+
|
449
|
+
if (!fs.existsSync(prdPath)) {
|
450
|
+
if (!fs.existsSync(docsDir)) {
|
451
|
+
fs.mkdirSync(docsDir, { recursive: true });
|
452
|
+
}
|
453
|
+
|
454
|
+
const prdTemplate = this.config.techStack?.isFlutter ?
|
455
|
+
"flutter-mobile-prd-tmpl.yaml" : "prd-tmpl.yaml";
|
456
|
+
|
457
|
+
console.log(chalk.cyan("๐ Creating docs/prd.md automatically"));
|
458
|
+
console.log(chalk.gray(` โ Using template: ${prdTemplate}`));
|
459
|
+
|
460
|
+
const prdContent = `# Product Requirements Document - ${dirName}
|
461
|
+
|
462
|
+
## Project Overview
|
463
|
+
This is a brownfield project enhancement for ${dirName}.
|
464
|
+
|
465
|
+
**Note:** Please fill in your specific requirements, features, and objectives below.
|
466
|
+
|
467
|
+
## Current State Analysis
|
468
|
+
- [ ] Document existing functionality
|
469
|
+
- [ ] Identify technical debt
|
470
|
+
- [ ] List current features
|
471
|
+
- [ ] Note architecture patterns
|
472
|
+
|
473
|
+
## Enhancement Goals
|
474
|
+
- [ ] Define new features to add
|
475
|
+
- [ ] List improvements to make
|
476
|
+
- [ ] Specify performance goals
|
477
|
+
- [ ] Document user experience improvements
|
478
|
+
|
479
|
+
## Technical Requirements
|
480
|
+
- [ ] Document current tech stack
|
481
|
+
- [ ] List required integrations
|
482
|
+
- [ ] Define API requirements
|
483
|
+
- [ ] Specify database changes
|
484
|
+
|
485
|
+
## Next Steps
|
486
|
+
1. Fill in the requirements above
|
487
|
+
2. Run \`@architect\` to analyze current architecture
|
488
|
+
3. Use \`@sm\` to create feature stories
|
489
|
+
4. Start implementation with \`@dev\`
|
490
|
+
`;
|
491
|
+
|
492
|
+
fs.writeFileSync(prdPath, prdContent);
|
493
|
+
console.log(chalk.green("โ
docs/prd.md created successfully"));
|
494
|
+
} else {
|
495
|
+
console.log(chalk.cyan("๐ docs/prd.md already exists"));
|
496
|
+
}
|
497
|
+
|
498
|
+
console.log(chalk.green(`โ
Brownfield project configured: "${dirName}"\n`));
|
407
499
|
}
|
408
500
|
|
409
501
|
async createProjectPlan() {
|
410
|
-
console.log(chalk.yellow("๐
|
411
|
-
console.log(chalk.gray("
|
502
|
+
console.log(chalk.yellow("๐ Creating project plan..."));
|
503
|
+
console.log(chalk.gray("Based on your idea and project type\n"));
|
412
504
|
|
413
|
-
//
|
505
|
+
// Normally team-fullstack.yaml would be used here
|
414
506
|
const plan = this.generateProjectPlan();
|
415
507
|
this.config.projectPlan = plan;
|
416
508
|
|
417
|
-
console.log(chalk.cyan("๐
|
509
|
+
console.log(chalk.cyan("๐ Your Project Plan:"));
|
418
510
|
console.log(chalk.white("โ".repeat(50)));
|
419
511
|
console.log(plan);
|
420
512
|
console.log(chalk.white("โ".repeat(50) + "\n"));
|
@@ -425,26 +517,26 @@ class AppiqSolutionInstaller {
|
|
425
517
|
{
|
426
518
|
type: "confirm",
|
427
519
|
name: "approved",
|
428
|
-
message: "โ
|
520
|
+
message: "โ
Are you satisfied with this plan?",
|
429
521
|
default: true,
|
430
522
|
},
|
431
523
|
{
|
432
524
|
type: "input",
|
433
525
|
name: "changes",
|
434
526
|
message:
|
435
|
-
"๐
|
527
|
+
"๐ What changes would you like? (or ENTER for no changes)",
|
436
528
|
when: (answers) => !answers.approved,
|
437
529
|
},
|
438
530
|
]);
|
439
531
|
|
440
532
|
if (!approved && changes) {
|
441
|
-
console.log(chalk.yellow("๐
|
533
|
+
console.log(chalk.yellow("๐ Adapting plan..."));
|
442
534
|
this.config.planChanges = changes;
|
443
|
-
//
|
444
|
-
console.log(chalk.green("โ
Plan
|
535
|
+
// Plan would be adapted here
|
536
|
+
console.log(chalk.green("โ
Plan has been adapted!\n"));
|
445
537
|
} else {
|
446
538
|
console.log(
|
447
|
-
chalk.green("โ
Plan
|
539
|
+
chalk.green("โ
Plan approved - development can start!\n")
|
448
540
|
);
|
449
541
|
}
|
450
542
|
|
@@ -454,50 +546,50 @@ class AppiqSolutionInstaller {
|
|
454
546
|
generateProjectPlan() {
|
455
547
|
const { projectType, projectName, projectIdea, targetUsers } = this.config;
|
456
548
|
|
457
|
-
return `๐ฏ
|
549
|
+
return `๐ฏ PROJECT PLAN: ${projectName}
|
458
550
|
|
459
|
-
๐
|
551
|
+
๐ PROJECT TYPE: ${
|
460
552
|
projectType === "greenfield"
|
461
|
-
? "Greenfield (
|
462
|
-
: "Brownfield (
|
553
|
+
? "Greenfield (New Project)"
|
554
|
+
: "Brownfield (Existing Project)"
|
463
555
|
}
|
464
|
-
๐ฅ
|
556
|
+
๐ฅ TARGET AUDIENCE: ${targetUsers}
|
465
557
|
|
466
|
-
๐ก
|
558
|
+
๐ก PROJECT IDEA:
|
467
559
|
${projectIdea}
|
468
560
|
|
469
|
-
๐
|
561
|
+
๐ DEVELOPMENT PIPELINE:
|
470
562
|
${
|
471
563
|
projectType === "greenfield"
|
472
564
|
? `
|
473
|
-
1. ๐ PO (Product Owner) โ PRD
|
474
|
-
2. ๐๏ธ Architect โ
|
565
|
+
1. ๐ PO (Product Owner) โ Create PRD
|
566
|
+
2. ๐๏ธ Architect โ Design system architecture
|
475
567
|
3. ๐จ UX Expert โ UI/UX Design
|
476
|
-
4. ๐ Story Master โ
|
477
|
-
5. ๐ป Developer โ
|
478
|
-
6. โ
QA Expert โ Testing &
|
479
|
-
7. ๐ SM (Scrum Master) โ Sprint
|
568
|
+
4. ๐ Story Master โ Break down user stories
|
569
|
+
5. ๐ป Developer โ Implement features
|
570
|
+
6. โ
QA Expert โ Testing & validation
|
571
|
+
7. ๐ SM (Scrum Master) โ Sprint coordination
|
480
572
|
`
|
481
573
|
: `
|
482
|
-
1. ๐ PO โ
|
483
|
-
2. ๐๏ธ Architect โ
|
484
|
-
3. ๐ Story Master โ
|
485
|
-
4. ๐ป Developer โ
|
486
|
-
5. โ
QA Expert โ Regression
|
487
|
-
6. ๐ SM โ Change
|
574
|
+
1. ๐ PO โ Analyze existing documentation
|
575
|
+
2. ๐๏ธ Architect โ Architecture review
|
576
|
+
3. ๐ Story Master โ Plan new features
|
577
|
+
4. ๐ป Developer โ Integrate features into existing base
|
578
|
+
5. โ
QA Expert โ Regression testing
|
579
|
+
6. ๐ SM โ Change management
|
488
580
|
`
|
489
581
|
}
|
490
582
|
|
491
|
-
๐ฎ ONE-CLICK
|
492
|
-
- /start โ
|
493
|
-
- /plan โ
|
494
|
-
- /develop โ
|
495
|
-
- /review โ Code
|
496
|
-
- /deploy โ
|
583
|
+
๐ฎ ONE-CLICK COMMANDS:
|
584
|
+
- /start โ Start entire workflow
|
585
|
+
- /plan โ Detailed planning
|
586
|
+
- /develop โ Begin development
|
587
|
+
- /review โ Code review
|
588
|
+
- /deploy โ Prepare deployment`;
|
497
589
|
}
|
498
590
|
|
499
591
|
async setupBMADCoreConfig() {
|
500
|
-
console.log(chalk.yellow("โ๏ธ BMAD Core Configuration
|
592
|
+
console.log(chalk.yellow("โ๏ธ Setting up BMAD Core Configuration..."));
|
501
593
|
|
502
594
|
// Create .bmad-core directory
|
503
595
|
const bmadCoreDir = path.join(this.appiqPath, ".bmad-core");
|
@@ -565,11 +657,11 @@ ${
|
|
565
657
|
fs.writeFileSync(path.join(docsDir, "prd.md"), this.generateInitialPRD());
|
566
658
|
}
|
567
659
|
|
568
|
-
console.log(chalk.green("โ
Document Templates
|
660
|
+
console.log(chalk.green("โ
Document Templates created!\n"));
|
569
661
|
}
|
570
662
|
|
571
663
|
async setupAgentDependencies() {
|
572
|
-
console.log(chalk.yellow("๐ Agent Dependencies System
|
664
|
+
console.log(chalk.yellow("๐ Setting up Agent Dependencies System..."));
|
573
665
|
|
574
666
|
const agentsDir = path.join(this.appiqPath, "agents");
|
575
667
|
const tasksDir = path.join(this.appiqPath, "tasks");
|
@@ -2164,48 +2256,48 @@ ${
|
|
2164
2256
|
generateBrownfieldWorkflow(config) {
|
2165
2257
|
const workflows = {
|
2166
2258
|
"Appiq Launcher": `
|
2167
|
-
**๐ง
|
2168
|
-
1. \`/analyze\` -
|
2169
|
-
2. **
|
2170
|
-
3. **
|
2259
|
+
**๐ง Quick Start for Existing Project:**
|
2260
|
+
1. \`/analyze\` - Analyzes existing project
|
2261
|
+
2. **Finds:** Existing docs, code structure, tech stack
|
2262
|
+
3. **Creates:** Customized workflows for your project`,
|
2171
2263
|
|
2172
2264
|
"Project Manager": `
|
2173
|
-
**๐
|
2174
|
-
1. **
|
2175
|
-
2. **
|
2176
|
-
3. **
|
2177
|
-
4. **
|
2265
|
+
**๐ Automatic PRD Creation:**
|
2266
|
+
1. **Creates automatically:** \`docs/prd.md\` (if not present)
|
2267
|
+
2. **For Flutter Projects:** Uses flutter-mobile-prd-tmpl.yaml
|
2268
|
+
3. **No project name prompt** - Uses directory name
|
2269
|
+
4. **Next Step:** Architect for architecture review`,
|
2178
2270
|
|
2179
2271
|
"System Architect": `
|
2180
|
-
**๐๏ธ
|
2181
|
-
1. \`/review-architecture\` -
|
2182
|
-
2. **
|
2183
|
-
3. **
|
2272
|
+
**๐๏ธ Architecture Review:**
|
2273
|
+
1. \`/review-architecture\` - Analyzes existing structure
|
2274
|
+
2. **Creates/updates:** \`docs/architecture.md\`
|
2275
|
+
3. **Next Step:** Story Master for new features`,
|
2184
2276
|
|
2185
2277
|
"Story Master": `
|
2186
2278
|
**๐ Feature Stories:**
|
2187
|
-
1. \`/new-feature\` -
|
2188
|
-
2. **
|
2189
|
-
3. **
|
2279
|
+
1. \`/new-feature\` - New story for existing project
|
2280
|
+
2. **File created:** \`docs/stories/feature-XXX.md\`
|
2281
|
+
3. **Considers:** Existing code base`,
|
2190
2282
|
|
2191
2283
|
"Senior Developer": `
|
2192
2284
|
**๐ป Feature Implementation:**
|
2193
|
-
1. \`/add-feature\` -
|
2194
|
-
2. **
|
2195
|
-
3. **
|
2285
|
+
1. \`/add-feature\` - Implements in existing code
|
2286
|
+
2. **Edits:** Existing files safely
|
2287
|
+
3. **Creates:** New files where needed`,
|
2196
2288
|
|
2197
2289
|
"QA Expert": `
|
2198
2290
|
**โ
Regression Testing:**
|
2199
|
-
1. \`/regression-test\` -
|
2200
|
-
2. **
|
2201
|
-
3. **
|
2291
|
+
1. \`/regression-test\` - Tests new features
|
2292
|
+
2. **Validates:** No breaking changes
|
2293
|
+
3. **Creates:** Test reports for existing + new features`,
|
2202
2294
|
};
|
2203
2295
|
|
2204
2296
|
return workflows[config.name] || "Standard Brownfield Workflow";
|
2205
2297
|
}
|
2206
2298
|
|
2207
2299
|
async setupOneClickWorkflows() {
|
2208
|
-
console.log(chalk.yellow("โก One-Click Workflows
|
2300
|
+
console.log(chalk.yellow("โก Setting up One-Click Workflows..."));
|
2209
2301
|
|
2210
2302
|
// Create quick commands
|
2211
2303
|
const commandsDir = path.join(this.appiqPath, "commands");
|