@kodus/cli 0.4.7 → 0.4.9

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 (316) hide show
  1. package/README.md +77 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +2 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/config.d.ts +1 -5
  6. package/dist/commands/config.d.ts.map +1 -1
  7. package/dist/commands/config.js +10 -71
  8. package/dist/commands/config.js.map +1 -1
  9. package/dist/commands/hook/install.d.ts +1 -1
  10. package/dist/commands/hook/install.d.ts.map +1 -1
  11. package/dist/commands/hook/uninstall.d.ts +1 -1
  12. package/dist/commands/hook/uninstall.d.ts.map +1 -1
  13. package/dist/commands/memory/disable.d.ts +1 -1
  14. package/dist/commands/memory/disable.d.ts.map +1 -1
  15. package/dist/commands/pr.d.ts +1 -2
  16. package/dist/commands/pr.d.ts.map +1 -1
  17. package/dist/commands/pr.js +1 -243
  18. package/dist/commands/pr.js.map +1 -1
  19. package/dist/commands/review.d.ts +1 -2
  20. package/dist/commands/review.d.ts.map +1 -1
  21. package/dist/commands/review.js +1 -314
  22. package/dist/commands/review.js.map +1 -1
  23. package/dist/commands/status.d.ts.map +1 -1
  24. package/dist/commands/status.js +2 -14
  25. package/dist/commands/status.js.map +1 -1
  26. package/dist/commands/update.d.ts +1 -0
  27. package/dist/commands/update.d.ts.map +1 -1
  28. package/dist/commands/update.js +24 -1
  29. package/dist/commands/update.js.map +1 -1
  30. package/dist/features/pr/command.d.ts +4 -0
  31. package/dist/features/pr/command.d.ts.map +1 -0
  32. package/dist/features/pr/command.js +222 -0
  33. package/dist/features/pr/command.js.map +1 -0
  34. package/dist/features/repo-config/actions.d.ts +33 -0
  35. package/dist/features/repo-config/actions.d.ts.map +1 -0
  36. package/dist/features/repo-config/actions.js +260 -0
  37. package/dist/features/repo-config/actions.js.map +1 -0
  38. package/dist/features/repo-config/command.d.ts +15 -0
  39. package/dist/features/repo-config/command.d.ts.map +1 -0
  40. package/dist/features/repo-config/command.js +135 -0
  41. package/dist/features/repo-config/command.js.map +1 -0
  42. package/dist/features/review/command.d.ts +4 -0
  43. package/dist/features/review/command.d.ts.map +1 -0
  44. package/dist/features/review/command.js +248 -0
  45. package/dist/features/review/command.js.map +1 -0
  46. package/dist/features/review/diff.d.ts +23 -0
  47. package/dist/features/review/diff.d.ts.map +1 -0
  48. package/dist/features/review/diff.js +47 -0
  49. package/dist/features/review/diff.js.map +1 -0
  50. package/dist/features/review/errors.d.ts +3 -0
  51. package/dist/features/review/errors.d.ts.map +1 -0
  52. package/dist/features/review/errors.js +26 -0
  53. package/dist/features/review/errors.js.map +1 -0
  54. package/dist/features/review/no-changes.d.ts +6 -0
  55. package/dist/features/review/no-changes.d.ts.map +1 -0
  56. package/dist/features/review/no-changes.js +31 -0
  57. package/dist/features/review/no-changes.js.map +1 -0
  58. package/dist/features/review/options.d.ts +7 -0
  59. package/dist/features/review/options.d.ts.map +1 -0
  60. package/dist/features/review/options.js +18 -0
  61. package/dist/features/review/options.js.map +1 -0
  62. package/dist/features/review/result.d.ts +11 -0
  63. package/dist/features/review/result.d.ts.map +1 -0
  64. package/dist/features/review/result.js +49 -0
  65. package/dist/features/review/result.js.map +1 -0
  66. package/dist/formatters/json.d.ts +1 -1
  67. package/dist/formatters/json.d.ts.map +1 -1
  68. package/dist/formatters/markdown.d.ts +1 -1
  69. package/dist/formatters/markdown.d.ts.map +1 -1
  70. package/dist/formatters/markdown.js.map +1 -1
  71. package/dist/formatters/prompt.d.ts +1 -1
  72. package/dist/formatters/prompt.d.ts.map +1 -1
  73. package/dist/formatters/repo-config.d.ts +7 -0
  74. package/dist/formatters/repo-config.d.ts.map +1 -0
  75. package/dist/formatters/repo-config.js +99 -0
  76. package/dist/formatters/repo-config.js.map +1 -0
  77. package/dist/formatters/terminal.d.ts +1 -1
  78. package/dist/formatters/terminal.d.ts.map +1 -1
  79. package/dist/formatters/terminal.js.map +1 -1
  80. package/dist/index.js +2 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/services/api/api-core.d.ts +15 -0
  83. package/dist/services/api/api-core.d.ts.map +1 -0
  84. package/dist/services/api/api-core.js +292 -0
  85. package/dist/services/api/api-core.js.map +1 -0
  86. package/dist/services/api/api.interface.d.ts +16 -1
  87. package/dist/services/api/api.interface.d.ts.map +1 -1
  88. package/dist/services/api/api.real.d.ts +12 -20
  89. package/dist/services/api/api.real.d.ts.map +1 -1
  90. package/dist/services/api/api.real.js +8 -545
  91. package/dist/services/api/api.real.js.map +1 -1
  92. package/dist/services/api/auth.api.d.ts +17 -0
  93. package/dist/services/api/auth.api.d.ts.map +1 -0
  94. package/dist/services/api/auth.api.js +73 -0
  95. package/dist/services/api/auth.api.js.map +1 -0
  96. package/dist/services/api/config.api.d.ts +24 -0
  97. package/dist/services/api/config.api.d.ts.map +1 -0
  98. package/dist/services/api/config.api.js +78 -0
  99. package/dist/services/api/config.api.js.map +1 -0
  100. package/dist/services/api/memory.api.d.ts +10 -0
  101. package/dist/services/api/memory.api.d.ts.map +1 -0
  102. package/dist/services/api/memory.api.js +19 -0
  103. package/dist/services/api/memory.api.js.map +1 -0
  104. package/dist/services/api/review.api.d.ts +26 -0
  105. package/dist/services/api/review.api.d.ts.map +1 -0
  106. package/dist/services/api/review.api.js +117 -0
  107. package/dist/services/api/review.api.js.map +1 -0
  108. package/dist/services/api/sessions.api.js +1 -1
  109. package/dist/services/api/sessions.api.js.map +1 -1
  110. package/dist/services/api/trial.api.d.ts +10 -0
  111. package/dist/services/api/trial.api.d.ts.map +1 -0
  112. package/dist/services/api/trial.api.js +11 -0
  113. package/dist/services/api/trial.api.js.map +1 -0
  114. package/dist/services/auth.service.d.ts +1 -1
  115. package/dist/services/auth.service.d.ts.map +1 -1
  116. package/dist/services/auth.service.js +1 -1
  117. package/dist/services/auth.service.js.map +1 -1
  118. package/dist/services/context.service.d.ts +1 -1
  119. package/dist/services/context.service.d.ts.map +1 -1
  120. package/dist/services/fix.service.d.ts +1 -1
  121. package/dist/services/fix.service.d.ts.map +1 -1
  122. package/dist/services/git.service.d.ts +2 -2
  123. package/dist/services/git.service.d.ts.map +1 -1
  124. package/dist/services/git.service.js +25 -172
  125. package/dist/services/git.service.js.map +1 -1
  126. package/dist/services/lifecycle-events.d.ts +49 -0
  127. package/dist/services/lifecycle-events.d.ts.map +1 -0
  128. package/dist/services/lifecycle-events.js +86 -0
  129. package/dist/services/lifecycle-events.js.map +1 -0
  130. package/dist/services/lifecycle-git-context.d.ts +15 -0
  131. package/dist/services/lifecycle-git-context.d.ts.map +1 -0
  132. package/dist/services/lifecycle-git-context.js +23 -0
  133. package/dist/services/lifecycle-git-context.js.map +1 -0
  134. package/dist/services/lifecycle-local-turn-state.d.ts +14 -0
  135. package/dist/services/lifecycle-local-turn-state.d.ts.map +1 -0
  136. package/dist/services/lifecycle-local-turn-state.js +18 -0
  137. package/dist/services/lifecycle-local-turn-state.js.map +1 -0
  138. package/dist/services/lifecycle-transcript.d.ts +25 -0
  139. package/dist/services/lifecycle-transcript.d.ts.map +1 -0
  140. package/dist/services/lifecycle-transcript.js +29 -0
  141. package/dist/services/lifecycle-transcript.js.map +1 -0
  142. package/dist/services/lifecycle-turn-data.d.ts +11 -0
  143. package/dist/services/lifecycle-turn-data.d.ts.map +1 -0
  144. package/dist/services/lifecycle-turn-data.js +23 -0
  145. package/dist/services/lifecycle-turn-data.js.map +1 -0
  146. package/dist/services/lifecycle.service.d.ts.map +1 -1
  147. package/dist/services/lifecycle.service.js +63 -132
  148. package/dist/services/lifecycle.service.js.map +1 -1
  149. package/dist/services/repo-config.service.d.ts.map +1 -1
  150. package/dist/services/repo-config.service.js +2 -8
  151. package/dist/services/repo-config.service.js.map +1 -1
  152. package/dist/services/repo-settings-wizard.service.d.ts +19 -0
  153. package/dist/services/repo-settings-wizard.service.d.ts.map +1 -0
  154. package/dist/services/repo-settings-wizard.service.js +260 -0
  155. package/dist/services/repo-settings-wizard.service.js.map +1 -0
  156. package/dist/services/repo-settings.service.d.ts +20 -0
  157. package/dist/services/repo-settings.service.d.ts.map +1 -0
  158. package/dist/services/repo-settings.service.js +86 -0
  159. package/dist/services/repo-settings.service.js.map +1 -0
  160. package/dist/services/review-auth-fallback.d.ts +7 -0
  161. package/dist/services/review-auth-fallback.d.ts.map +1 -0
  162. package/dist/services/review-auth-fallback.js +25 -0
  163. package/dist/services/review-auth-fallback.js.map +1 -0
  164. package/dist/services/review-config-builder.d.ts +19 -0
  165. package/dist/services/review-config-builder.d.ts.map +1 -0
  166. package/dist/services/review-config-builder.js +17 -0
  167. package/dist/services/review-config-builder.js.map +1 -0
  168. package/dist/services/review-file-filter.d.ts +3 -0
  169. package/dist/services/review-file-filter.d.ts.map +1 -0
  170. package/dist/services/review-file-filter.js +35 -0
  171. package/dist/services/review-file-filter.js.map +1 -0
  172. package/dist/services/review-normalizer.d.ts +6 -0
  173. package/dist/services/review-normalizer.d.ts.map +1 -0
  174. package/dist/services/review-normalizer.js +62 -0
  175. package/dist/services/review-normalizer.js.map +1 -0
  176. package/dist/services/review-verbose.d.ts +28 -0
  177. package/dist/services/review-verbose.d.ts.map +1 -0
  178. package/dist/services/review-verbose.js +52 -0
  179. package/dist/services/review-verbose.js.map +1 -0
  180. package/dist/services/review.service.d.ts +1 -5
  181. package/dist/services/review.service.d.ts.map +1 -1
  182. package/dist/services/review.service.js +55 -182
  183. package/dist/services/review.service.js.map +1 -1
  184. package/dist/types/auth.d.ts +18 -0
  185. package/dist/types/auth.d.ts.map +1 -0
  186. package/dist/types/auth.js +2 -0
  187. package/dist/types/auth.js.map +1 -0
  188. package/dist/types/cli.d.ts +33 -0
  189. package/dist/types/cli.d.ts.map +1 -0
  190. package/dist/types/cli.js +2 -0
  191. package/dist/types/cli.js.map +1 -0
  192. package/dist/types/config.d.ts +47 -0
  193. package/dist/types/config.d.ts.map +1 -0
  194. package/dist/types/config.js +2 -0
  195. package/dist/types/config.js.map +1 -0
  196. package/dist/types/errors.d.ts +8 -0
  197. package/dist/types/errors.d.ts.map +1 -0
  198. package/dist/types/errors.js +15 -0
  199. package/dist/types/errors.js.map +1 -0
  200. package/dist/types/index.d.ts +8 -191
  201. package/dist/types/index.d.ts.map +1 -1
  202. package/dist/types/index.js +1 -14
  203. package/dist/types/index.js.map +1 -1
  204. package/dist/types/repo-config.d.ts +24 -0
  205. package/dist/types/repo-config.d.ts.map +1 -0
  206. package/dist/types/repo-config.js +2 -0
  207. package/dist/types/repo-config.js.map +1 -0
  208. package/dist/types/review.d.ts +112 -0
  209. package/dist/types/review.d.ts.map +1 -0
  210. package/dist/types/review.js +2 -0
  211. package/dist/types/review.js.map +1 -0
  212. package/dist/types/trial.d.ts +10 -0
  213. package/dist/types/trial.d.ts.map +1 -0
  214. package/dist/types/trial.js +2 -0
  215. package/dist/types/trial.js.map +1 -0
  216. package/dist/ui/interactive-formatters.d.ts +6 -0
  217. package/dist/ui/interactive-formatters.d.ts.map +1 -0
  218. package/dist/ui/interactive-formatters.js +61 -0
  219. package/dist/ui/interactive-formatters.js.map +1 -0
  220. package/dist/ui/interactive-helpers.d.ts +12 -0
  221. package/dist/ui/interactive-helpers.d.ts.map +1 -0
  222. package/dist/ui/interactive-helpers.js +51 -0
  223. package/dist/ui/interactive-helpers.js.map +1 -0
  224. package/dist/ui/interactive-renderers.d.ts +6 -0
  225. package/dist/ui/interactive-renderers.d.ts.map +1 -0
  226. package/dist/ui/interactive-renderers.js +82 -0
  227. package/dist/ui/interactive-renderers.js.map +1 -0
  228. package/dist/ui/interactive.d.ts +1 -9
  229. package/dist/ui/interactive.d.ts.map +1 -1
  230. package/dist/ui/interactive.js +11 -187
  231. package/dist/ui/interactive.js.map +1 -1
  232. package/dist/utils/auth-mode.d.ts +7 -0
  233. package/dist/utils/auth-mode.d.ts.map +1 -0
  234. package/dist/utils/auth-mode.js +42 -0
  235. package/dist/utils/auth-mode.js.map +1 -0
  236. package/dist/utils/banner.d.ts.map +1 -1
  237. package/dist/utils/banner.js +2 -14
  238. package/dist/utils/banner.js.map +1 -1
  239. package/dist/utils/command-context.d.ts +1 -1
  240. package/dist/utils/command-context.d.ts.map +1 -1
  241. package/dist/utils/command-errors.d.ts.map +1 -1
  242. package/dist/utils/command-errors.js +25 -1
  243. package/dist/utils/command-errors.js.map +1 -1
  244. package/dist/utils/commander-errors.d.ts +8 -0
  245. package/dist/utils/commander-errors.d.ts.map +1 -0
  246. package/dist/utils/commander-errors.js +79 -0
  247. package/dist/utils/commander-errors.js.map +1 -0
  248. package/dist/utils/commander-setup.d.ts +3 -0
  249. package/dist/utils/commander-setup.d.ts.map +1 -0
  250. package/dist/utils/commander-setup.js +10 -0
  251. package/dist/utils/commander-setup.js.map +1 -0
  252. package/dist/utils/credentials.d.ts +1 -1
  253. package/dist/utils/credentials.d.ts.map +1 -1
  254. package/dist/utils/git-diff.d.ts +5 -0
  255. package/dist/utils/git-diff.d.ts.map +1 -0
  256. package/dist/utils/git-diff.js +14 -0
  257. package/dist/utils/git-diff.js.map +1 -0
  258. package/dist/utils/git-file-reader.d.ts +22 -0
  259. package/dist/utils/git-file-reader.d.ts.map +1 -0
  260. package/dist/utils/git-file-reader.js +45 -0
  261. package/dist/utils/git-file-reader.js.map +1 -0
  262. package/dist/utils/git-file-selection.d.ts +14 -0
  263. package/dist/utils/git-file-selection.d.ts.map +1 -0
  264. package/dist/utils/git-file-selection.js +20 -0
  265. package/dist/utils/git-file-selection.js.map +1 -0
  266. package/dist/utils/git-file-targets.d.ts +4 -0
  267. package/dist/utils/git-file-targets.d.ts.map +1 -0
  268. package/dist/utils/git-file-targets.js +11 -0
  269. package/dist/utils/git-file-targets.js.map +1 -0
  270. package/dist/utils/git-remote.d.ts +7 -0
  271. package/dist/utils/git-remote.d.ts.map +1 -0
  272. package/dist/utils/git-remote.js +60 -0
  273. package/dist/utils/git-remote.js.map +1 -0
  274. package/dist/utils/git-status.d.ts +7 -0
  275. package/dist/utils/git-status.d.ts.map +1 -0
  276. package/dist/utils/git-status.js +36 -0
  277. package/dist/utils/git-status.js.map +1 -0
  278. package/dist/utils/input-validation.d.ts +1 -1
  279. package/dist/utils/input-validation.d.ts.map +1 -1
  280. package/dist/utils/rate-limit.d.ts +1 -1
  281. package/dist/utils/repo-settings-dashboard.d.ts +6 -0
  282. package/dist/utils/repo-settings-dashboard.d.ts.map +1 -0
  283. package/dist/utils/repo-settings-dashboard.js +36 -0
  284. package/dist/utils/repo-settings-dashboard.js.map +1 -0
  285. package/dist/utils/repo-settings-patterns.d.ts +7 -0
  286. package/dist/utils/repo-settings-patterns.d.ts.map +1 -0
  287. package/dist/utils/repo-settings-patterns.js +66 -0
  288. package/dist/utils/repo-settings-patterns.js.map +1 -0
  289. package/dist/utils/repo-settings-schema.d.ts +6 -0
  290. package/dist/utils/repo-settings-schema.d.ts.map +1 -0
  291. package/dist/utils/repo-settings-schema.js +70 -0
  292. package/dist/utils/repo-settings-schema.js.map +1 -0
  293. package/dist/utils/review-output.d.ts +4 -0
  294. package/dist/utils/review-output.d.ts.map +1 -0
  295. package/dist/utils/review-output.js +18 -0
  296. package/dist/utils/review-output.js.map +1 -0
  297. package/dist/utils/skills-sync-manifest.d.ts +5 -0
  298. package/dist/utils/skills-sync-manifest.d.ts.map +1 -0
  299. package/dist/utils/skills-sync-manifest.js +39 -0
  300. package/dist/utils/skills-sync-manifest.js.map +1 -0
  301. package/dist/utils/skills-sync-paths.d.ts +5 -0
  302. package/dist/utils/skills-sync-paths.d.ts.map +1 -0
  303. package/dist/utils/skills-sync-paths.js +60 -0
  304. package/dist/utils/skills-sync-paths.js.map +1 -0
  305. package/dist/utils/skills-sync-targets.d.ts +3 -0
  306. package/dist/utils/skills-sync-targets.d.ts.map +1 -0
  307. package/dist/utils/skills-sync-targets.js +211 -0
  308. package/dist/utils/skills-sync-targets.js.map +1 -0
  309. package/dist/utils/skills-sync.d.ts.map +1 -1
  310. package/dist/utils/skills-sync.js +4 -241
  311. package/dist/utils/skills-sync.js.map +1 -1
  312. package/dist/utils/team-key-auth.d.ts +5 -0
  313. package/dist/utils/team-key-auth.d.ts.map +1 -0
  314. package/dist/utils/team-key-auth.js +14 -0
  315. package/dist/utils/team-key-auth.js.map +1 -0
  316. package/package.json +4 -4
