@knpkv/jira-clockify 1.3.0 → 1.4.1

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 (242) hide show
  1. package/README.md +245 -1
  2. package/dist/package.json +36 -12
  3. package/dist/src/agent/agentSettings.d.ts +18 -0
  4. package/dist/src/agent/agentSettings.d.ts.map +1 -0
  5. package/dist/src/agent/agentSettings.js +23 -0
  6. package/dist/src/agent/agentSettings.js.map +1 -0
  7. package/dist/src/agent/schedule.d.ts +20 -0
  8. package/dist/src/agent/schedule.d.ts.map +1 -0
  9. package/dist/src/agent/schedule.js +189 -0
  10. package/dist/src/agent/schedule.js.map +1 -0
  11. package/dist/src/agent/sessions.d.ts +427 -0
  12. package/dist/src/agent/sessions.d.ts.map +1 -0
  13. package/dist/src/agent/sessions.js +868 -0
  14. package/dist/src/agent/sessions.js.map +1 -0
  15. package/dist/src/agent/sourceConsumption.d.ts +79 -0
  16. package/dist/src/agent/sourceConsumption.d.ts.map +1 -0
  17. package/dist/src/agent/sourceConsumption.js +191 -0
  18. package/dist/src/agent/sourceConsumption.js.map +1 -0
  19. package/dist/src/agent/watch.d.ts +76 -0
  20. package/dist/src/agent/watch.d.ts.map +1 -0
  21. package/dist/src/agent/watch.js +45 -0
  22. package/dist/src/agent/watch.js.map +1 -0
  23. package/dist/src/agent/writePlanning.d.ts +154 -0
  24. package/dist/src/agent/writePlanning.d.ts.map +1 -0
  25. package/dist/src/agent/writePlanning.js +210 -0
  26. package/dist/src/agent/writePlanning.js.map +1 -0
  27. package/dist/src/bin.d.ts +3 -0
  28. package/dist/src/bin.d.ts.map +1 -0
  29. package/dist/src/bin.js +9 -3
  30. package/dist/src/bin.js.map +1 -1
  31. package/dist/src/cli/agentWrite.d.ts +164 -0
  32. package/dist/src/cli/agentWrite.d.ts.map +1 -0
  33. package/dist/src/cli/agentWrite.js +362 -0
  34. package/dist/src/cli/agentWrite.js.map +1 -0
  35. package/dist/src/cli/auth.d.ts +8 -0
  36. package/dist/src/cli/auth.d.ts.map +1 -0
  37. package/dist/src/cli/auth.js +10 -10
  38. package/dist/src/cli/auth.js.map +1 -1
  39. package/dist/src/cli/calendar.d.ts +42 -0
  40. package/dist/src/cli/calendar.d.ts.map +1 -0
  41. package/dist/src/cli/calendar.js +189 -0
  42. package/dist/src/cli/calendar.js.map +1 -0
  43. package/dist/src/cli/config.d.ts +12 -0
  44. package/dist/src/cli/config.d.ts.map +1 -0
  45. package/dist/src/cli/config.js +163 -21
  46. package/dist/src/cli/config.js.map +1 -1
  47. package/dist/src/cli/fetchTicket.d.ts +51 -0
  48. package/dist/src/cli/fetchTicket.d.ts.map +1 -0
  49. package/dist/src/cli/fetchTicket.js +18 -2
  50. package/dist/src/cli/fetchTicket.js.map +1 -1
  51. package/dist/src/cli/fuzzySelect.d.ts +24 -0
  52. package/dist/src/cli/fuzzySelect.d.ts.map +1 -0
  53. package/dist/src/cli/layers.d.ts +40 -0
  54. package/dist/src/cli/layers.d.ts.map +1 -0
  55. package/dist/src/cli/layers.js +57 -13
  56. package/dist/src/cli/layers.js.map +1 -1
  57. package/dist/src/cli/list.d.ts +8 -0
  58. package/dist/src/cli/list.d.ts.map +1 -0
  59. package/dist/src/cli/list.js +2 -2
  60. package/dist/src/cli/list.js.map +1 -1
  61. package/dist/src/cli/reconcile.d.ts +129 -0
  62. package/dist/src/cli/reconcile.d.ts.map +1 -0
  63. package/dist/src/cli/reconcile.js +635 -46
  64. package/dist/src/cli/reconcile.js.map +1 -1
  65. package/dist/src/cli/root.d.ts +15 -0
  66. package/dist/src/cli/root.d.ts.map +1 -0
  67. package/dist/src/cli/root.js +4 -3
  68. package/dist/src/cli/root.js.map +1 -1
  69. package/dist/src/cli/runtimeFailure.d.ts +10 -0
  70. package/dist/src/cli/runtimeFailure.d.ts.map +1 -0
  71. package/dist/src/cli/runtimeFailure.js +17 -0
  72. package/dist/src/cli/runtimeFailure.js.map +1 -0
  73. package/dist/src/cli/setup.d.ts +10 -0
  74. package/dist/src/cli/setup.d.ts.map +1 -0
  75. package/dist/src/cli/setup.js +7 -7
  76. package/dist/src/cli/setup.js.map +1 -1
  77. package/dist/src/cli/timer/discard.d.ts +4 -0
  78. package/dist/src/cli/timer/discard.d.ts.map +1 -0
  79. package/dist/src/cli/timer/discard.js +2 -2
  80. package/dist/src/cli/timer/discard.js.map +1 -1
  81. package/dist/src/cli/timer/edit.d.ts +22 -0
  82. package/dist/src/cli/timer/edit.d.ts.map +1 -0
  83. package/dist/src/cli/timer/edit.js +62 -42
  84. package/dist/src/cli/timer/edit.js.map +1 -1
  85. package/dist/src/cli/timer/index.d.ts +12 -0
  86. package/dist/src/cli/timer/index.d.ts.map +1 -0
  87. package/dist/src/cli/timer/log.d.ts +16 -0
  88. package/dist/src/cli/timer/log.d.ts.map +1 -0
  89. package/dist/src/cli/timer/log.js +6 -6
  90. package/dist/src/cli/timer/log.js.map +1 -1
  91. package/dist/src/cli/timer/start.d.ts +21 -0
  92. package/dist/src/cli/timer/start.d.ts.map +1 -0
  93. package/dist/src/cli/timer/start.js +9 -9
  94. package/dist/src/cli/timer/start.js.map +1 -1
  95. package/dist/src/cli/timer/status.d.ts +22 -0
  96. package/dist/src/cli/timer/status.d.ts.map +1 -0
  97. package/dist/src/cli/timer/status.js +3 -3
  98. package/dist/src/cli/timer/status.js.map +1 -1
  99. package/dist/src/cli/timer/stop.d.ts +48 -0
  100. package/dist/src/cli/timer/stop.d.ts.map +1 -0
  101. package/dist/src/cli/timer/stop.js +19 -19
  102. package/dist/src/cli/timer/stop.js.map +1 -1
  103. package/dist/src/cli/timer.d.ts +11 -0
  104. package/dist/src/cli/timer.d.ts.map +1 -0
  105. package/dist/src/cli/timer.js +1 -1
  106. package/dist/src/cli/timer.js.map +1 -1
  107. package/dist/src/cli/watch.d.ts +54 -0
  108. package/dist/src/cli/watch.d.ts.map +1 -0
  109. package/dist/src/cli/watch.js +412 -0
  110. package/dist/src/cli/watch.js.map +1 -0
  111. package/dist/src/cli/watchLease.d.ts +99 -0
  112. package/dist/src/cli/watchLease.d.ts.map +1 -0
  113. package/dist/src/cli/watchLease.js +204 -0
  114. package/dist/src/cli/watchLease.js.map +1 -0
  115. package/dist/src/cli/writerGuard.d.ts +37 -0
  116. package/dist/src/cli/writerGuard.d.ts.map +1 -0
  117. package/dist/src/cli/writerGuard.js +92 -0
  118. package/dist/src/cli/writerGuard.js.map +1 -0
  119. package/dist/src/index.d.ts +46 -0
  120. package/dist/src/index.d.ts.map +1 -0
  121. package/dist/src/index.js +46 -0
  122. package/dist/src/index.js.map +1 -0
  123. package/dist/src/main.d.ts +4 -0
  124. package/dist/src/main.d.ts.map +1 -0
  125. package/dist/src/services/AgentSessionReader.d.ts +121 -0
  126. package/dist/src/services/AgentSessionReader.d.ts.map +1 -0
  127. package/dist/src/services/AgentSessionReader.js +392 -0
  128. package/dist/src/services/AgentSessionReader.js.map +1 -0
  129. package/dist/src/services/ClockifyAuth.d.ts +47 -0
  130. package/dist/src/services/ClockifyAuth.d.ts.map +1 -0
  131. package/dist/src/services/ClockifyAuth.js +2 -2
  132. package/dist/src/services/ClockifyAuth.js.map +1 -1
  133. package/dist/src/services/CodexTranscript.d.ts +112 -0
  134. package/dist/src/services/CodexTranscript.d.ts.map +1 -0
  135. package/dist/src/services/CodexTranscript.js +96 -0
  136. package/dist/src/services/CodexTranscript.js.map +1 -0
  137. package/dist/src/services/ConfigService.d.ts +99 -0
  138. package/dist/src/services/ConfigService.d.ts.map +1 -0
  139. package/dist/src/services/ConfigService.js +79 -7
  140. package/dist/src/services/ConfigService.js.map +1 -1
  141. package/dist/src/services/HomeDirectory.d.ts +17 -0
  142. package/dist/src/services/HomeDirectory.d.ts.map +1 -0
  143. package/dist/src/services/HomeDirectory.js +1 -1
  144. package/dist/src/services/IssueFacts.d.ts +127 -0
  145. package/dist/src/services/IssueFacts.d.ts.map +1 -0
  146. package/dist/src/services/IssueFacts.js +277 -0
  147. package/dist/src/services/IssueFacts.js.map +1 -0
  148. package/dist/src/services/ProviderDeletion.d.ts +19 -0
  149. package/dist/src/services/ProviderDeletion.d.ts.map +1 -0
  150. package/dist/src/services/ProviderDeletion.js +37 -0
  151. package/dist/src/services/ProviderDeletion.js.map +1 -0
  152. package/dist/src/services/ReconcileService.d.ts +378 -0
  153. package/dist/src/services/ReconcileService.d.ts.map +1 -0
  154. package/dist/src/services/ReconcileService.js +1270 -79
  155. package/dist/src/services/ReconcileService.js.map +1 -1
  156. package/dist/src/services/SavedEntries.d.ts +40 -0
  157. package/dist/src/services/SavedEntries.d.ts.map +1 -0
  158. package/dist/src/services/SavedEntries.js +209 -0
  159. package/dist/src/services/SavedEntries.js.map +1 -0
  160. package/dist/src/services/SessionAttributor.d.ts +114 -0
  161. package/dist/src/services/SessionAttributor.d.ts.map +1 -0
  162. package/dist/src/services/SessionAttributor.js +240 -0
  163. package/dist/src/services/SessionAttributor.js.map +1 -0
  164. package/dist/src/services/SourceLedger.d.ts +104 -0
  165. package/dist/src/services/SourceLedger.d.ts.map +1 -0
  166. package/dist/src/services/SourceLedger.js +302 -0
  167. package/dist/src/services/SourceLedger.js.map +1 -0
  168. package/dist/src/services/StateWriter.d.ts +39 -0
  169. package/dist/src/services/StateWriter.d.ts.map +1 -0
  170. package/dist/src/services/TicketService.d.ts +63 -0
  171. package/dist/src/services/TicketService.d.ts.map +1 -0
  172. package/dist/src/services/TimerService.d.ts +145 -0
  173. package/dist/src/services/TimerService.d.ts.map +1 -0
  174. package/dist/src/services/TimerService.js +113 -80
  175. package/dist/src/services/TimerService.js.map +1 -1
  176. package/dist/src/services/internal/JiraWorklogPost.d.ts +7 -0
  177. package/dist/src/services/internal/JiraWorklogPost.d.ts.map +1 -0
  178. package/dist/src/services/internal/JiraWorklogPost.js +32 -0
  179. package/dist/src/services/internal/JiraWorklogPost.js.map +1 -0
  180. package/dist/src/testing/fakeHeadless.d.ts +318 -0
  181. package/dist/src/testing/fakeHeadless.d.ts.map +1 -0
  182. package/dist/src/testing/fakeHeadless.js +1149 -0
  183. package/dist/src/testing/fakeHeadless.js.map +1 -0
  184. package/dist/src/tui/App.d.ts +6 -0
  185. package/dist/src/tui/App.d.ts.map +1 -0
  186. package/dist/src/tui/App.js +1 -1
  187. package/dist/src/tui/App.js.map +1 -1
  188. package/dist/src/tui/atoms/runtime.d.ts +8 -0
  189. package/dist/src/tui/atoms/runtime.d.ts.map +1 -0
  190. package/dist/src/tui/atoms/runtime.js +1 -1
  191. package/dist/src/tui/atoms/runtime.js.map +1 -1
  192. package/dist/src/tui/atoms/tickets.d.ts +3 -0
  193. package/dist/src/tui/atoms/tickets.d.ts.map +1 -0
  194. package/dist/src/tui/atoms/timer.d.ts +11 -0
  195. package/dist/src/tui/atoms/timer.d.ts.map +1 -0
  196. package/dist/src/tui/atoms/timer.js +1 -1
  197. package/dist/src/tui/atoms/timer.js.map +1 -1
  198. package/dist/src/tui/atoms/ui.d.ts +11 -0
  199. package/dist/src/tui/atoms/ui.d.ts.map +1 -0
  200. package/dist/src/tui/atoms/ui.js +1 -1
  201. package/dist/src/tui/atoms/ui.js.map +1 -1
  202. package/dist/src/tui/components/BigTimer.d.ts +2 -0
  203. package/dist/src/tui/components/BigTimer.d.ts.map +1 -0
  204. package/dist/src/tui/components/Footer.d.ts +2 -0
  205. package/dist/src/tui/components/Footer.d.ts.map +1 -0
  206. package/dist/src/tui/components/Header.d.ts +2 -0
  207. package/dist/src/tui/components/Header.d.ts.map +1 -0
  208. package/dist/src/tui/components/Header.js +1 -1
  209. package/dist/src/tui/components/Header.js.map +1 -1
  210. package/dist/src/tui/components/PopupInput.d.ts +18 -0
  211. package/dist/src/tui/components/PopupInput.d.ts.map +1 -0
  212. package/dist/src/tui/components/PopupMessage.d.ts +20 -0
  213. package/dist/src/tui/components/PopupMessage.d.ts.map +1 -0
  214. package/dist/src/tui/components/TicketList.d.ts +2 -0
  215. package/dist/src/tui/components/TicketList.d.ts.map +1 -0
  216. package/dist/src/tui/components/TicketList.js +1 -1
  217. package/dist/src/tui/components/TicketList.js.map +1 -1
  218. package/dist/src/tui/components/TicketRow.d.ts +8 -0
  219. package/dist/src/tui/components/TicketRow.d.ts.map +1 -0
  220. package/dist/src/tui/components/TimerDisplay.d.ts +2 -0
  221. package/dist/src/tui/components/TimerDisplay.d.ts.map +1 -0
  222. package/dist/src/tui/components/index.d.ts +12 -0
  223. package/dist/src/tui/components/index.d.ts.map +1 -0
  224. package/dist/src/tui/context/theme.d.ts +15 -0
  225. package/dist/src/tui/context/theme.d.ts.map +1 -0
  226. package/dist/src/tui/hooks/useElapsedTimer.d.ts +6 -0
  227. package/dist/src/tui/hooks/useElapsedTimer.d.ts.map +1 -0
  228. package/dist/src/tui/hooks/useElapsedTimer.js +1 -1
  229. package/dist/src/tui/hooks/useElapsedTimer.js.map +1 -1
  230. package/dist/src/tui/hooks/useTerminalSize.d.ts +5 -0
  231. package/dist/src/tui/hooks/useTerminalSize.d.ts.map +1 -0
  232. package/dist/src/utils/hints.d.ts +12 -0
  233. package/dist/src/utils/hints.d.ts.map +1 -0
  234. package/dist/src/utils/hints.js +12 -0
  235. package/dist/src/utils/hints.js.map +1 -0
  236. package/dist/src/utils/time.d.ts +104 -0
  237. package/dist/src/utils/time.d.ts.map +1 -0
  238. package/dist/src/utils/time.js +74 -8
  239. package/dist/src/utils/time.js.map +1 -1
  240. package/dist/tsconfig.tsbuildinfo +1 -1
  241. package/package.json +36 -18
  242. package/skills/jcf/SKILL.md +93 -1
