@kodus/cli 0.4.8 → 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.
- package/README.md +77 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/config.d.ts +1 -5
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +10 -71
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/hook/install.d.ts +1 -1
- package/dist/commands/hook/install.d.ts.map +1 -1
- package/dist/commands/hook/uninstall.d.ts +1 -1
- package/dist/commands/hook/uninstall.d.ts.map +1 -1
- package/dist/commands/memory/disable.d.ts +1 -1
- package/dist/commands/memory/disable.d.ts.map +1 -1
- package/dist/commands/pr.d.ts +1 -2
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +1 -243
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/review.d.ts +1 -2
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +1 -314
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -14
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +24 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/features/pr/command.d.ts +4 -0
- package/dist/features/pr/command.d.ts.map +1 -0
- package/dist/features/pr/command.js +222 -0
- package/dist/features/pr/command.js.map +1 -0
- package/dist/features/repo-config/actions.d.ts +33 -0
- package/dist/features/repo-config/actions.d.ts.map +1 -0
- package/dist/features/repo-config/actions.js +260 -0
- package/dist/features/repo-config/actions.js.map +1 -0
- package/dist/features/repo-config/command.d.ts +15 -0
- package/dist/features/repo-config/command.d.ts.map +1 -0
- package/dist/features/repo-config/command.js +135 -0
- package/dist/features/repo-config/command.js.map +1 -0
- package/dist/features/review/command.d.ts +4 -0
- package/dist/features/review/command.d.ts.map +1 -0
- package/dist/features/review/command.js +248 -0
- package/dist/features/review/command.js.map +1 -0
- package/dist/features/review/diff.d.ts +23 -0
- package/dist/features/review/diff.d.ts.map +1 -0
- package/dist/features/review/diff.js +47 -0
- package/dist/features/review/diff.js.map +1 -0
- package/dist/features/review/errors.d.ts +3 -0
- package/dist/features/review/errors.d.ts.map +1 -0
- package/dist/features/review/errors.js +26 -0
- package/dist/features/review/errors.js.map +1 -0
- package/dist/features/review/no-changes.d.ts +6 -0
- package/dist/features/review/no-changes.d.ts.map +1 -0
- package/dist/features/review/no-changes.js +31 -0
- package/dist/features/review/no-changes.js.map +1 -0
- package/dist/features/review/options.d.ts +7 -0
- package/dist/features/review/options.d.ts.map +1 -0
- package/dist/features/review/options.js +18 -0
- package/dist/features/review/options.js.map +1 -0
- package/dist/features/review/result.d.ts +11 -0
- package/dist/features/review/result.d.ts.map +1 -0
- package/dist/features/review/result.js +49 -0
- package/dist/features/review/result.js.map +1 -0
- package/dist/formatters/json.d.ts +1 -1
- package/dist/formatters/json.d.ts.map +1 -1
- package/dist/formatters/markdown.d.ts +1 -1
- package/dist/formatters/markdown.d.ts.map +1 -1
- package/dist/formatters/markdown.js.map +1 -1
- package/dist/formatters/prompt.d.ts +1 -1
- package/dist/formatters/prompt.d.ts.map +1 -1
- package/dist/formatters/repo-config.d.ts +7 -0
- package/dist/formatters/repo-config.d.ts.map +1 -0
- package/dist/formatters/repo-config.js +99 -0
- package/dist/formatters/repo-config.js.map +1 -0
- package/dist/formatters/terminal.d.ts +1 -1
- package/dist/formatters/terminal.d.ts.map +1 -1
- package/dist/formatters/terminal.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/api/api-core.d.ts +15 -0
- package/dist/services/api/api-core.d.ts.map +1 -0
- package/dist/services/api/api-core.js +292 -0
- package/dist/services/api/api-core.js.map +1 -0
- package/dist/services/api/api.interface.d.ts +16 -1
- package/dist/services/api/api.interface.d.ts.map +1 -1
- package/dist/services/api/api.real.d.ts +12 -20
- package/dist/services/api/api.real.d.ts.map +1 -1
- package/dist/services/api/api.real.js +8 -545
- package/dist/services/api/api.real.js.map +1 -1
- package/dist/services/api/auth.api.d.ts +17 -0
- package/dist/services/api/auth.api.d.ts.map +1 -0
- package/dist/services/api/auth.api.js +73 -0
- package/dist/services/api/auth.api.js.map +1 -0
- package/dist/services/api/config.api.d.ts +24 -0
- package/dist/services/api/config.api.d.ts.map +1 -0
- package/dist/services/api/config.api.js +78 -0
- package/dist/services/api/config.api.js.map +1 -0
- package/dist/services/api/memory.api.d.ts +10 -0
- package/dist/services/api/memory.api.d.ts.map +1 -0
- package/dist/services/api/memory.api.js +19 -0
- package/dist/services/api/memory.api.js.map +1 -0
- package/dist/services/api/review.api.d.ts +26 -0
- package/dist/services/api/review.api.d.ts.map +1 -0
- package/dist/services/api/review.api.js +117 -0
- package/dist/services/api/review.api.js.map +1 -0
- package/dist/services/api/sessions.api.js +1 -1
- package/dist/services/api/sessions.api.js.map +1 -1
- package/dist/services/api/trial.api.d.ts +10 -0
- package/dist/services/api/trial.api.d.ts.map +1 -0
- package/dist/services/api/trial.api.js +11 -0
- package/dist/services/api/trial.api.js.map +1 -0
- package/dist/services/auth.service.d.ts +1 -1
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +1 -1
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/context.service.d.ts +1 -1
- package/dist/services/context.service.d.ts.map +1 -1
- package/dist/services/fix.service.d.ts +1 -1
- package/dist/services/fix.service.d.ts.map +1 -1
- package/dist/services/git.service.d.ts +2 -2
- package/dist/services/git.service.d.ts.map +1 -1
- package/dist/services/git.service.js +25 -172
- package/dist/services/git.service.js.map +1 -1
- package/dist/services/lifecycle-events.d.ts +49 -0
- package/dist/services/lifecycle-events.d.ts.map +1 -0
- package/dist/services/lifecycle-events.js +86 -0
- package/dist/services/lifecycle-events.js.map +1 -0
- package/dist/services/lifecycle-git-context.d.ts +15 -0
- package/dist/services/lifecycle-git-context.d.ts.map +1 -0
- package/dist/services/lifecycle-git-context.js +23 -0
- package/dist/services/lifecycle-git-context.js.map +1 -0
- package/dist/services/lifecycle-local-turn-state.d.ts +14 -0
- package/dist/services/lifecycle-local-turn-state.d.ts.map +1 -0
- package/dist/services/lifecycle-local-turn-state.js +18 -0
- package/dist/services/lifecycle-local-turn-state.js.map +1 -0
- package/dist/services/lifecycle-transcript.d.ts +25 -0
- package/dist/services/lifecycle-transcript.d.ts.map +1 -0
- package/dist/services/lifecycle-transcript.js +29 -0
- package/dist/services/lifecycle-transcript.js.map +1 -0
- package/dist/services/lifecycle-turn-data.d.ts +11 -0
- package/dist/services/lifecycle-turn-data.d.ts.map +1 -0
- package/dist/services/lifecycle-turn-data.js +23 -0
- package/dist/services/lifecycle-turn-data.js.map +1 -0
- package/dist/services/lifecycle.service.d.ts.map +1 -1
- package/dist/services/lifecycle.service.js +63 -132
- package/dist/services/lifecycle.service.js.map +1 -1
- package/dist/services/repo-config.service.d.ts.map +1 -1
- package/dist/services/repo-config.service.js +2 -8
- package/dist/services/repo-config.service.js.map +1 -1
- package/dist/services/repo-settings-wizard.service.d.ts +19 -0
- package/dist/services/repo-settings-wizard.service.d.ts.map +1 -0
- package/dist/services/repo-settings-wizard.service.js +260 -0
- package/dist/services/repo-settings-wizard.service.js.map +1 -0
- package/dist/services/repo-settings.service.d.ts +20 -0
- package/dist/services/repo-settings.service.d.ts.map +1 -0
- package/dist/services/repo-settings.service.js +86 -0
- package/dist/services/repo-settings.service.js.map +1 -0
- package/dist/services/review-auth-fallback.d.ts +7 -0
- package/dist/services/review-auth-fallback.d.ts.map +1 -0
- package/dist/services/review-auth-fallback.js +25 -0
- package/dist/services/review-auth-fallback.js.map +1 -0
- package/dist/services/review-config-builder.d.ts +19 -0
- package/dist/services/review-config-builder.d.ts.map +1 -0
- package/dist/services/review-config-builder.js +17 -0
- package/dist/services/review-config-builder.js.map +1 -0
- package/dist/services/review-file-filter.d.ts +3 -0
- package/dist/services/review-file-filter.d.ts.map +1 -0
- package/dist/services/review-file-filter.js +35 -0
- package/dist/services/review-file-filter.js.map +1 -0
- package/dist/services/review-normalizer.d.ts +6 -0
- package/dist/services/review-normalizer.d.ts.map +1 -0
- package/dist/services/review-normalizer.js +62 -0
- package/dist/services/review-normalizer.js.map +1 -0
- package/dist/services/review-verbose.d.ts +28 -0
- package/dist/services/review-verbose.d.ts.map +1 -0
- package/dist/services/review-verbose.js +52 -0
- package/dist/services/review-verbose.js.map +1 -0
- package/dist/services/review.service.d.ts +1 -5
- package/dist/services/review.service.d.ts.map +1 -1
- package/dist/services/review.service.js +55 -182
- package/dist/services/review.service.js.map +1 -1
- package/dist/types/auth.d.ts +18 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +2 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/cli.d.ts +33 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +2 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.d.ts +47 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +8 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +15 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +8 -191
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -14
- package/dist/types/index.js.map +1 -1
- package/dist/types/repo-config.d.ts +24 -0
- package/dist/types/repo-config.d.ts.map +1 -0
- package/dist/types/repo-config.js +2 -0
- package/dist/types/repo-config.js.map +1 -0
- package/dist/types/review.d.ts +112 -0
- package/dist/types/review.d.ts.map +1 -0
- package/dist/types/review.js +2 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/trial.d.ts +10 -0
- package/dist/types/trial.d.ts.map +1 -0
- package/dist/types/trial.js +2 -0
- package/dist/types/trial.js.map +1 -0
- package/dist/ui/interactive-formatters.d.ts +6 -0
- package/dist/ui/interactive-formatters.d.ts.map +1 -0
- package/dist/ui/interactive-formatters.js +61 -0
- package/dist/ui/interactive-formatters.js.map +1 -0
- package/dist/ui/interactive-helpers.d.ts +12 -0
- package/dist/ui/interactive-helpers.d.ts.map +1 -0
- package/dist/ui/interactive-helpers.js +51 -0
- package/dist/ui/interactive-helpers.js.map +1 -0
- package/dist/ui/interactive-renderers.d.ts +6 -0
- package/dist/ui/interactive-renderers.d.ts.map +1 -0
- package/dist/ui/interactive-renderers.js +82 -0
- package/dist/ui/interactive-renderers.js.map +1 -0
- package/dist/ui/interactive.d.ts +1 -9
- package/dist/ui/interactive.d.ts.map +1 -1
- package/dist/ui/interactive.js +11 -187
- package/dist/ui/interactive.js.map +1 -1
- package/dist/utils/auth-mode.d.ts +7 -0
- package/dist/utils/auth-mode.d.ts.map +1 -0
- package/dist/utils/auth-mode.js +42 -0
- package/dist/utils/auth-mode.js.map +1 -0
- package/dist/utils/banner.d.ts.map +1 -1
- package/dist/utils/banner.js +2 -14
- package/dist/utils/banner.js.map +1 -1
- package/dist/utils/command-context.d.ts +1 -1
- package/dist/utils/command-context.d.ts.map +1 -1
- package/dist/utils/command-errors.d.ts.map +1 -1
- package/dist/utils/command-errors.js +25 -1
- package/dist/utils/command-errors.js.map +1 -1
- package/dist/utils/commander-errors.d.ts +8 -0
- package/dist/utils/commander-errors.d.ts.map +1 -0
- package/dist/utils/commander-errors.js +79 -0
- package/dist/utils/commander-errors.js.map +1 -0
- package/dist/utils/commander-setup.d.ts +3 -0
- package/dist/utils/commander-setup.d.ts.map +1 -0
- package/dist/utils/commander-setup.js +10 -0
- package/dist/utils/commander-setup.js.map +1 -0
- package/dist/utils/credentials.d.ts +1 -1
- package/dist/utils/credentials.d.ts.map +1 -1
- package/dist/utils/git-diff.d.ts +5 -0
- package/dist/utils/git-diff.d.ts.map +1 -0
- package/dist/utils/git-diff.js +14 -0
- package/dist/utils/git-diff.js.map +1 -0
- package/dist/utils/git-file-reader.d.ts +22 -0
- package/dist/utils/git-file-reader.d.ts.map +1 -0
- package/dist/utils/git-file-reader.js +45 -0
- package/dist/utils/git-file-reader.js.map +1 -0
- package/dist/utils/git-file-selection.d.ts +14 -0
- package/dist/utils/git-file-selection.d.ts.map +1 -0
- package/dist/utils/git-file-selection.js +20 -0
- package/dist/utils/git-file-selection.js.map +1 -0
- package/dist/utils/git-file-targets.d.ts +4 -0
- package/dist/utils/git-file-targets.d.ts.map +1 -0
- package/dist/utils/git-file-targets.js +11 -0
- package/dist/utils/git-file-targets.js.map +1 -0
- package/dist/utils/git-remote.d.ts +7 -0
- package/dist/utils/git-remote.d.ts.map +1 -0
- package/dist/utils/git-remote.js +60 -0
- package/dist/utils/git-remote.js.map +1 -0
- package/dist/utils/git-status.d.ts +7 -0
- package/dist/utils/git-status.d.ts.map +1 -0
- package/dist/utils/git-status.js +36 -0
- package/dist/utils/git-status.js.map +1 -0
- package/dist/utils/input-validation.d.ts +1 -1
- package/dist/utils/input-validation.d.ts.map +1 -1
- package/dist/utils/rate-limit.d.ts +1 -1
- package/dist/utils/repo-settings-dashboard.d.ts +6 -0
- package/dist/utils/repo-settings-dashboard.d.ts.map +1 -0
- package/dist/utils/repo-settings-dashboard.js +36 -0
- package/dist/utils/repo-settings-dashboard.js.map +1 -0
- package/dist/utils/repo-settings-patterns.d.ts +7 -0
- package/dist/utils/repo-settings-patterns.d.ts.map +1 -0
- package/dist/utils/repo-settings-patterns.js +66 -0
- package/dist/utils/repo-settings-patterns.js.map +1 -0
- package/dist/utils/repo-settings-schema.d.ts +6 -0
- package/dist/utils/repo-settings-schema.d.ts.map +1 -0
- package/dist/utils/repo-settings-schema.js +70 -0
- package/dist/utils/repo-settings-schema.js.map +1 -0
- package/dist/utils/review-output.d.ts +4 -0
- package/dist/utils/review-output.d.ts.map +1 -0
- package/dist/utils/review-output.js +18 -0
- package/dist/utils/review-output.js.map +1 -0
- package/dist/utils/skills-sync-manifest.d.ts +5 -0
- package/dist/utils/skills-sync-manifest.d.ts.map +1 -0
- package/dist/utils/skills-sync-manifest.js +39 -0
- package/dist/utils/skills-sync-manifest.js.map +1 -0
- package/dist/utils/skills-sync-paths.d.ts +5 -0
- package/dist/utils/skills-sync-paths.d.ts.map +1 -0
- package/dist/utils/skills-sync-paths.js +60 -0
- package/dist/utils/skills-sync-paths.js.map +1 -0
- package/dist/utils/skills-sync-targets.d.ts +3 -0
- package/dist/utils/skills-sync-targets.d.ts.map +1 -0
- package/dist/utils/skills-sync-targets.js +211 -0
- package/dist/utils/skills-sync-targets.js.map +1 -0
- package/dist/utils/skills-sync.d.ts.map +1 -1
- package/dist/utils/skills-sync.js +4 -253
- package/dist/utils/skills-sync.js.map +1 -1
- package/dist/utils/team-key-auth.d.ts +5 -0
- package/dist/utils/team-key-auth.d.ts.map +1 -0
- package/dist/utils/team-key-auth.js +14 -0
- package/dist/utils/team-key-auth.js.map +1 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -521,6 +521,82 @@ Get your team key at [app.kodus.io/organization/cli-keys](https://app.kodus.io/o
|
|
|
521
521
|
|
|
522
522
|
This is also the recommended auth method for AI coding agents (Claude Code, Cursor, Codex) — set the env var once and every agent session is authenticated automatically.
|
|
523
523
|
|
|
524
|
+
### Repository Configuration
|
|
525
|
+
|
|
526
|
+
Repository configuration requires team-key auth:
|
|
527
|
+
|
|
528
|
+
- team keys work across `add`, `list`, `show`, `setup`, `set`, and pattern mutations through the CLI config endpoints
|
|
529
|
+
|
|
530
|
+
These commands always read and update the repository's current settings directly. There is no reset-to-default flow in the CLI.
|
|
531
|
+
|
|
532
|
+
`kodus config -r` and `kodus config --remote` are shortcuts for `kodus config remote add`.
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
kodus config -r . # Shortcut for: kodus config remote add .
|
|
536
|
+
kodus config --remote . # Shortcut for: kodus config remote add .
|
|
537
|
+
kodus config --remote . --json # Add and print machine-readable result
|
|
538
|
+
kodus config --remote . --no-prompt # Add without starting setup
|
|
539
|
+
kodus config remote add . # Add the current repository explicitly
|
|
540
|
+
kodus config remote show . # Inspect current repository settings
|
|
541
|
+
kodus config remote setup . # Run guided setup again
|
|
542
|
+
kodus config remote setup . --json # Print structured setup result
|
|
543
|
+
kodus config remote set . review.enabled true
|
|
544
|
+
kodus config remote set . review.enabled true --json
|
|
545
|
+
kodus config remote set . patterns.ignoreFiles "**/*.lock,dist/**"
|
|
546
|
+
kodus config remote add-pattern . ignore-files "dist/**"
|
|
547
|
+
kodus config remote add-ignore-file . "dist/**"
|
|
548
|
+
kodus config remote remove-base-branch . "release/*"
|
|
549
|
+
kodus config remote remove-pattern . base-branches "release/*"
|
|
550
|
+
kodus config remote open . --section suggestion-control
|
|
551
|
+
kodus config remote list --json
|
|
552
|
+
kodus config remote list # List repositories already configured
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
When a repository is added from an interactive terminal, Kodus offers a guided setup for:
|
|
556
|
+
|
|
557
|
+
- automated review
|
|
558
|
+
- auto approve
|
|
559
|
+
- minimum severity level
|
|
560
|
+
- ignored file patterns
|
|
561
|
+
- base branch patterns
|
|
562
|
+
- ignored title patterns
|
|
563
|
+
|
|
564
|
+
Pattern fields accept glob expressions such as `**/*.lock`, `dist/**`, `release/*`, and `draft*`.
|
|
565
|
+
|
|
566
|
+
Use `kodus config remote open` when you need advanced repository settings that are still web-only. The CLI opens the Kodus app and prints the repository/section path to navigate.
|
|
567
|
+
|
|
568
|
+
Use `--json` with `show`, `set`, `open`, `add-pattern`, `remove-pattern`, and the pattern aliases when you need stable machine-readable output for scripts or AI agents.
|
|
569
|
+
|
|
570
|
+
When targeting a repository that is different from your current working directory, pass `owner/repo` explicitly instead of `.`:
|
|
571
|
+
|
|
572
|
+
```bash
|
|
573
|
+
kodus config -r Wellington01/kodus-extension
|
|
574
|
+
kodus config remote show Wellington01/kodus-extension
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
#### Local API note
|
|
578
|
+
|
|
579
|
+
When testing against the local backend with `yarn start:local`, repository configuration works with a team key when the local API exposes:
|
|
580
|
+
|
|
581
|
+
- `GET /cli/config/repositories/available`
|
|
582
|
+
- `GET /cli/config/repositories/selected`
|
|
583
|
+
- `POST /cli/config/repositories`
|
|
584
|
+
- `GET /cli/config/repositories/:repositoryId/settings`
|
|
585
|
+
- `PATCH /cli/config/repositories/:repositoryId/settings`
|
|
586
|
+
|
|
587
|
+
```text
|
|
588
|
+
Repository configuration access denied: ...
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Example local commands:
|
|
592
|
+
|
|
593
|
+
```bash
|
|
594
|
+
export KODUS_TEAM_KEY=kodus_xxxxx
|
|
595
|
+
yarn start:local config -r Wellington01/kodus-extension --no-prompt
|
|
596
|
+
yarn start:local config remote list --json
|
|
597
|
+
yarn start:local config remote show Wellington01/kodus-extension
|
|
598
|
+
```
|
|
599
|
+
|
|
524
600
|
### CI/CD Token
|
|
525
601
|
|
|
526
602
|
For pipelines and automated environments. Generated from your personal login:
|
|
@@ -544,6 +620,7 @@ kodus review --format json --fail-on error
|
|
|
544
620
|
| Variable | Description |
|
|
545
621
|
| ---------------- | ------------------------------------------------------------------------------ |
|
|
546
622
|
| `KODUS_API_URL` | API endpoint (default: `https://api.kodus.io`). HTTPS only (except localhost). |
|
|
623
|
+
| `KODUS_APP_URL` | Optional Kodus app URL override for `kodus config remote open`. |
|
|
547
624
|
| `KODUS_TOKEN` | CI/CD token for automated pipelines (generated via `kodus auth token`) |
|
|
548
625
|
| `KODUS_TEAM_KEY` | Team key for shared team access and AI coding agents |
|
|
549
626
|
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,QAAA,MAAM,OAAO,SAAgB,CAAC;AA+C9B,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -14,10 +14,10 @@ import { configCommand } from './commands/config.js';
|
|
|
14
14
|
import { checkForUpdates } from './utils/update-check.js';
|
|
15
15
|
import { setCliOutputMode } from './utils/logger.js';
|
|
16
16
|
import { recordRecentActivity } from './utils/recent-activity.js';
|
|
17
|
+
import { applyCommanderBehavior } from './utils/commander-setup.js';
|
|
17
18
|
const require = createRequire(import.meta.url);
|
|
18
19
|
const pkg = require('../package.json');
|
|
19
20
|
const program = new Command();
|
|
20
|
-
program.exitOverride();
|
|
21
21
|
program
|
|
22
22
|
.name('kodus')
|
|
23
23
|
.description('Kodus CLI - AI-powered code review from your terminal')
|
|
@@ -38,6 +38,7 @@ program.addCommand(statusCommand);
|
|
|
38
38
|
program.addCommand(skillsCommand);
|
|
39
39
|
program.addCommand(configCommand);
|
|
40
40
|
program.addCommand(createSchemaCommand(() => program));
|
|
41
|
+
applyCommanderBehavior(program);
|
|
41
42
|
program.hook('preAction', (_thisCommand, actionCommand) => {
|
|
42
43
|
const opts = actionCommand.optsWithGlobals();
|
|
43
44
|
setCliOutputMode({
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
export
|
|
3
|
-
export declare function configRepoAddAction(repository?: string): Promise<void>;
|
|
4
|
-
export declare function configRemoteAction(repository?: string): Promise<void>;
|
|
5
|
-
export declare function configRemoteAddAction(repository?: string): Promise<void>;
|
|
6
|
-
export declare function configRepoListAction(): Promise<void>;
|
|
2
|
+
export { configRemoteAction, configRemoteAddAction, configRepoAction, configRepoAddAction, configRepoListAction, configRepoShowAction, configRepoSetupAction, configRepoOpenAction, configRepoSetAction, configRepoPatternAddAction, configRepoPatternRemoveAction, } from '../features/repo-config/actions.js';
|
|
7
3
|
export declare const configCommand: Command;
|
|
8
4
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,GAChC,MAAM,oCAAoC,CAAC;AAE5C,eAAO,MAAM,aAAa,SAEzB,CAAC"}
|
package/dist/commands/config.js
CHANGED
|
@@ -1,84 +1,23 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import { cliError, cliInfo } from '../utils/logger.js';
|
|
6
|
-
import { normalizeCommandError } from '../utils/command-errors.js';
|
|
7
|
-
export async function configRepoAction(repository = '.') {
|
|
8
|
-
try {
|
|
9
|
-
const result = await repoConfigService.addRepository(repository);
|
|
10
|
-
if (result.status === 'already-added') {
|
|
11
|
-
cliInfo(chalk.yellow(`Repository '${result.repositoryFullName}' is already added to Kodus.`));
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
cliInfo(chalk.green(`Repository '${result.repositoryFullName}' was added to Kodus successfully.`));
|
|
15
|
-
}
|
|
16
|
-
catch (error) {
|
|
17
|
-
const normalized = normalizeCommandError(error);
|
|
18
|
-
cliError(chalk.red(normalized.message));
|
|
19
|
-
exitWithCode(normalized.exitCode);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
export async function configRepoAddAction(repository = '.') {
|
|
23
|
-
await configRepoAction(repository);
|
|
24
|
-
}
|
|
25
|
-
export async function configRemoteAction(repository = '.') {
|
|
26
|
-
await configRepoAction(repository);
|
|
27
|
-
}
|
|
28
|
-
export async function configRemoteAddAction(repository = '.') {
|
|
29
|
-
await configRepoAction(repository);
|
|
30
|
-
}
|
|
31
|
-
export async function configRepoListAction() {
|
|
32
|
-
try {
|
|
33
|
-
const repositories = await repoConfigService.listRepositories();
|
|
34
|
-
if (repositories.length === 0) {
|
|
35
|
-
cliInfo(chalk.yellow('No repositories are currently configured.'));
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
cliInfo('Configured repositories:');
|
|
39
|
-
for (const repository of repositories) {
|
|
40
|
-
cliInfo(`- ${repository.fullName}`);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
const normalized = normalizeCommandError(error);
|
|
45
|
-
cliError(chalk.red(normalized.message));
|
|
46
|
-
exitWithCode(normalized.exitCode);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
2
|
+
import { configRemoteAction, } from '../features/repo-config/actions.js';
|
|
3
|
+
import { registerRemoteRepositoryConfig, registerRepoAliasConfig, } from '../features/repo-config/command.js';
|
|
4
|
+
export { configRemoteAction, configRemoteAddAction, configRepoAction, configRepoAddAction, configRepoListAction, configRepoShowAction, configRepoSetupAction, configRepoOpenAction, configRepoSetAction, configRepoPatternAddAction, configRepoPatternRemoveAction, } from '../features/repo-config/actions.js';
|
|
49
5
|
export const configCommand = new Command('config').description('Configuration commands');
|
|
50
6
|
configCommand
|
|
51
|
-
.option('-r, --remote [repository]', "Add
|
|
7
|
+
.option('-r, --remote [repository]', "Add a repository to Kodus. Shortcut for: kodus config remote add [repository]. Use '.' for the current repo.")
|
|
8
|
+
.option('--no-prompt', 'Skip the post-add setup prompt')
|
|
52
9
|
.action(async (options, command) => {
|
|
53
10
|
if (options.remote !== undefined) {
|
|
54
11
|
const repository = typeof options.remote === 'string' ? options.remote : '.';
|
|
55
|
-
await configRemoteAction(repository
|
|
12
|
+
await configRemoteAction(repository, {
|
|
13
|
+
prompt: options.prompt,
|
|
14
|
+
});
|
|
56
15
|
return;
|
|
57
16
|
}
|
|
58
17
|
command.help();
|
|
59
18
|
});
|
|
60
|
-
|
|
61
|
-
command
|
|
62
|
-
.description(description)
|
|
63
|
-
.argument('[repository]', "Repository to add. Use '.' for the current repo.", '.')
|
|
64
|
-
.action(handlers.action);
|
|
65
|
-
command
|
|
66
|
-
.command('add [repository]')
|
|
67
|
-
.description("Add a repository to Kodus. Use '.' for the current repo.")
|
|
68
|
-
.action(handlers.addAction);
|
|
69
|
-
command
|
|
70
|
-
.command('list')
|
|
71
|
-
.description('List repositories already configured in Kodus.')
|
|
72
|
-
.action(configRepoListAction);
|
|
73
|
-
}
|
|
74
|
-
registerRemoteRepositoryConfig(configCommand.command('remote'), 'Manage remote repository configuration in Kodus.', {
|
|
75
|
-
action: configRemoteAction,
|
|
76
|
-
addAction: configRemoteAddAction,
|
|
77
|
-
});
|
|
19
|
+
registerRemoteRepositoryConfig(configCommand.command('remote'));
|
|
78
20
|
const repoAliasCommand = configCommand.command('repo');
|
|
79
21
|
repoAliasCommand._hidden = true;
|
|
80
|
-
|
|
81
|
-
action: configRepoAction,
|
|
82
|
-
addAction: configRepoAddAction,
|
|
83
|
-
});
|
|
22
|
+
registerRepoAliasConfig(repoAliasCommand);
|
|
84
23
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACH,kBAAkB,GAErB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,8BAA8B,EAC9B,uBAAuB,GAC1B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACH,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,0BAA0B,EAC1B,6BAA6B,GAChC,MAAM,oCAAoC,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAC1D,wBAAwB,CAC3B,CAAC;AAEF,aAAa;KACR,MAAM,CACH,2BAA2B,EAC3B,8GAA8G,CACjH;KACA,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,UAAU,GACZ,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9D,MAAM,kBAAkB,CAAC,UAAU,EAAE;YACjC,MAAM,EAAG,OAAgC,CAAC,MAAM;SACnD,CAAC,CAAC;QACH,OAAO;IACX,CAAC;IAED,OAAO,CAAC,IAAI,EAAE,CAAC;AACnB,CAAC,CAAC,CAAC;AAEP,8BAA8B,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEhE,MAAM,gBAAgB,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtD,gBAAoD,CAAC,OAAO,GAAG,IAAI,CAAC;AACrE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GlobalOptions } from '../../types/
|
|
1
|
+
import type { GlobalOptions } from '../../types/cli.js';
|
|
2
2
|
declare const KODUS_MARKER = "# kodus-hook";
|
|
3
3
|
declare function generateHookScript(failOn: string, fast: boolean): string;
|
|
4
4
|
export declare function installAction(options: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/hook/install.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/hook/install.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYxD,QAAA,MAAM,YAAY,iBAAiB,CAAC;AAEpC,iBAAS,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAwDjE;AAED,wBAAsB,aAAa,CAC/B,OAAO,EAAE;IACL,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB,EACD,UAAU,CAAC,EAAE,aAAa,GAC3B,OAAO,CAAC,IAAI,CAAC,CAsGf;AAED,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/hook/uninstall.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../src/commands/hook/uninstall.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYxD,wBAAsB,eAAe,CACjC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,EAClC,UAAU,CAAC,EAAE,aAAa,GAC3B,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/disable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"disable.d.ts","sourceRoot":"","sources":["../../../src/commands/memory/disable.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYxD,wBAAsB,aAAa,CAC/B,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,EAClC,UAAU,CAAC,EAAE,aAAa,GAC3B,OAAO,CAAC,IAAI,CAAC,CAkFf"}
|
package/dist/commands/pr.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/commands/pr.js
CHANGED
|
@@ -1,244 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import ora from 'ora';
|
|
4
|
-
import fs from 'fs/promises';
|
|
5
|
-
import { reviewService } from '../services/review.service.js';
|
|
6
|
-
import { gitService } from '../services/git.service.js';
|
|
7
|
-
import { terminalFormatter } from '../formatters/terminal.js';
|
|
8
|
-
import { jsonFormatter } from '../formatters/json.js';
|
|
9
|
-
import { markdownFormatter } from '../formatters/markdown.js';
|
|
10
|
-
import { promptFormatter } from '../formatters/prompt.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 { CommandError, normalizeCommandError, } from '../utils/command-errors.js';
|
|
16
|
-
import { assertStructuredOutputForFields, parseCsvEnumList, parseFieldList, parseOptionalNumber, validateHttpUrl, } from '../utils/input-validation.js';
|
|
17
|
-
import { applyFieldMask } from '../utils/field-mask.js';
|
|
18
|
-
export const prCommand = new Command('pr').description('Pull request commands');
|
|
19
|
-
prCommand
|
|
20
|
-
.command('suggestions')
|
|
21
|
-
.description('Fetch suggestions for a pull request')
|
|
22
|
-
.option('--pr-url <url>', 'Pull request URL')
|
|
23
|
-
.option('--pr-number <number>', 'Pull request number')
|
|
24
|
-
.option('--repo-id <id>', 'Repository ID for the pull request')
|
|
25
|
-
.option('--severity <list>', 'Comma-separated severities to include')
|
|
26
|
-
.option('--category <list>', 'Comma-separated categories to include')
|
|
27
|
-
.option('--fields <csv>', 'Select response fields (JSON/agent mode only), e.g. summary,issues.file')
|
|
28
|
-
.action(async (options, cmd) => {
|
|
29
|
-
const globalOpts = cmd.optsWithGlobals();
|
|
30
|
-
const ctx = createCommandContext('pr suggestions', globalOpts);
|
|
31
|
-
const spinner = ora();
|
|
32
|
-
try {
|
|
33
|
-
assertStructuredOutputForFields({
|
|
34
|
-
fields: options.fields,
|
|
35
|
-
format: globalOpts.format,
|
|
36
|
-
isAgent: ctx.isAgent,
|
|
37
|
-
});
|
|
38
|
-
const prNumber = parseOptionalNumber(options.prNumber, '--pr-number');
|
|
39
|
-
const normalizedPrUrl = options.prUrl
|
|
40
|
-
? validateHttpUrl(options.prUrl, '--pr-url')
|
|
41
|
-
: undefined;
|
|
42
|
-
const allowedSeverities = [
|
|
43
|
-
'info',
|
|
44
|
-
'warning',
|
|
45
|
-
'error',
|
|
46
|
-
'critical',
|
|
47
|
-
'high',
|
|
48
|
-
'medium',
|
|
49
|
-
'low',
|
|
50
|
-
];
|
|
51
|
-
const allowedCategories = [
|
|
52
|
-
'security_vulnerability',
|
|
53
|
-
'performance',
|
|
54
|
-
'code_quality',
|
|
55
|
-
'best_practices',
|
|
56
|
-
'style',
|
|
57
|
-
'bug',
|
|
58
|
-
'complexity',
|
|
59
|
-
'maintainability',
|
|
60
|
-
'documentation',
|
|
61
|
-
];
|
|
62
|
-
const severityFilter = parseCsvEnumList(options.severity, '--severity', allowedSeverities);
|
|
63
|
-
const categoryFilter = parseCsvEnumList(options.category, '--category', allowedCategories);
|
|
64
|
-
const fields = parseFieldList(options.fields);
|
|
65
|
-
if (!normalizedPrUrl && !(prNumber && options.repoId)) {
|
|
66
|
-
throw new CommandError('INVALID_INPUT', 'Provide --pr-url or both --pr-number and --repo-id.');
|
|
67
|
-
}
|
|
68
|
-
const shouldRequestMarkdown = !ctx.isAgent &&
|
|
69
|
-
(globalOpts.format === 'prompt' ||
|
|
70
|
-
globalOpts.format === 'markdown');
|
|
71
|
-
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
72
|
-
spinner.start(chalk.cyan('Fetching pull request suggestions...'));
|
|
73
|
-
}
|
|
74
|
-
const { result, markdown } = await reviewService.getPullRequestSuggestions({
|
|
75
|
-
prUrl: normalizedPrUrl,
|
|
76
|
-
prNumber,
|
|
77
|
-
repositoryId: options.repoId,
|
|
78
|
-
format: shouldRequestMarkdown ? 'markdown' : undefined,
|
|
79
|
-
severity: severityFilter?.join(','),
|
|
80
|
-
category: categoryFilter?.join(','),
|
|
81
|
-
});
|
|
82
|
-
if (!globalOpts.quiet && !ctx.isAgent) {
|
|
83
|
-
spinner.succeed(chalk.green('Suggestions fetched'));
|
|
84
|
-
}
|
|
85
|
-
const selectedResult = fields
|
|
86
|
-
? applyFieldMask(result, fields)
|
|
87
|
-
: result;
|
|
88
|
-
if (ctx.isAgent) {
|
|
89
|
-
await emitAgentEnvelope(buildAgentSuccessEnvelope(ctx.command, selectedResult, ctx.startedAt), ctx.outputFile);
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const output = markdown && shouldRequestMarkdown
|
|
93
|
-
? markdown
|
|
94
|
-
: formatOutput(selectedResult, globalOpts.format);
|
|
95
|
-
if (globalOpts.output) {
|
|
96
|
-
await fs.writeFile(globalOpts.output, output, 'utf-8');
|
|
97
|
-
cliInfo(chalk.green(`\nOutput saved to ${globalOpts.output}`));
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
cliInfo(output);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
catch (error) {
|
|
104
|
-
const normalized = normalizeCommandError(error);
|
|
105
|
-
if (ctx.isAgent) {
|
|
106
|
-
await emitAgentEnvelope(buildAgentErrorEnvelope(ctx.command, {
|
|
107
|
-
code: normalized.code,
|
|
108
|
-
message: normalized.message,
|
|
109
|
-
details: normalized.details,
|
|
110
|
-
}, ctx.startedAt), ctx.outputFile);
|
|
111
|
-
if (normalized.exitCode > 0) {
|
|
112
|
-
exitWithCode(normalized.exitCode);
|
|
113
|
-
}
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
if (!globalOpts.quiet) {
|
|
117
|
-
spinner.fail(chalk.red('Failed to fetch pull request suggestions'));
|
|
118
|
-
}
|
|
119
|
-
if (error instanceof Error) {
|
|
120
|
-
cliError(chalk.red(error.message));
|
|
121
|
-
}
|
|
122
|
-
exitWithCode(normalized.exitCode);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
prCommand
|
|
126
|
-
.command('business-validation')
|
|
127
|
-
.description('Run business rules validation for local diff only')
|
|
128
|
-
.argument('[files...]', 'Specific files to include in local diff mode')
|
|
129
|
-
.option('--task-url <url>', 'Task URL to append to the validation command')
|
|
130
|
-
.option('--task-id <id>', 'Task ID or issue key (e.g. KC-1441) to append')
|
|
131
|
-
.option('-s, --staged', 'Use only staged changes when running in local diff mode')
|
|
132
|
-
.option('-c, --commit <sha>', 'Use diff from a specific commit when running in local diff mode')
|
|
133
|
-
.option('-b, --branch <name>', 'Compare current branch against a base branch in local diff mode')
|
|
134
|
-
.option('--dry-run', 'Print payload without executing the API call', false)
|
|
135
|
-
.action(async (files, options, cmd) => {
|
|
136
|
-
const spinner = ora();
|
|
137
|
-
const globalOpts = cmd.optsWithGlobals();
|
|
138
|
-
try {
|
|
139
|
-
if (options.taskUrl && options.taskId) {
|
|
140
|
-
throw new Error('Provide only one of --task-url or --task-id.');
|
|
141
|
-
}
|
|
142
|
-
const diff = await getLocalDiffForBusinessValidation(files ?? [], options, globalOpts.verbose);
|
|
143
|
-
if (!diff.trim()) {
|
|
144
|
-
throw new Error('No local changes found for the selected scope.');
|
|
145
|
-
}
|
|
146
|
-
let repository;
|
|
147
|
-
const orgRepo = await gitService.extractOrgRepo();
|
|
148
|
-
if (orgRepo) {
|
|
149
|
-
repository = `${orgRepo.org}/${orgRepo.repo}`;
|
|
150
|
-
}
|
|
151
|
-
const payload = {
|
|
152
|
-
repository,
|
|
153
|
-
taskUrl: options.taskUrl,
|
|
154
|
-
taskId: options.taskId,
|
|
155
|
-
diff,
|
|
156
|
-
};
|
|
157
|
-
if (options.dryRun) {
|
|
158
|
-
cliInfo(chalk.cyan('Dry run mode. Payload that would be sent to /cli/business-validation:'));
|
|
159
|
-
cliInfo(JSON.stringify(payload, null, 2));
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
if (!globalOpts.quiet) {
|
|
163
|
-
spinner.start(chalk.cyan('Running business validation...'));
|
|
164
|
-
}
|
|
165
|
-
const response = await reviewService.triggerBusinessValidation({
|
|
166
|
-
...payload,
|
|
167
|
-
});
|
|
168
|
-
if (!globalOpts.quiet) {
|
|
169
|
-
spinner.succeed(chalk.green('Business validation completed.'));
|
|
170
|
-
}
|
|
171
|
-
cliInfo(chalk.dim('Mode: local diff'));
|
|
172
|
-
if (response.repositoryName) {
|
|
173
|
-
cliInfo(chalk.dim(`Repository: ${response.repositoryName}`));
|
|
174
|
-
}
|
|
175
|
-
if (response.taskReference) {
|
|
176
|
-
cliInfo(chalk.dim(`Task: ${response.taskReference}`));
|
|
177
|
-
}
|
|
178
|
-
cliInfo(chalk.dim(`Command: ${response.command}`));
|
|
179
|
-
cliInfo('');
|
|
180
|
-
cliInfo(response.result);
|
|
181
|
-
}
|
|
182
|
-
catch (error) {
|
|
183
|
-
if (!globalOpts.quiet) {
|
|
184
|
-
spinner.fail(chalk.red('Failed to trigger business validation'));
|
|
185
|
-
}
|
|
186
|
-
if (error instanceof Error) {
|
|
187
|
-
cliError(chalk.red(error.message));
|
|
188
|
-
}
|
|
189
|
-
exitWithCode(1);
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
async function getLocalDiffForBusinessValidation(files, options, verbose) {
|
|
193
|
-
gitService.setVerbose(!!verbose);
|
|
194
|
-
const hasFiles = files.length > 0;
|
|
195
|
-
const hasBranch = !!options.branch;
|
|
196
|
-
const hasCommit = !!options.commit;
|
|
197
|
-
const hasStaged = !!options.staged;
|
|
198
|
-
const selectedScopes = [hasFiles, hasBranch, hasCommit, hasStaged].filter(Boolean).length;
|
|
199
|
-
if (selectedScopes > 1) {
|
|
200
|
-
throw new Error('Use only one local diff scope: [files], --staged, --branch, or --commit.');
|
|
201
|
-
}
|
|
202
|
-
if (hasFiles) {
|
|
203
|
-
if (verbose) {
|
|
204
|
-
cliDebug(chalk.dim(`[verbose] Getting local diff for specific files: ${files.join(', ')}`));
|
|
205
|
-
}
|
|
206
|
-
return gitService.getDiffForFiles(files);
|
|
207
|
-
}
|
|
208
|
-
if (options.branch !== undefined) {
|
|
209
|
-
if (verbose) {
|
|
210
|
-
cliDebug(chalk.dim(`[verbose] Getting local diff for branch: ${options.branch}`));
|
|
211
|
-
}
|
|
212
|
-
return gitService.getDiffForBranch(options.branch);
|
|
213
|
-
}
|
|
214
|
-
if (options.commit !== undefined) {
|
|
215
|
-
if (verbose) {
|
|
216
|
-
cliDebug(chalk.dim(`[verbose] Getting local diff for commit: ${options.commit}`));
|
|
217
|
-
}
|
|
218
|
-
return gitService.getDiffForCommit(options.commit);
|
|
219
|
-
}
|
|
220
|
-
if (hasStaged) {
|
|
221
|
-
if (verbose) {
|
|
222
|
-
cliDebug(chalk.dim('[verbose] Getting local staged diff'));
|
|
223
|
-
}
|
|
224
|
-
return gitService.getStagedDiff();
|
|
225
|
-
}
|
|
226
|
-
if (verbose) {
|
|
227
|
-
cliDebug(chalk.dim('[verbose] Getting local working tree diff'));
|
|
228
|
-
}
|
|
229
|
-
return gitService.getWorkingTreeDiff();
|
|
230
|
-
}
|
|
231
|
-
function formatOutput(result, format) {
|
|
232
|
-
switch (format) {
|
|
233
|
-
case 'json':
|
|
234
|
-
return jsonFormatter.format(result);
|
|
235
|
-
case 'markdown':
|
|
236
|
-
return markdownFormatter.format(result);
|
|
237
|
-
case 'prompt':
|
|
238
|
-
return promptFormatter.format(result);
|
|
239
|
-
case 'terminal':
|
|
240
|
-
default:
|
|
241
|
-
return terminalFormatter.format(result);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
1
|
+
export { createPrCommand, prCommand } from '../features/pr/command.js';
|
|
244
2
|
//# sourceMappingURL=pr.js.map
|
package/dist/commands/pr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC"}
|