@kudusov.takhir/ba-toolkit 1.2.5 → 1.3.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.
- package/CHANGELOG.md +57 -1
- package/README.md +12 -8
- package/bin/ba-toolkit.js +215 -80
- package/package.json +1 -1
- package/skills/brief/SKILL.md +4 -4
- package/skills/references/environment.md +7 -7
- package/skills/references/templates/export-template.md +1 -1
- package/skills/references/templates/risk-template.md +24 -24
- package/skills/references/templates/sprint-template.md +50 -50
- package/skills/srs/SKILL.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,6 +11,60 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## [1.3.1] — 2026-04-08
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- **`/brief` and `/srs` now load all 9 domain references, not just 3.** Both `skills/brief/SKILL.md` and `skills/srs/SKILL.md` hardcoded a check for `igaming`, `fintech`, `saas` only — a stale list from v1.0 that was never updated when v1.1.0 added six new domain references (`ecommerce`, `healthcare`, `logistics`, `on-demand`, `social-media`, `real-estate`). As a result, users on any of those six domains silently got no domain-specific interview questions, mandatory entities, or glossary. The check now covers all nine shipped domain files, matching the supported list advertised in the CLI and README. No other skill files had the same stale list — only `brief` and `srs` did hardcoded domain matching.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **`sprint-template.md` rewritten end-to-end as Nova Analytics (SaaS).** The sprint-plan reference template loaded by `/sprint` was previously a Dragon Fortune iGaming example (slot games, RTP, responsible gambling, bonus wagering, Telegram Mini App). It's now a B2B SaaS product analytics plan — workspace sign-up, data source integration, dashboards with funnel/cohort widgets, metric alerts, SSO, and admin workspace management. Structure (sprint goals, DoD, capacity math, epic labels) is unchanged.
|
|
23
|
+
- **`risk-template.md` rewritten end-to-end as Nova Analytics.** The risk-register reference template loaded by `/risk` had iGaming-specific risks (regulated iGaming jurisdiction, Telegram Mini App API breakage, RTP / bonus wagering knowledge gap). It's now a SaaS analytics risk register: third-party data source rate limits, GDPR DPA, columnar query performance at scale, OIDC/SSO library breaking changes, and columnar analytics storage knowledge gap. Structure (probability × impact scoring, priority tiers, mitigation/contingency sections) is unchanged.
|
|
24
|
+
- **`export-template.md`** — one-line fix: the example Jira label changed from `dragon-fortune` to `nova-analytics`.
|
|
25
|
+
- **iGaming-first ordering removed from user-facing documentation.** README intro, README Domain support table, `docs/FAQ.md`, `docs/USAGE.md`, and `docs/TROUBLESHOOTING.md` all listed iGaming first when enumerating the 9 supported domains. They now follow the SaaS-first order the CLI has used since v1.3.0: `saas → fintech → ecommerce → healthcare → logistics → on-demand → social-media → real-estate → igaming`. The iGaming row in the Domain support table stays — it just moved from position 1 to position 9.
|
|
26
|
+
- **`dragon-fortune` slug example in README.md:186 replaced with `nova-analytics`.** This was the last stray placeholder outside the real `example/dragon-fortune/` project.
|
|
27
|
+
|
|
28
|
+
### Not changed (deliberately)
|
|
29
|
+
|
|
30
|
+
- `skills/references/domains/igaming.md` — the domain reference itself. iGaming remains a first-class supported domain.
|
|
31
|
+
- `example/dragon-fortune/` — the real end-to-end example project referenced from README.
|
|
32
|
+
- `bin/ba-toolkit.js` / `init.sh` / `init.ps1` `DOMAINS` array iGaming entry — iGaming remains a menu choice in the CLI and shell initialisers.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## [1.3.0] — 2026-04-08
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- **`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>`.
|
|
41
|
+
- **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`, …).
|
|
42
|
+
- **`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.
|
|
43
|
+
- **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.
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- `ba-toolkit init --for <agent>` flag — skip the agent menu (e.g. `--for claude-code`). Accepts the same set as `ba-toolkit install --for`.
|
|
48
|
+
- `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.
|
|
49
|
+
- `ba-toolkit init --global` / `--project` / `--dry-run` flags — forwarded to the embedded install step.
|
|
50
|
+
- `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).
|
|
51
|
+
|
|
52
|
+
### Migration note
|
|
53
|
+
|
|
54
|
+
CI scripts that relied on the old behaviour (`init` creates files only, `install` is a separate step) need one of:
|
|
55
|
+
|
|
56
|
+
- Pass all the new flags to get fully non-interactive behaviour:
|
|
57
|
+
```bash
|
|
58
|
+
npx @kudusov.takhir/ba-toolkit init --name "My App" --domain saas --for claude-code
|
|
59
|
+
```
|
|
60
|
+
- Or add `--no-install` to keep the two-step flow:
|
|
61
|
+
```bash
|
|
62
|
+
npx @kudusov.takhir/ba-toolkit init --name "My App" --domain saas --no-install
|
|
63
|
+
npx @kudusov.takhir/ba-toolkit install --for claude-code
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
14
68
|
## [1.2.5] — 2026-04-08
|
|
15
69
|
|
|
16
70
|
### Changed
|
|
@@ -180,7 +234,9 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
180
234
|
|
|
181
235
|
---
|
|
182
236
|
|
|
183
|
-
[Unreleased]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.
|
|
237
|
+
[Unreleased]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.3.1...HEAD
|
|
238
|
+
[1.3.1]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.3.0...v1.3.1
|
|
239
|
+
[1.3.0]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.5...v1.3.0
|
|
184
240
|
[1.2.5]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.4...v1.2.5
|
|
185
241
|
[1.2.4]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.3...v1.2.4
|
|
186
242
|
[1.2.3]: https://github.com/TakhirKudusov/ba-toolkit/compare/v1.2.2...v1.2.3
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Structured BA pipeline for AI coding agents — brief to handoff, 21 skills, 9 d
|
|
|
24
24
|
|
|
25
25
|
BA Toolkit is a set of 21 interconnected skills that run a full business-analysis pipeline inside your AI coding agent. You go from a rough project brief to a development handoff package, and each skill reads the output of the previous ones — maintaining cross-references between artifacts along the chain `FR → US → UC → AC → NFR → Entity → ADR → API → WF → Scenario`.
|
|
26
26
|
|
|
27
|
-
Unlike one-shot prompting, every artifact is written to disk as Markdown, every ID links back to its source, and `/trace` verifies coverage across the whole pipeline. `/clarify` and `/analyze` catch ambiguities and quality gaps with CRITICAL/HIGH severity ratings. Domain references for 9 industries (
|
|
27
|
+
Unlike one-shot prompting, every artifact is written to disk as Markdown, every ID links back to its source, and `/trace` verifies coverage across the whole pipeline. `/clarify` and `/analyze` catch ambiguities and quality gaps with CRITICAL/HIGH severity ratings. Domain references for 9 industries (SaaS, Fintech, E-commerce, Healthcare, Logistics, On-demand, Social/Media, Real Estate, iGaming) plug in automatically at `/brief`.
|
|
28
28
|
|
|
29
29
|
Artifacts are generated in whatever language you write in — ask in English, get English docs; ask in any other language, the output follows.
|
|
30
30
|
|
|
@@ -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
|
|
|
@@ -179,7 +183,7 @@ Full traceability: FR → US → UC → AC → NFR → Entity → ADR → API
|
|
|
179
183
|
| — | `/risk` | Risk register — probability × impact matrix, mitigation per risk | `00_risks_{slug}.md` |
|
|
180
184
|
| — | `/sprint` | Sprint plan — stories grouped by velocity and capacity with sprint goals | `00_sprint_{slug}.md` |
|
|
181
185
|
|
|
182
|
-
The project **slug** (e.g., `
|
|
186
|
+
The project **slug** (e.g., `nova-analytics`) is set at `/brief` and reused across all files automatically.
|
|
183
187
|
|
|
184
188
|
---
|
|
185
189
|
|
|
@@ -208,15 +212,15 @@ The pipeline is domain-agnostic by default. At `/brief`, you pick a domain, and
|
|
|
208
212
|
|
|
209
213
|
| Domain | Industries covered |
|
|
210
214
|
|--------|-------------------|
|
|
211
|
-
| **iGaming** | Online slots, sports betting, casino lobbies, Telegram Mini Apps, promo mechanics |
|
|
212
|
-
| **Fintech** | Neobanks, payment systems, crypto exchanges, investment platforms, P2P lending |
|
|
213
215
|
| **SaaS** | B2B platforms, CRM, analytics, marketplaces, EdTech, HRTech |
|
|
216
|
+
| **Fintech** | Neobanks, payment systems, crypto exchanges, investment platforms, P2P lending |
|
|
214
217
|
| **E-commerce** | B2C stores, B2B catalogs, multi-vendor marketplaces, D2C brands, digital goods |
|
|
215
218
|
| **Healthcare** | Telemedicine, patient portals, EHR/EMR, clinic management, mental health apps |
|
|
216
219
|
| **Logistics** | Last-mile delivery, courier management, freight tracking, WMS, fleet management |
|
|
217
220
|
| **On-demand** | Ride-hailing, home services, task marketplaces, beauty, tutoring, pet care |
|
|
218
221
|
| **Social / Media** | Social networks, creator platforms, community forums, newsletters, short-video |
|
|
219
222
|
| **Real Estate** | Property portals, agency CRM, rental management, property management, mortgage tools |
|
|
223
|
+
| **iGaming** | Online slots, sports betting, casino lobbies, Telegram Mini Apps, promo mechanics |
|
|
220
224
|
| **Custom** | Any other domain — works with general interview questions |
|
|
221
225
|
|
|
222
226
|
Adding a new domain = creating one Markdown file in `skills/references/domains/`. See [docs/DOMAINS.md](docs/DOMAINS.md).
|
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.1",
|
|
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",
|
package/skills/brief/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ba-brief
|
|
3
3
|
description: >
|
|
4
|
-
Generate a high-level Project Brief for projects in any domain (
|
|
4
|
+
Generate a high-level Project Brief for projects in any domain (SaaS, Fintech, E-commerce, Healthcare, Logistics, and others). Use this skill when the user enters /brief, or asks to "create a project brief", "describe the project", "start a new project", "project brief", or mentions the starting stage of the analytical pipeline. Also triggers on requests like "begin with a brief", "describe the product", "form a product description". First step of the BA Toolkit pipeline.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# /brief — Project Brief
|
|
@@ -10,7 +10,7 @@ Starting point of the BA Toolkit pipeline. Generates a structured Project Brief
|
|
|
10
10
|
|
|
11
11
|
## Loading domain reference
|
|
12
12
|
|
|
13
|
-
Domain references are located in `references/domains/` relative to the `ba-toolkit` directory. Supported domains: `
|
|
13
|
+
Domain references are located in `references/domains/` relative to the `ba-toolkit` directory. Supported domains: `saas`, `fintech`, `ecommerce`, `healthcare`, `logistics`, `on-demand`, `social-media`, `real-estate`, `igaming`. For other domains, work without a reference file.
|
|
14
14
|
|
|
15
15
|
## Workflow
|
|
16
16
|
|
|
@@ -26,7 +26,7 @@ If `00_principles_*.md` exists in the output directory, load it and apply its co
|
|
|
26
26
|
|
|
27
27
|
### 3. Domain selection
|
|
28
28
|
|
|
29
|
-
Ask the user about the project domain. If
|
|
29
|
+
Ask the user about the project domain. If a matching `references/domains/{domain}.md` file exists (currently: `saas`, `fintech`, `ecommerce`, `healthcare`, `logistics`, `on-demand`, `social-media`, `real-estate`, `igaming`), load it and use its domain-specific interview questions (section `1. /brief`), typical business goals, risks, and glossary.
|
|
30
30
|
|
|
31
31
|
If the domain does not match any supported one, record it as `custom:{name}` and use general questions only.
|
|
32
32
|
|
|
@@ -54,7 +54,7 @@ If a domain reference is loaded, supplement general questions with domain-specif
|
|
|
54
54
|
```markdown
|
|
55
55
|
# Project Brief: {Project Name}
|
|
56
56
|
|
|
57
|
-
**Domain:** {
|
|
57
|
+
**Domain:** {saas | fintech | ecommerce | healthcare | logistics | on-demand | social-media | real-estate | igaming | custom:{name}}
|
|
58
58
|
**Date:** {date}
|
|
59
59
|
|
|
60
60
|
## 1. Project Summary
|
|
@@ -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
|
|
|
@@ -39,7 +39,7 @@ Actual values are filled in by the skill based on the project's artifacts.
|
|
|
39
39
|
},
|
|
40
40
|
"issuetype": { "name": "Story" },
|
|
41
41
|
"priority": { "name": "High" },
|
|
42
|
-
"labels": ["
|
|
42
|
+
"labels": ["nova-analytics", "E-01"],
|
|
43
43
|
"customfield_10016": 3,
|
|
44
44
|
"customfield_10014": null
|
|
45
45
|
}
|
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
|
|
24
24
|
| ID | Title | Category | Probability | Impact | Score | Priority | Status |
|
|
25
25
|
|----|-------|----------|:-----------:|:------:|:-----:|---------|--------|
|
|
26
|
-
| RISK-01 |
|
|
27
|
-
| RISK-02 |
|
|
28
|
-
| RISK-03 |
|
|
26
|
+
| RISK-01 | Third-party data source rate limits unclear | External | 4 | 5 | 20 | 🔴 Critical | Open |
|
|
27
|
+
| RISK-02 | GDPR data-processing agreement unsigned | Compliance | 3 | 4 | 12 | 🟡 High | Open |
|
|
28
|
+
| RISK-03 | Columnar query performance under concurrent load unproven | Technical | 3 | 3 | 9 | 🟡 High | Open |
|
|
29
29
|
| RISK-04 | Scope creep from stakeholder wish list | Business | 3 | 2 | 6 | 🟢 Medium | Open |
|
|
30
|
-
| RISK-05 |
|
|
30
|
+
| RISK-05 | OIDC / SSO library breaking changes | External | 2 | 3 | 6 | 🟢 Medium | Open |
|
|
31
31
|
| RISK-06 | Data model changes after /datadict | Technical | 2 | 3 | 6 | 🟢 Medium | Open |
|
|
32
|
-
| RISK-07 | Development team unfamiliar with domain | Business | 2 | 1 | 2 | ⚪ Low | Open |
|
|
32
|
+
| RISK-07 | Development team unfamiliar with analytics domain | Business | 2 | 1 | 2 | ⚪ Low | Open |
|
|
33
33
|
|
|
34
34
|
---
|
|
35
35
|
|
|
36
36
|
## Risk Details
|
|
37
37
|
|
|
38
|
-
### RISK-01 —
|
|
38
|
+
### RISK-01 — Third-party data source rate limits unclear
|
|
39
39
|
|
|
40
40
|
**Category:** External
|
|
41
41
|
**Probability:** 4 / 5 — Likely
|
|
@@ -45,19 +45,19 @@
|
|
|
45
45
|
**Source:** `07a_research_{slug}.md`
|
|
46
46
|
|
|
47
47
|
**Description:**
|
|
48
|
-
The
|
|
48
|
+
The product depends on timely event delivery from third-party integrations (Segment and warehouse connectors). The published rate limits do not guarantee sustained throughput at the projected MVP event volume. If a critical integration is rate-limited or breaks its contract, dashboards will show stale or incomplete data and user trust erodes quickly.
|
|
49
49
|
|
|
50
50
|
**Mitigation:**
|
|
51
|
-
|
|
51
|
+
Run a sustained-throughput test against each integration in sprint 0. Negotiate higher quotas with the providers before launch. Add per-source ingestion lag as a monitored NFR metric with an alert threshold.
|
|
52
52
|
|
|
53
53
|
**Contingency:**
|
|
54
|
-
Enable
|
|
54
|
+
Enable an ingestion backpressure queue and surface a workspace-level banner when a source is lagging more than 5 minutes behind real-time. Prioritise critical event streams over low-value ones until the lag recovers.
|
|
55
55
|
|
|
56
56
|
**Owner:** Tech Lead
|
|
57
57
|
|
|
58
58
|
---
|
|
59
59
|
|
|
60
|
-
### RISK-02 —
|
|
60
|
+
### RISK-02 — GDPR data-processing agreement unsigned
|
|
61
61
|
|
|
62
62
|
**Category:** Compliance
|
|
63
63
|
**Probability:** 3 / 5 — Possible
|
|
@@ -67,19 +67,19 @@ Enable the fallback provider automatically via feature flag if primary provider
|
|
|
67
67
|
**Source:** `01_brief_{slug}.md`
|
|
68
68
|
|
|
69
69
|
**Description:**
|
|
70
|
-
The product
|
|
70
|
+
The product collects first-party user-behavioural events from EU workspaces. The Brief listed the GDPR data-processing agreement (DPA) with the selected cloud provider as an assumption. If the DPA is delayed or blocked by legal review, the EU launch date will slip regardless of development readiness.
|
|
71
71
|
|
|
72
72
|
**Mitigation:**
|
|
73
|
-
Engage legal counsel early to track
|
|
73
|
+
Engage legal counsel early to track DPA status. Decouple development milestones from the legal timeline so that technical readiness does not block on paperwork. Draft the workspace-level privacy controls (PII redaction, data residency) independently of the final DPA text.
|
|
74
74
|
|
|
75
75
|
**Contingency:**
|
|
76
|
-
|
|
76
|
+
Launch in non-EU regions first (US, CA, APAC) while the EU DPA is pending. Gate EU workspace signups behind a feature flag tied to DPA status.
|
|
77
77
|
|
|
78
78
|
**Owner:** Product Manager
|
|
79
79
|
|
|
80
80
|
---
|
|
81
81
|
|
|
82
|
-
### RISK-03 —
|
|
82
|
+
### RISK-03 — Columnar query performance under concurrent load unproven
|
|
83
83
|
|
|
84
84
|
**Category:** Technical
|
|
85
85
|
**Probability:** 3 / 5 — Possible
|
|
@@ -89,13 +89,13 @@ Prepare a soft launch in an unregulated market while the primary jurisdiction ap
|
|
|
89
89
|
**Source:** `07a_research_{slug}.md`
|
|
90
90
|
|
|
91
91
|
**Description:**
|
|
92
|
-
The ADR for the
|
|
92
|
+
The ADR for the analytics query layer chose ClickHouse as the primary store. This setup has not been load-tested for the projected 200 concurrent dashboard viewers reading against a 10 M-event dataset. If query throughput assumptions are wrong, dashboards will exceed the 500 ms p95 NFR target and degrade UX.
|
|
93
93
|
|
|
94
94
|
**Mitigation:**
|
|
95
|
-
|
|
95
|
+
Run a load-test spike in the first development sprint against the reference dataset. Define a caching fallback (5-minute materialised query cache) if raw query throughput does not meet targets.
|
|
96
96
|
|
|
97
97
|
**Contingency:**
|
|
98
|
-
|
|
98
|
+
Enable the query cache globally and mark cached dashboards with a "last refreshed" timestamp. Communicate the change as a phased rollout feature.
|
|
99
99
|
|
|
100
100
|
**Owner:** Tech Lead
|
|
101
101
|
|
|
@@ -123,7 +123,7 @@ Freeze scope at the start of each sprint. Defer any mid-sprint scope additions t
|
|
|
123
123
|
|
|
124
124
|
---
|
|
125
125
|
|
|
126
|
-
### RISK-05 —
|
|
126
|
+
### RISK-05 — OIDC / SSO library breaking changes
|
|
127
127
|
|
|
128
128
|
**Category:** External
|
|
129
129
|
**Probability:** 2 / 5 — Unlikely
|
|
@@ -133,13 +133,13 @@ Freeze scope at the start of each sprint. Defer any mid-sprint scope additions t
|
|
|
133
133
|
**Source:** `07a_research_{slug}.md`
|
|
134
134
|
|
|
135
135
|
**Description:**
|
|
136
|
-
The product
|
|
136
|
+
The product uses a third-party OIDC / SAML library for workspace SSO. Similar libraries have released breaking changes in previous majors without long deprecation windows. If the library releases a breaking change after development, sign-up and SSO flows may require rework.
|
|
137
137
|
|
|
138
138
|
**Mitigation:**
|
|
139
|
-
Pin the
|
|
139
|
+
Pin the library version used in development. Monitor the library changelog and security advisories. Abstract SSO calls behind a thin adapter layer so a future swap to a different provider is isolated to one module.
|
|
140
140
|
|
|
141
141
|
**Contingency:**
|
|
142
|
-
Allocate a 3-day buffer in the release plan for
|
|
142
|
+
Allocate a 3-day buffer in the release plan for library compatibility fixes.
|
|
143
143
|
|
|
144
144
|
**Owner:** Frontend Lead
|
|
145
145
|
|
|
@@ -167,7 +167,7 @@ Use `/revise` on affected artifacts to propagate changes. Document the delta in
|
|
|
167
167
|
|
|
168
168
|
---
|
|
169
169
|
|
|
170
|
-
### RISK-07 — Development team unfamiliar with domain
|
|
170
|
+
### RISK-07 — Development team unfamiliar with analytics domain
|
|
171
171
|
|
|
172
172
|
**Category:** Business
|
|
173
173
|
**Probability:** 2 / 5 — Unlikely
|
|
@@ -177,10 +177,10 @@ Use `/revise` on affected artifacts to propagate changes. Document the delta in
|
|
|
177
177
|
**Source:** `01_brief_{slug}.md`
|
|
178
178
|
|
|
179
179
|
**Description:**
|
|
180
|
-
The engineering team has limited prior experience with
|
|
180
|
+
The engineering team has limited prior experience with columnar analytics storage. Domain-specific concepts (event schemas, funnel aggregation, cohort joins) may be misunderstood during implementation, leading to query correctness bugs on edge cases.
|
|
181
181
|
|
|
182
182
|
**Mitigation:**
|
|
183
|
-
Include a domain onboarding session as part of sprint 0. Reference the
|
|
183
|
+
Include a domain onboarding session as part of sprint 0. Reference the SaaS domain glossary in the Handoff document.
|
|
184
184
|
|
|
185
185
|
**Contingency:**
|
|
186
186
|
Schedule a BA review checkpoint after the first feature is implemented end-to-end.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
# Sprint Plan:
|
|
1
|
+
# Sprint Plan: Nova Analytics
|
|
2
2
|
|
|
3
|
-
**Domain:**
|
|
3
|
+
**Domain:** saas
|
|
4
4
|
**Date:** 2026-04-08
|
|
5
|
-
**Slug:**
|
|
5
|
+
**Slug:** nova-analytics
|
|
6
6
|
**Sprint length:** 2 weeks
|
|
7
7
|
**Team velocity:** 35 SP per sprint
|
|
8
|
-
**Sources:** `
|
|
8
|
+
**Sources:** `00_estimate_nova-analytics.md`, `03_stories_nova-analytics.md`, `00_risks_nova-analytics.md`, `02_srs_nova-analytics.md`
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -13,11 +13,11 @@
|
|
|
13
13
|
|
|
14
14
|
| Sprint | Goal | Stories | Points | Capacity |
|
|
15
15
|
|--------|------|:-------:|:------:|:--------:|
|
|
16
|
-
| SP-00 | Setup: environment, CI/CD,
|
|
17
|
-
| SP-01 |
|
|
18
|
-
| SP-02 |
|
|
19
|
-
| SP-03 |
|
|
20
|
-
| SP-04 | Admin
|
|
16
|
+
| SP-00 | Setup: environment, CI/CD, event-ingestion pipeline scaffold | — | — | — |
|
|
17
|
+
| SP-01 | Users can sign up, connect a data source, and see events arrive | 6 | 34 SP | 97% |
|
|
18
|
+
| SP-02 | Users can build dashboards with funnel, cohort, and trend widgets | 5 | 32 SP | 91% |
|
|
19
|
+
| SP-03 | Alerts and collaboration: thresholds, notifications, sharing, SSO | 5 | 30 SP | 86% |
|
|
20
|
+
| SP-04 | Admin workspace: usage, retention, billing, audit log | 4 | 28 SP | 80% |
|
|
21
21
|
| **Total** | | **20** | **124 SP** | |
|
|
22
22
|
|
|
23
23
|
**Planned:** 20 stories / 124 SP across 4 sprints (8 weeks)
|
|
@@ -35,104 +35,104 @@
|
|
|
35
35
|
**Tasks:**
|
|
36
36
|
- Configure CI/CD pipeline (GitHub Actions).
|
|
37
37
|
- Provision staging environment on cloud infrastructure.
|
|
38
|
-
- Scaffold
|
|
39
|
-
- Establish
|
|
40
|
-
- Team domain
|
|
38
|
+
- Scaffold Next.js web app and Node ingestion service with a base authentication stub.
|
|
39
|
+
- Establish OLTP (Postgres) and columnar analytics (ClickHouse) schema baselines from `/datadict`.
|
|
40
|
+
- Team alignment session on analytics domain concepts (event taxonomy, funnel modelling, cohort analysis).
|
|
41
41
|
|
|
42
42
|
**Definition of Done for SP-00:**
|
|
43
43
|
- [ ] All developers can run the project locally.
|
|
44
|
-
- [ ] Staging environment is
|
|
44
|
+
- [ ] Staging environment is reachable from the team's workstations.
|
|
45
45
|
- [ ] Base CI pipeline runs lint + unit tests on every push.
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
49
|
-
### SP-01 —
|
|
49
|
+
### SP-01 — Users can sign up, connect a data source, and see events arrive
|
|
50
50
|
|
|
51
51
|
**Duration:** Weeks 1–2
|
|
52
52
|
**Capacity:** 35 SP
|
|
53
53
|
|
|
54
54
|
| US | Title | Epic | Priority | Risk | Estimate |
|
|
55
55
|
|----|-------|------|---------|------|---------|
|
|
56
|
-
| US-001 |
|
|
57
|
-
| US-002 |
|
|
58
|
-
| US-003 |
|
|
59
|
-
| US-004 | View
|
|
60
|
-
| US-005 |
|
|
61
|
-
| US-006 | View
|
|
56
|
+
| US-001 | Sign up via email or Google SSO | E-01 Onboarding | Must | RISK-02 ↑ | 5 SP |
|
|
57
|
+
| US-002 | Create a workspace and invite a teammate | E-01 Onboarding | Must | — | 3 SP |
|
|
58
|
+
| US-003 | Connect first data source (Segment or warehouse) | E-06 Integrations | Must | RISK-03 ↑ | 13 SP |
|
|
59
|
+
| US-004 | View the live event stream from the connected source | E-03 Events | Must | — | 3 SP |
|
|
60
|
+
| US-005 | Validate the incoming event schema against expected taxonomy | E-03 Events | Must | — | 5 SP |
|
|
61
|
+
| US-006 | View the default dashboard with sample metrics | E-02 Dashboards | Should | — | 5 SP |
|
|
62
62
|
|
|
63
63
|
**Sprint total:** 34 SP / 35 SP capacity (97%)
|
|
64
64
|
|
|
65
65
|
**Definition of Done for SP-01:**
|
|
66
66
|
- [ ] All stories pass their Acceptance Criteria.
|
|
67
|
-
- [ ]
|
|
68
|
-
- [ ]
|
|
67
|
+
- [ ] Sign-up and SSO flows tested on Chrome, Safari, and Firefox.
|
|
68
|
+
- [ ] End-to-end event ingestion latency under 1 s at p95 from source emit to dashboard read.
|
|
69
69
|
- [ ] No 🔴 Critical open items in `/analyze` for completed stories.
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
73
|
-
### SP-02 —
|
|
73
|
+
### SP-02 — Users can build dashboards with funnel, cohort, and trend widgets
|
|
74
74
|
|
|
75
75
|
**Duration:** Weeks 3–4
|
|
76
76
|
**Capacity:** 35 SP
|
|
77
77
|
|
|
78
78
|
| US | Title | Epic | Priority | Risk | Estimate |
|
|
79
79
|
|----|-------|------|---------|------|---------|
|
|
80
|
-
| US-007 |
|
|
81
|
-
| US-008 |
|
|
82
|
-
| US-009 |
|
|
83
|
-
| US-010 |
|
|
84
|
-
| US-011 |
|
|
80
|
+
| US-007 | Create a custom dashboard from scratch | E-02 Dashboards | Must | RISK-01 ↑ | 8 SP |
|
|
81
|
+
| US-008 | Add a funnel widget with 3 configurable steps | E-02 Dashboards | Must | RISK-01 ↑ | 8 SP |
|
|
82
|
+
| US-009 | Add a cohort retention widget for the last 30 days | E-02 Dashboards | Must | — | 8 SP |
|
|
83
|
+
| US-010 | Save a dashboard to the workspace library | E-02 Dashboards | Should | — | 5 SP |
|
|
84
|
+
| US-011 | Filter a dashboard by date range and segment | E-02 Dashboards | Must | — | 3 SP |
|
|
85
85
|
|
|
86
86
|
**Sprint total:** 32 SP / 35 SP capacity (91%)
|
|
87
87
|
|
|
88
88
|
**Definition of Done for SP-02:**
|
|
89
89
|
- [ ] All stories pass their Acceptance Criteria.
|
|
90
|
-
- [ ]
|
|
91
|
-
- [ ]
|
|
92
|
-
- [ ]
|
|
90
|
+
- [ ] Dashboard read query latency under 500 ms at p95 for the reference dataset (10 M events).
|
|
91
|
+
- [ ] Funnel and cohort calculations verified against the reference dataset to within 0.1%.
|
|
92
|
+
- [ ] Saved dashboards survive workspace reload and session refresh.
|
|
93
93
|
|
|
94
94
|
---
|
|
95
95
|
|
|
96
|
-
### SP-03 —
|
|
96
|
+
### SP-03 — Alerts and collaboration: thresholds, notifications, sharing, SSO
|
|
97
97
|
|
|
98
98
|
**Duration:** Weeks 5–6
|
|
99
99
|
**Capacity:** 35 SP
|
|
100
100
|
|
|
101
101
|
| US | Title | Epic | Priority | Risk | Estimate |
|
|
102
102
|
|----|-------|------|---------|------|---------|
|
|
103
|
-
| US-012 |
|
|
104
|
-
| US-013 |
|
|
105
|
-
| US-014 |
|
|
106
|
-
| US-015 |
|
|
107
|
-
| US-016 |
|
|
103
|
+
| US-012 | Set a metric threshold alert on any dashboard widget | E-04 Alerts | Must | RISK-04 ↑ | 8 SP |
|
|
104
|
+
| US-013 | Receive an alert email within 60 s of threshold breach | E-04 Alerts | Must | — | 5 SP |
|
|
105
|
+
| US-014 | Invite a teammate and assign a role (admin, editor, viewer) | E-05 Collaboration | Should | — | 5 SP |
|
|
106
|
+
| US-015 | Share a dashboard read-only link with internal and external viewers | E-05 Collaboration | Must | — | 5 SP |
|
|
107
|
+
| US-016 | Enable SSO (SAML / OIDC) for the workspace | E-05 Collaboration | Should | — | 7 SP |
|
|
108
108
|
|
|
109
109
|
**Sprint total:** 30 SP / 35 SP capacity (86%)
|
|
110
110
|
|
|
111
111
|
**Definition of Done for SP-03:**
|
|
112
112
|
- [ ] All stories pass their Acceptance Criteria.
|
|
113
|
-
- [ ]
|
|
114
|
-
- [ ]
|
|
113
|
+
- [ ] Alert evaluation runs within 60 s of threshold breach in staging.
|
|
114
|
+
- [ ] Read-only share links respect role permissions and expire as configured.
|
|
115
115
|
|
|
116
116
|
---
|
|
117
117
|
|
|
118
|
-
### SP-04 — Admin
|
|
118
|
+
### SP-04 — Admin workspace: usage, retention, billing, audit log
|
|
119
119
|
|
|
120
120
|
**Duration:** Weeks 7–8
|
|
121
121
|
**Capacity:** 35 SP
|
|
122
122
|
|
|
123
123
|
| US | Title | Epic | Priority | Risk | Estimate |
|
|
124
124
|
|----|-------|------|---------|------|---------|
|
|
125
|
-
| US-017 | Admin views
|
|
126
|
-
| US-018 | Admin adjusts
|
|
127
|
-
| US-019 | Admin views
|
|
128
|
-
| US-020 | Admin
|
|
125
|
+
| US-017 | Admin views the workspace list with per-workspace event volume | E-07 Admin | Must | — | 5 SP |
|
|
126
|
+
| US-018 | Admin adjusts data retention window and event quota per workspace | E-07 Admin | Must | — | 8 SP |
|
|
127
|
+
| US-019 | Admin views the usage-based billing report for the current period | E-07 Admin | Should | — | 8 SP |
|
|
128
|
+
| US-020 | Admin reviews the audit log of workspace and permission changes | E-07 Admin | Should | — | 7 SP |
|
|
129
129
|
|
|
130
130
|
**Sprint total:** 28 SP / 35 SP capacity (80%)
|
|
131
131
|
|
|
132
132
|
**Definition of Done for SP-04:**
|
|
133
133
|
- [ ] All stories pass their Acceptance Criteria.
|
|
134
|
-
- [ ]
|
|
135
|
-
- [ ]
|
|
134
|
+
- [ ] Retention changes take effect on the next hourly compaction run.
|
|
135
|
+
- [ ] Billing report matches the underlying usage ledger to within 0.01%.
|
|
136
136
|
|
|
137
137
|
---
|
|
138
138
|
|
|
@@ -142,10 +142,10 @@ Stories not assigned to any sprint — below MVP capacity or marked Could/Won't:
|
|
|
142
142
|
|
|
143
143
|
| US | Title | Epic | Priority | Estimate | Reason |
|
|
144
144
|
|----|-------|------|---------|---------|--------|
|
|
145
|
-
| US-021 | Export
|
|
146
|
-
| US-022 |
|
|
147
|
-
| US-023 |
|
|
148
|
-
| US-024 |
|
|
145
|
+
| US-021 | Export a dashboard snapshot as PDF | E-02 Dashboards | Could | 5 SP | Capacity exceeded — defer to v1.1 |
|
|
146
|
+
| US-022 | Mobile companion app for alert notifications | E-04 Alerts | Could | 8 SP | Deferred — requires mobile infrastructure |
|
|
147
|
+
| US-023 | In-app chat support widget | E-08 Support | Could | 3 SP | Deferred — third-party integration |
|
|
148
|
+
| US-024 | White-label dashboards for embedded use | E-05 Collaboration | Won't | 2 SP | Out of MVP scope |
|
|
149
149
|
|
|
150
150
|
---
|
|
151
151
|
|
package/skills/srs/SKILL.md
CHANGED
|
@@ -15,7 +15,7 @@ Second step of the BA Toolkit pipeline. Generates an SRS adapted from IEEE 830.
|
|
|
15
15
|
0. If `00_principles_*.md` exists in the output directory, load it and apply its conventions (artifact language, ID format, traceability requirements, Definition of Ready, quality gate threshold).
|
|
16
16
|
1. Read `01_brief_*.md` from the output directory. If missing, warn and suggest running `/brief`.
|
|
17
17
|
2. Extract: slug, domain, business goals, functionality, stakeholders, constraints, glossary.
|
|
18
|
-
3. If domain
|
|
18
|
+
3. If a matching `references/domains/{domain}.md` file exists (currently: `saas`, `fintech`, `ecommerce`, `healthcare`, `logistics`, `on-demand`, `social-media`, `real-estate`, `igaming`), load it and apply its section `2. /srs`.
|
|
19
19
|
|
|
20
20
|
## Environment
|
|
21
21
|
|