create-byan-agent 1.2.5 → 2.0.0-alpha.1

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 (77) hide show
  1. package/CHANGELOG.md +196 -385
  2. package/LICENSE +21 -21
  3. package/README.md +420 -1256
  4. package/bin/create-byan-agent-backup.js +220 -220
  5. package/bin/create-byan-agent-fixed.js +301 -301
  6. package/bin/create-byan-agent-v2.js +492 -0
  7. package/bin/create-byan-agent.js +304 -238
  8. package/package.json +68 -64
  9. package/templates/.github/agents/bmad-agent-bmad-master.md +15 -15
  10. package/templates/.github/agents/bmad-agent-bmb-agent-builder.md +15 -15
  11. package/templates/.github/agents/bmad-agent-bmb-module-builder.md +15 -15
  12. package/templates/.github/agents/bmad-agent-bmb-workflow-builder.md +15 -15
  13. package/templates/.github/agents/bmad-agent-bmm-analyst.md +15 -15
  14. package/templates/.github/agents/bmad-agent-bmm-architect.md +15 -15
  15. package/templates/.github/agents/bmad-agent-bmm-dev.md +15 -15
  16. package/templates/.github/agents/bmad-agent-bmm-pm.md +15 -15
  17. package/templates/.github/agents/bmad-agent-bmm-quick-flow-solo-dev.md +15 -15
  18. package/templates/.github/agents/bmad-agent-bmm-quinn.md +15 -15
  19. package/templates/.github/agents/bmad-agent-bmm-sm.md +15 -15
  20. package/templates/.github/agents/bmad-agent-bmm-tech-writer.md +15 -15
  21. package/templates/.github/agents/bmad-agent-bmm-ux-designer.md +15 -15
  22. package/templates/.github/agents/bmad-agent-byan-test.md +32 -32
  23. package/templates/.github/agents/bmad-agent-byan.md +224 -224
  24. package/templates/.github/agents/bmad-agent-carmack.md +18 -18
  25. package/templates/.github/agents/bmad-agent-cis-brainstorming-coach.md +15 -15
  26. package/templates/.github/agents/bmad-agent-cis-creative-problem-solver.md +15 -15
  27. package/templates/.github/agents/bmad-agent-cis-design-thinking-coach.md +15 -15
  28. package/templates/.github/agents/bmad-agent-cis-innovation-strategist.md +15 -15
  29. package/templates/.github/agents/bmad-agent-cis-presentation-master.md +15 -15
  30. package/templates/.github/agents/bmad-agent-cis-storyteller.md +15 -15
  31. package/templates/.github/agents/bmad-agent-marc.md +48 -48
  32. package/templates/.github/agents/bmad-agent-patnote.md +48 -48
  33. package/templates/.github/agents/bmad-agent-rachid.md +47 -47
  34. package/templates/.github/agents/bmad-agent-tea-tea.md +15 -15
  35. package/templates/.github/agents/bmad-agent-test-dynamic.md +21 -21
  36. package/templates/.github/agents/franck.md +379 -379
  37. package/templates/_bmad/bmb/agents/agent-builder.md +59 -59
  38. package/templates/_bmad/bmb/agents/byan-test.md +116 -116
  39. package/templates/_bmad/bmb/agents/byan.md +215 -215
  40. package/templates/_bmad/bmb/agents/marc.md +303 -303
  41. package/templates/_bmad/bmb/agents/module-builder.md +60 -60
  42. package/templates/_bmad/bmb/agents/patnote.md +495 -495
  43. package/templates/_bmad/bmb/agents/rachid.md +184 -184
  44. package/templates/_bmad/bmb/agents/workflow-builder.md +61 -61
  45. package/templates/_bmad/bmb/workflows/byan/data/mantras.yaml +272 -272
  46. package/templates/_bmad/bmb/workflows/byan/data/templates.yaml +59 -59
  47. package/templates/_bmad/bmb/workflows/byan/delete-agent-workflow.md +657 -657
  48. package/templates/_bmad/bmb/workflows/byan/edit-agent-workflow.md +688 -688
  49. package/templates/_bmad/bmb/workflows/byan/interview-workflow.md +753 -753
  50. package/templates/_bmad/bmb/workflows/byan/quick-create-workflow.md +450 -450
  51. package/templates/_bmad/bmb/workflows/byan/templates/base-agent-template.md +79 -79
  52. package/templates/_bmad/bmb/workflows/byan/validate-agent-workflow.md +676 -676
  53. package/templates/_bmad/core/agents/carmack.md +238 -238
  54. package/lib/errors.js +0 -61
  55. package/lib/exit-codes.js +0 -54
  56. package/lib/platforms/claude-code.js +0 -113
  57. package/lib/platforms/codex.js +0 -92
  58. package/lib/platforms/copilot-cli.js +0 -123
  59. package/lib/platforms/index.js +0 -14
  60. package/lib/platforms/vscode.js +0 -51
  61. package/lib/utils/config-loader.js +0 -79
  62. package/lib/utils/file-utils.js +0 -117
  63. package/lib/utils/git-detector.js +0 -35
  64. package/lib/utils/logger.js +0 -64
  65. package/lib/utils/node-detector.js +0 -58
  66. package/lib/utils/os-detector.js +0 -74
  67. package/lib/utils/yaml-utils.js +0 -87
  68. package/lib/yanstaller/backuper.js +0 -308
  69. package/lib/yanstaller/detector.js +0 -141
  70. package/lib/yanstaller/index.js +0 -93
  71. package/lib/yanstaller/installer.js +0 -226
  72. package/lib/yanstaller/interviewer.js +0 -295
  73. package/lib/yanstaller/recommender.js +0 -308
  74. package/lib/yanstaller/troubleshooter.js +0 -498
  75. package/lib/yanstaller/validator.js +0 -602
  76. package/lib/yanstaller/wizard.js +0 -229
  77. package/templates/.github/agents/expert-merise-agile.md +0 -1
