@muzzamil-khan/redmine-agent-mcp 1.1.0 → 1.2.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 (36) hide show
  1. package/dist/mcp/server.js +93 -4
  2. package/dist/mcp/server.js.map +1 -1
  3. package/dist/services/redmine.d.ts +20 -0
  4. package/dist/services/redmine.d.ts.map +1 -1
  5. package/dist/services/redmine.js +38 -0
  6. package/dist/services/redmine.js.map +1 -1
  7. package/dist/services/redmineConfig.d.ts +5 -0
  8. package/dist/services/redmineConfig.d.ts.map +1 -1
  9. package/dist/services/redmineConfig.js +31 -2
  10. package/dist/services/redmineConfig.js.map +1 -1
  11. package/dist/spreadsheet/batchColumnMapping.d.ts.map +1 -1
  12. package/dist/spreadsheet/batchColumnMapping.js +6 -0
  13. package/dist/spreadsheet/batchColumnMapping.js.map +1 -1
  14. package/dist/spreadsheet/batchCreationTypes.d.ts +3 -0
  15. package/dist/spreadsheet/batchCreationTypes.d.ts.map +1 -1
  16. package/dist/spreadsheet/batchIssueConfig.d.ts +5 -0
  17. package/dist/spreadsheet/batchIssueConfig.d.ts.map +1 -1
  18. package/dist/spreadsheet/batchIssueConfig.js +34 -1
  19. package/dist/spreadsheet/batchIssueConfig.js.map +1 -1
  20. package/dist/spreadsheet/batchPreviewFormat.d.ts +2 -0
  21. package/dist/spreadsheet/batchPreviewFormat.d.ts.map +1 -1
  22. package/dist/spreadsheet/batchPreviewFormat.js +4 -0
  23. package/dist/spreadsheet/batchPreviewFormat.js.map +1 -1
  24. package/dist/spreadsheet/bulkUpdateExtract.d.ts +14 -0
  25. package/dist/spreadsheet/bulkUpdateExtract.d.ts.map +1 -0
  26. package/dist/spreadsheet/bulkUpdateExtract.js +83 -0
  27. package/dist/spreadsheet/bulkUpdateExtract.js.map +1 -0
  28. package/dist/workflows/batchCreateIssuesWorkflow.d.ts +5 -2
  29. package/dist/workflows/batchCreateIssuesWorkflow.d.ts.map +1 -1
  30. package/dist/workflows/batchCreateIssuesWorkflow.js +101 -13
  31. package/dist/workflows/batchCreateIssuesWorkflow.js.map +1 -1
  32. package/dist/workflows/bulkUpdateIssuesWorkflow.d.ts +21 -0
  33. package/dist/workflows/bulkUpdateIssuesWorkflow.d.ts.map +1 -0
  34. package/dist/workflows/bulkUpdateIssuesWorkflow.js +384 -0
  35. package/dist/workflows/bulkUpdateIssuesWorkflow.js.map +1 -0
  36. package/package.json +1 -1
