baseguard 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 (244) hide show
  1. package/.eslintrc.json +25 -0
  2. package/.prettierrc +8 -0
  3. package/README.md +94 -0
  4. package/bin/base.js +494 -0
  5. package/dist/ai/fix-manager.d.ts +67 -0
  6. package/dist/ai/fix-manager.d.ts.map +1 -0
  7. package/dist/ai/fix-manager.js +326 -0
  8. package/dist/ai/fix-manager.js.map +1 -0
  9. package/dist/ai/gemini-analyzer.d.ts +116 -0
  10. package/dist/ai/gemini-analyzer.d.ts.map +1 -0
  11. package/dist/ai/gemini-analyzer.js +572 -0
  12. package/dist/ai/gemini-analyzer.js.map +1 -0
  13. package/dist/ai/index.d.ts +4 -0
  14. package/dist/ai/index.d.ts.map +1 -0
  15. package/dist/ai/index.js +5 -0
  16. package/dist/ai/index.js.map +1 -0
  17. package/dist/ai/jules-implementer.d.ts +115 -0
  18. package/dist/ai/jules-implementer.d.ts.map +1 -0
  19. package/dist/ai/jules-implementer.js +387 -0
  20. package/dist/ai/jules-implementer.js.map +1 -0
  21. package/dist/commands/automation.d.ts +5 -0
  22. package/dist/commands/automation.d.ts.map +1 -0
  23. package/dist/commands/automation.js +305 -0
  24. package/dist/commands/automation.js.map +1 -0
  25. package/dist/commands/check.d.ts +9 -0
  26. package/dist/commands/check.d.ts.map +1 -0
  27. package/dist/commands/check.js +113 -0
  28. package/dist/commands/check.js.map +1 -0
  29. package/dist/commands/config.d.ts +11 -0
  30. package/dist/commands/config.d.ts.map +1 -0
  31. package/dist/commands/config.js +324 -0
  32. package/dist/commands/config.js.map +1 -0
  33. package/dist/commands/fix.d.ts +9 -0
  34. package/dist/commands/fix.d.ts.map +1 -0
  35. package/dist/commands/fix.js +207 -0
  36. package/dist/commands/fix.js.map +1 -0
  37. package/dist/commands/index.d.ts +6 -0
  38. package/dist/commands/index.d.ts.map +1 -0
  39. package/dist/commands/index.js +7 -0
  40. package/dist/commands/index.js.map +1 -0
  41. package/dist/commands/init.d.ts +9 -0
  42. package/dist/commands/init.d.ts.map +1 -0
  43. package/dist/commands/init.js +125 -0
  44. package/dist/commands/init.js.map +1 -0
  45. package/dist/core/api-key-manager.d.ts +83 -0
  46. package/dist/core/api-key-manager.d.ts.map +1 -0
  47. package/dist/core/api-key-manager.js +244 -0
  48. package/dist/core/api-key-manager.js.map +1 -0
  49. package/dist/core/baseguard.d.ts +46 -0
  50. package/dist/core/baseguard.d.ts.map +1 -0
  51. package/dist/core/baseguard.js +132 -0
  52. package/dist/core/baseguard.js.map +1 -0
  53. package/dist/core/baseline-checker.d.ts +63 -0
  54. package/dist/core/baseline-checker.d.ts.map +1 -0
  55. package/dist/core/baseline-checker.js +502 -0
  56. package/dist/core/baseline-checker.js.map +1 -0
  57. package/dist/core/cache-manager.d.ts +88 -0
  58. package/dist/core/cache-manager.d.ts.map +1 -0
  59. package/dist/core/cache-manager.js +213 -0
  60. package/dist/core/cache-manager.js.map +1 -0
  61. package/dist/core/configuration.d.ts +140 -0
  62. package/dist/core/configuration.d.ts.map +1 -0
  63. package/dist/core/configuration.js +474 -0
  64. package/dist/core/configuration.js.map +1 -0
  65. package/dist/core/directory-filter.d.ts +90 -0
  66. package/dist/core/directory-filter.d.ts.map +1 -0
  67. package/dist/core/directory-filter.js +319 -0
  68. package/dist/core/directory-filter.js.map +1 -0
  69. package/dist/core/error-handler.d.ts +110 -0
  70. package/dist/core/error-handler.d.ts.map +1 -0
  71. package/dist/core/error-handler.js +392 -0
  72. package/dist/core/error-handler.js.map +1 -0
  73. package/dist/core/file-processor.d.ts +80 -0
  74. package/dist/core/file-processor.d.ts.map +1 -0
  75. package/dist/core/file-processor.js +259 -0
  76. package/dist/core/file-processor.js.map +1 -0
  77. package/dist/core/gitignore-manager.d.ts +44 -0
  78. package/dist/core/gitignore-manager.d.ts.map +1 -0
  79. package/dist/core/gitignore-manager.js +147 -0
  80. package/dist/core/gitignore-manager.js.map +1 -0
  81. package/dist/core/index.d.ts +13 -0
  82. package/dist/core/index.d.ts.map +1 -0
  83. package/dist/core/index.js +13 -0
  84. package/dist/core/index.js.map +1 -0
  85. package/dist/core/lazy-loader.d.ts +68 -0
  86. package/dist/core/lazy-loader.d.ts.map +1 -0
  87. package/dist/core/lazy-loader.js +260 -0
  88. package/dist/core/lazy-loader.js.map +1 -0
  89. package/dist/core/memory-manager.d.ts +1 -0
  90. package/dist/core/memory-manager.d.ts.map +1 -0
  91. package/dist/core/memory-manager.js +2 -0
  92. package/dist/core/memory-manager.js.map +1 -0
  93. package/dist/core/startup-optimizer.d.ts +45 -0
  94. package/dist/core/startup-optimizer.d.ts.map +1 -0
  95. package/dist/core/startup-optimizer.js +140 -0
  96. package/dist/core/startup-optimizer.js.map +1 -0
  97. package/dist/git/automation-engine.d.ts +58 -0
  98. package/dist/git/automation-engine.d.ts.map +1 -0
  99. package/dist/git/automation-engine.js +318 -0
  100. package/dist/git/automation-engine.js.map +1 -0
  101. package/dist/git/github-manager.d.ts +71 -0
  102. package/dist/git/github-manager.d.ts.map +1 -0
  103. package/dist/git/github-manager.js +226 -0
  104. package/dist/git/github-manager.js.map +1 -0
  105. package/dist/git/hook-manager.d.ts +43 -0
  106. package/dist/git/hook-manager.d.ts.map +1 -0
  107. package/dist/git/hook-manager.js +191 -0
  108. package/dist/git/hook-manager.js.map +1 -0
  109. package/dist/git/index.d.ts +4 -0
  110. package/dist/git/index.d.ts.map +1 -0
  111. package/dist/git/index.js +5 -0
  112. package/dist/git/index.js.map +1 -0
  113. package/dist/index.d.ts +8 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +9 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/parsers/feature-validator.d.ts +60 -0
  118. package/dist/parsers/feature-validator.d.ts.map +1 -0
  119. package/dist/parsers/feature-validator.js +483 -0
  120. package/dist/parsers/feature-validator.js.map +1 -0
  121. package/dist/parsers/index.d.ts +8 -0
  122. package/dist/parsers/index.d.ts.map +1 -0
  123. package/dist/parsers/index.js +9 -0
  124. package/dist/parsers/index.js.map +1 -0
  125. package/dist/parsers/parser-manager.d.ts +103 -0
  126. package/dist/parsers/parser-manager.d.ts.map +1 -0
  127. package/dist/parsers/parser-manager.js +321 -0
  128. package/dist/parsers/parser-manager.js.map +1 -0
  129. package/dist/parsers/parser.d.ts +23 -0
  130. package/dist/parsers/parser.d.ts.map +1 -0
  131. package/dist/parsers/parser.js +6 -0
  132. package/dist/parsers/parser.js.map +1 -0
  133. package/dist/parsers/react-parser.d.ts +22 -0
  134. package/dist/parsers/react-parser.d.ts.map +1 -0
  135. package/dist/parsers/react-parser.js +307 -0
  136. package/dist/parsers/react-parser.js.map +1 -0
  137. package/dist/parsers/svelte-parser.d.ts +33 -0
  138. package/dist/parsers/svelte-parser.d.ts.map +1 -0
  139. package/dist/parsers/svelte-parser.js +408 -0
  140. package/dist/parsers/svelte-parser.js.map +1 -0
  141. package/dist/parsers/vanilla-parser.d.ts +31 -0
  142. package/dist/parsers/vanilla-parser.d.ts.map +1 -0
  143. package/dist/parsers/vanilla-parser.js +590 -0
  144. package/dist/parsers/vanilla-parser.js.map +1 -0
  145. package/dist/parsers/vue-parser.d.ts +9 -0
  146. package/dist/parsers/vue-parser.d.ts.map +1 -0
  147. package/dist/parsers/vue-parser.js +16 -0
  148. package/dist/parsers/vue-parser.js.map +1 -0
  149. package/dist/terminal-header.d.ts +12 -0
  150. package/dist/terminal-header.js +45 -0
  151. package/dist/types/index.d.ts +83 -0
  152. package/dist/types/index.d.ts.map +1 -0
  153. package/dist/types/index.js +5 -0
  154. package/dist/types/index.js.map +1 -0
  155. package/dist/ui/components.d.ts +133 -0
  156. package/dist/ui/components.d.ts.map +1 -0
  157. package/dist/ui/components.js +482 -0
  158. package/dist/ui/components.js.map +1 -0
  159. package/dist/ui/help.d.ts +11 -0
  160. package/dist/ui/help.d.ts.map +1 -0
  161. package/dist/ui/help.js +161 -0
  162. package/dist/ui/help.js.map +1 -0
  163. package/dist/ui/index.d.ts +5 -0
  164. package/dist/ui/index.d.ts.map +1 -0
  165. package/dist/ui/index.js +5 -0
  166. package/dist/ui/index.js.map +1 -0
  167. package/dist/ui/prompts.d.ts +63 -0
  168. package/dist/ui/prompts.d.ts.map +1 -0
  169. package/dist/ui/prompts.js +611 -0
  170. package/dist/ui/prompts.js.map +1 -0
  171. package/dist/ui/terminal-header.d.ts +13 -0
  172. package/dist/ui/terminal-header.d.ts.map +1 -0
  173. package/dist/ui/terminal-header.js +46 -0
  174. package/dist/ui/terminal-header.js.map +1 -0
  175. package/package.json +80 -0
  176. package/src/ai/__tests__/gemini-analyzer.test.ts +181 -0
  177. package/src/ai/fix-manager.ts +362 -0
  178. package/src/ai/gemini-analyzer.ts +671 -0
  179. package/src/ai/index.ts +4 -0
  180. package/src/ai/jules-implementer.ts +459 -0
  181. package/src/commands/automation.ts +344 -0
  182. package/src/commands/check.ts +299 -0
  183. package/src/commands/config.ts +365 -0
  184. package/src/commands/fix.ts +234 -0
  185. package/src/commands/index.ts +6 -0
  186. package/src/commands/init.ts +142 -0
  187. package/src/commands/status.ts +0 -0
  188. package/src/core/api-key-manager.ts +298 -0
  189. package/src/core/baseguard.ts +742 -0
  190. package/src/core/baseline-checker.ts +563 -0
  191. package/src/core/cache-manager.ts +270 -0
  192. package/src/core/configuration-recovery.ts +676 -0
  193. package/src/core/configuration.ts +559 -0
  194. package/src/core/debug-logger.ts +590 -0
  195. package/src/core/directory-filter.ts +421 -0
  196. package/src/core/error-handler.ts +517 -0
  197. package/src/core/file-processor.ts +331 -0
  198. package/src/core/gitignore-manager.ts +169 -0
  199. package/src/core/graceful-degradation-manager.ts +596 -0
  200. package/src/core/index.ts +13 -0
  201. package/src/core/lazy-loader.ts +307 -0
  202. package/src/core/logger.ts +0 -0
  203. package/src/core/memory-manager.ts +294 -0
  204. package/src/core/startup-optimizer.ts +173 -0
  205. package/src/core/system-error-handler.ts +746 -0
  206. package/src/git/automation-engine.ts +361 -0
  207. package/src/git/github-manager.ts +260 -0
  208. package/src/git/hook-manager.ts +210 -0
  209. package/src/git/index.ts +4 -0
  210. package/src/index.ts +8 -0
  211. package/src/parsers/feature-validator.ts +559 -0
  212. package/src/parsers/index.ts +8 -0
  213. package/src/parsers/parser-manager.ts +419 -0
  214. package/src/parsers/parser.ts +26 -0
  215. package/src/parsers/react-parser-optimized.ts +161 -0
  216. package/src/parsers/react-parser.ts +359 -0
  217. package/src/parsers/svelte-parser.ts +506 -0
  218. package/src/parsers/vanilla-parser.ts +682 -0
  219. package/src/parsers/vue-parser.ts +472 -0
  220. package/src/types/index.ts +92 -0
  221. package/src/ui/components.ts +567 -0
  222. package/src/ui/help.ts +193 -0
  223. package/src/ui/index.ts +4 -0
  224. package/src/ui/prompts.ts +688 -0
  225. package/src/ui/terminal-header.ts +59 -0
  226. package/test-config-commands.js +56 -0
  227. package/test-header-simple.js +33 -0
  228. package/test-terminal-header.js +12 -0
  229. package/test-ui.js +29 -0
  230. package/tests/e2e/baseguard.e2e.test.ts +516 -0
  231. package/tests/e2e/cross-platform.e2e.test.ts +420 -0
  232. package/tests/e2e/git-integration.e2e.test.ts +487 -0
  233. package/tests/fixtures/react-project/package.json +14 -0
  234. package/tests/fixtures/react-project/src/App.css +76 -0
  235. package/tests/fixtures/react-project/src/App.tsx +77 -0
  236. package/tests/fixtures/svelte-project/package.json +11 -0
  237. package/tests/fixtures/svelte-project/src/App.svelte +369 -0
  238. package/tests/fixtures/vanilla-project/index.html +76 -0
  239. package/tests/fixtures/vanilla-project/script.js +331 -0
  240. package/tests/fixtures/vanilla-project/styles.css +359 -0
  241. package/tests/fixtures/vue-project/package.json +12 -0
  242. package/tests/fixtures/vue-project/src/App.vue +216 -0
  243. package/tsconfig.json +36 -0
  244. package/vitest.config.ts +10 -0
