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,210 @@
1
+ import { execSync, spawn } from 'child_process';
2
+ import { existsSync, mkdirSync, writeFileSync, unlinkSync, readFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ import chalk from 'chalk';
5
+
6
+ /**
7
+ * Git hook installation and management using husky
8
+ */
9
+ export class GitHookManager {
10
+ private huskyDir = '.husky';
11
+
12
+ /**
13
+ * Install git hooks for BaseGuard automation
14
+ */
15
+ async installHooks(trigger: 'pre-commit' | 'pre-push'): Promise<void> {
16
+ try {
17
+ // Ensure we're in a git repository
18
+ await this.ensureGitRepository();
19
+
20
+ // Ensure husky is installed and configured
21
+ await this.ensureHuskyInstalled();
22
+
23
+ // Create the hook script
24
+ await this.createHookScript(trigger);
25
+
26
+ console.log(chalk.green(`✅ ${trigger} hook installed successfully`));
27
+ } catch (error) {
28
+ throw new Error(`Failed to install ${trigger} hook: ${error instanceof Error ? error.message : 'Unknown error'}`);
29
+ }
30
+ }
31
+
32
+ /**
33
+ * Uninstall git hooks
34
+ */
35
+ async uninstallHooks(): Promise<void> {
36
+ try {
37
+ const hooks = ['pre-commit', 'pre-push'];
38
+
39
+ for (const hook of hooks) {
40
+ const hookPath = join(this.huskyDir, hook);
41
+ if (existsSync(hookPath)) {
42
+ unlinkSync(hookPath);
43
+ console.log(chalk.yellow(`🗑️ Removed ${hook} hook`));
44
+ }
45
+ }
46
+
47
+ // If no hooks remain, we could optionally remove husky entirely
48
+ // but we'll leave it in case user has other hooks
49
+ console.log(chalk.green('✅ BaseGuard hooks uninstalled'));
50
+ } catch (error) {
51
+ throw new Error(`Failed to uninstall hooks: ${error instanceof Error ? error.message : 'Unknown error'}`);
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Check if hooks are installed
57
+ */
58
+ async areHooksInstalled(): Promise<boolean> {
59
+ const preCommitPath = join(this.huskyDir, 'pre-commit');
60
+ const prePushPath = join(this.huskyDir, 'pre-push');
61
+
62
+ // Check if either hook exists and contains BaseGuard automation
63
+ const checkHook = (path: string): boolean => {
64
+ if (!existsSync(path)) return false;
65
+
66
+ try {
67
+ const content = readFileSync(path, 'utf-8');
68
+ return content.includes('base automation run');
69
+ } catch {
70
+ return false;
71
+ }
72
+ };
73
+
74
+ return checkHook(preCommitPath) || checkHook(prePushPath);
75
+ }
76
+
77
+ /**
78
+ * Get currently installed hook types
79
+ */
80
+ async getInstalledHooks(): Promise<('pre-commit' | 'pre-push')[]> {
81
+ const hooks: ('pre-commit' | 'pre-push')[] = [];
82
+
83
+ const checkHook = (hookType: 'pre-commit' | 'pre-push'): boolean => {
84
+ const hookPath = join(this.huskyDir, hookType);
85
+ if (!existsSync(hookPath)) return false;
86
+
87
+ try {
88
+ const content = readFileSync(hookPath, 'utf-8');
89
+ return content.includes('base automation run');
90
+ } catch {
91
+ return false;
92
+ }
93
+ };
94
+
95
+ if (checkHook('pre-commit')) hooks.push('pre-commit');
96
+ if (checkHook('pre-push')) hooks.push('pre-push');
97
+
98
+ return hooks;
99
+ }
100
+
101
+ /**
102
+ * Update existing hook configuration
103
+ */
104
+ async updateHookConfiguration(oldTrigger: 'pre-commit' | 'pre-push', newTrigger: 'pre-commit' | 'pre-push'): Promise<void> {
105
+ try {
106
+ // Remove old hook if different
107
+ if (oldTrigger !== newTrigger) {
108
+ const oldHookPath = join(this.huskyDir, oldTrigger);
109
+ if (existsSync(oldHookPath)) {
110
+ unlinkSync(oldHookPath);
111
+ }
112
+ }
113
+
114
+ // Install new hook
115
+ await this.createHookScript(newTrigger);
116
+
117
+ console.log(chalk.green(`✅ Hook configuration updated to ${newTrigger}`));
118
+ } catch (error) {
119
+ throw new Error(`Failed to update hook configuration: ${error instanceof Error ? error.message : 'Unknown error'}`);
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Ensure we're in a git repository
125
+ */
126
+ private async ensureGitRepository(): Promise<void> {
127
+ try {
128
+ execSync('git rev-parse --git-dir', { stdio: 'ignore' });
129
+ } catch {
130
+ throw new Error('Not in a git repository. Please run this command from within a git repository.');
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Ensure husky is installed and configured
136
+ */
137
+ private async ensureHuskyInstalled(): Promise<void> {
138
+ try {
139
+ // Check if husky is already initialized
140
+ if (!existsSync(this.huskyDir)) {
141
+ console.log(chalk.blue('🔧 Initializing husky...'));
142
+
143
+ // Initialize husky
144
+ execSync('npx husky install', { stdio: 'inherit' });
145
+
146
+ // Add husky install to package.json prepare script if not already there
147
+ await this.addPrepareScript();
148
+ }
149
+ } catch (error) {
150
+ throw new Error(`Failed to initialize husky: ${error instanceof Error ? error.message : 'Unknown error'}`);
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Add prepare script to package.json for husky
156
+ */
157
+ private async addPrepareScript(): Promise<void> {
158
+ try {
159
+ const packageJsonPath = 'package.json';
160
+ if (!existsSync(packageJsonPath)) return;
161
+
162
+ const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
163
+
164
+ // Add prepare script if it doesn't exist or doesn't include husky
165
+ if (!packageJson.scripts) {
166
+ packageJson.scripts = {};
167
+ }
168
+
169
+ if (!packageJson.scripts.prepare || !packageJson.scripts.prepare.includes('husky install')) {
170
+ packageJson.scripts.prepare = 'husky install';
171
+ writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
172
+ console.log(chalk.blue('📝 Added husky install to package.json prepare script'));
173
+ }
174
+ } catch (error) {
175
+ console.warn(chalk.yellow(`⚠️ Could not update package.json: ${error instanceof Error ? error.message : 'Unknown error'}`));
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Create hook script content
181
+ */
182
+ private async createHookScript(trigger: string): Promise<void> {
183
+ const hookPath = join(this.huskyDir, trigger);
184
+
185
+ // Create .husky directory if it doesn't exist
186
+ if (!existsSync(this.huskyDir)) {
187
+ mkdirSync(this.huskyDir, { recursive: true });
188
+ }
189
+
190
+ const hookContent = `#!/usr/bin/env sh
191
+ . "$(dirname -- "$0")/_/husky.sh"
192
+
193
+ # BaseGuard automation
194
+ base automation run --trigger ${trigger}
195
+ `;
196
+
197
+ writeFileSync(hookPath, hookContent);
198
+
199
+ // Make the hook executable (Unix systems)
200
+ if (process.platform !== 'win32') {
201
+ try {
202
+ execSync(`chmod +x "${hookPath}"`);
203
+ } catch (error) {
204
+ console.warn(chalk.yellow(`⚠️ Could not make hook executable: ${error instanceof Error ? error.message : 'Unknown error'}`));
205
+ }
206
+ }
207
+
208
+ console.log(chalk.blue(`📝 Created ${trigger} hook script`));
209
+ }
210
+ }
@@ -0,0 +1,4 @@
1
+ // Git integration exports
2
+ export * from './hook-manager.js';
3
+ export * from './automation-engine.js';
4
+ export * from './github-manager.js';
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ // Main BaseGuard exports
2
+ export * from './core/index.js';
3
+ export * from './parsers/index.js';
4
+ export * from './ai/index.js';
5
+ export * from './git/index.js';
6
+ export * from './commands/index.js';
7
+ export * from './ui/index.js';
8
+ export * from './types/index.js';