@neurcode-ai/cli 0.3.9 → 0.4.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 (111) hide show
  1. package/dist/api-client.d.ts +105 -17
  2. package/dist/api-client.d.ts.map +1 -1
  3. package/dist/api-client.js +388 -85
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/commands/allow.d.ts.map +1 -1
  6. package/dist/commands/allow.js +6 -33
  7. package/dist/commands/allow.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 +7 -0
  12. package/dist/commands/doctor.d.ts.map +1 -0
  13. package/dist/commands/doctor.js +134 -0
  14. package/dist/commands/doctor.js.map +1 -0
  15. package/dist/commands/init.d.ts +13 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +365 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/login.d.ts +8 -0
  20. package/dist/commands/login.d.ts.map +1 -0
  21. package/dist/commands/login.js +209 -0
  22. package/dist/commands/login.js.map +1 -0
  23. package/dist/commands/logout.d.ts +7 -0
  24. package/dist/commands/logout.d.ts.map +1 -0
  25. package/dist/commands/logout.js +70 -0
  26. package/dist/commands/logout.js.map +1 -0
  27. package/dist/commands/plan.d.ts +2 -0
  28. package/dist/commands/plan.d.ts.map +1 -1
  29. package/dist/commands/plan.js +210 -57
  30. package/dist/commands/plan.js.map +1 -1
  31. package/dist/commands/prompt.d.ts +6 -0
  32. package/dist/commands/prompt.d.ts.map +1 -0
  33. package/dist/commands/prompt.js +254 -0
  34. package/dist/commands/prompt.js.map +1 -0
  35. package/dist/commands/revert.d.ts.map +1 -1
  36. package/dist/commands/revert.js +10 -0
  37. package/dist/commands/revert.js.map +1 -1
  38. package/dist/commands/session.d.ts +29 -0
  39. package/dist/commands/session.d.ts.map +1 -0
  40. package/dist/commands/session.js +382 -0
  41. package/dist/commands/session.js.map +1 -0
  42. package/dist/commands/verify.d.ts.map +1 -1
  43. package/dist/commands/verify.js +132 -15
  44. package/dist/commands/verify.js.map +1 -1
  45. package/dist/commands/watch.d.ts +8 -0
  46. package/dist/commands/watch.d.ts.map +1 -0
  47. package/dist/commands/watch.js +78 -0
  48. package/dist/commands/watch.js.map +1 -0
  49. package/dist/config.d.ts +29 -4
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +186 -21
  52. package/dist/config.js.map +1 -1
  53. package/dist/index.js +120 -3
  54. package/dist/index.js.map +1 -1
  55. package/dist/services/integrations/TicketService.d.ts +68 -0
  56. package/dist/services/integrations/TicketService.d.ts.map +1 -0
  57. package/dist/services/integrations/TicketService.js +151 -0
  58. package/dist/services/integrations/TicketService.js.map +1 -0
  59. package/dist/services/security/SecurityGuard.d.ts +80 -0
  60. package/dist/services/security/SecurityGuard.d.ts.map +1 -0
  61. package/dist/services/security/SecurityGuard.js +410 -0
  62. package/dist/services/security/SecurityGuard.js.map +1 -0
  63. package/dist/services/watch/BlobStore.d.ts +33 -0
  64. package/dist/services/watch/BlobStore.d.ts.map +1 -0
  65. package/dist/services/watch/BlobStore.js +108 -0
  66. package/dist/services/watch/BlobStore.js.map +1 -0
  67. package/dist/services/watch/CommandPoller.d.ts +76 -0
  68. package/dist/services/watch/CommandPoller.d.ts.map +1 -0
  69. package/dist/services/watch/CommandPoller.js +298 -0
  70. package/dist/services/watch/CommandPoller.js.map +1 -0
  71. package/dist/services/watch/Journal.d.ts +58 -0
  72. package/dist/services/watch/Journal.d.ts.map +1 -0
  73. package/dist/services/watch/Journal.js +144 -0
  74. package/dist/services/watch/Journal.js.map +1 -0
  75. package/dist/services/watch/Sentinel.d.ts +49 -0
  76. package/dist/services/watch/Sentinel.d.ts.map +1 -0
  77. package/dist/services/watch/Sentinel.js +205 -0
  78. package/dist/services/watch/Sentinel.js.map +1 -0
  79. package/dist/services/watch/Syncer.d.ts +55 -0
  80. package/dist/services/watch/Syncer.d.ts.map +1 -0
  81. package/dist/services/watch/Syncer.js +231 -0
  82. package/dist/services/watch/Syncer.js.map +1 -0
  83. package/dist/utils/ROILogger.d.ts +16 -0
  84. package/dist/utils/ROILogger.d.ts.map +1 -0
  85. package/dist/utils/ROILogger.js +45 -0
  86. package/dist/utils/ROILogger.js.map +1 -0
  87. package/dist/utils/box.d.ts +16 -0
  88. package/dist/utils/box.d.ts.map +1 -0
  89. package/dist/utils/box.js +85 -0
  90. package/dist/utils/box.js.map +1 -0
  91. package/dist/utils/gitignore.d.ts +10 -0
  92. package/dist/utils/gitignore.d.ts.map +1 -0
  93. package/dist/utils/gitignore.js +34 -0
  94. package/dist/utils/gitignore.js.map +1 -0
  95. package/dist/utils/messages.d.ts +81 -0
  96. package/dist/utils/messages.d.ts.map +1 -0
  97. package/dist/utils/messages.js +306 -0
  98. package/dist/utils/messages.js.map +1 -0
  99. package/dist/utils/restore.d.ts +14 -0
  100. package/dist/utils/restore.d.ts.map +1 -0
  101. package/dist/utils/restore.js +89 -0
  102. package/dist/utils/restore.js.map +1 -0
  103. package/dist/utils/state.d.ts +69 -0
  104. package/dist/utils/state.d.ts.map +1 -0
  105. package/dist/utils/state.js +151 -0
  106. package/dist/utils/state.js.map +1 -0
  107. package/dist/utils/user-context.d.ts +28 -0
  108. package/dist/utils/user-context.d.ts.map +1 -0
  109. package/dist/utils/user-context.js +68 -0
  110. package/dist/utils/user-context.js.map +1 -0
  111. package/package.json +11 -4
