@knpkv/jira-clockify 1.0.2 → 1.1.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/dist/package.json +6 -6
- package/dist/src/cli/auth.js +19 -4
- package/dist/src/cli/auth.js.map +1 -1
- package/dist/src/cli/config.js.map +1 -1
- package/dist/src/cli/fetchTicket.js +9 -4
- package/dist/src/cli/fetchTicket.js.map +1 -1
- package/dist/src/cli/fuzzySelect.js.map +1 -1
- package/dist/src/cli/layers.js.map +1 -1
- package/dist/src/cli/setup.js +36 -6
- package/dist/src/cli/setup.js.map +1 -1
- package/dist/src/cli/timer/edit.js +14 -7
- package/dist/src/cli/timer/edit.js.map +1 -1
- package/dist/src/cli/timer/start.js +9 -5
- package/dist/src/cli/timer/start.js.map +1 -1
- package/dist/src/cli/timer/status.js.map +1 -1
- package/dist/src/cli/timer/stop.js +48 -8
- package/dist/src/cli/timer/stop.js.map +1 -1
- package/dist/src/services/ClockifyAuth.js.map +1 -1
- package/dist/src/services/ConfigService.js +34 -1
- package/dist/src/services/ConfigService.js.map +1 -1
- package/dist/src/services/ReconcileService.js +0 -0
- package/dist/src/services/ReconcileService.js.map +1 -1
- package/dist/src/services/StateWriter.js +25 -1
- package/dist/src/services/StateWriter.js.map +1 -1
- package/dist/src/services/TicketService.js +10 -5
- package/dist/src/services/TicketService.js.map +1 -1
- package/dist/src/services/TimerService.js +34 -6
- package/dist/src/services/TimerService.js.map +1 -1
- package/dist/src/tui/App.js +69 -9
- package/dist/src/tui/App.js.map +1 -1
- package/dist/src/tui/components/BigTimer.js +1 -1
- package/dist/src/tui/components/BigTimer.js.map +1 -1
- package/dist/src/tui/components/Footer.js +11 -2
- package/dist/src/tui/components/Footer.js.map +1 -1
- package/dist/src/tui/components/Header.js +2 -1
- package/dist/src/tui/components/Header.js.map +1 -1
- package/dist/src/tui/components/PopupInput.js +10 -5
- package/dist/src/tui/components/PopupInput.js.map +1 -1
- package/dist/src/tui/components/PopupMessage.js +7 -3
- package/dist/src/tui/components/PopupMessage.js.map +1 -1
- package/dist/src/tui/components/TicketList.js +7 -8
- package/dist/src/tui/components/TicketList.js.map +1 -1
- package/dist/src/tui/components/TicketRow.js +7 -6
- package/dist/src/tui/components/TicketRow.js.map +1 -1
- package/dist/src/tui/components/TimerDisplay.js +1 -1
- package/dist/src/tui/components/TimerDisplay.js.map +1 -1
- package/dist/src/tui/hooks/useTerminalSize.js +3 -1
- package/dist/src/tui/hooks/useTerminalSize.js.map +1 -1
- package/dist/src/utils/time.js +72 -0
- package/dist/src/utils/time.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/dist/test/ReconcileService.test.js +0 -146
- package/dist/test/ReconcileService.test.js.map +0 -1
- package/dist/test/TimerService.test.js +0 -607
- package/dist/test/TimerService.test.js.map +0 -1
- package/dist/test/commandSurface.test.js +0 -42
- package/dist/test/commandSurface.test.js.map +0 -1
- package/dist/test/fetchTicket.test.js +0 -89
- package/dist/test/fetchTicket.test.js.map +0 -1
- package/dist/test/stopPrompts.test.js +0 -93
- package/dist/test/stopPrompts.test.js.map +0 -1
- package/dist/test/time.test.js +0 -84
- package/dist/test/time.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knpkv/jira-clockify",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "TUI for Jira-Clockify time tracking, attachable to neovim",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "knpkv",
|
|
@@ -17,23 +17,23 @@
|
|
|
17
17
|
"skills"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@effect/atom-react": "4.0.0-beta.
|
|
21
|
-
"@effect/platform-node": "4.0.0-beta.
|
|
20
|
+
"@effect/atom-react": "4.0.0-beta.93",
|
|
21
|
+
"@effect/platform-node": "4.0.0-beta.93",
|
|
22
22
|
"@opentui/core": "https://pkg.pr.new/anomalyco/opentui/@opentui/core@367a94087821b3b5feedd35bbb57df43b10a286e",
|
|
23
23
|
"@opentui/react": "https://pkg.pr.new/anomalyco/opentui/@opentui/react@367a94087821b3b5feedd35bbb57df43b10a286e",
|
|
24
|
-
"effect": "4.0.0-beta.
|
|
24
|
+
"effect": "4.0.0-beta.93",
|
|
25
25
|
"react": "^19.2.7",
|
|
26
26
|
"@knpkv/agent-skills": "^0.2.2",
|
|
27
|
-
"@knpkv/atlassian-common": "^1.
|
|
27
|
+
"@knpkv/atlassian-common": "^1.1.0",
|
|
28
28
|
"@knpkv/clockify-api-client": "^0.3.0",
|
|
29
|
-
"@knpkv/jira-api-client": "^0.
|
|
30
|
-
"@knpkv/jira-cli": "^1.
|
|
29
|
+
"@knpkv/jira-api-client": "^0.4.0",
|
|
30
|
+
"@knpkv/jira-cli": "^1.2.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@effect/vitest": "4.0.0-beta.
|
|
33
|
+
"@effect/vitest": "4.0.0-beta.93",
|
|
34
34
|
"@types/node": "latest",
|
|
35
35
|
"@types/react": "^19.2.17",
|
|
36
|
-
"tsx": "^4.
|
|
36
|
+
"tsx": "^4.23.0",
|
|
37
37
|
"vitest": "^4.1.9"
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "@effect/vitest";
|
|
2
|
-
import { deltaToApply, resolvePeriod } from "../src/cli/reconcile.js";
|
|
3
|
-
import { buildReconcileRows, combineDescriptions, localDay, parseTicketKey, stripTicketPrefix } from "../src/services/ReconcileService.js";
|
|
4
|
-
describe("parseTicketKey", () => {
|
|
5
|
-
it("parses the bracket form `[KEY] summary`", () => {
|
|
6
|
-
expect(parseTicketKey("[PROJ-12] Fix the widget")).toBe("PROJ-12");
|
|
7
|
-
});
|
|
8
|
-
it("parses the colon form `KEY: summary`", () => {
|
|
9
|
-
expect(parseTicketKey("PROJ-12: Fix the widget")).toBe("PROJ-12");
|
|
10
|
-
});
|
|
11
|
-
// A bare colon prefix that isn't a ticket key must not be mistaken for one.
|
|
12
|
-
it("does not treat arbitrary `word:` prefixes as a key", () => {
|
|
13
|
-
expect(parseTicketKey("Meeting: standup")).toBeNull();
|
|
14
|
-
});
|
|
15
|
-
it("returns null for empty / missing descriptions", () => {
|
|
16
|
-
expect(parseTicketKey("")).toBeNull();
|
|
17
|
-
expect(parseTicketKey(null)).toBeNull();
|
|
18
|
-
expect(parseTicketKey(undefined)).toBeNull();
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
describe("localDay", () => {
|
|
22
|
-
it("formats a date as local YYYY-MM-DD", () => {
|
|
23
|
-
// Construct from local components to stay timezone-independent.
|
|
24
|
-
expect(localDay(new Date(2026, 5, 23, 9, 30))).toBe("2026-06-23");
|
|
25
|
-
expect(localDay(new Date(2026, 0, 1, 0, 0))).toBe("2026-01-01");
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
describe("buildReconcileRows", () => {
|
|
29
|
-
// Multiple entries on the same (ticket, day) on one side must sum, not duplicate.
|
|
30
|
-
it("sums per (ticket, day) bucket across both sides", () => {
|
|
31
|
-
const rows = buildReconcileRows([
|
|
32
|
-
{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 3600 },
|
|
33
|
-
{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 1800 }
|
|
34
|
-
], [{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 3600 }]);
|
|
35
|
-
expect(rows).toHaveLength(1);
|
|
36
|
-
expect(rows[0]).toMatchObject({ ticketKey: "PROJ-1", day: "2026-06-23", clockifySeconds: 5400, jiraSeconds: 3600 });
|
|
37
|
-
});
|
|
38
|
-
// A bucket present on only one side still appears, with 0 on the other.
|
|
39
|
-
it("includes one-sided buckets with zero on the missing side", () => {
|
|
40
|
-
const rows = buildReconcileRows([{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 3600 }], [{ ticketKey: "PROJ-2", day: "2026-06-24", seconds: 1800 }]);
|
|
41
|
-
expect(rows).toEqual([
|
|
42
|
-
{ ticketKey: "PROJ-1", day: "2026-06-23", clockifySeconds: 3600, jiraSeconds: 0, clockifyDescription: null },
|
|
43
|
-
{ ticketKey: "PROJ-2", day: "2026-06-24", clockifySeconds: 0, jiraSeconds: 1800, clockifyDescription: null }
|
|
44
|
-
]);
|
|
45
|
-
});
|
|
46
|
-
it("sorts by day then ticket for stable output", () => {
|
|
47
|
-
const rows = buildReconcileRows([
|
|
48
|
-
{ ticketKey: "PROJ-9", day: "2026-06-24", seconds: 60 },
|
|
49
|
-
{ ticketKey: "PROJ-2", day: "2026-06-23", seconds: 60 },
|
|
50
|
-
{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 60 }
|
|
51
|
-
], []);
|
|
52
|
-
expect(rows.map((r) => `${r.day} ${r.ticketKey}`)).toEqual([
|
|
53
|
-
"2026-06-23 PROJ-1",
|
|
54
|
-
"2026-06-23 PROJ-2",
|
|
55
|
-
"2026-06-24 PROJ-9"
|
|
56
|
-
]);
|
|
57
|
-
});
|
|
58
|
-
it("returns an empty list when both sides are empty", () => {
|
|
59
|
-
expect(buildReconcileRows([], [])).toEqual([]);
|
|
60
|
-
});
|
|
61
|
-
// The Clockify description becomes the worklog comment, prefix stripped and deduped.
|
|
62
|
-
it("combines Clockify descriptions per bucket into clockifyDescription", () => {
|
|
63
|
-
const rows = buildReconcileRows([
|
|
64
|
-
{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 3600, description: "[PROJ-1] Fix the widget" },
|
|
65
|
-
{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 1800, description: "[PROJ-1] Write tests" },
|
|
66
|
-
{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 600, description: "[PROJ-1] Fix the widget" }
|
|
67
|
-
], []);
|
|
68
|
-
expect(rows[0]?.clockifyDescription).toBe("Fix the widget; Write tests");
|
|
69
|
-
});
|
|
70
|
-
it("yields a null clockifyDescription when descriptions are only the ticket prefix", () => {
|
|
71
|
-
const rows = buildReconcileRows([{ ticketKey: "PROJ-1", day: "2026-06-23", seconds: 3600, description: "[PROJ-1]" }], []);
|
|
72
|
-
expect(rows[0]?.clockifyDescription).toBeNull();
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
describe("stripTicketPrefix", () => {
|
|
76
|
-
it("strips the bracket and colon ticket markers", () => {
|
|
77
|
-
expect(stripTicketPrefix("[PROJ-12] Fix the widget")).toBe("Fix the widget");
|
|
78
|
-
expect(stripTicketPrefix("PROJ-12: Fix the widget")).toBe("Fix the widget");
|
|
79
|
-
});
|
|
80
|
-
it("keeps the prefix appended after a Clockify stop comment", () => {
|
|
81
|
-
expect(stripTicketPrefix("[PROJ-12] Fix the widget | extra note")).toBe("Fix the widget | extra note");
|
|
82
|
-
});
|
|
83
|
-
it("returns empty when only the marker is present", () => {
|
|
84
|
-
expect(stripTicketPrefix("[PROJ-12]")).toBe("");
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe("combineDescriptions", () => {
|
|
88
|
-
it("strips prefixes, dedupes, and joins with '; '", () => {
|
|
89
|
-
expect(combineDescriptions(["[A-1] one", "[A-1] two", "[A-1] one"])).toBe("one; two");
|
|
90
|
-
});
|
|
91
|
-
it("returns null when nothing meaningful remains", () => {
|
|
92
|
-
expect(combineDescriptions([null, undefined, "[A-1]", " "])).toBeNull();
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe("deltaToApply", () => {
|
|
96
|
-
const row = (clockifySeconds, jiraSeconds) => ({
|
|
97
|
-
ticketKey: "PROJ-1",
|
|
98
|
-
day: "2026-06-23",
|
|
99
|
-
clockifySeconds,
|
|
100
|
-
jiraSeconds,
|
|
101
|
-
clockifyDescription: null
|
|
102
|
-
});
|
|
103
|
-
it("returns the gap the target is short in the chosen direction", () => {
|
|
104
|
-
expect(deltaToApply(row(7200, 3600), "clockify-to-jira")).toBe(3600);
|
|
105
|
-
expect(deltaToApply(row(3600, 7200), "jira-to-clockify")).toBe(3600);
|
|
106
|
-
});
|
|
107
|
-
// Reconciling clockify->jira never proposes shrinking Jira when Jira already has more.
|
|
108
|
-
it("returns 0 when the target already has at least as much", () => {
|
|
109
|
-
expect(deltaToApply(row(3600, 7200), "clockify-to-jira")).toBe(0);
|
|
110
|
-
expect(deltaToApply(row(7200, 3600), "jira-to-clockify")).toBe(0);
|
|
111
|
-
});
|
|
112
|
-
// Sub-minute differences are noise (Jira floors to 60s) and must not be flagged.
|
|
113
|
-
it("ignores differences under the 60s tolerance", () => {
|
|
114
|
-
expect(deltaToApply(row(3630, 3600), "clockify-to-jira")).toBe(0);
|
|
115
|
-
expect(deltaToApply(row(3660, 3600), "clockify-to-jira")).toBe(60);
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
describe("resolvePeriod", () => {
|
|
119
|
-
// A custom window is inclusive of both days → half-open [from 00:00, until+1 00:00).
|
|
120
|
-
it("builds an inclusive custom window from --since/--until", () => {
|
|
121
|
-
const period = resolvePeriod({ week: false, since: "2026-06-01", until: "2026-06-07" });
|
|
122
|
-
expect("error" in period).toBe(false);
|
|
123
|
-
if ("error" in period)
|
|
124
|
-
return;
|
|
125
|
-
expect(localDay(period.from)).toBe("2026-06-01");
|
|
126
|
-
// `to` is exclusive: the instant just before it is still 2026-06-07.
|
|
127
|
-
expect(localDay(new Date(period.to.getTime() - 1))).toBe("2026-06-07");
|
|
128
|
-
});
|
|
129
|
-
it("spans 7 local days for --week (inclusive of today)", () => {
|
|
130
|
-
const period = resolvePeriod({ week: true, since: undefined, until: undefined });
|
|
131
|
-
expect("error" in period).toBe(false);
|
|
132
|
-
if ("error" in period)
|
|
133
|
-
return;
|
|
134
|
-
const days = Math.round((period.to.getTime() - period.from.getTime()) / (24 * 60 * 60 * 1000));
|
|
135
|
-
expect(days).toBe(7);
|
|
136
|
-
});
|
|
137
|
-
it("rejects a reversed custom window", () => {
|
|
138
|
-
const period = resolvePeriod({ week: false, since: "2026-06-07", until: "2026-06-01" });
|
|
139
|
-
expect("error" in period).toBe(true);
|
|
140
|
-
});
|
|
141
|
-
it("rejects a malformed date", () => {
|
|
142
|
-
const period = resolvePeriod({ week: false, since: "june 1", until: undefined });
|
|
143
|
-
expect("error" in period).toBe(true);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
//# sourceMappingURL=ReconcileService.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReconcileService.test.js","sourceRoot":"","sources":["../../test/ReconcileService.test.ts"],"names":[],"mappings":"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"}
|