@knpkv/jira-clockify 1.5.0 → 1.6.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.
Files changed (102) hide show
  1. package/README.md +33 -4
  2. package/dist/package.json +1 -1
  3. package/dist/src/bin.js +16 -5
  4. package/dist/src/bin.js.map +1 -1
  5. package/dist/src/cli/CommandFailed.d.ts +27 -0
  6. package/dist/src/cli/CommandFailed.d.ts.map +1 -0
  7. package/dist/src/cli/CommandFailed.js +25 -0
  8. package/dist/src/cli/CommandFailed.js.map +1 -0
  9. package/dist/src/cli/auth.d.ts +23 -3
  10. package/dist/src/cli/auth.d.ts.map +1 -1
  11. package/dist/src/cli/auth.js +123 -102
  12. package/dist/src/cli/auth.js.map +1 -1
  13. package/dist/src/cli/config.d.ts +2 -1
  14. package/dist/src/cli/config.d.ts.map +1 -1
  15. package/dist/src/cli/config.js +43 -29
  16. package/dist/src/cli/config.js.map +1 -1
  17. package/dist/src/cli/fetchTicket.d.ts +3 -3
  18. package/dist/src/cli/fetchTicket.d.ts.map +1 -1
  19. package/dist/src/cli/fetchTicket.js +7 -7
  20. package/dist/src/cli/fetchTicket.js.map +1 -1
  21. package/dist/src/cli/layers.d.ts +6 -5
  22. package/dist/src/cli/layers.d.ts.map +1 -1
  23. package/dist/src/cli/layers.js +16 -15
  24. package/dist/src/cli/layers.js.map +1 -1
  25. package/dist/src/cli/list.d.ts +3 -2
  26. package/dist/src/cli/list.d.ts.map +1 -1
  27. package/dist/src/cli/list.js +11 -5
  28. package/dist/src/cli/list.js.map +1 -1
  29. package/dist/src/cli/reconcile.d.ts +12 -3
  30. package/dist/src/cli/reconcile.d.ts.map +1 -1
  31. package/dist/src/cli/reconcile.js +71 -23
  32. package/dist/src/cli/reconcile.js.map +1 -1
  33. package/dist/src/cli/root.d.ts.map +1 -1
  34. package/dist/src/cli/root.js +3 -3
  35. package/dist/src/cli/root.js.map +1 -1
  36. package/dist/src/cli/setup.d.ts +14 -4
  37. package/dist/src/cli/setup.d.ts.map +1 -1
  38. package/dist/src/cli/setup.js +45 -94
  39. package/dist/src/cli/setup.js.map +1 -1
  40. package/dist/src/cli/timer/discard.d.ts +1 -1
  41. package/dist/src/cli/timer/discard.d.ts.map +1 -1
  42. package/dist/src/cli/timer/discard.js +2 -1
  43. package/dist/src/cli/timer/discard.js.map +1 -1
  44. package/dist/src/cli/timer/log.d.ts +1 -1
  45. package/dist/src/cli/timer/log.d.ts.map +1 -1
  46. package/dist/src/cli/timer/log.js +2 -1
  47. package/dist/src/cli/timer/log.js.map +1 -1
  48. package/dist/src/cli/timer/start.d.ts +2 -1
  49. package/dist/src/cli/timer/start.d.ts.map +1 -1
  50. package/dist/src/cli/timer/start.js +6 -8
  51. package/dist/src/cli/timer/start.js.map +1 -1
  52. package/dist/src/cli/timer/stop.d.ts +1 -1
  53. package/dist/src/cli/timer/stop.d.ts.map +1 -1
  54. package/dist/src/cli/timer.d.ts.map +1 -1
  55. package/dist/src/cli/timer.js +8 -1
  56. package/dist/src/cli/timer.js.map +1 -1
  57. package/dist/src/cli/unknownCommand.d.ts +24 -0
  58. package/dist/src/cli/unknownCommand.d.ts.map +1 -0
  59. package/dist/src/cli/unknownCommand.js +84 -0
  60. package/dist/src/cli/unknownCommand.js.map +1 -0
  61. package/dist/src/cli/watch.d.ts +2 -2
  62. package/dist/src/cli/watch.d.ts.map +1 -1
  63. package/dist/src/services/ConfigService.d.ts +2 -0
  64. package/dist/src/services/ConfigService.d.ts.map +1 -1
  65. package/dist/src/services/ConfigService.js +2 -1
  66. package/dist/src/services/ConfigService.js.map +1 -1
  67. package/dist/src/services/IssueFacts.d.ts +2 -2
  68. package/dist/src/services/IssueFacts.d.ts.map +1 -1
  69. package/dist/src/services/IssueFacts.js +5 -5
  70. package/dist/src/services/IssueFacts.js.map +1 -1
  71. package/dist/src/services/JiraAccess.d.ts +140 -0
  72. package/dist/src/services/JiraAccess.d.ts.map +1 -0
  73. package/dist/src/services/JiraAccess.js +204 -0
  74. package/dist/src/services/JiraAccess.js.map +1 -0
  75. package/dist/src/services/ProviderSnapshots.d.ts +2 -2
  76. package/dist/src/services/ProviderSnapshots.d.ts.map +1 -1
  77. package/dist/src/services/ProviderSnapshots.js +14 -24
  78. package/dist/src/services/ProviderSnapshots.js.map +1 -1
  79. package/dist/src/services/ReconcileService.d.ts +2 -2
  80. package/dist/src/services/ReconcileService.d.ts.map +1 -1
  81. package/dist/src/services/ReconcileService.js +11 -4
  82. package/dist/src/services/ReconcileService.js.map +1 -1
  83. package/dist/src/services/SavedEntries.d.ts +1 -1
  84. package/dist/src/services/SavedEntries.d.ts.map +1 -1
  85. package/dist/src/services/TimerService.d.ts +3 -3
  86. package/dist/src/services/TimerService.d.ts.map +1 -1
  87. package/dist/src/services/TimerService.js +6 -17
  88. package/dist/src/services/TimerService.js.map +1 -1
  89. package/dist/src/testing/fakeHeadless.d.ts +1 -1
  90. package/dist/src/testing/fakeHeadless.d.ts.map +1 -1
  91. package/dist/src/testing/fakeHeadless.js +17 -7
  92. package/dist/src/testing/fakeHeadless.js.map +1 -1
  93. package/dist/src/tui/App.js +1 -1
  94. package/dist/src/tui/atoms/runtime.d.ts +1 -1
  95. package/dist/src/tui/atoms/runtime.d.ts.map +1 -1
  96. package/dist/src/utils/hints.d.ts +4 -2
  97. package/dist/src/utils/hints.d.ts.map +1 -1
  98. package/dist/src/utils/hints.js +4 -2
  99. package/dist/src/utils/hints.js.map +1 -1
  100. package/dist/tsconfig.tsbuildinfo +1 -1
  101. package/package.json +4 -4
  102. package/skills/jcf/SKILL.md +9 -6
