codevf 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/ARCHITECTURE.md +285 -0
  2. package/BUILD_SUMMARY.md +340 -0
  3. package/LICENSE +21 -0
  4. package/QUICKSTART.md +180 -0
  5. package/README.md +104 -0
  6. package/dist/commands/fix.d.ts +2 -0
  7. package/dist/commands/fix.d.ts.map +1 -0
  8. package/dist/commands/fix.js +118 -0
  9. package/dist/commands/fix.js.map +1 -0
  10. package/dist/commands/init.d.ts +2 -0
  11. package/dist/commands/init.d.ts.map +1 -0
  12. package/dist/commands/init.js +270 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/login.d.ts +2 -0
  15. package/dist/commands/login.d.ts.map +1 -0
  16. package/dist/commands/login.js +62 -0
  17. package/dist/commands/login.js.map +1 -0
  18. package/dist/commands/logout.d.ts +2 -0
  19. package/dist/commands/logout.d.ts.map +1 -0
  20. package/dist/commands/logout.js +14 -0
  21. package/dist/commands/logout.js.map +1 -0
  22. package/dist/commands/sync.d.ts +4 -0
  23. package/dist/commands/sync.d.ts.map +1 -0
  24. package/dist/commands/sync.js +93 -0
  25. package/dist/commands/sync.js.map +1 -0
  26. package/dist/commands/tasks.d.ts +2 -0
  27. package/dist/commands/tasks.d.ts.map +1 -0
  28. package/dist/commands/tasks.js +41 -0
  29. package/dist/commands/tasks.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +248 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/modules/api.d.ts +36 -0
  35. package/dist/modules/api.d.ts.map +1 -0
  36. package/dist/modules/api.js +107 -0
  37. package/dist/modules/api.js.map +1 -0
  38. package/dist/modules/auth.d.ts +13 -0
  39. package/dist/modules/auth.d.ts.map +1 -0
  40. package/dist/modules/auth.js +80 -0
  41. package/dist/modules/auth.js.map +1 -0
  42. package/dist/modules/config.d.ts +17 -0
  43. package/dist/modules/config.d.ts.map +1 -0
  44. package/dist/modules/config.js +76 -0
  45. package/dist/modules/config.js.map +1 -0
  46. package/dist/modules/git.d.ts +13 -0
  47. package/dist/modules/git.d.ts.map +1 -0
  48. package/dist/modules/git.js +78 -0
  49. package/dist/modules/git.js.map +1 -0
  50. package/dist/modules/permissions.d.ts +5 -0
  51. package/dist/modules/permissions.d.ts.map +1 -0
  52. package/dist/modules/permissions.js +42 -0
  53. package/dist/modules/permissions.js.map +1 -0
  54. package/dist/modules/websocket.d.ts +17 -0
  55. package/dist/modules/websocket.d.ts.map +1 -0
  56. package/dist/modules/websocket.js +80 -0
  57. package/dist/modules/websocket.js.map +1 -0
  58. package/dist/types/index.d.ts +186 -0
  59. package/dist/types/index.d.ts.map +1 -0
  60. package/dist/types/index.js +40 -0
  61. package/dist/types/index.js.map +1 -0
  62. package/dist/ui/LiveSession.d.ts +13 -0
  63. package/dist/ui/LiveSession.d.ts.map +1 -0
  64. package/dist/ui/LiveSession.js +451 -0
  65. package/dist/ui/LiveSession.js.map +1 -0
  66. package/dist/utils/detect.d.ts +3 -0
  67. package/dist/utils/detect.d.ts.map +1 -0
  68. package/dist/utils/detect.js +78 -0
  69. package/dist/utils/detect.js.map +1 -0
  70. package/dist/utils/errors.d.ts +3 -0
  71. package/dist/utils/errors.d.ts.map +1 -0
  72. package/dist/utils/errors.js +36 -0
  73. package/dist/utils/errors.js.map +1 -0
  74. package/dist/utils/upload.d.ts +3 -0
  75. package/dist/utils/upload.d.ts.map +1 -0
  76. package/dist/utils/upload.js +75 -0
  77. package/dist/utils/upload.js.map +1 -0
  78. package/package.json +76 -0
