@kodus/cli 0.0.11 → 0.1.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/README.md +387 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +26 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +36 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +7 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +97 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +2 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +24 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/signup.d.ts +2 -0
- package/dist/commands/auth/signup.d.ts.map +1 -0
- package/dist/commands/auth/signup.js +74 -0
- package/dist/commands/auth/signup.js.map +1 -0
- package/dist/commands/auth/status.d.ts +2 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +91 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/auth/team-key.d.ts +5 -0
- package/dist/commands/auth/team-key.d.ts.map +1 -0
- package/dist/commands/auth/team-key.js +59 -0
- package/dist/commands/auth/team-key.js.map +1 -0
- package/dist/commands/auth/token.d.ts +2 -0
- package/dist/commands/auth/token.d.ts.map +1 -0
- package/dist/commands/auth/token.js +31 -0
- package/dist/commands/auth/token.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +47 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/pr.d.ts +3 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +75 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +245 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/telemetry.d.ts +3 -0
- package/dist/commands/telemetry.d.ts.map +1 -0
- package/dist/commands/telemetry.js +76 -0
- package/dist/commands/telemetry.js.map +1 -0
- package/dist/commands/upgrade.d.ts +3 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +35 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/formatters/json.d.ts +7 -0
- package/dist/formatters/json.d.ts.map +1 -0
- package/dist/formatters/json.js +7 -0
- package/dist/formatters/json.js.map +1 -0
- package/dist/formatters/markdown.d.ts +7 -0
- package/dist/formatters/markdown.d.ts.map +1 -0
- package/dist/formatters/markdown.js +93 -0
- package/dist/formatters/markdown.js.map +1 -0
- package/dist/formatters/prompt.d.ts +12 -0
- package/dist/formatters/prompt.d.ts.map +1 -0
- package/dist/formatters/prompt.js +90 -0
- package/dist/formatters/prompt.js.map +1 -0
- package/dist/formatters/terminal.d.ts +7 -0
- package/dist/formatters/terminal.d.ts.map +1 -0
- package/dist/formatters/terminal.js +127 -0
- package/dist/formatters/terminal.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/services/api/api.interface.d.ts +46 -0
- package/dist/services/api/api.interface.d.ts.map +1 -0
- package/dist/services/api/api.interface.js +2 -0
- package/dist/services/api/api.interface.js.map +1 -0
- package/dist/services/api/api.mock.d.ts +8 -0
- package/dist/services/api/api.mock.d.ts.map +1 -0
- package/dist/services/api/api.mock.js +249 -0
- package/dist/services/api/api.mock.js.map +1 -0
- package/dist/services/api/api.real.d.ts +8 -0
- package/dist/services/api/api.real.d.ts.map +1 -0
- package/dist/services/api/api.real.js +253 -0
- package/dist/services/api/api.real.js.map +1 -0
- package/dist/services/api/index.d.ts +4 -0
- package/dist/services/api/index.d.ts.map +1 -0
- package/dist/services/api/index.js +9 -0
- package/dist/services/api/index.js.map +1 -0
- package/dist/services/auth.service.d.ts +19 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +90 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/context.service.d.ts +22 -0
- package/dist/services/context.service.d.ts.map +1 -0
- package/dist/services/context.service.js +104 -0
- package/dist/services/context.service.js.map +1 -0
- package/dist/services/fix.service.d.ts +31 -0
- package/dist/services/fix.service.d.ts.map +1 -0
- package/dist/services/fix.service.js +120 -0
- package/dist/services/fix.service.js.map +1 -0
- package/dist/services/git.service.d.ts +32 -0
- package/dist/services/git.service.d.ts.map +1 -0
- package/dist/services/git.service.js +261 -0
- package/dist/services/git.service.js.map +1 -0
- package/dist/services/review.service.d.ts +26 -0
- package/dist/services/review.service.d.ts.map +1 -0
- package/dist/services/review.service.js +82 -0
- package/dist/services/review.service.js.map +1 -0
- package/dist/services/telemetry.service.d.ts +73 -0
- package/dist/services/telemetry.service.d.ts.map +1 -0
- package/dist/services/telemetry.service.js +229 -0
- package/dist/services/telemetry.service.js.map +1 -0
- package/dist/types/index.d.ts +143 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/interactive.d.ts +26 -0
- package/dist/ui/interactive.d.ts.map +1 -0
- package/dist/ui/interactive.js +365 -0
- package/dist/ui/interactive.js.map +1 -0
- package/dist/utils/config.d.ts +10 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +54 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/credentials.d.ts +6 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +54 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +5 -0
- package/dist/utils/rate-limit.d.ts.map +1 -0
- package/dist/utils/rate-limit.js +47 -0
- package/dist/utils/rate-limit.js.map +1 -0
- package/dist/utils/review-loading.d.ts +19 -0
- package/dist/utils/review-loading.d.ts.map +1 -0
- package/dist/utils/review-loading.js +140 -0
- package/dist/utils/review-loading.js.map +1 -0
- package/package.json +39 -33
- package/index.js +0 -17
- package/license.md +0 -21
- package/readme.md +0 -128
- package/scripts/setup-db.sh +0 -77
- package/src/commands/install.js +0 -324
- package/src/config/default.js +0 -66
- package/src/utils/helpers.js +0 -118
- package/templates/docker-compose.yml +0 -139
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import machineId from 'node-machine-id';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
const { machineIdSync } = machineId;
|
|
6
|
+
/**
|
|
7
|
+
* Telemetry Service - Analytics via Kodus API
|
|
8
|
+
*
|
|
9
|
+
* Security:
|
|
10
|
+
* - Does NOT expose PostHog API key to users
|
|
11
|
+
* - Sends events to Kodus API which forwards to PostHog
|
|
12
|
+
* - API key stays secure on the server
|
|
13
|
+
*
|
|
14
|
+
* Features:
|
|
15
|
+
* - User can opt-out via `kodus telemetry disable`
|
|
16
|
+
* - Anonymous user ID (machine ID hash)
|
|
17
|
+
* - No sensitive data (file names, code, etc)
|
|
18
|
+
* - Graceful degradation (never breaks the CLI)
|
|
19
|
+
*/
|
|
20
|
+
class TelemetryService {
|
|
21
|
+
userId = null;
|
|
22
|
+
enabled = true;
|
|
23
|
+
configPath;
|
|
24
|
+
apiUrl;
|
|
25
|
+
constructor() {
|
|
26
|
+
this.configPath = path.join(os.homedir(), '.kodus', 'telemetry.json');
|
|
27
|
+
this.apiUrl = process.env.KODUS_API_URL || 'https://api.kodus.io';
|
|
28
|
+
this.initialize();
|
|
29
|
+
}
|
|
30
|
+
async initialize() {
|
|
31
|
+
try {
|
|
32
|
+
// Check if telemetry is enabled
|
|
33
|
+
this.enabled = await this.isEnabled();
|
|
34
|
+
if (!this.enabled) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Get or create anonymous user ID
|
|
38
|
+
this.userId = await this.getUserId();
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
// Silent fail - telemetry should never break the CLI
|
|
42
|
+
this.enabled = false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get anonymous user ID (machine ID)
|
|
47
|
+
*/
|
|
48
|
+
async getUserId() {
|
|
49
|
+
try {
|
|
50
|
+
// Use machine ID for consistent anonymous tracking
|
|
51
|
+
const machineId = machineIdSync();
|
|
52
|
+
return `anon_${machineId}`;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Fallback to random ID
|
|
56
|
+
return `anon_${Math.random().toString(36).substring(7)}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if telemetry is enabled
|
|
61
|
+
*/
|
|
62
|
+
async isEnabled() {
|
|
63
|
+
try {
|
|
64
|
+
// Check env var first
|
|
65
|
+
if (process.env.KODUS_TELEMETRY === 'false' || process.env.DO_NOT_TRACK === '1') {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
// Check config file
|
|
69
|
+
const config = await this.readConfig();
|
|
70
|
+
return config.enabled !== false; // Enabled by default
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return true; // Default to enabled
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Read telemetry config
|
|
78
|
+
*/
|
|
79
|
+
async readConfig() {
|
|
80
|
+
try {
|
|
81
|
+
const content = await fs.readFile(this.configPath, 'utf-8');
|
|
82
|
+
return JSON.parse(content);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return { enabled: true };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Write telemetry config
|
|
90
|
+
*/
|
|
91
|
+
async writeConfig(config) {
|
|
92
|
+
try {
|
|
93
|
+
const dir = path.dirname(this.configPath);
|
|
94
|
+
await fs.mkdir(dir, { recursive: true });
|
|
95
|
+
await fs.writeFile(this.configPath, JSON.stringify(config, null, 2));
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Silent fail
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Track an event
|
|
103
|
+
*/
|
|
104
|
+
async track(eventName, properties) {
|
|
105
|
+
if (!this.enabled || !this.userId) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
// Add common properties
|
|
110
|
+
const enrichedProperties = {
|
|
111
|
+
...properties,
|
|
112
|
+
cli_version: '0.1.0',
|
|
113
|
+
node_version: process.version,
|
|
114
|
+
platform: process.platform,
|
|
115
|
+
arch: process.arch,
|
|
116
|
+
timestamp: new Date().toISOString(),
|
|
117
|
+
};
|
|
118
|
+
// Remove any potentially sensitive data
|
|
119
|
+
const sanitized = this.sanitizeProperties(enrichedProperties);
|
|
120
|
+
// Send to Kodus API (which forwards to PostHog securely)
|
|
121
|
+
await this.sendEvent({
|
|
122
|
+
distinctId: this.userId,
|
|
123
|
+
event: eventName,
|
|
124
|
+
properties: sanitized,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Silent fail - telemetry should never break the CLI
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Send event to Kodus API
|
|
133
|
+
*/
|
|
134
|
+
async sendEvent(payload) {
|
|
135
|
+
try {
|
|
136
|
+
const response = await fetch(`${this.apiUrl}/v1/telemetry/events`, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: {
|
|
139
|
+
'Content-Type': 'application/json',
|
|
140
|
+
},
|
|
141
|
+
body: JSON.stringify(payload),
|
|
142
|
+
});
|
|
143
|
+
// Don't throw on failure - telemetry is best-effort
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
if (process.env.KODUS_VERBOSE) {
|
|
146
|
+
console.error('Telemetry event failed:', response.statusText);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
// Silent fail
|
|
152
|
+
if (process.env.KODUS_VERBOSE) {
|
|
153
|
+
console.error('Telemetry error:', error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Sanitize properties to remove sensitive data
|
|
159
|
+
*/
|
|
160
|
+
sanitizeProperties(properties) {
|
|
161
|
+
const sanitized = {};
|
|
162
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
163
|
+
// Skip potentially sensitive keys
|
|
164
|
+
if (key.toLowerCase().includes('password') ||
|
|
165
|
+
key.toLowerCase().includes('token') ||
|
|
166
|
+
key.toLowerCase().includes('secret') ||
|
|
167
|
+
key.toLowerCase().includes('key')) {
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
// Sanitize file paths (keep only basename)
|
|
171
|
+
if (typeof value === 'string' && (value.includes('/') || value.includes('\\'))) {
|
|
172
|
+
sanitized[key] = path.basename(value);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
sanitized[key] = value;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return sanitized;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Enable telemetry
|
|
182
|
+
*/
|
|
183
|
+
async enable() {
|
|
184
|
+
await this.writeConfig({ enabled: true });
|
|
185
|
+
this.enabled = true;
|
|
186
|
+
await this.initialize();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Disable telemetry (opt-out)
|
|
190
|
+
*/
|
|
191
|
+
async disable() {
|
|
192
|
+
await this.writeConfig({ enabled: false });
|
|
193
|
+
this.enabled = false;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Check if telemetry is currently enabled
|
|
197
|
+
*/
|
|
198
|
+
async status() {
|
|
199
|
+
return this.enabled;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Identify user (when authenticated)
|
|
203
|
+
*/
|
|
204
|
+
async identify(userId, traits) {
|
|
205
|
+
if (!this.enabled) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
await this.sendEvent({
|
|
210
|
+
distinctId: userId,
|
|
211
|
+
event: '$identify',
|
|
212
|
+
properties: {
|
|
213
|
+
$set: traits,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Silent fail
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Shutdown (cleanup)
|
|
223
|
+
*/
|
|
224
|
+
async shutdown() {
|
|
225
|
+
// No cleanup needed with HTTP-based telemetry
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
export const telemetryService = new TelemetryService();
|
|
229
|
+
//# sourceMappingURL=telemetry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.service.js","sourceRoot":"","sources":["../../src/services/telemetry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export type Severity = 'info' | 'warning' | 'error' | 'critical';
|
|
2
|
+
export type OutputFormat = 'terminal' | 'json' | 'markdown' | 'prompt';
|
|
3
|
+
export type IssueCategory = 'security_vulnerability' | 'performance' | 'code_quality' | 'best_practices' | 'style' | 'bug' | 'complexity' | 'maintainability';
|
|
4
|
+
export interface AuthResponse {
|
|
5
|
+
accessToken: string;
|
|
6
|
+
refreshToken: string;
|
|
7
|
+
expiresIn: number;
|
|
8
|
+
user: UserInfo;
|
|
9
|
+
}
|
|
10
|
+
export interface UserInfo {
|
|
11
|
+
id: string;
|
|
12
|
+
email: string;
|
|
13
|
+
orgs: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface StoredCredentials {
|
|
16
|
+
accessToken: string;
|
|
17
|
+
refreshToken: string;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
user: UserInfo;
|
|
20
|
+
}
|
|
21
|
+
export interface ReviewConfig {
|
|
22
|
+
org?: string;
|
|
23
|
+
repo?: string;
|
|
24
|
+
severity?: Severity;
|
|
25
|
+
rules?: {
|
|
26
|
+
security?: boolean;
|
|
27
|
+
performance?: boolean;
|
|
28
|
+
style?: boolean;
|
|
29
|
+
bestPractices?: boolean;
|
|
30
|
+
};
|
|
31
|
+
rulesOnly?: boolean;
|
|
32
|
+
fast?: boolean;
|
|
33
|
+
files?: FileContent[];
|
|
34
|
+
}
|
|
35
|
+
export interface CodeFix {
|
|
36
|
+
type: 'replace' | 'insert' | 'delete';
|
|
37
|
+
startLine: number;
|
|
38
|
+
endLine: number;
|
|
39
|
+
oldCode: string;
|
|
40
|
+
newCode: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ReviewIssue {
|
|
43
|
+
file: string;
|
|
44
|
+
line: number;
|
|
45
|
+
endLine?: number;
|
|
46
|
+
severity: Severity;
|
|
47
|
+
category?: IssueCategory;
|
|
48
|
+
message: string;
|
|
49
|
+
suggestion?: string;
|
|
50
|
+
recommendation?: string;
|
|
51
|
+
ruleId?: string;
|
|
52
|
+
fixable?: boolean;
|
|
53
|
+
fix?: CodeFix;
|
|
54
|
+
}
|
|
55
|
+
export interface ReviewResult {
|
|
56
|
+
summary: string;
|
|
57
|
+
issues: ReviewIssue[];
|
|
58
|
+
filesAnalyzed: number;
|
|
59
|
+
duration: number;
|
|
60
|
+
}
|
|
61
|
+
export interface PullRequestSuggestionsResponse {
|
|
62
|
+
summary?: string;
|
|
63
|
+
issues?: ReviewIssue[];
|
|
64
|
+
suggestions?: ReviewIssue[];
|
|
65
|
+
filesAnalyzed?: number;
|
|
66
|
+
duration?: number;
|
|
67
|
+
markdown?: string;
|
|
68
|
+
deliveryStatus?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface TrialReviewResult extends ReviewResult {
|
|
71
|
+
trialInfo: {
|
|
72
|
+
reviewsUsed: number;
|
|
73
|
+
reviewsLimit: number;
|
|
74
|
+
resetsAt: string;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export interface RemoteConfig {
|
|
78
|
+
language: string;
|
|
79
|
+
severity: Severity;
|
|
80
|
+
rules: {
|
|
81
|
+
security: boolean;
|
|
82
|
+
performance: boolean;
|
|
83
|
+
style: boolean;
|
|
84
|
+
bestPractices: boolean;
|
|
85
|
+
};
|
|
86
|
+
ignore: string[];
|
|
87
|
+
llmProvider: 'kodus' | 'byok';
|
|
88
|
+
}
|
|
89
|
+
export interface TrialStatus {
|
|
90
|
+
fingerprint: string;
|
|
91
|
+
reviewsUsed: number;
|
|
92
|
+
reviewsLimit: number;
|
|
93
|
+
filesLimit: number;
|
|
94
|
+
linesLimit: number;
|
|
95
|
+
resetsAt: string;
|
|
96
|
+
isLimited: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface FileDiff {
|
|
99
|
+
file: string;
|
|
100
|
+
status: 'added' | 'modified' | 'deleted' | 'renamed';
|
|
101
|
+
additions: number;
|
|
102
|
+
deletions: number;
|
|
103
|
+
diff: string;
|
|
104
|
+
}
|
|
105
|
+
export interface FileContent {
|
|
106
|
+
path: string;
|
|
107
|
+
content: string;
|
|
108
|
+
status: 'added' | 'modified' | 'deleted' | 'renamed';
|
|
109
|
+
diff: string;
|
|
110
|
+
}
|
|
111
|
+
export interface ProjectContext {
|
|
112
|
+
cursorRules?: string;
|
|
113
|
+
claudeRules?: string;
|
|
114
|
+
kodusRules?: string;
|
|
115
|
+
customContext?: string;
|
|
116
|
+
}
|
|
117
|
+
export interface GlobalOptions {
|
|
118
|
+
format: OutputFormat;
|
|
119
|
+
output?: string;
|
|
120
|
+
verbose: boolean;
|
|
121
|
+
quiet: boolean;
|
|
122
|
+
org?: string;
|
|
123
|
+
repo?: string;
|
|
124
|
+
interactive?: boolean;
|
|
125
|
+
promptOnly?: boolean;
|
|
126
|
+
fix?: boolean;
|
|
127
|
+
context?: string;
|
|
128
|
+
}
|
|
129
|
+
export declare class ApiError extends Error {
|
|
130
|
+
statusCode: number;
|
|
131
|
+
constructor(statusCode: number, message: string);
|
|
132
|
+
}
|
|
133
|
+
export declare class AuthError extends Error {
|
|
134
|
+
constructor(message: string);
|
|
135
|
+
}
|
|
136
|
+
export interface GitInfo {
|
|
137
|
+
userEmail?: string;
|
|
138
|
+
remote?: string | null;
|
|
139
|
+
branch?: string;
|
|
140
|
+
commitSha?: string;
|
|
141
|
+
}
|
|
142
|
+
export type PlatformType = 'GITHUB' | 'GITLAB' | 'BITBUCKET' | 'AZURE_REPOS' | undefined;
|
|
143
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AACjE,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;AACvE,MAAM,MAAM,aAAa,GACrB,wBAAwB,GACxB,aAAa,GACb,cAAc,GACd,gBAAgB,GAChB,OAAO,GACP,KAAK,GACL,YAAY,GACZ,iBAAiB,CAAC;AAEtB,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE;QACL,QAAQ,EAAE,OAAO,CAAC;QAClB,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,OAAO,GAAG,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,QAAS,SAAQ,KAAK;IAExB,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM,EACzB,OAAO,EAAE,MAAM;CAKlB;AAED,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class ApiError extends Error {
|
|
2
|
+
statusCode;
|
|
3
|
+
constructor(statusCode, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.statusCode = statusCode;
|
|
6
|
+
this.name = 'ApiError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class AuthError extends Error {
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'AuthError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAwJA,MAAM,OAAO,QAAS,SAAQ,KAAK;IAExB;IADT,YACS,UAAkB,EACzB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,eAAU,GAAV,UAAU,CAAQ;QAIzB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ReviewResult } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Interactive UI - Navigable interface for reviewing issues
|
|
4
|
+
*/
|
|
5
|
+
declare class InteractiveUI {
|
|
6
|
+
private getSeverityColor;
|
|
7
|
+
private getSeverityIcon;
|
|
8
|
+
private formatIssueTitle;
|
|
9
|
+
private displayIssueDetails;
|
|
10
|
+
private showFixPreview;
|
|
11
|
+
private groupIssuesByFile;
|
|
12
|
+
private getFileStats;
|
|
13
|
+
private formatCategoryBadge;
|
|
14
|
+
private formatFileChoice;
|
|
15
|
+
run(result: ReviewResult): Promise<void>;
|
|
16
|
+
private generateFixPrompt;
|
|
17
|
+
private copyToClipboard;
|
|
18
|
+
private reviewFileIssues;
|
|
19
|
+
/**
|
|
20
|
+
* Quick fix mode - applies all fixable issues automatically
|
|
21
|
+
*/
|
|
22
|
+
runQuickFix(result: ReviewResult): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export declare const interactiveUI: InteractiveUI;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=interactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/ui/interactive.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAGnE;;GAEG;AACH,cAAM,aAAa;IACjB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,mBAAmB;YAyCb,cAAc;IA2B5B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,gBAAgB;IAqBlB,GAAG,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAiF9C,OAAO,CAAC,iBAAiB;YAyBX,eAAe;YAef,gBAAgB;IAsG9B;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAsCvD;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|