@kodus/cli 0.2.4 → 0.4.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 (261) hide show
  1. package/README.md +78 -27
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +20 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/auth/index.d.ts.map +1 -1
  6. package/dist/commands/auth/index.js +1 -2
  7. package/dist/commands/auth/index.js.map +1 -1
  8. package/dist/commands/auth/login.d.ts.map +1 -1
  9. package/dist/commands/auth/login.js +44 -45
  10. package/dist/commands/auth/login.js.map +1 -1
  11. package/dist/commands/auth/logout.d.ts.map +1 -1
  12. package/dist/commands/auth/logout.js +5 -3
  13. package/dist/commands/auth/logout.js.map +1 -1
  14. package/dist/commands/auth/status.d.ts.map +1 -1
  15. package/dist/commands/auth/status.js +28 -25
  16. package/dist/commands/auth/status.js.map +1 -1
  17. package/dist/commands/auth/team-key.d.ts.map +1 -1
  18. package/dist/commands/auth/team-key.js +49 -29
  19. package/dist/commands/auth/team-key.js.map +1 -1
  20. package/dist/commands/auth/token.d.ts.map +1 -1
  21. package/dist/commands/auth/token.js +12 -10
  22. package/dist/commands/auth/token.js.map +1 -1
  23. package/dist/commands/hook/index.d.ts.map +1 -1
  24. package/dist/commands/hook/index.js +1 -2
  25. package/dist/commands/hook/index.js.map +1 -1
  26. package/dist/commands/hook/install.d.ts.map +1 -1
  27. package/dist/commands/hook/install.js +21 -22
  28. package/dist/commands/hook/install.js.map +1 -1
  29. package/dist/commands/hook/status.d.ts.map +1 -1
  30. package/dist/commands/hook/status.js +10 -8
  31. package/dist/commands/hook/status.js.map +1 -1
  32. package/dist/commands/hook/uninstall.d.ts.map +1 -1
  33. package/dist/commands/hook/uninstall.js +7 -5
  34. package/dist/commands/hook/uninstall.js.map +1 -1
  35. package/dist/commands/memory/capture.d.ts.map +1 -1
  36. package/dist/commands/memory/capture.js +28 -14
  37. package/dist/commands/memory/capture.js.map +1 -1
  38. package/dist/commands/memory/disable.d.ts.map +1 -1
  39. package/dist/commands/memory/disable.js +9 -7
  40. package/dist/commands/memory/disable.js.map +1 -1
  41. package/dist/commands/memory/enable.d.ts.map +1 -1
  42. package/dist/commands/memory/enable.js +18 -14
  43. package/dist/commands/memory/enable.js.map +1 -1
  44. package/dist/commands/memory/hooks.d.ts.map +1 -1
  45. package/dist/commands/memory/hooks.js +37 -17
  46. package/dist/commands/memory/hooks.js.map +1 -1
  47. package/dist/commands/memory/index.d.ts.map +1 -1
  48. package/dist/commands/memory/index.js +1 -2
  49. package/dist/commands/memory/index.js.map +1 -1
  50. package/dist/commands/memory/promote.d.ts.map +1 -1
  51. package/dist/commands/memory/promote.js +14 -10
  52. package/dist/commands/memory/promote.js.map +1 -1
  53. package/dist/commands/memory/show.d.ts.map +1 -1
  54. package/dist/commands/memory/show.js +11 -10
  55. package/dist/commands/memory/show.js.map +1 -1
  56. package/dist/commands/memory/status.d.ts.map +1 -1
  57. package/dist/commands/memory/status.js +22 -20
  58. package/dist/commands/memory/status.js.map +1 -1
  59. package/dist/commands/pr.d.ts.map +1 -1
  60. package/dist/commands/pr.js +131 -13
  61. package/dist/commands/pr.js.map +1 -1
  62. package/dist/commands/review.d.ts.map +1 -1
  63. package/dist/commands/review.js +57 -38
  64. package/dist/commands/review.js.map +1 -1
  65. package/dist/commands/status.d.ts +3 -0
  66. package/dist/commands/status.d.ts.map +1 -0
  67. package/dist/commands/status.js +119 -0
  68. package/dist/commands/status.js.map +1 -0
  69. package/dist/commands/subscribe.d.ts +4 -0
  70. package/dist/commands/subscribe.d.ts.map +1 -0
  71. package/dist/commands/subscribe.js +25 -0
  72. package/dist/commands/subscribe.js.map +1 -0
  73. package/dist/commands/update.d.ts +9 -0
  74. package/dist/commands/update.d.ts.map +1 -0
  75. package/dist/commands/update.js +74 -0
  76. package/dist/commands/update.js.map +1 -0
  77. package/dist/formatters/json.d.ts.map +1 -1
  78. package/dist/formatters/json.js.map +1 -1
  79. package/dist/formatters/markdown.d.ts.map +1 -1
  80. package/dist/formatters/markdown.js.map +1 -1
  81. package/dist/formatters/prompt.d.ts.map +1 -1
  82. package/dist/formatters/prompt.js +6 -6
  83. package/dist/formatters/prompt.js.map +1 -1
  84. package/dist/formatters/terminal.d.ts.map +1 -1
  85. package/dist/formatters/terminal.js +7 -4
  86. package/dist/formatters/terminal.js.map +1 -1
  87. package/dist/index.js +28 -5
  88. package/dist/index.js.map +1 -1
  89. package/dist/services/api/api.interface.d.ts +10 -1
  90. package/dist/services/api/api.interface.d.ts.map +1 -1
  91. package/dist/services/api/api.real.d.ts +14 -0
  92. package/dist/services/api/api.real.d.ts.map +1 -1
  93. package/dist/services/api/api.real.js +163 -58
  94. package/dist/services/api/api.real.js.map +1 -1
  95. package/dist/services/api/index.d.ts +2 -2
  96. package/dist/services/api/index.js +1 -1
  97. package/dist/services/auth.service.d.ts +1 -0
  98. package/dist/services/auth.service.d.ts.map +1 -1
  99. package/dist/services/auth.service.js +21 -2
  100. package/dist/services/auth.service.js.map +1 -1
  101. package/dist/services/context.service.d.ts +4 -1
  102. package/dist/services/context.service.d.ts.map +1 -1
  103. package/dist/services/context.service.js +30 -19
  104. package/dist/services/context.service.js.map +1 -1
  105. package/dist/services/fix.service.d.ts.map +1 -1
  106. package/dist/services/fix.service.js +3 -2
  107. package/dist/services/fix.service.js.map +1 -1
  108. package/dist/services/git.service.d.ts +1 -0
  109. package/dist/services/git.service.d.ts.map +1 -1
  110. package/dist/services/git.service.js +123 -48
  111. package/dist/services/git.service.js.map +1 -1
  112. package/dist/services/memory.service.d.ts.map +1 -1
  113. package/dist/services/memory.service.js +93 -35
  114. package/dist/services/memory.service.js.map +1 -1
  115. package/dist/services/review.service.d.ts +12 -1
  116. package/dist/services/review.service.d.ts.map +1 -1
  117. package/dist/services/review.service.js +88 -65
  118. package/dist/services/review.service.js.map +1 -1
  119. package/dist/services/transcript-parser.service.d.ts.map +1 -1
  120. package/dist/services/transcript-parser.service.js +46 -15
  121. package/dist/services/transcript-parser.service.js.map +1 -1
  122. package/dist/types/index.d.ts +12 -1
  123. package/dist/types/index.d.ts.map +1 -1
  124. package/dist/types/index.js.map +1 -1
  125. package/dist/types/memory.d.ts.map +1 -1
  126. package/dist/ui/interactive.d.ts.map +1 -1
  127. package/dist/ui/interactive.js +86 -92
  128. package/dist/ui/interactive.js.map +1 -1
  129. package/dist/utils/banner.d.ts +2 -0
  130. package/dist/utils/banner.d.ts.map +1 -0
  131. package/dist/utils/banner.js +190 -0
  132. package/dist/utils/banner.js.map +1 -0
  133. package/dist/utils/cli-exit.d.ts +13 -0
  134. package/dist/utils/cli-exit.d.ts.map +1 -0
  135. package/dist/utils/cli-exit.js +29 -0
  136. package/dist/utils/cli-exit.js.map +1 -0
  137. package/dist/utils/clipboard.d.ts +2 -0
  138. package/dist/utils/clipboard.d.ts.map +1 -0
  139. package/dist/utils/clipboard.js +11 -0
  140. package/dist/utils/clipboard.js.map +1 -0
  141. package/dist/utils/config.d.ts +3 -0
  142. package/dist/utils/config.d.ts.map +1 -1
  143. package/dist/utils/config.js.map +1 -1
  144. package/dist/utils/credentials.d.ts.map +1 -1
  145. package/dist/utils/credentials.js.map +1 -1
  146. package/dist/utils/device.d.ts.map +1 -1
  147. package/dist/utils/device.js +17 -6
  148. package/dist/utils/device.js.map +1 -1
  149. package/dist/utils/logger.d.ts +13 -0
  150. package/dist/utils/logger.d.ts.map +1 -0
  151. package/dist/utils/logger.js +48 -0
  152. package/dist/utils/logger.js.map +1 -0
  153. package/dist/utils/module-matcher.d.ts.map +1 -1
  154. package/dist/utils/module-matcher.js +12 -7
  155. package/dist/utils/module-matcher.js.map +1 -1
  156. package/dist/utils/rate-limit.d.ts.map +1 -1
  157. package/dist/utils/rate-limit.js +12 -3
  158. package/dist/utils/rate-limit.js.map +1 -1
  159. package/dist/utils/recent-activity.d.ts +9 -0
  160. package/dist/utils/recent-activity.d.ts.map +1 -0
  161. package/dist/utils/recent-activity.js +139 -0
  162. package/dist/utils/recent-activity.js.map +1 -0
  163. package/dist/utils/skills.d.ts +2 -0
  164. package/dist/utils/skills.d.ts.map +1 -0
  165. package/dist/utils/skills.js +40 -0
  166. package/dist/utils/skills.js.map +1 -0
  167. package/dist/utils/update-check.d.ts +1 -2
  168. package/dist/utils/update-check.d.ts.map +1 -1
  169. package/dist/utils/update-check.js +21 -97
  170. package/dist/utils/update-check.js.map +1 -1
  171. package/package.json +83 -59
  172. package/skills/README.md +49 -0
  173. package/skills/business-rules-validation/SKILL.md +43 -0
  174. package/skills/kodus-pr-suggestions-resolver/SKILL.md +61 -0
  175. package/skills/kodus-review/SKILL.md +40 -0
  176. package/skills/kodus-review-dev/SKILL.md +41 -0
  177. package/skills/kodus-review-dev/scripts/run-local-cli.sh +49 -0
  178. package/dist/commands/__tests__/auth.login-logout.test.d.ts +0 -2
  179. package/dist/commands/__tests__/auth.login-logout.test.d.ts.map +0 -1
  180. package/dist/commands/__tests__/auth.login-logout.test.js +0 -125
  181. package/dist/commands/__tests__/auth.login-logout.test.js.map +0 -1
  182. package/dist/commands/__tests__/auth.team-key.test.d.ts +0 -2
  183. package/dist/commands/__tests__/auth.team-key.test.d.ts.map +0 -1
  184. package/dist/commands/__tests__/auth.team-key.test.js +0 -145
  185. package/dist/commands/__tests__/auth.team-key.test.js.map +0 -1
  186. package/dist/commands/__tests__/capture-api.test.d.ts +0 -2
  187. package/dist/commands/__tests__/capture-api.test.d.ts.map +0 -1
  188. package/dist/commands/__tests__/capture-api.test.js +0 -88
  189. package/dist/commands/__tests__/capture-api.test.js.map +0 -1
  190. package/dist/commands/__tests__/disable.test.d.ts +0 -2
  191. package/dist/commands/__tests__/disable.test.d.ts.map +0 -1
  192. package/dist/commands/__tests__/disable.test.js +0 -103
  193. package/dist/commands/__tests__/disable.test.js.map +0 -1
  194. package/dist/commands/__tests__/enable.test.d.ts +0 -2
  195. package/dist/commands/__tests__/enable.test.d.ts.map +0 -1
  196. package/dist/commands/__tests__/enable.test.js +0 -103
  197. package/dist/commands/__tests__/enable.test.js.map +0 -1
  198. package/dist/commands/__tests__/hook.test.d.ts +0 -2
  199. package/dist/commands/__tests__/hook.test.d.ts.map +0 -1
  200. package/dist/commands/__tests__/hook.test.js +0 -105
  201. package/dist/commands/__tests__/hook.test.js.map +0 -1
  202. package/dist/commands/__tests__/install-merge-hook.test.d.ts +0 -2
  203. package/dist/commands/__tests__/install-merge-hook.test.d.ts.map +0 -1
  204. package/dist/commands/__tests__/install-merge-hook.test.js +0 -54
  205. package/dist/commands/__tests__/install-merge-hook.test.js.map +0 -1
  206. package/dist/commands/upgrade.d.ts +0 -3
  207. package/dist/commands/upgrade.d.ts.map +0 -1
  208. package/dist/commands/upgrade.js +0 -35
  209. package/dist/commands/upgrade.js.map +0 -1
  210. package/dist/services/__tests__/auth.service.test.d.ts +0 -2
  211. package/dist/services/__tests__/auth.service.test.d.ts.map +0 -1
  212. package/dist/services/__tests__/auth.service.test.js +0 -201
  213. package/dist/services/__tests__/auth.service.test.js.map +0 -1
  214. package/dist/services/__tests__/git.service.test.d.ts +0 -2
  215. package/dist/services/__tests__/git.service.test.d.ts.map +0 -1
  216. package/dist/services/__tests__/git.service.test.js +0 -61
  217. package/dist/services/__tests__/git.service.test.js.map +0 -1
  218. package/dist/services/__tests__/memory.service.test.d.ts +0 -2
  219. package/dist/services/__tests__/memory.service.test.d.ts.map +0 -1
  220. package/dist/services/__tests__/memory.service.test.js +0 -279
  221. package/dist/services/__tests__/memory.service.test.js.map +0 -1
  222. package/dist/services/__tests__/review.service.auth-fallback.test.d.ts +0 -2
  223. package/dist/services/__tests__/review.service.auth-fallback.test.d.ts.map +0 -1
  224. package/dist/services/__tests__/review.service.auth-fallback.test.js +0 -63
  225. package/dist/services/__tests__/review.service.auth-fallback.test.js.map +0 -1
  226. package/dist/services/__tests__/review.service.test.d.ts +0 -2
  227. package/dist/services/__tests__/review.service.test.d.ts.map +0 -1
  228. package/dist/services/__tests__/review.service.test.js +0 -132
  229. package/dist/services/__tests__/review.service.test.js.map +0 -1
  230. package/dist/services/__tests__/review.suggestions-auth.test.d.ts +0 -2
  231. package/dist/services/__tests__/review.suggestions-auth.test.d.ts.map +0 -1
  232. package/dist/services/__tests__/review.suggestions-auth.test.js +0 -81
  233. package/dist/services/__tests__/review.suggestions-auth.test.js.map +0 -1
  234. package/dist/services/__tests__/transcript-parser.service.test.d.ts +0 -2
  235. package/dist/services/__tests__/transcript-parser.service.test.d.ts.map +0 -1
  236. package/dist/services/__tests__/transcript-parser.service.test.js +0 -134
  237. package/dist/services/__tests__/transcript-parser.service.test.js.map +0 -1
  238. package/dist/services/api/__tests__/api.real.test.d.ts +0 -2
  239. package/dist/services/api/__tests__/api.real.test.d.ts.map +0 -1
  240. package/dist/services/api/__tests__/api.real.test.js +0 -182
  241. package/dist/services/api/__tests__/api.real.test.js.map +0 -1
  242. package/dist/utils/__tests__/config.test.d.ts +0 -2
  243. package/dist/utils/__tests__/config.test.d.ts.map +0 -1
  244. package/dist/utils/__tests__/config.test.js +0 -79
  245. package/dist/utils/__tests__/config.test.js.map +0 -1
  246. package/dist/utils/__tests__/credentials.test.d.ts +0 -2
  247. package/dist/utils/__tests__/credentials.test.d.ts.map +0 -1
  248. package/dist/utils/__tests__/credentials.test.js +0 -89
  249. package/dist/utils/__tests__/credentials.test.js.map +0 -1
  250. package/dist/utils/__tests__/device.test.d.ts +0 -2
  251. package/dist/utils/__tests__/device.test.d.ts.map +0 -1
  252. package/dist/utils/__tests__/device.test.js +0 -108
  253. package/dist/utils/__tests__/device.test.js.map +0 -1
  254. package/dist/utils/__tests__/module-matcher.test.d.ts +0 -2
  255. package/dist/utils/__tests__/module-matcher.test.d.ts.map +0 -1
  256. package/dist/utils/__tests__/module-matcher.test.js +0 -164
  257. package/dist/utils/__tests__/module-matcher.test.js.map +0 -1
  258. package/dist/utils/__tests__/update-check.test.d.ts +0 -2
  259. package/dist/utils/__tests__/update-check.test.d.ts.map +0 -1
  260. package/dist/utils/__tests__/update-check.test.js +0 -26
  261. package/dist/utils/__tests__/update-check.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"hook.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/hook.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=install-merge-hook.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-merge-hook.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/install-merge-hook.test.ts"],"names":[],"mappings":""}