package/README.md CHANGED
@@ -18,27 +18,49 @@ cd packages/jira-clockify && pnpm link --global
18
18
 
19
19
  ## Setup
20
20
 
21
- ### 1. Jira OAuth
21
+ Run `jcf` with nothing set up and it asks about each system in turn; either can be skipped and
22
+ added later. `jcf auth status` shows what is connected and what to run next. Every step below can
23
+ also be run on its own.
24
+
25
+ ### 1. Jira
22
26
 
23
27
  ```bash
24
- jcf auth jira create # Opens Atlassian console — create OAuth 2.0 app
28
+ jcf auth jira token # Site, email and an API token from https://id.atlassian.com/manage-profile/security/api-tokens
29
+ ```
30
+
31
+ The token is checked against Jira before it is saved to `~/.jcf/jira.json` (owner-only, `0600`) and is
32
+ never printed. Only Jira Cloud addresses (`*.atlassian.net`) are accepted, so a typo or look-alike
33
+ domain never receives the token. Classic and scoped tokens both work: a scoped token, which the
34
+ site itself refuses, is used through Atlassian's gateway for that site (`api.atlassian.com/ex/jira/<cloud id>`). A failed check says whether the site, the token or the network was
35
+ the problem.
36
+
37
+ Advanced: connect through your own Atlassian OAuth app instead.
38
+
39
+ ```bash
40
+ jcf auth jira create # Opens Atlassian console — create OAuth 2.0 app
25
41
  jcf auth jira configure # Set client ID and secret
26
42
  jcf auth jira login # Authenticate via browser
27
43
  ```
28
44
 
45
+ When both exist, the API token is used. `jcf auth jira logout` removes both.
46
+
29
47
  ### 2. Clockify API Key
30
48
 
31
49
  ```bash
32
50
  jcf auth clockify setup # Enter API key from https://app.clockify.me/manage-api-keys
51
+ jcf auth clockify setup --api-key <key> --workspace <name> # For scripts; the key is visible to other processes
33
52
  ```
34
53
 
54
+ Commands that need a system that is not connected fail with one line naming the command that
55
+ connects it, and exit non-zero.
56
+
35
57
  ### 3. Configure Defaults
36
58
 
37
59
  ```bash
38
60
  jcf config set project # Select default Clockify project
39
61
  jcf config set billable # Set default billable flag
40
62
  jcf config set jql <jql> # Set default JQL filter
41
- jcf config show # Show current config
63
+ jcf config show # Show current config; marks values that are jcf's defaults
42
64
  jcf config reset # Reset to defaults
43
65
  ```
44
66
 
@@ -96,8 +118,13 @@ jcf sync reconcile jira-to-clockify # Fill Clockify from Jira
96
118
  jcf sync reconcile --agent claude # Propose worklogs from local Claude Code sessions
97
119
  jcf sync reconcile --agent claude --calendar # ...with an hour-by-hour grid of when it happened
98
120
  jcf sync reconcile --agent claude --json # Reporting only: one JSON value, nothing logged
121
+ jcf sync reconcile --agent claude --only clockify # Read and write Clockify alone (or --only jira)
99
122
  ```
100
123
 
124
+ An agent run reads both systems before it proposes anything, because a side it cannot read looks the
125
+ same as a side with nothing recorded. If one is not connected the run stops before planning and says
126
+ how to connect it, or to pass `--only` for the other one.
127
+
101
128
  `--agent claude` is for time _neither_ side recorded: it reads Claude Code and Codex transcripts,
102
129
  keeps work inside your session roots, and works out which issue each
103
130
  session belongs to and how long it accounts for, subtracts
@@ -319,12 +346,14 @@ Stored in `~/.jcf/`:
319
346
  ~/.jcf/
320
347
  ├── config.json # JQL, project, billable defaults, session roots
321
348
  ├── clockify.json # Clockify API key, workspace, user
349
+ ├── jira.json # Jira site, cloud id, email, API token, account (0600)
322
350
  ├── poll.lock # Kernel lock held by the active managed poll
323
351
  ├── poll.stamp # Last managed poll attempt, including failures
324
352
  └── state.json # Current timer state and polling authority
325
353
  ```
326
354
 
327
- Jira OAuth credentials stored via `@knpkv/atlassian-common` in `~/.config/atlassian/`.
355
+ Jira OAuth credentials (the advanced path) are stored via `@knpkv/atlassian-common` in
356
+ `~/.config/atlassian/`. That store holds OAuth logins only, so the API token lives in `~/.jcf/jira.json`.
328
357
 
329
358
  ## License
