@grafema/util 0.3.0-beta
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/LICENSE +190 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +212 -0
- package/dist/api/GraphAPI.js.map +1 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +290 -0
- package/dist/api/GuaranteeAPI.js.map +1 -0
- package/dist/config/ConfigLoader.d.ts +214 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +441 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +199 -0
- package/dist/core/CoverageAnalyzer.js.map +1 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +140 -0
- package/dist/core/FileExplainer.js.map +1 -0
- package/dist/core/FileOverview.d.ts +124 -0
- package/dist/core/FileOverview.d.ts.map +1 -0
- package/dist/core/FileOverview.js +279 -0
- package/dist/core/FileOverview.js.map +1 -0
- package/dist/core/GrafemaUri.d.ts +66 -0
- package/dist/core/GrafemaUri.d.ts.map +1 -0
- package/dist/core/GrafemaUri.js +191 -0
- package/dist/core/GrafemaUri.js.map +1 -0
- package/dist/core/GraphBackend.d.ts +158 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GraphBackend.js.map +1 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +104 -0
- package/dist/core/GraphFreshnessChecker.js.map +1 -0
- package/dist/core/GuaranteeManager.d.ts +254 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +447 -0
- package/dist/core/GuaranteeManager.js.map +1 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +46 -0
- package/dist/core/HashUtils.js.map +1 -0
- package/dist/core/IncrementalReanalyzer.d.ts +33 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +67 -0
- package/dist/core/IncrementalReanalyzer.js.map +1 -0
- package/dist/core/ResourceRegistry.d.ts +17 -0
- package/dist/core/ResourceRegistry.d.ts.map +1 -0
- package/dist/core/ResourceRegistry.js +32 -0
- package/dist/core/ResourceRegistry.js.map +1 -0
- package/dist/core/SemanticId.d.ts +159 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +291 -0
- package/dist/core/SemanticId.js.map +1 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +239 -0
- package/dist/core/VersionManager.js.map +1 -0
- package/dist/core/brandNodeInternal.d.ts +14 -0
- package/dist/core/brandNodeInternal.d.ts.map +1 -0
- package/dist/core/brandNodeInternal.js +4 -0
- package/dist/core/brandNodeInternal.js.map +1 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +118 -0
- package/dist/core/nodes/GuaranteeNode.js.map +1 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +130 -0
- package/dist/core/nodes/IssueNode.js.map +1 -0
- package/dist/core/nodes/NodeKind.d.ts +104 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +166 -0
- package/dist/core/nodes/NodeKind.js.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +103 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +133 -0
- package/dist/diagnostics/DiagnosticCollector.js.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +122 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +300 -0
- package/dist/diagnostics/DiagnosticReporter.js.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +44 -0
- package/dist/diagnostics/DiagnosticWriter.js.map +1 -0
- package/dist/diagnostics/categories.d.ts +57 -0
- package/dist/diagnostics/categories.d.ts.map +1 -0
- package/dist/diagnostics/categories.js +71 -0
- package/dist/diagnostics/categories.js.map +1 -0
- package/dist/diagnostics/index.d.ts +17 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +15 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/errors/GrafemaError.d.ts +200 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +209 -0
- package/dist/errors/GrafemaError.js.map +1 -0
- package/dist/index.d.ts +75 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/index.d.ts +8 -0
- package/dist/instructions/index.d.ts.map +1 -0
- package/dist/instructions/index.js +20 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/instructions/onboarding.md +133 -0
- package/dist/knowledge/KnowledgeBase.d.ts +113 -0
- package/dist/knowledge/KnowledgeBase.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeBase.js +420 -0
- package/dist/knowledge/KnowledgeBase.js.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts +59 -0
- package/dist/knowledge/SemanticAddressResolver.d.ts.map +1 -0
- package/dist/knowledge/SemanticAddressResolver.js +160 -0
- package/dist/knowledge/SemanticAddressResolver.js.map +1 -0
- package/dist/knowledge/git-ingest.d.ts +58 -0
- package/dist/knowledge/git-ingest.d.ts.map +1 -0
- package/dist/knowledge/git-ingest.js +301 -0
- package/dist/knowledge/git-ingest.js.map +1 -0
- package/dist/knowledge/git-queries.d.ts +86 -0
- package/dist/knowledge/git-queries.d.ts.map +1 -0
- package/dist/knowledge/git-queries.js +177 -0
- package/dist/knowledge/git-queries.js.map +1 -0
- package/dist/knowledge/index.d.ts +14 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +10 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/parser.d.ts +39 -0
- package/dist/knowledge/parser.d.ts.map +1 -0
- package/dist/knowledge/parser.js +292 -0
- package/dist/knowledge/parser.js.map +1 -0
- package/dist/knowledge/types.d.ts +133 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +8 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/logging/Logger.d.ts +98 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +274 -0
- package/dist/logging/Logger.js.map +1 -0
- package/dist/notation/archetypes.d.ts +36 -0
- package/dist/notation/archetypes.d.ts.map +1 -0
- package/dist/notation/archetypes.js +173 -0
- package/dist/notation/archetypes.js.map +1 -0
- package/dist/notation/fold.d.ts +25 -0
- package/dist/notation/fold.d.ts.map +1 -0
- package/dist/notation/fold.js +598 -0
- package/dist/notation/fold.js.map +1 -0
- package/dist/notation/index.d.ts +18 -0
- package/dist/notation/index.d.ts.map +1 -0
- package/dist/notation/index.js +16 -0
- package/dist/notation/index.js.map +1 -0
- package/dist/notation/lodExtractor.d.ts +32 -0
- package/dist/notation/lodExtractor.d.ts.map +1 -0
- package/dist/notation/lodExtractor.js +149 -0
- package/dist/notation/lodExtractor.js.map +1 -0
- package/dist/notation/nameShortener.d.ts +22 -0
- package/dist/notation/nameShortener.d.ts.map +1 -0
- package/dist/notation/nameShortener.js +24 -0
- package/dist/notation/nameShortener.js.map +1 -0
- package/dist/notation/perspectives.d.ts +11 -0
- package/dist/notation/perspectives.d.ts.map +1 -0
- package/dist/notation/perspectives.js +16 -0
- package/dist/notation/perspectives.js.map +1 -0
- package/dist/notation/renderer.d.ts +31 -0
- package/dist/notation/renderer.d.ts.map +1 -0
- package/dist/notation/renderer.js +315 -0
- package/dist/notation/renderer.js.map +1 -0
- package/dist/notation/traceRenderer.d.ts +39 -0
- package/dist/notation/traceRenderer.d.ts.map +1 -0
- package/dist/notation/traceRenderer.js +358 -0
- package/dist/notation/traceRenderer.js.map +1 -0
- package/dist/notation/types.d.ts +66 -0
- package/dist/notation/types.d.ts.map +1 -0
- package/dist/notation/types.js +10 -0
- package/dist/notation/types.js.map +1 -0
- package/dist/queries/NodeContext.d.ts +81 -0
- package/dist/queries/NodeContext.d.ts.map +1 -0
- package/dist/queries/NodeContext.js +196 -0
- package/dist/queries/NodeContext.js.map +1 -0
- package/dist/queries/findCallsInFunction.d.ts +62 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +169 -0
- package/dist/queries/findCallsInFunction.js.map +1 -0
- package/dist/queries/findContainingFunction.d.ts +57 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +91 -0
- package/dist/queries/findContainingFunction.js.map +1 -0
- package/dist/queries/index.d.ts +18 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +14 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/traceDataflow.d.ts +65 -0
- package/dist/queries/traceDataflow.d.ts.map +1 -0
- package/dist/queries/traceDataflow.js +754 -0
- package/dist/queries/traceDataflow.js.map +1 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +373 -0
- package/dist/queries/traceValues.js.map +1 -0
- package/dist/queries/types.d.ts +166 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +10 -0
- package/dist/queries/types.js.map +1 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +125 -0
- package/dist/schema/GraphSchemaExtractor.js.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +113 -0
- package/dist/schema/InterfaceSchemaExtractor.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +356 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +748 -0
- package/dist/storage/backends/RFDBServerBackend.js.map +1 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +141 -0
- package/dist/storage/backends/typeValidation.js.map +1 -0
- package/dist/utils/findRfdbBinary.d.ts +67 -0
- package/dist/utils/findRfdbBinary.d.ts.map +1 -0
- package/dist/utils/findRfdbBinary.js +261 -0
- package/dist/utils/findRfdbBinary.js.map +1 -0
- package/dist/utils/lazyDownload.d.ts +43 -0
- package/dist/utils/lazyDownload.d.ts.map +1 -0
- package/dist/utils/lazyDownload.js +175 -0
- package/dist/utils/lazyDownload.js.map +1 -0
- package/dist/utils/moduleResolution.d.ts +134 -0
- package/dist/utils/moduleResolution.d.ts.map +1 -0
- package/dist/utils/moduleResolution.js +189 -0
- package/dist/utils/moduleResolution.js.map +1 -0
- package/dist/utils/resolveNodeFile.d.ts +13 -0
- package/dist/utils/resolveNodeFile.d.ts.map +1 -0
- package/dist/utils/resolveNodeFile.js +18 -0
- package/dist/utils/resolveNodeFile.js.map +1 -0
- package/dist/utils/startRfdbServer.d.ts +63 -0
- package/dist/utils/startRfdbServer.d.ts.map +1 -0
- package/dist/utils/startRfdbServer.js +142 -0
- package/dist/utils/startRfdbServer.js.map +1 -0
- package/dist/validation/PathValidator.d.ts +80 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +252 -0
- package/dist/validation/PathValidator.js.map +1 -0
- package/dist/version.d.ts +11 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +26 -0
- package/dist/version.js.map +1 -0
- package/package.json +50 -0
- package/src/api/GraphAPI.ts +307 -0
- package/src/api/GuaranteeAPI.ts +402 -0
- package/src/config/ConfigLoader.ts +653 -0
- package/src/config/index.ts +13 -0
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileOverview.ts +397 -0
- package/src/core/GrafemaUri.ts +216 -0
- package/src/core/GraphBackend.ts +266 -0
- package/src/core/GraphFreshnessChecker.ts +145 -0
- package/src/core/GuaranteeManager.ts +684 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +106 -0
- package/src/core/ResourceRegistry.ts +39 -0
- package/src/core/SemanticId.ts +423 -0
- package/src/core/VersionManager.ts +405 -0
- package/src/core/brandNodeInternal.ts +16 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/NodeKind.ts +192 -0
- package/src/diagnostics/DiagnosticCollector.ts +170 -0
- package/src/diagnostics/DiagnosticReporter.ts +395 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/categories.ts +104 -0
- package/src/diagnostics/index.ts +30 -0
- package/src/errors/GrafemaError.ts +297 -0
- package/src/index.ts +261 -0
- package/src/instructions/index.ts +21 -0
- package/src/instructions/onboarding.md +133 -0
- package/src/knowledge/KnowledgeBase.ts +486 -0
- package/src/knowledge/SemanticAddressResolver.ts +191 -0
- package/src/knowledge/git-ingest.ts +402 -0
- package/src/knowledge/git-queries.ts +269 -0
- package/src/knowledge/index.ts +29 -0
- package/src/knowledge/parser.ts +294 -0
- package/src/knowledge/types.ts +146 -0
- package/src/logging/Logger.ts +303 -0
- package/src/notation/archetypes.ts +189 -0
- package/src/notation/fold.ts +696 -0
- package/src/notation/index.ts +27 -0
- package/src/notation/lodExtractor.ts +177 -0
- package/src/notation/nameShortener.ts +24 -0
- package/src/notation/perspectives.ts +18 -0
- package/src/notation/renderer.ts +394 -0
- package/src/notation/traceRenderer.ts +458 -0
- package/src/notation/types.ts +79 -0
- package/src/queries/NodeContext.ts +280 -0
- package/src/queries/findCallsInFunction.ts +249 -0
- package/src/queries/findContainingFunction.ts +124 -0
- package/src/queries/index.ts +44 -0
- package/src/queries/traceDataflow.ts +838 -0
- package/src/queries/traceValues.ts +531 -0
- package/src/queries/types.ts +191 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +895 -0
- package/src/storage/backends/typeValidation.ts +154 -0
- package/src/utils/findRfdbBinary.ts +288 -0
- package/src/utils/lazyDownload.ts +206 -0
- package/src/utils/moduleResolution.ts +271 -0
- package/src/utils/resolveNodeFile.ts +18 -0
- package/src/utils/startRfdbServer.ts +197 -0
- package/src/validation/PathValidator.ts +334 -0
- package/src/version.ts +28 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiagnosticCollector - Collects and filters diagnostics from plugin execution
|
|
3
|
+
*
|
|
4
|
+
* The DiagnosticCollector aggregates errors from PluginResult.errors[],
|
|
5
|
+
* converting both GrafemaError instances (with rich info) and plain Error
|
|
6
|
+
* instances (treated as generic errors) into unified Diagnostic entries.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const collector = new DiagnosticCollector();
|
|
10
|
+
* collector.addFromPluginResult('INDEXING', 'JSModuleIndexer', result);
|
|
11
|
+
*
|
|
12
|
+
* if (collector.hasFatal()) {
|
|
13
|
+
* throw new Error('Fatal error detected');
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* console.log(collector.toDiagnosticsLog());
|
|
17
|
+
*/
|
|
18
|
+
import { GrafemaError } from '../errors/GrafemaError.js';
|
|
19
|
+
/**
|
|
20
|
+
* DiagnosticCollector - collects, filters, and formats diagnostics
|
|
21
|
+
*/
|
|
22
|
+
export class DiagnosticCollector {
|
|
23
|
+
diagnostics = [];
|
|
24
|
+
/**
|
|
25
|
+
* Extract errors from PluginResult and add as diagnostics.
|
|
26
|
+
*
|
|
27
|
+
* GrafemaError instances provide rich info (code, severity, context, suggestion).
|
|
28
|
+
* Plain Error instances are treated as generic errors with code 'ERR_UNKNOWN'.
|
|
29
|
+
*/
|
|
30
|
+
addFromPluginResult(phase, plugin, result) {
|
|
31
|
+
for (const error of result.errors) {
|
|
32
|
+
if (error instanceof GrafemaError) {
|
|
33
|
+
this.add({
|
|
34
|
+
code: error.code,
|
|
35
|
+
severity: error.severity,
|
|
36
|
+
message: error.message,
|
|
37
|
+
file: error.context.filePath,
|
|
38
|
+
line: error.context.lineNumber,
|
|
39
|
+
phase,
|
|
40
|
+
plugin,
|
|
41
|
+
suggestion: error.suggestion,
|
|
42
|
+
// REG-332: Pass through resolution context
|
|
43
|
+
resolutionChain: error.context.resolutionChain,
|
|
44
|
+
failureReason: error.context.failureReason,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Plain Error - treat as generic error
|
|
49
|
+
this.add({
|
|
50
|
+
code: 'ERR_UNKNOWN',
|
|
51
|
+
severity: 'error',
|
|
52
|
+
message: error.message,
|
|
53
|
+
phase,
|
|
54
|
+
plugin,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Add a diagnostic directly.
|
|
61
|
+
* Timestamp is set automatically.
|
|
62
|
+
*/
|
|
63
|
+
add(diagnostic) {
|
|
64
|
+
this.diagnostics.push({
|
|
65
|
+
...diagnostic,
|
|
66
|
+
timestamp: Date.now(),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get all diagnostics.
|
|
71
|
+
* Returns a copy to prevent external modification.
|
|
72
|
+
*/
|
|
73
|
+
getAll() {
|
|
74
|
+
return [...this.diagnostics];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get diagnostics filtered by phase.
|
|
78
|
+
*/
|
|
79
|
+
getByPhase(phase) {
|
|
80
|
+
return this.diagnostics.filter(d => d.phase === phase);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get diagnostics filtered by plugin name (case-sensitive).
|
|
84
|
+
*/
|
|
85
|
+
getByPlugin(plugin) {
|
|
86
|
+
return this.diagnostics.filter(d => d.plugin === plugin);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get diagnostics filtered by error code.
|
|
90
|
+
*/
|
|
91
|
+
getByCode(code) {
|
|
92
|
+
return this.diagnostics.filter(d => d.code === code);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if any fatal diagnostic exists.
|
|
96
|
+
* Fatal errors require immediate stop of analysis.
|
|
97
|
+
*/
|
|
98
|
+
hasFatal() {
|
|
99
|
+
return this.diagnostics.some(d => d.severity === 'fatal');
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Check if any error (including fatal) exists.
|
|
103
|
+
*/
|
|
104
|
+
hasErrors() {
|
|
105
|
+
return this.diagnostics.some(d => d.severity === 'error' || d.severity === 'fatal');
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Check if any warning exists.
|
|
109
|
+
*/
|
|
110
|
+
hasWarnings() {
|
|
111
|
+
return this.diagnostics.some(d => d.severity === 'warning');
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get total count of diagnostics.
|
|
115
|
+
*/
|
|
116
|
+
count() {
|
|
117
|
+
return this.diagnostics.length;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Format diagnostics as JSON lines (one JSON object per line).
|
|
121
|
+
* Suitable for .grafema/diagnostics.log file.
|
|
122
|
+
*/
|
|
123
|
+
toDiagnosticsLog() {
|
|
124
|
+
return this.diagnostics.map(d => JSON.stringify(d)).join('\n');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Clear all diagnostics.
|
|
128
|
+
*/
|
|
129
|
+
clear() {
|
|
130
|
+
this.diagnostics = [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=DiagnosticCollector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagnosticCollector.js","sourceRoot":"","sources":["../../src/diagnostics/DiagnosticCollector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiagnosticReporter - Formats diagnostics for output
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple output formats:
|
|
5
|
+
* - text: Human-readable format with severity indicators
|
|
6
|
+
* - json: Machine-readable JSON format for CI integration
|
|
7
|
+
* - csv: Spreadsheet-compatible format
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const reporter = new DiagnosticReporter(collector);
|
|
11
|
+
* console.log(reporter.report({ format: 'text', includeSummary: true }));
|
|
12
|
+
* console.log(reporter.summary());
|
|
13
|
+
*/
|
|
14
|
+
import type { Diagnostic, DiagnosticCollector } from './DiagnosticCollector.js';
|
|
15
|
+
/**
|
|
16
|
+
* Report output options
|
|
17
|
+
*/
|
|
18
|
+
export interface ReportOptions {
|
|
19
|
+
format: 'text' | 'json' | 'csv';
|
|
20
|
+
includeSummary?: boolean;
|
|
21
|
+
includeTrace?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Options for strict mode formatting (REG-332)
|
|
25
|
+
*/
|
|
26
|
+
export interface StrictFormatOptions {
|
|
27
|
+
/** Show resolution chain (hybrid: auto-show for ≤3 errors, hide for more) */
|
|
28
|
+
verbose?: boolean;
|
|
29
|
+
/** REG-332: Number of errors suppressed by grafema-ignore comments */
|
|
30
|
+
suppressedCount?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Summary statistics
|
|
34
|
+
*/
|
|
35
|
+
export interface SummaryStats {
|
|
36
|
+
total: number;
|
|
37
|
+
fatal: number;
|
|
38
|
+
errors: number;
|
|
39
|
+
warnings: number;
|
|
40
|
+
info: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Category count with metadata
|
|
44
|
+
*/
|
|
45
|
+
export interface CategoryCount {
|
|
46
|
+
code: string;
|
|
47
|
+
count: number;
|
|
48
|
+
name: string;
|
|
49
|
+
checkCommand: string;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Summary statistics with category breakdown
|
|
53
|
+
*/
|
|
54
|
+
export interface CategorizedSummaryStats extends SummaryStats {
|
|
55
|
+
byCode: CategoryCount[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* DiagnosticReporter - formats diagnostics for different output formats
|
|
59
|
+
*/
|
|
60
|
+
export declare class DiagnosticReporter {
|
|
61
|
+
private collector;
|
|
62
|
+
constructor(collector: DiagnosticCollector);
|
|
63
|
+
/**
|
|
64
|
+
* Generate a formatted report of all diagnostics.
|
|
65
|
+
*/
|
|
66
|
+
report(options: ReportOptions): string;
|
|
67
|
+
/**
|
|
68
|
+
* Generate a human-readable summary of diagnostic counts.
|
|
69
|
+
*/
|
|
70
|
+
summary(): string;
|
|
71
|
+
/**
|
|
72
|
+
* Generate a categorized summary with actionable commands.
|
|
73
|
+
*/
|
|
74
|
+
categorizedSummary(): string;
|
|
75
|
+
/**
|
|
76
|
+
* Get diagnostic statistics by severity.
|
|
77
|
+
*/
|
|
78
|
+
getStats(): SummaryStats;
|
|
79
|
+
/**
|
|
80
|
+
* Get diagnostic statistics grouped by category.
|
|
81
|
+
*/
|
|
82
|
+
getCategorizedStats(): CategorizedSummaryStats;
|
|
83
|
+
/**
|
|
84
|
+
* Format strict mode errors with enhanced context (REG-332).
|
|
85
|
+
* Shows resolution chain and context-aware suggestions.
|
|
86
|
+
*
|
|
87
|
+
* Uses hybrid progressive disclosure:
|
|
88
|
+
* - ≤3 errors: show chain by default
|
|
89
|
+
* - >3 errors: hide chain unless verbose=true
|
|
90
|
+
*
|
|
91
|
+
* @param diagnostics - The fatal diagnostics from strict mode
|
|
92
|
+
* @param options - Formatting options
|
|
93
|
+
* @returns Formatted string for CLI output
|
|
94
|
+
*/
|
|
95
|
+
formatStrict(diagnostics: Diagnostic[], options?: StrictFormatOptions): string;
|
|
96
|
+
/**
|
|
97
|
+
* Generate human-readable text report.
|
|
98
|
+
*/
|
|
99
|
+
private textReport;
|
|
100
|
+
/**
|
|
101
|
+
* Generate JSON report.
|
|
102
|
+
*/
|
|
103
|
+
private jsonReport;
|
|
104
|
+
/**
|
|
105
|
+
* Generate CSV report.
|
|
106
|
+
*/
|
|
107
|
+
private csvReport;
|
|
108
|
+
/**
|
|
109
|
+
* Get severity indicator for text output.
|
|
110
|
+
*/
|
|
111
|
+
private getSeverityIcon;
|
|
112
|
+
/**
|
|
113
|
+
* Format file location for display.
|
|
114
|
+
*/
|
|
115
|
+
private formatLocation;
|
|
116
|
+
/**
|
|
117
|
+
* Escape a value for CSV output.
|
|
118
|
+
* Wraps in quotes and escapes internal quotes.
|
|
119
|
+
*/
|
|
120
|
+
private csvEscape;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=DiagnosticReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagnosticReporter.d.ts","sourceRoot":"","sources":["../../src/diagnostics/DiagnosticReporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGhF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,YAAY;IAC3D,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,mBAAmB;IAElD;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM;IAYtC;;OAEG;IACH,OAAO,IAAI,MAAM;IAsBjB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IA0C5B;;OAEG;IACH,QAAQ,IAAI,YAAY;IAWxB;;OAEG;IACH,mBAAmB,IAAI,uBAAuB;IAwC9C;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM;IA+DlF;;OAEG;IACH,OAAO,CAAC,UAAU;IA0BlB;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,SAAS;IAiBjB;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;;OAGG;IACH,OAAO,CAAC,SAAS;CAKlB"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiagnosticReporter - Formats diagnostics for output
|
|
3
|
+
*
|
|
4
|
+
* Supports multiple output formats:
|
|
5
|
+
* - text: Human-readable format with severity indicators
|
|
6
|
+
* - json: Machine-readable JSON format for CI integration
|
|
7
|
+
* - csv: Spreadsheet-compatible format
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const reporter = new DiagnosticReporter(collector);
|
|
11
|
+
* console.log(reporter.report({ format: 'text', includeSummary: true }));
|
|
12
|
+
* console.log(reporter.summary());
|
|
13
|
+
*/
|
|
14
|
+
import { CODE_TO_CATEGORY } from './categories.js';
|
|
15
|
+
/**
|
|
16
|
+
* DiagnosticReporter - formats diagnostics for different output formats
|
|
17
|
+
*/
|
|
18
|
+
export class DiagnosticReporter {
|
|
19
|
+
collector;
|
|
20
|
+
constructor(collector) {
|
|
21
|
+
this.collector = collector;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Generate a formatted report of all diagnostics.
|
|
25
|
+
*/
|
|
26
|
+
report(options) {
|
|
27
|
+
const diagnostics = this.collector.getAll();
|
|
28
|
+
if (options.format === 'json') {
|
|
29
|
+
return this.jsonReport(diagnostics, options);
|
|
30
|
+
}
|
|
31
|
+
else if (options.format === 'csv') {
|
|
32
|
+
return this.csvReport(diagnostics);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return this.textReport(diagnostics, options);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate a human-readable summary of diagnostic counts.
|
|
40
|
+
*/
|
|
41
|
+
summary() {
|
|
42
|
+
const stats = this.getStats();
|
|
43
|
+
if (stats.total === 0) {
|
|
44
|
+
return 'No issues found.';
|
|
45
|
+
}
|
|
46
|
+
const parts = [];
|
|
47
|
+
if (stats.fatal > 0) {
|
|
48
|
+
parts.push(`Fatal: ${stats.fatal}`);
|
|
49
|
+
}
|
|
50
|
+
if (stats.errors > 0) {
|
|
51
|
+
parts.push(`Errors: ${stats.errors}`);
|
|
52
|
+
}
|
|
53
|
+
if (stats.warnings > 0) {
|
|
54
|
+
parts.push(`Warnings: ${stats.warnings}`);
|
|
55
|
+
}
|
|
56
|
+
return parts.join(', ');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate a categorized summary with actionable commands.
|
|
60
|
+
*/
|
|
61
|
+
categorizedSummary() {
|
|
62
|
+
const stats = this.getCategorizedStats();
|
|
63
|
+
if (stats.total === 0) {
|
|
64
|
+
return 'No issues found.';
|
|
65
|
+
}
|
|
66
|
+
const lines = [];
|
|
67
|
+
// Severity totals (same format as summary())
|
|
68
|
+
const severityParts = [];
|
|
69
|
+
if (stats.fatal > 0) {
|
|
70
|
+
severityParts.push(`Fatal: ${stats.fatal}`);
|
|
71
|
+
}
|
|
72
|
+
if (stats.errors > 0) {
|
|
73
|
+
severityParts.push(`Errors: ${stats.errors}`);
|
|
74
|
+
}
|
|
75
|
+
if (stats.warnings > 0) {
|
|
76
|
+
severityParts.push(`Warnings: ${stats.warnings}`);
|
|
77
|
+
}
|
|
78
|
+
lines.push(severityParts.join(', '));
|
|
79
|
+
// Top 5 categories
|
|
80
|
+
const topCategories = stats.byCode.slice(0, 5);
|
|
81
|
+
for (const category of topCategories) {
|
|
82
|
+
lines.push(` - ${category.count} ${category.name} (run \`${category.checkCommand}\`)`);
|
|
83
|
+
}
|
|
84
|
+
// "Other issues" if more than 5 categories
|
|
85
|
+
if (stats.byCode.length > 5) {
|
|
86
|
+
const remainingCount = stats.byCode.slice(5).reduce((sum, cat) => sum + cat.count, 0);
|
|
87
|
+
const issueWord = remainingCount === 1 ? 'other issue' : 'other issues';
|
|
88
|
+
lines.push(` - ${remainingCount} ${issueWord}`);
|
|
89
|
+
}
|
|
90
|
+
// Footer
|
|
91
|
+
lines.push('');
|
|
92
|
+
lines.push('Run `grafema check --all` for full diagnostics.');
|
|
93
|
+
return lines.join('\n');
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get diagnostic statistics by severity.
|
|
97
|
+
*/
|
|
98
|
+
getStats() {
|
|
99
|
+
const diagnostics = this.collector.getAll();
|
|
100
|
+
return {
|
|
101
|
+
total: diagnostics.length,
|
|
102
|
+
fatal: diagnostics.filter(d => d.severity === 'fatal').length,
|
|
103
|
+
errors: diagnostics.filter(d => d.severity === 'error').length,
|
|
104
|
+
warnings: diagnostics.filter(d => d.severity === 'warning').length,
|
|
105
|
+
info: diagnostics.filter(d => d.severity === 'info').length,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get diagnostic statistics grouped by category.
|
|
110
|
+
*/
|
|
111
|
+
getCategorizedStats() {
|
|
112
|
+
const diagnostics = this.collector.getAll();
|
|
113
|
+
// Get severity stats
|
|
114
|
+
const severityStats = {
|
|
115
|
+
total: diagnostics.length,
|
|
116
|
+
fatal: diagnostics.filter(d => d.severity === 'fatal').length,
|
|
117
|
+
errors: diagnostics.filter(d => d.severity === 'error').length,
|
|
118
|
+
warnings: diagnostics.filter(d => d.severity === 'warning').length,
|
|
119
|
+
info: diagnostics.filter(d => d.severity === 'info').length,
|
|
120
|
+
};
|
|
121
|
+
// Group by code
|
|
122
|
+
const codeMap = new Map();
|
|
123
|
+
for (const diag of diagnostics) {
|
|
124
|
+
const count = codeMap.get(diag.code) || 0;
|
|
125
|
+
codeMap.set(diag.code, count + 1);
|
|
126
|
+
}
|
|
127
|
+
// Convert to CategoryCount array with metadata
|
|
128
|
+
const byCode = [];
|
|
129
|
+
for (const [code, count] of codeMap.entries()) {
|
|
130
|
+
const category = CODE_TO_CATEGORY[code];
|
|
131
|
+
byCode.push({
|
|
132
|
+
code,
|
|
133
|
+
count,
|
|
134
|
+
name: category?.name || code,
|
|
135
|
+
checkCommand: category?.checkCommand || 'grafema check --all',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Sort by count descending
|
|
139
|
+
byCode.sort((a, b) => b.count - a.count);
|
|
140
|
+
return {
|
|
141
|
+
...severityStats,
|
|
142
|
+
byCode,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Format strict mode errors with enhanced context (REG-332).
|
|
147
|
+
* Shows resolution chain and context-aware suggestions.
|
|
148
|
+
*
|
|
149
|
+
* Uses hybrid progressive disclosure:
|
|
150
|
+
* - ≤3 errors: show chain by default
|
|
151
|
+
* - >3 errors: hide chain unless verbose=true
|
|
152
|
+
*
|
|
153
|
+
* @param diagnostics - The fatal diagnostics from strict mode
|
|
154
|
+
* @param options - Formatting options
|
|
155
|
+
* @returns Formatted string for CLI output
|
|
156
|
+
*/
|
|
157
|
+
formatStrict(diagnostics, options = {}) {
|
|
158
|
+
const lines = [];
|
|
159
|
+
// Hybrid: show chain for ≤3 errors unless explicitly set
|
|
160
|
+
const showChain = options.verbose ?? diagnostics.length <= 3;
|
|
161
|
+
for (const diag of diagnostics) {
|
|
162
|
+
// Header: CODE file:line
|
|
163
|
+
const location = diag.file
|
|
164
|
+
? diag.line
|
|
165
|
+
? `${diag.file}:${diag.line}`
|
|
166
|
+
: diag.file
|
|
167
|
+
: '';
|
|
168
|
+
lines.push(`${diag.code} ${location}`);
|
|
169
|
+
lines.push('');
|
|
170
|
+
// Message
|
|
171
|
+
lines.push(` ${diag.message}`);
|
|
172
|
+
// Resolution chain (if showing and present)
|
|
173
|
+
if (showChain && diag.resolutionChain && diag.resolutionChain.length > 0) {
|
|
174
|
+
lines.push('');
|
|
175
|
+
lines.push(' Resolution chain:');
|
|
176
|
+
for (const step of diag.resolutionChain) {
|
|
177
|
+
const stepLocation = step.file
|
|
178
|
+
? step.line
|
|
179
|
+
? ` (${step.file}:${step.line})`
|
|
180
|
+
: ` (${step.file})`
|
|
181
|
+
: '';
|
|
182
|
+
lines.push(` ${step.step} -> ${step.result}${stepLocation}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Suggestion (if present)
|
|
186
|
+
if (diag.suggestion) {
|
|
187
|
+
lines.push('');
|
|
188
|
+
lines.push(` Suggestion: ${diag.suggestion}`);
|
|
189
|
+
}
|
|
190
|
+
lines.push('');
|
|
191
|
+
lines.push('---');
|
|
192
|
+
lines.push('');
|
|
193
|
+
}
|
|
194
|
+
// Remove trailing separator
|
|
195
|
+
if (lines.length > 0) {
|
|
196
|
+
lines.splice(-3);
|
|
197
|
+
}
|
|
198
|
+
// Add hint about verbose mode if chain hidden
|
|
199
|
+
if (!showChain && diagnostics.some(d => d.resolutionChain && d.resolutionChain.length > 0)) {
|
|
200
|
+
lines.push('');
|
|
201
|
+
lines.push(' Run with --verbose to see resolution chains.');
|
|
202
|
+
}
|
|
203
|
+
// REG-332: Show suppression summary if any errors were suppressed
|
|
204
|
+
if (options.suppressedCount && options.suppressedCount > 0) {
|
|
205
|
+
lines.push('');
|
|
206
|
+
lines.push(` ${options.suppressedCount} error(s) suppressed by grafema-ignore comments.`);
|
|
207
|
+
}
|
|
208
|
+
return lines.join('\n');
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Generate human-readable text report.
|
|
212
|
+
*/
|
|
213
|
+
textReport(diagnostics, options) {
|
|
214
|
+
if (diagnostics.length === 0) {
|
|
215
|
+
return 'No issues found.';
|
|
216
|
+
}
|
|
217
|
+
const lines = [];
|
|
218
|
+
for (const diag of diagnostics) {
|
|
219
|
+
const icon = this.getSeverityIcon(diag.severity);
|
|
220
|
+
const location = this.formatLocation(diag);
|
|
221
|
+
lines.push(`${icon} ${diag.code} ${location} ${diag.message}`);
|
|
222
|
+
if (diag.suggestion) {
|
|
223
|
+
lines.push(` Suggestion: ${diag.suggestion}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (options.includeSummary) {
|
|
227
|
+
lines.push('');
|
|
228
|
+
lines.push(this.summary());
|
|
229
|
+
}
|
|
230
|
+
return lines.join('\n');
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Generate JSON report.
|
|
234
|
+
*/
|
|
235
|
+
jsonReport(diagnostics, options) {
|
|
236
|
+
const result = {
|
|
237
|
+
diagnostics,
|
|
238
|
+
};
|
|
239
|
+
if (options.includeSummary) {
|
|
240
|
+
result.summary = this.getStats();
|
|
241
|
+
}
|
|
242
|
+
return JSON.stringify(result, null, 2);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Generate CSV report.
|
|
246
|
+
*/
|
|
247
|
+
csvReport(diagnostics) {
|
|
248
|
+
const header = 'severity,code,file,line,message,plugin,phase,suggestion';
|
|
249
|
+
const rows = diagnostics.map(d => [
|
|
250
|
+
d.severity,
|
|
251
|
+
d.code,
|
|
252
|
+
d.file || '',
|
|
253
|
+
d.line || '',
|
|
254
|
+
this.csvEscape(d.message),
|
|
255
|
+
d.plugin,
|
|
256
|
+
d.phase,
|
|
257
|
+
d.suggestion ? this.csvEscape(d.suggestion) : '',
|
|
258
|
+
].join(','));
|
|
259
|
+
return [header, ...rows].join('\n');
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get severity indicator for text output.
|
|
263
|
+
*/
|
|
264
|
+
getSeverityIcon(severity) {
|
|
265
|
+
switch (severity) {
|
|
266
|
+
case 'fatal':
|
|
267
|
+
return '[FATAL]';
|
|
268
|
+
case 'error':
|
|
269
|
+
return '[ERROR]';
|
|
270
|
+
case 'warning':
|
|
271
|
+
return '[WARN]';
|
|
272
|
+
case 'info':
|
|
273
|
+
return '[INFO]';
|
|
274
|
+
default:
|
|
275
|
+
return '[?]';
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Format file location for display.
|
|
280
|
+
*/
|
|
281
|
+
formatLocation(diag) {
|
|
282
|
+
if (!diag.file) {
|
|
283
|
+
return '';
|
|
284
|
+
}
|
|
285
|
+
if (diag.line) {
|
|
286
|
+
return `(${diag.file}:${diag.line})`;
|
|
287
|
+
}
|
|
288
|
+
return `(${diag.file})`;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Escape a value for CSV output.
|
|
292
|
+
* Wraps in quotes and escapes internal quotes.
|
|
293
|
+
*/
|
|
294
|
+
csvEscape(value) {
|
|
295
|
+
// Always quote to handle commas and special characters
|
|
296
|
+
const escaped = value.replace(/"/g, '""');
|
|
297
|
+
return `"${escaped}"`;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=DiagnosticReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagnosticReporter.js","sourceRoot":"","sources":["../../src/diagnostics/DiagnosticReporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiagnosticWriter - Writes diagnostics to .grafema/diagnostics.log
|
|
3
|
+
*
|
|
4
|
+
* Writes diagnostics in JSON lines format (one JSON object per line).
|
|
5
|
+
* This format is:
|
|
6
|
+
* - Easy to parse line-by-line
|
|
7
|
+
* - Appendable without reading entire file
|
|
8
|
+
* - Compatible with streaming tools (grep, jq, etc.)
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const writer = new DiagnosticWriter();
|
|
12
|
+
* await writer.write(collector, '/project/.grafema');
|
|
13
|
+
*/
|
|
14
|
+
import type { DiagnosticCollector } from './DiagnosticCollector.js';
|
|
15
|
+
/**
|
|
16
|
+
* DiagnosticWriter - writes diagnostics.log file
|
|
17
|
+
*/
|
|
18
|
+
export declare class DiagnosticWriter {
|
|
19
|
+
/**
|
|
20
|
+
* Write all diagnostics to .grafema/diagnostics.log
|
|
21
|
+
*
|
|
22
|
+
* Creates the directory if it doesn't exist.
|
|
23
|
+
* Overwrites existing file.
|
|
24
|
+
*/
|
|
25
|
+
write(collector: DiagnosticCollector, grafemaDir: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Get the path to the diagnostics.log file
|
|
28
|
+
*/
|
|
29
|
+
getLogPath(grafemaDir: string): string;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=DiagnosticWriter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagnosticWriter.d.ts","sourceRoot":"","sources":["../../src/diagnostics/DiagnosticWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;;;;OAKG;IACG,KAAK,CAAC,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;CAGvC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DiagnosticWriter - Writes diagnostics to .grafema/diagnostics.log
|
|
3
|
+
*
|
|
4
|
+
* Writes diagnostics in JSON lines format (one JSON object per line).
|
|
5
|
+
* This format is:
|
|
6
|
+
* - Easy to parse line-by-line
|
|
7
|
+
* - Appendable without reading entire file
|
|
8
|
+
* - Compatible with streaming tools (grep, jq, etc.)
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* const writer = new DiagnosticWriter();
|
|
12
|
+
* await writer.write(collector, '/project/.grafema');
|
|
13
|
+
*/
|
|
14
|
+
import { writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
15
|
+
import { join, dirname } from 'path';
|
|
16
|
+
/**
|
|
17
|
+
* DiagnosticWriter - writes diagnostics.log file
|
|
18
|
+
*/
|
|
19
|
+
export class DiagnosticWriter {
|
|
20
|
+
/**
|
|
21
|
+
* Write all diagnostics to .grafema/diagnostics.log
|
|
22
|
+
*
|
|
23
|
+
* Creates the directory if it doesn't exist.
|
|
24
|
+
* Overwrites existing file.
|
|
25
|
+
*/
|
|
26
|
+
async write(collector, grafemaDir) {
|
|
27
|
+
const logPath = this.getLogPath(grafemaDir);
|
|
28
|
+
// Create directory if it doesn't exist
|
|
29
|
+
const dir = dirname(logPath);
|
|
30
|
+
if (!existsSync(dir)) {
|
|
31
|
+
mkdirSync(dir, { recursive: true });
|
|
32
|
+
}
|
|
33
|
+
// Write diagnostics as JSON lines
|
|
34
|
+
const content = collector.toDiagnosticsLog();
|
|
35
|
+
writeFileSync(logPath, content, 'utf-8');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the path to the diagnostics.log file
|
|
39
|
+
*/
|
|
40
|
+
getLogPath(grafemaDir) {
|
|
41
|
+
return join(grafemaDir, 'diagnostics.log');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=DiagnosticWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagnosticWriter.js","sourceRoot":"","sources":["../../src/diagnostics/DiagnosticWriter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIrC;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,SAA8B,EAAE,UAAkB;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAE5C,uCAAuC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,kCAAkC;QAClC,MAAM,OAAO,GAAG,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC7C,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,UAAkB;QAC3B,OAAO,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC7C,CAAC;CACF"}
|