@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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared time formatting and parsing utilities.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Local calendar day (`YYYY-MM-DD`) of an instant — matches how a person reads their
|
|
8
|
+
* timesheet, and the single definition every day bucket in jcf is keyed by.
|
|
9
|
+
*/
|
|
10
|
+
export declare function localDay(date: Date): string;
|
|
11
|
+
/**
|
|
12
|
+
* Local midnight following `atMs`, as epoch milliseconds — how every day-by-day walk in jcf
|
|
13
|
+
* advances. Built from local calendar fields rather than by adding 24 hours, so it lands on
|
|
14
|
+
* midnight across a daylight-saving change too.
|
|
15
|
+
*/
|
|
16
|
+
export declare function nextLocalMidnight(atMs: number): number;
|
|
17
|
+
/** One calendar-day slice of a half-open interval. */
|
|
18
|
+
export interface LocalDaySlice {
|
|
19
|
+
readonly day: string;
|
|
20
|
+
readonly startMs: number;
|
|
21
|
+
readonly endMs: number;
|
|
22
|
+
readonly seconds: number;
|
|
23
|
+
}
|
|
24
|
+
/** Split a half-open interval at every local midnight, preserving its elapsed seconds. */
|
|
25
|
+
export declare function splitIntervalByLocalDay(startMs: number, endMs: number): ReadonlyArray<LocalDaySlice>;
|
|
26
|
+
/**
|
|
27
|
+
* Local Monday 00:00 of the ISO week containing `date`.
|
|
28
|
+
*
|
|
29
|
+
* Built from local calendar fields, never by subtracting days in milliseconds: a week containing a
|
|
30
|
+
* daylight-saving change is 167 or 169 hours long, so arithmetic on the clock lands an hour either
|
|
31
|
+
* side of midnight and the week then starts on Sunday night or Monday morning.
|
|
32
|
+
*/
|
|
33
|
+
export declare function startOfIsoWeek(date: Date): Date;
|
|
34
|
+
/**
|
|
35
|
+
* The ISO week containing `date` as a half-open local period `[Monday, next Monday)` — the same
|
|
36
|
+
* shape every jcf period has, so a week is reconciled by exactly the code a day is.
|
|
37
|
+
*/
|
|
38
|
+
export interface WeekPeriod {
|
|
39
|
+
readonly from: Date;
|
|
40
|
+
readonly to: Date;
|
|
41
|
+
}
|
|
42
|
+
export declare function isoWeekPeriod(date: Date): WeekPeriod;
|
|
43
|
+
/** Format a `Date` as local `HH:MM` — the canonical clock format for prompts and confirmations. */
|
|
44
|
+
export declare function formatClock(date: Date): string;
|
|
45
|
+
/** Format seconds as `HH:MM:SS`. Negative input is clamped to 0. */
|
|
46
|
+
export declare function formatElapsed(seconds: number): string;
|
|
47
|
+
/** Format seconds as human-readable duration (`1h 23m` or `45s`). */
|
|
48
|
+
export declare function formatDuration(seconds: number): string;
|
|
49
|
+
/**
|
|
50
|
+
* Parse a duration string like `1h30m`, `2h`, `45m`, `90m`, or `56m 36s` into seconds.
|
|
51
|
+
* Returns `null` when the input is empty or malformed (unlike the loose regex
|
|
52
|
+
* that previously lived in the `log` command, which silently matched garbage).
|
|
53
|
+
*
|
|
54
|
+
* Spaces between the parts, and a trailing seconds component, are accepted because
|
|
55
|
+
* {@link formatDuration} *writes* both: a form pre-filled with `56m 36s` that its own parser then
|
|
56
|
+
* rejects is a row nobody can accept. Parse what we print.
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseDuration(input: string): number | null;
|
|
59
|
+
/** True when `input` is a full ISO-8601 timestamp (carries its own date). */
|
|
60
|
+
export declare function isFullIsoTimestamp(input: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Parse a past start time. Accepts `HH:MM` (interpreted as that time today, in
|
|
63
|
+
* local time, relative to `now`) or a full ISO-8601 timestamp. Returns `null`
|
|
64
|
+
* when unparseable.
|
|
65
|
+
*
|
|
66
|
+
* Note: the `HH:MM` branch uses `setHours` on the local day, so across a DST
|
|
67
|
+
* transition (a clock-time that is skipped or repeated locally) the resulting
|
|
68
|
+
* instant can shift by an hour. Pass a full ISO timestamp to avoid the ambiguity.
|
|
69
|
+
*
|
|
70
|
+
* The ISO fallback deliberately requires a *full* timestamp; bare years (`"2024"`)
|
|
71
|
+
* or locale strings (`"Jan 5"`) — which `new Date()` would otherwise accept — are
|
|
72
|
+
* rejected as `null` so malformed input never becomes a surprising instant.
|
|
73
|
+
*/
|
|
74
|
+
export declare function parseStartTime(input: string, now?: Date): Date | null;
|
|
75
|
+
/** Outcome of resolving a user-supplied End Correction time. */
|
|
76
|
+
export type CorrectedEnd = {
|
|
77
|
+
readonly ok: true;
|
|
78
|
+
readonly end: Date;
|
|
79
|
+
} | {
|
|
80
|
+
readonly ok: false;
|
|
81
|
+
readonly error: string;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Resolve a corrected timer end for an End Correction — the user forgot to stop
|
|
85
|
+
* and is pulling the end back to when work actually finished.
|
|
86
|
+
*
|
|
87
|
+
* Accepts the same grammar as {@link parseStartTime} — `HH:MM` (local, today) or
|
|
88
|
+
* a full ISO-8601 timestamp — with one extra rule: a bare `HH:MM` that would land
|
|
89
|
+
* *after* `now` is rolled back to the previous local day. That is the overnight
|
|
90
|
+
* "forgot to stop" case: typing `18:00` at 09:00 means yesterday at 18:00. The
|
|
91
|
+
* rollback moves the calendar day (not a raw −24h) so it stays on the intended
|
|
92
|
+
* wall-clock time across a DST boundary. A full ISO timestamp carries its own
|
|
93
|
+
* date and is never rolled back — it is the escape hatch for ends more than a
|
|
94
|
+
* day ago.
|
|
95
|
+
*
|
|
96
|
+
* Enforces the End Correction bounds `start < end <= now`, returning a specific
|
|
97
|
+
* reason on violation so callers can re-prompt. Never clamps a bad value.
|
|
98
|
+
*/
|
|
99
|
+
export declare function resolveCorrectedEnd(params: {
|
|
100
|
+
readonly start: Date;
|
|
101
|
+
readonly input: string;
|
|
102
|
+
readonly now: Date;
|
|
103
|
+
}): CorrectedEnd;
|
|
104
|
+
//# sourceMappingURL=time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAK3C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC,CAiBpG;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAI/C;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAClB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,CAMpD;AAED,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE9C;AAED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMrD;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS1D;AAKD,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,GAAG,IAAI,CAcjF;AAqBD,gEAAgE;AAChE,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;CAAE,GACzC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAElD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;CACnB,GAAG,YAAY,CAkCf"}
|
package/dist/src/utils/time.js
CHANGED
|
@@ -3,6 +3,64 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
+
/**
|
|
7
|
+
* Local calendar day (`YYYY-MM-DD`) of an instant — matches how a person reads their
|
|
8
|
+
* timesheet, and the single definition every day bucket in jcf is keyed by.
|
|
9
|
+
*/
|
|
10
|
+
export function localDay(date) {
|
|
11
|
+
const y = date.getFullYear();
|
|
12
|
+
const m = String(date.getMonth() + 1).padStart(2, "0");
|
|
13
|
+
const d = String(date.getDate()).padStart(2, "0");
|
|
14
|
+
return `${y}-${m}-${d}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Local midnight following `atMs`, as epoch milliseconds — how every day-by-day walk in jcf
|
|
18
|
+
* advances. Built from local calendar fields rather than by adding 24 hours, so it lands on
|
|
19
|
+
* midnight across a daylight-saving change too.
|
|
20
|
+
*/
|
|
21
|
+
export function nextLocalMidnight(atMs) {
|
|
22
|
+
const at = new Date(atMs);
|
|
23
|
+
return new Date(at.getFullYear(), at.getMonth(), at.getDate() + 1, 0, 0, 0, 0).getTime();
|
|
24
|
+
}
|
|
25
|
+
/** Split a half-open interval at every local midnight, preserving its elapsed seconds. */
|
|
26
|
+
export function splitIntervalByLocalDay(startMs, endMs) {
|
|
27
|
+
if (endMs <= startMs) {
|
|
28
|
+
return [{ day: localDay(new Date(startMs)), endMs: startMs, seconds: 0, startMs }];
|
|
29
|
+
}
|
|
30
|
+
const slices = [];
|
|
31
|
+
let cursor = startMs;
|
|
32
|
+
while (cursor < endMs) {
|
|
33
|
+
const boundary = Math.min(nextLocalMidnight(cursor), endMs);
|
|
34
|
+
slices.push({
|
|
35
|
+
day: localDay(new Date(cursor)),
|
|
36
|
+
endMs: boundary,
|
|
37
|
+
seconds: Math.max(0, Math.round((boundary - cursor) / 1000)),
|
|
38
|
+
startMs: cursor
|
|
39
|
+
});
|
|
40
|
+
cursor = boundary;
|
|
41
|
+
}
|
|
42
|
+
return slices;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Local Monday 00:00 of the ISO week containing `date`.
|
|
46
|
+
*
|
|
47
|
+
* Built from local calendar fields, never by subtracting days in milliseconds: a week containing a
|
|
48
|
+
* daylight-saving change is 167 or 169 hours long, so arithmetic on the clock lands an hour either
|
|
49
|
+
* side of midnight and the week then starts on Sunday night or Monday morning.
|
|
50
|
+
*/
|
|
51
|
+
export function startOfIsoWeek(date) {
|
|
52
|
+
// getDay() is Sunday-first; ISO weeks start on Monday, so Sunday is six days into its week.
|
|
53
|
+
const daysSinceMonday = (date.getDay() + 6) % 7;
|
|
54
|
+
return new Date(date.getFullYear(), date.getMonth(), date.getDate() - daysSinceMonday, 0, 0, 0, 0);
|
|
55
|
+
}
|
|
56
|
+
export function isoWeekPeriod(date) {
|
|
57
|
+
const from = startOfIsoWeek(date);
|
|
58
|
+
let to = from.getTime();
|
|
59
|
+
// Seven local midnights rather than seven times 24 hours, for the reason startOfIsoWeek gives.
|
|
60
|
+
for (let day = 0; day < 7; day++)
|
|
61
|
+
to = nextLocalMidnight(to);
|
|
62
|
+
return { from, to: new Date(to) };
|
|
63
|
+
}
|
|
6
64
|
/** Format a `Date` as local `HH:MM` — the canonical clock format for prompts and confirmations. */
|
|
7
65
|
export function formatClock(date) {
|
|
8
66
|
return `${String(date.getHours()).padStart(2, "0")}:${String(date.getMinutes()).padStart(2, "0")}`;
|
|
@@ -26,17 +84,25 @@ export function formatDuration(seconds) {
|
|
|
26
84
|
return `${h}h ${m}m`;
|
|
27
85
|
}
|
|
28
86
|
/**
|
|
29
|
-
* Parse a duration string like `1h30m`, `2h`, `45m`, or `
|
|
87
|
+
* Parse a duration string like `1h30m`, `2h`, `45m`, `90m`, or `56m 36s` into seconds.
|
|
30
88
|
* Returns `null` when the input is empty or malformed (unlike the loose regex
|
|
31
89
|
* that previously lived in the `log` command, which silently matched garbage).
|
|
90
|
+
*
|
|
91
|
+
* Spaces between the parts, and a trailing seconds component, are accepted because
|
|
92
|
+
* {@link formatDuration} *writes* both: a form pre-filled with `56m 36s` that its own parser then
|
|
93
|
+
* rejects is a row nobody can accept. Parse what we print.
|
|
32
94
|
*/
|
|
33
95
|
export function parseDuration(input) {
|
|
34
|
-
const match = input.trim().match(/^(?:(\d+)h)
|
|
35
|
-
if (
|
|
96
|
+
const match = input.trim().match(/^(?:(\d+)\s*h)?\s*(?:(\d+)\s*m)?\s*(?:(\d+)\s*s)?$/);
|
|
97
|
+
if (match === null)
|
|
98
|
+
return null;
|
|
99
|
+
const parts = [match[1] ?? "", match[2] ?? "", match[3] ?? ""];
|
|
100
|
+
if (parts.every((part) => part === ""))
|
|
36
101
|
return null;
|
|
37
102
|
const hours = parseInt(match[1] ?? "0", 10);
|
|
38
103
|
const minutes = parseInt(match[2] ?? "0", 10);
|
|
39
|
-
|
|
104
|
+
const seconds = parseInt(match[3] ?? "0", 10);
|
|
105
|
+
return hours * 3600 + minutes * 60 + seconds;
|
|
40
106
|
}
|
|
41
107
|
/** Full ISO-8601 timestamp: `YYYY-MM-DDTHH:MM[:SS[.sss]][Z|±HH:MM]`. */
|
|
42
108
|
const ISO_8601 = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?$/;
|
|
@@ -60,7 +126,7 @@ export function isFullIsoTimestamp(input) {
|
|
|
60
126
|
export function parseStartTime(input, now = new Date()) {
|
|
61
127
|
const trimmed = input.trim();
|
|
62
128
|
const hm = trimmed.match(/^(\d{1,2}):(\d{2})$/);
|
|
63
|
-
if (hm) {
|
|
129
|
+
if (hm !== null) {
|
|
64
130
|
const hours = parseInt(hm[1], 10);
|
|
65
131
|
const minutes = parseInt(hm[2], 10);
|
|
66
132
|
if (hours > 23 || minutes > 59)
|
|
@@ -108,13 +174,13 @@ function formatClockDated(date, now) {
|
|
|
108
174
|
*/
|
|
109
175
|
export function resolveCorrectedEnd(params) {
|
|
110
176
|
const trimmed = params.input.trim();
|
|
111
|
-
if (
|
|
177
|
+
if (trimmed === "") {
|
|
112
178
|
return { ok: false, error: "Enter an end time as HH:MM (today) or a full ISO timestamp." };
|
|
113
179
|
}
|
|
114
180
|
let end;
|
|
115
181
|
if (HH_MM.test(trimmed)) {
|
|
116
182
|
const parsed = parseStartTime(trimmed, params.now);
|
|
117
|
-
if (
|
|
183
|
+
if (parsed === null)
|
|
118
184
|
return { ok: false, error: "Invalid time. Use HH:MM (24-hour), e.g. 17:30." };
|
|
119
185
|
// Bare HH:MM lands on today by default; if that is still in the future the
|
|
120
186
|
// user means the same clock time yesterday (they forgot overnight).
|
|
@@ -124,7 +190,7 @@ export function resolveCorrectedEnd(params) {
|
|
|
124
190
|
}
|
|
125
191
|
else if (isFullIsoTimestamp(trimmed)) {
|
|
126
192
|
const parsed = parseStartTime(trimmed, params.now);
|
|
127
|
-
if (
|
|
193
|
+
if (parsed === null)
|
|
128
194
|
return { ok: false, error: "Invalid ISO timestamp." };
|
|
129
195
|
end = parsed;
|
|
130
196
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,mGAAmG;AACnG,MAAM,UAAU,WAAW,CAAC,IAAU;IACpC,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AACpG,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC3C,MAAM,CAAC,GAAG,OAAO,GAAG,EAAE,CAAA;IACtB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AACpG,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAA;IACtC,IAAI,OAAO,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,EAAE,GAAG,CAAA;IAC1E,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAC3C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAA;AACtB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../../src/utils/time.ts"],"names":[],"mappings":"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"}
|