@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.
- package/.claude-plugin/marketplace.json +46 -0
- package/.claude-plugin/plugin.json +114 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +255 -0
- package/README.backup.md +714 -0
- package/README.md +869 -0
- package/action.yml +56 -0
- package/dist/action/action/index.d.ts +2 -0
- package/dist/action/action/index.d.ts.map +1 -0
- package/dist/action/cli/index.d.ts +3 -0
- package/dist/action/cli/index.d.ts.map +1 -0
- package/dist/action/core/audit/auditor.d.ts +43 -0
- package/dist/action/core/audit/auditor.d.ts.map +1 -0
- package/dist/action/core/audit/rules.d.ts +37 -0
- package/dist/action/core/audit/rules.d.ts.map +1 -0
- package/dist/action/core/discover/antipatterns.d.ts +24 -0
- package/dist/action/core/discover/antipatterns.d.ts.map +1 -0
- package/dist/action/core/discover/dependencies.d.ts +57 -0
- package/dist/action/core/discover/dependencies.d.ts.map +1 -0
- package/dist/action/core/discover/patterns.d.ts +38 -0
- package/dist/action/core/discover/patterns.d.ts.map +1 -0
- package/dist/action/core/discover/standards.d.ts +58 -0
- package/dist/action/core/discover/standards.d.ts.map +1 -0
- package/dist/action/core/domains/classifier.d.ts +41 -0
- package/dist/action/core/domains/classifier.d.ts.map +1 -0
- package/dist/action/core/domains/constants.d.ts +40 -0
- package/dist/action/core/domains/constants.d.ts.map +1 -0
- package/dist/action/core/domains/detector.d.ts +35 -0
- package/dist/action/core/domains/detector.d.ts.map +1 -0
- package/dist/action/core/integrate/integrator.d.ts +35 -0
- package/dist/action/core/integrate/integrator.d.ts.map +1 -0
- package/dist/action/core/links/checker.d.ts +64 -0
- package/dist/action/core/links/checker.d.ts.map +1 -0
- package/dist/action/core/links/tracker.d.ts +69 -0
- package/dist/action/core/links/tracker.d.ts.map +1 -0
- package/dist/action/core/maintain/orchestrator.d.ts +39 -0
- package/dist/action/core/maintain/orchestrator.d.ts.map +1 -0
- package/dist/action/core/metadata/generator.d.ts +26 -0
- package/dist/action/core/metadata/generator.d.ts.map +1 -0
- package/dist/action/core/metadata/schema.d.ts +201 -0
- package/dist/action/core/metadata/schema.d.ts.map +1 -0
- package/dist/action/core/metadata/sync.d.ts +36 -0
- package/dist/action/core/metadata/sync.d.ts.map +1 -0
- package/dist/action/generators/index-generator.d.ts +19 -0
- package/dist/action/generators/index-generator.d.ts.map +1 -0
- package/dist/action/generators/registry-generator.d.ts +11 -0
- package/dist/action/generators/registry-generator.d.ts.map +1 -0
- package/dist/action/generators/scaffold.d.ts +30 -0
- package/dist/action/generators/scaffold.d.ts.map +1 -0
- package/dist/action/generators/templates/document.d.ts +14 -0
- package/dist/action/generators/templates/document.d.ts.map +1 -0
- package/dist/action/generators/templates/domain-index.d.ts +6 -0
- package/dist/action/generators/templates/domain-index.d.ts.map +1 -0
- package/dist/action/generators/templates/domain-registry.d.ts +6 -0
- package/dist/action/generators/templates/domain-registry.d.ts.map +1 -0
- package/dist/action/index.d.ts +31 -0
- package/dist/action/index.d.ts.map +1 -0
- package/dist/action/index.js +17 -0
- package/dist/action/index.js.map +1 -0
- package/dist/action/package.json +3 -0
- package/dist/action/reports/audit-report.d.ts +15 -0
- package/dist/action/reports/audit-report.d.ts.map +1 -0
- package/dist/action/reports/health-report.d.ts +15 -0
- package/dist/action/reports/health-report.d.ts.map +1 -0
- package/dist/action/reports/link-report.d.ts +15 -0
- package/dist/action/reports/link-report.d.ts.map +1 -0
- package/dist/action/utils/frontmatter.d.ts +50 -0
- package/dist/action/utils/frontmatter.d.ts.map +1 -0
- package/dist/action/utils/glob.d.ts +63 -0
- package/dist/action/utils/glob.d.ts.map +1 -0
- package/dist/action/utils/logger.d.ts +42 -0
- package/dist/action/utils/logger.d.ts.map +1 -0
- package/dist/action/utils/markdown.d.ts +89 -0
- package/dist/action/utils/markdown.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +287 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/audit/auditor.d.ts +43 -0
- package/dist/core/audit/auditor.d.ts.map +1 -0
- package/dist/core/audit/auditor.js +273 -0
- package/dist/core/audit/auditor.js.map +1 -0
- package/dist/core/audit/rules.d.ts +37 -0
- package/dist/core/audit/rules.d.ts.map +1 -0
- package/dist/core/audit/rules.js +223 -0
- package/dist/core/audit/rules.js.map +1 -0
- package/dist/core/discover/antipatterns.d.ts +24 -0
- package/dist/core/discover/antipatterns.d.ts.map +1 -0
- package/dist/core/discover/antipatterns.js +354 -0
- package/dist/core/discover/antipatterns.js.map +1 -0
- package/dist/core/discover/dependencies.d.ts +57 -0
- package/dist/core/discover/dependencies.d.ts.map +1 -0
- package/dist/core/discover/dependencies.js +311 -0
- package/dist/core/discover/dependencies.js.map +1 -0
- package/dist/core/discover/patterns.d.ts +38 -0
- package/dist/core/discover/patterns.d.ts.map +1 -0
- package/dist/core/discover/patterns.js +371 -0
- package/dist/core/discover/patterns.js.map +1 -0
- package/dist/core/discover/standards.d.ts +58 -0
- package/dist/core/discover/standards.d.ts.map +1 -0
- package/dist/core/discover/standards.js +359 -0
- package/dist/core/discover/standards.js.map +1 -0
- package/dist/core/domains/classifier.d.ts +41 -0
- package/dist/core/domains/classifier.d.ts.map +1 -0
- package/dist/core/domains/classifier.js +208 -0
- package/dist/core/domains/classifier.js.map +1 -0
- package/dist/core/domains/constants.d.ts +40 -0
- package/dist/core/domains/constants.d.ts.map +1 -0
- package/dist/core/domains/constants.js +252 -0
- package/dist/core/domains/constants.js.map +1 -0
- package/dist/core/domains/detector.d.ts +35 -0
- package/dist/core/domains/detector.d.ts.map +1 -0
- package/dist/core/domains/detector.js +176 -0
- package/dist/core/domains/detector.js.map +1 -0
- package/dist/core/integrate/integrator.d.ts +35 -0
- package/dist/core/integrate/integrator.d.ts.map +1 -0
- package/dist/core/integrate/integrator.js +216 -0
- package/dist/core/integrate/integrator.js.map +1 -0
- package/dist/core/links/checker.d.ts +64 -0
- package/dist/core/links/checker.d.ts.map +1 -0
- package/dist/core/links/checker.js +190 -0
- package/dist/core/links/checker.js.map +1 -0
- package/dist/core/links/tracker.d.ts +69 -0
- package/dist/core/links/tracker.d.ts.map +1 -0
- package/dist/core/links/tracker.js +184 -0
- package/dist/core/links/tracker.js.map +1 -0
- package/dist/core/maintain/orchestrator.d.ts +39 -0
- package/dist/core/maintain/orchestrator.d.ts.map +1 -0
- package/dist/core/maintain/orchestrator.js +372 -0
- package/dist/core/maintain/orchestrator.js.map +1 -0
- package/dist/core/metadata/generator.d.ts +26 -0
- package/dist/core/metadata/generator.d.ts.map +1 -0
- package/dist/core/metadata/generator.js +221 -0
- package/dist/core/metadata/generator.js.map +1 -0
- package/dist/core/metadata/schema.d.ts +201 -0
- package/dist/core/metadata/schema.d.ts.map +1 -0
- package/dist/core/metadata/schema.js +184 -0
- package/dist/core/metadata/schema.js.map +1 -0
- package/dist/core/metadata/sync.d.ts +36 -0
- package/dist/core/metadata/sync.d.ts.map +1 -0
- package/dist/core/metadata/sync.js +195 -0
- package/dist/core/metadata/sync.js.map +1 -0
- package/dist/generators/index-generator.d.ts +19 -0
- package/dist/generators/index-generator.d.ts.map +1 -0
- package/dist/generators/index-generator.js +191 -0
- package/dist/generators/index-generator.js.map +1 -0
- package/dist/generators/registry-generator.d.ts +11 -0
- package/dist/generators/registry-generator.d.ts.map +1 -0
- package/dist/generators/registry-generator.js +156 -0
- package/dist/generators/registry-generator.js.map +1 -0
- package/dist/generators/scaffold.d.ts +30 -0
- package/dist/generators/scaffold.d.ts.map +1 -0
- package/dist/generators/scaffold.js +213 -0
- package/dist/generators/scaffold.js.map +1 -0
- package/dist/generators/templates/document.d.ts +14 -0
- package/dist/generators/templates/document.d.ts.map +1 -0
- package/dist/generators/templates/document.js +305 -0
- package/dist/generators/templates/document.js.map +1 -0
- package/dist/generators/templates/domain-index.d.ts +6 -0
- package/dist/generators/templates/domain-index.d.ts.map +1 -0
- package/dist/generators/templates/domain-index.js +68 -0
- package/dist/generators/templates/domain-index.js.map +1 -0
- package/dist/generators/templates/domain-registry.d.ts +6 -0
- package/dist/generators/templates/domain-registry.d.ts.map +1 -0
- package/dist/generators/templates/domain-registry.js +59 -0
- package/dist/generators/templates/domain-registry.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/reports/audit-report.d.ts +15 -0
- package/dist/reports/audit-report.d.ts.map +1 -0
- package/dist/reports/audit-report.js +150 -0
- package/dist/reports/audit-report.js.map +1 -0
- package/dist/reports/health-report.d.ts +15 -0
- package/dist/reports/health-report.d.ts.map +1 -0
- package/dist/reports/health-report.js +175 -0
- package/dist/reports/health-report.js.map +1 -0
- package/dist/reports/link-report.d.ts +15 -0
- package/dist/reports/link-report.d.ts.map +1 -0
- package/dist/reports/link-report.js +165 -0
- package/dist/reports/link-report.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +50 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +93 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/glob.d.ts +63 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +128 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +118 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown.d.ts +89 -0
- package/dist/utils/markdown.d.ts.map +1 -0
- package/dist/utils/markdown.js +192 -0
- package/dist/utils/markdown.js.map +1 -0
- package/package.json +100 -0
- package/templates/claude/CLAUDE.md +204 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { relative, basename } from 'path';
|
|
3
|
+
import { glob } from '../../utils/glob.js';
|
|
4
|
+
import { logger } from '../../utils/logger.js';
|
|
5
|
+
/**
|
|
6
|
+
* Discover implicit standards from codebase
|
|
7
|
+
*/
|
|
8
|
+
export async function discoverStandards(options) {
|
|
9
|
+
const { rootPath, silent = false } = options;
|
|
10
|
+
if (!silent) {
|
|
11
|
+
logger.header('Standards Discovery');
|
|
12
|
+
logger.info(`Analyzing: ${rootPath}`);
|
|
13
|
+
}
|
|
14
|
+
// Find all source files
|
|
15
|
+
const tsFiles = await glob('**/*.{ts,tsx}', {
|
|
16
|
+
cwd: rootPath,
|
|
17
|
+
absolute: true,
|
|
18
|
+
ignore: ['**/node_modules/**', '**/dist/**'],
|
|
19
|
+
});
|
|
20
|
+
const jsFiles = await glob('**/*.{js,jsx,mjs}', {
|
|
21
|
+
cwd: rootPath,
|
|
22
|
+
absolute: true,
|
|
23
|
+
ignore: ['**/node_modules/**', '**/dist/**'],
|
|
24
|
+
});
|
|
25
|
+
const allFiles = [...new Set([...tsFiles, ...jsFiles])];
|
|
26
|
+
if (!silent) {
|
|
27
|
+
logger.info(`Analyzing ${allFiles.length} source files...`);
|
|
28
|
+
}
|
|
29
|
+
// Discover each category
|
|
30
|
+
const naming = await discoverNamingStandards(allFiles, rootPath);
|
|
31
|
+
const fileOrganization = await discoverFileOrganization(rootPath);
|
|
32
|
+
const codeStyle = await discoverCodeStyle(allFiles);
|
|
33
|
+
const documentation = await discoverDocumentationStandards(allFiles);
|
|
34
|
+
const testing = await discoverTestingStandards(rootPath);
|
|
35
|
+
const standards = {
|
|
36
|
+
naming,
|
|
37
|
+
fileOrganization,
|
|
38
|
+
codeStyle,
|
|
39
|
+
documentation,
|
|
40
|
+
testing,
|
|
41
|
+
};
|
|
42
|
+
if (!silent) {
|
|
43
|
+
logger.newline();
|
|
44
|
+
logger.success('Standards discovered:');
|
|
45
|
+
logger.info(` Functions: ${naming.functions.convention} (${naming.functions.compliance.toFixed(0)}% compliance)`);
|
|
46
|
+
logger.info(` Classes: ${naming.classes.convention} (${naming.classes.compliance.toFixed(0)}% compliance)`);
|
|
47
|
+
logger.info(` Indentation: ${codeStyle.indentation}${codeStyle.indentSize ? ` (${codeStyle.indentSize} spaces)` : ''}`);
|
|
48
|
+
logger.info(` Type hints: ${documentation.typeHintCoverage.toFixed(0)}% coverage`);
|
|
49
|
+
}
|
|
50
|
+
return standards;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Discover naming conventions
|
|
54
|
+
*/
|
|
55
|
+
async function discoverNamingStandards(files, rootPath) {
|
|
56
|
+
const functionNames = [];
|
|
57
|
+
const classNames = [];
|
|
58
|
+
const constantNames = [];
|
|
59
|
+
const variableNames = [];
|
|
60
|
+
for (const file of files.slice(0, 100)) {
|
|
61
|
+
try {
|
|
62
|
+
const content = await readFile(file, 'utf-8');
|
|
63
|
+
const relPath = relative(rootPath, file);
|
|
64
|
+
// Extract function names
|
|
65
|
+
const funcMatches = content.matchAll(/(?:function\s+(\w+)|(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s*)?\([^)]*\)\s*=>)/g);
|
|
66
|
+
for (const match of funcMatches) {
|
|
67
|
+
const name = match[1] ?? match[2];
|
|
68
|
+
if (name)
|
|
69
|
+
functionNames.push({ name, file: relPath });
|
|
70
|
+
}
|
|
71
|
+
// Extract class names
|
|
72
|
+
const classMatches = content.matchAll(/class\s+(\w+)/g);
|
|
73
|
+
for (const match of classMatches) {
|
|
74
|
+
if (match[1])
|
|
75
|
+
classNames.push({ name: match[1], file: relPath });
|
|
76
|
+
}
|
|
77
|
+
// Extract constants (UPPER_SNAKE_CASE)
|
|
78
|
+
const constMatches = content.matchAll(/const\s+([A-Z][A-Z0-9_]+)\s*=/g);
|
|
79
|
+
for (const match of constMatches) {
|
|
80
|
+
if (match[1])
|
|
81
|
+
constantNames.push({ name: match[1], file: relPath });
|
|
82
|
+
}
|
|
83
|
+
// Extract regular variables
|
|
84
|
+
const varMatches = content.matchAll(/(?:const|let|var)\s+([a-z][a-zA-Z0-9]*)\s*=/g);
|
|
85
|
+
for (const match of varMatches) {
|
|
86
|
+
if (match[1])
|
|
87
|
+
variableNames.push({ name: match[1], file: relPath });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Skip
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Analyze file naming
|
|
95
|
+
const fileNameExamples = files.slice(0, 20).map((f) => ({
|
|
96
|
+
name: basename(f),
|
|
97
|
+
file: relative(rootPath, f),
|
|
98
|
+
}));
|
|
99
|
+
return {
|
|
100
|
+
functions: analyzeNamingConvention(functionNames, 'camelCase'),
|
|
101
|
+
classes: analyzeNamingConvention(classNames, 'PascalCase'),
|
|
102
|
+
constants: analyzeNamingConvention(constantNames, 'UPPER_SNAKE_CASE'),
|
|
103
|
+
variables: analyzeNamingConvention(variableNames, 'camelCase'),
|
|
104
|
+
files: analyzeFileNaming(fileNameExamples),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Analyze naming convention compliance
|
|
109
|
+
*/
|
|
110
|
+
function analyzeNamingConvention(names, expectedConvention) {
|
|
111
|
+
const checks = {
|
|
112
|
+
camelCase: (n) => /^[a-z][a-zA-Z0-9]*$/.test(n),
|
|
113
|
+
PascalCase: (n) => /^[A-Z][a-zA-Z0-9]*$/.test(n),
|
|
114
|
+
UPPER_SNAKE_CASE: (n) => /^[A-Z][A-Z0-9_]*$/.test(n),
|
|
115
|
+
'kebab-case': (n) => /^[a-z][a-z0-9-]*$/.test(n),
|
|
116
|
+
snake_case: (n) => /^[a-z][a-z0-9_]*$/.test(n),
|
|
117
|
+
};
|
|
118
|
+
const check = checks[expectedConvention] ?? checks.camelCase;
|
|
119
|
+
const compliant = names.filter((n) => check(n.name));
|
|
120
|
+
const compliance = names.length > 0 ? (compliant.length / names.length) * 100 : 100;
|
|
121
|
+
// Detect actual convention used
|
|
122
|
+
let detectedConvention = expectedConvention;
|
|
123
|
+
let maxCompliance = compliance;
|
|
124
|
+
for (const [convention, checkFn] of Object.entries(checks)) {
|
|
125
|
+
const conventionCompliance = names.filter((n) => checkFn(n.name)).length / Math.max(names.length, 1) * 100;
|
|
126
|
+
if (conventionCompliance > maxCompliance) {
|
|
127
|
+
maxCompliance = conventionCompliance;
|
|
128
|
+
detectedConvention = convention;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
convention: detectedConvention,
|
|
133
|
+
compliance: maxCompliance,
|
|
134
|
+
examples: names.slice(0, 5).map((n) => ({
|
|
135
|
+
...n,
|
|
136
|
+
compliant: check(n.name),
|
|
137
|
+
})),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Analyze file naming convention
|
|
142
|
+
*/
|
|
143
|
+
function analyzeFileNaming(files) {
|
|
144
|
+
const kebabCase = files.filter((f) => /^[a-z][a-z0-9-]*\./.test(f.name)).length;
|
|
145
|
+
const camelCase = files.filter((f) => /^[a-z][a-zA-Z0-9]*\./.test(f.name)).length;
|
|
146
|
+
const pascalCase = files.filter((f) => /^[A-Z][a-zA-Z0-9]*\./.test(f.name)).length;
|
|
147
|
+
const snakeCase = files.filter((f) => /^[a-z][a-z0-9_]*\./.test(f.name)).length;
|
|
148
|
+
const total = files.length || 1;
|
|
149
|
+
const conventions = [
|
|
150
|
+
{ name: 'kebab-case', count: kebabCase },
|
|
151
|
+
{ name: 'camelCase', count: camelCase },
|
|
152
|
+
{ name: 'PascalCase', count: pascalCase },
|
|
153
|
+
{ name: 'snake_case', count: snakeCase },
|
|
154
|
+
];
|
|
155
|
+
const best = conventions.sort((a, b) => b.count - a.count)[0];
|
|
156
|
+
return {
|
|
157
|
+
convention: best.name,
|
|
158
|
+
compliance: (best.count / total) * 100,
|
|
159
|
+
examples: files.slice(0, 5).map((f) => ({
|
|
160
|
+
...f,
|
|
161
|
+
compliant: best.name === 'kebab-case' ? /^[a-z][a-z0-9-]*\./.test(f.name) : true,
|
|
162
|
+
})),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Discover file organization patterns
|
|
167
|
+
*/
|
|
168
|
+
async function discoverFileOrganization(rootPath) {
|
|
169
|
+
const patterns = [];
|
|
170
|
+
// Common folder patterns to check
|
|
171
|
+
const folderPatterns = [
|
|
172
|
+
{ pattern: 'src/', glob: 'src/**/*' },
|
|
173
|
+
{ pattern: 'lib/', glob: 'lib/**/*' },
|
|
174
|
+
{ pattern: 'components/', glob: '**/components/**/*' },
|
|
175
|
+
{ pattern: 'services/', glob: '**/services/**/*' },
|
|
176
|
+
{ pattern: 'models/', glob: '**/models/**/*' },
|
|
177
|
+
{ pattern: 'utils/', glob: '**/utils/**/*' },
|
|
178
|
+
{ pattern: 'hooks/', glob: '**/hooks/**/*' },
|
|
179
|
+
{ pattern: 'api/', glob: '**/api/**/*' },
|
|
180
|
+
{ pattern: 'routes/', glob: '**/routes/**/*' },
|
|
181
|
+
{ pattern: 'routers/', glob: '**/routers/**/*' },
|
|
182
|
+
{ pattern: 'tests/', glob: '**/tests/**/*' },
|
|
183
|
+
{ pattern: '__tests__/', glob: '**/__tests__/**/*' },
|
|
184
|
+
];
|
|
185
|
+
for (const { pattern: name, glob: globPattern } of folderPatterns) {
|
|
186
|
+
const files = await glob(globPattern, {
|
|
187
|
+
cwd: rootPath,
|
|
188
|
+
ignore: ['**/node_modules/**', '**/dist/**'],
|
|
189
|
+
});
|
|
190
|
+
if (files.length > 0) {
|
|
191
|
+
patterns.push({
|
|
192
|
+
pattern: name,
|
|
193
|
+
files: files.length,
|
|
194
|
+
examples: files.slice(0, 3),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Get root folders
|
|
199
|
+
const rootEntries = await glob('*', { cwd: rootPath });
|
|
200
|
+
const rootFolders = rootEntries.filter((e) => !e.includes('.'));
|
|
201
|
+
return {
|
|
202
|
+
patterns: patterns.sort((a, b) => b.files - a.files),
|
|
203
|
+
rootFolders,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Discover code style preferences
|
|
208
|
+
*/
|
|
209
|
+
async function discoverCodeStyle(files) {
|
|
210
|
+
let tabCount = 0;
|
|
211
|
+
let spaceCount = 0;
|
|
212
|
+
let space2Count = 0;
|
|
213
|
+
let space4Count = 0;
|
|
214
|
+
let semiCount = 0;
|
|
215
|
+
let noSemiCount = 0;
|
|
216
|
+
let singleQuoteCount = 0;
|
|
217
|
+
let doubleQuoteCount = 0;
|
|
218
|
+
let trailingCommaCount = 0;
|
|
219
|
+
let noTrailingCommaCount = 0;
|
|
220
|
+
let maxLineLength = 0;
|
|
221
|
+
for (const file of files.slice(0, 50)) {
|
|
222
|
+
try {
|
|
223
|
+
const content = await readFile(file, 'utf-8');
|
|
224
|
+
const lines = content.split('\n');
|
|
225
|
+
for (const line of lines) {
|
|
226
|
+
// Check indentation
|
|
227
|
+
if (line.startsWith('\t'))
|
|
228
|
+
tabCount++;
|
|
229
|
+
if (line.startsWith(' ')) {
|
|
230
|
+
spaceCount++;
|
|
231
|
+
if (line.startsWith(' ') && !line.startsWith(' '))
|
|
232
|
+
space4Count++;
|
|
233
|
+
else if (line.startsWith(' ') && !line.startsWith(' '))
|
|
234
|
+
space2Count++;
|
|
235
|
+
}
|
|
236
|
+
// Check max line length
|
|
237
|
+
if (line.length > maxLineLength)
|
|
238
|
+
maxLineLength = line.length;
|
|
239
|
+
// Check semicolons (at end of statements)
|
|
240
|
+
if (/[a-zA-Z0-9)}\]'"`]\s*;$/.test(line.trim()))
|
|
241
|
+
semiCount++;
|
|
242
|
+
if (/[a-zA-Z0-9)}\]'"`]$/.test(line.trim()) && !line.trim().endsWith('{'))
|
|
243
|
+
noSemiCount++;
|
|
244
|
+
// Check quotes
|
|
245
|
+
if (line.includes("'") && !line.includes('"'))
|
|
246
|
+
singleQuoteCount++;
|
|
247
|
+
if (line.includes('"') && !line.includes("'"))
|
|
248
|
+
doubleQuoteCount++;
|
|
249
|
+
// Check trailing commas
|
|
250
|
+
if (/,\s*[}\]]/.test(line))
|
|
251
|
+
trailingCommaCount++;
|
|
252
|
+
if (/[^,\s]\s*[}\]]/.test(line))
|
|
253
|
+
noTrailingCommaCount++;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// Skip
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Determine preferences
|
|
261
|
+
const indentation = tabCount > spaceCount * 0.8 ? 'tabs' :
|
|
262
|
+
spaceCount > tabCount * 0.8 ? 'spaces' : 'mixed';
|
|
263
|
+
const indentSize = space4Count > space2Count ? 4 : 2;
|
|
264
|
+
const semicolons = semiCount > noSemiCount * 2 ? 'always' :
|
|
265
|
+
noSemiCount > semiCount * 2 ? 'never' : 'mixed';
|
|
266
|
+
const quotes = singleQuoteCount > doubleQuoteCount * 2 ? 'single' :
|
|
267
|
+
doubleQuoteCount > singleQuoteCount * 2 ? 'double' : 'mixed';
|
|
268
|
+
const trailingCommas = trailingCommaCount > noTrailingCommaCount * 2 ? 'always' :
|
|
269
|
+
noTrailingCommaCount > trailingCommaCount * 2 ? 'never' : 'mixed';
|
|
270
|
+
const result = {
|
|
271
|
+
maxLineLength,
|
|
272
|
+
indentation,
|
|
273
|
+
semicolons,
|
|
274
|
+
quotes,
|
|
275
|
+
trailingCommas,
|
|
276
|
+
};
|
|
277
|
+
if (indentation === 'spaces') {
|
|
278
|
+
result.indentSize = indentSize;
|
|
279
|
+
}
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Discover documentation standards
|
|
284
|
+
*/
|
|
285
|
+
async function discoverDocumentationStandards(files) {
|
|
286
|
+
let totalFunctions = 0;
|
|
287
|
+
let documentedFunctions = 0;
|
|
288
|
+
let typedFunctions = 0;
|
|
289
|
+
let jsdocCount = 0;
|
|
290
|
+
let tsdocCount = 0;
|
|
291
|
+
for (const file of files.slice(0, 50)) {
|
|
292
|
+
try {
|
|
293
|
+
const content = await readFile(file, 'utf-8');
|
|
294
|
+
// Count functions
|
|
295
|
+
const functions = content.match(/(?:function\s+\w+|(?:const|let|var)\s+\w+\s*=\s*(?:async\s*)?\([^)]*\)\s*=>)/g);
|
|
296
|
+
totalFunctions += functions?.length ?? 0;
|
|
297
|
+
// Count documented functions (JSDoc/TSDoc comments before functions)
|
|
298
|
+
const jsdocs = content.match(/\/\*\*[\s\S]*?\*\/\s*(?:export\s+)?(?:async\s+)?(?:function|const|let|var)/g);
|
|
299
|
+
documentedFunctions += jsdocs?.length ?? 0;
|
|
300
|
+
// Check docstring style
|
|
301
|
+
if (content.includes('@param'))
|
|
302
|
+
jsdocCount++;
|
|
303
|
+
if (content.includes('@returns'))
|
|
304
|
+
tsdocCount++;
|
|
305
|
+
// Count typed functions (TypeScript)
|
|
306
|
+
const typed = content.match(/\([^)]*:[^)]+\)\s*(?::\s*\w+)?\s*(?:=>|{)/g);
|
|
307
|
+
typedFunctions += typed?.length ?? 0;
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// Skip
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
const docstringStyle = tsdocCount > jsdocCount ? 'TSDoc' : 'JSDoc';
|
|
314
|
+
const coverage = totalFunctions > 0 ? (documentedFunctions / totalFunctions) * 100 : 0;
|
|
315
|
+
const typeHintCoverage = totalFunctions > 0 ? (typedFunctions / totalFunctions) * 100 : 0;
|
|
316
|
+
return {
|
|
317
|
+
docstringStyle,
|
|
318
|
+
coverage,
|
|
319
|
+
typeHintCoverage,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Discover testing standards
|
|
324
|
+
*/
|
|
325
|
+
async function discoverTestingStandards(rootPath) {
|
|
326
|
+
// Check for test files in various patterns
|
|
327
|
+
const patterns = [
|
|
328
|
+
'**/*.test.ts',
|
|
329
|
+
'**/*.spec.ts',
|
|
330
|
+
'**/__tests__/*.ts',
|
|
331
|
+
'**/test/*.ts',
|
|
332
|
+
'**/tests/*.ts',
|
|
333
|
+
];
|
|
334
|
+
let testPattern = '*.test.ts';
|
|
335
|
+
let maxFiles = 0;
|
|
336
|
+
for (const pattern of patterns) {
|
|
337
|
+
const files = await glob(pattern, {
|
|
338
|
+
cwd: rootPath,
|
|
339
|
+
ignore: ['**/node_modules/**'],
|
|
340
|
+
});
|
|
341
|
+
if (files.length > maxFiles) {
|
|
342
|
+
maxFiles = files.length;
|
|
343
|
+
testPattern = pattern.replace('**/', '').replace('/*.ts', '');
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Check for fixtures
|
|
347
|
+
const fixtures = await glob('**/fixtures/**/*', {
|
|
348
|
+
cwd: rootPath,
|
|
349
|
+
ignore: ['**/node_modules/**'],
|
|
350
|
+
});
|
|
351
|
+
const result = {
|
|
352
|
+
pattern: testPattern,
|
|
353
|
+
};
|
|
354
|
+
if (fixtures.length > 0) {
|
|
355
|
+
result.fixturePattern = 'fixtures/';
|
|
356
|
+
}
|
|
357
|
+
return result;
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=standards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standards.js","sourceRoot":"","sources":["../../../src/core/discover/standards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document tier classification system.
|
|
3
|
+
* Classifies documents into 5 tiers based on content structure.
|
|
4
|
+
*/
|
|
5
|
+
export declare const TIERS: readonly ["guide", "standard", "example", "reference", "admin"];
|
|
6
|
+
export type Tier = (typeof TIERS)[number];
|
|
7
|
+
export interface TierDefinition {
|
|
8
|
+
id: Tier;
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
sizeRange: {
|
|
12
|
+
min: number;
|
|
13
|
+
max: number;
|
|
14
|
+
};
|
|
15
|
+
indicators: string[];
|
|
16
|
+
headingPatterns: RegExp[];
|
|
17
|
+
}
|
|
18
|
+
export declare const TIER_DEFINITIONS: Record<Tier, TierDefinition>;
|
|
19
|
+
export interface TierClassificationResult {
|
|
20
|
+
tier: Tier;
|
|
21
|
+
confidence: number;
|
|
22
|
+
scores: Record<Tier, number>;
|
|
23
|
+
reasoning: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Classify document content into a tier
|
|
27
|
+
*/
|
|
28
|
+
export declare function classifyTier(content: string): TierClassificationResult;
|
|
29
|
+
/**
|
|
30
|
+
* Get tier definition by ID
|
|
31
|
+
*/
|
|
32
|
+
export declare function getTierDefinition(tier: Tier): TierDefinition;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a string is a valid tier
|
|
35
|
+
*/
|
|
36
|
+
export declare function isValidTier(value: string): value is Tier;
|
|
37
|
+
/**
|
|
38
|
+
* Get tier display name
|
|
39
|
+
*/
|
|
40
|
+
export declare function getTierDisplayName(tier: Tier): string;
|
|
41
|
+
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../../../src/core/domains/classifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,KAAK,iEAAkE,CAAC;AACrF,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc,CAgFzD,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CA+GtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,cAAc,CAE5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,IAAI,CAExD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAErD"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document tier classification system.
|
|
3
|
+
* Classifies documents into 5 tiers based on content structure.
|
|
4
|
+
*/
|
|
5
|
+
export const TIERS = ['guide', 'standard', 'example', 'reference', 'admin'];
|
|
6
|
+
export const TIER_DEFINITIONS = {
|
|
7
|
+
guide: {
|
|
8
|
+
id: 'guide',
|
|
9
|
+
name: 'Guide',
|
|
10
|
+
description: 'Step-by-step how-to guides',
|
|
11
|
+
sizeRange: { min: 15, max: 30 },
|
|
12
|
+
indicators: [
|
|
13
|
+
'how to', 'step by step', 'tutorial', 'guide', 'walkthrough',
|
|
14
|
+
'getting started', 'learn', 'implement', 'build', 'create',
|
|
15
|
+
],
|
|
16
|
+
headingPatterns: [
|
|
17
|
+
/^#+\s*(prerequisites?|requirements?)/i,
|
|
18
|
+
/^#+\s*(step\s*\d+|first|next|then|finally)/i,
|
|
19
|
+
/^#+\s*(overview|introduction|getting started)/i,
|
|
20
|
+
/^#+\s*(example|demo|try it)/i,
|
|
21
|
+
],
|
|
22
|
+
},
|
|
23
|
+
standard: {
|
|
24
|
+
id: 'standard',
|
|
25
|
+
name: 'Standard',
|
|
26
|
+
description: 'Coding standards and conventions',
|
|
27
|
+
sizeRange: { min: 5, max: 15 },
|
|
28
|
+
indicators: [
|
|
29
|
+
'standard', 'convention', 'rule', 'must', 'should', 'must not',
|
|
30
|
+
'should not', 'required', 'recommended', 'best practice', 'guideline',
|
|
31
|
+
],
|
|
32
|
+
headingPatterns: [
|
|
33
|
+
/^#+\s*(rules?|guidelines?|conventions?)/i,
|
|
34
|
+
/^#+\s*(do|don'?t|avoid|prefer)/i,
|
|
35
|
+
/^#+\s*(naming|formatting|style)/i,
|
|
36
|
+
/^#+\s*(required|recommended|optional)/i,
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
example: {
|
|
40
|
+
id: 'example',
|
|
41
|
+
name: 'Example',
|
|
42
|
+
description: 'Code examples and templates',
|
|
43
|
+
sizeRange: { min: 3, max: 10 },
|
|
44
|
+
indicators: [
|
|
45
|
+
'example', 'sample', 'template', 'snippet', 'code', 'demo',
|
|
46
|
+
'showcase', 'pattern example', 'usage example',
|
|
47
|
+
],
|
|
48
|
+
headingPatterns: [
|
|
49
|
+
/^#+\s*(example|sample|template)/i,
|
|
50
|
+
/^#+\s*(code|snippet|usage)/i,
|
|
51
|
+
/^#+\s*(input|output|result)/i,
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
reference: {
|
|
55
|
+
id: 'reference',
|
|
56
|
+
name: 'Reference',
|
|
57
|
+
description: 'Comprehensive references',
|
|
58
|
+
sizeRange: { min: 30, max: 100 },
|
|
59
|
+
indicators: [
|
|
60
|
+
'reference', 'specification', 'api', 'complete', 'comprehensive',
|
|
61
|
+
'all', 'full list', 'documentation', 'schema', 'interface',
|
|
62
|
+
],
|
|
63
|
+
headingPatterns: [
|
|
64
|
+
/^#+\s*(api|schema|interface|type)/i,
|
|
65
|
+
/^#+\s*(parameters?|arguments?|options?)/i,
|
|
66
|
+
/^#+\s*(methods?|functions?|endpoints?)/i,
|
|
67
|
+
/^#+\s*(properties|fields|attributes)/i,
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
admin: {
|
|
71
|
+
id: 'admin',
|
|
72
|
+
name: 'Admin',
|
|
73
|
+
description: 'Administrative/operational docs',
|
|
74
|
+
sizeRange: { min: 10, max: 20 },
|
|
75
|
+
indicators: [
|
|
76
|
+
'admin', 'administrative', 'operational', 'maintenance', 'ops',
|
|
77
|
+
'manage', 'configure', 'setup', 'deployment', 'monitoring',
|
|
78
|
+
],
|
|
79
|
+
headingPatterns: [
|
|
80
|
+
/^#+\s*(configuration|setup|installation)/i,
|
|
81
|
+
/^#+\s*(maintenance|monitoring|logging)/i,
|
|
82
|
+
/^#+\s*(backup|restore|recovery)/i,
|
|
83
|
+
/^#+\s*(troubleshooting|debugging)/i,
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Classify document content into a tier
|
|
89
|
+
*/
|
|
90
|
+
export function classifyTier(content) {
|
|
91
|
+
const scores = {
|
|
92
|
+
guide: 0,
|
|
93
|
+
standard: 0,
|
|
94
|
+
example: 0,
|
|
95
|
+
reference: 0,
|
|
96
|
+
admin: 0,
|
|
97
|
+
};
|
|
98
|
+
const reasoning = [];
|
|
99
|
+
const lowerContent = content.toLowerCase();
|
|
100
|
+
// Calculate content size in KB
|
|
101
|
+
const sizeKB = Buffer.byteLength(content, 'utf8') / 1024;
|
|
102
|
+
// Score based on indicators
|
|
103
|
+
for (const tier of TIERS) {
|
|
104
|
+
const def = TIER_DEFINITIONS[tier];
|
|
105
|
+
// Check indicators
|
|
106
|
+
for (const indicator of def.indicators) {
|
|
107
|
+
const regex = new RegExp(`\\b${escapeRegExp(indicator)}\\b`, 'gi');
|
|
108
|
+
const matches = lowerContent.match(regex);
|
|
109
|
+
if (matches) {
|
|
110
|
+
scores[tier] += matches.length * 2;
|
|
111
|
+
if (matches.length >= 3) {
|
|
112
|
+
reasoning.push(`Found indicator "${indicator}" ${matches.length} times (${tier})`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Check heading patterns
|
|
117
|
+
for (const pattern of def.headingPatterns) {
|
|
118
|
+
const matches = content.match(new RegExp(pattern.source, 'gim'));
|
|
119
|
+
if (matches) {
|
|
120
|
+
scores[tier] += matches.length * 5;
|
|
121
|
+
reasoning.push(`Matched heading pattern for ${tier}: ${matches.length} matches`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Size-based scoring
|
|
125
|
+
if (sizeKB >= def.sizeRange.min && sizeKB <= def.sizeRange.max) {
|
|
126
|
+
scores[tier] += 10;
|
|
127
|
+
reasoning.push(`Size ${sizeKB.toFixed(1)}KB matches ${tier} range`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Additional heuristics
|
|
131
|
+
// Code block ratio indicates example or reference
|
|
132
|
+
const codeBlockCount = (content.match(/```/g) ?? []).length / 2;
|
|
133
|
+
const lines = content.split('\n').length;
|
|
134
|
+
const codeRatio = codeBlockCount / (lines / 50);
|
|
135
|
+
if (codeRatio > 0.5) {
|
|
136
|
+
scores.example += 15;
|
|
137
|
+
reasoning.push('High code block ratio suggests example');
|
|
138
|
+
}
|
|
139
|
+
// Bullet/numbered list ratio indicates guide or standard
|
|
140
|
+
const listItems = (content.match(/^[\s]*[-*\d.]+\s/gm) ?? []).length;
|
|
141
|
+
const listRatio = listItems / lines;
|
|
142
|
+
if (listRatio > 0.3) {
|
|
143
|
+
scores.guide += 10;
|
|
144
|
+
scores.standard += 8;
|
|
145
|
+
reasoning.push('High list ratio suggests guide or standard');
|
|
146
|
+
}
|
|
147
|
+
// Table presence indicates reference
|
|
148
|
+
const tables = (content.match(/^\|.*\|$/gm) ?? []).length;
|
|
149
|
+
if (tables > 5) {
|
|
150
|
+
scores.reference += 15;
|
|
151
|
+
reasoning.push('Multiple tables suggest reference');
|
|
152
|
+
}
|
|
153
|
+
// Warning/Note boxes indicate admin or troubleshooting
|
|
154
|
+
const warnings = (content.match(/>\s*\*\*(warning|note|caution|important)/gi) ?? []).length;
|
|
155
|
+
if (warnings > 2) {
|
|
156
|
+
scores.admin += 10;
|
|
157
|
+
reasoning.push('Warning boxes suggest admin documentation');
|
|
158
|
+
}
|
|
159
|
+
// Find the winning tier
|
|
160
|
+
let maxScore = 0;
|
|
161
|
+
let winningTier = 'guide';
|
|
162
|
+
for (const tier of TIERS) {
|
|
163
|
+
if (scores[tier] > maxScore) {
|
|
164
|
+
maxScore = scores[tier];
|
|
165
|
+
winningTier = tier;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Calculate confidence based on score difference
|
|
169
|
+
const sortedScores = Object.values(scores).sort((a, b) => b - a);
|
|
170
|
+
const topScore = sortedScores[0] ?? 0;
|
|
171
|
+
const secondScore = sortedScores[1] ?? 0;
|
|
172
|
+
const scoreDiff = topScore - secondScore;
|
|
173
|
+
let confidence = 0.5;
|
|
174
|
+
if (topScore > 0) {
|
|
175
|
+
confidence = Math.min(0.5 + (scoreDiff / topScore) * 0.3 + (topScore / 100) * 0.2, 0.95);
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
tier: winningTier,
|
|
179
|
+
confidence,
|
|
180
|
+
scores,
|
|
181
|
+
reasoning,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get tier definition by ID
|
|
186
|
+
*/
|
|
187
|
+
export function getTierDefinition(tier) {
|
|
188
|
+
return TIER_DEFINITIONS[tier];
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Check if a string is a valid tier
|
|
192
|
+
*/
|
|
193
|
+
export function isValidTier(value) {
|
|
194
|
+
return TIERS.includes(value);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Get tier display name
|
|
198
|
+
*/
|
|
199
|
+
export function getTierDisplayName(tier) {
|
|
200
|
+
return TIER_DEFINITIONS[tier].name;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Escape special regex characters
|
|
204
|
+
*/
|
|
205
|
+
function escapeRegExp(string) {
|
|
206
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../../src/core/domains/classifier.ts"],"names":[],"mappings":"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"}
|