@@ -0,0 +1,318 @@
1
+ import { execSync } from 'child_process';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import inquirer from 'inquirer';
5
+ import { ConfigurationManager } from '../core/configuration.js';
6
+ import { BaseGuard } from '../core/baseguard.js';
7
+ import { UIComponents } from '../ui/components.js';
8
+ import { GeminiAnalyzer } from '../ai/gemini-analyzer.js';
9
+ import { JulesImplementer } from '../ai/jules-implementer.js';
10
+ /**
11
+ * Automation engine for git workflow integration
12
+ */
13
+ export class AutomationEngine {
14
+ config;
15
+ baseGuard;
16
+ constructor(config) {
17
+ this.config = config || ConfigurationManager.createDefault();
18
+ this.baseGuard = new BaseGuard(this.config);
19
+ }
20
+ /**
21
+ * Run automation for git hooks
22
+ */
23
+ async run(options) {
24
+ try {
25
+ // Load current configuration
26
+ this.config = await ConfigurationManager.load();
27
+ this.baseGuard = new BaseGuard(this.config);
28
+ // Check if automation is enabled
29
+ if (!this.config.automation.enabled) {
30
+ console.log(chalk.yellow('⚠️ BaseGuard automation is disabled. Run "base automation enable" to enable it.'));
31
+ return;
32
+ }
33
+ // Check if this is the correct trigger
34
+ if (this.config.automation.trigger !== options.trigger) {
35
+ // Silently exit if this isn't the configured trigger
36
+ return;
37
+ }
38
+ console.log(chalk.cyan(`🛡️ BaseGuard automation running (${options.trigger})...`));
39
+ // Step 1: Check violations in staged files
40
+ const violations = await this.checkViolations(options.trigger);
41
+ if (violations.length === 0) {
42
+ console.log(chalk.green('✅ No compatibility issues found'));
43
+ return;
44
+ }
45
+ console.log(chalk.yellow(`⚠️ Found ${violations.length} compatibility issue(s)`));
46
+ UIComponents.showViolations(violations);
47
+ // Step 2: Analyze violations (if enabled and API key available)
48
+ let analyses = [];
49
+ if (this.config.automation.autoAnalyze && this.config.apiKeys.gemini) {
50
+ analyses = await this.analyzeViolations(violations);
51
+ }
52
+ // Step 3: Auto-fix (if enabled and API keys available)
53
+ if (this.config.automation.autoFix && this.config.apiKeys.jules && this.config.apiKeys.gemini) {
54
+ const fixes = await this.generateFixes(violations, analyses);
55
+ if (fixes.length > 0) {
56
+ await this.applyFixes(fixes);
57
+ await this.stageChanges();
58
+ console.log(chalk.green('✅ All issues fixed automatically and staged'));
59
+ return;
60
+ }
61
+ }
62
+ // Manual mode - show options
63
+ await this.showManualOptions(violations, analyses);
64
+ // Block commit if configured to do so
65
+ if (this.config.automation.blockCommit && !options.strict === false) {
66
+ console.log(chalk.red('❌ Commit blocked due to compatibility issues'));
67
+ console.log(chalk.dim('Use --no-verify to bypass this check'));
68
+ process.exit(1);
69
+ }
70
+ }
71
+ catch (error) {
72
+ console.error(chalk.red('❌ BaseGuard automation failed:'), error instanceof Error ? error.message : 'Unknown error');
73
+ // Don't block commit on automation errors unless in strict mode
74
+ if (options.strict) {
75
+ process.exit(1);
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * Check violations in staged files (for pre-commit) or all files (for pre-push)
81
+ */
82
+ async checkViolations(trigger) {
83
+ const spinner = ora('Checking for compatibility violations...').start();
84
+ try {
85
+ let filesToCheck = [];
86
+ if (trigger === 'pre-commit') {
87
+ // Get staged files for pre-commit
88
+ filesToCheck = this.getStagedFiles();
89
+ }
90
+ else {
91
+ // For pre-push, check all files in the repository
92
+ filesToCheck = this.getAllTrackedFiles();
93
+ }
94
+ // Filter to only supported file types
95
+ const supportedExtensions = ['.js', '.ts', '.jsx', '.tsx', '.vue', '.svelte', '.css', '.html'];
96
+ const filteredFiles = filesToCheck.filter(file => supportedExtensions.some(ext => file.endsWith(ext)));
97
+ if (filteredFiles.length === 0) {
98
+ spinner.succeed('No supported files to check');
99
+ return [];
100
+ }
101
+ spinner.text = `Checking ${filteredFiles.length} file(s)...`;
102
+ // Use BaseGuard to check violations
103
+ const violations = await this.baseGuard.checkViolations(filteredFiles);
104
+ spinner.succeed(`Checked ${filteredFiles.length} file(s)`);
105
+ return violations;
106
+ }
107
+ catch (error) {
108
+ spinner.fail('Failed to check violations');
109
+ throw error;
110
+ }
111
+ }
112
+ /**
113
+ * Get staged files from git
114
+ */
115
+ getStagedFiles() {
116
+ try {
117
+ const output = execSync('git diff --cached --name-only', { encoding: 'utf-8' });
118
+ return output.trim().split('\n').filter(file => file.length > 0);
119
+ }
120
+ catch (error) {
121
+ console.warn(chalk.yellow('⚠️ Could not get staged files, checking all files'));
122
+ return this.getAllTrackedFiles();
123
+ }
124
+ }
125
+ /**
126
+ * Get all tracked files from git
127
+ */
128
+ getAllTrackedFiles() {
129
+ try {
130
+ const output = execSync('git ls-files', { encoding: 'utf-8' });
131
+ return output.trim().split('\n').filter(file => file.length > 0);
132
+ }
133
+ catch (error) {
134
+ throw new Error('Could not get tracked files from git');
135
+ }
136
+ }
137
+ /**
138
+ * Analyze violations if auto-analyze is enabled
139
+ */
140
+ async analyzeViolations(violations) {
141
+ if (!this.config.apiKeys.gemini) {
142
+ console.log(chalk.yellow('⚠️ Gemini API key not configured, skipping analysis'));
143
+ return [];
144
+ }
145
+ const spinner = ora('Analyzing violations with AI...').start();
146
+ try {
147
+ const analyzer = new GeminiAnalyzer(this.config.apiKeys.gemini);
148
+ const analyses = [];
149
+ // Analyze violations in batches to avoid rate limiting
150
+ for (const violation of violations) {
151
+ try {
152
+ const analysis = await analyzer.analyzeViolation(violation);
153
+ analyses.push(analysis);
154
+ }
155
+ catch (error) {
156
+ console.warn(chalk.yellow(`⚠️ Could not analyze ${violation.feature}: ${error instanceof Error ? error.message : 'Unknown error'}`));
157
+ }
158
+ }
159
+ spinner.succeed(`Analyzed ${analyses.length} violation(s)`);
160
+ return analyses;
161
+ }
162
+ catch (error) {
163
+ spinner.fail('Failed to analyze violations');
164
+ throw error;
165
+ }
166
+ }
167
+ /**
168
+ * Generate and apply fixes if auto-fix is enabled
169
+ */
170
+ async generateFixes(violations, analyses) {
171
+ if (!this.config.apiKeys.jules) {
172
+ console.log(chalk.yellow('⚠️ Jules API key not configured, skipping auto-fix'));
173
+ return [];
174
+ }
175
+ const spinner = ora('Generating fixes with AI...').start();
176
+ try {
177
+ const implementer = new JulesImplementer(this.config.apiKeys.jules);
178
+ const fixes = [];
179
+ // Generate fixes for violations that have analyses
180
+ for (const violation of violations) {
181
+ const analysis = analyses.find(a => a.violation.feature === violation.feature);
182
+ if (!analysis)
183
+ continue;
184
+ try {
185
+ // For automation, we need a repository source - this would need to be configured
186
+ // For now, we'll skip Jules integration in automation mode
187
+ console.log(chalk.yellow('⚠️ Jules integration requires repository setup, skipping auto-fix'));
188
+ break;
189
+ }
190
+ catch (error) {
191
+ console.warn(chalk.yellow(`⚠️ Could not generate fix for ${violation.feature}: ${error instanceof Error ? error.message : 'Unknown error'}`));
192
+ }
193
+ }
194
+ spinner.succeed(`Generated ${fixes.length} fix(es)`);
195
+ return fixes;
196
+ }
197
+ catch (error) {
198
+ spinner.fail('Failed to generate fixes');
199
+ throw error;
200
+ }
201
+ }
202
+ /**
203
+ * Apply fixes to files
204
+ */
205
+ async applyFixes(fixes) {
206
+ const spinner = ora('Applying fixes...').start();
207
+ try {
208
+ // This would use the BaseGuard.applyFixes method when implemented
209
+ // For now, we'll just log that fixes would be applied
210
+ spinner.succeed(`Applied ${fixes.length} fix(es)`);
211
+ }
212
+ catch (error) {
213
+ spinner.fail('Failed to apply fixes');
214
+ throw error;
215
+ }
216
+ }
217
+ /**
218
+ * Stage changes after fixing
219
+ */
220
+ async stageChanges() {
221
+ try {
222
+ execSync('git add -u', { stdio: 'ignore' });
223
+ }
224
+ catch (error) {
225
+ console.warn(chalk.yellow('⚠️ Could not stage changes automatically'));
226
+ }
227
+ }
228
+ /**
229
+ * Show manual options when auto-fix is disabled
230
+ */
231
+ async showManualOptions(violations, analyses = []) {
232
+ console.log(chalk.cyan('\n🔧 Manual Options:'));
233
+ const choices = [
234
+ {
235
+ name: 'Continue with commit (ignore violations)',
236
+ value: 'continue'
237
+ },
238
+ {
239
+ name: 'Fix violations manually and retry',
240
+ value: 'manual'
241
+ }
242
+ ];
243
+ // Add AI options if API keys are available
244
+ if (this.config.apiKeys.gemini && analyses.length === 0) {
245
+ choices.unshift({
246
+ name: 'Analyze violations with AI first',
247
+ value: 'analyze'
248
+ });
249
+ }
250
+ if (this.config.apiKeys.jules && this.config.apiKeys.gemini) {
251
+ choices.unshift({
252
+ name: 'Generate and preview AI fixes',
253
+ value: 'fix'
254
+ });
255
+ }
256
+ const { action } = await inquirer.prompt([
257
+ {
258
+ type: 'list',
259
+ name: 'action',
260
+ message: 'What would you like to do?',
261
+ choices
262
+ }
263
+ ]);
264
+ switch (action) {
265
+ case 'continue':
266
+ console.log(chalk.yellow('⚠️ Continuing with violations...'));
267
+ break;
268
+ case 'manual':
269
+ console.log(chalk.blue('💡 Fix the violations manually and run git commit again'));
270
+ process.exit(1);
271
+ case 'analyze':
272
+ console.log(chalk.blue('🔍 Run "base check --analyze" to get AI analysis'));
273
+ process.exit(1);
274
+ case 'fix':
275
+ console.log(chalk.blue('🤖 Run "base fix" to generate and preview AI fixes'));
276
+ process.exit(1);
277
+ default:
278
+ process.exit(1);
279
+ }
280
+ }
281
+ /**
282
+ * Check if git repository has uncommitted changes
283
+ */
284
+ hasUncommittedChanges() {
285
+ try {
286
+ const output = execSync('git status --porcelain', { encoding: 'utf-8' });
287
+ return output.trim().length > 0;
288
+ }
289
+ catch {
290
+ return false;
291
+ }
292
+ }
293
+ /**
294
+ * Get current git branch
295
+ */
296
+ getCurrentBranch() {
297
+ try {
298
+ const output = execSync('git branch --show-current', { encoding: 'utf-8' });
299
+ return output.trim();
300
+ }
301
+ catch {
302
+ return 'unknown';
303
+ }
304
+ }
305
+ /**
306
+ * Check if we're in a git repository
307
+ */
308
+ isGitRepository() {
309
+ try {
310
+ execSync('git rev-parse --git-dir', { stdio: 'ignore' });
311
+ return true;
312
+ }
313
+ catch {
314
+ return false;
315
+ }
316
+ }
317
+ }
318
+ //# sourceMappingURL=automation-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-engine.js","sourceRoot":"","sources":["../../src/git/automation-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * GitHub repository manager for Jules integration
3
+ */
4
+ export declare class GitHubManager {
5
+ private repoOwner;
6
+ private repoName;
7
+ private sourceIdentifier;
8
+ /**
9
+ * Guide user through Jules GitHub app installation
10
+ */
11
+ setupJulesGitHubIntegration(): Promise<string>;
12
+ /**
13
+ * Check if current directory is a git repository
14
+ */
15
+ private isGitRepository;
16
+ /**
17
+ * Detect repository owner and name from git remote
18
+ */
19
+ private detectRepositoryInfo;
20
+ /**
21
+ * Guide user through GitHub app installation process
22
+ */
23
+ private guideGitHubAppInstallation;
24
+ /**
25
+ * Wait for user to confirm GitHub app installation
26
+ */
27
+ private waitForUserConfirmation;
28
+ /**
29
+ * Get source identifier for Jules API
30
+ */
31
+ private getSourceIdentifier;
32
+ /**
33
+ * Verify GitHub authentication and permissions
34
+ */
35
+ verifyGitHubConnection(): Promise<boolean>;
36
+ /**
37
+ * Get current repository source identifier
38
+ */
39
+ getCurrentSourceIdentifier(): Promise<string>;
40
+ /**
41
+ * Check if Jules GitHub integration is set up
42
+ */
43
+ isJulesIntegrationSetup(): Promise<boolean>;
44
+ /**
45
+ * Get repository information
46
+ */
47
+ getRepositoryInfo(): {
48
+ owner: string | null;
49
+ name: string | null;
50
+ };
51
+ /**
52
+ * Check if repository has required permissions for Jules
53
+ */
54
+ checkRepositoryPermissions(): Promise<{
55
+ hasAccess: boolean;
56
+ permissions: string[];
57
+ }>;
58
+ /**
59
+ * Get current branch name
60
+ */
61
+ getCurrentBranch(): string;
62
+ /**
63
+ * Check if there are uncommitted changes
64
+ */
65
+ hasUncommittedChanges(): boolean;
66
+ /**
67
+ * Get repository URL for display
68
+ */
69
+ getRepositoryUrl(): string | null;
70
+ }
71
+ //# sourceMappingURL=github-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-manager.d.ts","sourceRoot":"","sources":["../../src/git/github-manager.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,gBAAgB,CAAuB;IAE/C;;OAEG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,CAAC;IAqBpD;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;YACW,oBAAoB;IAoBlC;;OAEG;YACW,0BAA0B;IAyBxC;;OAEG;YACW,uBAAuB;IAkBrC;;OAEG;YACW,mBAAmB;IAajC;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC;IAsBhD;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC;IASnD;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC;IAajD;;OAEG;IACH,iBAAiB,IAAI;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;IAOlE;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAsB1F;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAQ1B;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAShC;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;CAOlC"}
@@ -0,0 +1,226 @@
1
+ import { execSync } from 'child_process';
2
+ import chalk from 'chalk';
3
+ import open from 'open';
4
+ /**
5
+ * GitHub repository manager for Jules integration
6
+ */
7
+ export class GitHubManager {
8
+ repoOwner = null;
9
+ repoName = null;
10
+ sourceIdentifier = null;
11
+ /**
12
+ * Guide user through Jules GitHub app installation
13
+ */
14
+ async setupJulesGitHubIntegration() {
15
+ console.log(chalk.cyan('\n🔗 Setting up Jules GitHub Integration\n'));
16
+ // Step 1: Check if we're in a git repository
17
+ if (!this.isGitRepository()) {
18
+ throw new Error('Not in a git repository. Please run this command from within a git repository.');
19
+ }
20
+ // Step 2: Get repository information
21
+ await this.detectRepositoryInfo();
22
+ // Step 3: Guide user through GitHub app installation
23
+ await this.guideGitHubAppInstallation();
24
+ // Step 4: Verify connection and get source identifier
25
+ const sourceId = await this.getSourceIdentifier();
26
+ console.log(chalk.green('✅ Jules GitHub integration setup complete!'));
27
+ return sourceId;
28
+ }
29
+ /**
30
+ * Check if current directory is a git repository
31
+ */
32
+ isGitRepository() {
33
+ try {
34
+ execSync('git rev-parse --git-dir', { stdio: 'ignore' });
35
+ return true;
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Detect repository owner and name from git remote
43
+ */
44
+ async detectRepositoryInfo() {
45
+ try {
46
+ const remoteUrl = execSync('git config --get remote.origin.url', { encoding: 'utf8' }).trim();
47
+ // Parse GitHub URL (supports both HTTPS and SSH)
48
+ const match = remoteUrl.match(/github\.com[:/]([^/]+)\/([^/.]+)/);
49
+ if (match) {
50
+ this.repoOwner = match[1] || null;
51
+ this.repoName = match[2] || null;
52
+ console.log(chalk.blue(`📁 Detected repository: ${this.repoOwner}/${this.repoName}`));
53
+ }
54
+ else {
55
+ throw new Error('Could not detect GitHub repository from remote URL');
56
+ }
57
+ }
58
+ catch (error) {
59
+ throw new Error(`Failed to detect repository info: ${error instanceof Error ? error.message : 'Unknown error'}`);
60
+ }
61
+ }
62
+ /**
63
+ * Guide user through GitHub app installation process
64
+ */
65
+ async guideGitHubAppInstallation() {
66
+ console.log(chalk.yellow('\n📋 Jules GitHub App Installation Steps:\n'));
67
+ console.log('1. Opening Jules GitHub app installation page...');
68
+ // Open Jules GitHub app installation URL
69
+ const installUrl = 'https://github.com/apps/jules-ai';
70
+ await open(installUrl);
71
+ console.log(chalk.dim(` ${installUrl}`));
72
+ console.log('\n2. Follow these steps in your browser:');
73
+ console.log(' • Click "Install" on the Jules app page');
74
+ console.log(' • Select your repository or organization');
75
+ console.log(` • Grant access to ${this.repoOwner}/${this.repoName}`);
76
+ console.log(' • Complete the installation process');
77
+ console.log('\n3. After installation:');
78
+ console.log(' • Return to this terminal');
79
+ console.log(' • The setup will continue automatically');
80
+ // Wait for user confirmation
81
+ await this.waitForUserConfirmation();
82
+ }
83
+ /**
84
+ * Wait for user to confirm GitHub app installation
85
+ */
86
+ async waitForUserConfirmation() {
87
+ const { default: inquirer } = await import('inquirer');
88
+ const { confirmed } = await inquirer.prompt([
89
+ {
90
+ type: 'confirm',
91
+ name: 'confirmed',
92
+ message: 'Have you completed the Jules GitHub app installation?',
93
+ default: false
94
+ }
95
+ ]);
96
+ if (!confirmed) {
97
+ console.log(chalk.yellow('\nPlease complete the GitHub app installation and run this command again.'));
98
+ process.exit(0);
99
+ }
100
+ }
101
+ /**
102
+ * Get source identifier for Jules API
103
+ */
104
+ async getSourceIdentifier() {
105
+ if (!this.repoOwner || !this.repoName) {
106
+ throw new Error('Repository information not available');
107
+ }
108
+ // Generate source identifier in the format expected by Jules
109
+ this.sourceIdentifier = `sources/github/${this.repoOwner}/${this.repoName}`;
110
+ console.log(chalk.blue(`🔗 Source identifier: ${this.sourceIdentifier}`));
111
+ return this.sourceIdentifier;
112
+ }
113
+ /**
114
+ * Verify GitHub authentication and permissions
115
+ */
116
+ async verifyGitHubConnection() {
117
+ try {
118
+ if (!this.repoOwner || !this.repoName) {
119
+ await this.detectRepositoryInfo();
120
+ }
121
+ // Check if we can access the repository
122
+ const response = await fetch(`https://api.github.com/repos/${this.repoOwner}/${this.repoName}`);
123
+ if (response.ok) {
124
+ console.log(chalk.green('✅ GitHub repository access verified'));
125
+ return true;
126
+ }
127
+ else {
128
+ console.log(chalk.yellow('⚠️ GitHub repository access verification failed'));
129
+ return false;
130
+ }
131
+ }
132
+ catch (error) {
133
+ console.log(chalk.red(`❌ GitHub connection error: ${error instanceof Error ? error.message : 'Unknown error'}`));
134
+ return false;
135
+ }
136
+ }
137
+ /**
138
+ * Get current repository source identifier
139
+ */
140
+ async getCurrentSourceIdentifier() {
141
+ if (this.sourceIdentifier) {
142
+ return this.sourceIdentifier;
143
+ }
144
+ await this.detectRepositoryInfo();
145
+ return this.getSourceIdentifier();
146
+ }
147
+ /**
148
+ * Check if Jules GitHub integration is set up
149
+ */
150
+ async isJulesIntegrationSetup() {
151
+ try {
152
+ if (!this.isGitRepository()) {
153
+ return false;
154
+ }
155
+ await this.detectRepositoryInfo();
156
+ return await this.verifyGitHubConnection();
157
+ }
158
+ catch {
159
+ return false;
160
+ }
161
+ }
162
+ /**
163
+ * Get repository information
164
+ */
165
+ getRepositoryInfo() {
166
+ return {
167
+ owner: this.repoOwner,
168
+ name: this.repoName
169
+ };
170
+ }
171
+ /**
172
+ * Check if repository has required permissions for Jules
173
+ */
174
+ async checkRepositoryPermissions() {
175
+ try {
176
+ if (!this.repoOwner || !this.repoName) {
177
+ await this.detectRepositoryInfo();
178
+ }
179
+ // In a real implementation, this would check specific permissions
180
+ // For now, we'll assume basic access if we can read the repo
181
+ const hasAccess = await this.verifyGitHubConnection();
182
+ const permissions = hasAccess ? [
183
+ 'read',
184
+ 'write',
185
+ 'pull_requests'
186
+ ] : [];
187
+ return { hasAccess, permissions };
188
+ }
189
+ catch {
190
+ return { hasAccess: false, permissions: [] };
191
+ }
192
+ }
193
+ /**
194
+ * Get current branch name
195
+ */
196
+ getCurrentBranch() {
197
+ try {
198
+ return execSync('git branch --show-current', { encoding: 'utf8' }).trim();
199
+ }
200
+ catch {
201
+ return 'main'; // fallback
202
+ }
203
+ }
204
+ /**
205
+ * Check if there are uncommitted changes
206
+ */
207
+ hasUncommittedChanges() {
208
+ try {
209
+ const status = execSync('git status --porcelain', { encoding: 'utf8' });
210
+ return status.trim().length > 0;
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ }
216
+ /**
217
+ * Get repository URL for display
218
+ */
219
+ getRepositoryUrl() {
220
+ if (!this.repoOwner || !this.repoName) {
221
+ return null;
222
+ }
223
+ return `https://github.com/${this.repoOwner}/${this.repoName}`;
224
+ }
225
+ }
226
+ //# sourceMappingURL=github-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-manager.js","sourceRoot":"","sources":["../../src/git/github-manager.ts"],"names":[],"mappings":"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"}