@principal-ai/principal-view-core 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/README.md +126 -0
  2. package/dist/ConfigurationLoader.d.ts +76 -0
  3. package/dist/ConfigurationLoader.d.ts.map +1 -0
  4. package/dist/ConfigurationLoader.js +144 -0
  5. package/dist/ConfigurationLoader.js.map +1 -0
  6. package/dist/ConfigurationValidator.d.ts +31 -0
  7. package/dist/ConfigurationValidator.d.ts.map +1 -0
  8. package/dist/ConfigurationValidator.js +242 -0
  9. package/dist/ConfigurationValidator.js.map +1 -0
  10. package/dist/EventProcessor.d.ts +49 -0
  11. package/dist/EventProcessor.d.ts.map +1 -0
  12. package/dist/EventProcessor.js +215 -0
  13. package/dist/EventProcessor.js.map +1 -0
  14. package/dist/EventRecorderService.d.ts +305 -0
  15. package/dist/EventRecorderService.d.ts.map +1 -0
  16. package/dist/EventRecorderService.js +463 -0
  17. package/dist/EventRecorderService.js.map +1 -0
  18. package/dist/LibraryLoader.d.ts +63 -0
  19. package/dist/LibraryLoader.d.ts.map +1 -0
  20. package/dist/LibraryLoader.js +188 -0
  21. package/dist/LibraryLoader.js.map +1 -0
  22. package/dist/PathBasedEventProcessor.d.ts +90 -0
  23. package/dist/PathBasedEventProcessor.d.ts.map +1 -0
  24. package/dist/PathBasedEventProcessor.js +239 -0
  25. package/dist/PathBasedEventProcessor.js.map +1 -0
  26. package/dist/SessionManager.d.ts +194 -0
  27. package/dist/SessionManager.d.ts.map +1 -0
  28. package/dist/SessionManager.js +299 -0
  29. package/dist/SessionManager.js.map +1 -0
  30. package/dist/ValidationEngine.d.ts +31 -0
  31. package/dist/ValidationEngine.d.ts.map +1 -0
  32. package/dist/ValidationEngine.js +158 -0
  33. package/dist/ValidationEngine.js.map +1 -0
  34. package/dist/helpers/GraphInstrumentationHelper.d.ts +93 -0
  35. package/dist/helpers/GraphInstrumentationHelper.d.ts.map +1 -0
  36. package/dist/helpers/GraphInstrumentationHelper.js +248 -0
  37. package/dist/helpers/GraphInstrumentationHelper.js.map +1 -0
  38. package/dist/index.d.ts +33 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +34 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/rules/config.d.ts +57 -0
  43. package/dist/rules/config.d.ts.map +1 -0
  44. package/dist/rules/config.js +382 -0
  45. package/dist/rules/config.js.map +1 -0
  46. package/dist/rules/engine.d.ts +70 -0
  47. package/dist/rules/engine.d.ts.map +1 -0
  48. package/dist/rules/engine.js +252 -0
  49. package/dist/rules/engine.js.map +1 -0
  50. package/dist/rules/implementations/connection-type-references.d.ts +7 -0
  51. package/dist/rules/implementations/connection-type-references.d.ts.map +1 -0
  52. package/dist/rules/implementations/connection-type-references.js +104 -0
  53. package/dist/rules/implementations/connection-type-references.js.map +1 -0
  54. package/dist/rules/implementations/dead-end-states.d.ts +17 -0
  55. package/dist/rules/implementations/dead-end-states.d.ts.map +1 -0
  56. package/dist/rules/implementations/dead-end-states.js +72 -0
  57. package/dist/rules/implementations/dead-end-states.js.map +1 -0
  58. package/dist/rules/implementations/index.d.ts +24 -0
  59. package/dist/rules/implementations/index.d.ts.map +1 -0
  60. package/dist/rules/implementations/index.js +62 -0
  61. package/dist/rules/implementations/index.js.map +1 -0
  62. package/dist/rules/implementations/library-node-type-match.d.ts +17 -0
  63. package/dist/rules/implementations/library-node-type-match.d.ts.map +1 -0
  64. package/dist/rules/implementations/library-node-type-match.js +123 -0
  65. package/dist/rules/implementations/library-node-type-match.js.map +1 -0
  66. package/dist/rules/implementations/minimum-node-sources.d.ts +22 -0
  67. package/dist/rules/implementations/minimum-node-sources.d.ts.map +1 -0
  68. package/dist/rules/implementations/minimum-node-sources.js +54 -0
  69. package/dist/rules/implementations/minimum-node-sources.js.map +1 -0
  70. package/dist/rules/implementations/no-unknown-fields.d.ts +7 -0
  71. package/dist/rules/implementations/no-unknown-fields.d.ts.map +1 -0
  72. package/dist/rules/implementations/no-unknown-fields.js +211 -0
  73. package/dist/rules/implementations/no-unknown-fields.js.map +1 -0
  74. package/dist/rules/implementations/orphaned-edge-types.d.ts +7 -0
  75. package/dist/rules/implementations/orphaned-edge-types.d.ts.map +1 -0
  76. package/dist/rules/implementations/orphaned-edge-types.js +47 -0
  77. package/dist/rules/implementations/orphaned-edge-types.js.map +1 -0
  78. package/dist/rules/implementations/orphaned-node-types.d.ts +7 -0
  79. package/dist/rules/implementations/orphaned-node-types.d.ts.map +1 -0
  80. package/dist/rules/implementations/orphaned-node-types.js +50 -0
  81. package/dist/rules/implementations/orphaned-node-types.js.map +1 -0
  82. package/dist/rules/implementations/required-metadata.d.ts +7 -0
  83. package/dist/rules/implementations/required-metadata.d.ts.map +1 -0
  84. package/dist/rules/implementations/required-metadata.js +57 -0
  85. package/dist/rules/implementations/required-metadata.js.map +1 -0
  86. package/dist/rules/implementations/state-transition-references.d.ts +7 -0
  87. package/dist/rules/implementations/state-transition-references.d.ts.map +1 -0
  88. package/dist/rules/implementations/state-transition-references.js +135 -0
  89. package/dist/rules/implementations/state-transition-references.js.map +1 -0
  90. package/dist/rules/implementations/unreachable-states.d.ts +7 -0
  91. package/dist/rules/implementations/unreachable-states.d.ts.map +1 -0
  92. package/dist/rules/implementations/unreachable-states.js +80 -0
  93. package/dist/rules/implementations/unreachable-states.js.map +1 -0
  94. package/dist/rules/implementations/valid-action-patterns.d.ts +17 -0
  95. package/dist/rules/implementations/valid-action-patterns.d.ts.map +1 -0
  96. package/dist/rules/implementations/valid-action-patterns.js +109 -0
  97. package/dist/rules/implementations/valid-action-patterns.js.map +1 -0
  98. package/dist/rules/implementations/valid-color-format.d.ts +7 -0
  99. package/dist/rules/implementations/valid-color-format.d.ts.map +1 -0
  100. package/dist/rules/implementations/valid-color-format.js +91 -0
  101. package/dist/rules/implementations/valid-color-format.js.map +1 -0
  102. package/dist/rules/implementations/valid-edge-types.d.ts +7 -0
  103. package/dist/rules/implementations/valid-edge-types.d.ts.map +1 -0
  104. package/dist/rules/implementations/valid-edge-types.js +244 -0
  105. package/dist/rules/implementations/valid-edge-types.js.map +1 -0
  106. package/dist/rules/implementations/valid-node-types.d.ts +7 -0
  107. package/dist/rules/implementations/valid-node-types.d.ts.map +1 -0
  108. package/dist/rules/implementations/valid-node-types.js +175 -0
  109. package/dist/rules/implementations/valid-node-types.js.map +1 -0
  110. package/dist/rules/index.d.ts +28 -0
  111. package/dist/rules/index.d.ts.map +1 -0
  112. package/dist/rules/index.js +45 -0
  113. package/dist/rules/index.js.map +1 -0
  114. package/dist/rules/types.d.ts +309 -0
  115. package/dist/rules/types.d.ts.map +1 -0
  116. package/dist/rules/types.js +35 -0
  117. package/dist/rules/types.js.map +1 -0
  118. package/dist/types/canvas.d.ts +409 -0
  119. package/dist/types/canvas.d.ts.map +1 -0
  120. package/dist/types/canvas.js +70 -0
  121. package/dist/types/canvas.js.map +1 -0
  122. package/dist/types/index.d.ts +311 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/index.js +13 -0
  125. package/dist/types/index.js.map +1 -0
  126. package/dist/types/library.d.ts +185 -0
  127. package/dist/types/library.d.ts.map +1 -0
  128. package/dist/types/library.js +15 -0
  129. package/dist/types/library.js.map +1 -0
  130. package/dist/types/path-based-config.d.ts +230 -0
  131. package/dist/types/path-based-config.d.ts.map +1 -0
  132. package/dist/types/path-based-config.js +9 -0
  133. package/dist/types/path-based-config.js.map +1 -0
  134. package/dist/utils/CanvasConverter.d.ts +118 -0
  135. package/dist/utils/CanvasConverter.d.ts.map +1 -0
  136. package/dist/utils/CanvasConverter.js +315 -0
  137. package/dist/utils/CanvasConverter.js.map +1 -0
  138. package/dist/utils/GraphConverter.d.ts +18 -0
  139. package/dist/utils/GraphConverter.d.ts.map +1 -0
  140. package/dist/utils/GraphConverter.js +61 -0
  141. package/dist/utils/GraphConverter.js.map +1 -0
  142. package/dist/utils/LibraryConverter.d.ts +113 -0
  143. package/dist/utils/LibraryConverter.d.ts.map +1 -0
  144. package/dist/utils/LibraryConverter.js +166 -0
  145. package/dist/utils/LibraryConverter.js.map +1 -0
  146. package/dist/utils/PathMatcher.d.ts +55 -0
  147. package/dist/utils/PathMatcher.d.ts.map +1 -0
  148. package/dist/utils/PathMatcher.js +172 -0
  149. package/dist/utils/PathMatcher.js.map +1 -0
  150. package/dist/utils/YamlParser.d.ts +36 -0
  151. package/dist/utils/YamlParser.d.ts.map +1 -0
  152. package/dist/utils/YamlParser.js +63 -0
  153. package/dist/utils/YamlParser.js.map +1 -0
  154. package/package.json +47 -0
  155. package/src/ConfigurationLoader.test.ts +490 -0
  156. package/src/ConfigurationLoader.ts +185 -0
  157. package/src/ConfigurationValidator.test.ts +200 -0
  158. package/src/ConfigurationValidator.ts +283 -0
  159. package/src/EventProcessor.test.ts +405 -0
  160. package/src/EventProcessor.ts +250 -0
  161. package/src/EventRecorderService.test.ts +541 -0
  162. package/src/EventRecorderService.ts +744 -0
  163. package/src/LibraryLoader.ts +215 -0
  164. package/src/PathBasedEventProcessor.test.ts +567 -0
  165. package/src/PathBasedEventProcessor.ts +332 -0
  166. package/src/SessionManager.test.ts +424 -0
  167. package/src/SessionManager.ts +470 -0
  168. package/src/ValidationEngine.test.ts +371 -0
  169. package/src/ValidationEngine.ts +196 -0
  170. package/src/helpers/GraphInstrumentationHelper.test.ts +340 -0
  171. package/src/helpers/GraphInstrumentationHelper.ts +326 -0
  172. package/src/index.ts +85 -0
  173. package/src/rules/config.test.ts +278 -0
  174. package/src/rules/config.ts +459 -0
  175. package/src/rules/engine.test.ts +332 -0
  176. package/src/rules/engine.ts +318 -0
  177. package/src/rules/implementations/connection-type-references.ts +117 -0
  178. package/src/rules/implementations/dead-end-states.ts +101 -0
  179. package/src/rules/implementations/index.ts +73 -0
  180. package/src/rules/implementations/library-node-type-match.ts +148 -0
  181. package/src/rules/implementations/minimum-node-sources.ts +82 -0
  182. package/src/rules/implementations/no-unknown-fields.ts +342 -0
  183. package/src/rules/implementations/orphaned-edge-types.ts +55 -0
  184. package/src/rules/implementations/orphaned-node-types.ts +58 -0
  185. package/src/rules/implementations/required-metadata.ts +64 -0
  186. package/src/rules/implementations/state-transition-references.ts +151 -0
  187. package/src/rules/implementations/unreachable-states.ts +94 -0
  188. package/src/rules/implementations/valid-action-patterns.ts +136 -0
  189. package/src/rules/implementations/valid-color-format.ts +140 -0
  190. package/src/rules/implementations/valid-edge-types.ts +258 -0
  191. package/src/rules/implementations/valid-node-types.ts +189 -0
  192. package/src/rules/index.ts +95 -0
  193. package/src/rules/types.ts +426 -0
  194. package/src/types/canvas.ts +496 -0
  195. package/src/types/index.ts +382 -0
  196. package/src/types/library.ts +233 -0
  197. package/src/types/path-based-config.ts +281 -0
  198. package/src/utils/CanvasConverter.ts +431 -0
  199. package/src/utils/GraphConverter.test.ts +195 -0
  200. package/src/utils/GraphConverter.ts +71 -0
  201. package/src/utils/LibraryConverter.ts +245 -0
  202. package/src/utils/PathMatcher.test.ts +148 -0
  203. package/src/utils/PathMatcher.ts +183 -0
  204. package/src/utils/YamlParser.ts +75 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Rule: library-node-type-match
