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.
Files changed (193) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +99 -0
  3. package/README.md +5 -5
  4. package/dist/analyzers/applicability.d.ts +19 -5
  5. package/dist/analyzers/applicability.d.ts.map +1 -1
  6. package/dist/analyzers/applicability.js +36 -24
  7. package/dist/analyzers/applicability.js.map +1 -1
  8. package/dist/analyzers/cross-language/APIContractAnalyzer.d.ts.map +1 -1
  9. package/dist/analyzers/cross-language/APIContractAnalyzer.js +23 -2
  10. package/dist/analyzers/cross-language/APIContractAnalyzer.js.map +1 -1
  11. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts +52 -9
  12. package/dist/analyzers/cross-language/DependencyGraphBuilder.d.ts.map +1 -1
  13. package/dist/analyzers/cross-language/DependencyGraphBuilder.js +228 -55
  14. package/dist/analyzers/cross-language/DependencyGraphBuilder.js.map +1 -1
  15. package/dist/analyzers/cross-language/SchemaValidator.d.ts +19 -12
  16. package/dist/analyzers/cross-language/SchemaValidator.d.ts.map +1 -1
  17. package/dist/analyzers/cross-language/SchemaValidator.js +78 -111
  18. package/dist/analyzers/cross-language/SchemaValidator.js.map +1 -1
  19. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts +0 -6
  20. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.d.ts.map +1 -1
  21. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js +85 -73
  22. package/dist/analyzers/crossDomain/CrossDomainAnalyzer.js.map +1 -1
  23. package/dist/analyzers/documentationAnalyzer.js +5 -5
  24. package/dist/analyzers/documentationAnalyzer.js.map +1 -1
  25. package/dist/analyzers/invariantsAnalyzer.d.ts.map +1 -1
  26. package/dist/analyzers/invariantsAnalyzer.js +1 -0
  27. package/dist/analyzers/invariantsAnalyzer.js.map +1 -1
  28. package/dist/analyzers/provenance.d.ts +7 -9
  29. package/dist/analyzers/provenance.d.ts.map +1 -1
  30. package/dist/analyzers/provenance.js +88 -124
  31. package/dist/analyzers/provenance.js.map +1 -1
  32. package/dist/analyzers/reactAnalyzer.d.ts.map +1 -1
  33. package/dist/analyzers/reactAnalyzer.js +120 -21
  34. package/dist/analyzers/reactAnalyzer.js.map +1 -1
  35. package/dist/analyzers/ruleRegistry.d.ts +35 -12
  36. package/dist/analyzers/ruleRegistry.d.ts.map +1 -1
  37. package/dist/analyzers/ruleRegistry.js +66 -108
  38. package/dist/analyzers/ruleRegistry.js.map +1 -1
  39. package/dist/analyzers/ruleTiming.d.ts +2 -2
  40. package/dist/analyzers/ruleTiming.js +2 -2
  41. package/dist/analyzers/universal/UniversalConventionsAnalyzer.d.ts.map +1 -1
  42. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js +60 -24
  43. package/dist/analyzers/universal/UniversalConventionsAnalyzer.js.map +1 -1
  44. package/dist/analyzers/universal/UniversalDRYAnalyzer.d.ts.map +1 -1
  45. package/dist/analyzers/universal/UniversalDRYAnalyzer.js +5 -2
  46. package/dist/analyzers/universal/UniversalDRYAnalyzer.js.map +1 -1
  47. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.d.ts.map +1 -1
  48. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js +82 -71
  49. package/dist/analyzers/universal/UniversalDataAccessAnalyzer.js.map +1 -1
  50. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts +2 -1
  51. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.d.ts.map +1 -1
  52. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js +23 -12
  53. package/dist/analyzers/universal/UniversalDocumentationAnalyzer.js.map +1 -1
  54. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts +11 -1
  55. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.d.ts.map +1 -1
  56. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js +60 -22
  57. package/dist/analyzers/universal/UniversalSOLIDAnalyzer.js.map +1 -1
  58. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  59. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +5 -2
  60. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  61. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts +2 -3
  62. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
  63. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +258 -87
  64. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
  65. package/dist/analyzers/universal/schema/codeAnalysis.d.ts.map +1 -1
  66. package/dist/analyzers/universal/schema/codeAnalysis.js +7 -1
  67. package/dist/analyzers/universal/schema/codeAnalysis.js.map +1 -1
  68. package/dist/analyzers/universal/schema/discovery.d.ts +29 -1
  69. package/dist/analyzers/universal/schema/discovery.d.ts.map +1 -1
  70. package/dist/analyzers/universal/schema/discovery.js +76 -21
  71. package/dist/analyzers/universal/schema/discovery.js.map +1 -1
  72. package/dist/analyzers/universal/schema/jsonSchema.js +7 -11
  73. package/dist/analyzers/universal/schema/jsonSchema.js.map +1 -1
  74. package/dist/auditRouter.d.ts +41 -0
  75. package/dist/auditRouter.d.ts.map +1 -0
  76. package/dist/auditRouter.js +185 -0
  77. package/dist/auditRouter.js.map +1 -0
  78. package/dist/auditRunner.d.ts.map +1 -1
  79. package/dist/auditRunner.js +93 -84
  80. package/dist/auditRunner.js.map +1 -1
  81. package/dist/cli.js +306 -95
  82. package/dist/cli.js.map +1 -1
  83. package/dist/codeIndexDB.d.ts.map +1 -1
  84. package/dist/codeIndexDB.js +41 -7
  85. package/dist/codeIndexDB.js.map +1 -1
  86. package/dist/componentScanner.d.ts.map +1 -1
  87. package/dist/componentScanner.js +2 -1
  88. package/dist/componentScanner.js.map +1 -1
  89. package/dist/config/configLoader.d.ts +9 -0
  90. package/dist/config/configLoader.d.ts.map +1 -1
  91. package/dist/config/configLoader.js +45 -2
  92. package/dist/config/configLoader.js.map +1 -1
  93. package/dist/config/defaults.d.ts +8 -1
  94. package/dist/config/defaults.d.ts.map +1 -1
  95. package/dist/config/defaults.js +19 -3
  96. package/dist/config/defaults.js.map +1 -1
  97. package/dist/dataPaths.js +18 -1
  98. package/dist/dataPaths.js.map +1 -1
  99. package/dist/enforcement/gate.d.ts +14 -19
  100. package/dist/enforcement/gate.d.ts.map +1 -1
  101. package/dist/enforcement/gate.js +27 -45
  102. package/dist/enforcement/gate.js.map +1 -1
  103. package/dist/functionScanner.d.ts.map +1 -1
  104. package/dist/functionScanner.js +1 -17
  105. package/dist/functionScanner.js.map +1 -1
  106. package/dist/invariants/ruleEngine.d.ts +8 -0
  107. package/dist/invariants/ruleEngine.d.ts.map +1 -1
  108. package/dist/invariants/ruleEngine.js +35 -16
  109. package/dist/invariants/ruleEngine.js.map +1 -1
  110. package/dist/languages/LanguageOrchestrator.d.ts +9 -10
  111. package/dist/languages/LanguageOrchestrator.d.ts.map +1 -1
  112. package/dist/languages/LanguageOrchestrator.js +135 -101
  113. package/dist/languages/LanguageOrchestrator.js.map +1 -1
  114. package/dist/languages/RuntimeManager.d.ts +28 -1
  115. package/dist/languages/RuntimeManager.d.ts.map +1 -1
  116. package/dist/languages/RuntimeManager.js +158 -47
  117. package/dist/languages/RuntimeManager.js.map +1 -1
  118. package/dist/languages/go/GoAdapter.d.ts +2 -0
  119. package/dist/languages/go/GoAdapter.d.ts.map +1 -1
  120. package/dist/languages/go/GoAdapter.js +15 -22
  121. package/dist/languages/go/GoAdapter.js.map +1 -1
  122. package/dist/languages/go/analyzer +0 -0
  123. package/dist/languages/go/analyzer-src/analyzer.go +510 -0
  124. package/dist/languages/go/analyzer-src/go.mod +3 -0
  125. package/dist/languages/go/analyzer-src/indexer.go +268 -0
  126. package/dist/languages/go/analyzer-src/parser.go +461 -0
  127. package/dist/languages/go/analyzer-src/solid.go +395 -0
  128. package/dist/languages/go/analyzer-src/testconventions.go +25 -0
  129. package/dist/languages/go/analyzer-src/types.go +148 -0
  130. package/dist/languages/go/go.mod +7 -0
  131. package/dist/languages/go/main.go +203 -0
  132. package/dist/languages/testConventions.d.ts +35 -0
  133. package/dist/languages/testConventions.d.ts.map +1 -0
  134. package/dist/languages/testConventions.js +51 -0
  135. package/dist/languages/testConventions.js.map +1 -0
  136. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts +3 -0
  137. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  138. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +25 -18
  139. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  140. package/dist/mcp-tools/whitelistTools.d.ts +1 -1
  141. package/dist/mcp-tools-shared.d.ts +0 -3
  142. package/dist/mcp-tools-shared.d.ts.map +1 -1
  143. package/dist/mcp-tools-shared.js +8 -117
  144. package/dist/mcp-tools-shared.js.map +1 -1
  145. package/dist/mcp.js +3 -1
  146. package/dist/mcp.js.map +1 -1
  147. package/dist/mcpAuditJobs.d.ts.map +1 -1
  148. package/dist/mcpAuditJobs.js +13 -0
  149. package/dist/mcpAuditJobs.js.map +1 -1
  150. package/dist/nextFile.d.ts +21 -0
  151. package/dist/nextFile.d.ts.map +1 -0
  152. package/dist/nextFile.js +51 -0
  153. package/dist/nextFile.js.map +1 -0
  154. package/dist/nextFileIncremental.d.ts +141 -0
  155. package/dist/nextFileIncremental.d.ts.map +1 -0
  156. package/dist/nextFileIncremental.js +314 -0
  157. package/dist/nextFileIncremental.js.map +1 -0
  158. package/dist/pipeline.d.ts.map +1 -1
  159. package/dist/pipeline.js +43 -3
  160. package/dist/pipeline.js.map +1 -1
  161. package/dist/pipelineAdapters.d.ts +17 -0
  162. package/dist/pipelineAdapters.d.ts.map +1 -1
  163. package/dist/pipelineAdapters.js +791 -40
  164. package/dist/pipelineAdapters.js.map +1 -1
  165. package/dist/reporting/jsonReportGenerator.d.ts.map +1 -1
  166. package/dist/reporting/jsonReportGenerator.js +11 -30
  167. package/dist/reporting/jsonReportGenerator.js.map +1 -1
  168. package/dist/styles/styleExtractor.js +2 -2
  169. package/dist/styles/styleExtractor.js.map +1 -1
  170. package/dist/styles/styleIndexer.d.ts +7 -0
  171. package/dist/styles/styleIndexer.d.ts.map +1 -1
  172. package/dist/styles/styleIndexer.js +51 -67
  173. package/dist/styles/styleIndexer.js.map +1 -1
  174. package/dist/styles/types.d.ts +3 -2
  175. package/dist/styles/types.d.ts.map +1 -1
  176. package/dist/types/crossLanguage.d.ts +1 -0
  177. package/dist/types/crossLanguage.d.ts.map +1 -1
  178. package/dist/types.d.ts +43 -34
  179. package/dist/types.d.ts.map +1 -1
  180. package/dist/types.js.map +1 -1
  181. package/dist/utils/fileDiscovery.d.ts +9 -0
  182. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  183. package/dist/utils/fileDiscovery.js +18 -0
  184. package/dist/utils/fileDiscovery.js.map +1 -1
  185. package/package.json +16 -6
  186. package/plugin/.claude-plugin/plugin.json +1 -1
  187. package/plugin/README.md +11 -9
  188. package/plugin/hooks/hooks.json +4 -0
  189. package/plugin/scripts/hook-audit.sh +20 -30
  190. package/plugin/scripts/hook-common.sh +63 -0
  191. package/plugin/scripts/hook-self-audit.sh +99 -0
  192. package/plugin/skills/code-auditor/SKILL-RULE-KINDS.md +55 -9
  193. 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
+ }