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 process2 = 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 process2 = __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 process2.env)) {
1474
+ if (option.envVar && option.envVar in process2.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,9 +1808,41 @@ var {
1797
1808
  Argument,
1798
1809
  Option,
1799
1810
  Help
1800
- } = import_.default;
1811
+ } = import__.default;
1812
+
1813
+ // lib/package.ts
1814
+ import path from "path";
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;
1840
+ }
1801
1841
 
1802
- // bine_modules
1842
+ // lib/spawn.ts
1843
+ var defaultOptions = {
1844
+ expectQuiet: false
1845
+ };
1803
1846
  async function spawn(args, options = defaultOptions) {
1804
1847
  const proc = Bun.spawn(args, { stdout: "pipe", stderr: "pipe" });
1805
1848
  const stdout = new Response(proc.stdout);
@@ -1814,19 +1857,16 @@ async function spawn(args, options = defaultOptions) {
1814
1857
  }
1815
1858
  return { out: out.trim(), err: err.trim(), code };
1816
1859
  }
1817
- async function doCommand(args) {
1818
- const { out, err } = await spawn(args);
1860
+ async function doCommand(args, options = defaultOptions) {
1861
+ const { out, err } = await spawn(args, options);
1819
1862
  if (err)
1820
1863
  console.error(err);
1821
1864
  return out;
1822
1865
  }
1823
- var defaultOptions = {
1824
- expectQuiet: false
1825
- };
1826
1866
 
1827
- // bine_modul
1828
- async function getConfig(key) {
1829
- 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);
1830
1870
  }
1831
1871
  async function createBranch(name) {
1832
1872
  return doCommand(["git", "checkout", "-b", name]);
@@ -1838,21 +1878,30 @@ async function getRemote() {
1838
1878
  return doCommand(["git", "ls-remote", "--get-url", "origin"]);
1839
1879
  }
1840
1880
 
1841
- // bine_modules/
1842
- import path from "path";
1843
- async function getGitlabConfig() {
1844
- 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;
1845
1891
  if (!host)
1846
- throw new Error("gitlab.host not in git config");
1847
- 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;
1848
1894
  if (!user)
1849
- throw new Error("user.email not in git config");
1850
- const token = await getConfig("gitlab.token");
1851
- if (!token)
1852
- throw new Error("gitlab.token not in git config");
1853
- 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 };
1854
1901
  }