@@ -0,0 +1,135 @@
1
+ import { configRemoteAction, configRemoteAddAction, configRepoAddAction, configRepoListAction, configRepoOpenAction, configRepoPatternAddAction, configRepoPatternRemoveAction, configRepoSetAction, configRepoSetupAction, configRepoShowAction, configRepoAction, } from './actions.js';
2
+ import { SUPPORTED_REPO_PATTERN_FIELDS } from '../../utils/repo-settings-patterns.js';
3
+ export const REPOSITORY_CONFIG_DESCRIPTION = "Inspect and update the current repository settings in Kodus. Team-key auth is required for repository config commands. Use 'kodus config -r [repository]' as a shortcut for 'kodus config remote add [repository]'.";
4
+ export function registerRepositoryConfigCommand(command, options = {}) {
5
+ const handlers = options.handlers ?? {
6
+ action: configRemoteAction,
7
+ addAction: configRemoteAddAction,
8
+ };
9
+ command
10
+ .description(options.description ?? REPOSITORY_CONFIG_DESCRIPTION)
11
+ .argument('[repository]', "Repository to add. Use '.' for the current repo.", '.')
12
+ .option('--no-prompt', 'Skip the post-add setup prompt')
13
+ .action(async (repository, actionOptions) => {
14
+ await handlers.action(repository ?? '.', actionOptions);
15
+ });
16
+ command
17
+ .command('add [repository]')
18
+ .description("Add a repository to Kodus. Equivalent to 'kodus config -r [repository]'. Use '.' for the current repo.")
19
+ .option('--no-prompt', 'Skip the post-add setup prompt')
20
+ .action(async (repository, actionOptions) => {
21
+ await handlers.addAction(repository ?? '.', actionOptions);
22
+ });
23
+ command
24
+ .command('list')
25
+ .description('List repositories already configured in Kodus.')
26
+ .option('--json', 'Output configured repositories as JSON')
27
+ .action(async (actionOptions) => {
28
+ await configRepoListAction(actionOptions);
29
+ });
30
+ command
31
+ .command('show [repository]')
32
+ .description("Show repository settings in Kodus. Use '.' for the current repo.")
33
+ .option('--json', 'Output repository settings as JSON')
34
+ .action(async (repository, actionOptions) => {
35
+ await configRepoShowAction(repository ?? '.', actionOptions);
36
+ });
37
+ command
38
+ .command('setup [repository]')
39
+ .description("Run a guided repository setup in Kodus. Use '.' for the current repo.")
40
+ .option('--yes', 'Apply current/default answers without interactive prompts')
41
+ .option('--json', 'Output setup result as JSON')
42
+ .action(async (repository, actionOptions) => {
43
+ await configRepoSetupAction(repository ?? '.', actionOptions);
44
+ });
45
+ command
46
+ .command('set [repository] <key> <value>')
47
+ .description("Set a repository setting directly. Use '.' for the current repo.")
48
+ .option('--json', 'Output updated repository settings as JSON')
49
+ .action(async (repository, key, value, actionOptions) => {
50
+ await configRepoSetAction(repository ?? '.', key, value, actionOptions);
51
+ });
52
+ command
53
+ .command('open [repository]')
54
+ .description("Open the Kodus dashboard for advanced repository settings. Use '.' for the current repo.")
55
+ .option('--section <section>', 'Section to open guidance for (general, review-categories, custom-prompts, suggestion-control, pr-summary, kody-rules, custom-messages, business-rules)')
56
+ .option('--json', 'Output dashboard handoff metadata as JSON')
57
+ .action(async (repository, actionOptions) => {
58
+ await configRepoOpenAction(repository ?? '.', actionOptions);
59
+ });
60
+ command
61
+ .command('add-pattern [repository] <field> <pattern>')
62
+ .description(`Add a pattern to a repository list field. Supported fields: ${SUPPORTED_REPO_PATTERN_FIELDS.join(', ')}`)
63
+ .option('--json', 'Output updated repository settings as JSON')
64
+ .action(async (repository, field, pattern, actionOptions) => {
65
+ await configRepoPatternAddAction(repository ?? '.', field, pattern, actionOptions);
66
+ });
67
+ command
68
+ .command('add-ignore-file [repository] <pattern>')
69
+ .description('Add a pattern to ignored file patterns for the repository.')
70
+ .option('--json', 'Output updated repository settings as JSON')
71
+ .action(async (repository, pattern, actionOptions) => {
72
+ await configRepoPatternAddAction(repository ?? '.', 'ignore-files', pattern, actionOptions);
73
+ });
74
+ command
75
+ .command('remove-ignore-file [repository] <pattern>')
76
+ .description('Remove a pattern from ignored file patterns for the repository.')
77
+ .option('--json', 'Output updated repository settings as JSON')
78
+ .action(async (repository, pattern, actionOptions) => {
79
+ await configRepoPatternRemoveAction(repository ?? '.', 'ignore-files', pattern, actionOptions);
80
+ });
81
+ command
82
+ .command('add-base-branch [repository] <pattern>')
83
+ .description('Add a pattern to base branch patterns for the repository.')
84
+ .option('--json', 'Output updated repository settings as JSON')
85
+ .action(async (repository, pattern, actionOptions) => {
86
+ await configRepoPatternAddAction(repository ?? '.', 'base-branches', pattern, actionOptions);
87
+ });
88
+ command
89
+ .command('remove-base-branch [repository] <pattern>')
90
+ .description('Remove a pattern from base branch patterns for the repository.')
91
+ .option('--json', 'Output updated repository settings as JSON')
92
+ .action(async (repository, pattern, actionOptions) => {
93
+ await configRepoPatternRemoveAction(repository ?? '.', 'base-branches', pattern, actionOptions);
94
+ });
95
+ command
96
+ .command('add-ignore-title [repository] <pattern>')
97
+ .description('Add a pattern to ignored title patterns for the repository.')
98
+ .option('--json', 'Output updated repository settings as JSON')
99
+ .action(async (repository, pattern, actionOptions) => {
100
+ await configRepoPatternAddAction(repository ?? '.', 'ignore-titles', pattern, actionOptions);
101
+ });
102
+ command
103
+ .command('remove-ignore-title [repository] <pattern>')
104
+ .description('Remove a pattern from ignored title patterns for the repository.')
105
+ .option('--json', 'Output updated repository settings as JSON')
106
+ .action(async (repository, pattern, actionOptions) => {
107
+ await configRepoPatternRemoveAction(repository ?? '.', 'ignore-titles', pattern, actionOptions);
108
+ });
109
+ command
110
+ .command('remove-pattern [repository] <field> <pattern>')
111
+ .description(`Remove a pattern from a repository list field. Supported fields: ${SUPPORTED_REPO_PATTERN_FIELDS.join(', ')}`)
112
+ .option('--json', 'Output updated repository settings as JSON')
113
+ .action(async (repository, field, pattern, actionOptions) => {
114
+ await configRepoPatternRemoveAction(repository ?? '.', field, pattern, actionOptions);
115
+ });
116
+ }
117
+ export function registerRemoteRepositoryConfig(command) {
118
+ registerRepositoryConfigCommand(command, {
119
+ description: REPOSITORY_CONFIG_DESCRIPTION,
120
+ handlers: {
121
+ action: configRemoteAction,
122
+ addAction: configRemoteAddAction,
123
+ },
124
+ });
125
+ }
126
+ export function registerRepoAliasConfig(command) {
127
+ registerRepositoryConfigCommand(command, {
128
+ description: REPOSITORY_CONFIG_DESCRIPTION,
129
+ handlers: {
130
+ action: configRepoAction,
131
+ addAction: configRepoAddAction,
132
+ },
133
+ });
134
+ }
135
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/features/repo-config/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createReviewCommand(): Command;
3
+ export declare const reviewCommand: Command;
4
+ //# sourceMappingURL=command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../../src/features/review/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,wBAAgB,mBAAmB,IAAI,OAAO,CAyC7C;AA0UD,eAAO,MAAM,aAAa,SAAwB,CAAC"}
@@ -0,0 +1,248 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import fs from 'fs/promises';
5
+ import { gitService } from '../../services/git.service.js';
6
+ import { reviewService } from '../../services/review.service.js';
7
+ import { authService } from '../../services/auth.service.js';
8
+ import { contextService } from '../../services/context.service.js';
9
+ import { interactiveUI } from '../../ui/interactive.js';
10
+ import { showTrialLimitPrompt, checkTrialStatus, } from '../../utils/rate-limit.js';
11
+ import { exitWithCode } from '../../utils/cli-exit.js';
12
+ import { cliDebug, cliError, cliInfo } from '../../utils/logger.js';
13
+ import { createCommandContext } from '../../utils/command-context.js';
14
+ import { buildAgentErrorEnvelope, buildAgentSuccessEnvelope, emitAgentEnvelope, } from '../../utils/command-output.js';
15
+ import { normalizeCommandError } from '../../utils/command-errors.js';
16
+ import { assertStructuredOutputForFields, parseFieldList, } from '../../utils/input-validation.js';
17
+ import { applyFieldMask } from '../../utils/field-mask.js';
18
+ import { formatReviewOutput } from '../../utils/review-output.js';
19
+ import { resolveReviewDiff } from './diff.js';
20
+ import { buildReviewErrorHints } from './errors.js';
21
+ import { buildNoChangesMessages } from './no-changes.js';
22
+ import { validateReviewOptions } from './options.js';
23
+ import { formatFailOnExitMessage, formatTrialCompletionMessage, shouldFailReview, shouldUseInteractiveReview, } from './result.js';
24
+ export function createReviewCommand() {
25
+ return new Command('review')
26
+ .description(`Analyze modified files for code review
27
+
28
+ Examples:
29
+ kodus review
30
+ kodus review --staged
31
+ kodus review --branch main
32
+ kodus review src/auth.ts src/config.ts
33
+ kodus review --fail-on error`)
34
+ .argument('[files...]', 'Specific files to analyze')
35
+ .option('-s, --staged', 'Analyze only staged files')
36
+ .option('-c, --commit <sha>', 'Analyze diff from a specific commit')
37
+ .option('-b, --branch <name>', 'Compare current branch against specified branch (e.g., main)')
38
+ .option('--rules-only', 'Review using only configured rules (no general suggestions)')
39
+ .option('--fast', 'Fast mode: quicker analysis with lighter checks')
40
+ .option('-i, --interactive', 'Interactive mode: navigate and apply fixes')
41
+ .option('--fix', 'Automatically apply all fixable issues')
42
+ .option('--prompt-only', 'Output optimized for AI agents (minimal, structured)')
43
+ .option('--fail-on <severity>', 'Exit with code 1 if issues meet or exceed severity (info, warning, error, critical)')
44
+ .option('--context <file>', 'Custom context file to include in review')
45
+ .option('--fields <csv>', 'Select response fields (JSON/agent mode only), e.g. summary,issues.file')
46
+ .action(reviewAction);
47
+ }
48
+ async function reviewAction(files, options, cmd) {
49
+ const globalOpts = cmd.optsWithGlobals();
50
+ const ctx = createCommandContext('review', globalOpts);
51
+ const spinner = ora();
52
+ const fields = parseFieldList(options.fields);
53
+ try {
54
+ validateReviewOptions(options);
55
+ assertStructuredOutputForFields({
56
+ fields: options.fields,
57
+ format: globalOpts.format,
58
+ isAgent: ctx.isAgent,
59
+ });
60
+ if (options.promptOnly && !ctx.isAgent) {
61
+ globalOpts.format = 'prompt';
62
+ }
63
+ if (!globalOpts.quiet && !ctx.isAgent) {
64
+ spinner.start(chalk.cyan('Checking authentication...'));
65
+ }
66
+ const isAuthenticated = await authService.isAuthenticated();
67
+ let result;
68
+ if (isAuthenticated) {
69
+ if (!globalOpts.quiet && !ctx.isAgent) {
70
+ spinner.text = chalk.cyan('Getting file changes...');
71
+ }
72
+ let diff = await getDiff(files, options, globalOpts.verbose);
73
+ if (!diff) {
74
+ await handleNoChanges(ctx, spinner, files, options, globalOpts.verbose, globalOpts.quiet);
75
+ return;
76
+ }
77
+ if (!globalOpts.quiet && !ctx.isAgent) {
78
+ spinner.text = chalk.cyan('Reading project context...');
79
+ }
80
+ if (globalOpts.verbose) {
81
+ cliDebug(chalk.dim('[verbose] Reading project context files...'));
82
+ }
83
+ diff = await contextService.enrichDiffWithContext(diff, options.context, globalOpts.verbose);
84
+ if (!globalOpts.quiet && !ctx.isAgent) {
85
+ spinner.text = chalk.cyan('Analyzing code...');
86
+ }
87
+ if (globalOpts.verbose) {
88
+ reviewService.setVerbose(true);
89
+ }
90
+ result = await reviewService.analyze(diff, options.rulesOnly, options.fast, {
91
+ files: files.length > 0 ? files : undefined,
92
+ staged: options.staged,
93
+ commit: options.commit,
94
+ branch: options.branch,
95
+ quiet: globalOpts.quiet,
96
+ });
97
+ const modeLabel = options.fast ? ' (fast mode)' : '';
98
+ if (!globalOpts.quiet && !ctx.isAgent) {
99
+ spinner.succeed(chalk.green(`Review complete!${modeLabel}`));
100
+ }
101
+ }
102
+ else {
103
+ if (!globalOpts.quiet && !ctx.isAgent) {
104
+ spinner.text = chalk.cyan('Running in trial mode...');
105
+ }
106
+ const trialStatus = await checkTrialStatus();
107
+ if (trialStatus.isLimited) {
108
+ spinner.stop();
109
+ showTrialLimitPrompt(trialStatus);
110
+ return;
111
+ }
112
+ if (!globalOpts.quiet && !ctx.isAgent) {
113
+ spinner.text = chalk.cyan('Getting file changes...');
114
+ }
115
+ let diff = await getDiff(files, options, globalOpts.verbose);
116
+ if (!diff) {
117
+ await handleNoChanges(ctx, spinner, files, options, globalOpts.verbose, globalOpts.quiet);
118
+ return;
119
+ }
120
+ if (!globalOpts.quiet && !ctx.isAgent) {
121
+ spinner.text = chalk.cyan('Reading project context...');
122
+ }
123
+ if (globalOpts.verbose) {
124
+ cliDebug(chalk.dim('[verbose] Reading project context files...'));
125
+ }
126
+ diff = await contextService.enrichDiffWithContext(diff, options.context, globalOpts.verbose);
127
+ if (!globalOpts.quiet && !ctx.isAgent) {
128
+ spinner.text = chalk.cyan('Analyzing code (trial mode)...');
129
+ }
130
+ if (globalOpts.verbose) {
131
+ reviewService.setVerbose(true);
132
+ }
133
+ const trialResult = await reviewService.trialAnalyze(diff);
134
+ result = trialResult;
135
+ if (!globalOpts.quiet && !ctx.isAgent) {
136
+ spinner.succeed(chalk.green(formatTrialCompletionMessage(trialResult)));
137
+ }
138
+ }
139
+ if (options.fix) {
140
+ await interactiveUI.runQuickFix(result);
141
+ if (ctx.isAgent) {
142
+ await emitAgentEnvelope(buildAgentSuccessEnvelope(ctx.command, { fixedIssues: true }, ctx.startedAt), ctx.outputFile);
143
+ }
144
+ return;
145
+ }
146
+ const selectedResult = fields ? applyFieldMask(result, fields) : result;
147
+ const shouldUseInteractive = shouldUseInteractiveReview({
148
+ isAgent: ctx.isAgent,
149
+ interactive: options.interactive,
150
+ output: globalOpts.output,
151
+ format: globalOpts.format,
152
+ });
153
+ if (shouldUseInteractive) {
154
+ await interactiveUI.run(result);
155
+ return;
156
+ }
157
+ if (ctx.isAgent) {
158
+ await emitAgentEnvelope(buildAgentSuccessEnvelope(ctx.command, selectedResult, ctx.startedAt), ctx.outputFile);
159
+ }
160
+ else {
161
+ const output = formatReviewOutput(selectedResult, globalOpts.format);
162
+ if (globalOpts.output) {
163
+ await fs.writeFile(globalOpts.output, output, 'utf-8');
164
+ cliInfo(chalk.green(`\nOutput saved to ${globalOpts.output}`));
165
+ }
166
+ else {
167
+ cliInfo(output);
168
+ }
169
+ }
170
+ if (shouldFailReview(result, options.failOn)) {
171
+ const failMessage = formatFailOnExitMessage(result, options.failOn);
172
+ if (failMessage && !ctx.isAgent) {
173
+ cliInfo(chalk.yellow(failMessage));
174
+ }
175
+ exitWithCode(1);
176
+ }
177
+ }
178
+ catch (error) {
179
+ const normalized = normalizeCommandError(error);
180
+ if (ctx.isAgent) {
181
+ await emitAgentEnvelope(buildAgentErrorEnvelope(ctx.command, {
182
+ code: normalized.code,
183
+ message: normalized.message,
184
+ details: normalized.details,
185
+ }, ctx.startedAt), ctx.outputFile);
186
+ if (normalized.exitCode > 0) {
187
+ exitWithCode(normalized.exitCode);
188
+ }
189
+ return;
190
+ }
191
+ if (!globalOpts.quiet && spinner.isSpinning) {
192
+ spinner.fail(chalk.red('Review failed'));
193
+ }
194
+ if (error instanceof Error) {
195
+ cliError(chalk.red(error.message));
196
+ for (const hint of buildReviewErrorHints(normalized)) {
197
+ cliInfo(chalk.dim(hint));
198
+ }
199
+ if (globalOpts.verbose) {
200
+ cliError(error.stack);
201
+ }
202
+ }
203
+ else {
204
+ cliError(chalk.red('An unexpected error occurred'));
205
+ if (globalOpts.verbose) {
206
+ cliError(error);
207
+ }
208
+ }
209
+ exitWithCode(normalized.exitCode);
210
+ }
211
+ }
212
+ async function handleNoChanges(ctx, spinner, files, options, verbose = false, quiet = false) {
213
+ if (ctx.isAgent) {
214
+ await emitAgentEnvelope(buildAgentErrorEnvelope(ctx.command, {
215
+ code: 'NO_CHANGES',
216
+ message: 'No changes to review',
217
+ }, ctx.startedAt), ctx.outputFile);
218
+ return;
219
+ }
220
+ if (!quiet) {
221
+ spinner.fail(chalk.yellow('No changes to review'));
222
+ for (const message of buildNoChangesMessages(files, options)) {
223
+ cliInfo(chalk.dim(message));
224
+ }
225
+ }
226
+ if (verbose) {
227
+ cliDebug(chalk.dim('[verbose] Checked scopes:'));
228
+ cliDebug(chalk.dim(` - Specific files: ${files.length > 0 ? files.join(', ') : 'none'}`));
229
+ cliDebug(chalk.dim(` - Branch comparison: ${options.branch || 'none'}`));
230
+ cliDebug(chalk.dim(` - Commit: ${options.commit || 'none'}`));
231
+ cliDebug(chalk.dim(` - Staged only: ${options.staged ? 'yes' : 'no'}`));
232
+ cliDebug(chalk.dim(` - Default: ${!files.length && !options.branch && !options.commit && !options.staged ? 'working tree (staged + unstaged)' : 'no'}`));
233
+ }
234
+ }
235
+ async function getDiff(files, options, verbose) {
236
+ const result = await resolveReviewDiff({
237
+ files,
238
+ options,
239
+ verbose,
240
+ git: gitService,
241
+ });
242
+ result.verboseMessages.forEach((message) => {
243
+ cliDebug(chalk.dim(message));
244
+ });
245
+ return result.diff;
246
+ }
247
+ export const reviewCommand = createReviewCommand();
248
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../../src/features/review/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ type ReviewDiffGit = {
2
+ setVerbose(verbose: boolean): void;
3
+ getDiffForFiles(files: string[]): Promise<string>;
4
+ getDiffForBranch(branch: string): Promise<string>;
5
+ getDiffForCommit(commit: string): Promise<string>;
6
+ getStagedDiff(): Promise<string>;
7
+ getWorkingTreeDiff(): Promise<string>;
8
+ };
9
+ export declare function resolveReviewDiff({ files, options, verbose, git, }: {
10
+ files: string[];
11
+ options: {
12
+ staged?: boolean;
13
+ commit?: string;
14
+ branch?: string;
15
+ };
16
+ verbose?: boolean;
17
+ git: ReviewDiffGit;
18
+ }): Promise<{
19
+ diff: string;
20
+ verboseMessages: string[];
21
+ }>;
22
+ export {};
23
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/features/review/diff.ts"],"names":[],"mappings":"AAAA,KAAK,aAAa,GAAG;IACjB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzC,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EACpC,KAAK,EACL,OAAO,EACP,OAAO,EACP,GAAG,GACN,EAAE;IACC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE;QACL,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,aAAa,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0DvD"}
@@ -0,0 +1,47 @@
1
+ export async function resolveReviewDiff({ files, options, verbose, git, }) {
2
+ git.setVerbose(!!verbose);
3
+ const verboseMessages = [];
4
+ let diff;
5
+ if (files.length > 0) {
6
+ if (verbose) {
7
+ verboseMessages.push(`[verbose] Getting diff for specific files: ${files.join(', ')}`);
8
+ }
9
+ diff = await git.getDiffForFiles(files);
10
+ }
11
+ else if (options.branch) {
12
+ if (verbose) {
13
+ verboseMessages.push(`[verbose] Getting diff for branch: ${options.branch}`);
14
+ }
15
+ diff = await git.getDiffForBranch(options.branch);
16
+ }
17
+ else if (options.commit) {
18
+ if (verbose) {
19
+ verboseMessages.push(`[verbose] Getting diff for commit: ${options.commit}`);
20
+ }
21
+ diff = await git.getDiffForCommit(options.commit);
22
+ }
23
+ else if (options.staged) {
24
+ if (verbose) {
25
+ verboseMessages.push('[verbose] Getting staged diff only');
26
+ }
27
+ diff = await git.getStagedDiff();
28
+ }
29
+ else {
30
+ if (verbose) {
31
+ verboseMessages.push('[verbose] Getting working tree diff (staged + unstaged)');
32
+ }
33
+ diff = await git.getWorkingTreeDiff();
34
+ }
35
+ if (verbose) {
36
+ verboseMessages.push(`[verbose] Diff result: ${diff ? `${diff.length} characters` : 'empty'}`);
37
+ if (!diff) {
38
+ verboseMessages.push('[verbose] No changes detected in the requested scope');
39
+ }
40
+ else {
41
+ const preview = diff.substring(0, 500);
42
+ verboseMessages.push(`[verbose] Diff preview:\n${preview}${diff.length > 500 ? '\n... (truncated)' : ''}`);
43
+ }
44
+ }
45
+ return { diff, verboseMessages };
46
+ }
47
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/features/review/diff.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACpC,KAAK,EACL,OAAO,EACP,OAAO,EACP,GAAG,GAUN;IACG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAE1B,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,IAAI,IAAY,CAAC;IAEjB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACV,eAAe,CAAC,IAAI,CAChB,8CAA8C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnE,CAAC;QACN,CAAC;QACD,IAAI,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACV,eAAe,CAAC,IAAI,CAChB,sCAAsC,OAAO,CAAC,MAAM,EAAE,CACzD,CAAC;QACN,CAAC;QACD,IAAI,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACV,eAAe,CAAC,IAAI,CAChB,sCAAsC,OAAO,CAAC,MAAM,EAAE,CACzD,CAAC;QACN,CAAC;QACD,IAAI,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,OAAO,EAAE,CAAC;YACV,eAAe,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,GAAG,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;IACrC,CAAC;SAAM,CAAC;QACJ,IAAI,OAAO,EAAE,CAAC;YACV,eAAe,CAAC,IAAI,CAChB,yDAAyD,CAC5D,CAAC;QACN,CAAC;QACD,IAAI,GAAG,MAAM,GAAG,CAAC,kBAAkB,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACV,eAAe,CAAC,IAAI,CAChB,0BAA0B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,CAC3E,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,eAAe,CAAC,IAAI,CAChB,sDAAsD,CACzD,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvC,eAAe,CAAC,IAAI,CAChB,4BAA4B,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE,CACvF,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { NormalizedCommandError } from '../../utils/command-errors.js';
2
+ export declare function buildReviewErrorHints(error: NormalizedCommandError): string[];
3
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/features/review/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,wBAAgB,qBAAqB,CACjC,KAAK,EAAE,sBAAsB,GAC9B,MAAM,EAAE,CAwBV"}
@@ -0,0 +1,26 @@
1
+ export function buildReviewErrorHints(error) {
2
+ switch (error.code) {
3
+ case 'AUTH_REQUIRED':
4
+ return [
5
+ 'Run `kodus auth login` to use your account or `kodus auth team-key --key <your-key>` to use a team key.',
6
+ ];
7
+ case 'API_REQUEST_FAILED':
8
+ if (error.message.includes('Could not reach the Kodus API')) {
9
+ return [
10
+ 'Check `KODUS_API_URL` and make sure the Kodus API is running if you are testing locally.',
11
+ ];
12
+ }
13
+ return [];
14
+ case 'NOT_IN_GIT_REPO':
15
+ return [
16
+ 'Run `kodus review` inside a Git repository, or pass explicit file paths to review.',
17
+ ];
18
+ case 'INVALID_INPUT':
19
+ return [
20
+ 'Run `kodus review --help` to see supported options, examples, and valid flag combinations.',
21
+ ];
22
+ default:
23
+ return [];
24
+ }
25
+ }
26
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/features/review/errors.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CACjC,KAA6B;IAE7B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,eAAe;YAChB,OAAO;gBACH,yGAAyG;aAC5G,CAAC;QACN,KAAK,oBAAoB;YACrB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CAAC;gBAC1D,OAAO;oBACH,0FAA0F;iBAC7F,CAAC;YACN,CAAC;YACD,OAAO,EAAE,CAAC;QACd,KAAK,iBAAiB;YAClB,OAAO;gBACH,oFAAoF;aACvF,CAAC;QACN,KAAK,eAAe;YAChB,OAAO;gBACH,4FAA4F;aAC/F,CAAC;QACN;YACI,OAAO,EAAE,CAAC;IAClB,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function buildNoChangesMessages(files: string[], options: {
2
+ staged?: boolean;
3
+ branch?: string;
4
+ commit?: string;
5
+ }): string[];
6
+ //# sourceMappingURL=no-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-changes.d.ts","sourceRoot":"","sources":["../../../src/features/review/no-changes.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE;IACL,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,GACF,MAAM,EAAE,CAiCV"}
@@ -0,0 +1,31 @@
1
+ export function buildNoChangesMessages(files, options) {
2
+ if (files.length > 0) {
3
+ return [
4
+ 'None of the requested files have diff content in the selected scope.',
5
+ 'Check the file paths or try running `kodus review` without explicit files.',
6
+ ];
7
+ }
8
+ if (options.branch) {
9
+ return [
10
+ `No diff was found against \`${options.branch}\`.`,
11
+ 'Confirm the branch name or try a different base branch.',
12
+ ];
13
+ }
14
+ if (options.commit) {
15
+ return [
16
+ `No diff was found for commit \`${options.commit}\`.`,
17
+ 'Confirm the commit SHA or review a different revision.',
18
+ ];
19
+ }
20
+ if (options.staged) {
21
+ return [
22
+ 'There are no staged changes to review.',
23
+ 'Stage files first or run `kodus review` to inspect the full working tree.',
24
+ ];
25
+ }
26
+ return [
27
+ 'Try `kodus review --staged` to review staged changes only.',
28
+ 'Or pass files explicitly, for example: `kodus review src/file.ts`.',
29
+ ];
30
+ }
31
+ //# sourceMappingURL=no-changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-changes.js","sourceRoot":"","sources":["../../../src/features/review/no-changes.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAClC,KAAe,EACf,OAIC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO;YACH,sEAAsE;YACtE,4EAA4E;SAC/E,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACH,+BAA+B,OAAO,CAAC,MAAM,KAAK;YAClD,yDAAyD;SAC5D,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACH,kCAAkC,OAAO,CAAC,MAAM,KAAK;YACrD,wDAAwD;SAC3D,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO;YACH,wCAAwC;YACxC,2EAA2E;SAC9E,CAAC;IACN,CAAC;IAED,OAAO;QACH,4DAA4D;QAC5D,oEAAoE;KACvE,CAAC;AACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function validateReviewOptions(options: {
2
+ interactive?: boolean;
3
+ fix?: boolean;
4
+ promptOnly?: boolean;
5
+ failOn?: string;
6
+ }): void;
7
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/features/review/options.ts"],"names":[],"mappings":"AAOA,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,IAAI,CAkBP"}
@@ -0,0 +1,18 @@
1
+ const VALID_FAIL_ON_SEVERITIES = new Set([
2
+ 'info',
3
+ 'warning',
4
+ 'error',
5
+ 'critical',
6
+ ]);
7
+ export function validateReviewOptions(options) {
8
+ if (options.interactive && options.promptOnly) {
9
+ throw new Error('The `--interactive` and `--prompt-only` options cannot be used together.');
10
+ }
11
+ if (options.interactive && options.fix) {
12
+ throw new Error('The `--interactive` and `--fix` options cannot be used together.');
13
+ }
14
+ if (options.failOn && !VALID_FAIL_ON_SEVERITIES.has(options.failOn)) {
15
+ throw new Error(`Invalid value for \`--fail-on\`: \`${options.failOn}\`. Use one of: info, warning, error, critical.`);
16
+ }
17
+ }
18
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/features/review/options.ts"],"names":[],"mappings":"AAAA,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC;IACrC,MAAM;IACN,SAAS;IACT,OAAO;IACP,UAAU;CACJ,CAAC,CAAC;AAEZ,MAAM,UAAU,qBAAqB,CAAC,OAKrC;IACG,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACX,0EAA0E,CAC7E,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACX,kEAAkE,CACrE,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAe,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CACX,sCAAsC,OAAO,CAAC,MAAM,iDAAiD,CACxG,CAAC;IACN,CAAC;AACL,CAAC"}