@@ -0,0 +1,384 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { resolve } from "node:path";
3
+ import { extractRawBatchSheet } from "../spreadsheet/extractRawBatchSheet.js";
4
+ import { BATCH_COLUMN_FIELD_SCHEMA, buildMappingPreview, suggestColumnMappingFromHeaders, validateColumnMapping, } from "../spreadsheet/batchColumnMapping.js";
5
+ import { extractBulkUpdateTasksFromSheet, } from "../spreadsheet/bulkUpdateExtract.js";
6
+ import { getIssueById, listProjectIssues, patchIssueFields, getProjects, } from "../services/redmine.js";
7
+ import { enumerationOptions, loadRedmineConfig, resolveStatus, } from "../services/redmineConfig.js";
8
+ import { parseProjectSelection } from "./issueCreationHelpers.js";
9
+ function normalizeText(value) {
10
+ return value.replace(/\r\n/g, "\n").trim();
11
+ }
12
+ async function loadCsvContent(input) {
13
+ if (input.csvContent?.trim()) {
14
+ return { content: input.csvContent };
15
+ }
16
+ if (input.csvPath?.trim()) {
17
+ try {
18
+ const path = resolve(input.csvPath.trim());
19
+ const content = await readFile(path, "utf8");
20
+ return { content };
21
+ }
22
+ catch {
23
+ return { error: `Could not read csvPath: ${input.csvPath}` };
24
+ }
25
+ }
26
+ return { error: "Provide csvContent, csvPath, or updates[]" };
27
+ }
28
+ async function loadProjectOptions() {
29
+ const projectsData = await getProjects();
30
+ const projects = (projectsData.projects ?? []);
31
+ return projects.map((p) => `${p.id} — ${p.name}`);
32
+ }
33
+ function resolveStatusId(label, config, fixes) {
34
+ if (!label?.trim())
35
+ return {};
36
+ const fix = fixes?.[label.trim()];
37
+ const resolved = resolveStatus(fix ?? label, config);
38
+ if (!resolved) {
39
+ return { error: `Unknown status "${label}"` };
40
+ }
41
+ return { statusId: resolved.id, statusName: resolved.name };
42
+ }
43
+ function buildSubjectIndex(issues) {
44
+ const map = new Map();
45
+ for (const issue of issues) {
46
+ const key = issue.subject.trim().toLowerCase();
47
+ const list = map.get(key) ?? [];
48
+ list.push(issue);
49
+ map.set(key, list);
50
+ }
51
+ return map;
52
+ }
53
+ async function fetchIssueSummary(issueId) {
54
+ try {
55
+ const data = await getIssueById(issueId);
56
+ const issue = data.issue;
57
+ return issue?.id ? issue : undefined;
58
+ }
59
+ catch {
60
+ return undefined;
61
+ }
62
+ }
63
+ async function resolveUpdates(params) {
64
+ const projectIssues = await listProjectIssues(params.projectId);
65
+ const bySubject = buildSubjectIndex(projectIssues);
66
+ const resolved = [];
67
+ const notFound = [];
68
+ const ambiguous = [];
69
+ const statusErrors = [];
70
+ for (const task of params.tasks) {
71
+ let issue;
72
+ let matchBy = "subject";
73
+ if (task.issueId !== undefined) {
74
+ issue =
75
+ projectIssues.find((i) => i.id === task.issueId) ??
76
+ (await fetchIssueSummary(task.issueId));
77
+ matchBy = "issueId";
78
+ if (!issue) {
79
+ notFound.push(task);
80
+ continue;
81
+ }
82
+ }
83
+ else {
84
+ const matches = bySubject.get(task.subject.trim().toLowerCase()) ?? [];
85
+ if (matches.length === 0) {
86
+ notFound.push(task);
87
+ continue;
88
+ }
89
+ if (matches.length > 1) {
90
+ ambiguous.push({
91
+ task,
92
+ issueIds: matches.map((m) => m.id),
93
+ });
94
+ continue;
95
+ }
96
+ issue = matches[0];
97
+ }
98
+ if (!issue)
99
+ continue;
100
+ const statusResult = resolveStatusId(task.statusLabel, params.config, params.statusNameFixes);
101
+ if (statusResult.error && task.statusLabel) {
102
+ statusErrors.push({ task, label: task.statusLabel });
103
+ }
104
+ const currentDescription = normalizeText(issue.description ?? "");
105
+ const newDescription = task.description !== undefined
106
+ ? normalizeText(task.description)
107
+ : undefined;
108
+ const descriptionChanged = newDescription !== undefined &&
109
+ newDescription !== currentDescription;
110
+ const statusChanged = statusResult.statusId !== undefined &&
111
+ statusResult.statusId !== issue.status.id;
112
+ if (!descriptionChanged && !statusChanged)
113
+ continue;
114
+ resolved.push({
115
+ sheetRow: task.sheetRow,
116
+ issueId: issue.id,
117
+ subject: issue.subject,
118
+ currentStatus: issue.status.name,
119
+ ...(statusResult.statusName
120
+ ? { newStatus: statusResult.statusName }
121
+ : {}),
122
+ ...(statusResult.statusId ? { statusId: statusResult.statusId } : {}),
123
+ currentDescription,
124
+ ...(newDescription !== undefined ? { newDescription } : {}),
125
+ descriptionChanged,
126
+ statusChanged,
127
+ matchBy,
128
+ });
129
+ }
130
+ return { resolved, notFound, ambiguous, statusErrors };
131
+ }
132
+ function buildPreviewText(resolved) {
133
+ const lines = [
134
+ "══════════════════════════════════════════════════════════════",
135
+ " BULK UPDATE — preview (description + status)",
136
+ "══════════════════════════════════════════════════════════════",
137
+ "",
138
+ `Will update ${resolved.length} issue(s):`,
139
+ "",
140
+ ];
141
+ for (const row of resolved) {
142
+ const loc = row.sheetRow ? `row ${row.sheetRow}` : row.subject;
143
+ lines.push(`#${row.issueId} · ${loc}`);
144
+ if (row.descriptionChanged) {
145
+ lines.push(` description: ${row.currentDescription.length}ch → ${(row.newDescription ?? "").length}ch`);
146
+ }
147
+ if (row.statusChanged) {
148
+ lines.push(` status: ${row.currentStatus} → ${row.newStatus ?? "?"}`);
149
+ }
150
+ lines.push("");
151
+ }
152
+ return lines.join("\n").trimEnd();
153
+ }
154
+ function tasksFromDirectUpdates(updates) {
155
+ return updates.map((u, i) => ({
156
+ sheetRow: i + 1,
157
+ subject: u.subject.trim(),
158
+ ...(u.description !== undefined ? { description: u.description } : {}),
159
+ ...(u.status !== undefined ? { statusLabel: u.status } : {}),
160
+ ...(u.issueId !== undefined ? { issueId: u.issueId } : {}),
161
+ }));
162
+ }
163
+ export async function bulkUpdateIssuesWorkflow(input) {
164
+ if (input.previewAction === "cancel" || input.confirmSave === "no") {
165
+ return { success: false, error: "Bulk update cancelled." };
166
+ }
167
+ const config = await loadRedmineConfig();
168
+ if (!input.project?.trim()) {
169
+ const projectOptions = await loadProjectOptions();
170
+ return {
171
+ success: false,
172
+ needsInput: true,
173
+ question: {
174
+ field: "project",
175
+ question: "Select the Redmine project for bulk update *",
176
+ options: projectOptions,
177
+ },
178
+ data: {
179
+ step: "pick_project",
180
+ projectOptions,
181
+ hint: "Retry with project (id or \"id — name\").",
182
+ },
183
+ };
184
+ }
185
+ const projectId = parseProjectSelection(input.project);
186
+ let tasks = [];
187
+ let rawSheet;
188
+ if (input.updates?.length) {
189
+ tasks = tasksFromDirectUpdates(input.updates);
190
+ }
191
+ else {
192
+ const loaded = await loadCsvContent(input);
193
+ if (loaded.error || !loaded.content) {
194
+ return { success: false, error: loaded.error ?? "No CSV content" };
195
+ }
196
+ rawSheet = extractRawBatchSheet(loaded.content);
197
+ if (!input.columnMapping) {
198
+ const suggested = suggestColumnMappingFromHeaders(rawSheet.detectedHeaders, rawSheet.detectedHeaderRowIndex);
199
+ return {
200
+ success: false,
201
+ needsInput: true,
202
+ question: {
203
+ field: "columnMapping",
204
+ question: "Use suggestedColumnMapping for bulk update, then retry with columnMapping.",
205
+ },
206
+ data: {
207
+ step: "map_columns",
208
+ project: projectId,
209
+ suggestedColumnMapping: suggested,
210
+ detectedHeaderRowIndex: rawSheet.detectedHeaderRowIndex,
211
+ detectedHeaders: rawSheet.detectedHeaders,
212
+ fieldSchema: BATCH_COLUMN_FIELD_SCHEMA,
213
+ hint: "Match tasks by Ticket:#id when present, else exact task title (subtask column) in project.",
214
+ },
215
+ };
216
+ }
217
+ if (!input.confirmMappingAction) {
218
+ const validation = validateColumnMapping(rawSheet, input.columnMapping);
219
+ if (!validation.valid) {
220
+ return {
221
+ success: false,
222
+ error: validation.problems.map((p) => p.issue).join("; "),
223
+ data: { step: "fix_column_mapping", problems: validation.problems },
224
+ };
225
+ }
226
+ return {
227
+ success: false,
228
+ needsInput: true,
229
+ questions: [
230
+ {
231
+ id: "confirm-column-mapping",
232
+ field: "confirmMappingAction",
233
+ question: "Use this column mapping to read task titles, descriptions, and statuses from the sheet?",
234
+ options: ["proceed with this mapping", "change mapping"],
235
+ },
236
+ ],
237
+ data: {
238
+ batchMode: true,
239
+ step: "confirm_mapping",
240
+ mappingPreview: buildMappingPreview(input.columnMapping, validation.detectedHeaders),
241
+ hint: "Retry with confirmMappingAction: \"proceed\".",
242
+ },
243
+ };
244
+ }
245
+ const extracted = extractBulkUpdateTasksFromSheet(rawSheet, input.columnMapping);
246
+ if (extracted.warnings.length) {
247
+ return {
248
+ success: false,
249
+ error: extracted.warnings.join("; "),
250
+ };
251
+ }
252
+ tasks = extracted.tasks;
253
+ }
254
+ if (tasks.length === 0) {
255
+ return { success: false, error: "No task rows to update." };
256
+ }
257
+ const { resolved, notFound, ambiguous, statusErrors } = await resolveUpdates({
258
+ tasks,
259
+ projectId,
260
+ config,
261
+ ...(input.statusNameFixes ? { statusNameFixes: input.statusNameFixes } : {}),
262
+ });
263
+ if (statusErrors.length > 0 && !input.statusNameFixes) {
264
+ return {
265
+ success: false,
266
+ needsInput: true,
267
+ questions: statusErrors.map((e) => ({
268
+ id: `status-${e.label}`,
269
+ field: `statusNameFixes.${e.label}`,
270
+ question: `Status "${e.label}" on row ${e.task.sheetRow} is not recognized. Pick a Redmine status.`,
271
+ options: enumerationOptions(config.statuses),
272
+ })),
273
+ data: {
274
+ step: "fix_status_gaps",
275
+ statusErrors: statusErrors.map((e) => ({
276
+ label: e.label,
277
+ sheetRow: e.task.sheetRow,
278
+ subject: e.task.subject,
279
+ })),
280
+ hint: "Retry with statusNameFixes, then preview again.",
281
+ },
282
+ };
283
+ }
284
+ if (ambiguous.length > 0) {
285
+ return {
286
+ success: false,
287
+ error: "Ambiguous subject matches — add Ticket:#id on the sheet or pass issueId in updates[].",
288
+ data: {
289
+ ambiguous: ambiguous.map((a) => ({
290
+ sheetRow: a.task.sheetRow,
291
+ subject: a.task.subject,
292
+ issueIds: a.issueIds,
293
+ })),
294
+ },
295
+ };
296
+ }
297
+ const previewText = buildPreviewText(resolved);
298
+ const unchangedCount = tasks.length - resolved.length - notFound.length;
299
+ if (input.previewAction !== "proceed" &&
300
+ input.confirmSave !== "yes") {
301
+ return {
302
+ success: false,
303
+ needsInput: true,
304
+ question: {
305
+ field: "previewAction",
306
+ question: `${resolved.length} issue(s) will be updated. ${notFound.length} not found. ${unchangedCount} already match.`,
307
+ options: ["show_preview", "proceed", "cancel"],
308
+ },
309
+ data: {
310
+ step: "preview_gate",
311
+ previewText,
312
+ previewSummary: previewText,
313
+ updateCount: resolved.length,
314
+ notFound: notFound.map((t) => ({
315
+ sheetRow: t.sheetRow,
316
+ subject: t.subject,
317
+ issueId: t.issueId,
318
+ })),
319
+ unchangedCount,
320
+ resolved,
321
+ hint: "Post previewText, then AskQuestion yes/no. Apply with previewAction: \"proceed\".",
322
+ },
323
+ };
324
+ }
325
+ if (resolved.length === 0) {
326
+ return {
327
+ success: true,
328
+ data: {
329
+ updated: [],
330
+ notFound: notFound.map((t) => ({
331
+ sheetRow: t.sheetRow,
332
+ subject: t.subject,
333
+ })),
334
+ message: "No changes needed — all matched issues already match the sheet.",
335
+ },
336
+ };
337
+ }
338
+ const updated = [];
339
+ const failed = [];
340
+ for (const row of resolved) {
341
+ try {
342
+ await patchIssueFields({
343
+ issueId: row.issueId,
344
+ ...(row.descriptionChanged && row.newDescription !== undefined
345
+ ? { description: row.newDescription }
346
+ : {}),
347
+ ...(row.statusChanged && row.statusId !== undefined
348
+ ? { statusId: row.statusId }
349
+ : {}),
350
+ });
351
+ updated.push({
352
+ issueId: row.issueId,
353
+ subject: row.subject,
354
+ descriptionUpdated: row.descriptionChanged,
355
+ statusUpdated: row.statusChanged,
356
+ });
357
+ }
358
+ catch (error) {
359
+ failed.push({
360
+ issueId: row.issueId,
361
+ subject: row.subject,
362
+ error: error instanceof Error ? error.message : String(error),
363
+ });
364
+ }
365
+ }
366
+ return {
367
+ success: failed.length === 0,
368
+ ...(failed.length > 0
369
+ ? {
370
+ error: `${failed.length} update(s) failed; ${updated.length} succeeded`,
371
+ }
372
+ : {}),
373
+ data: {
374
+ project: projectId,
375
+ updated,
376
+ failed,
377
+ notFound: notFound.map((t) => ({
378
+ sheetRow: t.sheetRow,
379
+ subject: t.subject,
380
+ })),
381
+ },
382
+ };
383
+ }
384
+ //# sourceMappingURL=bulkUpdateIssuesWorkflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulkUpdateIssuesWorkflow.js","sourceRoot":"","sources":["../../src/workflows/bulkUpdateIssuesWorkflow.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muzzamil-khan/redmine-agent-mcp",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Redmine MCP server for batch time logging and ticket creation",
5
5
  "main": "dist/mcp/server.js",
6
6
  "type": "module",