3
+ * Ensures nodeTypes match library nodeComponents when a library is provided
4
+ */
5
+ const DEFAULT_OPTIONS = {
6
+ allowExtra: false,
7
+ };
8
+ export const libraryNodeTypeMatch = {
9
+ id: 'library-node-type-match',
10
+ name: 'Library Node Type Match',
11
+ description: 'NodeTypes must match library nodeComponents when a library is provided',
12
+ impact: 'Mismatched types may cause inconsistent behavior or missing features',
13
+ severity: 'error',
14
+ category: 'library',
15
+ enabled: true,
16
+ fixable: false,
17
+ defaultOptions: DEFAULT_OPTIONS,
18
+ async check(context) {
19
+ const violations = [];
20
+ const { configuration, library, configPath, libraryPath, options } = context;
21
+ // Skip if no library is provided
22
+ if (!library) {
23
+ return violations;
24
+ }
25
+ // Skip if library has no nodeComponents
26
+ if (!library.nodeComponents || Object.keys(library.nodeComponents).length === 0) {
27
+ return violations;
28
+ }
29
+ const libraryNodeTypes = new Set(Object.keys(library.nodeComponents));
30
+ const configNodeTypes = Object.keys(configuration.nodeTypes ?? {});
31
+ // Check each nodeType in configuration
32
+ for (const typeId of configNodeTypes) {
33
+ if (!libraryNodeTypes.has(typeId)) {
34
+ if (!options.allowExtra) {
35
+ const suggestion = findSimilar(typeId, libraryNodeTypes);
36
+ violations.push({
37
+ ruleId: 'library-node-type-match',
38
+ severity: 'error',
39
+ file: configPath,
40
+ path: `nodeTypes.${typeId}`,
41
+ message: `Node type "${typeId}" is not defined in the component library`,
42
+ impact: 'This node type may be missing library-defined behavior or styling',
43
+ suggestion: suggestion
44
+ ? `Did you mean "${suggestion}"?`
45
+ : `Available library nodeComponents: ${[...libraryNodeTypes].join(', ')}`,
46
+ fixable: false,
47
+ });
48
+ }
49
+ }
50
+ else {
51
+ // Validate that config matches library definition
52
+ const libraryComponent = library.nodeComponents[typeId];
53
+ const configNodeType = configuration.nodeTypes[typeId];
54
+ // Check shape matches if library defines one
55
+ if (libraryComponent.shape && configNodeType.shape !== libraryComponent.shape) {
56
+ violations.push({
57
+ ruleId: 'library-node-type-match',
58
+ severity: 'error',
59
+ file: configPath,
60
+ path: `nodeTypes.${typeId}.shape`,
61
+ message: `Node type "${typeId}" shape "${configNodeType.shape}" doesn't match library definition "${libraryComponent.shape}"`,
62
+ impact: 'Node may render differently than expected',
63
+ suggestion: `Use shape "${libraryComponent.shape}" as defined in the library`,
64
+ fixable: true,
65
+ fixData: {
66
+ typeId,
67
+ field: 'shape',
68
+ expected: libraryComponent.shape,
69
+ actual: configNodeType.shape,
70
+ },
71
+ });
72
+ }
73
+ // Check that config defines all states from library
74
+ if (libraryComponent.states && Object.keys(libraryComponent.states).length > 0) {
75
+ const libraryStates = Object.keys(libraryComponent.states);
76
+ const configStates = configNodeType.states ? Object.keys(configNodeType.states) : [];
77
+ for (const stateId of libraryStates) {
78
+ if (!configStates.includes(stateId)) {
79
+ violations.push({
80
+ ruleId: 'library-node-type-match',
81
+ severity: 'error',
82
+ file: configPath,
83
+ path: `nodeTypes.${typeId}.states`,
84
+ message: `Node type "${typeId}" is missing state "${stateId}" defined in library`,
85
+ impact: 'State transitions to this state may fail',
86
+ suggestion: `Add state "${stateId}" to nodeTypes.${typeId}.states`,
87
+ fixable: false,
88
+ });
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return violations;
95
+ },
96
+ };
97
+ /**
98
+ * Find a similar string from a set (for "did you mean" suggestions)
99
+ */
100
+ function findSimilar(input, candidates) {
101
+ const inputLower = input.toLowerCase();
102
+ for (const candidate of candidates) {
103
+ const candidateLower = candidate.toLowerCase();
104
+ // Exact substring match
105
+ if (inputLower.includes(candidateLower) || candidateLower.includes(inputLower)) {
106
+ return candidate;
107
+ }
108
+ // Small edit distance
109
+ if (Math.abs(input.length - candidate.length) <= 2) {
110
+ let differences = 0;
111
+ const minLen = Math.min(inputLower.length, candidateLower.length);
112
+ for (let i = 0; i < minLen; i++) {
113
+ if (inputLower[i] !== candidateLower[i])
114
+ differences++;
115
+ }
116
+ differences += Math.abs(input.length - candidate.length);
117
+ if (differences <= 2)
118
+ return candidate;
119
+ }
120
+ }
121
+ return null;
122
+ }
123
+ //# sourceMappingURL=library-node-type-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"library-node-type-match.js","sourceRoot":"","sources":["../../../src/rules/implementations/library-node-type-match.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Rule: minimum-node-sources
3
+ * Ensures each nodeType has at least a minimum number of sources defined
4
+ */
5
+ import type { GraphRule, RuleOptions } from '../types';
6
+ /**
7
+ * Options for minimum-node-sources rule
8
+ */
9
+ export interface MinimumNodeSourcesOptions extends RuleOptions {
10
+ /**
11
+ * Minimum number of sources required per nodeType
12
+ * @default 1
13
+ */
14
+ minimum: number;
15
+ /**
16
+ * NodeType IDs to exclude from this check
17
+ * @default []
18
+ */
19
+ excludeNodeTypes: string[];
20
+ }
21
+ export declare const minimumNodeSources: GraphRule<MinimumNodeSourcesOptions>;
22
+ //# sourceMappingURL=minimum-node-sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimum-node-sources.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/minimum-node-sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,WAAW,EAAE,MAAM,UAAU,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,WAAW;IAC5D;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAOD,eAAO,MAAM,kBAAkB,EAAE,SAAS,CAAC,yBAAyB,CAoDnE,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Rule: minimum-node-sources
3
+ * Ensures each nodeType has at least a minimum number of sources defined
4
+ */
5
+ const DEFAULT_OPTIONS = {
6
+ minimum: 1,
7
+ excludeNodeTypes: [],
8
+ };
9
+ export const minimumNodeSources = {
10
+ id: 'minimum-node-sources',
11
+ name: 'Minimum Node Sources',
12
+ description: 'Each nodeType must have at least a minimum number of sources defined',
13
+ impact: 'NodeTypes without sources cannot be associated with log activity',
14
+ severity: 'error',
15
+ category: 'structure',
16
+ enabled: true,
17
+ fixable: false,
18
+ defaultOptions: DEFAULT_OPTIONS,
19
+ async check(context) {
20
+ const violations = [];
21
+ const { configuration, configPath, options } = context;
22
+ const minimum = options.minimum ?? DEFAULT_OPTIONS.minimum;
23
+ const excludeNodeTypes = options.excludeNodeTypes ?? DEFAULT_OPTIONS.excludeNodeTypes;
24
+ if (!configuration.nodeTypes) {
25
+ return violations;
26
+ }
27
+ for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
28
+ // Skip excluded node types
29
+ if (excludeNodeTypes.includes(typeId)) {
30
+ continue;
31
+ }
32
+ // Get sources from nodeType (may be extended via path-based config)
33
+ const nodeTypeAny = nodeType;
34
+ const sources = nodeTypeAny.sources;
35
+ const sourceCount = Array.isArray(sources) ? sources.length : 0;
36
+ if (sourceCount < minimum) {
37
+ violations.push({
38
+ ruleId: 'minimum-node-sources',
39
+ severity: 'error',
40
+ file: configPath,
41
+ path: `nodeTypes.${typeId}.sources`,
42
+ message: sourceCount === 0
43
+ ? `Node type "${typeId}" has no sources defined`
44
+ : `Node type "${typeId}" has ${sourceCount} source(s), minimum required is ${minimum}`,
45
+ impact: 'This node type cannot be associated with log activity from source files',
46
+ suggestion: `Add at least ${minimum} source path(s) to nodeTypes.${typeId}.sources`,
47
+ fixable: false,
48
+ });
49
+ }
50
+ }
51
+ return violations;
52
+ },
53
+ };
54
+ //# sourceMappingURL=minimum-node-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minimum-node-sources.js","sourceRoot":"","sources":["../../../src/rules/implementations/minimum-node-sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH,MAAM,eAAe,GAA8B;IACjD,OAAO,EAAE,CAAC;IACV,gBAAgB,EAAE,EAAE;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAyC;IACtE,EAAE,EAAE,sBAAsB;IAC1B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,sEAAsE;IACnF,MAAM,EAAE,kEAAkE;IAC1E,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,KAAK;IACd,cAAc,EAAE,eAAe;IAE/B,KAAK,CAAC,KAAK,CAAC,OAAoD;QAC9D,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAEvD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC;QAC3D,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,eAAe,CAAC,gBAAgB,CAAC;QAEtF,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC7B,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YACzE,2BAA2B;YAC3B,IAAI,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,oEAAoE;YACpE,MAAM,WAAW,GAAG,QAA8C,CAAC;YACnE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;YACpC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAEhE,IAAI,WAAW,GAAG,OAAO,EAAE,CAAC;gBAC1B,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,sBAAsB;oBAC9B,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,aAAa,MAAM,UAAU;oBACnC,OAAO,EACL,WAAW,KAAK,CAAC;wBACf,CAAC,CAAC,cAAc,MAAM,0BAA0B;wBAChD,CAAC,CAAC,cAAc,MAAM,SAAS,WAAW,mCAAmC,OAAO,EAAE;oBAC1F,MAAM,EAAE,yEAAyE;oBACjF,UAAU,EAAE,gBAAgB,OAAO,gCAAgC,MAAM,UAAU;oBACnF,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: no-unknown-fields
3
+ * Flags fields that are not defined in the configuration schema
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const noUnknownFields: GraphRule;
7
+ //# sourceMappingURL=no-unknown-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unknown-fields.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/no-unknown-fields.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAgDhF,eAAO,MAAM,eAAe,EAAE,SAqO7B,CAAC"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Rule: no-unknown-fields
3
+ * Flags fields that are not defined in the configuration schema
4
+ */
5
+ /**
6
+ * Allowed fields for each configuration section
7
+ */
8
+ const ALLOWED_FIELDS = {
9
+ root: ['metadata', 'nodeTypes', 'edgeTypes', 'allowedConnections', 'validation', 'display'],
10
+ metadata: ['name', 'version', 'description'],
11
+ nodeType: [
12
+ 'shape',
13
+ 'icon',
14
+ 'color',
15
+ 'stroke',
16
+ 'size',
17
+ 'dataSchema',
18
+ 'states',
19
+ 'layout',
20
+ 'sources',
21
+ 'actions',
22
+ ],
23
+ edgeType: [
24
+ 'style',
25
+ 'color',
26
+ 'width',
27
+ 'directed',
28
+ 'animated',
29
+ 'label',
30
+ 'animation',
31
+ 'dataSchema',
32
+ 'activatedBy',
33
+ ],
34
+ connectionRule: ['from', 'to', 'via', 'constraints'],
35
+ connectionConstraints: ['maxInstances', 'bidirectional', 'exclusive'],
36
+ validation: ['stateTransitions', 'constraints', 'cardinality'],
37
+ display: ['layout', 'theme', 'animations'],
38
+ displayTheme: ['primary', 'success', 'warning', 'danger', 'info'],
39
+ displayAnimations: ['enabled', 'speed'],
40
+ dataSchemaField: ['type', 'required', 'displayInLabel', 'label', 'displayInInfo'],
41
+ stateDefinition: ['color', 'icon', 'label'],
42
+ layoutHints: ['layer', 'cluster'],
43
+ edgeLabel: ['field', 'position'],
44
+ edgeAnimation: ['type', 'duration', 'color'],
45
+ nodeSize: ['width', 'height'],
46
+ stateTransition: ['from', 'to'],
47
+ constraint: ['id', 'description', 'check', 'severity'],
48
+ actionPattern: ['pattern', 'event', 'state', 'metadata'],
49
+ };
50
+ export const noUnknownFields = {
51
+ id: 'no-unknown-fields',
52
+ name: 'No Unknown Fields',
53
+ description: 'Flag fields that are not defined in the configuration schema',
54
+ impact: 'Unknown fields are likely typos and will be ignored',
55
+ severity: 'error',
56
+ category: 'schema',
57
+ enabled: true,
58
+ fixable: true,
59
+ async check(context) {
60
+ const violations = [];
61
+ const { configuration, configPath } = context;
62
+ // Check root level fields
63
+ checkFields(configuration, ALLOWED_FIELDS.root, '', configPath, violations);
64
+ // Check metadata fields
65
+ if (configuration.metadata) {
66
+ checkFields(configuration.metadata, ALLOWED_FIELDS.metadata, 'metadata', configPath, violations);
67
+ }
68
+ // Check nodeTypes
69
+ if (configuration.nodeTypes) {
70
+ for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
71
+ const basePath = `nodeTypes.${typeId}`;
72
+ checkFields(nodeType, ALLOWED_FIELDS.nodeType, basePath, configPath, violations);
73
+ // Check nested fields in nodeType
74
+ if (nodeType.dataSchema) {
75
+ for (const [fieldName, fieldDef] of Object.entries(nodeType.dataSchema)) {
76
+ checkFields(fieldDef, ALLOWED_FIELDS.dataSchemaField, `${basePath}.dataSchema.${fieldName}`, configPath, violations);
77
+ }
78
+ }
79
+ if (nodeType.states) {
80
+ for (const [stateName, stateDef] of Object.entries(nodeType.states)) {
81
+ checkFields(stateDef, ALLOWED_FIELDS.stateDefinition, `${basePath}.states.${stateName}`, configPath, violations);
82
+ }
83
+ }
84
+ if (nodeType.layout) {
85
+ checkFields(nodeType.layout, ALLOWED_FIELDS.layoutHints, `${basePath}.layout`, configPath, violations);
86
+ }
87
+ if (nodeType.size) {
88
+ checkFields(nodeType.size, ALLOWED_FIELDS.nodeSize, `${basePath}.size`, configPath, violations);
89
+ }
90
+ // Check actions
91
+ const nodeTypeAny = nodeType;
92
+ if (Array.isArray(nodeTypeAny.actions)) {
93
+ nodeTypeAny.actions.forEach((action, index) => {
94
+ if (typeof action === 'object' && action !== null) {
95
+ checkFields(action, ALLOWED_FIELDS.actionPattern, `${basePath}.actions[${index}]`, configPath, violations);
96
+ }
97
+ });
98
+ }
99
+ }
100
+ }
101
+ // Check edgeTypes
102
+ if (configuration.edgeTypes) {
103
+ for (const [typeId, edgeType] of Object.entries(configuration.edgeTypes)) {
104
+ const basePath = `edgeTypes.${typeId}`;
105
+ checkFields(edgeType, ALLOWED_FIELDS.edgeType, basePath, configPath, violations);
106
+ if (edgeType.label && typeof edgeType.label === 'object') {
107
+ checkFields(edgeType.label, ALLOWED_FIELDS.edgeLabel, `${basePath}.label`, configPath, violations);
108
+ }
109
+ if (edgeType.animation && typeof edgeType.animation === 'object') {
110
+ checkFields(edgeType.animation, ALLOWED_FIELDS.edgeAnimation, `${basePath}.animation`, configPath, violations);
111
+ }
112
+ if (edgeType.dataSchema) {
113
+ for (const [fieldName, fieldDef] of Object.entries(edgeType.dataSchema)) {
114
+ checkFields(fieldDef, ALLOWED_FIELDS.dataSchemaField, `${basePath}.dataSchema.${fieldName}`, configPath, violations);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ // Check allowedConnections
120
+ if (configuration.allowedConnections) {
121
+ configuration.allowedConnections.forEach((rule, index) => {
122
+ const basePath = `allowedConnections[${index}]`;
123
+ checkFields(rule, ALLOWED_FIELDS.connectionRule, basePath, configPath, violations);
124
+ if (rule.constraints) {
125
+ checkFields(rule.constraints, ALLOWED_FIELDS.connectionConstraints, `${basePath}.constraints`, configPath, violations);
126
+ }
127
+ });
128
+ }
129
+ // Check validation
130
+ if (configuration.validation) {
131
+ checkFields(configuration.validation, ALLOWED_FIELDS.validation, 'validation', configPath, violations);
132
+ // Check state transitions
133
+ if (configuration.validation.stateTransitions) {
134
+ for (const [nodeType, transitions] of Object.entries(configuration.validation.stateTransitions)) {
135
+ if (Array.isArray(transitions)) {
136
+ transitions.forEach((transition, index) => {
137
+ checkFields(transition, ALLOWED_FIELDS.stateTransition, `validation.stateTransitions.${nodeType}[${index}]`, configPath, violations);
138
+ });
139
+ }
140
+ }
141
+ }
142
+ // Check constraints
143
+ if (configuration.validation.constraints && Array.isArray(configuration.validation.constraints)) {
144
+ configuration.validation.constraints.forEach((constraint, index) => {
145
+ checkFields(constraint, ALLOWED_FIELDS.constraint, `validation.constraints[${index}]`, configPath, violations);
146
+ });
147
+ }
148
+ }
149
+ // Check display
150
+ if (configuration.display) {
151
+ checkFields(configuration.display, ALLOWED_FIELDS.display, 'display', configPath, violations);
152
+ if (configuration.display.theme) {
153
+ checkFields(configuration.display.theme, ALLOWED_FIELDS.displayTheme, 'display.theme', configPath, violations);
154
+ }
155
+ if (configuration.display.animations) {
156
+ checkFields(configuration.display.animations, ALLOWED_FIELDS.displayAnimations, 'display.animations', configPath, violations);
157
+ }
158
+ }
159
+ return violations;
160
+ },
161
+ };
162
+ /**
163
+ * Check an object's fields against allowed fields
164
+ */
165
+ function checkFields(obj, allowedFields, path, configPath, violations) {
166
+ for (const field of Object.keys(obj)) {
167
+ if (!allowedFields.includes(field)) {
168
+ const suggestion = findSimilarField(field, allowedFields);
169
+ violations.push({
170
+ ruleId: 'no-unknown-fields',
171
+ severity: 'error',
172
+ file: configPath,
173
+ path: path ? `${path}.${field}` : field,
174
+ message: `Unknown field "${field}"${path ? ` in ${path}` : ' at root level'}`,
175
+ impact: 'This field will be ignored and may indicate a configuration error',
176
+ suggestion: suggestion
177
+ ? `Did you mean "${suggestion}"? Allowed fields: ${allowedFields.join(', ')}`
178
+ : `Allowed fields: ${allowedFields.join(', ')}`,
179
+ fixable: true,
180
+ fixData: { path, field, suggestion },
181
+ });
182
+ }
183
+ }
184
+ }
185
+ /**
186
+ * Find a similar field name for "did you mean" suggestions
187
+ */
188
+ function findSimilarField(field, allowedFields) {
189
+ const fieldLower = field.toLowerCase();
190
+ for (const allowed of allowedFields) {
191
+ const allowedLower = allowed.toLowerCase();
192
+ // Check for substring match
193
+ if (fieldLower.includes(allowedLower) || allowedLower.includes(fieldLower)) {
194
+ return allowed;
195
+ }
196
+ // Check for small edit distance (typos)
197
+ if (Math.abs(field.length - allowed.length) <= 2) {
198
+ let differences = 0;
199
+ const minLen = Math.min(fieldLower.length, allowedLower.length);
200
+ for (let i = 0; i < minLen; i++) {
201
+ if (fieldLower[i] !== allowedLower[i])
202
+ differences++;
203
+ }
204
+ differences += Math.abs(field.length - allowed.length);
205
+ if (differences <= 2)
206
+ return allowed;
207
+ }
208
+ }
209
+ return null;
210
+ }
211
+ //# sourceMappingURL=no-unknown-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unknown-fields.js","sourceRoot":"","sources":["../../../src/rules/implementations/no-unknown-fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: orphaned-edge-types
3
+ * Warns when edgeTypes are not used in any connection rule
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const orphanedEdgeTypes: GraphRule;
7
+ //# sourceMappingURL=orphaned-edge-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphaned-edge-types.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-edge-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,SA+C/B,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Rule: orphaned-edge-types
3
+ * Warns when edgeTypes are not used in any connection rule
4
+ */
5
+ export const orphanedEdgeTypes = {
6
+ id: 'orphaned-edge-types',
7
+ name: 'Orphaned Edge Types',
8
+ description: 'EdgeTypes should be used in at least one connection rule',
9
+ impact: 'Orphaned edge types may indicate unused or misconfigured types',
10
+ severity: 'error',
11
+ category: 'structure',
12
+ enabled: true,
13
+ fixable: false,
14
+ async check(context) {
15
+ const violations = [];
16
+ const { configuration, configPath } = context;
17
+ if (!configuration.edgeTypes || Object.keys(configuration.edgeTypes).length === 0) {
18
+ return violations;
19
+ }
20
+ // Collect all edgeTypes referenced in allowedConnections
21
+ const referencedEdgeTypes = new Set();
22
+ if (configuration.allowedConnections) {
23
+ for (const connection of configuration.allowedConnections) {
24
+ if (connection.via) {
25
+ referencedEdgeTypes.add(connection.via);
26
+ }
27
+ }
28
+ }
29
+ // Check each edgeType
30
+ for (const typeId of Object.keys(configuration.edgeTypes)) {
31
+ if (!referencedEdgeTypes.has(typeId)) {
32
+ violations.push({
33
+ ruleId: 'orphaned-edge-types',
34
+ severity: 'error',
35
+ file: configPath,
36
+ path: `edgeTypes.${typeId}`,
37
+ message: `Edge type "${typeId}" is not used in any connection rule`,
38
+ impact: 'This edge type may be unused or misconfigured',
39
+ suggestion: `Add a connection rule using this edge type, or remove it if unused`,
40
+ fixable: false,
41
+ });
42
+ }
43
+ }
44
+ return violations;
45
+ },
46
+ };
47
+ //# sourceMappingURL=orphaned-edge-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphaned-edge-types.js","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-edge-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,0DAA0D;IACvE,MAAM,EAAE,gEAAgE;IACxE,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,KAAK;IAEd,KAAK,CAAC,KAAK,CAAC,OAAyB;QACnC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE9C,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,yDAAyD;QACzD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE9C,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;YACrC,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;gBAC1D,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;oBACnB,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,aAAa,MAAM,EAAE;oBAC3B,OAAO,EAAE,cAAc,MAAM,sCAAsC;oBACnE,MAAM,EAAE,+CAA+C;oBACvD,UAAU,EAAE,oEAAoE;oBAChF,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: orphaned-node-types
3
+ * Warns when nodeTypes are not used in any connection rule
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const orphanedNodeTypes: GraphRule;
7
+ //# sourceMappingURL=orphaned-node-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphaned-node-types.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-node-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,SAkD/B,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Rule: orphaned-node-types
3
+ * Warns when nodeTypes are not used in any connection rule
4
+ */
5
+ export const orphanedNodeTypes = {
6
+ id: 'orphaned-node-types',
7
+ name: 'Orphaned Node Types',
8
+ description: 'NodeTypes should be used in at least one connection rule',
9
+ impact: 'Orphaned node types may indicate unused or misconfigured types',
10
+ severity: 'error',
11
+ category: 'structure',
12
+ enabled: true,
13
+ fixable: false,
14
+ async check(context) {
15
+ const violations = [];
16
+ const { configuration, configPath } = context;
17
+ if (!configuration.nodeTypes || Object.keys(configuration.nodeTypes).length === 0) {
18
+ return violations;
19
+ }
20
+ // Collect all nodeTypes referenced in allowedConnections
21
+ const referencedNodeTypes = new Set();
22
+ if (configuration.allowedConnections) {
23
+ for (const connection of configuration.allowedConnections) {
24
+ if (connection.from) {
25
+ referencedNodeTypes.add(connection.from);
26
+ }
27
+ if (connection.to) {
28
+ referencedNodeTypes.add(connection.to);
29
+ }
30
+ }
31
+ }
32
+ // Check each nodeType
33
+ for (const typeId of Object.keys(configuration.nodeTypes)) {
34
+ if (!referencedNodeTypes.has(typeId)) {
35
+ violations.push({
36
+ ruleId: 'orphaned-node-types',
37
+ severity: 'error',
38
+ file: configPath,
39
+ path: `nodeTypes.${typeId}`,
40
+ message: `Node type "${typeId}" is not used in any connection rule`,
41
+ impact: 'This node type may be unused or misconfigured',
42
+ suggestion: `Add a connection rule using this node type, or remove it if unused`,
43
+ fixable: false,
44
+ });
45
+ }
46
+ }
47
+ return violations;
48
+ },
49
+ };
50
+ //# sourceMappingURL=orphaned-node-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orphaned-node-types.js","sourceRoot":"","sources":["../../../src/rules/implementations/orphaned-node-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,iBAAiB,GAAc;IAC1C,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,0DAA0D;IACvE,MAAM,EAAE,gEAAgE;IACxE,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,WAAW;IACrB,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,KAAK;IAEd,KAAK,CAAC,KAAK,CAAC,OAAyB;QACnC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE9C,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,yDAAyD;QACzD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;QAE9C,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;YACrC,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,kBAAkB,EAAE,CAAC;gBAC1D,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;oBACpB,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3C,CAAC;gBACD,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;oBAClB,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,qBAAqB;oBAC7B,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,aAAa,MAAM,EAAE;oBAC3B,OAAO,EAAE,cAAc,MAAM,sCAAsC;oBACnE,MAAM,EAAE,+CAA+C;oBACvD,UAAU,EAAE,oEAAoE;oBAChF,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule: required-metadata
3
+ * Ensures configuration has required metadata fields (name, version)
4
+ */
5
+ import type { GraphRule } from '../types';
6
+ export declare const requiredMetadata: GraphRule;
7
+ //# sourceMappingURL=required-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"required-metadata.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/required-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,gBAAgB,EAAE,SAwD9B,CAAC"}