@kudusov.takhir/ba-toolkit 1.2.5 → 1.3.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 +34 -1
- package/README.md +8 -4
- package/bin/ba-toolkit.js +215 -80
- package/package.json +1 -1
- package/skills/references/environment.md +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,38 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## [1.3.0] — 2026-04-08
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- **`ba-toolkit init` is now a one-command setup.** It prompts for project name, slug (auto-derived from the name), domain, and AI agent, then creates `output/{slug}/`, writes `AGENTS.md`, and installs the skills into the chosen agent's directory — in a single interactive flow. Previously this required two commands: `ba-toolkit init` followed by `ba-toolkit install --for <agent>`. The old two-step flow is still available via `ba-toolkit init --no-install` + `ba-toolkit install --for <agent>`.
|
|
19
|
+
- **Domain and agent selection now use numbered menus** instead of free-text input. Domains are listed 1–10 with name and short description; agents are listed 1–5 with their registered id. Users can type either the menu number (`1`, `2`, …) or the id (`saas`, `claude-code`, …).
|
|
20
|
+
- **`DOMAINS` reordered** so general-purpose industries (SaaS, Fintech, E-commerce, Healthcare) appear first; iGaming moved to position 9. The toolkit is no longer iGaming-first in its defaults.
|
|
21
|
+
- **Setup placeholders no longer use "Dragon Fortune"** (the iGaming example project). The CLI, `init.sh`, `init.ps1`, `docs/USAGE.md` AGENTS.md example, and `skills/references/environment.md` file listings now use neutral placeholders (`My App` / `my-app` / `saas`). The actual example project in `example/dragon-fortune/` and the skill templates that reference it are unchanged — they remain a real iGaming walkthrough.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- `ba-toolkit init --for <agent>` flag — skip the agent menu (e.g. `--for claude-code`). Accepts the same set as `ba-toolkit install --for`.
|
|
26
|
+
- `ba-toolkit init --no-install` flag — create the project structure only; don't install skills. Restores the pre-1.3.0 behavior for CI pipelines that run `init` and `install` as separate steps.
|
|
27
|
+
- `ba-toolkit init --global` / `--project` / `--dry-run` flags — forwarded to the embedded install step.
|
|
28
|
+
- `init.sh` and `init.ps1` shell fallbacks now use the same numbered domain menu and auto-derived slug UX as the CLI, with pointers to `npx @kudusov.takhir/ba-toolkit install --for <agent>` for the skill install step (they remain zero-dependency scripts and don't install skills themselves).
|
|
29
|
+
|
|
30
|
+
### Migration note
|
|
31
|
+
|
|
32
|
+
CI scripts that relied on the old behaviour (`init` creates files only, `install` is a separate step) need one of:
|
|
33
|
+
|
|
34
|
+
- Pass all the new flags to get fully non-interactive behaviour:
|
|
35
|
+
```bash
|
|
36
|
+
npx @kudusov.takhir/ba-toolkit init --name "My App" --domain saas --for claude-code
|
|
37
|
+
```
|
|
38
|
+
- Or add `--no-install` to keep the two-step flow:
|
|
39
|
+
```bash
|
|
40
|
+
npx @kudusov.takhir/ba-toolkit init --name "My App" --domain saas --no-install
|
|
41
|
+
npx @kudusov.takhir/ba-toolkit install --for claude-code
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
14
46
|
## [1.2.5] — 2026-04-08
|
|
15
47
|
|
|
16
48
|
### Changed
|
|
@@ -180,7 +212,8 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
180
212
|
|
|
181
213
|
---
|
|
182
214
|
|
|
183
|
-
[Unreleased]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.
|
|
215
|
+
[Unreleased]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.3.0...HEAD
|
|
216
|
+
[1.3.0]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.5...v1.3.0
|
|
184
217
|
[1.2.5]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.4...v1.2.5
|
|
185
218
|
[1.2.4]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.3...v1.2.4
|
|
186
219
|
[1.2.3]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.2...v1.2.3
|
package/README.md
CHANGED
|
@@ -33,16 +33,20 @@ Artifacts are generated in whatever language you write in — ask in English, ge
|
|
|
33
33
|
## Install
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
#
|
|
36
|
+
# Full setup in one command — prompts for project name, domain, and
|
|
37
|
+
# AI agent, then creates output/{slug}/, AGENTS.md, and installs the
|
|
38
|
+
# skills into the chosen agent's directory.
|
|
37
39
|
npx @kudusov.takhir/ba-toolkit init
|
|
38
|
-
|
|
40
|
+
|
|
41
|
+
# Non-interactive (e.g. for CI): pass every choice on the command line.
|
|
42
|
+
npx @kudusov.takhir/ba-toolkit init --name "My App" --domain saas --for claude-code
|
|
39
43
|
|
|
40
44
|
# Or install globally and reuse across projects:
|
|
41
45
|
npm install -g @kudusov.takhir/ba-toolkit
|
|
42
|
-
ba-toolkit
|
|
46
|
+
ba-toolkit init
|
|
43
47
|
```
|
|
44
48
|
|
|
45
|
-
Supported agents: `claude-code`, `codex`, `gemini`, `cursor`, `windsurf`. Cursor and Windsurf installs auto-convert `SKILL.md` into the `.mdc` rule format.
|
|
49
|
+
Supported agents: `claude-code`, `codex`, `gemini`, `cursor`, `windsurf`. Cursor and Windsurf installs auto-convert `SKILL.md` into the `.mdc` rule format. Pass `--dry-run` to preview the install step without writing files, or `--no-install` to create only the project structure and install skills later with `ba-toolkit install --for <agent>`.
|
|
46
50
|
|
|
47
51
|
`ba-toolkit --help` shows the full CLI reference. Zero runtime dependencies — only Node.js ≥ 18.
|
|
48
52
|
|
package/bin/ba-toolkit.js
CHANGED
|
@@ -57,16 +57,16 @@ const AGENTS = {
|
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
const DOMAINS = [
|
|
60
|
-
{ id: '
|
|
61
|
-
{ id: 'fintech', desc: '
|
|
62
|
-
{ id: '
|
|
63
|
-
{ id: '
|
|
64
|
-
{ id: '
|
|
65
|
-
{ id: '
|
|
66
|
-
{ id: '
|
|
67
|
-
{ id: '
|
|
68
|
-
{ id: '
|
|
69
|
-
{ id: 'custom', desc: '
|
|
60
|
+
{ id: 'saas', name: 'SaaS', desc: 'B2B platforms, CRM, analytics, EdTech, HRTech' },
|
|
61
|
+
{ id: 'fintech', name: 'Fintech', desc: 'Neobanks, payments, crypto, P2P lending' },
|
|
62
|
+
{ id: 'ecommerce', name: 'E-commerce', desc: 'Stores, marketplaces, D2C brands, digital goods' },
|
|
63
|
+
{ id: 'healthcare', name: 'Healthcare', desc: 'Telemedicine, EHR, patient portals, clinic management' },
|
|
64
|
+
{ id: 'logistics', name: 'Logistics', desc: 'Delivery, courier, WMS, fleet management' },
|
|
65
|
+
{ id: 'on-demand', name: 'On-demand', desc: 'Ride-hailing, home services, task marketplaces' },
|
|
66
|
+
{ id: 'social-media', name: 'Social/Media', desc: 'Social networks, creator platforms, community forums' },
|
|
67
|
+
{ id: 'real-estate', name: 'Real Estate', desc: 'Property portals, agency CRM, rental management' },
|
|
68
|
+
{ id: 'igaming', name: 'iGaming', desc: 'Slots, betting, casino, Telegram Mini Apps' },
|
|
69
|
+
{ id: 'custom', name: 'Custom', desc: 'Any other domain — general interview questions' },
|
|
70
70
|
];
|
|
71
71
|
|
|
72
72
|
// --- Terminal helpers --------------------------------------------------
|
|
@@ -134,6 +134,32 @@ function sanitiseSlug(input) {
|
|
|
134
134
|
.replace(/^-+|-+$/g, '');
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
+
// Accepts a 1-based menu index ("3") or a domain id ("fintech"). Returns the
|
|
138
|
+
// resolved id or null if nothing matched.
|
|
139
|
+
function resolveDomain(raw) {
|
|
140
|
+
const trimmed = String(raw || '').toLowerCase().trim();
|
|
141
|
+
if (!trimmed) return null;
|
|
142
|
+
if (/^\d+$/.test(trimmed)) {
|
|
143
|
+
const n = parseInt(trimmed, 10);
|
|
144
|
+
return n >= 1 && n <= DOMAINS.length ? DOMAINS[n - 1].id : null;
|
|
145
|
+
}
|
|
146
|
+
const match = DOMAINS.find((d) => d.id === trimmed);
|
|
147
|
+
return match ? match.id : null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Accepts a 1-based menu index ("1") or an agent id ("claude-code"). Returns
|
|
151
|
+
// the resolved id or null if nothing matched.
|
|
152
|
+
function resolveAgent(raw) {
|
|
153
|
+
const trimmed = String(raw || '').toLowerCase().trim();
|
|
154
|
+
if (!trimmed) return null;
|
|
155
|
+
const ids = Object.keys(AGENTS);
|
|
156
|
+
if (/^\d+$/.test(trimmed)) {
|
|
157
|
+
const n = parseInt(trimmed, 10);
|
|
158
|
+
return n >= 1 && n <= ids.length ? ids[n - 1] : null;
|
|
159
|
+
}
|
|
160
|
+
return AGENTS[trimmed] ? trimmed : null;
|
|
161
|
+
}
|
|
162
|
+
|
|
137
163
|
function today() {
|
|
138
164
|
return new Date().toISOString().slice(0, 10);
|
|
139
165
|
}
|
|
@@ -250,34 +276,93 @@ async function cmdInit(args) {
|
|
|
250
276
|
log(' ' + cyan('================================'));
|
|
251
277
|
log('');
|
|
252
278
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
if (!
|
|
257
|
-
|
|
279
|
+
// --- 1. Project name (slug derives from it) ---
|
|
280
|
+
const nameFromFlag = !!(args.flags.name && args.flags.name !== true);
|
|
281
|
+
let name = nameFromFlag ? args.flags.name : null;
|
|
282
|
+
if (!name) name = await prompt(' Project name (e.g. My App): ');
|
|
283
|
+
name = String(name || '').trim();
|
|
284
|
+
if (!name) {
|
|
285
|
+
logError('Project name is required.');
|
|
258
286
|
process.exit(1);
|
|
259
287
|
}
|
|
260
288
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
289
|
+
// --- 2. Slug (auto-derived from name; confirmed interactively unless
|
|
290
|
+
// both --name and --slug were passed on the command line) ---
|
|
291
|
+
const slugFromFlag = !!(args.flags.slug && args.flags.slug !== true);
|
|
292
|
+
let slug = slugFromFlag ? args.flags.slug : null;
|
|
293
|
+
if (!slug) {
|
|
294
|
+
const derived = sanitiseSlug(name);
|
|
295
|
+
if (nameFromFlag) {
|
|
296
|
+
// Non-interactive path: silently accept the derived slug.
|
|
297
|
+
slug = derived;
|
|
298
|
+
} else if (derived) {
|
|
299
|
+
const custom = await prompt(` Project slug [${cyan(derived)}]: `);
|
|
300
|
+
slug = custom || derived;
|
|
301
|
+
} else {
|
|
302
|
+
slug = await prompt(' Project slug (lowercase, hyphens only): ');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
slug = sanitiseSlug(slug);
|
|
306
|
+
if (!slug) {
|
|
307
|
+
logError('Invalid or empty slug.');
|
|
265
308
|
process.exit(1);
|
|
266
309
|
}
|
|
267
310
|
|
|
311
|
+
// --- 3. Domain (numbered menu) ---
|
|
268
312
|
let domain = args.flags.domain;
|
|
269
|
-
if (
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
log(
|
|
313
|
+
if (domain && domain !== true) {
|
|
314
|
+
domain = resolveDomain(String(domain));
|
|
315
|
+
if (!domain) {
|
|
316
|
+
logError(`Unknown domain: ${args.flags.domain}`);
|
|
317
|
+
log('Valid ids: ' + DOMAINS.map((d) => d.id).join(', '));
|
|
318
|
+
process.exit(1);
|
|
274
319
|
}
|
|
320
|
+
} else {
|
|
321
|
+
log('');
|
|
322
|
+
log(' ' + yellow('Pick a domain:'));
|
|
323
|
+
DOMAINS.forEach((d, i) => {
|
|
324
|
+
const idx = String(i + 1).padStart(2);
|
|
325
|
+
log(` ${idx}) ${bold(d.name.padEnd(13))} ${gray('— ' + d.desc)}`);
|
|
326
|
+
});
|
|
275
327
|
log('');
|
|
276
|
-
|
|
328
|
+
const raw = await prompt(` Select [1-${DOMAINS.length}]: `);
|
|
329
|
+
domain = resolveDomain(raw);
|
|
330
|
+
if (!domain) {
|
|
331
|
+
logError(`Invalid selection: ${raw || '(empty)'}`);
|
|
332
|
+
process.exit(1);
|
|
333
|
+
}
|
|
277
334
|
}
|
|
278
|
-
domain = String(domain || '').toLowerCase().trim();
|
|
279
|
-
if (!domain) domain = 'custom';
|
|
280
335
|
|
|
336
|
+
// --- 4. Agent (numbered menu), unless --no-install ---
|
|
337
|
+
const skipInstall = !!args.flags['no-install'];
|
|
338
|
+
let agentId = args.flags.for;
|
|
339
|
+
if (!skipInstall) {
|
|
340
|
+
if (agentId && agentId !== true) {
|
|
341
|
+
agentId = resolveAgent(String(agentId));
|
|
342
|
+
if (!agentId) {
|
|
343
|
+
logError(`Unknown agent: ${args.flags.for}`);
|
|
344
|
+
log('Supported: ' + Object.keys(AGENTS).join(', '));
|
|
345
|
+
process.exit(1);
|
|
346
|
+
}
|
|
347
|
+
} else {
|
|
348
|
+
log('');
|
|
349
|
+
log(' ' + yellow('Pick your AI agent:'));
|
|
350
|
+
const agentEntries = Object.entries(AGENTS);
|
|
351
|
+
agentEntries.forEach(([id, a], i) => {
|
|
352
|
+
const idx = String(i + 1).padStart(2);
|
|
353
|
+
log(` ${idx}) ${bold(a.name.padEnd(20))} ${gray('(' + id + ')')}`);
|
|
354
|
+
});
|
|
355
|
+
log('');
|
|
356
|
+
const raw = await prompt(` Select [1-${agentEntries.length}]: `);
|
|
357
|
+
agentId = resolveAgent(raw);
|
|
358
|
+
if (!agentId) {
|
|
359
|
+
logError(`Invalid selection: ${raw || '(empty)'}`);
|
|
360
|
+
process.exit(1);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// --- 5. Create project structure ---
|
|
281
366
|
log('');
|
|
282
367
|
log(' ' + green('Creating project structure...'));
|
|
283
368
|
|
|
@@ -303,27 +388,43 @@ async function cmdInit(args) {
|
|
|
303
388
|
log(' created AGENTS.md');
|
|
304
389
|
}
|
|
305
390
|
|
|
391
|
+
// --- 6. Install skills for the selected agent ---
|
|
392
|
+
if (!skipInstall && agentId) {
|
|
393
|
+
log('');
|
|
394
|
+
await runInstall({
|
|
395
|
+
agentId,
|
|
396
|
+
isGlobal: !!args.flags.global,
|
|
397
|
+
isProject: !!args.flags.project,
|
|
398
|
+
dryRun: !!args.flags['dry-run'],
|
|
399
|
+
showHeader: false,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// --- 7. Final message ---
|
|
306
404
|
log('');
|
|
307
|
-
log(' ' + cyan(`Project '${name}' (${slug})
|
|
405
|
+
log(' ' + cyan(`Project '${name}' (${slug}) is ready.`));
|
|
308
406
|
log('');
|
|
309
407
|
log(' ' + yellow('Next steps:'));
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
408
|
+
if (!skipInstall && agentId) {
|
|
409
|
+
log(' 1. ' + AGENTS[agentId].restartHint);
|
|
410
|
+
log(' 2. Optional: run /principles to define project-wide conventions');
|
|
411
|
+
log(' 3. Run /brief to start the BA pipeline');
|
|
412
|
+
} else {
|
|
413
|
+
log(' 1. Install skills for your agent:');
|
|
414
|
+
log(' ' + gray('ba-toolkit install --for claude-code'));
|
|
415
|
+
log(' 2. Open your AI assistant (Claude, Cursor, etc.)');
|
|
416
|
+
log(' 3. Optional: run /principles to define project-wide conventions');
|
|
417
|
+
log(' 4. Run /brief to start the BA pipeline');
|
|
418
|
+
}
|
|
315
419
|
log('');
|
|
316
420
|
log(' ' + gray(`Artifacts will be saved to: ${outputDir}/`));
|
|
317
421
|
log('');
|
|
318
422
|
}
|
|
319
423
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
log('Supported agents: ' + Object.keys(AGENTS).join(', '));
|
|
325
|
-
process.exit(1);
|
|
326
|
-
}
|
|
424
|
+
// Core install logic. Shared between `cmdInstall` (standalone) and `cmdInit`
|
|
425
|
+
// (full setup). Returns true on success, false if the user declined to
|
|
426
|
+
// overwrite an existing destination.
|
|
427
|
+
async function runInstall({ agentId, isGlobal, isProject, dryRun, showHeader = true }) {
|
|
327
428
|
const agent = AGENTS[agentId];
|
|
328
429
|
if (!agent) {
|
|
329
430
|
logError(`Unknown agent: ${agentId}`);
|
|
@@ -331,41 +432,41 @@ async function cmdInstall(args) {
|
|
|
331
432
|
process.exit(1);
|
|
332
433
|
}
|
|
333
434
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
let isGlobal = requestedGlobal;
|
|
337
|
-
if (!requestedGlobal && !requestedProject) {
|
|
435
|
+
let effectiveGlobal = !!isGlobal;
|
|
436
|
+
if (!isGlobal && !isProject) {
|
|
338
437
|
// Default: project-level if supported, otherwise global
|
|
339
|
-
|
|
438
|
+
effectiveGlobal = !agent.projectPath;
|
|
340
439
|
}
|
|
341
|
-
if (
|
|
440
|
+
if (effectiveGlobal && !agent.globalPath) {
|
|
342
441
|
logError(`${agent.name} does not support --global install.`);
|
|
343
442
|
process.exit(1);
|
|
344
443
|
}
|
|
345
|
-
if (!
|
|
444
|
+
if (!effectiveGlobal && !agent.projectPath) {
|
|
346
445
|
logError(`${agent.name} does not support project-level install. Use --global.`);
|
|
347
446
|
process.exit(1);
|
|
348
447
|
}
|
|
349
448
|
|
|
350
|
-
const destDir =
|
|
351
|
-
const dryRun = !!args.flags['dry-run'];
|
|
449
|
+
const destDir = effectiveGlobal ? agent.globalPath : path.resolve(process.cwd(), agent.projectPath);
|
|
352
450
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
log(
|
|
451
|
+
if (showHeader) {
|
|
452
|
+
log('');
|
|
453
|
+
log(' ' + cyan(`BA Toolkit — Install for ${agent.name}`));
|
|
454
|
+
log(' ' + cyan('================================'));
|
|
455
|
+
log('');
|
|
456
|
+
} else {
|
|
457
|
+
log(' ' + green(`Installing skills for ${agent.name}...`));
|
|
458
|
+
}
|
|
459
|
+
log(` source: ${SKILLS_DIR}`);
|
|
460
|
+
log(` destination: ${destDir}`);
|
|
461
|
+
log(` scope: ${effectiveGlobal ? 'global (user-wide)' : 'project-level'}`);
|
|
462
|
+
log(` format: ${agent.format === 'mdc' ? '.mdc (converted from SKILL.md)' : 'SKILL.md (native)'}`);
|
|
463
|
+
if (dryRun) log(' ' + yellow('mode: dry-run (no files will be written)'));
|
|
363
464
|
|
|
364
465
|
if (fs.existsSync(destDir) && !dryRun) {
|
|
365
|
-
const answer = await prompt(`
|
|
466
|
+
const answer = await prompt(` ${destDir} already exists. Overwrite? (y/N): `);
|
|
366
467
|
if (answer.toLowerCase() !== 'y') {
|
|
367
|
-
log('
|
|
368
|
-
return;
|
|
468
|
+
log(' cancelled.');
|
|
469
|
+
return false;
|
|
369
470
|
}
|
|
370
471
|
}
|
|
371
472
|
|
|
@@ -378,14 +479,31 @@ async function cmdInstall(args) {
|
|
|
378
479
|
process.exit(1);
|
|
379
480
|
}
|
|
380
481
|
|
|
381
|
-
log('
|
|
482
|
+
log(' ' + green(`${dryRun ? 'would copy' : 'copied'} ${copied.length} files.`));
|
|
483
|
+
if (!dryRun && agent.format === 'mdc') {
|
|
484
|
+
log(' ' + gray('SKILL.md files converted to .mdc rule format.'));
|
|
485
|
+
}
|
|
486
|
+
return true;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
async function cmdInstall(args) {
|
|
490
|
+
const agentId = args.flags.for;
|
|
491
|
+
if (!agentId || agentId === true) {
|
|
492
|
+
logError('--for <agent> is required.');
|
|
493
|
+
log('Supported agents: ' + Object.keys(AGENTS).join(', '));
|
|
494
|
+
process.exit(1);
|
|
495
|
+
}
|
|
496
|
+
const ok = await runInstall({
|
|
497
|
+
agentId,
|
|
498
|
+
isGlobal: !!args.flags.global,
|
|
499
|
+
isProject: !!args.flags.project,
|
|
500
|
+
dryRun: !!args.flags['dry-run'],
|
|
501
|
+
showHeader: true,
|
|
502
|
+
});
|
|
382
503
|
log('');
|
|
383
|
-
if (!
|
|
504
|
+
if (ok && !args.flags['dry-run']) {
|
|
384
505
|
log(' ' + cyan('Install complete.'));
|
|
385
|
-
|
|
386
|
-
log(' ' + gray('SKILL.md files converted to .mdc rule format.'));
|
|
387
|
-
}
|
|
388
|
-
log(' ' + yellow(agent.restartHint));
|
|
506
|
+
log(' ' + yellow(AGENTS[agentId].restartHint));
|
|
389
507
|
}
|
|
390
508
|
log('');
|
|
391
509
|
}
|
|
@@ -397,9 +515,25 @@ ${bold('USAGE')}
|
|
|
397
515
|
ba-toolkit <command> [options]
|
|
398
516
|
|
|
399
517
|
${bold('COMMANDS')}
|
|
400
|
-
init
|
|
401
|
-
|
|
402
|
-
|
|
518
|
+
init One-command project setup: prompts for name,
|
|
519
|
+
slug, domain, and AI agent, then creates
|
|
520
|
+
output/{slug}/, AGENTS.md, and installs the
|
|
521
|
+
skills into the chosen agent's directory.
|
|
522
|
+
install --for <agent> Install (or re-install) skills into an
|
|
523
|
+
agent's directory without creating a project.
|
|
524
|
+
|
|
525
|
+
${bold('INIT OPTIONS')}
|
|
526
|
+
--name <name> Skip the project name prompt
|
|
527
|
+
--slug <slug> Skip the slug prompt (auto-derived from name)
|
|
528
|
+
--domain <id> Skip the domain menu (e.g. saas, fintech)
|
|
529
|
+
--for <agent> Skip the agent menu (e.g. claude-code)
|
|
530
|
+
--no-install Create the project structure only; don't
|
|
531
|
+
install skills. Useful for CI or when you
|
|
532
|
+
want to pick the agent later.
|
|
533
|
+
--global Install agent skills user-wide
|
|
534
|
+
--project Install agent skills project-level (default
|
|
535
|
+
when the agent supports it)
|
|
536
|
+
--dry-run Preview the install step without writing
|
|
403
537
|
|
|
404
538
|
${bold('INSTALL OPTIONS')}
|
|
405
539
|
--for <agent> One of: ${Object.keys(AGENTS).join(', ')}
|
|
@@ -407,22 +541,23 @@ ${bold('INSTALL OPTIONS')}
|
|
|
407
541
|
--project Project-level install (default when supported)
|
|
408
542
|
--dry-run Preview without writing files
|
|
409
543
|
|
|
410
|
-
${bold('INIT OPTIONS')}
|
|
411
|
-
--slug <slug> Skip the slug prompt
|
|
412
|
-
--name <name> Skip the project name prompt
|
|
413
|
-
--domain <domain> Skip the domain prompt
|
|
414
|
-
|
|
415
544
|
${bold('GENERAL OPTIONS')}
|
|
416
545
|
--version, -v Print version and exit
|
|
417
546
|
--help, -h Print this help and exit
|
|
418
547
|
|
|
419
548
|
${bold('EXAMPLES')}
|
|
549
|
+
# Full interactive setup — one command does everything.
|
|
420
550
|
ba-toolkit init
|
|
421
|
-
|
|
551
|
+
|
|
552
|
+
# Non-interactive: all choices on the command line.
|
|
553
|
+
ba-toolkit init --name "My App" --domain saas --for claude-code
|
|
554
|
+
|
|
555
|
+
# Create the project structure now, pick the agent later.
|
|
556
|
+
ba-toolkit init --name "My App" --domain saas --no-install
|
|
557
|
+
|
|
558
|
+
# Re-install skills after a toolkit update (no project changes).
|
|
422
559
|
ba-toolkit install --for claude-code
|
|
423
|
-
ba-toolkit install --for
|
|
424
|
-
ba-toolkit install --for cursor
|
|
425
|
-
ba-toolkit install --for gemini --dry-run
|
|
560
|
+
ba-toolkit install --for cursor --dry-run
|
|
426
561
|
|
|
427
562
|
${bold('LEARN MORE')}
|
|
428
563
|
https://github.com/TakhirKudusov/ba-toolkit
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kudusov.takhir/ba-toolkit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "AI-powered Business Analyst pipeline — 21 skills from project brief to development handoff. Works with Claude Code, Codex CLI, Gemini CLI, Cursor, and Windsurf.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"business-analyst",
|
|
@@ -37,9 +37,9 @@ By default, all artifacts are saved flat in the output directory:
|
|
|
37
37
|
|
|
38
38
|
```
|
|
39
39
|
output_dir/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
00_principles_my-app.md
|
|
41
|
+
01_brief_my-app.md
|
|
42
|
+
02_srs_my-app.md
|
|
43
43
|
...
|
|
44
44
|
```
|
|
45
45
|
|
|
@@ -47,10 +47,10 @@ If the user prefers a project-scoped subfolder (useful when managing multiple pr
|
|
|
47
47
|
|
|
48
48
|
```
|
|
49
49
|
output_dir/
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
my-app/
|
|
51
|
+
00_principles_my-app.md
|
|
52
|
+
01_brief_my-app.md
|
|
53
|
+
02_srs_my-app.md
|
|
54
54
|
...
|
|
55
55
|
```
|
|
56
56
|
|