code-auditor-mcp 3.4.18 → 3.6.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 +1 -1
- package/CHANGELOG.md +99 -0
- package/README.md +5 -5
- package/dist/analyzers/applicability.d.ts +19 -5
- package/dist/analyzers/applicability.d.ts.map +1 -1
- package/dist/analyzers/applicability.js +36 -24
- package/dist/analyzers/applicability.js.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/cross-language/APIContractAnalyzer.js +23 -2
- package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +52 -9
- package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js +228 -55
- package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.d.ts +19 -12
- package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
- package/dist/analyzers/cross-language/SchemaValidator.js +78 -111
- package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +0 -6
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +85 -73
- package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
- package/dist/analyzers/documentationAnalyzer.js +5 -5
- package/dist/analyzers/documentationAnalyzer.js.map +1 -1
- package/dist/analyzers/invariantsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/invariantsAnalyzer.js +1 -0
- package/dist/analyzers/invariantsAnalyzer.js.map +1 -1
- package/dist/analyzers/provenance.d.ts +7 -9
- package/dist/analyzers/provenance.d.ts.map +1 -1
- package/dist/analyzers/provenance.js +88 -124
- package/dist/analyzers/provenance.js.map +1 -1
- package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/reactAnalyzer.js +120 -21
- package/dist/analyzers/reactAnalyzer.js.map +1 -1
- package/dist/analyzers/ruleRegistry.d.ts +35 -12
- package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
- package/dist/analyzers/ruleRegistry.js +66 -108
- package/dist/analyzers/ruleRegistry.js.map +1 -1
- package/dist/analyzers/ruleTiming.d.ts +2 -2
- package/dist/analyzers/ruleTiming.js +2 -2
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +60 -24
- package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js +5 -2
- package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +82 -71
- package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +2 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +23 -12
- package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +11 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +60 -22
- package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +5 -2
- package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +2 -3
- package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js +258 -87
- package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/codeAnalysis.js +7 -1
- package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
- package/dist/analyzers/universal/schema/discovery.d.ts +29 -1
- package/dist/analyzers/universal/schema/discovery.d.ts.map +1 -1
- package/dist/analyzers/universal/schema/discovery.js +76 -21
- package/dist/analyzers/universal/schema/discovery.js.map +1 -1
- package/dist/analyzers/universal/schema/jsonSchema.js +7 -11
- package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -1
- package/dist/auditRouter.d.ts +41 -0
- package/dist/auditRouter.d.ts.map +1 -0
- package/dist/auditRouter.js +185 -0
- package/dist/auditRouter.js.map +1 -0
- package/dist/auditRunner.d.ts.map +1 -1
- package/dist/auditRunner.js +93 -84
- package/dist/auditRunner.js.map +1 -1
- package/dist/cli.js +306 -95
- package/dist/cli.js.map +1 -1
- package/dist/codeIndexDB.d.ts.map +1 -1
- package/dist/codeIndexDB.js +41 -7
- package/dist/codeIndexDB.js.map +1 -1
- package/dist/componentScanner.d.ts.map +1 -1
- package/dist/componentScanner.js +2 -1
- package/dist/componentScanner.js.map +1 -1
- package/dist/config/configLoader.d.ts +9 -0
- package/dist/config/configLoader.d.ts.map +1 -1
- package/dist/config/configLoader.js +45 -2
- package/dist/config/configLoader.js.map +1 -1
- package/dist/config/defaults.d.ts +8 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +19 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/dataPaths.js +18 -1
- package/dist/dataPaths.js.map +1 -1
- package/dist/enforcement/gate.d.ts +14 -19
- package/dist/enforcement/gate.d.ts.map +1 -1
- package/dist/enforcement/gate.js +27 -45
- package/dist/enforcement/gate.js.map +1 -1
- package/dist/functionScanner.d.ts.map +1 -1
- package/dist/functionScanner.js +1 -17
- package/dist/functionScanner.js.map +1 -1
- package/dist/invariants/ruleEngine.d.ts +8 -0
- package/dist/invariants/ruleEngine.d.ts.map +1 -1
- package/dist/invariants/ruleEngine.js +35 -16
- package/dist/invariants/ruleEngine.js.map +1 -1
- package/dist/languages/LanguageOrchestrator.d.ts +9 -10
- package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
- package/dist/languages/LanguageOrchestrator.js +135 -101
- package/dist/languages/LanguageOrchestrator.js.map +1 -1
- package/dist/languages/RuntimeManager.d.ts +28 -1
- package/dist/languages/RuntimeManager.d.ts.map +1 -1
- package/dist/languages/RuntimeManager.js +158 -47
- package/dist/languages/RuntimeManager.js.map +1 -1
- package/dist/languages/go/GoAdapter.d.ts +2 -0
- package/dist/languages/go/GoAdapter.d.ts.map +1 -1
- package/dist/languages/go/GoAdapter.js +15 -22
- package/dist/languages/go/GoAdapter.js.map +1 -1
- package/dist/languages/go/analyzer +0 -0
- package/dist/languages/go/analyzer-src/analyzer.go +510 -0
- package/dist/languages/go/analyzer-src/go.mod +3 -0
- package/dist/languages/go/analyzer-src/indexer.go +268 -0
- package/dist/languages/go/analyzer-src/parser.go +461 -0
- package/dist/languages/go/analyzer-src/solid.go +395 -0
- package/dist/languages/go/analyzer-src/testconventions.go +25 -0
- package/dist/languages/go/analyzer-src/types.go +148 -0
- package/dist/languages/go/go.mod +7 -0
- package/dist/languages/go/main.go +203 -0
- package/dist/languages/testConventions.d.ts +35 -0
- package/dist/languages/testConventions.d.ts.map +1 -0
- package/dist/languages/testConventions.js +51 -0
- package/dist/languages/testConventions.js.map +1 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +3 -0
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +25 -18
- package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
- package/dist/mcp-tools/whitelistTools.d.ts +1 -1
- package/dist/mcp-tools-shared.d.ts +0 -3
- package/dist/mcp-tools-shared.d.ts.map +1 -1
- package/dist/mcp-tools-shared.js +8 -117
- package/dist/mcp-tools-shared.js.map +1 -1
- package/dist/mcp.js +3 -1
- package/dist/mcp.js.map +1 -1
- package/dist/mcpAuditJobs.d.ts.map +1 -1
- package/dist/mcpAuditJobs.js +13 -0
- package/dist/mcpAuditJobs.js.map +1 -1
- package/dist/nextFile.d.ts +21 -0
- package/dist/nextFile.d.ts.map +1 -0
- package/dist/nextFile.js +51 -0
- package/dist/nextFile.js.map +1 -0
- package/dist/nextFileIncremental.d.ts +141 -0
- package/dist/nextFileIncremental.d.ts.map +1 -0
- package/dist/nextFileIncremental.js +314 -0
- package/dist/nextFileIncremental.js.map +1 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +43 -3
- package/dist/pipeline.js.map +1 -1
- package/dist/pipelineAdapters.d.ts +17 -0
- package/dist/pipelineAdapters.d.ts.map +1 -1
- package/dist/pipelineAdapters.js +791 -40
- package/dist/pipelineAdapters.js.map +1 -1
- package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
- package/dist/reporting/jsonReportGenerator.js +11 -30
- package/dist/reporting/jsonReportGenerator.js.map +1 -1
- package/dist/styles/styleExtractor.js +2 -2
- package/dist/styles/styleExtractor.js.map +1 -1
- package/dist/styles/styleIndexer.d.ts +7 -0
- package/dist/styles/styleIndexer.d.ts.map +1 -1
- package/dist/styles/styleIndexer.js +51 -67
- package/dist/styles/styleIndexer.js.map +1 -1
- package/dist/styles/types.d.ts +3 -2
- package/dist/styles/types.d.ts.map +1 -1
- package/dist/types/crossLanguage.d.ts +1 -0
- package/dist/types/crossLanguage.d.ts.map +1 -1
- package/dist/types.d.ts +43 -34
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/fileDiscovery.d.ts +9 -0
- package/dist/utils/fileDiscovery.d.ts.map +1 -1
- package/dist/utils/fileDiscovery.js +18 -0
- package/dist/utils/fileDiscovery.js.map +1 -1
- package/package.json +16 -6
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/README.md +11 -9
- package/plugin/hooks/hooks.json +4 -0
- package/plugin/scripts/hook-audit.sh +20 -30
- package/plugin/scripts/hook-common.sh +63 -0
- package/plugin/scripts/hook-self-audit.sh +99 -0
- package/plugin/skills/code-auditor/SKILL-RULE-KINDS.md +55 -9
- package/plugin/skills/code-auditor/SKILL.md +22 -23
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
package analyzer
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
// Indexer creates index entries for Go entities
|
|
9
|
+
type Indexer struct {
|
|
10
|
+
parser *Parser
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// NewIndexer creates a new indexer
|
|
14
|
+
func NewIndexer(parser *Parser) *Indexer {
|
|
15
|
+
return &Indexer{
|
|
16
|
+
parser: parser,
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// GenerateIndexEntries creates index entries for all parsed entities
|
|
21
|
+
func (i *Indexer) GenerateIndexEntries() []IndexEntry {
|
|
22
|
+
// Non-nil empty slice so zero entries serialize to [] not null.
|
|
23
|
+
entries := make([]IndexEntry, 0)
|
|
24
|
+
|
|
25
|
+
// Index functions
|
|
26
|
+
functions := i.parser.ExtractFunctions()
|
|
27
|
+
for _, function := range functions {
|
|
28
|
+
entry := i.createFunctionIndexEntry(function)
|
|
29
|
+
entries = append(entries, entry)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Index structs
|
|
33
|
+
structs := i.parser.ExtractStructs()
|
|
34
|
+
for _, structInfo := range structs {
|
|
35
|
+
entry := i.createStructIndexEntry(structInfo)
|
|
36
|
+
entries = append(entries, entry)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Index interfaces
|
|
40
|
+
interfaces := i.parser.ExtractInterfaces()
|
|
41
|
+
for _, interfaceInfo := range interfaces {
|
|
42
|
+
entry := i.createInterfaceIndexEntry(interfaceInfo)
|
|
43
|
+
entries = append(entries, entry)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return entries
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// createFunctionIndexEntry creates an index entry for a function
|
|
50
|
+
func (i *Indexer) createFunctionIndexEntry(function Function) IndexEntry {
|
|
51
|
+
return IndexEntry{
|
|
52
|
+
ID: i.generateID("function", function.File, function.Name, function.StartLine),
|
|
53
|
+
Name: function.Name,
|
|
54
|
+
Type: "function",
|
|
55
|
+
Language: "go",
|
|
56
|
+
File: function.File,
|
|
57
|
+
Signature: function.Signature,
|
|
58
|
+
Parameters: function.Parameters,
|
|
59
|
+
Purpose: function.Purpose,
|
|
60
|
+
Context: i.generateContext(function.EntityInfo),
|
|
61
|
+
StartLine: function.StartLine,
|
|
62
|
+
EndLine: function.EndLine,
|
|
63
|
+
Metadata: map[string]interface{}{
|
|
64
|
+
"isMethod": function.IsMethod,
|
|
65
|
+
"isExported": function.IsExported,
|
|
66
|
+
"receiver": function.Receiver,
|
|
67
|
+
"returnType": function.ReturnType,
|
|
68
|
+
"complexity": function.Complexity,
|
|
69
|
+
"package": function.Package,
|
|
70
|
+
"dependencies": function.Dependencies,
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// createStructIndexEntry creates an index entry for a struct
|
|
76
|
+
func (i *Indexer) createStructIndexEntry(structInfo Struct) IndexEntry {
|
|
77
|
+
return IndexEntry{
|
|
78
|
+
ID: i.generateID("struct", structInfo.File, structInfo.Name, structInfo.StartLine),
|
|
79
|
+
Name: structInfo.Name,
|
|
80
|
+
Type: "struct",
|
|
81
|
+
Language: "go",
|
|
82
|
+
File: structInfo.File,
|
|
83
|
+
Signature: structInfo.Signature,
|
|
84
|
+
Purpose: i.generateStructPurpose(structInfo),
|
|
85
|
+
Context: i.generateContext(structInfo.EntityInfo),
|
|
86
|
+
StartLine: structInfo.StartLine,
|
|
87
|
+
EndLine: structInfo.EndLine,
|
|
88
|
+
Metadata: map[string]interface{}{
|
|
89
|
+
"isExported": structInfo.IsExported,
|
|
90
|
+
"fieldCount": len(structInfo.Fields),
|
|
91
|
+
"fields": i.serializeFields(structInfo.Fields),
|
|
92
|
+
"methods": structInfo.Methods,
|
|
93
|
+
"package": structInfo.Package,
|
|
94
|
+
},
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// createInterfaceIndexEntry creates an index entry for an interface
|
|
99
|
+
func (i *Indexer) createInterfaceIndexEntry(interfaceInfo Interface) IndexEntry {
|
|
100
|
+
return IndexEntry{
|
|
101
|
+
ID: i.generateID("interface", interfaceInfo.File, interfaceInfo.Name, interfaceInfo.StartLine),
|
|
102
|
+
Name: interfaceInfo.Name,
|
|
103
|
+
Type: "interface",
|
|
104
|
+
Language: "go",
|
|
105
|
+
File: interfaceInfo.File,
|
|
106
|
+
Signature: interfaceInfo.Signature,
|
|
107
|
+
Purpose: i.generateInterfacePurpose(interfaceInfo),
|
|
108
|
+
Context: i.generateContext(interfaceInfo.EntityInfo),
|
|
109
|
+
StartLine: interfaceInfo.StartLine,
|
|
110
|
+
EndLine: interfaceInfo.EndLine,
|
|
111
|
+
Metadata: map[string]interface{}{
|
|
112
|
+
"isExported": interfaceInfo.IsExported,
|
|
113
|
+
"methodCount": len(interfaceInfo.Methods),
|
|
114
|
+
"methods": i.serializeMethods(interfaceInfo.Methods),
|
|
115
|
+
"package": interfaceInfo.Package,
|
|
116
|
+
},
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// generateID creates a unique ID for an entity
|
|
121
|
+
func (i *Indexer) generateID(entityType, file, name string, line int) string {
|
|
122
|
+
return fmt.Sprintf("go:%s:%s:%s:%d", entityType, filepath.Base(file), name, line)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// generateContext creates context information for an entity
|
|
126
|
+
func (i *Indexer) generateContext(entity EntityInfo) string {
|
|
127
|
+
return fmt.Sprintf("Go %s in package %s at %s:%d",
|
|
128
|
+
entity.Type, entity.Package, filepath.Base(entity.File), entity.StartLine)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// generateStructPurpose creates a purpose description for a struct
|
|
132
|
+
func (i *Indexer) generateStructPurpose(structInfo Struct) string {
|
|
133
|
+
if structInfo.Purpose != "" {
|
|
134
|
+
return structInfo.Purpose
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fieldCount := len(structInfo.Fields)
|
|
138
|
+
if fieldCount == 0 {
|
|
139
|
+
return fmt.Sprintf("Empty struct %s", structInfo.Name)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return fmt.Sprintf("Data structure with %d fields representing %s",
|
|
143
|
+
fieldCount, i.inferStructPurpose(structInfo))
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// generateInterfacePurpose creates a purpose description for an interface
|
|
147
|
+
func (i *Indexer) generateInterfacePurpose(interfaceInfo Interface) string {
|
|
148
|
+
if interfaceInfo.Purpose != "" {
|
|
149
|
+
return interfaceInfo.Purpose
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
methodCount := len(interfaceInfo.Methods)
|
|
153
|
+
if methodCount == 0 {
|
|
154
|
+
return fmt.Sprintf("Empty interface %s", interfaceInfo.Name)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return fmt.Sprintf("Interface defining %d methods for %s behavior",
|
|
158
|
+
methodCount, i.inferInterfacePurpose(interfaceInfo))
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// inferStructPurpose tries to infer the purpose of a struct from its name and fields
|
|
162
|
+
func (i *Indexer) inferStructPurpose(structInfo Struct) string {
|
|
163
|
+
name := structInfo.Name
|
|
164
|
+
|
|
165
|
+
// Common patterns in Go struct names
|
|
166
|
+
if containsAny(name, []string{"Config", "Configuration"}) {
|
|
167
|
+
return "configuration data"
|
|
168
|
+
}
|
|
169
|
+
if containsAny(name, []string{"Request", "Req"}) {
|
|
170
|
+
return "request data"
|
|
171
|
+
}
|
|
172
|
+
if containsAny(name, []string{"Response", "Resp"}) {
|
|
173
|
+
return "response data"
|
|
174
|
+
}
|
|
175
|
+
if containsAny(name, []string{"Handler", "Controller"}) {
|
|
176
|
+
return "request handling"
|
|
177
|
+
}
|
|
178
|
+
if containsAny(name, []string{"Service", "Manager"}) {
|
|
179
|
+
return "business logic"
|
|
180
|
+
}
|
|
181
|
+
if containsAny(name, []string{"Repository", "Repo", "Store"}) {
|
|
182
|
+
return "data access"
|
|
183
|
+
}
|
|
184
|
+
if containsAny(name, []string{"Model", "Entity"}) {
|
|
185
|
+
return "data model"
|
|
186
|
+
}
|
|
187
|
+
if containsAny(name, []string{"Client", "Adapter"}) {
|
|
188
|
+
return "external integration"
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return "entity data"
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// inferInterfacePurpose tries to infer the purpose of an interface from its name and methods
|
|
195
|
+
func (i *Indexer) inferInterfacePurpose(interfaceInfo Interface) string {
|
|
196
|
+
name := interfaceInfo.Name
|
|
197
|
+
|
|
198
|
+
// Common patterns in Go interface names
|
|
199
|
+
if containsAny(name, []string{"Reader", "Writer", "ReadWriter"}) {
|
|
200
|
+
return "I/O operations"
|
|
201
|
+
}
|
|
202
|
+
if containsAny(name, []string{"Handler", "Processor"}) {
|
|
203
|
+
return "request processing"
|
|
204
|
+
}
|
|
205
|
+
if containsAny(name, []string{"Repository", "Store"}) {
|
|
206
|
+
return "data storage"
|
|
207
|
+
}
|
|
208
|
+
if containsAny(name, []string{"Service", "Provider"}) {
|
|
209
|
+
return "service operations"
|
|
210
|
+
}
|
|
211
|
+
if containsAny(name, []string{"Client", "Adapter"}) {
|
|
212
|
+
return "external communication"
|
|
213
|
+
}
|
|
214
|
+
if containsAny(name, []string{"Validator", "Checker"}) {
|
|
215
|
+
return "validation logic"
|
|
216
|
+
}
|
|
217
|
+
if containsAny(name, []string{"Builder", "Factory"}) {
|
|
218
|
+
return "object creation"
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return "behavioral contract"
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// serializeFields converts struct fields to a serializable format
|
|
225
|
+
func (i *Indexer) serializeFields(fields []Field) []map[string]interface{} {
|
|
226
|
+
var serialized []map[string]interface{}
|
|
227
|
+
|
|
228
|
+
for _, field := range fields {
|
|
229
|
+
serialized = append(serialized, map[string]interface{}{
|
|
230
|
+
"name": field.Name,
|
|
231
|
+
"type": field.Type,
|
|
232
|
+
"tag": field.Tag,
|
|
233
|
+
"isExported": field.IsExported,
|
|
234
|
+
})
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return serialized
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// serializeMethods converts interface methods to a serializable format
|
|
241
|
+
func (i *Indexer) serializeMethods(methods []Method) []map[string]interface{} {
|
|
242
|
+
var serialized []map[string]interface{}
|
|
243
|
+
|
|
244
|
+
for _, method := range methods {
|
|
245
|
+
serialized = append(serialized, map[string]interface{}{
|
|
246
|
+
"name": method.Name,
|
|
247
|
+
"signature": method.Signature,
|
|
248
|
+
"parameters": method.Parameters,
|
|
249
|
+
"returnType": method.ReturnType,
|
|
250
|
+
})
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return serialized
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// containsAny checks if a string contains any of the given substrings
|
|
257
|
+
func containsAny(str string, substrings []string) bool {
|
|
258
|
+
for _, substring := range substrings {
|
|
259
|
+
if len(str) >= len(substring) {
|
|
260
|
+
for i := 0; i <= len(str)-len(substring); i++ {
|
|
261
|
+
if str[i:i+len(substring)] == substring {
|
|
262
|
+
return true
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return false
|
|
268
|
+
}
|