ya-git-jira 1.5.0 → 2.0.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 (89) hide show
  1. package/.opencode/skills/architecture/SKILL.md +45 -0
  2. package/.opencode/skills/code-style/SKILL.md +76 -0
  3. package/.opencode/skills/git-confluence/SKILL.md +82 -0
  4. package/.opencode/skills/git-jira/SKILL.md +63 -0
  5. package/.opencode/skills/git-lab/SKILL.md +102 -0
  6. package/AGENTS.md +50 -0
  7. package/README.md +121 -71
  8. package/bin/git-api.ts +70 -0
  9. package/bin/git-confluence-page-search.ts +58 -0
  10. package/bin/git-confluence-page-show.ts +61 -0
  11. package/bin/git-confluence-page-update.ts +77 -0
  12. package/bin/git-confluence-page.ts +28 -0
  13. package/bin/git-confluence-space-list.ts +34 -0
  14. package/bin/git-confluence-space.ts +24 -0
  15. package/bin/git-confluence-whoami.ts +33 -0
  16. package/bin/git-confluence.ts +27 -0
  17. package/bin/git-jira-start.ts +1 -1
  18. package/bin/git-jira-whoami.ts +32 -0
  19. package/bin/git-jira.ts +2 -0
  20. package/bin/git-lab-project-mr-list.ts +57 -0
  21. package/bin/git-lab-project-mr.ts +24 -0
  22. package/bin/git-lab-project-pipeline-jobs.ts +46 -0
  23. package/bin/git-lab-project-pipeline-latest.ts +47 -0
  24. package/bin/git-lab-project-pipeline-log.ts +49 -0
  25. package/bin/git-lab-project-pipeline.ts +6 -0
  26. package/bin/git-lab-project.ts +5 -1
  27. package/bin/gitj-install-skills.ts +126 -0
  28. package/bin/gitj.ts +12 -0
  29. package/dist/bin/git-api.js +2156 -0
  30. package/dist/bin/git-bump.js +136 -125
  31. package/dist/bin/git-confluence-page-search.js +2079 -0
  32. package/dist/bin/{git-lab-projects.js → git-confluence-page-show.js} +294 -250
  33. package/dist/bin/{git-lab-projects-whereami.js → git-confluence-page-update.js} +300 -206
  34. package/dist/bin/git-confluence-page.js +2186 -0
  35. package/dist/bin/{git-lab-groups.js → git-confluence-space-list.js} +279 -210
  36. package/dist/bin/git-confluence-space.js +2073 -0
  37. package/dist/bin/git-confluence-whoami.js +2060 -0
  38. package/dist/bin/git-confluence.js +2251 -0
  39. package/dist/bin/git-jira-issue-list.js +144 -129
  40. package/dist/bin/git-jira-issue-show.js +144 -129
  41. package/dist/bin/git-jira-issue.js +148 -133
  42. package/dist/bin/git-jira-start.js +146 -131
  43. package/dist/bin/{git-lab-namespaces.js → git-jira-whoami.js} +214 -226
  44. package/dist/bin/git-jira.js +178 -143
  45. package/dist/bin/git-lab-group-list.js +326 -394
  46. package/dist/bin/git-lab-group.js +328 -396
  47. package/dist/bin/git-lab-merge-active.js +326 -394
  48. package/dist/bin/git-lab-merge-todo.js +326 -394
  49. package/dist/bin/git-lab-merge-train-list.js +294 -388
  50. package/dist/bin/git-lab-merge-train.js +296 -390
  51. package/dist/bin/git-lab-merge.js +335 -403
  52. package/dist/bin/git-lab-namespace-list.js +145 -135
  53. package/dist/bin/git-lab-namespace.js +147 -137
  54. package/dist/bin/git-lab-project-list.js +293 -387
  55. package/dist/bin/git-lab-project-mr-list.js +2740 -0
  56. package/dist/bin/git-lab-project-mr.js +2752 -0
  57. package/dist/bin/git-lab-project-pipeline-jobs.js +2734 -0
  58. package/dist/bin/git-lab-project-pipeline-latest.js +2736 -0
  59. package/dist/bin/git-lab-project-pipeline-list.js +328 -396
  60. package/dist/bin/git-lab-project-pipeline-log.js +2739 -0
  61. package/dist/bin/git-lab-project-pipeline.js +442 -407
  62. package/dist/bin/git-lab-project-whereami.js +297 -391
  63. package/dist/bin/git-lab-project.js +568 -403
  64. package/dist/bin/git-lab-whoami.js +149 -139
  65. package/dist/bin/git-lab.js +581 -454
  66. package/dist/bin/{git-lab-projects-list.js → gitj-install-skills.js} +226 -268
  67. package/dist/bin/gitj.js +1384 -578
  68. package/dist/index.js +379 -300
  69. package/index.ts +1 -0
  70. package/lib/api.ts +177 -0
  71. package/lib/confluence/api.ts +132 -0
  72. package/lib/confluence/config.ts +25 -0
  73. package/lib/confluence/index.ts +3 -0
  74. package/lib/confluence/types.ts +59 -0
  75. package/lib/git.ts +3 -3
  76. package/lib/gitlab/config.ts +5 -5
  77. package/lib/gitlab/index.ts +1 -0
  78. package/lib/gitlab/job.ts +31 -0
  79. package/lib/gitlab/merge-request.ts +20 -0
  80. package/lib/gitlab/pipeline.ts +28 -1
  81. package/lib/gitlab/project.ts +14 -5
  82. package/lib/help.ts +40 -0
  83. package/lib/jira.ts +11 -6
  84. package/lib/spawn.ts +3 -3
  85. package/package.json +18 -2
  86. package/tests/all-help.test.ts +6 -1
  87. package/tests/gitj.test.ts +1 -1
  88. package/tests/help-all.test.ts +29 -0
  89. package/bun.lockb +0 -0
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
3
  var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
