mcp-adr-analysis-server 2.4.1 → 2.5.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.
@@ -0,0 +1,626 @@
1
+ /**
2
+ * Release Tracker Utility
3
+ *
4
+ * Core engine for release tracking that maps ADRs to releases,
5
+ * generates changelogs, manages milestones, and supports both
6
+ * greenfield and brownfield applications.
7
+ *
8
+ * No AI dependency — all deterministic git/file analysis.
9
+ */
10
+ import { execSync } from 'node:child_process';
11
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
12
+ import { join, basename } from 'path';
13
+ import * as os from 'os';
14
+ import { analyzeReleaseReadiness, } from './release-readiness-detector.js';
15
+ // ─── Release Detection ─────────────────────────────────────────────
16
+ /**
17
+ * Detect releases from git tags and optionally GitHub Releases.
18
+ */
19
+ export async function detectReleases(projectPath) {
20
+ const releases = [];
21
+ try {
22
+ // Get all semver-like tags sorted by version
23
+ const tagOutput = execSync("git tag -l --sort=-version:refname --format='%(refname:short)|%(creatordate:iso-strict)|%(objectname:short)'", { cwd: projectPath, encoding: 'utf8', timeout: 10000 }).trim();
24
+ if (!tagOutput) {
25
+ return [];
26
+ }
27
+ const tags = tagOutput
28
+ .split('\n')
29
+ .filter(line => line.trim())
30
+ .map(line => {
31
+ const parts = line.replace(/'/g, '').split('|');
32
+ return {
33
+ tag: parts[0] || '',
34
+ date: parts[1] || new Date().toISOString(),
35
+ commit: parts[2] || '',
36
+ };
37
+ })
38
+ .filter(t => /^v?\d+\.\d+/.test(t.tag));
39
+ // Build releases from tag pairs
40
+ for (let i = 0; i < tags.length; i++) {
41
+ const current = tags[i];
42
+ const previous = tags[i + 1];
43
+ const commitRange = {
44
+ from: previous ? previous.commit : getFirstCommit(projectPath),
45
+ to: current.commit,
46
+ };
47
+ // Get commits in this range
48
+ const { features, bugfixes, breakingChanges } = categorizeCommits(projectPath, commitRange.from, commitRange.to);
49
+ releases.push({
50
+ version: current.tag,
51
+ date: current.date,
52
+ source: 'git_tag',
53
+ commitRange,
54
+ adrs: [],
55
+ features,
56
+ bugfixes,
57
+ breakingChanges,
58
+ });
59
+ }
60
+ }
61
+ catch {
62
+ // Not a git repo or no tags — greenfield scenario
63
+ }
64
+ return releases;
65
+ }
66
+ /**
67
+ * Detect project type based on git history and ADR presence.
68
+ */
69
+ export async function detectProjectType(projectPath, adrCount) {
70
+ let commitCount = 0;
71
+ let tagCount = 0;
72
+ try {
73
+ commitCount = parseInt(execSync('git rev-list --count HEAD', {
74
+ cwd: projectPath,
75
+ encoding: 'utf8',
76
+ timeout: 5000,
77
+ }).trim(), 10);
78
+ }
79
+ catch {
80
+ commitCount = 0;
81
+ }
82
+ try {
83
+ tagCount = parseInt(execSync("git tag -l 'v*' | wc -l", {
84
+ cwd: projectPath,
85
+ encoding: 'utf8',
86
+ timeout: 5000,
87
+ }).trim(), 10);
88
+ }
89
+ catch {
90
+ tagCount = 0;
91
+ }
92
+ const projectType = tagCount === 0 && commitCount < 50 && adrCount < 3 ? 'greenfield' : 'brownfield';
93
+ let phase;
94
+ if (commitCount < 100)
95
+ phase = 'startup';
96
+ else if (commitCount < 500)
97
+ phase = 'growth';
98
+ else if (commitCount < 2000)
99
+ phase = 'mature';
100
+ else
101
+ phase = 'maintenance';
102
+ return { projectType, phase };
103
+ }
104
+ // ─── ADR-to-Release Mapping ────────────────────────────────────────
105
+ /**
106
+ * Three-pass mapping of ADRs to releases.
107
+ * Pass 1: Git history — match ADR file commits to release ranges
108
+ * Pass 2: Date range — ADR dates vs release windows
109
+ * Pass 3: Content reference — scan commit messages for ADR number references
110
+ */
111
+ export async function mapAdrsToReleases(adrs, releases, projectPath) {
112
+ const mappedAdrs = new Set();
113
+ // Clone releases to avoid mutating originals
114
+ const result = releases.map(r => ({ ...r, adrs: [...r.adrs] }));
115
+ for (const adr of adrs) {
116
+ let mapped = false;
117
+ // Pass 1: Git history — find commits that touched this ADR file
118
+ try {
119
+ const adrCommits = execSync(`git log --follow --format='%H|%aI' -- "${adr.path}"`, {
120
+ cwd: projectPath,
121
+ encoding: 'utf8',
122
+ timeout: 5000,
123
+ })
124
+ .trim()
125
+ .split('\n')
126
+ .filter(l => l.trim())
127
+ .map(l => {
128
+ const parts = l.replace(/'/g, '').split('|');
129
+ return { hash: parts[0] || '', date: parts[1] || '' };
130
+ });
131
+ if (adrCommits.length > 0) {
132
+ // Find which release range contains the earliest commit
133
+ for (const release of result) {
134
+ const isInRange = adrCommits.some(c => {
135
+ try {
136
+ const check = execSync(`git merge-base --is-ancestor ${c.hash.substring(0, 8)} ${release.commitRange.to}`, { cwd: projectPath, encoding: 'utf8', timeout: 5000 });
137
+ return check !== undefined || check === '';
138
+ }
139
+ catch {
140
+ return false;
141
+ }
142
+ });
143
+ if (isInRange) {
144
+ const changeType = determineChangeType(adr, adrCommits);
145
+ release.adrs.push({
146
+ adrFilename: adr.filename,
147
+ adrTitle: adr.title,
148
+ adrStatus: adr.status,
149
+ mappingMethod: 'git_history',
150
+ confidence: 0.9,
151
+ changeType,
152
+ relevantCommits: adrCommits.map(c => c.hash.substring(0, 8)),
153
+ });
154
+ mappedAdrs.add(adr.filename);
155
+ mapped = true;
156
+ break;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ catch {
162
+ // Git command failed, try next pass
163
+ }
164
+ // Pass 2: Date range — match ADR date to release windows
165
+ if (!mapped && adr.date) {
166
+ const adrDate = new Date(adr.date);
167
+ if (!isNaN(adrDate.getTime())) {
168
+ for (const release of result) {
169
+ const releaseDate = new Date(release.date);
170
+ if (adrDate <= releaseDate) {
171
+ release.adrs.push({
172
+ adrFilename: adr.filename,
173
+ adrTitle: adr.title,
174
+ adrStatus: adr.status,
175
+ mappingMethod: 'date_range',
176
+ confidence: 0.6,
177
+ changeType: determineChangeTypeFromStatus(adr.status),
178
+ });
179
+ mappedAdrs.add(adr.filename);
180
+ mapped = true;
181
+ break;
182
+ }
183
+ }
184
+ }
185
+ }
186
+ // Pass 3: Content reference — scan commit messages for ADR references
187
+ if (!mapped && adr.metadata?.number) {
188
+ const adrNumber = adr.metadata.number;
189
+ for (const release of result) {
190
+ try {
191
+ const commitMessages = execSync(`git log ${release.commitRange.from}..${release.commitRange.to} --format='%s' 2>/dev/null`, { cwd: projectPath, encoding: 'utf8', timeout: 5000 }).trim();
192
+ const pattern = new RegExp(`ADR[-_]?0*${adrNumber}\\b`, 'i');
193
+ if (pattern.test(commitMessages)) {
194
+ release.adrs.push({
195
+ adrFilename: adr.filename,
196
+ adrTitle: adr.title,
197
+ adrStatus: adr.status,
198
+ mappingMethod: 'content_reference',
199
+ confidence: 0.7,
200
+ changeType: 'implemented',
201
+ });
202
+ mappedAdrs.add(adr.filename);
203
+ mapped = true;
204
+ break;
205
+ }
206
+ }
207
+ catch {
208
+ // Continue to next release
209
+ }
210
+ }
211
+ }
212
+ }
213
+ const unmappedAdrs = adrs.filter(a => !mappedAdrs.has(a.filename)).map(a => a.filename);
214
+ return { mappedReleases: result, unmappedAdrs };
215
+ }
216
+ // ─── Changelog Generation ──────────────────────────────────────────
217
+ /**
218
+ * Generate CHANGELOG.md content in Keep a Changelog format.
219
+ */
220
+ export function generateChangelog(releases, options = {
221
+ format: 'keep-a-changelog',
222
+ includeAdrLinks: true,
223
+ includeCommitHashes: false,
224
+ groupByAdr: false,
225
+ }) {
226
+ const lines = [
227
+ '# Changelog',
228
+ '',
229
+ 'All notable changes to this project will be documented in this file.',
230
+ '',
231
+ 'The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),',
232
+ 'and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).',
233
+ '',
234
+ ];
235
+ for (const release of releases) {
236
+ const dateStr = release.date ? release.date.split('T')[0] : 'Unreleased';
237
+ lines.push(`## [${release.version}] - ${dateStr}`);
238
+ lines.push('');
239
+ if (options.groupByAdr && release.adrs.length > 0) {
240
+ lines.push('### Architecture Decisions');
241
+ for (const adr of release.adrs) {
242
+ const confidence = options.includeAdrLinks
243
+ ? ` (confidence: ${(adr.confidence * 100).toFixed(0)}%)`
244
+ : '';
245
+ lines.push(`- **${adr.adrTitle}** [${adr.changeType}]${confidence}`);
246
+ }
247
+ lines.push('');
248
+ }
249
+ if (release.features.length > 0) {
250
+ lines.push('### Added');
251
+ for (const feature of release.features) {
252
+ lines.push(`- ${feature}`);
253
+ }
254
+ lines.push('');
255
+ }
256
+ if (release.bugfixes.length > 0) {
257
+ lines.push('### Fixed');
258
+ for (const fix of release.bugfixes) {
259
+ lines.push(`- ${fix}`);
260
+ }
261
+ lines.push('');
262
+ }
263
+ if (release.breakingChanges.length > 0) {
264
+ lines.push('### Breaking Changes');
265
+ for (const change of release.breakingChanges) {
266
+ lines.push(`- ${change}`);
267
+ }
268
+ lines.push('');
269
+ }
270
+ if (!options.groupByAdr && release.adrs.length > 0 && options.includeAdrLinks) {
271
+ lines.push('### Related ADRs');
272
+ for (const adr of release.adrs) {
273
+ lines.push(`- ${adr.adrFilename}: ${adr.adrTitle} (${adr.changeType})`);
274
+ }
275
+ lines.push('');
276
+ }
277
+ }
278
+ return lines.join('\n');
279
+ }
280
+ /**
281
+ * Write CHANGELOG.md to the project root.
282
+ */
283
+ export function writeChangelog(projectPath, content) {
284
+ const changelogPath = join(projectPath, 'CHANGELOG.md');
285
+ writeFileSync(changelogPath, content, 'utf8');
286
+ }
287
+ // ─── Release Comparison ────────────────────────────────────────────
288
+ /**
289
+ * Compare two releases showing ADR changes between them.
290
+ */
291
+ export function compareReleases(releases, fromVersion, toVersion) {
292
+ const fromRelease = releases.find(r => r.version === fromVersion);
293
+ const toRelease = releases.find(r => r.version === toVersion);
294
+ if (!fromRelease || !toRelease) {
295
+ return {
296
+ fromVersion,
297
+ toVersion,
298
+ addedAdrs: [],
299
+ modifiedAdrs: [],
300
+ deprecatedAdrs: [],
301
+ featuresDelta: [],
302
+ bugfixesDelta: [],
303
+ breakingChangesDelta: [],
304
+ };
305
+ }
306
+ const fromAdrFiles = new Set(fromRelease.adrs.map(a => a.adrFilename));
307
+ const addedAdrs = toRelease.adrs.filter(a => !fromAdrFiles.has(a.adrFilename));
308
+ const modifiedAdrs = toRelease.adrs.filter(a => fromAdrFiles.has(a.adrFilename) && a.changeType === 'modified');
309
+ const deprecatedAdrs = toRelease.adrs.filter(a => a.changeType === 'deprecated');
310
+ return {
311
+ fromVersion,
312
+ toVersion,
313
+ addedAdrs,
314
+ modifiedAdrs,
315
+ deprecatedAdrs,
316
+ featuresDelta: toRelease.features.filter(f => !fromRelease.features.includes(f)),
317
+ bugfixesDelta: toRelease.bugfixes.filter(f => !fromRelease.bugfixes.includes(f)),
318
+ breakingChangesDelta: toRelease.breakingChanges.filter(c => !fromRelease.breakingChanges.includes(c)),
319
+ };
320
+ }
321
+ // ─── Milestone Management ──────────────────────────────────────────
322
+ /**
323
+ * Build milestone map linking ADRs to milestones and tasks.
324
+ */
325
+ export async function buildMilestoneMap(adrs, projectPath) {
326
+ // Get milestones from release readiness detector (parses TODO.md)
327
+ try {
328
+ const readiness = await analyzeReleaseReadiness({ projectPath });
329
+ const milestones = readiness.milestones;
330
+ // Enrich milestones with ADR cross-references
331
+ for (const milestone of milestones) {
332
+ const milestoneName = milestone.name.toLowerCase();
333
+ // Find ADRs that relate to this milestone by name matching
334
+ for (const adr of adrs) {
335
+ const adrTitle = adr.title.toLowerCase();
336
+ const adrContext = (adr.context || '').toLowerCase();
337
+ if (adrTitle.includes(milestoneName) || adrContext.includes(milestoneName)) {
338
+ if (!milestone.blockers.includes(adr.filename)) {
339
+ milestone.blockers.push(`[ADR] ${adr.filename}: ${adr.title}`);
340
+ }
341
+ }
342
+ }
343
+ }
344
+ return milestones;
345
+ }
346
+ catch {
347
+ return [];
348
+ }
349
+ }
350
+ // ─── GitHub Integration ────────────────────────────────────────────
351
+ /**
352
+ * Create a GitHub Release with ADR-linked release notes.
353
+ */
354
+ export function createGitHubRelease(projectPath, version, releaseNotes) {
355
+ try {
356
+ const output = execSync(`gh release create "${version}" --title "${version}" --notes-file -`, {
357
+ cwd: projectPath,
358
+ encoding: 'utf8',
359
+ input: releaseNotes,
360
+ timeout: 30000,
361
+ }).trim();
362
+ return { success: true, url: output };
363
+ }
364
+ catch (error) {
365
+ return {
366
+ success: false,
367
+ error: error instanceof Error ? error.message : String(error),
368
+ };
369
+ }
370
+ }
371
+ /**
372
+ * Create or update a GitHub milestone linked to ADRs.
373
+ */
374
+ export function syncGitHubMilestone(projectPath, title, description, dueDate) {
375
+ try {
376
+ // Check if milestone exists
377
+ const existing = execSync(`gh api repos/{owner}/{repo}/milestones --jq '.[] | select(.title == "${title}") | .number'`, { cwd: projectPath, encoding: 'utf8', timeout: 10000 }).trim();
378
+ if (existing) {
379
+ // Update existing
380
+ const dueDateParam = dueDate ? ` -f due_on="${dueDate}T00:00:00Z"` : '';
381
+ execSync(`gh api repos/{owner}/{repo}/milestones/${existing} -X PATCH -f description="${description}"${dueDateParam}`, { cwd: projectPath, encoding: 'utf8', timeout: 10000 });
382
+ return { success: true, number: parseInt(existing, 10) };
383
+ }
384
+ else {
385
+ // Create new
386
+ const dueDateParam = dueDate ? ` -f due_on="${dueDate}T00:00:00Z"` : '';
387
+ const output = execSync(`gh api repos/{owner}/{repo}/milestones -f title="${title}" -f description="${description}"${dueDateParam} --jq '.number'`, { cwd: projectPath, encoding: 'utf8', timeout: 10000 }).trim();
388
+ return { success: true, number: parseInt(output, 10) };
389
+ }
390
+ }
391
+ catch (error) {
392
+ return {
393
+ success: false,
394
+ error: error instanceof Error ? error.message : String(error),
395
+ };
396
+ }
397
+ }
398
+ // ─── TODO.md Milestone Update ──────────────────────────────────────
399
+ /**
400
+ * Update milestone sections in TODO.md with ADR cross-references.
401
+ */
402
+ export function updateTodoMilestones(projectPath, milestones, adrs) {
403
+ const todoPath = join(projectPath, 'TODO.md');
404
+ if (!existsSync(todoPath)) {
405
+ // Create a new TODO.md with milestone structure
406
+ const content = generateTodoFromMilestones(milestones, adrs);
407
+ writeFileSync(todoPath, content, 'utf8');
408
+ return;
409
+ }
410
+ // Read existing and update milestone status comments
411
+ let content = readFileSync(todoPath, 'utf8');
412
+ // Add/update release tracking section at the end
413
+ const trackingSection = generateTrackingSection(milestones, adrs);
414
+ const trackingMarker = '<!-- RELEASE TRACKING -->';
415
+ const trackingEndMarker = '<!-- /RELEASE TRACKING -->';
416
+ if (content.includes(trackingMarker)) {
417
+ const startIdx = content.indexOf(trackingMarker);
418
+ const endIdx = content.indexOf(trackingEndMarker);
419
+ if (endIdx > startIdx) {
420
+ content =
421
+ content.substring(0, startIdx) +
422
+ trackingSection +
423
+ content.substring(endIdx + trackingEndMarker.length);
424
+ }
425
+ }
426
+ else {
427
+ content += '\n\n' + trackingSection;
428
+ }
429
+ writeFileSync(todoPath, content, 'utf8');
430
+ }
431
+ // ─── Cache Management ──────────────────────────────────────────────
432
+ /**
433
+ * Load cached release tracking state.
434
+ */
435
+ export function loadTrackingState(projectPath) {
436
+ const cachePath = getTrackingCachePath(projectPath);
437
+ if (!existsSync(cachePath))
438
+ return null;
439
+ try {
440
+ return JSON.parse(readFileSync(cachePath, 'utf8'));
441
+ }
442
+ catch {
443
+ return null;
444
+ }
445
+ }
446
+ /**
447
+ * Save release tracking state to cache.
448
+ */
449
+ export function saveTrackingState(projectPath, state) {
450
+ const cachePath = getTrackingCachePath(projectPath);
451
+ const cacheDir = join(cachePath, '..');
452
+ if (!existsSync(cacheDir)) {
453
+ mkdirSync(cacheDir, { recursive: true });
454
+ }
455
+ writeFileSync(cachePath, JSON.stringify(state, null, 2), 'utf8');
456
+ }
457
+ // ─── Next Release Preview ──────────────────────────────────────────
458
+ /**
459
+ * Preview what the next release would contain.
460
+ */
461
+ export async function previewNextRelease(projectPath, adrs, releases) {
462
+ let unreleaseCommits = [];
463
+ // Get commits since last tag
464
+ try {
465
+ const lastTag = releases.length > 0
466
+ ? releases[0].version
467
+ : execSync("git describe --tags --abbrev=0 2>/dev/null || echo ''", {
468
+ cwd: projectPath,
469
+ encoding: 'utf8',
470
+ timeout: 5000,
471
+ }).trim();
472
+ if (lastTag) {
473
+ unreleaseCommits = execSync(`git log ${lastTag}..HEAD --oneline 2>/dev/null`, {
474
+ cwd: projectPath,
475
+ encoding: 'utf8',
476
+ timeout: 5000,
477
+ })
478
+ .trim()
479
+ .split('\n')
480
+ .filter(l => l.trim());
481
+ }
482
+ else {
483
+ unreleaseCommits = execSync('git log --oneline -20 2>/dev/null', {
484
+ cwd: projectPath,
485
+ encoding: 'utf8',
486
+ timeout: 5000,
487
+ })
488
+ .trim()
489
+ .split('\n')
490
+ .filter(l => l.trim());
491
+ }
492
+ }
493
+ catch {
494
+ unreleaseCommits = [];
495
+ }
496
+ // Find ADRs not in any release
497
+ const releasedAdrFiles = new Set(releases.flatMap(r => r.adrs.map(a => a.adrFilename)));
498
+ const pendingAdrs = adrs.filter(a => !releasedAdrFiles.has(a.filename) && a.status.toLowerCase() === 'accepted');
499
+ // Get release readiness
500
+ const readiness = await analyzeReleaseReadiness({ projectPath });
501
+ // Suggest version bump
502
+ const hasBreaking = unreleaseCommits.some(c => c.includes('BREAKING') || c.includes('!:'));
503
+ const hasFeatures = unreleaseCommits.some(c => c.includes('feat:') || c.includes('feat('));
504
+ const suggestedVersion = hasBreaking ? 'major' : hasFeatures ? 'minor' : 'patch';
505
+ return { unreleaseCommits, pendingAdrs, readiness, suggestedVersion };
506
+ }
507
+ // ─── Private Helpers ───────────────────────────────────────────────
508
+ function getFirstCommit(projectPath) {
509
+ try {
510
+ return execSync('git rev-list --max-parents=0 HEAD', {
511
+ cwd: projectPath,
512
+ encoding: 'utf8',
513
+ timeout: 5000,
514
+ })
515
+ .trim()
516
+ .split('\n')[0]
517
+ .substring(0, 8);
518
+ }
519
+ catch {
520
+ return '';
521
+ }
522
+ }
523
+ function categorizeCommits(projectPath, from, to) {
524
+ const features = [];
525
+ const bugfixes = [];
526
+ const breakingChanges = [];
527
+ try {
528
+ const commits = execSync(`git log ${from}..${to} --format='%s' 2>/dev/null`, {
529
+ cwd: projectPath,
530
+ encoding: 'utf8',
531
+ timeout: 10000,
532
+ })
533
+ .trim()
534
+ .split('\n')
535
+ .filter(l => l.trim());
536
+ for (const msg of commits) {
537
+ const cleaned = msg.replace(/'/g, '');
538
+ if (/^feat[:(]/i.test(cleaned) || /add /i.test(cleaned)) {
539
+ features.push(cleaned);
540
+ }
541
+ else if (/^fix[:(]/i.test(cleaned)) {
542
+ bugfixes.push(cleaned);
543
+ }
544
+ if (/BREAKING|!:/i.test(cleaned)) {
545
+ breakingChanges.push(cleaned);
546
+ }
547
+ }
548
+ }
549
+ catch {
550
+ // Ignore git errors
551
+ }
552
+ return { features, bugfixes, breakingChanges };
553
+ }
554
+ function determineChangeType(adr, commits) {
555
+ if (adr.status.toLowerCase() === 'deprecated')
556
+ return 'deprecated';
557
+ if (commits.length === 1)
558
+ return 'introduced';
559
+ if (commits.length > 1)
560
+ return 'modified';
561
+ return 'implemented';
562
+ }
563
+ function determineChangeTypeFromStatus(status) {
564
+ const s = status.toLowerCase();
565
+ if (s === 'deprecated' || s === 'superseded')
566
+ return 'deprecated';
567
+ if (s === 'proposed' || s === 'draft')
568
+ return 'introduced';
569
+ if (s === 'accepted')
570
+ return 'implemented';
571
+ return 'modified';
572
+ }
573
+ function getTrackingCachePath(projectPath) {
574
+ const projectName = basename(projectPath);
575
+ return join(os.tmpdir(), projectName, 'cache', 'release-tracking.json');
576
+ }
577
+ function generateTodoFromMilestones(milestones, adrs) {
578
+ const lines = ['# TODO', '', '## Release Tracking', ''];
579
+ if (milestones.length > 0) {
580
+ for (const milestone of milestones) {
581
+ lines.push(`### ${milestone.name}`);
582
+ lines.push(`<!-- Completion: ${(milestone.completionRate * 100).toFixed(1)}% -->`);
583
+ lines.push('');
584
+ }
585
+ }
586
+ if (adrs.length > 0) {
587
+ lines.push('## ADR Implementation Status', '');
588
+ for (const adr of adrs) {
589
+ const isComplete = adr.status.toLowerCase() === 'accepted';
590
+ lines.push(`- [${isComplete ? 'x' : ' '}] ${adr.title} (${adr.filename})`);
591
+ }
592
+ lines.push('');
593
+ }
594
+ return lines.join('\n');
595
+ }
596
+ function generateTrackingSection(milestones, adrs) {
597
+ const lines = [
598
+ '<!-- RELEASE TRACKING -->',
599
+ '',
600
+ '## Release Tracking Status',
601
+ '',
602
+ `_Last updated: ${new Date().toISOString().split('T')[0]}_`,
603
+ '',
604
+ ];
605
+ if (milestones.length > 0) {
606
+ lines.push('### Milestone Progress');
607
+ lines.push('| Milestone | Progress | Completion |');
608
+ lines.push('|-----------|----------|------------|');
609
+ for (const m of milestones) {
610
+ const bar = `${'█'.repeat(Math.floor(m.completionRate * 10))}${'░'.repeat(10 - Math.floor(m.completionRate * 10))}`;
611
+ lines.push(`| ${m.name} | ${bar} | ${(m.completionRate * 100).toFixed(0)}% (${m.completed}/${m.total}) |`);
612
+ }
613
+ lines.push('');
614
+ }
615
+ const unmappedAdrs = adrs.filter(a => a.status.toLowerCase() !== 'deprecated' && a.status.toLowerCase() !== 'superseded');
616
+ if (unmappedAdrs.length > 0) {
617
+ lines.push('### ADR Status');
618
+ for (const adr of unmappedAdrs) {
619
+ lines.push(`- **${adr.title}**: ${adr.status}`);
620
+ }
621
+ lines.push('');
622
+ }
623
+ lines.push('<!-- /RELEASE TRACKING -->');
624
+ return lines.join('\n');
625
+ }
626
+ //# sourceMappingURL=release-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-tracker.js","sourceRoot":"","sources":["../../../src/utils/release-tracker.ts"],"names":[],"mappings":"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"}