@knpkv/jira-clockify 0.2.0 → 0.5.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 +4 -1
- package/dist/package.json +12 -13
- package/dist/src/bin.js +30 -13
- package/dist/src/bin.js.map +1 -1
- package/dist/src/cli/auth.js +23 -19
- package/dist/src/cli/auth.js.map +1 -1
- package/dist/src/cli/config.js +4 -4
- package/dist/src/cli/config.js.map +1 -1
- package/dist/src/cli/fetchTicket.js +30 -0
- package/dist/src/cli/fetchTicket.js.map +1 -0
- package/dist/src/cli/fuzzySelect.js +6 -5
- package/dist/src/cli/fuzzySelect.js.map +1 -1
- package/dist/src/cli/layers.js +10 -8
- package/dist/src/cli/layers.js.map +1 -1
- package/dist/src/cli/list.js +1 -1
- package/dist/src/cli/list.js.map +1 -1
- package/dist/src/cli/setup.js +19 -19
- package/dist/src/cli/setup.js.map +1 -1
- 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.js +11 -11
- package/dist/src/cli/timer/edit.js.map +1 -1
- package/dist/src/cli/timer/log.js +56 -79
- package/dist/src/cli/timer/log.js.map +1 -1
- package/dist/src/cli/timer/start.js +56 -40
- package/dist/src/cli/timer/start.js.map +1 -1
- package/dist/src/cli/timer/status.js +7 -7
- package/dist/src/cli/timer/status.js.map +1 -1
- package/dist/src/cli/timer/stop.js +183 -59
- package/dist/src/cli/timer/stop.js.map +1 -1
- package/dist/src/main.js +15 -3
- package/dist/src/main.js.map +1 -1
- package/dist/src/services/ClockifyAuth.js +12 -23
- package/dist/src/services/ClockifyAuth.js.map +1 -1
- package/dist/src/services/ConfigService.js +7 -7
- package/dist/src/services/ConfigService.js.map +1 -1
- package/dist/src/services/HomeDirectory.js +14 -0
- package/dist/src/services/HomeDirectory.js.map +1 -0
- package/dist/src/services/StateWriter.js +8 -8
- package/dist/src/services/StateWriter.js.map +1 -1
- package/dist/src/services/TicketService.js +22 -15
- package/dist/src/services/TicketService.js.map +1 -1
- package/dist/src/services/TimerService.js +126 -60
- package/dist/src/services/TimerService.js.map +1 -1
- package/dist/src/tui/App.js +72 -8
- package/dist/src/tui/App.js.map +1 -1
- 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.js +1 -1
- package/dist/src/tui/atoms/tickets.js.map +1 -1
- package/dist/src/tui/atoms/timer.js +7 -2
- package/dist/src/tui/atoms/timer.js.map +1 -1
- 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.js +2 -2
- package/dist/src/tui/components/BigTimer.js.map +1 -1
- package/dist/src/tui/components/Footer.js +1 -1
- package/dist/src/tui/components/Footer.js.map +1 -1
- package/dist/src/tui/components/Header.js +3 -2
- package/dist/src/tui/components/Header.js.map +1 -1
- package/dist/src/tui/components/PopupMessage.js +7 -2
- package/dist/src/tui/components/PopupMessage.js.map +1 -1
- package/dist/src/tui/components/TicketList.js +3 -2
- package/dist/src/tui/components/TicketList.js.map +1 -1
- package/dist/src/tui/context/theme.js.map +1 -1
- package/dist/src/tui/hooks/useElapsedTimer.js +3 -2
- package/dist/src/tui/hooks/useElapsedTimer.js.map +1 -1
- package/dist/src/tui/hooks/useTerminalSize.js +1 -21
- package/dist/src/tui/hooks/useTerminalSize.js.map +1 -1
- package/dist/src/utils/time.js +55 -5
- package/dist/src/utils/time.js.map +1 -1
- package/dist/test/TimerService.test.js +224 -31
- package/dist/test/TimerService.test.js.map +1 -1
- package/dist/test/fetchTicket.test.js +89 -0
- package/dist/test/fetchTicket.test.js.map +1 -0
- package/dist/test/stopPrompts.test.js +93 -0
- package/dist/test/stopPrompts.test.js.map +1 -0
- package/dist/test/time.test.js +84 -0
- package/dist/test/time.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -17
- package/skills/jcf/SKILL.md +89 -0
- package/skills/jcf/agents/openai.yaml +4 -0
package/dist/src/cli/setup.js
CHANGED
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { Prompt } from "@effect/cli";
|
|
7
6
|
import { makeOpenApiFetchClient, toEffect } from "@knpkv/clockify-api-client";
|
|
8
7
|
import { JiraAuth } from "@knpkv/jira-cli/JiraAuth";
|
|
9
8
|
import { Console, Effect } from "effect";
|
|
9
|
+
import * as Path from "effect/Path";
|
|
10
|
+
import { Prompt } from "effect/unstable/cli";
|
|
11
|
+
import * as ChildProcess from "effect/unstable/process/ChildProcess";
|
|
10
12
|
import { ClockifyAuth } from "../services/ClockifyAuth.js";
|
|
11
13
|
// ---------------------------------------------------------------------------
|
|
12
14
|
// First-run setup
|
|
@@ -34,8 +36,8 @@ export const checkAuthOrSetup = Effect.gen(function* () {
|
|
|
34
36
|
yield* Console.log("OAuth configured.");
|
|
35
37
|
}
|
|
36
38
|
yield* Console.log("Starting Jira login...");
|
|
37
|
-
yield* jira.login().pipe(Effect.
|
|
38
|
-
const user = yield* jira.getCurrentUser().pipe(Effect.
|
|
39
|
+
yield* jira.login().pipe(Effect.catch((e) => Console.log(`Jira login failed: ${"message" in e ? e.message : String(e)}`)));
|
|
40
|
+
const user = yield* jira.getCurrentUser().pipe(Effect.catch(() => Effect.succeed(null)));
|
|
39
41
|
if (user) {
|
|
40
42
|
yield* Console.log(`✓ Logged in as ${user.name} (${user.email})\n`);
|
|
41
43
|
}
|
|
@@ -56,13 +58,13 @@ export const checkAuthOrSetup = Effect.gen(function* () {
|
|
|
56
58
|
"X-Api-Key": apiKey,
|
|
57
59
|
"Content-Type": "application/json"
|
|
58
60
|
});
|
|
59
|
-
const user = yield* toEffect(client.GET("/v1/user")).pipe(Effect.
|
|
61
|
+
const user = yield* toEffect(client.GET("/v1/user")).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
60
62
|
if (!user) {
|
|
61
63
|
yield* Console.log("✗ Invalid API key. Run: jcf auth clockify setup\n");
|
|
62
64
|
return false;
|
|
63
65
|
}
|
|
64
66
|
yield* Console.log(`Authenticated as: ${user.name} (${user.email})`);
|
|
65
|
-
const workspaces = yield* toEffect(client.GET("/v1/workspaces")).pipe(Effect.
|
|
67
|
+
const workspaces = yield* toEffect(client.GET("/v1/workspaces")).pipe(Effect.catch(() => Effect.succeed([])));
|
|
66
68
|
let workspaceId = "";
|
|
67
69
|
let workspaceName = "";
|
|
68
70
|
if (workspaces.length === 1) {
|
|
@@ -100,11 +102,9 @@ export const launchTui = (args) => Effect.gen(function* () {
|
|
|
100
102
|
}
|
|
101
103
|
else {
|
|
102
104
|
// Relaunch with Bun if available
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
105
|
+
const exitCode = (command) => Effect.scoped(command.pipe(Effect.flatMap((handle) => handle.exitCode)));
|
|
106
|
+
const hasBun = yield* exitCode(ChildProcess.make("bun", ["--version"])).pipe(Effect.map((code) => code === 0), Effect.catch(() => Effect.succeed(false)));
|
|
107
|
+
if (!hasBun) {
|
|
108
108
|
yield* Console.log("TUI requires Bun runtime (@opentui/react dependency).");
|
|
109
109
|
yield* Console.log("Install Bun: curl -fsSL https://bun.sh/install | bash");
|
|
110
110
|
yield* Console.log("");
|
|
@@ -112,19 +112,19 @@ export const launchTui = (args) => Effect.gen(function* () {
|
|
|
112
112
|
return;
|
|
113
113
|
}
|
|
114
114
|
// Re-exec with bun — must point to bin.ts, not this module
|
|
115
|
-
const
|
|
116
|
-
const
|
|
115
|
+
const path = yield* Path.Path;
|
|
116
|
+
const thisDir = yield* path.fromFileUrl(new URL(".", import.meta.url));
|
|
117
|
+
const scriptPath = path.join(thisDir, "../bin.js");
|
|
117
118
|
const cliArgs = args.slice(2);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
119
|
+
yield* exitCode(ChildProcess.make("bun", [scriptPath, ...cliArgs], {
|
|
120
|
+
stdin: "inherit",
|
|
121
|
+
stdout: "inherit",
|
|
122
|
+
stderr: "inherit"
|
|
123
|
+
})).pipe(Effect.catch(() => Effect.void));
|
|
124
124
|
}
|
|
125
125
|
});
|
|
126
126
|
export const launchTuiOrSetup = (args) => Effect.gen(function* () {
|
|
127
|
-
const ready = yield* checkAuthOrSetup.pipe(Effect.
|
|
127
|
+
const ready = yield* checkAuthOrSetup.pipe(Effect.catch(() => Effect.succeed(false)));
|
|
128
128
|
if (!ready) {
|
|
129
129
|
yield* Console.log("Setup incomplete. Run 'jcf auth status' to check.");
|
|
130
130
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { Command, Prompt } from "@effect/cli";
|
|
7
6
|
import { Console, Effect, SubscriptionRef } from "effect";
|
|
7
|
+
import { Command, Prompt } from "effect/unstable/cli";
|
|
8
8
|
import { TimerService } from "../../services/TimerService.js";
|
|
9
9
|
export const discard = Command.make("discard", {}, () => Effect.gen(function* () {
|
|
10
10
|
const timer = yield* TimerService;
|
|
@@ -27,7 +27,7 @@ export const discard = Command.make("discard", {}, () => Effect.gen(function* ()
|
|
|
27
27
|
yield* Console.log("Cancelled.");
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
yield* timer.discard.pipe(Effect.
|
|
30
|
+
yield* timer.discard.pipe(Effect.catch((e) => Console.log(`Error: ${e.message}`)));
|
|
31
31
|
yield* Console.log("Timer discarded. Clockify entry deleted.");
|
|
32
32
|
}));
|
|
33
33
|
//# sourceMappingURL=discard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discard.js","sourceRoot":"","sources":["../../../../src/cli/timer/discard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"discard.js","sourceRoot":"","sources":["../../../../src/cli/timer/discard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAE7D,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CACjC,SAAS,EACT,EAAE,EACF,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;IACjC,KAAK,CAAC,CAAC,KAAK,CAAC,aAAa,CAAA;IAE1B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACvD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QACjD,OAAM;IACR,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,OAAO,IAAI,EAAE,GAAG,CAAC,CAAA;IACrF,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;IAE3F,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE;YACtC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE;SAClC;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QAChC,OAAM;IACR,CAAC;IAED,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CACvB,MAAM,CAAC,KAAK,CAAC,CAAC,CAA+B,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACtF,CAAA;IAED,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAA;AAChE,CAAC,CAAC,CACL,CAAA"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import { Command, Prompt } from "@effect/cli";
|
|
7
6
|
import { ClockifyApiClient } from "@knpkv/clockify-api-client";
|
|
8
7
|
import { Console, Effect, SubscriptionRef } from "effect";
|
|
8
|
+
import { Command, Prompt } from "effect/unstable/cli";
|
|
9
9
|
import { ClockifyAuth } from "../../services/ClockifyAuth.js";
|
|
10
10
|
import { TimerService } from "../../services/TimerService.js";
|
|
11
11
|
export const edit = Command.make("edit", {}, () => Effect.gen(function* () {
|
|
@@ -20,7 +20,7 @@ export const edit = Command.make("edit", {}, () => Effect.gen(function* () {
|
|
|
20
20
|
yield* Console.log("");
|
|
21
21
|
const clockifyAuth = yield* ClockifyAuth;
|
|
22
22
|
const clockifyClient = yield* ClockifyApiClient;
|
|
23
|
-
const auth = yield* clockifyAuth.getConfig.pipe(Effect.
|
|
23
|
+
const auth = yield* clockifyAuth.getConfig.pipe(Effect.catch(() => Effect.succeed(null)));
|
|
24
24
|
if (!auth || !current.clockifyEntryId) {
|
|
25
25
|
yield* Console.log("Cannot edit: missing Clockify auth or entry ID.");
|
|
26
26
|
return;
|
|
@@ -40,7 +40,7 @@ export const edit = Command.make("edit", {}, () => Effect.gen(function* () {
|
|
|
40
40
|
]
|
|
41
41
|
});
|
|
42
42
|
if (what === "project") {
|
|
43
|
-
const projects = yield* clockifyClient.getProjects(auth.workspaceId).pipe(Effect.
|
|
43
|
+
const projects = yield* clockifyClient.getProjects(auth.workspaceId).pipe(Effect.catch(() => Effect.succeed([])));
|
|
44
44
|
const selected = yield* Prompt.select({
|
|
45
45
|
message: "Select project:",
|
|
46
46
|
choices: [
|
|
@@ -51,12 +51,12 @@ export const edit = Command.make("edit", {}, () => Effect.gen(function* () {
|
|
|
51
51
|
if (!current.startedAt)
|
|
52
52
|
return;
|
|
53
53
|
// Fetch existing entry to preserve tags
|
|
54
|
-
const entry = yield* clockifyClient.getTimeEntry(auth.workspaceId, current.clockifyEntryId).pipe(Effect.
|
|
54
|
+
const entry = yield* clockifyClient.getTimeEntry(auth.workspaceId, current.clockifyEntryId).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
55
55
|
yield* clockifyClient.updateTimeEntry(auth.workspaceId, current.clockifyEntryId, {
|
|
56
56
|
start: current.startedAt.toISOString(),
|
|
57
57
|
...(selected ? { projectId: selected } : {}),
|
|
58
58
|
...(entry?.tagIds && entry.tagIds.length > 0 ? { tagIds: [...entry.tagIds] } : {})
|
|
59
|
-
}).pipe(Effect.
|
|
59
|
+
}).pipe(Effect.catch((e) => Console.log(`Error: ${e.message}`)));
|
|
60
60
|
const name = projects.find((p) => p.id === selected)?.name ?? null;
|
|
61
61
|
yield* Console.log(`Project updated: ${name ?? "(none)"}`);
|
|
62
62
|
}
|
|
@@ -70,18 +70,18 @@ export const edit = Command.make("edit", {}, () => Effect.gen(function* () {
|
|
|
70
70
|
});
|
|
71
71
|
if (!current.startedAt)
|
|
72
72
|
return;
|
|
73
|
-
const entry = yield* clockifyClient.getTimeEntry(auth.workspaceId, current.clockifyEntryId).pipe(Effect.
|
|
73
|
+
const entry = yield* clockifyClient.getTimeEntry(auth.workspaceId, current.clockifyEntryId).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
74
74
|
yield* clockifyClient.updateTimeEntry(auth.workspaceId, current.clockifyEntryId, {
|
|
75
75
|
start: current.startedAt.toISOString(),
|
|
76
76
|
billable: val,
|
|
77
77
|
...(entry?.projectId ? { projectId: entry.projectId } : {}),
|
|
78
78
|
...(entry?.tagIds && entry.tagIds.length > 0 ? { tagIds: [...entry.tagIds] } : {})
|
|
79
|
-
}).pipe(Effect.
|
|
79
|
+
}).pipe(Effect.catch((e) => Console.log(`Error: ${e.message}`)));
|
|
80
80
|
yield* Console.log(`Billable updated: ${val ? "yes" : "no"}`);
|
|
81
81
|
}
|
|
82
82
|
if (what === "tags") {
|
|
83
|
-
const allTags = yield* clockifyClient.getTags(auth.workspaceId).pipe(Effect.
|
|
84
|
-
const entry = yield* clockifyClient.getTimeEntry(auth.workspaceId, current.clockifyEntryId).pipe(Effect.
|
|
83
|
+
const allTags = yield* clockifyClient.getTags(auth.workspaceId).pipe(Effect.catch(() => Effect.succeed([])));
|
|
84
|
+
const entry = yield* clockifyClient.getTimeEntry(auth.workspaceId, current.clockifyEntryId).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
85
85
|
const currentTagIds = new Set(entry?.tagIds ?? []);
|
|
86
86
|
yield* Console.log("Current tags: " + (allTags.filter((t) => currentTagIds.has(t.id)).map((t) => t.name).join(", ") || "none"));
|
|
87
87
|
yield* Console.log("");
|
|
@@ -110,7 +110,7 @@ export const edit = Command.make("edit", {}, () => Effect.gen(function* () {
|
|
|
110
110
|
tagIds: newTagIds,
|
|
111
111
|
...(entry?.projectId ? { projectId: entry.projectId } : {}),
|
|
112
112
|
...(entry?.billable !== undefined ? { billable: entry.billable } : {})
|
|
113
|
-
}).pipe(Effect.
|
|
113
|
+
}).pipe(Effect.catch((e) => Console.log(`Error: ${e.message}`)));
|
|
114
114
|
yield* Console.log(`Tag added: ${allTags.find((t) => t.id === tagId)?.name}`);
|
|
115
115
|
}
|
|
116
116
|
if (action === "remove") {
|
|
@@ -131,7 +131,7 @@ export const edit = Command.make("edit", {}, () => Effect.gen(function* () {
|
|
|
131
131
|
tagIds: newTagIds,
|
|
132
132
|
...(entry?.projectId ? { projectId: entry.projectId } : {}),
|
|
133
133
|
...(entry?.billable !== undefined ? { billable: entry.billable } : {})
|
|
134
|
-
}).pipe(Effect.
|
|
134
|
+
}).pipe(Effect.catch((e) => Console.log(`Error: ${e.message}`)));
|
|
135
135
|
yield* Console.log(`Tag removed: ${allTags.find((t) => t.id === tagId)?.name}`);
|
|
136
136
|
}
|
|
137
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../../src/cli/timer/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"edit.js","sourceRoot":"","sources":["../../../../src/cli/timer/edit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,96 +1,73 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Timer `log` command — add
|
|
2
|
+
* Timer `log` command — add a completed interval manually (no running timer).
|
|
3
3
|
*
|
|
4
4
|
* @module
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
import { Console, Effect, Option } from "effect";
|
|
7
|
+
import { Argument as Args, Command, Flag as Options } from "effect/unstable/cli";
|
|
8
|
+
import { TimerService } from "../../services/TimerService.js";
|
|
9
|
+
import { formatDuration, isFullIsoTimestamp, parseDuration, parseStartTime } from "../../utils/time.js";
|
|
10
|
+
import { fetchTicketByKey, NOT_LOGGED_IN_HINT } from "../fetchTicket.js";
|
|
11
|
+
/** Today's calendar day in the user's *local* timezone as `YYYY-MM-DD`. */
|
|
12
|
+
const localToday = () => {
|
|
13
|
+
const d = new Date();
|
|
14
|
+
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
15
|
+
};
|
|
14
16
|
export const log = Command.make("log", {
|
|
15
|
-
key: Args.
|
|
16
|
-
time: Options.
|
|
17
|
-
date: Options.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
if (
|
|
23
|
-
yield* Console.log("Invalid duration. Use format: 1h30m, 2h, 45m");
|
|
17
|
+
key: Args.string("key"),
|
|
18
|
+
time: Options.string("time").pipe(Options.withAlias("t"), Options.withDescription("Duration (e.g. 1h30m, 2h, 45m)")),
|
|
19
|
+
date: Options.string("date").pipe(Options.withAlias("d"), Options.withDescription("Date (YYYY-MM-DD, default today)"), Options.optional),
|
|
20
|
+
at: Options.string("at").pipe(Options.withDescription("Start time on that date (HH:MM, default 09:00)"), Options.optional),
|
|
21
|
+
comment: Options.string("comment").pipe(Options.withAlias("c"), Options.withDescription("Worklog comment"), Options.optional)
|
|
22
|
+
}, ({ at, comment, date, key, time }) => Effect.gen(function* () {
|
|
23
|
+
const totalSeconds = parseDuration(time);
|
|
24
|
+
if (totalSeconds === null || totalSeconds < 60) {
|
|
25
|
+
yield* Console.log("Invalid duration. Use format: 1h30m, 2h, 45m (minimum 1m).");
|
|
24
26
|
return;
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
// A full ISO `--at` carries its own date — combining it with `--date` is
|
|
29
|
+
// ambiguous (which date wins?), so reject the conflict explicitly.
|
|
30
|
+
if (Option.isSome(at) && isFullIsoTimestamp(at.value) && Option.isSome(date)) {
|
|
31
|
+
yield* Console.log("--at is a full ISO timestamp; drop --date (it conflicts).");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Parse date + start time → start instant. Default date is the *local*
|
|
35
|
+
// calendar day, and the date base is parsed at local midnight so the
|
|
36
|
+
// HH:MM `--at` lands on the intended local clock time.
|
|
37
|
+
const dateStr = Option.isSome(date) ? date.value : localToday();
|
|
38
|
+
const timeStr = Option.isSome(at) ? at.value : "09:00";
|
|
39
|
+
const started = parseStartTime(timeStr, new Date(`${dateStr}T00:00:00`));
|
|
40
|
+
if (!started || isNaN(started.getTime())) {
|
|
41
|
+
yield* Console.log("Invalid date/time. Use --date YYYY-MM-DD and --at HH:MM.");
|
|
34
42
|
return;
|
|
35
43
|
}
|
|
36
44
|
// Validate ticket exists
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
})).pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
44
|
-
if (!issue) {
|
|
45
|
+
const fetched = yield* fetchTicketByKey(key);
|
|
46
|
+
if (fetched._tag === "NotLoggedIn") {
|
|
47
|
+
yield* Console.log(NOT_LOGGED_IN_HINT);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (fetched._tag === "NotFound") {
|
|
45
51
|
yield* Console.log(`Ticket ${key} not found in Jira.`);
|
|
46
52
|
return;
|
|
47
53
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
yield* Console.log(` Duration: ${hours}h ${minutes}m (${totalSeconds}s)`);
|
|
52
|
-
yield* Console.log(` Date: ${dateStr}`);
|
|
53
|
-
// Create Clockify entry (completed)
|
|
54
|
-
const clockifyAuth = yield* ClockifyAuth;
|
|
55
|
-
const clockifyClient = yield* ClockifyApiClient;
|
|
56
|
-
const auth = yield* clockifyAuth.getConfig.pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
57
|
-
let clockifyOk = false;
|
|
58
|
-
if (auth) {
|
|
59
|
-
const end = new Date(started.getTime() + totalSeconds * 1000);
|
|
60
|
-
yield* clockifyClient.createTimeEntry(auth.workspaceId, {
|
|
61
|
-
description: `[${key}] ${summary}`,
|
|
62
|
-
start: started.toISOString(),
|
|
63
|
-
end: end.toISOString()
|
|
64
|
-
}).pipe(Effect.tap(() => Effect.sync(() => {
|
|
65
|
-
clockifyOk = true;
|
|
66
|
-
})), Effect.catchAll(() => Effect.void));
|
|
54
|
+
if (fetched._tag === "FetchError") {
|
|
55
|
+
yield* Console.log(`Failed to fetch ticket ${key}: ${fetched.message}`);
|
|
56
|
+
return;
|
|
67
57
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
comment: {
|
|
82
|
-
type: "doc",
|
|
83
|
-
version: 1,
|
|
84
|
-
content: [{ type: "paragraph", content: [{ type: "text", text: commentText }] }]
|
|
85
|
-
}
|
|
86
|
-
} :
|
|
87
|
-
{})
|
|
88
|
-
}))).pipe(Effect.catchAll(() => Effect.succeed(null)));
|
|
89
|
-
if (response && response.status >= 200 && response.status < 300) {
|
|
90
|
-
jiraOk = true;
|
|
91
|
-
}
|
|
58
|
+
const ticket = fetched.ticket;
|
|
59
|
+
yield* Console.log(`Logging: ${ticket.key} — ${ticket.summary}`);
|
|
60
|
+
yield* Console.log(` Duration: ${formatDuration(totalSeconds)} (${totalSeconds}s)`);
|
|
61
|
+
yield* Console.log(` Started: ${started.toISOString()}`);
|
|
62
|
+
const timer = yield* TimerService;
|
|
63
|
+
const result = yield* timer.logManual(ticket, {
|
|
64
|
+
start: started,
|
|
65
|
+
durationSeconds: totalSeconds,
|
|
66
|
+
comment: Option.isSome(comment) ? comment.value : undefined
|
|
67
|
+
}).pipe(Effect.catch((e) => Console.log(`Error: ${e.message}`).pipe(Effect.as(null))));
|
|
68
|
+
if (result) {
|
|
69
|
+
yield* Console.log(` Clockify: ${result.clockifyLogged ? "✓" : "✗"}`);
|
|
70
|
+
yield* Console.log(` Jira worklog: ${result.jiraWorklogLogged ? "✓" : "✗"}`);
|
|
92
71
|
}
|
|
93
|
-
yield* Console.log(` Clockify: ${clockifyOk ? "✓" : "✗"}`);
|
|
94
|
-
yield* Console.log(` Jira worklog: ${jiraOk ? "✓" : "✗"}`);
|
|
95
72
|
}));
|
|
96
73
|
//# sourceMappingURL=log.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../../src/cli/timer/log.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../../../src/cli/timer/log.ts"],"names":[],"mappings":"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"}
|