4
  var __getProtoOf = Object.getPrototypeOf;
5
+ var __defProp = Object.defineProperty;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
8
  var __toESM = (mod, isNodeMode, target) => {
@@ -17,11 +17,9 @@ var __toESM = (mod, isNodeMode, target) => {
17
17
  return to;
18
18
  };
19
19
  var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
20
- var __require = (id) => {
21
- return import.meta.require(id);
22
- };
20
+ var __require = import.meta.require;
23
21
 
24
- // bine_modules/commander/lib/suggestS
22
+ // node_modules/commander/lib/error.js
25
23
  var require_error = __commonJS((exports) => {
26
24
  class CommanderError extends Error {
27
25
  constructor(exitCode, code, message) {
@@ -45,12 +43,8 @@ var require_error = __commonJS((exports) => {
45
43
  exports.InvalidArgumentError = InvalidArgumentError;
46
44
  });
47
45
 
48
- // bine_modules/commander/lib/suggestSimi
46
+ // node_modules/commander/lib/argument.js
49
47
  var require_argument = __commonJS((exports) => {
50
- var humanReadableArgName = function(arg) {
51
- const nameOutput = arg.name() + (arg.variadic === true ? "..." : "");
52
- return arg.required ? "<" + nameOutput + ">" : "[" + nameOutput + "]";
53
- };
54
48
  var { InvalidArgumentError } = require_error();
55
49
 
56
50
  class Argument {
@@ -120,11 +114,15 @@ var require_argument = __commonJS((exports) => {
120
114
  return this;
121
115
  }
122
116
  }
117
+ function humanReadableArgName(arg) {
118
+ const nameOutput = arg.name() + (arg.variadic === true ? "..." : "");
119
+ return arg.required ? "<" + nameOutput + ">" : "[" + nameOutput + "]";
120
+ }
123
121
  exports.Argument = Argument;
124
122
  exports.humanReadableArgName = humanReadableArgName;
125
123
  });
126
124
 
127
- // bine_modules/commander/lib/suggest
125
+ // node_modules/commander/lib/help.js
128
126
  var require_help = __commonJS((exports) => {
129
127
  var { humanReadableArgName } = require_argument();
130
128
 
@@ -301,7 +299,8 @@ var require_help = __commonJS((exports) => {
301
299
  return term;
302
300
  }
303
301
  function formatList(textArray) {
304
- return textArray.join("\n").replace(/^/gm, " ".repeat(itemIndentWidth));
302
+ return textArray.join(`
303
+ `).replace(/^/gm, " ".repeat(itemIndentWidth));
305
304
  }
306
305
  let output = [`Usage: ${helper.commandUsage(cmd)}`, ""];
307
306
  const commandDescription = helper.commandDescription(cmd);
@@ -334,7 +333,8 @@ var require_help = __commonJS((exports) => {
334
333
  if (commandList.length > 0) {
335
334
  output = output.concat(["Commands:", formatList(commandList), ""]);
336
335
  }
337
- return output.join("\n");
336
+ return output.join(`
337
+ `);
338
338
  }
339
339
  padWidth(cmd, helper) {
340
340
  return Math.max(helper.longestOptionTermLength(cmd, helper), helper.longestGlobalOptionTermLength(cmd, helper), helper.longestSubcommandTermLength(cmd, helper), helper.longestArgumentTermLength(cmd, helper));
@@ -348,42 +348,29 @@ var require_help = __commonJS((exports) => {
348
348
  if (columnWidth < minColumnWidth)
349
349
  return str;
350
350
  const leadingStr = str.slice(0, indent);
351
- const columnText = str.slice(indent).replace("\r\n", "\n");
351
+ const columnText = str.slice(indent).replace(`\r
352
+ `, `
353
+ `);
352
354
  const indentString = " ".repeat(indent);
353
355
  const zeroWidthSpace = "\u200B";
354
356
  const breaks = `\\s${zeroWidthSpace}`;
355
- const regex = new RegExp(`\n|.{1,${columnWidth - 1}}([${breaks}]|\$)|[^${breaks}]+?([${breaks}]|\$)`, "g");
357
+ const regex = new RegExp(`
358
+ |.{1,${columnWidth - 1}}([${breaks}]|$)|[^${breaks}]+?([${breaks}]|$)`, "g");
356
359
  const lines = columnText.match(regex) || [];
357
360
  return leadingStr + lines.map((line, i) => {
358
- if (line === "\n")
361
+ if (line === `
362
+ `)
359
363
  return "";
360
364
  return (i > 0 ? indentString : "") + line.trimEnd();
361
- }).join("\n");
365
+ }).join(`
366
+ `);
362
367
  }
363
368
  }
364
369
  exports.Help = Help;
365
370
  });
366
371
 
367
- // bine_modules/commander/lib/suggestSi
372
+ // node_modules/commander/lib/option.js
368
373
  var require_option = __commonJS((exports) => {
369
- var camelcase = function(str) {
370
- return str.split("-").reduce((str2, word) => {
371
- return str2 + word[0].toUpperCase() + word.slice(1);
372
- });
373
- };
374
- var splitOptionFlags = function(flags) {
375
- let shortFlag;
376
- let longFlag;
377
- const flagParts = flags.split(/[ |,]+/);
378
- if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1]))
379
- shortFlag = flagParts.shift();
380
- longFlag = flagParts.shift();
381
- if (!shortFlag && /^-[^-]$/.test(longFlag)) {
382
- shortFlag = longFlag;
383
- longFlag = undefined;
384
- }
385
- return { shortFlag, longFlag };
386
- };
387
374
  var { InvalidArgumentError } = require_error();
388
375
 
389
376
  class Option {
@@ -511,14 +498,33 @@ var require_option = __commonJS((exports) => {
511
498
  return option.negate === (negativeValue === value);
512
499
  }
513
500
  }
501
+ function camelcase(str) {
502
+ return str.split("-").reduce((str2, word) => {
503
+ return str2 + word[0].toUpperCase() + word.slice(1);
504
+ });
505
+ }
506
+ function splitOptionFlags(flags) {
507
+ let shortFlag;
508
+ let longFlag;
509
+ const flagParts = flags.split(/[ |,]+/);
510
+ if (flagParts.length > 1 && !/^[[<]/.test(flagParts[1]))
511
+ shortFlag = flagParts.shift();
512
+ longFlag = flagParts.shift();
513
+ if (!shortFlag && /^-[^-]$/.test(longFlag)) {
514
+ shortFlag = longFlag;
515
+ longFlag = undefined;
516
+ }
517
+ return { shortFlag, longFlag };
518
+ }
514
519
  exports.Option = Option;
515
520
  exports.splitOptionFlags = splitOptionFlags;
516
521
  exports.DualOptions = DualOptions;
517
522
  });
518
523
 
519
- // bine_modules/commander/lib/suggestSimilar.js
524
+ // node_modules/commander/lib/suggestSimilar.js
520
525
  var require_suggestSimilar = __commonJS((exports) => {
521
- var editDistance = function(a, b) {
526
+ var maxDistance = 3;
527
+ function editDistance(a, b) {
522
528
  if (Math.abs(a.length - b.length) > maxDistance)
523
529
  return Math.max(a.length, b.length);
524
530
  const d = [];
@@ -543,8 +549,8 @@ var require_suggestSimilar = __commonJS((exports) => {
543
549
  }
544
550
  }
545
551
  return d[a.length][b.length];
546
- };
547
- var suggestSimilar = function(word, candidates) {
552
+ }
553
+ function suggestSimilar(word, candidates) {
548
554
  if (!candidates || candidates.length === 0)
549
555
  return "";
550
556
  candidates = Array.from(new Set(candidates));
@@ -576,67 +582,25 @@ var require_suggestSimilar = __commonJS((exports) => {
576
582
  similar = similar.map((candidate) => `--${candidate}`);
577
583
  }
578
584
  if (similar.length > 1) {
579
- return `\n(Did you mean one of ${similar.join(", ")}?)`;
585
+ return `
586
+ (Did you mean one of ${similar.join(", ")}?)`;
580
587
  }
581
588
  if (similar.length === 1) {
582
- return `\n(Did you mean ${similar[0]}?)`;
589
+ return `
590
+ (Did you mean ${similar[0]}?)`;
583
591
  }
584
592
  return "";
585
- };
586
- var maxDistance = 3;
593
+ }
587
594
  exports.suggestSimilar = suggestSimilar;
588
595
  });
589
596
 
590
- // bine_modules/commander/lib/suggestSim
597
+ // node_modules/commander/lib/command.js
591
598
  var require_command = __commonJS((exports) => {
592
- var outputHelpIfRequested = function(cmd, args) {
593
- const helpOption = cmd._hasHelpOption && args.find((arg) => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag);
594
- if (helpOption) {
595
- cmd.outputHelp();
596
- cmd._exit(0, "commander.helpDisplayed", "(outputHelp)");
597
- }
598
- };
599
- var incrementNodeInspectorPort = function(args) {
600
- return args.map((arg) => {
601
- if (!arg.startsWith("--inspect")) {
602
- return arg;
603
- }
604
- let debugOption;
605
- let debugHost = "127.0.0.1";
606
- let debugPort = "9229";
607
- let match;
608
- if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {
609
- debugOption = match[1];
610
- } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) {
611
- debugOption = match[1];
612
- if (/^\d+$/.test(match[3])) {
613
- debugPort = match[3];
614
- } else {
615
- debugHost = match[3];
616
- }
617
- } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) {
618
- debugOption = match[1];
619
- debugHost = match[3];
620
- debugPort = match[4];
621
- }
622
- if (debugOption && debugPort !== "0") {
623
- return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;
624
- }
625
- return arg;
626
- });
627
- };
628
- var getCommandAndParents = function(startCommand) {
629
- const result = [];
630
- for (let command = startCommand;command; command = command.parent) {
631
- result.push(command);
632
- }
633
- return result;
634
- };
635
- var EventEmitter = import.meta.require("events").EventEmitter;
636
- var childProcess = import.meta.require("child_process");
637
- var path = import.meta.require("path");
638
- var fs = import.meta.require("fs");
639
- var process = import.meta.require("process");
599
+ var EventEmitter = __require("events").EventEmitter;
600
+ var childProcess = __require("child_process");
601
+ var path = __require("path");
602
+ var fs = __require("fs");
603
+ var process = __require("process");
640
604
  var { Argument, humanReadableArgName } = require_argument();
641
605
  var { CommanderError } = require_error();
642
606
  var { Help } = require_help();
@@ -853,8 +817,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
853
817
  this._exitCallback = (err) => {
854
818
  if (err.code !== "commander.executeSubCommandAsync") {
855
819
  throw err;
856
- } else {
857
- }
820
+ } else {}
858
821
  };
859
822
  }
860
823
  return this;
@@ -1491,11 +1454,14 @@ Expecting one of '${allowedValues.join("', '")}'`);
1491
1454
  return getCommandAndParents(this).reduce((combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()), {});
1492
1455
  }
1493
1456
  error(message, errorOptions) {
1494
- this._outputConfiguration.outputError(`${message}\n`, this._outputConfiguration.writeErr);
1457
+ this._outputConfiguration.outputError(`${message}
1458
+ `, this._outputConfiguration.writeErr);
1495
1459
  if (typeof this._showHelpAfterError === "string") {
1496
- this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`);
1460
+ this._outputConfiguration.writeErr(`${this._showHelpAfterError}
1461
+ `);
1497
1462
  } else if (this._showHelpAfterError) {
1498
- this._outputConfiguration.writeErr("\n");
1463
+ this._outputConfiguration.writeErr(`
1464
+ `);
1499
1465
  this.outputHelp({ error: true });
1500
1466
  }
1501
1467
  const config = errorOptions || {};
@@ -1505,7 +1471,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1505
1471
  }
1506
1472
  _parseOptionsEnv() {
1507
1473
  this.options.forEach((option) => {
1508
- if (option.envVar && (option.envVar in process.env)) {
1474
+ if (option.envVar && option.envVar in process.env) {
1509
1475
  const optionKey = option.attributeName();
1510
1476
  if (this.getOptionValue(optionKey) === undefined || ["default", "config", "env"].includes(this.getOptionValueSource(optionKey))) {
1511
1477
  if (option.required || option.optional) {
@@ -1614,7 +1580,8 @@ Expecting one of '${allowedValues.join("', '")}'`);
1614
1580
  this._versionOptionName = versionOption.attributeName();
1615
1581
  this.options.push(versionOption);
1616
1582
  this.on("option:" + versionOption.name(), () => {
1617
- this._outputConfiguration.writeOut(`${str}\n`);
1583
+ this._outputConfiguration.writeOut(`${str}
1584
+ `);
1618
1585
  this._exit(0, "commander.version", str);
1619
1586
  });
1620
1587
  return this;
@@ -1642,7 +1609,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1642
1609
  command = this.commands[this.commands.length - 1];
1643
1610
  }
1644
1611
  if (alias === command._name)
1645
- throw new Error("Command alias can\'t be the same as its name");
1612
+ throw new Error("Command alias can't be the same as its name");
1646
1613
  command._aliases.push(alias);
1647
1614
  return this;
1648
1615
  }
@@ -1756,16 +1723,60 @@ Expecting one of '${allowedValues.join("', '")}'`);
1756
1723
  helpStr = text;
1757
1724
  }
1758
1725
  if (helpStr) {
1759
- context.write(`${helpStr}\n`);
1726
+ context.write(`${helpStr}
1727
+ `);
1760
1728
  }
1761
1729
  });
1762
1730
  return this;
1763
1731
  }
1764
1732
  }
1733
+ function outputHelpIfRequested(cmd, args) {
1734
+ const helpOption = cmd._hasHelpOption && args.find((arg) => arg === cmd._helpLongFlag || arg === cmd._helpShortFlag);
1735
+ if (helpOption) {
1736
+ cmd.outputHelp();
1737
+ cmd._exit(0, "commander.helpDisplayed", "(outputHelp)");
1738
+ }
1739
+ }
1740
+ function incrementNodeInspectorPort(args) {
1741
+ return args.map((arg) => {
1742
+ if (!arg.startsWith("--inspect")) {
1743
+ return arg;
1744
+ }
1745
+ let debugOption;
1746
+ let debugHost = "127.0.0.1";
1747
+ let debugPort = "9229";
1748
+ let match;
1749
+ if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) {
1750
+ debugOption = match[1];
1751
+ } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) {
1752
+ debugOption = match[1];
1753
+ if (/^\d+$/.test(match[3])) {
1754
+ debugPort = match[3];
1755
+ } else {
1756
+ debugHost = match[3];
1757
+ }
1758
+ } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) {
1759
+ debugOption = match[1];
1760
+ debugHost = match[3];
1761
+ debugPort = match[4];
1762
+ }
1763
+ if (debugOption && debugPort !== "0") {
1764
+ return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`;
1765
+ }
1766
+ return arg;
1767
+ });
1768
+ }
1769
+ function getCommandAndParents(startCommand) {
1770
+ const result = [];
1771
+ for (let command = startCommand;command; command = command.parent) {
1772
+ result.push(command);
1773
+ }
1774
+ return result;
1775
+ }
1765
1776
  exports.Command = Command;
1766
1777
  });
1767
1778
 
1768
- // bine_modules/commander/lib/sugg
1779
+ // node_modules/commander/index.js
1769
1780
  var require_commander = __commonJS((exports, module) => {
1770
1781
  var { Argument } = require_argument();
1771
1782
  var { Command } = require_command();
@@ -1783,8 +1794,8 @@ var require_commander = __commonJS((exports, module) => {
1783
1794
  exports.Option = Option;
1784
1795
  });
1785
1796
 
1786
- // bine_modules/commander/lib/sug
1787
- var import_ = __toESM(require_commander(), 1);
1797
+ // node_modules/commander/esm.mjs
1798
+ var import__ = __toESM(require_commander(), 1);
1788
1799
  var {
1789
1800
  program,
1790
1801
  createCommand,
@@ -1797,24 +1808,41 @@ var {
1797
1808
  Argument,
1798
1809
  Option,
1799
1810
  Help
1800
- } = import_.default;
1811
+ } = import__.default;
1801
1812
 
1802
- // bine_modules/c
1813
+ // lib/package.ts
1803
1814
  import path from "path";
1804
- var justBase = function(filename) {
1805
- const ext = path.extname(filename);
1806
- const base = path.basename(filename, ext);
1807
- return base;
1808
- };
1809
- function isMain(self) {
1810
- const arg1 = Bun.argv[1];
1811
- const argv1Base = justBase(arg1);
1812
- const selfBase = justBase(self);
1813
- const result = argv1Base === selfBase;
1814
- return result;
1815
+ import fs from "fs";
1816
+ function findPackageJson() {
1817
+ const cwd = import.meta.dir;
1818
+ let dir = cwd;
1819
+ while (dir !== "/") {
1820
+ const packageJson = path.join(dir, "package.json");
1821
+ if (fs.existsSync(packageJson)) {
1822
+ return packageJson;
1823
+ }
1824
+ dir = path.dirname(dir);
1825
+ }
1826
+ return null;
1827
+ }
1828
+ async function getPackageJson() {
1829
+ const packagePath = findPackageJson();
1830
+ if (!packagePath) {
1831
+ throw new Error(`No package.json found in ${import.meta.dir} or any parent directory`);
1832
+ }
1833
+ const packageJsonText = fs.readFileSync(packagePath, "utf8");
1834
+ return JSON.parse(packageJsonText);
1835
+ }
1836
+ var packageJsonPromise = getPackageJson();
1837
+ async function getPackageVersion() {
1838
+ const packageJson = await packageJsonPromise;
1839
+ return packageJson.version;
1815
1840
  }
1816
1841
 
1817
- // bine_modules
1842
+ // lib/spawn.ts
1843
+ var defaultOptions = {
1844
+ expectQuiet: false
1845
+ };
1818
1846
  async function spawn(args, options = defaultOptions) {
1819
1847
  const proc = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" });
1820
1848
  const stdout = new Response(proc.stdout);
@@ -1829,19 +1857,16 @@ async function spawn(args, options = defaultOptions) {
1829
1857
  }
1830
1858
  return { out: out.trim(), err: err.trim(), code };
1831
1859
  }
1832
- async function doCommand(args) {
1833
- const { out, err } = await spawn(args);
1860
+ async function doCommand(args, options = defaultOptions) {
1861
+ const { out, err } = await spawn(args, options);
1834
1862
  if (err)
1835
1863
  console.error(err);
1836
1864
  return out;
1837
1865
  }
1838
- var defaultOptions = {
1839
- expectQuiet: false
1840
- };
1841
1866
 
1842
- // bine_modul
1843
- async function getConfig(key) {
1844
- return doCommand(["git", "config", "--get", key]);
1867
+ // lib/git.ts
1868
+ async function getConfig(key, options = defaultOptions) {
1869
+ return doCommand(["git", "config", "--get", key], options);
1845
1870
  }
1846
1871
  async function createBranch(name) {
1847
1872
  return doCommand(["git", "checkout", "-b", name]);
@@ -1853,21 +1878,30 @@ async function getRemote() {
1853
1878
  return doCommand(["git", "ls-remote", "--get-url", "origin"]);
1854
1879
  }
1855
1880
 
1856
- // bine_modules/
1857
- import path2 from "path";
1858
- async function getGitlabConfig() {
1859
- const host = await getConfig("gitlab.host");
1881
+ // lib/confluence/config.ts
1882
+ var gitEmailP = getConfig("user.email");
1883
+ var jiraEmailP = getConfig("jira.user");
1884
+ var confluenceEmailP = getConfig("confluence.user", { expectQuiet: true });
1885
+ var jiraHostP = getConfig("jira.host");
1886
+ var confluenceHostP = getConfig("confluence.host", { expectQuiet: true });
1887
+ var jiraTokenP = getConfig("jira.token");
1888
+ var confluenceTokenP = getConfig("confluence.token", { expectQuiet: true });
1889
+ async function getConfluenceConfig() {
1890
+ const host = await confluenceHostP || await jiraHostP;
1860
1891
  if (!host)
1861
- throw new Error("gitlab.host not in git config");
1862
- const user = await getConfig("user.email");
1892
+ throw new Error("confluence.host or jira.host not in git config");
1893
+ const user = await confluenceEmailP || await jiraEmailP || await gitEmailP;
1863
1894
  if (!user)
1864
- throw new Error("user.email not in git config");
1865
- const token = await getConfig("gitlab.token");
1866
- if (!token)
1867
- throw new Error("gitlab.token not in git config");
1868
- return { host, user, token };
1895
+ throw new Error("confluence.user, jira.user, or user.email not in git config");
1896
+ const pat = await confluenceTokenP || await jiraTokenP;
1897
+ if (!pat)
1898
+ throw new Error("confluence.token or jira.token not in git config");
1899
+ const token = Buffer.from(`${user}:${pat}`).toString("base64");
1900
+ return { host, token };
1869
1901
  }
1870
- var getNextLink = function(link) {
1902
+
1903
+ // lib/confluence/api.ts
1904
+ function getNextLink(link) {
1871
1905
  if (!link) {
1872
1906
  return;
1873
1907
  }
@@ -1875,17 +1909,20 @@ var getNextLink = function(link) {
1875
1909
  const match = link.match(regex);
1876
1910
  const next = match ? match[1] : undefined;
1877
1911
  return next;
1878
- };
1879
- async function gitlabApi(endpoint) {
1912
+ }
1913
+ async function confluenceApi(endpoint) {
1914
+ if (endpoint.startsWith("/")) {
1915
+ console.warn(`confluenceApi: endpoint ${endpoint} starts with /, removing it`);
1916
+ endpoint = endpoint.slice(1);
1917
+ }
1880
1918
  const method = "GET";
1881
- const { host, token } = await getGitlabConfig();
1882
- const base = `https://${host}/api/v4`;
1883
- const requested = 100;
1884
- const sep = endpoint.includes("?") ? "&" : "?";
1885
- const uri = `${base}/${endpoint}${sep}per_page=${requested}`;
1919
+ const { host, token } = await getConfluenceConfig();
1920
+ const base = `https://${host}/wiki/api/v2`;
1921
+ const uri = `${base}/${endpoint}`;
1922
+ const auth = `Basic ${token}`;
1886
1923
  const headers = new Headers;
1924
+ headers.append("Authorization", auth);
1887
1925
  headers.append("Accept", "application/json");
1888
- headers.append("Private-Token", token);
1889
1926
  const options = {
1890
1927
  method,
1891
1928
  headers
@@ -1893,100 +1930,132 @@ async function gitlabApi(endpoint) {
1893
1930
  let request = new Request(uri, options);
1894
1931
  const response = await fetch(request);
1895
1932
  let link = getNextLink(response.headers.get("Link"));
1896
- let partial = await response.json();
1897
- let result = partial;
1898
- while (partial.length == requested && link) {
1899
- let request2 = new Request(link, options);
1933
+ const body = await response.json();
1934
+ if (!body.results) {
1935
+ return body;
1936
+ }
1937
+ let result = body.results;
1938
+ const origin = `https://${host}`;
1939
+ while (link) {
1940
+ const url = link.startsWith("/") ? `${origin}${link}` : link;
1941
+ let request2 = new Request(url, options);
1900
1942
  const next_response = await fetch(request2);
1901
1943
  link = getNextLink(next_response.headers.get("Link"));
1902
- partial = await next_response.json();
1903
- result = result.concat(partial);
1944
+ const next_body = await next_response.json();
1945
+ if (next_body.results) {
1946
+ result = result.concat(next_body.results);
1947
+ }
1904
1948
  }
1905
1949
  return result;
1906
1950
  }
1907
- async function whoami() {
1908
- return await gitlabApi("/user");
1909
- }
1910
- async function getProjects(match) {
1911
- const projects = await gitlabApi(`/projects?membership=true&simple=true`);
1912
- if (!projects) {
1913
- throw new Error(`No projects!`);
1914
- } else if (!Array.isArray(projects)) {
1915
- console.log(projects);
1916
- throw new Error(`Projects is not an array!`);
1951
+ async function confluenceApiWrite(endpoint, method, body) {
1952
+ if (endpoint.startsWith("/")) {
1953
+ console.warn(`confluenceApiWrite: endpoint ${endpoint} starts with /, removing it`);
1954
+ endpoint = endpoint.slice(1);
1917
1955
  }
1918
- const projs = projects;
1919
- console.log(`Searching within a set of ${projs.length} projects for ${match}`);
1920
- const filtered = projs.filter((p) => {
1921
- return p.path_with_namespace.toLowerCase().includes(match.toLowerCase());
1922
- });
1923
- return filtered;
1956
+ const { host, token } = await getConfluenceConfig();
1957
+ const base = `https://${host}/wiki/api/v2`;
1958
+ const uri = `${base}/${endpoint}`;
1959
+ const auth = `Basic ${token}`;
1960
+ const headers = new Headers;
1961
+ headers.append("Authorization", auth);
1962
+ headers.append("Accept", "application/json");
1963
+ headers.append("Content-Type", "application/json");
1964
+ const options = {
1965
+ method,
1966
+ headers,
1967
+ body: JSON.stringify(body)
1968
+ };
1969
+ const request = new Request(uri, options);
1970
+ const response = await fetch(request);
1971
+ if (!response.ok) {
1972
+ const text = await response.text();
1973
+ throw new Error(`Confluence API ${method} ${endpoint} failed (${response.status}): ${text}`);
1974
+ }
1975
+ const result = await response.json();
1976
+ return result;
1924
1977
  }
1925
- async function findProject(ssh_url) {
1926
- const parts = ssh_url.split(":");
1927
- if (parts.length != 2) {
1928
- throw new Error(`${ssh_url} is invalid, could not be split into two parts at :`);
1978
+ async function confluenceSearch(cql) {
1979
+ const { host, token } = await getConfluenceConfig();
1980
+ const base = `https://${host}/wiki/rest/api`;
1981
+ const auth = `Basic ${token}`;
1982
+ const headers = new Headers;
1983
+ headers.append("Authorization", auth);
1984
+ headers.append("Accept", "application/json");
1985
+ const options = { method: "GET", headers };
1986
+ const origin = `https://${host}`;
1987
+ let uri = `${base}/search?cql=${encodeURIComponent(cql)}&limit=25`;
1988
+ let allResults = [];
1989
+ while (uri) {
1990
+ const request = new Request(uri, options);
1991
+ const response = await fetch(request);
1992
+ const body = await response.json();
1993
+ if (body.results) {
1994
+ allResults = allResults.concat(body.results);
1995
+ }
1996
+ const next = body._links?.next;
1997
+ uri = next ? next.startsWith("/") ? `${origin}${next}` : next : "";
1929
1998
  }
1930
- const name = path2.basename(parts[1], ".git");
1931
- const projects = await getProjects(name);
1932
- const project = projects.find((p) => {
1933
- return p.ssh_url_to_repo === ssh_url;
1934
- });
1935
- return project;
1999
+ return allResults;
1936
2000
  }
1937
- async function projectScopedGet(endpoint) {
1938
- const method = "GET";
1939
- const { host, token } = await getGitlabConfig();
1940
- const remote = await getRemote();
1941
- const project = await findProject(remote);
1942
- if (!project) {
1943
- throw new Error(`Could not find project for remote ${remote}`);
2001
+ async function confluenceApiV1(endpoint) {
2002
+ if (endpoint.startsWith("/")) {
2003
+ console.warn(`confluenceApiV1: endpoint ${endpoint} starts with /, removing it`);
2004
+ endpoint = endpoint.slice(1);
1944
2005
  }
1945
- const base = `https://${host}/api/v4/projects/${project.id}`;
2006
+ const method = "GET";
2007
+ const { host, token } = await getConfluenceConfig();
2008
+ const base = `https://${host}/wiki/rest/api`;
1946
2009
  const uri = `${base}/${endpoint}`;
2010
+ const auth = `Basic ${token}`;
1947
2011
  const headers = new Headers;
2012
+ headers.append("Authorization", auth);
1948
2013
  headers.append("Accept", "application/json");
1949
- headers.append("Private-Token", token);
1950
2014
  const options = {
1951
2015
  method,
1952
2016
  headers
1953
2017
  };
1954
2018
  const request = new Request(uri, options);
1955
2019
  const response = await fetch(request);
1956
- return await response.json();
1957
- }
1958
- async function getMergeRequest(id) {
1959
- return await projectScopedGet(`/merge_requests/${id}`);
2020
+ const result = await response.json();
2021
+ return result;
1960
2022
  }
1961
- async function getNamespaces() {
1962
- return await gitlabApi(`/namespaces`);
2023
+ // lib/is_main.ts
2024
+ import path2 from "path";
2025
+ function justBase(filename) {
2026
+ const ext = path2.extname(filename);
2027
+ const base = path2.basename(filename, ext);
2028
+ return base;
1963
2029
  }
1964
- async function getGroups() {
1965
- return await gitlabApi(`/groups`);
2030
+ function isMain(self) {
2031
+ const arg1 = Bun.argv[1];
2032
+ const argv1Base = justBase(arg1);
2033
+ const selfBase = justBase(self);
2034
+ const result = argv1Base === selfBase;
2035
+ return result;
1966
2036
  }
1967
2037
 
1968
- // bine_modules/commande
2038
+ // bin/git-confluence-space-list.ts
2039
+ var version = await getPackageVersion();
1969
2040
  function create() {
1970
2041
  const program2 = new Command;
1971
- program2.name("groups").description("List groups for the current user").option("-v, --verbose", "Verbose output").action(async (options) => {
1972
- const groups = await getGroups();
1973
- if (options.verbose)
1974
- console.log(groups);
1975
- else {
1976
- const filtered = groups.map((g) => {
1977
- const { id, name, full_path } = g;
1978
- return { id, name, full_path };
1979
- });
1980
- console.log(filtered);
2042
+ program2.version(version).name("list").description("List Confluence spaces").option("-v, --verbose", "Verbose output").action(async (options) => {
2043
+ const spaces = await confluenceApi("spaces");
2044
+ if (options.verbose) {
2045
+ console.log(spaces);
2046
+ } else {
2047
+ for (const space of spaces) {
2048
+ console.log(`${space.key} ${space.name}`);
2049
+ }
1981
2050
  }
1982
2051
  });
1983
2052
  return program2;
1984
2053
  }
1985
- var git_lab_groups_default = create;
1986
- if (isMain("git-lab-groups")) {
2054
+ var git_confluence_space_list_default = create;
2055
+ if (isMain("git-confluence-space-list")) {
1987
2056
  await create().parseAsync(Bun.argv);
1988
2057
  }
1989
2058
  export {
1990
- git_lab_groups_default as default,
2059
+ git_confluence_space_list_default as default,
1991
2060
  create
1992
2061
  };