reviewflow 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/README.md +38 -13
- package/dist/cli/formatters/initSummary.d.ts +11 -0
- package/dist/cli/formatters/initSummary.d.ts.map +1 -0
- package/dist/cli/formatters/initSummary.js +35 -0
- package/dist/cli/formatters/initSummary.js.map +1 -0
- package/dist/cli/parseCliArgs.d.ts +12 -1
- package/dist/cli/parseCliArgs.d.ts.map +1 -1
- package/dist/cli/parseCliArgs.js +29 -1
- package/dist/cli/parseCliArgs.js.map +1 -1
- package/dist/frameworks/config/configLoader.d.ts.map +1 -1
- package/dist/frameworks/config/configLoader.js +22 -3
- package/dist/frameworks/config/configLoader.js.map +1 -1
- package/dist/main/cli.d.ts +2 -0
- package/dist/main/cli.d.ts.map +1 -1
- package/dist/main/cli.js +233 -3
- package/dist/main/cli.js.map +1 -1
- package/dist/shared/services/configDir.d.ts +2 -0
- package/dist/shared/services/configDir.d.ts.map +1 -0
- package/dist/shared/services/configDir.js +20 -0
- package/dist/shared/services/configDir.js.map +1 -0
- package/dist/shared/services/secretGenerator.d.ts +6 -0
- package/dist/shared/services/secretGenerator.d.ts.map +1 -0
- package/dist/shared/services/secretGenerator.js +13 -0
- package/dist/shared/services/secretGenerator.js.map +1 -0
- package/dist/tests/units/cli/formatters/initSummary.test.d.ts +2 -0
- package/dist/tests/units/cli/formatters/initSummary.test.d.ts.map +1 -0
- package/dist/tests/units/cli/formatters/initSummary.test.js +45 -0
- package/dist/tests/units/cli/formatters/initSummary.test.js.map +1 -0
- package/dist/tests/units/cli/parseCliArgs.test.js +63 -0
- package/dist/tests/units/cli/parseCliArgs.test.js.map +1 -1
- package/dist/tests/units/shared/services/configDir.test.d.ts +2 -0
- package/dist/tests/units/shared/services/configDir.test.d.ts.map +1 -0
- package/dist/tests/units/shared/services/configDir.test.js +42 -0
- package/dist/tests/units/shared/services/configDir.test.js.map +1 -0
- package/dist/tests/units/shared/services/secretGenerator.test.d.ts +2 -0
- package/dist/tests/units/shared/services/secretGenerator.test.d.ts.map +1 -0
- package/dist/tests/units/shared/services/secretGenerator.test.js +46 -0
- package/dist/tests/units/shared/services/secretGenerator.test.js.map +1 -0
- package/dist/tests/units/usecases/cli/configureMcp.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/cli/configureMcp.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/cli/configureMcp.usecase.test.js +94 -0
- package/dist/tests/units/usecases/cli/configureMcp.usecase.test.js.map +1 -0
- package/dist/tests/units/usecases/cli/discoverRepositories.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/cli/discoverRepositories.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/cli/discoverRepositories.usecase.test.js +193 -0
- package/dist/tests/units/usecases/cli/discoverRepositories.usecase.test.js.map +1 -0
- package/dist/tests/units/usecases/cli/validateConfig.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/cli/validateConfig.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/cli/validateConfig.usecase.test.js +119 -0
- package/dist/tests/units/usecases/cli/validateConfig.usecase.test.js.map +1 -0
- package/dist/tests/units/usecases/cli/writeInitConfig.usecase.test.d.ts +2 -0
- package/dist/tests/units/usecases/cli/writeInitConfig.usecase.test.d.ts.map +1 -0
- package/dist/tests/units/usecases/cli/writeInitConfig.usecase.test.js +75 -0
- package/dist/tests/units/usecases/cli/writeInitConfig.usecase.test.js.map +1 -0
- package/dist/usecases/cli/configureMcp.usecase.d.ts +16 -0
- package/dist/usecases/cli/configureMcp.usecase.d.ts.map +1 -0
- package/dist/usecases/cli/configureMcp.usecase.js +36 -0
- package/dist/usecases/cli/configureMcp.usecase.js.map +1 -0
- package/dist/usecases/cli/discoverRepositories.usecase.d.ts +34 -0
- package/dist/usecases/cli/discoverRepositories.usecase.d.ts.map +1 -0
- package/dist/usecases/cli/discoverRepositories.usecase.js +67 -0
- package/dist/usecases/cli/discoverRepositories.usecase.js.map +1 -0
- package/dist/usecases/cli/validateConfig.usecase.d.ts +28 -0
- package/dist/usecases/cli/validateConfig.usecase.d.ts.map +1 -0
- package/dist/usecases/cli/validateConfig.usecase.js +74 -0
- package/dist/usecases/cli/validateConfig.usecase.js.map +1 -0
- package/dist/usecases/cli/writeInitConfig.usecase.d.ts +31 -0
- package/dist/usecases/cli/writeInitConfig.usecase.d.ts.map +1 -0
- package/dist/usecases/cli/writeInitConfig.usecase.js +37 -0
- package/dist/usecases/cli/writeInitConfig.usecase.js.map +1 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.2.0](https://github.com/DGouron/review-flow/compare/reviewflow-v3.1.1...reviewflow-v3.2.0) (2026-02-12)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
* **cli:** add interactive setup wizard and config validation ([5ca96b6](https://github.com/DGouron/review-flow/commit/5ca96b601be6cad015551aba0d383e6f5494989b))
|
|
14
|
+
* **cli:** add reviewflow init wizard and validate command ([41ee87b](https://github.com/DGouron/review-flow/commit/41ee87b924bd9e9a72517e736913950ac8d7d4bf))
|
|
15
|
+
|
|
16
|
+
## [3.1.1](https://github.com/DGouron/review-flow/compare/reviewflow-v3.1.0...reviewflow-v3.1.1) (2026-02-11)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Fixed
|
|
20
|
+
|
|
21
|
+
* **cli:** resolve symlinks for global npm install detection ([5f70ee6](https://github.com/DGouron/review-flow/commit/5f70ee6763e24348aa9cfd07d78e0f0f33ab2c56))
|
|
22
|
+
* **cli:** resolve symlinks for global npm install detection ([8ed3b45](https://github.com/DGouron/review-flow/commit/8ed3b45fecf07ce69a9c6eb3dc6d46bd240de317))
|
|
23
|
+
|
|
8
24
|
## [3.1.0](https://github.com/DGouron/review-flow/compare/reviewflow-v3.0.1...reviewflow-v3.1.0) (2026-02-11)
|
|
9
25
|
|
|
10
26
|
|
package/README.md
CHANGED
|
@@ -125,40 +125,65 @@ Review behavior is defined by [Claude Code skills](https://docs.anthropic.com/en
|
|
|
125
125
|
|
|
126
126
|
## Quick Start
|
|
127
127
|
|
|
128
|
-
### Install
|
|
128
|
+
### 1. Install
|
|
129
129
|
|
|
130
130
|
```bash
|
|
131
131
|
npm install -g reviewflow
|
|
132
|
-
# or
|
|
133
|
-
yarn global add reviewflow
|
|
134
132
|
```
|
|
135
133
|
|
|
136
|
-
###
|
|
134
|
+
### 2. Initialize
|
|
137
135
|
|
|
138
136
|
```bash
|
|
139
|
-
|
|
140
|
-
npx reviewflow start
|
|
137
|
+
reviewflow init
|
|
141
138
|
```
|
|
142
139
|
|
|
143
|
-
|
|
140
|
+
The interactive wizard will:
|
|
141
|
+
- Configure server port and usernames
|
|
142
|
+
- Generate webhook secrets
|
|
143
|
+
- Scan your filesystem for git repositories
|
|
144
|
+
- Set up MCP server integration with Claude Code
|
|
144
145
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
cp config.example.json config.json
|
|
149
|
-
# Edit config.json with your repositories
|
|
146
|
+
For non-interactive setup: `reviewflow init --yes`
|
|
147
|
+
|
|
148
|
+
### 3. Start
|
|
150
149
|
|
|
151
|
-
|
|
150
|
+
```bash
|
|
152
151
|
reviewflow start
|
|
153
152
|
# Dashboard at http://localhost:3847
|
|
154
153
|
```
|
|
155
154
|
|
|
156
155
|
Then [configure a webhook](https://dgouron.github.io/review-flow/guide/quick-start) on your GitLab/GitHub project pointing to your server.
|
|
157
156
|
|
|
157
|
+
### Validate your setup
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
reviewflow validate
|
|
161
|
+
```
|
|
162
|
+
|
|
158
163
|
For detailed setup, see the **[Quick Start Guide](https://dgouron.github.io/review-flow/guide/quick-start)**.
|
|
159
164
|
|
|
160
165
|
---
|
|
161
166
|
|
|
167
|
+
## CLI Reference
|
|
168
|
+
|
|
169
|
+
| Command | Description |
|
|
170
|
+
|---------|-------------|
|
|
171
|
+
| `reviewflow init` | Interactive setup wizard |
|
|
172
|
+
| `reviewflow start` | Start the review server |
|
|
173
|
+
| `reviewflow stop` | Stop the running daemon |
|
|
174
|
+
| `reviewflow status` | Show server status |
|
|
175
|
+
| `reviewflow logs` | Show daemon logs |
|
|
176
|
+
| `reviewflow validate` | Validate configuration |
|
|
177
|
+
|
|
178
|
+
| Init Flag | Description |
|
|
179
|
+
|-----------|-------------|
|
|
180
|
+
| `-y, --yes` | Accept all defaults (non-interactive) |
|
|
181
|
+
| `--skip-mcp` | Skip MCP server configuration |
|
|
182
|
+
| `--show-secrets` | Display full webhook secrets |
|
|
183
|
+
| `--scan-path <path>` | Custom scan path (repeatable) |
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
162
187
|
## Documentation
|
|
163
188
|
|
|
164
189
|
| Topic | Link |
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface InitSummaryInput {
|
|
2
|
+
configPath: string;
|
|
3
|
+
envPath: string;
|
|
4
|
+
port: number;
|
|
5
|
+
repositoryCount: number;
|
|
6
|
+
mcpStatus: 'configured' | 'already-configured' | 'claude-not-found' | 'skipped' | 'failed';
|
|
7
|
+
gitlabUsername: string;
|
|
8
|
+
githubUsername: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatInitSummary(input: InitSummaryInput): string;
|
|
11
|
+
//# sourceMappingURL=initSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initSummary.d.ts","sourceRoot":"","sources":["../../../src/cli/formatters/initSummary.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,YAAY,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3F,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAiBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAoBjE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function mcpLine(status) {
|
|
2
|
+
switch (status) {
|
|
3
|
+
case 'configured':
|
|
4
|
+
return ' MCP server: configured';
|
|
5
|
+
case 'already-configured':
|
|
6
|
+
return ' MCP server: already configured';
|
|
7
|
+
case 'claude-not-found':
|
|
8
|
+
return ' MCP server: skipped (Claude CLI not found)';
|
|
9
|
+
case 'skipped':
|
|
10
|
+
return ' MCP server: skipped by user';
|
|
11
|
+
case 'failed':
|
|
12
|
+
return ' MCP server: configuration failed';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function formatInitSummary(input) {
|
|
16
|
+
const lines = [
|
|
17
|
+
'',
|
|
18
|
+
'ReviewFlow initialized successfully!',
|
|
19
|
+
'',
|
|
20
|
+
'Configuration:',
|
|
21
|
+
` Config file: ${input.configPath}`,
|
|
22
|
+
` Env file: ${input.envPath}`,
|
|
23
|
+
` Port: ${input.port}`,
|
|
24
|
+
` Repositories: ${input.repositoryCount}`,
|
|
25
|
+
mcpLine(input.mcpStatus),
|
|
26
|
+
'',
|
|
27
|
+
'Next steps:',
|
|
28
|
+
' 1. Configure webhook secrets on your GitLab/GitHub projects',
|
|
29
|
+
' 2. Start the server: reviewflow start',
|
|
30
|
+
' 3. Check status: reviewflow validate',
|
|
31
|
+
'',
|
|
32
|
+
];
|
|
33
|
+
return lines.join('\n');
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=initSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initSummary.js","sourceRoot":"","sources":["../../../src/cli/formatters/initSummary.ts"],"names":[],"mappings":"AAUA,SAAS,OAAO,CAAC,MAAqC;IACpD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,YAAY;YACf,OAAO,6BAA6B,CAAC;QACvC,KAAK,oBAAoB;YACvB,OAAO,qCAAqC,CAAC;QAC/C,KAAK,kBAAkB;YACrB,OAAO,iDAAiD,CAAC;QAC3D,KAAK,SAAS;YACZ,OAAO,kCAAkC,CAAC;QAC5C,KAAK,QAAQ;YACX,OAAO,uCAAuC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,KAAK,GAAa;QACtB,EAAE;QACF,sCAAsC;QACtC,EAAE;QACF,gBAAgB;QAChB,oBAAoB,KAAK,CAAC,UAAU,EAAE;QACtC,oBAAoB,KAAK,CAAC,OAAO,EAAE;QACnC,oBAAoB,KAAK,CAAC,IAAI,EAAE;QAChC,oBAAoB,KAAK,CAAC,eAAe,EAAE;QAC3C,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QACxB,EAAE;QACF,aAAa;QACb,+DAA+D;QAC/D,yCAAyC;QACzC,4CAA4C;QAC5C,EAAE;KACH,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -18,13 +18,24 @@ interface LogsArgs {
|
|
|
18
18
|
follow: boolean;
|
|
19
19
|
lines: number;
|
|
20
20
|
}
|
|
21
|
+
interface InitArgs {
|
|
22
|
+
command: 'init';
|
|
23
|
+
yes: boolean;
|
|
24
|
+
skipMcp: boolean;
|
|
25
|
+
showSecrets: boolean;
|
|
26
|
+
scanPaths: string[];
|
|
27
|
+
}
|
|
28
|
+
interface ValidateArgs {
|
|
29
|
+
command: 'validate';
|
|
30
|
+
fix: boolean;
|
|
31
|
+
}
|
|
21
32
|
interface VersionArgs {
|
|
22
33
|
command: 'version';
|
|
23
34
|
}
|
|
24
35
|
interface HelpArgs {
|
|
25
36
|
command: 'help';
|
|
26
37
|
}
|
|
27
|
-
export type CliArgs = StartArgs | StopArgs | StatusArgs | LogsArgs | VersionArgs | HelpArgs;
|
|
38
|
+
export type CliArgs = StartArgs | StopArgs | StatusArgs | LogsArgs | InitArgs | ValidateArgs | VersionArgs | HelpArgs;
|
|
28
39
|
export declare function parseCliArgs(args: string[]): CliArgs;
|
|
29
40
|
export {};
|
|
30
41
|
//# sourceMappingURL=parseCliArgs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCliArgs.d.ts","sourceRoot":"","sources":["../../src/cli/parseCliArgs.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"parseCliArgs.d.ts","sourceRoot":"","sources":["../../src/cli/parseCliArgs.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,UAAU,CAAC;IACpB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;AAuFtH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAyBpD"}
|
package/dist/cli/parseCliArgs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const KNOWN_COMMANDS = ['start', 'stop', 'status', 'logs'];
|
|
1
|
+
const KNOWN_COMMANDS = ['start', 'stop', 'status', 'logs', 'init', 'validate'];
|
|
2
2
|
function hasFlag(args, long, short) {
|
|
3
3
|
return args.includes(long) || (short !== undefined && args.includes(short));
|
|
4
4
|
}
|
|
@@ -47,6 +47,30 @@ function parseLogsArgs(args) {
|
|
|
47
47
|
lines: linesValue !== undefined ? Number(linesValue) : 20,
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
+
function getAllFlagValues(args, long) {
|
|
51
|
+
const values = [];
|
|
52
|
+
for (let index = 0; index < args.length; index++) {
|
|
53
|
+
if (args[index] === long && args[index + 1] !== undefined) {
|
|
54
|
+
values.push(args[index + 1]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return values;
|
|
58
|
+
}
|
|
59
|
+
function parseInitArgs(args) {
|
|
60
|
+
return {
|
|
61
|
+
command: 'init',
|
|
62
|
+
yes: hasFlag(args, '--yes', '-y'),
|
|
63
|
+
skipMcp: hasFlag(args, '--skip-mcp'),
|
|
64
|
+
showSecrets: hasFlag(args, '--show-secrets'),
|
|
65
|
+
scanPaths: getAllFlagValues(args, '--scan-path'),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function parseValidateArgs(args) {
|
|
69
|
+
return {
|
|
70
|
+
command: 'validate',
|
|
71
|
+
fix: hasFlag(args, '--fix'),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
50
74
|
export function parseCliArgs(args) {
|
|
51
75
|
if (hasFlag(args, '--version', '-v')) {
|
|
52
76
|
return { command: 'version' };
|
|
@@ -64,6 +88,10 @@ export function parseCliArgs(args) {
|
|
|
64
88
|
return parseStatusArgs(args);
|
|
65
89
|
case 'logs':
|
|
66
90
|
return parseLogsArgs(args);
|
|
91
|
+
case 'init':
|
|
92
|
+
return parseInitArgs(args);
|
|
93
|
+
case 'validate':
|
|
94
|
+
return parseValidateArgs(args);
|
|
67
95
|
}
|
|
68
96
|
}
|
|
69
97
|
//# sourceMappingURL=parseCliArgs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCliArgs.js","sourceRoot":"","sources":["../../src/cli/parseCliArgs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseCliArgs.js","sourceRoot":"","sources":["../../src/cli/parseCliArgs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configLoader.d.ts","sourceRoot":"","sources":["../../../src/frameworks/config/configLoader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"configLoader.d.ts","sourceRoot":"","sources":["../../../src/frameworks/config/configLoader.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAiLD,wBAAgB,UAAU,IAAI,MAAM,CAcnC;AAED,wBAAgB,cAAc,IAAI,UAAU,CAI3C;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAWzF;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAa7F"}
|
|
@@ -2,7 +2,15 @@ import { readFileSync, existsSync } from 'node:fs';
|
|
|
2
2
|
import { execSync } from 'node:child_process';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { config as loadEnv } from 'dotenv';
|
|
5
|
-
|
|
5
|
+
import { getConfigDir } from '../../shared/services/configDir.js';
|
|
6
|
+
const configDir = getConfigDir();
|
|
7
|
+
const xdgEnvPath = join(configDir, '.env');
|
|
8
|
+
if (existsSync(xdgEnvPath)) {
|
|
9
|
+
loadEnv({ path: xdgEnvPath });
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
loadEnv();
|
|
13
|
+
}
|
|
6
14
|
function loadProjectConfig(localPath) {
|
|
7
15
|
const configPath = join(localPath, '.claude', 'reviews', 'config.json');
|
|
8
16
|
if (!existsSync(configPath)) {
|
|
@@ -142,12 +150,23 @@ function loadSecrets() {
|
|
|
142
150
|
// Main loader
|
|
143
151
|
let cachedConfig = null;
|
|
144
152
|
let cachedSecrets = null;
|
|
153
|
+
function resolveConfigPath() {
|
|
154
|
+
if (process.env.CONFIG_PATH)
|
|
155
|
+
return process.env.CONFIG_PATH;
|
|
156
|
+
const cwdPath = join(process.cwd(), 'config.json');
|
|
157
|
+
if (existsSync(cwdPath))
|
|
158
|
+
return cwdPath;
|
|
159
|
+
const xdgPath = join(configDir, 'config.json');
|
|
160
|
+
if (existsSync(xdgPath))
|
|
161
|
+
return xdgPath;
|
|
162
|
+
return cwdPath;
|
|
163
|
+
}
|
|
145
164
|
export function loadConfig() {
|
|
146
165
|
if (cachedConfig)
|
|
147
166
|
return cachedConfig;
|
|
148
|
-
const configPath =
|
|
167
|
+
const configPath = resolveConfigPath();
|
|
149
168
|
if (!existsSync(configPath)) {
|
|
150
|
-
throw new Error(`
|
|
169
|
+
throw new Error(`Configuration file not found: ${configPath}\nRun 'reviewflow init' to create one.`);
|
|
151
170
|
}
|
|
152
171
|
const rawContent = readFileSync(configPath, 'utf-8');
|
|
153
172
|
const parsed = JSON.parse(rawContent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../../src/frameworks/config/configLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AAE3C,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../../src/frameworks/config/configLoader.ts"],"names":[],"mappings":"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"}
|
package/dist/main/cli.d.ts
CHANGED
|
@@ -40,4 +40,6 @@ export interface LogsDeps {
|
|
|
40
40
|
exit: (code: number) => void;
|
|
41
41
|
}
|
|
42
42
|
export declare function executeLogs(follow: boolean, lines: number, deps: LogsDeps): void;
|
|
43
|
+
export declare function executeInit(yes: boolean, skipMcp: boolean, showSecrets: boolean, scanPaths: string[]): Promise<void>;
|
|
44
|
+
export declare function executeValidate(fix: boolean): void;
|
|
43
45
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/main/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/main/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/main/cli.ts"],"names":[],"mappings":";AAUA,OAAO,EAAsB,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAC1G,OAAO,EAAqB,KAAK,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACvG,OAAO,EAAsB,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAC1G,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAwEjG,MAAM,WAAW,iBAAiB;IAChC,oBAAoB,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnE,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,eAAe,EAAE,uBAAuB,CAAC;IACzC,eAAe,EAAE,MAAM;QAAE,gBAAgB,EAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7F,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAkBD,wBAAgB,YAAY,CAC1B,mBAAmB,EAAE,OAAO,EAC5B,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,iBAAiB,GACtB,IAAI,CA0CN;AAED,MAAM,WAAW,QAAQ;IACvB,cAAc,EAAE,sBAAsB,CAAC;IACvC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAgBhE;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,EAAE,uBAAuB,CAAC;IACzC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAmBnE;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,oBAAoB,CAAC;IACnC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAyBhF;AAuBD,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,IAAI,CAAC,CA4Jf;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CA0ClD"}
|
package/dist/main/cli.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { readFileSync, realpathSync, existsSync, mkdirSync, writeFileSync, readdirSync, copyFileSync } from 'node:fs';
|
|
3
3
|
import { join, dirname, resolve } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { execSync } from 'node:child_process';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
5
7
|
import { parseCliArgs } from '../cli/parseCliArgs.js';
|
|
6
|
-
import { validateDependencies } from '../shared/services/dependencyChecker.js';
|
|
8
|
+
import { validateDependencies, checkDependency } from '../shared/services/dependencyChecker.js';
|
|
7
9
|
import { startServer } from './server.js';
|
|
8
10
|
import { StartDaemonUseCase } from '../usecases/cli/startDaemon.usecase.js';
|
|
9
11
|
import { StopDaemonUseCase } from '../usecases/cli/stopDaemon.usecase.js';
|
|
@@ -18,6 +20,14 @@ import { green, red, yellow, dim, bold } from '../shared/services/ansiColors.js'
|
|
|
18
20
|
import { formatStartupBanner } from '../cli/startupBanner.js';
|
|
19
21
|
import { openInBrowser } from '../shared/services/browserOpener.js';
|
|
20
22
|
import { loadConfig } from '../frameworks/config/configLoader.js';
|
|
23
|
+
import { getConfigDir } from '../shared/services/configDir.js';
|
|
24
|
+
import { generateWebhookSecret, truncateSecret } from '../shared/services/secretGenerator.js';
|
|
25
|
+
import { DiscoverRepositoriesUseCase } from '../usecases/cli/discoverRepositories.usecase.js';
|
|
26
|
+
import { ConfigureMcpUseCase } from '../usecases/cli/configureMcp.usecase.js';
|
|
27
|
+
import { WriteInitConfigUseCase } from '../usecases/cli/writeInitConfig.usecase.js';
|
|
28
|
+
import { ValidateConfigUseCase } from '../usecases/cli/validateConfig.usecase.js';
|
|
29
|
+
import { formatInitSummary } from '../cli/formatters/initSummary.js';
|
|
30
|
+
import { resolveMcpServerPath } from '../frameworks/claude/claudeInvoker.js';
|
|
21
31
|
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
22
32
|
function readVersion() {
|
|
23
33
|
const packageJsonPath = join(currentDir, '..', '..', 'package.json');
|
|
@@ -31,10 +41,18 @@ Usage:
|
|
|
31
41
|
reviewflow [command] [options]
|
|
32
42
|
|
|
33
43
|
Commands:
|
|
44
|
+
init Interactive setup wizard
|
|
34
45
|
start Start the review server (default)
|
|
35
46
|
stop Stop the running daemon
|
|
36
47
|
status Show server status
|
|
37
48
|
logs Show daemon logs
|
|
49
|
+
validate Validate configuration
|
|
50
|
+
|
|
51
|
+
Init options:
|
|
52
|
+
-y, --yes Accept all defaults (non-interactive)
|
|
53
|
+
--skip-mcp Skip MCP server configuration
|
|
54
|
+
--show-secrets Display full webhook secrets
|
|
55
|
+
--scan-path <path> Custom scan path (repeatable)
|
|
38
56
|
|
|
39
57
|
Start options:
|
|
40
58
|
-d, --daemon Run as background daemon
|
|
@@ -52,6 +70,9 @@ Logs options:
|
|
|
52
70
|
-f, --follow Follow log output (tail -f)
|
|
53
71
|
-n, --lines <count> Number of lines to show (default: 20)
|
|
54
72
|
|
|
73
|
+
Validate options:
|
|
74
|
+
--fix Auto-fix correctable issues
|
|
75
|
+
|
|
55
76
|
General options:
|
|
56
77
|
-v, --version Show version
|
|
57
78
|
-h, --help Show this help
|
|
@@ -168,6 +189,209 @@ export function executeLogs(follow, lines, deps) {
|
|
|
168
189
|
break;
|
|
169
190
|
}
|
|
170
191
|
}
|
|
192
|
+
const DEFAULT_SCAN_PATHS = [
|
|
193
|
+
join(homedir(), 'Documents'),
|
|
194
|
+
join(homedir(), 'Projects'),
|
|
195
|
+
join(homedir(), 'Development'),
|
|
196
|
+
join(homedir(), 'dev'),
|
|
197
|
+
join(homedir(), 'repos'),
|
|
198
|
+
];
|
|
199
|
+
function getGitRemoteUrl(localPath) {
|
|
200
|
+
try {
|
|
201
|
+
const result = execSync('git remote get-url origin', {
|
|
202
|
+
cwd: localPath,
|
|
203
|
+
encoding: 'utf-8',
|
|
204
|
+
timeout: 5000,
|
|
205
|
+
});
|
|
206
|
+
return result.trim().replace(/\.git$/, '');
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export async function executeInit(yes, skipMcp, showSecrets, scanPaths) {
|
|
213
|
+
const configDir = getConfigDir();
|
|
214
|
+
const configPath = join(configDir, 'config.json');
|
|
215
|
+
if (existsSync(configPath) && !yes) {
|
|
216
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
217
|
+
const overwrite = await confirm({
|
|
218
|
+
message: `Config already exists at ${configPath}. Overwrite?`,
|
|
219
|
+
default: false,
|
|
220
|
+
});
|
|
221
|
+
if (!overwrite) {
|
|
222
|
+
console.log(yellow('Init cancelled.'));
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
let port = 3847;
|
|
227
|
+
let gitlabUsername = '';
|
|
228
|
+
let githubUsername = '';
|
|
229
|
+
if (yes) {
|
|
230
|
+
console.log(dim('Non-interactive mode: using defaults'));
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
const { input, number: numberPrompt } = await import('@inquirer/prompts');
|
|
234
|
+
const portAnswer = await numberPrompt({
|
|
235
|
+
message: 'Server port:',
|
|
236
|
+
default: 3847,
|
|
237
|
+
validate: (value) => {
|
|
238
|
+
if (value === undefined || value < 1 || value > 65535)
|
|
239
|
+
return 'Port must be between 1 and 65535';
|
|
240
|
+
return true;
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
port = portAnswer ?? 3847;
|
|
244
|
+
gitlabUsername = await input({
|
|
245
|
+
message: 'GitLab username (optional):',
|
|
246
|
+
default: '',
|
|
247
|
+
});
|
|
248
|
+
githubUsername = await input({
|
|
249
|
+
message: 'GitHub username (optional):',
|
|
250
|
+
default: '',
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
const gitlabSecret = generateWebhookSecret();
|
|
254
|
+
const githubSecret = generateWebhookSecret();
|
|
255
|
+
console.log('');
|
|
256
|
+
console.log(bold('Webhook secrets generated:'));
|
|
257
|
+
if (showSecrets) {
|
|
258
|
+
console.log(` GitLab: ${gitlabSecret}`);
|
|
259
|
+
console.log(` GitHub: ${githubSecret}`);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
console.log(` GitLab: ${truncateSecret(gitlabSecret, 16)}`);
|
|
263
|
+
console.log(` GitHub: ${truncateSecret(githubSecret, 16)}`);
|
|
264
|
+
console.log(dim(' Use --show-secrets to display full values'));
|
|
265
|
+
}
|
|
266
|
+
const pathsToScan = scanPaths.length > 0 ? scanPaths : DEFAULT_SCAN_PATHS;
|
|
267
|
+
let selectedRepos = [];
|
|
268
|
+
const shouldScan = yes || (await (async () => {
|
|
269
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
270
|
+
return confirm({ message: 'Scan for repositories?', default: true });
|
|
271
|
+
})());
|
|
272
|
+
if (shouldScan) {
|
|
273
|
+
console.log(dim('\nScanning for repositories...'));
|
|
274
|
+
const discoverer = new DiscoverRepositoriesUseCase({
|
|
275
|
+
existsSync,
|
|
276
|
+
readdirSync: (path) => readdirSync(path, { withFileTypes: true }).map(d => ({
|
|
277
|
+
name: d.name,
|
|
278
|
+
isDirectory: () => d.isDirectory(),
|
|
279
|
+
})),
|
|
280
|
+
getGitRemoteUrl,
|
|
281
|
+
});
|
|
282
|
+
const discovered = discoverer.execute({ scanPaths: pathsToScan, maxDepth: 3 });
|
|
283
|
+
console.log(` Found ${discovered.repositories.length} repositories`);
|
|
284
|
+
if (discovered.repositories.length > 0) {
|
|
285
|
+
if (yes) {
|
|
286
|
+
selectedRepos = discovered.repositories.map(r => ({
|
|
287
|
+
name: r.name,
|
|
288
|
+
localPath: r.localPath,
|
|
289
|
+
enabled: true,
|
|
290
|
+
}));
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
const { checkbox } = await import('@inquirer/prompts');
|
|
294
|
+
const selected = await checkbox({
|
|
295
|
+
message: 'Select repositories to configure:',
|
|
296
|
+
choices: discovered.repositories.map(r => ({
|
|
297
|
+
name: `${r.name} ${dim(`(${r.localPath})`)}${r.hasReviewConfig ? green(' [configured]') : ''}`,
|
|
298
|
+
value: r,
|
|
299
|
+
checked: r.hasReviewConfig,
|
|
300
|
+
})),
|
|
301
|
+
});
|
|
302
|
+
selectedRepos = selected.map(r => ({
|
|
303
|
+
name: r.name,
|
|
304
|
+
localPath: r.localPath,
|
|
305
|
+
enabled: true,
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
let mcpStatus = 'skipped';
|
|
311
|
+
if (!skipMcp) {
|
|
312
|
+
console.log(dim('\nConfiguring MCP server...'));
|
|
313
|
+
try {
|
|
314
|
+
const mcpUseCase = new ConfigureMcpUseCase({
|
|
315
|
+
isClaudeInstalled: () => checkDependency({ name: 'Claude', command: 'claude --version' }),
|
|
316
|
+
readFileSync: (path, encoding) => readFileSync(path, encoding),
|
|
317
|
+
writeFileSync,
|
|
318
|
+
existsSync,
|
|
319
|
+
copyFileSync,
|
|
320
|
+
resolveMcpServerPath: () => {
|
|
321
|
+
try {
|
|
322
|
+
return resolveMcpServerPath();
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
return join(dirname(fileURLToPath(import.meta.url)), '..', 'mcpServer.js');
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
settingsPath: join(homedir(), '.claude', 'settings.json'),
|
|
329
|
+
});
|
|
330
|
+
mcpStatus = mcpUseCase.execute();
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
mcpStatus = 'failed';
|
|
334
|
+
}
|
|
335
|
+
console.log(` MCP: ${mcpStatus}`);
|
|
336
|
+
}
|
|
337
|
+
const writer = new WriteInitConfigUseCase({ mkdirSync, writeFileSync });
|
|
338
|
+
const result = writer.execute({
|
|
339
|
+
configDir,
|
|
340
|
+
port,
|
|
341
|
+
gitlabUsername,
|
|
342
|
+
githubUsername,
|
|
343
|
+
repositories: selectedRepos,
|
|
344
|
+
gitlabWebhookSecret: gitlabSecret,
|
|
345
|
+
githubWebhookSecret: githubSecret,
|
|
346
|
+
});
|
|
347
|
+
const summary = formatInitSummary({
|
|
348
|
+
configPath: result.configPath,
|
|
349
|
+
envPath: result.envPath,
|
|
350
|
+
port,
|
|
351
|
+
repositoryCount: selectedRepos.length,
|
|
352
|
+
mcpStatus,
|
|
353
|
+
gitlabUsername,
|
|
354
|
+
githubUsername,
|
|
355
|
+
});
|
|
356
|
+
console.log(green(summary));
|
|
357
|
+
}
|
|
358
|
+
export function executeValidate(fix) {
|
|
359
|
+
const configDir = getConfigDir();
|
|
360
|
+
const configPath = join(configDir, 'config.json');
|
|
361
|
+
const envPath = join(configDir, '.env');
|
|
362
|
+
const cwdConfigPath = join(process.cwd(), 'config.json');
|
|
363
|
+
const resolvedConfigPath = existsSync(cwdConfigPath) ? cwdConfigPath : configPath;
|
|
364
|
+
const resolvedEnvPath = existsSync(join(process.cwd(), '.env')) ? join(process.cwd(), '.env') : envPath;
|
|
365
|
+
const validator = new ValidateConfigUseCase({
|
|
366
|
+
existsSync,
|
|
367
|
+
readFileSync: (path, encoding) => readFileSync(path, encoding),
|
|
368
|
+
});
|
|
369
|
+
const result = validator.execute({ configPath: resolvedConfigPath, envPath: resolvedEnvPath });
|
|
370
|
+
switch (result.status) {
|
|
371
|
+
case 'not-found':
|
|
372
|
+
console.log(red('No configuration found.'));
|
|
373
|
+
console.log(dim(`Looked in: ${resolvedConfigPath}`));
|
|
374
|
+
console.log(`Run ${bold('reviewflow init')} to create one.`);
|
|
375
|
+
process.exit(1);
|
|
376
|
+
break;
|
|
377
|
+
case 'valid':
|
|
378
|
+
console.log(green(bold('Configuration is valid!')));
|
|
379
|
+
console.log(dim(` Config: ${resolvedConfigPath}`));
|
|
380
|
+
console.log(dim(` Env: ${resolvedEnvPath}`));
|
|
381
|
+
break;
|
|
382
|
+
case 'invalid':
|
|
383
|
+
console.log(red(bold('Configuration has issues:')));
|
|
384
|
+
for (const issue of result.issues) {
|
|
385
|
+
const prefix = issue.severity === 'error' ? red('ERROR') : yellow('WARN');
|
|
386
|
+
console.log(` ${prefix} [${issue.field}]: ${issue.message}`);
|
|
387
|
+
}
|
|
388
|
+
if (fix) {
|
|
389
|
+
console.log(dim('\n--fix flag detected, but no auto-fixable issues implemented yet.'));
|
|
390
|
+
}
|
|
391
|
+
process.exit(1);
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
171
395
|
function createPidFileDeps() {
|
|
172
396
|
return {
|
|
173
397
|
readPidFile: () => readPidFile(PID_FILE_PATH),
|
|
@@ -177,7 +401,7 @@ function createPidFileDeps() {
|
|
|
177
401
|
};
|
|
178
402
|
}
|
|
179
403
|
const isDirectlyExecuted = process.argv[1] &&
|
|
180
|
-
resolve(process.argv[1]) === fileURLToPath(import.meta.url);
|
|
404
|
+
realpathSync(resolve(process.argv[1])) === fileURLToPath(import.meta.url);
|
|
181
405
|
if (isDirectlyExecuted) {
|
|
182
406
|
const args = parseCliArgs(process.argv.slice(2));
|
|
183
407
|
switch (args.command) {
|
|
@@ -247,6 +471,12 @@ if (isDirectlyExecuted) {
|
|
|
247
471
|
exit: process.exit,
|
|
248
472
|
});
|
|
249
473
|
break;
|
|
474
|
+
case 'init':
|
|
475
|
+
executeInit(args.yes, args.skipMcp, args.showSecrets, args.scanPaths);
|
|
476
|
+
break;
|
|
477
|
+
case 'validate':
|
|
478
|
+
executeValidate(args.fix);
|
|
479
|
+
break;
|
|
250
480
|
}
|
|
251
481
|
}
|
|
252
482
|
//# sourceMappingURL=cli.js.map
|