@alwaysmeticulous/cli 2.298.0 → 2.299.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 (225) hide show
  1. package/dist/command-utils/common-options.d.ts +1 -0
  2. package/dist/command-utils/common-options.d.ts.map +1 -0
  3. package/dist/command-utils/download-session.utils.d.ts +3 -2
  4. package/dist/command-utils/download-session.utils.d.ts.map +1 -0
  5. package/dist/command-utils/download-session.utils.js +2 -2
  6. package/dist/command-utils/download-session.utils.js.map +1 -1
  7. package/dist/command-utils/parse-rewrites.d.ts +2 -1
  8. package/dist/command-utils/parse-rewrites.d.ts.map +1 -0
  9. package/dist/command-utils/sentry.utils.d.ts +1 -0
  10. package/dist/command-utils/sentry.utils.d.ts.map +1 -0
  11. package/dist/command-utils/sentry.utils.js +4 -4
  12. package/dist/command-utils/sentry.utils.js.map +1 -1
  13. package/dist/commands/agent/index.d.ts +2 -1
  14. package/dist/commands/agent/index.d.ts.map +1 -0
  15. package/dist/commands/agent/js-coverage-diff.command.d.ts +2 -1
  16. package/dist/commands/agent/js-coverage-diff.command.d.ts.map +1 -0
  17. package/dist/commands/agent/js-coverage.command.d.ts +2 -1
  18. package/dist/commands/agent/js-coverage.command.d.ts.map +1 -0
  19. package/dist/commands/agent/js-coverage.command.js +2 -2
  20. package/dist/commands/agent/js-coverage.command.js.map +1 -1
  21. package/dist/commands/agent/screenshot-dom-diff.command.d.ts +2 -1
  22. package/dist/commands/agent/screenshot-dom-diff.command.d.ts.map +1 -0
  23. package/dist/commands/agent/screenshot-image-files.command.d.ts +2 -1
  24. package/dist/commands/agent/screenshot-image-files.command.d.ts.map +1 -0
  25. package/dist/commands/agent/screenshot-image.command.d.ts +2 -1
  26. package/dist/commands/agent/screenshot-image.command.d.ts.map +1 -0
  27. package/dist/commands/agent/test-run-diffs.command.d.ts +2 -1
  28. package/dist/commands/agent/test-run-diffs.command.d.ts.map +1 -0
  29. package/dist/commands/agent/test-run-diffs.utils.d.ts +2 -1
  30. package/dist/commands/agent/test-run-diffs.utils.d.ts.map +1 -0
  31. package/dist/commands/agent/test-run-diffs.utils.spec.d.ts +1 -0
  32. package/dist/commands/agent/test-run-diffs.utils.spec.d.ts.map +1 -0
  33. package/dist/commands/agent/test-run-for-commit.command.d.ts +2 -1
  34. package/dist/commands/agent/test-run-for-commit.command.d.ts.map +1 -0
  35. package/dist/commands/agent/timeline.command.d.ts +2 -1
  36. package/dist/commands/agent/timeline.command.d.ts.map +1 -0
  37. package/dist/commands/auth/__tests__/list-projects.command.spec.d.ts +2 -0
  38. package/dist/commands/auth/__tests__/list-projects.command.spec.d.ts.map +1 -0
  39. package/dist/commands/auth/__tests__/list-projects.command.spec.js +108 -0
  40. package/dist/commands/auth/__tests__/list-projects.command.spec.js.map +1 -0
  41. package/dist/commands/auth/__tests__/login.command.spec.d.ts +2 -0
  42. package/dist/commands/auth/__tests__/login.command.spec.d.ts.map +1 -0
  43. package/dist/commands/auth/__tests__/login.command.spec.js +72 -0
  44. package/dist/commands/auth/__tests__/login.command.spec.js.map +1 -0
  45. package/dist/commands/auth/__tests__/logout.command.spec.d.ts +2 -0
  46. package/dist/commands/auth/__tests__/logout.command.spec.d.ts.map +1 -0
  47. package/dist/commands/auth/__tests__/logout.command.spec.js +80 -0
  48. package/dist/commands/auth/__tests__/logout.command.spec.js.map +1 -0
  49. package/dist/commands/auth/__tests__/whoami.command.spec.d.ts +2 -0
  50. package/dist/commands/auth/__tests__/whoami.command.spec.d.ts.map +1 -0
  51. package/dist/commands/auth/__tests__/whoami.command.spec.js +132 -0
  52. package/dist/commands/auth/__tests__/whoami.command.spec.js.map +1 -0
  53. package/dist/commands/auth/index.d.ts +2 -1
  54. package/dist/commands/auth/index.d.ts.map +1 -0
  55. package/dist/commands/auth/index.js +6 -2
  56. package/dist/commands/auth/index.js.map +1 -1
  57. package/dist/commands/auth/list-projects.command.d.ts +7 -0
  58. package/dist/commands/auth/list-projects.command.d.ts.map +1 -0
  59. package/dist/commands/auth/list-projects.command.js +66 -0
  60. package/dist/commands/auth/list-projects.command.js.map +1 -0
  61. package/dist/commands/auth/login.command.d.ts +7 -0
  62. package/dist/commands/auth/login.command.d.ts.map +1 -0
  63. package/dist/commands/auth/login.command.js +46 -0
  64. package/dist/commands/auth/login.command.js.map +1 -0
  65. package/dist/commands/auth/logout.command.d.ts +2 -1
  66. package/dist/commands/auth/logout.command.d.ts.map +1 -0
  67. package/dist/commands/auth/logout.command.js +28 -6
  68. package/dist/commands/auth/logout.command.js.map +1 -1
  69. package/dist/commands/auth/set-project.command.d.ts +7 -2
  70. package/dist/commands/auth/set-project.command.d.ts.map +1 -0
  71. package/dist/commands/auth/set-project.command.js +12 -43
  72. package/dist/commands/auth/set-project.command.js.map +1 -1
  73. package/dist/commands/auth/unset-project.command.d.ts +2 -1
  74. package/dist/commands/auth/unset-project.command.d.ts.map +1 -0
  75. package/dist/commands/auth/unset-project.command.js +4 -3
  76. package/dist/commands/auth/unset-project.command.js.map +1 -1
  77. package/dist/commands/auth/whoami.command.d.ts +2 -1
  78. package/dist/commands/auth/whoami.command.d.ts.map +1 -0
  79. package/dist/commands/auth/whoami.command.js +37 -3
  80. package/dist/commands/auth/whoami.command.js.map +1 -1
  81. package/dist/commands/ci/index.d.ts +2 -1
  82. package/dist/commands/ci/index.d.ts.map +1 -0
  83. package/dist/commands/ci/prepare.command.d.ts +3 -2
  84. package/dist/commands/ci/prepare.command.d.ts.map +1 -0
  85. package/dist/commands/ci/resolve-git-options.d.ts +1 -0
  86. package/dist/commands/ci/resolve-git-options.d.ts.map +1 -0
  87. package/dist/commands/ci/resolve-git-options.js +8 -3
  88. package/dist/commands/ci/resolve-git-options.js.map +1 -1
  89. package/dist/commands/ci/run-local.command.d.ts +4 -3
  90. package/dist/commands/ci/run-local.command.d.ts.map +1 -0
  91. package/dist/commands/ci/run-local.command.js +2 -2
  92. package/dist/commands/ci/run-local.command.js.map +1 -1
  93. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.d.ts +2 -1
  94. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.d.ts.map +1 -0
  95. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js +2 -2
  96. package/dist/commands/ci/run-with-uploaded-asset-chunks.command.js.map +1 -1
  97. package/dist/commands/ci/run.command.d.ts +2 -1
  98. package/dist/commands/ci/run.command.d.ts.map +1 -0
  99. package/dist/commands/ci/run.command.js +10 -4
  100. package/dist/commands/ci/run.command.js.map +1 -1
  101. package/dist/commands/ci/start-tunnel.command.d.ts +2 -1
  102. package/dist/commands/ci/start-tunnel.command.d.ts.map +1 -0
  103. package/dist/commands/ci/start-tunnel.command.js +3 -3
  104. package/dist/commands/ci/start-tunnel.command.js.map +1 -1
  105. package/dist/commands/ci/upload-asset-chunk.command.d.ts +2 -1
  106. package/dist/commands/ci/upload-asset-chunk.command.d.ts.map +1 -0
  107. package/dist/commands/ci/upload-assets.command.d.ts +2 -1
  108. package/dist/commands/ci/upload-assets.command.d.ts.map +1 -0
  109. package/dist/commands/ci/upload-assets.command.js +3 -3
  110. package/dist/commands/ci/upload-assets.command.js.map +1 -1
  111. package/dist/commands/ci/upload-container.command.d.ts +3 -2
  112. package/dist/commands/ci/upload-container.command.d.ts.map +1 -0
  113. package/dist/commands/ci/upload-container.command.js +2 -2
  114. package/dist/commands/ci/upload-container.command.js.map +1 -1
  115. package/dist/commands/debug/clean-workspaces.d.ts +1 -0
  116. package/dist/commands/debug/clean-workspaces.d.ts.map +1 -0
  117. package/dist/commands/debug/index.d.ts +2 -1
  118. package/dist/commands/debug/index.d.ts.map +1 -0
  119. package/dist/commands/debug/index.js +2 -2
  120. package/dist/commands/debug/index.js.map +1 -1
  121. package/dist/commands/debug/present-workspace.d.ts +1 -0
  122. package/dist/commands/debug/present-workspace.d.ts.map +1 -0
  123. package/dist/commands/debug/present-workspace.js +2 -2
  124. package/dist/commands/debug/present-workspace.js.map +1 -1
  125. package/dist/commands/debug/project-worktree.d.ts +2 -1
  126. package/dist/commands/debug/project-worktree.d.ts.map +1 -0
  127. package/dist/commands/deprecated-aliases.d.ts +2 -1
  128. package/dist/commands/deprecated-aliases.d.ts.map +1 -0
  129. package/dist/commands/download/index.d.ts +2 -1
  130. package/dist/commands/download/index.d.ts.map +1 -0
  131. package/dist/commands/download/replay.command.d.ts +2 -1
  132. package/dist/commands/download/replay.command.d.ts.map +1 -0
  133. package/dist/commands/download/session.command.d.ts +2 -1
  134. package/dist/commands/download/session.command.d.ts.map +1 -0
  135. package/dist/commands/download/test-run.command.d.ts +2 -1
  136. package/dist/commands/download/test-run.command.d.ts.map +1 -0
  137. package/dist/commands/download/test-run.command.js +2 -2
  138. package/dist/commands/download/test-run.command.js.map +1 -1
  139. package/dist/commands/local/get-edited-files.utils.d.ts +2 -1
  140. package/dist/commands/local/get-edited-files.utils.d.ts.map +1 -0
  141. package/dist/commands/local/get-edited-files.utils.js +3 -3
  142. package/dist/commands/local/get-edited-files.utils.js.map +1 -1
  143. package/dist/commands/local/get-edited-files.utils.spec.d.ts +1 -0
  144. package/dist/commands/local/get-edited-files.utils.spec.d.ts.map +1 -0
  145. package/dist/commands/local/index.d.ts +2 -1
  146. package/dist/commands/local/index.d.ts.map +1 -0
  147. package/dist/commands/local/relevant-sessions.command.d.ts +2 -1
  148. package/dist/commands/local/relevant-sessions.command.d.ts.map +1 -0
  149. package/dist/commands/local/relevant-sessions.command.js +2 -2
  150. package/dist/commands/local/relevant-sessions.command.js.map +1 -1
  151. package/dist/commands/project/index.d.ts +2 -1
  152. package/dist/commands/project/index.d.ts.map +1 -0
  153. package/dist/commands/project/index.js +7 -3
  154. package/dist/commands/project/index.js.map +1 -1
  155. package/dist/commands/project/show.command.d.ts +2 -1
  156. package/dist/commands/project/show.command.d.ts.map +1 -0
  157. package/dist/commands/project/show.command.js +2 -2
  158. package/dist/commands/project/show.command.js.map +1 -1
  159. package/dist/commands/project/upload-source.command.d.ts +2 -1
  160. package/dist/commands/project/upload-source.command.d.ts.map +1 -0
  161. package/dist/commands/record/index.d.ts +2 -1
  162. package/dist/commands/record/index.d.ts.map +1 -0
  163. package/dist/commands/record/login.command.d.ts +2 -1
  164. package/dist/commands/record/login.command.d.ts.map +1 -0
  165. package/dist/commands/record/login.command.js +2 -2
  166. package/dist/commands/record/login.command.js.map +1 -1
  167. package/dist/commands/record/session.command.d.ts +2 -1
  168. package/dist/commands/record/session.command.d.ts.map +1 -0
  169. package/dist/commands/record/session.command.js +2 -2
  170. package/dist/commands/record/session.command.js.map +1 -1
  171. package/dist/commands/replay-debugger.ui.d.ts +4 -3
  172. package/dist/commands/replay-debugger.ui.d.ts.map +1 -0
  173. package/dist/commands/replay-debugger.ui.js +2 -2
  174. package/dist/commands/replay-debugger.ui.js.map +1 -1
  175. package/dist/commands/replay.command.d.ts +4 -3
  176. package/dist/commands/replay.command.d.ts.map +1 -0
  177. package/dist/commands/replay.command.js +8 -4
  178. package/dist/commands/replay.command.js.map +1 -1
  179. package/dist/commands/schema.command.d.ts +2 -1
  180. package/dist/commands/schema.command.d.ts.map +1 -0
  181. package/dist/commands/schema.command.js +4 -3
  182. package/dist/commands/schema.command.js.map +1 -1
  183. package/dist/index.d.ts +1 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/main.d.ts +1 -0
  186. package/dist/main.d.ts.map +1 -0
  187. package/dist/main.js +2 -2
  188. package/dist/main.js.map +1 -1
  189. package/dist/utils/__tests__/handle-auth-failure.spec.d.ts +1 -0
  190. package/dist/utils/__tests__/handle-auth-failure.spec.d.ts.map +1 -0
  191. package/dist/utils/__tests__/handle-auth-failure.spec.js +2 -2
  192. package/dist/utils/__tests__/handle-auth-failure.spec.js.map +1 -1
  193. package/dist/utils/__tests__/resolve-project-identifier.spec.d.ts +1 -0
  194. package/dist/utils/__tests__/resolve-project-identifier.spec.d.ts.map +1 -0
  195. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.d.ts +1 -0
  196. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.d.ts.map +1 -0
  197. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js +2 -2
  198. package/dist/utils/__tests__/resolve-test-run-from-commit.spec.js.map +1 -1
  199. package/dist/utils/__tests__/select-project.spec.d.ts +2 -0
  200. package/dist/utils/__tests__/select-project.spec.d.ts.map +1 -0
  201. package/dist/utils/__tests__/select-project.spec.js +87 -0
  202. package/dist/utils/__tests__/select-project.spec.js.map +1 -0
  203. package/dist/utils/cli-user-error.d.ts +1 -0
  204. package/dist/utils/cli-user-error.d.ts.map +1 -0
  205. package/dist/utils/constants.d.ts +1 -0
  206. package/dist/utils/constants.d.ts.map +1 -0
  207. package/dist/utils/environment.utils.d.ts +1 -0
  208. package/dist/utils/environment.utils.d.ts.map +1 -0
  209. package/dist/utils/format-coverage-ranges.d.ts +2 -1
  210. package/dist/utils/format-coverage-ranges.d.ts.map +1 -0
  211. package/dist/utils/handle-auth-failure.d.ts +1 -0
  212. package/dist/utils/handle-auth-failure.d.ts.map +1 -0
  213. package/dist/utils/out-of-date-client-error.d.ts +2 -1
  214. package/dist/utils/out-of-date-client-error.d.ts.map +1 -0
  215. package/dist/utils/resolve-project-identifier.d.ts +1 -0
  216. package/dist/utils/resolve-project-identifier.d.ts.map +1 -0
  217. package/dist/utils/resolve-test-run-from-commit.d.ts +3 -2
  218. package/dist/utils/resolve-test-run-from-commit.d.ts.map +1 -0
  219. package/dist/utils/resolve-test-run-from-commit.js +2 -2
  220. package/dist/utils/resolve-test-run-from-commit.js.map +1 -1
  221. package/dist/utils/select-project.d.ts +25 -0
  222. package/dist/utils/select-project.d.ts.map +1 -0
  223. package/dist/utils/select-project.js +88 -0
  224. package/dist/utils/select-project.js.map +1 -0
  225. package/package.json +13 -13
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="b691defa-b012-5038-9b9d-61d7c657c6d4")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const vitest_1 = require("vitest");
6
+ const logout_command_1 = require("../logout.command");
7
+ vitest_1.vi.mock("../../../command-utils/sentry.utils", () => ({
8
+ wrapHandler: (fn) => fn,
9
+ }));
10
+ const loggerMock = {
11
+ info: vitest_1.vi.fn(),
12
+ warn: vitest_1.vi.fn(),
13
+ error: vitest_1.vi.fn(),
14
+ debug: vitest_1.vi.fn(),
15
+ };
16
+ vitest_1.vi.mock("@alwaysmeticulous/common", () => ({
17
+ initLogger: () => loggerMock,
18
+ }));
19
+ const mocks = vitest_1.vi.hoisted(() => ({
20
+ clearOAuthTokens: vitest_1.vi.fn(),
21
+ clearStoredProject: vitest_1.vi.fn(),
22
+ readFileBasedToken: vitest_1.vi.fn(),
23
+ }));
24
+ vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
25
+ clearOAuthTokens: mocks.clearOAuthTokens,
26
+ clearStoredProject: mocks.clearStoredProject,
27
+ readFileBasedToken: mocks.readFileBasedToken,
28
+ }));
29
+ const runHandler = (args = {}) => logout_command_1.logoutCommand.handler(args);
30
+ const warnedText = () => loggerMock.warn.mock.calls.flat().join("\n");
31
+ (0, vitest_1.describe)("logout command", () => {
32
+ const originalEnvToken = process.env["METICULOUS_API_TOKEN"];
33
+ (0, vitest_1.beforeEach)(() => {
34
+ vitest_1.vi.clearAllMocks();
35
+ delete process.env["METICULOUS_API_TOKEN"];
36
+ mocks.readFileBasedToken.mockReturnValue(null);
37
+ });
38
+ (0, vitest_1.afterAll)(() => {
39
+ if (originalEnvToken === undefined) {
40
+ delete process.env["METICULOUS_API_TOKEN"];
41
+ }
42
+ else {
43
+ process.env["METICULOUS_API_TOKEN"] = originalEnvToken;
44
+ }
45
+ });
46
+ (0, vitest_1.it)("clears OAuth tokens and the selected project", async () => {
47
+ await runHandler();
48
+ (0, vitest_1.expect)(mocks.clearOAuthTokens).toHaveBeenCalled();
49
+ (0, vitest_1.expect)(mocks.clearStoredProject).toHaveBeenCalled();
50
+ (0, vitest_1.expect)(warnedText()).toBe("");
51
+ });
52
+ (0, vitest_1.it)("does not clear anything on a dry run", async () => {
53
+ await runHandler({ dryRun: true });
54
+ (0, vitest_1.expect)(mocks.clearOAuthTokens).not.toHaveBeenCalled();
55
+ (0, vitest_1.expect)(mocks.clearStoredProject).not.toHaveBeenCalled();
56
+ });
57
+ (0, vitest_1.it)("warns when METICULOUS_API_TOKEN is still set", async () => {
58
+ process.env["METICULOUS_API_TOKEN"] = "still-here";
59
+ await runHandler();
60
+ (0, vitest_1.expect)(warnedText()).toContain("METICULOUS_API_TOKEN");
61
+ });
62
+ (0, vitest_1.it)("warns about a lingering config-file token, naming its path", async () => {
63
+ mocks.readFileBasedToken.mockReturnValue({
64
+ token: "file-token",
65
+ path: "/home/me/.meticulous/config.json",
66
+ });
67
+ await runHandler();
68
+ (0, vitest_1.expect)(warnedText()).toContain("/home/me/.meticulous/config.json");
69
+ });
70
+ (0, vitest_1.it)("does not fail logout when the config file is malformed", async () => {
71
+ mocks.clearOAuthTokens.mockClear();
72
+ mocks.readFileBasedToken.mockImplementation(() => {
73
+ throw new SyntaxError("Unexpected token in JSON");
74
+ });
75
+ await (0, vitest_1.expect)(runHandler()).resolves.toBeUndefined();
76
+ (0, vitest_1.expect)(mocks.clearOAuthTokens).toHaveBeenCalled();
77
+ });
78
+ });
79
+ //# sourceMappingURL=logout.command.spec.js.map
80
+ //# debugId=b691defa-b012-5038-9b9d-61d7c657c6d4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.command.spec.js","sources":["../../../../src/commands/auth/__tests__/logout.command.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"b691defa-b012-5038-9b9d-61d7c657c6d4"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whoami.command.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.command.spec.d.ts","sourceRoot":"","sources":["../../../../src/commands/auth/__tests__/whoami.command.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9b6c0776-62bb-5d0e-87d3-41367dd26c55")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ const vitest_1 = require("vitest");
6
+ const whoami_command_1 = require("../whoami.command");
7
+ // Make wrapHandler a passthrough so handler errors propagate directly to tests
8
+ // rather than being swallowed by process.exit().
9
+ vitest_1.vi.mock("../../../command-utils/sentry.utils", () => ({
10
+ wrapHandler: (fn) => fn,
11
+ }));
12
+ const loggerMock = {
13
+ info: vitest_1.vi.fn(),
14
+ warn: vitest_1.vi.fn(),
15
+ error: vitest_1.vi.fn(),
16
+ debug: vitest_1.vi.fn(),
17
+ };
18
+ vitest_1.vi.mock("@alwaysmeticulous/common", () => ({
19
+ initLogger: () => loggerMock,
20
+ }));
21
+ const mocks = vitest_1.vi.hoisted(() => ({
22
+ resolveApiTokenWithOAuth: vitest_1.vi.fn(),
23
+ isOAuthJwt: vitest_1.vi.fn(),
24
+ createClient: vitest_1.vi.fn(),
25
+ getWhoami: vitest_1.vi.fn(),
26
+ getStoredProject: vitest_1.vi.fn(),
27
+ getProject: vitest_1.vi.fn(),
28
+ }));
29
+ vitest_1.vi.mock("@alwaysmeticulous/client", () => ({
30
+ resolveApiTokenWithOAuth: mocks.resolveApiTokenWithOAuth,
31
+ isOAuthJwt: mocks.isOAuthJwt,
32
+ createClient: mocks.createClient,
33
+ getWhoami: mocks.getWhoami,
34
+ getStoredProject: mocks.getStoredProject,
35
+ getProject: mocks.getProject,
36
+ }));
37
+ vitest_1.vi.mock("../../../utils/handle-auth-failure", () => ({
38
+ handleAuthFailure: vitest_1.vi.fn().mockReturnValue(false),
39
+ }));
40
+ const runHandler = () => whoami_command_1.whoamiCommand.handler({});
41
+ const loggedText = () => loggerMock.info.mock.calls.flat().join("\n");
42
+ const FAKE_WHOAMI = {
43
+ email: "alice@example.com",
44
+ firstName: "Alice",
45
+ lastName: "Smith",
46
+ isAdmin: false,
47
+ organizations: [],
48
+ };
49
+ (0, vitest_1.describe)("whoami command", () => {
50
+ const originalEnvToken = process.env["METICULOUS_API_TOKEN"];
51
+ (0, vitest_1.beforeEach)(() => {
52
+ vitest_1.vi.clearAllMocks();
53
+ delete process.env["METICULOUS_API_TOKEN"];
54
+ mocks.createClient.mockReturnValue({});
55
+ mocks.getWhoami.mockResolvedValue(FAKE_WHOAMI);
56
+ mocks.getStoredProject.mockReturnValue(null);
57
+ mocks.getProject.mockResolvedValue(null);
58
+ });
59
+ (0, vitest_1.afterAll)(() => {
60
+ if (originalEnvToken === undefined) {
61
+ delete process.env["METICULOUS_API_TOKEN"];
62
+ }
63
+ else {
64
+ process.env["METICULOUS_API_TOKEN"] = originalEnvToken;
65
+ }
66
+ });
67
+ (0, vitest_1.describe)("OAuth token", () => {
68
+ (0, vitest_1.beforeEach)(() => {
69
+ mocks.resolveApiTokenWithOAuth.mockResolvedValue("oauth-jwt");
70
+ mocks.isOAuthJwt.mockReturnValue(true);
71
+ });
72
+ (0, vitest_1.it)("reports the OAuth user and skips the project-token path", async () => {
73
+ await runHandler();
74
+ (0, vitest_1.expect)(mocks.getWhoami).toHaveBeenCalled();
75
+ (0, vitest_1.expect)(mocks.getProject).not.toHaveBeenCalled();
76
+ const logged = loggedText();
77
+ (0, vitest_1.expect)(logged).toContain("Authenticated via: OAuth");
78
+ (0, vitest_1.expect)(logged).toContain("alice@example.com");
79
+ (0, vitest_1.expect)(logged).toContain("Alice Smith");
80
+ });
81
+ (0, vitest_1.it)("logs organizations with their role", async () => {
82
+ mocks.getWhoami.mockResolvedValue({
83
+ ...FAKE_WHOAMI,
84
+ organizations: [{ id: "org-1", name: "Acme", role: "owner" }],
85
+ });
86
+ await runHandler();
87
+ (0, vitest_1.expect)(loggedText()).toContain("Acme (owner)");
88
+ });
89
+ (0, vitest_1.it)("logs the selected project when one is stored", async () => {
90
+ mocks.getStoredProject.mockReturnValue("Acme/my-project");
91
+ await runHandler();
92
+ (0, vitest_1.expect)(loggedText()).toContain("Acme/my-project");
93
+ });
94
+ (0, vitest_1.it)("prompts to set a project when none is selected", async () => {
95
+ mocks.getStoredProject.mockReturnValue(null);
96
+ await runHandler();
97
+ (0, vitest_1.expect)(loggedText()).toContain("auth set-project");
98
+ });
99
+ });
100
+ (0, vitest_1.describe)("project API token", () => {
101
+ (0, vitest_1.beforeEach)(() => {
102
+ mocks.resolveApiTokenWithOAuth.mockResolvedValue("project-token");
103
+ mocks.isOAuthJwt.mockReturnValue(false);
104
+ });
105
+ (0, vitest_1.it)("reports the env var as the source and never calls getWhoami", async () => {
106
+ process.env["METICULOUS_API_TOKEN"] = "project-token";
107
+ await runHandler();
108
+ (0, vitest_1.expect)(mocks.getWhoami).not.toHaveBeenCalled();
109
+ (0, vitest_1.expect)(loggedText()).toContain("project API token (METICULOUS_API_TOKEN environment variable)");
110
+ });
111
+ (0, vitest_1.it)("reports the config file as the source when the env var is unset", async () => {
112
+ await runHandler();
113
+ (0, vitest_1.expect)(loggedText()).toContain("project API token (~/.meticulous/config.json)");
114
+ });
115
+ (0, vitest_1.it)("shows the pinned project resolved via token-info", async () => {
116
+ mocks.getProject.mockResolvedValue({
117
+ id: "p1",
118
+ name: "App",
119
+ organization: { id: "o1", name: "Org" },
120
+ });
121
+ await runHandler();
122
+ (0, vitest_1.expect)(loggedText()).toContain("Pinned project: Org/App");
123
+ });
124
+ (0, vitest_1.it)("swallows token-info failures without failing whoami", async () => {
125
+ mocks.getProject.mockRejectedValue(new Error("boom"));
126
+ await (0, vitest_1.expect)(runHandler()).resolves.toBeUndefined();
127
+ (0, vitest_1.expect)(loggedText()).toContain("scoped to a single project");
128
+ });
129
+ });
130
+ });
131
+ //# sourceMappingURL=whoami.command.spec.js.map
132
+ //# debugId=9b6c0776-62bb-5d0e-87d3-41367dd26c55
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.command.spec.js","sources":["../../../../src/commands/auth/__tests__/whoami.command.spec.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"9b6c0776-62bb-5d0e-87d3-41367dd26c55"}
@@ -1,2 +1,3 @@
1
- import { CommandModule } from "yargs";
1
+ import type { CommandModule } from "yargs";
2
2
  export declare const authCommand: CommandModule;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,eAAO,MAAM,WAAW,EAAE,aAgBzB,CAAC"}
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="7656218c-3101-5a77-8f14-4b9086ba7e30")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9b0610de-36fb-54ca-bc31-8d6bf85d065a")}catch(e){}}();
3
3
 
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.authCommand = void 0;
6
+ const list_projects_command_1 = require("./list-projects.command");
7
+ const login_command_1 = require("./login.command");
6
8
  const logout_command_1 = require("./logout.command");