1855
- var getNextLink = function(link) {
1902
+
1903
+ // lib/confluence/api.ts
1904
+ function getNextLink(link) {
1856
1905
  if (!link) {
1857
1906
  return;
1858
1907
  }
@@ -1860,17 +1909,20 @@ var getNextLink = function(link) {
1860
1909
  const match = link.match(regex);
1861
1910
  const next = match ? match[1] : undefined;
1862
1911
  return next;
1863
- };
1864
- 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
+ }
1865
1918
  const method = "GET";
1866
- const { host, token } = await getGitlabConfig();
1867
- const base = `https://${host}/api/v4`;
1868
- const requested = 100;
1869
- const sep = endpoint.includes("?") ? "&" : "?";
1870
- 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}`;
1871
1923
  const headers = new Headers;
1924
+ headers.append("Authorization", auth);
1872
1925
  headers.append("Accept", "application/json");
1873
- headers.append("Private-Token", token);
1874
1926
  const options = {
1875
1927
  method,
1876
1928
  headers
@@ -1878,85 +1930,103 @@ async function gitlabApi(endpoint) {
1878
1930
  let request = new Request(uri, options);
1879
1931
  const response = await fetch(request);
1880
1932
  let link = getNextLink(response.headers.get("Link"));
1881
- let partial = await response.json();
1882
- let result = partial;
1883
- while (partial.length == requested && link) {
1884
- 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);
1885
1942
  const next_response = await fetch(request2);
1886
1943
  link = getNextLink(next_response.headers.get("Link"));
1887
- partial = await next_response.json();
1888
- 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
+ }
1889
1948
  }
1890
1949
  return result;
1891
1950
  }
1892
- async function whoami() {
1893
- return await gitlabApi("/user");
1894
- }
1895
- async function getProjects(match) {
1896
- const projects = await gitlabApi(`/projects?membership=true&simple=true`);
1897
- if (!projects) {
1898
- throw new Error(`No projects!`);
1899
- } else if (!Array.isArray(projects)) {
1900
- console.log(projects);
1901
- 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);
1902
1955
  }
1903
- const projs = projects;
1904
- console.log(`Searching within a set of ${projs.length} projects for ${match}`);
1905
- const filtered = projs.filter((p) => {
1906
- return p.path_with_namespace.toLowerCase().includes(match.toLowerCase());
1907
- });
1908
- 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;
1909
1977
  }
1910
- async function findProject(ssh_url) {
1911
- const parts = ssh_url.split(":");
1912
- if (parts.length != 2) {
1913
- 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 : "";
1914
1998
  }
1915
- const name = path.basename(parts[1], ".git");
1916
- const projects = await getProjects(name);
1917
- const project = projects.find((p) => {
1918
- return p.ssh_url_to_repo === ssh_url;
1919
- });
1920
- return project;
1999
+ return allResults;
1921
2000
  }
1922
- async function projectScopedGet(endpoint) {
1923
- const method = "GET";
1924
- const { host, token } = await getGitlabConfig();
1925
- const remote = await getRemote();
1926
- const project = await findProject(remote);
1927
- if (!project) {
1928
- 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);
1929
2005
  }
1930
- 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`;
1931
2009
  const uri = `${base}/${endpoint}`;
2010
+ const auth = `Basic ${token}`;
1932
2011
  const headers = new Headers;
2012
+ headers.append("Authorization", auth);
1933
2013
  headers.append("Accept", "application/json");
1934
- headers.append("Private-Token", token);
1935
2014
  const options = {
1936
2015
  method,
1937
2016
  headers
1938
2017
  };
1939
2018
  const request = new Request(uri, options);
1940
2019
  const response = await fetch(request);
1941
- return await response.json();
1942
- }
1943
- async function getMergeRequest(id) {
1944
- return await projectScopedGet(`/merge_requests/${id}`);
1945
- }
1946
- async function getNamespaces() {
1947
- return await gitlabApi(`/namespaces`);
1948
- }
1949
- async function getGroups() {
1950
- return await gitlabApi(`/groups`);
2020
+ const result = await response.json();
2021
+ return result;
1951
2022
  }
1952
-
1953
- // bine_modules/c
2023
+ // lib/is_main.ts
1954
2024
  import path2 from "path";
