mcp-adr-analysis-server 2.5.4 → 2.6.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.
Files changed (31) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/index.d.ts +1 -0
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js +74 -0
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/resources/todo-list-resource.d.ts +6 -0
  7. package/dist/src/resources/todo-list-resource.d.ts.map +1 -1
  8. package/dist/src/resources/todo-list-resource.js +55 -0
  9. package/dist/src/resources/todo-list-resource.js.map +1 -1
  10. package/dist/src/tools/generate-adr-todo-tool.d.ts +34 -0
  11. package/dist/src/tools/generate-adr-todo-tool.d.ts.map +1 -0
  12. package/dist/src/tools/generate-adr-todo-tool.js +292 -0
  13. package/dist/src/tools/generate-adr-todo-tool.js.map +1 -0
  14. package/dist/src/tools/release-tracking-tool.d.ts.map +1 -1
  15. package/dist/src/tools/release-tracking-tool.js +119 -21
  16. package/dist/src/tools/release-tracking-tool.js.map +1 -1
  17. package/dist/src/tools/tool-catalog.d.ts.map +1 -1
  18. package/dist/src/tools/tool-catalog.js +29 -0
  19. package/dist/src/tools/tool-catalog.js.map +1 -1
  20. package/dist/src/utils/adr-todo-generator.d.ts +77 -0
  21. package/dist/src/utils/adr-todo-generator.d.ts.map +1 -0
  22. package/dist/src/utils/adr-todo-generator.js +320 -0
  23. package/dist/src/utils/adr-todo-generator.js.map +1 -0
  24. package/dist/src/utils/local-milestone-store.d.ts +40 -0
  25. package/dist/src/utils/local-milestone-store.d.ts.map +1 -0
  26. package/dist/src/utils/local-milestone-store.js +185 -0
  27. package/dist/src/utils/local-milestone-store.js.map +1 -0
  28. package/dist/src/utils/release-readiness-detector.d.ts +8 -0
  29. package/dist/src/utils/release-readiness-detector.d.ts.map +1 -1
  30. package/dist/src/utils/release-readiness-detector.js.map +1 -1
  31. package/package.json +2 -2
