@knpkv/jira-clockify 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +245 -1
- package/dist/package.json +36 -12
- package/dist/src/agent/agentSettings.d.ts +18 -0
- package/dist/src/agent/agentSettings.d.ts.map +1 -0
- package/dist/src/agent/agentSettings.js +23 -0
- package/dist/src/agent/agentSettings.js.map +1 -0
- package/dist/src/agent/schedule.d.ts +20 -0
- package/dist/src/agent/schedule.d.ts.map +1 -0
- package/dist/src/agent/schedule.js +189 -0
- package/dist/src/agent/schedule.js.map +1 -0
- package/dist/src/agent/sessions.d.ts +427 -0
- package/dist/src/agent/sessions.d.ts.map +1 -0
- package/dist/src/agent/sessions.js +868 -0
- package/dist/src/agent/sessions.js.map +1 -0
- package/dist/src/agent/sourceConsumption.d.ts +79 -0
- package/dist/src/agent/sourceConsumption.d.ts.map +1 -0
- package/dist/src/agent/sourceConsumption.js +191 -0
- package/dist/src/agent/sourceConsumption.js.map +1 -0
- package/dist/src/agent/watch.d.ts +76 -0
- package/dist/src/agent/watch.d.ts.map +1 -0
- package/dist/src/agent/watch.js +45 -0
- package/dist/src/agent/watch.js.map +1 -0
- package/dist/src/agent/writePlanning.d.ts +154 -0
- package/dist/src/agent/writePlanning.d.ts.map +1 -0
- package/dist/src/agent/writePlanning.js +210 -0
- package/dist/src/agent/writePlanning.js.map +1 -0
- package/dist/src/bin.d.ts +3 -0
- package/dist/src/bin.d.ts.map +1 -0
- package/dist/src/bin.js +9 -3
- package/dist/src/bin.js.map +1 -1
- package/dist/src/cli/agentWrite.d.ts +164 -0
- package/dist/src/cli/agentWrite.d.ts.map +1 -0
- package/dist/src/cli/agentWrite.js +362 -0
- package/dist/src/cli/agentWrite.js.map +1 -0
- package/dist/src/cli/auth.d.ts +8 -0
- package/dist/src/cli/auth.d.ts.map +1 -0
- package/dist/src/cli/auth.js +10 -10
- package/dist/src/cli/auth.js.map +1 -1
- package/dist/src/cli/calendar.d.ts +42 -0
- package/dist/src/cli/calendar.d.ts.map +1 -0
- package/dist/src/cli/calendar.js +189 -0
- package/dist/src/cli/calendar.js.map +1 -0
- package/dist/src/cli/config.d.ts +12 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +163 -21
- package/dist/src/cli/config.js.map +1 -1
- package/dist/src/cli/fetchTicket.d.ts +51 -0
- package/dist/src/cli/fetchTicket.d.ts.map +1 -0
- package/dist/src/cli/fetchTicket.js +18 -2
- package/dist/src/cli/fetchTicket.js.map +1 -1
- package/dist/src/cli/fuzzySelect.d.ts +24 -0
- package/dist/src/cli/fuzzySelect.d.ts.map +1 -0
- package/dist/src/cli/layers.d.ts +40 -0
- package/dist/src/cli/layers.d.ts.map +1 -0
- package/dist/src/cli/layers.js +56 -12
- package/dist/src/cli/layers.js.map +1 -1
- package/dist/src/cli/list.d.ts +8 -0
- package/dist/src/cli/list.d.ts.map +1 -0
- package/dist/src/cli/list.js +2 -2
- package/dist/src/cli/list.js.map +1 -1
- package/dist/src/cli/reconcile.d.ts +129 -0
- package/dist/src/cli/reconcile.d.ts.map +1 -0
- package/dist/src/cli/reconcile.js +635 -46
- package/dist/src/cli/reconcile.js.map +1 -1
- package/dist/src/cli/root.d.ts +15 -0
- package/dist/src/cli/root.d.ts.map +1 -0
- package/dist/src/cli/root.js +4 -3
- package/dist/src/cli/root.js.map +1 -1
- package/dist/src/cli/runtimeFailure.d.ts +10 -0
- package/dist/src/cli/runtimeFailure.d.ts.map +1 -0
- package/dist/src/cli/runtimeFailure.js +17 -0
- package/dist/src/cli/runtimeFailure.js.map +1 -0
- package/dist/src/cli/setup.d.ts +10 -0
- package/dist/src/cli/setup.d.ts.map +1 -0
- package/dist/src/cli/setup.js +7 -7
- package/dist/src/cli/setup.js.map +1 -1
- package/dist/src/cli/timer/discard.d.ts +4 -0
- package/dist/src/cli/timer/discard.d.ts.map +1 -0
- package/dist/src/cli/timer/discard.js +2 -2
- package/dist/src/cli/timer/discard.js.map +1 -1
- package/dist/src/cli/timer/edit.d.ts +22 -0
- package/dist/src/cli/timer/edit.d.ts.map +1 -0
- package/dist/src/cli/timer/edit.js +62 -42
- package/dist/src/cli/timer/edit.js.map +1 -1
- package/dist/src/cli/timer/index.d.ts +12 -0
- package/dist/src/cli/timer/index.d.ts.map +1 -0
- package/dist/src/cli/timer/log.d.ts +16 -0
- package/dist/src/cli/timer/log.d.ts.map +1 -0
- package/dist/src/cli/timer/log.js +6 -6
- package/dist/src/cli/timer/log.js.map +1 -1
- package/dist/src/cli/timer/start.d.ts +21 -0
- package/dist/src/cli/timer/start.d.ts.map +1 -0
- package/dist/src/cli/timer/start.js +9 -9
- package/dist/src/cli/timer/start.js.map +1 -1
- package/dist/src/cli/timer/status.d.ts +22 -0
- package/dist/src/cli/timer/status.d.ts.map +1 -0
- package/dist/src/cli/timer/status.js +3 -3
- package/dist/src/cli/timer/status.js.map +1 -1
- package/dist/src/cli/timer/stop.d.ts +48 -0
- package/dist/src/cli/timer/stop.d.ts.map +1 -0
- package/dist/src/cli/timer/stop.js +19 -19
- package/dist/src/cli/timer/stop.js.map +1 -1
- package/dist/src/cli/timer.d.ts +11 -0
- package/dist/src/cli/timer.d.ts.map +1 -0
- package/dist/src/cli/timer.js +1 -1
- package/dist/src/cli/timer.js.map +1 -1
- package/dist/src/cli/watch.d.ts +54 -0
- package/dist/src/cli/watch.d.ts.map +1 -0
- package/dist/src/cli/watch.js +412 -0
- package/dist/src/cli/watch.js.map +1 -0
- package/dist/src/cli/watchLease.d.ts +99 -0
- package/dist/src/cli/watchLease.d.ts.map +1 -0
- package/dist/src/cli/watchLease.js +204 -0
- package/dist/src/cli/watchLease.js.map +1 -0
- package/dist/src/cli/writerGuard.d.ts +37 -0
- package/dist/src/cli/writerGuard.d.ts.map +1 -0
- package/dist/src/cli/writerGuard.js +92 -0
- package/dist/src/cli/writerGuard.js.map +1 -0
- package/dist/src/index.d.ts +46 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +46 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/main.d.ts +4 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/services/AgentSessionReader.d.ts +121 -0
- package/dist/src/services/AgentSessionReader.d.ts.map +1 -0
- package/dist/src/services/AgentSessionReader.js +392 -0
- package/dist/src/services/AgentSessionReader.js.map +1 -0
- package/dist/src/services/ClockifyAuth.d.ts +47 -0
- package/dist/src/services/ClockifyAuth.d.ts.map +1 -0
- package/dist/src/services/ClockifyAuth.js +2 -2
- package/dist/src/services/ClockifyAuth.js.map +1 -1
- package/dist/src/services/CodexTranscript.d.ts +112 -0
- package/dist/src/services/CodexTranscript.d.ts.map +1 -0
- package/dist/src/services/CodexTranscript.js +96 -0
- package/dist/src/services/CodexTranscript.js.map +1 -0
- package/dist/src/services/ConfigService.d.ts +99 -0
- package/dist/src/services/ConfigService.d.ts.map +1 -0
- package/dist/src/services/ConfigService.js +79 -7
- package/dist/src/services/ConfigService.js.map +1 -1
- package/dist/src/services/HomeDirectory.d.ts +17 -0
- package/dist/src/services/HomeDirectory.d.ts.map +1 -0
- package/dist/src/services/HomeDirectory.js +1 -1
- package/dist/src/services/IssueFacts.d.ts +127 -0
- package/dist/src/services/IssueFacts.d.ts.map +1 -0
- package/dist/src/services/IssueFacts.js +277 -0
- package/dist/src/services/IssueFacts.js.map +1 -0
- package/dist/src/services/ProviderDeletion.d.ts +19 -0
- package/dist/src/services/ProviderDeletion.d.ts.map +1 -0
- package/dist/src/services/ProviderDeletion.js +37 -0
- package/dist/src/services/ProviderDeletion.js.map +1 -0
- package/dist/src/services/ReconcileService.d.ts +378 -0
- package/dist/src/services/ReconcileService.d.ts.map +1 -0
- package/dist/src/services/ReconcileService.js +1270 -79
- package/dist/src/services/ReconcileService.js.map +1 -1
- package/dist/src/services/SavedEntries.d.ts +40 -0
- package/dist/src/services/SavedEntries.d.ts.map +1 -0
- package/dist/src/services/SavedEntries.js +209 -0
- package/dist/src/services/SavedEntries.js.map +1 -0
- package/dist/src/services/SessionAttributor.d.ts +114 -0
- package/dist/src/services/SessionAttributor.d.ts.map +1 -0
- package/dist/src/services/SessionAttributor.js +240 -0
- package/dist/src/services/SessionAttributor.js.map +1 -0
- package/dist/src/services/SourceLedger.d.ts +104 -0
- package/dist/src/services/SourceLedger.d.ts.map +1 -0
- package/dist/src/services/SourceLedger.js +302 -0
- package/dist/src/services/SourceLedger.js.map +1 -0
- package/dist/src/services/StateWriter.d.ts +39 -0
- package/dist/src/services/StateWriter.d.ts.map +1 -0
- package/dist/src/services/TicketService.d.ts +63 -0
- package/dist/src/services/TicketService.d.ts.map +1 -0
- package/dist/src/services/TimerService.d.ts +145 -0
- package/dist/src/services/TimerService.d.ts.map +1 -0
- package/dist/src/services/TimerService.js +113 -80
- package/dist/src/services/TimerService.js.map +1 -1
- package/dist/src/services/internal/JiraWorklogPost.d.ts +7 -0
- package/dist/src/services/internal/JiraWorklogPost.d.ts.map +1 -0
- package/dist/src/services/internal/JiraWorklogPost.js +32 -0
- package/dist/src/services/internal/JiraWorklogPost.js.map +1 -0
- package/dist/src/testing/fakeHeadless.d.ts +318 -0
- package/dist/src/testing/fakeHeadless.d.ts.map +1 -0
- package/dist/src/testing/fakeHeadless.js +1149 -0
- package/dist/src/testing/fakeHeadless.js.map +1 -0
- package/dist/src/tui/App.d.ts +6 -0
- package/dist/src/tui/App.d.ts.map +1 -0
- package/dist/src/tui/App.js +1 -1
- package/dist/src/tui/App.js.map +1 -1
- package/dist/src/tui/atoms/runtime.d.ts +8 -0
- package/dist/src/tui/atoms/runtime.d.ts.map +1 -0
- package/dist/src/tui/atoms/runtime.js +1 -1
- package/dist/src/tui/atoms/runtime.js.map +1 -1
- package/dist/src/tui/atoms/tickets.d.ts +3 -0
- package/dist/src/tui/atoms/tickets.d.ts.map +1 -0
- package/dist/src/tui/atoms/timer.d.ts +11 -0
- package/dist/src/tui/atoms/timer.d.ts.map +1 -0
- package/dist/src/tui/atoms/timer.js +1 -1
- package/dist/src/tui/atoms/timer.js.map +1 -1
- package/dist/src/tui/atoms/ui.d.ts +11 -0
- package/dist/src/tui/atoms/ui.d.ts.map +1 -0
- package/dist/src/tui/atoms/ui.js +1 -1
- package/dist/src/tui/atoms/ui.js.map +1 -1
- package/dist/src/tui/components/BigTimer.d.ts +2 -0
- package/dist/src/tui/components/BigTimer.d.ts.map +1 -0
- package/dist/src/tui/components/Footer.d.ts +2 -0
- package/dist/src/tui/components/Footer.d.ts.map +1 -0
- package/dist/src/tui/components/Header.d.ts +2 -0
- package/dist/src/tui/components/Header.d.ts.map +1 -0
- package/dist/src/tui/components/Header.js +1 -1
- package/dist/src/tui/components/Header.js.map +1 -1
- package/dist/src/tui/components/PopupInput.d.ts +18 -0
- package/dist/src/tui/components/PopupInput.d.ts.map +1 -0
- package/dist/src/tui/components/PopupMessage.d.ts +20 -0
- package/dist/src/tui/components/PopupMessage.d.ts.map +1 -0
- package/dist/src/tui/components/TicketList.d.ts +2 -0
- package/dist/src/tui/components/TicketList.d.ts.map +1 -0
- package/dist/src/tui/components/TicketList.js +1 -1
- package/dist/src/tui/components/TicketList.js.map +1 -1
- package/dist/src/tui/components/TicketRow.d.ts +8 -0
- package/dist/src/tui/components/TicketRow.d.ts.map +1 -0
- package/dist/src/tui/components/TimerDisplay.d.ts +2 -0
- package/dist/src/tui/components/TimerDisplay.d.ts.map +1 -0
- package/dist/src/tui/components/index.d.ts +12 -0
- package/dist/src/tui/components/index.d.ts.map +1 -0
- package/dist/src/tui/context/theme.d.ts +15 -0
- package/dist/src/tui/context/theme.d.ts.map +1 -0
- package/dist/src/tui/hooks/useElapsedTimer.d.ts +6 -0
- package/dist/src/tui/hooks/useElapsedTimer.d.ts.map +1 -0
- package/dist/src/tui/hooks/useElapsedTimer.js +1 -1
- package/dist/src/tui/hooks/useElapsedTimer.js.map +1 -1
- package/dist/src/tui/hooks/useTerminalSize.d.ts +5 -0
- package/dist/src/tui/hooks/useTerminalSize.d.ts.map +1 -0
- package/dist/src/utils/hints.d.ts +12 -0
- package/dist/src/utils/hints.d.ts.map +1 -0
- package/dist/src/utils/hints.js +12 -0
- package/dist/src/utils/hints.js.map +1 -0
- package/dist/src/utils/time.d.ts +104 -0
- package/dist/src/utils/time.d.ts.map +1 -0
- package/dist/src/utils/time.js +74 -8
- package/dist/src/utils/time.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +36 -18
- 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"}
|
package/dist/src/cli/config.js
CHANGED
|
@@ -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/
|
|
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
|
-
|
|
15
|
-
|
|
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 (
|
|
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.
|
|
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.
|
|
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.
|
|
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([
|
|
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
|
-
|
|
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":"AAAA;;;;GAIG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACxC,OAAO,EAAE,QAAQ,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAkB,MAAM,8BAA8B,CAAA;AAE9F,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,4EAA4E;AAC5E,MAAM,WAAW,GAAG,CAAC,MAAiB,EAAE,EAAE,CACxC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IACzC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACtB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;IAC7D,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAA;IAClE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,gBAAgB,IAAI,QAAQ,EAAE,CAAC,CAAA;IAC5G,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACnF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7E,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAChB,sBAAsB,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CACnG,CAAA;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;IACnF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAA;IACxE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAChB,sBAAsB,MAAM,CAAC,mBAAmB,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAC9F,CAAA;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAA;IAC/E,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAChB,sBACE,MAAM,CAAC,gBAAgB,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,4BACpE,EAAE,CACH,CAAA;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAChB,sBACE,MAAM,CAAC,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAC9F,EAAE,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,MAAM,EACN,EAAE,EACF,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC,CAAC,CACL,CAAA;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CACnC,SAAS,EACT,EAAE,EACF,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;IACxC,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAA;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACzF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CACvE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CACvC,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;QAC9D,OAAM;IACR,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE;YACP,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;SAC/B;KACF,CAAC,CAAA;IACF,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,IAAI,IAAI,CAAA;QAClE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;QACxE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAA;IAC5D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAA;QACpE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IAChD,CAAC;AACH,CAAC,CAAC,CACL,CAAA;AAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CACpC,UAAU,EACV,EAAE,EACF,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC/B,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;SAC9B;KACF,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,CAAA;IACxC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAC/D,CAAC,CAAC,CACL,CAAA;AAED,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAC/B,KAAK,EACL,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAC3B,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CACV,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAA;IACnC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAA;AAC3C,CAAC,CAAC,CACL,CAAA;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,eAAe,GAAG,CAAC,KAAa,EAA0D,EAAE;IAChG,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC5F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAA;IAClE;IACE,+FAA+F;IAC/F,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;QACvE,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAChC,CAAC,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,EAC7C,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,sDAAsD,KAAK,KAAK,EAAE,CAAA;IACpF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAC1B,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CACjD,OAAO,CAAC,eAAe,CAAC,uCAAuC,CAAC,EAChE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAC3B,CAAA;AAED,MAAM,oBAAoB,GAAG,OAAO,CAAC,IAAI,CACvC,cAAc,EACd,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EACjD,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAClB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACpC,OAAM;IACR,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAA;IAC7C,MAAM,IAAI,GAAG,MAAM;QACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC;QACpD,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;YACnC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;IACjC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;IACtC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,8CAA8C,CACvG,CAAA;AACH,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,+DAA+D,CAAC,CAAC,CAAA;AAEhG,MAAM,sBAAsB,GAAG,OAAO,CAAC,IAAI,CACzC,gBAAgB,EAChB,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,EACpG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACpC,OAAM;IACR,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,gBAAgB,CAAA;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACzG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACpE,OAAM;IACR,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;QACjG,OAAM;IACR,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,yDAAyD,CAAC,CAAA;QAC7F,OAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5D,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AACtE,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,uDAAuD,CAAC,CAAC,CAAA;AAExF,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CACnC,UAAU,EACV,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EACnC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;QACrE,OAAM;IACR,CAAC;IACD,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,qBAAqB,EAAE,MAAM,EAAE,CAAC,CAAA;IACjD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,GAAG,CAAC,CAAA;AAC5C,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,mEAAmE,CAAC,CAAC,CAAA;AAEpG,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CACjC,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EACnC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAC9B,uFAAuF;IACvF,qEAAqE;IACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAA;QAC5F,OAAM;IACR,CAAC;IACD,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAChB,MAAM,KAAK,CAAC;QACV,CAAC,CAAC,gFAAgF;QAClF,CAAC,CAAC,gBAAgB,MAAM,GAAG,CAC9B,CAAA;AACH,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,+CAA+C,CAAC,CAAC,CAAA;AAEhF,MAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CACrC,WAAW,EACX,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EACrC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACX,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;QAC1E,OAAM;IACR,CAAC;IACD,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAChB,IAAI,KAAK,UAAU;QACjB,CAAC,CAAC,8EAA8E;QAChF,CAAC,CAAC,gEAAgE,CACrE,CAAA;AACH,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,gEAAgE,CAAC,CAAC,CAAA;AAEjG,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAChC,MAAM,EACN,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EACjC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CACV,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC1C,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;QAC9D,OAAM;IACR,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAA;IAC9B,IAAI,OAAO,CAAC,yBAAyB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,+BAA+B,CAAC,CAAA;QAC/D,OAAM;IACR,CAAC;IACD,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACb,yBAAyB,EAAE,CAAC,GAAG,OAAO,CAAC,yBAAyB,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE;KACpF,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,gEAAgE,CAAC,CAAA;AAClG,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,sEAAsE,CAAC,CAAC,CAAA;AAEvG,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAC9B,OAAO,EACP,EAAE,EACF,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACb,gBAAgB,EAAE,IAAI;QACtB,kBAAkB,EAAE,IAAI;QACxB,eAAe,EAAE,IAAI;QACrB,UAAU,EAAE,mEAAmE;QAC/E,eAAe,EAAE,EAAE;QACnB,UAAU,EAAE,EAAE;QACd,6FAA6F;QAC7F,0FAA0F;QAC1F,oCAAoC;QACpC,YAAY,EAAE,gBAAgB,CAAC,YAAY;QAC3C,gBAAgB,EAAE,gBAAgB,CAAC,gBAAgB;QACnD,qBAAqB,EAAE,gBAAgB,CAAC,qBAAqB;QAC7D,sBAAsB,EAAE,gBAAgB,CAAC,sBAAsB;QAC/D,mBAAmB,EAAE,gBAAgB,CAAC,mBAAmB;QACzD,YAAY,EAAE,gBAAgB,CAAC,YAAY;QAC3C,gBAAgB,EAAE,gBAAgB,CAAC,gBAAgB;QACnD,yBAAyB,EAAE,gBAAgB,CAAC,yBAAyB;KACtE,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAA;AACpG,CAAC,CAAC,CACL,CAAA;AAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC5B,KAAK,EACL,EAAE,EACF,GAAG,EAAE,CACH,OAAO,CAAC,GAAG,CACT,oGAAoG,CACrG,CACJ,CAAC,IAAI,CACJ,OAAO,CAAC,eAAe,CAAC;IACtB,gBAAgB;IAChB,iBAAiB;IACjB,YAAY;IACZ,oBAAoB;IACpB,sBAAsB;IACtB,gBAAgB;IAChB,cAAc;IACd,kBAAkB;IAClB,aAAa;CACd,CAAC,CACH,CAAA;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,kEAAkE;AAClE,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAChC,QAAQ,EACR,EAAE,EACF,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IAChC,KAAK,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACpC,CAAC,CAAC,CACL,CAAC,IAAI,CACJ,OAAO,CAAC,eAAe,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAC9D,CAAA"}
|
|
@@ -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
|
|
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,
|
|
1
|
+
{"version":3,"file":"fetchTicket.js","sourceRoot":"","sources":["../../../src/cli/fetchTicket.ts"],"names":[],"mappings":"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"}
|