@muzzamil-khan/redmine-agent-mcp 1.0.0 → 1.1.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 (111) hide show
  1. package/dist/config/env.d.ts +2 -0
  2. package/dist/config/env.d.ts.map +1 -1
  3. package/dist/config/env.js +8 -0
  4. package/dist/config/env.js.map +1 -1
  5. package/dist/mcp/server.js +630 -147
  6. package/dist/mcp/server.js.map +1 -1
  7. package/dist/services/assigneeDirectory.d.ts +34 -0
  8. package/dist/services/assigneeDirectory.d.ts.map +1 -0
  9. package/dist/services/assigneeDirectory.js +138 -0
  10. package/dist/services/assigneeDirectory.js.map +1 -0
  11. package/dist/services/googleSheets.d.ts +32 -0
  12. package/dist/services/googleSheets.d.ts.map +1 -0
  13. package/dist/services/googleSheets.js +109 -0
  14. package/dist/services/googleSheets.js.map +1 -0
  15. package/dist/services/redmine.d.ts +52 -0
  16. package/dist/services/redmine.d.ts.map +1 -1
  17. package/dist/services/redmine.js +103 -0
  18. package/dist/services/redmine.js.map +1 -1
  19. package/dist/services/redmineConfig.d.ts +85 -0
  20. package/dist/services/redmineConfig.d.ts.map +1 -0
  21. package/dist/services/redmineConfig.js +271 -0
  22. package/dist/services/redmineConfig.js.map +1 -0
  23. package/dist/spreadsheet/batchColumnMapping.d.ts +93 -0
  24. package/dist/spreadsheet/batchColumnMapping.d.ts.map +1 -0
  25. package/dist/spreadsheet/batchColumnMapping.js +660 -0
  26. package/dist/spreadsheet/batchColumnMapping.js.map +1 -0
  27. package/dist/spreadsheet/batchCreationTypes.d.ts +58 -0
  28. package/dist/spreadsheet/batchCreationTypes.d.ts.map +1 -0
  29. package/dist/spreadsheet/batchCreationTypes.js +18 -0
  30. package/dist/spreadsheet/batchCreationTypes.js.map +1 -0
  31. package/dist/spreadsheet/batchIssueConfig.d.ts +21 -0
  32. package/dist/spreadsheet/batchIssueConfig.d.ts.map +1 -0
  33. package/dist/spreadsheet/batchIssueConfig.js +73 -0
  34. package/dist/spreadsheet/batchIssueConfig.js.map +1 -0
  35. package/dist/spreadsheet/batchPreviewFormat.d.ts +39 -0
  36. package/dist/spreadsheet/batchPreviewFormat.d.ts.map +1 -0
  37. package/dist/spreadsheet/batchPreviewFormat.js +190 -0
  38. package/dist/spreadsheet/batchPreviewFormat.js.map +1 -0
  39. package/dist/spreadsheet/batchSheetHeuristics.d.ts +13 -0
  40. package/dist/spreadsheet/batchSheetHeuristics.d.ts.map +1 -0
  41. package/dist/spreadsheet/batchSheetHeuristics.js +30 -0
  42. package/dist/spreadsheet/batchSheetHeuristics.js.map +1 -0
  43. package/dist/spreadsheet/csvUtils.d.ts +14 -0
  44. package/dist/spreadsheet/csvUtils.d.ts.map +1 -0
  45. package/dist/spreadsheet/csvUtils.js +113 -0
  46. package/dist/spreadsheet/csvUtils.js.map +1 -0
  47. package/dist/spreadsheet/extractRawBatchSheet.d.ts +14 -0
  48. package/dist/spreadsheet/extractRawBatchSheet.d.ts.map +1 -0
  49. package/dist/spreadsheet/extractRawBatchSheet.js +33 -0
  50. package/dist/spreadsheet/extractRawBatchSheet.js.map +1 -0
  51. package/dist/spreadsheet/featureRow.d.ts +15 -0
  52. package/dist/spreadsheet/featureRow.d.ts.map +1 -0
  53. package/dist/spreadsheet/featureRow.js +119 -0
  54. package/dist/spreadsheet/featureRow.js.map +1 -0
  55. package/dist/spreadsheet/parseBatchCreationCsv.d.ts +8 -0
  56. package/dist/spreadsheet/parseBatchCreationCsv.d.ts.map +1 -0
  57. package/dist/spreadsheet/parseBatchCreationCsv.js +22 -0
  58. package/dist/spreadsheet/parseBatchCreationCsv.js.map +1 -0
  59. package/dist/spreadsheet/parseBatchCreationCsvV1.d.ts +3 -0
  60. package/dist/spreadsheet/parseBatchCreationCsvV1.d.ts.map +1 -0
  61. package/dist/spreadsheet/parseBatchCreationCsvV1.js +226 -0
  62. package/dist/spreadsheet/parseBatchCreationCsvV1.js.map +1 -0
  63. package/dist/spreadsheet/parseBatchCreationCsvV2.d.ts +4 -0
  64. package/dist/spreadsheet/parseBatchCreationCsvV2.d.ts.map +1 -0
  65. package/dist/spreadsheet/parseBatchCreationCsvV2.js +180 -0
  66. package/dist/spreadsheet/parseBatchCreationCsvV2.js.map +1 -0
  67. package/dist/spreadsheet/redmineIssueCell.d.ts +38 -0
  68. package/dist/spreadsheet/redmineIssueCell.d.ts.map +1 -0
  69. package/dist/spreadsheet/redmineIssueCell.js +176 -0
  70. package/dist/spreadsheet/redmineIssueCell.js.map +1 -0
  71. package/dist/spreadsheet/sheetColumnMap.d.ts +38 -0
  72. package/dist/spreadsheet/sheetColumnMap.d.ts.map +1 -0
  73. package/dist/spreadsheet/sheetColumnMap.js +75 -0
  74. package/dist/spreadsheet/sheetColumnMap.js.map +1 -0
  75. package/dist/spreadsheet/sheetGridToCsv.d.ts +28 -0
  76. package/dist/spreadsheet/sheetGridToCsv.d.ts.map +1 -0
  77. package/dist/spreadsheet/sheetGridToCsv.js +88 -0
  78. package/dist/spreadsheet/sheetGridToCsv.js.map +1 -0
  79. package/dist/spreadsheet/sheetRedmineFields.d.ts +7 -0
  80. package/dist/spreadsheet/sheetRedmineFields.d.ts.map +1 -0
  81. package/dist/spreadsheet/sheetRedmineFields.js +22 -0
  82. package/dist/spreadsheet/sheetRedmineFields.js.map +1 -0
  83. package/dist/spreadsheet/sheetWriteBack.d.ts +27 -0
  84. package/dist/spreadsheet/sheetWriteBack.d.ts.map +1 -0
  85. package/dist/spreadsheet/sheetWriteBack.js +90 -0
  86. package/dist/spreadsheet/sheetWriteBack.js.map +1 -0
  87. package/dist/workflows/batchCreateIssuesWorkflow.d.ts +66 -0
  88. package/dist/workflows/batchCreateIssuesWorkflow.d.ts.map +1 -0
  89. package/dist/workflows/batchCreateIssuesWorkflow.js +1014 -0
  90. package/dist/workflows/batchCreateIssuesWorkflow.js.map +1 -0
  91. package/dist/workflows/createIssueWorkflow.d.ts +41 -0
  92. package/dist/workflows/createIssueWorkflow.d.ts.map +1 -0
  93. package/dist/workflows/createIssueWorkflow.js +697 -0
  94. package/dist/workflows/createIssueWorkflow.js.map +1 -0
  95. package/dist/workflows/getAllUsersWorkflow.d.ts +27 -0
  96. package/dist/workflows/getAllUsersWorkflow.d.ts.map +1 -0
  97. package/dist/workflows/getAllUsersWorkflow.js +48 -0
  98. package/dist/workflows/getAllUsersWorkflow.js.map +1 -0
  99. package/dist/workflows/issueCreationHelpers.d.ts +54 -0
  100. package/dist/workflows/issueCreationHelpers.d.ts.map +1 -0
  101. package/dist/workflows/issueCreationHelpers.js +272 -0
  102. package/dist/workflows/issueCreationHelpers.js.map +1 -0
  103. package/dist/workflows/logTimeWorkflow.d.ts +6 -1
  104. package/dist/workflows/logTimeWorkflow.d.ts.map +1 -1
  105. package/dist/workflows/logTimeWorkflow.js +139 -20
  106. package/dist/workflows/logTimeWorkflow.js.map +1 -1
  107. package/dist/workflows/sheetToCsvWorkflow.d.ts +15 -0
  108. package/dist/workflows/sheetToCsvWorkflow.d.ts.map +1 -0
  109. package/dist/workflows/sheetToCsvWorkflow.js +65 -0
  110. package/dist/workflows/sheetToCsvWorkflow.js.map +1 -0
  111. package/package.json +2 -2
