@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,447 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuaranteeManager - управление гарантиями/инвариантами кода
|
|
3
|
+
*
|
|
4
|
+
* GUARANTEE ноды хранят Datalog правила, которые код должен соблюдать.
|
|
5
|
+
* GOVERNS edges связывают гарантии с модулями, к которым они применяются.
|
|
6
|
+
*
|
|
7
|
+
* Workflow:
|
|
8
|
+
* 1. Создать гарантию (create) → GUARANTEE нода + GOVERNS edges
|
|
9
|
+
* 2. Проверить (check) → выполнить Datalog rule, найти нарушения
|
|
10
|
+
* 3. Экспортировать (export) → сохранить в YAML для version control
|
|
11
|
+
* 4. Импортировать (import) → загрузить из YAML в граф
|
|
12
|
+
* 5. Drift detection → сравнить граф с файлом
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
15
|
+
import { join, isAbsolute, relative } from 'path';
|
|
16
|
+
import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
|
|
17
|
+
import { minimatch } from 'minimatch';
|
|
18
|
+
import { brandNodeInternal } from './brandNodeInternal.js';
|
|
19
|
+
export class GuaranteeManager {
|
|
20
|
+
graph;
|
|
21
|
+
projectPath;
|
|
22
|
+
guaranteesFile;
|
|
23
|
+
constructor(graph, projectPath) {
|
|
24
|
+
this.graph = graph;
|
|
25
|
+
this.projectPath = projectPath;
|
|
26
|
+
this.guaranteesFile = join(projectPath, '.grafema', 'guarantees.yaml');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Создать новую гарантию
|
|
30
|
+
*/
|
|
31
|
+
async create(guarantee) {
|
|
32
|
+
const { id, name, rule, severity = 'warning', governs = ['**/*.js'] } = guarantee;
|
|
33
|
+
if (!id || !rule) {
|
|
34
|
+
throw new Error('Guarantee must have id and rule');
|
|
35
|
+
}
|
|
36
|
+
// Создаём GUARANTEE ноду
|
|
37
|
+
const guaranteeNode = brandNodeInternal({
|
|
38
|
+
id: `GUARANTEE:${id}`,
|
|
39
|
+
type: 'GUARANTEE',
|
|
40
|
+
name: name || id,
|
|
41
|
+
rule,
|
|
42
|
+
severity,
|
|
43
|
+
governs,
|
|
44
|
+
version: 'meta',
|
|
45
|
+
createdAt: Date.now(),
|
|
46
|
+
});
|
|
47
|
+
await this.graph.addNode(guaranteeNode);
|
|
48
|
+
// Создаём GOVERNS edges к matching модулям
|
|
49
|
+
await this._createGovernsEdges(guaranteeNode.id, governs);
|
|
50
|
+
return guaranteeNode;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Получить все гарантии из графа
|
|
54
|
+
*/
|
|
55
|
+
async list() {
|
|
56
|
+
const guarantees = [];
|
|
57
|
+
for await (const node of this.graph.queryNodes({ type: 'GUARANTEE' })) {
|
|
58
|
+
const guaranteeNode = node;
|
|
59
|
+
// Получаем GOVERNS edges для этой гарантии
|
|
60
|
+
const governsEdges = await this.graph.getOutgoingEdges(guaranteeNode.id, ['GOVERNS']);
|
|
61
|
+
const governedModules = [];
|
|
62
|
+
for (const edge of governsEdges) {
|
|
63
|
+
const targetNode = await this.graph.getNode(edge.dst);
|
|
64
|
+
if (targetNode) {
|
|
65
|
+
governedModules.push(targetNode.file || targetNode.id);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
guarantees.push({
|
|
69
|
+
...guaranteeNode,
|
|
70
|
+
governedModules
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return guarantees;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Проверить гарантию
|
|
77
|
+
*/
|
|
78
|
+
async check(guaranteeId) {
|
|
79
|
+
const fullId = guaranteeId.startsWith('GUARANTEE:') ? guaranteeId : `GUARANTEE:${guaranteeId}`;
|
|
80
|
+
const node = (await this.graph.getNode(fullId));
|
|
81
|
+
if (!node) {
|
|
82
|
+
throw new Error(`Guarantee not found: ${guaranteeId}`);
|
|
83
|
+
}
|
|
84
|
+
const startTime = Date.now();
|
|
85
|
+
let violations = [];
|
|
86
|
+
let error = null;
|
|
87
|
+
try {
|
|
88
|
+
violations = await this.graph.checkGuarantee(node.rule);
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
error = e instanceof Error ? e.message : String(e);
|
|
92
|
+
}
|
|
93
|
+
// Обогащаем violations информацией о нодах
|
|
94
|
+
const enrichedViolations = [];
|
|
95
|
+
for (const v of violations) {
|
|
96
|
+
const nodeId = v.bindings?.find(b => b.name === 'X')?.value;
|
|
97
|
+
if (nodeId) {
|
|
98
|
+
const violatingNode = await this.graph.getNode(nodeId);
|
|
99
|
+
if (violatingNode) {
|
|
100
|
+
enrichedViolations.push({
|
|
101
|
+
nodeId,
|
|
102
|
+
type: violatingNode.type,
|
|
103
|
+
name: violatingNode.name,
|
|
104
|
+
file: violatingNode.file,
|
|
105
|
+
line: violatingNode.line
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Non-node-ID binding (e.g. attr() string value) — return raw binding as violation
|
|
110
|
+
enrichedViolations.push({ nodeId, type: 'raw_binding', name: nodeId });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
guaranteeId: guaranteeId,
|
|
116
|
+
name: node.name,
|
|
117
|
+
severity: node.severity,
|
|
118
|
+
passed: violations.length === 0 && !error,
|
|
119
|
+
violationCount: violations.length,
|
|
120
|
+
violations: enrichedViolations,
|
|
121
|
+
error,
|
|
122
|
+
checkDurationMs: Date.now() - startTime
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Проверить все гарантии
|
|
127
|
+
*/
|
|
128
|
+
async checkAll() {
|
|
129
|
+
const guarantees = await this.list();
|
|
130
|
+
const results = [];
|
|
131
|
+
let passedCount = 0;
|
|
132
|
+
let failedCount = 0;
|
|
133
|
+
let errorCount = 0;
|
|
134
|
+
for (const g of guarantees) {
|
|
135
|
+
const result = await this.check(g.id);
|
|
136
|
+
results.push(result);
|
|
137
|
+
if (result.error) {
|
|
138
|
+
errorCount++;
|
|
139
|
+
}
|
|
140
|
+
else if (result.passed) {
|
|
141
|
+
passedCount++;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
failedCount++;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return {
|
|
148
|
+
total: guarantees.length,
|
|
149
|
+
passed: passedCount,
|
|
150
|
+
failed: failedCount,
|
|
151
|
+
errors: errorCount,
|
|
152
|
+
results
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Extract type references from a Datalog rule.
|
|
157
|
+
* Matches node(X, "TYPE") and edge(X, Y, "TYPE") patterns.
|
|
158
|
+
* Returns unique types array. If nothing parseable, returns empty array.
|
|
159
|
+
*/
|
|
160
|
+
extractRelevantTypes(rule) {
|
|
161
|
+
const types = new Set();
|
|
162
|
+
// Match node(X, "TYPE") or type(X, "TYPE") patterns
|
|
163
|
+
const nodePattern = /(?:node|type)\(\s*\w+\s*,\s*"([^"]+)"\s*\)/g;
|
|
164
|
+
let match;
|
|
165
|
+
while ((match = nodePattern.exec(rule)) !== null) {
|
|
166
|
+
types.add(match[1]);
|
|
167
|
+
}
|
|
168
|
+
// Match edge(X, Y, "TYPE") patterns
|
|
169
|
+
const edgePattern = /edge\(\s*\w+\s*,\s*\w+\s*,\s*"([^"]+)"\s*\)/g;
|
|
170
|
+
while ((match = edgePattern.exec(rule)) !== null) {
|
|
171
|
+
types.add(match[1]);
|
|
172
|
+
}
|
|
173
|
+
return [...types];
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Selectively check guarantees whose relevant types overlap with changedTypes.
|
|
177
|
+
* Guarantees with no parseable types are always checked (conservative).
|
|
178
|
+
* Returns CheckAllResult with total = all guarantees count,
|
|
179
|
+
* but results only for the checked subset.
|
|
180
|
+
*/
|
|
181
|
+
async checkSelective(changedTypes) {
|
|
182
|
+
const guarantees = await this.list();
|
|
183
|
+
const results = [];
|
|
184
|
+
let passedCount = 0;
|
|
185
|
+
let failedCount = 0;
|
|
186
|
+
let errorCount = 0;
|
|
187
|
+
for (const g of guarantees) {
|
|
188
|
+
const relevantTypes = this.extractRelevantTypes(g.rule);
|
|
189
|
+
// If no types parseable, check conservatively; otherwise check only if overlap
|
|
190
|
+
const shouldCheck = relevantTypes.length === 0 ||
|
|
191
|
+
relevantTypes.some(t => changedTypes.has(t));
|
|
192
|
+
if (!shouldCheck)
|
|
193
|
+
continue;
|
|
194
|
+
const result = await this.check(g.id);
|
|
195
|
+
results.push(result);
|
|
196
|
+
if (result.error) {
|
|
197
|
+
errorCount++;
|
|
198
|
+
}
|
|
199
|
+
else if (result.passed) {
|
|
200
|
+
passedCount++;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
failedCount++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
total: guarantees.length,
|
|
208
|
+
passed: passedCount,
|
|
209
|
+
failed: failedCount,
|
|
210
|
+
errors: errorCount,
|
|
211
|
+
results
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Load guarantees from the project's YAML file (.grafema/guarantees.yaml).
|
|
216
|
+
*
|
|
217
|
+
* Reads the YAML file, skips non-datalog guarantees (e.g., integration-test),
|
|
218
|
+
* and creates GUARANTEE nodes in the graph for each datalog guarantee.
|
|
219
|
+
* Idempotent: skips guarantees that already exist in the graph.
|
|
220
|
+
* Gracefully handles missing file (no error, just returns).
|
|
221
|
+
*
|
|
222
|
+
* @returns ImportResult with counts of imported and skipped guarantees
|
|
223
|
+
*/
|
|
224
|
+
async loadFromYaml() {
|
|
225
|
+
if (!existsSync(this.guaranteesFile)) {
|
|
226
|
+
return { imported: 0, skipped: 0, importedIds: [], skippedIds: [] };
|
|
227
|
+
}
|
|
228
|
+
return this.import(this.guaranteesFile);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Удалить гарантию
|
|
232
|
+
*/
|
|
233
|
+
async delete(guaranteeId) {
|
|
234
|
+
const fullId = guaranteeId.startsWith('GUARANTEE:') ? guaranteeId : `GUARANTEE:${guaranteeId}`;
|
|
235
|
+
// Удаляем GOVERNS edges
|
|
236
|
+
const edges = await this.graph.getOutgoingEdges(fullId, ['GOVERNS']);
|
|
237
|
+
for (const edge of edges) {
|
|
238
|
+
await this.graph.deleteEdge(edge.src, edge.dst, 'GOVERNS');
|
|
239
|
+
}
|
|
240
|
+
// Удаляем ноду
|
|
241
|
+
await this.graph.deleteNode(fullId);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Экспортировать гарантии в YAML файл
|
|
245
|
+
*/
|
|
246
|
+
async export(filePath = this.guaranteesFile) {
|
|
247
|
+
const guarantees = await this.list();
|
|
248
|
+
const exportData = {
|
|
249
|
+
version: 1,
|
|
250
|
+
exportedAt: new Date().toISOString(),
|
|
251
|
+
guarantees: guarantees.map(g => ({
|
|
252
|
+
id: g.id.replace('GUARANTEE:', ''),
|
|
253
|
+
name: g.name,
|
|
254
|
+
rule: g.rule,
|
|
255
|
+
severity: g.severity,
|
|
256
|
+
governs: g.governs || ['**/*.js']
|
|
257
|
+
}))
|
|
258
|
+
};
|
|
259
|
+
const yaml = stringifyYaml(exportData, { lineWidth: 0 });
|
|
260
|
+
writeFileSync(filePath, yaml, 'utf-8');
|
|
261
|
+
return filePath;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Импортировать гарантии из YAML файла
|
|
265
|
+
*/
|
|
266
|
+
async import(filePath = this.guaranteesFile, options = {}) {
|
|
267
|
+
const { clearExisting = false } = options;
|
|
268
|
+
if (!existsSync(filePath)) {
|
|
269
|
+
throw new Error(`Guarantees file not found: ${filePath}`);
|
|
270
|
+
}
|
|
271
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
272
|
+
const data = parseYaml(content);
|
|
273
|
+
if (!data.guarantees || !Array.isArray(data.guarantees)) {
|
|
274
|
+
throw new Error('Invalid guarantees file format');
|
|
275
|
+
}
|
|
276
|
+
// Удаляем существующие если нужно
|
|
277
|
+
if (clearExisting) {
|
|
278
|
+
const existing = await this.list();
|
|
279
|
+
for (const g of existing) {
|
|
280
|
+
await this.delete(g.id);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Импортируем
|
|
284
|
+
const imported = [];
|
|
285
|
+
const skipped = [];
|
|
286
|
+
for (const g of data.guarantees) {
|
|
287
|
+
// Normalize: YAML uses 'name', code expects 'id'
|
|
288
|
+
if (!g.id && g.name)
|
|
289
|
+
g.id = g.name;
|
|
290
|
+
// Skip non-Datalog guarantees (integration-test entries have no rule)
|
|
291
|
+
if (!g.rule) {
|
|
292
|
+
skipped.push(g.id || g.name || 'unknown');
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const fullId = `GUARANTEE:${g.id}`;
|
|
296
|
+
const existing = await this.graph.getNode(fullId);
|
|
297
|
+
if (existing && !clearExisting) {
|
|
298
|
+
skipped.push(g.id);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
// Default governs to all files if not specified in YAML
|
|
302
|
+
if (!g.governs) {
|
|
303
|
+
g.governs = ['**/*'];
|
|
304
|
+
}
|
|
305
|
+
await this.create(g);
|
|
306
|
+
imported.push(g.id);
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
imported: imported.length,
|
|
310
|
+
skipped: skipped.length,
|
|
311
|
+
importedIds: imported,
|
|
312
|
+
skippedIds: skipped
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Показать drift между графом и файлом
|
|
317
|
+
*/
|
|
318
|
+
async drift(filePath = this.guaranteesFile) {
|
|
319
|
+
const graphGuarantees = await this.list();
|
|
320
|
+
const graphMap = new Map(graphGuarantees.map(g => [g.id.replace('GUARANTEE:', ''), g]));
|
|
321
|
+
let fileGuarantees = [];
|
|
322
|
+
if (existsSync(filePath)) {
|
|
323
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
324
|
+
const data = parseYaml(content);
|
|
325
|
+
fileGuarantees = data.guarantees || [];
|
|
326
|
+
}
|
|
327
|
+
const fileMap = new Map(fileGuarantees.map(g => [g.id, g]));
|
|
328
|
+
const onlyInGraph = [];
|
|
329
|
+
const onlyInFile = [];
|
|
330
|
+
const modified = [];
|
|
331
|
+
const unchanged = [];
|
|
332
|
+
// Проверяем гарантии в графе
|
|
333
|
+
for (const [id, graphG] of graphMap) {
|
|
334
|
+
const fileG = fileMap.get(id);
|
|
335
|
+
if (!fileG) {
|
|
336
|
+
onlyInGraph.push(id);
|
|
337
|
+
}
|
|
338
|
+
else if (this._hasChanges(graphG, fileG)) {
|
|
339
|
+
modified.push({
|
|
340
|
+
id,
|
|
341
|
+
changes: this._describeChanges(graphG, fileG)
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
unchanged.push(id);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Проверяем гарантии только в файле
|
|
349
|
+
for (const [id] of fileMap) {
|
|
350
|
+
if (!graphMap.has(id)) {
|
|
351
|
+
onlyInFile.push(id);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
hasDrift: onlyInGraph.length > 0 || onlyInFile.length > 0 || modified.length > 0,
|
|
356
|
+
summary: {
|
|
357
|
+
onlyInGraph: onlyInGraph.length,
|
|
358
|
+
onlyInFile: onlyInFile.length,
|
|
359
|
+
modified: modified.length,
|
|
360
|
+
unchanged: unchanged.length
|
|
361
|
+
},
|
|
362
|
+
onlyInGraph,
|
|
363
|
+
onlyInFile,
|
|
364
|
+
modified,
|
|
365
|
+
unchanged
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Найти гарантии затронутые изменением ноды
|
|
370
|
+
*/
|
|
371
|
+
async findAffectedGuarantees(nodeId) {
|
|
372
|
+
const node = await this.graph.getNode(nodeId);
|
|
373
|
+
if (!node)
|
|
374
|
+
return [];
|
|
375
|
+
// Поднимаемся до MODULE
|
|
376
|
+
let moduleId = null;
|
|
377
|
+
if (node.type === 'MODULE') {
|
|
378
|
+
moduleId = node.id;
|
|
379
|
+
}
|
|
380
|
+
else if (node.file) {
|
|
381
|
+
// Ищем MODULE по file
|
|
382
|
+
for await (const m of this.graph.queryNodes({ type: 'MODULE' })) {
|
|
383
|
+
if (m.file === node.file) {
|
|
384
|
+
moduleId = m.id;
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (!moduleId)
|
|
390
|
+
return [];
|
|
391
|
+
// Находим GOVERNS edges к этому модулю
|
|
392
|
+
const incomingEdges = await this.graph.getIncomingEdges(moduleId, ['GOVERNS']);
|
|
393
|
+
return incomingEdges.map(e => e.src);
|
|
394
|
+
}
|
|
395
|
+
// ============ Private methods ============
|
|
396
|
+
/**
|
|
397
|
+
* Создать GOVERNS edges к модулям по glob patterns
|
|
398
|
+
*/
|
|
399
|
+
async _createGovernsEdges(guaranteeId, patterns) {
|
|
400
|
+
// Получаем все MODULE ноды
|
|
401
|
+
const modules = [];
|
|
402
|
+
for await (const node of this.graph.queryNodes({ type: 'MODULE' })) {
|
|
403
|
+
modules.push(node);
|
|
404
|
+
}
|
|
405
|
+
// Матчим patterns
|
|
406
|
+
for (const module of modules) {
|
|
407
|
+
const relativePath = module.file
|
|
408
|
+
? (isAbsolute(module.file) ? relative(this.projectPath, module.file) : module.file)
|
|
409
|
+
: '';
|
|
410
|
+
for (const pattern of patterns) {
|
|
411
|
+
if (minimatch(relativePath, pattern) || minimatch(module.file || '', pattern)) {
|
|
412
|
+
await this.graph.addEdge({
|
|
413
|
+
type: 'GOVERNS',
|
|
414
|
+
src: guaranteeId,
|
|
415
|
+
dst: module.id
|
|
416
|
+
});
|
|
417
|
+
break; // Один edge на модуль
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* Проверить есть ли изменения между версиями гарантии
|
|
424
|
+
*/
|
|
425
|
+
_hasChanges(graphG, fileG) {
|
|
426
|
+
return (graphG.rule !== fileG.rule ||
|
|
427
|
+
graphG.severity !== fileG.severity ||
|
|
428
|
+
graphG.name !== fileG.name ||
|
|
429
|
+
JSON.stringify(graphG.governs) !== JSON.stringify(fileG.governs));
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Описать изменения между версиями
|
|
433
|
+
*/
|
|
434
|
+
_describeChanges(graphG, fileG) {
|
|
435
|
+
const changes = [];
|
|
436
|
+
if (graphG.rule !== fileG.rule)
|
|
437
|
+
changes.push('rule');
|
|
438
|
+
if (graphG.severity !== fileG.severity)
|
|
439
|
+
changes.push('severity');
|
|
440
|
+
if (graphG.name !== fileG.name)
|
|
441
|
+
changes.push('name');
|
|
442
|
+
if (JSON.stringify(graphG.governs) !== JSON.stringify(fileG.governs))
|
|
443
|
+
changes.push('governs');
|
|
444
|
+
return changes;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
//# sourceMappingURL=GuaranteeManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GuaranteeManager.js","sourceRoot":"","sources":["../../src/core/GuaranteeManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HashUtils - unified hash computation for Grafema
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS:
|
|
5
|
+
* - 6 copies of the same hash computation existed across the codebase
|
|
6
|
+
* - Single source of truth ensures consistent hashing everywhere
|
|
7
|
+
* - Makes future algorithm changes (e.g., SHA-256 -> BLAKE3) trivial
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Calculate hash from a file path (synchronous).
|
|
11
|
+
* Returns null if file doesn't exist or is unreadable.
|
|
12
|
+
*/
|
|
13
|
+
export declare function calculateFileHash(filePath: string): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Calculate hash from a file path (asynchronous).
|
|
16
|
+
* Returns null if file doesn't exist or is unreadable.
|
|
17
|
+
*/
|
|
18
|
+
export declare function calculateFileHashAsync(filePath: string): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Calculate hash from content string.
|
|
21
|
+
* Always returns a hash (never null).
|
|
22
|
+
*/
|
|
23
|
+
export declare function calculateContentHash(content: string): string;
|
|
24
|
+
//# sourceMappingURL=HashUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashUtils.d.ts","sourceRoot":"","sources":["../../src/core/HashUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOjE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HashUtils - unified hash computation for Grafema
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS:
|
|
5
|
+
* - 6 copies of the same hash computation existed across the codebase
|
|
6
|
+
* - Single source of truth ensures consistent hashing everywhere
|
|
7
|
+
* - Makes future algorithm changes (e.g., SHA-256 -> BLAKE3) trivial
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from 'crypto';
|
|
10
|
+
import { readFileSync } from 'fs';
|
|
11
|
+
import { readFile } from 'fs/promises';
|
|
12
|
+
const HASH_ALGORITHM = 'sha256';
|
|
13
|
+
/**
|
|
14
|
+
* Calculate hash from a file path (synchronous).
|
|
15
|
+
* Returns null if file doesn't exist or is unreadable.
|
|
16
|
+
*/
|
|
17
|
+
export function calculateFileHash(filePath) {
|
|
18
|
+
try {
|
|
19
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
20
|
+
return createHash(HASH_ALGORITHM).update(content).digest('hex');
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Calculate hash from a file path (asynchronous).
|
|
28
|
+
* Returns null if file doesn't exist or is unreadable.
|
|
29
|
+
*/
|
|
30
|
+
export async function calculateFileHashAsync(filePath) {
|
|
31
|
+
try {
|
|
32
|
+
const content = await readFile(filePath, 'utf-8');
|
|
33
|
+
return createHash(HASH_ALGORITHM).update(content).digest('hex');
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Calculate hash from content string.
|
|
41
|
+
* Always returns a hash (never null).
|
|
42
|
+
*/
|
|
43
|
+
export function calculateContentHash(content) {
|
|
44
|
+
return createHash(HASH_ALGORITHM).update(content).digest('hex');
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=HashUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HashUtils.js","sourceRoot":"","sources":["../../src/core/HashUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,QAAgB;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IncrementalReanalyzer - selective re-analysis of stale modules
|
|
3
|
+
*
|
|
4
|
+
* Shells out to grafema-orchestrator for reanalysis.
|
|
5
|
+
* The Rust orchestrator handles clearing, indexing, analysis, and enrichment.
|
|
6
|
+
*/
|
|
7
|
+
import type { GraphBackend } from '@grafema/types';
|
|
8
|
+
import type { StaleModule } from './GraphFreshnessChecker.js';
|
|
9
|
+
export interface ReanalysisOptions {
|
|
10
|
+
skipEnrichment?: boolean;
|
|
11
|
+
onProgress?: (info: ReanalysisProgress) => void;
|
|
12
|
+
}
|
|
13
|
+
export interface ReanalysisProgress {
|
|
14
|
+
phase: 'clearing' | 'indexing' | 'analysis' | 'enrichment';
|
|
15
|
+
processedFiles: number;
|
|
16
|
+
totalFiles: number;
|
|
17
|
+
currentService?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ReanalysisResult {
|
|
20
|
+
modulesReanalyzed: number;
|
|
21
|
+
modulesDeleted: number;
|
|
22
|
+
nodesCreated: number;
|
|
23
|
+
edgesCreated: number;
|
|
24
|
+
nodesCleared: number;
|
|
25
|
+
durationMs: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class IncrementalReanalyzer {
|
|
28
|
+
private _graph;
|
|
29
|
+
private projectPath;
|
|
30
|
+
constructor(graph: GraphBackend, projectPath: string);
|
|
31
|
+
reanalyze(staleModules: StaleModule[], _options?: ReanalysisOptions): Promise<ReanalysisResult>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=IncrementalReanalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncrementalReanalyzer.d.ts","sourceRoot":"","sources":["../../src/core/IncrementalReanalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM;IAK9C,SAAS,CACb,YAAY,EAAE,WAAW,EAAE,EAC3B,QAAQ,GAAE,iBAAsB,GAC/B,OAAO,CAAC,gBAAgB,CAAC;CA2D7B"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IncrementalReanalyzer - selective re-analysis of stale modules
|
|
3
|
+
*
|
|
4
|
+
* Shells out to grafema-orchestrator for reanalysis.
|
|
5
|
+
* The Rust orchestrator handles clearing, indexing, analysis, and enrichment.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { findOrchestratorBinary } from '../utils/findRfdbBinary.js';
|
|
10
|
+
export class IncrementalReanalyzer {
|
|
11
|
+
_graph;
|
|
12
|
+
projectPath;
|
|
13
|
+
constructor(graph, projectPath) {
|
|
14
|
+
this._graph = graph;
|
|
15
|
+
this.projectPath = projectPath;
|
|
16
|
+
}
|
|
17
|
+
async reanalyze(staleModules, _options = {}) {
|
|
18
|
+
const startTime = Date.now();
|
|
19
|
+
if (staleModules.length === 0) {
|
|
20
|
+
return {
|
|
21
|
+
modulesReanalyzed: 0,
|
|
22
|
+
modulesDeleted: 0,
|
|
23
|
+
nodesCreated: 0,
|
|
24
|
+
edgesCreated: 0,
|
|
25
|
+
nodesCleared: 0,
|
|
26
|
+
durationMs: Date.now() - startTime,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const binary = findOrchestratorBinary();
|
|
30
|
+
if (!binary) {
|
|
31
|
+
throw new Error('grafema-orchestrator binary not found. ' +
|
|
32
|
+
'Build it with: cd packages/grafema-orchestrator && cargo build --release');
|
|
33
|
+
}
|
|
34
|
+
const socketPath = join(this.projectPath, '.grafema', 'rfdb.sock');
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
const child = spawn(binary, [
|
|
37
|
+
'analyze',
|
|
38
|
+
'--project', this.projectPath,
|
|
39
|
+
'--socket', socketPath,
|
|
40
|
+
], {
|
|
41
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
42
|
+
});
|
|
43
|
+
let stderr = '';
|
|
44
|
+
child.stderr?.on('data', (data) => {
|
|
45
|
+
stderr += data.toString();
|
|
46
|
+
});
|
|
47
|
+
child.on('error', (err) => {
|
|
48
|
+
reject(new Error(`Failed to start grafema-orchestrator: ${err.message}`));
|
|
49
|
+
});
|
|
50
|
+
child.on('close', (code) => {
|
|
51
|
+
if (code !== 0) {
|
|
52
|
+
reject(new Error(`grafema-orchestrator exited with code ${code}: ${stderr}`));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
resolve({
|
|
56
|
+
modulesReanalyzed: staleModules.filter(m => m.currentHash !== null).length,
|
|
57
|
+
modulesDeleted: staleModules.filter(m => m.currentHash === null).length,
|
|
58
|
+
nodesCreated: 0,
|
|
59
|
+
edgesCreated: 0,
|
|
60
|
+
nodesCleared: 0,
|
|
61
|
+
durationMs: Date.now() - startTime,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=IncrementalReanalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncrementalReanalyzer.js","sourceRoot":"","sources":["../../src/core/IncrementalReanalyzer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAuBpE,MAAM,OAAO,qBAAqB;IACxB,MAAM,CAAe;IACrB,WAAW,CAAS;IAE5B,YAAY,KAAmB,EAAE,WAAmB;QAClD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,SAAS,CACb,YAA2B,EAC3B,WAA8B,EAAE;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO;gBACL,iBAAiB,EAAE,CAAC;gBACpB,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;gBACf,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACnC,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,yCAAyC;gBACzC,0EAA0E,CAC3E,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAEnE,OAAO,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACvD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE;gBAC1B,SAAS;gBACT,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,UAAU;aACvB,EAAE;gBACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;YAEH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC9E,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC;oBACN,iBAAiB,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,MAAM;oBAC1E,cAAc,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,MAAM;oBACvE,YAAY,EAAE,CAAC;oBACf,YAAY,EAAE,CAAC;oBACf,YAAY,EAAE,CAAC;oBACf,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACnC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|