@theglitchking/hit-em-with-the-docs 2.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 (200) hide show
  1. package/.claude-plugin/marketplace.json +46 -0
  2. package/.claude-plugin/plugin.json +114 -0
  3. package/LICENSE +21 -0
  4. package/MIGRATION.md +255 -0
  5. package/README.backup.md +714 -0
  6. package/README.md +869 -0
  7. package/action.yml +56 -0
  8. package/dist/action/action/index.d.ts +2 -0
  9. package/dist/action/action/index.d.ts.map +1 -0
  10. package/dist/action/cli/index.d.ts +3 -0
  11. package/dist/action/cli/index.d.ts.map +1 -0
  12. package/dist/action/core/audit/auditor.d.ts +43 -0
  13. package/dist/action/core/audit/auditor.d.ts.map +1 -0
  14. package/dist/action/core/audit/rules.d.ts +37 -0
  15. package/dist/action/core/audit/rules.d.ts.map +1 -0
  16. package/dist/action/core/discover/antipatterns.d.ts +24 -0
  17. package/dist/action/core/discover/antipatterns.d.ts.map +1 -0
  18. package/dist/action/core/discover/dependencies.d.ts +57 -0
  19. package/dist/action/core/discover/dependencies.d.ts.map +1 -0
  20. package/dist/action/core/discover/patterns.d.ts +38 -0
  21. package/dist/action/core/discover/patterns.d.ts.map +1 -0
  22. package/dist/action/core/discover/standards.d.ts +58 -0
  23. package/dist/action/core/discover/standards.d.ts.map +1 -0
  24. package/dist/action/core/domains/classifier.d.ts +41 -0
  25. package/dist/action/core/domains/classifier.d.ts.map +1 -0
  26. package/dist/action/core/domains/constants.d.ts +40 -0
  27. package/dist/action/core/domains/constants.d.ts.map +1 -0
  28. package/dist/action/core/domains/detector.d.ts +35 -0
  29. package/dist/action/core/domains/detector.d.ts.map +1 -0
  30. package/dist/action/core/integrate/integrator.d.ts +35 -0
  31. package/dist/action/core/integrate/integrator.d.ts.map +1 -0
  32. package/dist/action/core/links/checker.d.ts +64 -0
  33. package/dist/action/core/links/checker.d.ts.map +1 -0
  34. package/dist/action/core/links/tracker.d.ts +69 -0
  35. package/dist/action/core/links/tracker.d.ts.map +1 -0
  36. package/dist/action/core/maintain/orchestrator.d.ts +39 -0
  37. package/dist/action/core/maintain/orchestrator.d.ts.map +1 -0
  38. package/dist/action/core/metadata/generator.d.ts +26 -0
  39. package/dist/action/core/metadata/generator.d.ts.map +1 -0
  40. package/dist/action/core/metadata/schema.d.ts +201 -0
  41. package/dist/action/core/metadata/schema.d.ts.map +1 -0
  42. package/dist/action/core/metadata/sync.d.ts +36 -0
  43. package/dist/action/core/metadata/sync.d.ts.map +1 -0
  44. package/dist/action/generators/index-generator.d.ts +19 -0
  45. package/dist/action/generators/index-generator.d.ts.map +1 -0
  46. package/dist/action/generators/registry-generator.d.ts +11 -0
  47. package/dist/action/generators/registry-generator.d.ts.map +1 -0
  48. package/dist/action/generators/scaffold.d.ts +30 -0
  49. package/dist/action/generators/scaffold.d.ts.map +1 -0
  50. package/dist/action/generators/templates/document.d.ts +14 -0
  51. package/dist/action/generators/templates/document.d.ts.map +1 -0
  52. package/dist/action/generators/templates/domain-index.d.ts +6 -0
  53. package/dist/action/generators/templates/domain-index.d.ts.map +1 -0
  54. package/dist/action/generators/templates/domain-registry.d.ts +6 -0
  55. package/dist/action/generators/templates/domain-registry.d.ts.map +1 -0
  56. package/dist/action/index.d.ts +31 -0
  57. package/dist/action/index.d.ts.map +1 -0
  58. package/dist/action/index.js +17 -0
  59. package/dist/action/index.js.map +1 -0
  60. package/dist/action/package.json +3 -0
  61. package/dist/action/reports/audit-report.d.ts +15 -0
  62. package/dist/action/reports/audit-report.d.ts.map +1 -0
  63. package/dist/action/reports/health-report.d.ts +15 -0
  64. package/dist/action/reports/health-report.d.ts.map +1 -0
  65. package/dist/action/reports/link-report.d.ts +15 -0
  66. package/dist/action/reports/link-report.d.ts.map +1 -0
  67. package/dist/action/utils/frontmatter.d.ts +50 -0
  68. package/dist/action/utils/frontmatter.d.ts.map +1 -0
  69. package/dist/action/utils/glob.d.ts +63 -0
  70. package/dist/action/utils/glob.d.ts.map +1 -0
  71. package/dist/action/utils/logger.d.ts +42 -0
  72. package/dist/action/utils/logger.d.ts.map +1 -0
  73. package/dist/action/utils/markdown.d.ts +89 -0
  74. package/dist/action/utils/markdown.d.ts.map +1 -0
  75. package/dist/cli/index.d.ts +3 -0
  76. package/dist/cli/index.d.ts.map +1 -0
  77. package/dist/cli/index.js +287 -0
  78. package/dist/cli/index.js.map +1 -0
  79. package/dist/core/audit/auditor.d.ts +43 -0
  80. package/dist/core/audit/auditor.d.ts.map +1 -0
  81. package/dist/core/audit/auditor.js +273 -0
  82. package/dist/core/audit/auditor.js.map +1 -0
  83. package/dist/core/audit/rules.d.ts +37 -0
  84. package/dist/core/audit/rules.d.ts.map +1 -0
  85. package/dist/core/audit/rules.js +223 -0
  86. package/dist/core/audit/rules.js.map +1 -0
  87. package/dist/core/discover/antipatterns.d.ts +24 -0
  88. package/dist/core/discover/antipatterns.d.ts.map +1 -0
  89. package/dist/core/discover/antipatterns.js +354 -0
  90. package/dist/core/discover/antipatterns.js.map +1 -0
  91. package/dist/core/discover/dependencies.d.ts +57 -0
  92. package/dist/core/discover/dependencies.d.ts.map +1 -0
  93. package/dist/core/discover/dependencies.js +311 -0
  94. package/dist/core/discover/dependencies.js.map +1 -0
  95. package/dist/core/discover/patterns.d.ts +38 -0
  96. package/dist/core/discover/patterns.d.ts.map +1 -0
  97. package/dist/core/discover/patterns.js +371 -0
  98. package/dist/core/discover/patterns.js.map +1 -0
  99. package/dist/core/discover/standards.d.ts +58 -0
  100. package/dist/core/discover/standards.d.ts.map +1 -0
  101. package/dist/core/discover/standards.js +359 -0
  102. package/dist/core/discover/standards.js.map +1 -0
  103. package/dist/core/domains/classifier.d.ts +41 -0
  104. package/dist/core/domains/classifier.d.ts.map +1 -0
  105. package/dist/core/domains/classifier.js +208 -0
  106. package/dist/core/domains/classifier.js.map +1 -0
  107. package/dist/core/domains/constants.d.ts +40 -0
  108. package/dist/core/domains/constants.d.ts.map +1 -0
  109. package/dist/core/domains/constants.js +252 -0
  110. package/dist/core/domains/constants.js.map +1 -0
  111. package/dist/core/domains/detector.d.ts +35 -0
  112. package/dist/core/domains/detector.d.ts.map +1 -0
  113. package/dist/core/domains/detector.js +176 -0
  114. package/dist/core/domains/detector.js.map +1 -0
  115. package/dist/core/integrate/integrator.d.ts +35 -0
  116. package/dist/core/integrate/integrator.d.ts.map +1 -0
  117. package/dist/core/integrate/integrator.js +216 -0
  118. package/dist/core/integrate/integrator.js.map +1 -0
  119. package/dist/core/links/checker.d.ts +64 -0
  120. package/dist/core/links/checker.d.ts.map +1 -0
  121. package/dist/core/links/checker.js +190 -0
  122. package/dist/core/links/checker.js.map +1 -0
  123. package/dist/core/links/tracker.d.ts +69 -0
  124. package/dist/core/links/tracker.d.ts.map +1 -0
  125. package/dist/core/links/tracker.js +184 -0
  126. package/dist/core/links/tracker.js.map +1 -0
  127. package/dist/core/maintain/orchestrator.d.ts +39 -0
  128. package/dist/core/maintain/orchestrator.d.ts.map +1 -0
  129. package/dist/core/maintain/orchestrator.js +372 -0
  130. package/dist/core/maintain/orchestrator.js.map +1 -0
  131. package/dist/core/metadata/generator.d.ts +26 -0
  132. package/dist/core/metadata/generator.d.ts.map +1 -0
  133. package/dist/core/metadata/generator.js +221 -0
  134. package/dist/core/metadata/generator.js.map +1 -0
  135. package/dist/core/metadata/schema.d.ts +201 -0
  136. package/dist/core/metadata/schema.d.ts.map +1 -0
  137. package/dist/core/metadata/schema.js +184 -0
  138. package/dist/core/metadata/schema.js.map +1 -0
  139. package/dist/core/metadata/sync.d.ts +36 -0
  140. package/dist/core/metadata/sync.d.ts.map +1 -0
  141. package/dist/core/metadata/sync.js +195 -0
  142. package/dist/core/metadata/sync.js.map +1 -0
  143. package/dist/generators/index-generator.d.ts +19 -0
  144. package/dist/generators/index-generator.d.ts.map +1 -0
  145. package/dist/generators/index-generator.js +191 -0
  146. package/dist/generators/index-generator.js.map +1 -0
  147. package/dist/generators/registry-generator.d.ts +11 -0
  148. package/dist/generators/registry-generator.d.ts.map +1 -0
  149. package/dist/generators/registry-generator.js +156 -0
  150. package/dist/generators/registry-generator.js.map +1 -0
  151. package/dist/generators/scaffold.d.ts +30 -0
  152. package/dist/generators/scaffold.d.ts.map +1 -0
  153. package/dist/generators/scaffold.js +213 -0
  154. package/dist/generators/scaffold.js.map +1 -0
  155. package/dist/generators/templates/document.d.ts +14 -0
  156. package/dist/generators/templates/document.d.ts.map +1 -0
  157. package/dist/generators/templates/document.js +305 -0
  158. package/dist/generators/templates/document.js.map +1 -0
  159. package/dist/generators/templates/domain-index.d.ts +6 -0
  160. package/dist/generators/templates/domain-index.d.ts.map +1 -0
  161. package/dist/generators/templates/domain-index.js +68 -0
  162. package/dist/generators/templates/domain-index.js.map +1 -0
  163. package/dist/generators/templates/domain-registry.d.ts +6 -0
  164. package/dist/generators/templates/domain-registry.d.ts.map +1 -0
  165. package/dist/generators/templates/domain-registry.js +59 -0
  166. package/dist/generators/templates/domain-registry.js.map +1 -0
  167. package/dist/index.d.ts +32 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +39 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/reports/audit-report.d.ts +15 -0
  172. package/dist/reports/audit-report.d.ts.map +1 -0
  173. package/dist/reports/audit-report.js +150 -0
  174. package/dist/reports/audit-report.js.map +1 -0
  175. package/dist/reports/health-report.d.ts +15 -0
  176. package/dist/reports/health-report.d.ts.map +1 -0
  177. package/dist/reports/health-report.js +175 -0
  178. package/dist/reports/health-report.js.map +1 -0
  179. package/dist/reports/link-report.d.ts +15 -0
  180. package/dist/reports/link-report.d.ts.map +1 -0
  181. package/dist/reports/link-report.js +165 -0
  182. package/dist/reports/link-report.js.map +1 -0
  183. package/dist/utils/frontmatter.d.ts +50 -0
  184. package/dist/utils/frontmatter.d.ts.map +1 -0
  185. package/dist/utils/frontmatter.js +93 -0
  186. package/dist/utils/frontmatter.js.map +1 -0
  187. package/dist/utils/glob.d.ts +63 -0
  188. package/dist/utils/glob.d.ts.map +1 -0
  189. package/dist/utils/glob.js +128 -0
  190. package/dist/utils/glob.js.map +1 -0
  191. package/dist/utils/logger.d.ts +42 -0
  192. package/dist/utils/logger.d.ts.map +1 -0
  193. package/dist/utils/logger.js +118 -0
  194. package/dist/utils/logger.js.map +1 -0
  195. package/dist/utils/markdown.d.ts +89 -0
  196. package/dist/utils/markdown.d.ts.map +1 -0
  197. package/dist/utils/markdown.js +192 -0
  198. package/dist/utils/markdown.js.map +1 -0
  199. package/package.json +100 -0
  200. package/templates/claude/CLAUDE.md +204 -0
