codexia 0.2.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 (224) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/LICENSE +663 -0
  3. package/README.md +392 -0
  4. package/dist/adapters/github/index.d.ts +66 -0
  5. package/dist/adapters/github/index.d.ts.map +1 -0
  6. package/dist/adapters/github/index.js +84 -0
  7. package/dist/adapters/github/index.js.map +1 -0
  8. package/dist/adapters/index.d.ts +5 -0
  9. package/dist/adapters/index.d.ts.map +1 -0
  10. package/dist/adapters/index.js +5 -0
  11. package/dist/adapters/index.js.map +1 -0
  12. package/dist/cli/commands/changelog.d.ts +3 -0
  13. package/dist/cli/commands/changelog.d.ts.map +1 -0
  14. package/dist/cli/commands/changelog.js +221 -0
  15. package/dist/cli/commands/changelog.js.map +1 -0
  16. package/dist/cli/commands/check.d.ts +3 -0
  17. package/dist/cli/commands/check.d.ts.map +1 -0
  18. package/dist/cli/commands/check.js +35 -0
  19. package/dist/cli/commands/check.js.map +1 -0
  20. package/dist/cli/commands/complexity.d.ts +3 -0
  21. package/dist/cli/commands/complexity.d.ts.map +1 -0
  22. package/dist/cli/commands/complexity.js +103 -0
  23. package/dist/cli/commands/complexity.js.map +1 -0
  24. package/dist/cli/commands/graph.d.ts +3 -0
  25. package/dist/cli/commands/graph.d.ts.map +1 -0
  26. package/dist/cli/commands/graph.js +46 -0
  27. package/dist/cli/commands/graph.js.map +1 -0
  28. package/dist/cli/commands/history.d.ts +3 -0
  29. package/dist/cli/commands/history.d.ts.map +1 -0
  30. package/dist/cli/commands/history.js +127 -0
  31. package/dist/cli/commands/history.js.map +1 -0
  32. package/dist/cli/commands/hotpaths.d.ts +3 -0
  33. package/dist/cli/commands/hotpaths.d.ts.map +1 -0
  34. package/dist/cli/commands/hotpaths.js +153 -0
  35. package/dist/cli/commands/hotpaths.js.map +1 -0
  36. package/dist/cli/commands/impact.d.ts +3 -0
  37. package/dist/cli/commands/impact.d.ts.map +1 -0
  38. package/dist/cli/commands/impact.js +37 -0
  39. package/dist/cli/commands/impact.js.map +1 -0
  40. package/dist/cli/commands/init.d.ts +3 -0
  41. package/dist/cli/commands/init.d.ts.map +1 -0
  42. package/dist/cli/commands/init.js +167 -0
  43. package/dist/cli/commands/init.js.map +1 -0
  44. package/dist/cli/commands/invariants.d.ts +3 -0
  45. package/dist/cli/commands/invariants.d.ts.map +1 -0
  46. package/dist/cli/commands/invariants.js +176 -0
  47. package/dist/cli/commands/invariants.js.map +1 -0
  48. package/dist/cli/commands/mcp-server.d.ts +3 -0
  49. package/dist/cli/commands/mcp-server.d.ts.map +1 -0
  50. package/dist/cli/commands/mcp-server.js +64 -0
  51. package/dist/cli/commands/mcp-server.js.map +1 -0
  52. package/dist/cli/commands/monorepo.d.ts +3 -0
  53. package/dist/cli/commands/monorepo.d.ts.map +1 -0
  54. package/dist/cli/commands/monorepo.js +156 -0
  55. package/dist/cli/commands/monorepo.js.map +1 -0
  56. package/dist/cli/commands/pr-report.d.ts +3 -0
  57. package/dist/cli/commands/pr-report.d.ts.map +1 -0
  58. package/dist/cli/commands/pr-report.js +32 -0
  59. package/dist/cli/commands/pr-report.js.map +1 -0
  60. package/dist/cli/commands/scan.d.ts +3 -0
  61. package/dist/cli/commands/scan.d.ts.map +1 -0
  62. package/dist/cli/commands/scan.js +25 -0
  63. package/dist/cli/commands/scan.js.map +1 -0
  64. package/dist/cli/commands/signals.d.ts +3 -0
  65. package/dist/cli/commands/signals.d.ts.map +1 -0
  66. package/dist/cli/commands/signals.js +34 -0
  67. package/dist/cli/commands/signals.js.map +1 -0
  68. package/dist/cli/commands/tests.d.ts +3 -0
  69. package/dist/cli/commands/tests.d.ts.map +1 -0
  70. package/dist/cli/commands/tests.js +30 -0
  71. package/dist/cli/commands/tests.js.map +1 -0
  72. package/dist/cli/commands/watch.d.ts +3 -0
  73. package/dist/cli/commands/watch.d.ts.map +1 -0
  74. package/dist/cli/commands/watch.js +131 -0
  75. package/dist/cli/commands/watch.js.map +1 -0
  76. package/dist/cli/engine.d.ts +162 -0
  77. package/dist/cli/engine.d.ts.map +1 -0
  78. package/dist/cli/engine.js +564 -0
  79. package/dist/cli/engine.js.map +1 -0
  80. package/dist/cli/formatter.d.ts +39 -0
  81. package/dist/cli/formatter.d.ts.map +1 -0
  82. package/dist/cli/formatter.js +444 -0
  83. package/dist/cli/formatter.js.map +1 -0
  84. package/dist/cli/index.d.ts +2 -0
  85. package/dist/cli/index.d.ts.map +1 -0
  86. package/dist/cli/index.js +63 -0
  87. package/dist/cli/index.js.map +1 -0
  88. package/dist/cli/interactive.d.ts +7 -0
  89. package/dist/cli/interactive.d.ts.map +1 -0
  90. package/dist/cli/interactive.js +644 -0
  91. package/dist/cli/interactive.js.map +1 -0
  92. package/dist/core/dependency-graph.d.ts +54 -0
  93. package/dist/core/dependency-graph.d.ts.map +1 -0
  94. package/dist/core/dependency-graph.js +190 -0
  95. package/dist/core/dependency-graph.js.map +1 -0
  96. package/dist/core/dependency-graph.test.d.ts +2 -0
  97. package/dist/core/dependency-graph.test.d.ts.map +1 -0
  98. package/dist/core/dependency-graph.test.js +106 -0
  99. package/dist/core/dependency-graph.test.js.map +1 -0
  100. package/dist/core/git-analyzer.d.ts +52 -0
  101. package/dist/core/git-analyzer.d.ts.map +1 -0
  102. package/dist/core/git-analyzer.js +250 -0
  103. package/dist/core/git-analyzer.js.map +1 -0
  104. package/dist/core/git-analyzer.test.d.ts +2 -0
  105. package/dist/core/git-analyzer.test.d.ts.map +1 -0
  106. package/dist/core/git-analyzer.test.js +71 -0
  107. package/dist/core/git-analyzer.test.js.map +1 -0
  108. package/dist/core/index.d.ts +7 -0
  109. package/dist/core/index.d.ts.map +1 -0
  110. package/dist/core/index.js +7 -0
  111. package/dist/core/index.js.map +1 -0
  112. package/dist/core/repo-indexer.d.ts +57 -0
  113. package/dist/core/repo-indexer.d.ts.map +1 -0
  114. package/dist/core/repo-indexer.js +356 -0
  115. package/dist/core/repo-indexer.js.map +1 -0
  116. package/dist/core/repo-indexer.test.d.ts +2 -0
  117. package/dist/core/repo-indexer.test.d.ts.map +1 -0
  118. package/dist/core/repo-indexer.test.js +89 -0
  119. package/dist/core/repo-indexer.test.js.map +1 -0
  120. package/dist/core/signals-engine.d.ts +38 -0
  121. package/dist/core/signals-engine.d.ts.map +1 -0
  122. package/dist/core/signals-engine.js +142 -0
  123. package/dist/core/signals-engine.js.map +1 -0
  124. package/dist/core/signals-engine.test.d.ts +2 -0
  125. package/dist/core/signals-engine.test.d.ts.map +1 -0
  126. package/dist/core/signals-engine.test.js +129 -0
  127. package/dist/core/signals-engine.test.js.map +1 -0
  128. package/dist/core/symbol-map.d.ts +45 -0
  129. package/dist/core/symbol-map.d.ts.map +1 -0
  130. package/dist/core/symbol-map.js +187 -0
  131. package/dist/core/symbol-map.js.map +1 -0
  132. package/dist/core/types.d.ts +514 -0
  133. package/dist/core/types.d.ts.map +1 -0
  134. package/dist/core/types.js +5 -0
  135. package/dist/core/types.js.map +1 -0
  136. package/dist/core/types.test.d.ts +2 -0
  137. package/dist/core/types.test.d.ts.map +1 -0
  138. package/dist/core/types.test.js +20 -0
  139. package/dist/core/types.test.js.map +1 -0
  140. package/dist/index.d.ts +5 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +9 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/mcp/index.d.ts +3 -0
  145. package/dist/mcp/index.d.ts.map +1 -0
  146. package/dist/mcp/index.js +2 -0
  147. package/dist/mcp/index.js.map +1 -0
  148. package/dist/mcp/server.d.ts +89 -0
  149. package/dist/mcp/server.d.ts.map +1 -0
  150. package/dist/mcp/server.js +549 -0
  151. package/dist/mcp/server.js.map +1 -0
  152. package/dist/modules/changelog-generator.d.ts +82 -0
  153. package/dist/modules/changelog-generator.d.ts.map +1 -0
  154. package/dist/modules/changelog-generator.js +350 -0
  155. package/dist/modules/changelog-generator.js.map +1 -0
  156. package/dist/modules/complexity-engine.d.ts +86 -0
  157. package/dist/modules/complexity-engine.d.ts.map +1 -0
  158. package/dist/modules/complexity-engine.js +355 -0
  159. package/dist/modules/complexity-engine.js.map +1 -0
  160. package/dist/modules/convention-checker.d.ts +24 -0
  161. package/dist/modules/convention-checker.d.ts.map +1 -0
  162. package/dist/modules/convention-checker.js +181 -0
  163. package/dist/modules/convention-checker.js.map +1 -0
  164. package/dist/modules/graph-utils.d.ts +38 -0
  165. package/dist/modules/graph-utils.d.ts.map +1 -0
  166. package/dist/modules/graph-utils.js +40 -0
  167. package/dist/modules/graph-utils.js.map +1 -0
  168. package/dist/modules/hot-path-detector.d.ts +105 -0
  169. package/dist/modules/hot-path-detector.d.ts.map +1 -0
  170. package/dist/modules/hot-path-detector.js +332 -0
  171. package/dist/modules/hot-path-detector.js.map +1 -0
  172. package/dist/modules/impact-analyzer.d.ts +40 -0
  173. package/dist/modules/impact-analyzer.d.ts.map +1 -0
  174. package/dist/modules/impact-analyzer.js +218 -0
  175. package/dist/modules/impact-analyzer.js.map +1 -0
  176. package/dist/modules/impact-analyzer.test.d.ts +2 -0
  177. package/dist/modules/impact-analyzer.test.d.ts.map +1 -0
  178. package/dist/modules/impact-analyzer.test.js +308 -0
  179. package/dist/modules/impact-analyzer.test.js.map +1 -0
  180. package/dist/modules/index.d.ts +14 -0
  181. package/dist/modules/index.d.ts.map +1 -0
  182. package/dist/modules/index.js +20 -0
  183. package/dist/modules/index.js.map +1 -0
  184. package/dist/modules/invariant-engine.d.ts +119 -0
  185. package/dist/modules/invariant-engine.d.ts.map +1 -0
  186. package/dist/modules/invariant-engine.js +457 -0
  187. package/dist/modules/invariant-engine.js.map +1 -0
  188. package/dist/modules/memory-loader.d.ts +34 -0
  189. package/dist/modules/memory-loader.d.ts.map +1 -0
  190. package/dist/modules/memory-loader.js +313 -0
  191. package/dist/modules/memory-loader.js.map +1 -0
  192. package/dist/modules/memory-loader.test.d.ts +2 -0
  193. package/dist/modules/memory-loader.test.d.ts.map +1 -0
  194. package/dist/modules/memory-loader.test.js +120 -0
  195. package/dist/modules/memory-loader.test.js.map +1 -0
  196. package/dist/modules/monorepo-analyzer.d.ts +141 -0
  197. package/dist/modules/monorepo-analyzer.d.ts.map +1 -0
  198. package/dist/modules/monorepo-analyzer.js +453 -0
  199. package/dist/modules/monorepo-analyzer.js.map +1 -0
  200. package/dist/modules/plugin-system.d.ts +144 -0
  201. package/dist/modules/plugin-system.d.ts.map +1 -0
  202. package/dist/modules/plugin-system.js +428 -0
  203. package/dist/modules/plugin-system.js.map +1 -0
  204. package/dist/modules/smart-test-prioritizer.d.ts +95 -0
  205. package/dist/modules/smart-test-prioritizer.d.ts.map +1 -0
  206. package/dist/modules/smart-test-prioritizer.js +328 -0
  207. package/dist/modules/smart-test-prioritizer.js.map +1 -0
  208. package/dist/modules/temporal-analyzer.d.ts +71 -0
  209. package/dist/modules/temporal-analyzer.d.ts.map +1 -0
  210. package/dist/modules/temporal-analyzer.js +301 -0
  211. package/dist/modules/temporal-analyzer.js.map +1 -0
  212. package/dist/modules/test-suggester.d.ts +22 -0
  213. package/dist/modules/test-suggester.d.ts.map +1 -0
  214. package/dist/modules/test-suggester.js +145 -0
  215. package/dist/modules/test-suggester.js.map +1 -0
  216. package/dist/modules/visualizer.d.ts +49 -0
  217. package/dist/modules/visualizer.d.ts.map +1 -0
  218. package/dist/modules/visualizer.js +302 -0
  219. package/dist/modules/visualizer.js.map +1 -0
  220. package/dist/modules/watcher.d.ts +82 -0
  221. package/dist/modules/watcher.d.ts.map +1 -0
  222. package/dist/modules/watcher.js +298 -0
  223. package/dist/modules/watcher.js.map +1 -0
  224. package/package.json +70 -0
