@grafema/types 0.1.0-alpha.4 → 0.1.1-alpha
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/dist/branded.d.ts +61 -0
- package/dist/branded.d.ts.map +1 -0
- package/dist/branded.js +34 -0
- package/dist/edges.d.ts +24 -1
- package/dist/edges.d.ts.map +1 -1
- package/dist/edges.js +7 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/nodes.d.ts +5 -1
- package/dist/nodes.d.ts.map +1 -1
- package/dist/plugins.d.ts +90 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/rfdb.d.ts +12 -1
- package/dist/rfdb.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/branded.ts +74 -0
- package/src/edges.ts +30 -1
- package/src/index.ts +3 -0
- package/src/nodes.ts +5 -1
- package/src/plugins.ts +100 -1
- package/src/rfdb.ts +14 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded Types - Type-safe node creation enforcement
|
|
3
|
+
*
|
|
4
|
+
* Branded types ensure that nodes can only be created through NodeFactory,
|
|
5
|
+
* preventing inline object creation that bypasses validation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // This compiles:
|
|
9
|
+
* const node = NodeFactory.createFunction(...);
|
|
10
|
+
* graph.addNode(node); // OK - node is BrandedNode
|
|
11
|
+
*
|
|
12
|
+
* // This fails to compile:
|
|
13
|
+
* const inline = { type: 'FUNCTION', ... };
|
|
14
|
+
* graph.addNode(inline); // ERROR - not a BrandedNode
|
|
15
|
+
*/
|
|
16
|
+
import type { BaseNodeRecord, NodeRecord } from './nodes.js';
|
|
17
|
+
/**
|
|
18
|
+
* Unique symbol for branding nodes.
|
|
19
|
+
* Declared but never actually exists at runtime - purely for type checking.
|
|
20
|
+
*/
|
|
21
|
+
declare const NODE_BRAND: unique symbol;
|
|
22
|
+
/**
|
|
23
|
+
* A branded node type that can only be created through NodeFactory.
|
|
24
|
+
*
|
|
25
|
+
* The brand is a phantom type - it exists only in TypeScript's type system
|
|
26
|
+
* and has no runtime representation. This makes it impossible to create
|
|
27
|
+
* a BrandedNode without going through a function that returns one.
|
|
28
|
+
*
|
|
29
|
+
* @template T - The specific node record type (e.g., FunctionNodeRecord)
|
|
30
|
+
*/
|
|
31
|
+
export type BrandedNode<T extends BaseNodeRecord> = T & {
|
|
32
|
+
readonly [NODE_BRAND]: true;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Union type for any branded node.
|
|
36
|
+
* Use this when you need to accept any valid node type.
|
|
37
|
+
*/
|
|
38
|
+
export type AnyBrandedNode = BrandedNode<NodeRecord>;
|
|
39
|
+
/**
|
|
40
|
+
* Helper type to extract the underlying record type from a branded node.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* type FnNode = BrandedNode<FunctionNodeRecord>;
|
|
44
|
+
* type FnRecord = UnbrandedNode<FnNode>; // FunctionNodeRecord
|
|
45
|
+
*/
|
|
46
|
+
export type UnbrandedNode<T> = T extends BrandedNode<infer U> ? U : never;
|
|
47
|
+
/**
|
|
48
|
+
* Type guard to check if a value is branded.
|
|
49
|
+
* Note: This always returns true at runtime since branding is purely type-level.
|
|
50
|
+
* It's useful for type narrowing in conditional logic.
|
|
51
|
+
*/
|
|
52
|
+
export declare function isBrandedNode<T extends BaseNodeRecord>(node: T | BrandedNode<T>): node is BrandedNode<T>;
|
|
53
|
+
/**
|
|
54
|
+
* Internal helper for NodeFactory to brand a node.
|
|
55
|
+
* This should ONLY be used inside NodeFactory methods.
|
|
56
|
+
*
|
|
57
|
+
* @internal
|
|
58
|
+
*/
|
|
59
|
+
export declare function brandNode<T extends BaseNodeRecord>(node: T): BrandedNode<T>;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=branded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"branded.d.ts","sourceRoot":"","sources":["../src/branded.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7D;;;GAGG;AACH,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAExC;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,IAAI,CAAC,GAAG;IACtD,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;CAC7B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,cAAc,EACpD,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GACvB,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAIxB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,cAAc,EAAE,IAAI,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAE3E"}
|
package/dist/branded.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded Types - Type-safe node creation enforcement
|
|
3
|
+
*
|
|
4
|
+
* Branded types ensure that nodes can only be created through NodeFactory,
|
|
5
|
+
* preventing inline object creation that bypasses validation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // This compiles:
|
|
9
|
+
* const node = NodeFactory.createFunction(...);
|
|
10
|
+
* graph.addNode(node); // OK - node is BrandedNode
|
|
11
|
+
*
|
|
12
|
+
* // This fails to compile:
|
|
13
|
+
* const inline = { type: 'FUNCTION', ... };
|
|
14
|
+
* graph.addNode(inline); // ERROR - not a BrandedNode
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Type guard to check if a value is branded.
|
|
18
|
+
* Note: This always returns true at runtime since branding is purely type-level.
|
|
19
|
+
* It's useful for type narrowing in conditional logic.
|
|
20
|
+
*/
|
|
21
|
+
export function isBrandedNode(node) {
|
|
22
|
+
// At runtime, all nodes from NodeFactory are considered branded.
|
|
23
|
+
// The actual enforcement happens at compile time.
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Internal helper for NodeFactory to brand a node.
|
|
28
|
+
* This should ONLY be used inside NodeFactory methods.
|
|
29
|
+
*
|
|
30
|
+
* @internal
|
|
31
|
+
*/
|
|
32
|
+
export function brandNode(node) {
|
|
33
|
+
return node;
|
|
34
|
+
}
|
package/dist/edges.d.ts
CHANGED
|
@@ -25,6 +25,10 @@ export declare const EDGE_TYPE: {
|
|
|
25
25
|
readonly ASSIGNED_FROM: "ASSIGNED_FROM";
|
|
26
26
|
readonly READS_FROM: "READS_FROM";
|
|
27
27
|
readonly WRITES_TO: "WRITES_TO";
|
|
28
|
+
readonly DERIVES_FROM: "DERIVES_FROM";
|
|
29
|
+
readonly FLOWS_INTO: "FLOWS_INTO";
|
|
30
|
+
readonly HAS_PROPERTY: "HAS_PROPERTY";
|
|
31
|
+
readonly HAS_ELEMENT: "HAS_ELEMENT";
|
|
28
32
|
readonly ROUTES_TO: "ROUTES_TO";
|
|
29
33
|
readonly HANDLED_BY: "HANDLED_BY";
|
|
30
34
|
readonly MAKES_REQUEST: "MAKES_REQUEST";
|
|
@@ -39,6 +43,7 @@ export declare const EDGE_TYPE: {
|
|
|
39
43
|
readonly THROWS: "THROWS";
|
|
40
44
|
readonly GOVERNS: "GOVERNS";
|
|
41
45
|
readonly VIOLATES: "VIOLATES";
|
|
46
|
+
readonly AFFECTS: "AFFECTS";
|
|
42
47
|
readonly UNKNOWN: "UNKNOWN";
|
|
43
48
|
};
|
|
44
49
|
export type EdgeType = typeof EDGE_TYPE[keyof typeof EDGE_TYPE] | string;
|
|
@@ -66,9 +71,27 @@ export interface ExportsEdge extends EdgeRecord {
|
|
|
66
71
|
exportedName?: string;
|
|
67
72
|
}
|
|
68
73
|
export interface DataFlowEdge extends EdgeRecord {
|
|
69
|
-
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT';
|
|
74
|
+
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT' | 'DERIVES_FROM' | 'FLOWS_INTO';
|
|
70
75
|
dataType?: string;
|
|
71
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Edge representing data flowing INTO a container (array, collection)
|
|
79
|
+
* Source: the value being added
|
|
80
|
+
* Destination: the container receiving the value
|
|
81
|
+
*
|
|
82
|
+
* Example: arr.push(obj) creates edge obj --FLOWS_INTO--> arr
|
|
83
|
+
*/
|
|
84
|
+
export interface FlowsIntoEdge extends EdgeRecord {
|
|
85
|
+
type: 'FLOWS_INTO';
|
|
86
|
+
mutationMethod?: 'push' | 'unshift' | 'splice' | 'indexed';
|
|
87
|
+
argIndex?: number;
|
|
88
|
+
isSpread?: boolean;
|
|
89
|
+
}
|
|
90
|
+
export interface ObjectStructureEdge extends EdgeRecord {
|
|
91
|
+
type: 'HAS_PROPERTY' | 'HAS_ELEMENT';
|
|
92
|
+
propertyName?: string;
|
|
93
|
+
elementIndex?: number;
|
|
94
|
+
}
|
|
72
95
|
export interface RouteEdge extends EdgeRecord {
|
|
73
96
|
type: 'ROUTES_TO' | 'HANDLED_BY';
|
|
74
97
|
method?: string;
|
package/dist/edges.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../src/edges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../src/edges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,OAAO,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,GAAG,MAAM,CAAC;AAGzE,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAGD,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,IAAI,EAAE,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,iBAAiB,GAAG,cAAc,GAAG,YAAY,CAAC;IACvG,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C,IAAI,EAAE,YAAY,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,IAAI,EAAE,cAAc,GAAG,aAAa,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAU,SAAQ,UAAU;IAC3C,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
package/dist/edges.js
CHANGED
|
@@ -31,6 +31,11 @@ export const EDGE_TYPE = {
|
|
|
31
31
|
ASSIGNED_FROM: 'ASSIGNED_FROM',
|
|
32
32
|
READS_FROM: 'READS_FROM',
|
|
33
33
|
WRITES_TO: 'WRITES_TO',
|
|
34
|
+
DERIVES_FROM: 'DERIVES_FROM',
|
|
35
|
+
FLOWS_INTO: 'FLOWS_INTO',
|
|
36
|
+
// Object/Array structure
|
|
37
|
+
HAS_PROPERTY: 'HAS_PROPERTY', // OBJECT_LITERAL -> property value
|
|
38
|
+
HAS_ELEMENT: 'HAS_ELEMENT', // ARRAY_LITERAL -> element
|
|
34
39
|
// HTTP/Routing
|
|
35
40
|
ROUTES_TO: 'ROUTES_TO',
|
|
36
41
|
HANDLED_BY: 'HANDLED_BY',
|
|
@@ -51,6 +56,8 @@ export const EDGE_TYPE = {
|
|
|
51
56
|
// Guarantees/Invariants
|
|
52
57
|
GOVERNS: 'GOVERNS',
|
|
53
58
|
VIOLATES: 'VIOLATES',
|
|
59
|
+
// Issues
|
|
60
|
+
AFFECTS: 'AFFECTS',
|
|
54
61
|
// Unknown/fallback
|
|
55
62
|
UNKNOWN: 'UNKNOWN',
|
|
56
63
|
};
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,YAAY,CAAC;AAG3B,cAAc,cAAc,CAAC;AAG7B,cAAc,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/nodes.d.ts
CHANGED
|
@@ -46,10 +46,10 @@ export type NamespacedNodeType = typeof NAMESPACED_TYPE[keyof typeof NAMESPACED_
|
|
|
46
46
|
export type NodeType = BaseNodeType | NamespacedNodeType | string;
|
|
47
47
|
export interface BaseNodeRecord {
|
|
48
48
|
id: string;
|
|
49
|
-
stableId?: string;
|
|
50
49
|
type: NodeType;
|
|
51
50
|
name: string;
|
|
52
51
|
file: string;
|
|
52
|
+
exported?: boolean;
|
|
53
53
|
line?: number;
|
|
54
54
|
column?: number;
|
|
55
55
|
metadata?: Record<string, unknown>;
|
|
@@ -65,6 +65,10 @@ export interface FunctionNodeRecord extends BaseNodeRecord {
|
|
|
65
65
|
isClassMethod?: boolean;
|
|
66
66
|
className?: string;
|
|
67
67
|
params?: string[];
|
|
68
|
+
paramTypes?: string[];
|
|
69
|
+
returnType?: string;
|
|
70
|
+
signature?: string;
|
|
71
|
+
jsdocSummary?: string;
|
|
68
72
|
}
|
|
69
73
|
export interface ClassNodeRecord extends BaseNodeRecord {
|
|
70
74
|
type: 'CLASS';
|
package/dist/nodes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;CA+BZ,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,OAAO,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAGpE,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;CA+BlB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AAGtF,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,kBAAkB,GAAG,MAAM,CAAC;AAIlE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,
|
|
1
|
+
{"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"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"}
|
package/dist/plugins.d.ts
CHANGED
|
@@ -3,6 +3,22 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { NodeType, NodeRecord } from './nodes.js';
|
|
5
5
|
import type { EdgeType, EdgeRecord } from './edges.js';
|
|
6
|
+
/**
|
|
7
|
+
* Log level for controlling verbosity.
|
|
8
|
+
* Levels are ordered by verbosity: silent < errors < warnings < info < debug
|
|
9
|
+
*/
|
|
10
|
+
export type LogLevel = 'silent' | 'errors' | 'warnings' | 'info' | 'debug';
|
|
11
|
+
/**
|
|
12
|
+
* Logger interface for structured logging.
|
|
13
|
+
* Plugins should use context.logger instead of console.log for controllable output.
|
|
14
|
+
*/
|
|
15
|
+
export interface Logger {
|
|
16
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
17
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
18
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
19
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
20
|
+
trace(message: string, context?: Record<string, unknown>): void;
|
|
21
|
+
}
|
|
6
22
|
export declare const PLUGIN_PHASE: {
|
|
7
23
|
readonly DISCOVERY: "DISCOVERY";
|
|
8
24
|
readonly INDEXING: "INDEXING";
|
|
@@ -21,6 +37,28 @@ export interface PluginMetadata {
|
|
|
21
37
|
};
|
|
22
38
|
dependencies?: string[];
|
|
23
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Specification for creating an issue node via reportIssue().
|
|
42
|
+
* Used by validation plugins to persist detected problems in the graph.
|
|
43
|
+
*/
|
|
44
|
+
export interface IssueSpec {
|
|
45
|
+
/** Issue category (e.g., 'security', 'performance', 'style', 'smell') */
|
|
46
|
+
category: string;
|
|
47
|
+
/** Severity level */
|
|
48
|
+
severity: 'error' | 'warning' | 'info';
|
|
49
|
+
/** Human-readable description of the issue */
|
|
50
|
+
message: string;
|
|
51
|
+
/** File where the issue was detected */
|
|
52
|
+
file: string;
|
|
53
|
+
/** Line number */
|
|
54
|
+
line: number;
|
|
55
|
+
/** Column number (optional, defaults to 0) */
|
|
56
|
+
column?: number;
|
|
57
|
+
/** ID of the node that this issue affects (creates AFFECTS edge) */
|
|
58
|
+
targetNodeId?: string;
|
|
59
|
+
/** Additional context data for the issue */
|
|
60
|
+
context?: Record<string, unknown>;
|
|
61
|
+
}
|
|
24
62
|
export interface PluginContext {
|
|
25
63
|
manifest?: unknown;
|
|
26
64
|
graph: GraphBackend;
|
|
@@ -30,6 +68,23 @@ export interface PluginContext {
|
|
|
30
68
|
onProgress?: (info: Record<string, unknown>) => void;
|
|
31
69
|
forceAnalysis?: boolean;
|
|
32
70
|
workerCount?: number;
|
|
71
|
+
/**
|
|
72
|
+
* Set of file paths already processed ("touched") in this analysis run.
|
|
73
|
+
* Used for idempotent re-analysis: first touch clears all nodes for that file,
|
|
74
|
+
* subsequent touches are no-ops. Only populated when forceAnalysis=true.
|
|
75
|
+
*/
|
|
76
|
+
touchedFiles?: Set<string>;
|
|
77
|
+
/**
|
|
78
|
+
* Logger instance for structured logging.
|
|
79
|
+
* Use this instead of console.log for controllable verbosity via CLI flags.
|
|
80
|
+
*/
|
|
81
|
+
logger?: Logger;
|
|
82
|
+
/**
|
|
83
|
+
* Report an issue to persist in the graph (VALIDATION phase only).
|
|
84
|
+
* Creates an issue:* node and optionally an AFFECTS edge to targetNodeId.
|
|
85
|
+
* @returns The ID of the created issue node
|
|
86
|
+
*/
|
|
87
|
+
reportIssue?(issue: IssueSpec): Promise<string>;
|
|
33
88
|
}
|
|
34
89
|
export interface PluginResult {
|
|
35
90
|
success: boolean;
|
|
@@ -66,6 +121,40 @@ export interface OrchestratorConfig {
|
|
|
66
121
|
parallel?: boolean;
|
|
67
122
|
maxWorkers?: number;
|
|
68
123
|
verbose?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Log level for controlling verbosity.
|
|
126
|
+
* Defaults to 'info'. Use 'silent' to suppress all output, 'debug' for verbose.
|
|
127
|
+
*/
|
|
128
|
+
logLevel?: LogLevel;
|
|
129
|
+
/**
|
|
130
|
+
* Optional explicit service definitions to bypass auto-discovery.
|
|
131
|
+
* If provided and non-empty, discovery plugins are skipped.
|
|
132
|
+
* Services are resolved relative to projectPath.
|
|
133
|
+
*/
|
|
134
|
+
services?: ServiceDefinition[];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Explicit service definition for configuration.
|
|
138
|
+
* Allows users to manually specify services when auto-discovery doesn't work.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```yaml
|
|
142
|
+
* services:
|
|
143
|
+
* - name: "backend"
|
|
144
|
+
* path: "apps/backend"
|
|
145
|
+
* entryPoint: "src/index.ts"
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export interface ServiceDefinition {
|
|
149
|
+
/** Unique service identifier (used for graph node ID) */
|
|
150
|
+
name: string;
|
|
151
|
+
/** Service directory path relative to project root */
|
|
152
|
+
path: string;
|
|
153
|
+
/**
|
|
154
|
+
* Optional entry point file path relative to service path.
|
|
155
|
+
* If omitted, auto-detected via resolveSourceEntrypoint() or package.json.main
|
|
156
|
+
*/
|
|
157
|
+
entryPoint?: string;
|
|
69
158
|
}
|
|
70
159
|
export interface InputNode {
|
|
71
160
|
id: string;
|
|
@@ -103,6 +192,7 @@ export interface GraphBackend {
|
|
|
103
192
|
checkGuarantee?(query: string): unknown[] | Promise<unknown[]>;
|
|
104
193
|
deleteNode?(id: string): Promise<void>;
|
|
105
194
|
deleteEdge?(src: string, dst: string, type: string): Promise<void>;
|
|
195
|
+
clear(): Promise<void>;
|
|
106
196
|
flush?(): Promise<void>;
|
|
107
197
|
close?(): Promise<void>;
|
|
108
198
|
}
|
package/dist/plugins.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAGzE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QACnB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAKD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACrD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/rfdb.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { NodeType } from './nodes.js';
|
|
5
5
|
import type { EdgeType } from './edges.js';
|
|
6
|
-
export type RFDBCommand = 'addNodes' | 'addEdges' | 'deleteNode' | 'deleteEdge' | 'clear' | 'updateNodeVersion' | 'getNode' | 'nodeExists' | 'findByType' | 'findByAttr' | 'queryNodes' | 'getAllNodes' | 'getAllEdges' | 'isEndpoint' | 'getNodeIdentifier' | 'neighbors' | 'bfs' | 'dfs' | 'getOutgoingEdges' | 'getIncomingEdges' | 'nodeCount' | 'edgeCount' | 'countNodesByType' | 'countEdgesByType' | 'flush' | 'compact' | 'ping' | 'shutdown' | 'datalogLoadRules' | 'datalogClearRules' | 'datalogQuery' | 'checkGuarantee';
|
|
6
|
+
export type RFDBCommand = 'addNodes' | 'addEdges' | 'deleteNode' | 'deleteEdge' | 'clear' | 'updateNodeVersion' | 'getNode' | 'nodeExists' | 'findByType' | 'findByAttr' | 'queryNodes' | 'getAllNodes' | 'getAllEdges' | 'isEndpoint' | 'getNodeIdentifier' | 'neighbors' | 'bfs' | 'dfs' | 'reachability' | 'getOutgoingEdges' | 'getIncomingEdges' | 'nodeCount' | 'edgeCount' | 'countNodesByType' | 'countEdgesByType' | 'flush' | 'compact' | 'ping' | 'shutdown' | 'datalogLoadRules' | 'datalogClearRules' | 'datalogQuery' | 'checkGuarantee';
|
|
7
7
|
export interface WireNode {
|
|
8
8
|
id: string;
|
|
9
9
|
nodeType: NodeType;
|
|
@@ -68,6 +68,13 @@ export interface BfsRequest extends RFDBRequest {
|
|
|
68
68
|
maxDepth: number;
|
|
69
69
|
edgeTypes?: EdgeType[];
|
|
70
70
|
}
|
|
71
|
+
export interface ReachabilityRequest extends RFDBRequest {
|
|
72
|
+
cmd: 'reachability';
|
|
73
|
+
startIds: string[];
|
|
74
|
+
maxDepth: number;
|
|
75
|
+
edgeTypes?: EdgeType[];
|
|
76
|
+
backward: boolean;
|
|
77
|
+
}
|
|
71
78
|
export interface GetOutgoingEdgesRequest extends RFDBRequest {
|
|
72
79
|
cmd: 'getOutgoingEdges';
|
|
73
80
|
id: string;
|
|
@@ -114,6 +121,9 @@ export interface NeighborsResponse extends RFDBResponse {
|
|
|
114
121
|
export interface BfsResponse extends RFDBResponse {
|
|
115
122
|
ids: string[];
|
|
116
123
|
}
|
|
124
|
+
export interface ReachabilityResponse extends RFDBResponse {
|
|
125
|
+
ids: string[];
|
|
126
|
+
}
|
|
117
127
|
export interface GetEdgesResponse extends RFDBResponse {
|
|
118
128
|
edges: WireEdge[];
|
|
119
129
|
}
|
|
@@ -167,6 +177,7 @@ export interface IRFDBClient {
|
|
|
167
177
|
neighbors(id: string, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
168
178
|
bfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
169
179
|
dfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
180
|
+
reachability(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[], backward?: boolean): Promise<string[]>;
|
|
170
181
|
getOutgoingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
171
182
|
getIncomingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
172
183
|
nodeCount(): Promise<number>;
|
package/dist/rfdb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rfdb.d.ts","sourceRoot":"","sources":["../src/rfdb.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rfdb.d.ts","sourceRoot":"","sources":["../src/rfdb.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/branded.ts
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Branded Types - Type-safe node creation enforcement
|
|
3
|
+
*
|
|
4
|
+
* Branded types ensure that nodes can only be created through NodeFactory,
|
|
5
|
+
* preventing inline object creation that bypasses validation.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* // This compiles:
|
|
9
|
+
* const node = NodeFactory.createFunction(...);
|
|
10
|
+
* graph.addNode(node); // OK - node is BrandedNode
|
|
11
|
+
*
|
|
12
|
+
* // This fails to compile:
|
|
13
|
+
* const inline = { type: 'FUNCTION', ... };
|
|
14
|
+
* graph.addNode(inline); // ERROR - not a BrandedNode
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { BaseNodeRecord, NodeRecord } from './nodes.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Unique symbol for branding nodes.
|
|
21
|
+
* Declared but never actually exists at runtime - purely for type checking.
|
|
22
|
+
*/
|
|
23
|
+
declare const NODE_BRAND: unique symbol;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A branded node type that can only be created through NodeFactory.
|
|
27
|
+
*
|
|
28
|
+
* The brand is a phantom type - it exists only in TypeScript's type system
|
|
29
|
+
* and has no runtime representation. This makes it impossible to create
|
|
30
|
+
* a BrandedNode without going through a function that returns one.
|
|
31
|
+
*
|
|
32
|
+
* @template T - The specific node record type (e.g., FunctionNodeRecord)
|
|
33
|
+
*/
|
|
34
|
+
export type BrandedNode<T extends BaseNodeRecord> = T & {
|
|
35
|
+
readonly [NODE_BRAND]: true;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Union type for any branded node.
|
|
40
|
+
* Use this when you need to accept any valid node type.
|
|
41
|
+
*/
|
|
42
|
+
export type AnyBrandedNode = BrandedNode<NodeRecord>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Helper type to extract the underlying record type from a branded node.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* type FnNode = BrandedNode<FunctionNodeRecord>;
|
|
49
|
+
* type FnRecord = UnbrandedNode<FnNode>; // FunctionNodeRecord
|
|
50
|
+
*/
|
|
51
|
+
export type UnbrandedNode<T> = T extends BrandedNode<infer U> ? U : never;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Type guard to check if a value is branded.
|
|
55
|
+
* Note: This always returns true at runtime since branding is purely type-level.
|
|
56
|
+
* It's useful for type narrowing in conditional logic.
|
|
57
|
+
*/
|
|
58
|
+
export function isBrandedNode<T extends BaseNodeRecord>(
|
|
59
|
+
node: T | BrandedNode<T>
|
|
60
|
+
): node is BrandedNode<T> {
|
|
61
|
+
// At runtime, all nodes from NodeFactory are considered branded.
|
|
62
|
+
// The actual enforcement happens at compile time.
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Internal helper for NodeFactory to brand a node.
|
|
68
|
+
* This should ONLY be used inside NodeFactory methods.
|
|
69
|
+
*
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
export function brandNode<T extends BaseNodeRecord>(node: T): BrandedNode<T> {
|
|
73
|
+
return node as BrandedNode<T>;
|
|
74
|
+
}
|
package/src/edges.ts
CHANGED
|
@@ -36,6 +36,12 @@ export const EDGE_TYPE = {
|
|
|
36
36
|
ASSIGNED_FROM: 'ASSIGNED_FROM',
|
|
37
37
|
READS_FROM: 'READS_FROM',
|
|
38
38
|
WRITES_TO: 'WRITES_TO',
|
|
39
|
+
DERIVES_FROM: 'DERIVES_FROM',
|
|
40
|
+
FLOWS_INTO: 'FLOWS_INTO',
|
|
41
|
+
|
|
42
|
+
// Object/Array structure
|
|
43
|
+
HAS_PROPERTY: 'HAS_PROPERTY', // OBJECT_LITERAL -> property value
|
|
44
|
+
HAS_ELEMENT: 'HAS_ELEMENT', // ARRAY_LITERAL -> element
|
|
39
45
|
|
|
40
46
|
// HTTP/Routing
|
|
41
47
|
ROUTES_TO: 'ROUTES_TO',
|
|
@@ -63,6 +69,9 @@ export const EDGE_TYPE = {
|
|
|
63
69
|
GOVERNS: 'GOVERNS',
|
|
64
70
|
VIOLATES: 'VIOLATES',
|
|
65
71
|
|
|
72
|
+
// Issues
|
|
73
|
+
AFFECTS: 'AFFECTS',
|
|
74
|
+
|
|
66
75
|
// Unknown/fallback
|
|
67
76
|
UNKNOWN: 'UNKNOWN',
|
|
68
77
|
} as const;
|
|
@@ -100,10 +109,30 @@ export interface ExportsEdge extends EdgeRecord {
|
|
|
100
109
|
}
|
|
101
110
|
|
|
102
111
|
export interface DataFlowEdge extends EdgeRecord {
|
|
103
|
-
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT';
|
|
112
|
+
type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT' | 'DERIVES_FROM' | 'FLOWS_INTO';
|
|
104
113
|
dataType?: string;
|
|
105
114
|
}
|
|
106
115
|
|
|
116
|
+
/**
|
|
117
|
+
* Edge representing data flowing INTO a container (array, collection)
|
|
118
|
+
* Source: the value being added
|
|
119
|
+
* Destination: the container receiving the value
|
|
120
|
+
*
|
|
121
|
+
* Example: arr.push(obj) creates edge obj --FLOWS_INTO--> arr
|
|
122
|
+
*/
|
|
123
|
+
export interface FlowsIntoEdge extends EdgeRecord {
|
|
124
|
+
type: 'FLOWS_INTO';
|
|
125
|
+
mutationMethod?: 'push' | 'unshift' | 'splice' | 'indexed';
|
|
126
|
+
argIndex?: number;
|
|
127
|
+
isSpread?: boolean;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface ObjectStructureEdge extends EdgeRecord {
|
|
131
|
+
type: 'HAS_PROPERTY' | 'HAS_ELEMENT';
|
|
132
|
+
propertyName?: string; // For HAS_PROPERTY
|
|
133
|
+
elementIndex?: number; // For HAS_ELEMENT
|
|
134
|
+
}
|
|
135
|
+
|
|
107
136
|
export interface RouteEdge extends EdgeRecord {
|
|
108
137
|
type: 'ROUTES_TO' | 'HANDLED_BY';
|
|
109
138
|
method?: string;
|
package/src/index.ts
CHANGED
package/src/nodes.ts
CHANGED
|
@@ -81,10 +81,10 @@ export type NodeType = BaseNodeType | NamespacedNodeType | string;
|
|
|
81
81
|
// Base interface for all nodes
|
|
82
82
|
export interface BaseNodeRecord {
|
|
83
83
|
id: string;
|
|
84
|
-
stableId?: string;
|
|
85
84
|
type: NodeType;
|
|
86
85
|
name: string;
|
|
87
86
|
file: string;
|
|
87
|
+
exported?: boolean; // Optional - some nodes may not have export status
|
|
88
88
|
line?: number; // Optional - not always available
|
|
89
89
|
column?: number;
|
|
90
90
|
metadata?: Record<string, unknown>;
|
|
@@ -103,6 +103,10 @@ export interface FunctionNodeRecord extends BaseNodeRecord {
|
|
|
103
103
|
isClassMethod?: boolean;
|
|
104
104
|
className?: string;
|
|
105
105
|
params?: string[];
|
|
106
|
+
paramTypes?: string[]; // Types for each param
|
|
107
|
+
returnType?: string; // Return type
|
|
108
|
+
signature?: string; // Full signature: "(a: T) => R"
|
|
109
|
+
jsdocSummary?: string; // First line of JSDoc
|
|
106
110
|
}
|
|
107
111
|
|
|
108
112
|
// Class node
|
package/src/plugins.ts
CHANGED
|
@@ -5,6 +5,26 @@
|
|
|
5
5
|
import type { NodeType, NodeRecord } from './nodes.js';
|
|
6
6
|
import type { EdgeType, EdgeRecord } from './edges.js';
|
|
7
7
|
|
|
8
|
+
// === LOG LEVEL ===
|
|
9
|
+
/**
|
|
10
|
+
* Log level for controlling verbosity.
|
|
11
|
+
* Levels are ordered by verbosity: silent < errors < warnings < info < debug
|
|
12
|
+
*/
|
|
13
|
+
export type LogLevel = 'silent' | 'errors' | 'warnings' | 'info' | 'debug';
|
|
14
|
+
|
|
15
|
+
// === LOGGER INTERFACE ===
|
|
16
|
+
/**
|
|
17
|
+
* Logger interface for structured logging.
|
|
18
|
+
* Plugins should use context.logger instead of console.log for controllable output.
|
|
19
|
+
*/
|
|
20
|
+
export interface Logger {
|
|
21
|
+
error(message: string, context?: Record<string, unknown>): void;
|
|
22
|
+
warn(message: string, context?: Record<string, unknown>): void;
|
|
23
|
+
info(message: string, context?: Record<string, unknown>): void;
|
|
24
|
+
debug(message: string, context?: Record<string, unknown>): void;
|
|
25
|
+
trace(message: string, context?: Record<string, unknown>): void;
|
|
26
|
+
}
|
|
27
|
+
|
|
8
28
|
// === PLUGIN PHASES ===
|
|
9
29
|
export const PLUGIN_PHASE = {
|
|
10
30
|
DISCOVERY: 'DISCOVERY',
|
|
@@ -28,6 +48,30 @@ export interface PluginMetadata {
|
|
|
28
48
|
dependencies?: string[];
|
|
29
49
|
}
|
|
30
50
|
|
|
51
|
+
// === ISSUE SPEC ===
|
|
52
|
+
/**
|
|
53
|
+
* Specification for creating an issue node via reportIssue().
|
|
54
|
+
* Used by validation plugins to persist detected problems in the graph.
|
|
55
|
+
*/
|
|
56
|
+
export interface IssueSpec {
|
|
57
|
+
/** Issue category (e.g., 'security', 'performance', 'style', 'smell') */
|
|
58
|
+
category: string;
|
|
59
|
+
/** Severity level */
|
|
60
|
+
severity: 'error' | 'warning' | 'info';
|
|
61
|
+
/** Human-readable description of the issue */
|
|
62
|
+
message: string;
|
|
63
|
+
/** File where the issue was detected */
|
|
64
|
+
file: string;
|
|
65
|
+
/** Line number */
|
|
66
|
+
line: number;
|
|
67
|
+
/** Column number (optional, defaults to 0) */
|
|
68
|
+
column?: number;
|
|
69
|
+
/** ID of the node that this issue affects (creates AFFECTS edge) */
|
|
70
|
+
targetNodeId?: string;
|
|
71
|
+
/** Additional context data for the issue */
|
|
72
|
+
context?: Record<string, unknown>;
|
|
73
|
+
}
|
|
74
|
+
|
|
31
75
|
// === PLUGIN CONTEXT ===
|
|
32
76
|
// Manifest varies by phase (UnitManifest, DiscoveryManifest, or full Manifest)
|
|
33
77
|
// Using unknown to allow all manifest types
|
|
@@ -40,6 +84,23 @@ export interface PluginContext {
|
|
|
40
84
|
onProgress?: (info: Record<string, unknown>) => void;
|
|
41
85
|
forceAnalysis?: boolean;
|
|
42
86
|
workerCount?: number;
|
|
87
|
+
/**
|
|
88
|
+
* Set of file paths already processed ("touched") in this analysis run.
|
|
89
|
+
* Used for idempotent re-analysis: first touch clears all nodes for that file,
|
|
90
|
+
* subsequent touches are no-ops. Only populated when forceAnalysis=true.
|
|
91
|
+
*/
|
|
92
|
+
touchedFiles?: Set<string>;
|
|
93
|
+
/**
|
|
94
|
+
* Logger instance for structured logging.
|
|
95
|
+
* Use this instead of console.log for controllable verbosity via CLI flags.
|
|
96
|
+
*/
|
|
97
|
+
logger?: Logger;
|
|
98
|
+
/**
|
|
99
|
+
* Report an issue to persist in the graph (VALIDATION phase only).
|
|
100
|
+
* Creates an issue:* node and optionally an AFFECTS edge to targetNodeId.
|
|
101
|
+
* @returns The ID of the created issue node
|
|
102
|
+
*/
|
|
103
|
+
reportIssue?(issue: IssueSpec): Promise<string>;
|
|
43
104
|
}
|
|
44
105
|
|
|
45
106
|
// === PLUGIN RESULT ===
|
|
@@ -84,6 +145,43 @@ export interface OrchestratorConfig {
|
|
|
84
145
|
parallel?: boolean;
|
|
85
146
|
maxWorkers?: number;
|
|
86
147
|
verbose?: boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Log level for controlling verbosity.
|
|
150
|
+
* Defaults to 'info'. Use 'silent' to suppress all output, 'debug' for verbose.
|
|
151
|
+
*/
|
|
152
|
+
logLevel?: LogLevel;
|
|
153
|
+
/**
|
|
154
|
+
* Optional explicit service definitions to bypass auto-discovery.
|
|
155
|
+
* If provided and non-empty, discovery plugins are skipped.
|
|
156
|
+
* Services are resolved relative to projectPath.
|
|
157
|
+
*/
|
|
158
|
+
services?: ServiceDefinition[];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Explicit service definition for configuration.
|
|
163
|
+
* Allows users to manually specify services when auto-discovery doesn't work.
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```yaml
|
|
167
|
+
* services:
|
|
168
|
+
* - name: "backend"
|
|
169
|
+
* path: "apps/backend"
|
|
170
|
+
* entryPoint: "src/index.ts"
|
|
171
|
+
* ```
|
|
172
|
+
*/
|
|
173
|
+
export interface ServiceDefinition {
|
|
174
|
+
/** Unique service identifier (used for graph node ID) */
|
|
175
|
+
name: string;
|
|
176
|
+
|
|
177
|
+
/** Service directory path relative to project root */
|
|
178
|
+
path: string;
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Optional entry point file path relative to service path.
|
|
182
|
+
* If omitted, auto-detected via resolveSourceEntrypoint() or package.json.main
|
|
183
|
+
*/
|
|
184
|
+
entryPoint?: string;
|
|
87
185
|
}
|
|
88
186
|
|
|
89
187
|
// === GRAPH BACKEND INTERFACE ===
|
|
@@ -133,9 +231,10 @@ export interface GraphBackend {
|
|
|
133
231
|
runDatalogQuery?(query: string): Promise<unknown[]>;
|
|
134
232
|
checkGuarantee?(query: string): unknown[] | Promise<unknown[]>;
|
|
135
233
|
|
|
136
|
-
//
|
|
234
|
+
// Delete methods
|
|
137
235
|
deleteNode?(id: string): Promise<void>;
|
|
138
236
|
deleteEdge?(src: string, dst: string, type: string): Promise<void>;
|
|
237
|
+
clear(): Promise<void>;
|
|
139
238
|
|
|
140
239
|
// Optional persistence
|
|
141
240
|
flush?(): Promise<void>;
|
package/src/rfdb.ts
CHANGED
|
@@ -28,6 +28,7 @@ export type RFDBCommand =
|
|
|
28
28
|
| 'neighbors'
|
|
29
29
|
| 'bfs'
|
|
30
30
|
| 'dfs'
|
|
31
|
+
| 'reachability'
|
|
31
32
|
| 'getOutgoingEdges'
|
|
32
33
|
| 'getIncomingEdges'
|
|
33
34
|
// Stats
|
|
@@ -127,6 +128,14 @@ export interface BfsRequest extends RFDBRequest {
|
|
|
127
128
|
edgeTypes?: EdgeType[];
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
export interface ReachabilityRequest extends RFDBRequest {
|
|
132
|
+
cmd: 'reachability';
|
|
133
|
+
startIds: string[];
|
|
134
|
+
maxDepth: number;
|
|
135
|
+
edgeTypes?: EdgeType[];
|
|
136
|
+
backward: boolean;
|
|
137
|
+
}
|
|
138
|
+
|
|
130
139
|
export interface GetOutgoingEdgesRequest extends RFDBRequest {
|
|
131
140
|
cmd: 'getOutgoingEdges';
|
|
132
141
|
id: string;
|
|
@@ -187,6 +196,10 @@ export interface BfsResponse extends RFDBResponse {
|
|
|
187
196
|
ids: string[];
|
|
188
197
|
}
|
|
189
198
|
|
|
199
|
+
export interface ReachabilityResponse extends RFDBResponse {
|
|
200
|
+
ids: string[];
|
|
201
|
+
}
|
|
202
|
+
|
|
190
203
|
export interface GetEdgesResponse extends RFDBResponse {
|
|
191
204
|
edges: WireEdge[];
|
|
192
205
|
}
|
|
@@ -258,6 +271,7 @@ export interface IRFDBClient {
|
|
|
258
271
|
neighbors(id: string, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
259
272
|
bfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
260
273
|
dfs(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[]): Promise<string[]>;
|
|
274
|
+
reachability(startIds: string[], maxDepth: number, edgeTypes?: EdgeType[], backward?: boolean): Promise<string[]>;
|
|
261
275
|
getOutgoingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
262
276
|
getIncomingEdges(id: string, edgeTypes?: EdgeType[] | null): Promise<WireEdge[]>;
|
|
263
277
|
|