@neurcode-ai/cli 0.7.12 → 0.8.1
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/dist/api-client.d.ts +38 -18
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +226 -121
- package/dist/api-client.js.map +1 -1
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +127 -1
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +56 -13
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +14 -11
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +95 -33
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +47 -57
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +245 -11
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/revert.d.ts.map +1 -1
- package/dist/commands/revert.js +82 -0
- package/dist/commands/revert.js.map +1 -1
- package/dist/commands/session.d.ts +29 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +382 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +177 -8
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +20 -15
- package/dist/commands/watch.js.map +1 -1
- package/dist/index.js +78 -3
- package/dist/index.js.map +1 -1
- package/dist/services/integrations/TicketService.d.ts +68 -0
- package/dist/services/integrations/TicketService.d.ts.map +1 -0
- package/dist/services/integrations/TicketService.js +151 -0
- package/dist/services/integrations/TicketService.js.map +1 -0
- package/dist/services/security/SecurityGuard.d.ts +88 -0
- package/dist/services/security/SecurityGuard.d.ts.map +1 -0
- package/dist/services/security/SecurityGuard.js +576 -0
- package/dist/services/security/SecurityGuard.js.map +1 -0
- package/dist/services/watch/Syncer.d.ts.map +1 -1
- package/dist/services/watch/Syncer.js +22 -1
- package/dist/services/watch/Syncer.js.map +1 -1
- package/dist/utils/ROILogger.d.ts +16 -0
- package/dist/utils/ROILogger.d.ts.map +1 -0
- package/dist/utils/ROILogger.js +45 -0
- package/dist/utils/ROILogger.js.map +1 -0
- package/dist/utils/box.d.ts +16 -0
- package/dist/utils/box.d.ts.map +1 -0
- package/dist/utils/box.js +85 -0
- package/dist/utils/box.js.map +1 -0
- package/dist/utils/messages.d.ts +81 -0
- package/dist/utils/messages.d.ts.map +1 -0
- package/dist/utils/messages.js +306 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/tier.d.ts +21 -0
- package/dist/utils/tier.d.ts.map +1 -0
- package/dist/utils/tier.js +150 -0
- package/dist/utils/tier.js.map +1 -0
- package/dist/utils/user-context.d.ts +28 -0
- package/dist/utils/user-context.d.ts.map +1 -0
- package/dist/utils/user-context.js +68 -0
- package/dist/utils/user-context.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Enhanced Messaging Utility
|
|
4
|
+
*
|
|
5
|
+
* Provides enterprise-grade, personalized CLI messaging with consistent formatting,
|
|
6
|
+
* helpful error messages, and actionable next steps.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getUserFirstName = exports.getUserInfo = void 0;
|
|
10
|
+
exports.printGreeting = printGreeting;
|
|
11
|
+
exports.printSuccess = printSuccess;
|
|
12
|
+
exports.printWarning = printWarning;
|
|
13
|
+
exports.printError = printError;
|
|
14
|
+
exports.printInfo = printInfo;
|
|
15
|
+
exports.printSection = printSection;
|
|
16
|
+
exports.printStep = printStep;
|
|
17
|
+
exports.printProgress = printProgress;
|
|
18
|
+
exports.printProgressComplete = printProgressComplete;
|
|
19
|
+
exports.printAuthError = printAuthError;
|
|
20
|
+
exports.printProjectError = printProjectError;
|
|
21
|
+
exports.printSuccessBanner = printSuccessBanner;
|
|
22
|
+
exports.printCommandHelp = printCommandHelp;
|
|
23
|
+
exports.printWaiting = printWaiting;
|
|
24
|
+
exports.clearWaiting = clearWaiting;
|
|
25
|
+
exports.printVerificationResult = printVerificationResult;
|
|
26
|
+
exports.printTable = printTable;
|
|
27
|
+
exports.printWelcomeBanner = printWelcomeBanner;
|
|
28
|
+
const user_context_1 = require("./user-context");
|
|
29
|
+
Object.defineProperty(exports, "getUserInfo", { enumerable: true, get: function () { return user_context_1.getUserInfo; } });
|
|
30
|
+
Object.defineProperty(exports, "getUserFirstName", { enumerable: true, get: function () { return user_context_1.getUserFirstName; } });
|
|
31
|
+
// Import chalk with fallback
|
|
32
|
+
let chalkInstance;
|
|
33
|
+
try {
|
|
34
|
+
chalkInstance = require('chalk');
|
|
35
|
+
// Disable colors in CI environments
|
|
36
|
+
if (process.env.CI === 'true' || process.env.GITHUB_ACTIONS === 'true') {
|
|
37
|
+
chalkInstance.level = 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
chalkInstance = {
|
|
42
|
+
green: (str) => str,
|
|
43
|
+
yellow: (str) => str,
|
|
44
|
+
red: (str) => str,
|
|
45
|
+
bold: (str) => str,
|
|
46
|
+
dim: (str) => str,
|
|
47
|
+
cyan: (str) => str,
|
|
48
|
+
white: (str) => str,
|
|
49
|
+
blue: (str) => str,
|
|
50
|
+
magenta: (str) => str,
|
|
51
|
+
gray: (str) => str,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Print a personalized greeting
|
|
56
|
+
*/
|
|
57
|
+
async function printGreeting(message) {
|
|
58
|
+
const firstName = await (0, user_context_1.getUserFirstName)();
|
|
59
|
+
console.log(chalkInstance.cyan(`\n👋 Hello ${firstName}!\n`));
|
|
60
|
+
console.log(chalkInstance.dim(message));
|
|
61
|
+
console.log('');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Print a success message with premium formatting
|
|
65
|
+
*/
|
|
66
|
+
function printSuccess(message, details) {
|
|
67
|
+
console.log(chalkInstance.green(`\n✨ ${message}\n`));
|
|
68
|
+
if (details) {
|
|
69
|
+
console.log(chalkInstance.dim(` ${details}`));
|
|
70
|
+
console.log('');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Print a warning message with helpful context
|
|
75
|
+
*/
|
|
76
|
+
function printWarning(message, suggestion) {
|
|
77
|
+
console.log(chalkInstance.yellow(`\n⚠️ ${message}\n`));
|
|
78
|
+
if (suggestion) {
|
|
79
|
+
console.log(chalkInstance.dim(` 💡 ${suggestion}\n`));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Print an error message with actionable next steps
|
|
84
|
+
*/
|
|
85
|
+
function printError(message, error, nextSteps) {
|
|
86
|
+
console.log(chalkInstance.red(`\n❌ ${message}\n`));
|
|
87
|
+
if (error) {
|
|
88
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
89
|
+
console.log(chalkInstance.dim(` Error: ${errorMessage}`));
|
|
90
|
+
console.log('');
|
|
91
|
+
}
|
|
92
|
+
if (nextSteps && nextSteps.length > 0) {
|
|
93
|
+
console.log(chalkInstance.bold.white(' Next steps:'));
|
|
94
|
+
nextSteps.forEach(step => {
|
|
95
|
+
console.log(chalkInstance.dim(` • ${step}`));
|
|
96
|
+
});
|
|
97
|
+
console.log('');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Print an info message
|
|
102
|
+
*/
|
|
103
|
+
function printInfo(message, details) {
|
|
104
|
+
console.log(chalkInstance.cyan(`\nℹ️ ${message}\n`));
|
|
105
|
+
if (details) {
|
|
106
|
+
console.log(chalkInstance.dim(` ${details}`));
|
|
107
|
+
console.log('');
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Print a section header with premium styling
|
|
112
|
+
*/
|
|
113
|
+
function printSection(title, emoji = '▸') {
|
|
114
|
+
console.log(chalkInstance.bold.white(`\n${emoji} ${title}\n`));
|
|
115
|
+
console.log(chalkInstance.dim('─────────────────────────────────────────────────────────'));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Print a step indicator
|
|
119
|
+
*/
|
|
120
|
+
function printStep(step, total, description) {
|
|
121
|
+
console.log(chalkInstance.dim(`[${step}/${total}]`), chalkInstance.white(description));
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Print a progress indicator
|
|
125
|
+
*/
|
|
126
|
+
function printProgress(message) {
|
|
127
|
+
process.stdout.write(chalkInstance.dim(` ${message}... `));
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Print completion of progress
|
|
131
|
+
*/
|
|
132
|
+
function printProgressComplete(success = true) {
|
|
133
|
+
if (success) {
|
|
134
|
+
console.log(chalkInstance.green('✓'));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
console.log(chalkInstance.red('✗'));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Print authentication-related errors with helpful suggestions
|
|
142
|
+
*/
|
|
143
|
+
async function printAuthError(error) {
|
|
144
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
145
|
+
if (errorMessage.includes('401') || errorMessage.includes('Unauthorized')) {
|
|
146
|
+
printError('Authentication Failed', error, [
|
|
147
|
+
'Your API key may be invalid or expired',
|
|
148
|
+
'Run: neurcode login',
|
|
149
|
+
'Verify your credentials in ~/.neurcoderc'
|
|
150
|
+
]);
|
|
151
|
+
}
|
|
152
|
+
else if (errorMessage.includes('403') || errorMessage.includes('Forbidden')) {
|
|
153
|
+
printError('Access Denied', error, [
|
|
154
|
+
'Your API key may not have the required permissions',
|
|
155
|
+
'Contact your administrator to verify access',
|
|
156
|
+
'Try running: neurcode logout && neurcode login'
|
|
157
|
+
]);
|
|
158
|
+
}
|
|
159
|
+
else if (errorMessage.includes('Network') || errorMessage.includes('fetch')) {
|
|
160
|
+
printError('Network Connection Failed', error, [
|
|
161
|
+
'Check your internet connection',
|
|
162
|
+
'Verify the API URL: neurcode doctor',
|
|
163
|
+
'Check firewall/proxy settings',
|
|
164
|
+
'Try again in a few moments'
|
|
165
|
+
]);
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
printError('Authentication Error', error);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Print project-related errors with helpful suggestions
|
|
173
|
+
*/
|
|
174
|
+
function printProjectError(error, projectId) {
|
|
175
|
+
const errorMessage = error instanceof Error ? error.message : error;
|
|
176
|
+
const nextSteps = [];
|
|
177
|
+
if (errorMessage.includes('not found') || errorMessage.includes('404')) {
|
|
178
|
+
nextSteps.push('The project may have been deleted or you don\'t have access');
|
|
179
|
+
nextSteps.push('List your projects: neurcode init');
|
|
180
|
+
nextSteps.push('Create a new project: neurcode init');
|
|
181
|
+
}
|
|
182
|
+
else if (!projectId) {
|
|
183
|
+
nextSteps.push('No project is configured for this directory');
|
|
184
|
+
nextSteps.push('Run: neurcode init');
|
|
185
|
+
nextSteps.push('Or set project ID: neurcode config --project-id <id>');
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
nextSteps.push('Verify project configuration: neurcode doctor');
|
|
189
|
+
nextSteps.push('Check project access: neurcode init');
|
|
190
|
+
}
|
|
191
|
+
printError('Project Error', error, nextSteps);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Print a beautiful success banner
|
|
195
|
+
*/
|
|
196
|
+
async function printSuccessBanner(title, subtitle) {
|
|
197
|
+
const firstName = await (0, user_context_1.getUserFirstName)();
|
|
198
|
+
console.log('');
|
|
199
|
+
console.log(chalkInstance.green('═══════════════════════════════════════════════════════════'));
|
|
200
|
+
console.log(chalkInstance.bold.green(` ✨ ${title}`));
|
|
201
|
+
if (subtitle) {
|
|
202
|
+
console.log(chalkInstance.dim(` ${subtitle}`));
|
|
203
|
+
}
|
|
204
|
+
console.log(chalkInstance.green('═══════════════════════════════════════════════════════════'));
|
|
205
|
+
console.log('');
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Print command-specific help in errors
|
|
209
|
+
*/
|
|
210
|
+
function printCommandHelp(command, options) {
|
|
211
|
+
console.log(chalkInstance.bold.white('\n Usage:'));
|
|
212
|
+
console.log(chalkInstance.dim(` $ neurcode ${command}${options ? ' ' + options.join(' ') : ''}`));
|
|
213
|
+
if (options && options.length > 0) {
|
|
214
|
+
console.log(chalkInstance.dim('\n Common options:'));
|
|
215
|
+
options.forEach(opt => {
|
|
216
|
+
console.log(chalkInstance.dim(` ${opt}`));
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
console.log('');
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Print waiting/progress message with spinner (simple version)
|
|
223
|
+
*/
|
|
224
|
+
function printWaiting(message, showDots = true) {
|
|
225
|
+
if (showDots) {
|
|
226
|
+
process.stdout.write(chalkInstance.dim(` ${message}`));
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
console.log(chalkInstance.dim(` ${message}`));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Clear waiting message
|
|
234
|
+
*/
|
|
235
|
+
function clearWaiting() {
|
|
236
|
+
process.stdout.write('\r');
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Print verification result with detailed breakdown
|
|
240
|
+
*/
|
|
241
|
+
function printVerificationResult(passed, score, warnings, violations) {
|
|
242
|
+
if (passed) {
|
|
243
|
+
if (score !== undefined) {
|
|
244
|
+
printSuccess(`Verification Passed`, `Your code scored ${score}% and meets all governance requirements`);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
printSuccess('Verification Passed', 'Your code meets all governance requirements');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
const details = [];
|
|
252
|
+
if (violations !== undefined && violations > 0) {
|
|
253
|
+
details.push(`${violations} violation(s) found`);
|
|
254
|
+
}
|
|
255
|
+
if (warnings !== undefined && warnings > 0) {
|
|
256
|
+
details.push(`${warnings} warning(s) found`);
|
|
257
|
+
}
|
|
258
|
+
if (score !== undefined) {
|
|
259
|
+
details.push(`Score: ${score}%`);
|
|
260
|
+
}
|
|
261
|
+
printError('Verification Failed', undefined, details.length > 0 ? details : undefined);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Print a table-like output for structured data
|
|
266
|
+
*/
|
|
267
|
+
function printTable(rows) {
|
|
268
|
+
// Find max width for each column
|
|
269
|
+
const maxWidths = rows[0].map((_, colIndex) => {
|
|
270
|
+
return Math.max(...rows.map(row => row[colIndex]?.length || 0));
|
|
271
|
+
});
|
|
272
|
+
rows.forEach((row, index) => {
|
|
273
|
+
const formatted = row.map((cell, colIndex) => {
|
|
274
|
+
const width = maxWidths[colIndex];
|
|
275
|
+
return cell.padEnd(width);
|
|
276
|
+
});
|
|
277
|
+
if (index === 0) {
|
|
278
|
+
console.log(chalkInstance.bold.white(formatted.join(' ')));
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
console.log(chalkInstance.dim(formatted.join(' ')));
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
console.log('');
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Print a big welcome banner (like other enterprise CLIs)
|
|
288
|
+
*/
|
|
289
|
+
async function printWelcomeBanner() {
|
|
290
|
+
const userInfo = await (0, user_context_1.getUserInfo)();
|
|
291
|
+
const userName = userInfo?.displayName || userInfo?.email || 'there';
|
|
292
|
+
console.log('');
|
|
293
|
+
console.log(chalkInstance.bold.cyan('═══════════════════════════════════════════════════════════'));
|
|
294
|
+
console.log(chalkInstance.bold.cyan(' '));
|
|
295
|
+
console.log(chalkInstance.bold.white(' 🚀 Welcome to Neurcode 🚀 '));
|
|
296
|
+
console.log(chalkInstance.bold.cyan(' '));
|
|
297
|
+
if (userInfo) {
|
|
298
|
+
console.log(chalkInstance.dim(` Hello, ${userName}! 👋 `));
|
|
299
|
+
}
|
|
300
|
+
console.log(chalkInstance.bold.cyan(' '));
|
|
301
|
+
console.log(chalkInstance.bold.cyan('═══════════════════════════════════════════════════════════'));
|
|
302
|
+
console.log('');
|
|
303
|
+
console.log(chalkInstance.dim(' AI-powered code governance and intelligent diff analysis '));
|
|
304
|
+
console.log('');
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/utils/messages.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAkCH,sCAKC;AAKD,oCAMC;AAKD,oCAKC;AAKD,gCAgBC;AAKD,8BAMC;AAKD,oCAGC;AAKD,8BAEC;AAKD,sCAEC;AAKD,sDAMC;AAKD,wCAqCC;AAKD,8CAmBC;AAKD,gDAWC;AAKD,4CAUC;AAKD,oCAMC;AAKD,oCAEC;AAKD,0DAiCC;AAKD,gCAmBC;AAKD,gDAiBC;AAjUD,iDAA+D;AAGtD,4FAHA,0BAAW,OAGA;AAAE,iGAHA,+BAAgB,OAGA;AAEtC,6BAA6B;AAC7B,IAAI,aAAkB,CAAC;AACvB,IAAI,CAAC;IACH,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,oCAAoC;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;QACvE,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAAC,MAAM,CAAC;IACP,aAAa,GAAG;QACd,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC3B,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC5B,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QACzB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC1B,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QACzB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC1B,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC3B,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC1B,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;QAC7B,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,SAAS,GAAG,MAAM,IAAA,+BAAgB,GAAE,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,SAAS,KAAK,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,OAAgB;IAC5D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,UAAmB;IAC/D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,OAAO,IAAI,CAAC,CAAC,CAAC;IACxD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,UAAU,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,OAAe,EAAE,KAAsB,EAAE,SAAoB;IACtF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC;IAEnD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,YAAY,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACxD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,OAAe,EAAE,OAAgB;IACzD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,CAAC,CAAC;IACtD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,KAAa,EAAE,QAAgB,GAAG;IAC7D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;GAEG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,KAAa,EAAE,WAAmB;IACxE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,UAAmB,IAAI;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,KAAqB;IACxD,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAEpE,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1E,UAAU,CACR,uBAAuB,EACvB,KAAK,EACL;YACE,wCAAwC;YACxC,qBAAqB;YACrB,0CAA0C;SAC3C,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9E,UAAU,CACR,eAAe,EACf,KAAK,EACL;YACE,oDAAoD;YACpD,6CAA6C;YAC7C,gDAAgD;SACjD,CACF,CAAC;IACJ,CAAC;SAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,UAAU,CACR,2BAA2B,EAC3B,KAAK,EACL;YACE,gCAAgC;YAChC,qCAAqC;YACrC,+BAA+B;YAC/B,4BAA4B;SAC7B,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,KAAqB,EAAE,SAAkB;IACzE,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAEpE,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvE,SAAS,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC9E,SAAS,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACpD,SAAS,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC9D,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAChE,SAAS,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACxD,CAAC;IAED,UAAU,CAAC,eAAe,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,KAAa,EAAE,QAAiB;IACvE,MAAM,SAAS,GAAG,MAAM,IAAA,+BAAgB,GAAE,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;IAChG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,OAAe,EAAE,OAAkB;IAClE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,iBAAiB,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpG,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,WAAoB,IAAI;IACpE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CACrC,MAAe,EACf,KAAc,EACd,QAAiB,EACjB,UAAmB;IAEnB,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CACV,qBAAqB,EACrB,oBAAoB,KAAK,yCAAyC,CACnE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,qBAAqB,EAAE,6CAA6C,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,qBAAqB,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,mBAAmB,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC;QACnC,CAAC;QAED,UAAU,CACR,qBAAqB,EACrB,SAAS,EACT,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CACzC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,IAAgB;IACzC,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB;IACtC,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAW,GAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,QAAQ,EAAE,WAAW,IAAI,QAAQ,EAAE,KAAK,IAAI,OAAO,CAAC;IAErE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACpG,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,0BAA0B,QAAQ,gCAAgC,CAAC,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier Utility
|
|
3
|
+
*
|
|
4
|
+
* Fetches and caches user tier to minimize API latency.
|
|
5
|
+
* Caches tier in .neurcode/config.json for the session.
|
|
6
|
+
*/
|
|
7
|
+
export type UserTier = 'FREE' | 'PRO';
|
|
8
|
+
/**
|
|
9
|
+
* Get user tier from API or cache
|
|
10
|
+
* Defaults to 'FREE' if tier cannot be determined
|
|
11
|
+
*/
|
|
12
|
+
export declare function getUserTier(): Promise<UserTier>;
|
|
13
|
+
/**
|
|
14
|
+
* Clear tier cache (useful after tier changes)
|
|
15
|
+
*/
|
|
16
|
+
export declare function clearTierCache(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Check if user has PRO tier
|
|
19
|
+
*/
|
|
20
|
+
export declare function isProUser(): Promise<boolean>;
|
|
21
|
+
//# sourceMappingURL=tier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier.d.ts","sourceRoot":"","sources":["../../src/utils/tier.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAUtC;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,CA+ErD;AAwCD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAiBrC;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAGlD"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tier Utility
|
|
4
|
+
*
|
|
5
|
+
* Fetches and caches user tier to minimize API latency.
|
|
6
|
+
* Caches tier in .neurcode/config.json for the session.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getUserTier = getUserTier;
|
|
10
|
+
exports.clearTierCache = clearTierCache;
|
|
11
|
+
exports.isProUser = isProUser;
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
const config_1 = require("../config");
|
|
15
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
16
|
+
let memoryCache = null;
|
|
17
|
+
/**
|
|
18
|
+
* Get user tier from API or cache
|
|
19
|
+
* Defaults to 'FREE' if tier cannot be determined
|
|
20
|
+
*/
|
|
21
|
+
async function getUserTier() {
|
|
22
|
+
try {
|
|
23
|
+
// Check memory cache first
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
if (memoryCache && (now - memoryCache.cachedAt) < CACHE_TTL) {
|
|
26
|
+
return memoryCache.tier;
|
|
27
|
+
}
|
|
28
|
+
// Check file cache
|
|
29
|
+
const neurcodeDir = (0, path_1.join)(process.cwd(), '.neurcode');
|
|
30
|
+
const configPath = (0, path_1.join)(neurcodeDir, 'config.json');
|
|
31
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
32
|
+
try {
|
|
33
|
+
const fileContent = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
34
|
+
const config = JSON.parse(fileContent);
|
|
35
|
+
if (config.tier && config.tierCachedAt) {
|
|
36
|
+
const cacheAge = now - config.tierCachedAt;
|
|
37
|
+
if (cacheAge < CACHE_TTL) {
|
|
38
|
+
const tier = config.tier;
|
|
39
|
+
memoryCache = { tier, cachedAt: config.tierCachedAt };
|
|
40
|
+
return tier;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// Ignore parse errors, continue to API fetch
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Fetch from API
|
|
49
|
+
const config = (0, config_1.loadConfig)();
|
|
50
|
+
if (!config.apiKey) {
|
|
51
|
+
// No API key, default to FREE
|
|
52
|
+
return 'FREE';
|
|
53
|
+
}
|
|
54
|
+
const apiUrl = (config.apiUrl || 'https://api.neurcode.com').replace(/\/$/, '');
|
|
55
|
+
const apiKey = config.apiKey;
|
|
56
|
+
// Try to get tier from subscription endpoint
|
|
57
|
+
try {
|
|
58
|
+
const response = await fetch(`${apiUrl}/api/v1/subscriptions/status`, {
|
|
59
|
+
method: 'GET',
|
|
60
|
+
headers: {
|
|
61
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
// If not authorized or subscription not found, default to FREE
|
|
67
|
+
return 'FREE';
|
|
68
|
+
}
|
|
69
|
+
const subscription = await response.json();
|
|
70
|
+
// PRO tier if: professional plan AND (active status OR trial status)
|
|
71
|
+
const tier = subscription.plan.slug === 'professional' &&
|
|
72
|
+
(subscription.status === 'active' || subscription.status === 'trial' || subscription.isTrial)
|
|
73
|
+
? 'PRO' : 'FREE';
|
|
74
|
+
// Cache the tier
|
|
75
|
+
cacheTier(tier);
|
|
76
|
+
return tier;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
// If subscription endpoint fails, default to FREE
|
|
80
|
+
// Don't log warning to avoid noise - this is expected for FREE users
|
|
81
|
+
return 'FREE';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// Fail-safe: default to FREE
|
|
86
|
+
return 'FREE';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Cache tier in memory and file
|
|
91
|
+
*/
|
|
92
|
+
function cacheTier(tier) {
|
|
93
|
+
const now = Date.now();
|
|
94
|
+
memoryCache = { tier, cachedAt: now };
|
|
95
|
+
try {
|
|
96
|
+
const neurcodeDir = (0, path_1.join)(process.cwd(), '.neurcode');
|
|
97
|
+
const configPath = (0, path_1.join)(neurcodeDir, 'config.json');
|
|
98
|
+
// Ensure .neurcode directory exists
|
|
99
|
+
if (!(0, fs_1.existsSync)(neurcodeDir)) {
|
|
100
|
+
(0, fs_1.mkdirSync)(neurcodeDir, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
// Read existing config or create new
|
|
103
|
+
let config = {};
|
|
104
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
105
|
+
try {
|
|
106
|
+
const fileContent = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
107
|
+
config = JSON.parse(fileContent);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
// If parse fails, start with empty config
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Update tier cache
|
|
114
|
+
config.tier = tier;
|
|
115
|
+
config.tierCachedAt = now;
|
|
116
|
+
// Write back to file
|
|
117
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// Ignore file write errors - memory cache is still valid
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Clear tier cache (useful after tier changes)
|
|
125
|
+
*/
|
|
126
|
+
function clearTierCache() {
|
|
127
|
+
memoryCache = null;
|
|
128
|
+
try {
|
|
129
|
+
const neurcodeDir = (0, path_1.join)(process.cwd(), '.neurcode');
|
|
130
|
+
const configPath = (0, path_1.join)(neurcodeDir, 'config.json');
|
|
131
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
132
|
+
const fileContent = (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
133
|
+
const config = JSON.parse(fileContent);
|
|
134
|
+
delete config.tier;
|
|
135
|
+
delete config.tierCachedAt;
|
|
136
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
// Ignore errors
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if user has PRO tier
|
|
145
|
+
*/
|
|
146
|
+
async function isProUser() {
|
|
147
|
+
const tier = await getUserTier();
|
|
148
|
+
return tier === 'PRO';
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=tier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier.js","sourceRoot":"","sources":["../../src/utils/tier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Context Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides user information (name, email) for personalized CLI messaging.
|
|
5
|
+
* Caches user info to avoid repeated API calls.
|
|
6
|
+
*/
|
|
7
|
+
export interface UserInfo {
|
|
8
|
+
id: string;
|
|
9
|
+
email: string;
|
|
10
|
+
firstName?: string;
|
|
11
|
+
lastName?: string;
|
|
12
|
+
imageUrl?: string;
|
|
13
|
+
displayName: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get current user information
|
|
17
|
+
* Uses cache to avoid repeated API calls
|
|
18
|
+
*/
|
|
19
|
+
export declare function getUserInfo(): Promise<UserInfo | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Clear cached user info (useful after logout)
|
|
22
|
+
*/
|
|
23
|
+
export declare function clearUserCache(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Get user's first name or fallback
|
|
26
|
+
*/
|
|
27
|
+
export declare function getUserFirstName(): Promise<string>;
|
|
28
|
+
//# sourceMappingURL=user-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-context.d.ts","sourceRoot":"","sources":["../../src/utils/user-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoC5D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAGxD"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* User Context Utility
|
|
4
|
+
*
|
|
5
|
+
* Provides user information (name, email) for personalized CLI messaging.
|
|
6
|
+
* Caches user info to avoid repeated API calls.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getUserInfo = getUserInfo;
|
|
10
|
+
exports.clearUserCache = clearUserCache;
|
|
11
|
+
exports.getUserFirstName = getUserFirstName;
|
|
12
|
+
const config_1 = require("../config");
|
|
13
|
+
const api_client_1 = require("../api-client");
|
|
14
|
+
let cachedUserInfo = null;
|
|
15
|
+
let cacheTimestamp = 0;
|
|
16
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
17
|
+
/**
|
|
18
|
+
* Get current user information
|
|
19
|
+
* Uses cache to avoid repeated API calls
|
|
20
|
+
*/
|
|
21
|
+
async function getUserInfo() {
|
|
22
|
+
try {
|
|
23
|
+
// Return cached info if still valid
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
if (cachedUserInfo && (now - cacheTimestamp) < CACHE_TTL) {
|
|
26
|
+
return cachedUserInfo;
|
|
27
|
+
}
|
|
28
|
+
const config = (0, config_1.loadConfig)();
|
|
29
|
+
if (!config.apiKey) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const client = new api_client_1.ApiClient(config);
|
|
33
|
+
const user = await client.getCurrentUser();
|
|
34
|
+
// Build display name
|
|
35
|
+
const displayName = user.firstName && user.lastName
|
|
36
|
+
? `${user.firstName} ${user.lastName}`
|
|
37
|
+
: user.firstName || user.lastName || user.email.split('@')[0] || 'User';
|
|
38
|
+
cachedUserInfo = {
|
|
39
|
+
id: user.id,
|
|
40
|
+
email: user.email,
|
|
41
|
+
firstName: user.firstName,
|
|
42
|
+
lastName: user.lastName,
|
|
43
|
+
imageUrl: user.imageUrl,
|
|
44
|
+
displayName,
|
|
45
|
+
};
|
|
46
|
+
cacheTimestamp = now;
|
|
47
|
+
return cachedUserInfo;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// Silently fail - user info is optional for messaging
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clear cached user info (useful after logout)
|
|
56
|
+
*/
|
|
57
|
+
function clearUserCache() {
|
|
58
|
+
cachedUserInfo = null;
|
|
59
|
+
cacheTimestamp = 0;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get user's first name or fallback
|
|
63
|
+
*/
|
|
64
|
+
async function getUserFirstName() {
|
|
65
|
+
const user = await getUserInfo();
|
|
66
|
+
return user?.firstName || user?.displayName.split(' ')[0] || 'there';
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=user-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-context.js","sourceRoot":"","sources":["../../src/utils/user-context.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAsBH,kCAoCC;AAKD,wCAGC;AAKD,4CAGC;AAxED,sCAAuC;AACvC,8CAA0C;AAW1C,IAAI,cAAc,GAAoB,IAAI,CAAC;AAC3C,IAAI,cAAc,GAAW,CAAC,CAAC;AAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE7C;;;GAGG;AACI,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,cAAc,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,GAAG,SAAS,EAAE,CAAC;YACzD,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC;QAE3C,qBAAqB;QACrB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ;YACjD,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;YACtC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAE1E,cAAc,GAAG;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW;SACZ,CAAC;QAEF,cAAc,GAAG,GAAG,CAAC;QACrB,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,cAAc,GAAG,IAAI,CAAC;IACtB,cAAc,GAAG,CAAC,CAAC;AACrB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,gBAAgB;IACpC,MAAM,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;IACjC,OAAO,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;AACvE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurcode-ai/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "Neurcode CLI - AI code governance and diff analysis",
|
|
5
5
|
"bin": {
|
|
6
6
|
"neurcode": "./dist/index.js"
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"node": ">=18.0.0"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@neurcode-ai/diff-parser": "^0.1.
|
|
41
|
-
"@neurcode-ai/policy-engine": "^0.1.
|
|
40
|
+
"@neurcode-ai/diff-parser": "^0.1.0",
|
|
41
|
+
"@neurcode-ai/policy-engine": "^0.1.0",
|
|
42
42
|
"chalk": "^4.1.2",
|
|
43
43
|
"chokidar": "^3.6.0",
|
|
44
44
|
"commander": "^11.1.0",
|
|
@@ -58,4 +58,4 @@
|
|
|
58
58
|
"@types/uuid": "^9.0.8",
|
|
59
59
|
"typescript": "^5.3.0"
|
|
60
60
|
}
|
|
61
|
-
}
|
|
61
|
+
}
|