@@ -0,0 +1,113 @@
1
+ function pushParsedRow(rows, row) {
2
+ rows.push(row);
3
+ }
4
+ /** RFC4180-style CSV row parser (supports quoted multiline fields). */
5
+ export function parseCsvRows(content) {
6
+ if (content.length === 0)
7
+ return [];
8
+ const rows = [];
9
+ let row = [];
10
+ let field = "";
11
+ let inQuotes = false;
12
+ let i = 0;
13
+ while (i < content.length) {
14
+ const ch = content[i];
15
+ if (inQuotes) {
16
+ if (ch === '"') {
17
+ if (content[i + 1] === '"') {
18
+ field += '"';
19
+ i += 2;
20
+ continue;
21
+ }
22
+ inQuotes = false;
23
+ i++;
24
+ continue;
25
+ }
26
+ field += ch;
27
+ i++;
28
+ continue;
29
+ }
30
+ if (ch === '"') {
31
+ inQuotes = true;
32
+ i++;
33
+ continue;
34
+ }
35
+ if (ch === ",") {
36
+ row.push(field);
37
+ field = "";
38
+ i++;
39
+ continue;
40
+ }
41
+ if (ch === "\r") {
42
+ i++;
43
+ if (content[i] === "\n")
44
+ i++;
45
+ row.push(field);
46
+ field = "";
47
+ pushParsedRow(rows, row);
48
+ row = [];
49
+ continue;
50
+ }
51
+ if (ch === "\n") {
52
+ row.push(field);
53
+ field = "";
54
+ pushParsedRow(rows, row);
55
+ row = [];
56
+ i++;
57
+ continue;
58
+ }
59
+ field += ch;
60
+ i++;
61
+ }
62
+ row.push(field);
63
+ pushParsedRow(rows, row);
64
+ return rows;
65
+ }
66
+ function escapeCsvField(value) {
67
+ if (/[",\r\n]/.test(value)) {
68
+ return `"${value.replace(/"/g, '""')}"`;
69
+ }
70
+ return value;
71
+ }
72
+ export function serializeCsvRows(rows) {
73
+ return rows
74
+ .map((row) => row.map(escapeCsvField).join(","))
75
+ .join("\n");
76
+ }
77
+ export function normalizeHeaderCell(value) {
78
+ return value.trim().toLowerCase().replace(/\s+/g, " ");
79
+ }
80
+ export const MAX_SUBJECT_LEN = 255;
81
+ /** First line = subject; remaining lines = description. */
82
+ export function splitSubjectAndDescription(text) {
83
+ const trimmed = text.trim();
84
+ if (!trimmed) {
85
+ return { subject: "", description: "" };
86
+ }
87
+ const lines = trimmed.split(/\r?\n/);
88
+ const firstLine = (lines[0] ?? "").trim();
89
+ const subject = firstLine.length <= MAX_SUBJECT_LEN
90
+ ? firstLine
91
+ : `${firstLine.slice(0, MAX_SUBJECT_LEN - 3)}...`;
92
+ const rest = lines.slice(1).join("\n").trim();
93
+ return { subject, description: rest };
94
+ }
95
+ export { parseRedmineIssueId } from "./redmineIssueCell.js";
96
+ export function parseHours(value) {
97
+ const trimmed = value.trim();
98
+ if (!trimmed)
99
+ return undefined;
100
+ const n = Number(trimmed);
101
+ if (Number.isFinite(n) && n > 0)
102
+ return n;
103
+ return undefined;
104
+ }
105
+ export function appendCommentsToDescription(description, comments) {
106
+ const c = comments.trim();
107
+ if (!c)
108
+ return description.trim();
109
+ const base = description.trim();
110
+ const block = `Comments / Question:\n${c}`;
111
+ return base ? `${base}\n\n${block}` : block;
112
+ }
113
+ //# sourceMappingURL=csvUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csvUtils.js","sourceRoot":"","sources":["../../src/spreadsheet/csvUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type RawSheetRow = {
2
+ /** 1-based row number in the sheet tab */
3
+ sheetRow: number;
4
+ cells: string[];
5
+ };
6
+ export type RawBatchSheet = {
7
+ rows: RawSheetRow[];
8
+ featureTitle: string | null;
9
+ /** Best-guess header row (0-based index in `rows`) */
10
+ detectedHeaderRowIndex: number;
11
+ detectedHeaders: string[];
12
+ };
13
+ export declare function extractRawBatchSheet(content: string): RawBatchSheet;
14
+ //# sourceMappingURL=extractRawBatchSheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractRawBatchSheet.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/extractRawBatchSheet.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACtB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IACxB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,sDAAsD;IACtD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAeF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAiBnE"}
@@ -0,0 +1,33 @@
1
+ import { parseCsvRows } from "./csvUtils.js";
2
+ import { extractFeatureTitle } from "./sheetColumnMap.js";
3
+ /** First row with enough non-empty cells to plausibly be a header (no column-name matching). */
4
+ function detectHeaderRowIndex(rows) {
5
+ for (let i = 0; i < Math.min(rows.length, 15); i++) {
6
+ const count = (rows[i] ?? []).filter((c) => (c ?? "").trim()).length;
7
+ if (count >= 3)
8
+ return i;
9
+ }
10
+ for (let i = 0; i < rows.length; i++) {
11
+ const count = (rows[i] ?? []).filter((c) => (c ?? "").trim()).length;
12
+ if (count >= 2)
13
+ return i;
14
+ }
15
+ return 0;
16
+ }
17
+ export function extractRawBatchSheet(content) {
18
+ const matrix = parseCsvRows(content);
19
+ const rows = matrix.map((cells, i) => ({
20
+ sheetRow: i + 1,
21
+ cells: cells.map((c) => (c ?? "").trim()),
22
+ }));
23
+ const detectedHeaderRowIndex = detectHeaderRowIndex(matrix);
24
+ const featureTitle = extractFeatureTitle(matrix, detectedHeaderRowIndex);
25
+ const detectedHeaders = rows[detectedHeaderRowIndex]?.cells ?? [];
26
+ return {
27
+ rows,
28
+ featureTitle,
29
+ detectedHeaderRowIndex,
30
+ detectedHeaders,
31
+ };
32
+ }
33
+ //# sourceMappingURL=extractRawBatchSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractRawBatchSheet.js","sourceRoot":"","sources":["../../src/spreadsheet/extractRawBatchSheet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAgB1D,gGAAgG;AAChG,SAAS,oBAAoB,CAAC,IAAgB;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACrE,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACrE,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAkB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAClD,QAAQ,EAAE,CAAC,GAAG,CAAC;QACf,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;KAC5C,CAAC,CAAC,CAAC;IAEJ,MAAM,sBAAsB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACzE,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IAElE,OAAO;QACH,IAAI;QACJ,YAAY;QACZ,sBAAsB;QACtB,eAAe;KAClB,CAAC;AACN,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** 1-based sheet row of the "Feature: …" title line, or 1 when none. */
2
+ export declare function findFeatureSheetRow(rows: string[][], beforeHeaderIndex: number): number;
3
+ /** Display text from a plain or HYPERLINK feature cell. */
4
+ export declare function featureCellDisplayText(cell: string): string;
5
+ export declare function extractFeatureTitleFromRows(rows: string[][], beforeHeaderIndex: number): string | null;
6
+ export declare function countNonEmptyCells(row: string[]): number;
7
+ export declare function findFeatureTitleColumnIndex(featureRow: string[]): number;
8
+ /** Existing Feature issue id from Task ID column and/or inline on the feature row. */
9
+ export declare function readFeatureRowExistingId(featureRow: string[], redmineIdColumnIndex: number): number | undefined;
10
+ export declare function readFeatureRowExistingIdFromSheet(rows: string[][], featureSheetRow: number, redmineIdColumnIndex: number): number | undefined;
11
+ /** Feature title is the only populated column besides Task ID / Ticket. */
12
+ export declare function isFeatureSingleColumnRow(featureRow: string[], redmineIdColumnIndex?: number): boolean;
13
+ /** Clickable feature cell: entire label is one link, e.g. Feature: title #id. */
14
+ export declare function buildFeatureCellWithIssueLink(existingCell: string, issueId: number, issueUrl: string): string;
15
+ //# sourceMappingURL=featureRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureRow.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/featureRow.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,iBAAiB,EAAE,MAAM,GAC1B,MAAM,CAgBR;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAED,wBAAgB,2BAA2B,CACvC,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,iBAAiB,EAAE,MAAM,GAC1B,MAAM,GAAG,IAAI,CAoBf;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,CAExD;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CASxE;AAED,sFAAsF;AACtF,wBAAgB,wBAAwB,CACpC,UAAU,EAAE,MAAM,EAAE,EACpB,oBAAoB,EAAE,MAAM,GAC7B,MAAM,GAAG,SAAS,CAkBpB;AAED,wBAAgB,iCAAiC,CAC7C,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,MAAM,GAC7B,MAAM,GAAG,SAAS,CAGpB;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACpC,UAAU,EAAE,MAAM,EAAE,EACpB,oBAAoB,SAAK,GAC1B,OAAO,CAUT;AAED,iFAAiF;AACjF,wBAAgB,6BAA6B,CACzC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACjB,MAAM,CAWR"}
@@ -0,0 +1,119 @@
1
+ import { parseRedmineIssueId } from "./redmineIssueCell.js";
2
+ /** 1-based sheet row of the "Feature: …" title line, or 1 when none. */
3
+ export function findFeatureSheetRow(rows, beforeHeaderIndex) {
4
+ for (let i = 0; i < beforeHeaderIndex; i++) {
5
+ const text = (rows[i] ?? [])
6
+ .map((c) => (c ?? "").trim())
7
+ .filter(Boolean)
8
+ .join(" ");
9
+ if (/^feature:\s*/i.test(text))
10
+ return i + 1;
11
+ for (const cell of rows[i] ?? []) {
12
+ const trimmed = (cell ?? "").trim();
13
+ if (!trimmed)
14
+ continue;
15
+ const display = featureCellDisplayText(trimmed);
16
+ const firstLine = display.split(/\r?\n/)[0]?.trim() ?? "";
17
+ if (/^feature:\s*/i.test(firstLine))
18
+ return i + 1;
19
+ }
20
+ }
21
+ return 1;
22
+ }
23
+ /** Display text from a plain or HYPERLINK feature cell. */
24
+ export function featureCellDisplayText(cell) {
25
+ const trimmed = cell.trim();
26
+ const hyperlinkLabel = /HYPERLINK\s*\(\s*"[^"]*"\s*,\s*"((?:[^"]|"")*)"\s*\)/i.exec(trimmed);
27
+ if (hyperlinkLabel?.[1]) {
28
+ return hyperlinkLabel[1].replace(/""/g, '"');
29
+ }
30
+ return trimmed;
31
+ }
32
+ export function extractFeatureTitleFromRows(rows, beforeHeaderIndex) {
33
+ for (let i = 0; i < beforeHeaderIndex; i++) {
34
+ const row = rows[i] ?? [];
35
+ for (const cell of row) {
36
+ const trimmed = (cell ?? "").trim();
37
+ if (!trimmed)
38
+ continue;
39
+ const display = featureCellDisplayText(trimmed);
40
+ const firstLine = display.split(/\r?\n/)[0]?.trim() ?? "";
41
+ const match = /^feature:\s*(.+)$/i.exec(firstLine);
42
+ if (match?.[1])
43
+ return match[1].trim();
44
+ }
45
+ const text = row
46
+ .map((c) => (c ?? "").trim())
47
+ .filter(Boolean)
48
+ .join(" ")
49
+ .trim();
50
+ const match = /^feature:\s*(.+)$/i.exec(text);
51
+ if (match?.[1])
52
+ return match[1].trim();
53
+ }
54
+ return null;
55
+ }
56
+ export function countNonEmptyCells(row) {
57
+ return row.filter((c) => (c ?? "").trim().length > 0).length;
58
+ }
59
+ export function findFeatureTitleColumnIndex(featureRow) {
60
+ for (let i = 0; i < featureRow.length; i++) {
61
+ const cell = (featureRow[i] ?? "").trim();
62
+ if (!cell)
63
+ continue;
64
+ const display = featureCellDisplayText(cell);
65
+ const firstLine = display.split(/\r?\n/)[0]?.trim() ?? "";
66
+ if (/^feature:\s*/i.test(firstLine))
67
+ return i;
68
+ }
69
+ return featureRow.findIndex((c) => (c ?? "").trim().length > 0);
70
+ }
71
+ /** Existing Feature issue id from Task ID column and/or inline on the feature row. */
72
+ export function readFeatureRowExistingId(featureRow, redmineIdColumnIndex) {
73
+ if (redmineIdColumnIndex >= 0) {
74
+ const id = parseRedmineIssueId((featureRow[redmineIdColumnIndex] ?? "").trim());
75
+ if (id !== undefined)
76
+ return id;
77
+ }
78
+ for (const cell of featureRow) {
79
+ const trimmed = (cell ?? "").trim();
80
+ if (!trimmed)
81
+ continue;
82
+ const display = featureCellDisplayText(trimmed);
83
+ const lines = display.split(/\r?\n/);
84
+ for (let i = 1; i < lines.length; i++) {
85
+ const id = parseRedmineIssueId(lines[i] ?? "");
86
+ if (id !== undefined)
87
+ return id;
88
+ }
89
+ }
90
+ return undefined;
91
+ }
92
+ export function readFeatureRowExistingIdFromSheet(rows, featureSheetRow, redmineIdColumnIndex) {
93
+ const featureRow = rows[featureSheetRow - 1] ?? [];
94
+ return readFeatureRowExistingId(featureRow, redmineIdColumnIndex);
95
+ }
96
+ /** Feature title is the only populated column besides Task ID / Ticket. */
97
+ export function isFeatureSingleColumnRow(featureRow, redmineIdColumnIndex = -1) {
98
+ const titleCol = findFeatureTitleColumnIndex(featureRow);
99
+ if (titleCol < 0)
100
+ return false;
101
+ const populated = featureRow
102
+ .map((cell, index) => ({ index, text: (cell ?? "").trim() }))
103
+ .filter((entry) => entry.text.length > 0)
104
+ .filter((entry) => entry.index !== redmineIdColumnIndex);
105
+ return (populated.length === 1 && populated[0]?.index === titleCol);
106
+ }
107
+ /** Clickable feature cell: entire label is one link, e.g. Feature: title #id. */
108
+ export function buildFeatureCellWithIssueLink(existingCell, issueId, issueUrl) {
109
+ const display = featureCellDisplayText(existingCell);
110
+ const titleLine = display
111
+ .split(/\r?\n/)
112
+ .find((line) => /^feature:\s*/i.test(line.trim())) ??
113
+ display.split(/\r?\n/)[0] ??
114
+ display;
115
+ const url = issueUrl.replace(/"/g, '""');
116
+ const label = titleLine.trim().replace(/"/g, '""');
117
+ return `=HYPERLINK("${url}","${label} #${issueId}")`;
118
+ }
119
+ //# sourceMappingURL=featureRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureRow.js","sourceRoot":"","sources":["../../src/spreadsheet/featureRow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { BatchParseResult } from "./batchCreationTypes.js";
2
+ export { parseCsvRows } from "./csvUtils.js";
3
+ /**
4
+ * Parse batch spreadsheets via shared column detection (sheetColumnMap.ts).
5
+ * Layout v1/v2 differs only in which columns exist; write-back uses Task ID or Ticket.
6
+ */
7
+ export declare function parseBatchCreationCsv(content: string): BatchParseResult;
8
+ //# sourceMappingURL=parseBatchCreationCsv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBatchCreationCsv.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/parseBatchCreationCsv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAYvE"}
@@ -0,0 +1,22 @@
1
+ import { findV1HeaderRowIndex, findV2HeaderRowIndex } from "./sheetColumnMap.js";
2
+ import { parseBatchCreationCsvV2 } from "./parseBatchCreationCsvV2.js";
3
+ import { parseBatchCreationCsvV1 } from "./parseBatchCreationCsvV1.js";
4
+ import { parseCsvRows } from "./csvUtils.js";
5
+ export { parseCsvRows } from "./csvUtils.js";
6
+ /**
7
+ * Parse batch spreadsheets via shared column detection (sheetColumnMap.ts).
8
+ * Layout v1/v2 differs only in which columns exist; write-back uses Task ID or Ticket.
9
+ */
10
+ export function parseBatchCreationCsv(content) {
11
+ const rows = parseCsvRows(content);
12
+ const v2Header = findV2HeaderRowIndex(rows);
13
+ const v1Header = findV1HeaderRowIndex(rows);
14
+ if (v2Header >= 0 && (v1Header < 0 || v2Header <= v1Header)) {
15
+ return parseBatchCreationCsvV2(content);
16
+ }
17
+ if (v1Header >= 0) {
18
+ return parseBatchCreationCsvV1(content);
19
+ }
20
+ return parseBatchCreationCsvV2(content);
21
+ }
22
+ //# sourceMappingURL=parseBatchCreationCsv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBatchCreationCsv.js","sourceRoot":"","sources":["../../src/spreadsheet/parseBatchCreationCsv.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACjD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC1D,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BatchParseResult } from "./batchCreationTypes.js";
2
+ export declare function parseBatchCreationCsvV1(content: string): BatchParseResult;
3
+ //# sourceMappingURL=parseBatchCreationCsvV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBatchCreationCsvV1.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/parseBatchCreationCsvV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,yBAAyB,CAAC;AA+GlF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAkLzE"}
@@ -0,0 +1,226 @@
1
+ import { BATCH_TRACKER_BY_LEVEL, FEATURE_ROOT_NODE_ID, } from "./batchCreationTypes.js";
2
+ import { findFeatureSheetRow, readFeatureRowExistingIdFromSheet, } from "./featureRow.js";
3
+ import { buildSheetWriteBackTarget, extractFeatureTitle, findV1HeaderRowIndex, mapV1Columns, readExistingRedmineIdFromRow, } from "./sheetColumnMap.js";
4
+ import { hoursForSubtaskOnRow, hoursForUserStoryOnRow, isAggregatingSheetRow, } from "./batchSheetHeuristics.js";
5
+ import { normalizeHeaderCell, parseCsvRows, parseHours, splitSubjectAndDescription, } from "./csvUtils.js";
6
+ import { normalizeSheetPriority, trackerForSheetRow, } from "./sheetRedmineFields.js";
7
+ function sheetMetaNotes(row, cols) {
8
+ const parts = [];
9
+ if (cols.status >= 0) {
10
+ const v = cell(row, cols.status);
11
+ if (v)
12
+ parts.push(`Status: ${v}`);
13
+ }
14
+ return parts.join("\n");
15
+ }
16
+ function cell(row, index) {
17
+ return (row[index] ?? "").trim();
18
+ }
19
+ function descriptionFromParts(parts) {
20
+ const sections = [];
21
+ const { subject, description: bodyRest } = splitSubjectAndDescription(parts.body);
22
+ if (bodyRest)
23
+ sections.push(bodyRest);
24
+ else if (parts.body.trim() && parts.body.trim() !== subject) {
25
+ sections.push(parts.body.trim());
26
+ }
27
+ if (parts.comments.trim())
28
+ sections.push(parts.comments.trim());
29
+ if (parts.system.trim())
30
+ sections.push(`System: ${parts.system.trim()}`);
31
+ if (parts.meta?.trim())
32
+ sections.push(parts.meta.trim());
33
+ return sections.join("\n\n").trim();
34
+ }
35
+ function makeNode(params) {
36
+ const { subject } = splitSubjectAndDescription(params.subjectSource);
37
+ const etaHours = parseHours(params.eta);
38
+ const issue = {
39
+ nodeId: `row-${params.rowIndex}-${params.level}`,
40
+ rowIndex: params.rowIndex,
41
+ level: params.level,
42
+ tracker: trackerForSheetRow(params.sheetType ?? "", params.level),
43
+ subject,
44
+ description: descriptionFromParts({
45
+ body: params.subjectSource,
46
+ comments: params.comments,
47
+ system: params.system,
48
+ ...(params.meta ? { meta: params.meta } : {}),
49
+ }),
50
+ targetVersion: "",
51
+ assignedTo: params.assignedTo,
52
+ system: params.system,
53
+ parentNodeId: params.parentNodeId,
54
+ ...(params.sheetType?.trim()
55
+ ? { sheetType: params.sheetType.trim() }
56
+ : {}),
57
+ ...(params.existingRedmineId !== undefined
58
+ ? { existingRedmineId: params.existingRedmineId }
59
+ : {}),
60
+ };
61
+ if (etaHours !== undefined) {
62
+ issue.estimatedHours = etaHours;
63
+ }
64
+ const priority = normalizeSheetPriority(params.sheetPriority ?? "");
65
+ if (priority)
66
+ issue.priority = priority;
67
+ return issue;
68
+ }
69
+ export function parseBatchCreationCsvV1(content) {
70
+ const rows = parseCsvRows(content);
71
+ const parseWarnings = [];
72
+ const headerRowIndex = findV1HeaderRowIndex(rows);
73
+ if (headerRowIndex < 0) {
74
+ return {
75
+ format: "v1",
76
+ scopeNotes: "",
77
+ headerRowIndex: -1,
78
+ issues: [],
79
+ parseWarnings: [
80
+ 'Could not find v1 header row with columns "Ticket", "Task", "Sub Tasks".',
81
+ ],
82
+ };
83
+ }
84
+ const featureTitle = extractFeatureTitle(rows, headerRowIndex);
85
+ const scopeRows = rows.slice(0, headerRowIndex);
86
+ const scopeNotes = featureTitle
87
+ ? `Feature: ${featureTitle}`
88
+ : scopeRows
89
+ .map((r) => r.map((c) => c.trim()).filter(Boolean).join(" "))
90
+ .filter(Boolean)
91
+ .join("\n");
92
+ const headerRow = rows[headerRowIndex] ?? [];
93
+ const featureSheetRow = findFeatureSheetRow(rows, headerRowIndex);
94
+ const existingFeatureId = featureTitle
95
+ ? readFeatureRowExistingIdFromSheet(rows, featureSheetRow, headerRow)
96
+ : undefined;
97
+ const issues = [];
98
+ const featureParentId = featureTitle ? FEATURE_ROOT_NODE_ID : null;
99
+ if (featureTitle) {
100
+ issues.push({
101
+ nodeId: FEATURE_ROOT_NODE_ID,
102
+ rowIndex: featureSheetRow,
103
+ level: "feature",
104
+ tracker: BATCH_TRACKER_BY_LEVEL.feature,
105
+ subject: featureTitle,
106
+ description: "",
107
+ targetVersion: "",
108
+ assignedTo: "",
109
+ system: "",
110
+ parentNodeId: null,
111
+ ...(existingFeatureId !== undefined
112
+ ? { existingRedmineId: existingFeatureId }
113
+ : {}),
114
+ });
115
+ }
116
+ const cols = mapV1Columns(headerRow);
117
+ const sheetWriteBack = buildSheetWriteBackTarget(headerRow);
118
+ let currentUserStoryNodeId = null;
119
+ let ticketGroupContext = "";
120
+ for (let i = headerRowIndex + 1; i < rows.length; i++) {
121
+ const row = rows[i] ?? [];
122
+ const ticket = cols.ticket >= 0 ? cell(row, cols.ticket) : "";
123
+ const task = cell(row, cols.userStory);
124
+ const sub = cell(row, cols.subtask);
125
+ const eta = cols.hours >= 0 ? cell(row, cols.hours) : "";
126
+ const system = cols.system >= 0 ? cell(row, cols.system) : "";
127
+ const comments = cols.comments >= 0 ? cell(row, cols.comments) : "";
128
+ const assignedTo = cols.assignedTo >= 0 ? cell(row, cols.assignedTo) : "";
129
+ const meta = sheetMetaNotes(row, cols);
130
+ const sheetType = cols.sheetType >= 0 ? cell(row, cols.sheetType) : "";
131
+ const sheetPriority = cols.priority >= 0 ? cell(row, cols.priority) : "";
132
+ const rowRedmineId = task || sub
133
+ ? readExistingRedmineIdFromRow(row, cols)
134
+ : undefined;
135
+ if (!ticket && !task && !sub)
136
+ continue;
137
+ if (ticket && !task && !sub) {
138
+ currentUserStoryNodeId = null;
139
+ ticketGroupContext = ticket;
140
+ continue;
141
+ }
142
+ if (isAggregatingSheetRow({ userStoryText: task, subtaskText: sub })) {
143
+ parseWarnings.push(`Row ${i + 1}: Rollup/summary row skipped (not created on Redmine).`);
144
+ currentUserStoryNodeId = null;
145
+ continue;
146
+ }
147
+ const subHoursCell = hoursForSubtaskOnRow(task, eta);
148
+ const storyHoursCell = hoursForUserStoryOnRow(sub, eta);
149
+ if (task) {
150
+ const groupPrefix = ticketGroupContext
151
+ ? `${ticketGroupContext}\n\n`
152
+ : "";
153
+ ticketGroupContext = "";
154
+ const body = groupPrefix + task;
155
+ const node = makeNode({
156
+ rowIndex: i + 1,
157
+ level: "userStory",
158
+ subjectSource: task,
159
+ comments,
160
+ system,
161
+ eta: storyHoursCell,
162
+ assignedTo,
163
+ parentNodeId: featureParentId,
164
+ meta,
165
+ sheetType,
166
+ sheetPriority,
167
+ ...(rowRedmineId !== undefined && !sub
168
+ ? { existingRedmineId: rowRedmineId }
169
+ : {}),
170
+ });
171
+ if (groupPrefix) {
172
+ node.description = descriptionFromParts({
173
+ body,
174
+ comments,
175
+ system: node.system,
176
+ ...(meta ? { meta } : {}),
177
+ });
178
+ }
179
+ if (!node.subject) {
180
+ parseWarnings.push(`Row ${i + 1}: Task has no subject text.`);
181
+ continue;
182
+ }
183
+ issues.push(node);
184
+ currentUserStoryNodeId = node.nodeId;
185
+ }
186
+ if (sub) {
187
+ if (!currentUserStoryNodeId) {
188
+ parseWarnings.push(`Row ${i + 1}: Sub Task skipped — no User Story (Task column) above.`);
189
+ continue;
190
+ }
191
+ const subRowId = readExistingRedmineIdFromRow(row, cols);
192
+ const node = makeNode({
193
+ rowIndex: i + 1,
194
+ level: "subtask",
195
+ subjectSource: sub,
196
+ comments,
197
+ system,
198
+ eta: subHoursCell,
199
+ assignedTo,
200
+ parentNodeId: currentUserStoryNodeId,
201
+ meta,
202
+ sheetType,
203
+ sheetPriority,
204
+ ...(subRowId !== undefined
205
+ ? { existingRedmineId: subRowId }
206
+ : {}),
207
+ });
208
+ if (!node.subject) {
209
+ parseWarnings.push(`Row ${i + 1}: Sub Task has no subject text.`);
210
+ continue;
211
+ }
212
+ issues.push(node);
213
+ }
214
+ }
215
+ return {
216
+ format: "v1",
217
+ scopeNotes,
218
+ headerRowIndex: headerRowIndex + 1,
219
+ sheetColumns: cols,
220
+ ...(sheetWriteBack ? { sheetWriteBack } : {}),
221
+ issues,
222
+ parseWarnings,
223
+ ...(featureTitle ? { featureTitle } : {}),
224
+ };
225
+ }
226
+ //# sourceMappingURL=parseBatchCreationCsvV1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBatchCreationCsvV1.js","sourceRoot":"","sources":["../../src/spreadsheet/parseBatchCreationCsvV1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { BatchParseResult } from "./batchCreationTypes.js";
2
+ export { mapV2Columns, extractFeatureTitle, findV2HeaderRowIndex } from "./sheetColumnMap.js";
3
+ export declare function parseBatchCreationCsvV2(content: string): BatchParseResult;
4
+ //# sourceMappingURL=parseBatchCreationCsvV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseBatchCreationCsvV2.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/parseBatchCreationCsvV2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAiC,MAAM,yBAAyB,CAAC;AA4B/F,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AA2D9F,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAmJzE"}