@@ -0,0 +1,365 @@
1
+ "use strict";
2
+ /**
3
+ * Init Command - Magic Init
4
+ *
5
+ * Zero-friction project initialization with auto-discovery and context menu.
6
+ *
7
+ * Flow:
8
+ * 1. Auto-detect directory name
9
+ * 2. Check .neurcode/config.json
10
+ * 3. If missing: Check API for existing project, create if not found
11
+ * 4. If present: Show context menu (Start Session, View History)
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.initCommand = initCommand;
48
+ const path_1 = require("path");
49
+ const config_1 = require("../config");
50
+ const api_client_1 = require("../api-client");
51
+ const state_1 = require("../utils/state");
52
+ const readline = __importStar(require("readline"));
53
+ const messages_1 = require("../utils/messages");
54
+ const session_1 = require("./session");
55
+ // Import chalk with fallback
56
+ let chalk;
57
+ try {
58
+ chalk = require('chalk');
59
+ }
60
+ catch {
61
+ chalk = {
62
+ green: (str) => str,
63
+ yellow: (str) => str,
64
+ red: (str) => str,
65
+ bold: (str) => str,
66
+ dim: (str) => str,
67
+ cyan: (str) => str,
68
+ white: (str) => str,
69
+ blue: (str) => str,
70
+ };
71
+ }
72
+ /**
73
+ * Get user input from terminal
74
+ */
75
+ function promptUser(question) {
76
+ const rl = readline.createInterface({
77
+ input: process.stdin,
78
+ output: process.stdout,
79
+ });
80
+ return new Promise((resolve) => {
81
+ rl.question(question, (answer) => {
82
+ rl.close();
83
+ resolve(answer.trim());
84
+ });
85
+ });
86
+ }
87
+ /**
88
+ * Display context menu and get user choice
89
+ */
90
+ async function showContextMenu(project, sessions) {
91
+ console.log(chalk.bold.cyan(`\nšŸ“ Project: ${project.name}`));
92
+ console.log(chalk.dim(` ID: ${project.id}\n`));
93
+ console.log(chalk.bold.white('What would you like to do?\n'));
94
+ const activeCount = sessions.filter(s => s.status === 'active').length;
95
+ const options = [
96
+ { key: '1', label: 'šŸš€ Start New Session (Plan)', value: 'new-session' },
97
+ { key: '2', label: 'šŸ“œ View Session History', value: 'history' },
98
+ { key: '3', label: activeCount > 0 ? `šŸ”š End Active Session${activeCount > 1 ? 's' : ''} (${activeCount})` : 'ā„¹ļø Session Management', value: 'manage-sessions' },
99
+ { key: '4', label: 'āŒ Exit', value: 'exit' },
100
+ ];
101
+ options.forEach(opt => {
102
+ console.log(chalk.cyan(` ${opt.key}.`), chalk.white(opt.label));
103
+ });
104
+ console.log('');
105
+ const maxOption = options.length;
106
+ const answer = await promptUser(chalk.bold(`Select option (1-${maxOption}): `));
107
+ switch (answer) {
108
+ case '1':
109
+ return 'new-session';
110
+ case '2':
111
+ return 'history';
112
+ case '3':
113
+ return 'manage-sessions';
114
+ case '4':
115
+ default:
116
+ return 'exit';
117
+ }
118
+ }
119
+ /**
120
+ * Display session history menu
121
+ */
122
+ async function showHistoryMenu(sessions) {
123
+ if (sessions.length === 0) {
124
+ console.log(chalk.yellow('\nšŸ“œ No sessions found for this project.\n'));
125
+ return null;
126
+ }
127
+ console.log(chalk.bold.white('\nšŸ“œ Session History (Last 5)\n'));
128
+ const options = sessions.map((session, index) => {
129
+ const emoji = session.status === 'active' ? '⚔' : session.status === 'completed' ? 'āœ…' : 'šŸ“';
130
+ const title = session.title || session.intentDescription || 'Untitled Session';
131
+ const status = session.status === 'active' ? chalk.green('Active') :
132
+ session.status === 'completed' ? chalk.dim('Completed') :
133
+ chalk.yellow(session.status);
134
+ return {
135
+ key: (index + 1).toString(),
136
+ session,
137
+ label: `${emoji} ${title} (${status})`,
138
+ };
139
+ });
140
+ options.forEach(opt => {
141
+ console.log(chalk.cyan(` ${opt.key}.`), chalk.white(opt.label));
142
+ });
143
+ console.log(chalk.cyan(` ${options.length + 1}.`), chalk.white('āž• Create New Session'));
144
+ console.log(chalk.cyan(` ${options.length + 2}.`), chalk.white('šŸ”™ Back'));
145
+ console.log('');
146
+ const answer = await promptUser(chalk.bold(`Select session (1-${options.length + 2}): `));
147
+ const choice = parseInt(answer, 10);
148
+ if (choice >= 1 && choice <= options.length) {
149
+ return options[choice - 1].session.sessionId;
150
+ }
151
+ else if (choice === options.length + 1) {
152
+ return 'new-session';
153
+ }
154
+ else {
155
+ return null; // Back
156
+ }
157
+ }
158
+ async function initCommand() {
159
+ try {
160
+ const config = (0, config_1.loadConfig)();
161
+ const apiKey = (0, config_1.requireApiKey)();
162
+ const apiUrl = config.apiUrl || config_1.DEFAULT_API_URL;
163
+ await (0, messages_1.printSuccessBanner)('Neurcode Project Initialization', 'Setting up your project for code governance');
164
+ // Step 1: Auto-detect directory name
165
+ const cwd = process.cwd();
166
+ const dirName = (0, path_1.basename)(cwd);
167
+ (0, messages_1.printInfo)('Detected Directory', `Working in: ${dirName}`);
168
+ // Step 2: Check local state
169
+ const state = (0, state_1.loadState)();
170
+ let existingProjectId = (0, state_1.getProjectId)() || state.projectId;
171
+ // Initialize API client
172
+ const client = new api_client_1.ApiClient({ ...config, apiKey });
173
+ let project = null;
174
+ if (existingProjectId) {
175
+ // Project already linked
176
+ (0, messages_1.printSuccess)('Project Already Initialized', 'Checking project status...');
177
+ // Fetch project details
178
+ try {
179
+ const projects = await client.getProjects();
180
+ project = projects.find(p => p.id === existingProjectId) || null;
181
+ if (!project) {
182
+ (0, messages_1.printWarning)('Project Not Found', `Project ID ${existingProjectId} no longer exists. We'll help you set up a new one.`);
183
+ // Clear invalid project ID
184
+ (0, state_1.saveState)({ projectId: undefined });
185
+ // Clear the local variable to allow fallthrough to project creation
186
+ existingProjectId = undefined;
187
+ }
188
+ else {
189
+ (0, messages_1.printSuccess)('Project Verified', `Connected to: ${project.name}`);
190
+ }
191
+ }
192
+ catch (error) {
193
+ (0, messages_1.printWarning)('Could Not Verify Project', 'Continuing with initialization. If issues persist, run: neurcode doctor');
194
+ }
195
+ }
196
+ // Step 3: Auto-discovery if no project linked
197
+ // After resetting invalid projectId, this condition will now pass and continue to project creation
198
+ if (!project && !existingProjectId) {
199
+ (0, messages_1.printSection)('Project Discovery');
200
+ (0, messages_1.printInfo)('Searching for existing project', `Looking for project matching "${dirName}"...`);
201
+ // Check if project exists by name
202
+ try {
203
+ const existingProject = await client.getProjectByName(dirName);
204
+ if (existingProject) {
205
+ // Project exists - ask to link
206
+ (0, messages_1.printSuccess)('Existing Project Found', `Found: ${existingProject.name}`);
207
+ const answer = await promptUser(chalk.bold(`\n Link this directory to "${existingProject.name}"? (y/n): `));
208
+ if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
209
+ project = existingProject;
210
+ (0, state_1.setProjectId)(project.id);
211
+ await (0, messages_1.printSuccessBanner)('Project Linked Successfully', `This directory is now connected to "${project.name}"`);
212
+ }
213
+ else {
214
+ (0, messages_1.printInfo)('Initialization Cancelled', 'Run "neurcode init" again when you\'re ready to link a project.');
215
+ process.exit(0);
216
+ }
217
+ }
218
+ else {
219
+ // Project doesn't exist - create it
220
+ (0, messages_1.printInfo)('No Existing Project Found', `No project named "${dirName}" was found.`);
221
+ const answer = await promptUser(chalk.bold(`\n Create new project "${dirName}"? (y/n): `));
222
+ if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
223
+ // Create project (using connect endpoint with empty gitUrl)
224
+ try {
225
+ (0, messages_1.printInfo)('Creating Project', 'Setting up your new project...');
226
+ const newProject = await client.ensureProject('', dirName);
227
+ project = {
228
+ id: newProject.id,
229
+ name: newProject.name,
230
+ slug: dirName.toLowerCase().replace(/[^a-z0-9]+/g, '-'),
231
+ git_url: null,
232
+ };
233
+ (0, state_1.setProjectId)(project.id);
234
+ await (0, messages_1.printSuccessBanner)('Project Created Successfully', `Your new project "${project.name}" is ready to use!`);
235
+ }
236
+ catch (error) {
237
+ (0, messages_1.printProjectError)(error, project?.id);
238
+ process.exit(1);
239
+ }
240
+ }
241
+ else {
242
+ (0, messages_1.printInfo)('Initialization Cancelled', 'Run "neurcode init" again when you\'re ready to create a project.');
243
+ process.exit(0);
244
+ }
245
+ }
246
+ }
247
+ catch (error) {
248
+ (0, messages_1.printProjectError)(error);
249
+ process.exit(1);
250
+ }
251
+ }
252
+ if (!project) {
253
+ (0, messages_1.printError)('No Project Available', undefined, [
254
+ 'Unable to determine which project to use',
255
+ 'Try running: neurcode init',
256
+ 'Or manually set project ID: neurcode config --project-id <id>'
257
+ ]);
258
+ process.exit(1);
259
+ }
260
+ // Step 4: Check for active sessions and prompt to end them
261
+ try {
262
+ const allSessions = await client.getSessions(project.id, 20);
263
+ const activeSessions = allSessions.filter(s => s.status === 'active');
264
+ if (activeSessions.length > 0) {
265
+ (0, messages_1.printSection)('Active Sessions Detected');
266
+ (0, messages_1.printWarning)(`You have ${activeSessions.length} active session(s)`, 'Consider ending completed sessions to keep your workspace organized');
267
+ // Show active sessions
268
+ activeSessions.forEach((session, index) => {
269
+ const title = session.title || session.intentDescription || 'Untitled';
270
+ console.log(chalk.cyan(` ${index + 1}.`), chalk.white(title));
271
+ console.log(chalk.dim(` ${session.sessionId.substring(0, 20)}...`));
272
+ });
273
+ console.log('');
274
+ const answer = await promptUser(chalk.bold('Would you like to end any active sessions? (y/n): '));
275
+ if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
276
+ (0, messages_1.printInfo)('Session Management', 'Run "neurcode session end" to end a session');
277
+ console.log('');
278
+ }
279
+ }
280
+ }
281
+ catch (error) {
282
+ // Non-critical - continue if we can't fetch sessions
283
+ if (process.env.DEBUG) {
284
+ (0, messages_1.printWarning)('Could not check active sessions', 'Continuing...');
285
+ }
286
+ }
287
+ // Step 5: Context Menu
288
+ (0, messages_1.printSection)('What would you like to do?');
289
+ let done = false;
290
+ while (!done) {
291
+ // Fetch recent sessions
292
+ let sessions = [];
293
+ try {
294
+ sessions = await client.getSessions(project.id, 5);
295
+ }
296
+ catch (error) {
297
+ // If fetching sessions fails, continue without history
298
+ if (process.env.DEBUG) {
299
+ (0, messages_1.printWarning)('Could not fetch sessions', 'Continuing without session history');
300
+ }
301
+ }
302
+ const choice = await showContextMenu(project, sessions);
303
+ switch (choice) {
304
+ case 'new-session': {
305
+ (0, messages_1.printSuccess)('Ready to Start', 'You can now create a new session!');
306
+ (0, messages_1.printInfo)('Next Steps', 'Run: neurcode plan "<your intent>"\n Example: neurcode plan "Add user authentication"');
307
+ done = true;
308
+ break;
309
+ }
310
+ case 'history': {
311
+ const sessionChoice = await showHistoryMenu(sessions);
312
+ if (sessionChoice === 'new-session') {
313
+ (0, messages_1.printSuccess)('Ready to Start', 'You can now create a new session!');
314
+ (0, messages_1.printInfo)('Next Steps', 'Run: neurcode plan "<your intent>"');
315
+ done = true;
316
+ }
317
+ else if (sessionChoice) {
318
+ (0, messages_1.printSuccess)('Session Selected', `Session ID: ${sessionChoice}`);
319
+ (0, messages_1.printInfo)('Usage', 'Use this session ID with neurcode commands that support --session-id');
320
+ done = true;
321
+ }
322
+ // If sessionChoice is null (back), continue loop
323
+ break;
324
+ }
325
+ case 'manage-sessions': {
326
+ (0, messages_1.printInfo)('Session Management', 'You can manage sessions using these commands:');
327
+ console.log(chalk.dim(' • neurcode session list - List all sessions'));
328
+ console.log(chalk.dim(' • neurcode session end - End the current or a specific session'));
329
+ console.log(chalk.dim(' • neurcode session status - Show status of current session'));
330
+ console.log('');
331
+ const answer = await promptUser(chalk.bold('Would you like to end a session now? (y/n): '));
332
+ if (answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes') {
333
+ await (0, session_1.endSessionCommand)({ projectId: project.id });
334
+ // After ending, refresh and show menu again
335
+ continue;
336
+ }
337
+ break;
338
+ }
339
+ case 'exit':
340
+ (0, messages_1.printInfo)('Goodbye', 'Thanks for using Neurcode!');
341
+ done = true;
342
+ break;
343
+ }
344
+ }
345
+ }
346
+ catch (error) {
347
+ if (error instanceof Error) {
348
+ if (error.message.includes('Authentication') || error.message.includes('401') || error.message.includes('403')) {
349
+ await (0, messages_1.printAuthError)(error);
350
+ }
351
+ else {
352
+ (0, messages_1.printError)('Initialization Failed', error, [
353
+ 'Check your internet connection',
354
+ 'Verify authentication: neurcode doctor',
355
+ 'Try again: neurcode init'
356
+ ]);
357
+ }
358
+ }
359
+ else {
360
+ (0, messages_1.printError)('Initialization Failed', String(error));
361
+ }
362
+ process.exit(1);
363
+ }
364
+ }
365
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Login Command
3
+ *
4
+ * Implements device flow authentication for CLI.
5
+ * User runs `neurcode login` → Opens browser → Approves → CLI saves API key globally
6
+ */
7
+ export declare function loginCommand(): Promise<void>;
8
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,wBAAsB,YAAY,kBA8NjC"}
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ /**
3
+ * Login Command
4
+ *
5
+ * Implements device flow authentication for CLI.
6
+ * User runs `neurcode login` → Opens browser → Approves → CLI saves API key globally
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.loginCommand = loginCommand;
43
+ const config_1 = require("../config");
44
+ const api_client_1 = require("../api-client");
45
+ const user_context_1 = require("../utils/user-context");
46
+ const messages_1 = require("../utils/messages");
47
+ const POLL_INTERVAL = 3000; // 3 seconds
48
+ const MAX_POLL_ATTEMPTS = 100; // 5 minutes total (100 * 3s)
49
+ async function loginCommand() {
50
+ try {
51
+ const config = (0, config_1.loadConfig)();
52
+ const apiUrl = config.apiUrl || config_1.DEFAULT_API_URL;
53
+ // Check if user is already logged in
54
+ const existingApiKey = (0, config_1.getApiKey)();
55
+ if (existingApiKey) {
56
+ try {
57
+ // Validate the existing API key by fetching user info
58
+ const client = new api_client_1.ApiClient(config);
59
+ const user = await client.getCurrentUser();
60
+ const userInfo = await (0, user_context_1.getUserInfo)();
61
+ await (0, messages_1.printSuccessBanner)('Already Authenticated', `Welcome back, ${userInfo?.displayName || user.email}!`);
62
+ (0, messages_1.printSuccess)(`You're logged in as ${userInfo?.displayName || user.email}`, `Account: ${user.email}\n API Key: ${existingApiKey.substring(0, 20)}...\n To log out: neurcode logout`);
63
+ return;
64
+ }
65
+ catch (error) {
66
+ // API key is invalid or expired, proceed with login
67
+ (0, user_context_1.clearUserCache)(); // Clear stale cache
68
+ (0, messages_1.printWarning)('Existing session expired', 'Your previous API key is no longer valid. Let\'s set up a fresh authentication.');
69
+ }
70
+ }
71
+ await (0, messages_1.printSuccessBanner)('Neurcode CLI Authentication');
72
+ (0, messages_1.printInfo)('We\'ll open your browser to securely authenticate your account.');
73
+ // Step 1: Initialize device flow
74
+ const initUrl = `${apiUrl}/cli/auth/init`;
75
+ let initResponse;
76
+ try {
77
+ initResponse = await fetch(initUrl, {
78
+ method: 'POST',
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ },
82
+ body: JSON.stringify({}), // Fastify requires a body when Content-Type is application/json
83
+ });
84
+ }
85
+ catch (error) {
86
+ await (0, messages_1.printAuthError)(error);
87
+ process.exit(1);
88
+ }
89
+ if (!initResponse.ok) {
90
+ const errorText = await initResponse.text();
91
+ await (0, messages_1.printAuthError)(new Error(`Failed to initialize authentication: ${errorText}`));
92
+ process.exit(1);
93
+ }
94
+ const initData = await initResponse.json();
95
+ const { deviceCode, userCode, verificationUrl, expiresIn } = initData;
96
+ // Step 2: Display user code and open browser
97
+ (0, messages_1.printSection)('Authentication Steps');
98
+ (0, messages_1.printStep)(1, 2, 'Open the authentication URL in your browser');
99
+ console.log(` ${verificationUrl}\n`);
100
+ (0, messages_1.printStep)(2, 2, 'Enter your verification code');
101
+ // Use inline chalk for the code display
102
+ const chalkInstance = require('chalk');
103
+ console.log(chalkInstance.bold.green(` ${userCode}\n`));
104
+ (0, messages_1.printWaiting)('Waiting for your approval', false);
105
+ // Open browser (cross-platform)
106
+ const { exec } = await Promise.resolve().then(() => __importStar(require('child_process')));
107
+ const platform = process.platform;
108
+ let command;
109
+ if (platform === 'darwin') {
110
+ command = `open "${verificationUrl}"`;
111
+ }
112
+ else if (platform === 'win32') {
113
+ command = `start "" "${verificationUrl}"`;
114
+ }
115
+ else {
116
+ command = `xdg-open "${verificationUrl}"`;
117
+ }
118
+ try {
119
+ exec(command, (error) => {
120
+ if (error) {
121
+ (0, messages_1.printWarning)('Could not open browser automatically', 'Please copy and paste the URL above into your browser');
122
+ }
123
+ });
124
+ }
125
+ catch (error) {
126
+ // Browser opening failed, but continue with polling
127
+ (0, messages_1.printWarning)('Could not open browser automatically', 'Please copy and paste the URL above into your browser');
128
+ }
129
+ // Step 3: Poll for approval
130
+ let pollAttempts = 0;
131
+ let approved = false;
132
+ while (pollAttempts < MAX_POLL_ATTEMPTS && !approved) {
133
+ await new Promise(resolve => setTimeout(resolve, POLL_INTERVAL));
134
+ const pollUrl = `${apiUrl}/cli/auth/poll`;
135
+ let pollResponse;
136
+ try {
137
+ pollResponse = await fetch(pollUrl, {
138
+ method: 'POST',
139
+ headers: {
140
+ 'Content-Type': 'application/json',
141
+ },
142
+ body: JSON.stringify({ deviceCode }),
143
+ });
144
+ }
145
+ catch (error) {
146
+ console.error(`\nšŸ” [DEBUG] Fetch failed for URL: ${pollUrl}`);
147
+ console.error(`šŸ” [DEBUG] API Base URL: ${apiUrl}`);
148
+ console.error(`šŸ” [DEBUG] Error: ${error instanceof Error ? error.message : String(error)}`);
149
+ throw error;
150
+ }
151
+ if (!pollResponse.ok) {
152
+ throw new Error(`Polling failed: ${pollResponse.statusText}`);
153
+ }
154
+ const pollData = await pollResponse.json();
155
+ if (pollData.status === 'approved') {
156
+ if (pollData.apiKey) {
157
+ // Save API key to global config
158
+ (0, config_1.saveGlobalAuth)(pollData.apiKey, apiUrl);
159
+ // Get user info for personalized message
160
+ const userInfo = await (0, user_context_1.getUserInfo)();
161
+ const userName = userInfo?.displayName || userInfo?.email || 'there';
162
+ await (0, messages_1.printSuccessBanner)('Authentication Successful!', `Welcome to Neurcode, ${userName}!`);
163
+ (0, messages_1.printSuccess)('Your CLI is now authenticated', `API key saved securely to ~/.neurcoderc\n You're all set to use Neurcode commands!`);
164
+ (0, messages_1.printInfo)('Getting started', 'Try running: neurcode init (to set up your first project)');
165
+ approved = true;
166
+ }
167
+ else {
168
+ (0, messages_1.printWarning)('Authentication approved but API key unavailable', 'Please check your API keys or try logging in again');
169
+ approved = true;
170
+ }
171
+ }
172
+ else if (pollData.status === 'denied') {
173
+ (0, messages_1.printError)('Authentication Denied', undefined, [
174
+ 'The authentication request was denied in your browser',
175
+ 'If this was unintentional, please try: neurcode login',
176
+ 'Contact support if you continue experiencing issues'
177
+ ]);
178
+ process.exit(1);
179
+ }
180
+ else if (pollData.status === 'expired') {
181
+ (0, messages_1.printError)('Authentication Request Expired', undefined, [
182
+ 'The authentication request has timed out',
183
+ 'Please try again: neurcode login',
184
+ 'Make sure to complete authentication within 5 minutes'
185
+ ]);
186
+ process.exit(1);
187
+ }
188
+ else {
189
+ // pending - continue polling
190
+ process.stdout.write('.');
191
+ pollAttempts++;
192
+ }
193
+ }
194
+ if (!approved) {
195
+ (0, messages_1.printError)('Authentication Timed Out', undefined, [
196
+ 'The authentication process took too long',
197
+ 'Please try again: neurcode login',
198
+ 'Make sure to complete the browser authentication promptly',
199
+ 'Check your internet connection if issues persist'
200
+ ]);
201
+ process.exit(1);
202
+ }
203
+ }
204
+ catch (error) {
205
+ await (0, messages_1.printAuthError)(error);
206
+ process.exit(1);
207
+ }
208
+ }
209
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Logout Command
3
+ *
4
+ * Clears the saved API key from global config (~/.neurcoderc)
5
+ */
6
+ export declare function logoutCommand(): Promise<void>;
7
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH,wBAAsB,aAAa,kBAgDlC"}