@@ -0,0 +1,189 @@
1
+ /**
2
+ * An ASCII day calendar for Attributed Intervals — a Clockify-style time grid in the terminal.
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **One column per minute, one row per hour.** 60 columns is the widest a grid can be while
7
+ * staying inside a normal terminal, and a minute is the resolution proposals are expressed in,
8
+ * so the picture and the numbers agree.
9
+ * - **Only hours with work are drawn.** A day is mostly empty; printing 24 rows to show three
10
+ * would bury the answer. A `~` separator marks each skipped stretch so the gaps stay visible
11
+ * rather than silently closing up.
12
+ * - **A minute is filled if any credited time touches it.** A 20-second span therefore shows as a
13
+ * full minute — the grid is a picture of *when*, and the row above it is the authority on
14
+ * *how much*.
15
+ * - **A minute worked on several Issue Keys at once shows as shared.** That time is divided equally
16
+ * between them, so attributing the minute to one of their glyphs would misrepresent it.
17
+ *
18
+ * @module
19
+ */
20
+ import { localDay, nextLocalMidnight } from "../utils/time.js";
21
+ const MINUTES_PER_HOUR = 60;
22
+ const IDLE = ".";
23
+ const SKIPPED = "~";
24
+ /** A minute claimed by more than one Issue Key: worked in parallel, so the time was split. */
25
+ const SHARED = "%";
26
+ /**
27
+ * Glyphs in assignment order. Deliberately ASCII: this has to survive a pipe, a log file, and a
28
+ * paste into a ticket comment.
29
+ */
30
+ const GLYPHS = ["#", "=", "*", "+", "o", "x"];
31
+ /**
32
+ * The glyph for every Issue Key past the supply.
33
+ *
34
+ * Shared on purpose, and legible as such: past six keys in a day the grid cannot tell them apart
35
+ * anyway, and saying so is better than silently reusing `#` for the seventh as if it were the first.
36
+ * Ownership is tracked by Issue Key, so a minute split between two overflow keys still reads shared.
37
+ */
38
+ const OVERFLOW = "?";
39
+ const LABEL_WIDTH = 8;
40
+ /**
41
+ * The actual elapsed minutes of one local day, projected into local-clock rows.
42
+ *
43
+ * A backward transition starts a new occurrence, so a repeated hour gets a second row even when
44
+ * only half of it repeats. A forward transition simply skips the missing local columns or hour.
45
+ */
46
+ const localTimeline = (dayStartMs, dayEndMs) => {
47
+ const rows = [];
48
+ let occurrence = 0;
49
+ let previousLocalMinute = null;
50
+ let previousKey = null;
51
+ let currentRow = null;
52
+ const elapsedMinutes = Math.round((dayEndMs - dayStartMs) / 60_000);
53
+ for (let elapsedMinute = 0; elapsedMinute < elapsedMinutes; elapsedMinute++) {
54
+ const local = new Date(dayStartMs + elapsedMinute * 60_000);
55
+ const localMinute = local.getHours() * MINUTES_PER_HOUR + local.getMinutes();
56
+ if (previousLocalMinute !== null && localMinute < previousLocalMinute)
57
+ occurrence++;
58
+ const key = `${String(occurrence)}:${String(local.getHours())}`;
59
+ if (key !== previousKey) {
60
+ currentRow = {
61
+ hour: local.getHours(),
62
+ minutes: Array.from({ length: MINUTES_PER_HOUR }, () => null)
63
+ };
64
+ rows.push(currentRow);
65
+ previousKey = key;
66
+ }
67
+ if (currentRow !== null)
68
+ currentRow.minutes[local.getMinutes()] = elapsedMinute;
69
+ previousLocalMinute = localMinute;
70
+ }
71
+ return rows;
72
+ };
73
+ /**
74
+ * The `:00 :05 …` ruler. Each label is five characters, so label *n* begins exactly above
75
+ * minute `5n` of the grid below it.
76
+ */
77
+ const ruler = () => {
78
+ let marks = "";
79
+ for (let minute = 0; minute < MINUTES_PER_HOUR; minute += 5) {
80
+ marks += `:${String(minute).padStart(2, "0")} `;
81
+ }
82
+ return `${" ".repeat(LABEL_WIDTH)}${marks}`;
83
+ };
84
+ /**
85
+ * Draw one day. Returns the lines to print, or an empty array when the day has no credited time
86
+ * at all — a caller can then say "nothing" in its own words rather than print an empty grid.
87
+ */
88
+ export const renderDayCalendar = (options) => {
89
+ const representative = options.rows
90
+ .flatMap((row) => row.spans)
91
+ .find((span) => localDay(new Date(span.startMs)) === options.day);
92
+ if (representative === undefined)
93
+ return [];
94
+ const representativeStart = new Date(representative.startMs);
95
+ const dayStartMs = new Date(representativeStart.getFullYear(), representativeStart.getMonth(), representativeStart.getDate()).getTime();
96
+ const dayEndMs = nextLocalMidnight(dayStartMs);
97
+ const dayDurationMs = dayEndMs - dayStartMs;
98
+ const timeline = localTimeline(dayStartMs, dayEndMs);
99
+ const gridMinutes = Math.round(dayDurationMs / 60_000);
100
+ const minutes = Array.from({ length: gridMinutes }, () => IDLE);
101
+ // Who owns each minute, tracked by Issue Key rather than by glyph. There are only so many glyphs,
102
+ // and a day with more Issue Keys than glyphs would otherwise have two of them compare equal — so a
103
+ // minute genuinely split between them would read as exclusively one ticket's.
104
+ const owners = Array.from({ length: gridMinutes }, () => null);
105
+ const glyphs = new Map();
106
+ let anyShared = false;
107
+ options.rows.forEach((row, index) => {
108
+ const glyph = GLYPHS[index] ?? OVERFLOW;
109
+ glyphs.set(row.ticketKey, glyph);
110
+ for (const span of row.spans) {
111
+ // Spans never cross a local midnight, but a caller may pass a whole period's worth of rows,
112
+ // so anything outside this day is skipped rather than wrapped onto it.
113
+ if (localDay(new Date(span.startMs)) !== options.day)
114
+ continue;
115
+ const from = Math.floor((span.startMs - dayStartMs) / 60_000);
116
+ const to = span.endMs - span.startMs >= dayDurationMs
117
+ ? gridMinutes
118
+ : Math.ceil((span.endMs - dayStartMs) / 60_000);
119
+ for (let minute = Math.max(0, from); minute < Math.min(gridMinutes, to); minute++) {
120
+ const owner = owners[minute];
121
+ if (owner === null || owner === undefined) {
122
+ minutes[minute] = glyph;
123
+ owners[minute] = row.ticketKey;
124
+ continue;
125
+ }
126
+ // Already claimed by another Issue Key: the minute was worked in parallel and its time was
127
+ // divided, so neither glyph would be honest.
128
+ if (owner !== row.ticketKey) {
129
+ minutes[minute] = SHARED;
130
+ anyShared = true;
131
+ }
132
+ }
133
+ }
134
+ });
135
+ const cellsFor = (row) => row.minutes.map((elapsedMinute) => elapsedMinute === null ? IDLE : (minutes[elapsedMinute] ?? IDLE));
136
+ const activeHours = timeline
137
+ .map((row, index) => ({ cells: cellsFor(row), index, row }))
138
+ .filter(({ cells }) => cells.some((cell) => cell !== IDLE));
139
+ if (activeHours.length === 0)
140
+ return [];
141
+ const legend = [
142
+ ...[...glyphs.entries()].map(([ticketKey, glyph]) => `${glyph} ${ticketKey}`),
143
+ ...(anyShared ? [`${SHARED} shared (split equally)`] : [])
144
+ ].join(" ");
145
+ const lines = [` ${options.day} ${legend}`, ruler()];
146
+ let previous = null;
147
+ for (const { cells, index, row } of activeHours) {
148
+ if (previous !== null && index > previous + 1) {
149
+ lines.push(`${" ".repeat(LABEL_WIDTH)}${SKIPPED.repeat(3)} ${index - previous - 1}h with nothing credited`);
150
+ }
151
+ const label = ` ${String(row.hour).padStart(2, "0")}h `.padEnd(LABEL_WIDTH);
152
+ lines.push(label + cells.join(""));
153
+ previous = index;
154
+ }
155
+ return lines;
156
+ };
157
+ /** Local `HH:MM`. */
158
+ const clock = (ms) => {
159
+ const at = new Date(ms);
160
+ return `${String(at.getHours()).padStart(2, "0")}:${String(at.getMinutes()).padStart(2, "0")}`;
161
+ };
162
+ /**
163
+ * The outer bounds of a set of spans: when the work item started and when it finished.
164
+ *
165
+ * This is the pair a timesheet actually asks for. It is deliberately *not* the credited duration —
166
+ * the gaps inside it were not worked, and on a shared day part of it belongs to another Issue Key.
167
+ */
168
+ export const formatSpanBounds = (spans) => {
169
+ if (spans.length === 0)
170
+ return "";
171
+ const first = spans.reduce((earliest, span) => Math.min(earliest, span.startMs), Infinity);
172
+ const last = spans.reduce((latest, span) => Math.max(latest, span.endMs), -Infinity);
173
+ return `${clock(first)}-${clock(last)}`;
174
+ };
175
+ /** The earliest instant in a set of spans, for anchoring a write to when work began. */
176
+ export const earliestStart = (spans) => spans.length === 0
177
+ ? undefined
178
+ : new Date(spans.reduce((earliest, span) => Math.min(earliest, span.startMs), Infinity));
179
+ /**
180
+ * `HH:MM-HH:MM` for each span, so the row above the grid says *when* in words. Long lists are
181
+ * clipped with a count rather than wrapped, because the total is already on the row.
182
+ */
183
+ export const formatSpanRanges = (spans, options) => {
184
+ const limit = options?.limit ?? 4;
185
+ const shown = spans.slice(0, limit).map((span) => `${clock(span.startMs)}-${clock(span.endMs)}`);
186
+ const hidden = spans.length - shown.length;
187
+ return hidden > 0 ? `${shown.join(", ")} +${hidden} more` : shown.join(", ");
188
+ };
189
+ //# sourceMappingURL=calendar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../../src/cli/calendar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Config commands: show, set (project/billable/jql), reset.
3
+ *
4
+ * @module
5
+ */
6
+ import { ClockifyApiClient } from "@knpkv/clockify-api-client";
7
+ import { Command, Prompt } from "effect/cli";
8
+ import { ClockifyAuth } from "../services/ClockifyAuth.js";
9
+ import { ConfigService } from "../services/ConfigService.js";
10
+ /** Top-level `config` command with show/set/reset subcommands. */
11
+ export declare const config: Command.Command<"config", {} | {}, {}, import("effect/Terminal").QuitError, ClockifyApiClient | ClockifyAuth | ConfigService | Prompt.Environment>;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAE9D,OAAO,EAAoB,OAAO,EAAmB,MAAM,EAAE,MAAM,YAAY,CAAA;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAoC,MAAM,8BAA8B,CAAA;AAqV9F,kEAAkE;AAClE,eAAO,MAAM,MAAM,oJAUlB,CAAA"}
@@ -5,15 +5,15 @@
5
5
  */