@@ -0,0 +1,311 @@
1
+ import { readFile } from 'fs/promises';
2
+ import { join, relative } from 'path';
3
+ import { glob, pathExists } from '../../utils/glob.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ /**
6
+ * Analyze project dependencies
7
+ */
8
+ export async function analyzeDependencies(options) {
9
+ const { rootPath, silent = false } = options;
10
+ if (!silent) {
11
+ logger.header('Dependency Analysis');
12
+ logger.info(`Analyzing: ${rootPath}`);
13
+ }
14
+ // Analyze package.json dependencies
15
+ const packages = await analyzePackages(rootPath);
16
+ if (!silent) {
17
+ logger.info(`Found ${packages.total} packages (${packages.production} prod, ${packages.development} dev)`);
18
+ }
19
+ // Analyze module imports
20
+ const modules = await analyzeModules(rootPath);
21
+ if (!silent) {
22
+ logger.info(`Analyzed ${modules.totalFiles} files, ${modules.imports} imports`);
23
+ if (modules.circularDependencies.length > 0) {
24
+ logger.warn(`Found ${modules.circularDependencies.length} circular dependencies`);
25
+ }
26
+ }
27
+ // Check for security issues (basic check)
28
+ const security = await analyzeSecurityBasic(packages);
29
+ // Find unused dependencies
30
+ const unused = await findUnusedDependencies(rootPath, packages);
31
+ if (!silent && unused.length > 0) {
32
+ logger.warn(`Found ${unused.length} potentially unused dependencies`);
33
+ }
34
+ return {
35
+ packages,
36
+ modules,
37
+ security,
38
+ unused,
39
+ };
40
+ }
41
+ /**
42
+ * Analyze package.json
43
+ */
44
+ async function analyzePackages(rootPath) {
45
+ const result = {
46
+ total: 0,
47
+ production: 0,
48
+ development: 0,
49
+ dependencies: [],
50
+ devDependencies: [],
51
+ };
52
+ const packageJsonPath = join(rootPath, 'package.json');
53
+ if (!(await pathExists(packageJsonPath))) {
54
+ return result;
55
+ }
56
+ try {
57
+ const content = await readFile(packageJsonPath, 'utf-8');
58
+ const pkg = JSON.parse(content);
59
+ // Production dependencies
60
+ if (pkg.dependencies) {
61
+ for (const [name, version] of Object.entries(pkg.dependencies)) {
62
+ result.dependencies.push({
63
+ name,
64
+ version: String(version),
65
+ type: 'production',
66
+ });
67
+ }
68
+ result.production = result.dependencies.length;
69
+ }
70
+ // Dev dependencies
71
+ if (pkg.devDependencies) {
72
+ for (const [name, version] of Object.entries(pkg.devDependencies)) {
73
+ result.devDependencies.push({
74
+ name,
75
+ version: String(version),
76
+ type: 'development',
77
+ });
78
+ }
79
+ result.development = result.devDependencies.length;
80
+ }
81
+ result.total = result.production + result.development;
82
+ }
83
+ catch {
84
+ // Invalid package.json
85
+ }
86
+ return result;
87
+ }
88
+ /**
89
+ * Analyze module imports and dependencies
90
+ */
91
+ async function analyzeModules(rootPath) {
92
+ const result = {
93
+ totalFiles: 0,
94
+ imports: 0,
95
+ circularDependencies: [],
96
+ highCoupling: [],
97
+ };
98
+ // Find all source files
99
+ const files = await glob('**/*.{ts,tsx,js,jsx}', {
100
+ cwd: rootPath,
101
+ absolute: true,
102
+ ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],
103
+ });
104
+ result.totalFiles = files.length;
105
+ // Build import graph
106
+ const importGraph = new Map();
107
+ const importedBy = new Map();
108
+ for (const file of files) {
109
+ try {
110
+ const content = await readFile(file, 'utf-8');
111
+ const relPath = relative(rootPath, file);
112
+ // Extract imports
113
+ const importMatches = content.matchAll(/import\s+.*?from\s+['"]([^'"]+)['"]/g);
114
+ const imports = new Set();
115
+ for (const match of importMatches) {
116
+ const importPath = match[1];
117
+ if (importPath?.startsWith('.')) {
118
+ // Resolve relative import
119
+ const resolved = resolveImport(relPath, importPath);
120
+ imports.add(resolved);
121
+ result.imports++;
122
+ // Track imported by
123
+ if (!importedBy.has(resolved)) {
124
+ importedBy.set(resolved, new Set());
125
+ }
126
+ importedBy.get(resolved).add(relPath);
127
+ }
128
+ }
129
+ importGraph.set(relPath, imports);
130
+ }
131
+ catch {
132
+ // Skip unreadable files
133
+ }
134
+ }
135
+ // Detect circular dependencies
136
+ result.circularDependencies = detectCircularDependencies(importGraph);
137
+ // Find high coupling modules
138
+ for (const [file, imports] of importGraph) {
139
+ const importCount = imports.size;
140
+ const importedByCount = importedBy.get(file)?.size ?? 0;
141
+ if (importCount > 10 || importedByCount > 10) {
142
+ result.highCoupling.push({
143
+ file,
144
+ imports: importCount,
145
+ importedBy: importedByCount,
146
+ });
147
+ }
148
+ }
149
+ // Sort by total coupling
150
+ result.highCoupling.sort((a, b) => (b.imports + b.importedBy) - (a.imports + a.importedBy));
151
+ return result;
152
+ }
153
+ /**
154
+ * Resolve relative import path
155
+ */
156
+ function resolveImport(fromFile, importPath) {
157
+ const fromDir = fromFile.split('/').slice(0, -1).join('/');
158
+ const parts = importPath.split('/');
159
+ const result = fromDir ? fromDir.split('/') : [];
160
+ for (const part of parts) {
161
+ if (part === '.')
162
+ continue;
163
+ if (part === '..') {
164
+ result.pop();
165
+ }
166
+ else {
167
+ result.push(part);
168
+ }
169
+ }
170
+ let resolved = result.join('/');
171
+ // Add extension if not present
172
+ if (!resolved.match(/\.[jt]sx?$/)) {
173
+ resolved += '.ts';
174
+ }
175
+ return resolved;
176
+ }
177
+ /**
178
+ * Detect circular dependencies using DFS
179
+ */
180
+ function detectCircularDependencies(graph) {
181
+ const cycles = [];
182
+ const visited = new Set();
183
+ const recursionStack = new Set();
184
+ function dfs(node, path) {
185
+ if (recursionStack.has(node)) {
186
+ // Found a cycle
187
+ const cycleStart = path.indexOf(node);
188
+ if (cycleStart !== -1) {
189
+ cycles.push({ files: path.slice(cycleStart) });
190
+ }
191
+ return true;
192
+ }
193
+ if (visited.has(node)) {
194
+ return false;
195
+ }
196
+ visited.add(node);
197
+ recursionStack.add(node);
198
+ path.push(node);
199
+ const imports = graph.get(node) ?? new Set();
200
+ for (const imported of imports) {
201
+ dfs(imported, [...path]);
202
+ }
203
+ recursionStack.delete(node);
204
+ return false;
205
+ }
206
+ for (const node of graph.keys()) {
207
+ if (!visited.has(node)) {
208
+ dfs(node, []);
209
+ }
210
+ }
211
+ // Deduplicate cycles (same cycle can be detected from different starting points)
212
+ const uniqueCycles = [];
213
+ const seen = new Set();
214
+ for (const cycle of cycles) {
215
+ const key = [...cycle.files].sort().join('->');
216
+ if (!seen.has(key)) {
217
+ seen.add(key);
218
+ uniqueCycles.push(cycle);
219
+ }
220
+ }
221
+ return uniqueCycles.slice(0, 10); // Limit to first 10
222
+ }
223
+ /**
224
+ * Basic security check (pattern-based)
225
+ */
226
+ async function analyzeSecurityBasic(packages) {
227
+ const vulnerabilities = [];
228
+ // Known vulnerable packages (simplified - real implementation would use a vulnerability database)
229
+ const knownVulnerable = {
230
+ 'lodash': {
231
+ severity: 'high',
232
+ title: 'Prototype Pollution in lodash < 4.17.21',
233
+ fix: 'Upgrade to lodash@4.17.21 or higher',
234
+ },
235
+ 'minimist': {
236
+ severity: 'moderate',
237
+ title: 'Prototype Pollution in minimist < 1.2.6',
238
+ fix: 'Upgrade to minimist@1.2.6 or higher',
239
+ },
240
+ 'node-fetch': {
241
+ severity: 'moderate',
242
+ title: 'Exposure of Sensitive Information in node-fetch < 2.6.7',
243
+ fix: 'Upgrade to node-fetch@2.6.7 or higher',
244
+ },
245
+ };
246
+ const allPackages = [...packages.dependencies, ...packages.devDependencies];
247
+ for (const pkg of allPackages) {
248
+ const vuln = knownVulnerable[pkg.name];
249
+ if (vuln) {
250
+ // Check version (simplified - real implementation would do proper semver comparison)
251
+ vulnerabilities.push({
252
+ package: pkg.name,
253
+ severity: vuln.severity,
254
+ title: vuln.title,
255
+ recommendation: vuln.fix,
256
+ });
257
+ }
258
+ }
259
+ return { vulnerabilities };
260
+ }
261
+ /**
262
+ * Find potentially unused dependencies
263
+ */
264
+ async function findUnusedDependencies(rootPath, packages) {
265
+ const unused = [];
266
+ // Get all source files
267
+ const files = await glob('**/*.{ts,tsx,js,jsx,json}', {
268
+ cwd: rootPath,
269
+ absolute: true,
270
+ ignore: ['**/node_modules/**', '**/dist/**'],
271
+ });
272
+ // Read all file contents
273
+ let allContent = '';
274
+ for (const file of files) {
275
+ try {
276
+ const content = await readFile(file, 'utf-8');
277
+ allContent += content + '\n';
278
+ }
279
+ catch {
280
+ // Skip
281
+ }
282
+ }
283
+ // Check each dependency
284
+ const allPackages = [...packages.dependencies, ...packages.devDependencies];
285
+ for (const pkg of allPackages) {
286
+ const name = pkg.name;
287
+ // Skip common false positives
288
+ if (['typescript', '@types/', 'eslint', 'prettier', 'vitest', 'jest'].some((p) => name.includes(p))) {
289
+ continue;
290
+ }
291
+ // Check if package is imported
292
+ const importPatterns = [
293
+ `from '${name}'`,
294
+ `from "${name}"`,
295
+ `require('${name}')`,
296
+ `require("${name}")`,
297
+ `from '${name}/`,
298
+ `from "${name}/`,
299
+ ];
300
+ const isUsed = importPatterns.some((p) => allContent.includes(p));
301
+ if (!isUsed) {
302
+ unused.push({
303
+ name,
304
+ type: pkg.type,
305
+ reason: 'No import found in source files',
306
+ });
307
+ }
308
+ }
309
+ return unused;
310
+ }
311
+ //# sourceMappingURL=dependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.js","sourceRoot":"","sources":["../../../src/core/discover/dependencies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export interface PatternDiscoveryOptions {
2
+ rootPath: string;
3
+ language?: string;
4
+ category?: string;
5
+ silent?: boolean;
6
+ }
7
+ export interface DiscoveredPattern {
8
+ name: string;
9
+ category: PatternCategory;
10
+ description: string;
11
+ occurrences: number;
12
+ examples: PatternExample[];
13
+ suggestedDocumentation?: string;
14
+ }
15
+ export interface PatternExample {
16
+ file: string;
17
+ line: number;
18
+ code: string;
19
+ context?: string;
20
+ }
21
+ export type PatternCategory = 'architecture' | 'data-access' | 'error-handling' | 'security' | 'testing' | 'api' | 'state-management' | 'utility';
22
+ export interface PatternDefinition {
23
+ name: string;
24
+ category: PatternCategory;
25
+ description: string;
26
+ patterns: RegExp[];
27
+ filePatterns?: string[];
28
+ languages?: string[];
29
+ }
30
+ /**
31
+ * Discover patterns in codebase
32
+ */
33
+ export declare function discoverPatterns(options: PatternDiscoveryOptions): Promise<DiscoveredPattern[]>;
34
+ /**
35
+ * Generate documentation suggestion for a pattern
36
+ */
37
+ export declare function generatePatternDocumentation(pattern: DiscoveredPattern): string;
38
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/core/discover/patterns.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GACvB,cAAc,GACd,aAAa,GACb,gBAAgB,GAChB,UAAU,GACV,SAAS,GACT,KAAK,GACL,kBAAkB,GAClB,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAsND;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAoE9B;AA0FD;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAkC/E"}