1955
- var justBase = function(filename) {
2025
+ function justBase(filename) {
1956
2026
  const ext = path2.extname(filename);
1957
2027
  const base = path2.basename(filename, ext);
1958
2028
  return base;
1959
- };
2029
+ }
1960
2030
  function isMain(self) {
1961
2031
  const arg1 = Bun.argv[1];
1962
2032
  const argv1Base = justBase(arg1);
@@ -1965,74 +2035,48 @@ function isMain(self) {
1965
2035
  return result;
1966
2036
  }
1967
2037
 
1968
- // bine_modules/commander/lib/s
2038
+ // bin/git-confluence-page-show.ts
2039
+ var version = await getPackageVersion();
1969
2040
  function create() {
1970
2041
  const program2 = new Command;
1971
- program2.name("list").description("List projects for current user").option("-v, --verbose", "Verbose output").option("-m, --match <match>", "Match projects with paths containing <match>").action(async (options) => {
1972
- const projects = await getProjects(options.match);
1973
- if (!projects) {
1974
- console.error(`No projects!`);
1975
- process.exit(1);
1976
- }
1977
- if (options.verbose) {
1978
- console.log(projects);
2042
+ program2.version(version).name("show").description("Show information about a Confluence page").argument("id", "Page ID").option("-v, --verbose", "Verbose output").option("-b, --body-format <format>", "Include page body (storage or atlas_doc_format)").option("--body-only", "Output only the body content value (requires --body-format)").action(async (id, options) => {
2043
+ let endpoint = `pages/${id}`;
2044
+ if (options.bodyFormat) {
2045
+ endpoint += `?body-format=${options.bodyFormat}`;
2046
+ }
2047
+ const page = await confluenceApi(endpoint);
2048
+ if (options.bodyOnly) {
2049
+ if (!options.bodyFormat) {
2050
+ console.error("--body-only requires --body-format");
2051
+ process.exit(1);
2052
+ }
2053
+ const body = page.body;
2054
+ const content = options.bodyFormat === "storage" ? body?.storage?.value : body?.atlas_doc_format?.value;
2055
+ if (content) {
2056
+ console.log(content);
2057
+ } else {
2058
+ console.error("No body content returned");
2059
+ process.exit(1);
2060
+ }
2061
+ } else if (options.verbose) {
2062
+ console.log(page);
1979
2063
  } else {
1980
- let filtered = projects.map((p) => {
1981
- const { id, name, path_with_namespace, ssh_url_to_repo } = p;
1982
- return { id, name, path_with_namespace, ssh_url_to_repo };
1983
- });
1984
- console.log(filtered);
2064
+ const { host } = await getConfluenceConfig();
2065
+ const url = `https://${host}/wiki/spaces/${page.spaceId}/pages/${page.id}`;
2066
+ const result = { id: page.id, title: page.title, spaceId: page.spaceId, url };
2067
+ if (page.body?.storage?.value) {
2068
+ result.bodyLength = page.body.storage.value.length;
2069
+ }
2070
+ console.log(result);
1985
2071
  }
1986
2072
  });
1987
2073
  return program2;
1988
2074
  }
1989
- var git_lab_projects_list_default = create;
1990
- if (isMain("git-lab-projects-list")) {
2075
+ var git_confluence_page_show_default = create;
2076
+ if (isMain("git-confluence-page-show")) {
1991
2077
  await create().parseAsync(Bun.argv);
1992
2078
  }
1993
-
1994
- // bine_modules/commander/lib/sugge
1995
- function create2() {
1996
- const program2 = new Command;
1997
- program2.name("whereami").description("Show current project based on current directory").option("-v, --verbose", "Verbose output").action(async (options) => {
1998
- const ssh_url = await getRemote();
1999
- if (!ssh_url) {
2000
- console.error(`No remote!`);
2001
- process.exit(1);
2002
- }
2003
- console.log(`Remote: ${ssh_url}`);
2004
- const project = await findProject(ssh_url);
2005
- if (!project) {
2006
- console.error(`No project!`);
2007
- process.exit(1);
2008
- }
2009
- if (options.verbose) {
2010
- console.log(project);
2011
- } else {
2012
- const { id, name, path_with_namespace, ssh_url_to_repo } = project;
2013
- console.log({ id, name, path_with_namespace, ssh_url_to_repo });
2014
- }
2015
- });
2016
- return program2;
2017
- }
2018
- var git_lab_projects_whereami_default = create2;
2019
- if (isMain("git-lab-projects-whereami")) {
2020
- await create2().parseAsync(Bun.argv);
2021
- }
2022
-
2023
- // bine_modules/commander/
2024
- function create3() {
2025
- const program2 = new Command;
2026
- program2.name("projects").description("Commands for working with GitLab projects").addCommand(git_lab_projects_list_default()).addCommand(git_lab_projects_whereami_default()).action(() => {
2027
- program2.help();
2028
- });
2029
- return program2;
2030
- }
2031
- var git_lab_projects_default = create3;
2032
- if (isMain("git-lab-projects")) {
2033
- await create3().parseAsync(Bun.argv);
2034
- }
2035
2079
  export {
2036
- git_lab_projects_default as default,
2037
- create3 as create
2080
+ git_confluence_page_show_default as default,
2081
+ create
2038
2082
  };