baseguard 1.0.0 → 1.0.2

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 (156) hide show
  1. package/.baseguardrc.example.json +64 -0
  2. package/.eslintrc.json +1 -1
  3. package/CHANGELOG.md +196 -0
  4. package/DEPLOYMENT.md +625 -0
  5. package/DEPLOYMENT_CHECKLIST.md +239 -0
  6. package/DEPLOYMENT_SUMMARY_v1.0.2.md +202 -0
  7. package/QUICK_START.md +134 -0
  8. package/README.md +447 -52
  9. package/RELEASE_NOTES_v1.0.2.md +434 -0
  10. package/bin/base.js +155 -36
  11. package/dist/ai/agentkit-orchestrator.d.ts +116 -0
  12. package/dist/ai/agentkit-orchestrator.d.ts.map +1 -0
  13. package/dist/ai/agentkit-orchestrator.js +417 -0
  14. package/dist/ai/agentkit-orchestrator.js.map +1 -0
  15. package/dist/ai/gemini-code-fixer.d.ts +85 -0
  16. package/dist/ai/gemini-code-fixer.d.ts.map +1 -0
  17. package/dist/ai/gemini-code-fixer.js +452 -0
  18. package/dist/ai/gemini-code-fixer.js.map +1 -0
  19. package/dist/ai/jules-implementer.d.ts +5 -4
  20. package/dist/ai/jules-implementer.d.ts.map +1 -1
  21. package/dist/ai/jules-implementer.js +6 -5
  22. package/dist/ai/jules-implementer.js.map +1 -1
  23. package/dist/ai/unified-code-fixer.d.ts +69 -0
  24. package/dist/ai/unified-code-fixer.d.ts.map +1 -0
  25. package/dist/ai/unified-code-fixer.js +289 -0
  26. package/dist/ai/unified-code-fixer.js.map +1 -0
  27. package/dist/commands/check.d.ts +3 -1
  28. package/dist/commands/check.d.ts.map +1 -1
  29. package/dist/commands/check.js +166 -34
  30. package/dist/commands/check.js.map +1 -1
  31. package/dist/commands/config.d.ts +4 -0
  32. package/dist/commands/config.d.ts.map +1 -1
  33. package/dist/commands/config.js +183 -0
  34. package/dist/commands/config.js.map +1 -1
  35. package/dist/commands/fix.d.ts.map +1 -1
  36. package/dist/commands/fix.js +89 -91
  37. package/dist/commands/fix.js.map +1 -1
  38. package/dist/commands/index.d.ts +1 -0
  39. package/dist/commands/index.d.ts.map +1 -1
  40. package/dist/commands/index.js +1 -0
  41. package/dist/commands/index.js.map +1 -1
  42. package/dist/commands/init.d.ts.map +1 -1
  43. package/dist/commands/init.js +16 -2
  44. package/dist/commands/init.js.map +1 -1
  45. package/dist/commands/status.d.ts +14 -0
  46. package/dist/commands/status.d.ts.map +1 -0
  47. package/dist/commands/status.js +254 -0
  48. package/dist/commands/status.js.map +1 -0
  49. package/dist/core/baseguard.d.ts +47 -5
  50. package/dist/core/baseguard.d.ts.map +1 -1
  51. package/dist/core/baseguard.js +506 -52
  52. package/dist/core/baseguard.js.map +1 -1
  53. package/dist/core/cache-manager.d.ts.map +1 -1
  54. package/dist/core/cache-manager.js +3 -1
  55. package/dist/core/cache-manager.js.map +1 -1
  56. package/dist/core/configuration-recovery.d.ts +116 -0
  57. package/dist/core/configuration-recovery.d.ts.map +1 -0
  58. package/dist/core/configuration-recovery.js +552 -0
  59. package/dist/core/configuration-recovery.js.map +1 -0
  60. package/dist/core/configuration.d.ts +4 -0
  61. package/dist/core/configuration.d.ts.map +1 -1
  62. package/dist/core/configuration.js +35 -0
  63. package/dist/core/configuration.js.map +1 -1
  64. package/dist/core/debug-logger.d.ts +181 -0
  65. package/dist/core/debug-logger.d.ts.map +1 -0
  66. package/dist/core/debug-logger.js +479 -0
  67. package/dist/core/debug-logger.js.map +1 -0
  68. package/dist/core/file-processor.d.ts.map +1 -1
  69. package/dist/core/file-processor.js +8 -2
  70. package/dist/core/file-processor.js.map +1 -1
  71. package/dist/core/graceful-degradation-manager.d.ts +123 -0
  72. package/dist/core/graceful-degradation-manager.d.ts.map +1 -0
  73. package/dist/core/graceful-degradation-manager.js +512 -0
  74. package/dist/core/graceful-degradation-manager.js.map +1 -0
  75. package/dist/core/index.d.ts +4 -0
  76. package/dist/core/index.d.ts.map +1 -1
  77. package/dist/core/index.js +4 -0
  78. package/dist/core/index.js.map +1 -1
  79. package/dist/core/logger.d.ts +1 -0
  80. package/dist/core/logger.d.ts.map +1 -0
  81. package/dist/core/logger.js +2 -0
  82. package/dist/core/logger.js.map +1 -0
  83. package/dist/core/memory-manager.d.ts +84 -0
  84. package/dist/core/memory-manager.d.ts.map +1 -1
  85. package/dist/core/memory-manager.js +236 -1
  86. package/dist/core/memory-manager.js.map +1 -1
  87. package/dist/core/startup-optimizer.d.ts +12 -0
  88. package/dist/core/startup-optimizer.d.ts.map +1 -1
  89. package/dist/core/startup-optimizer.js +60 -0
  90. package/dist/core/startup-optimizer.js.map +1 -1
  91. package/dist/core/system-error-handler.d.ts +65 -0
  92. package/dist/core/system-error-handler.d.ts.map +1 -0
  93. package/dist/core/system-error-handler.js +646 -0
  94. package/dist/core/system-error-handler.js.map +1 -0
  95. package/dist/git/github-manager.d.ts +5 -16
  96. package/dist/git/github-manager.d.ts.map +1 -1
  97. package/dist/git/github-manager.js +6 -61
  98. package/dist/git/github-manager.js.map +1 -1
  99. package/dist/parsers/react-parser-optimized.d.ts +16 -0
  100. package/dist/parsers/react-parser-optimized.d.ts.map +1 -0
  101. package/dist/parsers/react-parser-optimized.js +147 -0
  102. package/dist/parsers/react-parser-optimized.js.map +1 -0
  103. package/dist/parsers/react-parser.d.ts.map +1 -1
  104. package/dist/parsers/react-parser.js +17 -15
  105. package/dist/parsers/react-parser.js.map +1 -1
  106. package/dist/parsers/svelte-parser.d.ts.map +1 -1
  107. package/dist/parsers/svelte-parser.js +7 -3
  108. package/dist/parsers/svelte-parser.js.map +1 -1
  109. package/dist/parsers/vanilla-parser.d.ts.map +1 -1
  110. package/dist/parsers/vanilla-parser.js +7 -3
  111. package/dist/parsers/vanilla-parser.js.map +1 -1
  112. package/dist/parsers/vue-parser.d.ts +18 -0
  113. package/dist/parsers/vue-parser.d.ts.map +1 -1
  114. package/dist/parsers/vue-parser.js +387 -1
  115. package/dist/parsers/vue-parser.js.map +1 -1
  116. package/dist/types/index.d.ts +4 -0
  117. package/dist/types/index.d.ts.map +1 -1
  118. package/dist/ui/help.js +1 -1
  119. package/dist/ui/help.js.map +1 -1
  120. package/dist/ui/prompts.d.ts +7 -4
  121. package/dist/ui/prompts.d.ts.map +1 -1
  122. package/dist/ui/prompts.js +48 -55
  123. package/dist/ui/prompts.js.map +1 -1
  124. package/package.json +30 -5
  125. package/src/ai/__tests__/gemini-analyzer.test.ts +2 -2
  126. package/src/ai/agentkit-orchestrator.ts +534 -0
  127. package/src/ai/gemini-code-fixer.ts +540 -0
  128. package/src/ai/jules-implementer.ts +6 -5
  129. package/src/ai/unified-code-fixer.ts +347 -0
  130. package/src/commands/config.ts +218 -0
  131. package/src/commands/fix.ts +98 -94
  132. package/src/commands/index.ts +2 -1
  133. package/src/commands/init.ts +16 -2
  134. package/src/commands/status.ts +307 -0
  135. package/src/core/baseguard.ts +36 -22
  136. package/src/core/cache-manager.ts +4 -2
  137. package/src/core/configuration-recovery.ts +3 -6
  138. package/src/core/configuration.ts +37 -0
  139. package/src/core/debug-logger.ts +2 -2
  140. package/src/core/file-processor.ts +10 -3
  141. package/src/core/index.ts +5 -1
  142. package/src/core/memory-manager.ts +4 -3
  143. package/src/core/startup-optimizer.ts +70 -0
  144. package/src/core/system-error-handler.ts +9 -5
  145. package/src/git/github-manager.ts +11 -79
  146. package/src/parsers/react-parser.ts +2 -2
  147. package/src/parsers/svelte-parser.ts +13 -9
  148. package/src/parsers/vanilla-parser.ts +18 -14
  149. package/src/parsers/vue-parser.ts +20 -14
  150. package/src/types/index.ts +4 -0
  151. package/src/ui/help.ts +1 -1
  152. package/src/ui/prompts.ts +54 -61
  153. package/test-build.js +41 -0
  154. package/tests/e2e/git-integration.e2e.test.ts +1 -1
  155. package/tsconfig.json +0 -1
  156. package/vitest.config.ts +4 -2
