@knpkv/jira-cli 1.4.0 → 1.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.
Files changed (37) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +4 -1
  3. package/dist/JiraAuth.d.ts +26 -8
  4. package/dist/JiraAuth.d.ts.map +1 -1
  5. package/dist/JiraAuth.js +12 -303
  6. package/dist/JiraAuth.js.map +1 -1
  7. package/dist/commands/auth.d.ts +1 -12
  8. package/dist/commands/auth.d.ts.map +1 -1
  9. package/dist/commands/auth.js +4 -128
  10. package/dist/commands/auth.js.map +1 -1
  11. package/dist/commands/layers.d.ts +1 -1
  12. package/dist/commands/layers.d.ts.map +1 -1
  13. package/package.json +4 -4
  14. package/skills/jira/SKILL.md +1 -0
  15. package/src/JiraAuth.ts +28 -468
  16. package/src/commands/auth.ts +4 -167
  17. package/test/JiraAuth.test.ts +79 -0
  18. package/test/authCommand.test.ts +54 -0
  19. package/vitest.config.integration.ts +4 -1
  20. package/vitest.config.ts +4 -1
  21. package/dist/internal/NodeLayers.d.ts +0 -7
  22. package/dist/internal/NodeLayers.d.ts.map +0 -1
  23. package/dist/internal/NodeLayers.js +0 -15
  24. package/dist/internal/NodeLayers.js.map +0 -1
  25. package/dist/internal/oauthServer.d.ts +0 -72
  26. package/dist/internal/oauthServer.d.ts.map +0 -1
  27. package/dist/internal/oauthServer.js +0 -97
  28. package/dist/internal/oauthServer.js.map +0 -1
  29. package/dist/internal/openBrowser.d.ts +0 -10
  30. package/dist/internal/openBrowser.d.ts.map +0 -1
  31. package/dist/internal/openBrowser.js +0 -17
  32. package/dist/internal/openBrowser.js.map +0 -1
  33. package/src/internal/NodeLayers.ts +0 -17
  34. package/src/internal/oauthServer.ts +0 -187
  35. package/src/internal/openBrowser.ts +0 -31
  36. package/test/JiraAuthRefresh.test.ts +0 -269
  37. package/test/oauthServer.test.ts +0 -172
