@pschroee/redmine-mcp 0.5.11 → 0.5.14
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/formatters/issue.js +43 -3
- package/dist/redmine/types.d.ts +4 -0
- package/package.json +1 -1
package/dist/formatters/issue.js
CHANGED
|
@@ -144,9 +144,29 @@ export function formatIssueList(response) {
|
|
|
144
144
|
lines.push("No issues found.");
|
|
145
145
|
return lines.join("\n");
|
|
146
146
|
}
|
|
147
|
+
// Collect all unique custom field names (preserving order by ID)
|
|
148
|
+
const customFieldMap = new Map(); // id -> name
|
|
149
|
+
for (const issue of issues) {
|
|
150
|
+
if (issue.custom_fields) {
|
|
151
|
+
for (const cf of issue.custom_fields) {
|
|
152
|
+
if (!customFieldMap.has(cf.id)) {
|
|
153
|
+
customFieldMap.set(cf.id, cf.name);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const customFieldIds = Array.from(customFieldMap.keys()).sort((a, b) => a - b);
|
|
159
|
+
const customFieldNames = customFieldIds.map(id => customFieldMap.get(id));
|
|
160
|
+
// Check if any issue has tags
|
|
161
|
+
const hasTags = issues.some(issue => issue.tags && issue.tags.length > 0);
|
|
147
162
|
// Table header
|
|
148
|
-
|
|
149
|
-
|
|
163
|
+
const headerCols = ["ID", "Subject", "Status", "Priority", "Assigned", "Version", "Created", "Updated"];
|
|
164
|
+
if (hasTags) {
|
|
165
|
+
headerCols.push("Tags");
|
|
166
|
+
}
|
|
167
|
+
headerCols.push(...customFieldNames);
|
|
168
|
+
lines.push("| " + headerCols.join(" | ") + " |");
|
|
169
|
+
lines.push("|" + headerCols.map(() => "---").join("|") + "|");
|
|
150
170
|
// Table rows
|
|
151
171
|
for (const issue of issues) {
|
|
152
172
|
const id = `#${issue.id}`;
|
|
@@ -154,8 +174,28 @@ export function formatIssueList(response) {
|
|
|
154
174
|
const status = issue.status.name;
|
|
155
175
|
const priority = issue.priority.name;
|
|
156
176
|
const assigned = issue.assigned_to?.name ?? "_(unassigned)_";
|
|
177
|
+
const version = issue.fixed_version?.name ?? "";
|
|
178
|
+
const created = formatDateShort(issue.created_on);
|
|
157
179
|
const updated = formatDateShort(issue.updated_on);
|
|
158
|
-
|
|
180
|
+
const tags = issue.tags?.map(t => t.name).join(", ") ?? "";
|
|
181
|
+
// Build custom field values in order
|
|
182
|
+
const cfValues = [];
|
|
183
|
+
for (const cfId of customFieldIds) {
|
|
184
|
+
const cf = issue.custom_fields?.find(f => f.id === cfId);
|
|
185
|
+
if (cf) {
|
|
186
|
+
const value = Array.isArray(cf.value) ? cf.value.join(", ") : cf.value;
|
|
187
|
+
cfValues.push(value || "");
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
cfValues.push("");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const cols = [id, subject, status, priority, assigned, version, created, updated];
|
|
194
|
+
if (hasTags) {
|
|
195
|
+
cols.push(tags);
|
|
196
|
+
}
|
|
197
|
+
cols.push(...cfValues);
|
|
198
|
+
lines.push("| " + cols.join(" | ") + " |");
|
|
159
199
|
}
|
|
160
200
|
return lines.join("\n");
|
|
161
201
|
}
|
package/dist/redmine/types.d.ts
CHANGED
|
@@ -237,6 +237,10 @@ export interface RedmineIssue {
|
|
|
237
237
|
total_estimated_hours?: number;
|
|
238
238
|
total_spent_hours?: number;
|
|
239
239
|
custom_fields?: RedmineCustomFieldValue[];
|
|
240
|
+
tags?: {
|
|
241
|
+
id: number;
|
|
242
|
+
name: string;
|
|
243
|
+
}[];
|
|
240
244
|
created_on: string;
|
|
241
245
|
updated_on: string;
|
|
242
246
|
closed_on?: string;
|