codebakers 1.0.45
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/.vscodeignore +18 -0
- package/LICENSE +21 -0
- package/README.md +88 -0
- package/codebakers-1.0.0.vsix +0 -0
- package/codebakers-1.0.10.vsix +0 -0
- package/codebakers-1.0.11.vsix +0 -0
- package/codebakers-1.0.12.vsix +0 -0
- package/codebakers-1.0.13.vsix +0 -0
- package/codebakers-1.0.14.vsix +0 -0
- package/codebakers-1.0.15.vsix +0 -0
- package/codebakers-1.0.16.vsix +0 -0
- package/codebakers-1.0.17.vsix +0 -0
- package/codebakers-1.0.18.vsix +0 -0
- package/codebakers-1.0.19.vsix +0 -0
- package/codebakers-1.0.20.vsix +0 -0
- package/codebakers-1.0.21.vsix +0 -0
- package/codebakers-1.0.22.vsix +0 -0
- package/codebakers-1.0.23.vsix +0 -0
- package/codebakers-1.0.24.vsix +0 -0
- package/codebakers-1.0.25.vsix +0 -0
- package/codebakers-1.0.26.vsix +0 -0
- package/codebakers-1.0.27.vsix +0 -0
- package/codebakers-1.0.28.vsix +0 -0
- package/codebakers-1.0.29.vsix +0 -0
- package/codebakers-1.0.30.vsix +0 -0
- package/codebakers-1.0.31.vsix +0 -0
- package/codebakers-1.0.32.vsix +0 -0
- package/codebakers-1.0.35.vsix +0 -0
- package/codebakers-1.0.36.vsix +0 -0
- package/codebakers-1.0.37.vsix +0 -0
- package/codebakers-1.0.38.vsix +0 -0
- package/codebakers-1.0.39.vsix +0 -0
- package/codebakers-1.0.40.vsix +0 -0
- package/codebakers-1.0.41.vsix +0 -0
- package/codebakers-1.0.42.vsix +0 -0
- package/codebakers-1.0.43.vsix +0 -0
- package/codebakers-1.0.44.vsix +0 -0
- package/codebakers-1.0.45.vsix +0 -0
- package/dist/extension.js +1394 -0
- package/esbuild.js +63 -0
- package/media/icon.png +0 -0
- package/media/icon.svg +7 -0
- package/nul +1 -0
- package/package.json +127 -0
- package/preview.html +547 -0
- package/src/ChatPanelProvider.ts +1815 -0
- package/src/ChatViewProvider.ts +749 -0
- package/src/CodeBakersClient.ts +1146 -0
- package/src/CodeValidator.ts +645 -0
- package/src/FileOperations.ts +410 -0
- package/src/ProjectContext.ts +526 -0
- package/src/extension.ts +332 -0
- package/tsconfig.json +19 -0
package/src/extension.ts
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import * as vscode from 'vscode';
|
|
2
|
+
|
|
3
|
+
// Use dynamic imports to prevent ANY import errors from blocking command registration
|
|
4
|
+
let ChatPanelProvider: any;
|
|
5
|
+
let CodeBakersClient: any;
|
|
6
|
+
let ProjectContext: any;
|
|
7
|
+
let DiffContentProvider: any;
|
|
8
|
+
|
|
9
|
+
let chatPanel: any;
|
|
10
|
+
let client: any;
|
|
11
|
+
let projectContext: any;
|
|
12
|
+
let statusBarItem: vscode.StatusBarItem | undefined;
|
|
13
|
+
let extensionContext: vscode.ExtensionContext;
|
|
14
|
+
let initializationError: string | null = null;
|
|
15
|
+
|
|
16
|
+
async function loadModules(): Promise<boolean> {
|
|
17
|
+
try {
|
|
18
|
+
console.log('CodeBakers: Loading ChatPanelProvider...');
|
|
19
|
+
const chatModule = await import('./ChatPanelProvider');
|
|
20
|
+
ChatPanelProvider = chatModule.ChatPanelProvider;
|
|
21
|
+
console.log('CodeBakers: ChatPanelProvider loaded');
|
|
22
|
+
|
|
23
|
+
console.log('CodeBakers: Loading CodeBakersClient...');
|
|
24
|
+
const clientModule = await import('./CodeBakersClient');
|
|
25
|
+
CodeBakersClient = clientModule.CodeBakersClient;
|
|
26
|
+
console.log('CodeBakers: CodeBakersClient loaded');
|
|
27
|
+
|
|
28
|
+
console.log('CodeBakers: Loading ProjectContext...');
|
|
29
|
+
const contextModule = await import('./ProjectContext');
|
|
30
|
+
ProjectContext = contextModule.ProjectContext;
|
|
31
|
+
console.log('CodeBakers: ProjectContext loaded');
|
|
32
|
+
|
|
33
|
+
console.log('CodeBakers: Loading FileOperations...');
|
|
34
|
+
const fileOpsModule = await import('./FileOperations');
|
|
35
|
+
DiffContentProvider = fileOpsModule.DiffContentProvider;
|
|
36
|
+
console.log('CodeBakers: FileOperations loaded');
|
|
37
|
+
|
|
38
|
+
console.log('CodeBakers: All modules loaded successfully');
|
|
39
|
+
return true;
|
|
40
|
+
} catch (error: any) {
|
|
41
|
+
const errorMessage = error?.message || error?.toString() || 'Unknown error';
|
|
42
|
+
const errorStack = error?.stack || '';
|
|
43
|
+
console.error('CodeBakers: Failed to load modules:', errorMessage);
|
|
44
|
+
console.error('CodeBakers: Stack:', errorStack);
|
|
45
|
+
initializationError = `Module load failed: ${errorMessage}`;
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function ensureInitialized(): Promise<boolean> {
|
|
51
|
+
if (client && projectContext && chatPanel) {
|
|
52
|
+
console.log('CodeBakers: Already initialized');
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!ChatPanelProvider || !CodeBakersClient || !ProjectContext) {
|
|
57
|
+
console.log('CodeBakers: Modules not loaded, loading now...');
|
|
58
|
+
const loaded = await loadModules();
|
|
59
|
+
if (!loaded) {
|
|
60
|
+
vscode.window.showErrorMessage(`CodeBakers: ${initializationError}`);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
console.log('CodeBakers: Initializing components...');
|
|
67
|
+
|
|
68
|
+
if (!client) {
|
|
69
|
+
console.log('CodeBakers: Creating CodeBakersClient...');
|
|
70
|
+
client = new CodeBakersClient(extensionContext);
|
|
71
|
+
console.log('CodeBakers: CodeBakersClient created successfully');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!projectContext) {
|
|
75
|
+
console.log('CodeBakers: Creating ProjectContext...');
|
|
76
|
+
projectContext = new ProjectContext();
|
|
77
|
+
console.log('CodeBakers: ProjectContext created successfully');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!chatPanel) {
|
|
81
|
+
console.log('CodeBakers: Creating ChatPanelProvider...');
|
|
82
|
+
chatPanel = ChatPanelProvider.getInstance(extensionContext, client, projectContext);
|
|
83
|
+
console.log('CodeBakers: ChatPanelProvider created successfully');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
console.log('CodeBakers: All components initialized successfully');
|
|
87
|
+
return true;
|
|
88
|
+
} catch (error: any) {
|
|
89
|
+
const errorMessage = error?.message || error?.toString() || 'Unknown error';
|
|
90
|
+
console.error('CodeBakers: Component initialization failed:', errorMessage);
|
|
91
|
+
console.error('CodeBakers: Stack:', error?.stack || 'no stack');
|
|
92
|
+
initializationError = `Init failed: ${errorMessage}`;
|
|
93
|
+
vscode.window.showErrorMessage(`CodeBakers: ${initializationError}`);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export function activate(context: vscode.ExtensionContext) {
|
|
99
|
+
console.log('CodeBakers: activate() called - v1.0.45 (plain text chat, parallel apply, keyboard shortcuts, command history, progress indicators, auto-TSC)');
|
|
100
|
+
extensionContext = context;
|
|
101
|
+
|
|
102
|
+
// IMMEDIATELY register commands - nothing can fail before this
|
|
103
|
+
try {
|
|
104
|
+
console.log('CodeBakers: Registering commands...');
|
|
105
|
+
|
|
106
|
+
context.subscriptions.push(
|
|
107
|
+
vscode.commands.registerCommand('codebakers.openChat', async () => {
|
|
108
|
+
console.log('CodeBakers: openChat command executed');
|
|
109
|
+
|
|
110
|
+
const initialized = await ensureInitialized();
|
|
111
|
+
if (!initialized) {
|
|
112
|
+
vscode.window.showErrorMessage('CodeBakers failed to initialize. Please try reloading VS Code.');
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
if (!client.hasSessionToken()) {
|
|
118
|
+
vscode.window.showWarningMessage(
|
|
119
|
+
'🍪 Sign in to CodeBakers to start your free trial',
|
|
120
|
+
'Sign In with GitHub'
|
|
121
|
+
).then((selection: string | undefined) => {
|
|
122
|
+
if (selection === 'Sign In with GitHub') {
|
|
123
|
+
client.login();
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
chatPanel.show();
|
|
128
|
+
} catch (e) {
|
|
129
|
+
console.error('CodeBakers: Error in openChat:', e);
|
|
130
|
+
vscode.window.showErrorMessage(`CodeBakers error: ${e}`);
|
|
131
|
+
}
|
|
132
|
+
})
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
context.subscriptions.push(
|
|
136
|
+
vscode.commands.registerCommand('codebakers.login', async () => {
|
|
137
|
+
console.log('CodeBakers: login command executed');
|
|
138
|
+
const initialized = await ensureInitialized();
|
|
139
|
+
if (!initialized) return;
|
|
140
|
+
|
|
141
|
+
try {
|
|
142
|
+
await client.login();
|
|
143
|
+
} catch (e) {
|
|
144
|
+
console.error('CodeBakers: Login error:', e);
|
|
145
|
+
vscode.window.showErrorMessage(`Login failed: ${e}`);
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
context.subscriptions.push(
|
|
151
|
+
vscode.commands.registerCommand('codebakers.logout', async () => {
|
|
152
|
+
console.log('CodeBakers: logout command executed');
|
|
153
|
+
const initialized = await ensureInitialized();
|
|
154
|
+
if (!initialized) return;
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
await client.logout();
|
|
158
|
+
chatPanel.refresh();
|
|
159
|
+
updateStatusBar();
|
|
160
|
+
} catch (e) {
|
|
161
|
+
console.error('CodeBakers: Logout error:', e);
|
|
162
|
+
}
|
|
163
|
+
})
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
context.subscriptions.push(
|
|
167
|
+
vscode.commands.registerCommand('codebakers.showPatterns', async () => {
|
|
168
|
+
const initialized = await ensureInitialized();
|
|
169
|
+
if (!initialized) return;
|
|
170
|
+
|
|
171
|
+
try {
|
|
172
|
+
const patterns = await client.getAvailablePatterns();
|
|
173
|
+
const quickPick = vscode.window.createQuickPick();
|
|
174
|
+
quickPick.items = patterns.map((p: any) => ({ label: p.name, description: p.description }));
|
|
175
|
+
quickPick.title = 'Available CodeBakers Patterns';
|
|
176
|
+
quickPick.show();
|
|
177
|
+
} catch (e) {
|
|
178
|
+
console.error('CodeBakers: Error showing patterns:', e);
|
|
179
|
+
}
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
context.subscriptions.push(
|
|
184
|
+
vscode.commands.registerCommand('codebakers.runAudit', async () => {
|
|
185
|
+
const initialized = await ensureInitialized();
|
|
186
|
+
if (!initialized) return;
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
chatPanel.show();
|
|
190
|
+
await chatPanel.sendMessage('/audit');
|
|
191
|
+
} catch (e) {
|
|
192
|
+
console.error('CodeBakers: Error running audit:', e);
|
|
193
|
+
}
|
|
194
|
+
})
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
console.log('CodeBakers: All 5 commands registered successfully');
|
|
198
|
+
|
|
199
|
+
} catch (error) {
|
|
200
|
+
// This should NEVER happen since registerCommand is synchronous
|
|
201
|
+
console.error('CodeBakers: FATAL - Command registration failed:', error);
|
|
202
|
+
vscode.window.showErrorMessage(`CodeBakers FATAL: Failed to register commands - ${error}`);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Create status bar
|
|
207
|
+
try {
|
|
208
|
+
statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
|
|
209
|
+
statusBarItem.text = '$(code) CodeBakers';
|
|
210
|
+
statusBarItem.tooltip = 'Open CodeBakers Chat (Ctrl+Alt+C)';
|
|
211
|
+
statusBarItem.command = 'codebakers.openChat';
|
|
212
|
+
statusBarItem.show();
|
|
213
|
+
context.subscriptions.push(statusBarItem);
|
|
214
|
+
console.log('CodeBakers: Status bar created');
|
|
215
|
+
} catch (e) {
|
|
216
|
+
console.error('CodeBakers: Status bar failed:', e);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Register diff content provider for showing file diffs
|
|
220
|
+
try {
|
|
221
|
+
if (DiffContentProvider) {
|
|
222
|
+
const diffProvider = new DiffContentProvider();
|
|
223
|
+
context.subscriptions.push(
|
|
224
|
+
vscode.workspace.registerTextDocumentContentProvider('codebakers-diff', diffProvider)
|
|
225
|
+
);
|
|
226
|
+
console.log('CodeBakers: Diff content provider registered');
|
|
227
|
+
}
|
|
228
|
+
} catch (e) {
|
|
229
|
+
console.error('CodeBakers: Diff provider registration failed:', e);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Register URI handler
|
|
233
|
+
try {
|
|
234
|
+
context.subscriptions.push(
|
|
235
|
+
vscode.window.registerUriHandler({
|
|
236
|
+
handleUri: async (uri) => {
|
|
237
|
+
console.log('CodeBakers: URI callback received:', uri.toString());
|
|
238
|
+
|
|
239
|
+
if (!uri.path.includes('callback')) return;
|
|
240
|
+
|
|
241
|
+
const initialized = await ensureInitialized();
|
|
242
|
+
if (!initialized) return;
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
const params = new URLSearchParams(uri.query);
|
|
246
|
+
const encodedToken = params.get('token');
|
|
247
|
+
const error = params.get('error');
|
|
248
|
+
|
|
249
|
+
if (error) {
|
|
250
|
+
vscode.window.showErrorMessage(`Login failed: ${params.get('message') || error}`);
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
if (encodedToken) {
|
|
255
|
+
const success = await client.handleOAuthCallback(encodedToken);
|
|
256
|
+
if (success) {
|
|
257
|
+
chatPanel.refresh();
|
|
258
|
+
updateStatusBar();
|
|
259
|
+
chatPanel.show();
|
|
260
|
+
}
|
|
261
|
+
} else {
|
|
262
|
+
vscode.window.showErrorMessage('Login failed: No token received');
|
|
263
|
+
}
|
|
264
|
+
} catch (e) {
|
|
265
|
+
console.error('CodeBakers: URI handler error:', e);
|
|
266
|
+
vscode.window.showErrorMessage(`OAuth error: ${e}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
})
|
|
270
|
+
);
|
|
271
|
+
console.log('CodeBakers: URI handler registered');
|
|
272
|
+
} catch (e) {
|
|
273
|
+
console.error('CodeBakers: URI handler registration failed:', e);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Background initialization
|
|
277
|
+
setTimeout(async () => {
|
|
278
|
+
try {
|
|
279
|
+
const initialized = await ensureInitialized();
|
|
280
|
+
if (initialized) {
|
|
281
|
+
updateStatusBar();
|
|
282
|
+
|
|
283
|
+
if (!client.hasSessionToken()) {
|
|
284
|
+
vscode.window.showInformationMessage(
|
|
285
|
+
'🍪 CodeBakers installed! Click the CodeBakers button in the status bar to get started.',
|
|
286
|
+
'Sign In Now'
|
|
287
|
+
).then((selection: string | undefined) => {
|
|
288
|
+
if (selection === 'Sign In Now') {
|
|
289
|
+
client.login();
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// File watcher
|
|
295
|
+
try {
|
|
296
|
+
const watcher = vscode.workspace.createFileSystemWatcher('**/*.{ts,tsx,js,jsx}');
|
|
297
|
+
watcher.onDidChange(() => projectContext?.invalidateCache());
|
|
298
|
+
watcher.onDidCreate(() => projectContext?.invalidateCache());
|
|
299
|
+
watcher.onDidDelete(() => projectContext?.invalidateCache());
|
|
300
|
+
context.subscriptions.push(watcher);
|
|
301
|
+
} catch (e) {
|
|
302
|
+
console.warn('CodeBakers: File watcher failed:', e);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
} catch (e) {
|
|
306
|
+
console.error('CodeBakers: Background init failed:', e);
|
|
307
|
+
}
|
|
308
|
+
}, 500);
|
|
309
|
+
|
|
310
|
+
console.log('CodeBakers: activate() completed - v1.0.45');
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
function updateStatusBar() {
|
|
314
|
+
if (!statusBarItem) return;
|
|
315
|
+
|
|
316
|
+
try {
|
|
317
|
+
if (client?.hasSessionToken()) {
|
|
318
|
+
const planInfo = client.getPlanInfo();
|
|
319
|
+
statusBarItem.text = `$(code) CodeBakers [${planInfo.plan}]`;
|
|
320
|
+
statusBarItem.backgroundColor = undefined;
|
|
321
|
+
} else {
|
|
322
|
+
statusBarItem.text = '$(code) CodeBakers (Sign In)';
|
|
323
|
+
statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
|
|
324
|
+
}
|
|
325
|
+
} catch (e) {
|
|
326
|
+
statusBarItem.text = '$(code) CodeBakers';
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
export function deactivate() {
|
|
331
|
+
console.log('CodeBakers: deactivate() called');
|
|
332
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"module": "commonjs",
|
|
4
|
+
"target": "ES2020",
|
|
5
|
+
"lib": ["ES2020"],
|
|
6
|
+
"outDir": "dist",
|
|
7
|
+
"rootDir": "src",
|
|
8
|
+
"sourceMap": true,
|
|
9
|
+
"strict": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"skipLibCheck": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"resolveJsonModule": true,
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"declarationMap": true
|
|
16
|
+
},
|
|
17
|
+
"include": ["src/**/*"],
|
|
18
|
+
"exclude": ["node_modules", "dist"]
|
|
19
|
+
}
|