@@ -0,0 +1,428 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ // ============================================================================
4
+ // Plugin Manager
5
+ // ============================================================================
6
+ export class PluginManager {
7
+ plugins = new Map();
8
+ repoRoot;
9
+ signals = [];
10
+ constructor(repoRoot) {
11
+ this.repoRoot = repoRoot;
12
+ }
13
+ /**
14
+ * Load plugins from configuration
15
+ */
16
+ async loadPlugins(config) {
17
+ for (const pluginConfig of config.plugins || []) {
18
+ try {
19
+ await this.loadPlugin(pluginConfig);
20
+ }
21
+ catch (error) {
22
+ console.error(`Failed to load plugin ${pluginConfig.name}:`, error);
23
+ }
24
+ }
25
+ }
26
+ /**
27
+ * Load a single plugin
28
+ */
29
+ async loadPlugin(config) {
30
+ let plugin;
31
+ if (config.path) {
32
+ // Load from local path
33
+ const fullPath = path.isAbsolute(config.path)
34
+ ? config.path
35
+ : path.join(this.repoRoot, config.path);
36
+ const module = await import(fullPath);
37
+ plugin = module.default || module;
38
+ }
39
+ else if (config.name.startsWith('@codexia/')) {
40
+ // Load built-in plugin
41
+ plugin = this.loadBuiltinPlugin(config.name);
42
+ }
43
+ else {
44
+ // Load from node_modules
45
+ const module = await import(config.name);
46
+ plugin = module.default || module;
47
+ }
48
+ const context = this.createContext(config);
49
+ if (plugin.onLoad) {
50
+ await plugin.onLoad(context);
51
+ }
52
+ this.plugins.set(plugin.name, {
53
+ plugin,
54
+ config,
55
+ context,
56
+ });
57
+ }
58
+ /**
59
+ * Unload all plugins
60
+ */
61
+ async unloadPlugins() {
62
+ for (const [name, loaded] of this.plugins) {
63
+ try {
64
+ if (loaded.plugin.onUnload) {
65
+ await loaded.plugin.onUnload();
66
+ }
67
+ }
68
+ catch (error) {
69
+ console.error(`Error unloading plugin ${name}:`, error);
70
+ }
71
+ }
72
+ this.plugins.clear();
73
+ }
74
+ /**
75
+ * Run file analysis hooks
76
+ */
77
+ async analyzeFile(file, content) {
78
+ const results = [];
79
+ for (const [, loaded] of this.plugins) {
80
+ if (loaded.plugin.analyzeFile && loaded.config.enabled !== false) {
81
+ try {
82
+ const result = await loaded.plugin.analyzeFile(file, content);
83
+ results.push(result);
84
+ }
85
+ catch (error) {
86
+ console.error(`Plugin ${loaded.plugin.name} analysis failed:`, error);
87
+ }
88
+ }
89
+ }
90
+ return results;
91
+ }
92
+ /**
93
+ * Run after-index hooks
94
+ */
95
+ async afterIndex(files) {
96
+ for (const [, loaded] of this.plugins) {
97
+ if (loaded.plugin.afterIndex && loaded.config.enabled !== false) {
98
+ try {
99
+ await loaded.plugin.afterIndex(files);
100
+ }
101
+ catch (error) {
102
+ console.error(`Plugin ${loaded.plugin.name} afterIndex failed:`, error);
103
+ }
104
+ }
105
+ }
106
+ }
107
+ /**
108
+ * Get all custom signals from plugins
109
+ */
110
+ runCustomSignals(file, content) {
111
+ const signals = [];
112
+ for (const [, loaded] of this.plugins) {
113
+ for (const checker of loaded.plugin.customSignals || []) {
114
+ try {
115
+ const signal = checker.check(file, content, loaded.context);
116
+ if (signal)
117
+ signals.push(signal);
118
+ }
119
+ catch (error) {
120
+ console.error(`Signal checker ${checker.id} failed:`, error);
121
+ }
122
+ }
123
+ }
124
+ return signals;
125
+ }
126
+ /**
127
+ * Get all custom conventions from plugins
128
+ */
129
+ runCustomConventions(file, content) {
130
+ const violations = [];
131
+ for (const [, loaded] of this.plugins) {
132
+ for (const checker of loaded.plugin.customConventions || []) {
133
+ try {
134
+ const violation = checker.check(file, content, loaded.context);
135
+ if (violation)
136
+ violations.push(violation);
137
+ }
138
+ catch (error) {
139
+ console.error(`Convention checker ${checker.id} failed:`, error);
140
+ }
141
+ }
142
+ }
143
+ return violations;
144
+ }
145
+ /**
146
+ * Get all plugin commands
147
+ */
148
+ getCommands() {
149
+ const commands = new Map();
150
+ for (const [, loaded] of this.plugins) {
151
+ for (const command of loaded.plugin.commands || []) {
152
+ commands.set(`${loaded.plugin.name}:${command.name}`, {
153
+ command,
154
+ context: loaded.context,
155
+ });
156
+ }
157
+ }
158
+ return commands;
159
+ }
160
+ /**
161
+ * Get loaded plugins
162
+ */
163
+ getPlugins() {
164
+ return this.plugins;
165
+ }
166
+ /**
167
+ * Create plugin context
168
+ */
169
+ createContext(config) {
170
+ const self = this;
171
+ return {
172
+ repoRoot: this.repoRoot,
173
+ config: {
174
+ enabled: config.enabled !== false,
175
+ options: config.options || {},
176
+ },
177
+ logger: {
178
+ debug: (msg) => console.debug(`[${config.name}] ${msg}`),
179
+ info: (msg) => console.info(`[${config.name}] ${msg}`),
180
+ warn: (msg) => console.warn(`[${config.name}] ${msg}`),
181
+ error: (msg) => console.error(`[${config.name}] ${msg}`),
182
+ },
183
+ api: {
184
+ getFiles: () => new Map(), // Will be set by engine
185
+ getFile: () => undefined,
186
+ getDependencies: () => [],
187
+ getDependents: () => [],
188
+ emitSignal: (signal) => self.signals.push(signal),
189
+ },
190
+ };
191
+ }
192
+ /**
193
+ * Load built-in plugin
194
+ */
195
+ loadBuiltinPlugin(name) {
196
+ switch (name) {
197
+ case '@codexia/plugin-react':
198
+ return createReactPlugin();
199
+ case '@codexia/plugin-security':
200
+ return createSecurityPlugin();
201
+ case '@codexia/plugin-performance':
202
+ return createPerformancePlugin();
203
+ default:
204
+ throw new Error(`Unknown built-in plugin: ${name}`);
205
+ }
206
+ }
207
+ }
208
+ /**
209
+ * Load codexia configuration
210
+ */
211
+ export async function loadConfig(repoRoot) {
212
+ const configFiles = [
213
+ 'codexia.config.ts',
214
+ 'codexia.config.js',
215
+ 'codexia.config.json',
216
+ '.codexiarc.json',
217
+ '.codexiarc',
218
+ ];
219
+ for (const configFile of configFiles) {
220
+ const configPath = path.join(repoRoot, configFile);
221
+ try {
222
+ await fs.access(configPath);
223
+ if (configFile.endsWith('.json') || configFile === '.codexiarc') {
224
+ const content = await fs.readFile(configPath, 'utf-8');
225
+ return JSON.parse(content);
226
+ }
227
+ else {
228
+ const module = await import(configPath);
229
+ return module.default || module;
230
+ }
231
+ }
232
+ catch {
233
+ // Config file doesn't exist, continue
234
+ }
235
+ }
236
+ return {}; // Default empty config
237
+ }
238
+ // ============================================================================
239
+ // Built-in Plugins
240
+ // ============================================================================
241
+ function createReactPlugin() {
242
+ return {
243
+ name: '@codexia/plugin-react',
244
+ version: '0.1.0',
245
+ description: 'React-specific analysis and conventions',
246
+ customSignals: [
247
+ {
248
+ id: 'react-large-component',
249
+ name: 'Large React Component',
250
+ description: 'React component with too many lines',
251
+ check: (file, content) => {
252
+ if (!file.relativePath.match(/\.(tsx|jsx)$/))
253
+ return null;
254
+ // Check for large components
255
+ const componentMatch = content.match(/function\s+\w+|const\s+\w+\s*=.*=>/g);
256
+ if (componentMatch && file.lines > 300) {
257
+ return {
258
+ type: 'god-class',
259
+ severity: 'warning',
260
+ message: `React component in ${file.relativePath} is too large (${file.lines} lines)`,
261
+ filePath: file.relativePath,
262
+ evidence: [{
263
+ type: 'metric',
264
+ description: 'Consider splitting into smaller components',
265
+ source: 'react-plugin',
266
+ }],
267
+ };
268
+ }
269
+ return null;
270
+ },
271
+ },
272
+ {
273
+ id: 'react-missing-memo',
274
+ name: 'Missing React.memo',
275
+ description: 'Component might benefit from memoization',
276
+ check: (file, content) => {
277
+ if (!file.relativePath.match(/\.(tsx|jsx)$/))
278
+ return null;
279
+ // Check for components without memo that have complex props
280
+ const hasComplexProps = content.includes('props.') &&
281
+ (content.match(/props\./g) || []).length > 5;
282
+ const hasMemo = content.includes('React.memo') || content.includes('memo(');
283
+ if (hasComplexProps && !hasMemo) {
284
+ return {
285
+ type: 'missing-tests', // Reusing type
286
+ severity: 'info',
287
+ message: `Component might benefit from React.memo`,
288
+ filePath: file.relativePath,
289
+ evidence: [{
290
+ type: 'code',
291
+ description: 'Component uses props extensively without memoization',
292
+ source: 'react-plugin',
293
+ }],
294
+ };
295
+ }
296
+ return null;
297
+ },
298
+ },
299
+ ],
300
+ customConventions: [
301
+ {
302
+ id: 'react-hook-naming',
303
+ name: 'React Hook Naming',
304
+ description: 'Custom hooks should start with "use"',
305
+ severity: 'warning',
306
+ check: (file, content) => {
307
+ if (!file.relativePath.match(/\.(tsx?|jsx?)$/))
308
+ return null;
309
+ // Find functions that use hooks but don't start with "use"
310
+ const hookPattern = /function\s+([a-z][a-zA-Z]+)\s*\([^)]*\)\s*{[^}]*use[A-Z]/;
311
+ const match = content.match(hookPattern);
312
+ if (match && !match[1].startsWith('use')) {
313
+ return {
314
+ convention: {
315
+ id: 'react-hook-naming',
316
+ name: 'React Hook Naming',
317
+ description: 'Custom hooks should start with "use"',
318
+ category: 'naming',
319
+ severity: 'warning',
320
+ check: { type: 'custom', message: 'Hook should start with "use"' },
321
+ },
322
+ filePath: file.relativePath,
323
+ line: 1,
324
+ column: 1,
325
+ message: `Function '${match[1]}' uses hooks but doesn't start with 'use'`,
326
+ suggestion: `Rename to 'use${match[1].charAt(0).toUpperCase() + match[1].slice(1)}'`,
327
+ };
328
+ }
329
+ return null;
330
+ },
331
+ },
332
+ ],
333
+ };
334
+ }
335
+ function createSecurityPlugin() {
336
+ return {
337
+ name: '@codexia/plugin-security',
338
+ version: '0.1.0',
339
+ description: 'Security anti-pattern detection',
340
+ customSignals: [
341
+ {
342
+ id: 'security-hardcoded-secret',
343
+ name: 'Hardcoded Secret',
344
+ description: 'Potential hardcoded secret or API key',
345
+ check: (file, content) => {
346
+ const secretPatterns = [
347
+ /api[_-]?key\s*[:=]\s*['"][^'"]{10,}['"]/i,
348
+ /secret\s*[:=]\s*['"][^'"]{10,}['"]/i,
349
+ /password\s*[:=]\s*['"][^'"]{5,}['"]/i,
350
+ /token\s*[:=]\s*['"][^'"]{20,}['"]/i,
351
+ ];
352
+ for (const pattern of secretPatterns) {
353
+ if (pattern.test(content)) {
354
+ return {
355
+ type: 'convention-violation',
356
+ severity: 'error',
357
+ message: `Potential hardcoded secret detected in ${file.relativePath}`,
358
+ filePath: file.relativePath,
359
+ evidence: [{
360
+ type: 'code',
361
+ description: 'Hardcoded secrets should be stored in environment variables',
362
+ source: 'security-plugin',
363
+ }],
364
+ };
365
+ }
366
+ }
367
+ return null;
368
+ },
369
+ },
370
+ {
371
+ id: 'security-sql-injection',
372
+ name: 'SQL Injection Risk',
373
+ description: 'Potential SQL injection vulnerability',
374
+ check: (file, content) => {
375
+ // Check for string concatenation in SQL queries
376
+ const sqlPattern = /(`|\"|')SELECT.*\$\{|\+ *\w+ *\+.*WHERE/i;
377
+ if (sqlPattern.test(content)) {
378
+ return {
379
+ type: 'convention-violation',
380
+ severity: 'error',
381
+ message: `Potential SQL injection risk in ${file.relativePath}`,
382
+ filePath: file.relativePath,
383
+ evidence: [{
384
+ type: 'code',
385
+ description: 'Use parameterized queries instead of string concatenation',
386
+ source: 'security-plugin',
387
+ }],
388
+ };
389
+ }
390
+ return null;
391
+ },
392
+ },
393
+ ],
394
+ };
395
+ }
396
+ function createPerformancePlugin() {
397
+ return {
398
+ name: '@codexia/plugin-performance',
399
+ version: '0.1.0',
400
+ description: 'Performance anti-pattern detection',
401
+ customSignals: [
402
+ {
403
+ id: 'perf-n-plus-one',
404
+ name: 'N+1 Query Pattern',
405
+ description: 'Potential N+1 query pattern',
406
+ check: (file, content) => {
407
+ // Check for queries inside loops
408
+ const loopWithQuery = /for\s*\([^)]*\)\s*{[^}]*(await|\.query|\.find|\.get)/;
409
+ if (loopWithQuery.test(content)) {
410
+ return {
411
+ type: 'high-churn',
412
+ severity: 'warning',
413
+ message: `Potential N+1 query pattern in ${file.relativePath}`,
414
+ filePath: file.relativePath,
415
+ evidence: [{
416
+ type: 'code',
417
+ description: 'Consider batching queries or using joins',
418
+ source: 'performance-plugin',
419
+ }],
420
+ };
421
+ }
422
+ return null;
423
+ },
424
+ },
425
+ ],
426
+ };
427
+ }
428
+ //# sourceMappingURL=plugin-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-system.js","sourceRoot":"","sources":["../../src/modules/plugin-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { GitDiff, FileInfo, ImpactResult } from '../core/types.js';
2
+ import type { TemporalInsights } from './temporal-analyzer.js';
3
+ import type { FileComplexity } from './complexity-engine.js';
4
+ export interface PrioritizedTest {
5
+ testFile: string;
6
+ targetFile: string;
7
+ priority: number;
8
+ reason: string;
9
+ category: TestCategory;
10
+ estimatedDuration?: number;
11
+ lastRunResult?: 'pass' | 'fail' | 'skip' | 'unknown';
12
+ flakiness?: number;
13
+ }
14
+ export type TestCategory = 'direct-change' | 'affected-module' | 'integration' | 'regression-prone' | 'hot-path' | 'high-coverage' | 'smoke' | 'other';
15
+ export interface TestPrioritizationResult {
16
+ tests: PrioritizedTest[];
17
+ totalTests: number;
18
+ estimatedTotalDuration: number;
19
+ suggestedSubset: PrioritizedTest[];
20
+ coverage: TestCoverageEstimate;
21
+ }
22
+ export interface TestCoverageEstimate {
23
+ directChangeCoverage: number;
24
+ affectedModuleCoverage: number;
25
+ overallCoverage: number;
26
+ }
27
+ export interface TestHistoryEntry {
28
+ testFile: string;
29
+ lastRun: Date;
30
+ duration: number;
31
+ result: 'pass' | 'fail' | 'skip';
32
+ failureCount: number;
33
+ totalRuns: number;
34
+ }
35
+ export declare class SmartTestPrioritizer {
36
+ private testPatterns;
37
+ private testHistory;
38
+ /**
39
+ * Prioritize tests based on code changes and analysis
40
+ */
41
+ prioritize(diff: GitDiff, files: Map<string, FileInfo>, impact?: ImpactResult, temporal?: Map<string, TemporalInsights>, complexity?: Map<string, FileComplexity>): TestPrioritizationResult;
42
+ /**
43
+ * Load test history for better prioritization
44
+ */
45
+ loadHistory(history: TestHistoryEntry[]): void;
46
+ /**
47
+ * Record test run result
48
+ */
49
+ recordResult(testFile: string, result: 'pass' | 'fail' | 'skip', duration: number): void;
50
+ /**
51
+ * Find all test files
52
+ */
53
+ private findAllTests;
54
+ /**
55
+ * Check if file is a test file
56
+ */
57
+ private isTestFile;
58
+ /**
59
+ * Check if file is an integration test
60
+ */
61
+ private isIntegrationTest;
62
+ /**
63
+ * Find test file for a source file
64
+ */
65
+ private findTestFile;
66
+ /**
67
+ * Check if a test might cover a source file
68
+ */
69
+ private mightTestCover;
70
+ /**
71
+ * Get estimated duration for a test
72
+ */
73
+ private getEstimatedDuration;
74
+ /**
75
+ * Get last run result
76
+ */
77
+ private getLastRunResult;
78
+ /**
79
+ * Get flakiness score
80
+ */
81
+ private getFlakiness;
82
+ /**
83
+ * Calculate minimal test subset for quick feedback
84
+ */
85
+ private calculateMinimalSubset;
86
+ /**
87
+ * Estimate test coverage
88
+ */
89
+ private estimateCoverage;
90
+ /**
91
+ * Format prioritized tests for display
92
+ */
93
+ formatResults(result: TestPrioritizationResult, format?: 'ascii' | 'json'): string;
94
+ }
95
+ //# sourceMappingURL=smart-test-prioritizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smart-test-prioritizer.d.ts","sourceRoot":"","sources":["../../src/modules/smart-test-prioritizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,YAAY,EACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,YAAY,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GACpB,eAAe,GACf,iBAAiB,GACjB,aAAa,GACb,kBAAkB,GAClB,UAAU,GACV,eAAe,GACf,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,YAAY,CAA8E;IAClG,OAAO,CAAC,WAAW,CAA4C;IAE/D;;OAEG;IACH,UAAU,CACR,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC5B,MAAM,CAAC,EAAE,YAAY,EACrB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACxC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACvC,wBAAwB;IA+H3B;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAM9C;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmBxF;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAuBpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4B9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,wBAAwB,EAAE,MAAM,GAAE,OAAO,GAAG,MAAgB,GAAG,MAAM;CAkD5F"}