package/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # @knpkv/jira-cli
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#472](https://github.com/knpkv/npm/pull/472) [`d12c336`](https://github.com/knpkv/npm/commit/d12c3364e56abb7cfd32aa693c5406788a67e3f5) Thanks [@konopkov](https://github.com/konopkov)! - One shared `auth` command group for jira and confluence: `makeAuthCommand(service, descriptor, options)` in `@knpkv/atlassian-common/cli-auth`. Each CLI exports one descriptor (`jiraCliDescriptor`, `confluenceCliDescriptor`: command name, product name, login scopes) that feeds both its auth and its `auth` commands.
8
+
9
+ - `jira auth create` lists every scope `jira auth login` requests. It previously listed three of five (missing `write:jira-work` and `manage:jira-project`), so an app set up from its instructions could not log in.
10
+ - `jira auth manage` is new: it opens the developer console with the scope and callback checklist.
11
+ - `confluence auth profiles`, `auth use <profile>` and `auth remove <profile>` are new; the docs already described them.
12
+ - `confluence auth status` prints the active profile, account, site and profile ID.
13
+ - `auth create` and `auth manage` print the URL first and exit non-zero when no browser opens (jira's `create` used to ignore that).
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [[`d12c336`](https://github.com/knpkv/npm/commit/d12c3364e56abb7cfd32aa693c5406788a67e3f5)]:
18
+ - @knpkv/atlassian-common@1.7.0
19
+ - @knpkv/agent-skills@0.3.3
20
+
21
+ ## 1.4.1
22
+
23
+ ### Patch Changes
24
+
25
+ - [#462](https://github.com/knpkv/npm/pull/462) [`a5490aa`](https://github.com/knpkv/npm/commit/a5490aad738507f2a3a7d7cb4babf3545d287087) Thanks [@konopkov](https://github.com/konopkov)! - `@knpkv/atlassian-common/cli-auth` now holds the browser login and rotating refresh-token flow that `jira` and `confluence` each carried a copy of; both CLIs bind it with `makeAtlassianCliAuth`. Login no longer gives up when no browser opens — it says so on stderr and keeps waiting, since the URL is already printed (`jira` used to treat a launcher that ran but failed as success; `confluence` aborted the login). `jira` login also reports the provider's error code when its description is empty, and reports callback-server failures as `OAuthError`.
26
+
27
+ Jira Clockify's timeout documentation now points to the shared refresh implementation.
28
+
29
+ - Updated dependencies [[`a5490aa`](https://github.com/knpkv/npm/commit/a5490aad738507f2a3a7d7cb4babf3545d287087)]:
30
+ - @knpkv/atlassian-common@1.6.0
31
+
3
32
  ## 1.4.0
4
33
 
5
34
  ### Minor Changes
package/README.md CHANGED
@@ -22,7 +22,9 @@ cd packages/jira-cli && pnpm link --global
22
22
  jira auth create
23
23
  ```
24
24
 
25
- Opens Atlassian Developer Console. Create a new OAuth 2.0 (3LO) app with:
25
+ Prints the URL and opens the Atlassian Developer Console (the command fails if no browser
26
+ opens; finish from the printed URL). Create a new OAuth 2.0 (3LO) app with the scopes it
27
+ prints, which are exactly the ones `jira auth login` requests:
26
28
 
27
29
  **Permissions:**
28
30
 
@@ -252,6 +254,7 @@ set, including surplus copies of a URL that _is_ desired. Other categories are n
252
254
 
253
255
  ```bash
254
256
  jira auth create # Open Atlassian console to create OAuth app
257
+ jira auth manage # Open the console to edit the app's scopes
255
258
  jira auth configure # Set client ID and secret
256
259
  jira auth login # Authenticate via OAuth
257
260
  jira auth profiles # List stored accounts/sites
@@ -1,13 +1,29 @@
1
- import { OAuthError } from "@knpkv/atlassian-common/auth";
2
- import { type AuthProfile, type FileSystemError, type HomeDirectoryError, type OAuthConfig, type OAuthUser } from "@knpkv/atlassian-common/config";
1
+ /**
2
+ * OAuth2 authentication service for Jira CLI with token refresh and concurrency locking.
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **Service pattern**: {@link JiraAuth} is a `Context.Tag` whose layer requires `HttpClient`,
7
+ * `ChildProcessSpawner` and `Crypto`. The flow — refresh lock, rotating-token persistence,
8
+ * browser login, profiles — is `@knpkv/atlassian-common/cli-auth`'s, bound to the
9
+ * `"jira-cli"` storage namespace, Jira's scopes and Jira's names.
10
+ *
11
+ * **Common tasks**
12
+ *
13
+ * - Get a valid access token: `auth.getAccessToken()` (auto-refreshes if expired)
14
+ * - Full login flow: `auth.login()`
15
+ * - Check auth state: `auth.isLoggedIn()`
16
+ *
17
+ * @module
18
+ */
19
+ import type { OAuthError } from "@knpkv/atlassian-common/auth";
20
+ import { type AtlassianCliDescriptor } from "@knpkv/atlassian-common/cli-auth";
21
+ import type { AuthProfile, FileSystemError, HomeDirectoryError, OAuthConfig, OAuthUser } from "@knpkv/atlassian-common/config";
3
22
  import * as Context from "effect/Context";
4
- import * as Crypto from "effect/Crypto";
5
- import * as Effect from "effect/Effect";
6
- import * as HttpClient from "effect/http/HttpClient";
23
+ import type * as Effect from "effect/Effect";
7
24
  import * as Layer from "effect/Layer";
8
25
  import type * as PlatformError from "effect/PlatformError";
9
- import { ChildProcessSpawner } from "effect/process";
10
- import * as Redacted from "effect/Redacted";
26
+ import type * as Redacted from "effect/Redacted";
11
27
  import type { AuthMissingError } from "./JiraCliError.js";
12
28
  /**
13
29
  * Options for the login method.
@@ -83,11 +99,13 @@ declare const JiraAuth_base: Context.ServiceClass<JiraAuth, "@knpkv/jira-cli/Jir
83
99
  */
84
100
  export declare class JiraAuth extends JiraAuth_base {
85
101
  }
102
+ /** Who the Jira CLI is: shared by its auth and its `auth` commands, so both name the same scopes. */
103
+ export declare const jiraCliDescriptor: AtlassianCliDescriptor;
86
104
  /**
87
105
  * Layer for JiraAuth service.
88
106
  *
89
107
  * @category Layers
90
108
  */
91
- export declare const layer: Layer.Layer<JiraAuth, never, ChildProcessSpawner.ChildProcessSpawner | Crypto.Crypto | HttpClient.HttpClient>;
109
+ export declare const layer: Layer.Layer<JiraAuth, never, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/Crypto").Crypto | import("effect/http/HttpClient").HttpClient>;
92
110
  export {};
93
111
  //# sourceMappingURL=JiraAuth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"JiraAuth.d.ts","sourceRoot":"","sources":["../src/JiraAuth.ts"],"names":[],"mappings":"AAuBA,OAAO,EASL,UAAU,EAGX,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,WAAW,EAGhB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EAOvB,KAAK,WAAW,EAEhB,KAAK,SAAS,EAIf,MAAM,gCAAgC,CAAA;AAGvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAK3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AA6CzD;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,QAAQ,CAAC,SAAS,EAAE,CAClB,MAAM,EAAE,WAAW,KAChB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAA;IAC5F,mCAAmC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,CACxC,OAAO,EACP,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CACnE,CAAA;IACD,+EAA+E;IAC/E,QAAQ,CAAC,KAAK,EAAE,CACd,OAAO,CAAC,EAAE,YAAY,KACnB,MAAM,CAAC,MAAM,CAChB,aAAa,CAAC,cAAc,CAAC,GAAG,IAAI,EACpC,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CAChF,CAAA;IACD,mCAAmC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,MAAM,CAAC,MAAM,CAClC,IAAI,EACJ,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CAChF,CAAA;IACD,6CAA6C;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,CAC1C,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EACzB,gBAAgB,GAAG,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CACnG,CAAA;IACD,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CACtC,MAAM,EACN,gBAAgB,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CACtF,CAAA;IACD,qCAAqC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CACtC,MAAM,EACN,gBAAgB,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CACtF,CAAA;IACD,8CAA8C;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,CAAC,MAAM,CAC1C,SAAS,GAAG,IAAI,EAChB,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CACnE,CAAA;IACD,8BAA8B;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,MAAM,CAAC,MAAM,CAC5C,WAAW,GAAG,IAAI,EAClB,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CACnE,CAAA;IACD,gCAAgC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,CACxC,aAAa,CAAC,WAAW,CAAC,EAC1B,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CACnE,CAAA;IACD,2EAA2E;IAC3E,QAAQ,CAAC,aAAa,EAAE,CACtB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,EAAE,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAA;IAC1G,2EAA2E;IAC3E,QAAQ,CAAC,aAAa,EAAE,CACtB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,EAAE,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAA;IAC1G,iCAAiC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,CAAC,CAAA;CACtH;;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,QAAS,SAAQ,aAGC;CAAG;AAyYlC;;;;GAIG;AACH,eAAO,MAAM,KAAK,+GAA+B,CAAA"}
1
+ {"version":3,"file":"JiraAuth.d.ts","sourceRoot":"","sources":["../src/JiraAuth.ts"],"names":[],"mappings":"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"}
package/dist/JiraAuth.js CHANGED
@@ -1,43 +1,6 @@
1
- /**
2
- * OAuth2 authentication service for Jira CLI with token refresh and concurrency locking.
3
- *
4
- * **Mental model**
5
- *
6
- * - **Service pattern**: {@link JiraAuth} is a `Context.Tag` whose layer requires `HttpClient`
7
- * and `ChildProcessSpawner`. All token storage operations are pre-bound to
8
- * `@knpkv/atlassian-common/config` with a `"jira-cli"` tool name.
9
- * - **Refresh lock**: A `Ref<Option<Deferred>>` prevents concurrent token refreshes — the
10
- * first caller refreshes, others await the same Deferred.
11
- * - **Browser-based login**: {@link JiraAuthService.login} starts a local callback server,
12
- * opens the browser, and awaits the OAuth code with a 5-minute timeout.
13
- *
14
- * **Common tasks**
15
- *
16
- * - Get a valid access token: `auth.getAccessToken()` (auto-refreshes if expired)
17
- * - Full login flow: `auth.login()`
18
- * - Check auth state: `auth.isLoggedIn()`
19
- *
20
- * @module
21
- */
22
- import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
23
- import * as NodePath from "@effect/platform-node/NodePath";
24
- import { buildAuthUrl, buildOAuthTokenAt, computeCodeChallenge, exchangeCodeForTokens, generateCodeVerifier, generateUUID, getAccessibleResources, getUserInfo, OAuthError, refreshToken, revokeToken } from "@knpkv/atlassian-common/auth";
25
- import { deleteActiveProfile, deleteProfileBySelector, HomeDirectoryLive, isTokenExpiredAt, loadActiveProfile, loadActiveProfileToken, loadOAuthConfig, loadProfiles, saveOAuthConfig, saveProfileToken, setActiveProfileBySelector } from "@knpkv/atlassian-common/config";
26
- import * as Clock from "effect/Clock";
27
- import * as Console from "effect/Console";
1
+ import { makeAtlassianCliAuth, NodeCliAuthLive } from "@knpkv/atlassian-common/cli-auth";
28
2
  import * as Context from "effect/Context";
29
- import * as Crypto from "effect/Crypto";
30
- import * as Deferred from "effect/Deferred";
31
- import * as Effect from "effect/Effect";
32
- import * as HttpClient from "effect/http/HttpClient";
33
3
  import * as Layer from "effect/Layer";
34
- import * as Option from "effect/Option";
35
- import { ChildProcessSpawner } from "effect/process";
36
- import * as Redacted from "effect/Redacted";
37
- import * as Ref from "effect/Ref";
38
- import { HttpServerFactoryLive } from "./internal/NodeLayers.js";
39
- import { callbackUrl, startCallbackServer } from "./internal/oauthServer.js";
40
- import { openBrowser } from "./internal/openBrowser.js";
41
4
  import { authMissing } from "./JiraCliError.js";
42
5
  /** OAuth scopes for the Jira CLI. Granular scopes must also be enabled on the app in the developer console. */
43
6
  const JIRA_CLI_SCOPES = [
@@ -56,19 +19,6 @@ const JIRA_CLI_SCOPES = [
56
19
  // Issue a refresh token so the CLI stays logged in across runs.
57
20
  "offline_access"
58
21
  ];
59
- const TOOL_NAME = "jira-cli";
60
- // Layer for token storage operations (FileSystem + Path + HomeDirectory)
61
- const TokenStorageLive = Layer.mergeAll(NodeFileSystem.layer, NodePath.layer, HomeDirectoryLive);
62
- // Wrap token storage operations with their required layers
63
- const loadTokenOp = () => loadActiveProfileToken(TOOL_NAME).pipe(Effect.provide(TokenStorageLive));
64
- const saveTokenOp = (token) => saveProfileToken(TOOL_NAME, token).pipe(Effect.provide(TokenStorageLive));
65
- const deleteTokenOp = () => deleteActiveProfile(TOOL_NAME).pipe(Effect.provide(TokenStorageLive));
66
- const listProfilesOp = () => loadProfiles(TOOL_NAME).pipe(Effect.map((store) => store.profiles), Effect.provide(TokenStorageLive));
67
- const loadActiveProfileOp = () => loadActiveProfile(TOOL_NAME).pipe(Effect.provide(TokenStorageLive));
68
- const switchProfileOp = (selector) => setActiveProfileBySelector(TOOL_NAME, selector).pipe(Effect.provide(TokenStorageLive));
69
- const removeProfileOp = (selector) => deleteProfileBySelector(TOOL_NAME, selector).pipe(Effect.provide(TokenStorageLive));
70
- const loadOAuthConfigOp = () => loadOAuthConfig(TOOL_NAME).pipe(Effect.provide(TokenStorageLive));
71
- const saveOAuthConfigOp = (config) => saveOAuthConfig(TOOL_NAME, config).pipe(Effect.provide(TokenStorageLive));
72
22
  /**
73
23
  * JiraAuth service tag.
74
24
  *
@@ -90,261 +40,20 @@ const saveOAuthConfigOp = (config) => saveOAuthConfig(TOOL_NAME, config).pipe(Ef
90
40
  */
91
41
  export class JiraAuth extends Context.Service()("@knpkv/jira-cli/JiraAuth") {
92
42
  }
93
- const make = Effect.gen(function* () {
94
- const httpClient = yield* HttpClient.HttpClient;
95
- const childProcessSpawner = yield* ChildProcessSpawner.ChildProcessSpawner;
96
- const cryptoService = yield* Crypto.Crypto;
97
- // Ref to track ongoing refresh operation to prevent concurrent refreshes
98
- const refreshLock = yield* Ref.make(Option.none());
99
- const openBrowserImpl = (url) => openBrowser(url).pipe(Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, childProcessSpawner), Effect.mapError((cause) => new OAuthError({ step: "authorize", cause })));
100
- const getConfig = () => Effect.gen(function* () {
101
- const config = yield* loadOAuthConfigOp();
102
- if (config === null) {
103
- return yield* new OAuthError({
104
- step: "authorize",
105
- cause: "OAuth not configured. Run 'jira auth configure' first."
106
- });
107
- }
108
- return config;
109
- });
110
- // Atlassian rotates refresh tokens: the response carries a replacement and
111
- // the one we sent is consumed server-side. Interrupting between the
112
- // round-trip and `saveTokenOp` therefore destroys the credential — the next
113
- // refresh fails and `getAccessToken` below reacts by deleting the token file,
114
- // so the user is silently logged out and has to run `jira auth login` again.
115
- //
116
- // Interruption is routine here, not hypothetical: this runs during layer
117
- // construction on every CLI invocation, and jcf's nvim statusline kills the
118
- // process on `VimLeave`. So the grant and the persist are atomic.
119
- //
120
- // The region carries its own deadline rather than relying on a caller's.
121
- // `Effect.timeout` is a race, and racing an uninterruptible loser means
122
- // waiting for it — an outer bound would go inert and, worse, an
123
- // uninterruptible region with no deadline of its own absorbs SIGINT/SIGTERM
124
- // entirely (`NodeRuntime.runMain`'s signal handlers only interrupt the main
125
- // fiber), leaving a process that ignores Ctrl-C. The deadline forked inside
126
- // the region is itself interruptible, so it does bound this.
127
- //
128
- // Abandoning the round-trip cannot prove the grant did not land: Atlassian
129
- // may consume the refresh token and rotate it after we have stopped
130
- // listening, and no client-side deadline changes that. So the deadline is
131
- // paired with the rule in `getAccessToken` below — a refresh that fails
132
- // without a 4xx never deletes the stored token. The credential survives to be
133
- // retried, and only a real rejection ends the session.
134
- const REFRESH_TIMEOUT = "30 seconds";
135
- const refreshTokenImpl = (token, config) => Effect.uninterruptible(Effect.gen(function* () {
136
- const updated = yield* refreshToken(token, config).pipe(Effect.provide(Layer.succeed(HttpClient.HttpClient, httpClient)), Effect.timeout(REFRESH_TIMEOUT), Effect.catchTag("TimeoutError", () => Effect.fail(new OAuthError({ step: "refresh", cause: `no response within ${REFRESH_TIMEOUT}` }))));
137
- yield* saveTokenOp(updated);
138
- return updated;
139
- }));
140
- const revokeTokenImpl = (token, config) => revokeToken(token, config).pipe(Effect.provide(Layer.succeed(HttpClient.HttpClient, httpClient)));
141
- const configure = (config) => saveOAuthConfigOp(config);
142
- const isConfigured = () => Effect.gen(function* () {
143
- const config = yield* loadOAuthConfigOp();
144
- return config !== null;
145
- });
146
- const login = (options) => Effect.gen(function* () {
147
- const config = yield* getConfig();
148
- const state = yield* generateUUID().pipe(Effect.provideService(Crypto.Crypto, cryptoService));
149
- const codeVerifier = yield* generateCodeVerifier().pipe(Effect.provideService(Crypto.Crypto, cryptoService));
150
- const codeChallenge = yield* computeCodeChallenge(codeVerifier).pipe(Effect.provideService(Crypto.Crypto, cryptoService));
151
- const { code, port } = yield* Effect.scoped(Effect.gen(function* () {
152
- const { codePromise, port } = yield* startCallbackServer(state).pipe(Effect.provide(HttpServerFactoryLive));
153
- const authUrl = buildAuthUrl({
154
- clientId: config.clientId,
155
- state,
156
- port,
157
- redirectUri: callbackUrl(port),
158
- scopes: JIRA_CLI_SCOPES,
159
- codeChallenge
160
- });
161
- yield* Console.log(`Opening browser for Atlassian login (callback on port ${port})...`);
162
- yield* Console.log(`If browser doesn't open, visit: ${authUrl}`);
163
- yield* openBrowserImpl(authUrl);
164
- yield* Console.log("Waiting for authorization (press Ctrl+C to cancel)...");
165
- const code = yield* codePromise.pipe(Effect.timeout("5 minutes"), Effect.catchTag("TimeoutError", () => Effect.fail(new OAuthError({ step: "authorize", cause: "Authorization timed out" }))));
166
- return { code, port };
167
- }));
168
- yield* Console.log("Exchanging code for tokens...");
169
- const tokens = yield* exchangeCodeForTokens(code, config, {
170
- port,
171
- redirectUri: callbackUrl(port),
172
- codeVerifier
173
- }).pipe(Effect.provide(Layer.succeed(HttpClient.HttpClient, httpClient)));
174
- yield* Console.log("Fetching accessible sites...");
175
- const sites = yield* getAccessibleResources(tokens.access_token).pipe(Effect.provide(Layer.succeed(HttpClient.HttpClient, httpClient)));
176
- if (sites.length === 0) {
177
- return yield* new OAuthError({
178
- step: "authorize",
179
- cause: "No Jira sites found for this account"
180
- });
181
- }
182
- let site;
183
- if (sites.length > 1) {
184
- if (options?.siteUrl) {
185
- const matched = sites.find((s) => s.url === options.siteUrl);
186
- if (!matched) {
187
- const available = sites.map((s) => ` - ${s.name}: ${s.url}`).join("\n");
188
- return yield* new OAuthError({
189
- step: "authorize",
190
- cause: `Site '${options.siteUrl}' not found. Available sites:\n${available}`
191
- });
192
- }
193
- site = matched;
194
- }
195
- else {
196
- yield* Console.log("Multiple Jira sites found. Please select one:");
197
- for (const s of sites) {
198
- yield* Console.log(` - ${s.name}: ${s.url}`);
199
- }
200
- yield* Console.log("\nRun 'jira auth login --site <url>' to select a site");
201
- return sites.map((s) => ({ id: s.id, name: s.name, url: s.url }));
202
- }
203
- }
204
- else {
205
- site = sites[0];
206
- }
207
- yield* Console.log("Fetching user info...");
208
- const user = yield* getUserInfo(tokens.access_token).pipe(Effect.provide(Layer.succeed(HttpClient.HttpClient, httpClient)));
209
- const nowMs = yield* Clock.currentTimeMillis;
210
- const tokenData = buildOAuthTokenAt(tokens, site, user, nowMs);
211
- yield* saveTokenOp(tokenData);
212
- yield* Console.log(`Logged in as ${user.name} (${user.email})`);
213
- return undefined;
214
- });
215
- const logout = () => Effect.gen(function* () {
216
- const token = yield* loadTokenOp();
217
- if (token === null) {
218
- yield* Console.log("Not logged in");
219
- return;
220
- }
221
- const config = yield* loadOAuthConfigOp();
222
- if (config !== null) {
223
- yield* revokeTokenImpl(token, config).pipe(Effect.tap(() => Effect.log("Token revoked with Atlassian")), Effect.catch((error) => Effect.log(`Warning: Failed to revoke token: ${error.message}`)));
224
- }
225
- yield* deleteTokenOp();
226
- });
227
- const getAccessToken = () => Effect.gen(function* () {
228
- const token = yield* loadTokenOp();
229
- if (token === null) {
230
- return yield* authMissing();
231
- }
232
- const nowMs = yield* Clock.currentTimeMillis;
233
- if (!isTokenExpiredAt(token, nowMs)) {
234
- return Redacted.make(token.access_token);
235
- }
236
- // Atomically check-then-set refresh lock to avoid TOCTOU race
237
- const deferred = yield* Deferred.make();
238
- const existing = yield* Ref.modify(refreshLock, (current) => Option.isSome(current)
239
- ? [current.value, current]
240
- : [deferred, Option.some(deferred)]);
241
- // Another fiber is already refreshing — just await its result
242
- if (existing !== deferred) {
243
- const refreshed = yield* Deferred.await(existing);
244
- return Redacted.make(refreshed.access_token);
245
- }
246
- const refresh = Effect.gen(function* () {
247
- const config = yield* getConfig();
248
- // stderr, not stdout: this fires from inside layer construction, so it
249
- // lands ahead of whatever the command prints. On `--json` that used to
250
- // put a line of prose in front of the document, and the release
251
- // automation parsing it failed *after* the remote writes had happened.
252
- yield* Console.error("Token expired, refreshing...");
253
- return yield* refreshTokenImpl(token, config);
254
- }).pipe(Effect.catchTag("OAuthError", (error) => {
255
- // Discard the stored credential only when Atlassian actually rejected
256
- // it. A refresh can fail without saying anything about the token —
257
- // transport error, timeout, interruption — and in those cases the
258
- // grant may even have been consumed server-side, so the one thing we
259
- // must not do is delete the replacement's only trail. Deleting on any
260
- // `step === "refresh"` failure turned a flaky network into a silent
261
- // logout, which is worse than retrying and is unrecoverable. On a 4xx
262
- // the token is genuinely dead and re-login is the only way forward.
263
- // Not every failure is a verdict on the token, and not even every
264
- // 4xx is. `429` is the one this most needs to survive — several
265
- // `jira`/`jcf` processes on an expired token hit the endpoint
266
- // together, one wins the rotation and the rest are rate-limited —
267
- // while `408`/`425` restate the timeout case and `407` and other
268
- // middlebox replies never came from Atlassian at all.
269
- //
270
- // Status alone is still too coarse. `refreshToken` sends the client
271
- // credentials in the body, so a wrong or rotated `clientSecret` comes
272
- // back as `400 invalid_client`; deleting the token there destroys a
273
- // working credential over a config problem, and the re-login it forces
274
- // would fail the same way until `jira auth configure` is run. Only
275
- // `invalid_grant` means the stored token itself is spent, and that is
276
- // the only thing that ends the session — on a `403` too, since a bare
277
- // 403 is just as likely to come from a proxy or WAF as from Atlassian
278
- // revoking anything. An unparseable body leaves `errorCode` absent and
279
- // the token in place.
280
- const { errorCode, status } = error;
281
- const rejected = errorCode === "invalid_grant" && (status === 400 || status === 403);
282
- if (error.step === "refresh" && rejected) {
283
- return Effect.gen(function* () {
284
- yield* deleteTokenOp();
285
- return yield* new OAuthError({
286
- step: "refresh",
287
- cause: "Refresh token expired. Please run 'jira auth login' to re-authenticate.",
288
- status,
289
- errorCode
290
- });
291
- });
292
- }
293
- return Effect.fail(error);
294
- }));
295
- // This fiber owns the refresh. Complete the shared Deferred with the final
296
- // transformed exit so waiters observe the same success or failure.
297
- const exit = yield* refresh.pipe(Effect.exit, Effect.ensuring(Ref.set(refreshLock, Option.none())));
298
- yield* Deferred.done(deferred, exit);
299
- const result = yield* Deferred.await(deferred);
300
- return Redacted.make(result.access_token);
301
- });
302
- const getCloudId = () => Effect.gen(function* () {
303
- const token = yield* loadTokenOp();
304
- if (token === null) {
305
- return yield* authMissing();
306
- }
307
- return token.cloud_id;
308
- });
309
- const getSiteUrl = () => Effect.gen(function* () {
310
- const token = yield* loadTokenOp();
311
- if (token === null) {
312
- return yield* authMissing();
313
- }
314
- return token.site_url;
315
- });
316
- const getCurrentUser = () => Effect.gen(function* () {
317
- const token = yield* loadTokenOp();
318
- return token?.user ?? null;
319
- });
320
- const getActiveProfile = () => loadActiveProfileOp();
321
- const listProfiles = () => listProfilesOp();
322
- const switchProfile = (selector) => switchProfileOp(selector);
323
- const removeProfile = (selector) => removeProfileOp(selector);
324
- const isLoggedIn = () => Effect.gen(function* () {
325
- const token = yield* loadTokenOp();
326
- return token !== null;
327
- });
328
- return JiraAuth.of({
329
- configure,
330
- isConfigured,
331
- login,
332
- logout,
333
- getAccessToken,
334
- getCloudId,
335
- getSiteUrl,
336
- getCurrentUser,
337
- getActiveProfile,
338
- listProfiles,
339
- switchProfile,
340
- removeProfile,
341
- isLoggedIn
342
- });
343
- });
43
+ /** Who the Jira CLI is: shared by its auth and its `auth` commands, so both name the same scopes. */
44
+ export const jiraCliDescriptor = {
45
+ commandName: "jira",
46
+ productName: "Jira",
47
+ scopes: JIRA_CLI_SCOPES
48
+ };
344
49
  /**
345
50
  * Layer for JiraAuth service.
346
51
  *
347
52
  * @category Layers
348
53
  */
349
- export const layer = Layer.effect(JiraAuth, make);
54
+ export const layer = Layer.effect(JiraAuth, makeAtlassianCliAuth({
55
+ ...jiraCliDescriptor,
56
+ toolName: "jira-cli",
57
+ authMissing
58
+ })).pipe(Layer.provide(NodeCliAuthLive));
350
59
  //# sourceMappingURL=JiraAuth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JiraAuth.js","sourceRoot":"","sources":["../src/JiraAuth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JiraAuth.js","sourceRoot":"","sources":["../src/JiraAuth.ts"],"names":[],"mappings":"AAmBA,OAAO,EAA+B,oBAAoB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAQrH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAIrC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,+GAA+G;AAC/G,MAAM,eAAe,GAAG;IACtB,0CAA0C;IAC1C,gBAAgB;IAChB,kCAAkC;IAClC,iBAAiB;IACjB,oEAAoE;IACpE,sEAAsE;IACtE,iEAAiE;IACjE,qBAAqB;IACrB,0EAA0E;IAC1E,gBAAgB;IAChB,oEAAoE;IACpE,SAAS;IACT,gEAAgE;IAChE,gBAAgB;CACjB,CAAA;AA4FD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,QAAS,SAAQ,OAAO,CAAC,OAAO,EAG1C,CAAC,0BAA0B,CAAC;CAAG;AAElC,qGAAqG;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAA2B;IACvD,WAAW,EAAE,MAAM;IACnB,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE,eAAe;CACxB,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAC/B,QAAQ,EACR,oBAAoB,CAAC;IACnB,GAAG,iBAAiB;IACpB,QAAQ,EAAE,UAAU;IACpB,WAAW;CACZ,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAA"}
@@ -1,14 +1,3 @@
1
- /**
2
- * Auth subcommands: create, configure, login, logout, status.
3
- *
4
- * **Mental model**
5
- *
6
- * - Each command is a standalone `Command.make` that yields into `JiraAuth` service methods.
7
- * - `create` opens the Atlassian Developer Console; `configure` prompts for client ID/secret.
8
- *
9
- * @internal
10
- */
11
- import { Command, Prompt } from "effect/cli";
12
1
  import { JiraAuth } from "../JiraAuth.js";
13
- export declare const authCommand: Command.Command<"auth", {}, {}, import("@knpkv/atlassian-common/config").FileSystemError | import("@knpkv/atlassian-common/config").HomeDirectoryError | import("@knpkv/atlassian-common/auth").OAuthError | import("effect/PlatformError").PlatformError | import("effect/Terminal").QuitError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | JiraAuth | Prompt.Environment>;
2
+ export declare const authCommand: import("effect/cli/Command").Command<"auth", {}, {}, import("@knpkv/atlassian-common/cli-auth").BrowserOpenError | import("@knpkv/atlassian-common").FileSystemError | import("@knpkv/atlassian-common").HomeDirectoryError | import("@knpkv/atlassian-common").OAuthError | import("effect/PlatformError").PlatformError | import("effect/Terminal").QuitError, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | JiraAuth | import("effect/cli/Prompt").Environment>;
14
3
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAoB,OAAO,EAAmB,MAAM,EAAE,MAAM,YAAY,CAAA;AAK/E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAgJzC,eAAO,MAAM,WAAW,oYAYvB,CAAA"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAqB,MAAM,gBAAgB,CAAA;AAE5D,eAAO,MAAM,WAAW,ydAA2E,CAAA"}