@principal-ai/principal-view-core 0.10.4 → 0.11.0

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.
@@ -6,6 +6,7 @@
6
6
  * - Nested properties: {{result.violations.total}}
7
7
  * - Conditionals: {{#if condition}}...{{/if}}
8
8
  * - Loops: {{#each items}}...{{/each}}
9
+ * - Comparison helpers: {{#if (eq a b)}}...{{/if}}
9
10
  */
10
11
  /**
11
12
  * Parse and evaluate a template string using Handlebars
@@ -1 +1 @@
1
- {"version":3,"file":"template-parser.d.ts","sourceRoot":"","sources":["../../src/narrative/template-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAOxF"}
1
+ {"version":3,"file":"template-parser.d.ts","sourceRoot":"","sources":["../../src/narrative/template-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAuBH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAOxF"}
@@ -6,8 +6,27 @@
6
6
  * - Nested properties: {{result.violations.total}}
7
7
  * - Conditionals: {{#if condition}}...{{/if}}
8
8
  * - Loops: {{#each items}}...{{/each}}
9
+ * - Comparison helpers: {{#if (eq a b)}}...{{/if}}
9
10
  */
10
11
  import Handlebars from 'handlebars';
12
+ // Register common comparison helpers
13
+ Handlebars.registerHelper('eq', (a, b) => a === b);
14
+ Handlebars.registerHelper('ne', (a, b) => a !== b);
15
+ Handlebars.registerHelper('lt', (a, b) => a < b);
16
+ Handlebars.registerHelper('gt', (a, b) => a > b);
17
+ Handlebars.registerHelper('lte', (a, b) => a <= b);
18
+ Handlebars.registerHelper('gte', (a, b) => a >= b);
19
+ Handlebars.registerHelper('and', (...args) => {
20
+ // Last argument is Handlebars options object
21
+ const values = args.slice(0, -1);
22
+ return values.every(Boolean);
23
+ });
24
+ Handlebars.registerHelper('or', (...args) => {
25
+ // Last argument is Handlebars options object
26
+ const values = args.slice(0, -1);
27
+ return values.some(Boolean);
28
+ });
29
+ Handlebars.registerHelper('not', (a) => !a);
11
30
  /**
12
31
  * Parse and evaluate a template string using Handlebars
13
32
  *
@@ -1 +1 @@
1
- {"version":3,"file":"template-parser.js","sourceRoot":"","sources":["../../src/narrative/template-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAgC;IAC9E,IAAI;QACF,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;KACnC;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;KACnG;AACH,CAAC"}
1
+ {"version":3,"file":"template-parser.js","sourceRoot":"","sources":["../../src/narrative/template-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,qCAAqC;AACrC,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;IAC3C,6CAA6C;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AACH,UAAU,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;IAC1C,6CAA6C;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AACH,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAgC;IAC9E,IAAI;QACF,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;KACnC;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;KACnG;AACH,CAAC"}
@@ -17,6 +17,13 @@ export interface NarrativeValidationContext {
17
17
  basePath: string;
18
18
  /** Raw narrative content for line number lookup */
19
19
  rawContent?: string;
20
+ /** Execution data for validating attribute references (optional) */
21
+ executionData?: {
22
+ /** Aggregated attributes available in templates */
23
+ aggregates: Record<string, unknown>;
24
+ /** Attributes grouped by event name */
25
+ eventAttributes: Map<string, Record<string, unknown>>;
26
+ };
20
27
  }
21
28
  export interface NarrativeViolation {
22
29
  /** Rule ID that detected this violation */
@@ -94,9 +101,36 @@ export declare class NarrativeValidator {
94
101
  */
95
102
  private validateTemplateString;
96
103
  /**
97
- * Check attribute references (warning level)
104
+ * Check attribute references against execution data
105
+ *
106
+ * Validates that:
107
+ * - Attributes referenced in templates exist in execution data
108
+ * - Object attributes are accessed via properties (not used directly)
109
+ * - Attribute names are correct (catches typos)
98
110
  */
99
111
  private checkAttributeReferences;
112
+ /**
113
+ * Validate a list of attribute references against available data
114
+ *
115
+ * @param attributes - Attribute paths to validate
116
+ * @param aggregates - Global aggregate attributes
117
+ * @param eventAttributes - Event-specific attributes (if validating event template)
118
+ * @param file - File path for violation reporting
119
+ * @param path - JSON path for violation reporting
120
+ * @param eventName - Event name (if validating event template)
121
+ * @returns Array of violations found
122
+ */
123
+ private validateAttributes;
124
+ /**
125
+ * Find similar attribute names for helpful suggestions
126
+ *
127
+ * Uses simple string similarity (Levenshtein-like) to find typos
128
+ *
129
+ * @param target - The attribute being searched for
130
+ * @param available - Available attribute names
131
+ * @returns Array of similar attribute names (max 3)
132
+ */
133
+ private findSimilarAttributes;
100
134
  /**
101
135
  * Check formatting options
102
136
  */
@@ -131,6 +165,38 @@ export declare class NarrativeValidator {
131
165
  * - "installation.started" -> ""
132
166
  */
133
167
  private extractAttributeValue;
168
+ /**
169
+ * Extract attribute references from Handlebars template
170
+ *
171
+ * Parses template strings like:
172
+ * - "{{source}}" -> ["source"]
173
+ * - "{{source.url}}" -> ["source.url"]
174
+ * - "{{#if options.global}}" -> ["options.global"]
175
+ * - "{{#if (eq install.mode 'symlink')}}" -> ["install.mode"]
176
+ *
177
+ * @param template - Handlebars template string
178
+ * @returns Array of attribute paths referenced in the template
179
+ */
180
+ private extractAttributeReferences;
181
+ /**
182
+ * Extract attribute references from a single Handlebars expression
183
+ *
184
+ * Handles:
185
+ * - Simple references: source.url
186
+ * - Helper calls: (eq install.mode 'symlink')
187
+ * - Nested expressions
188
+ *
189
+ * @param expression - The expression to parse
190
+ * @param attributes - Set to add found attributes to
191
+ */
192
+ private extractAttributesFromExpression;
193
+ /**
194
+ * Check if an attribute is an object type
195
+ *
196
+ * @param value - The attribute value to check
197
+ * @returns true if value is a plain object (not array, not null)
198
+ */
199
+ private isObjectType;
134
200
  }
135
201
  /**
136
202
  * Create a validator instance
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/narrative/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAQtD,MAAM,WAAW,0BAA0B;IACzC,6CAA6C;IAC7C,SAAS,EAAE,iBAAiB,CAAC;IAE7B,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IAEtB,iCAAiC;IACjC,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IAEjB,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IAEf,qBAAqB;IACrB,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAE3B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IAEf,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,yBAAyB;IACxC,2BAA2B;IAC3B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IAEjC,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IAEnB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAC;IAErB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,qBAAa,kBAAkB;IAC7B;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC;IAwBrC;;OAEG;IACH,OAAO,CAAC,WAAW;IA4InB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAuE5B;;OAEG;IACH,OAAO,CAAC,cAAc;IA6ItB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAqD/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqD9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+D5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA4E3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyF9B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA4B9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA4BxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;CAO9B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CAE7D"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/narrative/validator.ts"],"names":[],"mappings":"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"}
@@ -691,14 +691,144 @@ export class NarrativeValidator {
691
691
  return violations;
692
692
  }
693
693
  /**
694
- * Check attribute references (warning level)
694
+ * Check attribute references against execution data
695
+ *
696
+ * Validates that:
697
+ * - Attributes referenced in templates exist in execution data
698
+ * - Object attributes are accessed via properties (not used directly)
699
+ * - Attribute names are correct (catches typos)
700
+ */
701
+ checkAttributeReferences(context) {
702
+ const violations = [];
703
+ const { narrative, narrativePath, executionData } = context;
704
+ // Skip if no execution data provided
705
+ if (!executionData) {
706
+ return violations;
707
+ }
708
+ const { aggregates, eventAttributes } = executionData;
709
+ // Check each scenario's template
710
+ for (const scenario of narrative.scenarios) {
711
+ const scenarioPath = `scenarios[${scenario.id}]`;
712
+ // Check introduction template
713
+ if (scenario.template.introduction) {
714
+ const attrs = this.extractAttributeReferences(scenario.template.introduction);
715
+ violations.push(...this.validateAttributes(attrs, aggregates, null, // introduction doesn't have specific event context
716
+ narrativePath, `${scenarioPath}.template.introduction`));
717
+ }
718
+ // Check event templates
719
+ if (scenario.template.events) {
720
+ for (const [eventName, eventTemplate] of Object.entries(scenario.template.events)) {
721
+ const attrs = this.extractAttributeReferences(eventTemplate);
722
+ const eventAttrs = eventAttributes.get(eventName);
723
+ violations.push(...this.validateAttributes(attrs, aggregates, eventAttrs || null, narrativePath, `${scenarioPath}.template.events.${eventName}`, eventName));
724
+ }
725
+ }
726
+ // Check summary template
727
+ if (scenario.template.summary) {
728
+ const attrs = this.extractAttributeReferences(scenario.template.summary);
729
+ violations.push(...this.validateAttributes(attrs, aggregates, null, // summary uses global aggregates
730
+ narrativePath, `${scenarioPath}.template.summary`));
731
+ }
732
+ }
733
+ return violations;
734
+ }
735
+ /**
736
+ * Validate a list of attribute references against available data
737
+ *
738
+ * @param attributes - Attribute paths to validate
739
+ * @param aggregates - Global aggregate attributes
740
+ * @param eventAttributes - Event-specific attributes (if validating event template)
741
+ * @param file - File path for violation reporting
742
+ * @param path - JSON path for violation reporting
743
+ * @param eventName - Event name (if validating event template)
744
+ * @returns Array of violations found
695
745
  */
696
- checkAttributeReferences(_context) {
746
+ validateAttributes(attributes, aggregates, eventAttributes, file, path, eventName) {
697
747
  const violations = [];
698
- // This would require parsing template expressions and checking against canvas schemas
699
- // Implementing as a warning-level check for future enhancement
748
+ for (const attr of attributes) {
749
+ // Check if attribute exists in global aggregates
750
+ const globalValue = aggregates[attr];
751
+ const eventValue = eventAttributes?.[attr];
752
+ // Attribute doesn't exist anywhere
753
+ if (globalValue === undefined && eventValue === undefined) {
754
+ // Try to find similar attributes for helpful suggestions
755
+ const allKeys = [
756
+ ...Object.keys(aggregates),
757
+ ...(eventAttributes ? Object.keys(eventAttributes) : []),
758
+ ];
759
+ const similar = this.findSimilarAttributes(attr, allKeys);
760
+ violations.push({
761
+ ruleId: 'narrative-attribute-undefined',
762
+ severity: 'warn',
763
+ file,
764
+ path,
765
+ message: eventName
766
+ ? `Attribute "{{${attr}}}" not found in event "${eventName}" or global aggregates`
767
+ : `Attribute "{{${attr}}}" not found in execution data`,
768
+ impact: 'Template will render as empty or "undefined"',
769
+ suggestion: similar.length > 0 ? `Did you mean: ${similar.join(', ')}?` : undefined,
770
+ fixable: false,
771
+ });
772
+ continue;
773
+ }
774
+ // Check if object is used directly (should use property access)
775
+ const value = eventValue !== undefined ? eventValue : globalValue;
776
+ if (this.isObjectType(value)) {
777
+ const objectKeys = Object.keys(value);
778
+ const suggestions = objectKeys.slice(0, 3).map((k) => `{{${attr}.${k}}}`);
779
+ violations.push({
780
+ ruleId: 'narrative-attribute-object',
781
+ severity: 'warn',
782
+ file,
783
+ path,
784
+ message: `Attribute "{{${attr}}}" is an object and will render as "[object Object]"`,
785
+ impact: 'Template will show "[object Object]" instead of useful data',
786
+ suggestion: `Access a property instead: ${suggestions.join(', ')}`,
787
+ fixable: false,
788
+ });
789
+ }
790
+ }
700
791
  return violations;
701
792
  }
793
+ /**
794
+ * Find similar attribute names for helpful suggestions
795
+ *
796
+ * Uses simple string similarity (Levenshtein-like) to find typos
797
+ *
798
+ * @param target - The attribute being searched for
799
+ * @param available - Available attribute names
800
+ * @returns Array of similar attribute names (max 3)
801
+ */
802
+ findSimilarAttributes(target, available) {
803
+ const similar = [];
804
+ for (const attr of available) {
805
+ // Check for prefix match
806
+ if (attr.startsWith(target) || target.startsWith(attr)) {
807
+ similar.push({ attr, score: 10 });
808
+ continue;
809
+ }
810
+ // Check for substring match
811
+ if (attr.includes(target) || target.includes(attr)) {
812
+ similar.push({ attr, score: 5 });
813
+ continue;
814
+ }
815
+ // Check for similar structure (same number of dots)
816
+ const targetParts = target.split('.');
817
+ const attrParts = attr.split('.');
818
+ if (targetParts.length === attrParts.length) {
819
+ // Check if any parts match
820
+ const matchingParts = targetParts.filter((p, i) => p === attrParts[i]).length;
821
+ if (matchingParts > 0) {
822
+ similar.push({ attr, score: matchingParts });
823
+ }
824
+ }
825
+ }
826
+ // Sort by score and return top 3
827
+ return similar
828
+ .sort((a, b) => b.score - a.score)
829
+ .slice(0, 3)
830
+ .map((s) => s.attr);
831
+ }
702
832
  /**
703
833
  * Check formatting options
704
834
  */
@@ -805,6 +935,87 @@ export class NarrativeValidator {
805
935
  }
806
936
  return match[1];
807
937
  }
938
+ /**
939
+ * Extract attribute references from Handlebars template
940
+ *
941
+ * Parses template strings like:
942
+ * - "{{source}}" -> ["source"]
943
+ * - "{{source.url}}" -> ["source.url"]
944
+ * - "{{#if options.global}}" -> ["options.global"]
945
+ * - "{{#if (eq install.mode 'symlink')}}" -> ["install.mode"]
946
+ *
947
+ * @param template - Handlebars template string
948
+ * @returns Array of attribute paths referenced in the template
949
+ */
950
+ extractAttributeReferences(template) {
951
+ const attributes = new Set();
952
+ // Match all Handlebars expressions: {{...}}
953
+ const expressionPattern = /\{\{([^}]+)\}\}/g;
954
+ let match;
955
+ while ((match = expressionPattern.exec(template)) !== null) {
956
+ const expression = match[1].trim();
957
+ // Skip block helpers closing tags
958
+ if (expression.startsWith('/')) {
959
+ continue;
960
+ }
961
+ // Handle block helpers: #if, #each, #unless, etc.
962
+ if (expression.startsWith('#')) {
963
+ // Extract the condition/expression after the helper
964
+ const helperMatch = expression.match(/^#\w+\s+(.+)$/);
965
+ if (helperMatch) {
966
+ this.extractAttributesFromExpression(helperMatch[1], attributes);
967
+ }
968
+ continue;
969
+ }
970
+ // Handle regular expressions
971
+ this.extractAttributesFromExpression(expression, attributes);
972
+ }
973
+ return Array.from(attributes);
974
+ }
975
+ /**
976
+ * Extract attribute references from a single Handlebars expression
977
+ *
978
+ * Handles:
979
+ * - Simple references: source.url
980
+ * - Helper calls: (eq install.mode 'symlink')
981
+ * - Nested expressions
982
+ *
983
+ * @param expression - The expression to parse
984
+ * @param attributes - Set to add found attributes to
985
+ */
986
+ extractAttributesFromExpression(expression, attributes) {
987
+ // Remove helper parentheses: (eq install.mode 'symlink') -> eq install.mode 'symlink'
988
+ const cleaned = expression.replace(/^\(|\)$/g, '').trim();
989
+ // Split on spaces to handle helper arguments
990
+ const parts = cleaned.split(/\s+/);
991
+ for (const part of parts) {
992
+ // Skip helper names, string literals, numbers, and boolean literals
993
+ if (part.match(/^(if|unless|each|with|eq|ne|lt|gt|lte|gte|and|or|not)$/) ||
994
+ part.match(/^['"].*['"]$/) ||
995
+ part.match(/^\d+$/) ||
996
+ part.match(/^(true|false|null|undefined)$/)) {
997
+ continue;
998
+ }
999
+ // Remove any remaining quotes or parentheses
1000
+ const cleanPart = part.replace(/['"()]/g, '');
1001
+ // If it looks like an attribute path (contains letters/dots/underscores)
1002
+ if (cleanPart && cleanPart.match(/^[a-zA-Z_][a-zA-Z0-9_.]*$/)) {
1003
+ attributes.add(cleanPart);
1004
+ }
1005
+ }
1006
+ }
1007
+ /**
1008
+ * Check if an attribute is an object type
1009
+ *
1010
+ * @param value - The attribute value to check
1011
+ * @returns true if value is a plain object (not array, not null)
1012
+ */
1013
+ isObjectType(value) {
1014
+ return (typeof value === 'object' &&
1015
+ value !== null &&
1016
+ !Array.isArray(value) &&
1017
+ !(value instanceof Date));
1018
+ }
808
1019
  }
809
1020
  /**
810
1021
  * Create a validator instance
@@ -1 +1 @@
1
- {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/narrative/validator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/narrative/validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ai/principal-view-core",
3
- "version": "0.10.4",
3
+ "version": "0.11.0",
4
4
  "description": "Core logic and types for graph-based principal view framework",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -6,10 +6,30 @@
6
6
  * - Nested properties: {{result.violations.total}}
7
7
  * - Conditionals: {{#if condition}}...{{/if}}
8
8
  * - Loops: {{#each items}}...{{/each}}
9
+ * - Comparison helpers: {{#if (eq a b)}}...{{/if}}
9
10
  */
10
11
 
11
12
  import Handlebars from 'handlebars';
12
13
 
14
+ // Register common comparison helpers
15
+ Handlebars.registerHelper('eq', (a, b) => a === b);
16
+ Handlebars.registerHelper('ne', (a, b) => a !== b);
17
+ Handlebars.registerHelper('lt', (a, b) => a < b);
18
+ Handlebars.registerHelper('gt', (a, b) => a > b);
19
+ Handlebars.registerHelper('lte', (a, b) => a <= b);
20
+ Handlebars.registerHelper('gte', (a, b) => a >= b);
21
+ Handlebars.registerHelper('and', (...args) => {
22
+ // Last argument is Handlebars options object
23
+ const values = args.slice(0, -1);
24
+ return values.every(Boolean);
25
+ });
26
+ Handlebars.registerHelper('or', (...args) => {
27
+ // Last argument is Handlebars options object
28
+ const values = args.slice(0, -1);
29
+ return values.some(Boolean);
30
+ });
31
+ Handlebars.registerHelper('not', (a) => !a);
32
+
13
33
  /**
14
34
  * Parse and evaluate a template string using Handlebars
15
35
  *
@@ -30,6 +30,14 @@ export interface NarrativeValidationContext {
30
30
 
31
31
  /** Raw narrative content for line number lookup */
32
32
  rawContent?: string;
33
+
34
+ /** Execution data for validating attribute references (optional) */
35
+ executionData?: {
36
+ /** Aggregated attributes available in templates */
37
+ aggregates: Record<string, unknown>;
38
+ /** Attributes grouped by event name */
39
+ eventAttributes: Map<string, Record<string, unknown>>;
40
+ };
33
41
  }
34
42
 
35
43
  export interface NarrativeViolation {
@@ -855,15 +863,195 @@ export class NarrativeValidator {
855
863
  }
856
864
 
857
865
  /**
858
- * Check attribute references (warning level)
866
+ * Check attribute references against execution data
867
+ *
868
+ * Validates that:
869
+ * - Attributes referenced in templates exist in execution data
870
+ * - Object attributes are accessed via properties (not used directly)
871
+ * - Attribute names are correct (catches typos)
872
+ */
873
+ private checkAttributeReferences(context: NarrativeValidationContext): NarrativeViolation[] {
874
+ const violations: NarrativeViolation[] = [];
875
+ const { narrative, narrativePath, executionData } = context;
876
+
877
+ // Skip if no execution data provided
878
+ if (!executionData) {
879
+ return violations;
880
+ }
881
+
882
+ const { aggregates, eventAttributes } = executionData;
883
+
884
+ // Check each scenario's template
885
+ for (const scenario of narrative.scenarios) {
886
+ const scenarioPath = `scenarios[${scenario.id}]`;
887
+
888
+ // Check introduction template
889
+ if (scenario.template.introduction) {
890
+ const attrs = this.extractAttributeReferences(scenario.template.introduction);
891
+ violations.push(
892
+ ...this.validateAttributes(
893
+ attrs,
894
+ aggregates,
895
+ null, // introduction doesn't have specific event context
896
+ narrativePath,
897
+ `${scenarioPath}.template.introduction`
898
+ )
899
+ );
900
+ }
901
+
902
+ // Check event templates
903
+ if (scenario.template.events) {
904
+ for (const [eventName, eventTemplate] of Object.entries(scenario.template.events)) {
905
+ const attrs = this.extractAttributeReferences(eventTemplate);
906
+ const eventAttrs = eventAttributes.get(eventName);
907
+
908
+ violations.push(
909
+ ...this.validateAttributes(
910
+ attrs,
911
+ aggregates,
912
+ eventAttrs || null,
913
+ narrativePath,
914
+ `${scenarioPath}.template.events.${eventName}`,
915
+ eventName
916
+ )
917
+ );
918
+ }
919
+ }
920
+
921
+ // Check summary template
922
+ if (scenario.template.summary) {
923
+ const attrs = this.extractAttributeReferences(scenario.template.summary);
924
+ violations.push(
925
+ ...this.validateAttributes(
926
+ attrs,
927
+ aggregates,
928
+ null, // summary uses global aggregates
929
+ narrativePath,
930
+ `${scenarioPath}.template.summary`
931
+ )
932
+ );
933
+ }
934
+ }
935
+
936
+ return violations;
937
+ }
938
+
939
+ /**
940
+ * Validate a list of attribute references against available data
941
+ *
942
+ * @param attributes - Attribute paths to validate
943
+ * @param aggregates - Global aggregate attributes
944
+ * @param eventAttributes - Event-specific attributes (if validating event template)
945
+ * @param file - File path for violation reporting
946
+ * @param path - JSON path for violation reporting
947
+ * @param eventName - Event name (if validating event template)
948
+ * @returns Array of violations found
859
949
  */
860
- private checkAttributeReferences(_context: NarrativeValidationContext): NarrativeViolation[] {
950
+ private validateAttributes(
951
+ attributes: string[],
952
+ aggregates: Record<string, unknown>,
953
+ eventAttributes: Record<string, unknown> | null,
954
+ file: string,
955
+ path: string,
956
+ eventName?: string
957
+ ): NarrativeViolation[] {
861
958
  const violations: NarrativeViolation[] = [];
862
- // This would require parsing template expressions and checking against canvas schemas
863
- // Implementing as a warning-level check for future enhancement
959
+
960
+ for (const attr of attributes) {
961
+ // Check if attribute exists in global aggregates
962
+ const globalValue = aggregates[attr];
963
+ const eventValue = eventAttributes?.[attr];
964
+
965
+ // Attribute doesn't exist anywhere
966
+ if (globalValue === undefined && eventValue === undefined) {
967
+ // Try to find similar attributes for helpful suggestions
968
+ const allKeys = [
969
+ ...Object.keys(aggregates),
970
+ ...(eventAttributes ? Object.keys(eventAttributes) : []),
971
+ ];
972
+ const similar = this.findSimilarAttributes(attr, allKeys);
973
+
974
+ violations.push({
975
+ ruleId: 'narrative-attribute-undefined',
976
+ severity: 'warn',
977
+ file,
978
+ path,
979
+ message: eventName
980
+ ? `Attribute "{{${attr}}}" not found in event "${eventName}" or global aggregates`
981
+ : `Attribute "{{${attr}}}" not found in execution data`,
982
+ impact: 'Template will render as empty or "undefined"',
983
+ suggestion: similar.length > 0 ? `Did you mean: ${similar.join(', ')}?` : undefined,
984
+ fixable: false,
985
+ });
986
+ continue;
987
+ }
988
+
989
+ // Check if object is used directly (should use property access)
990
+ const value = eventValue !== undefined ? eventValue : globalValue;
991
+ if (this.isObjectType(value)) {
992
+ const objectKeys = Object.keys(value as Record<string, unknown>);
993
+ const suggestions = objectKeys.slice(0, 3).map((k) => `{{${attr}.${k}}}`);
994
+
995
+ violations.push({
996
+ ruleId: 'narrative-attribute-object',
997
+ severity: 'warn',
998
+ file,
999
+ path,
1000
+ message: `Attribute "{{${attr}}}" is an object and will render as "[object Object]"`,
1001
+ impact: 'Template will show "[object Object]" instead of useful data',
1002
+ suggestion: `Access a property instead: ${suggestions.join(', ')}`,
1003
+ fixable: false,
1004
+ });
1005
+ }
1006
+ }
1007
+
864
1008
  return violations;
865
1009
  }
866
1010
 
1011
+ /**
1012
+ * Find similar attribute names for helpful suggestions
1013
+ *
1014
+ * Uses simple string similarity (Levenshtein-like) to find typos
1015
+ *
1016
+ * @param target - The attribute being searched for
1017
+ * @param available - Available attribute names
1018
+ * @returns Array of similar attribute names (max 3)
1019
+ */
1020
+ private findSimilarAttributes(target: string, available: string[]): string[] {
1021
+ const similar: Array<{ attr: string; score: number }> = [];
1022
+
1023
+ for (const attr of available) {
1024
+ // Check for prefix match
1025
+ if (attr.startsWith(target) || target.startsWith(attr)) {
1026
+ similar.push({ attr, score: 10 });
1027
+ continue;
1028
+ }
1029
+
1030
+ // Check for substring match
1031
+ if (attr.includes(target) || target.includes(attr)) {
1032
+ similar.push({ attr, score: 5 });
1033
+ continue;
1034
+ }
1035
+
1036
+ // Check for similar structure (same number of dots)
1037
+ const targetParts = target.split('.');
1038
+ const attrParts = attr.split('.');
1039
+ if (targetParts.length === attrParts.length) {
1040
+ // Check if any parts match
1041
+ const matchingParts = targetParts.filter((p, i) => p === attrParts[i]).length;
1042
+ if (matchingParts > 0) {
1043
+ similar.push({ attr, score: matchingParts });
1044
+ }
1045
+ }
1046
+ }
1047
+
1048
+ // Sort by score and return top 3
1049
+ return similar
1050
+ .sort((a, b) => b.score - a.score)
1051
+ .slice(0, 3)
1052
+ .map((s) => s.attr);
1053
+ }
1054
+
867
1055
  /**
868
1056
  * Check formatting options
869
1057
  */
@@ -982,6 +1170,104 @@ export class NarrativeValidator {
982
1170
  }
983
1171
  return match[1];
984
1172
  }
1173
+
1174
+ /**
1175
+ * Extract attribute references from Handlebars template
1176
+ *
1177
+ * Parses template strings like:
1178
+ * - "{{source}}" -> ["source"]
1179
+ * - "{{source.url}}" -> ["source.url"]
1180
+ * - "{{#if options.global}}" -> ["options.global"]
1181
+ * - "{{#if (eq install.mode 'symlink')}}" -> ["install.mode"]
1182
+ *
1183
+ * @param template - Handlebars template string
1184
+ * @returns Array of attribute paths referenced in the template
1185
+ */
1186
+ private extractAttributeReferences(template: string): string[] {
1187
+ const attributes = new Set<string>();
1188
+
1189
+ // Match all Handlebars expressions: {{...}}
1190
+ const expressionPattern = /\{\{([^}]+)\}\}/g;
1191
+ let match;
1192
+
1193
+ while ((match = expressionPattern.exec(template)) !== null) {
1194
+ const expression = match[1].trim();
1195
+
1196
+ // Skip block helpers closing tags
1197
+ if (expression.startsWith('/')) {
1198
+ continue;
1199
+ }
1200
+
1201
+ // Handle block helpers: #if, #each, #unless, etc.
1202
+ if (expression.startsWith('#')) {
1203
+ // Extract the condition/expression after the helper
1204
+ const helperMatch = expression.match(/^#\w+\s+(.+)$/);
1205
+ if (helperMatch) {
1206
+ this.extractAttributesFromExpression(helperMatch[1], attributes);
1207
+ }
1208
+ continue;
1209
+ }
1210
+
1211
+ // Handle regular expressions
1212
+ this.extractAttributesFromExpression(expression, attributes);
1213
+ }
1214
+
1215
+ return Array.from(attributes);
1216
+ }
1217
+
1218
+ /**
1219
+ * Extract attribute references from a single Handlebars expression
1220
+ *
1221
+ * Handles:
1222
+ * - Simple references: source.url
1223
+ * - Helper calls: (eq install.mode 'symlink')
1224
+ * - Nested expressions
1225
+ *
1226
+ * @param expression - The expression to parse
1227
+ * @param attributes - Set to add found attributes to
1228
+ */
1229
+ private extractAttributesFromExpression(expression: string, attributes: Set<string>): void {
1230
+ // Remove helper parentheses: (eq install.mode 'symlink') -> eq install.mode 'symlink'
1231
+ const cleaned = expression.replace(/^\(|\)$/g, '').trim();
1232
+
1233
+ // Split on spaces to handle helper arguments
1234
+ const parts = cleaned.split(/\s+/);
1235
+
1236
+ for (const part of parts) {
1237
+ // Skip helper names, string literals, numbers, and boolean literals
1238
+ if (
1239
+ part.match(/^(if|unless|each|with|eq|ne|lt|gt|lte|gte|and|or|not)$/) ||
1240
+ part.match(/^['"].*['"]$/) ||
1241
+ part.match(/^\d+$/) ||
1242
+ part.match(/^(true|false|null|undefined)$/)
1243
+ ) {
1244
+ continue;
1245
+ }
1246
+
1247
+ // Remove any remaining quotes or parentheses
1248
+ const cleanPart = part.replace(/['"()]/g, '');
1249
+
1250
+ // If it looks like an attribute path (contains letters/dots/underscores)
1251
+ if (cleanPart && cleanPart.match(/^[a-zA-Z_][a-zA-Z0-9_.]*$/)) {
1252
+ attributes.add(cleanPart);
1253
+ }
1254
+ }
1255
+ }
1256
+
1257
+ /**
1258
+ * Check if an attribute is an object type
1259
+ *
1260
+ * @param value - The attribute value to check
1261
+ * @returns true if value is a plain object (not array, not null)
1262
+ */
1263
+ private isObjectType(value: unknown): boolean {
1264
+ return (
1265
+ typeof value === 'object' &&
1266
+ value !== null &&
1267
+ !Array.isArray(value) &&
1268
+ !(value instanceof Date)
1269
+ );
1270
+ }
985
1271
  }
986
1272
 
987
1273
  /**