7
9
  const set_project_command_1 = require("./set-project.command");
8
10
  const unset_project_command_1 = require("./unset-project.command");
@@ -11,10 +13,12 @@ exports.authCommand = {
11
13
  command: "auth",
12
14
  describe: "Authentication commands",
13
15
  builder: (yargs) => yargs
16
+ .command(login_command_1.loginCommand)
14
17
  .command(whoami_command_1.whoamiCommand)
15
18
  .command(logout_command_1.logoutCommand)
16
19
  .command(set_project_command_1.setProjectCommand)
17
20
  .command(unset_project_command_1.unsetProjectCommand)
21
+ .command(list_projects_command_1.listProjectsCommand)
18
22
  .demandCommand()
19
23
  .help(),
20
24
  handler: () => {
@@ -22,4 +26,4 @@ exports.authCommand = {
22
26
  },
23
27
  };
24
28
  //# sourceMappingURL=index.js.map
25
- //# debugId=7656218c-3101-5a77-8f14-4b9086ba7e30
29
+ //# debugId=9b0610de-36fb-54ca-bc31-8d6bf85d065a
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/commands/auth/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AACA,qDAAiD;AACjD,+DAA0D;AAC1D,mEAA8D;AAC9D,qDAAiD;AAEpC,QAAA,WAAW,GAAkB;IACxC,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,yBAAyB;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,uCAAiB,CAAC;SAC1B,OAAO,CAAC,2CAAmB,CAAC;SAC5B,aAAa,EAAE;SACf,IAAI,EAAE;IACX,OAAO,EAAE,GAAG,EAAE;QACZ,0BAA0B;IAC5B,CAAC;CACF,CAAC","debugId":"7656218c-3101-5a77-8f14-4b9086ba7e30"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/commands/auth/index.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AACA,mEAA8D;AAC9D,mDAA+C;AAC/C,qDAAiD;AACjD,+DAA0D;AAC1D,mEAA8D;AAC9D,qDAAiD;AAEpC,QAAA,WAAW,GAAkB;IACxC,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,yBAAyB;IACnC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK;SACF,OAAO,CAAC,4BAAY,CAAC;SACrB,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,8BAAa,CAAC;SACtB,OAAO,CAAC,uCAAiB,CAAC;SAC1B,OAAO,CAAC,2CAAmB,CAAC;SAC5B,OAAO,CAAC,2CAAmB,CAAC;SAC5B,aAAa,EAAE;SACf,IAAI,EAAE;IACX,OAAO,EAAE,GAAG,EAAE;QACZ,0BAA0B;IAC5B,CAAC;CACF,CAAC","debugId":"9b0610de-36fb-54ca-bc31-8d6bf85d065a"}
@@ -0,0 +1,7 @@
1
+ import type { CommandModule } from "yargs";
2
+ interface Options {
3
+ json?: boolean;
4
+ }
5
+ export declare const listProjectsCommand: CommandModule<unknown, Options>;
6
+ export {};
7
+ //# sourceMappingURL=list-projects.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/list-projects.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,UAAU,OAAO;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CA4C/D,CAAC"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c51ff4e2-4e66-55a0-a12f-333f055b9d13")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.listProjectsCommand = void 0;
6
+ const client_1 = require("@alwaysmeticulous/client");
7
+ const common_1 = require("@alwaysmeticulous/common");
8
+ const sentry_utils_1 = require("../../command-utils/sentry.utils");
9
+ const cli_user_error_1 = require("../../utils/cli-user-error");
10
+ const select_project_1 = require("../../utils/select-project");
11
+ exports.listProjectsCommand = {
12
+ command: "list-projects",
13
+ describe: "List all Meticulous projects accessible to the authenticated user",
14
+ builder: {
15
+ json: {
16
+ boolean: true,
17
+ description: "Output projects as a JSON array of {id, name, organization: {name}} " +
18
+ "instead of one 'organization/project' slug per line.",
19
+ default: false,
20
+ },
21
+ },
22
+ handler: (0, sentry_utils_1.wrapHandler)(async ({ json }) => {
23
+ const logger = (0, common_1.initLogger)();
24
+ // Enumerating the user's projects is an OAuth-only operation: a
25
+ // project-scoped API token (env var or legacy config) is bound to a single
26
+ // project and cannot list the rest. Rather than asking the user to log out
27
+ // of that token, we just use their OAuth login — performing one now if
28
+ // there isn't a stored one yet (interactive only; CI can't show a browser).
29
+ const apiToken = await resolveOAuthToken();
30
+ const client = (0, client_1.createClient)({ apiToken });
31
+ const projects = await (0, select_project_1.fetchAccessibleProjects)(client);
32
+ if (json) {
33
+ const payload = projects.map((p) => ({
34
+ id: p.id,
35
+ name: p.name,
36
+ organization: { name: p.organization.name },
37
+ }));
38
+ process.stdout.write(JSON.stringify(payload, null, 2) + "\n");
39
+ return;
40
+ }
41
+ if (projects.length === 0) {
42
+ logger.info("No projects are accessible to your account.");
43
+ return;
44
+ }
45
+ for (const p of projects) {
46
+ process.stdout.write(`${p.organization.name}/${p.name}\n`);
47
+ }
48
+ }),
49
+ };
50
+ const resolveOAuthToken = async () => {
51
+ const oauthToken = await (0, client_1.getValidAccessToken)();
52
+ if (oauthToken) {
53
+ return oauthToken;
54
+ }
55
+ if (!(0, client_1.isInteractiveContext)()) {
56
+ throw new cli_user_error_1.CliUserError("`meticulous auth list-projects` lists the projects your user account " +
57
+ "can access, which requires an OAuth login. Run it from an " +
58
+ "interactive terminal to log in via the browser. (A project-scoped " +
59
+ "METICULOUS_API_TOKEN or ~/.meticulous/config.json token cannot " +
60
+ "enumerate projects.)");
61
+ }
62
+ const tokens = await (0, client_1.performOAuthLogin)();
63
+ return tokens.accessToken;
64
+ };
65
+ //# sourceMappingURL=list-projects.command.js.map
66
+ //# debugId=c51ff4e2-4e66-55a0-a12f-333f055b9d13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.command.js","sources":["../../../src/commands/auth/list-projects.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAKkC;AAClC,qDAAsD;AAEtD,mEAA+D;AAC/D,+DAA0D;AAC1D,+DAAqE;AAMxD,QAAA,mBAAmB,GAAoC;IAClE,OAAO,EAAE,eAAe;IACxB,QAAQ,EAAE,mEAAmE;IAC7E,OAAO,EAAE;QACP,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI;YACb,WAAW,EACT,sEAAsE;gBACtE,sDAAsD;YACxD,OAAO,EAAE,KAAK;SACf;KACF;IACD,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,IAAI,EAAW,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,gEAAgE;QAChE,2EAA2E;QAC3E,2EAA2E;QAC3E,uEAAuE;QACvE,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAA,wCAAuB,EAAC,MAAM,CAAC,CAAC;QAEvD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE;aAC5C,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC;CACH,CAAC;AAEF,MAAM,iBAAiB,GAAG,KAAK,IAAqB,EAAE;IACpD,MAAM,UAAU,GAAG,MAAM,IAAA,4BAAmB,GAAE,CAAC;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC,IAAA,6BAAoB,GAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,6BAAY,CACpB,uEAAuE;YACrE,4DAA4D;YAC5D,oEAAoE;YACpE,iEAAiE;YACjE,sBAAsB,CACzB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAiB,GAAE,CAAC;IACzC,OAAO,MAAM,CAAC,WAAW,CAAC;AAC5B,CAAC,CAAC","debugId":"c51ff4e2-4e66-55a0-a12f-333f055b9d13"}
@@ -0,0 +1,7 @@
1
+ import type { CommandModule } from "yargs";
2
+ interface Options {
3
+ project?: string;
4
+ }
5
+ export declare const loginCommand: CommandModule<unknown, Options>;
6
+ export {};
7
+ //# sourceMappingURL=login.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,UAAU,OAAO;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CA4CxD,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="cf9ee091-8093-5037-8d6a-a448d5dc40cc")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.loginCommand = void 0;
6
+ const client_1 = require("@alwaysmeticulous/client");
7
+ const common_1 = require("@alwaysmeticulous/common");
8
+ const sentry_utils_1 = require("../../command-utils/sentry.utils");
9
+ const cli_user_error_1 = require("../../utils/cli-user-error");
10
+ const select_project_1 = require("../../utils/select-project");
11
+ exports.loginCommand = {
12
+ command: "login",
13
+ describe: "Log in to Meticulous via the browser (OAuth)",
14
+ builder: {
15
+ project: {
16
+ string: true,
17
+ description: "Project to select in 'organization/project' format (e.g. 'MyOrg/My App'). " +
18
+ "When provided, skips the interactive picker after logging in.",
19
+ },
20
+ },
21
+ handler: (0, sentry_utils_1.wrapHandler)(async ({ project }) => {
22
+ const logger = (0, common_1.initLogger)();
23
+ if (!(0, client_1.isInteractiveContext)()) {
24
+ throw new cli_user_error_1.CliUserError("`meticulous auth login` requires an interactive terminal. In " +
25
+ "non-interactive environments, set METICULOUS_API_TOKEN or pass " +
26
+ "`--apiToken` instead.");
27
+ }
28
+ // Force a fresh browser login. Don't clear anything beforehand: if the flow
29
+ // is cancelled, times out, or token exchange fails, the existing session
30
+ // and selected project must survive. A successful login overwrites the
31
+ // stored OAuth tokens anyway.
32
+ const tokens = await (0, client_1.performOAuthLogin)();
33
+ // Logged in fresh (possibly as a different account), so drop any
34
+ // previously-selected project before re-selecting — keeping it would leave
35
+ // a stale selection the new user may not be able to access if the selection
36
+ // step below is interrupted.
37
+ (0, client_1.clearStoredProject)();
38
+ const client = (0, client_1.createClient)({ apiToken: tokens.accessToken });
39
+ // Pick a project for the freshly logged-in user: an explicit `--project`
40
+ // wins, otherwise auto-select when there is only one and prompt otherwise.
41
+ await (0, select_project_1.selectAndStoreProject)({ client, logger, project });
42
+ logger.info("You can change the selected project at any time with `meticulous auth set-project`.");
43
+ }),
44
+ };
45
+ //# sourceMappingURL=login.command.js.map
46
+ //# debugId=cf9ee091-8093-5037-8d6a-a448d5dc40cc
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.command.js","sources":["../../../src/commands/auth/login.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAKkC;AAClC,qDAAsD;AAEtD,mEAA+D;AAC/D,+DAA0D;AAC1D,+DAAmE;AAMtD,QAAA,YAAY,GAAoC;IAC3D,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,8CAA8C;IACxD,OAAO,EAAE;QACP,OAAO,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,WAAW,EACT,4EAA4E;gBAC5E,+DAA+D;SAClE;KACF;IACD,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,OAAO,EAAW,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,IAAI,CAAC,IAAA,6BAAoB,GAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,6BAAY,CACpB,+DAA+D;gBAC7D,iEAAiE;gBACjE,uBAAuB,CAC1B,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,yEAAyE;QACzE,uEAAuE;QACvE,8BAA8B;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAiB,GAAE,CAAC;QAEzC,iEAAiE;QACjE,2EAA2E;QAC3E,4EAA4E;QAC5E,6BAA6B;QAC7B,IAAA,2BAAkB,GAAE,CAAC;QAErB,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QAE9D,yEAAyE;QACzE,2EAA2E;QAC3E,MAAM,IAAA,sCAAqB,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAEzD,MAAM,CAAC,IAAI,CACT,qFAAqF,CACtF,CAAC;IACJ,CAAC,CAAC;CACH,CAAC","debugId":"cf9ee091-8093-5037-8d6a-a448d5dc40cc"}
@@ -1,6 +1,7 @@
1
- import { CommandModule } from "yargs";
1
+ import type { CommandModule } from "yargs";
2
2
  interface Options {
3
3
  dryRun?: boolean;
4
4
  }
