create-byan-agent 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +250 -177
- package/LICENSE +21 -21
- package/README.md +1245 -421
- package/bin/create-byan-agent-backup.js +220 -220
- package/bin/create-byan-agent-fixed.js +301 -301
- package/bin/create-byan-agent.js +322 -301
- package/lib/errors.js +61 -0
- package/lib/exit-codes.js +54 -0
- package/lib/platforms/claude-code.js +113 -0
- package/lib/platforms/codex.js +92 -0
- package/lib/platforms/copilot-cli.js +123 -0
- package/lib/platforms/index.js +14 -0
- package/lib/platforms/vscode.js +51 -0
- package/lib/utils/config-loader.js +79 -0
- package/lib/utils/file-utils.js +104 -0
- package/lib/utils/git-detector.js +35 -0
- package/lib/utils/logger.js +64 -0
- package/lib/utils/node-detector.js +58 -0
- package/lib/utils/os-detector.js +74 -0
- package/lib/utils/yaml-utils.js +87 -0
- package/lib/yanstaller/backuper.js +308 -0
- package/lib/yanstaller/detector.js +141 -0
- package/lib/yanstaller/index.js +93 -0
- package/lib/yanstaller/installer.js +225 -0
- package/lib/yanstaller/interviewer.js +250 -0
- package/lib/yanstaller/recommender.js +298 -0
- package/lib/yanstaller/troubleshooter.js +498 -0
- package/lib/yanstaller/validator.js +578 -0
- package/lib/yanstaller/wizard.js +211 -0
- package/package.json +61 -55
- package/templates/.github/agents/bmad-agent-bmad-master.md +15 -15
- package/templates/.github/agents/bmad-agent-bmb-agent-builder.md +15 -15
- package/templates/.github/agents/bmad-agent-bmb-module-builder.md +15 -15
- package/templates/.github/agents/bmad-agent-bmb-workflow-builder.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-analyst.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-architect.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-dev.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-pm.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-quick-flow-solo-dev.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-quinn.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-sm.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-tech-writer.md +15 -15
- package/templates/.github/agents/bmad-agent-bmm-ux-designer.md +15 -15
- package/templates/.github/agents/bmad-agent-byan-test.md +32 -0
- package/templates/.github/agents/bmad-agent-byan.md +224 -224
- package/templates/.github/agents/bmad-agent-carmack.md +18 -0
- package/templates/.github/agents/bmad-agent-cis-brainstorming-coach.md +15 -15
- package/templates/.github/agents/bmad-agent-cis-creative-problem-solver.md +15 -15
- package/templates/.github/agents/bmad-agent-cis-design-thinking-coach.md +15 -15
- package/templates/.github/agents/bmad-agent-cis-innovation-strategist.md +15 -15
- package/templates/.github/agents/bmad-agent-cis-presentation-master.md +15 -15
- package/templates/.github/agents/bmad-agent-cis-storyteller.md +15 -15
- package/templates/.github/agents/bmad-agent-marc.md +48 -48
- package/templates/.github/agents/bmad-agent-patnote.md +48 -0
- package/templates/.github/agents/bmad-agent-rachid.md +47 -47
- package/templates/.github/agents/bmad-agent-tea-tea.md +15 -15
- package/templates/.github/agents/bmad-agent-test-dynamic.md +21 -0
- package/templates/.github/agents/expert-merise-agile.md +1 -0
- package/templates/.github/agents/franck.md +379 -0
- package/templates/_bmad/bmb/agents/agent-builder.md +59 -59
- package/templates/_bmad/bmb/agents/byan-test.md +116 -116
- package/templates/_bmad/bmb/agents/byan.md +215 -215
- package/templates/_bmad/bmb/agents/marc.md +303 -303
- package/templates/_bmad/bmb/agents/module-builder.md +60 -60
- package/templates/_bmad/bmb/agents/patnote.md +495 -495
- package/templates/_bmad/bmb/agents/rachid.md +184 -184
- package/templates/_bmad/bmb/agents/workflow-builder.md +61 -61
- package/templates/_bmad/bmb/workflows/byan/data/mantras.yaml +272 -272
- package/templates/_bmad/bmb/workflows/byan/data/templates.yaml +59 -59
- package/templates/_bmad/bmb/workflows/byan/delete-agent-workflow.md +657 -657
- package/templates/_bmad/bmb/workflows/byan/edit-agent-workflow.md +688 -688
- package/templates/_bmad/bmb/workflows/byan/interview-workflow.md +753 -753
- package/templates/_bmad/bmb/workflows/byan/quick-create-workflow.md +450 -450
- package/templates/_bmad/bmb/workflows/byan/templates/base-agent-template.md +79 -79
- package/templates/_bmad/bmb/workflows/byan/validate-agent-workflow.md +676 -676
- package/templates/_bmad/core/agents/carmack.md +238 -238
package/bin/create-byan-agent.js
CHANGED
|
@@ -1,301 +1,322 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
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');
|
|
10
|
-
|
|
11
|
-
const BYAN_VERSION = '1.1.
|
|
12
|
-
|
|
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
|
-
`;
|
|
24
|
-
|
|
25
|
-
// Source template directory (where BYAN package files are)
|
|
26
|
-
const getTemplateDir = () => {
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
console.
|
|
46
|
-
console.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
await fs.ensureDir(
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
console.log(
|
|
269
|
-
console.log(
|
|
270
|
-
console.log(
|
|
271
|
-
console.log(
|
|
272
|
-
console.log('');
|
|
273
|
-
|
|
274
|
-
console.log(
|
|
275
|
-
|
|
276
|
-
console.log('
|
|
277
|
-
console.log(
|
|
278
|
-
|
|
279
|
-
console.log(chalk.
|
|
280
|
-
console.log(
|
|
281
|
-
console.log(
|
|
282
|
-
console.log('');
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
console.log('
|
|
286
|
-
console.log('
|
|
287
|
-
console.log('');
|
|
288
|
-
|
|
289
|
-
console.log(chalk.
|
|
290
|
-
console.log('');
|
|
291
|
-
console.log(chalk.
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
.
|
|
297
|
-
.
|
|
298
|
-
.
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
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');
|
|
10
|
+
|
|
11
|
+
const BYAN_VERSION = '1.1.3';
|
|
12
|
+
|
|
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
|
+
`;
|
|
24
|
+
|
|
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;
|
|
34
|
+
}
|
|
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
|
+
};
|
|
50
|
+
|
|
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
|
+
]);
|
|
76
|
+
|
|
77
|
+
if (!continueAnyway) {
|
|
78
|
+
console.log(chalk.yellow('Installation cancelled.'));
|
|
79
|
+
process.exit(0);
|
|
80
|
+
}
|
|
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}`);
|
|
162
|
+
}
|
|
163
|
+
|
|
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');
|
|
167
|
+
|
|
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}`));
|
|
172
|
+
} else {
|
|
173
|
+
copySpinner.warn(`⚠ Workflow source not found: ${workflowsSource}`);
|
|
174
|
+
}
|
|
175
|
+
|
|
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}`));
|
|
183
|
+
} else {
|
|
184
|
+
copySpinner.warn(`⚠ GitHub agents source not found: ${githubAgentsSource}`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
copySpinner.succeed('BYAN files installed');
|
|
188
|
+
} catch (error) {
|
|
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);
|