specweave 0.9.0 → 0.10.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/CLAUDE.md +100 -13
- package/README.md +97 -207
- package/bin/install-agents.sh +1 -1
- package/bin/install-commands.sh +1 -1
- package/bin/install-hooks.sh +1 -1
- package/bin/install-skills.sh +1 -1
- package/bin/specweave.js +32 -0
- package/dist/cli/commands/validate-jira.d.ts +35 -0
- package/dist/cli/commands/validate-jira.d.ts.map +1 -0
- package/dist/cli/commands/validate-jira.js +112 -0
- package/dist/cli/commands/validate-jira.js.map +1 -0
- package/dist/cli/commands/validate-plugins.d.ts +41 -0
- package/dist/cli/commands/validate-plugins.d.ts.map +1 -0
- package/dist/cli/commands/validate-plugins.js +171 -0
- package/dist/cli/commands/validate-plugins.js.map +1 -0
- package/dist/core/types/sync-profile.d.ts +177 -29
- package/dist/core/types/sync-profile.d.ts.map +1 -1
- package/dist/core/types/sync-profile.js +48 -1
- package/dist/core/types/sync-profile.js.map +1 -1
- package/dist/hooks/lib/translate-living-docs.d.ts.map +1 -1
- package/dist/hooks/lib/translate-living-docs.js +16 -7
- package/dist/hooks/lib/translate-living-docs.js.map +1 -1
- package/dist/metrics/dora-calculator.d.ts +7 -3
- package/dist/metrics/dora-calculator.d.ts.map +1 -1
- package/dist/metrics/dora-calculator.js +19 -6
- package/dist/metrics/dora-calculator.js.map +1 -1
- package/dist/metrics/report-generator.d.ts +17 -0
- package/dist/metrics/report-generator.d.ts.map +1 -0
- package/dist/metrics/report-generator.js +403 -0
- package/dist/metrics/report-generator.js.map +1 -0
- package/dist/utils/external-resource-validator.d.ts +102 -0
- package/dist/utils/external-resource-validator.d.ts.map +1 -0
- package/dist/utils/external-resource-validator.js +381 -0
- package/dist/utils/external-resource-validator.js.map +1 -0
- package/dist/utils/plugin-validator.d.ts +161 -0
- package/dist/utils/plugin-validator.d.ts.map +1 -0
- package/dist/utils/plugin-validator.js +565 -0
- package/dist/utils/plugin-validator.js.map +1 -0
- package/package.json +2 -1
- package/plugins/specweave/commands/specweave-do.md +47 -0
- package/plugins/specweave/commands/specweave-increment.md +82 -0
- package/plugins/specweave/commands/specweave-next.md +47 -0
- package/plugins/specweave/hooks/post-increment-planning.sh +117 -38
- package/plugins/specweave/hooks/pre-tool-use.sh +133 -0
- package/plugins/specweave/plugin.json +22 -0
- package/plugins/specweave/skills/SKILLS-INDEX.md +3 -1
- package/plugins/specweave/skills/plugin-validator/SKILL.md +427 -0
- package/plugins/specweave-ado/.claude-plugin/plugin.json +2 -4
- package/plugins/specweave-ado/lib/ado-board-resolver.ts +328 -0
- package/plugins/specweave-ado/lib/ado-hierarchical-sync.ts +484 -0
- package/plugins/specweave-ado/plugin.json +20 -0
- package/plugins/specweave-alternatives/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-backend/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-cost-optimizer/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-diagrams/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-docs/.claude-plugin/plugin.json +13 -2
- package/plugins/specweave-figma/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-frontend/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-github/lib/github-board-resolver.ts +164 -0
- package/plugins/specweave-github/lib/github-hierarchical-sync.ts +344 -0
- package/plugins/specweave-github/plugin.json +19 -0
- package/plugins/specweave-infrastructure/.claude-plugin/plugin.json +15 -2
- package/plugins/specweave-jira/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-jira/lib/jira-board-resolver.ts +127 -0
- package/plugins/specweave-jira/lib/jira-hierarchical-sync.ts +283 -0
- package/plugins/specweave-jira/plugin.json +20 -0
- package/plugins/specweave-jira/skills/jira-resource-validator/SKILL.md +584 -0
- package/plugins/specweave-kubernetes/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-payments/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-testing/.claude-plugin/plugin.json +14 -2
- package/plugins/specweave-tooling/.claude-plugin/plugin.json +13 -2
- package/src/templates/.env.example +71 -5
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* DORA Metrics Report Generator
|
|
4
|
+
*
|
|
5
|
+
* Generates detailed markdown reports from DORA metrics
|
|
6
|
+
* Provides insights, trends, and actionable recommendations
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Format date for display
|
|
12
|
+
*/
|
|
13
|
+
function formatDate(date) {
|
|
14
|
+
const d = typeof date === 'string' ? new Date(date) : date;
|
|
15
|
+
return d.toLocaleDateString('en-US', {
|
|
16
|
+
year: 'numeric',
|
|
17
|
+
month: 'short',
|
|
18
|
+
day: 'numeric',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get tier emoji
|
|
23
|
+
*/
|
|
24
|
+
function getTierEmoji(tier) {
|
|
25
|
+
switch (tier) {
|
|
26
|
+
case 'Elite': return '🏆';
|
|
27
|
+
case 'High': return '⭐';
|
|
28
|
+
case 'Medium': return '📊';
|
|
29
|
+
case 'Low': return '⚠️';
|
|
30
|
+
default: return '⚪';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get status emoji
|
|
35
|
+
*/
|
|
36
|
+
function getStatusEmoji(tier) {
|
|
37
|
+
switch (tier) {
|
|
38
|
+
case 'Elite':
|
|
39
|
+
case 'High':
|
|
40
|
+
return '✅';
|
|
41
|
+
case 'Medium':
|
|
42
|
+
return '⚠️';
|
|
43
|
+
case 'Low':
|
|
44
|
+
return '❌';
|
|
45
|
+
default:
|
|
46
|
+
return 'ℹ️';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate deployment frequency insights
|
|
51
|
+
*/
|
|
52
|
+
function generateDFInsights(value, tier) {
|
|
53
|
+
const insights = [];
|
|
54
|
+
if (tier === 'Elite') {
|
|
55
|
+
insights.push('🎉 **Elite Performance**: Deploying multiple times per day enables rapid feedback and reduced risk');
|
|
56
|
+
insights.push('✅ Continue current cadence - no action needed');
|
|
57
|
+
}
|
|
58
|
+
else if (tier === 'High') {
|
|
59
|
+
insights.push('✅ **Strong Performance**: Weekly to monthly deployments indicate healthy delivery rhythm');
|
|
60
|
+
insights.push('📈 **Next Level**: Consider increasing to daily deployments for elite performance');
|
|
61
|
+
insights.push('💡 **Tip**: Implement feature flags to decouple deployment from release');
|
|
62
|
+
}
|
|
63
|
+
else if (tier === 'Medium') {
|
|
64
|
+
insights.push('⚠️ **Room for Improvement**: Monthly to quarterly deployments increase risk');
|
|
65
|
+
insights.push('🎯 **Action**: Break down changes into smaller, more frequent deployments');
|
|
66
|
+
insights.push('🔧 **Focus**: Improve CI/CD pipeline automation');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
insights.push('❌ **Critical**: Infrequent deployments create significant risk and slow feedback');
|
|
70
|
+
insights.push('🚨 **Urgent**: Implement automated deployment pipeline');
|
|
71
|
+
insights.push('📋 **Priority**: Break monolithic releases into incremental deployments');
|
|
72
|
+
}
|
|
73
|
+
return insights;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate lead time insights
|
|
77
|
+
*/
|
|
78
|
+
function generateLTInsights(value, tier, p50, p90) {
|
|
79
|
+
const insights = [];
|
|
80
|
+
if (tier === 'Elite') {
|
|
81
|
+
insights.push('🎉 **Elite Performance**: Sub-hour lead time enables rapid iteration');
|
|
82
|
+
insights.push('✅ Best-in-class delivery speed');
|
|
83
|
+
}
|
|
84
|
+
else if (tier === 'High') {
|
|
85
|
+
insights.push('✅ **Strong Performance**: Lead time under 1 week is competitive');
|
|
86
|
+
if (p50 && p90) {
|
|
87
|
+
insights.push(`📊 **Distribution**: 50% of changes deploy in ${p50}h, 90% in ${p90}h`);
|
|
88
|
+
}
|
|
89
|
+
insights.push('📈 **Next Level**: Focus on reducing p90 to reach elite tier');
|
|
90
|
+
insights.push('💡 **Tip**: Identify bottlenecks in slowest 10% of deployments');
|
|
91
|
+
}
|
|
92
|
+
else if (tier === 'Medium') {
|
|
93
|
+
insights.push('⚠️ **Moderate Performance**: 1 week to 1 month lead time slows feedback');
|
|
94
|
+
insights.push('🎯 **Action**: Reduce code review time and automate testing');
|
|
95
|
+
insights.push('🔧 **Focus**: Eliminate manual approval steps');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
insights.push('❌ **Critical**: Long lead times reduce agility and increase risk');
|
|
99
|
+
insights.push('🚨 **Urgent**: Implement automated testing and deployment');
|
|
100
|
+
insights.push('📋 **Priority**: Reduce batch size and increase deployment frequency');
|
|
101
|
+
}
|
|
102
|
+
return insights;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Generate change failure rate insights
|
|
106
|
+
*/
|
|
107
|
+
function generateCFRInsights(value, tier, failed, total) {
|
|
108
|
+
const insights = [];
|
|
109
|
+
if (tier === 'Elite') {
|
|
110
|
+
insights.push('🎉 **Elite Performance**: < 15% failure rate indicates high quality');
|
|
111
|
+
if (failed === 0) {
|
|
112
|
+
insights.push('🏆 **Perfect Record**: Zero failures across all deployments!');
|
|
113
|
+
}
|
|
114
|
+
insights.push('✅ Maintain current quality standards');
|
|
115
|
+
}
|
|
116
|
+
else if (tier === 'High') {
|
|
117
|
+
insights.push('✅ **Good Performance**: 16-30% failure rate is manageable');
|
|
118
|
+
insights.push(`📊 **Stats**: ${failed} failures out of ${total} deployments`);
|
|
119
|
+
insights.push('📈 **Next Level**: Focus on test coverage and pre-deployment validation');
|
|
120
|
+
insights.push('💡 **Tip**: Implement smoke tests and canary deployments');
|
|
121
|
+
}
|
|
122
|
+
else if (tier === 'Medium') {
|
|
123
|
+
insights.push('⚠️ **Concerning**: 31-45% failure rate impacts reliability');
|
|
124
|
+
insights.push(`📊 **Stats**: ${failed} failures out of ${total} deployments`);
|
|
125
|
+
insights.push('🎯 **Action**: Increase automated test coverage');
|
|
126
|
+
insights.push('🔧 **Focus**: Implement pre-commit hooks and PR validation');
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
insights.push('❌ **Critical**: > 45% failure rate severely impacts trust');
|
|
130
|
+
insights.push(`📊 **Stats**: ${failed} failures out of ${total} deployments`);
|
|
131
|
+
insights.push('🚨 **Urgent**: Implement comprehensive test suite');
|
|
132
|
+
insights.push('📋 **Priority**: Add smoke tests and staging environment');
|
|
133
|
+
}
|
|
134
|
+
return insights;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Generate MTTR insights
|
|
138
|
+
*/
|
|
139
|
+
function generateMTTRInsights(value, tier, p50, p90) {
|
|
140
|
+
const insights = [];
|
|
141
|
+
if (value === 0 || tier === 'N/A') {
|
|
142
|
+
insights.push('ℹ️ **No Incidents**: No production incidents in measurement period');
|
|
143
|
+
insights.push('✅ This is good news! Either stability is high or incident tracking needs improvement');
|
|
144
|
+
insights.push('💡 **Tip**: Ensure production incidents are labeled "incident" or "production-bug"');
|
|
145
|
+
return insights;
|
|
146
|
+
}
|
|
147
|
+
if (tier === 'Elite') {
|
|
148
|
+
insights.push('🎉 **Elite Performance**: Sub-hour recovery time minimizes impact');
|
|
149
|
+
insights.push('✅ Excellent incident response capability');
|
|
150
|
+
}
|
|
151
|
+
else if (tier === 'High') {
|
|
152
|
+
insights.push('✅ **Strong Performance**: Recovery within 24 hours limits damage');
|
|
153
|
+
if (p50 && p90) {
|
|
154
|
+
insights.push(`📊 **Distribution**: 50% resolve in ${p50} min, 90% in ${p90} min`);
|
|
155
|
+
}
|
|
156
|
+
insights.push('📈 **Next Level**: Implement auto-remediation for common issues');
|
|
157
|
+
}
|
|
158
|
+
else if (tier === 'Medium') {
|
|
159
|
+
insights.push('⚠️ **Room for Improvement**: Multi-day recovery extends impact');
|
|
160
|
+
insights.push('🎯 **Action**: Create runbooks for common incidents');
|
|
161
|
+
insights.push('🔧 **Focus**: Improve monitoring and alerting');
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
insights.push('❌ **Critical**: Week-plus recovery time is unacceptable');
|
|
165
|
+
insights.push('🚨 **Urgent**: Implement on-call rotation and incident procedures');
|
|
166
|
+
insights.push('📋 **Priority**: Create disaster recovery plan');
|
|
167
|
+
}
|
|
168
|
+
return insights;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Generate markdown report
|
|
172
|
+
*/
|
|
173
|
+
export function generateMarkdownReport(metrics, releases, issues) {
|
|
174
|
+
const timestamp = new Date(metrics.timestamp);
|
|
175
|
+
const { deploymentFrequency, leadTime, changeFailureRate, mttr } = metrics.metrics;
|
|
176
|
+
let report = `# DORA Metrics Report
|
|
177
|
+
|
|
178
|
+
**Generated**: ${formatDate(timestamp)} at ${timestamp.toLocaleTimeString('en-US')}
|
|
179
|
+
**Period**: Last 30 days
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## 📊 Executive Summary
|
|
184
|
+
|
|
185
|
+
| Metric | Value | Tier | Status |
|
|
186
|
+
|--------|-------|------|--------|
|
|
187
|
+
| **Deployment Frequency** | ${deploymentFrequency.value} ${deploymentFrequency.unit} | ${getTierEmoji(deploymentFrequency.tier)} ${deploymentFrequency.tier} | ${getStatusEmoji(deploymentFrequency.tier)} |
|
|
188
|
+
| **Lead Time for Changes** | ${leadTime.value} ${leadTime.unit} | ${getTierEmoji(leadTime.tier)} ${leadTime.tier} | ${getStatusEmoji(leadTime.tier)} |
|
|
189
|
+
| **Change Failure Rate** | ${changeFailureRate.value}% | ${getTierEmoji(changeFailureRate.tier)} ${changeFailureRate.tier} | ${getStatusEmoji(changeFailureRate.tier)} |
|
|
190
|
+
| **Mean Time to Recovery** | ${mttr.value} ${mttr.unit} | ${getTierEmoji(mttr.tier)} ${mttr.tier} | ${getStatusEmoji(mttr.tier)} |
|
|
191
|
+
|
|
192
|
+
`;
|
|
193
|
+
// Overall assessment
|
|
194
|
+
const tiers = [deploymentFrequency.tier, leadTime.tier, changeFailureRate.tier, mttr.tier];
|
|
195
|
+
const eliteCount = tiers.filter(t => t === 'Elite').length;
|
|
196
|
+
const highCount = tiers.filter(t => t === 'High').length;
|
|
197
|
+
if (eliteCount >= 3) {
|
|
198
|
+
report += `**Overall Assessment**: 🏆 **Elite Team** - ${eliteCount}/4 metrics at elite level\n\n`;
|
|
199
|
+
}
|
|
200
|
+
else if (eliteCount + highCount >= 3) {
|
|
201
|
+
report += `**Overall Assessment**: ⭐ **High-Performing Team** - ${eliteCount + highCount}/4 metrics at high or elite\n\n`;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
report += `**Overall Assessment**: 📊 **Growing Team** - Focus on continuous improvement\n\n`;
|
|
205
|
+
}
|
|
206
|
+
report += `---
|
|
207
|
+
|
|
208
|
+
## 🚀 Deployment Frequency
|
|
209
|
+
|
|
210
|
+
**Current**: ${deploymentFrequency.value} ${deploymentFrequency.unit} (${getTierEmoji(deploymentFrequency.tier)} ${deploymentFrequency.tier})
|
|
211
|
+
|
|
212
|
+
**Industry Benchmarks**:
|
|
213
|
+
- 🏆 Elite: Multiple deploys per day (>365/year)
|
|
214
|
+
- ⭐ High: Weekly to monthly (52-365/year)
|
|
215
|
+
- 📊 Medium: Monthly to quarterly (12-52/year)
|
|
216
|
+
- ⚠️ Low: Less than quarterly (<12/year)
|
|
217
|
+
|
|
218
|
+
### Insights
|
|
219
|
+
|
|
220
|
+
${generateDFInsights(deploymentFrequency.value, deploymentFrequency.tier).map(i => `- ${i}`).join('\n')}
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## ⚡ Lead Time for Changes
|
|
225
|
+
|
|
226
|
+
**Current**: ${leadTime.value} ${leadTime.unit} (${getTierEmoji(leadTime.tier)} ${leadTime.tier})
|
|
227
|
+
`;
|
|
228
|
+
if (leadTime.p50 && leadTime.p90) {
|
|
229
|
+
report += `**Percentiles**: P50 = ${leadTime.p50}h, P90 = ${leadTime.p90}h\n`;
|
|
230
|
+
}
|
|
231
|
+
report += `
|
|
232
|
+
**Industry Benchmarks**:
|
|
233
|
+
- 🏆 Elite: Less than 1 hour
|
|
234
|
+
- ⭐ High: 1 day to 1 week
|
|
235
|
+
- 📊 Medium: 1 week to 1 month
|
|
236
|
+
- ⚠️ Low: More than 1 month
|
|
237
|
+
|
|
238
|
+
### Insights
|
|
239
|
+
|
|
240
|
+
${generateLTInsights(leadTime.value, leadTime.tier, leadTime.p50, leadTime.p90).map(i => `- ${i}`).join('\n')}
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## ✅ Change Failure Rate
|
|
245
|
+
|
|
246
|
+
**Current**: ${changeFailureRate.value}% (${getTierEmoji(changeFailureRate.tier)} ${changeFailureRate.tier})
|
|
247
|
+
**Failed Releases**: ${changeFailureRate.failedReleases} / ${changeFailureRate.totalReleases}
|
|
248
|
+
|
|
249
|
+
**Industry Benchmarks**:
|
|
250
|
+
- 🏆 Elite: 0-15%
|
|
251
|
+
- ⭐ High: 16-30%
|
|
252
|
+
- 📊 Medium: 31-45%
|
|
253
|
+
- ⚠️ Low: More than 45%
|
|
254
|
+
|
|
255
|
+
### Insights
|
|
256
|
+
|
|
257
|
+
${generateCFRInsights(changeFailureRate.value, changeFailureRate.tier, changeFailureRate.failedReleases, changeFailureRate.totalReleases).map(i => `- ${i}`).join('\n')}
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 🔧 Mean Time to Recovery (MTTR)
|
|
262
|
+
|
|
263
|
+
**Current**: ${mttr.value} ${mttr.unit} (${getTierEmoji(mttr.tier)} ${mttr.tier})
|
|
264
|
+
`;
|
|
265
|
+
if (mttr.p50 && mttr.p90) {
|
|
266
|
+
report += `**Percentiles**: P50 = ${mttr.p50} min, P90 = ${mttr.p90} min\n`;
|
|
267
|
+
}
|
|
268
|
+
report += `
|
|
269
|
+
**Industry Benchmarks**:
|
|
270
|
+
- 🏆 Elite: Less than 1 hour
|
|
271
|
+
- ⭐ High: 1 hour to 1 day
|
|
272
|
+
- 📊 Medium: 1 day to 1 week
|
|
273
|
+
- ⚠️ Low: More than 1 week
|
|
274
|
+
|
|
275
|
+
### Insights
|
|
276
|
+
|
|
277
|
+
${generateMTTRInsights(mttr.value, mttr.tier, mttr.p50, mttr.p90).map(i => `- ${i}`).join('\n')}
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 📈 Recent Activity
|
|
282
|
+
|
|
283
|
+
`;
|
|
284
|
+
// Add release information if available
|
|
285
|
+
if (releases && releases.length > 0) {
|
|
286
|
+
report += `### Recent Releases (${releases.length} in last 30 days)\n\n`;
|
|
287
|
+
releases.slice(0, 5).forEach((release) => {
|
|
288
|
+
const publishedAt = new Date(release.published_at);
|
|
289
|
+
report += `- **[${release.tag_name}](${release.html_url})** - ${formatDate(publishedAt)}\n`;
|
|
290
|
+
if (release.name && release.name !== release.tag_name) {
|
|
291
|
+
report += ` _${release.name}_\n`;
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
if (releases.length > 5) {
|
|
295
|
+
report += `\n_...and ${releases.length - 5} more releases_\n`;
|
|
296
|
+
}
|
|
297
|
+
report += '\n';
|
|
298
|
+
}
|
|
299
|
+
// Add incident information if available
|
|
300
|
+
if (issues && issues.length > 0) {
|
|
301
|
+
report += `### Production Incidents (${issues.length} tracked)\n\n`;
|
|
302
|
+
issues.slice(0, 5).forEach((issue) => {
|
|
303
|
+
const createdAt = new Date(issue.created_at);
|
|
304
|
+
const closedAt = issue.closed_at ? new Date(issue.closed_at) : null;
|
|
305
|
+
const duration = closedAt
|
|
306
|
+
? Math.round((closedAt.getTime() - createdAt.getTime()) / (1000 * 60))
|
|
307
|
+
: 'ongoing';
|
|
308
|
+
report += `- **[#${issue.number}](${issue.html_url})** ${issue.title}\n`;
|
|
309
|
+
report += ` Created: ${formatDate(createdAt)} | `;
|
|
310
|
+
if (typeof duration === 'number') {
|
|
311
|
+
report += `Resolved in: ${duration} minutes\n`;
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
report += `Status: ${duration}\n`;
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
if (issues.length > 5) {
|
|
318
|
+
report += `\n_...and ${issues.length - 5} more incidents_\n`;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
report += `### Production Incidents
|
|
323
|
+
|
|
324
|
+
ℹ️ No production incidents tracked in the last 30 days.
|
|
325
|
+
|
|
326
|
+
💡 **Tip**: Label issues with "incident" or "production-bug" to track them automatically.
|
|
327
|
+
|
|
328
|
+
`;
|
|
329
|
+
}
|
|
330
|
+
report += `---
|
|
331
|
+
|
|
332
|
+
## 🎯 Recommended Actions
|
|
333
|
+
|
|
334
|
+
`;
|
|
335
|
+
const actions = [];
|
|
336
|
+
// Deployment frequency actions
|
|
337
|
+
if (deploymentFrequency.tier === 'Medium' || deploymentFrequency.tier === 'Low') {
|
|
338
|
+
actions.push('1. **Increase Deployment Frequency**');
|
|
339
|
+
actions.push(' - Implement automated CI/CD pipeline');
|
|
340
|
+
actions.push(' - Use feature flags to decouple deployment from release');
|
|
341
|
+
actions.push(' - Break down large changes into smaller increments');
|
|
342
|
+
}
|
|
343
|
+
// Lead time actions
|
|
344
|
+
if (leadTime.tier === 'Medium' || leadTime.tier === 'Low') {
|
|
345
|
+
actions.push('2. **Reduce Lead Time**');
|
|
346
|
+
actions.push(' - Automate code review and approval processes');
|
|
347
|
+
actions.push(' - Implement automated testing (unit, integration, E2E)');
|
|
348
|
+
actions.push(' - Reduce manual steps in deployment pipeline');
|
|
349
|
+
}
|
|
350
|
+
// Change failure rate actions
|
|
351
|
+
if (changeFailureRate.tier === 'Medium' || changeFailureRate.tier === 'Low') {
|
|
352
|
+
actions.push('3. **Improve Change Failure Rate**');
|
|
353
|
+
actions.push(' - Increase test coverage (target: 80%+)');
|
|
354
|
+
actions.push(' - Implement pre-commit hooks and linting');
|
|
355
|
+
actions.push(' - Add smoke tests and staging environment');
|
|
356
|
+
}
|
|
357
|
+
// MTTR actions
|
|
358
|
+
if (mttr.tier === 'Medium' || mttr.tier === 'Low') {
|
|
359
|
+
actions.push('4. **Reduce Mean Time to Recovery**');
|
|
360
|
+
actions.push(' - Create incident runbooks for common issues');
|
|
361
|
+
actions.push(' - Implement automated rollback procedures');
|
|
362
|
+
actions.push(' - Improve monitoring and alerting');
|
|
363
|
+
}
|
|
364
|
+
if (actions.length === 0) {
|
|
365
|
+
report += `✅ **Great work!** All metrics are performing well. Focus on maintaining current standards.
|
|
366
|
+
|
|
367
|
+
💡 **Continue**:
|
|
368
|
+
- Monitor metrics regularly for trends
|
|
369
|
+
- Share DORA metrics with team for transparency
|
|
370
|
+
- Celebrate successes and learn from incidents
|
|
371
|
+
`;
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
report += actions.join('\n') + '\n';
|
|
375
|
+
}
|
|
376
|
+
report += `
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## 📚 Resources
|
|
380
|
+
|
|
381
|
+
- **DORA Research**: [State of DevOps Report](https://cloud.google.com/devops/state-of-devops)
|
|
382
|
+
- **Metrics Calculation**: [GitHub Workflow](https://github.com/anton-abyzov/specweave/actions/workflows/dora-metrics.yml)
|
|
383
|
+
- **Implementation**: [SpecWeave DORA Calculator](https://github.com/anton-abyzov/specweave/tree/develop/src/metrics)
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
_This report was generated automatically by SpecWeave DORA Metrics Calculator_
|
|
388
|
+
_Last updated: ${formatDate(timestamp)}_
|
|
389
|
+
`;
|
|
390
|
+
return report;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Write report to markdown file
|
|
394
|
+
*/
|
|
395
|
+
export function writeReport(report, filePath) {
|
|
396
|
+
const dir = path.dirname(filePath);
|
|
397
|
+
if (!fs.existsSync(dir)) {
|
|
398
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
399
|
+
}
|
|
400
|
+
fs.writeFileSync(filePath, report, 'utf-8');
|
|
401
|
+
console.log(`\n✅ Report written to ${filePath}`);
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=report-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/metrics/report-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Resource Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates and creates external resources (Jira projects, boards, etc.)
|
|
5
|
+
* Smart enough to:
|
|
6
|
+
* - Check if resources exist
|
|
7
|
+
* - Prompt user to select existing or create new
|
|
8
|
+
* - Create missing resources automatically
|
|
9
|
+
* - Update .env with actual IDs after creation
|
|
10
|
+
*
|
|
11
|
+
* @module utils/external-resource-validator
|
|
12
|
+
* @since 0.9.5
|
|
13
|
+
*/
|
|
14
|
+
export interface JiraProject {
|
|
15
|
+
id: string;
|
|
16
|
+
key: string;
|
|
17
|
+
name: string;
|
|
18
|
+
}
|
|
19
|
+
export interface JiraBoard {
|
|
20
|
+
id: number;
|
|
21
|
+
name: string;
|
|
22
|
+
type: string;
|
|
23
|
+
}
|
|
24
|
+
export interface JiraValidationResult {
|
|
25
|
+
valid: boolean;
|
|
26
|
+
project: {
|
|
27
|
+
exists: boolean;
|
|
28
|
+
key?: string;
|
|
29
|
+
id?: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
};
|
|
32
|
+
boards: {
|
|
33
|
+
valid: boolean;
|
|
34
|
+
existing: number[];
|
|
35
|
+
missing: string[];
|
|
36
|
+
created: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
id: number;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
envUpdated: boolean;
|
|
42
|
+
}
|
|
43
|
+
export declare class JiraResourceValidator {
|
|
44
|
+
private apiToken;
|
|
45
|
+
private email;
|
|
46
|
+
private domain;
|
|
47
|
+
private envPath;
|
|
48
|
+
constructor(envPath?: string);
|
|
49
|
+
/**
|
|
50
|
+
* Load .env file
|
|
51
|
+
*/
|
|
52
|
+
private loadEnv;
|
|
53
|
+
/**
|
|
54
|
+
* Update .env file with new values
|
|
55
|
+
*/
|
|
56
|
+
private updateEnv;
|
|
57
|
+
/**
|
|
58
|
+
* Call Jira API
|
|
59
|
+
*/
|
|
60
|
+
private callJiraApi;
|
|
61
|
+
/**
|
|
62
|
+
* Fetch all Jira projects
|
|
63
|
+
*/
|
|
64
|
+
fetchProjects(): Promise<JiraProject[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Check if project exists
|
|
67
|
+
*/
|
|
68
|
+
checkProject(projectKey: string): Promise<JiraProject | null>;
|
|
69
|
+
/**
|
|
70
|
+
* Create new Jira project
|
|
71
|
+
*/
|
|
72
|
+
createProject(projectKey: string, projectName: string): Promise<JiraProject>;
|
|
73
|
+
/**
|
|
74
|
+
* Get current user ID (for project lead)
|
|
75
|
+
*/
|
|
76
|
+
private getCurrentUserId;
|
|
77
|
+
/**
|
|
78
|
+
* Fetch all boards for a project
|
|
79
|
+
*/
|
|
80
|
+
fetchBoards(projectKey: string): Promise<JiraBoard[]>;
|
|
81
|
+
/**
|
|
82
|
+
* Check if board exists by ID
|
|
83
|
+
*/
|
|
84
|
+
checkBoard(boardId: number): Promise<JiraBoard | null>;
|
|
85
|
+
/**
|
|
86
|
+
* Create new Jira board
|
|
87
|
+
*/
|
|
88
|
+
createBoard(boardName: string, projectKey: string): Promise<JiraBoard>;
|
|
89
|
+
/**
|
|
90
|
+
* Get or create filter for board
|
|
91
|
+
*/
|
|
92
|
+
private getOrCreateFilter;
|
|
93
|
+
/**
|
|
94
|
+
* Validate and fix Jira configuration
|
|
95
|
+
*/
|
|
96
|
+
validate(): Promise<JiraValidationResult>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Validate Jira resources
|
|
100
|
+
*/
|
|
101
|
+
export declare function validateJiraResources(envPath?: string): Promise<JiraValidationResult>;
|
|
102
|
+
//# sourceMappingURL=external-resource-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-resource-validator.d.ts","sourceRoot":"","sources":["../../src/utils/external-resource-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAeH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE;QACP,MAAM,EAAE,OAAO,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,EAAE;QACN,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC9C,CAAC;IACF,UAAU,EAAE,OAAO,CAAC;CACrB;AAMD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,GAAE,MAAe;IASpC;;OAEG;IACH,OAAO,CAAC,OAAO;IAwBf;;OAEG;YACW,SAAS;IAyBvB;;OAEG;YACW,WAAW;IAmBzB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAa7C;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAanE;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAwBlF;;OAEG;YACW,gBAAgB;IAS9B;;OAEG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAa3D;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAa5D;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAuB5E;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,oBAAoB,CAAC;CA0IhD;AAMD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,GAAE,MAAe,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAG/B"}
|