330
359
 
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knpkv/jira-clockify",
3
- "version": "1.5.0",
3
+ "version": "1.6.0",
4
4
  "description": "TUI for Jira-Clockify time tracking, attachable to neovim",
5
5
  "license": "MIT",
6
6
  "author": "knpkv",
package/dist/src/bin.js CHANGED
@@ -5,22 +5,33 @@
5
5
  * @module
6
6
  */
7
7
  import { NodeRuntime } from "@effect/platform-node";
8
- import { Effect } from "effect";
8
+ import { Console, Data, Effect } from "effect";
9
9
  import { Command } from "effect/cli";
10
10
  import * as Runtime from "effect/Runtime";
11
11
  import * as Stdio from "effect/Stdio";
12
+ import pkg from "../package.json" with { type: "json" };
12
13
  import { HeadlessLayer } from "./cli/layers.js";
13
14
  import { root } from "./cli/root.js";
14
15
  import { reportUnhandled } from "./cli/runtimeFailure.js";
16
+ import { unknownCommandLine } from "./cli/unknownCommand.js";
15
17
  const processArgv = Effect.gen(function* () {
16
18
  const stdio = yield* Stdio.Stdio;
17
19
  const args = yield* stdio.args;
18
20
  return args;
19
21
  });
20
- const cli = Command.runWith(root, {
21
- version: "0.1.0"
22
- });
23
- const program = reportUnhandled(processArgv.pipe(Effect.flatMap((argv) => cli(argv)))).pipe(
22
+ const cli = Command.runWith(root, { version: pkg.version });
23
+ /** An unknown command fails with one line, before effect/cli prints the whole help above it. */
24
+ class UnknownCommand extends Data.TaggedError("UnknownCommand") {
25
+ [Runtime.errorReported] = false;
26
+ }
27
+ const program = reportUnhandled(processArgv.pipe(Effect.flatMap((argv) => Effect.gen(function* () {
28
+ const unknown = unknownCommandLine(argv, root);
29
+ if (unknown !== undefined) {
30
+ yield* Console.error(unknown);
31
+ return yield* new UnknownCommand();
32
+ }
33
+ return yield* cli(argv);
34
+ })))).pipe(
24
35
  // This *is* the entry point: the one place the whole layer graph is composed and provided.
25
36
  // @effect-diagnostics-next-line strictEffectProvide:off
26
37
  Effect.provide(HeadlessLayer));
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAEzD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;IAC9B,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA;AAEF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;IAChC,OAAO,EAAE,OAAO;CACjB,CAAC,CAAA;AAEF,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CACpC,CAAC,CAAC,IAAI;AACL,2FAA2F;AAC3F,wDAAwD;AACxD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAC9B,CAAA;AAED,gFAAgF;AAChF,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,iBAAiB,GAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAEjH,mGAAmG;AACnG,oEAAoE;AACpE,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAE5D,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;IAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;IAC9B,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA;AAEF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;AAE3D,gGAAgG;AAChG,MAAM,cAAe,SAAQ,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAK;IAC/C,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAA;CAClD;AAED,MAAM,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC9C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC7B,OAAO,KAAK,CAAC,CAAC,IAAI,cAAc,EAAE,CAAA;IACpC,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC,CAAC,CACH,CACF,CAAC,CAAC,IAAI;AACL,2FAA2F;AAC3F,wDAAwD;AACxD,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAC9B,CAAA;AAED,gFAAgF;AAChF,8EAA8E;AAC9E,2EAA2E;AAC3E,8EAA8E;AAC9E,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,iBAAiB,GAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAEjH,mGAAmG;AACnG,oEAAoE;AACpE,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAA"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A command that could not do its job, with the one line that says why and what to run.
3
+ *
4
+ * Fail with it instead of printing and returning: the command boundary (`reportUnhandled`) prints
5
+ * the message once on stderr, and the process exits non-zero so a script can tell.
6
+ *
7
+ * @module
8
+ */
9
+ import { Effect, Stdio } from "effect";
10
+ import { JiraAccess } from "../services/JiraAccess.js";
11
+ declare const CommandFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
12
+ readonly _tag: "CommandFailed";
13
+ } & Readonly<A>;
14
+ export declare class CommandFailed extends CommandFailed_base<{
15
+ readonly message: string;
16
+ }> {
17
+ }
18
+ /** Fails unless Jira is connected, naming the command that connects it. */
19
+ export declare const requireJira: Effect.Effect<import("../services/JiraAccess.js").JiraConnection, CommandFailed, JiraAccess>;
20
+ /** Fails before a prompt when nobody can answer it, saying what to run instead. */
21
+ export declare const requireTerminal: (instead: string) => Effect.Effect<void, CommandFailed, Stdio.Stdio>;
22
+ /** Any failure with a message, as the one line the command prints. */
23
+ export declare const toCommandFailed: (error: {
24
+ readonly message: string;
25
+ }) => CommandFailed;
26
+ export {};
27
+ //# sourceMappingURL=CommandFailed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandFailed.d.ts","sourceRoot":"","sources":["../../../src/cli/CommandFailed.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAQ,MAAM,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;;;;AAGtD,qBAAa,aAAc,SAAQ,mBAAkC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;CAAG;AAErG,2EAA2E;AAC3E,eAAO,MAAM,WAAW,8FAMvB,CAAA;AAED,mFAAmF;AACnF,eAAO,MAAM,eAAe,YAAa,MAAM,oDAO5C,CAAA;AAEH,sEAAsE;AACtE,eAAO,MAAM,eAAe,UAAW;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KAAG,aACvB,CAAA"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * A command that could not do its job, with the one line that says why and what to run.
3
+ *
4
+ * Fail with it instead of printing and returning: the command boundary (`reportUnhandled`) prints
5
+ * the message once on stderr, and the process exits non-zero so a script can tell.
6
+ *
7
+ * @module
8
+ */
9
+ import { Data, Effect, Option, Stdio } from "effect";
10
+ import { JiraAccess } from "../services/JiraAccess.js";
11
+ import { NOT_LOGGED_IN_HINT } from "../utils/hints.js";
12
+ export class CommandFailed extends Data.TaggedError("CommandFailed") {
13
+ }
14
+ /** Fails unless Jira is connected, naming the command that connects it. */
15
+ export const requireJira = JiraAccess.use((access) => access.connection).pipe(Effect.mapError((error) => new CommandFailed({ message: error.message })), Effect.flatMap(Option.match({
16
+ onNone: () => Effect.fail(new CommandFailed({ message: NOT_LOGGED_IN_HINT })),
17
+ onSome: Effect.succeed
18
+ })));
19
+ /** Fails before a prompt when nobody can answer it, saying what to run instead. */
20
+ export const requireTerminal = (instead) => Stdio.Stdio.use((stdio) => stdio.stdinIsTerminal).pipe(Effect.flatMap((terminal) => terminal
21
+ ? Effect.void
22
+ : Effect.fail(new CommandFailed({ message: `This step needs an interactive terminal. ${instead}` }))));
23
+ /** Any failure with a message, as the one line the command prints. */
24
+ export const toCommandFailed = (error) => new CommandFailed({ message: error.message });
25
+ //# sourceMappingURL=CommandFailed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandFailed.js","sourceRoot":"","sources":["../../../src/cli/CommandFailed.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,OAAO,aAAc,SAAQ,IAAI,CAAC,WAAW,CAAC,eAAe,CAA+B;CAAG;AAErG,2EAA2E;AAC3E,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAC3E,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EACzE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAC1B,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC,OAAO;CACvB,CAAC,CAAC,CACJ,CAAA;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,EAAE,CACjD,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CACpD,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,QAAQ;IACN,CAAC,CAAC,MAAM,CAAC,IAAI;IACb,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,4CAA4C,OAAO,EAAE,EAAE,CAAC,CAAC,CACvG,CACF,CAAA;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAmC,EAAiB,EAAE,CACpF,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA"}
@@ -1,8 +1,10 @@
1
1
  import { JiraAuth } from "@knpkv/jira-cli/JiraAuth";
