@geneverse/workctl 0.2.5

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 (182) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +340 -0
  3. package/dist/packages/capabilities/assistant/src/commands.d.ts +10 -0
  4. package/dist/packages/capabilities/assistant/src/commands.js +33 -0
  5. package/dist/packages/capabilities/assistant/src/commands.js.map +1 -0
  6. package/dist/packages/capabilities/assistant/src/index.d.ts +2 -0
  7. package/dist/packages/capabilities/assistant/src/index.js +3 -0
  8. package/dist/packages/capabilities/assistant/src/index.js.map +1 -0
  9. package/dist/packages/capabilities/assistant/src/status.d.ts +18 -0
  10. package/dist/packages/capabilities/assistant/src/status.js +48 -0
  11. package/dist/packages/capabilities/assistant/src/status.js.map +1 -0
  12. package/dist/packages/capabilities/jenkins/src/commands.d.ts +9 -0
  13. package/dist/packages/capabilities/jenkins/src/commands.js +43 -0
  14. package/dist/packages/capabilities/jenkins/src/commands.js.map +1 -0
  15. package/dist/packages/capabilities/jenkins/src/definition.d.ts +10 -0
  16. package/dist/packages/capabilities/jenkins/src/definition.js +59 -0
  17. package/dist/packages/capabilities/jenkins/src/definition.js.map +1 -0
  18. package/dist/packages/capabilities/jenkins/src/index.d.ts +2 -0
  19. package/dist/packages/capabilities/jenkins/src/index.js +3 -0
  20. package/dist/packages/capabilities/jenkins/src/index.js.map +1 -0
  21. package/dist/packages/capabilities/jira/src/adapters/filesystem/config.store.d.ts +2 -0
  22. package/dist/packages/capabilities/jira/src/adapters/filesystem/config.store.js +43 -0
  23. package/dist/packages/capabilities/jira/src/adapters/filesystem/config.store.js.map +1 -0
  24. package/dist/packages/capabilities/jira/src/adapters/filesystem/local.paths.d.ts +16 -0
  25. package/dist/packages/capabilities/jira/src/adapters/filesystem/local.paths.js +46 -0
  26. package/dist/packages/capabilities/jira/src/adapters/filesystem/local.paths.js.map +1 -0
  27. package/dist/packages/capabilities/jira/src/adapters/filesystem/sync-lock.d.ts +2 -0
  28. package/dist/packages/capabilities/jira/src/adapters/filesystem/sync-lock.js +120 -0
  29. package/dist/packages/capabilities/jira/src/adapters/filesystem/sync-lock.js.map +1 -0
  30. package/dist/packages/capabilities/jira/src/adapters/jira/jira.client.d.ts +31 -0
  31. package/dist/packages/capabilities/jira/src/adapters/jira/jira.client.js +344 -0
  32. package/dist/packages/capabilities/jira/src/adapters/jira/jira.client.js.map +1 -0
  33. package/dist/packages/capabilities/jira/src/adapters/kawari/catalog.d.ts +9 -0
  34. package/dist/packages/capabilities/jira/src/adapters/kawari/catalog.js +17 -0
  35. package/dist/packages/capabilities/jira/src/adapters/kawari/catalog.js.map +1 -0
  36. package/dist/packages/capabilities/jira/src/adapters/kawari/orchestrator.d.ts +14 -0
  37. package/dist/packages/capabilities/jira/src/adapters/kawari/orchestrator.js +116 -0
  38. package/dist/packages/capabilities/jira/src/adapters/kawari/orchestrator.js.map +1 -0
  39. package/dist/packages/capabilities/jira/src/adapters/kawari/scraper.d.ts +32 -0
  40. package/dist/packages/capabilities/jira/src/adapters/kawari/scraper.js +2 -0
  41. package/dist/packages/capabilities/jira/src/adapters/kawari/scraper.js.map +1 -0
  42. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/detect.d.ts +2 -0
  43. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/detect.js +45 -0
  44. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/detect.js.map +1 -0
  45. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/extract.d.ts +3 -0
  46. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/extract.js +115 -0
  47. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/extract.js.map +1 -0
  48. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/index.d.ts +2 -0
  49. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/index.js +27 -0
  50. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/index.js.map +1 -0
  51. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/navigation.d.ts +3 -0
  52. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/navigation.js +104 -0
  53. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/navigation.js.map +1 -0
  54. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/ready.d.ts +2 -0
  55. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/ready.js +47 -0
  56. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/ready.js.map +1 -0
  57. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/shared.d.ts +4 -0
  58. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/shared.js +5 -0
  59. package/dist/packages/capabilities/jira/src/adapters/kawari/v1/shared.js.map +1 -0
  60. package/dist/packages/capabilities/jira/src/adapters/terminal/node-cli.io.d.ts +2 -0
  61. package/dist/packages/capabilities/jira/src/adapters/terminal/node-cli.io.js +40 -0
  62. package/dist/packages/capabilities/jira/src/adapters/terminal/node-cli.io.js.map +1 -0
  63. package/dist/packages/capabilities/jira/src/batch-interaction.d.ts +53 -0
  64. package/dist/packages/capabilities/jira/src/batch-interaction.js +201 -0
  65. package/dist/packages/capabilities/jira/src/batch-interaction.js.map +1 -0
  66. package/dist/packages/capabilities/jira/src/capability.d.ts +16 -0
  67. package/dist/packages/capabilities/jira/src/capability.js +56 -0
  68. package/dist/packages/capabilities/jira/src/capability.js.map +1 -0
  69. package/dist/packages/capabilities/jira/src/cli/contracts.d.ts +42 -0
  70. package/dist/packages/capabilities/jira/src/cli/contracts.js +2 -0
  71. package/dist/packages/capabilities/jira/src/cli/contracts.js.map +1 -0
  72. package/dist/packages/capabilities/jira/src/cli/errors.d.ts +3 -0
  73. package/dist/packages/capabilities/jira/src/cli/errors.js +7 -0
  74. package/dist/packages/capabilities/jira/src/cli/errors.js.map +1 -0
  75. package/dist/packages/capabilities/jira/src/cli/program.d.ts +6 -0
  76. package/dist/packages/capabilities/jira/src/cli/program.js +48 -0
  77. package/dist/packages/capabilities/jira/src/cli/program.js.map +1 -0
  78. package/dist/packages/capabilities/jira/src/cli/run-cli.d.ts +2 -0
  79. package/dist/packages/capabilities/jira/src/cli/run-cli.js +72 -0
  80. package/dist/packages/capabilities/jira/src/cli/run-cli.js.map +1 -0
  81. package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.command.d.ts +2 -0
  82. package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.command.js +165 -0
  83. package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.command.js.map +1 -0
  84. package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.service.d.ts +30 -0
  85. package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.service.js +174 -0
  86. package/dist/packages/capabilities/jira/src/commands/audit-links/audit-links.service.js.map +1 -0
  87. package/dist/packages/capabilities/jira/src/commands/command-context.d.ts +10 -0
  88. package/dist/packages/capabilities/jira/src/commands/command-context.js +2 -0
  89. package/dist/packages/capabilities/jira/src/commands/command-context.js.map +1 -0
  90. package/dist/packages/capabilities/jira/src/commands/config-show/config-show.command.d.ts +2 -0
  91. package/dist/packages/capabilities/jira/src/commands/config-show/config-show.command.js +26 -0
  92. package/dist/packages/capabilities/jira/src/commands/config-show/config-show.command.js.map +1 -0
  93. package/dist/packages/capabilities/jira/src/commands/configure/configure.command.d.ts +2 -0
  94. package/dist/packages/capabilities/jira/src/commands/configure/configure.command.js +26 -0
  95. package/dist/packages/capabilities/jira/src/commands/configure/configure.command.js.map +1 -0
  96. package/dist/packages/capabilities/jira/src/commands/configure/configure.service.d.ts +42 -0
  97. package/dist/packages/capabilities/jira/src/commands/configure/configure.service.js +205 -0
  98. package/dist/packages/capabilities/jira/src/commands/configure/configure.service.js.map +1 -0
  99. package/dist/packages/capabilities/jira/src/commands/doctor/doctor.command.d.ts +2 -0
  100. package/dist/packages/capabilities/jira/src/commands/doctor/doctor.command.js +17 -0
  101. package/dist/packages/capabilities/jira/src/commands/doctor/doctor.command.js.map +1 -0
  102. package/dist/packages/capabilities/jira/src/commands/doctor/doctor.service.d.ts +18 -0
  103. package/dist/packages/capabilities/jira/src/commands/doctor/doctor.service.js +84 -0
  104. package/dist/packages/capabilities/jira/src/commands/doctor/doctor.service.js.map +1 -0
  105. package/dist/packages/capabilities/jira/src/commands/rollback/rollback.command.d.ts +2 -0
  106. package/dist/packages/capabilities/jira/src/commands/rollback/rollback.command.js +198 -0
  107. package/dist/packages/capabilities/jira/src/commands/rollback/rollback.command.js.map +1 -0
  108. package/dist/packages/capabilities/jira/src/commands/rollback/rollback.service.d.ts +37 -0
  109. package/dist/packages/capabilities/jira/src/commands/rollback/rollback.service.js +112 -0
  110. package/dist/packages/capabilities/jira/src/commands/rollback/rollback.service.js.map +1 -0
  111. package/dist/packages/capabilities/jira/src/commands/sync/audit-export.service.d.ts +18 -0
  112. package/dist/packages/capabilities/jira/src/commands/sync/audit-export.service.js +96 -0
  113. package/dist/packages/capabilities/jira/src/commands/sync/audit-export.service.js.map +1 -0
  114. package/dist/packages/capabilities/jira/src/commands/sync/preview.service.d.ts +23 -0
  115. package/dist/packages/capabilities/jira/src/commands/sync/preview.service.js +201 -0
  116. package/dist/packages/capabilities/jira/src/commands/sync/preview.service.js.map +1 -0
  117. package/dist/packages/capabilities/jira/src/commands/sync/sync.command.d.ts +2 -0
  118. package/dist/packages/capabilities/jira/src/commands/sync/sync.command.js +537 -0
  119. package/dist/packages/capabilities/jira/src/commands/sync/sync.command.js.map +1 -0
  120. package/dist/packages/capabilities/jira/src/commands/sync/verification.service.d.ts +34 -0
  121. package/dist/packages/capabilities/jira/src/commands/sync/verification.service.js +164 -0
  122. package/dist/packages/capabilities/jira/src/commands/sync/verification.service.js.map +1 -0
  123. package/dist/packages/capabilities/jira/src/config.d.ts +37 -0
  124. package/dist/packages/capabilities/jira/src/config.js +217 -0
  125. package/dist/packages/capabilities/jira/src/config.js.map +1 -0
  126. package/dist/packages/capabilities/jira/src/dependencies.d.ts +2 -0
  127. package/dist/packages/capabilities/jira/src/dependencies.js +92 -0
  128. package/dist/packages/capabilities/jira/src/dependencies.js.map +1 -0
  129. package/dist/packages/capabilities/jira/src/domain/date-range.d.ts +10 -0
  130. package/dist/packages/capabilities/jira/src/domain/date-range.js +63 -0
  131. package/dist/packages/capabilities/jira/src/domain/date-range.js.map +1 -0
  132. package/dist/packages/capabilities/jira/src/domain/marker.d.ts +20 -0
  133. package/dist/packages/capabilities/jira/src/domain/marker.js +100 -0
  134. package/dist/packages/capabilities/jira/src/domain/marker.js.map +1 -0
  135. package/dist/packages/capabilities/jira/src/domain/timesheet-entry.d.ts +45 -0
  136. package/dist/packages/capabilities/jira/src/domain/timesheet-entry.js +117 -0
  137. package/dist/packages/capabilities/jira/src/domain/timesheet-entry.js.map +1 -0
  138. package/dist/packages/capabilities/jira/src/index.d.ts +5 -0
  139. package/dist/packages/capabilities/jira/src/index.js +4 -0
  140. package/dist/packages/capabilities/jira/src/index.js.map +1 -0
  141. package/dist/packages/capabilities/jira/src/ports/jira.d.ts +49 -0
  142. package/dist/packages/capabilities/jira/src/ports/jira.js +11 -0
  143. package/dist/packages/capabilities/jira/src/ports/jira.js.map +1 -0
  144. package/dist/packages/capabilities/jira/src/ports/sync-lock.d.ts +6 -0
  145. package/dist/packages/capabilities/jira/src/ports/sync-lock.js +7 -0
  146. package/dist/packages/capabilities/jira/src/ports/sync-lock.js.map +1 -0
  147. package/dist/packages/capabilities/jira/src/ports/timesheet.d.ts +11 -0
  148. package/dist/packages/capabilities/jira/src/ports/timesheet.js +7 -0
  149. package/dist/packages/capabilities/jira/src/ports/timesheet.js.map +1 -0
  150. package/dist/packages/capabilities/jira/src/presentation.d.ts +37 -0
  151. package/dist/packages/capabilities/jira/src/presentation.js +111 -0
  152. package/dist/packages/capabilities/jira/src/presentation.js.map +1 -0
  153. package/dist/packages/cli/src/bin.d.ts +2 -0
  154. package/dist/packages/cli/src/bin.js +4 -0
  155. package/dist/packages/cli/src/bin.js.map +1 -0
  156. package/dist/packages/cli/src/commands/browsers/browsers.command.d.ts +7 -0
  157. package/dist/packages/cli/src/commands/browsers/browsers.command.js +22 -0
  158. package/dist/packages/cli/src/commands/browsers/browsers.command.js.map +1 -0
  159. package/dist/packages/cli/src/commands/browsers/browsers.service.d.ts +16 -0
  160. package/dist/packages/cli/src/commands/browsers/browsers.service.js +37 -0
  161. package/dist/packages/cli/src/commands/browsers/browsers.service.js.map +1 -0
  162. package/dist/packages/cli/src/commands/setup/setup.command.d.ts +4 -0
  163. package/dist/packages/cli/src/commands/setup/setup.command.js +41 -0
  164. package/dist/packages/cli/src/commands/setup/setup.command.js.map +1 -0
  165. package/dist/packages/cli/src/commands/setup/setup.service.d.ts +23 -0
  166. package/dist/packages/cli/src/commands/setup/setup.service.js +32 -0
  167. package/dist/packages/cli/src/commands/setup/setup.service.js.map +1 -0
  168. package/dist/packages/cli/src/commands/update/update.command.d.ts +7 -0
  169. package/dist/packages/cli/src/commands/update/update.command.js +34 -0
  170. package/dist/packages/cli/src/commands/update/update.command.js.map +1 -0
  171. package/dist/packages/cli/src/commands/update/update.service.d.ts +35 -0
  172. package/dist/packages/cli/src/commands/update/update.service.js +134 -0
  173. package/dist/packages/cli/src/commands/update/update.service.js.map +1 -0
  174. package/dist/packages/cli/src/index.d.ts +1 -0
  175. package/dist/packages/cli/src/index.js +2 -0
  176. package/dist/packages/cli/src/index.js.map +1 -0
  177. package/dist/packages/cli/src/program.d.ts +21 -0
  178. package/dist/packages/cli/src/program.js +74 -0
  179. package/dist/packages/cli/src/program.js.map +1 -0
  180. package/dist/packages/cli/src/release-version.d.ts +1 -0
  181. package/dist/packages/cli/src/release-version.js +2 -0
  182. package/package.json +57 -0