@@ -1,6 +1,10 @@
1
1
  import { Parser } from './parser.js';
2
2
  import type { DetectedFeature } from '../types/index.js';
3
3
  import { LazyLoader } from '../core/lazy-loader.js';
4
+ import { parse as parseBabel } from '@babel/parser';
5
+ import traverse from '@babel/traverse';
6
+ import * as t from '@babel/types';
7
+ import postcss from 'postcss';
4
8
 
5
9
  /**
6
10
  * Parser for Svelte files (.svelte) - extracts ALL web platform features
@@ -177,7 +181,7 @@ export class SvelteParser extends Parser {
177
181
 
178
182
  traverse(ast, {
179
183
  // Extract JavaScript Web APIs
180
- MemberExpression: (path) => {
184
+ MemberExpression: (path: any) => {
181
185
  const feature = this.extractWebAPIFeature(path.node, scriptContent, scriptNode.start);
182
186
  if (feature) {
183
187
  features.push({ ...feature, file: filePath });
@@ -185,7 +189,7 @@ export class SvelteParser extends Parser {
185
189
  },
186
190
 
187
191
  // Extract function calls to Web APIs
188
- CallExpression: (path) => {
192
+ CallExpression: (path: any) => {
189
193
  const feature = this.extractWebAPICall(path.node, scriptContent, scriptNode.start);
190
194
  if (feature) {
191
195
  features.push({ ...feature, file: filePath });
@@ -193,7 +197,7 @@ export class SvelteParser extends Parser {
193
197
  },
194
198
 
195
199
  // Extract modern JavaScript syntax features
196
- OptionalMemberExpression: (path) => {
200
+ OptionalMemberExpression: (path: any) => {
197
201
  features.push({
198
202
  feature: 'optional-chaining',
199
203
  type: 'js',
@@ -205,7 +209,7 @@ export class SvelteParser extends Parser {
205
209
  },
206
210
 
207
211
  // Nullish coalescing
208
- LogicalExpression: (path) => {
212
+ LogicalExpression: (path: any) => {
209
213
  if (path.node.operator === '??') {
210
214
  features.push({
211
215
  feature: 'nullish-coalescing',
@@ -219,7 +223,7 @@ export class SvelteParser extends Parser {
219
223
  },
220
224
 
221
225
  // Private class fields
222
- ClassPrivateProperty: (path) => {
226
+ ClassPrivateProperty: (path: any) => {
223
227
  features.push({
224
228
  feature: 'private-fields',
225
229
  type: 'js',
@@ -231,7 +235,7 @@ export class SvelteParser extends Parser {
231
235
  },
232
236
 
233
237
  // Top-level await
234
- AwaitExpression: (path) => {
238
+ AwaitExpression: (path: any) => {
235
239
  if (this.isTopLevelAwait(path)) {
236
240
  features.push({
237
241
  feature: 'top-level-await',
@@ -265,7 +269,7 @@ export class SvelteParser extends Parser {
265
269
 
266
270
  const root = postcss.parse(styleContent);
267
271
 
268
- root.walkDecls(decl => {
272
+ root.walkDecls((decl: any) => {
269
273
  features.push({
270
274
  feature: decl.prop,
271
275
  type: 'css',
@@ -276,7 +280,7 @@ export class SvelteParser extends Parser {
276
280
  });
277
281
  });
278
282
 
279
- root.walkRules(rule => {
283
+ root.walkRules((rule: any) => {
280
284
  // Extract CSS selectors that might be modern features
281
285
  if (rule.selector.includes(':has(') ||
282
286
  rule.selector.includes(':is(') ||
@@ -293,7 +297,7 @@ export class SvelteParser extends Parser {
293
297
  }
294
298
  });
295
299
 
296
- root.walkAtRules(atRule => {
300
+ root.walkAtRules((atRule: any) => {
297
301
  // Extract at-rules like @supports, @container, etc.
298
302
  features.push({
299
303
  feature: `@${atRule.name}`,
@@ -1,6 +1,10 @@
1
1
  import { Parser } from './parser.js';
2
2
  import type { DetectedFeature } from '../types/index.js';
3
3
  import { LazyLoader } from '../core/lazy-loader.js';
4
+ import { parse as parseBabel } from '@babel/parser';
5
+ import traverse from '@babel/traverse';
6
+ import * as t from '@babel/types';
7
+ import postcss from 'postcss';
4
8
 
5
9
  /**
6
10
  * Vanilla JavaScript/CSS/HTML parser - extracts ALL web platform features
@@ -280,7 +284,7 @@ export class VanillaParser extends Parser {
280
284
 
281
285
  traverse(ast, {
282
286
  // Extract Web API member expressions
283
- MemberExpression: (path) => {
287
+ MemberExpression: (path: any) => {
284
288
  const feature = this.extractWebAPIFeature(path.node, content);
285
289
  if (feature) {
286
290
  features.push({ ...feature, file: filePath });
@@ -288,7 +292,7 @@ export class VanillaParser extends Parser {
288
292
  },
289
293
 
290
294
  // Extract Web API function calls
291
- CallExpression: (path) => {
295
+ CallExpression: (path: any) => {
292
296
  const feature = this.extractWebAPICall(path.node, content);
293
297
  if (feature) {
294
298
  features.push({ ...feature, file: filePath });
@@ -296,7 +300,7 @@ export class VanillaParser extends Parser {
296
300
  },
297
301
 
298
302
  // Modern JavaScript syntax features
299
- OptionalMemberExpression: (path) => {
303
+ OptionalMemberExpression: (path: any) => {
300
304
  features.push({
301
305
  feature: 'optional-chaining',
302
306
  type: 'js',
@@ -307,7 +311,7 @@ export class VanillaParser extends Parser {
307
311
  });
308
312
  },
309
313
 
310
- OptionalCallExpression: (path) => {
314
+ OptionalCallExpression: (path: any) => {
311
315
  features.push({
312
316
  feature: 'optional-chaining',
313
317
  type: 'js',
@@ -319,7 +323,7 @@ export class VanillaParser extends Parser {
319
323
  },
320
324
 
321
325
  // Nullish coalescing
322
- LogicalExpression: (path) => {
326
+ LogicalExpression: (path: any) => {
323
327
  if (path.node.operator === '??') {
324
328
  features.push({
325
329
  feature: 'nullish-coalescing',
@@ -333,7 +337,7 @@ export class VanillaParser extends Parser {
333
337
  },
334
338
 
335
339
  // Private class fields
336
- ClassPrivateProperty: (path) => {
340
+ ClassPrivateProperty: (path: any) => {
337
341
  features.push({
338
342
  feature: 'private-fields',
339
343
  type: 'js',
@@ -344,7 +348,7 @@ export class VanillaParser extends Parser {
344
348
  });
345
349
  },
346
350
 
347
- ClassPrivateMethod: (path) => {
351
+ ClassPrivateMethod: (path: any) => {
348
352
  features.push({
349
353
  feature: 'private-methods',
350
354
  type: 'js',
@@ -356,7 +360,7 @@ export class VanillaParser extends Parser {
356
360
  },
357
361
 
358
362
  // Top-level await
359
- AwaitExpression: (path) => {
363
+ AwaitExpression: (path: any) => {
360
364
  if (this.isTopLevelAwait(path)) {
361
365
  features.push({
362
366
  feature: 'top-level-await',
@@ -370,7 +374,7 @@ export class VanillaParser extends Parser {
370
374
  },
371
375
 
372
376
  // Dynamic imports
373
- Import: (path) => {
377
+ Import: (path: any) => {
374
378
  features.push({
375
379
  feature: 'dynamic-import',
376
380
  type: 'js',
@@ -382,7 +386,7 @@ export class VanillaParser extends Parser {
382
386
  },
383
387
 
384
388
  // BigInt literals
385
- BigIntLiteral: (path) => {
389
+ BigIntLiteral: (path: any) => {
386
390
  features.push({
387
391
  feature: 'bigint',
388
392
  type: 'js',
@@ -394,7 +398,7 @@ export class VanillaParser extends Parser {
394
398
  },
395
399
 
396
400
  // Numeric separators
397
- NumericLiteral: (path) => {
401
+ NumericLiteral: (path: any) => {
398
402
  if ((path.node.extra as any)?.raw?.includes('_')) {
399
403
  features.push({
400
404
  feature: 'numeric-separators',
@@ -422,7 +426,7 @@ export class VanillaParser extends Parser {
422
426
  const root = postcss.parse(content);
423
427
 
424
428
  // Extract CSS properties
425
- root.walkDecls(decl => {
429
+ root.walkDecls((decl: any) => {
426
430
  if (this.CSS_PROPERTIES.has(decl.prop) || decl.prop.startsWith('--')) {
427
431
  features.push({
428
432
  feature: decl.prop,
@@ -453,7 +457,7 @@ export class VanillaParser extends Parser {
453
457
  });
454
458
 
455
459
  // Extract CSS selectors
456
- root.walkRules(rule => {
460
+ root.walkRules((rule: any) => {
457
461
  this.CSS_SELECTORS.forEach(selector => {
458
462
  if (rule.selector.includes(selector)) {
459
463
  features.push({
@@ -469,7 +473,7 @@ export class VanillaParser extends Parser {
469
473
  });
470
474
 
471
475
  // Extract at-rules
472
- root.walkAtRules(atRule => {
476
+ root.walkAtRules((atRule: any) => {
473
477
  const atRuleName = `@${atRule.name}`;
474
478
  features.push({
475
479
  feature: atRuleName,
@@ -1,6 +1,9 @@
1
1
  import { Parser } from './parser.js';
2
2
  import type { DetectedFeature } from '../types/index.js';
3
3
  import { LazyLoader } from '../core/lazy-loader.js';
4
+ import traverse from '@babel/traverse';
5
+ import * as t from '@babel/types';
6
+ import postcss from 'postcss';
4
7
 
5
8
  /**
6
9
  * Vue single-file component parser - extracts ALL web platform features
@@ -165,7 +168,7 @@ export class VueParser extends Parser {
165
168
 
166
169
  traverse(ast, {
167
170
  // Extract JavaScript Web APIs
168
- MemberExpression: (path) => {
171
+ MemberExpression: (path: any) => {
169
172
  const feature = this.extractWebAPIFeature(path.node, path, content);
170
173
  if (feature) {
171
174
  features.push({ ...feature, file: filePath });
@@ -173,7 +176,7 @@ export class VueParser extends Parser {
173
176
  },
174
177
 
175
178
  // Extract function calls to Web APIs
176
- CallExpression: (path) => {
179
+ CallExpression: (path: any) => {
177
180
  const feature = this.extractWebAPICall(path.node, path, content);
178
181
  if (feature) {
179
182
  features.push({ ...feature, file: filePath });
@@ -181,7 +184,7 @@ export class VueParser extends Parser {
181
184
  },
182
185
 
183
186
  // Extract modern JavaScript syntax features
184
- OptionalMemberExpression: (path) => {
187
+ OptionalMemberExpression: (path: any) => {
185
188
  features.push({
186
189
  feature: 'optional-chaining',
187
190
  type: 'js',
@@ -193,7 +196,7 @@ export class VueParser extends Parser {
193
196
  },
194
197
 
195
198
  // Nullish coalescing
196
- LogicalExpression: (path) => {
199
+ LogicalExpression: (path: any) => {
197
200
  if (path.node.operator === '??') {
198
201
  features.push({
199
202
  feature: 'nullish-coalescing',
@@ -207,7 +210,7 @@ export class VueParser extends Parser {
207
210
  },
208
211
 
209
212
  // Private class fields
210
- ClassPrivateProperty: (path) => {
213
+ ClassPrivateProperty: (path: any) => {
211
214
  features.push({
212
215
  feature: 'private-fields',
213
216
  type: 'js',
@@ -219,7 +222,7 @@ export class VueParser extends Parser {
219
222
  },
220
223
 
221
224
  // Top-level await
222
- AwaitExpression: (path) => {
225
+ AwaitExpression: (path: any) => {
223
226
  if (this.isTopLevelAwait(path)) {
224
227
  features.push({
225
228
  feature: 'top-level-await',
@@ -250,7 +253,7 @@ export class VueParser extends Parser {
250
253
  const postcss = await LazyLoader.getPostCSS();
251
254
  const root = postcss.parse(content);
252
255
 
253
- root.walkDecls(decl => {
256
+ root.walkDecls((decl: any) => {
254
257
  features.push({
255
258
  feature: decl.prop,
256
259
  type: 'css',
@@ -261,7 +264,7 @@ export class VueParser extends Parser {
261
264
  });
262
265
  });
263
266
 
264
- root.walkRules(rule => {
267
+ root.walkRules((rule: any) => {
265
268
  // Extract CSS selectors that might be modern features
266
269
  if (rule.selector.includes(':has(') ||
267
270
  rule.selector.includes(':is(') ||
@@ -278,7 +281,7 @@ export class VueParser extends Parser {
278
281
  }
279
282
  });
280
283
 
281
- root.walkAtRules(atRule => {
284
+ root.walkAtRules((atRule: any) => {
282
285
  // Extract at-rules like @supports, @container, etc.
283
286
  features.push({
284
287
  feature: `@${atRule.name}`,
@@ -305,13 +308,13 @@ export class VueParser extends Parser {
305
308
  const lines = content.split('\n');
306
309
 
307
310
  lines.forEach((line, index) => {
308
- let match;
311
+ let match: RegExpExecArray | null;
309
312
  while ((match = htmlElementRegex.exec(line)) !== null) {
310
313
  const tagName = match[1];
311
314
  const attributes = match[2];
312
315
 
313
316
  // Check for modern HTML elements
314
- if (this.isModernHTMLElement(tagName)) {
317
+ if (tagName && this.isModernHTMLElement(tagName)) {
315
318
  features.push({
316
319
  feature: tagName,
317
320
  type: 'html',
@@ -331,7 +334,7 @@ export class VueParser extends Parser {
331
334
  type: 'html',
332
335
  context: line.trim(),
333
336
  line: index + 1,
334
- column: match.index,
337
+ column: match!.index,
335
338
  file: filePath
336
339
  });
337
340
  });
@@ -447,8 +450,11 @@ export class VueParser extends Parser {
447
450
  modernAttrPatterns.forEach(pattern => {
448
451
  if (pattern.test(attributes)) {
449
452
  const match = attributes.match(pattern);
450
- if (match) {
451
- modernAttrs.push(match[0].split('=')[0]);
453
+ if (match && match[0]) {
454
+ const attrName = match[0].split('=')[0];
455
+ if (attrName) {
456
+ modernAttrs.push(attrName);
457
+ }
452
458
  }
453
459
  }
454
460
  });
@@ -50,6 +50,10 @@ export interface Configuration {
50
50
  jules: string | null;
51
51
  gemini: string | null;
52
52
  };
53
+ codingAgent: {
54
+ primary: 'jules' | 'gemini';
55
+ fallback: 'jules' | 'gemini';
56
+ };
53
57
  automation: {
54
58
  enabled: boolean;
55
59
  trigger: 'pre-commit' | 'pre-push';
package/src/ui/help.ts CHANGED
@@ -138,7 +138,7 @@ export function showGlobalHelp(): void {
138
138
  console.log(chalk.white('AI SERVICES:'));
139
139
  console.log(` ${chalk.cyan('Gemini:')} AI analysis of compatibility issues`);
140
140
  console.log(` Get API key: ${chalk.blue('https://aistudio.google.com')}`);
141
- console.log(` ${chalk.cyan('Jules:')} Autonomous code fixing with GitHub integration`);
141
+ console.log(` ${chalk.cyan('Jules:')} Autonomous code fixing (requires GitHub repository)`);
142
142
  console.log(` Get API key: ${chalk.blue('https://jules.google.com')}\n`);
143
143
 
144
144
  console.log(chalk.white('SUPPORTED FILES:'));
package/src/ui/prompts.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import inquirer from 'inquirer';
2
2
  import open from 'open';
3
+ import chalk from 'chalk';
3
4
  import { Colors, UIComponents } from './components.js';
4
5
  import { ApiKeyManager } from '../core/api-key-manager.js';
5
6
  import type { BrowserTarget } from '../types/index.js';
@@ -300,8 +301,8 @@ export class Prompts {
300
301
  if (testResult.success) {
301
302
  spinner.succeed('Jules API key validated successfully');
302
303
 
303
- // Guide through GitHub app installation
304
- await this.setupJulesGitHubIntegration();
304
+ // Note: GitHub integration should be set up on the Jules dashboard
305
+ console.log(chalk.cyan('šŸ’” Note: GitHub integration should be configured on the Jules dashboard.'));
305
306
 
306
307
  return keyPrompt.apiKey;
307
308
  } else {
@@ -329,66 +330,7 @@ export class Prompts {
329
330
  return undefined;
330
331
  }
331
332
 
332
- /**
333
- * Guide user through Jules GitHub app installation
334
- */
335
- static async setupJulesGitHubIntegration(): Promise<void> {
336
- console.log(Colors.info('\nšŸ”— Setting up Jules GitHub integration'));
337
-
338
- const setupGitHub = await inquirer.prompt([
339
- {
340
- type: 'confirm',
341
- name: 'setup',
342
- message: 'Jules needs access to your GitHub repository for code fixing. Set up now?',
343
- default: true
344
- }
345
- ]);
346
-
347
- if (!setupGitHub.setup) {
348
- UIComponents.showWarningBox('GitHub integration skipped. Jules will have limited functionality without repository access.');
349
- return;
350
- }
351
-
352
- const openGitHub = await inquirer.prompt([
353
- {
354
- type: 'confirm',
355
- name: 'open',
356
- message: 'Open GitHub to install the Jules app?',
357
- default: true
358
- }
359
- ]);
360
-
361
- if (openGitHub.open) {
362
- const spinner = UIComponents.createSpinner('Opening GitHub Apps...');
363
- spinner.start();
364
-
365
- try {
366
- await open('https://github.com/apps/jules-ai');
367
- spinner.succeed('Opened Jules GitHub App page');
368
- } catch (error) {
369
- spinner.fail('Failed to open browser. Please visit https://github.com/apps/jules-ai manually');
370
- }
371
- }
372
333
 
373
- console.log(Colors.muted('\nSteps to install Jules GitHub app:'));
374
- UIComponents.showList([
375
- 'Click "Install" on the Jules GitHub app page',
376
- 'Select the repositories you want Jules to access',
377
- 'Complete the installation process',
378
- 'Return here when done'
379
- ]);
380
-
381
- await inquirer.prompt([
382
- {
383
- type: 'confirm',
384
- name: 'completed',
385
- message: 'Have you completed the GitHub app installation?',
386
- default: false
387
- }
388
- ]);
389
-
390
- UIComponents.showSuccessBox('Jules GitHub integration setup complete!');
391
- }
392
334
 
