specweave 0.23.12 → 0.23.16
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/CLAUDE.md +55 -0
- package/dist/src/core/progress/error-logger.d.ts +58 -0
- package/dist/src/core/progress/error-logger.d.ts.map +1 -0
- package/dist/src/core/progress/error-logger.js +99 -0
- package/dist/src/core/progress/error-logger.js.map +1 -0
- package/dist/src/core/spec-detector.d.ts +5 -0
- package/dist/src/core/spec-detector.d.ts.map +1 -1
- package/dist/src/core/spec-detector.js +91 -33
- package/dist/src/core/spec-detector.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/hooks/docs-changed.sh +9 -1
- package/plugins/specweave/hooks/docs-changed.sh.backup +79 -0
- package/plugins/specweave/hooks/human-input-required.sh +9 -1
- package/plugins/specweave/hooks/human-input-required.sh.backup +75 -0
- package/plugins/specweave/hooks/post-first-increment.sh.backup +61 -0
- package/plugins/specweave/hooks/post-increment-change.sh +6 -1
- package/plugins/specweave/hooks/post-increment-change.sh.backup +98 -0
- package/plugins/specweave/hooks/post-increment-completion.sh +6 -1
- package/plugins/specweave/hooks/post-increment-completion.sh.backup +231 -0
- package/plugins/specweave/hooks/post-increment-planning.sh +6 -1
- package/plugins/specweave/hooks/post-increment-planning.sh.backup +1048 -0
- package/plugins/specweave/hooks/post-increment-status-change.sh +6 -1
- package/plugins/specweave/hooks/post-increment-status-change.sh.backup +147 -0
- package/plugins/specweave/hooks/post-metadata-change.sh +7 -1
- package/plugins/specweave/hooks/post-spec-update.sh.backup +158 -0
- package/plugins/specweave/hooks/post-user-story-complete.sh.backup +179 -0
- package/plugins/specweave/hooks/pre-command-deduplication.sh.backup +83 -0
- package/plugins/specweave/hooks/pre-implementation.sh +9 -1
- package/plugins/specweave/hooks/pre-implementation.sh.backup +67 -0
- package/plugins/specweave/hooks/pre-task-completion.sh +9 -1
- package/plugins/specweave/hooks/pre-task-completion.sh.backup +194 -0
- package/plugins/specweave/hooks/pre-tool-use.sh +9 -1
- package/plugins/specweave/hooks/pre-tool-use.sh.backup +133 -0
- package/plugins/specweave/hooks/user-prompt-submit.sh.backup +386 -0
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh +9 -2
- package/plugins/specweave-ado/hooks/post-living-docs-update.sh.backup +353 -0
- package/plugins/specweave-ado/hooks/post-task-completion.sh +9 -1
- package/plugins/specweave-ado/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-github/.claude-plugin/plugin.json +15 -1
- package/plugins/specweave-github/hooks/.specweave/logs/hooks-debug.log +16 -0
- package/plugins/specweave-github/hooks/post-task-completion.sh +62 -1
- package/plugins/specweave-github/hooks/post-task-completion.sh.backup +258 -0
- package/plugins/specweave-jira/hooks/post-task-completion.sh +9 -1
- package/plugins/specweave-jira/hooks/post-task-completion.sh.backup +172 -0
- package/plugins/specweave-release/hooks/.specweave/logs/dora-tracking.log +48 -0
- package/plugins/specweave-release/hooks/post-task-completion.sh.backup +110 -0
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +0 -21
- package/plugins/specweave-alternatives/skills/bmad-method-expert/SKILL.md +0 -626
- package/plugins/specweave-alternatives/skills/bmad-method-expert/scripts/analyze-project.js +0 -318
- package/plugins/specweave-alternatives/skills/bmad-method-expert/scripts/check-setup.js +0 -208
- package/plugins/specweave-alternatives/skills/bmad-method-expert/scripts/generate-template.js +0 -1149
- package/plugins/specweave-alternatives/skills/bmad-method-expert/scripts/validate-documents.js +0 -340
- package/plugins/specweave-alternatives/skills/spec-kit-expert/SKILL.md +0 -1010
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +0 -20
- package/plugins/specweave-cost-optimizer/skills/cost-optimizer/SKILL.md +0 -190
- package/plugins/specweave-docs/.claude-plugin/plugin.json +0 -19
- package/plugins/specweave-docs/skills/docusaurus/SKILL.md +0 -613
- package/plugins/specweave-docs/skills/spec-driven-brainstorming/README.md +0 -264
- package/plugins/specweave-docs/skills/spec-driven-brainstorming/SKILL.md +0 -439
- package/plugins/specweave-docs/skills/spec-driven-debugging/README.md +0 -479
- package/plugins/specweave-docs/skills/spec-driven-debugging/SKILL.md +0 -652
- package/plugins/specweave-figma/.claude-plugin/.mcp.json +0 -12
- package/plugins/specweave-figma/.claude-plugin/plugin.json +0 -20
- package/plugins/specweave-figma/ARCHITECTURE.md +0 -453
- package/plugins/specweave-figma/README.md +0 -728
- package/plugins/specweave-figma/skills/figma-to-code/SKILL.md +0 -632
- package/plugins/specweave-figma/skills/figma-to-code/test-1-token-generation.yaml +0 -29
- package/plugins/specweave-figma/skills/figma-to-code/test-2-component-generation.yaml +0 -27
- package/plugins/specweave-figma/skills/figma-to-code/test-3-typescript-generation.yaml +0 -28
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +0 -21
- package/plugins/specweave-frontend/skills/design-system-architect/SKILL.md +0 -107
- package/plugins/specweave-frontend/skills/frontend/SKILL.md +0 -177
- package/plugins/specweave-frontend/skills/nextjs/SKILL.md +0 -176
- package/plugins/specweave-testing/.claude-plugin/plugin.json +0 -20
- package/plugins/specweave-testing/skills/e2e-playwright/README.md +0 -506
- package/plugins/specweave-testing/skills/e2e-playwright/SKILL.md +0 -457
- package/plugins/specweave-testing/skills/e2e-playwright/execute.js +0 -373
- package/plugins/specweave-testing/skills/e2e-playwright/lib/utils.js +0 -514
- package/plugins/specweave-testing/skills/e2e-playwright/package.json +0 -33
- package/plugins/specweave-tooling/.claude-plugin/plugin.json +0 -19
- package/plugins/specweave-tooling/skills/skill-creator/LICENSE.txt +0 -202
- package/plugins/specweave-tooling/skills/skill-creator/SKILL.md +0 -209
- package/plugins/specweave-tooling/skills/skill-creator/scripts/init_skill.py +0 -303
- package/plugins/specweave-tooling/skills/skill-creator/scripts/package_skill.py +0 -110
- package/plugins/specweave-tooling/skills/skill-creator/scripts/quick_validate.py +0 -65
- package/plugins/specweave-tooling/skills/skill-router/SKILL.md +0 -479
- package/plugins/specweave-ui/.claude-plugin/plugin.json +0 -26
- package/plugins/specweave-ui/.mcp.json +0 -10
- package/plugins/specweave-ui/README.md +0 -492
- package/plugins/specweave-ui/skills/browser-automation/SKILL.md +0 -676
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* BMAD Project Analyzer
|
|
5
|
-
*
|
|
6
|
-
* Analyzes a BMAD-METHOD project structure and provides health assessment
|
|
7
|
-
* and recommendations.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
|
|
13
|
-
class BMADProjectAnalyzer {
|
|
14
|
-
constructor(projectPath = process.cwd()) {
|
|
15
|
-
this.projectPath = projectPath;
|
|
16
|
-
this.issues = [];
|
|
17
|
-
this.warnings = [];
|
|
18
|
-
this.info = [];
|
|
19
|
-
this.structure = {
|
|
20
|
-
hasBmadCore: false,
|
|
21
|
-
hasDocs: false,
|
|
22
|
-
hasPRD: false,
|
|
23
|
-
hasArchitecture: false,
|
|
24
|
-
hasEpics: false,
|
|
25
|
-
hasStories: false,
|
|
26
|
-
hasQA: false,
|
|
27
|
-
hasTechnicalPreferences: false,
|
|
28
|
-
hasCoreConfig: false,
|
|
29
|
-
nodeModules: false,
|
|
30
|
-
packageJson: false
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
checkPath(relativePath) {
|
|
35
|
-
const fullPath = path.join(this.projectPath, relativePath);
|
|
36
|
-
return fs.existsSync(fullPath);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
readFile(relativePath) {
|
|
40
|
-
try {
|
|
41
|
-
const fullPath = path.join(this.projectPath, relativePath);
|
|
42
|
-
return fs.readFileSync(fullPath, 'utf-8');
|
|
43
|
-
} catch (error) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
countFiles(dirPath) {
|
|
49
|
-
try {
|
|
50
|
-
const fullPath = path.join(this.projectPath, dirPath);
|
|
51
|
-
if (!fs.existsSync(fullPath)) return 0;
|
|
52
|
-
const files = fs.readdirSync(fullPath);
|
|
53
|
-
return files.filter(f => !f.startsWith('.')).length;
|
|
54
|
-
} catch (error) {
|
|
55
|
-
return 0;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
analyzeStructure() {
|
|
60
|
-
console.log('\n🔍 Analyzing BMAD Project Structure...\n');
|
|
61
|
-
|
|
62
|
-
// Check core BMAD structure
|
|
63
|
-
this.structure.hasBmadCore = this.checkPath('bmad-core');
|
|
64
|
-
this.structure.hasDocs = this.checkPath('docs');
|
|
65
|
-
this.structure.hasPRD = this.checkPath('docs/prd.md');
|
|
66
|
-
this.structure.hasArchitecture = this.checkPath('docs/architecture.md');
|
|
67
|
-
this.structure.hasEpics = this.checkPath('docs/epics');
|
|
68
|
-
this.structure.hasStories = this.checkPath('docs/stories');
|
|
69
|
-
this.structure.hasQA = this.checkPath('docs/qa');
|
|
70
|
-
this.structure.hasTechnicalPreferences = this.checkPath('.bmad-core/data/technical-preferences.md');
|
|
71
|
-
this.structure.hasCoreConfig = this.checkPath('.bmad-core/core-config.yaml');
|
|
72
|
-
this.structure.packageJson = this.checkPath('package.json');
|
|
73
|
-
this.structure.nodeModules = this.checkPath('node_modules');
|
|
74
|
-
|
|
75
|
-
// Core structure checks
|
|
76
|
-
if (!this.structure.hasBmadCore && !this.structure.hasDocs) {
|
|
77
|
-
this.issues.push('No BMAD structure detected. Run: npx bmad-method install');
|
|
78
|
-
return; // Early return if not a BMAD project
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (this.structure.hasBmadCore) {
|
|
82
|
-
this.info.push('✓ bmad-core/ directory found');
|
|
83
|
-
} else {
|
|
84
|
-
this.warnings.push('⚠ bmad-core/ directory not found - custom setup?');
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (this.structure.hasDocs) {
|
|
88
|
-
this.info.push('✓ docs/ directory found');
|
|
89
|
-
} else {
|
|
90
|
-
this.warnings.push('⚠ docs/ directory not found - create with: mkdir docs');
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Planning artifacts
|
|
94
|
-
if (this.structure.hasPRD) {
|
|
95
|
-
const prdContent = this.readFile('docs/prd.md');
|
|
96
|
-
const prdSize = prdContent ? prdContent.length : 0;
|
|
97
|
-
this.info.push(`✓ PRD found (${(prdSize / 1024).toFixed(1)}KB)`);
|
|
98
|
-
} else {
|
|
99
|
-
this.info.push('ℹ No PRD yet - use @pm to create one');
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (this.structure.hasArchitecture) {
|
|
103
|
-
const archContent = this.readFile('docs/architecture.md');
|
|
104
|
-
const archSize = archContent ? archContent.length : 0;
|
|
105
|
-
this.info.push(`✓ Architecture document found (${(archSize / 1024).toFixed(1)}KB)`);
|
|
106
|
-
} else {
|
|
107
|
-
this.info.push('ℹ No architecture document - use @architect to create one');
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Development artifacts
|
|
111
|
-
const epicCount = this.countFiles('docs/epics');
|
|
112
|
-
const storyCount = this.countFiles('docs/stories');
|
|
113
|
-
const qaCount = this.countFiles('docs/qa/assessments');
|
|
114
|
-
|
|
115
|
-
if (epicCount > 0) {
|
|
116
|
-
this.info.push(`✓ ${epicCount} epic(s) found`);
|
|
117
|
-
} else {
|
|
118
|
-
this.info.push('ℹ No epics yet - use @po to shard PRD into epics');
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
if (storyCount > 0) {
|
|
122
|
-
this.info.push(`✓ ${storyCount} user story(ies) found`);
|
|
123
|
-
} else {
|
|
124
|
-
this.info.push('ℹ No user stories yet - use @pm or @scrum to create stories');
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (qaCount > 0) {
|
|
128
|
-
this.info.push(`✓ ${qaCount} QA assessment(s) found`);
|
|
129
|
-
} else if (storyCount > 0) {
|
|
130
|
-
this.warnings.push('⚠ Stories exist but no QA assessments - consider using @qa *risk and @qa *design');
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Configuration
|
|
134
|
-
if (this.structure.hasTechnicalPreferences) {
|
|
135
|
-
this.info.push('✓ Technical preferences configured');
|
|
136
|
-
} else {
|
|
137
|
-
this.warnings.push('⚠ No technical-preferences.md - consider creating one for consistent tech stack decisions');
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (this.structure.hasCoreConfig) {
|
|
141
|
-
this.info.push('✓ Core configuration found');
|
|
142
|
-
} else {
|
|
143
|
-
this.warnings.push('⚠ No core-config.yaml found');
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Node.js setup
|
|
147
|
-
if (this.structure.packageJson) {
|
|
148
|
-
this.info.push('✓ package.json found');
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (this.structure.nodeModules) {
|
|
152
|
-
this.info.push('✓ Dependencies installed');
|
|
153
|
-
} else if (this.structure.packageJson) {
|
|
154
|
-
this.warnings.push('⚠ package.json exists but node_modules missing - run: npm install');
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
analyzeDocumentAlignment() {
|
|
159
|
-
if (!this.structure.hasPRD || !this.structure.hasArchitecture) {
|
|
160
|
-
return; // Can't check alignment without both documents
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
console.log('\n📋 Analyzing Document Alignment...\n');
|
|
164
|
-
|
|
165
|
-
const prd = this.readFile('docs/prd.md');
|
|
166
|
-
const arch = this.readFile('docs/architecture.md');
|
|
167
|
-
|
|
168
|
-
// Basic checks for alignment
|
|
169
|
-
const prdSections = this.extractSections(prd);
|
|
170
|
-
const archSections = this.extractSections(arch);
|
|
171
|
-
|
|
172
|
-
// Check if architecture references key PRD elements
|
|
173
|
-
const prdHasEpics = /##\s*Epics/i.test(prd);
|
|
174
|
-
const prdHasUserStories = /##\s*User Stories/i.test(prd);
|
|
175
|
-
const archHasSystemDesign = /##\s*(System Design|Architecture Overview)/i.test(arch);
|
|
176
|
-
const archHasTechStack = /##\s*(Tech(nology)? Stack|Technical Stack)/i.test(arch);
|
|
177
|
-
|
|
178
|
-
if (prdHasEpics) {
|
|
179
|
-
this.info.push('✓ PRD contains Epics section');
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (prdHasUserStories) {
|
|
183
|
-
this.info.push('✓ PRD contains User Stories section');
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
if (archHasSystemDesign) {
|
|
187
|
-
this.info.push('✓ Architecture has System Design section');
|
|
188
|
-
} else {
|
|
189
|
-
this.warnings.push('⚠ Architecture should include System Design section');
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (archHasTechStack) {
|
|
193
|
-
this.info.push('✓ Architecture specifies Tech Stack');
|
|
194
|
-
} else {
|
|
195
|
-
this.warnings.push('⚠ Architecture should specify Technology Stack');
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// Check document sizes - PRD and Architecture should be substantial
|
|
199
|
-
if (prd.length < 2000) {
|
|
200
|
-
this.warnings.push('⚠ PRD seems short (<2KB) - ensure it\'s comprehensive');
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (arch.length < 1500) {
|
|
204
|
-
this.warnings.push('⚠ Architecture document seems short (<1.5KB) - ensure it\'s detailed');
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
extractSections(markdown) {
|
|
209
|
-
const sections = [];
|
|
210
|
-
const lines = markdown.split('\n');
|
|
211
|
-
for (const line of lines) {
|
|
212
|
-
const match = line.match(/^#+\s+(.+)$/);
|
|
213
|
-
if (match) {
|
|
214
|
-
sections.push(match[1].trim());
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
return sections;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
analyzeWorkflowProgress() {
|
|
221
|
-
console.log('\n📊 Workflow Progress Assessment...\n');
|
|
222
|
-
|
|
223
|
-
const hasPRD = this.structure.hasPRD;
|
|
224
|
-
const hasArch = this.structure.hasArchitecture;
|
|
225
|
-
const hasEpics = this.structure.hasEpics && this.countFiles('docs/epics') > 0;
|
|
226
|
-
const hasStories = this.structure.hasStories && this.countFiles('docs/stories') > 0;
|
|
227
|
-
const hasQA = this.structure.hasQA && this.countFiles('docs/qa/assessments') > 0;
|
|
228
|
-
|
|
229
|
-
let phase = 'Not Started';
|
|
230
|
-
let nextSteps = [];
|
|
231
|
-
|
|
232
|
-
if (!hasPRD && !hasArch) {
|
|
233
|
-
phase = 'Planning Phase - Not Started';
|
|
234
|
-
nextSteps = [
|
|
235
|
-
'1. Create project brief',
|
|
236
|
-
'2. Use @pm to create PRD',
|
|
237
|
-
'3. Use @architect to design architecture',
|
|
238
|
-
'4. Use @po to validate alignment'
|
|
239
|
-
];
|
|
240
|
-
} else if (hasPRD && !hasArch) {
|
|
241
|
-
phase = 'Planning Phase - PRD Created';
|
|
242
|
-
nextSteps = [
|
|
243
|
-
'1. Use @architect to design system architecture',
|
|
244
|
-
'2. Use @po to validate PRD/Architecture alignment',
|
|
245
|
-
'3. Use @po to shard documents into epics/stories'
|
|
246
|
-
];
|
|
247
|
-
} else if (hasPRD && hasArch && !hasEpics) {
|
|
248
|
-
phase = 'Planning Phase - Documents Complete';
|
|
249
|
-
nextSteps = [
|
|
250
|
-
'1. Use @po to validate document alignment',
|
|
251
|
-
'2. Use @po to shard PRD into epics and stories',
|
|
252
|
-
'3. Transition to IDE for development phase'
|
|
253
|
-
];
|
|
254
|
-
} else if (hasEpics && !hasStories) {
|
|
255
|
-
phase = 'Development Preparation';
|
|
256
|
-
nextSteps = [
|
|
257
|
-
'1. Use @pm or @scrum to create user stories from epics',
|
|
258
|
-
'2. Use @qa *risk to assess story risks',
|
|
259
|
-
'3. Use @qa *design to create test strategies'
|
|
260
|
-
];
|
|
261
|
-
} else if (hasStories && !hasQA) {
|
|
262
|
-
phase = 'Development Phase - Stories Ready';
|
|
263
|
-
nextSteps = [
|
|
264
|
-
'1. Use @qa *risk {story} for risk assessment',
|
|
265
|
-
'2. Use @qa *design {story} for test strategy',
|
|
266
|
-
'3. Use @dev to implement first story',
|
|
267
|
-
'4. Use @qa *review after implementation'
|
|
268
|
-
];
|
|
269
|
-
} else if (hasStories && hasQA) {
|
|
270
|
-
phase = 'Development Phase - Active';
|
|
271
|
-
nextSteps = [
|
|
272
|
-
'1. Continue iterative development cycle',
|
|
273
|
-
'2. Use @dev to implement stories',
|
|
274
|
-
'3. Use @qa *review for quality checks',
|
|
275
|
-
'4. Commit and move to next story'
|
|
276
|
-
];
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
console.log(`Current Phase: ${phase}\n`);
|
|
280
|
-
console.log('Recommended Next Steps:');
|
|
281
|
-
nextSteps.forEach(step => console.log(` ${step}`));
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
generateReport() {
|
|
285
|
-
console.log('\n═══════════════════════════════════════════════════════');
|
|
286
|
-
console.log(' BMAD-METHOD PROJECT ANALYSIS REPORT');
|
|
287
|
-
console.log('═══════════════════════════════════════════════════════');
|
|
288
|
-
console.log(`\nProject Path: ${this.projectPath}\n`);
|
|
289
|
-
|
|
290
|
-
this.analyzeStructure();
|
|
291
|
-
this.analyzeDocumentAlignment();
|
|
292
|
-
this.analyzeWorkflowProgress();
|
|
293
|
-
|
|
294
|
-
if (this.issues.length > 0) {
|
|
295
|
-
console.log('\n🚨 ISSUES:\n');
|
|
296
|
-
this.issues.forEach(issue => console.log(` ${issue}`));
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (this.warnings.length > 0) {
|
|
300
|
-
console.log('\n⚠️ WARNINGS:\n');
|
|
301
|
-
this.warnings.forEach(warning => console.log(` ${warning}`));
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
if (this.info.length > 0) {
|
|
305
|
-
console.log('\nℹ️ INFO:\n');
|
|
306
|
-
this.info.forEach(info => console.log(` ${info}`));
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
console.log('\n═══════════════════════════════════════════════════════');
|
|
310
|
-
console.log(' ANALYSIS COMPLETE');
|
|
311
|
-
console.log('═══════════════════════════════════════════════════════\n');
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Main execution
|
|
316
|
-
const projectPath = process.argv[2] || process.cwd();
|
|
317
|
-
const analyzer = new BMADProjectAnalyzer(projectPath);
|
|
318
|
-
analyzer.generateReport();
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* BMAD Setup Checker
|
|
5
|
-
*
|
|
6
|
-
* Verifies BMAD-METHOD installation and configuration
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const { execSync } = require('child_process');
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
|
|
13
|
-
class BMADSetupChecker {
|
|
14
|
-
constructor() {
|
|
15
|
-
this.checks = [];
|
|
16
|
-
this.issues = [];
|
|
17
|
-
this.warnings = [];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
checkNodeVersion() {
|
|
21
|
-
try {
|
|
22
|
-
const version = process.version;
|
|
23
|
-
const majorVersion = parseInt(version.slice(1).split('.')[0]);
|
|
24
|
-
|
|
25
|
-
if (majorVersion >= 20) {
|
|
26
|
-
this.checks.push(`✓ Node.js ${version} (required: v20+)`);
|
|
27
|
-
} else {
|
|
28
|
-
this.issues.push(`✗ Node.js ${version} is too old. Required: v20+`);
|
|
29
|
-
}
|
|
30
|
-
} catch (error) {
|
|
31
|
-
this.issues.push('✗ Could not determine Node.js version');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
checkNpmAvailable() {
|
|
36
|
-
try {
|
|
37
|
-
const version = execSync('npm --version', { encoding: 'utf-8' }).trim();
|
|
38
|
-
this.checks.push(`✓ npm ${version}`);
|
|
39
|
-
} catch (error) {
|
|
40
|
-
this.issues.push('✗ npm not found. Install Node.js from https://nodejs.org/');
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
checkBMADInstallation() {
|
|
45
|
-
const homeDir = require('os').homedir();
|
|
46
|
-
const bmadPaths = [
|
|
47
|
-
path.join(process.cwd(), 'bmad-core'),
|
|
48
|
-
path.join(process.cwd(), '.bmad-core'),
|
|
49
|
-
path.join(homeDir, '.bmad'),
|
|
50
|
-
];
|
|
51
|
-
|
|
52
|
-
let found = false;
|
|
53
|
-
for (const bmadPath of bmadPaths) {
|
|
54
|
-
if (fs.existsSync(bmadPath)) {
|
|
55
|
-
this.checks.push(`✓ BMAD installation found at ${bmadPath}`);
|
|
56
|
-
found = true;
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (!found) {
|
|
62
|
-
this.warnings.push('⚠ BMAD installation not found in current directory');
|
|
63
|
-
this.warnings.push(' Run: npx bmad-method install');
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
checkGitAvailable() {
|
|
68
|
-
try {
|
|
69
|
-
const version = execSync('git --version', { encoding: 'utf-8' }).trim();
|
|
70
|
-
this.checks.push(`✓ ${version}`);
|
|
71
|
-
} catch (error) {
|
|
72
|
-
this.warnings.push('⚠ git not found - recommended for version control');
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
checkIDEIntegration() {
|
|
77
|
-
const ideMarkers = {
|
|
78
|
-
'VS Code': ['.vscode'],
|
|
79
|
-
'Cursor': ['.cursor', '.cursorrules'],
|
|
80
|
-
'WebStorm': ['.idea']
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
let foundIDE = false;
|
|
84
|
-
for (const [ide, markers] of Object.entries(ideMarkers)) {
|
|
85
|
-
for (const marker of markers) {
|
|
86
|
-
if (fs.existsSync(path.join(process.cwd(), marker))) {
|
|
87
|
-
this.checks.push(`✓ ${ide} integration detected`);
|
|
88
|
-
foundIDE = true;
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (!foundIDE) {
|
|
95
|
-
this.warnings.push('⚠ No IDE integration detected - BMAD works best with IDE integration');
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
checkProjectStructure() {
|
|
100
|
-
const requiredDirs = ['docs'];
|
|
101
|
-
const optionalDirs = ['bmad-core', 'expansion-packs', 'dist', 'tools'];
|
|
102
|
-
|
|
103
|
-
for (const dir of requiredDirs) {
|
|
104
|
-
if (fs.existsSync(path.join(process.cwd(), dir))) {
|
|
105
|
-
this.checks.push(`✓ ${dir}/ directory exists`);
|
|
106
|
-
} else {
|
|
107
|
-
this.warnings.push(`⚠ ${dir}/ directory not found - create with: mkdir ${dir}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
for (const dir of optionalDirs) {
|
|
112
|
-
if (fs.existsSync(path.join(process.cwd(), dir))) {
|
|
113
|
-
this.checks.push(`✓ ${dir}/ directory exists`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
checkConfiguration() {
|
|
119
|
-
const configFiles = [
|
|
120
|
-
'.bmad-core/core-config.yaml',
|
|
121
|
-
'.bmad-core/data/technical-preferences.md',
|
|
122
|
-
'package.json'
|
|
123
|
-
];
|
|
124
|
-
|
|
125
|
-
for (const configFile of configFiles) {
|
|
126
|
-
const fullPath = path.join(process.cwd(), configFile);
|
|
127
|
-
if (fs.existsSync(fullPath)) {
|
|
128
|
-
const stats = fs.statSync(fullPath);
|
|
129
|
-
this.checks.push(`✓ ${configFile} (${(stats.size / 1024).toFixed(1)}KB)`);
|
|
130
|
-
} else {
|
|
131
|
-
if (configFile === 'package.json') {
|
|
132
|
-
this.warnings.push(`⚠ ${configFile} not found - run: npm init`);
|
|
133
|
-
} else {
|
|
134
|
-
this.warnings.push(`⚠ ${configFile} not found`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
checkBMADCommand() {
|
|
141
|
-
try {
|
|
142
|
-
// Try to check if bmad-method is available
|
|
143
|
-
execSync('npx bmad-method --version', {
|
|
144
|
-
encoding: 'utf-8',
|
|
145
|
-
stdio: 'pipe'
|
|
146
|
-
});
|
|
147
|
-
this.checks.push('✓ bmad-method CLI accessible via npx');
|
|
148
|
-
} catch (error) {
|
|
149
|
-
// This is not necessarily an error, just means it's not cached
|
|
150
|
-
this.warnings.push('⚠ bmad-method not cached - first run will download it');
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
generateReport() {
|
|
155
|
-
console.log('\n═══════════════════════════════════════════════════════');
|
|
156
|
-
console.log(' BMAD-METHOD SETUP VERIFICATION');
|
|
157
|
-
console.log('═══════════════════════════════════════════════════════\n');
|
|
158
|
-
|
|
159
|
-
console.log('Running setup checks...\n');
|
|
160
|
-
|
|
161
|
-
this.checkNodeVersion();
|
|
162
|
-
this.checkNpmAvailable();
|
|
163
|
-
this.checkBMADInstallation();
|
|
164
|
-
this.checkGitAvailable();
|
|
165
|
-
this.checkIDEIntegration();
|
|
166
|
-
this.checkProjectStructure();
|
|
167
|
-
this.checkConfiguration();
|
|
168
|
-
this.checkBMADCommand();
|
|
169
|
-
|
|
170
|
-
if (this.checks.length > 0) {
|
|
171
|
-
console.log('✅ PASSED CHECKS:\n');
|
|
172
|
-
this.checks.forEach(check => console.log(` ${check}`));
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (this.warnings.length > 0) {
|
|
176
|
-
console.log('\n⚠️ WARNINGS:\n');
|
|
177
|
-
this.warnings.forEach(warning => console.log(` ${warning}`));
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (this.issues.length > 0) {
|
|
181
|
-
console.log('\n🚨 ISSUES:\n');
|
|
182
|
-
this.issues.forEach(issue => console.log(` ${issue}`));
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
console.log('\n═══════════════════════════════════════════════════════');
|
|
186
|
-
|
|
187
|
-
if (this.issues.length === 0) {
|
|
188
|
-
console.log(' ✓ SETUP VERIFICATION PASSED');
|
|
189
|
-
} else {
|
|
190
|
-
console.log(' ⚠ SETUP ISSUES DETECTED - SEE ABOVE');
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
console.log('═══════════════════════════════════════════════════════\n');
|
|
194
|
-
|
|
195
|
-
if (this.issues.length === 0 && this.warnings.length === 0) {
|
|
196
|
-
console.log('🎉 Your BMAD-METHOD setup looks good!\n');
|
|
197
|
-
console.log('Next steps:');
|
|
198
|
-
console.log(' 1. Create a project brief');
|
|
199
|
-
console.log(' 2. Use @pm to create a PRD');
|
|
200
|
-
console.log(' 3. Use @architect to design architecture');
|
|
201
|
-
console.log(' 4. Start developing!\n');
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// Main execution
|
|
207
|
-
const checker = new BMADSetupChecker();
|
|
208
|
-
checker.generateReport();
|