bmad-visual 0.1.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/bin/bmad-visual.js +255 -0
- package/package.json +31 -0
- package/templates/.agent/workflows/analyst.md +20 -0
- package/templates/.agent/workflows/architect.md +20 -0
- package/templates/.agent/workflows/bmad-advanced-elicitation.md +5 -0
- package/templates/.agent/workflows/bmad-brainstorming.md +5 -0
- package/templates/.agent/workflows/bmad-check-implementation-readiness.md +5 -0
- package/templates/.agent/workflows/bmad-checkpoint-preview.md +5 -0
- package/templates/.agent/workflows/bmad-code-review.md +5 -0
- package/templates/.agent/workflows/bmad-correct-course.md +5 -0
- package/templates/.agent/workflows/bmad-create-architecture.md +5 -0
- package/templates/.agent/workflows/bmad-create-epics-and-stories.md +5 -0
- package/templates/.agent/workflows/bmad-create-prd.md +5 -0
- package/templates/.agent/workflows/bmad-create-story.md +5 -0
- package/templates/.agent/workflows/bmad-create-ux-design.md +5 -0
- package/templates/.agent/workflows/bmad-dev-story.md +5 -0
- package/templates/.agent/workflows/bmad-distillator.md +5 -0
- package/templates/.agent/workflows/bmad-document-project.md +5 -0
- package/templates/.agent/workflows/bmad-domain-research.md +5 -0
- package/templates/.agent/workflows/bmad-edit-prd.md +5 -0
- package/templates/.agent/workflows/bmad-editorial-review-prose.md +5 -0
- package/templates/.agent/workflows/bmad-editorial-review-structure.md +5 -0
- package/templates/.agent/workflows/bmad-generate-project-context.md +5 -0
- package/templates/.agent/workflows/bmad-help-full.md +5 -0
- package/templates/.agent/workflows/bmad-help.md +5 -0
- package/templates/.agent/workflows/bmad-index-docs.md +5 -0
- package/templates/.agent/workflows/bmad-market-research.md +5 -0
- package/templates/.agent/workflows/bmad-party-mode.md +5 -0
- package/templates/.agent/workflows/bmad-prfaq.md +5 -0
- package/templates/.agent/workflows/bmad-product-brief.md +5 -0
- package/templates/.agent/workflows/bmad-qa-generate-e2e-tests.md +5 -0
- package/templates/.agent/workflows/bmad-quick-dev.md +5 -0
- package/templates/.agent/workflows/bmad-retrospective.md +5 -0
- package/templates/.agent/workflows/bmad-review-adversarial-general.md +5 -0
- package/templates/.agent/workflows/bmad-review-edge-case-hunter.md +5 -0
- package/templates/.agent/workflows/bmad-shard-doc.md +5 -0
- package/templates/.agent/workflows/bmad-sprint-planning.md +5 -0
- package/templates/.agent/workflows/bmad-sprint-status.md +5 -0
- package/templates/.agent/workflows/bmad-technical-research.md +5 -0
- package/templates/.agent/workflows/bmad-validate-prd.md +5 -0
- package/templates/.agent/workflows/dev.md +20 -0
- package/templates/.agent/workflows/pm.md +20 -0
- package/templates/.agent/workflows/qa.md +20 -0
- package/templates/.agent/workflows/sm.md +20 -0
- package/templates/.agent/workflows/solo-dev.md +20 -0
- package/templates/.agent/workflows/ux.md +20 -0
- package/templates/.claude/settings.local.json +50 -0
- package/templates/.claude/skills/analyst/SKILL.md +77 -0
- package/templates/.claude/skills/architect/SKILL.md +72 -0
- package/templates/.claude/skills/bmad-advanced-elicitation/SKILL.md +24 -0
- package/templates/.claude/skills/bmad-brainstorming/SKILL.md +26 -0
- package/templates/.claude/skills/bmad-check-implementation-readiness/SKILL.md +22 -0
- package/templates/.claude/skills/bmad-checkpoint-preview/SKILL.md +17 -0
- package/templates/.claude/skills/bmad-code-review/SKILL.md +22 -0
- package/templates/.claude/skills/bmad-correct-course/SKILL.md +17 -0
- package/templates/.claude/skills/bmad-create-architecture/SKILL.md +22 -0
- package/templates/.claude/skills/bmad-create-epics-and-stories/SKILL.md +22 -0
- package/templates/.claude/skills/bmad-create-prd/SKILL.md +30 -0
- package/templates/.claude/skills/bmad-create-story/SKILL.md +21 -0
- package/templates/.claude/skills/bmad-create-ux-design/SKILL.md +23 -0
- package/templates/.claude/skills/bmad-dev-story/SKILL.md +27 -0
- package/templates/.claude/skills/bmad-distillator/SKILL.md +22 -0
- package/templates/.claude/skills/bmad-document-project/SKILL.md +27 -0
- package/templates/.claude/skills/bmad-domain-research/SKILL.md +21 -0
- package/templates/.claude/skills/bmad-edit-prd/SKILL.md +18 -0
- package/templates/.claude/skills/bmad-editorial-review-prose/SKILL.md +21 -0
- package/templates/.claude/skills/bmad-editorial-review-structure/SKILL.md +25 -0
- package/templates/.claude/skills/bmad-generate-project-context/SKILL.md +20 -0
- package/templates/.claude/skills/bmad-help/SKILL.md +63 -0
- package/templates/.claude/skills/bmad-help-full/SKILL.md +23 -0
- package/templates/.claude/skills/bmad-index-docs/SKILL.md +16 -0
- package/templates/.claude/skills/bmad-market-research/SKILL.md +22 -0
- package/templates/.claude/skills/bmad-party-mode/SKILL.md +24 -0
- package/templates/.claude/skills/bmad-prfaq/SKILL.md +36 -0
- package/templates/.claude/skills/bmad-product-brief/SKILL.md +36 -0
- package/templates/.claude/skills/bmad-qa-generate-e2e-tests/SKILL.md +21 -0
- package/templates/.claude/skills/bmad-quick-dev/SKILL.md +23 -0
- package/templates/.claude/skills/bmad-retrospective/SKILL.md +17 -0
- package/templates/.claude/skills/bmad-review-adversarial-general/SKILL.md +21 -0
- package/templates/.claude/skills/bmad-review-edge-case-hunter/SKILL.md +22 -0
- package/templates/.claude/skills/bmad-shard-doc/SKILL.md +17 -0
- package/templates/.claude/skills/bmad-sprint-planning/SKILL.md +21 -0
- package/templates/.claude/skills/bmad-sprint-status/SKILL.md +17 -0
- package/templates/.claude/skills/bmad-technical-research/SKILL.md +21 -0
- package/templates/.claude/skills/bmad-validate-prd/SKILL.md +22 -0
- package/templates/.claude/skills/dev/SKILL.md +71 -0
- package/templates/.claude/skills/pm/SKILL.md +76 -0
- package/templates/.claude/skills/qa/SKILL.md +64 -0
- package/templates/.claude/skills/sm/SKILL.md +74 -0
- package/templates/.claude/skills/solo-dev/SKILL.md +64 -0
- package/templates/.claude/skills/ux/SKILL.md +71 -0
- package/templates/CLAUDE.md +60 -0
- package/templates/dashboard/index.html +15 -0
- package/templates/dashboard/package.json +30 -0
- package/templates/dashboard/public/assets/avatars/Female1_1wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female1_2wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female1_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female1_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female2_1wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female2_2wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female2_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female2_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female3_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female3_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female3_wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female4_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female4_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female4_wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female5_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female5_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female5_wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female6_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female6_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Female6_wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male1_1wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male1_2wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male1_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male1_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male2_1wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male2_2wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male2_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male2_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male3_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male3_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male3_wave.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male4_blink.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male4_talk.png +0 -0
- package/templates/dashboard/public/assets/avatars/Male4_wave.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_black_down.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_black_down_coding-1.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_black_down_coding.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_black_up.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_white_down.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_white_down_coding-1.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_white_down_coding.png +0 -0
- package/templates/dashboard/public/assets/desks/desktop_set_white_up.png +0 -0
- package/templates/dashboard/public/assets/furniture/armchair_tan.png +0 -0
- package/templates/dashboard/public/assets/furniture/armchair_tan_down.png +0 -0
- package/templates/dashboard/public/assets/furniture/backpack_blue.png +0 -0
- package/templates/dashboard/public/assets/furniture/backpack_red.png +0 -0
- package/templates/dashboard/public/assets/furniture/blinds.png +0 -0
- package/templates/dashboard/public/assets/furniture/blinds_large_closed_white.png +0 -0
- package/templates/dashboard/public/assets/furniture/bookshelf.png +0 -0
- package/templates/dashboard/public/assets/furniture/bookshelf_purple_tall.png +0 -0
- package/templates/dashboard/public/assets/furniture/bulletin_board.png +0 -0
- package/templates/dashboard/public/assets/furniture/clock.png +0 -0
- package/templates/dashboard/public/assets/furniture/coffee_mug.png +0 -0
- package/templates/dashboard/public/assets/furniture/coffee_mug_blue.png +0 -0
- package/templates/dashboard/public/assets/furniture/coffee_table.png +0 -0
- package/templates/dashboard/public/assets/furniture/coffeepot_right.png +0 -0
- package/templates/dashboard/public/assets/furniture/coffeetable_black_horizontal.png +0 -0
- package/templates/dashboard/public/assets/furniture/couch.png +0 -0
- package/templates/dashboard/public/assets/furniture/couch_tan_down.png +0 -0
- package/templates/dashboard/public/assets/furniture/cushion_blue.png +0 -0
- package/templates/dashboard/public/assets/furniture/cushion_tan.png +0 -0
- package/templates/dashboard/public/assets/furniture/desk_wood.png +0 -0
- package/templates/dashboard/public/assets/furniture/fancy_rug.png +0 -0
- package/templates/dashboard/public/assets/furniture/fancy_rug_wide.png +0 -0
- package/templates/dashboard/public/assets/furniture/flowers1.png +0 -0
- package/templates/dashboard/public/assets/furniture/flowers2.png +0 -0
- package/templates/dashboard/public/assets/furniture/lamp_tan.png +0 -0
- package/templates/dashboard/public/assets/furniture/lantern.png +0 -0
- package/templates/dashboard/public/assets/furniture/monstera.png +0 -0
- package/templates/dashboard/public/assets/furniture/monstera_small.png +0 -0
- package/templates/dashboard/public/assets/furniture/picture_frame.png +0 -0
- package/templates/dashboard/public/assets/furniture/plant1.png +0 -0
- package/templates/dashboard/public/assets/furniture/plant2.png +0 -0
- package/templates/dashboard/public/assets/furniture/plant3.png +0 -0
- package/templates/dashboard/public/assets/furniture/plant_poof.png +0 -0
- package/templates/dashboard/public/assets/furniture/plant_spindly.png +0 -0
- package/templates/dashboard/public/assets/furniture/poster_blue.png +0 -0
- package/templates/dashboard/public/assets/furniture/rug.png +0 -0
- package/templates/dashboard/public/assets/furniture/succulent_blue.png +0 -0
- package/templates/dashboard/public/assets/furniture/succulent_green.png +0 -0
- package/templates/dashboard/public/assets/furniture/treasurechest_closed_gold.png +0 -0
- package/templates/dashboard/public/assets/furniture/water_cooler_better.png +0 -0
- package/templates/dashboard/public/assets/furniture/whiteboard.png +0 -0
- package/templates/dashboard/public/assets/furniture/whiteboard_stand_graph.png +0 -0
- package/templates/dashboard/public/assets/furniture/window_blinds_open.png +0 -0
- package/templates/dashboard/public/assets/logo.png +0 -0
- package/templates/dashboard/src/App.tsx +119 -0
- package/templates/dashboard/src/components/SquadCard.tsx +47 -0
- package/templates/dashboard/src/components/SquadSelector.tsx +61 -0
- package/templates/dashboard/src/components/StatusBadge.tsx +32 -0
- package/templates/dashboard/src/components/StatusBar.tsx +97 -0
- package/templates/dashboard/src/hooks/useSquadSocket.ts +137 -0
- package/templates/dashboard/src/lib/formatTime.ts +16 -0
- package/templates/dashboard/src/lib/normalizeState.ts +25 -0
- package/templates/dashboard/src/main.tsx +14 -0
- package/templates/dashboard/src/office/AgentSprite.ts +249 -0
- package/templates/dashboard/src/office/OfficeScene.ts +577 -0
- package/templates/dashboard/src/office/PhaserGame.tsx +101 -0
- package/templates/dashboard/src/office/RoomBuilder.ts +190 -0
- package/templates/dashboard/src/office/assetKeys.ts +150 -0
- package/templates/dashboard/src/office/palette.ts +32 -0
- package/templates/dashboard/src/plugin/squadWatcher.ts +260 -0
- package/templates/dashboard/src/store/useSquadStore.ts +63 -0
- package/templates/dashboard/src/styles/globals.css +41 -0
- package/templates/dashboard/src/types/state.ts +69 -0
- package/templates/dashboard/src/vite-env.d.ts +1 -0
- package/templates/dashboard/tsconfig.json +24 -0
- package/templates/dashboard/tsconfig.tsbuildinfo +1 -0
- package/templates/dashboard/vite.config.ts +13 -0
- package/templates/squads/.gitkeep +0 -0
- package/templates/squads/bmad/agents/analyst.agent.md +87 -0
- package/templates/squads/bmad/agents/architect.agent.md +82 -0
- package/templates/squads/bmad/agents/developer.agent.md +91 -0
- package/templates/squads/bmad/agents/pm.agent.md +86 -0
- package/templates/squads/bmad/agents/qa-engineer.agent.md +84 -0
- package/templates/squads/bmad/agents/scrum-master.agent.md +84 -0
- package/templates/squads/bmad/agents/solo-dev.agent.md +81 -0
- package/templates/squads/bmad/agents/tech-writer.agent.md +86 -0
- package/templates/squads/bmad/agents/ux-designer.agent.md +81 -0
- package/templates/squads/bmad/squad.yaml +70 -0
- package/templates/squads/bmad/state.json +108 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { execSync } = require('node:child_process');
|
|
6
|
+
|
|
7
|
+
// ─── ANSI Colors ───────────────────────────────────────────────
|
|
8
|
+
const c = {
|
|
9
|
+
reset: '\x1b[0m',
|
|
10
|
+
bold: '\x1b[1m',
|
|
11
|
+
dim: '\x1b[2m',
|
|
12
|
+
green: '\x1b[32m',
|
|
13
|
+
cyan: '\x1b[36m',
|
|
14
|
+
yellow: '\x1b[33m',
|
|
15
|
+
red: '\x1b[31m',
|
|
16
|
+
magenta: '\x1b[35m',
|
|
17
|
+
white: '\x1b[37m',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const LOGO = `
|
|
21
|
+
${c.green} ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓${c.reset}
|
|
22
|
+
${c.green} ┃${c.reset} ${c.bold}${c.white}BMAD Visual${c.reset} ${c.dim}— AI Agent Dashboard${c.reset} ${c.green}┃${c.reset}
|
|
23
|
+
${c.green} ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛${c.reset}
|
|
24
|
+
`;
|
|
25
|
+
|
|
26
|
+
function log(msg) {
|
|
27
|
+
console.log(` ${c.green}>${c.reset} ${msg}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function success(msg) {
|
|
31
|
+
console.log(` ${c.green}✓${c.reset} ${msg}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function warn(msg) {
|
|
35
|
+
console.log(` ${c.yellow}!${c.reset} ${msg}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function error(msg) {
|
|
39
|
+
console.error(` ${c.red}✗${c.reset} ${msg}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function step(n, total, msg) {
|
|
43
|
+
process.stdout.write(` ${c.dim}[${n}/${total}]${c.reset} ${msg}...`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function done() {
|
|
47
|
+
console.log(` ${c.green}done${c.reset}`);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ─── Template Resolver ─────────────────────────────────────────
|
|
51
|
+
function getTemplatesDir() {
|
|
52
|
+
const dir = path.resolve(__dirname, '..', 'templates');
|
|
53
|
+
if (!fs.existsSync(dir)) {
|
|
54
|
+
error('Templates directory not found. Try reinstalling: npm install -g bmad-visual');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
return dir;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// ─── Copy Helper ───────────────────────────────────────────────
|
|
61
|
+
function copyDir(src, dest) {
|
|
62
|
+
fs.cpSync(src, dest, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function copyFile(src, dest) {
|
|
66
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
67
|
+
fs.copyFileSync(src, dest);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// ─── Commands ──────────────────────────────────────────────────
|
|
71
|
+
|
|
72
|
+
function handleInit(projectName) {
|
|
73
|
+
console.log(LOGO);
|
|
74
|
+
|
|
75
|
+
// Determine target directory
|
|
76
|
+
let targetDir;
|
|
77
|
+
if (projectName) {
|
|
78
|
+
targetDir = path.resolve(process.cwd(), projectName);
|
|
79
|
+
if (fs.existsSync(targetDir)) {
|
|
80
|
+
const entries = fs.readdirSync(targetDir);
|
|
81
|
+
if (entries.length > 0) {
|
|
82
|
+
error(`Directory "${projectName}" already exists and is not empty.`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
fs.mkdirSync(targetDir, { recursive: true });
|
|
87
|
+
log(`Creating project in ${c.cyan}${targetDir}${c.reset}`);
|
|
88
|
+
} else {
|
|
89
|
+
targetDir = process.cwd();
|
|
90
|
+
log(`Scaffolding into ${c.cyan}${targetDir}${c.reset}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const templatesDir = getTemplatesDir();
|
|
94
|
+
const totalSteps = 6;
|
|
95
|
+
|
|
96
|
+
console.log('');
|
|
97
|
+
|
|
98
|
+
// Step 1: Dashboard
|
|
99
|
+
step(1, totalSteps, 'Copying dashboard');
|
|
100
|
+
const dashSrc = path.join(templatesDir, 'dashboard');
|
|
101
|
+
const dashDest = path.join(targetDir, 'dashboard');
|
|
102
|
+
if (fs.existsSync(dashDest)) {
|
|
103
|
+
warn('dashboard/ already exists, overwriting...');
|
|
104
|
+
}
|
|
105
|
+
copyDir(dashSrc, dashDest);
|
|
106
|
+
done();
|
|
107
|
+
|
|
108
|
+
// Step 2: Squad definition
|
|
109
|
+
step(2, totalSteps, 'Copying BMAD squad & agents');
|
|
110
|
+
copyDir(
|
|
111
|
+
path.join(templatesDir, 'squads'),
|
|
112
|
+
path.join(targetDir, 'squads'),
|
|
113
|
+
);
|
|
114
|
+
done();
|
|
115
|
+
|
|
116
|
+
// Step 3: Claude Code skills
|
|
117
|
+
step(3, totalSteps, 'Copying Claude Code skills');
|
|
118
|
+
copyDir(
|
|
119
|
+
path.join(templatesDir, '.claude'),
|
|
120
|
+
path.join(targetDir, '.claude'),
|
|
121
|
+
);
|
|
122
|
+
done();
|
|
123
|
+
|
|
124
|
+
// Step 4: Antigravity workflows
|
|
125
|
+
step(4, totalSteps, 'Copying Antigravity workflows');
|
|
126
|
+
copyDir(
|
|
127
|
+
path.join(templatesDir, '.agent'),
|
|
128
|
+
path.join(targetDir, '.agent'),
|
|
129
|
+
);
|
|
130
|
+
done();
|
|
131
|
+
|
|
132
|
+
// Step 5: CLAUDE.md
|
|
133
|
+
step(5, totalSteps, 'Copying CLAUDE.md');
|
|
134
|
+
copyFile(
|
|
135
|
+
path.join(templatesDir, 'CLAUDE.md'),
|
|
136
|
+
path.join(targetDir, 'CLAUDE.md'),
|
|
137
|
+
);
|
|
138
|
+
done();
|
|
139
|
+
|
|
140
|
+
// Step 6: .gitignore
|
|
141
|
+
step(6, totalSteps, 'Updating .gitignore');
|
|
142
|
+
const gitignorePath = path.join(targetDir, '.gitignore');
|
|
143
|
+
const entries = [
|
|
144
|
+
'',
|
|
145
|
+
'# bmad-visual',
|
|
146
|
+
'dashboard/node_modules/',
|
|
147
|
+
'dashboard/dist/',
|
|
148
|
+
'squads/*/state.json',
|
|
149
|
+
];
|
|
150
|
+
const entriesToAdd = entries.join('\n') + '\n';
|
|
151
|
+
|
|
152
|
+
if (fs.existsSync(gitignorePath)) {
|
|
153
|
+
const current = fs.readFileSync(gitignorePath, 'utf-8');
|
|
154
|
+
if (!current.includes('# bmad-visual')) {
|
|
155
|
+
fs.appendFileSync(gitignorePath, entriesToAdd);
|
|
156
|
+
}
|
|
157
|
+
} else {
|
|
158
|
+
fs.writeFileSync(gitignorePath, entriesToAdd.trimStart());
|
|
159
|
+
}
|
|
160
|
+
done();
|
|
161
|
+
|
|
162
|
+
// Install dependencies
|
|
163
|
+
console.log('');
|
|
164
|
+
log('Installing dashboard dependencies...');
|
|
165
|
+
try {
|
|
166
|
+
execSync('npm install', {
|
|
167
|
+
cwd: path.join(targetDir, 'dashboard'),
|
|
168
|
+
stdio: 'pipe',
|
|
169
|
+
});
|
|
170
|
+
success('Dependencies installed');
|
|
171
|
+
} catch {
|
|
172
|
+
warn('Could not auto-install. Run manually: cd dashboard && npm install');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Done!
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log(` ${c.green}${c.bold}Done!${c.reset} Your BMAD Visual dashboard is ready.`);
|
|
178
|
+
console.log('');
|
|
179
|
+
console.log(` ${c.dim}Next steps:${c.reset}`);
|
|
180
|
+
if (projectName) {
|
|
181
|
+
console.log(` ${c.cyan}cd ${projectName}${c.reset}`);
|
|
182
|
+
}
|
|
183
|
+
console.log(` ${c.cyan}bmad-visual dev${c.reset} ${c.dim}Start the dashboard${c.reset}`);
|
|
184
|
+
console.log('');
|
|
185
|
+
console.log(` ${c.dim}Available agents:${c.reset}`);
|
|
186
|
+
console.log(` /analyst /pm /ux /architect /sm /dev /qa /solo-dev /bmad-help`);
|
|
187
|
+
console.log('');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function handleDev() {
|
|
191
|
+
const dashboardDir = path.join(process.cwd(), 'dashboard');
|
|
192
|
+
|
|
193
|
+
if (!fs.existsSync(path.join(dashboardDir, 'package.json'))) {
|
|
194
|
+
error('No dashboard found in this directory.');
|
|
195
|
+
log('Run "bmad-visual init" first to scaffold the project.');
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Check if node_modules exists
|
|
200
|
+
if (!fs.existsSync(path.join(dashboardDir, 'node_modules'))) {
|
|
201
|
+
log('Installing dependencies first...');
|
|
202
|
+
execSync('npm install', { cwd: dashboardDir, stdio: 'inherit' });
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
console.log(LOGO);
|
|
206
|
+
log(`Starting dashboard at ${c.cyan}http://localhost:5174${c.reset}`);
|
|
207
|
+
console.log('');
|
|
208
|
+
|
|
209
|
+
try {
|
|
210
|
+
execSync('npm run dev', { cwd: dashboardDir, stdio: 'inherit' });
|
|
211
|
+
} catch {
|
|
212
|
+
// User hit Ctrl+C
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function showHelp() {
|
|
217
|
+
console.log(LOGO);
|
|
218
|
+
console.log(` ${c.bold}Usage:${c.reset}`);
|
|
219
|
+
console.log('');
|
|
220
|
+
console.log(` ${c.cyan}bmad-visual init${c.reset} Scaffold into current directory`);
|
|
221
|
+
console.log(` ${c.cyan}bmad-visual init ${c.dim}<name>${c.reset} Create new project directory`);
|
|
222
|
+
console.log(` ${c.cyan}bmad-visual dev${c.reset} Start the dashboard dev server`);
|
|
223
|
+
console.log('');
|
|
224
|
+
console.log(` ${c.bold}Agents:${c.reset}`);
|
|
225
|
+
console.log('');
|
|
226
|
+
console.log(` ${c.green}/analyst${c.reset} Mary Market research & requirements`);
|
|
227
|
+
console.log(` ${c.green}/pm${c.reset} John PRD, epics & stories`);
|
|
228
|
+
console.log(` ${c.green}/ux${c.reset} Sally UX design & wireframes`);
|
|
229
|
+
console.log(` ${c.green}/architect${c.reset} Winston System architecture`);
|
|
230
|
+
console.log(` ${c.green}/sm${c.reset} Bob Sprint planning`);
|
|
231
|
+
console.log(` ${c.green}/dev${c.reset} Amelia TDD implementation`);
|
|
232
|
+
console.log(` ${c.green}/qa${c.reset} Quinn QA & testing`);
|
|
233
|
+
console.log(` ${c.green}/solo-dev${c.reset} Barry Quick dev end-to-end`);
|
|
234
|
+
console.log(` ${c.green}/bmad-help${c.reset} Agent guide`);
|
|
235
|
+
console.log('');
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// ─── Main ──────────────────────────────────────────────────────
|
|
239
|
+
const args = process.argv.slice(2);
|
|
240
|
+
const command = args[0];
|
|
241
|
+
|
|
242
|
+
if (!command || command === '--help' || command === '-h') {
|
|
243
|
+
showHelp();
|
|
244
|
+
} else if (command === 'init') {
|
|
245
|
+
handleInit(args[1]);
|
|
246
|
+
} else if (command === 'dev') {
|
|
247
|
+
handleDev();
|
|
248
|
+
} else if (command === '--version' || command === '-v') {
|
|
249
|
+
const pkg = require('../package.json');
|
|
250
|
+
console.log(pkg.version);
|
|
251
|
+
} else {
|
|
252
|
+
error(`Unknown command: ${command}`);
|
|
253
|
+
showHelp();
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bmad-visual",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "BMAD Method visual dashboard — AI agent squad with Phaser.js office",
|
|
5
|
+
"bin": {
|
|
6
|
+
"bmad-visual": "./bin/bmad-visual.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"templates/"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"sync-templates": "node scripts/sync-templates.js",
|
|
14
|
+
"prepublishOnly": "node scripts/sync-templates.js"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"bmad",
|
|
18
|
+
"bmad-method",
|
|
19
|
+
"ai-agents",
|
|
20
|
+
"dashboard",
|
|
21
|
+
"phaser",
|
|
22
|
+
"claude",
|
|
23
|
+
"multi-agent",
|
|
24
|
+
"visual-office"
|
|
25
|
+
],
|
|
26
|
+
"author": "Manoel Neto",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: BMAD Analyst — Mary. Market research, competitive analysis, brainstorming, product brief, and requirements.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Dashboard Update (MANDATORY — do this FIRST)
|
|
6
|
+
|
|
7
|
+
1. Read `squads/bmad/state.json`
|
|
8
|
+
2. Set `"status": "running"` on the squad
|
|
9
|
+
3. Find the agent with `"id": "analyst"` and set its `"status"` to `"working"`
|
|
10
|
+
4. **If invoked WITHOUT arguments**: also set `"step"` to `{ "current": 0, "total": 12, "label": "intro" }`
|
|
11
|
+
5. Set `"updatedAt"` to current ISO timestamp
|
|
12
|
+
6. Write the updated `state.json` back
|
|
13
|
+
|
|
14
|
+
Then read `.claude/skills/analyst/SKILL.md` and follow ALL instructions (skip the Dashboard Update section there since you already did it above).
|
|
15
|
+
|
|
16
|
+
When your work is complete:
|
|
17
|
+
1. Read `squads/bmad/state.json`
|
|
18
|
+
2. Find the agent with `"id": "analyst"` and set its `"status"` to `"done"`
|
|
19
|
+
3. Set `"updatedAt"` to current ISO timestamp
|
|
20
|
+
4. Write the updated `state.json` back
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: BMAD Architect — Winston. System architecture, tech stack, ADRs, and implementation readiness.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Dashboard Update (MANDATORY — do this FIRST)
|
|
6
|
+
|
|
7
|
+
1. Read `squads/bmad/state.json`
|
|
8
|
+
2. Set `"status": "running"` on the squad
|
|
9
|
+
3. Find the agent with `"id": "architect"` and set its `"status"` to `"working"`
|
|
10
|
+
4. **If invoked WITHOUT arguments**: also set `"step"` to `{ "current": 0, "total": 12, "label": "intro" }`
|
|
11
|
+
5. Set `"updatedAt"` to current ISO timestamp
|
|
12
|
+
6. Write the updated `state.json` back
|
|
13
|
+
|
|
14
|
+
Then read `.claude/skills/architect/SKILL.md` and follow ALL instructions (skip the Dashboard Update section there since you already did it above).
|
|
15
|
+
|
|
16
|
+
When your work is complete:
|
|
17
|
+
1. Read `squads/bmad/state.json`
|
|
18
|
+
2. Find the agent with `"id": "architect"` and set its `"status"` to `"done"`
|
|
19
|
+
3. Set `"updatedAt"` to current ISO timestamp
|
|
20
|
+
4. Write the updated `state.json` back
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Structural editor that proposes cuts, reorganization, and simplification. Use when user requests 'structural review' or 'editorial review of structure'.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Read the file `.claude/skills/bmad-editorial-review-structure/SKILL.md` and follow ALL instructions.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: BMAD Developer — Amelia. Dev story, TDD implementation, code review, strict adherence to specs.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Dashboard Update (MANDATORY — do this FIRST)
|
|
6
|
+
|
|
7
|
+
1. Read `squads/bmad/state.json`
|
|
8
|
+
2. Set `"status": "running"` on the squad
|
|
9
|
+
3. Find the agent with `"id": "developer"` and set its `"status"` to `"working"`
|
|
10
|
+
4. **If invoked WITHOUT arguments**: also set `"step"` to `{ "current": 0, "total": 12, "label": "intro" }`
|
|
11
|
+
5. Set `"updatedAt"` to current ISO timestamp
|
|
12
|
+
6. Write the updated `state.json` back
|
|
13
|
+
|
|
14
|
+
Then read `.claude/skills/dev/SKILL.md` and follow ALL instructions (skip the Dashboard Update section there since you already did it above).
|
|
15
|
+
|
|
16
|
+
When your work is complete:
|
|
17
|
+
1. Read `squads/bmad/state.json`
|
|
18
|
+
2. Find the agent with `"id": "developer"` and set its `"status"` to `"done"`
|
|
19
|
+
3. Set `"updatedAt"` to current ISO timestamp
|
|
20
|
+
4. Write the updated `state.json` back
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: BMAD Product Manager — John. PRD creation, validation, epics, stories, and implementation readiness.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Dashboard Update (MANDATORY — do this FIRST)
|
|
6
|
+
|
|
7
|
+
1. Read `squads/bmad/state.json`
|
|
8
|
+
2. Set `"status": "running"` on the squad
|
|
9
|
+
3. Find the agent with `"id": "pm"` and set its `"status"` to `"working"`
|
|
10
|
+
4. **If invoked WITHOUT arguments**: also set `"step"` to `{ "current": 0, "total": 12, "label": "intro" }`
|
|
11
|
+
5. Set `"updatedAt"` to current ISO timestamp
|
|
12
|
+
6. Write the updated `state.json` back
|
|
13
|
+
|
|
14
|
+
Then read `.claude/skills/pm/SKILL.md` and follow ALL instructions (skip the Dashboard Update section there since you already did it above).
|
|
15
|
+
|
|
16
|
+
When your work is complete:
|
|
17
|
+
1. Read `squads/bmad/state.json`
|
|
18
|
+
2. Find the agent with `"id": "pm"` and set its `"status"` to `"done"`
|
|
19
|
+
3. Set `"updatedAt"` to current ISO timestamp
|
|
20
|
+
4. Write the updated `state.json` back
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: BMAD QA Engineer — Quinn. BMAD QA validation, E2E tests, API tests, and coverage analysis.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Dashboard Update (MANDATORY — do this FIRST)
|
|
6
|
+
|
|
7
|
+
1. Read `squads/bmad/state.json`
|
|
8
|
+
2. Set `"status": "running"` on the squad
|
|
9
|
+
3. Find the agent with `"id": "qa-engineer"` and set its `"status"` to `"working"`
|
|
10
|
+
4. **If invoked WITHOUT arguments**: also set `"step"` to `{ "current": 0, "total": 12, "label": "intro" }`
|
|
11
|
+
5. Set `"updatedAt"` to current ISO timestamp
|
|
12
|
+
6. Write the updated `state.json` back
|
|
13
|
+
|
|
14
|
+
Then read `.claude/skills/qa/SKILL.md` and follow ALL instructions (skip the Dashboard Update section there since you already did it above).
|
|
15
|
+
|
|
16
|
+
When your work is complete:
|
|
17
|
+
1. Read `squads/bmad/state.json`
|
|
18
|
+
2. Find the agent with `"id": "qa-engineer"` and set its `"status"` to `"done"`
|
|
19
|
+
3. Set `"updatedAt"` to current ISO timestamp
|
|
20
|
+
4. Write the updated `state.json` back
|