@@ -0,0 +1,320 @@
1
+ /**
2
+ * ADR → TODO Decomposition
3
+ *
4
+ * Pure utilities for turning ADRs into TODO entries with stable IDs,
5
+ * idempotent merging, and a markdown render that mirrors the bounded-section
6
+ * pattern in `release-tracker.ts:580-596`.
7
+ *
8
+ * Tasks generated here always carry `adrId` so callers (e.g. `compare_adr_progress`)
9
+ * can correlate work against ADRs without name-matching guesswork.
10
+ */
11
+ import { slugify } from './local-milestone-store.js';
12
+ export const ADR_TODO_START_MARKER = '<!-- ADR-GENERATED-TASKS -->';
13
+ export const ADR_TODO_END_MARKER = '<!-- /ADR-GENERATED-TASKS -->';
14
+ export const STALE_HEADING = '## Stale Tasks';
15
+ const DEFAULT_PRIORITY = 'medium';
16
+ function priorityFromAdr(adr) {
17
+ const status = (adr.status || '').toLowerCase();
18
+ if (status === 'accepted')
19
+ return 'high';
20
+ if (status === 'proposed' || status === 'draft')
21
+ return 'medium';
22
+ return DEFAULT_PRIORITY;
23
+ }
24
+ /**
25
+ * Pull implementation steps out of an ADR. Strategy:
26
+ * 1. Look for explicit list items under a `## Decision` or `## Implementation` heading.
27
+ * 2. Fall back to top-level bullets in the `decision` field.
28
+ * 3. As a last resort, emit a single "Implement: <title>" step.
29
+ *
30
+ * No AI — this is intentionally deterministic so re-runs produce stable output.
31
+ */
32
+ function extractImplementationSteps(adr) {
33
+ const steps = [];
34
+ const seen = new Set();
35
+ const pushStep = (step) => {
36
+ const key = step.title.toLowerCase().trim();
37
+ if (!key || seen.has(key))
38
+ return;
39
+ seen.add(key);
40
+ steps.push(step);
41
+ };
42
+ const collectBullets = (text) => {
43
+ if (!text)
44
+ return [];
45
+ const bullets = [];
46
+ for (const rawLine of text.split('\n')) {
47
+ const line = rawLine.trim();
48
+ if (!line)
49
+ continue;
50
+ const m = line.match(/^[-*+]\s+(.+)$/) || line.match(/^\d+\.\s+(.+)$/);
51
+ if (m && m[1])
52
+ bullets.push(m[1].trim());
53
+ }
54
+ return bullets;
55
+ };
56
+ for (const bullet of collectBullets(adr.decision)) {
57
+ pushStep({ title: bullet });
58
+ }
59
+ if (steps.length === 0 && adr.content) {
60
+ // Look for ## Implementation, ## Action Items, ## Tasks. The `[^]` class
61
+ // matches any char including newlines (vs. `.` which excludes newlines)
62
+ // and the lookahead matches either the next `##` heading or end-of-string.
63
+ const implSection = adr.content.match(/^##\s*(?:Implementation|Action Items|Tasks|Implementation Plan)\s*\n([^]*?)(?=\n##\s|$(?![\r\n]))/im);
64
+ if (implSection && implSection[1]) {
65
+ for (const bullet of collectBullets(implSection[1])) {
66
+ pushStep({ title: bullet });
67
+ }
68
+ }
69
+ }
70
+ if (steps.length === 0) {
71
+ // Fall back to a single step that captures the decision intent
72
+ pushStep({
73
+ title: `Implement decision: ${adr.title}`,
74
+ description: adr.decision || adr.context || '',
75
+ });
76
+ }
77
+ return steps;
78
+ }
79
+ export function makeTaskId(adrId, title, phase) {
80
+ return `${slugify(adrId)}/${slugify(title) || 'task'}/${phase}`;
81
+ }
82
+ /**
83
+ * Decompose a single ADR into TODO tasks. Returns paired test+production tasks
84
+ * by default (matches the architecture doc's two-phase TDD design). Callers can
85
+ * narrow with `phase: 'production'` or `phase: 'test'`.
86
+ */
87
+ export function decomposeAdrToTasks(adr, options = {}) {
88
+ const phase = options.phase ?? 'both';
89
+ const defaultPriority = options.defaultPriority ?? priorityFromAdr(adr);
90
+ const generatedAt = options.generatedAt ?? new Date().toISOString();
91
+ const steps = extractImplementationSteps(adr);
92
+ const tasks = [];
93
+ const phasesToEmit = phase === 'both' ? ['test', 'production'] : [phase];
94
+ for (const step of steps) {
95
+ for (const tddPhase of phasesToEmit) {
96
+ const stepTitle = step.title.trim();
97
+ const title = tddPhase === 'test' ? `Write tests for: ${stepTitle}` : stepTitle;
98
+ const id = makeTaskId(adr.filename, stepTitle, tddPhase);
99
+ const priority = step.priority ?? defaultPriority;
100
+ const description = step.description ?? adr.decision ?? adr.context;
101
+ const effort = step.effort;
102
+ const category = step.category ?? adr.metadata?.category;
103
+ const task = {
104
+ id,
105
+ title,
106
+ status: 'pending',
107
+ adrId: adr.filename,
108
+ linkedAdrs: [adr.filename],
109
+ tddPhase,
110
+ createdAt: generatedAt,
111
+ updatedAt: generatedAt,
112
+ ...(priority !== undefined ? { priority } : {}),
113
+ ...(description !== undefined ? { description } : {}),
114
+ ...(effort !== undefined ? { effort } : {}),
115
+ ...(category !== undefined ? { category } : {}),
116
+ };
117
+ tasks.push(task);
118
+ }
119
+ }
120
+ return tasks;
121
+ }
122
+ /**
123
+ * Merge generated tasks with the existing TODO state. Stable ids drive matching.
124
+ * User edits to status / description / priority survive re-runs; freshly generated
125
+ * fields (effort, tddPhase) are refreshed.
126
+ */
127
+ export function mergeTodoTasks(existing, generated, options = {}) {
128
+ const generatedById = new Map();
129
+ for (const t of generated)
130
+ generatedById.set(t.id, t);
131
+ const merged = [];
132
+ const stale = [];
133
+ let preserved = 0;
134
+ let added = 0;
135
+ const seen = new Set();
136
+ for (const prior of existing) {
137
+ const gen = generatedById.get(prior.id);
138
+ if (gen) {
139
+ seen.add(prior.id);
140
+ preserved += 1;
141
+ const description = prior.description ?? gen.description;
142
+ const priority = prior.priority ?? gen.priority;
143
+ const createdAt = prior.createdAt ?? gen.createdAt;
144
+ const updatedAt = gen.updatedAt ?? new Date().toISOString();
145
+ const milestoneId = prior.milestoneId ?? gen.milestoneId;
146
+ const blended = {
147
+ ...gen,
148
+ status: prior.status, // user toggles win
149
+ ...(description !== undefined ? { description } : {}),
150
+ ...(priority !== undefined ? { priority } : {}),
151
+ ...(createdAt !== undefined ? { createdAt } : {}),
152
+ ...(updatedAt !== undefined ? { updatedAt } : {}),
153
+ ...(milestoneId !== undefined ? { milestoneId } : {}),
154
+ };
155
+ merged.push(blended);
156
+ continue;
157
+ }
158
+ // Not in newly generated set. Decide stale vs. carryover.
159
+ const adrId = prior.adrId;
160
+ const isAdrTask = !!adrId;
161
+ if (!isAdrTask) {
162
+ // Manual user task — never touched.
163
+ merged.push(prior);
164
+ continue;
165
+ }
166
+ const active = options.activeAdrIds;
167
+ const superseded = options.supersededAdrIds;
168
+ const isStale = (active && !active.has(adrId)) || (superseded && superseded.has(adrId));
169
+ if (isStale) {
170
+ stale.push(prior);
171
+ }
172
+ else {
173
+ // ADR still exists but step removed — keep it; user may still want it.
174
+ merged.push(prior);
175
+ }
176
+ }
177
+ for (const gen of generated) {
178
+ if (seen.has(gen.id))
179
+ continue;
180
+ merged.push(gen);
181
+ added += 1;
182
+ }
183
+ return { merged, stale, added, preserved };
184
+ }
185
+ function renderTask(task) {
186
+ const lines = [];
187
+ lines.push(`## ${task.title}`);
188
+ lines.push(`<!-- task-id: ${task.id} -->`);
189
+ if (task.adrId)
190
+ lines.push(`<!-- adr: ${task.adrId} -->`);
191
+ if (task.linkedAdrs && task.linkedAdrs.length > 1) {
192
+ lines.push(`<!-- linked-adrs: ${task.linkedAdrs.join(', ')} -->`);
193
+ }
194
+ if (task.tddPhase)
195
+ lines.push(`<!-- tdd: ${task.tddPhase} -->`);
196
+ if (task.milestoneId)
197
+ lines.push(`<!-- milestone: ${task.milestoneId} -->`);
198
+ lines.push(`**Status:** ${task.status}`);
199
+ if (task.priority)
200
+ lines.push(`**Priority:** ${task.priority}`);
201
+ if (task.effort)
202
+ lines.push(`**Effort:** ${task.effort}`);
203
+ if (task.category)
204
+ lines.push(`**Category:** ${task.category}`);
205
+ if (task.description) {
206
+ const desc = task.description.trim();
207
+ if (desc) {
208
+ lines.push('');
209
+ lines.push(desc);
210
+ }
211
+ }
212
+ lines.push('');
213
+ return lines.join('\n');
214
+ }
215
+ /**
216
+ * Render the bounded "ADR-generated tasks" section. Caller is responsible for
217
+ * splicing the result into TODO.md with the same start/end markers.
218
+ */
219
+ export function renderTodoSection(tasks, stale, options = {}) {
220
+ const generatedAt = options.generatedAt ?? new Date().toISOString();
221
+ const lines = [
222
+ ADR_TODO_START_MARKER,
223
+ '',
224
+ '<!-- This section is managed by `generate_adr_todo`. Tasks outside this',
225
+ ' bounded block are preserved verbatim across re-runs. Toggling Status -->',
226
+ `<!-- generated-at: ${generatedAt} -->`,
227
+ '',
228
+ '## ADR-Generated Tasks',
229
+ '',
230
+ ];
231
+ if (tasks.length === 0) {
232
+ lines.push('_No tasks generated. Add ADRs under your configured `adrDirectory` and re-run._', '');
233
+ }
234
+ else {
235
+ for (const task of tasks.filter(t => t.adrId)) {
236
+ lines.push(renderTask(task));
237
+ }
238
+ }
239
+ if (stale.length > 0) {
240
+ lines.push(STALE_HEADING, '');
241
+ lines.push('_Tasks whose source ADR has been deleted or marked `superseded`. Review and remove or re-link manually._', '');
242
+ for (const task of stale) {
243
+ lines.push(renderTask(task));
244
+ }
245
+ }
246
+ if (options.milestones && options.milestones.length > 0) {
247
+ lines.push('## Milestone Index', '');
248
+ for (const m of options.milestones) {
249
+ const id = m.id || slugify(m.name);
250
+ const linkedAdrs = m.linkedAdrIds && m.linkedAdrIds.length > 0 ? ` (ADRs: ${m.linkedAdrIds.join(', ')})` : '';
251
+ lines.push(`- **${m.name}** [${id}]${linkedAdrs}`);
252
+ }
253
+ lines.push('');
254
+ }
255
+ lines.push(ADR_TODO_END_MARKER);
256
+ return lines.join('\n');
257
+ }
258
+ /**
259
+ * Splice the rendered ADR-task section into existing TODO.md content.
260
+ * Manual content outside the bounded block is preserved verbatim, mirroring
261
+ * `updateTodoMilestones()` in `release-tracker.ts:580-596`.
262
+ */
263
+ export function spliceTodoSection(existingContent, section) {
264
+ if (!existingContent) {
265
+ return `# TODO\n\n${section}\n`;
266
+ }
267
+ const startIdx = existingContent.indexOf(ADR_TODO_START_MARKER);
268
+ const endIdx = existingContent.indexOf(ADR_TODO_END_MARKER);
269
+ if (startIdx >= 0 && endIdx > startIdx) {
270
+ return (existingContent.substring(0, startIdx) +
271
+ section +
272
+ existingContent.substring(endIdx + ADR_TODO_END_MARKER.length));
273
+ }
274
+ const sep = existingContent.endsWith('\n') ? '\n' : '\n\n';
275
+ return existingContent + sep + section + '\n';
276
+ }
277
+ /**
278
+ * Build a milestoneId → {linkedAdrIds, linkedTodoIds} map by name-matching
279
+ * milestones against ADR titles/contexts (mirrors `buildMilestoneMap()` in
280
+ * `release-tracker.ts:460-488`) and against generated tasks via their `adrId`.
281
+ */
282
+ export function linkTasksToMilestones(tasks, milestones, adrs) {
283
+ if (milestones.length === 0)
284
+ return { tasks, milestones };
285
+ const adrById = new Map(adrs.map(a => [a.filename, a]));
286
+ const updatedMilestones = milestones.map(m => ({
287
+ ...m,
288
+ id: m.id || slugify(m.name),
289
+ linkedAdrIds: [...(m.linkedAdrIds ?? [])],
290
+ linkedTodoIds: [...(m.linkedTodoIds ?? [])],
291
+ }));
292
+ for (const milestone of updatedMilestones) {
293
+ const milestoneName = milestone.name.toLowerCase();
294
+ for (const adr of adrs) {
295
+ const titleMatches = adr.title.toLowerCase().includes(milestoneName);
296
+ const contextMatches = (adr.context || '').toLowerCase().includes(milestoneName);
297
+ if (titleMatches || contextMatches) {
298
+ if (!milestone.linkedAdrIds.includes(adr.filename)) {
299
+ milestone.linkedAdrIds.push(adr.filename);
300
+ }
301
+ }
302
+ }
303
+ }
304
+ const updatedTasks = tasks.map(task => {
305
+ if (!task.adrId)
306
+ return task;
307
+ const owner = updatedMilestones.find(m => m.linkedAdrIds.includes(task.adrId));
308
+ if (!owner)
309
+ return task;
310
+ if (!owner.linkedTodoIds.includes(task.id)) {
311
+ owner.linkedTodoIds.push(task.id);
312
+ }
313
+ return { ...task, milestoneId: owner.id };
314
+ });
315
+ // adrById is intentionally retained for future enrichment (e.g. surfacing
316
+ // ADR titles in milestone descriptions); unused here to keep types narrow.
317
+ void adrById;
318
+ return { tasks: updatedTasks, milestones: updatedMilestones };
319
+ }
320
+ //# sourceMappingURL=adr-todo-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr-todo-generator.js","sourceRoot":"","sources":["../../../src/utils/adr-todo-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Local Milestone Store
3
+ *
4
+ * File-backed milestone persistence used when GitHub `gh` auth is unavailable
5
+ * or when the caller explicitly opts into a local-only workflow. Mirrors the
6
+ * markdown-bounded-section pattern proven in `release-tracker.ts:580-596`.
7
+ *
8
+ * - JSON index: `<projectPath>/.mcp-adr-cache/milestones.local.json`
9
+ * - Optional human-readable surface: `<projectPath>/RELEASE_PLAN.md`,
10
+ * bounded by `<!-- LOCAL MILESTONES -->...<!-- /LOCAL MILESTONES -->`.
11
+ */
12
+ import { MilestoneStatus } from './release-readiness-detector.js';
13
+ export declare const LOCAL_MILESTONE_DIR = ".mcp-adr-cache";
14
+ export declare const LOCAL_MILESTONE_FILE = "milestones.local.json";
15
+ export declare const RELEASE_PLAN_START_MARKER = "<!-- LOCAL MILESTONES -->";
16
+ export declare const RELEASE_PLAN_END_MARKER = "<!-- /LOCAL MILESTONES -->";
17
+ export interface LocalMilestoneStore {
18
+ version: '1.0';
19
+ updatedAt: string;
20
+ milestones: MilestoneStatus[];
21
+ }
22
+ export declare function slugify(input: string): string;
23
+ export declare function loadLocal(projectPath: string): LocalMilestoneStore;
24
+ export declare function listLocal(projectPath: string): MilestoneStatus[];
25
+ export declare function upsertLocal(projectPath: string, milestone: MilestoneStatus): MilestoneStatus;
26
+ export declare function markPushed(projectPath: string, id: string, githubNumber: number): MilestoneStatus | undefined;
27
+ export declare function removeLocal(projectPath: string, id: string): boolean;
28
+ /**
29
+ * Render a list of local milestones as a markdown section bounded by
30
+ * the LOCAL MILESTONES HTML-comment markers. Caller is responsible for
31
+ * splicing the result into RELEASE_PLAN.md (or another file).
32
+ */
33
+ export declare function renderLocalMilestonesMarkdown(milestones: MilestoneStatus[]): string;
34
+ /**
35
+ * Splice a milestone section into RELEASE_PLAN.md (or any markdown file),
36
+ * preserving any content outside the bounded markers. Creates the file if
37
+ * it does not yet exist.
38
+ */
39
+ export declare function writeReleasePlanFile(projectPath: string, milestones: MilestoneStatus[], filename?: string): string;
40
+ //# sourceMappingURL=local-milestone-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-milestone-store.d.ts","sourceRoot":"","sources":["../../../src/utils/local-milestone-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AACpD,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAC5D,eAAO,MAAM,yBAAyB,8BAA8B,CAAC;AACrE,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7C;AAMD,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CAelE;AAYD,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,EAAE,CAEhE;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,eAAe,CAsC5F;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,MAAM,GACnB,eAAe,GAAG,SAAS,CAW7B;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAOpE;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,MAAM,CAoCnF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,eAAe,EAAE,EAC7B,QAAQ,GAAE,MAA0B,GACnC,MAAM,CA0BR"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Local Milestone Store
3
+ *
4
+ * File-backed milestone persistence used when GitHub `gh` auth is unavailable
5
+ * or when the caller explicitly opts into a local-only workflow. Mirrors the
6
+ * markdown-bounded-section pattern proven in `release-tracker.ts:580-596`.
7
+ *
8
+ * - JSON index: `<projectPath>/.mcp-adr-cache/milestones.local.json`
9
+ * - Optional human-readable surface: `<projectPath>/RELEASE_PLAN.md`,
10
+ * bounded by `<!-- LOCAL MILESTONES -->...<!-- /LOCAL MILESTONES -->`.
11
+ */
12
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
13
+ import { dirname, join } from 'path';
14
+ export const LOCAL_MILESTONE_DIR = '.mcp-adr-cache';
15
+ export const LOCAL_MILESTONE_FILE = 'milestones.local.json';
16
+ export const RELEASE_PLAN_START_MARKER = '<!-- LOCAL MILESTONES -->';
17
+ export const RELEASE_PLAN_END_MARKER = '<!-- /LOCAL MILESTONES -->';
18
+ export function slugify(input) {
19
+ return input
20
+ .toLowerCase()
21
+ .replace(/[^a-z0-9]+/g, '-')
22
+ .replace(/^-+|-+$/g, '')
23
+ .slice(0, 80);
24
+ }
25
+ function getStorePath(projectPath) {
26
+ return join(projectPath, LOCAL_MILESTONE_DIR, LOCAL_MILESTONE_FILE);
27
+ }
28
+ export function loadLocal(projectPath) {
29
+ const storePath = getStorePath(projectPath);
30
+ if (!existsSync(storePath)) {
31
+ return { version: '1.0', updatedAt: new Date().toISOString(), milestones: [] };
32
+ }
33
+ try {
34
+ const raw = readFileSync(storePath, 'utf8');
35
+ const parsed = JSON.parse(raw);
36
+ if (!parsed || !Array.isArray(parsed.milestones)) {
37
+ return { version: '1.0', updatedAt: new Date().toISOString(), milestones: [] };
38
+ }
39
+ return parsed;
40
+ }
41
+ catch {
42
+ return { version: '1.0', updatedAt: new Date().toISOString(), milestones: [] };
43
+ }
44
+ }
45
+ function persist(projectPath, store) {
46
+ const storePath = getStorePath(projectPath);
47
+ const dir = dirname(storePath);
48
+ if (!existsSync(dir)) {
49
+ mkdirSync(dir, { recursive: true });
50
+ }
51
+ store.updatedAt = new Date().toISOString();
52
+ writeFileSync(storePath, JSON.stringify(store, null, 2), 'utf8');
53
+ }
54
+ export function listLocal(projectPath) {
55
+ return loadLocal(projectPath).milestones;
56
+ }
57
+ export function upsertLocal(projectPath, milestone) {
58
+ const store = loadLocal(projectPath);
59
+ const id = milestone.id || slugify(milestone.name);
60
+ const normalized = {
61
+ ...milestone,
62
+ id,
63
+ source: milestone.source ?? 'local',
64
+ pushed: milestone.pushed ?? false,
65
+ blockers: milestone.blockers ?? [],
66
+ linkedAdrIds: milestone.linkedAdrIds ?? [],
67
+ linkedTodoIds: milestone.linkedTodoIds ?? [],
68
+ };
69
+ const idx = store.milestones.findIndex(m => (m.id || slugify(m.name)) === id);
70
+ if (idx >= 0) {
71
+ const existing = store.milestones[idx];
72
+ const ghNumber = normalized.githubNumber ?? existing.githubNumber;
73
+ const merged = {
74
+ ...existing,
75
+ ...normalized,
76
+ // Preserve push state across upserts unless caller explicitly overrides it
77
+ pushed: normalized.pushed || existing.pushed || false,
78
+ // Merge link arrays so cross-references accumulate
79
+ linkedAdrIds: Array.from(new Set([...(existing.linkedAdrIds ?? []), ...(normalized.linkedAdrIds ?? [])])),
80
+ linkedTodoIds: Array.from(new Set([...(existing.linkedTodoIds ?? []), ...(normalized.linkedTodoIds ?? [])])),
81
+ ...(ghNumber !== undefined ? { githubNumber: ghNumber } : {}),
82
+ };
83
+ store.milestones[idx] = merged;
84
+ }
85
+ else {
86
+ store.milestones.push(normalized);
87
+ }
88
+ persist(projectPath, store);
89
+ return store.milestones.find(m => (m.id || slugify(m.name)) === id);
90
+ }
91
+ export function markPushed(projectPath, id, githubNumber) {
92
+ const store = loadLocal(projectPath);
93
+ const idx = store.milestones.findIndex(m => (m.id || slugify(m.name)) === id);
94
+ if (idx < 0)
95
+ return undefined;
96
+ store.milestones[idx] = {
97
+ ...store.milestones[idx],
98
+ pushed: true,
99
+ githubNumber,
100
+ };
101
+ persist(projectPath, store);
102
+ return store.milestones[idx];
103
+ }
104
+ export function removeLocal(projectPath, id) {
105
+ const store = loadLocal(projectPath);
106
+ const before = store.milestones.length;
107
+ store.milestones = store.milestones.filter(m => (m.id || slugify(m.name)) !== id);
108
+ if (store.milestones.length === before)
109
+ return false;
110
+ persist(projectPath, store);
111
+ return true;
112
+ }
113
+ /**
114
+ * Render a list of local milestones as a markdown section bounded by
115
+ * the LOCAL MILESTONES HTML-comment markers. Caller is responsible for
116
+ * splicing the result into RELEASE_PLAN.md (or another file).
117
+ */
118
+ export function renderLocalMilestonesMarkdown(milestones) {
119
+ const lines = [
120
+ RELEASE_PLAN_START_MARKER,
121
+ '',
122
+ '## Local Milestones',
123
+ '',
124
+ '_Synced from `.mcp-adr-cache/milestones.local.json`. Run `release_tracking` with `operation: "push_local_milestones"` to publish to GitHub._',
125
+ '',
126
+ ];
127
+ if (milestones.length === 0) {
128
+ lines.push('_No local milestones yet._', '');
129
+ }
130
+ else {
131
+ for (const m of milestones) {
132
+ const id = m.id || slugify(m.name);
133
+ const status = m.pushed ? `pushed (#${m.githubNumber ?? '?'})` : 'local-only';
134
+ lines.push(`### ${m.name}`);
135
+ lines.push(`<!-- milestone-id: ${id} -->`);
136
+ lines.push(`- **Status:** ${status}`);
137
+ if (m.dueDate)
138
+ lines.push(`- **Due:** ${m.dueDate}`);
139
+ if (typeof m.completed === 'number' && typeof m.total === 'number' && m.total > 0) {
140
+ const pct = (m.completionRate * 100).toFixed(1);
141
+ lines.push(`- **Progress:** ${m.completed}/${m.total} (${pct}%)`);
142
+ }
143
+ if (m.linkedAdrIds && m.linkedAdrIds.length > 0) {
144
+ lines.push(`- **Linked ADRs:** ${m.linkedAdrIds.join(', ')}`);
145
+ }
146
+ if (m.description) {
147
+ lines.push('', m.description);
148
+ }
149
+ lines.push('');
150
+ }
151
+ }
152
+ lines.push(RELEASE_PLAN_END_MARKER);
153
+ return lines.join('\n');
154
+ }
155
+ /**
156
+ * Splice a milestone section into RELEASE_PLAN.md (or any markdown file),
157
+ * preserving any content outside the bounded markers. Creates the file if
158
+ * it does not yet exist.
159
+ */
160
+ export function writeReleasePlanFile(projectPath, milestones, filename = 'RELEASE_PLAN.md') {
161
+ const fullPath = join(projectPath, filename);
162
+ const section = renderLocalMilestonesMarkdown(milestones);
163
+ if (!existsSync(fullPath)) {
164
+ const content = `# Release Plan\n\n${section}\n`;
165
+ writeFileSync(fullPath, content, 'utf8');
166
+ return fullPath;
167
+ }
168
+ let content = readFileSync(fullPath, 'utf8');
169
+ const startIdx = content.indexOf(RELEASE_PLAN_START_MARKER);
170
+ const endIdx = content.indexOf(RELEASE_PLAN_END_MARKER);
171
+ if (startIdx >= 0 && endIdx > startIdx) {
172
+ content =
173
+ content.substring(0, startIdx) +
174
+ section +
175
+ content.substring(endIdx + RELEASE_PLAN_END_MARKER.length);
176
+ }
177
+ else {
178
+ if (!content.endsWith('\n'))
179
+ content += '\n';
180
+ content += '\n' + section + '\n';
181
+ }
182
+ writeFileSync(fullPath, content, 'utf8');
183
+ return fullPath;
184
+ }
185
+ //# sourceMappingURL=local-milestone-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-milestone-store.js","sourceRoot":"","sources":["../../../src/utils/local-milestone-store.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,14 @@ export interface MilestoneStatus {
29
29
  completionRate: number;
30
30
  criticalTodos: number;
31
31
  blockers: string[];
32
+ id?: string;
33
+ description?: string;
34
+ dueDate?: string;
35
+ linkedAdrIds?: string[];
36
+ linkedTodoIds?: string[];
37
+ source?: 'github' | 'local' | 'todo';
38
+ githubNumber?: number;
39
+ pushed?: boolean;
32
40
  }
33
41
  export interface ReleaseReadinessOptions {
34
42
  projectPath: string;
@@ -1 +1 @@
1
- {"version":3,"file":"release-readiness-detector.d.ts","sourceRoot":"","sources":["../../../src/utils/release-readiness-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EACA,gBAAgB,GAChB,qBAAqB,GACrB,eAAe,GACf,iBAAiB,GACjB,eAAe,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAqEjC;AAmaD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC7C,OAAO,CAAC,sBAAsB,CAAC,CA6BjC"}
1
+ {"version":3,"file":"release-readiness-detector.d.ts","sourceRoot":"","sources":["../../../src/utils/release-readiness-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EACA,gBAAgB,GAChB,qBAAqB,GACrB,eAAe,GACf,iBAAiB,GACjB,eAAe,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAqEjC;AAmaD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAO,CAAC,uBAAuB,CAAM,GAC7C,OAAO,CAAC,sBAAsB,CAAC,CA6BjC"}