mcp-adr-analysis-server 2.5.3 → 2.6.3
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/dist/.tsbuildinfo +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +74 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/resources/todo-list-resource.d.ts +6 -0
- package/dist/src/resources/todo-list-resource.d.ts.map +1 -1
- package/dist/src/resources/todo-list-resource.js +55 -0
- package/dist/src/resources/todo-list-resource.js.map +1 -1
- package/dist/src/tools/generate-adr-todo-tool.d.ts +34 -0
- package/dist/src/tools/generate-adr-todo-tool.d.ts.map +1 -0
- package/dist/src/tools/generate-adr-todo-tool.js +292 -0
- package/dist/src/tools/generate-adr-todo-tool.js.map +1 -0
- package/dist/src/tools/release-tracking-tool.d.ts.map +1 -1
- package/dist/src/tools/release-tracking-tool.js +119 -21
- package/dist/src/tools/release-tracking-tool.js.map +1 -1
- package/dist/src/tools/tool-catalog.d.ts.map +1 -1
- package/dist/src/tools/tool-catalog.js +29 -0
- package/dist/src/tools/tool-catalog.js.map +1 -1
- package/dist/src/utils/adr-todo-generator.d.ts +77 -0
- package/dist/src/utils/adr-todo-generator.d.ts.map +1 -0
- package/dist/src/utils/adr-todo-generator.js +320 -0
- package/dist/src/utils/adr-todo-generator.js.map +1 -0
- package/dist/src/utils/local-milestone-store.d.ts +40 -0
- package/dist/src/utils/local-milestone-store.d.ts.map +1 -0
- package/dist/src/utils/local-milestone-store.js +185 -0
- package/dist/src/utils/local-milestone-store.js.map +1 -0
- package/dist/src/utils/release-readiness-detector.d.ts +8 -0
- package/dist/src/utils/release-readiness-detector.d.ts.map +1 -1
- package/dist/src/utils/release-readiness-detector.js.map +1 -1
- package/package.json +5 -4
|
@@ -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;
|
|
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"}
|