5
5
  export declare const logoutCommand: CommandModule<unknown, Options>;
6
6
  export {};
7
+ //# sourceMappingURL=logout.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.command.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,UAAU,OAAO;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAmBzD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="827a6d5f-1c7d-51f1-baa1-5efb1138c410")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2ec189a5-df5a-52e6-8ee9-b1c39783771f")}catch(e){}}();
3
3
 
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.logoutCommand = void 0;
@@ -8,17 +8,39 @@ const common_1 = require("@alwaysmeticulous/common");
8
8
  const sentry_utils_1 = require("../../command-utils/sentry.utils");
9
9
  exports.logoutCommand = {
10
10
  command: "logout",
11
- describe: "Clear stored OAuth tokens",
11
+ describe: "Clear stored OAuth tokens and selected project",
12
12
  builder: {},
13
- handler: (0, sentry_utils_1.wrapHandler)(async ({ dryRun }) => {
13
+ handler: (0, sentry_utils_1.wrapHandler)(({ dryRun }) => {
14
14
  const logger = (0, common_1.initLogger)();
15
15
  if (dryRun) {
16
- logger.info("Dry run: would clear stored OAuth tokens");
17
- return;
16
+ logger.info("Dry run: would clear stored OAuth tokens and selected project");
17
+ return Promise.resolve();
18
18
  }
19
19
  (0, client_1.clearOAuthTokens)();
20
+ (0, client_1.clearStoredProject)();
20
21
  logger.info("Logged out successfully.");
22
+ warnAboutRemainingCredentials(logger);
23
+ return Promise.resolve();
21
24
  }),
22
25
  };
26
+ const warnAboutRemainingCredentials = (logger) => {
27
+ if (process.env["METICULOUS_API_TOKEN"]) {
28
+ logger.warn("Note: METICULOUS_API_TOKEN is still set in your environment and will " +
29
+ "continue to be used. Unset it in your shell to fully log out.");
30
+ }
31
+ // Best-effort: a malformed ~/.meticulous/config.json must not fail logout —
32
+ // the credentials have already been cleared by this point.
33
+ let fileToken = null;
34
+ try {
35
+ fileToken = (0, client_1.readFileBasedToken)();
36
+ }
37
+ catch {
38
+ return;
39
+ }
40
+ if (fileToken) {
41
+ logger.warn(`Note: an apiToken is still present in ${fileToken.path} and ` +
42
+ "will continue to be used. Remove it from that file to fully log out.");
43
+ }
44
+ };
23
45
  //# sourceMappingURL=logout.command.js.map
24
- //# debugId=827a6d5f-1c7d-51f1-baa1-5efb1138c410
46
+ //# debugId=2ec189a5-df5a-52e6-8ee9-b1c39783771f
@@ -1 +1 @@
1
- {"version":3,"file":"logout.command.js","sources":["../../../src/commands/auth/logout.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAA4D;AAC5D,qDAAsD;AAEtD,mEAA+D;AAMlD,QAAA,aAAa,GAAoC;IAC5D,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,2BAA2B;IACrC,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,IAAA,yBAAgB,GAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC,CAAC;CACH,CAAC","debugId":"827a6d5f-1c7d-51f1-baa1-5efb1138c410"}
1
+ {"version":3,"file":"logout.command.js","sources":["../../../src/commands/auth/logout.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAIkC;AAClC,qDAAsD;AAGtD,mEAA+D;AAMlD,QAAA,aAAa,GAAoC;IAC5D,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,gDAAgD;IAC1D,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,IAAA,0BAAW,EAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CACT,+DAA+D,CAChE,CAAC;YACF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,IAAA,yBAAgB,GAAE,CAAC;QACnB,IAAA,2BAAkB,GAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAExC,6BAA6B,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC;CACH,CAAC;AAEF,MAAM,6BAA6B,GAAG,CAAC,MAAc,EAAQ,EAAE;IAC7D,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CACT,uEAAuE;YACrE,+DAA+D,CAClE,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,2DAA2D;IAC3D,IAAI,SAAS,GAA0C,IAAI,CAAC;IAC5D,IAAI,CAAC;QACH,SAAS,GAAG,IAAA,2BAAkB,GAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CACT,yCAAyC,SAAS,CAAC,IAAI,OAAO;YAC5D,sEAAsE,CACzE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC","debugId":"2ec189a5-df5a-52e6-8ee9-b1c39783771f"}
@@ -1,2 +1,7 @@
1
- import { CommandModule } from "yargs";
2
- export declare const setProjectCommand: CommandModule;
1
+ import type { CommandModule } from "yargs";
2
+ interface Options {
3
+ project?: string;
4
+ }
5
+ export declare const setProjectCommand: CommandModule<unknown, Options>;
6
+ export {};
7
+ //# sourceMappingURL=set-project.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-project.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/set-project.command.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,UAAU,OAAO;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,iBAAiB,EAAE,aAAa,CAAC,OAAO,EAAE,OAAO,CAoC7D,CAAC"}
@@ -1,22 +1,24 @@
1
1
  "use strict";
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="244e201e-e98b-5479-a94e-e6ff80551232")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="35e70405-cd43-5b5a-b0a4-c6be75f9dbd2")}catch(e){}}();
3
3
 