6
6
  import { ClockifyApiClient } from "@knpkv/clockify-api-client";
7
7
  import { Console, Effect } from "effect";
8
- import { Argument as Args, Command, Prompt } from "effect/unstable/cli";
8
+ import { Argument as Args, Command, Flag as Options, Prompt } from "effect/cli";
9
+ import { isTicketKey } from "../agent/sessions.js";
9
10
  import { ClockifyAuth } from "../services/ClockifyAuth.js";
10
- import { ConfigService } from "../services/ConfigService.js";
11
+ import { ConfigService, defaultJcfConfig } from "../services/ConfigService.js";
11
12
  // ---------------------------------------------------------------------------
12
13
  // show
13
14
  // ---------------------------------------------------------------------------
14
- const configShow = Command.make("show", {}, () => Effect.gen(function* () {
15
- const cfg = yield* ConfigService;
16
- const config = yield* cfg.get;
15
+ /** One printer so `jcf config` and `jcf config show` cannot drift apart. */
16
+ const printConfig = (config) => Effect.gen(function* () {
17
17
  yield* Console.log("~/.jcf/config.json:");
18
18
  yield* Console.log("");
19
19
  yield* Console.log(` Default JQL: ${config.defaultJql}`);
@@ -21,6 +21,17 @@ const configShow = Command.make("show", {}, () => Effect.gen(function* () {
21
21
  yield* Console.log(` Default project: ${config.defaultProjectName ?? config.defaultProjectId ?? "(none)"}`);
22
22
  yield* Console.log(` Default billable:${config.defaultBillable ? " yes" : " no"}`);
23
23
  yield* Console.log(` Project map: ${JSON.stringify(config.projectMap)}`);
24
+ yield* Console.log(` Session roots: ${config.sessionRoots.length > 0 ? config.sessionRoots.join(", ") : "(none)"}`);
25
+ yield* Console.log(` Session tickets: ${JSON.stringify(config.sessionTicketMap)}`);
26
+ yield* Console.log(` Idle cap (sec): ${config.sessionIdleCapSeconds}`);
27
+ yield* Console.log(` Dwell (sec): ${config.sessionDwellSeconds === 0 ? "off" : config.sessionDwellSeconds}`);
28
+ yield* Console.log(` Confidence floor:${` ${config.sessionConfidenceFloor}`}`);
29
+ yield* Console.log(` Ownership: ${config.sessionOwnership === "assigned" ? "assigned to you only" : "any ticket a signal placed"}`);
30
+ yield* Console.log(` Yours anyway: ${config.sessionOwnershipOverrides.length > 0 ? config.sessionOwnershipOverrides.join(", ") : "(none)"}`);
31
+ });
32
+ const configShow = Command.make("show", {}, () => Effect.gen(function* () {
33
+ const cfg = yield* ConfigService;
34
+ yield* printConfig(yield* cfg.get);
24
35
  }));
25
36
  // ---------------------------------------------------------------------------
26
37
  // set subcommands
@@ -30,7 +41,7 @@ const configSetProject = Command.make("project", {}, () => Effect.gen(function*
30
41
  const clockifyAuth = yield* ClockifyAuth;
31
42
  const clockifyClient = yield* ClockifyApiClient;
32
43
  const auth = yield* clockifyAuth.getConfig.pipe(Effect.catch(() => Effect.succeed(null)));
33
- if (!auth) {
44
+ if (auth === null) {
34
45
  yield* Console.log("Clockify not configured. Run: jcf auth clockify setup");
35
46
  return;
36
47
  }
@@ -39,14 +50,14 @@ const configSetProject = Command.make("project", {}, () => Effect.gen(function*
39
50
  yield* Console.log("No projects found in Clockify workspace.");
40
51
  return;
41
52
  }
42
- const selected = yield* Prompt.select({
53
+ const selected = yield* Prompt.Select({
43
54
  message: "Default project:",
44
55
  choices: [
45
56
  ...projects.map((p) => ({ title: p.name, value: p.id })),
46
57
  { title: "(none)", value: "" }
47
58
  ]
48
59
  });
49
- if (selected) {
60
+ if (selected !== "") {
50
61
  const name = projects.find((p) => p.id === selected)?.name ?? null;
51
62
  yield* cfg.set({ defaultProjectId: selected, defaultProjectName: name });
52
63
  yield* Console.log(`Default project: ${name ?? selected}`);
@@ -58,7 +69,7 @@ const configSetProject = Command.make("project", {}, () => Effect.gen(function*
58
69
  }));
59
70
  const configSetBillable = Command.make("billable", {}, () => Effect.gen(function* () {
60
71
  const cfg = yield* ConfigService;
61
- const val = yield* Prompt.select({
72
+ const val = yield* Prompt.Select({
62
73
  message: "Default billable:",
63
74
  choices: [
64
75
  { title: "Yes", value: true },
@@ -68,12 +79,129 @@ const configSetBillable = Command.make("billable", {}, () => Effect.gen(function
68
79
  yield* cfg.set({ defaultBillable: val });
69
80
  yield* Console.log(`Default billable: ${val ? "yes" : "no"}`);
70
81
  }));
71
- const configSetJql = Command.make("jql", { jql: Args.string("jql") }, ({ jql }) => Effect.gen(function* () {
82
+ const configSetJql = Command.make("jql", { jql: Args.String("jql") }, ({ jql }) => Effect.gen(function* () {
72
83
  const cfg = yield* ConfigService;
73
84
  yield* cfg.set({ defaultJql: jql });
74
85
  yield* Console.log(`Default JQL: ${jql}`);
75
86
  }));
76
87
  // ---------------------------------------------------------------------------
88
+ // Agent session settings
89
+ // ---------------------------------------------------------------------------
90
+ /**
91
+ * A Session Root or Standing Attribution prefix must be absolute or `~`-relative. Anything else
92
+ * would be interpreted against a working directory that is not the one the sessions ran in, so it
93
+ * is rejected rather than resolved into a surprising path.
94
+ */
95
+ const normalisePrefix = (input) => {
96
+ const raw = input.trim();
97
+ const trimmed = /^[A-Za-z]:[\\/]+$/.test(raw) ? raw.slice(0, 3) : raw.replace(/[\\/]+$/, "");
98
+ if (trimmed.length === 0)
99
+ return { error: "Provide a directory." };
100
+ if (
101
+ // Only `~` and `~/…` (or `~\…`) expand to the home directory; `~work` would never match a cwd.
102
+ !trimmed.startsWith("/") && trimmed !== "~" && !/^~[\\/]/.test(trimmed) &&
103
+ !/^[A-Za-z]:[\\/]/.test(trimmed) &&
104
+ !/^[\\/]{2}[^\\/]+[\\/][^\\/]+/.test(trimmed)) {
105
+ return { error: `Use an absolute path or one starting with ~/ (got "${input}").` };
106
+ }
107
+ return { path: trimmed };
108
+ };
109
+ const removeOption = Options.Boolean("remove").pipe(Options.withDescription("Remove the entry instead of adding it"), Options.withDefault(false));
110
+ const configSetSessionRoot = Command.make("session-root", { dir: Args.String("dir"), remove: removeOption }, ({ dir, remove }) => Effect.gen(function* () {
111
+ const cfg = yield* ConfigService;
112
+ const normalised = normalisePrefix(dir);
113
+ if ("error" in normalised) {
114
+ yield* Console.log(normalised.error);
115
+ return;
116
+ }
117
+ const current = (yield* cfg.get).sessionRoots;
118
+ const next = remove
119
+ ? current.filter((root) => root !== normalised.path)
120
+ : current.includes(normalised.path)
121
+ ? current
122
+ : [...current, normalised.path];
123
+ yield* cfg.set({ sessionRoots: next });
124
+ yield* Console.log(next.length > 0 ? `Session roots: ${next.join(", ")}` : "Session roots cleared — no work is opted in.");
125
+ })).pipe(Command.withDescription("Directories whose Agent Sessions may become Proposed Worklogs"));
126
+ const configSetSessionTicket = Command.make("session-ticket", { dir: Args.String("dir"), ticket: Args.String("ticket").pipe(Args.optional), remove: removeOption }, ({ dir, remove, ticket }) => Effect.gen(function* () {
127
+ const cfg = yield* ConfigService;
128
+ const normalised = normalisePrefix(dir);
129
+ if ("error" in normalised) {
130
+ yield* Console.log(normalised.error);
131
+ return;
132
+ }
133
+ const current = (yield* cfg.get).sessionTicketMap;
134
+ if (remove) {
135
+ const next = Object.fromEntries(Object.entries(current).filter(([prefix]) => prefix !== normalised.path));
136
+ yield* cfg.set({ sessionTicketMap: next });
137
+ yield* Console.log(`Standing attributions: ${JSON.stringify(next)}`);
138
+ return;
139
+ }
140
+ if (ticket._tag === "None") {
141
+ yield* Console.log("Provide an issue key, e.g. jcf config set session-ticket ~/dev/docs PROJ-42");
142
+ return;
143
+ }
144
+ if (!isTicketKey(ticket.value)) {
145
+ yield* Console.log(`"${ticket.value}" is not an issue key. Use the Jira form, e.g. PROJ-42.`);
146
+ return;
147
+ }
148
+ const next = { ...current, [normalised.path]: ticket.value };
149
+ yield* cfg.set({ sessionTicketMap: next });
150
+ yield* Console.log(`Standing attributions: ${JSON.stringify(next)}`);
151
+ })).pipe(Command.withDescription("Standing Attribution: map a directory to an issue key"));
152
+ const configSetIdleCap = Command.make("idle-cap", { seconds: Args.String("seconds") }, ({ seconds }) => Effect.gen(function* () {
153
+ const cfg = yield* ConfigService;
154
+ const parsed = Number(seconds);
155
+ if (!Number.isFinite(parsed) || parsed <= 0) {
156
+ yield* Console.log("Provide a positive number of seconds, e.g. 300.");
157
+ return;
158
+ }
159
+ yield* cfg.set({ sessionIdleCapSeconds: parsed });
160
+ yield* Console.log(`Idle cap: ${parsed}s`);
161
+ })).pipe(Command.withDescription("Longest gap between Session Activity events still counted as work"));
162
+ const configSetDwell = Command.make("dwell", { seconds: Args.String("seconds") }, ({ seconds }) => Effect.gen(function* () {
163
+ const cfg = yield* ConfigService;
164
+ const parsed = Number(seconds);
165
+ // Zero is allowed here, unlike an idle cap: it turns the floor off and reports the raw
166
+ // interleaving, which is a legitimate thing to want to look at once.
167
+ if (!Number.isFinite(parsed) || parsed < 0) {
168
+ yield* Console.log("Provide a number of seconds, e.g. 900. Zero turns the dwell floor off.");
169
+ return;
170
+ }
171
+ yield* cfg.set({ sessionDwellSeconds: parsed });
172
+ yield* Console.log(parsed === 0
173
+ ? "Dwell floor: off — ownership may change as often as the transcripts interleave"
174
+ : `Dwell floor: ${parsed}s`);
175
+ })).pipe(Command.withDescription("Shortest stretch that may own time on its own"));
176
+ const configSetOwnership = Command.make("ownership", { mode: Args.String("assigned|any") }, ({ mode }) => Effect.gen(function* () {
177
+ const cfg = yield* ConfigService;
178
+ if (mode !== "assigned" && mode !== "any") {
179
+ yield* Console.log("Provide `assigned` (only your own tickets) or `any`.");
180
+ return;
181
+ }
182
+ yield* cfg.set({ sessionOwnership: mode });
183
+ yield* Console.log(mode === "assigned"
184
+ ? "Ownership: only tickets assigned to you are proposed — the rest are reported"
185
+ : "Ownership: any ticket an Attribution Signal placed is proposed");
186
+ })).pipe(Command.withDescription("Whether a proposal may name a ticket assigned to somebody else"));
187
+ const configSetMine = Command.make("mine", { key: Args.String("ISSUE-KEY") }, ({ key }) => Effect.gen(function* () {
188
+ const cfg = yield* ConfigService;
189
+ const ticketKey = key.trim().toUpperCase();
190
+ if (!isTicketKey(ticketKey)) {
191
+ yield* Console.log("That is not an Issue Key, e.g. PROJ-123.");
192
+ return;
193
+ }
194
+ const current = yield* cfg.get;
195
+ if (current.sessionOwnershipOverrides.includes(ticketKey)) {
196
+ yield* Console.log(`${ticketKey} is already treated as yours.`);
197
+ return;
198
+ }
199
+ yield* cfg.set({
200
+ sessionOwnershipOverrides: [...current.sessionOwnershipOverrides, ticketKey].sort()
201
+ });
202
+ yield* Console.log(`${ticketKey} will be proposed as yours whatever Jira says its assignee is.`);
203
+ })).pipe(Command.withDescription("Treat one ticket as yours even when Jira assigns it to somebody else"));
204
+ // ---------------------------------------------------------------------------
77
205
  // reset
78
206
  // ---------------------------------------------------------------------------
79
207
  const configReset = Command.make("reset", {}, () => Effect.gen(function* () {
@@ -84,24 +212,38 @@ const configReset = Command.make("reset", {}, () => Effect.gen(function* () {
84
212
  defaultBillable: true,
85
213
  defaultJql: "assignee = currentUser() AND status != Done ORDER BY updated DESC",
86
214
  refreshInterval: 30,
87
- projectMap: {}
215
+ projectMap: {},
216
+ // Reset means reset. Leaving these behind was invisible — `jcf config show` lists them, so a
217
+ // user chasing a bad idle cap or a stale Standing Attribution would reset, see them still
218
+ // there, and have nothing to go on.
219
+ sessionRoots: defaultJcfConfig.sessionRoots,
220
+ sessionTicketMap: defaultJcfConfig.sessionTicketMap,
221
+ sessionIdleCapSeconds: defaultJcfConfig.sessionIdleCapSeconds,
222
+ sessionConfidenceFloor: defaultJcfConfig.sessionConfidenceFloor,
223
+ sessionDwellSeconds: defaultJcfConfig.sessionDwellSeconds,
224
+ sessionAgent: defaultJcfConfig.sessionAgent,
225
+ sessionOwnership: defaultJcfConfig.sessionOwnership,
226
+ sessionOwnershipOverrides: defaultJcfConfig.sessionOwnershipOverrides
88
227
  });
89
- yield* Console.log("Config reset to defaults.");
228
+ yield* Console.log("Config reset to defaults, including session roots and standing attributions.");
90
229
  }));
91
- const configSet = Command.make("set", {}, () => Console.log("Config set: project, billable, jql")).pipe(Command.withSubcommands([configSetProject, configSetBillable, configSetJql]));
230
+ const configSet = Command.make("set", {}, () => Console.log("Config set: project, billable, jql, session-root, session-ticket, idle-cap, dwell, ownership, mine")).pipe(Command.withSubcommands([
231
+ configSetProject,
232
+ configSetBillable,
233
+ configSetJql,
234
+ configSetSessionRoot,
235
+ configSetSessionTicket,
236
+ configSetIdleCap,
237
+ configSetDwell,
238
+ configSetOwnership,
239
+ configSetMine
240
+ ]));
92
241
  // ---------------------------------------------------------------------------
93
242
  // Top-level config command
94
243
  // ---------------------------------------------------------------------------
95
244
  /** Top-level `config` command with show/set/reset subcommands. */
96
245
  export const config = Command.make("config", {}, () => Effect.gen(function* () {
97
246
  const cfg = yield* ConfigService;
98
- const c = yield* cfg.get;
99
- yield* Console.log("~/.jcf/config.json:");
100
- yield* Console.log("");
101
- yield* Console.log(` Default JQL: ${c.defaultJql}`);
102
- yield* Console.log(` Refresh (sec): ${c.refreshInterval}`);
103
- yield* Console.log(` Default project: ${c.defaultProjectName ?? c.defaultProjectId ?? "(none)"}`);
104
- yield* Console.log(` Default billable:${c.defaultBillable ? " yes" : " no"}`);
105
- yield* Console.log(` Project map: ${JSON.stringify(c.projectMap)}`);
247
+ yield* printConfig(yield* cfg.get);
106
248
  })).pipe(Command.withSubcommands([configShow, configSet, configReset]));
107
249
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Fetch a single Jira issue by key and shape it into a {@link JiraTicket}.
3
+ *
4
+ * Shared by the `start`, `log`, and `stop` (correction) commands so they all
5
+ * resolve the same fields (summary, type, labels) needed for Clockify tags and
6
+ * worklog descriptions. Field extraction delegates to
7
+ * {@link mapIssueToTicket} (the same mapper `TicketService` uses) so the two
8
+ * never drift.
9
+ *
10
+ * Returns a discriminated {@link FetchTicketResult} so callers can tell a
11
+ * genuine "not found" (404) apart from a fetch failure (auth/network) or a
12
+ * missing Jira login, instead of collapsing every error to "not found".
13
+ *
14
+ * The login check matters because an unauthenticated request resolves an empty
15
+ * cloudId into a malformed URL that Atlassian answers with a 404 — which would
16
+ * otherwise masquerade as "ticket not found".
17
+ *
18
+ * @module
19
+ */
20
+ import { JiraApiClient } from "@knpkv/jira-api-client";
21
+ import { JiraAuth } from "@knpkv/jira-cli/JiraAuth";
22
+ import { Effect } from "effect";
23
+ import { type JiraTicket } from "../services/TicketService.js";
24
+ /** Shared user hint for the {@link FetchTicketResult} `NotLoggedIn` case. */
25
+ export { NOT_LOGGED_IN_HINT } from "../utils/hints.js";
26
+ /** Outcome of {@link fetchTicketByKey}. */
27
+ export type FetchTicketResult = {
28
+ readonly _tag: "Found";
29
+ readonly ticket: JiraTicket;
30
+ } | {
31
+ readonly _tag: "NotLoggedIn";
32
+ } | {
33
+ readonly _tag: "NotFound";
34
+ } | {
35
+ readonly _tag: "FetchError";
36
+ readonly message: string;
37
+ };
38
+ /**
39
+ * A best-effort reader of issue titles, bound to the services it needs.
40
+ *
41
+ * Returns a function rather than taking a key, so a caller resolves the Jira services once and then
42
+ * asks about many issues without carrying their requirements through its own signatures — which is
43
+ * what lets a web handler ask for a title without importing a Jira client.
44
+ *
45
+ * Best-effort by construction: {@link fetchTicketByKey} reports "not found" and "not logged in" as
46
+ * values rather than failures, and both become a null title. A title Clockify cannot be told is a
47
+ * worse entry; a title that costs the write is a worse outcome.
48
+ */
49
+ export declare const ticketSummaryReader: Effect.Effect<(ticketKey: string) => Effect.Effect<string | null>, never, JiraApiClient | JiraAuth>;
50
+ export declare const fetchTicketByKey: (key: string) => Effect.Effect<FetchTicketResult, never, JiraApiClient | JiraAuth>;
51
+ //# sourceMappingURL=fetchTicket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchTicket.d.ts","sourceRoot":"","sources":["../../../src/cli/fetchTicket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,8BAA8B,CAAA;AAEhF,6EAA6E;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,2CAA2C;AAC3C,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,CAC7C,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EACnD,KAAK,EACL,aAAa,GAAG,QAAQ,CAUxB,CAAA;AAEF,eAAO,MAAM,gBAAgB,QACtB,MAAM,KACV,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,EAAE,aAAa,GAAG,QAAQ,CAoC/D,CAAA"}
@@ -23,7 +23,23 @@ import { Effect } from "effect";
23
23
  import * as Predicate from "effect/Predicate";
24
24
  import { mapIssueToTicket } from "../services/TicketService.js";
25
25
  /** Shared user hint for the {@link FetchTicketResult} `NotLoggedIn` case. */
26
- export const NOT_LOGGED_IN_HINT = "Not logged in to Jira. Run: jcf auth jira login";
26
+ export { NOT_LOGGED_IN_HINT } from "../utils/hints.js";
27
+ /**
28
+ * A best-effort reader of issue titles, bound to the services it needs.
29
+ *
30
+ * Returns a function rather than taking a key, so a caller resolves the Jira services once and then
31
+ * asks about many issues without carrying their requirements through its own signatures — which is
32
+ * what lets a web handler ask for a title without importing a Jira client.
33
+ *
34
+ * Best-effort by construction: {@link fetchTicketByKey} reports "not found" and "not logged in" as
35
+ * values rather than failures, and both become a null title. A title Clockify cannot be told is a
36
+ * worse entry; a title that costs the write is a worse outcome.
37
+ */
38
+ export const ticketSummaryReader = Effect.gen(function* () {
39
+ const jira = yield* JiraApiClient;
40
+ const auth = yield* JiraAuth;
41
+ return (ticketKey) => fetchTicketByKey(ticketKey).pipe(Effect.map((result) => (result._tag === "Found" ? result.ticket.summary : null)), Effect.provideService(JiraApiClient, jira), Effect.provideService(JiraAuth, auth));
42
+ });
27
43
  export const fetchTicketByKey = (key) => Effect.gen(function* () {
28
44
  // Without a Jira login the request would 404 on a malformed URL; surface
29
45
  // the real cause so callers can point the user at `jcf auth jira login`.
@@ -32,7 +48,7 @@ export const fetchTicketByKey = (key) => Effect.gen(function* () {
32
48
  // failure, not a benign logged-out state, so it routes to FetchError.
33
49
  const auth = yield* JiraAuth;
34
50
  const loginCheck = yield* auth.isLoggedIn().pipe(Effect.map((loggedIn) => (loggedIn ? null : { _tag: "NotLoggedIn" })), Effect.catch((e) => Effect.succeed({ _tag: "FetchError", message: e.message })));
35
- if (loginCheck)
51
+ if (loginCheck !== null)
36
52
  return loginCheck;
37
53
  const jira = yield* JiraApiClient;
38
54
  return yield* jira.getIssue(key, {
@@ -1 +1 @@
1
- {"version":3,"file":"fetchTicket.js","sourceRoot":"","sources":["../../../src/cli/fetchTicket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAmB,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEhF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAG,iDAAiD,CAAA;AASnF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAW,EACwD,EAAE,CACrE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,uEAAuE;IACvE,sEAAsE;IACtE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAA;IAC5B,MAAM,UAAU,GAA6B,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CACxE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAA4B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,EAC/F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAoB,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACnG,CAAA;IACD,IAAI,UAAU;QAAE,OAAO,UAAU,CAAA;IAEjC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IACjC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QAC/B,MAAM,EAAE;YACN,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC;SACxF;KACF,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAqB,EAAE;QACtC,MAAM,MAAM,GAAG,KAAK,KAAK,IAAI,IAAI,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACxF,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC,EAAE,CAAA;QACN,OAAO;YACL,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC;SACtC,CAAA;IACH,CAAC,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,EAC7F,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACjB,MAAM,CAAC,OAAO,CACZ,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3C,CACF,CACF,CAAA;AACH,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"fetchTicket.js","sourceRoot":"","sources":["../../../src/cli/fetchTicket.ts"],"names":[],"mappings":"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"}