pipe-kan 0.23.4 → 0.24.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/pipe-kan.js +46 -18
- package/package.json +1 -1
package/dist/pipe-kan.js
CHANGED
|
@@ -225,6 +225,7 @@ function mergeEpics(listed, fromBoard) {
|
|
|
225
225
|
import { spawn } from "node:child_process";
|
|
226
226
|
import { existsSync } from "node:fs";
|
|
227
227
|
import { delimiter, join, resolve } from "node:path";
|
|
228
|
+
import { availableParallelism } from "node:os";
|
|
228
229
|
|
|
229
230
|
// src/flags.ts
|
|
230
231
|
var DEFAULT_FLAGS = "";
|
|
@@ -243,12 +244,13 @@ function takeValue(list, index, flag) {
|
|
|
243
244
|
return [glued, index];
|
|
244
245
|
return [list[index + 1] ?? "", index + 1];
|
|
245
246
|
}
|
|
246
|
-
function
|
|
247
|
+
function parseFlags(flags) {
|
|
247
248
|
const list = tokens(flags.trim() || DEFAULT_FLAGS);
|
|
248
249
|
let assignee = "";
|
|
249
250
|
let epic = "";
|
|
250
251
|
let type = "";
|
|
251
252
|
let raw = "";
|
|
253
|
+
let projectsValue = "";
|
|
252
254
|
const statusEq = [];
|
|
253
255
|
const statusNeq = [];
|
|
254
256
|
for (let i = 0;i < list.length; i++) {
|
|
@@ -276,6 +278,10 @@ function flagsToJql(flags) {
|
|
|
276
278
|
statusEq.push(status);
|
|
277
279
|
continue;
|
|
278
280
|
}
|
|
281
|
+
if (token === "--projects") {
|
|
282
|
+
[projectsValue, i] = takeValue(list, i, "--projects");
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
279
285
|
if (token === "-q" || token === "--jql") {
|
|
280
286
|
raw = list[++i] ?? "";
|
|
281
287
|
continue;
|
|
@@ -284,9 +290,12 @@ function flagsToJql(flags) {
|
|
|
284
290
|
raw = token.slice(2);
|
|
285
291
|
}
|
|
286
292
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
293
|
+
const projects = projectsValue.split(",").map((p) => p.trim().toUpperCase()).filter(Boolean);
|
|
294
|
+
if (raw) {
|
|
295
|
+
return { jql: raw, projects };
|
|
296
|
+
}
|
|
297
|
+
const projectClause = projects.length ? `project in (${projects.map((p) => `"${p}"`).join(", ")})` : 'project="DEMO"';
|
|
298
|
+
const clauses = [projectClause];
|
|
290
299
|
if (assignee)
|
|
291
300
|
clauses.push(`assignee="${assignee}"`);
|
|
292
301
|
if (type)
|
|
@@ -297,7 +306,10 @@ function flagsToJql(flags) {
|
|
|
297
306
|
clauses.push(`status="${status}"`);
|
|
298
307
|
for (const status of statusNeq)
|
|
299
308
|
clauses.push(`status!="${status}"`);
|
|
300
|
-
return clauses.join(" AND ");
|
|
309
|
+
return { jql: clauses.join(" AND "), projects };
|
|
310
|
+
}
|
|
311
|
+
function flagsToJql(flags) {
|
|
312
|
+
return parseFlags(flags).jql;
|
|
301
313
|
}
|
|
302
314
|
|
|
303
315
|
// src/store.ts
|
|
@@ -429,6 +441,12 @@ Available states for issue ${key}: ${available}`
|
|
|
429
441
|
}
|
|
430
442
|
|
|
431
443
|
// src/cli.ts
|
|
444
|
+
function projectClause(flags) {
|
|
445
|
+
const { projects } = parseFlags(flags || DEFAULT_FLAGS);
|
|
446
|
+
if (!projects.length)
|
|
447
|
+
return 'project="DEMO"';
|
|
448
|
+
return `project in (${projects.map((p) => `"${p}"`).join(", ")})`;
|
|
449
|
+
}
|
|
432
450
|
function emptyList(text) {
|
|
433
451
|
return /no result found/i.test(text);
|
|
434
452
|
}
|
|
@@ -445,18 +463,18 @@ function issueKey(issue) {
|
|
|
445
463
|
function hasPaginate(args) {
|
|
446
464
|
return args.some((arg) => arg === "--paginate" || arg.startsWith("--paginate="));
|
|
447
465
|
}
|
|
448
|
-
function createStoreCli(store) {
|
|
466
|
+
function createStoreCli(store, defaultFlags = DEFAULT_FLAGS) {
|
|
449
467
|
return {
|
|
450
468
|
async list(flags) {
|
|
451
|
-
const issues = store.list(flagsToJql(flags ||
|
|
469
|
+
const issues = store.list(flagsToJql(flags || defaultFlags));
|
|
452
470
|
return JSON.stringify(issues, null, 2);
|
|
453
471
|
},
|
|
454
|
-
async listEpics() {
|
|
455
|
-
const issues = store.list(
|
|
472
|
+
async listEpics(queryFlags = defaultFlags) {
|
|
473
|
+
const issues = store.list(`${projectClause(queryFlags || defaultFlags)} AND type="Epic"`);
|
|
456
474
|
return JSON.stringify(issues, null, 2);
|
|
457
475
|
},
|
|
458
|
-
async listEpic(key) {
|
|
459
|
-
const issues = store.list(
|
|
476
|
+
async listEpic(key, queryFlags = defaultFlags) {
|
|
477
|
+
const issues = store.list(`${projectClause(queryFlags || defaultFlags)} AND parent="${key}"`);
|
|
460
478
|
return JSON.stringify(issues, null, 2);
|
|
461
479
|
},
|
|
462
480
|
async listChildren(keys) {
|
|
@@ -495,6 +513,7 @@ function resolveJiraBin(bin = process.env.JIRA_BIN ?? "jira", pathVar = process.
|
|
|
495
513
|
function createJiraCli(opts = {}) {
|
|
496
514
|
const bin = opts.bin ?? "jira";
|
|
497
515
|
const retryDelayMs = opts.retryDelayMs ?? 1000;
|
|
516
|
+
const defaultFlags = opts.flags ?? DEFAULT_FLAGS;
|
|
498
517
|
function fmt(args) {
|
|
499
518
|
return args.filter((arg) => arg !== "--raw").map((arg, i, all) => all[i - 1] === "-q" && arg.length > 48 ? `${arg.slice(0, 48)}…` : arg).join(" ");
|
|
500
519
|
}
|
|
@@ -584,15 +603,17 @@ function createJiraCli(opts = {}) {
|
|
|
584
603
|
const extra = (flags || DEFAULT_FLAGS).split(/\s+/).filter(Boolean);
|
|
585
604
|
return JSON.stringify(await listOnce(["issue", "list", ...extra, "--raw"]));
|
|
586
605
|
},
|
|
587
|
-
async listEpics() {
|
|
588
|
-
|
|
606
|
+
async listEpics(queryFlags = defaultFlags) {
|
|
607
|
+
const clause = projectClause(queryFlags || defaultFlags);
|
|
608
|
+
return listAll(["issue", "list", "-q", `${clause} AND type="Epic"`]);
|
|
589
609
|
},
|
|
590
|
-
async listEpic(key) {
|
|
610
|
+
async listEpic(key, queryFlags = defaultFlags) {
|
|
611
|
+
const clause = projectClause(queryFlags || defaultFlags);
|
|
591
612
|
return listAll([
|
|
592
613
|
"issue",
|
|
593
614
|
"list",
|
|
594
615
|
"-q",
|
|
595
|
-
|
|
616
|
+
`${clause} AND (parent="${key}" OR "Epic Link"="${key}")`
|
|
596
617
|
]);
|
|
597
618
|
},
|
|
598
619
|
async listChildren(keys) {
|
|
@@ -638,7 +659,14 @@ function createJiraCli(opts = {}) {
|
|
|
638
659
|
console.log(`Refresh children chunk ${chunkIndex + 1} failed; ${lastError ?? "unknown error"}`);
|
|
639
660
|
return { issues: [], error: lastError };
|
|
640
661
|
}
|
|
641
|
-
|
|
662
|
+
function childrenConcurrency() {
|
|
663
|
+
const env = Number(process.env.PIPE_KAN_CHILDREN_CONCURRENCY);
|
|
664
|
+
if (!Number.isNaN(env) && env > 0)
|
|
665
|
+
return env;
|
|
666
|
+
return Math.max(3, Math.min(10, availableParallelism()));
|
|
667
|
+
}
|
|
668
|
+
const concurrency = childrenConcurrency();
|
|
669
|
+
console.log(`Refresh children ${validKeys.length} epics; concurrency ${concurrency}`);
|
|
642
670
|
const chunks = [];
|
|
643
671
|
let cursor = 0;
|
|
644
672
|
for (let i = 0;i < validKeys.length; i += chunkSizeFor(lockedMode ?? "or")) {
|
|
@@ -914,7 +942,7 @@ function createApp(opts) {
|
|
|
914
942
|
console.log("Refresh");
|
|
915
943
|
try {
|
|
916
944
|
const issues = await cli.list(flags);
|
|
917
|
-
const epics = await cli.listEpics();
|
|
945
|
+
const epics = await cli.listEpics(flags);
|
|
918
946
|
const nextPayload = JSON.parse(issues);
|
|
919
947
|
const nextEpics = JSON.parse(epics);
|
|
920
948
|
const keys = issuesToBoard(nextEpics).epics.map((epic) => epic.key);
|
|
@@ -965,7 +993,7 @@ function createApp(opts) {
|
|
|
965
993
|
if (columns.length)
|
|
966
994
|
return { columns, epics: [] };
|
|
967
995
|
}
|
|
968
|
-
return stampMissingEpic(issuesToBoard(JSON.parse(await cli.listEpic(epic))), epic);
|
|
996
|
+
return stampMissingEpic(issuesToBoard(JSON.parse(await cli.listEpic(epic, flags))), epic);
|
|
969
997
|
},
|
|
970
998
|
async move(key, status) {
|
|
971
999
|
const result = await tryMove(key, status);
|