4
- var __importDefault = (this && this.__importDefault) || function (mod) {
5
- return (mod && mod.__esModule) ? mod : { "default": mod };
6
- };
7
4
  Object.defineProperty(exports, "__esModule", { value: true });
8
5
  exports.setProjectCommand = void 0;
9
6
  const client_1 = require("@alwaysmeticulous/client");
10
7
  const common_1 = require("@alwaysmeticulous/common");
11
- const inquirer_1 = __importDefault(require("inquirer"));
12
8
  const sentry_utils_1 = require("../../command-utils/sentry.utils");
13
9
  const cli_user_error_1 = require("../../utils/cli-user-error");
14
- const handle_auth_failure_1 = require("../../utils/handle-auth-failure");
10
+ const select_project_1 = require("../../utils/select-project");
15
11
  exports.setProjectCommand = {
16
12
  command: "set-project",
17
13
  describe: "Select the Meticulous project to use with OAuth-authenticated commands",
18
- builder: {},
19
- handler: (0, sentry_utils_1.wrapHandler)(async () => {
14
+ builder: {
15
+ project: {
16
+ string: true,
17
+ description: "Project to select in 'organization/project' format (e.g. 'MyOrg/My App'). " +
18
+ "When provided, skips the interactive picker.",
19
+ },
20
+ },
21
+ handler: (0, sentry_utils_1.wrapHandler)(async ({ project }) => {
20
22
  const logger = (0, common_1.initLogger)();
21
23
  const apiToken = await (0, client_1.resolveApiTokenWithOAuth)({
22
24
  apiToken: null,
@@ -33,41 +35,8 @@ exports.setProjectCommand = {
33
35
  "command to log in with OAuth.");
34
36
  }
35
37
  const client = (0, client_1.createClient)({ apiToken });
36
- let projects;
37
- try {
38
- projects = await (0, client_1.getOAuthProjects)(client);
39
- }
40
- catch (error) {
41
- (0, handle_auth_failure_1.handleAuthFailure)(error);
42
- throw error;
43
- }
44
- if (projects.length === 0) {
45
- throw new cli_user_error_1.CliUserError("No projects are accessible to your account. Ask an organization " +
46
- "admin to add you to a project.");
47
- }
48
- const selected = projects.length === 1 ? projects[0] : await promptForProject(projects);
49
- const projectSlug = `${selected.organization.name}/${selected.name}`;
50
- (0, client_1.setStoredProject)({ project: projectSlug, projectId: selected.id });
51
- logger.info(`Selected project: ${projectSlug}`);
38
+ await (0, select_project_1.selectAndStoreProject)({ client, logger, project });
52
39
  }),
53
40
  };
54
- const promptForProject = async (projects) => {
55
- const { projectId } = await inquirer_1.default.prompt([
56
- {
57
- type: "list",
58
- name: "projectId",
59
- message: "Select a project:",
60
- choices: projects.map((project) => ({
61
- name: `${project.organization.name}/${project.name}`,
62
- value: project.id,
63
- })),
64
- },
65
- ]);
66
- const selected = projects.find((project) => project.id === projectId);
67
- if (!selected) {
68
- throw new Error("Selected project not found in fetched list");
69
- }
70
- return selected;
71
- };
72
41
  //# sourceMappingURL=set-project.command.js.map
73
- //# debugId=244e201e-e98b-5479-a94e-e6ff80551232
42
+ //# debugId=35e70405-cd43-5b5a-b0a4-c6be75f9dbd2
@@ -1 +1 @@
1
- {"version":3,"file":"set-project.command.js","sources":["../../../src/commands/auth/set-project.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;;;;AAAA,qDAOkC;AAClC,qDAAsD;AACtD,wDAAgC;AAEhC,mEAA+D;AAC/D,+DAA0D;AAC1D,yEAAoE;AAEvD,QAAA,iBAAiB,GAAkB;IAC9C,OAAO,EAAE,aAAa;IACtB,QAAQ,EACN,wEAAwE;IAC1E,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,MAAM,IAAA,iCAAwB,EAAC;YAC9C,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,qEAAqE;QACrE,+CAA+C;QAC/C,IAAI,CAAC,IAAA,mBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,6BAAY,CACpB,gEAAgE;gBAC9D,+DAA+D;gBAC/D,UAAU;gBACV,gEAAgE;gBAChE,6DAA6D;gBAC7D,+BAA+B,CAClC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE1C,IAAI,QAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAA,yBAAgB,EAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAA,uCAAiB,EAAC,KAAK,CAAC,CAAC;YACzB,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,6BAAY,CACpB,kEAAkE;gBAChE,gCAAgC,CACnC,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GACZ,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrE,IAAA,yBAAgB,EAAC,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;CACH,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,EAC5B,QAAwB,EACD,EAAE;IACzB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAwB;QACjE;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE;gBACpD,KAAK,EAAE,OAAO,CAAC,EAAE;aAClB,CAAC,CAAC;SACJ;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC","debugId":"244e201e-e98b-5479-a94e-e6ff80551232"}
1
+ {"version":3,"file":"set-project.command.js","sources":["../../../src/commands/auth/set-project.command.ts"],"sourceRoot":"","names":[],"mappings":";;;;;AAAA,qDAIkC;AAClC,qDAAsD;AAEtD,mEAA+D;AAC/D,+DAA0D;AAC1D,+DAAmE;AAMtD,QAAA,iBAAiB,GAAoC;IAChE,OAAO,EAAE,aAAa;IACtB,QAAQ,EACN,wEAAwE;IAC1E,OAAO,EAAE;QACP,OAAO,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,WAAW,EACT,4EAA4E;gBAC5E,8CAA8C;SACjD;KACF;IACD,OAAO,EAAE,IAAA,0BAAW,EAAC,KAAK,EAAE,EAAE,OAAO,EAAW,EAAE,EAAE;QAClD,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,MAAM,IAAA,iCAAwB,EAAC;YAC9C,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,qEAAqE;QACrE,+CAA+C;QAC/C,IAAI,CAAC,IAAA,mBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,6BAAY,CACpB,gEAAgE;gBAC9D,+DAA+D;gBAC/D,UAAU;gBACV,gEAAgE;gBAChE,6DAA6D;gBAC7D,+BAA+B,CAClC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1C,MAAM,IAAA,sCAAqB,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC;CACH,CAAC","debugId":"35e70405-cd43-5b5a-b0a4-c6be75f9dbd2"}
@@ -1,2 +1,3 @@
1
- import { CommandModule } from "yargs";
1
+ import type { CommandModule } from "yargs";
2
2
  export declare const unsetProjectCommand: CommandModule;
3
+ //# sourceMappingURL=unset-project.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unset-project.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/unset-project.command.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C,eAAO,MAAM,mBAAmB,EAAE,aAejC,CAAC"}