@@ -0,0 +1,5 @@
1
+ export const LOGIN_PROMPT = "Kawari login is required. Complete login in the browser, then press Enter here to continue.\n";
2
+ export const MONTH_SELECTION_PROMPT = (targetMonth) => `Could not select Kawari month ${targetMonth} automatically. Select that month in the browser, then press Enter here to continue.\n`;
3
+ export const TIMESHEET_READY_TIMEOUT_MS = 60_000;
4
+ export const MAX_MONTH_NAVIGATION_STEPS = 120;
5
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../../../../packages/capabilities/jira/src/adapters/kawari/v1/shared.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GACvB,+FAA+F,CAAC;AAClG,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,WAAmB,EAAE,EAAE,CAC5D,iCAAiC,WAAW,wFAAwF,CAAC;AACvI,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CliIO } from "../../cli/contracts.js";
2
+ export declare function createNodeCliIO(stdin?: NodeJS.ReadStream, stdout?: NodeJS.WriteStream, stderr?: NodeJS.WriteStream, env?: NodeJS.ProcessEnv): CliIO;
@@ -0,0 +1,40 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { CliInteractionError } from "../../cli/errors.js";
3
+ import { shouldUseColor } from "../../presentation.js";
4
+ import { createClackInteraction } from "../../batch-interaction.js";
5
+ export function createNodeCliIO(stdin = process.stdin, stdout = process.stdout, stderr = process.stderr, env = process.env) {
6
+ const interactiveTerminal = stdin.isTTY && stdout.isTTY;
7
+ const question = async (prompt) => {
8
+ const terminal = createInterface({ input: stdin, output: stdout });
9
+ try {
10
+ return await terminal.question(prompt);
11
+ }
12
+ finally {
13
+ terminal.close();
14
+ }
15
+ };
16
+ return {
17
+ stdout: (message) => stdout.write(message),
18
+ stderr: (message) => stderr.write(message),
19
+ color: shouldUseColor(stdout.isTTY, env),
20
+ terminalWidth: stdout.columns,
21
+ ...(interactiveTerminal ? { interaction: createClackInteraction() } : {}),
22
+ waitForLogin: async () => {
23
+ if (!stdin.isTTY)
24
+ throw new Error("Manual login requires an interactive terminal.");
25
+ await question("");
26
+ },
27
+ waitForMonthSelection: async () => {
28
+ if (!stdin.isTTY)
29
+ throw new Error("Manual month selection requires an interactive terminal.");
30
+ await question("");
31
+ },
32
+ requestApproval: async (prompt) => {
33
+ if (!stdin.isTTY) {
34
+ throw new CliInteractionError("Jira worklog creation requires an interactive terminal.");
35
+ }
36
+ return question(prompt);
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=node-cli.io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-cli.io.js","sourceRoot":"","sources":["../../../../../../../packages/capabilities/jira/src/adapters/terminal/node-cli.io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,UAAU,eAAe,CAC7B,QAA2B,OAAO,CAAC,KAAK,EACxC,SAA6B,OAAO,CAAC,MAAM,EAC3C,SAA6B,OAAO,CAAC,MAAM,EAC3C,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,mBAAmB,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;IACxD,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAmB,EAAE;QACzD,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IACF,OAAO;QACL,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;QACxC,aAAa,EAAE,MAAM,CAAC,OAAO;QAC7B,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,YAAY,EAAE,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpF,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;QACD,qBAAqB,EAAE,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;YAC9F,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC;QACD,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,IAAI,mBAAmB,CAAC,yDAAyD,CAAC,CAAC;YAC3F,CAAC;YACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { type DateRange } from "./domain/date-range.js";
2
+ export interface MissingJiraIssue {
3
+ jiraKey: string;
4
+ entries: readonly {
5
+ date: string;
6
+ description: string;
7
+ duration: number;
8
+ }[];
9
+ }
10
+ export type MissingJiraIssueResolution = {
11
+ action: "replace";
12
+ jiraKey: string;
13
+ } | {
14
+ action: "exclude";
15
+ } | {
16
+ action: "cancel";
17
+ };
18
+ export interface OwnershipReviewIssue {
19
+ jiraKey: string;
20
+ summary: string;
21
+ assignee: string;
22
+ hours: number;
23
+ }
24
+ export interface CliInteraction {
25
+ requestDateRange(command: "sync" | "rollback" | "audit-links", defaultRange: DateRange): Promise<DateRange | undefined>;
26
+ waitForKawariLogin(): Promise<void>;
27
+ waitForKawariMonthSelection(targetMonth: string): Promise<void>;
28
+ confirmUpdate(message: string): Promise<boolean>;
29
+ begin(command: string, from: string, to: string): void;
30
+ step(message: string): void;
31
+ message(message: string): void;
32
+ info(message: string): void;
33
+ success(message: string): void;
34
+ failure(message: string): void;
35
+ warning(message: string): void;
36
+ startLoading(message: string): void;
37
+ updateLoading(message: string): void;
38
+ stopLoading(message: string): void;
39
+ failLoading(message: string): void;
40
+ note(title: string, message: string): void;
41
+ errorBlock(title: string, message: string): void;
42
+ resolveMissingJiraIssue(issue: MissingJiraIssue): Promise<MissingJiraIssueResolution>;
43
+ selectOwnershipOverrides(issues: readonly OwnershipReviewIssue[]): Promise<readonly string[] | undefined>;
44
+ confirmWorklogCreation(message: string): Promise<boolean>;
45
+ confirmWorklogDeletion(count: number): Promise<boolean>;
46
+ cancelled(message: string): void;
47
+ complete(message: string): void;
48
+ }
49
+ /** @deprecated Use CliInteraction. */
50
+ export type BatchInteraction = CliInteraction;
51
+ export declare function createClackInteraction(): CliInteraction;
52
+ /** @deprecated Use createClackInteraction. */
53
+ export declare const createClackBatchInteraction: typeof createClackInteraction;
@@ -0,0 +1,201 @@
1
+ import * as prompts from "@clack/prompts";
2
+ import { isValidIsoDate, resolveDateRange, } from "./domain/date-range.js";
3
+ function unwrapReadyPrompt(value, message) {
4
+ if (prompts.isCancel(value)) {
5
+ prompts.cancel(message);
6
+ throw new Error(message);
7
+ }
8
+ }
9
+ export function createClackInteraction() {
10
+ const loading = prompts.spinner();
11
+ return {
12
+ async requestDateRange(command, defaultRange) {
13
+ const choice = await prompts.select({
14
+ message: "Select date range",
15
+ initialValue: "current",
16
+ options: [
17
+ {
18
+ value: "current",
19
+ label: `Current month (${defaultRange.from} → ${defaultRange.to})`,
20
+ },
21
+ { value: "custom", label: "Custom date range" },
22
+ ],
23
+ });
24
+ if (prompts.isCancel(choice)) {
25
+ prompts.cancel(`${command} batch cancelled.`);
26
+ return undefined;
27
+ }
28
+ if (choice === "current")
29
+ return defaultRange;
30
+ const from = await prompts.text({
31
+ message: "From",
32
+ initialValue: defaultRange.from,
33
+ validate(value) {
34
+ if (!value || !isValidIsoDate(value)) {
35
+ return "Enter a valid date in YYYY-MM-DD format.";
36
+ }
37
+ },
38
+ });
39
+ if (prompts.isCancel(from)) {
40
+ prompts.cancel(`${command} batch cancelled.`);
41
+ return undefined;
42
+ }
43
+ const to = await prompts.text({
44
+ message: "To",
45
+ initialValue: defaultRange.to,
46
+ validate(value) {
47
+ if (!value)
48
+ return "Enter a valid date in YYYY-MM-DD format.";
49
+ try {
50
+ resolveDateRange(from, value);
51
+ }
52
+ catch (error) {
53
+ return error instanceof Error ? error.message : "Enter a valid date range.";
54
+ }
55
+ },
56
+ });
57
+ if (prompts.isCancel(to)) {
58
+ prompts.cancel(`${command} batch cancelled.`);
59
+ return undefined;
60
+ }
61
+ return resolveDateRange(from, to);
62
+ },
63
+ async waitForKawariLogin() {
64
+ prompts.log.warn("Kawari login required\nComplete login in the browser.");
65
+ const answer = await prompts.text({ message: "Press Enter when ready" });
66
+ unwrapReadyPrompt(answer, "Kawari login cancelled.");
67
+ },
68
+ async waitForKawariMonthSelection(targetMonth) {
69
+ prompts.log.warn(`Automatic month selection unavailable\nSelect Kawari month ${targetMonth} in the browser.`);
70
+ const answer = await prompts.text({ message: "Press Enter when ready" });
71
+ unwrapReadyPrompt(answer, "Kawari month selection cancelled.");
72
+ },
73
+ async confirmUpdate(message) {
74
+ const answer = await prompts.confirm({ message, initialValue: false });
75
+ if (prompts.isCancel(answer)) {
76
+ prompts.cancel("Update cancelled; nothing was installed.");
77
+ return false;
78
+ }
79
+ return answer;
80
+ },
81
+ begin(command, from, to) {
82
+ prompts.intro(`jira ${command} · ${from} → ${to}`);
83
+ },
84
+ step(message) {
85
+ prompts.log.step(message);
86
+ },
87
+ message(message) {
88
+ prompts.log.message(message);
89
+ },
90
+ info(message) {
91
+ prompts.log.info(message);
92
+ },
93
+ success(message) {
94
+ prompts.log.success(message);
95
+ },
96
+ failure(message) {
97
+ prompts.log.error(message);
98
+ },
99
+ warning(message) {
100
+ prompts.log.warn(message);
101
+ },
102
+ startLoading(message) {
103
+ loading.start(message);
104
+ },
105
+ updateLoading(message) {
106
+ loading.message(message);
107
+ },
108
+ stopLoading(message) {
109
+ loading.stop(message);
110
+ },
111
+ failLoading(message) {
112
+ loading.error(message);
113
+ },
114
+ note(title, message) {
115
+ prompts.note(message, title);
116
+ },
117
+ errorBlock(title, message) {
118
+ prompts.log.error(`${title}\n${message}`);
119
+ },
120
+ async resolveMissingJiraIssue(issue) {
121
+ prompts.log.warn(`Jira issue ${issue.jiraKey} was not found.\n` +
122
+ issue.entries.map((entry) => ` ${entry.date} · ${entry.duration}h · ${entry.description}`).join("\n"));
123
+ const action = await prompts.select({
124
+ message: `Resolve ${issue.jiraKey} for this batch`,
125
+ options: [
126
+ { value: "replace", label: "Replace with another Jira key" },
127
+ { value: "exclude", label: "Exclude from this batch" },
128
+ { value: "cancel", label: "Cancel this batch" },
129
+ ],
130
+ });
131
+ if (prompts.isCancel(action) || action === "cancel") {
132
+ prompts.cancel("Sync batch cancelled.");
133
+ return { action: "cancel" };
134
+ }
135
+ if (action === "exclude")
136
+ return { action: "exclude" };
137
+ const jiraKey = await prompts.text({
138
+ message: `Replace ${issue.jiraKey} for this batch`,
139
+ placeholder: "PROJECT-123",
140
+ validate(value) {
141
+ if (!value || !/^[A-Z][A-Z0-9]*-\d+$/.test(value.trim().toUpperCase())) {
142
+ return "Enter a Jira key such as PROJECT-123.";
143
+ }
144
+ },
145
+ });
146
+ if (prompts.isCancel(jiraKey)) {
147
+ prompts.cancel("Sync batch cancelled.");
148
+ return { action: "cancel" };
149
+ }
150
+ return { action: "replace", jiraKey: jiraKey.trim().toUpperCase() };
151
+ },
152
+ async selectOwnershipOverrides(issues) {
153
+ const selected = await prompts.multiselect({
154
+ message: "Select foreign-owned Jira issues to create worklogs for",
155
+ required: false,
156
+ options: issues.map((issue) => ({
157
+ value: issue.jiraKey,
158
+ label: `${issue.jiraKey} · ${issue.hours}h · ${issue.assignee}`,
159
+ hint: issue.summary,
160
+ })),
161
+ });
162
+ if (prompts.isCancel(selected)) {
163
+ prompts.cancel("Sync batch cancelled.");
164
+ return undefined;
165
+ }
166
+ return selected;
167
+ },
168
+ async confirmWorklogCreation(message) {
169
+ const answer = await prompts.confirm({ message, initialValue: false });
170
+ if (prompts.isCancel(answer)) {
171
+ prompts.cancel("Sync batch cancelled.");
172
+ return false;
173
+ }
174
+ return answer;
175
+ },
176
+ async confirmWorklogDeletion(count) {
177
+ const expected = `delete ${count}`;
178
+ const answer = await prompts.text({
179
+ message: `Type "${expected}" to permanently delete these worklogs`,
180
+ validate(value) {
181
+ if (value !== expected)
182
+ return `Enter exactly: ${expected}`;
183
+ },
184
+ });
185
+ if (prompts.isCancel(answer)) {
186
+ prompts.cancel("Rollback batch cancelled.");
187
+ return false;
188
+ }
189
+ return answer === expected;
190
+ },
191
+ cancelled(message) {
192
+ prompts.cancel(message);
193
+ },
194
+ complete(message) {
195
+ prompts.outro(message);
196
+ },
197
+ };
198
+ }
199
+ /** @deprecated Use createClackInteraction. */
200
+ export const createClackBatchInteraction = createClackInteraction;
201
+ //# sourceMappingURL=batch-interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-interaction.js","sourceRoot":"","sources":["../../../../../packages/capabilities/jira/src/batch-interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Command } from "commander";
2
+ import { createNodeCliIO } from "./adapters/terminal/node-cli.io.js";
3
+ export { createNodeCliIO };
4
+ export interface JiraCommandDependencies {
5
+ run(argv: readonly string[], env: NodeJS.ProcessEnv): Promise<number>;
6
+ setupCapability(env: NodeJS.ProcessEnv): {
7
+ id: string;
8
+ title: string;
9
+ defaultSelected: boolean;
10
+ isReady(): Promise<boolean>;
11
+ configure(): Promise<"Ready" | "Failed" | "Cancelled">;
12
+ verify(): Promise<boolean>;
13
+ };
14
+ }
15
+ export declare function createJiraCommandDependencies(): JiraCommandDependencies;
16
+ export declare function registerJiraCommands(program: Command, env: NodeJS.ProcessEnv, dependencies?: JiraCommandDependencies): void;
@@ -0,0 +1,56 @@
1
+ import { CommanderError } from "commander";
2
+ import { runCli } from "./cli/run-cli.js";
3
+ import { createCliDependencies } from "./dependencies.js";
4
+ import { createNodeCliIO } from "./adapters/terminal/node-cli.io.js";
5
+ import { hasValidStoredConfig, runSetup, } from "./commands/configure/configure.service.js";
6
+ import { JiraClient } from "./adapters/jira/jira.client.js";
7
+ import { writeConfigAtomic } from "./adapters/filesystem/config.store.js";
8
+ import { localPaths, migrateLegacyLocalData, } from "./adapters/filesystem/local.paths.js";
9
+ export { createNodeCliIO };
10
+ export function createJiraCommandDependencies() {
11
+ const run = async (argv, env) => {
12
+ if (!argv.includes("--help") && !argv.includes("-h")) {
13
+ await migrateLegacyLocalData();
14
+ }
15
+ const io = createNodeCliIO();
16
+ return runCli(argv, env, io, createCliDependencies(env, io));
17
+ };
18
+ return {
19
+ run,
20
+ setupCapability: (env) => ({
21
+ id: "jira",
22
+ title: "jira — Jira time synchronization",
23
+ defaultSelected: true,
24
+ isReady: async () => hasValidStoredConfig(localPaths().configFile),
25
+ configure: async () => {
26
+ try {
27
+ await runSetup(localPaths().configFile, process.stdin.isTTY === true && process.stdout.isTTY === true, {
28
+ createJiraClient: (baseUrl, email, token) => new JiraClient(baseUrl, email, token),
29
+ writeConfig: writeConfigAtomic,
30
+ }, undefined, "compact");
31
+ return "Ready";
32
+ }
33
+ catch (error) {
34
+ return error instanceof Error && error.name === "SetupCancelledError"
35
+ ? "Cancelled"
36
+ : "Failed";
37
+ }
38
+ },
39
+ verify: async () => await run(["doctor"], env) === 0,
40
+ }),
41
+ };
42
+ }
43
+ export function registerJiraCommands(program, env, dependencies = createJiraCommandDependencies()) {
44
+ program.command("jira [args...]")
45
+ .description("run the Kawari-to-Jira time synchronization capability")
46
+ .helpOption(false)
47
+ .allowUnknownOption(true)
48
+ .allowExcessArguments(true)
49
+ .action(async (args) => {
50
+ const exitCode = await dependencies.run(args, env);
51
+ if (exitCode !== 0) {
52
+ throw new CommanderError(exitCode, "jira.failed", "jira command failed");
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../../../packages/capabilities/jira/src/capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { EffectiveConfig } from "../config.js";
2
+ import type { DoctorCheck } from "../commands/doctor/doctor.service.js";
3
+ import type { TimesheetInspection } from "../ports/timesheet.js";
4
+ import type { JiraIssueSnapshot, JiraLinkIssueSnapshot } from "../ports/jira.js";
5
+ import type { TimesheetEntry } from "../domain/timesheet-entry.js";
6
+ import type { AuditFormat, AuditRecord } from "../commands/sync/audit-export.service.js";
7
+ import type { RollbackReceipt } from "../commands/rollback/rollback.service.js";
8
+ import type { LinkAuditRecord } from "../commands/audit-links/audit-links.service.js";
9
+ import type { CliInteraction } from "../batch-interaction.js";
10
+ import type { SyncLockLease } from "../ports/sync-lock.js";
11
+ export interface CliIO {
12
+ stdout: (message: string) => void;
13
+ stderr: (message: string) => void;
14
+ color?: boolean;
15
+ terminalWidth?: number;
16
+ waitForLogin?: () => Promise<void>;
17
+ waitForMonthSelection?: () => Promise<void>;
18
+ requestApproval?: (prompt: string) => Promise<string>;
19
+ interaction?: CliInteraction;
20
+ /** @deprecated Use interaction. */
21
+ batchInteraction?: CliInteraction;
22
+ }
23
+ export interface CliDependencies {
24
+ acquireSyncLock(): Promise<SyncLockLease>;
25
+ inspect: (timesheetUrl: string, targetMonth: string, scraperVersion?: string) => Promise<TimesheetInspection>;
26
+ readJiraIssue(config: EffectiveConfig["config"], issueKey: string): Promise<JiraIssueSnapshot>;
27
+ readJiraLinkIssue?(config: EffectiveConfig["config"], issueKey: string): Promise<JiraLinkIssueSnapshot>;
28
+ createJiraWorklog(config: EffectiveConfig["config"], entry: TimesheetEntry): Promise<{
29
+ id: string;
30
+ }>;
31
+ readCurrentJiraAccount?(config: EffectiveConfig["config"]): Promise<{
32
+ accountId: string;
33
+ }>;
34
+ deleteJiraWorklog?(config: EffectiveConfig["config"], issueKey: string, worklogId: string): Promise<void>;
35
+ writeRollbackReceipt(receipt: RollbackReceipt): Promise<string>;
36
+ writeAuditExport(command: string, from: string, to: string, format: AuditFormat, records: readonly AuditRecord[]): Promise<string>;
37
+ writeLinkAuditExport(from: string, to: string, format: AuditFormat, records: readonly LinkAuditRecord[]): Promise<string>;
38
+ resolveEffectiveConfig?(): EffectiveConfig;
39
+ setup?(ifNeeded: boolean): Promise<void>;
40
+ doctor?(config: EffectiveConfig["config"]): Promise<readonly DoctorCheck[]>;
41
+ configPath: string;
42
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/cli/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare class CliInteractionError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -0,0 +1,7 @@
1
+ export class CliInteractionError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "CliInteractionError";
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/cli/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import { Command } from "commander";
2
+ import type { CliDependencies, CliIO } from "./contracts.js";
3
+ export type { CliDependencies, CliIO } from "./contracts.js";
4
+ export { CliInteractionError } from "./errors.js";
5
+ export { runCli } from "./run-cli.js";
6
+ export declare function createProgram(env: NodeJS.ProcessEnv, io: CliIO, dependencies: CliDependencies): Command;
@@ -0,0 +1,48 @@
1
+ import { Command } from "commander";
2
+ import { CONFIG_FIELDS, parseConfig } from "../config.js";
3
+ import { registerConfigureCommand } from "../commands/configure/configure.command.js";
4
+ import { registerConfigShowCommand } from "../commands/config-show/config-show.command.js";
5
+ import { registerDoctorCommand } from "../commands/doctor/doctor.command.js";
6
+ import { registerAuditLinksCommand } from "../commands/audit-links/audit-links.command.js";
7
+ import { registerRollbackCommand } from "../commands/rollback/rollback.command.js";
8
+ import { registerSyncCommands } from "../commands/sync/sync.command.js";
9
+ export { CliInteractionError } from "./errors.js";
10
+ export { runCli } from "./run-cli.js";
11
+ export function createProgram(env, io, dependencies) {
12
+ const interaction = io.interaction ?? io.batchInteraction;
13
+ const output = (message, title = "Result") => {
14
+ if (interaction)
15
+ interaction.note(title, message.trimEnd());
16
+ else
17
+ io.stdout(message);
18
+ };
19
+ const failure = (message, title = "Error") => {
20
+ if (interaction)
21
+ interaction.errorBlock(title, message.trimEnd());
22
+ else
23
+ io.stderr(message);
24
+ };
25
+ const program = new Command();
26
+ program
27
+ .name("jira")
28
+ .description("Synchronize Kawari timesheets with Jira Cloud worklogs")
29
+ .showHelpAfterError()
30
+ .configureOutput({
31
+ writeOut: (text) => io.stdout(text),
32
+ writeErr: (text) => failure(text, "Command error"),
33
+ })
34
+ .exitOverride();
35
+ const effectiveConfig = () => dependencies.resolveEffectiveConfig?.() ?? {
36
+ config: parseConfig(env),
37
+ sources: Object.fromEntries(CONFIG_FIELDS.map((field) => [field, "environment"])),
38
+ };
39
+ const commandContext = { program, io, dependencies, effectiveConfig, output };
40
+ registerConfigureCommand(commandContext);
41
+ registerConfigShowCommand(commandContext);
42
+ registerDoctorCommand(commandContext);
43
+ registerAuditLinksCommand(commandContext);
44
+ registerRollbackCommand(commandContext);
45
+ registerSyncCommands(commandContext);
46
+ return program;
47
+ }
48
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/cli/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAwB,MAAM,cAAc,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAGxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,UAAU,aAAa,CAC3B,GAAsB,EACtB,EAAS,EACT,YAA6B;IAE7B,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,gBAAgB,CAAC;IAC1D,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,KAAK,GAAG,QAAQ,EAAE,EAAE;QACnD,IAAI,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;;YACvD,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,KAAK,GAAG,OAAO,EAAE,EAAE;QACnD,IAAI,WAAW;YAAE,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;;YAC7D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,MAAM,CAAC;SACZ,WAAW,CAAC,wDAAwD,CAAC;SACrE,kBAAkB,EAAE;SACpB,eAAe,CAAC;QACf,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC;KACnD,CAAC;SACD,YAAY,EAAE,CAAC;IAElB,MAAM,eAAe,GAAG,GAAoB,EAAE,CAC5C,YAAY,CAAC,sBAAsB,EAAE,EAAE,IAAI;QACzC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC;QACxB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CACpD;KAC7B,CAAC;IAEJ,MAAM,cAAc,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC9E,wBAAwB,CAAC,cAAc,CAAC,CAAC;IACzC,yBAAyB,CAAC,cAAc,CAAC,CAAC;IAC1C,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACtC,yBAAyB,CAAC,cAAc,CAAC,CAAC;IAC1C,uBAAuB,CAAC,cAAc,CAAC,CAAC;IACxC,oBAAoB,CAAC,cAAc,CAAC,CAAC;IAErC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CliDependencies, CliIO } from "./contracts.js";
2
+ export declare function runCli(argv: readonly string[], env: NodeJS.ProcessEnv, io: CliIO, dependencies: CliDependencies): Promise<number>;
@@ -0,0 +1,72 @@
1
+ import { CommanderError } from "commander";
2
+ import { ConfigFileError, ConfigurationError } from "../config.js";
3
+ import { DateRangeError } from "../domain/date-range.js";
4
+ import { TimesheetBrowserError } from "../ports/timesheet.js";
5
+ import { JiraClientError } from "../ports/jira.js";
6
+ import { LinkAuditError } from "../commands/audit-links/audit-links.service.js";
7
+ import { CliInteractionError } from "./errors.js";
8
+ import { createProgram } from "./program.js";
9
+ import { SyncLockError } from "../ports/sync-lock.js";
10
+ function reportCliError(io, message) {
11
+ const interaction = io.interaction ?? io.batchInteraction;
12
+ if (interaction)
13
+ interaction.errorBlock("Error", message.trimEnd());
14
+ else
15
+ io.stderr(message);
16
+ }
17
+ export async function runCli(argv, env, io, dependencies) {
18
+ const program = createProgram(env, io, dependencies);
19
+ try {
20
+ await program.parseAsync([...argv], { from: "user" });
21
+ return 0;
22
+ }
23
+ catch (error) {
24
+ if (error instanceof ConfigurationError) {
25
+ reportCliError(io, `${error.message}\n`);
26
+ return 2;
27
+ }
28
+ if (error instanceof ConfigFileError) {
29
+ reportCliError(io, `${error.message}\nRun \`workctl jira configure\` to repair the configuration.\n`);
30
+ return 2;
31
+ }
32
+ if (error instanceof DateRangeError) {
33
+ reportCliError(io, `${error.message}\n`);
34
+ return 2;
35
+ }
36
+ if (error instanceof CommanderError) {
37
+ if (error.code === "commander.helpDisplayed" || error.code === "commander.version") {
38
+ return 0;
39
+ }
40
+ if (error.code === "batch.cancelled" || error.code === "auditLinks.cancelled")
41
+ return 0;
42
+ if (error.code === "batch5.syncConflict" ||
43
+ error.code === "batch4.invalidEntries" ||
44
+ error.code === "batch6.interactiveRequired" ||
45
+ error.code === "batch6.ownershipChanged" ||
46
+ error.code === "batch6.partialFailure" ||
47
+ error.code === "batch7.verificationFailed" ||
48
+ error.code === "batch7.invalidExportFormat" ||
49
+ error.code === "auditLinks.invalidExportFormat" ||
50
+ error.code === "auditLinks.notConfigured" ||
51
+ error.code === "auditLinks.blocked" ||
52
+ error.code === "doctor.failed" ||
53
+ error.code === "rollback.invalidIssue" ||
54
+ error.code === "rollback.blocked" ||
55
+ error.code === "rollback.interactiveRequired" ||
56
+ error.code === "rollback.partialFailure") {
57
+ reportCliError(io, `${error.message}\n`);
58
+ }
59
+ return error.exitCode;
60
+ }
61
+ if (error instanceof TimesheetBrowserError ||
62
+ error instanceof JiraClientError ||
63
+ error instanceof LinkAuditError ||
64
+ error instanceof SyncLockError ||
65
+ error instanceof CliInteractionError) {
66
+ reportCliError(io, `${error.message}\n`);
67
+ return 1;
68
+ }
69
+ throw error;
70
+ }
71
+ }
72
+ //# sourceMappingURL=run-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../../../../../../packages/capabilities/jira/src/cli/run-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,SAAS,cAAc,CAAC,EAAS,EAAE,OAAe;IAChD,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,gBAAgB,CAAC;IAC1D,IAAI,WAAW;QAAE,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;;QAC/D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAuB,EACvB,GAAsB,EACtB,EAAS,EACT,YAA6B;IAE7B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,EAAE,EAAE,YAAY,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,cAAc,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,cAAc,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,iEAAiE,CAAC,CAAC;YACtG,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YACpC,cAAc,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,IAAI,KAAK,yBAAyB,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACnF,OAAO,CAAC,CAAC;YACX,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB;gBAAE,OAAO,CAAC,CAAC;YACxF,IACE,KAAK,CAAC,IAAI,KAAK,qBAAqB;gBACpC,KAAK,CAAC,IAAI,KAAK,uBAAuB;gBACtC,KAAK,CAAC,IAAI,KAAK,4BAA4B;gBAC3C,KAAK,CAAC,IAAI,KAAK,yBAAyB;gBACxC,KAAK,CAAC,IAAI,KAAK,uBAAuB;gBACtC,KAAK,CAAC,IAAI,KAAK,2BAA2B;gBAC1C,KAAK,CAAC,IAAI,KAAK,4BAA4B;gBAC3C,KAAK,CAAC,IAAI,KAAK,gCAAgC;gBAC/C,KAAK,CAAC,IAAI,KAAK,0BAA0B;gBACzC,KAAK,CAAC,IAAI,KAAK,oBAAoB;gBACnC,KAAK,CAAC,IAAI,KAAK,eAAe;gBAC9B,KAAK,CAAC,IAAI,KAAK,uBAAuB;gBACtC,KAAK,CAAC,IAAI,KAAK,kBAAkB;gBACjC,KAAK,CAAC,IAAI,KAAK,8BAA8B;gBAC7C,KAAK,CAAC,IAAI,KAAK,yBAAyB,EACxC,CAAC;gBACD,cAAc,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;QACD,IACE,KAAK,YAAY,qBAAqB;YACtC,KAAK,YAAY,eAAe;YAChC,KAAK,YAAY,cAAc;YAC/B,KAAK,YAAY,aAAa;YAC9B,KAAK,YAAY,mBAAmB,EACpC,CAAC;YACD,cAAc,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CommandContext } from "../command-context.js";
2
+ export declare function registerAuditLinksCommand({ program, io, dependencies, effectiveConfig }: CommandContext): void;