393
335
  /**
394
336
  * Set up Gemini API key with browser integration
@@ -685,4 +627,55 @@ export class Prompts {
685
627
  }
686
628
  ]);
687
629
  }
630
+
631
+ /**
632
+ * Choose coding agent for fixing
633
+ */
634
+ static async chooseCodingAgent(): Promise<{ primary: 'jules' | 'gemini'; fallback: 'jules' | 'gemini' }> {
635
+ console.log(chalk.cyan('\nšŸ¤– Coding Agent Selection'));
636
+ console.log(chalk.dim('Choose which AI agent to use for code fixing:\n'));
637
+
638
+ console.log(chalk.white('Jules (Google\'s Autonomous Coding Agent):'));
639
+ console.log(chalk.green(' āœ… Autonomous operation in cloud VMs'));
640
+ console.log(chalk.green(' āœ… Full repository context understanding'));
641
+ console.log(chalk.green(' āœ… Asynchronous processing'));
642
+ console.log(chalk.red(' āŒ Requires GitHub repository'));
643
+ console.log(chalk.red(' āŒ Cannot work with local/uncommitted files'));
644
+
645
+ console.log(chalk.white('\nGemini 2.5 Pro (Direct API Integration):'));
646
+ console.log(chalk.green(' āœ… Works with any files (GitHub or not)'));
647
+ console.log(chalk.green(' āœ… Immediate processing'));
648
+ console.log(chalk.green(' āœ… Works with uncommitted/local files'));
649
+ console.log(chalk.green(' āœ… Grounded with real-time web search'));
650
+ console.log(chalk.yellow(' āš ļø Requires manual code application'));
651
+
652
+ const answers = await inquirer.prompt([
653
+ {
654
+ type: 'list',
655
+ name: 'primary',
656
+ message: 'Select primary coding agent:',
657
+ choices: [
658
+ { name: 'Gemini 2.5 Pro (recommended for most projects)', value: 'gemini' },
659
+ { name: 'Jules (for GitHub repositories with autonomous needs)', value: 'jules' }
660
+ ],
661
+ default: 'gemini'
662
+ },
663
+ {
664
+ type: 'list',
665
+ name: 'fallback',
666
+ message: 'Select fallback coding agent:',
667
+ choices: [
668
+ { name: 'Gemini 2.5 Pro', value: 'gemini' },
669
+ { name: 'Jules', value: 'jules' }
670
+ ],
671
+ default: 'gemini'
672
+ }
673
+ ]);
674
+
675
+ console.log(chalk.green(`\nāœ… Coding agents configured:`));
676
+ console.log(` Primary: ${answers.primary}`);
677
+ console.log(` Fallback: ${answers.fallback}`);
678
+
679
+ return answers;
680
+ }
688
681
  }
