@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.
- package/dist/config/env.d.ts +2 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +8 -0
- package/dist/config/env.js.map +1 -1
- package/dist/mcp/server.js +630 -147
- package/dist/mcp/server.js.map +1 -1
- package/dist/services/assigneeDirectory.d.ts +34 -0
- package/dist/services/assigneeDirectory.d.ts.map +1 -0
- package/dist/services/assigneeDirectory.js +138 -0
- package/dist/services/assigneeDirectory.js.map +1 -0
- package/dist/services/googleSheets.d.ts +32 -0
- package/dist/services/googleSheets.d.ts.map +1 -0
- package/dist/services/googleSheets.js +109 -0
- package/dist/services/googleSheets.js.map +1 -0
- package/dist/services/redmine.d.ts +52 -0
- package/dist/services/redmine.d.ts.map +1 -1
- package/dist/services/redmine.js +103 -0
- package/dist/services/redmine.js.map +1 -1
- package/dist/services/redmineConfig.d.ts +85 -0
- package/dist/services/redmineConfig.d.ts.map +1 -0
- package/dist/services/redmineConfig.js +271 -0
- package/dist/services/redmineConfig.js.map +1 -0
- package/dist/spreadsheet/batchColumnMapping.d.ts +93 -0
- package/dist/spreadsheet/batchColumnMapping.d.ts.map +1 -0
- package/dist/spreadsheet/batchColumnMapping.js +660 -0
- package/dist/spreadsheet/batchColumnMapping.js.map +1 -0
- package/dist/spreadsheet/batchCreationTypes.d.ts +58 -0
- package/dist/spreadsheet/batchCreationTypes.d.ts.map +1 -0
- package/dist/spreadsheet/batchCreationTypes.js +18 -0
- package/dist/spreadsheet/batchCreationTypes.js.map +1 -0
- package/dist/spreadsheet/batchIssueConfig.d.ts +21 -0
- package/dist/spreadsheet/batchIssueConfig.d.ts.map +1 -0
- package/dist/spreadsheet/batchIssueConfig.js +73 -0
- package/dist/spreadsheet/batchIssueConfig.js.map +1 -0
- package/dist/spreadsheet/batchPreviewFormat.d.ts +39 -0
- package/dist/spreadsheet/batchPreviewFormat.d.ts.map +1 -0
- package/dist/spreadsheet/batchPreviewFormat.js +190 -0
- package/dist/spreadsheet/batchPreviewFormat.js.map +1 -0
- package/dist/spreadsheet/batchSheetHeuristics.d.ts +13 -0
- package/dist/spreadsheet/batchSheetHeuristics.d.ts.map +1 -0
- package/dist/spreadsheet/batchSheetHeuristics.js +30 -0
- package/dist/spreadsheet/batchSheetHeuristics.js.map +1 -0
- package/dist/spreadsheet/csvUtils.d.ts +14 -0
- package/dist/spreadsheet/csvUtils.d.ts.map +1 -0
- package/dist/spreadsheet/csvUtils.js +113 -0
- package/dist/spreadsheet/csvUtils.js.map +1 -0
- package/dist/spreadsheet/extractRawBatchSheet.d.ts +14 -0
- package/dist/spreadsheet/extractRawBatchSheet.d.ts.map +1 -0
- package/dist/spreadsheet/extractRawBatchSheet.js +33 -0
- package/dist/spreadsheet/extractRawBatchSheet.js.map +1 -0
- package/dist/spreadsheet/featureRow.d.ts +15 -0
- package/dist/spreadsheet/featureRow.d.ts.map +1 -0
- package/dist/spreadsheet/featureRow.js +119 -0
- package/dist/spreadsheet/featureRow.js.map +1 -0
- package/dist/spreadsheet/parseBatchCreationCsv.d.ts +8 -0
- package/dist/spreadsheet/parseBatchCreationCsv.d.ts.map +1 -0
- package/dist/spreadsheet/parseBatchCreationCsv.js +22 -0
- package/dist/spreadsheet/parseBatchCreationCsv.js.map +1 -0
- package/dist/spreadsheet/parseBatchCreationCsvV1.d.ts +3 -0
- package/dist/spreadsheet/parseBatchCreationCsvV1.d.ts.map +1 -0
- package/dist/spreadsheet/parseBatchCreationCsvV1.js +226 -0
- package/dist/spreadsheet/parseBatchCreationCsvV1.js.map +1 -0
- package/dist/spreadsheet/parseBatchCreationCsvV2.d.ts +4 -0
- package/dist/spreadsheet/parseBatchCreationCsvV2.d.ts.map +1 -0
- package/dist/spreadsheet/parseBatchCreationCsvV2.js +180 -0
- package/dist/spreadsheet/parseBatchCreationCsvV2.js.map +1 -0
- package/dist/spreadsheet/redmineIssueCell.d.ts +38 -0
- package/dist/spreadsheet/redmineIssueCell.d.ts.map +1 -0
- package/dist/spreadsheet/redmineIssueCell.js +176 -0
- package/dist/spreadsheet/redmineIssueCell.js.map +1 -0
- package/dist/spreadsheet/sheetColumnMap.d.ts +38 -0
- package/dist/spreadsheet/sheetColumnMap.d.ts.map +1 -0
- package/dist/spreadsheet/sheetColumnMap.js +75 -0
- package/dist/spreadsheet/sheetColumnMap.js.map +1 -0
- package/dist/spreadsheet/sheetGridToCsv.d.ts +28 -0
- package/dist/spreadsheet/sheetGridToCsv.d.ts.map +1 -0
- package/dist/spreadsheet/sheetGridToCsv.js +88 -0
- package/dist/spreadsheet/sheetGridToCsv.js.map +1 -0
- package/dist/spreadsheet/sheetRedmineFields.d.ts +7 -0
- package/dist/spreadsheet/sheetRedmineFields.d.ts.map +1 -0
- package/dist/spreadsheet/sheetRedmineFields.js +22 -0
- package/dist/spreadsheet/sheetRedmineFields.js.map +1 -0
- package/dist/spreadsheet/sheetWriteBack.d.ts +27 -0
- package/dist/spreadsheet/sheetWriteBack.d.ts.map +1 -0
- package/dist/spreadsheet/sheetWriteBack.js +90 -0
- package/dist/spreadsheet/sheetWriteBack.js.map +1 -0
- package/dist/workflows/batchCreateIssuesWorkflow.d.ts +66 -0
- package/dist/workflows/batchCreateIssuesWorkflow.d.ts.map +1 -0
- package/dist/workflows/batchCreateIssuesWorkflow.js +1014 -0
- package/dist/workflows/batchCreateIssuesWorkflow.js.map +1 -0
- package/dist/workflows/createIssueWorkflow.d.ts +41 -0
- package/dist/workflows/createIssueWorkflow.d.ts.map +1 -0
- package/dist/workflows/createIssueWorkflow.js +697 -0
- package/dist/workflows/createIssueWorkflow.js.map +1 -0
- package/dist/workflows/getAllUsersWorkflow.d.ts +27 -0
- package/dist/workflows/getAllUsersWorkflow.d.ts.map +1 -0
- package/dist/workflows/getAllUsersWorkflow.js +48 -0
- package/dist/workflows/getAllUsersWorkflow.js.map +1 -0
- package/dist/workflows/issueCreationHelpers.d.ts +54 -0
- package/dist/workflows/issueCreationHelpers.d.ts.map +1 -0
- package/dist/workflows/issueCreationHelpers.js +272 -0
- package/dist/workflows/issueCreationHelpers.js.map +1 -0
- package/dist/workflows/logTimeWorkflow.d.ts +6 -1
- package/dist/workflows/logTimeWorkflow.d.ts.map +1 -1
- package/dist/workflows/logTimeWorkflow.js +139 -20
- package/dist/workflows/logTimeWorkflow.js.map +1 -1
- package/dist/workflows/sheetToCsvWorkflow.d.ts +15 -0
- package/dist/workflows/sheetToCsvWorkflow.d.ts.map +1 -0
- package/dist/workflows/sheetToCsvWorkflow.js +65 -0
- package/dist/workflows/sheetToCsvWorkflow.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { serializeCsvRows } from "./csvUtils.js";
|
|
4
|
+
/** RFC4180 CSV from a Google Sheets values grid (coerces cells to strings). */
|
|
5
|
+
export function gridValuesToCsv(rows) {
|
|
6
|
+
return serializeCsvRows(rows.map((row) => row.map((cell) => (cell == null ? "" : String(cell)))));
|
|
7
|
+
}
|
|
8
|
+
function parseMaybeJson(value) {
|
|
9
|
+
if (typeof value !== "string")
|
|
10
|
+
return value;
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(value);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Extract `valueRanges[0].values` from Google Sheets MCP `get_sheet_data` output. */
|
|
19
|
+
export function extractGridFromSheetsPayload(payload) {
|
|
20
|
+
let data = parseMaybeJson(payload);
|
|
21
|
+
if (data && typeof data === "object" && "result" in data) {
|
|
22
|
+
data = parseMaybeJson(data.result);
|
|
23
|
+
}
|
|
24
|
+
if (!data || typeof data !== "object")
|
|
25
|
+
return null;
|
|
26
|
+
const obj = data;
|
|
27
|
+
const ranges = obj.valueRanges;
|
|
28
|
+
const firstRange = ranges?.[0];
|
|
29
|
+
const values = firstRange?.values;
|
|
30
|
+
if (!firstRange || !values?.length)
|
|
31
|
+
return null;
|
|
32
|
+
const rows = values.map((row) => row.map((cell) => (cell == null ? "" : String(cell))));
|
|
33
|
+
const rangeLabel = firstRange?.range ?? "";
|
|
34
|
+
const sheetFromRange = rangeLabel.includes("!")
|
|
35
|
+
? rangeLabel.split("!")[0]?.replace(/^'|'$/g, "")
|
|
36
|
+
: rangeLabel.replace(/^'|'$/g, "");
|
|
37
|
+
const extract = { rows };
|
|
38
|
+
if (typeof obj.spreadsheetId === "string") {
|
|
39
|
+
extract.spreadsheetId = obj.spreadsheetId;
|
|
40
|
+
}
|
|
41
|
+
if (sheetFromRange) {
|
|
42
|
+
extract.sheet = sheetFromRange;
|
|
43
|
+
}
|
|
44
|
+
return extract;
|
|
45
|
+
}
|
|
46
|
+
/** Add `csvContent` + `csvRowCount` to a Sheets MCP result object. */
|
|
47
|
+
export function enrichSheetsPayloadWithCsv(payload) {
|
|
48
|
+
const parsed = parseMaybeJson(payload);
|
|
49
|
+
const grid = extractGridFromSheetsPayload(parsed);
|
|
50
|
+
if (!grid)
|
|
51
|
+
return null;
|
|
52
|
+
const csvContent = gridValuesToCsv(grid.rows);
|
|
53
|
+
const base = parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
54
|
+
? parsed
|
|
55
|
+
: {};
|
|
56
|
+
const result = {
|
|
57
|
+
enriched: {
|
|
58
|
+
...base,
|
|
59
|
+
csvContent,
|
|
60
|
+
csvRowCount: grid.rows.length,
|
|
61
|
+
},
|
|
62
|
+
csvContent,
|
|
63
|
+
rowCount: grid.rows.length,
|
|
64
|
+
};
|
|
65
|
+
if (grid.spreadsheetId)
|
|
66
|
+
result.spreadsheetId = grid.spreadsheetId;
|
|
67
|
+
if (grid.sheet)
|
|
68
|
+
result.sheet = grid.sheet;
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
const CACHE_DIR = ".cursor/cache";
|
|
72
|
+
const CACHE_CSV = "last-sheet.csv";
|
|
73
|
+
const CACHE_META = "last-sheet-meta.json";
|
|
74
|
+
/** Persist last sheet CSV for `csvPath` on batch_create_issues. */
|
|
75
|
+
export async function writeSheetCsvCache(csvContent, meta, projectRoot = process.cwd()) {
|
|
76
|
+
const dir = join(projectRoot, CACHE_DIR);
|
|
77
|
+
await mkdir(dir, { recursive: true });
|
|
78
|
+
const csvPath = join(dir, CACHE_CSV);
|
|
79
|
+
const metaPath = join(dir, CACHE_META);
|
|
80
|
+
await writeFile(csvPath, csvContent, "utf8");
|
|
81
|
+
await writeFile(metaPath, JSON.stringify({
|
|
82
|
+
...meta,
|
|
83
|
+
csvPath,
|
|
84
|
+
cachedAt: new Date().toISOString(),
|
|
85
|
+
}, null, 2), "utf8");
|
|
86
|
+
return { csvPath, metaPath };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=sheetGridToCsv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheetGridToCsv.js","sourceRoot":"","sources":["../../src/spreadsheet/sheetGridToCsv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { BatchIssueLevel } from "./batchCreationTypes.js";
|
|
2
|
+
/** Map sheet Type column values to Redmine tracker names. */
|
|
3
|
+
export declare function normalizeSheetTracker(sheetType: string): string | undefined;
|
|
4
|
+
export declare function trackerForSheetRow(sheetType: string, level: BatchIssueLevel): string;
|
|
5
|
+
/** Map sheet Priority column; empty → use workflow default. */
|
|
6
|
+
export declare function normalizeSheetPriority(sheetPriority: string): string | undefined;
|
|
7
|
+
//# sourceMappingURL=sheetRedmineFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheetRedmineFields.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/sheetRedmineFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI/D,6DAA6D;AAC7D,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI3E;AAED,wBAAgB,kBAAkB,CAC9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,GACvB,MAAM,CAGR;AAED,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIhF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BATCH_TRACKER_BY_LEVEL } from "./batchCreationTypes.js";
|
|
2
|
+
import { applyPriorityAlias, applyTrackerAlias } from "../services/redmineConfig.js";
|
|
3
|
+
/** Map sheet Type column values to Redmine tracker names. */
|
|
4
|
+
export function normalizeSheetTracker(sheetType) {
|
|
5
|
+
const t = sheetType.trim();
|
|
6
|
+
if (!t)
|
|
7
|
+
return undefined;
|
|
8
|
+
return applyTrackerAlias(t);
|
|
9
|
+
}
|
|
10
|
+
export function trackerForSheetRow(sheetType, level) {
|
|
11
|
+
if (level === "feature")
|
|
12
|
+
return BATCH_TRACKER_BY_LEVEL.feature;
|
|
13
|
+
return normalizeSheetTracker(sheetType) ?? BATCH_TRACKER_BY_LEVEL[level];
|
|
14
|
+
}
|
|
15
|
+
/** Map sheet Priority column; empty → use workflow default. */
|
|
16
|
+
export function normalizeSheetPriority(sheetPriority) {
|
|
17
|
+
const p = sheetPriority.trim();
|
|
18
|
+
if (!p)
|
|
19
|
+
return undefined;
|
|
20
|
+
return applyPriorityAlias(p);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=sheetRedmineFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheetRedmineFields.js","sourceRoot":"","sources":["../../src/spreadsheet/sheetRedmineFields.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAErF,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IACnD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,OAAO,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAC9B,SAAiB,EACjB,KAAsB;IAEtB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,sBAAsB,CAAC,OAAO,CAAC;IAC/D,OAAO,qBAAqB,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB,CAAC,aAAqB;IACxD,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type BatchIssueLevel } from "./batchCreationTypes.js";
|
|
2
|
+
import { type BatchSheetColumnMap } from "./sheetColumnMap.js";
|
|
3
|
+
export type SheetWriteBackItem = {
|
|
4
|
+
/** 1-based sheet row */
|
|
5
|
+
rowIndex: number;
|
|
6
|
+
issueId: number;
|
|
7
|
+
issueUrl?: string;
|
|
8
|
+
level: BatchIssueLevel;
|
|
9
|
+
};
|
|
10
|
+
export type SheetWriteBackResult = {
|
|
11
|
+
updatedCells: number;
|
|
12
|
+
redmineIdColumn: number;
|
|
13
|
+
createdColumn: boolean;
|
|
14
|
+
featureInlineCell?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare function writeRedmineIdsToSheet(options: {
|
|
17
|
+
spreadsheetId: string;
|
|
18
|
+
sheetTitle: string;
|
|
19
|
+
/** 1-based header row in the sheet */
|
|
20
|
+
headerRowIndex: number;
|
|
21
|
+
headerRow: string[];
|
|
22
|
+
sheetColumns?: BatchSheetColumnMap;
|
|
23
|
+
/** Full sheet rows (0-based) for feature inline write-back */
|
|
24
|
+
sheetRows?: string[][];
|
|
25
|
+
items: SheetWriteBackItem[];
|
|
26
|
+
}): Promise<SheetWriteBackResult>;
|
|
27
|
+
//# sourceMappingURL=sheetWriteBack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheetWriteBack.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/sheetWriteBack.ts"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,eAAe,EACvB,MAAM,yBAAyB,CAAC;AAWjC,OAAO,EAIH,KAAK,mBAAmB,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,kBAAkB,GAAG;IAC7B,wBAAwB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAYF,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IAClD,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;IACvB,KAAK,EAAE,kBAAkB,EAAE,CAAC;CAC/B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA2GhC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { requireRedmineEnv } from "../config/env.js";
|
|
2
|
+
import { writeGoogleSheetCells } from "../services/googleSheets.js";
|
|
3
|
+
import { BATCH_CREATE_LEVEL_ORDER, } from "./batchCreationTypes.js";
|
|
4
|
+
import { buildFeatureCellWithIssueLink, findFeatureTitleColumnIndex, isFeatureSingleColumnRow, } from "./featureRow.js";
|
|
5
|
+
import { buildRedmineIssueIdCell, buildRedmineIssueUrl, mergeTicketCellWriteBack, } from "./redmineIssueCell.js";
|
|
6
|
+
import { resolveTaskIdColumnForWriteBack, TASK_ID_COLUMN_HEADER, usesCompositeTicketColumn, } from "./sheetColumnMap.js";
|
|
7
|
+
function cellKey(row, columnIndex) {
|
|
8
|
+
return `${row}:${columnIndex}`;
|
|
9
|
+
}
|
|
10
|
+
export async function writeRedmineIdsToSheet(options) {
|
|
11
|
+
const { columnIndex, createdColumn } = resolveTaskIdColumnForWriteBack(options.headerRow, options.sheetColumns);
|
|
12
|
+
const compositeTicketColumn = options.sheetColumns !== undefined &&
|
|
13
|
+
usesCompositeTicketColumn(options.sheetColumns);
|
|
14
|
+
const writeBackLevels = new Set([
|
|
15
|
+
"feature",
|
|
16
|
+
"userStory",
|
|
17
|
+
"subtask",
|
|
18
|
+
]);
|
|
19
|
+
const { baseUrl } = requireRedmineEnv();
|
|
20
|
+
const updatesByCell = new Map();
|
|
21
|
+
const ticketCellDraft = new Map();
|
|
22
|
+
let featureInlineCell = false;
|
|
23
|
+
for (const item of [...options.items]
|
|
24
|
+
.filter((entry) => writeBackLevels.has(entry.level))
|
|
25
|
+
.sort((a, b) => BATCH_CREATE_LEVEL_ORDER[a.level] -
|
|
26
|
+
BATCH_CREATE_LEVEL_ORDER[b.level])) {
|
|
27
|
+
const sheetRow = item.rowIndex < 1 ? 1 : item.rowIndex;
|
|
28
|
+
const url = item.issueUrl ?? buildRedmineIssueUrl(baseUrl, item.issueId);
|
|
29
|
+
const cellKeyStr = cellKey(sheetRow, columnIndex);
|
|
30
|
+
let taskIdValue;
|
|
31
|
+
if (compositeTicketColumn &&
|
|
32
|
+
(item.level === "userStory" || item.level === "subtask")) {
|
|
33
|
+
const existingCell = ticketCellDraft.get(cellKeyStr) ??
|
|
34
|
+
(options.sheetRows?.[sheetRow - 1]?.[columnIndex] ?? "");
|
|
35
|
+
taskIdValue = mergeTicketCellWriteBack(existingCell, item.level, item.issueId, url);
|
|
36
|
+
ticketCellDraft.set(cellKeyStr, taskIdValue);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
taskIdValue = buildRedmineIssueIdCell(item.issueId, url);
|
|
40
|
+
}
|
|
41
|
+
updatesByCell.set(cellKeyStr, {
|
|
42
|
+
row: sheetRow,
|
|
43
|
+
columnIndex,
|
|
44
|
+
value: taskIdValue,
|
|
45
|
+
});
|
|
46
|
+
if (item.level === "feature" && options.sheetRows) {
|
|
47
|
+
const featureRow = options.sheetRows[sheetRow - 1] ?? [];
|
|
48
|
+
if (isFeatureSingleColumnRow(featureRow, columnIndex)) {
|
|
49
|
+
const titleCol = findFeatureTitleColumnIndex(featureRow);
|
|
50
|
+
if (titleCol >= 0) {
|
|
51
|
+
const existingCell = featureRow[titleCol] ?? "";
|
|
52
|
+
updatesByCell.set(cellKey(sheetRow, titleCol), {
|
|
53
|
+
row: sheetRow,
|
|
54
|
+
columnIndex: titleCol,
|
|
55
|
+
value: buildFeatureCellWithIssueLink(existingCell, item.issueId, url),
|
|
56
|
+
});
|
|
57
|
+
featureInlineCell = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const updates = [...updatesByCell.values()];
|
|
63
|
+
if (createdColumn) {
|
|
64
|
+
updates.unshift({
|
|
65
|
+
row: options.headerRowIndex,
|
|
66
|
+
columnIndex,
|
|
67
|
+
value: TASK_ID_COLUMN_HEADER,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (updates.length === 0) {
|
|
71
|
+
return {
|
|
72
|
+
updatedCells: 0,
|
|
73
|
+
redmineIdColumn: columnIndex,
|
|
74
|
+
createdColumn,
|
|
75
|
+
...(featureInlineCell ? { featureInlineCell } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const result = await writeGoogleSheetCells({
|
|
79
|
+
spreadsheetId: options.spreadsheetId,
|
|
80
|
+
sheetTitle: options.sheetTitle,
|
|
81
|
+
updates,
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
updatedCells: result.updatedCells,
|
|
85
|
+
redmineIdColumn: columnIndex,
|
|
86
|
+
createdColumn,
|
|
87
|
+
...(featureInlineCell ? { featureInlineCell } : {}),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=sheetWriteBack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheetWriteBack.js","sourceRoot":"","sources":["../../src/spreadsheet/sheetWriteBack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { WorkflowResponse } from "../types/workflow.js";
|
|
2
|
+
import { type BatchColumnMappingInput } from "../spreadsheet/batchColumnMapping.js";
|
|
3
|
+
/** AskQuestion option: user skips the row (agent adds nodeId to skipNodeIds). */
|
|
4
|
+
export declare const ASSIGNEE_SKIP_OPTION = "Skip this row";
|
|
5
|
+
/** AskQuestion option: create row without assigned_to (clear invalid sheet label). */
|
|
6
|
+
export declare const ASSIGNEE_UNASSIGNED_OPTION = "Leave unassigned";
|
|
7
|
+
/** AskQuestion option: create user story without fixed_version. */
|
|
8
|
+
export declare const TARGET_VERSION_SKIP_OPTION = "Skip target version";
|
|
9
|
+
export type BatchSheetSource = {
|
|
10
|
+
spreadsheetId: string;
|
|
11
|
+
sheetTitle: string;
|
|
12
|
+
};
|
|
13
|
+
export type BatchCreateIssuesInput = {
|
|
14
|
+
csvPath?: string;
|
|
15
|
+
csvContent?: string;
|
|
16
|
+
/** From redmine_agent_sheet_to_csv — metadata for agent sheet write-back via Google Sheets MCP. */
|
|
17
|
+
sheetSource?: BatchSheetSource;
|
|
18
|
+
project?: string;
|
|
19
|
+
status?: string;
|
|
20
|
+
priority?: string;
|
|
21
|
+
/** nodeId → skip this row on upload */
|
|
22
|
+
skipNodeIds?: string[];
|
|
23
|
+
/** nodeId → override fields after validation */
|
|
24
|
+
rowFixes?: Record<string, {
|
|
25
|
+
subject?: string;
|
|
26
|
+
assignedTo?: string;
|
|
27
|
+
project?: string;
|
|
28
|
+
/** User Story only — id or "id — name" from project versions */
|
|
29
|
+
targetVersion?: string;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* When user stories lack Target Version: apply this to all of them, or
|
|
33
|
+
* TARGET_VERSION_SKIP_OPTION to create without fixed_version.
|
|
34
|
+
*/
|
|
35
|
+
missingTargetVersionFix?: string;
|
|
36
|
+
/**
|
|
37
|
+
* Sheet assignee label → project member label, ASSIGNEE_UNASSIGNED_OPTION to create without assignee,
|
|
38
|
+
* or ASSIGNEE_SKIP_OPTION to skip all rows with that label.
|
|
39
|
+
* One entry fixes every sub-task row sharing the same invalid name (not per-row questions).
|
|
40
|
+
*/
|
|
41
|
+
assigneeNameFixes?: Record<string, string>;
|
|
42
|
+
/** Sheet priority label → Redmine priority "id — name" from priorityOptions. */
|
|
43
|
+
priorityNameFixes?: Record<string, string>;
|
|
44
|
+
/** Sheet Type label → Redmine tracker "id — name" from trackerOptions. */
|
|
45
|
+
trackerNameFixes?: Record<string, string>;
|
|
46
|
+
confirmSave?: "yes" | "no";
|
|
47
|
+
/**
|
|
48
|
+
* After preview_gate: show_preview = full list; proceed = upload (same as confirmSave yes); cancel = abort.
|
|
49
|
+
*/
|
|
50
|
+
previewAction?: "show_preview" | "proceed" | "cancel";
|
|
51
|
+
/** nodeId → Redmine issue id already created (e.g. prior batch); used for parent linking, not re-created. */
|
|
52
|
+
existingNodeIds?: Record<string, number>;
|
|
53
|
+
/**
|
|
54
|
+
* structure_only: return raw rows + field schema for agent mapping (no issue tree).
|
|
55
|
+
* When omitted and columnMapping is missing, same as structure_only.
|
|
56
|
+
*/
|
|
57
|
+
sheetParseMode?: "structure_only";
|
|
58
|
+
/** LLM-provided column roles (header names or 0-based indices). */
|
|
59
|
+
columnMapping?: BatchColumnMappingInput;
|
|
60
|
+
/**
|
|
61
|
+
* After confirm_mapping: proceed = parse sheet with columnMapping; omit on first mapping submit.
|
|
62
|
+
*/
|
|
63
|
+
confirmMappingAction?: "proceed";
|
|
64
|
+
};
|
|
65
|
+
export declare function batchCreateIssuesWorkflow(input: BatchCreateIssuesInput): Promise<WorkflowResponse>;
|
|
66
|
+
//# sourceMappingURL=batchCreateIssuesWorkflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batchCreateIssuesWorkflow.d.ts","sourceRoot":"","sources":["../../src/workflows/batchCreateIssuesWorkflow.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAQH,KAAK,uBAAuB,EAC/B,MAAM,sCAAsC,CAAC;AAoC9C,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,0BAA0B,wBAAwB,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mGAAmG;IACnG,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CACb,MAAM,EACN;QACI,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,gEAAgE;QAChE,aAAa,CAAC,EAAE,MAAM,CAAC;KAC1B,CACJ,CAAC;IACF;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,aAAa,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,QAAQ,CAAC;IACtD,6GAA6G;IAC7G,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;OAGG;IACH,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,mEAAmE;IACnE,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACxC;;OAEG;IACH,oBAAoB,CAAC,EAAE,SAAS,CAAC;CACpC,CAAC;AAisBF,wBAAsB,yBAAyB,CAC3C,KAAK,EAAE,sBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAqiB3B"}
|