@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 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.2.5...HEAD
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
- # One-shot project setup — zero install, just run:
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
- npx @kudusov.takhir/ba-toolkit install --for claude-code
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 install --for claude-code --global
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. Use `--dry-run` to preview without writing.
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: 'igaming', desc: 'iGaming slots, betting, casino, Telegram Mini Apps' },
61
- { id: 'fintech', desc: 'Fintech — neobanks, payments, crypto, P2P lending' },
62
- { id: 'saas', desc: 'SaaS B2B platforms, CRM, analytics, EdTech' },
63
- { id: 'ecommerce', desc: 'E-commerce — stores, marketplaces, D2C brands' },
64
- { id: 'healthcare', desc: 'Healthcare — telemedicine, EHR, patient portals' },
65
- { id: 'logistics', desc: 'Logistics delivery, courier, WMS, fleet' },
66
- { id: 'on-demand', desc: 'On-demand — ride-hailing, home services, marketplace' },
67
- { id: 'social-media', desc: 'Social/Media social networks, creator platforms' },
68
- { id: 'real-estate', desc: 'Real Estate — property portals, CRM, rental management' },
69
- { id: 'custom', desc: 'Customany other domain' },
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
- let slug = args.flags.slug;
254
- if (!slug) slug = await prompt(' Project slug (lowercase, hyphens only, e.g. dragon-fortune): ');
255
- slug = sanitiseSlug(slug);
256
- if (!slug) {
257
- logError('Invalid or empty slug.');
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
- let name = args.flags.name;
262
- if (!name) name = await prompt(' Project name (human-readable, e.g. Dragon Fortune): ');
263
- if (!name) {
264
- logError('Project name is required.');
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 (!domain) {
270
- log('');
271
- log(' ' + yellow('Available domains:'));
272
- for (const d of DOMAINS) {
273
- log(` ${d.id.padEnd(14)} ${d.desc}`);
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
- domain = await prompt(' Domain: ');
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}) initialised.`));
405
+ log(' ' + cyan(`Project '${name}' (${slug}) is ready.`));
308
406
  log('');
309
407
  log(' ' + yellow('Next steps:'));
310
- log(' 1. Install skills for your agent:');
311
- log(' ' + gray('ba-toolkit install --for claude-code'));
312
- log(' 2. Open your AI assistant (Claude, Cursor, etc.)');
313
- log(' 3. Optional: run /principles to define project-wide conventions');
314
- log(' 4. Run /brief to start the pipeline');
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
- async function cmdInstall(args) {
321
- const agentId = args.flags.for;
322
- if (!agentId || agentId === true) {
323
- logError('--for <agent> is required.');
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
- const requestedGlobal = !!args.flags.global;
335
- const requestedProject = !!args.flags.project;
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
- isGlobal = !agent.projectPath;
438
+ effectiveGlobal = !agent.projectPath;
340
439
  }
341
- if (isGlobal && !agent.globalPath) {
440
+ if (effectiveGlobal && !agent.globalPath) {
342
441
  logError(`${agent.name} does not support --global install.`);
343
442
  process.exit(1);
344
443
  }
345
- if (!isGlobal && !agent.projectPath) {
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 = isGlobal ? agent.globalPath : path.resolve(process.cwd(), agent.projectPath);
351
- const dryRun = !!args.flags['dry-run'];
449
+ const destDir = effectiveGlobal ? agent.globalPath : path.resolve(process.cwd(), agent.projectPath);
352
450
 
353
- log('');
354
- log(' ' + cyan(`BA Toolkit — Install for ${agent.name}`));
355
- log(' ' + cyan('================================'));
356
- log('');
357
- log(` Source: ${SKILLS_DIR}`);
358
- log(` Destination: ${destDir}`);
359
- log(` Scope: ${isGlobal ? 'global (user-wide)' : 'project-level'}`);
360
- log(` Format: ${agent.format === 'mdc' ? '.mdc (converted from SKILL.md)' : 'SKILL.md (native)'}`);
361
- if (dryRun) log(' ' + yellow('Mode: dry-run (no files will be written)'));
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(` ${destDir} already exists. Overwrite? (y/N): `);
466
+ const answer = await prompt(` ${destDir} already exists. Overwrite? (y/N): `);
366
467
  if (answer.toLowerCase() !== 'y') {
367
- log(' Cancelled.');
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(' ' + green(`${dryRun ? 'Would copy' : 'Copied'} ${copied.length} files.`));
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 (!dryRun) {
504
+ if (ok && !args.flags['dry-run']) {
384
505
  log(' ' + cyan('Install complete.'));
385
- if (agent.format === 'mdc') {
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 Interactive project initialiser. Creates
401
- output/{slug}/ and a starter AGENTS.md.
402
- install --for <agent> Install skills into an agent's directory.
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
- ba-toolkit init --slug dragon-fortune --name "Dragon Fortune" --domain igaming
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 claude-code --global
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.2.5",
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
- 00_principles_dragon-fortune.md
41
- 01_brief_dragon-fortune.md
42
- 02_srs_dragon-fortune.md
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
- dragon-fortune/
51
- 00_principles_dragon-fortune.md
52
- 01_brief_dragon-fortune.md
53
- 02_srs_dragon-fortune.md
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