@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.
- package/README.md +126 -0
- package/dist/ConfigurationLoader.d.ts +76 -0
- package/dist/ConfigurationLoader.d.ts.map +1 -0
- package/dist/ConfigurationLoader.js +144 -0
- package/dist/ConfigurationLoader.js.map +1 -0
- package/dist/ConfigurationValidator.d.ts +31 -0
- package/dist/ConfigurationValidator.d.ts.map +1 -0
- package/dist/ConfigurationValidator.js +242 -0
- package/dist/ConfigurationValidator.js.map +1 -0
- package/dist/EventProcessor.d.ts +49 -0
- package/dist/EventProcessor.d.ts.map +1 -0
- package/dist/EventProcessor.js +215 -0
- package/dist/EventProcessor.js.map +1 -0
- package/dist/EventRecorderService.d.ts +305 -0
- package/dist/EventRecorderService.d.ts.map +1 -0
- package/dist/EventRecorderService.js +463 -0
- package/dist/EventRecorderService.js.map +1 -0
- package/dist/LibraryLoader.d.ts +63 -0
- package/dist/LibraryLoader.d.ts.map +1 -0
- package/dist/LibraryLoader.js +188 -0
- package/dist/LibraryLoader.js.map +1 -0
- package/dist/PathBasedEventProcessor.d.ts +90 -0
- package/dist/PathBasedEventProcessor.d.ts.map +1 -0
- package/dist/PathBasedEventProcessor.js +239 -0
- package/dist/PathBasedEventProcessor.js.map +1 -0
- package/dist/SessionManager.d.ts +194 -0
- package/dist/SessionManager.d.ts.map +1 -0
- package/dist/SessionManager.js +299 -0
- package/dist/SessionManager.js.map +1 -0
- package/dist/ValidationEngine.d.ts +31 -0
- package/dist/ValidationEngine.d.ts.map +1 -0
- package/dist/ValidationEngine.js +158 -0
- package/dist/ValidationEngine.js.map +1 -0
- package/dist/helpers/GraphInstrumentationHelper.d.ts +93 -0
- package/dist/helpers/GraphInstrumentationHelper.d.ts.map +1 -0
- package/dist/helpers/GraphInstrumentationHelper.js +248 -0
- package/dist/helpers/GraphInstrumentationHelper.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/config.d.ts +57 -0
- package/dist/rules/config.d.ts.map +1 -0
- package/dist/rules/config.js +382 -0
- package/dist/rules/config.js.map +1 -0
- package/dist/rules/engine.d.ts +70 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +252 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/implementations/connection-type-references.d.ts +7 -0
- package/dist/rules/implementations/connection-type-references.d.ts.map +1 -0
- package/dist/rules/implementations/connection-type-references.js +104 -0
- package/dist/rules/implementations/connection-type-references.js.map +1 -0
- package/dist/rules/implementations/dead-end-states.d.ts +17 -0
- package/dist/rules/implementations/dead-end-states.d.ts.map +1 -0
- package/dist/rules/implementations/dead-end-states.js +72 -0
- package/dist/rules/implementations/dead-end-states.js.map +1 -0
- package/dist/rules/implementations/index.d.ts +24 -0
- package/dist/rules/implementations/index.d.ts.map +1 -0
- package/dist/rules/implementations/index.js +62 -0
- package/dist/rules/implementations/index.js.map +1 -0
- package/dist/rules/implementations/library-node-type-match.d.ts +17 -0
- package/dist/rules/implementations/library-node-type-match.d.ts.map +1 -0
- package/dist/rules/implementations/library-node-type-match.js +123 -0
- package/dist/rules/implementations/library-node-type-match.js.map +1 -0
- package/dist/rules/implementations/minimum-node-sources.d.ts +22 -0
- package/dist/rules/implementations/minimum-node-sources.d.ts.map +1 -0
- package/dist/rules/implementations/minimum-node-sources.js +54 -0
- package/dist/rules/implementations/minimum-node-sources.js.map +1 -0
- package/dist/rules/implementations/no-unknown-fields.d.ts +7 -0
- package/dist/rules/implementations/no-unknown-fields.d.ts.map +1 -0
- package/dist/rules/implementations/no-unknown-fields.js +211 -0
- package/dist/rules/implementations/no-unknown-fields.js.map +1 -0
- package/dist/rules/implementations/orphaned-edge-types.d.ts +7 -0
- package/dist/rules/implementations/orphaned-edge-types.d.ts.map +1 -0
- package/dist/rules/implementations/orphaned-edge-types.js +47 -0
- package/dist/rules/implementations/orphaned-edge-types.js.map +1 -0
- package/dist/rules/implementations/orphaned-node-types.d.ts +7 -0
- package/dist/rules/implementations/orphaned-node-types.d.ts.map +1 -0
- package/dist/rules/implementations/orphaned-node-types.js +50 -0
- package/dist/rules/implementations/orphaned-node-types.js.map +1 -0
- package/dist/rules/implementations/required-metadata.d.ts +7 -0
- package/dist/rules/implementations/required-metadata.d.ts.map +1 -0
- package/dist/rules/implementations/required-metadata.js +57 -0
- package/dist/rules/implementations/required-metadata.js.map +1 -0
- package/dist/rules/implementations/state-transition-references.d.ts +7 -0
- package/dist/rules/implementations/state-transition-references.d.ts.map +1 -0
- package/dist/rules/implementations/state-transition-references.js +135 -0
- package/dist/rules/implementations/state-transition-references.js.map +1 -0
- package/dist/rules/implementations/unreachable-states.d.ts +7 -0
- package/dist/rules/implementations/unreachable-states.d.ts.map +1 -0
- package/dist/rules/implementations/unreachable-states.js +80 -0
- package/dist/rules/implementations/unreachable-states.js.map +1 -0
- package/dist/rules/implementations/valid-action-patterns.d.ts +17 -0
- package/dist/rules/implementations/valid-action-patterns.d.ts.map +1 -0
- package/dist/rules/implementations/valid-action-patterns.js +109 -0
- package/dist/rules/implementations/valid-action-patterns.js.map +1 -0
- package/dist/rules/implementations/valid-color-format.d.ts +7 -0
- package/dist/rules/implementations/valid-color-format.d.ts.map +1 -0
- package/dist/rules/implementations/valid-color-format.js +91 -0
- package/dist/rules/implementations/valid-color-format.js.map +1 -0
- package/dist/rules/implementations/valid-edge-types.d.ts +7 -0
- package/dist/rules/implementations/valid-edge-types.d.ts.map +1 -0
- package/dist/rules/implementations/valid-edge-types.js +244 -0
- package/dist/rules/implementations/valid-edge-types.js.map +1 -0
- package/dist/rules/implementations/valid-node-types.d.ts +7 -0
- package/dist/rules/implementations/valid-node-types.d.ts.map +1 -0
- package/dist/rules/implementations/valid-node-types.js +175 -0
- package/dist/rules/implementations/valid-node-types.js.map +1 -0
- package/dist/rules/index.d.ts +28 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +45 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/types.d.ts +309 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +35 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/types/canvas.d.ts +409 -0
- package/dist/types/canvas.d.ts.map +1 -0
- package/dist/types/canvas.js +70 -0
- package/dist/types/canvas.js.map +1 -0
- package/dist/types/index.d.ts +311 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/library.d.ts +185 -0
- package/dist/types/library.d.ts.map +1 -0
- package/dist/types/library.js +15 -0
- package/dist/types/library.js.map +1 -0
- package/dist/types/path-based-config.d.ts +230 -0
- package/dist/types/path-based-config.d.ts.map +1 -0
- package/dist/types/path-based-config.js +9 -0
- package/dist/types/path-based-config.js.map +1 -0
- package/dist/utils/CanvasConverter.d.ts +118 -0
- package/dist/utils/CanvasConverter.d.ts.map +1 -0
- package/dist/utils/CanvasConverter.js +315 -0
- package/dist/utils/CanvasConverter.js.map +1 -0
- package/dist/utils/GraphConverter.d.ts +18 -0
- package/dist/utils/GraphConverter.d.ts.map +1 -0
- package/dist/utils/GraphConverter.js +61 -0
- package/dist/utils/GraphConverter.js.map +1 -0
- package/dist/utils/LibraryConverter.d.ts +113 -0
- package/dist/utils/LibraryConverter.d.ts.map +1 -0
- package/dist/utils/LibraryConverter.js +166 -0
- package/dist/utils/LibraryConverter.js.map +1 -0
- package/dist/utils/PathMatcher.d.ts +55 -0
- package/dist/utils/PathMatcher.d.ts.map +1 -0
- package/dist/utils/PathMatcher.js +172 -0
- package/dist/utils/PathMatcher.js.map +1 -0
- package/dist/utils/YamlParser.d.ts +36 -0
- package/dist/utils/YamlParser.d.ts.map +1 -0
- package/dist/utils/YamlParser.js +63 -0
- package/dist/utils/YamlParser.js.map +1 -0
- package/package.json +47 -0
- package/src/ConfigurationLoader.test.ts +490 -0
- package/src/ConfigurationLoader.ts +185 -0
- package/src/ConfigurationValidator.test.ts +200 -0
- package/src/ConfigurationValidator.ts +283 -0
- package/src/EventProcessor.test.ts +405 -0
- package/src/EventProcessor.ts +250 -0
- package/src/EventRecorderService.test.ts +541 -0
- package/src/EventRecorderService.ts +744 -0
- package/src/LibraryLoader.ts +215 -0
- package/src/PathBasedEventProcessor.test.ts +567 -0
- package/src/PathBasedEventProcessor.ts +332 -0
- package/src/SessionManager.test.ts +424 -0
- package/src/SessionManager.ts +470 -0
- package/src/ValidationEngine.test.ts +371 -0
- package/src/ValidationEngine.ts +196 -0
- package/src/helpers/GraphInstrumentationHelper.test.ts +340 -0
- package/src/helpers/GraphInstrumentationHelper.ts +326 -0
- package/src/index.ts +85 -0
- package/src/rules/config.test.ts +278 -0
- package/src/rules/config.ts +459 -0
- package/src/rules/engine.test.ts +332 -0
- package/src/rules/engine.ts +318 -0
- package/src/rules/implementations/connection-type-references.ts +117 -0
- package/src/rules/implementations/dead-end-states.ts +101 -0
- package/src/rules/implementations/index.ts +73 -0
- package/src/rules/implementations/library-node-type-match.ts +148 -0
- package/src/rules/implementations/minimum-node-sources.ts +82 -0
- package/src/rules/implementations/no-unknown-fields.ts +342 -0
- package/src/rules/implementations/orphaned-edge-types.ts +55 -0
- package/src/rules/implementations/orphaned-node-types.ts +58 -0
- package/src/rules/implementations/required-metadata.ts +64 -0
- package/src/rules/implementations/state-transition-references.ts +151 -0
- package/src/rules/implementations/unreachable-states.ts +94 -0
- package/src/rules/implementations/valid-action-patterns.ts +136 -0
- package/src/rules/implementations/valid-color-format.ts +140 -0
- package/src/rules/implementations/valid-edge-types.ts +258 -0
- package/src/rules/implementations/valid-node-types.ts +189 -0
- package/src/rules/index.ts +95 -0
- package/src/rules/types.ts +426 -0
- package/src/types/canvas.ts +496 -0
- package/src/types/index.ts +382 -0
- package/src/types/library.ts +233 -0
- package/src/types/path-based-config.ts +281 -0
- package/src/utils/CanvasConverter.ts +431 -0
- package/src/utils/GraphConverter.test.ts +195 -0
- package/src/utils/GraphConverter.ts +71 -0
- package/src/utils/LibraryConverter.ts +245 -0
- package/src/utils/PathMatcher.test.ts +148 -0
- package/src/utils/PathMatcher.ts +183 -0
- package/src/utils/YamlParser.ts +75 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: required-metadata
|
|
3
|
+
* Ensures configuration has required metadata fields (name, version)
|
|
4
|
+
*/
|
|
5
|
+
export const requiredMetadata = {
|
|
6
|
+
id: 'required-metadata',
|
|
7
|
+
name: 'Required Metadata',
|
|
8
|
+
description: 'Configuration must have name and version in metadata',
|
|
9
|
+
impact: 'Missing metadata makes configurations hard to identify and version',
|
|
10
|
+
severity: 'error',
|
|
11
|
+
category: 'schema',
|
|
12
|
+
enabled: true,
|
|
13
|
+
fixable: false,
|
|
14
|
+
async check(context) {
|
|
15
|
+
const violations = [];
|
|
16
|
+
const { configuration, configPath } = context;
|
|
17
|
+
if (!configuration.metadata) {
|
|
18
|
+
violations.push({
|
|
19
|
+
ruleId: 'required-metadata',
|
|
20
|
+
severity: 'error',
|
|
21
|
+
file: configPath,
|
|
22
|
+
path: 'metadata',
|
|
23
|
+
message: 'Configuration is missing metadata section',
|
|
24
|
+
impact: 'Cannot identify or version this configuration',
|
|
25
|
+
suggestion: 'Add a metadata section with name and version fields',
|
|
26
|
+
fixable: false,
|
|
27
|
+
});
|
|
28
|
+
return violations;
|
|
29
|
+
}
|
|
30
|
+
if (!configuration.metadata.name) {
|
|
31
|
+
violations.push({
|
|
32
|
+
ruleId: 'required-metadata',
|
|
33
|
+
severity: 'error',
|
|
34
|
+
file: configPath,
|
|
35
|
+
path: 'metadata.name',
|
|
36
|
+
message: 'Configuration metadata is missing required "name" field',
|
|
37
|
+
impact: 'Cannot identify this configuration',
|
|
38
|
+
suggestion: 'Add a name field to metadata',
|
|
39
|
+
fixable: false,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (!configuration.metadata.version) {
|
|
43
|
+
violations.push({
|
|
44
|
+
ruleId: 'required-metadata',
|
|
45
|
+
severity: 'error',
|
|
46
|
+
file: configPath,
|
|
47
|
+
path: 'metadata.version',
|
|
48
|
+
message: 'Configuration metadata is missing required "version" field',
|
|
49
|
+
impact: 'Cannot track configuration versions',
|
|
50
|
+
suggestion: 'Add a version field (e.g., "1.0.0") to metadata',
|
|
51
|
+
fixable: false,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return violations;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=required-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"required-metadata.js","sourceRoot":"","sources":["../../../src/rules/implementations/required-metadata.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,sDAAsD;IACnE,MAAM,EAAE,oEAAoE;IAC5E,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,QAAQ;IAClB,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,QAAQ,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,2CAA2C;gBACpD,MAAM,EAAE,+CAA+C;gBACvD,UAAU,EAAE,qDAAqD;gBACjE,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;YACH,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,yDAAyD;gBAClE,MAAM,EAAE,oCAAoC;gBAC5C,UAAU,EAAE,8BAA8B;gBAC1C,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,4DAA4D;gBACrE,MAAM,EAAE,qCAAqC;gBAC7C,UAAU,EAAE,iDAAiD;gBAC7D,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: state-transition-references
|
|
3
|
+
* Ensures state transitions only reference defined states
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphRule } from '../types';
|
|
6
|
+
export declare const stateTransitionReferences: GraphRule;
|
|
7
|
+
//# sourceMappingURL=state-transition-references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-transition-references.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/state-transition-references.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,yBAAyB,EAAE,SAkHvC,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: state-transition-references
|
|
3
|
+
* Ensures state transitions only reference defined states
|
|
4
|
+
*/
|
|
5
|
+
export const stateTransitionReferences = {
|
|
6
|
+
id: 'state-transition-references',
|
|
7
|
+
name: 'State Transition References',
|
|
8
|
+
description: 'State transitions must reference states defined in nodeTypes',
|
|
9
|
+
impact: 'Invalid state references will cause state validation to fail',
|
|
10
|
+
severity: 'error',
|
|
11
|
+
category: 'reference',
|
|
12
|
+
enabled: true,
|
|
13
|
+
fixable: false,
|
|
14
|
+
async check(context) {
|
|
15
|
+
const violations = [];
|
|
16
|
+
const { configuration, configPath } = context;
|
|
17
|
+
if (!configuration.validation?.stateTransitions) {
|
|
18
|
+
return violations;
|
|
19
|
+
}
|
|
20
|
+
// Build a map of nodeType -> defined states
|
|
21
|
+
const statesByNodeType = new Map();
|
|
22
|
+
if (configuration.nodeTypes) {
|
|
23
|
+
for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
|
|
24
|
+
if (nodeType.states) {
|
|
25
|
+
statesByNodeType.set(typeId, new Set(Object.keys(nodeType.states)));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Check each state transition rule
|
|
30
|
+
for (const [nodeTypeId, transitions] of Object.entries(configuration.validation.stateTransitions)) {
|
|
31
|
+
const basePath = `validation.stateTransitions.${nodeTypeId}`;
|
|
32
|
+
// Check if nodeType exists
|
|
33
|
+
if (!configuration.nodeTypes?.[nodeTypeId]) {
|
|
34
|
+
violations.push({
|
|
35
|
+
ruleId: 'state-transition-references',
|
|
36
|
+
severity: 'error',
|
|
37
|
+
file: configPath,
|
|
38
|
+
path: basePath,
|
|
39
|
+
message: `State transitions defined for undefined nodeType "${nodeTypeId}"`,
|
|
40
|
+
impact: 'These state transitions will never apply',
|
|
41
|
+
suggestion: `Available nodeTypes: ${Object.keys(configuration.nodeTypes ?? {}).join(', ') || '(none defined)'}`,
|
|
42
|
+
fixable: false,
|
|
43
|
+
});
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// Check if nodeType has states defined
|
|
47
|
+
const definedStates = statesByNodeType.get(nodeTypeId);
|
|
48
|
+
if (!definedStates || definedStates.size === 0) {
|
|
49
|
+
violations.push({
|
|
50
|
+
ruleId: 'state-transition-references',
|
|
51
|
+
severity: 'error',
|
|
52
|
+
file: configPath,
|
|
53
|
+
path: basePath,
|
|
54
|
+
message: `State transitions defined for nodeType "${nodeTypeId}" which has no states`,
|
|
55
|
+
impact: 'These state transitions will never apply',
|
|
56
|
+
suggestion: `Add states to nodeTypes.${nodeTypeId}.states`,
|
|
57
|
+
fixable: false,
|
|
58
|
+
});
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// Check each transition
|
|
62
|
+
if (Array.isArray(transitions)) {
|
|
63
|
+
for (let i = 0; i < transitions.length; i++) {
|
|
64
|
+
const transition = transitions[i];
|
|
65
|
+
const transitionPath = `${basePath}[${i}]`;
|
|
66
|
+
// Check 'from' state
|
|
67
|
+
if (transition.from && !definedStates.has(transition.from)) {
|
|
68
|
+
const suggestion = findSimilar(transition.from, definedStates);
|
|
69
|
+
violations.push({
|
|
70
|
+
ruleId: 'state-transition-references',
|
|
71
|
+
severity: 'error',
|
|
72
|
+
file: configPath,
|
|
73
|
+
path: `${transitionPath}.from`,
|
|
74
|
+
message: `Transition references undefined state "${transition.from}" in nodeType "${nodeTypeId}"`,
|
|
75
|
+
impact: 'This transition will never match',
|
|
76
|
+
suggestion: suggestion
|
|
77
|
+
? `Did you mean "${suggestion}"?`
|
|
78
|
+
: `Available states: ${[...definedStates].join(', ')}`,
|
|
79
|
+
fixable: false,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Check 'to' states
|
|
83
|
+
if (Array.isArray(transition.to)) {
|
|
84
|
+
for (let j = 0; j < transition.to.length; j++) {
|
|
85
|
+
const toState = transition.to[j];
|
|
86
|
+
if (!definedStates.has(toState)) {
|
|
87
|
+
const suggestion = findSimilar(toState, definedStates);
|
|
88
|
+
violations.push({
|
|
89
|
+
ruleId: 'state-transition-references',
|
|
90
|
+
severity: 'error',
|
|
91
|
+
file: configPath,
|
|
92
|
+
path: `${transitionPath}.to[${j}]`,
|
|
93
|
+
message: `Transition references undefined state "${toState}" in nodeType "${nodeTypeId}"`,
|
|
94
|
+
impact: 'This transition target is invalid',
|
|
95
|
+
suggestion: suggestion
|
|
96
|
+
? `Did you mean "${suggestion}"?`
|
|
97
|
+
: `Available states: ${[...definedStates].join(', ')}`,
|
|
98
|
+
fixable: false,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return violations;
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Find a similar string from a set (for "did you mean" suggestions)
|
|
111
|
+
*/
|
|
112
|
+
function findSimilar(input, candidates) {
|
|
113
|
+
const inputLower = input.toLowerCase();
|
|
114
|
+
for (const candidate of candidates) {
|
|
115
|
+
const candidateLower = candidate.toLowerCase();
|
|
116
|
+
// Exact substring match
|
|
117
|
+
if (inputLower.includes(candidateLower) || candidateLower.includes(inputLower)) {
|
|
118
|
+
return candidate;
|
|
119
|
+
}
|
|
120
|
+
// Small edit distance
|
|
121
|
+
if (Math.abs(input.length - candidate.length) <= 2) {
|
|
122
|
+
let differences = 0;
|
|
123
|
+
const minLen = Math.min(inputLower.length, candidateLower.length);
|
|
124
|
+
for (let i = 0; i < minLen; i++) {
|
|
125
|
+
if (inputLower[i] !== candidateLower[i])
|
|
126
|
+
differences++;
|
|
127
|
+
}
|
|
128
|
+
differences += Math.abs(input.length - candidate.length);
|
|
129
|
+
if (differences <= 2)
|
|
130
|
+
return candidate;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=state-transition-references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-transition-references.js","sourceRoot":"","sources":["../../../src/rules/implementations/state-transition-references.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unreachable-states.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/unreachable-states.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAEhF,eAAO,MAAM,iBAAiB,EAAE,SAsF/B,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: unreachable-states
|
|
3
|
+
* Warns when states have no entry transitions (cannot be reached)
|
|
4
|
+
*/
|
|
5
|
+
export const unreachableStates = {
|
|
6
|
+
id: 'unreachable-states',
|
|
7
|
+
name: 'Unreachable States',
|
|
8
|
+
description: 'States should have at least one entry transition or be an initial state',
|
|
9
|
+
impact: 'Unreachable states can never be entered and may indicate configuration errors',
|
|
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) {
|
|
18
|
+
return violations;
|
|
19
|
+
}
|
|
20
|
+
// For each nodeType with states, check if all states are reachable
|
|
21
|
+
for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
|
|
22
|
+
if (!nodeType.states || Object.keys(nodeType.states).length === 0) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const stateIds = Object.keys(nodeType.states);
|
|
26
|
+
// If there's only one state, it's implicitly the initial state
|
|
27
|
+
if (stateIds.length <= 1) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
// Get state transitions for this nodeType
|
|
31
|
+
const transitions = configuration.validation?.stateTransitions?.[typeId];
|
|
32
|
+
if (!transitions || !Array.isArray(transitions) || transitions.length === 0) {
|
|
33
|
+
// No transitions defined - all states except the first are unreachable
|
|
34
|
+
// The first state is conventionally the initial state
|
|
35
|
+
for (let i = 1; i < stateIds.length; i++) {
|
|
36
|
+
violations.push({
|
|
37
|
+
ruleId: 'unreachable-states',
|
|
38
|
+
severity: 'error',
|
|
39
|
+
file: configPath,
|
|
40
|
+
path: `nodeTypes.${typeId}.states.${stateIds[i]}`,
|
|
41
|
+
message: `State "${stateIds[i]}" in node type "${typeId}" has no entry transitions`,
|
|
42
|
+
impact: 'This state can never be reached',
|
|
43
|
+
suggestion: `Add a state transition to "${stateIds[i]}" in validation.stateTransitions.${typeId}`,
|
|
44
|
+
fixable: false,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Build set of states that can be reached (are targets of transitions)
|
|
50
|
+
const reachableStates = new Set();
|
|
51
|
+
// First state is assumed to be the initial state
|
|
52
|
+
reachableStates.add(stateIds[0]);
|
|
53
|
+
// Add all states that are targets of transitions
|
|
54
|
+
for (const transition of transitions) {
|
|
55
|
+
if (Array.isArray(transition.to)) {
|
|
56
|
+
for (const toState of transition.to) {
|
|
57
|
+
reachableStates.add(toState);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Check for unreachable states
|
|
62
|
+
for (const stateId of stateIds) {
|
|
63
|
+
if (!reachableStates.has(stateId)) {
|
|
64
|
+
violations.push({
|
|
65
|
+
ruleId: 'unreachable-states',
|
|
66
|
+
severity: 'error',
|
|
67
|
+
file: configPath,
|
|
68
|
+
path: `nodeTypes.${typeId}.states.${stateId}`,
|
|
69
|
+
message: `State "${stateId}" in node type "${typeId}" has no entry transitions`,
|
|
70
|
+
impact: 'This state can never be reached',
|
|
71
|
+
suggestion: `Add a state transition to "${stateId}" in validation.stateTransitions.${typeId}`,
|
|
72
|
+
fixable: false,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return violations;
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=unreachable-states.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unreachable-states.js","sourceRoot":"","sources":["../../../src/rules/implementations/unreachable-states.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: valid-action-patterns
|
|
3
|
+
* Ensures action pattern regex is syntactically valid
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphRule, RuleOptions } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Options for valid-action-patterns rule
|
|
8
|
+
*/
|
|
9
|
+
export interface ValidActionPatternsOptions extends RuleOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Enable strict mode - also validates capture group references
|
|
12
|
+
* @default false
|
|
13
|
+
*/
|
|
14
|
+
strictMode: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const validActionPatterns: GraphRule<ValidActionPatternsOptions>;
|
|
17
|
+
//# sourceMappingURL=valid-action-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-action-patterns.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/valid-action-patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,WAAW,EAAE,MAAM,UAAU,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,WAAW;IAC7D;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;CACrB;AAMD,eAAO,MAAM,mBAAmB,EAAE,SAAS,CAAC,0BAA0B,CAgGrE,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: valid-action-patterns
|
|
3
|
+
* Ensures action pattern regex is syntactically valid
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_OPTIONS = {
|
|
6
|
+
strictMode: false,
|
|
7
|
+
};
|
|
8
|
+
export const validActionPatterns = {
|
|
9
|
+
id: 'valid-action-patterns',
|
|
10
|
+
name: 'Valid Action Patterns',
|
|
11
|
+
description: 'Action pattern regex must be syntactically valid',
|
|
12
|
+
impact: 'Invalid regex patterns will cause runtime errors during log processing',
|
|
13
|
+
severity: 'error',
|
|
14
|
+
category: 'pattern',
|
|
15
|
+
enabled: true,
|
|
16
|
+
fixable: false,
|
|
17
|
+
defaultOptions: DEFAULT_OPTIONS,
|
|
18
|
+
async check(context) {
|
|
19
|
+
const violations = [];
|
|
20
|
+
const { configuration, configPath, options } = context;
|
|
21
|
+
if (!configuration.nodeTypes) {
|
|
22
|
+
return violations;
|
|
23
|
+
}
|
|
24
|
+
for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
|
|
25
|
+
// Check if nodeType has actions (from path-based config extension)
|
|
26
|
+
const nodeTypeAny = nodeType;
|
|
27
|
+
const actions = nodeTypeAny.actions;
|
|
28
|
+
if (!Array.isArray(actions)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
for (let i = 0; i < actions.length; i++) {
|
|
32
|
+
const action = actions[i];
|
|
33
|
+
const pattern = action.pattern;
|
|
34
|
+
const basePath = `nodeTypes.${typeId}.actions[${i}]`;
|
|
35
|
+
if (typeof pattern !== 'string') {
|
|
36
|
+
violations.push({
|
|
37
|
+
ruleId: 'valid-action-patterns',
|
|
38
|
+
severity: 'error',
|
|
39
|
+
file: configPath,
|
|
40
|
+
path: `${basePath}.pattern`,
|
|
41
|
+
message: `Action pattern must be a string`,
|
|
42
|
+
impact: 'Pattern matching will fail',
|
|
43
|
+
suggestion: 'Provide a valid regex pattern string',
|
|
44
|
+
fixable: false,
|
|
45
|
+
});
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Test if regex is valid
|
|
49
|
+
try {
|
|
50
|
+
new RegExp(pattern);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
54
|
+
violations.push({
|
|
55
|
+
ruleId: 'valid-action-patterns',
|
|
56
|
+
severity: 'error',
|
|
57
|
+
file: configPath,
|
|
58
|
+
path: `${basePath}.pattern`,
|
|
59
|
+
message: `Invalid regex pattern "${pattern}": ${errorMessage}`,
|
|
60
|
+
impact: 'Pattern matching will fail at runtime',
|
|
61
|
+
suggestion: 'Fix the regex syntax error',
|
|
62
|
+
fixable: false,
|
|
63
|
+
});
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// In strict mode, validate capture group references in metadata
|
|
67
|
+
if (options.strictMode) {
|
|
68
|
+
const metadata = action.metadata;
|
|
69
|
+
if (metadata) {
|
|
70
|
+
// Extract capture group names from pattern
|
|
71
|
+
const captureGroupNames = extractCaptureGroupNames(pattern);
|
|
72
|
+
for (const [metaKey, metaValue] of Object.entries(metadata)) {
|
|
73
|
+
if (typeof metaValue === 'string' && metaValue.startsWith('$')) {
|
|
74
|
+
const groupName = metaValue.slice(1);
|
|
75
|
+
if (!captureGroupNames.has(groupName)) {
|
|
76
|
+
violations.push({
|
|
77
|
+
ruleId: 'valid-action-patterns',
|
|
78
|
+
severity: 'error',
|
|
79
|
+
file: configPath,
|
|
80
|
+
path: `${basePath}.metadata.${metaKey}`,
|
|
81
|
+
message: `Metadata references undefined capture group "$${groupName}"`,
|
|
82
|
+
impact: 'Metadata extraction will fail',
|
|
83
|
+
suggestion: `Available capture groups: ${[...captureGroupNames].join(', ') || '(none)'}`,
|
|
84
|
+
fixable: false,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return violations;
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Extract named capture group names from a regex pattern
|
|
98
|
+
*/
|
|
99
|
+
function extractCaptureGroupNames(pattern) {
|
|
100
|
+
const names = new Set();
|
|
101
|
+
// Match named capture groups: (?<name>...)
|
|
102
|
+
const namedGroupRegex = /\(\?<([a-zA-Z_][a-zA-Z0-9_]*)>/g;
|
|
103
|
+
let match;
|
|
104
|
+
while ((match = namedGroupRegex.exec(pattern)) !== null) {
|
|
105
|
+
names.add(match[1]);
|
|
106
|
+
}
|
|
107
|
+
return names;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=valid-action-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-action-patterns.js","sourceRoot":"","sources":["../../../src/rules/implementations/valid-action-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-color-format.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/valid-color-format.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAOhF,eAAO,MAAM,gBAAgB,EAAE,SAkG9B,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule: valid-color-format
|
|
3
|
+
* Ensures all color values are valid hex codes
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Regex for valid hex color codes (#RGB or #RRGGBB)
|
|
7
|
+
*/
|
|
8
|
+
const HEX_COLOR_REGEX = /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;
|
|
9
|
+
export const validColorFormat = {
|
|
10
|
+
id: 'valid-color-format',
|
|
11
|
+
name: 'Valid Color Format',
|
|
12
|
+
description: 'Color values must be valid hex codes (#RGB or #RRGGBB)',
|
|
13
|
+
impact: 'Invalid colors may render incorrectly or cause visualization errors',
|
|
14
|
+
severity: 'error',
|
|
15
|
+
category: 'schema',
|
|
16
|
+
enabled: true,
|
|
17
|
+
fixable: true,
|
|
18
|
+
async check(context) {
|
|
19
|
+
const violations = [];
|
|
20
|
+
const { configuration, configPath } = context;
|
|
21
|
+
// Check nodeTypes colors
|
|
22
|
+
if (configuration.nodeTypes) {
|
|
23
|
+
for (const [typeId, nodeType] of Object.entries(configuration.nodeTypes)) {
|
|
24
|
+
// Check node color
|
|
25
|
+
if (nodeType.color && !isValidColor(nodeType.color)) {
|
|
26
|
+
violations.push(createColorViolation(configPath, `nodeTypes.${typeId}.color`, nodeType.color, `node type "${typeId}"`));
|
|
27
|
+
}
|
|
28
|
+
// Check node stroke color
|
|
29
|
+
if (nodeType.stroke && !isValidColor(nodeType.stroke)) {
|
|
30
|
+
violations.push(createColorViolation(configPath, `nodeTypes.${typeId}.stroke`, nodeType.stroke, `node type "${typeId}" stroke`));
|
|
31
|
+
}
|
|
32
|
+
// Check state colors
|
|
33
|
+
if (nodeType.states) {
|
|
34
|
+
for (const [stateName, stateDef] of Object.entries(nodeType.states)) {
|
|
35
|
+
if (stateDef.color && !isValidColor(stateDef.color)) {
|
|
36
|
+
violations.push(createColorViolation(configPath, `nodeTypes.${typeId}.states.${stateName}.color`, stateDef.color, `state "${stateName}" in node type "${typeId}"`));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Check edgeTypes colors
|
|
43
|
+
if (configuration.edgeTypes) {
|
|
44
|
+
for (const [typeId, edgeType] of Object.entries(configuration.edgeTypes)) {
|
|
45
|
+
// Check edge color
|
|
46
|
+
if (edgeType.color && !isValidColor(edgeType.color)) {
|
|
47
|
+
violations.push(createColorViolation(configPath, `edgeTypes.${typeId}.color`, edgeType.color, `edge type "${typeId}"`));
|
|
48
|
+
}
|
|
49
|
+
// Check animation color
|
|
50
|
+
if (edgeType.animation?.color && !isValidColor(edgeType.animation.color)) {
|
|
51
|
+
violations.push(createColorViolation(configPath, `edgeTypes.${typeId}.animation.color`, edgeType.animation.color, `animation in edge type "${typeId}"`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Check display theme colors
|
|
56
|
+
if (configuration.display?.theme) {
|
|
57
|
+
const theme = configuration.display.theme;
|
|
58
|
+
const themeColors = ['primary', 'success', 'warning', 'danger', 'info'];
|
|
59
|
+
for (const colorKey of themeColors) {
|
|
60
|
+
const colorValue = theme[colorKey];
|
|
61
|
+
if (colorValue && !isValidColor(colorValue)) {
|
|
62
|
+
violations.push(createColorViolation(configPath, `display.theme.${colorKey}`, colorValue, `theme ${colorKey} color`));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return violations;
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Check if a color value is valid
|
|
71
|
+
*/
|
|
72
|
+
function isValidColor(color) {
|
|
73
|
+
return HEX_COLOR_REGEX.test(color);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a color format violation
|
|
77
|
+
*/
|
|
78
|
+
function createColorViolation(configPath, path, value, description) {
|
|
79
|
+
return {
|
|
80
|
+
ruleId: 'valid-color-format',
|
|
81
|
+
severity: 'error',
|
|
82
|
+
file: configPath,
|
|
83
|
+
path,
|
|
84
|
+
message: `Invalid color format "${value}" for ${description}`,
|
|
85
|
+
impact: 'Color may not render correctly',
|
|
86
|
+
suggestion: 'Use hex format: #RGB or #RRGGBB (e.g., #3b82f6 or #f00)',
|
|
87
|
+
fixable: true,
|
|
88
|
+
fixData: { path, value, description },
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=valid-color-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-color-format.js","sourceRoot":"","sources":["../../../src/rules/implementations/valid-color-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valid-edge-types.d.ts","sourceRoot":"","sources":["../../../src/rules/implementations/valid-edge-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAwC,MAAM,UAAU,CAAC;AAsBhF,eAAO,MAAM,cAAc,EAAE,SAsO5B,CAAC"}
|