@@ -1,54 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import fs from 'fs/promises';
3
- import path from 'path';
4
- import os from 'os';
5
- import { installMergeHook, MERGE_HOOK_MARKER } from '../memory/hooks.js';
6
- vi.mock('../../services/git.service.js', () => ({
7
- gitService: {
8
- isGitRepository: vi.fn().mockResolvedValue(true),
9
- getGitRoot: vi.fn(),
10
- },
11
- }));
12
- let tmpDir;
13
- beforeEach(async () => {
14
- tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'kodus-merge-hook-test-'));
15
- const hooksDir = path.join(tmpDir, '.git', 'hooks');
16
- await fs.mkdir(hooksDir, { recursive: true });
17
- });
18
- afterEach(async () => {
19
- await fs.rm(tmpDir, { recursive: true, force: true });
20
- vi.restoreAllMocks();
21
- });
22
- function hookPath() {
23
- return path.join(tmpDir, '.git', 'hooks', 'post-merge');
24
- }
25
- describe('installMergeHook', () => {
26
- it('creates new hook when none exists', async () => {
27
- const result = await installMergeHook(tmpDir);
28
- expect(result.alreadyInstalled).toBe(false);
29
- expect(result.hookPath).toBe(hookPath());
30
- const content = await fs.readFile(hookPath(), 'utf-8');
31
- expect(content).toContain('#!/bin/sh');
32
- expect(content).toContain(MERGE_HOOK_MARKER);
33
- expect(content).toContain('kodus decisions promote');
34
- // Check executable
35
- const stat = await fs.stat(hookPath());
36
- expect(stat.mode & 0o100).toBeTruthy();
37
- });
38
- it('skips when marker already present', async () => {
39
- await fs.writeFile(hookPath(), `#!/bin/sh\n${MERGE_HOOK_MARKER}\nkodus decisions promote\n`);
40
- const result = await installMergeHook(tmpDir);
41
- expect(result.alreadyInstalled).toBe(true);
42
- });
43
- it('appends to existing non-kodus hook', async () => {
44
- const existingContent = '#!/bin/sh\necho "existing hook"\n';
45
- await fs.writeFile(hookPath(), existingContent);
46
- const result = await installMergeHook(tmpDir);
47
- expect(result.alreadyInstalled).toBe(false);
48
- const content = await fs.readFile(hookPath(), 'utf-8');
49
- expect(content).toContain('echo "existing hook"');
50
- expect(content).toContain(MERGE_HOOK_MARKER);
51
- expect(content).toContain('kodus decisions promote');
52
- });
53
- });
54
- //# sourceMappingURL=install-merge-hook.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-merge-hook.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/install-merge-hook.test.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare const upgradeCommand: Command;
3
- //# sourceMappingURL=upgrade.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,cAAc,SAmBvB,CAAC"}
@@ -1,35 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- const UPGRADE_URL = 'https://kodus.io/pricing';
4
- export const upgradeCommand = new Command('upgrade')
5
- .description('Open the upgrade page in your browser')
6
- .action(async () => {
7
- console.log(chalk.blue('\nOpening upgrade page...'));
8
- console.log(chalk.dim(`URL: ${UPGRADE_URL}\n`));
9
- const open = await getOpenCommand();
10
- if (open) {
11
- const { execFile } = await import('child_process');
12
- // Use execFile instead of exec to prevent command injection
13
- execFile(open, [UPGRADE_URL], (error) => {
14
- if (error) {
15
- console.log(chalk.yellow(`Could not open browser. Please visit: ${UPGRADE_URL}`));
16
- }
17
- });
18
- }
19
- else {
20
- console.log(chalk.yellow(`Please visit: ${UPGRADE_URL}`));
21
- }
22
- });
23
- async function getOpenCommand() {
24
- switch (process.platform) {
25
- case 'darwin':
26
- return 'open';
27
- case 'win32':
28
- return 'start';
29
- case 'linux':
30
- return 'xdg-open';
31
- default:
32
- return null;
33
- }
34
- }
35
- //# sourceMappingURL=upgrade.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IAEpC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;QACnD,4DAA4D;QAC5D,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,KAAK,UAAU,cAAc;IAC3B,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC;QAChB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=auth.service.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/auth.service.test.ts"],"names":[],"mappings":""}
@@ -1,201 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { AuthError } from '../../types/index.js';
3
- vi.mock('../api/index.js', () => ({
4
- api: {
5
- auth: {
6
- login: vi.fn(),
7
- refresh: vi.fn(),
8
- logout: vi.fn(),
9
- generateCIToken: vi.fn(),
10
- verify: vi.fn(),
11
- },
12
- },
13
- }));
14
- vi.mock('../../utils/credentials.js', () => ({
15
- loadCredentials: vi.fn(),
16
- saveCredentials: vi.fn(),
17
- clearCredentials: vi.fn(),
18
- }));
19
- vi.mock('../../utils/config.js', () => ({
20
- loadConfig: vi.fn(),
21
- clearConfig: vi.fn(),
22
- }));
23
- import { api } from '../api/index.js';
24
- import { loadCredentials, saveCredentials, clearCredentials } from '../../utils/credentials.js';
25
- import { loadConfig, clearConfig } from '../../utils/config.js';
26
- import { AuthService } from '../auth.service.js';
27
- const mockApi = vi.mocked(api);
28
- const mockLoadCredentials = vi.mocked(loadCredentials);
29
- const mockSaveCredentials = vi.mocked(saveCredentials);
30
- const mockClearCredentials = vi.mocked(clearCredentials);
31
- const mockLoadConfig = vi.mocked(loadConfig);
32
- const mockClearConfig = vi.mocked(clearConfig);
33
- function makeCredentials(overrides = {}) {
34
- return {
35
- accessToken: 'access-token',
36
- refreshToken: 'refresh-token',
37
- expiresAt: Date.now() + 3600 * 1000,
38
- user: { id: 'u1', email: 'test@example.com', orgs: [] },
39
- ...overrides,
40
- };
41
- }
42
- function makeAuthResponse(overrides = {}) {
43
- return {
44
- accessToken: 'new-access-token',
45
- refreshToken: 'new-refresh-token',
46
- expiresIn: 3600,
47
- user: { id: 'u1', email: 'test@example.com', orgs: [] },
48
- ...overrides,
49
- };
50
- }
51
- describe('AuthService', () => {
52
- let authService;
53
- beforeEach(() => {
54
- vi.clearAllMocks();
55
- authService = new AuthService();
56
- });
57
- describe('login', () => {
58
- it('calls api.auth.login and saves credentials', async () => {
59
- const response = makeAuthResponse();
60
- mockApi.auth.login = vi.fn().mockResolvedValue(response);
61
- await authService.login('test@example.com', 'password123');
62
- expect(mockApi.auth.login).toHaveBeenCalledWith('test@example.com', 'password123');
63
- expect(mockSaveCredentials).toHaveBeenCalledWith(expect.objectContaining({
64
- accessToken: 'new-access-token',
65
- refreshToken: 'new-refresh-token',
66
- }));
67
- expect(mockClearConfig).toHaveBeenCalled();
68
- });
69
- });
70
- describe('logout', () => {
71
- it('calls api.auth.logout and clears credentials and cache', async () => {
72
- const creds = makeCredentials();
73
- mockLoadCredentials.mockResolvedValue(creds);
74
- mockApi.auth.logout = vi.fn().mockResolvedValue(undefined);
75
- await authService.logout();
76
- expect(mockApi.auth.logout).toHaveBeenCalledWith('access-token');
77
- expect(mockClearCredentials).toHaveBeenCalled();
78
- expect(mockClearConfig).toHaveBeenCalled();
79
- });
80
- it('ignores API errors during logout silently', async () => {
81
- const creds = makeCredentials();
82
- mockLoadCredentials.mockResolvedValue(creds);
83
- mockApi.auth.logout = vi.fn().mockRejectedValue(new Error('Network error'));
84
- await authService.logout();
85
- expect(mockClearCredentials).toHaveBeenCalled();
86
- expect(mockClearConfig).toHaveBeenCalled();
87
- });
88
- });
89
- describe('isAuthenticated', () => {
90
- it('returns true when credentials exist', async () => {
91
- mockLoadCredentials.mockResolvedValue(makeCredentials());
92
- const result = await authService.isAuthenticated();
93
- expect(result).toBe(true);
94
- });
95
- it('returns true when teamKey exists (no credentials)', async () => {
96
- mockLoadCredentials.mockResolvedValue(null);
97
- mockLoadConfig.mockResolvedValue({ teamKey: 'kodus_abc123' });
98
- const result = await authService.isAuthenticated();
99
- expect(result).toBe(true);
100
- });
101
- it('returns false when neither credentials nor teamKey exist', async () => {
102
- mockLoadCredentials.mockResolvedValue(null);
103
- mockLoadConfig.mockResolvedValue(null);
104
- const result = await authService.isAuthenticated();
105
- expect(result).toBe(false);
106
- });
107
- });
108
- describe('getValidToken', () => {
109
- it('returns teamKey when no personal credentials exist', async () => {
110
- mockLoadCredentials.mockResolvedValue(null);
111
- mockLoadConfig.mockResolvedValue({ teamKey: 'kodus_team_key' });
112
- mockLoadCredentials.mockResolvedValue(null);
113
- const token = await authService.getValidToken();
114
- expect(token).toBe('kodus_team_key');
115
- });
116
- it('prefers accessToken when credentials and teamKey both exist', async () => {
117
- mockLoadConfig.mockResolvedValue({ teamKey: 'kodus_team_key' });
118
- const creds = makeCredentials({ expiresAt: Date.now() + 60 * 60 * 1000 });
119
- mockLoadCredentials.mockResolvedValue(creds);
120
- const token = await authService.getValidToken();
121
- expect(token).toBe('access-token');
122
- });
123
- it('returns accessToken when not expired', async () => {
124
- mockLoadConfig.mockResolvedValue(null);
125
- const creds = makeCredentials({ expiresAt: Date.now() + 60 * 60 * 1000 });
126
- mockLoadCredentials.mockResolvedValue(creds);
127
- const token = await authService.getValidToken();
128
- expect(token).toBe('access-token');
129
- });
130
- it('refreshes token when expired and saves new credentials', async () => {
131
- mockLoadConfig.mockResolvedValue(null);
132
- const expiredCreds = makeCredentials({ expiresAt: Date.now() - 1000 });
133
- mockLoadCredentials.mockResolvedValue(expiredCreds);
134
- const newResponse = makeAuthResponse({ accessToken: 'refreshed-token' });
135
- mockApi.auth.refresh = vi.fn().mockResolvedValue(newResponse);
136
- const token = await authService.getValidToken();
137
- expect(token).toBe('refreshed-token');
138
- expect(mockApi.auth.refresh).toHaveBeenCalledWith('refresh-token');
139
- expect(mockSaveCredentials).toHaveBeenCalledWith(expect.objectContaining({ accessToken: 'refreshed-token' }));
140
- });
141
- it('throws AuthError and clears credentials when refresh fails', async () => {
142
- mockLoadConfig.mockResolvedValue(null);
143
- const expiredCreds = makeCredentials({ expiresAt: Date.now() - 1000 });
144
- mockLoadCredentials.mockResolvedValue(expiredCreds);
145
- mockApi.auth.refresh = vi.fn().mockRejectedValue(new Error('refresh failed'));
146
- await expect(authService.getValidToken()).rejects.toThrow(AuthError);
147
- expect(mockClearCredentials).toHaveBeenCalled();
148
- });
149
- it('falls back to teamKey when refresh fails and teamKey exists', async () => {
150
- mockLoadConfig.mockResolvedValue({ teamKey: 'kodus_team_key' });
151
- const expiredCreds = makeCredentials({ expiresAt: Date.now() - 1000 });
152
- mockLoadCredentials.mockResolvedValue(expiredCreds);
153
- mockApi.auth.refresh = vi.fn().mockRejectedValue(new Error('refresh failed'));
154
- const token = await authService.getValidToken();
155
- expect(token).toBe('kodus_team_key');
156
- expect(mockClearCredentials).toHaveBeenCalled();
157
- });
158
- it('deduplicates concurrent refresh requests', async () => {
159
- mockLoadConfig.mockResolvedValue(null);
160
- const expiredCreds = makeCredentials({ expiresAt: Date.now() - 1000 });
161
- mockLoadCredentials.mockResolvedValue(expiredCreds);
162
- const refreshed = makeAuthResponse({ accessToken: 'single-refresh-token' });
163
- mockApi.auth.refresh = vi.fn().mockResolvedValue(refreshed);
164
- const [a, b] = await Promise.all([authService.getValidToken(), authService.getValidToken()]);
165
- expect(a).toBe('single-refresh-token');
166
- expect(b).toBe('single-refresh-token');
167
- expect(mockApi.auth.refresh).toHaveBeenCalledTimes(1);
168
- });
169
- it('throws AuthError when no credentials exist', async () => {
170
- mockLoadConfig.mockResolvedValue(null);
171
- mockLoadCredentials.mockResolvedValue(null);
172
- await expect(authService.getValidToken()).rejects.toThrow(AuthError);
173
- });
174
- });
175
- describe('getCredentials', () => {
176
- it('caches credentials after first load', async () => {
177
- const creds = makeCredentials();
178
- mockLoadCredentials.mockResolvedValue(creds);
179
- const first = await authService.getCredentials();
180
- const second = await authService.getCredentials();
181
- expect(first).toBe(second);
182
- expect(mockLoadCredentials).toHaveBeenCalledTimes(1);
183
- });
184
- });
185
- describe('verifyToken', () => {
186
- it('returns { valid: false } when no credentials exist', async () => {
187
- mockLoadCredentials.mockResolvedValue(null);
188
- const result = await authService.verifyToken();
189
- expect(result).toEqual({ valid: false });
190
- });
191
- it('delegates to api.auth.verify with accessToken', async () => {
192
- const creds = makeCredentials();
193
- mockLoadCredentials.mockResolvedValue(creds);
194
- mockApi.auth.verify = vi.fn().mockResolvedValue({ valid: true, user: { id: 'u1' } });
195
- const result = await authService.verifyToken();
196
- expect(mockApi.auth.verify).toHaveBeenCalledWith('access-token');
197
- expect(result).toEqual({ valid: true, user: { id: 'u1' } });
198
- });
199
- });
200
- });
201
- //# sourceMappingURL=auth.service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.service.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/auth.service.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=git.service.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/git.service.test.ts"],"names":[],"mappings":""}
@@ -1,61 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { gitService } from '../git.service.js';
3
- describe('inferPlatform', () => {
4
- it('detects GitHub from HTTPS URL', () => {
5
- expect(gitService.inferPlatform('https://github.com/org/repo.git')).toBe('GITHUB');
6
- });
7
- it('detects GitHub from SSH URL', () => {
8
- expect(gitService.inferPlatform('git@github.com:org/repo.git')).toBe('GITHUB');
9
- });
10
- it('detects GitLab from HTTPS URL', () => {
11
- expect(gitService.inferPlatform('https://gitlab.com/org/repo.git')).toBe('GITLAB');
12
- });
13
- it('detects GitLab from SSH URL', () => {
14
- expect(gitService.inferPlatform('git@gitlab.com:org/repo.git')).toBe('GITLAB');
15
- });
16
- it('detects Bitbucket from HTTPS URL', () => {
17
- expect(gitService.inferPlatform('https://bitbucket.org/org/repo.git')).toBe('BITBUCKET');
18
- });
19
- it('detects Bitbucket from SSH URL', () => {
20
- expect(gitService.inferPlatform('git@bitbucket.org:org/repo.git')).toBe('BITBUCKET');
21
- });
22
- it('detects Azure DevOps from dev.azure.com URL', () => {
23
- expect(gitService.inferPlatform('https://dev.azure.com/org/project/_git/repo')).toBe('AZURE_REPOS');
24
- });
25
- it('detects Azure DevOps from visualstudio.com URL', () => {
26
- expect(gitService.inferPlatform('https://org.visualstudio.com/project/_git/repo')).toBe('AZURE_REPOS');
27
- });
28
- it('returns undefined for null', () => {
29
- expect(gitService.inferPlatform(null)).toBeUndefined();
30
- });
31
- it('returns undefined for undefined', () => {
32
- expect(gitService.inferPlatform(undefined)).toBeUndefined();
33
- });
34
- it('returns undefined for unknown host', () => {
35
- expect(gitService.inferPlatform('https://selfhosted.example.com/org/repo.git')).toBeUndefined();
36
- });
37
- });
38
- describe('parseGitStatus', () => {
39
- it('maps A to added', () => {
40
- expect(gitService.parseGitStatus('A')).toBe('added');
41
- });
42
- it('maps D to deleted', () => {
43
- expect(gitService.parseGitStatus('D')).toBe('deleted');
44
- });
45
- it('maps R to renamed', () => {
46
- expect(gitService.parseGitStatus('R')).toBe('renamed');
47
- });
48
- it('maps M to modified', () => {
49
- expect(gitService.parseGitStatus('M')).toBe('modified');
50
- });
51
- it('maps unknown char to modified', () => {
52
- expect(gitService.parseGitStatus('X')).toBe('modified');
53
- });
54
- it('handles lowercase input', () => {
55
- expect(gitService.parseGitStatus('a')).toBe('added');
56
- });
57
- it('handles status with trailing info (e.g. R100)', () => {
58
- expect(gitService.parseGitStatus('R100')).toBe('renamed');
59
- });
60
- });
61
- //# sourceMappingURL=git.service.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git.service.test.js","sourceRoot":"","sources":["../../../src/services/__tests__/git.service.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,6CAA6C,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,gDAAgD,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,6CAA6C,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=memory.service.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory.service.test.d.ts","sourceRoot":"","sources":["../../../src/services/__tests__/memory.service.test.ts"],"names":[],"mappings":""}