2
- import { Effect } from "effect";
2
+ import { Effect, Option } from "effect";
3
3
  import { Command, Prompt } from "effect/cli";
4
4
  import * as HttpClient from "effect/http/HttpClient";
5
5
  import { ClockifyAuth } from "../services/ClockifyAuth.js";
6
+ import { JiraAccess } from "../services/JiraAccess.js";
7
+ import { CommandFailed } from "./CommandFailed.js";
6
8
  declare const InvalidClockifyApiKeyError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
7
9
  readonly _tag: "InvalidClockifyApiKeyError";
8
10
  } & Readonly<A>;
@@ -38,8 +40,26 @@ export declare const loadClockifyAccount: (client: import("@knpkv/clockify-api-c
38
40
  readonly name: string;
39
41
  }[];
40
42
  }, ClockifyRequestError | InvalidClockifyApiKeyError, never>;
41
- export declare const clockifySetup: Command.Command<"setup", {}, {}, ClockifyRequestError | InvalidClockifyApiKeyError | import("effect/Terminal").QuitError, ClockifyAuth | HttpClient.HttpClient | Prompt.Environment>;
43
+ /**
44
+ * Asks for a site, email and API token, checks them against Jira and saves them. The token is read
45
+ * without echo and never printed; a failed check names its cause and saves nothing.
46
+ */
47
+ export declare const connectJiraWithToken: (given: {
48
+ readonly site: Option.Option<string>;
49
+ readonly email: Option.Option<string>;
50
+ }) => Effect.Effect<import("../services/JiraAccess.js").StoredToken, CommandFailed, JiraAccess | import("effect/Stdio").Stdio | Prompt.Environment>;
51
+ /**
52
+ * Asks for a Clockify API key (unless given), checks it, picks a workspace and saves it. A key that
53
+ * Clockify refuses, a failed request and an account with no workspace each fail with their own line.
54
+ */
55
+ export declare const connectClockify: (given: Option.Option<string>, workspaceName?: Option.Option<string>) => Effect.Effect<undefined, CommandFailed, ClockifyAuth | HttpClient.HttpClient | import("effect/Stdio").Stdio | Prompt.Environment>;
56
+ export declare const clockifySetup: Command.Command<"setup", {
57
+ readonly apiKey: Option.Option<string>;
58
+ readonly workspace: Option.Option<string>;
59
+ }, {}, CommandFailed, ClockifyAuth | HttpClient.HttpClient | import("effect/Stdio").Stdio | Prompt.Environment>;
60
+ /** Both systems' status lines, Jira first. */
61
+ export declare const printAuthStatus: Effect.Effect<void, never, ClockifyAuth | HttpClient.HttpClient | JiraAccess>;
42
62
  /** Top-level `auth` command with jira/clockify/status subcommands. */
43
- export declare const auth: Command.Command<"auth", {} | {}, {}, ClockifyRequestError | InvalidClockifyApiKeyError | import("effect/Terminal").QuitError | (import("@knpkv/atlassian-common").FileSystemError | import("@knpkv/atlassian-common").HomeDirectoryError | import("effect/PlatformError").PlatformError), import("effect/process/ChildProcessSpawner").ChildProcessSpawner | ClockifyAuth | HttpClient.HttpClient | JiraAuth | Prompt.Environment>;
63
+ export declare const auth: Command.Command<"auth", {} | {}, {}, CommandFailed, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | ClockifyAuth | HttpClient.HttpClient | JiraAccess | JiraAuth | import("effect/Stdio").Stdio | Prompt.Environment>;
44
64
  export {};