@@ -1,256 +1,322 @@
1
- #!/usr/bin/env node
2
-
3
- const path = require('path');
4
- const { program } = require('commander');
5
- const chalk = require('chalk');
6
-
7
- // YANSTALLER Modules
8
- const detector = require('../lib/yanstaller/detector');
9
- const recommender = require('../lib/yanstaller/recommender');
10
- const interviewer = require('../lib/yanstaller/interviewer');
11
- const installer = require('../lib/yanstaller/installer');
12
- const validator = require('../lib/yanstaller/validator');
13
- const wizard = require('../lib/yanstaller/wizard');
14
- const backuper = require('../lib/yanstaller/backuper');
15
- const logger = require('../lib/utils/logger');
16
-
17
- const YANSTALLER_VERSION = '1.2.3';
1
+ #!/usr/bin/env node
18
2
 
19
- function parseList(value) {
20
- if (!value) return [];
21
- if (Array.isArray(value)) return value.map(v => String(v).trim()).filter(Boolean);
22
- return String(value)
23
- .split(',')
24
- .map(v => v.trim())
25
- .filter(Boolean);
26
- }
3
+ const fs = require('fs-extra');
4
+ const path = require('path');
5
+ const { program } = require('commander');
6
+ const inquirer = require('inquirer');
7
+ const chalk = require('chalk');
8
+ const ora = require('ora');
9
+ const yaml = require('js-yaml');
27
10
 
28
- function normalizePlatformName(name) {
29
- if (!name) return name;
30
- const lower = String(name).toLowerCase();
31
- if (lower === 'claude') return 'claude-code';
32
- return lower;
33
- }
11
+ const BYAN_VERSION = '1.1.3';
34
12
 
35
- function normalizePlatforms(list) {
36
- return list.map(normalizePlatformName).filter(Boolean);
37
- }
13
+ // ASCII Art Banner
14
+ const banner = `
15
+ ${chalk.blue('╔════════════════════════════════════════════════════════════╗')}
16
+ ${chalk.blue('║')} ${chalk.blue('║')}
17
+ ${chalk.blue('║')} ${chalk.bold('🏗️ BYAN INSTALLER v' + BYAN_VERSION)} ${chalk.blue('║')}
18
+ ${chalk.blue('║')} ${chalk.gray('Builder of YAN - Agent Creator')} ${chalk.blue('║')}
19
+ ${chalk.blue('║')} ${chalk.blue('║')}
20
+ ${chalk.blue('║')} ${chalk.gray('Methodology: Merise Agile + TDD + 64 Mantras')} ${chalk.blue('║')}
21
+ ${chalk.blue('║')} ${chalk.blue('║')}
22
+ ${chalk.blue('╚════════════════════════════════════════════════════════════╝')}
23
+ `;
38
24
 
