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.
Files changed (2) hide show
  1. package/dist/pipe-kan.js +46 -18
  2. 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 flagsToJql(flags) {
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
- if (raw)
288
- return raw;
289
- const clauses = ['project="DEMO"'];
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 || DEFAULT_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(flagsToJql("-tEpic"));
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(`project="DEMO" AND parent="${key}"`);
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
- return listAll(["issue", "list", "-tEpic"]);
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
- `(parent="${key}" OR "Epic Link"="${key}")`
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
- const concurrency = 5;
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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipe-kan",
3
- "version": "0.23.4",
3
+ "version": "0.24.0",
4
4
  "description": "Local Kanban for jira-cli",
5
5
  "license": "MIT",
6
6
  "type": "module",