@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.
Files changed (70) hide show
  1. package/dist/api-client.d.ts +38 -18
  2. package/dist/api-client.d.ts.map +1 -1
  3. package/dist/api-client.js +226 -121
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/commands/apply.d.ts.map +1 -1
  6. package/dist/commands/apply.js +127 -1
  7. package/dist/commands/apply.js.map +1 -1
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/check.js +56 -13
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/doctor.d.ts.map +1 -1
  12. package/dist/commands/doctor.js +14 -11
  13. package/dist/commands/doctor.js.map +1 -1
  14. package/dist/commands/init.d.ts.map +1 -1
  15. package/dist/commands/init.js +95 -33
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/login.d.ts.map +1 -1
  18. package/dist/commands/login.js +47 -57
  19. package/dist/commands/login.js.map +1 -1
  20. package/dist/commands/plan.d.ts +2 -0
  21. package/dist/commands/plan.d.ts.map +1 -1
  22. package/dist/commands/plan.js +245 -11
  23. package/dist/commands/plan.js.map +1 -1
  24. package/dist/commands/revert.d.ts.map +1 -1
  25. package/dist/commands/revert.js +82 -0
  26. package/dist/commands/revert.js.map +1 -1
  27. package/dist/commands/session.d.ts +29 -0
  28. package/dist/commands/session.d.ts.map +1 -0
  29. package/dist/commands/session.js +382 -0
  30. package/dist/commands/session.js.map +1 -0
  31. package/dist/commands/verify.d.ts.map +1 -1
  32. package/dist/commands/verify.js +177 -8
  33. package/dist/commands/verify.js.map +1 -1
  34. package/dist/commands/watch.d.ts.map +1 -1
  35. package/dist/commands/watch.js +20 -15
  36. package/dist/commands/watch.js.map +1 -1
  37. package/dist/index.js +78 -3
  38. package/dist/index.js.map +1 -1
  39. package/dist/services/integrations/TicketService.d.ts +68 -0
  40. package/dist/services/integrations/TicketService.d.ts.map +1 -0
  41. package/dist/services/integrations/TicketService.js +151 -0
  42. package/dist/services/integrations/TicketService.js.map +1 -0
  43. package/dist/services/security/SecurityGuard.d.ts +88 -0
  44. package/dist/services/security/SecurityGuard.d.ts.map +1 -0
  45. package/dist/services/security/SecurityGuard.js +576 -0
  46. package/dist/services/security/SecurityGuard.js.map +1 -0
  47. package/dist/services/watch/Syncer.d.ts.map +1 -1
  48. package/dist/services/watch/Syncer.js +22 -1
  49. package/dist/services/watch/Syncer.js.map +1 -1
  50. package/dist/utils/ROILogger.d.ts +16 -0
  51. package/dist/utils/ROILogger.d.ts.map +1 -0
  52. package/dist/utils/ROILogger.js +45 -0
  53. package/dist/utils/ROILogger.js.map +1 -0
  54. package/dist/utils/box.d.ts +16 -0
  55. package/dist/utils/box.d.ts.map +1 -0
  56. package/dist/utils/box.js +85 -0
  57. package/dist/utils/box.js.map +1 -0
  58. package/dist/utils/messages.d.ts +81 -0
  59. package/dist/utils/messages.d.ts.map +1 -0
  60. package/dist/utils/messages.js +306 -0
  61. package/dist/utils/messages.js.map +1 -0
  62. package/dist/utils/tier.d.ts +21 -0
  63. package/dist/utils/tier.d.ts.map +1 -0
  64. package/dist/utils/tier.js +150 -0
  65. package/dist/utils/tier.js.map +1 -0
  66. package/dist/utils/user-context.d.ts +28 -0
  67. package/dist/utils/user-context.d.ts.map +1 -0
  68. package/dist/utils/user-context.js +68 -0
  69. package/dist/utils/user-context.js.map +1 -0
  70. 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":"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"}
@@ -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.7.12",
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.1",
41
- "@neurcode-ai/policy-engine": "^0.1.3",
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
+ }