39
- function expandAllPlatforms(list) {
40
- if (list.includes('all')) {
41
- return ['copilot-cli', 'vscode', 'codex', 'claude-code'];
25
+ // Source template directory (where BYAN package files are)
26
+ const getTemplateDir = () => {
27
+ // FIX #1: Correct path for npm/npx installation
28
+ // When running from node_modules/create-byan-agent/bin/
29
+ // We need to go up ONE level to reach templates/
30
+ const npmPackagePath = path.join(__dirname, '..', 'templates');
31
+ if (fs.existsSync(npmPackagePath)) {
32
+ console.log(chalk.gray(`[DEBUG] Template dir found: ${npmPackagePath}`));
33
+ return npmPackagePath;
42
34
  }
43
- return list;
44
- }
35
+
36
+ // ✅ FIX #2: Alternative check for development mode
37
+ // If running from source during development
38
+ const devPath = path.join(__dirname, '..', '..', 'templates');
39
+ if (fs.existsSync(devPath)) {
40
+ console.log(chalk.gray(`[DEBUG] Dev template dir found: ${devPath}`));
41
+ return devPath;
42
+ }
43
+
44
+ // ❌ Fallback: This shouldn't happen in production
45
+ console.error(chalk.red('⚠️ WARNING: Template directory not found!'));
46
+ console.error(chalk.red(` Searched: ${npmPackagePath}`));
47
+ console.error(chalk.red(` Also searched: ${devPath}`));
48
+ return null;
49
+ };
45
50
 
46
- // ASCII Art Banner
47
- const banner = `
48
- ${chalk.blue('╔════════════════════════════════════════════════════════════╗')}
49
- ${chalk.blue('║')} ${chalk.blue('║')}
50
- ${chalk.blue('║')} ${chalk.bold('🏗️ YANSTALLER v' + YANSTALLER_VERSION)} ${chalk.blue('║')}
51
- ${chalk.blue('║')} ${chalk.gray('Intelligent BYAN Installer')} ${chalk.blue('║')}
52
- ${chalk.blue('║')} ${chalk.blue('║')}
53
- ${chalk.blue('║')} ${chalk.gray('Methodology: Merise Agile + TDD + 64 Mantras')} ${chalk.blue('║')}
54
- ${chalk.blue('║')} ${chalk.gray('29 Agents Multi-Platform Auto-Fix')} ${chalk.blue('║')}
55
- ${chalk.blue('║')} ${chalk.blue('║')}
56
- ${chalk.blue('╚════════════════════════════════════════════════════════════╝')}
57
- `;
58
-
59
- /**
60
- * Main YANSTALLER Installation Flow
61
- *
62
- * Orchestrates the 7-step intelligent installation:
63
- * 1. DETECT - Platform & project analysis
64
- * 2. RECOMMEND - Intelligent agent recommendations
65
- * 3. INTERVIEW - 7-question personalization
66
- * 4. BACKUP - Pre-install safety (optional)
67
- * 5. INSTALL - Core installation
68
- * 6. VALIDATE - 10 automated checks
69
- * 7. WIZARD - Post-install actions
70
- */
71
- async function main(options = {}) {
72
- try {
73
- console.clear();
74
- console.log(banner);
75
-
76
- const projectRoot = process.cwd();
77
-
78
- // STEP 1: DETECT - Platform & Project Analysis
79
- logger.info(chalk.bold('\n🔍 STEP 1/7: Detection\n'));
80
- const detection = await detector.detect({ projectRoot });
81
-
82
- const platformNames = detection.platforms ? detection.platforms.map(p => p.name).join(', ') : 'none';
83
- logger.info(`✓ Platforms detected: ${chalk.cyan(platformNames)}`);
84
- if (detection.projectType) {
85
- logger.info(`✓ Project type: ${chalk.cyan(detection.projectType)}`);
86
- }
87
- if (detection.framework) {
88
- logger.info(`✓ Framework: ${chalk.cyan(detection.framework)}`);
89
- }
90
-
91
- // STEP 2: RECOMMEND - Intelligent Agent Selection
92
- logger.info(chalk.bold('\n🎯 STEP 2/7: Recommendations\n'));
93
- const recommendations = await recommender.recommend({
94
- projectRoot,
95
- detection
96
- });
97
-
98
- if (recommendations.agents && recommendations.agents.length > 0) {
99
- logger.info(`✓ Recommended agents: ${chalk.cyan(recommendations.agents.join(', '))}`);
100
- }
101
-
102
- // STEP 3: INTERVIEW - 7-Question Personalization
103
- const isSilent = !!options.silent;
104
- const forceInteractive = !!options.interactive;
105
- const hasTty = !!process.stdin.isTTY;
106
- const forceSilent = !hasTty && !isSilent && !forceInteractive;
51
+ // Main installer
52
+ async function install() {
53
+ console.clear();
54
+ console.log(banner);
55
+
56
+ const projectRoot = process.cwd();
57
+
58
+ // Step 1: Detect project type
59
+ const spinner = ora('Detecting project type...').start();
60
+
61
+ const isGitRepo = await fs.pathExists(path.join(projectRoot, '.git'));
62
+ const hasPackageJson = await fs.pathExists(path.join(projectRoot, 'package.json'));
63
+ const hasPyProject = await fs.pathExists(path.join(projectRoot, 'pyproject.toml'));
64
+
65
+ if (!isGitRepo && !hasPackageJson && !hasPyProject) {
66
+ spinner.warn('Not in a recognized project directory');
67
+
68
+ const { continueAnyway } = await inquirer.prompt([
69
+ {
70
+ type: 'confirm',
71
+ name: 'continueAnyway',
72
+ message: 'BYAN works best in a project with version control. Continue anyway?',
73
+ default: false
74
+ }
75
+ ]);
107
76
 
108
- if (forceSilent) {
109
- logger.warn('No interactive TTY detected. Falling back to silent mode.');
77
+ if (!continueAnyway) {
78
+ console.log(chalk.yellow('Installation cancelled.'));
79
+ process.exit(0);
110
80
  }
111
- if (!hasTty && forceInteractive) {
112
- logger.warn('Interactive mode forced without TTY. Prompts may not render correctly.');
81
+ } else {
82
+ spinner.succeed('Project detected');
83
+ }
84
+
85
+ // Step 2: Platform selection
86
+ const { platform } = await inquirer.prompt([
87
+ {
88
+ type: 'list',
89
+ name: 'platform',
90
+ message: 'Select platform to install for:',
91
+ choices: [
92
+ { name: 'GitHub Copilot CLI', value: 'copilot' },
93
+ { name: 'VSCode', value: 'vscode' },
94
+ { name: 'Claude Code', value: 'claude' },
95
+ { name: 'Codex', value: 'codex' },
96
+ { name: 'All platforms', value: 'all' }
97
+ ]
98
+ }
99
+ ]);
100
+
101
+ // Step 3: User configuration
102
+ const config = await inquirer.prompt([
103
+ {
104
+ type: 'input',
105
+ name: 'userName',
106
+ message: 'Your name:',
107
+ default: 'Developer'
108
+ },
109
+ {
110
+ type: 'list',
111
+ name: 'language',
112
+ message: 'Communication language:',
113
+ choices: ['Francais', 'English'],
114
+ default: 'English'
115
+ }
116
+ ]);
117
+
118
+ // Step 4: Create directory structure
119
+ const installSpinner = ora('Creating directory structure...').start();
120
+
121
+ const bmadDir = path.join(projectRoot, '_bmad');
122
+ const bmbDir = path.join(bmadDir, 'bmb');
123
+ const githubAgentsDir = path.join(projectRoot, '.github', 'agents');
124
+
125
+ await fs.ensureDir(path.join(bmadDir, 'bmb', 'agents'));
126
+ await fs.ensureDir(path.join(bmadDir, 'bmb', 'workflows', 'byan', 'steps'));
127
+ await fs.ensureDir(path.join(bmadDir, 'bmb', 'workflows', 'byan', 'templates'));
128
+ await fs.ensureDir(path.join(bmadDir, 'bmb', 'workflows', 'byan', 'data'));
129
+ await fs.ensureDir(path.join(bmadDir, 'core'));
130
+ await fs.ensureDir(path.join(bmadDir, '_config'));
131
+ await fs.ensureDir(path.join(bmadDir, '_memory'));
132
+ await fs.ensureDir(path.join(bmadDir, '_output'));
133
+ await fs.ensureDir(githubAgentsDir);
134
+
135
+ installSpinner.succeed('Directory structure created');
136
+
137
+ // Step 5: Copy BYAN files from template
138
+ const copySpinner = ora('Installing BYAN files...').start();
139
+
140
+ const templateDir = getTemplateDir();
141
+
142
+ // ✅ FIX #3: Validate template directory before proceeding
143
+ if (!templateDir) {
144
+ copySpinner.fail('❌ Template directory not found! Cannot proceed.');
145
+ console.error(chalk.red('\nInstallation failed: Missing template files.'));
146
+ console.error(chalk.yellow('This usually means the package was not installed correctly.'));
147
+ console.error(chalk.yellow('Try reinstalling: npm install -g create-byan-agent'));
148
+ process.exit(1);
149
+ }
150
+
151
+ try {
152
+ // ✅ FIX #4: Copy agent files from _bmad/bmb/agents
153
+ const agentsSource = path.join(templateDir, '_bmad', 'bmb', 'agents');
154
+ const agentsDest = path.join(bmbDir, 'agents');
155
+
156
+ if (await fs.pathExists(agentsSource)) {
157
+ await fs.copy(agentsSource, agentsDest, { overwrite: true });
158
+ copySpinner.text = 'Copied agent files...';
159
+ console.log(chalk.green(` ✓ Agents: ${agentsSource} → ${agentsDest}`));
160
+ } else {
161
+ copySpinner.warn(`⚠ Agent source not found: ${agentsSource}`);
113
162
  }
114
163
 
115
- let answers;
164
+ // ✅ FIX #5: Copy workflow files from _bmad/bmb/workflows/byan
165
+ const workflowsSource = path.join(templateDir, '_bmad', 'bmb', 'workflows', 'byan');
166
+ const workflowsDest = path.join(bmbDir, 'workflows', 'byan');
116
167
 
117
- if (isSilent || forceSilent) {
118
- logger.info(chalk.bold('\nSTEP 3/7: Interview (skipped - silent)\n'));
119
-
120
- const parsedAgents = parseList(options.agents);
121
- const parsedPlatforms = expandAllPlatforms(normalizePlatforms(parseList(options.platforms)));
122
-
123
- let mode = options.mode || (parsedAgents.length > 0 ? 'custom' : (recommendations.mode || 'minimal'));
124
- let agents = parsedAgents;
125
-
126
- if (agents.length === 0) {
127
- if (mode === 'recommended' && recommendations && recommendations.agents) {
128
- agents = recommendations.agents;
129
- } else if (mode === 'minimal' || mode === 'full') {
130
- agents = recommender.getAgentList(mode);
131
- } else if (mode === 'custom') {
132
- logger.warn('Custom mode selected without agents. Falling back to recommendations.');
133
- agents = recommendations.agents || ['byan'];
134
- mode = 'recommended';
135
- } else {
136
- agents = recommendations.agents || ['byan'];
137
- mode = recommendations.mode || 'minimal';
138
- }
139
- }
140
-
141
- let targetPlatforms = parsedPlatforms;
142
- if (targetPlatforms.length === 0) {
143
- targetPlatforms = (detection.platforms || [])
144
- .filter(p => p.detected)
145
- .map(p => normalizePlatformName(p.name));
146
- }
147
-
148
- answers = {
149
- userName: 'Developer',
150
- language: 'English',
151
- mode,
152
- agents,
153
- targetPlatforms,
154
- createSampleAgent: false,
155
- createBackup: options.backup !== false
156
- };
168
+ if (await fs.pathExists(workflowsSource)) {
169
+ await fs.copy(workflowsSource, workflowsDest, { overwrite: true });
170
+ copySpinner.text = 'Copied workflow files...';
171
+ console.log(chalk.green(` ✓ Workflows: ${workflowsSource} → ${workflowsDest}`));
157
172
  } else {
158
- logger.info(chalk.bold('\nSTEP 3/7: Interview\n'));
159
- const preferredPlatforms = expandAllPlatforms(normalizePlatforms(parseList(options.platforms)));
160
- answers = await interviewer.ask(recommendations, {
161
- detection,
162
- preferredPlatforms
163
- });
164
-
165
- if (options.backup === false) {
166
- answers.createBackup = false;
167
- }
173
+ copySpinner.warn(`⚠ Workflow source not found: ${workflowsSource}`);
168
174
  }
169
175
 
170
- // STEP 4: BACKUP (optional)
171
- if (answers.createBackup) {
172
- logger.info(chalk.bold('\n💾 STEP 4/7: Backup\n'));
173
- try {
174
- const bmadPath = path.join(projectRoot, '_bmad');
175
- const backup = await backuper.backup(bmadPath);
176
- logger.info(`✓ Backup created: ${chalk.cyan(backup.backupPath)}`);
177
- } catch (error) {
178
- logger.warn(`⚠ Backup failed (non-critical): ${error.message}`);
179
- }
180
- } else {
181
- logger.info(chalk.bold('\n⏭️ STEP 4/7: Backup (skipped)\n'));
182
- }
183
-
184
- // STEP 5: INSTALL - Core Installation
185
- logger.info(chalk.bold('\n🚀 STEP 5/7: Installation\n'));
186
- const installResult = await installer.install({
187
- projectRoot,
188
- agents: answers.agents,
189
- targetPlatforms: answers.targetPlatforms,
190
- userName: answers.userName,
191
- language: answers.language,
192
- mode: answers.mode
193
- });
194
-
195
- logger.info(`✓ Installed ${chalk.cyan(installResult.agentsInstalled)} agents`);
196
- if (installResult.errors && installResult.errors.length > 0) {
197
- logger.warn(`⚠ ${installResult.errors.length} installation errors`);
198
- }
199
-
200
- // STEP 6: VALIDATE - 10 Automated Checks
201
- logger.info(chalk.bold('\n✅ STEP 6/7: Validation\n'));
202
- const validation = await validator.validate({ projectRoot });
203
-
204
- if (validation.valid) {
205
- logger.info(chalk.green('✓ All validation checks passed!'));
206
- } else {
207
- logger.warn(chalk.yellow(`⚠ ${validation.errors.length} errors, ${validation.warnings.length} warnings`));
208
- if (validation.errors.length > 0) {
209
- validation.errors.forEach(err => logger.error(` ✗ ${err}`));
210
- }
211
- if (validation.warnings.length > 0) {
212
- validation.warnings.forEach(warn => logger.warn(` ⚠ ${warn}`));
213
- }
214
- }
215
-
216
- // STEP 7: WIZARD - Post-Install Actions
217
- if (isSilent || forceSilent) {
218
- logger.info(chalk.bold('\nSTEP 7/7: Post-Install Wizard (skipped - silent)\n'));
176
+ // FIX #6: Copy .github/agents files (stubs for Copilot CLI detection)
177
+ const githubAgentsSource = path.join(templateDir, '.github', 'agents');
178
+
179
+ if (await fs.pathExists(githubAgentsSource)) {
180
+ await fs.copy(githubAgentsSource, githubAgentsDir, { overwrite: true });
181
+ copySpinner.text = 'Copied Copilot CLI agent stubs...';
182
+ console.log(chalk.green(` ✓ GitHub agents: ${githubAgentsSource} → ${githubAgentsDir}`));
219
183
  } else {
220
- logger.info(chalk.bold('\nSTEP 7/7: Post-Install Wizard\n'));
221
- await wizard.show({
222
- agents: answers.agents,
223
- targetPlatforms: answers.targetPlatforms,
224
- mode: answers.mode,
225
- projectRoot,
226
- userName: answers.userName,
227
- language: answers.language
228
- });
184
+ copySpinner.warn(`⚠ GitHub agents source not found: ${githubAgentsSource}`);
229
185
  }
230
186
 
187
+ copySpinner.succeed('BYAN files installed');
231
188
  } catch (error) {
232
- logger.error(chalk.red('\n❌ Installation failed:\n'));
233
- logger.error(error.message);
234
- if (error.stack) {
235
- logger.error(chalk.gray(error.stack));
236
- }
237
- process.exit(1);
238
- }
239
- }
240
-
241
- // CLI Program
242
- program
243
- .name('create-byan-agent')
244
- .description('YANSTALLER - Intelligent installer for BYAN ecosystem (29 agents, multi-platform)')
245
- .version(YANSTALLER_VERSION)
246
- .option('--silent', 'Silent installation (no prompts)')
247
- .option('--interactive', 'Force interactive prompts even without TTY')
248
- .option('--agents <agents>', 'Comma-separated list of agents to install')
249
- .option('--platforms <platforms>', 'Comma-separated list of platforms (copilot-cli,vscode,claude-code,codex)')
250
- .option('--mode <mode>', 'Installation mode: recommended, custom, minimal, full')
251
- .option('--no-backup', 'Skip pre-install backup')
252
- .option('--dry-run', 'Simulate installation without making changes')
253
- .option('--verbose', 'Verbose logging')
254
- .action((opts) => main(opts));
255
-
256
- program.parse(process.argv);
189
+ copySpinner.fail('Error copying files');
190
+ console.error(chalk.red('Details:'), error.message);
191
+ console.error(chalk.red('Stack:'), error.stack);
192
+ }
193
+
194
+ // Step 6: Create config.yaml
195
+ const configSpinner = ora('Generating configuration...').start();
196
+
197
+ const configContent = {
198
+ bmb_creations_output_folder: "{project-root}/_bmad-output/bmb-creations",
199
+ user_name: config.userName,
200
+ communication_language: config.language,
201
+ document_output_language: config.language,
202
+ output_folder: "{project-root}/_bmad-output",
203
+ platform: platform
204
+ };
205
+
206
+ const configPath = path.join(bmbDir, 'config.yaml');
207
+ await fs.writeFile(configPath, yaml.dump(configContent), 'utf8');
208
+
209
+ configSpinner.succeed('Configuration generated');
210
+
211
+ // Step 7: Create package.json script
212
+ const shortcutSpinner = ora('Creating shortcuts...').start();
213
+
214
+ if (hasPackageJson) {
215
+ const pkgPath = path.join(projectRoot, 'package.json');
216
+ const pkg = await fs.readJson(pkgPath);
217
+
218
+ if (!pkg.scripts) pkg.scripts = {};
219
+
220
+ if (!pkg.scripts.byan) {
221
+ pkg.scripts.byan = 'echo "BYAN agent installed. Use: copilot and type /agent"';
222
+ await fs.writeJson(pkgPath, pkg, { spaces: 2 });
223
+ shortcutSpinner.succeed('NPM script added');
224
+ } else {
225
+ shortcutSpinner.info('NPM script already exists');
226
+ }
227
+ } else {
228
+ shortcutSpinner.succeed('Shortcuts created');
229
+ }
230
+
231
+ // Step 8: Verification
232
+ const verifySpinner = ora('Verifying installation...').start();
233
+
234
+ const checks = [
235
+ { name: 'Agents directory', path: path.join(bmbDir, 'agents') },
236
+ { name: 'BYAN agent', path: path.join(bmbDir, 'agents', 'byan.md') },
237
+ { name: 'RACHID agent', path: path.join(bmbDir, 'agents', 'rachid.md') },
238
+ { name: 'MARC agent', path: path.join(bmbDir, 'agents', 'marc.md') },
239
+ { name: 'Workflows', path: path.join(bmbDir, 'workflows', 'byan') },
240
+ { name: 'Config', path: configPath },
241
+ { name: 'GitHub agents dir', path: githubAgentsDir },
242
+ { name: 'BYAN stub', path: path.join(githubAgentsDir, 'bmad-agent-byan.md') },
243
+ { name: 'RACHID stub', path: path.join(githubAgentsDir, 'bmad-agent-rachid.md') },
244
+ { name: 'MARC stub', path: path.join(githubAgentsDir, 'bmad-agent-marc.md') }
245
+ ];
246
+
247
+ let passed = 0;
248
+ let failed = [];
249
+
250
+ for (const check of checks) {
251
+ if (await fs.pathExists(check.path)) {
252
+ passed++;
253
+ } else {
254
+ failed.push(check.name);
255
+ }
256
+ }
257
+
258
+ if (passed === checks.length) {
259
+ verifySpinner.succeed(`Verification: ${passed}/${checks.length} checks passed ✅`);
260
+ } else {
261
+ verifySpinner.warn(`Verification: ${passed}/${checks.length} checks passed`);
262
+ if (failed.length > 0) {
263
+ console.log(chalk.yellow(' Missing:'), failed.join(', '));
264
+ }
265
+ }
266
+
267
+ // Success message
268
+ console.log('');
269
+ console.log(chalk.green('╔════════════════════════════════════════════════════════════╗'));
270
+ console.log(chalk.green('║ ║'));
271
+ console.log(chalk.green('║ ✅ BYAN INSTALLATION COMPLETE! ║'));
272
+ console.log(chalk.green('║ ║'));
273
+ console.log(chalk.green('╚════════════════════════════════════════════════════════════╝'));
274
+ console.log('');
275
+
276
+ console.log(chalk.bold('Installation Summary:'));
277
+ console.log(` • Platform: ${chalk.cyan(platform)}`);
278
+ console.log(` • Installation Directory: ${chalk.cyan(bmbDir)}`);
279
+ console.log(` • Configuration: ${chalk.cyan(configPath)}`);
280
+ console.log(` • User: ${chalk.cyan(config.userName)}`);
281
+ console.log(` • Language: ${chalk.cyan(config.language)}`);
282
+ console.log(` • Agents Installed: ${chalk.cyan('BYAN, RACHID, MARC')}`);
283
+ console.log('');
284
+
285
+ console.log(chalk.bold('Next Steps:'));
286
+ console.log('');
287
+ console.log(chalk.yellow('1. Activate agents in GitHub Copilot CLI:'));
288
+ console.log(` ${chalk.blue('copilot')}`);
289
+ console.log(` Then type: ${chalk.blue('/agent')}`);
290
+ console.log(` Select: ${chalk.cyan('byan')} (create agents)`);
291
+ console.log(` ${chalk.cyan('rachid')} (NPM deployment)`);
292
+ console.log(` ${chalk.cyan('marc')} (Copilot CLI integration)`);
293
+ console.log('');
294
+
295
+ console.log(chalk.yellow('2. Create your first agent with BYAN:'));
296
+ console.log(' [INT] Start Intelligent Interview (30-45 min)');
297
+ console.log(' [QC] Quick Create (10 min)');
298
+ console.log('');
299
+
300
+ console.log(chalk.yellow('3. Deploy with RACHID:'));
301
+ console.log(' Use RACHID to publish BYAN to npm');
302
+ console.log(' Validate package.json and dependencies');
303
+ console.log('');
304
+
305
+ console.log(chalk.yellow('4. Integrate with MARC:'));
306
+ console.log(' Use MARC to test /agent detection');
307
+ console.log(' Validate .github/agents/ structure');
308
+ console.log('');
309
+
310
+ console.log(chalk.gray('Need help? Type \'/bmad-help\' when BYAN is active'));
311
+ console.log('');
312
+ console.log(chalk.blue('Happy agent building! 🏗️'));
313
+ }
314
+
315
+ // CLI Program
316
+ program
317
+ .name('create-byan-agent')
318
+ .description('Install BYAN - Builder of YAN agent creator with RACHID and MARC')
319
+ .version(BYAN_VERSION)
320
+ .action(install);
321
+
322
+ program.parse(process.argv);