45
65
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/auth.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAiB,MAAM,EAAuC,MAAM,QAAQ,CAAA;AACnF,OAAO,EAAE,OAAO,EAAmB,MAAM,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAA;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;;;;AAE1D,qBAAa,0BAA2B,SAAQ,gCAA+C,EAAE,CAAC;IAChG,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,0BAAyC;IACjF,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,qBAAqB,CAAA;IAC3D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAG7B;CACF;AAsBD;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;4DAoB/B,CAAA;AAmHD,eAAO,MAAM,aAAa,sLA8DzB,CAAA;AAgED,sEAAsE;AACtE,eAAO,MAAM,IAAI,oaAEhB,CAAA"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/auth.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAiB,MAAM,EAAE,MAAM,EAA+B,MAAM,QAAQ,CAAA;AACnF,OAAO,EAAE,OAAO,EAAmB,MAAM,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAA;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAEtD,OAAO,EAAE,aAAa,EAAoC,MAAM,oBAAoB,CAAA;;;;AAEpF,qBAAa,0BAA2B,SAAQ,gCAA+C,EAAE,CAAC;IAChG,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,0BAAyC;IACjF,QAAQ,CAAC,SAAS,EAAE,eAAe,GAAG,qBAAqB,CAAA;IAC3D,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAG7B;CACF;AAsBD;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;4DAoB/B,CAAA;AAQD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,UAAW;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;CACtC,kJAoBE,CAAA;AA2IH;;;GAGG;AACH,eAAO,MAAM,eAAe,UACnB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,kBACb,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,sIAmDnC,CAAA;AAEH,eAAO,MAAM,aAAa;;;+GAayC,CAAA;AAiCnE,8CAA8C;AAC9C,eAAO,MAAM,eAAe,+EAG1B,CAAA;AAMF,sEAAsE;AACtE,eAAO,MAAM,IAAI,0OAGhB,CAAA"}
@@ -10,6 +10,9 @@ import { Command, Flag as Options, Prompt } from "effect/cli";
10
10
  import * as HttpClient from "effect/http/HttpClient";
11
11
  import * as ChildProcess from "effect/process/ChildProcess";
12
12
  import { ClockifyAuth } from "../services/ClockifyAuth.js";
13
+ import { JiraAccess } from "../services/JiraAccess.js";
14
+ import { CONNECT_JIRA_COMMAND } from "../utils/hints.js";
15
+ import { CommandFailed, requireTerminal, toCommandFailed } from "./CommandFailed.js";
13
16
  export class InvalidClockifyApiKeyError extends Data.TaggedError("InvalidClockifyApiKeyError") {
14
17
  get message() {
15
18
  return "Invalid API key — check the value and try again";
@@ -53,11 +56,38 @@ export const loadClockifyAccount = Effect.fn("ClockifyAuth.loadClockifyAccount")
53
56
  return { user, workspaces };
54
57
  });
55
58
  // ---------------------------------------------------------------------------
56
- // Jira OAuth
59
+ // Jira
57
60
  // ---------------------------------------------------------------------------