package/test-build.js ADDED
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Simple build verification script
5
+ * Tests that BaseGuard can be imported and basic functionality works
6
+ */
7
+
8
+ import { execSync } from 'child_process';
9
+
10
+ console.log('šŸ›”ļø Testing BaseGuard Build...\n');
11
+
12
+ try {
13
+ // Test basic imports
14
+ console.log('āœ“ Testing imports...');
15
+
16
+ console.log('āœ“ Testing CLI help...');
17
+ const helpOutput = execSync('node bin/base.js --help', { encoding: 'utf8' });
18
+
19
+ if (helpOutput.includes('BaseGuard')) {
20
+ console.log('āœ… CLI help working');
21
+ } else {
22
+ throw new Error('CLI help not working properly');
23
+ }
24
+
25
+ console.log('āœ“ Testing version...');
26
+ const versionOutput = execSync('node bin/base.js --version', { encoding: 'utf8' });
27
+
28
+ if (versionOutput.includes('1.0.2')) {
29
+ console.log('āœ… Version check working');
30
+ } else {
31
+ throw new Error('Version not correct');
32
+ }
33
+
34
+ console.log('\nšŸŽ‰ Build verification successful!');
35
+ console.log('šŸ“¦ BaseGuard v1.0.2 is ready for deployment');
36
+
37
+ } catch (error) {
38
+ console.error('\nāŒ Build verification failed:');
39
+ console.error(error.message);
40
+ process.exit(1);
41
+ }
@@ -71,7 +71,7 @@ async function setupGitRepo(repoPath: string): Promise<void> {
71
71
  // Create initial commit
72
72
  await fs.writeFile(path.join(repoPath, 'README.md'), '# Test Project\n');
73
73
  runGit(['add', 'README.md'], repoPath);
74
- runGit(['commit', '-m', 'Initial commit'], repoPath);
74
+ runGit(['commit', '-m', '"Initial commit"'], repoPath);
75
75
  }
76
76
 
77
77
  // Helper function to create test files with violations
package/tsconfig.json CHANGED
@@ -20,7 +20,6 @@
20
20
  "declarationMap": true,
21
21
  "sourceMap": true,
22
22
  "removeComments": false,
23
- "skipLibCheck": true,
24
23
  "forceConsistentCasingInFileNames": true,
25
24
  "resolveJsonModule": true
26
25
  },
package/vitest.config.ts CHANGED
@@ -4,7 +4,9 @@ export default defineConfig({
4
4
  test: {
5
5
  globals: true,
6
6
  environment: 'node',
7
- include: ['src/**/*.{test,spec}.{js,ts}'],
8
- exclude: ['node_modules', 'dist']
7
+ include: ['src/**/*.{test,spec}.{js,ts}', 'tests/**/*.{test,spec}.{js,ts}'],
8
+ exclude: ['node_modules', 'dist', 'tests/e2e/**'],
9
+ testTimeout: 60000, // 60 seconds for tests
10
+ hookTimeout: 60000
9
11
  }
10
12
  });