@@ -0,0 +1,270 @@
1
+ import prompts from 'prompts';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { AuthManager } from '../modules/auth.js';
5
+ import { ConfigManager } from '../modules/config.js';
6
+ import { ApiClient } from '../modules/api.js';
7
+ import { detectProjectType } from '../utils/detect.js';
8
+ import { createRepoZip } from '../utils/upload.js';
9
+ import { execSync } from 'child_process';
10
+ import { loginCommand } from './login.js';
11
+ async function getRepoUrl() {
12
+ try {
13
+ const remoteUrl = execSync('git config --get remote.origin.url', {
14
+ encoding: 'utf8',
15
+ stdio: ['pipe', 'pipe', 'ignore'],
16
+ }).trim();
17
+ // Clean up SSH URLs to HTTPS format
18
+ if (remoteUrl.startsWith('git@')) {
19
+ return remoteUrl.replace('git@github.com:', 'https://github.com/').replace('.git', '');
20
+ }
21
+ return remoteUrl.replace('.git', '');
22
+ }
23
+ catch (error) {
24
+ return '';
25
+ }
26
+ }
27
+ export async function initCommand() {
28
+ const authManager = new AuthManager();
29
+ const configManager = new ConfigManager();
30
+ console.log(chalk.bold.blue('\nšŸš€ CodeVF Project Initialization\n'));
31
+ // Check authentication - if not authenticated, prompt to login
32
+ if (!authManager.isAuthenticated()) {
33
+ console.log(chalk.yellow('⚠ Not authenticated.'));
34
+ const { shouldLogin } = await prompts({
35
+ type: 'confirm',
36
+ name: 'shouldLogin',
37
+ message: 'Would you like to login now?',
38
+ initial: true,
39
+ });
40
+ if (!shouldLogin) {
41
+ console.log(chalk.dim('\nInitialization cancelled. Please run "codevf login" when ready.\n'));
42
+ process.exit(1);
43
+ }
44
+ // Run login flow
45
+ await loginCommand();
46
+ // Check if login was successful
47
+ if (!authManager.isAuthenticated()) {
48
+ console.log(chalk.red('\nāœ– Login failed or was cancelled.\n'));
49
+ process.exit(1);
50
+ }
51
+ console.log(chalk.green('\nāœ“ Login successful! Continuing with initialization...\n'));
52
+ }
53
+ // Check if already initialized
54
+ if (configManager.isInitialized()) {
55
+ console.log(chalk.yellow('⚠ This project is already initialized.'));
56
+ const { reinit } = await prompts({
57
+ type: 'confirm',
58
+ name: 'reinit',
59
+ message: 'Do you want to reinitialize?',
60
+ initial: false,
61
+ });
62
+ if (!reinit) {
63
+ console.log(chalk.dim('\nInitialization cancelled.\n'));
64
+ return;
65
+ }
66
+ }
67
+ const apiClient = new ApiClient(authManager);
68
+ // Ask: Link to existing project or create new one?
69
+ let { linkMode } = await prompts({
70
+ type: 'select',
71
+ name: 'linkMode',
72
+ message: 'Do you want to link to an existing project or create a new one?',
73
+ choices: [
74
+ { title: 'Link to existing project', value: 'existing' },
75
+ { title: 'Create new project', value: 'new' },
76
+ ],
77
+ });
78
+ if (!linkMode) {
79
+ console.log(chalk.dim('\nInitialization cancelled.\n'));
80
+ return;
81
+ }
82
+ let projectId;
83
+ let repoUrl;
84
+ if (linkMode === 'existing') {
85
+ // Fetch existing projects
86
+ const spinner = ora('Fetching your projects...').start();
87
+ try {
88
+ const { projects } = await apiClient.getProjects();
89
+ spinner.stop();
90
+ if (projects.length === 0) {
91
+ console.log(chalk.yellow('\n⚠ You have no existing projects. Creating a new one...\n'));
92
+ linkMode = 'new'; // Fall through to new project creation
93
+ }
94
+ else {
95
+ const { selectedProject } = await prompts({
96
+ type: 'select',
97
+ name: 'selectedProject',
98
+ message: 'Select a project to link:',
99
+ choices: projects.map((p) => ({
100
+ title: `${p.repoUrl} (ID: ${p.id})`,
101
+ value: p.id.toString(),
102
+ })),
103
+ });
104
+ if (!selectedProject) {
105
+ console.log(chalk.dim('\nInitialization cancelled.\n'));
106
+ return;
107
+ }
108
+ projectId = selectedProject;
109
+ const selectedProjectData = projects.find((p) => p.id.toString() === selectedProject);
110
+ repoUrl = selectedProjectData?.repoUrl || '';
111
+ console.log(chalk.green(`\nāœ“ Linked to project: ${repoUrl} (ID: ${projectId})\n`));
112
+ }
113
+ }
114
+ catch (error) {
115
+ spinner.fail('Failed to fetch projects');
116
+ throw error;
117
+ }
118
+ }
119
+ if (linkMode === 'new') {
120
+ // Create new project
121
+ const detectedRepoUrl = await getRepoUrl();
122
+ const { newRepoUrl, problemDescription } = await prompts([
123
+ {
124
+ type: 'text',
125
+ name: 'newRepoUrl',
126
+ message: 'Repository URL:',
127
+ initial: detectedRepoUrl,
128
+ validate: (value) => value.trim() ? true : 'Repository URL is required',
129
+ },
130
+ {
131
+ type: 'text',
132
+ name: 'problemDescription',
133
+ message: 'Project description (optional):',
134
+ initial: '',
135
+ },
136
+ ]);
137
+ if (!newRepoUrl) {
138
+ console.log(chalk.dim('\nInitialization cancelled.\n'));
139
+ return;
140
+ }
141
+ const spinner = ora('Creating new project...').start();
142
+ try {
143
+ const { project } = await apiClient.createProject(newRepoUrl, problemDescription);
144
+ projectId = project.id.toString();
145
+ repoUrl = project.repoUrl;
146
+ spinner.succeed(chalk.green(`Created project: ${repoUrl} (ID: ${projectId})`));
147
+ }
148
+ catch (error) {
149
+ spinner.fail('Failed to create project');
150
+ throw error;
151
+ }
152
+ }
153
+ // Detect project type
154
+ console.log(chalk.cyan('\nDetecting project type...'));
155
+ const detection = detectProjectType();
156
+ if (detection.type !== 'unknown') {
157
+ console.log(chalk.green(`āœ“ Detected: ${detection.type} project (${detection.confidence}% confidence)`));
158
+ console.log(chalk.dim(` Indicators: ${detection.indicators.join(', ')}\n`));
159
+ }
160
+ else {
161
+ console.log(chalk.yellow('⚠ Could not auto-detect project type\n'));
162
+ }
163
+ // Interactive wizard
164
+ const answers = await prompts([
165
+ {
166
+ type: 'select',
167
+ name: 'projectType',
168
+ message: 'Select your project type:',
169
+ choices: [
170
+ { title: 'Node.js', value: 'node' },
171
+ { title: 'Python', value: 'python' },
172
+ { title: 'Go', value: 'go' },
173
+ { title: 'Ruby', value: 'ruby' },
174
+ { title: 'Java', value: 'java' },
175
+ { title: 'Rust', value: 'rust' },
176
+ { title: 'Other', value: 'unknown' },
177
+ ],
178
+ initial: detection.type === 'unknown' ? 0 : ['node', 'python', 'go', 'ruby', 'java', 'rust'].indexOf(detection.type),
179
+ },
180
+ {
181
+ type: 'text',
182
+ name: 'testCommand',
183
+ message: 'Test command:',
184
+ initial: detection.suggestedTestCommand || '',
185
+ },
186
+ {
187
+ type: 'text',
188
+ name: 'buildCommand',
189
+ message: 'Build command (leave empty if not applicable):',
190
+ initial: detection.suggestedBuildCommand || '',
191
+ },
192
+ {
193
+ type: 'multiselect',
194
+ name: 'allowedTools',
195
+ message: 'Which AI tools should engineers be allowed to use?',
196
+ choices: [
197
+ { title: 'Claude (Anthropic)', value: 'claude', selected: true },
198
+ { title: 'Gemini (Google)', value: 'gemini', selected: true },
199
+ { title: 'GPT (OpenAI)', value: 'gpt', selected: false },
200
+ { title: 'None', value: 'none', selected: false },
201
+ ],
202
+ hint: 'Space to select, Enter to confirm',
203
+ },
204
+ {
205
+ type: 'confirm',
206
+ name: 'uploadCode',
207
+ message: 'Upload code snapshot for faster debugging?',
208
+ initial: true,
209
+ },
210
+ {
211
+ type: 'confirm',
212
+ name: 'allowBranchAccess',
213
+ message: 'Allow engineers to access the "codevf" branch only?',
214
+ initial: true,
215
+ },
216
+ ]);
217
+ // Handle cancellation
218
+ if (Object.keys(answers).length === 0) {
219
+ console.log(chalk.dim('\nInitialization cancelled.\n'));
220
+ return;
221
+ }
222
+ // Ensure projectId is set
223
+ if (!projectId || !repoUrl) {
224
+ console.log(chalk.red('Error: Failed to get project ID. Please try again.\n'));
225
+ process.exit(1);
226
+ }
227
+ const spinner = ora('Finalizing project setup...').start();
228
+ try {
229
+ // Upload code if requested
230
+ if (answers.uploadCode) {
231
+ spinner.text = 'Creating code snapshot...';
232
+ const zipBuffer = await createRepoZip(process.cwd());
233
+ spinner.text = 'Uploading code snapshot...';
234
+ await apiClient.uploadRepoSnapshot(projectId, zipBuffer);
235
+ }
236
+ // Save config
237
+ const config = {
238
+ projectId,
239
+ allowedTools: answers.allowedTools.includes('none') ? [] : answers.allowedTools,
240
+ testCommand: answers.testCommand,
241
+ buildCommand: answers.buildCommand,
242
+ repoUploaded: answers.uploadCode,
243
+ branchMode: answers.allowBranchAccess ? 'codevf' : 'all',
244
+ createdAt: new Date().toISOString(),
245
+ version: '1',
246
+ };
247
+ configManager.saveConfig(config);
248
+ spinner.succeed(chalk.green('Project initialized successfully!'));
249
+ // Print summary
250
+ console.log(chalk.bold('\nšŸ“‹ Configuration Summary:'));
251
+ console.log(chalk.dim('━'.repeat(60)));
252
+ console.log(`${chalk.cyan('Project ID:')} ${config.projectId}`);
253
+ console.log(`${chalk.cyan('Repository:')} ${repoUrl}`);
254
+ console.log(`${chalk.cyan('Project Type:')} ${answers.projectType}`);
255
+ console.log(`${chalk.cyan('Test Command:')} ${config.testCommand || chalk.dim('(none)')}`);
256
+ console.log(`${chalk.cyan('Build Command:')} ${config.buildCommand || chalk.dim('(none)')}`);
257
+ console.log(`${chalk.cyan('Allowed Tools:')} ${config.allowedTools.length > 0 ? config.allowedTools.join(', ') : chalk.dim('none')}`);
258
+ console.log(`${chalk.cyan('Code Uploaded:')} ${config.repoUploaded ? 'Yes' : 'No'}`);
259
+ console.log(`${chalk.cyan('Branch Mode:')} ${config.branchMode}`);
260
+ console.log(chalk.dim('━'.repeat(60)));
261
+ console.log(chalk.dim('\nNext steps:'));
262
+ console.log(chalk.dim(' • Start a debug session: codevf'));
263
+ console.log(chalk.dim(' • Sync your changes: codevf sync\n'));
264
+ }
265
+ catch (error) {
266
+ spinner.fail('Initialization failed');
267
+ throw error;
268
+ }
269
+ }
270
+ //# 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,2 @@
1
+ export declare function loginCommand(): Promise<void>;
2
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAOA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAmElD"}
@@ -0,0 +1,62 @@
1
+ import open from 'open';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { AuthManager } from '../modules/auth.js';
5
+ import { ApiClient } from '../modules/api.js';
6
+ export async function loginCommand() {
7
+ const authManager = new AuthManager();
8
+ const apiClient = new ApiClient(authManager);
9
+ console.log(chalk.bold.blue('\nšŸ” CodeVF Login\n'));
10
+ // Check if already logged in
11
+ if (authManager.isAuthenticated()) {
12
+ console.log(chalk.green('āœ“ Already logged in!'));
13
+ console.log(chalk.dim('\nTo logout, run: codevf logout'));
14
+ return;
15
+ }
16
+ const spinner = ora('Initializing authentication...').start();
17
+ try {
18
+ // Initialize OAuth flow
19
+ const { authUrl, pollToken } = await apiClient.initAuth();
20
+ spinner.stop();
21
+ console.log(chalk.cyan('\nOpening browser for authentication...'));
22
+ console.log(chalk.dim(`If browser doesn't open, visit: ${authUrl}\n`));
23
+ // Open browser
24
+ await open(authUrl);
25
+ // Poll for token
26
+ const pollSpinner = ora('Waiting for authentication...').start();
27
+ let attempts = 0;
28
+ const maxAttempts = 60; // 5 minutes (60 * 5 seconds)
29
+ while (attempts < maxAttempts) {
30
+ try {
31
+ const authData = await apiClient.pollAuth(pollToken);
32
+ // Calculate expiration time
33
+ const expiresAt = new Date();
34
+ expiresAt.setSeconds(expiresAt.getSeconds() + authData.expiresIn);
35
+ // Save token
36
+ const token = {
37
+ accessToken: authData.accessToken,
38
+ refreshToken: authData.refreshToken,
39
+ expiresAt: expiresAt.toISOString(),
40
+ userId: 'user-id', // This should come from the API
41
+ };
42
+ authManager.saveToken(token);
43
+ pollSpinner.succeed(chalk.green('Authentication successful!'));
44
+ console.log(chalk.dim('\nYou can now use CodeVF CLI commands.'));
45
+ console.log(chalk.dim('Next step: Run "codevf init" in your project directory.\n'));
46
+ return;
47
+ }
48
+ catch (error) {
49
+ // Continue polling
50
+ attempts++;
51
+ await new Promise((resolve) => setTimeout(resolve, 5000));
52
+ }
53
+ }
54
+ pollSpinner.fail('Authentication timeout. Please try again.');
55
+ process.exit(1);
56
+ }
57
+ catch (error) {
58
+ spinner.fail('Authentication failed');
59
+ throw error;
60
+ }
61
+ }
62
+ //# 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,2 @@
1
+ export declare function logoutCommand(): Promise<void>;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAanD"}
@@ -0,0 +1,14 @@
1
+ import chalk from 'chalk';
2
+ import { AuthManager } from '../modules/auth.js';
3
+ export async function logoutCommand() {
4
+ const authManager = new AuthManager();
5
+ console.log(chalk.bold.blue('\nšŸ‘‹ CodeVF Logout\n'));
6
+ if (!authManager.isAuthenticated()) {
7
+ console.log(chalk.yellow('Not currently logged in.'));
8
+ return;
9
+ }
10
+ authManager.clearToken();
11
+ console.log(chalk.green('āœ“ Successfully logged out'));
12
+ console.log(chalk.dim('\nTo login again, run: codevf login\n'));
13
+ }
14
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAEtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAErD,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,WAAW,CAAC,UAAU,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function syncCommand(options?: {
2
+ force?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqGlF"}
@@ -0,0 +1,93 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { AuthManager } from '../modules/auth.js';
4
+ import { ConfigManager } from '../modules/config.js';
5
+ import { ApiClient } from '../modules/api.js';
6
+ import { GitManager } from '../modules/git.js';
7
+ export async function syncCommand(options = {}) {
8
+ const authManager = new AuthManager();
9
+ const configManager = new ConfigManager();
10
+ const gitManager = new GitManager();
11
+ console.log(chalk.bold.blue('\nšŸ”„ CodeVF Sync\n'));
12
+ // Check authentication
13
+ if (!authManager.isAuthenticated()) {
14
+ console.log(chalk.red('Error: Not authenticated.'));
15
+ console.log(chalk.yellow('Please run: codevf login\n'));
16
+ process.exit(1);
17
+ }
18
+ // Check if project is initialized
19
+ if (!configManager.isInitialized()) {
20
+ console.log(chalk.red('Error: No CodeVF project found.'));
21
+ console.log(chalk.yellow('Please run: codevf init\n'));
22
+ process.exit(1);
23
+ }
24
+ const config = configManager.loadConfig();
25
+ // Check if git repo
26
+ if (!(await gitManager.isGitRepo())) {
27
+ console.log(chalk.red('Error: Not a git repository.'));
28
+ console.log(chalk.yellow('Please initialize git first: git init\n'));
29
+ process.exit(1);
30
+ }
31
+ const spinner = ora('Checking git status...').start();
32
+ try {
33
+ // Check for uncommitted changes
34
+ const hasChanges = await gitManager.hasUncommittedChanges();
35
+ if (hasChanges && !options.force) {
36
+ spinner.fail('Working directory has uncommitted changes');
37
+ console.log(chalk.yellow('\nPlease commit or stash your changes before syncing.'));
38
+ console.log(chalk.dim('\nTo commit changes:'));
39
+ console.log(chalk.dim(' git add .'));
40
+ console.log(chalk.dim(' git commit -m "Your message"'));
41
+ console.log(chalk.dim('\nOr use --force to sync anyway (not recommended)\n'));
42
+ process.exit(1);
43
+ }
44
+ // Check current branch
45
+ const currentBranch = await gitManager.getCurrentBranch();
46
+ const expectedBranch = config.branchMode;
47
+ if (currentBranch !== expectedBranch && config.branchMode !== 'all') {
48
+ spinner.warn(`Not on ${expectedBranch} branch (currently on ${currentBranch})`);
49
+ console.log(chalk.yellow(`\nPlease switch to the '${expectedBranch}' branch.`));
50
+ console.log(chalk.dim('\nTo create and switch:'));
51
+ console.log(chalk.dim(` git checkout -b ${expectedBranch}`));
52
+ console.log(chalk.dim('\nOr to switch if it exists:'));
53
+ console.log(chalk.dim(` git checkout ${expectedBranch}\n`));
54
+ process.exit(1);
55
+ }
56
+ // Get commit hash
57
+ spinner.text = 'Getting commit information...';
58
+ const commitHash = await gitManager.getCommitHash();
59
+ if (!commitHash) {
60
+ spinner.fail('No commits found');
61
+ console.log(chalk.yellow('\nPlease make at least one commit before syncing.\n'));
62
+ process.exit(1);
63
+ }
64
+ // Sync with backend
65
+ spinner.text = 'Syncing with CodeVF...';
66
+ const apiClient = new ApiClient(authManager);
67
+ const syncRequest = {
68
+ projectId: config.projectId,
69
+ commitHash,
70
+ branch: currentBranch,
71
+ };
72
+ await apiClient.syncProject(syncRequest);
73
+ // Save last sync
74
+ const lastSync = {
75
+ timestamp: new Date().toISOString(),
76
+ commitHash,
77
+ branch: currentBranch,
78
+ };
79
+ configManager.saveLastSync(lastSync);
80
+ spinner.succeed(chalk.green('Sync completed successfully!'));
81
+ console.log(chalk.dim('\n━'.repeat(60)));
82
+ console.log(`${chalk.cyan('Branch:')} ${currentBranch}`);
83
+ console.log(`${chalk.cyan('Commit:')} ${commitHash.substring(0, 8)}`);
84
+ console.log(`${chalk.cyan('Synced at:')} ${new Date().toLocaleString()}`);
85
+ console.log(chalk.dim('━'.repeat(60)));
86
+ console.log(chalk.dim('\nEngineers can now access your latest changes.\n'));
87
+ }
88
+ catch (error) {
89
+ spinner.fail('Sync failed');
90
+ throw error;
91
+ }
92
+ }
93
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function tasksCommand(cancelId?: string): Promise<void>;
2
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AAKA,wBAAsB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CnE"}
@@ -0,0 +1,41 @@
1
+ import chalk from 'chalk';
2
+ import { AuthManager } from '../modules/auth.js';
3
+ import { ApiClient } from '../modules/api.js';
4
+ import { handleError } from '../utils/errors.js';
5
+ export async function tasksCommand(cancelId) {
6
+ try {
7
+ const authManager = new AuthManager();
8
+ if (!authManager.isAuthenticated()) {
9
+ console.log(chalk.red('Error: Not authenticated.'));
10
+ console.log(chalk.yellow('Please run: codevf login\n'));
11
+ return;
12
+ }
13
+ const apiClient = new ApiClient(authManager);
14
+ // Fetch tasks directly since the API wrapper listTasks was removed
15
+ const response = await apiClient['client'].get(`/api/cli/tasks/list`);
16
+ const { tasks } = response.data || { tasks: [] };
17
+ if (cancelId) {
18
+ const target = tasks.find((t) => t.id === cancelId);
19
+ if (!target) {
20
+ console.log(chalk.red(`Task ${cancelId} not found in open tasks.`));
21
+ return;
22
+ }
23
+ await apiClient.cancelTask(cancelId);
24
+ console.log(chalk.green(`āœ“ Cancelled task ${cancelId}`));
25
+ return;
26
+ }
27
+ if (!tasks || tasks.length === 0) {
28
+ console.log(chalk.dim('No open tasks.'));
29
+ return;
30
+ }
31
+ console.log(chalk.bold.blue('\nOpen Tasks\n'));
32
+ tasks.forEach((task) => {
33
+ console.log(`${chalk.white(task.id)} ${chalk.gray('-')} ${chalk.white(task.issueDescription || 'Unknown')}`);
34
+ console.log(chalk.dim(` status: ${task.status} | project: ${task.projectId} | created: ${task.createdAt || 'n/a'}`));
35
+ });
36
+ }
37
+ catch (error) {
38
+ handleError(error);
39
+ }
40
+ }
41
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/commands/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAiB;IAClD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC;QAE7C,mEAAmE;QACnE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACtE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAEjD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,QAAQ,2BAA2B,CAAC,CAAC,CAAC;gBACpE,OAAO;YACT,CAAC;YACD,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;YAC1B,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,SAAS,CAAC,EAAE,CAChG,CAAC;YACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,aAAa,IAAI,CAAC,MAAM,eAAe,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,SAAS,IAAI,KAAK,EAAE,CAC9F,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAGA,OAAO,eAAe,CAAC"}