@grafema/types 0.1.0-alpha.5 → 0.2.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.
@@ -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"}
@@ -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
@@ -5,6 +5,17 @@ export declare const EDGE_TYPE: {
5
5
  readonly CONTAINS: "CONTAINS";
6
6
  readonly DEPENDS_ON: "DEPENDS_ON";
7
7
  readonly HAS_SCOPE: "HAS_SCOPE";
8
+ readonly HAS_CONDITION: "HAS_CONDITION";
9
+ readonly HAS_CASE: "HAS_CASE";
10
+ readonly HAS_DEFAULT: "HAS_DEFAULT";
11
+ readonly HAS_BODY: "HAS_BODY";
12
+ readonly ITERATES_OVER: "ITERATES_OVER";
13
+ readonly HAS_INIT: "HAS_INIT";
14
+ readonly HAS_UPDATE: "HAS_UPDATE";
15
+ readonly HAS_CONSEQUENT: "HAS_CONSEQUENT";
16
+ readonly HAS_ALTERNATE: "HAS_ALTERNATE";
17
+ readonly HAS_CATCH: "HAS_CATCH";
18
+ readonly HAS_FINALLY: "HAS_FINALLY";
8
19
  readonly CALLS: "CALLS";
9
20
  readonly HAS_CALLBACK: "HAS_CALLBACK";
10
21
  readonly PASSES_ARGUMENT: "PASSES_ARGUMENT";
@@ -25,20 +36,27 @@ export declare const EDGE_TYPE: {
25
36
  readonly ASSIGNED_FROM: "ASSIGNED_FROM";
26
37
  readonly READS_FROM: "READS_FROM";
27
38
  readonly WRITES_TO: "WRITES_TO";
39
+ readonly DERIVES_FROM: "DERIVES_FROM";
40
+ readonly FLOWS_INTO: "FLOWS_INTO";
41
+ readonly HAS_PROPERTY: "HAS_PROPERTY";
42
+ readonly HAS_ELEMENT: "HAS_ELEMENT";
28
43
  readonly ROUTES_TO: "ROUTES_TO";
29
44
  readonly HANDLED_BY: "HANDLED_BY";
30
45
  readonly MAKES_REQUEST: "MAKES_REQUEST";
31
46
  readonly MOUNTS: "MOUNTS";
32
47
  readonly EXPOSES: "EXPOSES";
48
+ readonly RESPONDS_WITH: "RESPONDS_WITH";
33
49
  readonly LISTENS_TO: "LISTENS_TO";
34
50
  readonly EMITS_EVENT: "EMITS_EVENT";
35
51
  readonly JOINS_ROOM: "JOINS_ROOM";
36
52
  readonly CALLS_API: "CALLS_API";
37
53
  readonly INTERACTS_WITH: "INTERACTS_WITH";
54
+ readonly HTTP_RECEIVES: "HTTP_RECEIVES";
38
55
  readonly REGISTERS_VIEW: "REGISTERS_VIEW";
39
56
  readonly THROWS: "THROWS";
40
57
  readonly GOVERNS: "GOVERNS";
41
58
  readonly VIOLATES: "VIOLATES";
59
+ readonly AFFECTS: "AFFECTS";
42
60
  readonly UNKNOWN: "UNKNOWN";
43
61
  };
44
62
  export type EdgeType = typeof EDGE_TYPE[keyof typeof EDGE_TYPE] | string;
@@ -66,12 +84,42 @@ export interface ExportsEdge extends EdgeRecord {
66
84
  exportedName?: string;
67
85
  }
68
86
  export interface DataFlowEdge extends EdgeRecord {
69
- type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT';
87
+ type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT' | 'DERIVES_FROM' | 'FLOWS_INTO';
70
88
  dataType?: string;
71
89
  }
90
+ /**
91
+ * Edge representing data flowing INTO a container (array, collection)
92
+ * Source: the value being added
93
+ * Destination: the container receiving the value
94
+ *
95
+ * Example: arr.push(obj) creates edge obj --FLOWS_INTO--> arr
96
+ */
97
+ export interface FlowsIntoEdge extends EdgeRecord {
98
+ type: 'FLOWS_INTO';
99
+ mutationMethod?: 'push' | 'unshift' | 'splice' | 'indexed';
100
+ argIndex?: number;
101
+ isSpread?: boolean;
102
+ }
103
+ export interface ObjectStructureEdge extends EdgeRecord {
104
+ type: 'HAS_PROPERTY' | 'HAS_ELEMENT';
105
+ propertyName?: string;
106
+ elementIndex?: number;
107
+ }
72
108
  export interface RouteEdge extends EdgeRecord {
73
109
  type: 'ROUTES_TO' | 'HANDLED_BY';
74
110
  method?: string;
75
111
  path?: string;
76
112
  }
113
+ /**
114
+ * Edge from LOOP to iterated collection (for-in/for-of loops)
115
+ * Source: LOOP node
116
+ * Destination: VARIABLE or PARAMETER being iterated
117
+ */
118
+ export interface IteratesOverEdge extends EdgeRecord {
119
+ type: 'ITERATES_OVER';
120
+ metadata?: {
121
+ /** What the loop iterates over: 'keys' for for-in, 'values' for for-of */
122
+ iterates: 'keys' | 'values';
123
+ };
124
+ }
77
125
  //# sourceMappingURL=edges.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../src/edges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8DZ,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,CAAC;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;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"}
1
+ {"version":3,"file":"edges.d.ts","sourceRoot":"","sources":["../src/edges.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4FZ,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;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE;QACT,0EAA0E;QAC1E,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;KAC7B,CAAC;CACH"}
package/dist/edges.js CHANGED
@@ -7,6 +7,21 @@ export const EDGE_TYPE = {
7
7
  CONTAINS: 'CONTAINS',
8
8
  DEPENDS_ON: 'DEPENDS_ON',
9
9
  HAS_SCOPE: 'HAS_SCOPE',
10
+ // Branching
11
+ HAS_CONDITION: 'HAS_CONDITION',
12
+ HAS_CASE: 'HAS_CASE',
13
+ HAS_DEFAULT: 'HAS_DEFAULT',
14
+ // Loop edges
15
+ HAS_BODY: 'HAS_BODY', // LOOP -> body SCOPE
16
+ ITERATES_OVER: 'ITERATES_OVER', // LOOP -> collection VARIABLE (for-in/for-of)
17
+ HAS_INIT: 'HAS_INIT', // LOOP (for) -> init VARIABLE (let i = 0)
18
+ HAS_UPDATE: 'HAS_UPDATE', // LOOP (for) -> update EXPRESSION (i++)
19
+ // If statement edges
20
+ HAS_CONSEQUENT: 'HAS_CONSEQUENT', // BRANCH -> then SCOPE
21
+ HAS_ALTERNATE: 'HAS_ALTERNATE', // BRANCH -> else SCOPE
22
+ // Try/catch/finally edges
23
+ HAS_CATCH: 'HAS_CATCH', // TRY_BLOCK -> CATCH_BLOCK
24
+ HAS_FINALLY: 'HAS_FINALLY', // TRY_BLOCK -> FINALLY_BLOCK
10
25
  // Calls
11
26
  CALLS: 'CALLS',
12
27
  HAS_CALLBACK: 'HAS_CALLBACK',
@@ -31,12 +46,18 @@ export const EDGE_TYPE = {
31
46
  ASSIGNED_FROM: 'ASSIGNED_FROM',
32
47
  READS_FROM: 'READS_FROM',
33
48
  WRITES_TO: 'WRITES_TO',
49
+ DERIVES_FROM: 'DERIVES_FROM',
50
+ FLOWS_INTO: 'FLOWS_INTO',
51
+ // Object/Array structure
52
+ HAS_PROPERTY: 'HAS_PROPERTY', // OBJECT_LITERAL -> property value
53
+ HAS_ELEMENT: 'HAS_ELEMENT', // ARRAY_LITERAL -> element
34
54
  // HTTP/Routing
35
55
  ROUTES_TO: 'ROUTES_TO',
36
56
  HANDLED_BY: 'HANDLED_BY',
37
57
  MAKES_REQUEST: 'MAKES_REQUEST',
38
58
  MOUNTS: 'MOUNTS',
39
59
  EXPOSES: 'EXPOSES',
60
+ RESPONDS_WITH: 'RESPONDS_WITH',
40
61
  // Events/Sockets
41
62
  LISTENS_TO: 'LISTENS_TO',
42
63
  EMITS_EVENT: 'EMITS_EVENT',
@@ -44,6 +65,7 @@ export const EDGE_TYPE = {
44
65
  // External
45
66
  CALLS_API: 'CALLS_API',
46
67
  INTERACTS_WITH: 'INTERACTS_WITH',
68
+ HTTP_RECEIVES: 'HTTP_RECEIVES',
47
69
  // Views
48
70
  REGISTERS_VIEW: 'REGISTERS_VIEW',
49
71
  // Errors
@@ -51,6 +73,8 @@ export const EDGE_TYPE = {
51
73
  // Guarantees/Invariants
52
74
  GOVERNS: 'GOVERNS',
53
75
  VIOLATES: 'VIOLATES',
76
+ // Issues
77
+ AFFECTS: 'AFFECTS',
54
78
  // Unknown/fallback
55
79
  UNKNOWN: 'UNKNOWN',
56
80
  };
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * @grafema/types - Type definitions for GraphDD code analysis toolkit
3
3
  */
4
4
  export * from './nodes.js';
5
+ export * from './branded.js';
5
6
  export * from './edges.js';
6
7
  export * from './plugins.js';
7
8
  export * from './rfdb.js';
@@ -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
@@ -3,6 +3,8 @@
3
3
  */
4
4
  // Node types
5
5
  export * from './nodes.js';
6
+ // Branded node types (type-safe node creation)
7
+ export * from './branded.js';
6
8
  // Edge types
7
9
  export * from './edges.js';
8
10
  // Plugin types
package/dist/nodes.d.ts CHANGED
@@ -18,6 +18,12 @@ export declare const NODE_TYPE: {
18
18
  readonly SERVICE: "SERVICE";
19
19
  readonly FILE: "FILE";
20
20
  readonly SCOPE: "SCOPE";
21
+ readonly BRANCH: "BRANCH";
22
+ readonly CASE: "CASE";
23
+ readonly LOOP: "LOOP";
24
+ readonly TRY_BLOCK: "TRY_BLOCK";
25
+ readonly CATCH_BLOCK: "CATCH_BLOCK";
26
+ readonly FINALLY_BLOCK: "FINALLY_BLOCK";
21
27
  readonly EXTERNAL: "EXTERNAL";
22
28
  readonly EXTERNAL_MODULE: "EXTERNAL_MODULE";
23
29
  readonly SIDE_EFFECT: "SIDE_EFFECT";
@@ -46,10 +52,10 @@ export type NamespacedNodeType = typeof NAMESPACED_TYPE[keyof typeof NAMESPACED_
46
52
  export type NodeType = BaseNodeType | NamespacedNodeType | string;
47
53
  export interface BaseNodeRecord {
48
54
  id: string;
49
- stableId?: string;
50
55
  type: NodeType;
51
56
  name: string;
52
57
  file: string;
58
+ exported?: boolean;
53
59
  line?: number;
54
60
  column?: number;
55
61
  metadata?: Record<string, unknown>;
@@ -65,6 +71,10 @@ export interface FunctionNodeRecord extends BaseNodeRecord {
65
71
  isClassMethod?: boolean;
66
72
  className?: string;
67
73
  params?: string[];
74
+ paramTypes?: string[];
75
+ returnType?: string;
76
+ signature?: string;
77
+ jsdocSummary?: string;
68
78
  }
69
79
  export interface ClassNodeRecord extends BaseNodeRecord {
70
80
  type: 'CLASS';
@@ -124,6 +134,41 @@ export interface ScopeNodeRecord extends BaseNodeRecord {
124
134
  scopeType: 'function' | 'block' | 'class' | 'module' | 'global';
125
135
  parentScopeId?: string;
126
136
  }
137
+ export interface BranchNodeRecord extends BaseNodeRecord {
138
+ type: 'BRANCH';
139
+ branchType: 'switch' | 'if' | 'ternary';
140
+ parentScopeId?: string;
141
+ }
142
+ export interface CaseNodeRecord extends BaseNodeRecord {
143
+ type: 'CASE';
144
+ value: unknown;
145
+ isDefault: boolean;
146
+ fallsThrough: boolean;
147
+ isEmpty: boolean;
148
+ }
149
+ export interface LoopNodeRecord extends BaseNodeRecord {
150
+ type: 'LOOP';
151
+ loopType: 'for' | 'for-in' | 'for-of' | 'while' | 'do-while';
152
+ parentScopeId?: string;
153
+ bodyScopeId?: string;
154
+ async?: boolean;
155
+ }
156
+ export interface TryBlockNodeRecord extends BaseNodeRecord {
157
+ type: 'TRY_BLOCK';
158
+ parentScopeId?: string;
159
+ bodyScopeId?: string;
160
+ }
161
+ export interface CatchBlockNodeRecord extends BaseNodeRecord {
162
+ type: 'CATCH_BLOCK';
163
+ parentScopeId?: string;
164
+ parameterName?: string;
165
+ bodyScopeId?: string;
166
+ }
167
+ export interface FinallyBlockNodeRecord extends BaseNodeRecord {
168
+ type: 'FINALLY_BLOCK';
169
+ parentScopeId?: string;
170
+ bodyScopeId?: string;
171
+ }
127
172
  export interface HttpRouteNodeRecord extends BaseNodeRecord {
128
173
  type: 'http:route';
129
174
  method: string;
@@ -153,7 +198,7 @@ export interface GuaranteeNodeRecord extends BaseNodeRecord {
153
198
  createdAt?: number;
154
199
  updatedAt?: number;
155
200
  }
156
- export type NodeRecord = FunctionNodeRecord | ClassNodeRecord | MethodNodeRecord | ModuleNodeRecord | ImportNodeRecord | ExportNodeRecord | VariableNodeRecord | CallNodeRecord | ServiceNodeRecord | ScopeNodeRecord | HttpRouteNodeRecord | DbQueryNodeRecord | EventListenerNodeRecord | GuaranteeNodeRecord | BaseNodeRecord;
201
+ export type NodeRecord = FunctionNodeRecord | ClassNodeRecord | MethodNodeRecord | ModuleNodeRecord | ImportNodeRecord | ExportNodeRecord | VariableNodeRecord | CallNodeRecord | ServiceNodeRecord | ScopeNodeRecord | BranchNodeRecord | CaseNodeRecord | LoopNodeRecord | TryBlockNodeRecord | CatchBlockNodeRecord | FinallyBlockNodeRecord | HttpRouteNodeRecord | DbQueryNodeRecord | EventListenerNodeRecord | GuaranteeNodeRecord | BaseNodeRecord;
157
202
  export declare function isNamespacedType(nodeType: string): boolean;
158
203
  export declare function getNamespace(nodeType: string): string | null;
159
204
  export declare function getBaseName(nodeType: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../src/nodes.ts"],"names":[],"mappings":"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"}
package/dist/nodes.js CHANGED
@@ -23,6 +23,14 @@ export const NODE_TYPE = {
23
23
  SERVICE: 'SERVICE',
24
24
  FILE: 'FILE',
25
25
  SCOPE: 'SCOPE',
26
+ // Branching
27
+ BRANCH: 'BRANCH',
28
+ CASE: 'CASE',
29
+ // Control flow
30
+ LOOP: 'LOOP',
31
+ TRY_BLOCK: 'TRY_BLOCK',
32
+ CATCH_BLOCK: 'CATCH_BLOCK',
33
+ FINALLY_BLOCK: 'FINALLY_BLOCK',
26
34
  // External dependencies
27
35
  EXTERNAL: 'EXTERNAL',
28
36
  EXTERNAL_MODULE: 'EXTERNAL_MODULE',
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,29 @@ 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>;
88
+ /**
89
+ * Strict mode flag. When true, enrichers should report unresolved
90
+ * references as fatal errors instead of silently continuing.
91
+ * Default: false (graceful degradation).
92
+ */
93
+ strictMode?: boolean;
33
94
  }
34
95
  export interface PluginResult {
35
96
  success: boolean;
@@ -66,6 +127,60 @@ export interface OrchestratorConfig {
66
127
  parallel?: boolean;
67
128
  maxWorkers?: number;
68
129
  verbose?: boolean;
130
+ /**
131
+ * Log level for controlling verbosity.
132
+ * Defaults to 'info'. Use 'silent' to suppress all output, 'debug' for verbose.
133
+ */
134
+ logLevel?: LogLevel;
135
+ /**
136
+ * Optional explicit service definitions to bypass auto-discovery.
137
+ * If provided and non-empty, discovery plugins are skipped.
138
+ * Services are resolved relative to projectPath.
139
+ */
140
+ services?: ServiceDefinition[];
141
+ /**
142
+ * Glob patterns for files to include during indexing.
143
+ * If specified, only files matching at least one pattern are processed.
144
+ * Patterns are matched against relative paths from project root.
145
+ * Uses minimatch syntax (e.g., "src/**.ts", "lib/**.js").
146
+ *
147
+ * Default: undefined (process all files reachable from entrypoint)
148
+ */
149
+ include?: string[];
150
+ /**
151
+ * Glob patterns for files to exclude during indexing.
152
+ * Files matching any pattern are skipped (not processed, imports not followed).
153
+ * Patterns are matched against relative paths from project root.
154
+ * Uses minimatch syntax.
155
+ *
156
+ * Default: undefined (no exclusions beyond npm packages)
157
+ *
158
+ * Note: node_modules is already excluded by default in JSModuleIndexer.
159
+ */
160
+ exclude?: string[];
161
+ }
162
+ /**
163
+ * Explicit service definition for configuration.
164
+ * Allows users to manually specify services when auto-discovery doesn't work.
165
+ *
166
+ * @example
167
+ * ```yaml
168
+ * services:
169
+ * - name: "backend"
170
+ * path: "apps/backend"
171
+ * entryPoint: "src/index.ts"
172
+ * ```
173
+ */
174
+ export interface ServiceDefinition {
175
+ /** Unique service identifier (used for graph node ID) */
176
+ name: string;
177
+ /** Service directory path relative to project root */
178
+ path: string;
179
+ /**
180
+ * Optional entry point file path relative to service path.
181
+ * If omitted, auto-detected via resolveSourceEntrypoint() or package.json.main
182
+ */
183
+ entryPoint?: string;
69
184
  }
70
185
  export interface InputNode {
71
186
  id: string;
@@ -103,6 +218,7 @@ export interface GraphBackend {
103
218
  checkGuarantee?(query: string): unknown[] | Promise<unknown[]>;
104
219
  deleteNode?(id: string): Promise<void>;
105
220
  deleteEdge?(src: string, dst: string, type: string): Promise<void>;
221
+ clear(): Promise<void>;
106
222
  flush?(): Promise<void>;
107
223
  close?(): Promise<void>;
108
224
  }
@@ -123,7 +239,7 @@ export interface IPlugin {
123
239
  export declare function createSuccessResult(created?: {
124
240
  nodes: number;
125
241
  edges: number;
126
- }, metadata?: Record<string, unknown>): PluginResult;
242
+ }, metadata?: Record<string, unknown>, errors?: Error[]): PluginResult;
127
243
  export declare function createErrorResult(error: Error, created?: {
128
244
  nodes: number;
129
245
  edges: number;
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"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"}
package/dist/plugins.js CHANGED
@@ -10,11 +10,11 @@ export const PLUGIN_PHASE = {
10
10
  VALIDATION: 'VALIDATION',
11
11
  };
12
12
  // === HELPER FUNCTIONS ===
13
- export function createSuccessResult(created = { nodes: 0, edges: 0 }, metadata = {}) {
13
+ export function createSuccessResult(created = { nodes: 0, edges: 0 }, metadata = {}, errors = []) {
14
14
  return {
15
15
  success: true,
16
16
  created,
17
- errors: [],
17
+ errors,
18
18
  warnings: [],
19
19
  metadata,
20
20
  };
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>;
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grafema/types",
3
- "version": "0.1.0-alpha.5",
3
+ "version": "0.2.0-beta",
4
4
  "description": "Type definitions for Grafema code analysis toolkit",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
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
@@ -9,6 +9,25 @@ export const EDGE_TYPE = {
9
9
  DEPENDS_ON: 'DEPENDS_ON',
10
10
  HAS_SCOPE: 'HAS_SCOPE',
11
11
 
12
+ // Branching
13
+ HAS_CONDITION: 'HAS_CONDITION',
14
+ HAS_CASE: 'HAS_CASE',
15
+ HAS_DEFAULT: 'HAS_DEFAULT',
16
+
17
+ // Loop edges
18
+ HAS_BODY: 'HAS_BODY', // LOOP -> body SCOPE
19
+ ITERATES_OVER: 'ITERATES_OVER', // LOOP -> collection VARIABLE (for-in/for-of)
20
+ HAS_INIT: 'HAS_INIT', // LOOP (for) -> init VARIABLE (let i = 0)
21
+ HAS_UPDATE: 'HAS_UPDATE', // LOOP (for) -> update EXPRESSION (i++)
22
+
23
+ // If statement edges
24
+ HAS_CONSEQUENT: 'HAS_CONSEQUENT', // BRANCH -> then SCOPE
25
+ HAS_ALTERNATE: 'HAS_ALTERNATE', // BRANCH -> else SCOPE
26
+
27
+ // Try/catch/finally edges
28
+ HAS_CATCH: 'HAS_CATCH', // TRY_BLOCK -> CATCH_BLOCK
29
+ HAS_FINALLY: 'HAS_FINALLY', // TRY_BLOCK -> FINALLY_BLOCK
30
+
12
31
  // Calls
13
32
  CALLS: 'CALLS',
14
33
  HAS_CALLBACK: 'HAS_CALLBACK',
@@ -36,6 +55,12 @@ export const EDGE_TYPE = {
36
55
  ASSIGNED_FROM: 'ASSIGNED_FROM',
37
56
  READS_FROM: 'READS_FROM',
38
57
  WRITES_TO: 'WRITES_TO',
58
+ DERIVES_FROM: 'DERIVES_FROM',
59
+ FLOWS_INTO: 'FLOWS_INTO',
60
+
61
+ // Object/Array structure
62
+ HAS_PROPERTY: 'HAS_PROPERTY', // OBJECT_LITERAL -> property value
63
+ HAS_ELEMENT: 'HAS_ELEMENT', // ARRAY_LITERAL -> element
39
64
 
40
65
  // HTTP/Routing
41
66
  ROUTES_TO: 'ROUTES_TO',
@@ -43,6 +68,7 @@ export const EDGE_TYPE = {
43
68
  MAKES_REQUEST: 'MAKES_REQUEST',
44
69
  MOUNTS: 'MOUNTS',
45
70
  EXPOSES: 'EXPOSES',
71
+ RESPONDS_WITH: 'RESPONDS_WITH',
46
72
 
47
73
  // Events/Sockets
48
74
  LISTENS_TO: 'LISTENS_TO',
@@ -52,6 +78,7 @@ export const EDGE_TYPE = {
52
78
  // External
53
79
  CALLS_API: 'CALLS_API',
54
80
  INTERACTS_WITH: 'INTERACTS_WITH',
81
+ HTTP_RECEIVES: 'HTTP_RECEIVES',
55
82
 
56
83
  // Views
57
84
  REGISTERS_VIEW: 'REGISTERS_VIEW',
@@ -63,6 +90,9 @@ export const EDGE_TYPE = {
63
90
  GOVERNS: 'GOVERNS',
64
91
  VIOLATES: 'VIOLATES',
65
92
 
93
+ // Issues
94
+ AFFECTS: 'AFFECTS',
95
+
66
96
  // Unknown/fallback
67
97
  UNKNOWN: 'UNKNOWN',
68
98
  } as const;
@@ -100,12 +130,45 @@ export interface ExportsEdge extends EdgeRecord {
100
130
  }
101
131
 
102
132
  export interface DataFlowEdge extends EdgeRecord {
103
- type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT';
133
+ type: 'ASSIGNED_FROM' | 'READS_FROM' | 'WRITES_TO' | 'PASSES_ARGUMENT' | 'DERIVES_FROM' | 'FLOWS_INTO';
104
134
  dataType?: string;
105
135
  }
106
136
 
137
+ /**
138
+ * Edge representing data flowing INTO a container (array, collection)
139
+ * Source: the value being added
140
+ * Destination: the container receiving the value
141
+ *
142
+ * Example: arr.push(obj) creates edge obj --FLOWS_INTO--> arr
143
+ */
144
+ export interface FlowsIntoEdge extends EdgeRecord {
145
+ type: 'FLOWS_INTO';
146
+ mutationMethod?: 'push' | 'unshift' | 'splice' | 'indexed';
147
+ argIndex?: number;
148
+ isSpread?: boolean;
149
+ }
150
+
151
+ export interface ObjectStructureEdge extends EdgeRecord {
152
+ type: 'HAS_PROPERTY' | 'HAS_ELEMENT';
153
+ propertyName?: string; // For HAS_PROPERTY
154
+ elementIndex?: number; // For HAS_ELEMENT
155
+ }
156
+
107
157
  export interface RouteEdge extends EdgeRecord {
108
158
  type: 'ROUTES_TO' | 'HANDLED_BY';
109
159
  method?: string;
110
160
  path?: string;
111
161
  }
162
+
163
+ /**
164
+ * Edge from LOOP to iterated collection (for-in/for-of loops)
165
+ * Source: LOOP node
166
+ * Destination: VARIABLE or PARAMETER being iterated
167
+ */
168
+ export interface IteratesOverEdge extends EdgeRecord {
169
+ type: 'ITERATES_OVER';
170
+ metadata?: {
171
+ /** What the loop iterates over: 'keys' for for-in, 'values' for for-of */
172
+ iterates: 'keys' | 'values';
173
+ };
174
+ }
package/src/index.ts CHANGED
@@ -5,6 +5,9 @@
5
5
  // Node types
6
6
  export * from './nodes.js';
7
7
 
8
+ // Branded node types (type-safe node creation)
9
+ export * from './branded.js';
10
+
8
11
  // Edge types
9
12
  export * from './edges.js';
10
13
 
package/src/nodes.ts CHANGED
@@ -28,6 +28,16 @@ export const NODE_TYPE = {
28
28
  FILE: 'FILE',
29
29
  SCOPE: 'SCOPE',
30
30
 
31
+ // Branching
32
+ BRANCH: 'BRANCH',
33
+ CASE: 'CASE',
34
+
35
+ // Control flow
36
+ LOOP: 'LOOP',
37
+ TRY_BLOCK: 'TRY_BLOCK',
38
+ CATCH_BLOCK: 'CATCH_BLOCK',
39
+ FINALLY_BLOCK: 'FINALLY_BLOCK',
40
+
31
41
  // External dependencies
32
42
  EXTERNAL: 'EXTERNAL',
33
43
  EXTERNAL_MODULE: 'EXTERNAL_MODULE',
@@ -81,10 +91,10 @@ export type NodeType = BaseNodeType | NamespacedNodeType | string;
81
91
  // Base interface for all nodes
82
92
  export interface BaseNodeRecord {
83
93
  id: string;
84
- stableId?: string;
85
94
  type: NodeType;
86
95
  name: string;
87
96
  file: string;
97
+ exported?: boolean; // Optional - some nodes may not have export status
88
98
  line?: number; // Optional - not always available
89
99
  column?: number;
90
100
  metadata?: Record<string, unknown>;
@@ -103,6 +113,10 @@ export interface FunctionNodeRecord extends BaseNodeRecord {
103
113
  isClassMethod?: boolean;
104
114
  className?: string;
105
115
  params?: string[];
116
+ paramTypes?: string[]; // Types for each param
117
+ returnType?: string; // Return type
118
+ signature?: string; // Full signature: "(a: T) => R"
119
+ jsdocSummary?: string; // First line of JSDoc
106
120
  }
107
121
 
108
122
  // Class node
@@ -182,6 +196,53 @@ export interface ScopeNodeRecord extends BaseNodeRecord {
182
196
  parentScopeId?: string;
183
197
  }
184
198
 
199
+ // Branch node (switch, future: if/ternary)
200
+ export interface BranchNodeRecord extends BaseNodeRecord {
201
+ type: 'BRANCH';
202
+ branchType: 'switch' | 'if' | 'ternary'; // For future expansion
203
+ parentScopeId?: string;
204
+ }
205
+
206
+ // Case node (switch case clause)
207
+ export interface CaseNodeRecord extends BaseNodeRecord {
208
+ type: 'CASE';
209
+ value: unknown; // Case test value ('ADD', 1, etc.) or null for default
210
+ isDefault: boolean; // true for default case
211
+ fallsThrough: boolean; // true if no break/return
212
+ isEmpty: boolean; // true if case has no statements (intentional fall-through)
213
+ }
214
+
215
+ // Loop node (for, for-in, for-of, while, do-while)
216
+ export interface LoopNodeRecord extends BaseNodeRecord {
217
+ type: 'LOOP';
218
+ loopType: 'for' | 'for-in' | 'for-of' | 'while' | 'do-while';
219
+ parentScopeId?: string;
220
+ bodyScopeId?: string; // ID of SCOPE node containing loop body
221
+ async?: boolean; // true for for-await-of loops
222
+ }
223
+
224
+ // Try block node
225
+ export interface TryBlockNodeRecord extends BaseNodeRecord {
226
+ type: 'TRY_BLOCK';
227
+ parentScopeId?: string;
228
+ bodyScopeId?: string; // ID of SCOPE node containing try body
229
+ }
230
+
231
+ // Catch block node
232
+ export interface CatchBlockNodeRecord extends BaseNodeRecord {
233
+ type: 'CATCH_BLOCK';
234
+ parentScopeId?: string;
235
+ parameterName?: string; // Error parameter name (e.g., 'e' in catch(e))
236
+ bodyScopeId?: string; // ID of SCOPE node containing catch body
237
+ }
238
+
239
+ // Finally block node
240
+ export interface FinallyBlockNodeRecord extends BaseNodeRecord {
241
+ type: 'FINALLY_BLOCK';
242
+ parentScopeId?: string;
243
+ bodyScopeId?: string; // ID of SCOPE node containing finally body
244
+ }
245
+
185
246
  // HTTP Route node
186
247
  export interface HttpRouteNodeRecord extends BaseNodeRecord {
187
248
  type: 'http:route';
@@ -235,6 +296,12 @@ export type NodeRecord =
235
296
  | CallNodeRecord
236
297
  | ServiceNodeRecord
237
298
  | ScopeNodeRecord
299
+ | BranchNodeRecord
300
+ | CaseNodeRecord
301
+ | LoopNodeRecord
302
+ | TryBlockNodeRecord
303
+ | CatchBlockNodeRecord
304
+ | FinallyBlockNodeRecord
238
305
  | HttpRouteNodeRecord
239
306
  | DbQueryNodeRecord
240
307
  | EventListenerNodeRecord
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,29 @@ 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>;
104
+ /**
105
+ * Strict mode flag. When true, enrichers should report unresolved
106
+ * references as fatal errors instead of silently continuing.
107
+ * Default: false (graceful degradation).
108
+ */
109
+ strictMode?: boolean;
43
110
  }
44
111
 
45
112
  // === PLUGIN RESULT ===
@@ -84,6 +151,65 @@ export interface OrchestratorConfig {
84
151
  parallel?: boolean;
85
152
  maxWorkers?: number;
86
153
  verbose?: boolean;
154
+ /**
155
+ * Log level for controlling verbosity.
156
+ * Defaults to 'info'. Use 'silent' to suppress all output, 'debug' for verbose.
157
+ */
158
+ logLevel?: LogLevel;
159
+ /**
160
+ * Optional explicit service definitions to bypass auto-discovery.
161
+ * If provided and non-empty, discovery plugins are skipped.
162
+ * Services are resolved relative to projectPath.
163
+ */
164
+ services?: ServiceDefinition[];
165
+
166
+ /**
167
+ * Glob patterns for files to include during indexing.
168
+ * If specified, only files matching at least one pattern are processed.
169
+ * Patterns are matched against relative paths from project root.
170
+ * Uses minimatch syntax (e.g., "src/**.ts", "lib/**.js").
171
+ *
172
+ * Default: undefined (process all files reachable from entrypoint)
173
+ */
174
+ include?: string[];
175
+
176
+ /**
177
+ * Glob patterns for files to exclude during indexing.
178
+ * Files matching any pattern are skipped (not processed, imports not followed).
179
+ * Patterns are matched against relative paths from project root.
180
+ * Uses minimatch syntax.
181
+ *
182
+ * Default: undefined (no exclusions beyond npm packages)
183
+ *
184
+ * Note: node_modules is already excluded by default in JSModuleIndexer.
185
+ */
186
+ exclude?: string[];
187
+ }
188
+
189
+ /**
190
+ * Explicit service definition for configuration.
191
+ * Allows users to manually specify services when auto-discovery doesn't work.
192
+ *
193
+ * @example
194
+ * ```yaml
195
+ * services:
196
+ * - name: "backend"
197
+ * path: "apps/backend"
198
+ * entryPoint: "src/index.ts"
199
+ * ```
200
+ */
201
+ export interface ServiceDefinition {
202
+ /** Unique service identifier (used for graph node ID) */
203
+ name: string;
204
+
205
+ /** Service directory path relative to project root */
206
+ path: string;
207
+
208
+ /**
209
+ * Optional entry point file path relative to service path.
210
+ * If omitted, auto-detected via resolveSourceEntrypoint() or package.json.main
211
+ */
212
+ entryPoint?: string;
87
213
  }
88
214
 
89
215
  // === GRAPH BACKEND INTERFACE ===
@@ -133,9 +259,10 @@ export interface GraphBackend {
133
259
  runDatalogQuery?(query: string): Promise<unknown[]>;
134
260
  checkGuarantee?(query: string): unknown[] | Promise<unknown[]>;
135
261
 
136
- // Optional delete methods
262
+ // Delete methods
137
263
  deleteNode?(id: string): Promise<void>;
138
264
  deleteEdge?(src: string, dst: string, type: string): Promise<void>;
265
+ clear(): Promise<void>;
139
266
 
140
267
  // Optional persistence
141
268
  flush?(): Promise<void>;
@@ -162,12 +289,13 @@ export interface IPlugin {
162
289
  // === HELPER FUNCTIONS ===
163
290
  export function createSuccessResult(
164
291
  created: { nodes: number; edges: number } = { nodes: 0, edges: 0 },
165
- metadata: Record<string, unknown> = {}
292
+ metadata: Record<string, unknown> = {},
293
+ errors: Error[] = []
166
294
  ): PluginResult {
167
295
  return {
168
296
  success: true,
169
297
  created,
170
- errors: [],
298
+ errors,
171
299
  warnings: [],
172
300
  metadata,
173
301
  };
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