61
+ const apiTokenPage = "https://id.atlassian.com/manage-profile/security/api-tokens";
62
+ /**
63
+ * Asks for a site, email and API token, checks them against Jira and saves them. The token is read
64
+ * without echo and never printed; a failed check names its cause and saves nothing.
65
+ */
66
+ export const connectJiraWithToken = (given) => Effect.gen(function* () {
67
+ const access = yield* JiraAccess;
68
+ yield* requireTerminal(`Run ${CONNECT_JIRA_COMMAND} in a terminal to enter the API token.`);
69
+ yield* Console.log(`Create an API token at ${apiTokenPage}, then paste it here.`);
70
+ const site = Option.isSome(given.site)
71
+ ? given.site.value
72
+ : yield* Prompt.String({ message: "Jira address (your-team.atlassian.net):" });
73
+ const email = Option.isSome(given.email)
74
+ ? given.email.value
75
+ : yield* Prompt.String({ message: "Email you sign in to Atlassian with:" });
76
+ const apiToken = yield* Prompt.Password({ message: "API token:" });
77
+ yield* Console.log("Checking with Jira...");
78
+ const verified = yield* access.verifyToken({ site, email, apiToken });
79
+ yield* access.saveToken(verified);
80
+ yield* Console.log(`Jira connected: ${verified.displayName} on ${verified.siteUrl}.`);
81
+ return verified;
82
+ }).pipe(Effect.catchTag("QuitError", () => Effect.fail(new CommandFailed({ message: "Jira was not connected." }))), Effect.mapError(toCommandFailed));
83
+ const jiraToken = Command.make("token", {
84
+ site: Options.String("site").pipe(Options.withDescription("Your Jira address, such as your-team.atlassian.net"), Options.optional),
85
+ email: Options.String("email").pipe(Options.withDescription("The email you sign in to Atlassian with"), Options.optional)
86
+ }, (given) => Effect.asVoid(connectJiraWithToken(given))).pipe(Command.withDescription("Connect Jira with an API token (recommended)"));
58
87
  const jiraCreate = Command.make("create", {}, () => Effect.gen(function* () {
59
88
  yield* Console.log(`
60
- Create OAuth app in Atlassian Developer Console:
89
+ Advanced: connect Jira through your own Atlassian OAuth app.
90
+ For most people ${CONNECT_JIRA_COMMAND} is simpler.
61
91
 
62
92
  1. Browser will open to create a new OAuth 2.0 (3LO) app
63
93
  2. Enter app name (e.g., "jcf")
@@ -74,12 +104,15 @@ Create OAuth app in Atlassian Developer Console:
74
104
  const url = "https://developer.atlassian.com/console/myapps/create-3lo-app/";
75
105
  const exitCode = (command) => Effect.scoped(command.pipe(Effect.flatMap((handle) => handle.exitCode)));
76
106
  yield* exitCode(ChildProcess.make("open", [url])).pipe(Effect.catch(() => exitCode(ChildProcess.make("xdg-open", [url]))), Effect.catch(() => exitCode(ChildProcess.make("rundll32.exe", ["url.dll,FileProtocolHandler", url]))), Effect.asVoid, Effect.catch(() => Effect.void));
77
- }));
107
+ })).pipe(Command.withDescription("Advanced: open the Atlassian console to create your own OAuth app"));
78
108
  const jiraConfigure = Command.make("configure", {
79
109
  clientId: Options.String("client-id").pipe(Options.withDescription("OAuth client ID"), Options.optional),
80
110
  clientSecret: Options.String("client-secret").pipe(Options.withDescription("OAuth client secret"), Options.optional)
81
111
  }, ({ clientId, clientSecret }) => Effect.gen(function* () {
82
112
  const auth = yield* JiraAuth;
113
+ if (Option.isNone(clientId) || Option.isNone(clientSecret)) {
114
+ yield* requireTerminal("Pass --client-id and --client-secret.");
115
+ }
83
116
  const id = Option.isSome(clientId)
84
117
  ? clientId.value
85
118
  : yield* Prompt.String({ message: "Enter OAuth client ID:" });
@@ -88,126 +121,114 @@ const jiraConfigure = Command.make("configure", {
88
121
  : yield* Prompt.String({ message: "Enter OAuth client secret:" });
89
122
  yield* auth.configure({ clientId: id, clientSecret: secret });
90
123
  yield* Console.log("OAuth configured. Run: jcf auth jira login");
91
- }));
124
+ }).pipe(Effect.mapError(toCommandFailed))).pipe(Command.withDescription("Advanced: store your OAuth app's client ID and secret"));
92
125
  const jiraLogin = Command.make("login", { site: Options.String("site").pipe(Options.withDescription("Jira site URL"), Options.optional) }, ({ site }) => Effect.gen(function* () {
93
126
  const auth = yield* JiraAuth;
127
+ if (!(yield* auth.isConfigured())) {
128
+ return yield* new CommandFailed({
129
+ message: `No OAuth app is configured. Run ${CONNECT_JIRA_COMMAND} to use an API token instead, ` +
130
+ "or jcf auth jira configure to set up your own OAuth app."
131
+ });
132
+ }
94
133
  const result = yield* auth.login(Option.isSome(site) ? { siteUrl: site.value } : undefined);
95
134
  if (Array.isArray(result) && result.length > 0) {
96
135
  yield* Console.log("\nRe-run with --site <url> to select a specific site.");
97
136
  }
98
- }).pipe(Effect.catch((e) => Console.log(`Error: ${Predicate.hasProperty(e, "message") ? String(e.message) : String(e)}`))));
137
+ }).pipe(Effect.mapError(toCommandFailed))).pipe(Command.withDescription("Advanced: sign in through your OAuth app in the browser"));
99
138
  const jiraLogout = Command.make("logout", {}, () => Effect.gen(function* () {
139
+ const access = yield* JiraAccess;
100
140
  const auth = yield* JiraAuth;
101
- yield* auth.logout();
102
- yield* Console.log("Logged out from Jira");
103
- }).pipe(Effect.catch((e) => Console.log(`Error: ${Predicate.hasProperty(e, "message") ? String(e.message) : String(e)}`))));
104
- const jiraStatus = Command.make("status", {}, () => Effect.gen(function* () {
105
- const auth = yield* JiraAuth;
106
- const user = yield* auth.getCurrentUser();
107
- if (user) {
108
- yield* Console.log(`Jira: ✓ logged in as ${user.name} (${user.email})`);
109
- }
110
- else {
111
- yield* Console.log("Jira: ✗ not logged in");
112
- yield* Console.log(" Run: jcf auth jira create → configure → login");
113
- }
114
- }).pipe(Effect.catch(() => Console.log("Jira: ✗ not configured"))));
115
- const authJira = Command.make("jira", {}, () => Console.log("Jira auth: create, configure, login, logout, status"))
116
- .pipe(Command.withSubcommands([jiraCreate, jiraConfigure, jiraLogin, jiraLogout, jiraStatus]));
141
+ const removedToken = yield* access.removeToken;
142
+ const oauth = yield* auth.isLoggedIn();
143
+ if (oauth)
144
+ yield* auth.logout();
145
+ yield* Console.log(removedToken || oauth ? "Jira disconnected." : "Jira was not connected.");
146
+ }).pipe(Effect.mapError(toCommandFailed))).pipe(Command.withDescription("Disconnect Jira: remove the API token and sign out of OAuth"));
147
+ /** One line saying how Jira is connected, or what to run when it is not. */
148
+ const jiraStatusLine = JiraAccess.use((access) => access.connection).pipe(Effect.map(Option.match({
149
+ onNone: () => `Jira: not connected. Run ${CONNECT_JIRA_COMMAND}`,
150
+ onSome: (connection) => `Jira: connected as ${connection.displayName === "" ? "unknown user" : connection.displayName} on ` +
151
+ `${connection.siteUrl} (${connection.method === "api-token" ? "API token" : "OAuth app"})`
152
+ })), Effect.catch((error) => Effect.succeed(`Jira: ${error.message}`)));
153
+ const jiraStatus = Command.make("status", {}, () => Effect.flatMap(jiraStatusLine, Console.log)).pipe(Command.withDescription("Show whether Jira is connected, and how"));
154
+ const authJira = Command.make("jira", {}, () => Console.log(`Connect Jira: ${CONNECT_JIRA_COMMAND}. Run jcf auth jira --help for every option.`)).pipe(Command.withDescription("Connect Jira with an API token, or with your own OAuth app (advanced)"), Command.withSubcommands([jiraToken, jiraStatus, jiraLogout, jiraCreate, jiraConfigure, jiraLogin]));
117
155
  // ---------------------------------------------------------------------------
118
156
  // Clockify API key
119
157
  // ---------------------------------------------------------------------------
120
- export const clockifySetup = Command.make("setup", {}, () => Effect.gen(function* () {
158
+ const clockifyBaseUrl = "https://api.clockify.me/api";
159
+ /**
160
+ * Asks for a Clockify API key (unless given), checks it, picks a workspace and saves it. A key that
161
+ * Clockify refuses, a failed request and an account with no workspace each fail with their own line.
162
+ */
163
+ export const connectClockify = (given, workspaceName = Option.none()) => Effect.gen(function* () {
121
164
  const auth = yield* ClockifyAuth;
122
- yield* Console.log("Clockify API Key Setup");
123
- yield* Console.log("Get your API key from: https://app.clockify.me/manage-api-keys");
124
- yield* Console.log("");
125
- const apiKey = yield* Prompt.String({ message: "Enter API key:" });
126
- if (!apiKey) {
127
- yield* Console.log("No API key provided, aborting.");
128
- return;
165
+ if (Option.isNone(given)) {
166
+ yield* requireTerminal("Pass the key with --api-key, or run jcf auth clockify setup in a terminal.");
167
+ yield* Console.log("Get your API key from https://app.clockify.me/manage-api-keys");
129
168
  }
130
- yield* Console.log("Validating...");
169
+ const apiKey = Option.isSome(given)
170
+ ? given.value
171
+ : Redacted.value(yield* Prompt.Password({ message: "Clockify API key:" }));
172
+ if (apiKey.trim() === "") {
173
+ return yield* new CommandFailed({ message: "No API key given; Clockify was not connected." });
174
+ }
175
+ yield* Console.log("Checking with Clockify...");
131
176
  const httpClient = yield* HttpClient.HttpClient;
132
- const client = makeClockifyApi(httpClient, {
133
- apiKey: Redacted.make(apiKey),
134
- baseUrl: "https://api.clockify.me/api"
135
- });
177
+ const client = makeClockifyApi(httpClient, { apiKey: Redacted.make(apiKey), baseUrl: clockifyBaseUrl });
136
178
  const { user, workspaces } = yield* loadClockifyAccount(client);
137
- yield* Console.log(`Authenticated as: ${user.name} (${user.email})`);
138
- if (workspaces.length === 0) {
139
- yield* Console.log("No workspaces found.");
140
- return;
141
- }
142
- yield* Console.log("");
143
- yield* Console.log("Workspaces:");
144
- for (let i = 0; i < workspaces.length; i++) {
145
- const workspace = workspaces[i];
146
- if (workspace !== undefined) {
147
- yield* Console.log(` ${i + 1}. ${workspace.name}`);
148
- }
179
+ const [first] = workspaces;
180
+ if (first === undefined) {
181
+ return yield* new CommandFailed({
182
+ message: "This Clockify account has no workspace. Create one at https://app.clockify.me, then run this again."
183
+ });
149
184
  }
150
- let selectedIdx = 0;
151
- if (workspaces.length > 1) {
152
- const choice = yield* Prompt.String({ message: `Select workspace (1-${workspaces.length}):` });
153
- selectedIdx = Math.max(0, Math.min(workspaces.length - 1, parseInt(choice, 10) - 1));
185
+ const names = workspaces.map((candidate) => candidate.name).join(", ");
186
+ const workspace = Option.isSome(workspaceName)
187
+ ? workspaces.find((candidate) => candidate.name === workspaceName.value || candidate.id === workspaceName.value)
188
+ : workspaces.length === 1
189
+ ? first
190
+ : yield* requireTerminal(`This key can use ${workspaces.length} workspaces; pass --workspace with one of: ${names}.`)
191
+ .pipe(Effect.andThen(Prompt.Select({
192
+ message: "Workspace:",
193
+ choices: workspaces.map((candidate) => ({ title: candidate.name, value: candidate }))
194
+ })));
195
+ if (workspace === undefined) {
196
+ return yield* new CommandFailed({
197
+ message: `No workspace named "${Option.getOrElse(workspaceName, () => "")}" for this key. Its workspaces: ${names}.`
198
+ });
154
199
  }
155
- const workspace = workspaces[selectedIdx];
156
- yield* Console.log(`Selected: ${workspace.name}`);
157
- yield* auth.save({
158
- apiKey,
159
- workspaceId: workspace.id,
160
- userId: user.id,
161
- baseUrl: "https://api.clockify.me/api"
162
- });
163
- yield* Console.log("");
164
- yield* Console.log("Clockify configured! Saved to ~/.jcf/clockify.json");
165
- }));
166
- const clockifyStatus = Command.make("status", {}, () => Effect.gen(function* () {
200
+ yield* auth.save({ apiKey, workspaceId: workspace.id, userId: user.id, baseUrl: clockifyBaseUrl });
201
+ yield* Console.log(`Clockify connected: ${user.name ?? user.email ?? user.id}, workspace ${workspace.name}.`);
202
+ }).pipe(Effect.catchTag("QuitError", () => Effect.fail(new CommandFailed({ message: "Clockify was not connected." }))), Effect.mapError(toCommandFailed));
203
+ export const clockifySetup = Command.make("setup", {
204
+ apiKey: Options.String("api-key").pipe(Options.withDescription("Clockify API key, for scripts; without it the key is asked for and not echoed"), Options.optional),
205
+ workspace: Options.String("workspace").pipe(Options.withDescription("Workspace name or id, when the key can use more than one"), Options.optional)
206
+ }, ({ apiKey, workspace }) => connectClockify(apiKey, workspace)).pipe(Command.withDescription("Connect Clockify with an API key"));
207
+ /** One line saying which Clockify workspace is connected, or what to run when none is. */
208
+ const clockifyStatusLine = Effect.gen(function* () {
167
209
  const auth = yield* ClockifyAuth;
168
- const configured = yield* auth.isConfigured;
169
- if (!configured) {
170
- yield* Console.log("Clockify: ✗ not configured");
171
- yield* Console.log(" Run: jcf auth clockify setup");
172
- return;
210
+ if (!(yield* auth.isConfigured))
211
+ return "Clockify: not connected. Run jcf auth clockify setup";
212
+ const config = yield* auth.getConfig;
213
+ const httpClient = yield* HttpClient.HttpClient;
214
+ const account = yield* Effect.result(loadClockifyAccount(makeClockifyApi(httpClient, config)));
215
+ if (account._tag === "Failure") {
216
+ return `Clockify: connected, workspace ${config.workspaceId} (could not read its name: ${account.failure.message})`;
173
217
  }
174
- const config = yield* auth.getConfig.pipe(Effect.catch((e) => Console.log(`Clockify: error — ${e.message}`).pipe(Effect.flatMap(() => Effect.fail(e)))));
175
- yield* Console.log("Clockify: ✓ authenticated");
176
- yield* Console.log(` Workspace: ${config.workspaceId}`);
177
- yield* Console.log(` User: ${config.userId}`);
178
- }).pipe(Effect.catch(() => Effect.void)));
179
- const authClockify = Command.make("clockify", {}, () => Console.log("Clockify auth: setup, status")).pipe(Command.withSubcommands([clockifySetup, clockifyStatus]));
218
+ const name = account.success.workspaces.find((workspace) => workspace.id === config.workspaceId)?.name;
219
+ return `Clockify: connected, workspace ${name ?? `${config.workspaceId}, which this key can no longer see`}`;
220
+ }).pipe(Effect.catch((error) => Effect.succeed(`Clockify: ${error.message}. Run jcf auth clockify setup`)));
221
+ const clockifyStatus = Command.make("status", {}, () => Effect.flatMap(clockifyStatusLine, Console.log)).pipe(Command.withDescription("Show whether Clockify is connected, and to which workspace"));
222
+ const authClockify = Command.make("clockify", {}, () => Console.log("Connect Clockify: jcf auth clockify setup. Run jcf auth clockify --help for every option.")).pipe(Command.withDescription("Connect Clockify with an API key"), Command.withSubcommands([clockifySetup, clockifyStatus]));
180
223
  // ---------------------------------------------------------------------------
181
224
  // Combined status
182
225
  // ---------------------------------------------------------------------------
183
- const authStatus = Command.make("status", {}, () => Effect.gen(function* () {
184
- yield* Console.log("=== Auth Status ===");
185
- yield* Console.log("");
186
- // Jira
187
- const jira = yield* JiraAuth;
188
- const jiraUser = yield* jira.getCurrentUser().pipe(Effect.catch(() => Effect.succeed(null)));
189
- if (jiraUser) {
190
- yield* Console.log(`Jira: ✓ ${jiraUser.name} (${jiraUser.email})`);
191
- }
192
- else {
193
- yield* Console.log("Jira: ✗ not logged in");
194
- }
195
- // Clockify
196
- const clockifyAuth = yield* ClockifyAuth;
197
- const clockifyOk = yield* clockifyAuth.isConfigured;
198
- if (clockifyOk) {
199
- const cfg = yield* clockifyAuth.getConfig.pipe(Effect.catch(() => Effect.succeed(null)));
200
- if (cfg) {
201
- yield* Console.log(`Clockify: ✓ workspace ${cfg.workspaceId}`);
202
- }
203
- else {
204
- yield* Console.log("Clockify: ✗ config corrupt");
205
- }
206
- }
207
- else {
208
- yield* Console.log("Clockify: ✗ not configured");
209
- }
210
- }));
226
+ /** Both systems' status lines, Jira first. */
227
+ export const printAuthStatus = Effect.gen(function* () {
228
+ yield* Console.log(yield* jiraStatusLine);
229
+ yield* Console.log(yield* clockifyStatusLine);
230
+ });
231
+ const authStatus = Command.make("status", {}, () => printAuthStatus).pipe(Command.withDescription("Show whether Jira and Clockify are connected"));
211
232
  /** Top-level `auth` command with jira/clockify/status subcommands. */
212
- export const auth = Command.make("auth", {}, () => Console.log("Auth: jira, clockify, status")).pipe(Command.withSubcommands([authJira, authClockify, authStatus]));
233
+ export const auth = Command.make("auth", {}, () => printAuthStatus).pipe(Command.withDescription("Connect Jira and Clockify, and see which are connected"), Command.withSubcommands([authJira, authClockify, authStatus]));
213
234
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/auth.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { ClockifyApiClient } from "@knpkv/clockify-api-client";
7
7
  import { Command, Prompt } from "effect/cli";
8
8
  import { ClockifyAuth } from "../services/ClockifyAuth.js";
9
9
  import { ConfigService } from "../services/ConfigService.js";
10
+ import { CommandFailed } from "./CommandFailed.js";
10
11
  /** Top-level `config` command with show/set/unset/reset subcommands. */
11
- export declare const config: Command.Command<"config", {} | {}, {}, import("effect/Terminal").QuitError, ClockifyApiClient | ClockifyAuth | ConfigService | Prompt.Environment>;
12
+ export declare const config: Command.Command<"config", {} | {}, {}, CommandFailed | import("effect/Terminal").QuitError, ClockifyApiClient | ClockifyAuth | ConfigService | Prompt.Environment>;
12
13
  //# sourceMappingURL=config.d.ts.map