@runhalo/engine 0.5.0 → 0.6.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.
Files changed (40) hide show
  1. package/dist/context-analyzer.js +38 -31
  2. package/dist/context-analyzer.js.map +1 -1
  3. package/dist/fp-patterns.d.ts +36 -0
  4. package/dist/fp-patterns.js +426 -0
  5. package/dist/fp-patterns.js.map +1 -0
  6. package/dist/frameworks/angular.d.ts +11 -0
  7. package/dist/frameworks/angular.js +41 -0
  8. package/dist/frameworks/angular.js.map +1 -0
  9. package/dist/frameworks/index.js +6 -0
  10. package/dist/frameworks/index.js.map +1 -1
  11. package/dist/frameworks/react.d.ts +13 -0
  12. package/dist/frameworks/react.js +36 -0
  13. package/dist/frameworks/react.js.map +1 -0
  14. package/dist/frameworks/vue.d.ts +9 -0
  15. package/dist/frameworks/vue.js +39 -0
  16. package/dist/frameworks/vue.js.map +1 -0
  17. package/dist/graduation/fp-verdict-logger.d.ts +81 -0
  18. package/dist/graduation/fp-verdict-logger.js +130 -0
  19. package/dist/graduation/fp-verdict-logger.js.map +1 -0
  20. package/dist/graduation/graduation-codifier.d.ts +37 -0
  21. package/dist/graduation/graduation-codifier.js +205 -0
  22. package/dist/graduation/graduation-codifier.js.map +1 -0
  23. package/dist/graduation/graduation-validator.d.ts +73 -0
  24. package/dist/graduation/graduation-validator.js +204 -0
  25. package/dist/graduation/graduation-validator.js.map +1 -0
  26. package/dist/graduation/index.d.ts +71 -0
  27. package/dist/graduation/index.js +105 -0
  28. package/dist/graduation/index.js.map +1 -0
  29. package/dist/graduation/pattern-aggregator.d.ts +77 -0
  30. package/dist/graduation/pattern-aggregator.js +154 -0
  31. package/dist/graduation/pattern-aggregator.js.map +1 -0
  32. package/dist/index.d.ts +75 -0
  33. package/dist/index.js +632 -73
  34. package/dist/index.js.map +1 -1
  35. package/dist/review-board/two-agent-review.d.ts +152 -0
  36. package/dist/review-board/two-agent-review.js +463 -0
  37. package/dist/review-board/two-agent-review.js.map +1 -0
  38. package/package.json +5 -2
  39. package/rules/coppa-tier-1.yaml +17 -10
  40. package/rules/rules.json +408 -40
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * Angular Framework Profile
4
+ *
5
+ * Angular provides strong built-in security:
6
+ * - Template interpolation auto-escaping (DomSanitizer)
7
+ * - Built-in XSRF/CSRF protection in HttpClient
8
+ * - Strict contextual escaping for URLs, styles, and HTML
9
+ * - RouterLink handles navigation safely
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.angularProfile = void 0;
13
+ exports.angularProfile = {
14
+ id: 'angular',
15
+ name: 'Angular',
16
+ ecosystem: 'javascript',
17
+ handled_rules: [
18
+ {
19
+ rule_id: 'coppa-sec-015',
20
+ action: 'downgrade',
21
+ downgrade_to: 'low',
22
+ reason: 'Angular auto-escapes template interpolation via DomSanitizer. bypassSecurityTrust* is the explicit escape hatch.',
23
+ documentation_url: 'https://angular.io/guide/security#preventing-cross-site-scripting-xss',
24
+ },
25
+ {
26
+ rule_id: 'coppa-ext-017',
27
+ action: 'downgrade',
28
+ downgrade_to: 'low',
29
+ reason: 'Angular RouterLink provides safe internal navigation. External links can be intercepted via route guards.',
30
+ documentation_url: 'https://angular.io/api/router/RouterLink',
31
+ },
32
+ ],
33
+ safe_patterns: [
34
+ {
35
+ description: 'Angular DomSanitizer and template security',
36
+ patterns: [/@angular/, /DomSanitizer/, /bypassSecurityTrust/],
37
+ applies_to_rules: ['coppa-sec-015'],
38
+ },
39
+ ],
40
+ };
41
+ //# sourceMappingURL=angular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular.js","sourceRoot":"","sources":["../../src/frameworks/angular.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAIU,QAAA,cAAc,GAAqB;IAC9C,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,YAAY;IACvB,aAAa,EAAE;QACb;YACE,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,kHAAkH;YAC1H,iBAAiB,EAAE,uEAAuE;SAC3F;QACD;YACE,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,2GAA2G;YACnH,iBAAiB,EAAE,0CAA0C;SAC9D;KACF;IACD,aAAa,EAAE;QACb;YACE,WAAW,EAAE,4CAA4C;YACzD,QAAQ,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,qBAAqB,CAAC;YAC7D,gBAAgB,EAAE,CAAC,eAAe,CAAC;SACpC;KACF;CACF,CAAC"}
@@ -21,11 +21,17 @@ exports.applyFrameworkOverrides = applyFrameworkOverrides;
21
21
  const nextjs_1 = require("./nextjs");
22
22
  const django_1 = require("./django");
23
23
  const rails_1 = require("./rails");
24
+ const react_1 = require("./react");
25
+ const vue_1 = require("./vue");
26
+ const angular_1 = require("./angular");
24
27
  /** Registry of all built-in framework profiles keyed by id. */
25
28
  const FRAMEWORK_REGISTRY = {
26
29
  nextjs: nextjs_1.nextjsProfile,
27
30
  django: django_1.djangoProfile,
28
31
  rails: rails_1.railsProfile,
32
+ react: react_1.reactProfile,
33
+ vue: vue_1.vueProfile,
34
+ angular: angular_1.angularProfile,
29
35
  };
30
36
  /**
31
37
  * Look up a framework profile by its id.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAiCH,kDAEC;AAOD,wCAEC;AAgBD,0DA6CC;AApGD,qCAAyC;AACzC,qCAAyC;AACzC,mCAAuC;AAavC,+DAA+D;AAC/D,MAAM,kBAAkB,GAAqC;IAC3D,MAAM,EAAE,sBAAa;IACrB,MAAM,EAAE,sBAAa;IACrB,KAAK,EAAE,oBAAY;CACpB,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,EAAU;IAC5C,OAAO,kBAAkB,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,uBAAuB,CACrC,UAAe,EACf,WAAmB;IAEnB,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CACtE,CAAC;IAEF,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAQ,EAAE,CAAC;IAEzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACnC,eAAe,EAAE,CAAC;YAClB,mCAAmC;YACnC,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7D,eAAe,EAAE,CAAC;YAClB,6EAA6E;YAC7E,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QAED,mDAAmD;QACnD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/frameworks/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;AAuCH,kDAEC;AAOD,wCAEC;AAgBD,0DA6CC;AA1GD,qCAAyC;AACzC,qCAAyC;AACzC,mCAAuC;AACvC,mCAAuC;AACvC,+BAAmC;AACnC,uCAA2C;AAa3C,+DAA+D;AAC/D,MAAM,kBAAkB,GAAqC;IAC3D,MAAM,EAAE,sBAAa;IACrB,MAAM,EAAE,sBAAa;IACrB,KAAK,EAAE,oBAAY;IACnB,KAAK,EAAE,oBAAY;IACnB,GAAG,EAAE,gBAAU;IACf,OAAO,EAAE,wBAAc;CACxB,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,EAAU;IAC5C,OAAO,kBAAkB,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc;IAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,uBAAuB,CACrC,UAAe,EACf,WAAmB;IAEnB,MAAM,OAAO,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CACtE,CAAC;IAEF,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAQ,EAAE,CAAC;IAEzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACnC,eAAe,EAAE,CAAC;YAClB,mCAAmC;YACnC,SAAS;QACX,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7D,eAAe,EAAE,CAAC;YAClB,6EAA6E;YAC7E,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QAED,mDAAmD;QACnD,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * React Framework Profile
3
+ *
4
+ * React provides JSX auto-escaping which mitigates most XSS vectors.
5
+ * Unlike Next.js, React does NOT provide:
6
+ * - HTTPS enforcement (deployment-dependent)
7
+ * - Safe link component (no built-in <Link> with rel attributes)
8
+ * - Cookie middleware (client-side only)
9
+ *
10
+ * This profile is deliberately narrower than the Next.js profile.
11
+ */
12
+ import { FrameworkProfile } from './types';
13
+ export declare const reactProfile: FrameworkProfile;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * React Framework Profile
4
+ *
5
+ * React provides JSX auto-escaping which mitigates most XSS vectors.
6
+ * Unlike Next.js, React does NOT provide:
7
+ * - HTTPS enforcement (deployment-dependent)
8
+ * - Safe link component (no built-in <Link> with rel attributes)
9
+ * - Cookie middleware (client-side only)
10
+ *
11
+ * This profile is deliberately narrower than the Next.js profile.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.reactProfile = void 0;
15
+ exports.reactProfile = {
16
+ id: 'react',
17
+ name: 'React',
18
+ ecosystem: 'javascript',
19
+ handled_rules: [
20
+ {
21
+ rule_id: 'coppa-sec-015',
22
+ action: 'downgrade',
23
+ downgrade_to: 'low',
24
+ reason: 'React auto-escapes JSX output by default. dangerouslySetInnerHTML is the only XSS vector.',
25
+ documentation_url: 'https://react.dev/reference/react-dom/components/common#dangerously-setting-the-inner-html',
26
+ },
27
+ ],
28
+ safe_patterns: [
29
+ {
30
+ description: 'React JSX auto-escaping protects against reflected XSS',
31
+ patterns: [/React/, /jsx/, /createElement/],
32
+ applies_to_rules: ['coppa-sec-015'],
33
+ },
34
+ ],
35
+ };
36
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/frameworks/react.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAIU,QAAA,YAAY,GAAqB;IAC5C,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,YAAY;IACvB,aAAa,EAAE;QACb;YACE,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,2FAA2F;YACnG,iBAAiB,EAAE,4FAA4F;SAChH;KACF;IACD,aAAa,EAAE;QACb;YACE,WAAW,EAAE,wDAAwD;YACrE,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC;YAC3C,gBAAgB,EAAE,CAAC,eAAe,CAAC;SACpC;KACF;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Vue.js Framework Profile
3
+ *
4
+ * Vue provides template auto-escaping which mitigates XSS vectors.
5
+ * v-html is the explicit escape hatch (similar to React's dangerouslySetInnerHTML).
6
+ * Vue Router provides safe navigation handling.
7
+ */
8
+ import { FrameworkProfile } from './types';
9
+ export declare const vueProfile: FrameworkProfile;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * Vue.js Framework Profile
4
+ *
5
+ * Vue provides template auto-escaping which mitigates XSS vectors.
6
+ * v-html is the explicit escape hatch (similar to React's dangerouslySetInnerHTML).
7
+ * Vue Router provides safe navigation handling.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.vueProfile = void 0;
11
+ exports.vueProfile = {
12
+ id: 'vue',
13
+ name: 'Vue.js',
14
+ ecosystem: 'javascript',
15
+ handled_rules: [
16
+ {
17
+ rule_id: 'coppa-sec-015',
18
+ action: 'downgrade',
19
+ downgrade_to: 'low',
20
+ reason: 'Vue auto-escapes template interpolation by default. v-html is the only XSS vector.',
21
+ documentation_url: 'https://vuejs.org/guide/best-practices/security.html#rule-no-1-never-use-non-trusted-templates',
22
+ },
23
+ {
24
+ rule_id: 'coppa-ext-017',
25
+ action: 'downgrade',
26
+ downgrade_to: 'low',
27
+ reason: 'Vue Router can be configured to handle external navigation with guards.',
28
+ documentation_url: 'https://router.vuejs.org/guide/advanced/navigation-guards.html',
29
+ },
30
+ ],
31
+ safe_patterns: [
32
+ {
33
+ description: 'Vue template auto-escaping protects against XSS',
34
+ patterns: [/Vue/, /createApp/, /\.vue$/],
35
+ applies_to_rules: ['coppa-sec-015'],
36
+ },
37
+ ],
38
+ };
39
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.js","sourceRoot":"","sources":["../../src/frameworks/vue.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAIU,QAAA,UAAU,GAAqB;IAC1C,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,YAAY;IACvB,aAAa,EAAE;QACb;YACE,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,oFAAoF;YAC5F,iBAAiB,EAAE,gGAAgG;SACpH;QACD;YACE,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,WAAW;YACnB,YAAY,EAAE,KAAK;YACnB,MAAM,EAAE,yEAAyE;YACjF,iBAAiB,EAAE,gEAAgE;SACpF;KACF;IACD,aAAa,EAAE;QACb;YACE,WAAW,EAAE,iDAAiD;YAC9D,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC;YACxC,gBAAgB,EAAE,CAAC,eAAe,CAAC;SACpC;KACF;CACF,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Sprint 13a Week 2: FP Verdict Logger
3
+ *
4
+ * Stage 1 of the Graduation Pipeline.
5
+ * Logs each AI Review Board verdict to a structured JSONL file.
6
+ * Captures the fpPatternId, confidence, and context needed for
7
+ * downstream aggregation.
8
+ *
9
+ * Output: One JSONL file per scan, written to a configurable directory.
10
+ * Each line is a complete VerdictLogEntry.
11
+ */
12
+ export interface VerdictLogEntry {
13
+ /** Timestamp of the verdict */
14
+ timestamp: string;
15
+ /** Scan identifier (for grouping entries from the same scan) */
16
+ scanId: string;
17
+ /** The rule that was evaluated */
18
+ ruleId: string;
19
+ /** File where the violation was found */
20
+ filePath: string;
21
+ /** Line number */
22
+ line: number;
23
+ /** The verdict from the Review Board */
24
+ verdict: 'confirmed' | 'downgraded' | 'escalated' | 'dismissed';
25
+ /** Confidence score (1-10) */
26
+ confidence: number;
27
+ /** FP pattern ID if dismissed */
28
+ fpPatternId?: string;
29
+ /** Human-readable FP reason */
30
+ fpReason?: string;
31
+ /** Code snippet for pattern analysis */
32
+ codeSnippet?: string;
33
+ /** File metadata flags at time of scan */
34
+ fileMetadata?: {
35
+ language: string;
36
+ isVendor: boolean;
37
+ isTest: boolean;
38
+ isAdmin: boolean;
39
+ isConsent: boolean;
40
+ isDocGenerator: boolean;
41
+ };
42
+ /** Whether this was from multi-agent review */
43
+ multiAgent?: boolean;
44
+ /** If multi-agent, the agreement level */
45
+ agreementLevel?: 'full' | 'partial' | 'split';
46
+ /** Model used for the review */
47
+ modelUsed?: string;
48
+ /** Prompt version identifier */
49
+ promptVersion?: string;
50
+ }
51
+ export declare class FPVerdictLogger {
52
+ private logDir;
53
+ private scanId;
54
+ private logPath;
55
+ private promptVersion;
56
+ constructor(options: {
57
+ logDir: string;
58
+ scanId: string;
59
+ promptVersion?: string;
60
+ });
61
+ /**
62
+ * Log a single verdict entry.
63
+ */
64
+ log(entry: Omit<VerdictLogEntry, 'timestamp' | 'scanId' | 'promptVersion'>): void;
65
+ /**
66
+ * Log a batch of verdict entries (from a Review Board response).
67
+ */
68
+ logBatch(entries: Array<Omit<VerdictLogEntry, 'timestamp' | 'scanId' | 'promptVersion'>>): void;
69
+ /**
70
+ * Get the path to the current log file.
71
+ */
72
+ getLogPath(): string;
73
+ /**
74
+ * Read all entries from a log file.
75
+ */
76
+ static readLog(logPath: string): VerdictLogEntry[];
77
+ /**
78
+ * Read all log files from a directory.
79
+ */
80
+ static readAllLogs(logDir: string): VerdictLogEntry[];
81
+ }
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ /**
3
+ * Sprint 13a Week 2: FP Verdict Logger
4
+ *
5
+ * Stage 1 of the Graduation Pipeline.
6
+ * Logs each AI Review Board verdict to a structured JSONL file.
7
+ * Captures the fpPatternId, confidence, and context needed for
8
+ * downstream aggregation.
9
+ *
10
+ * Output: One JSONL file per scan, written to a configurable directory.
11
+ * Each line is a complete VerdictLogEntry.
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.FPVerdictLogger = void 0;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ // ─── Logger ─────────────────────────────────────────────────────────────────
51
+ class FPVerdictLogger {
52
+ constructor(options) {
53
+ this.logDir = options.logDir;
54
+ this.scanId = options.scanId;
55
+ this.promptVersion = options.promptVersion || 'v1.0';
56
+ this.logPath = path.join(this.logDir, `verdicts-${this.scanId}.jsonl`);
57
+ // Ensure log directory exists
58
+ if (!fs.existsSync(this.logDir)) {
59
+ fs.mkdirSync(this.logDir, { recursive: true });
60
+ }
61
+ }
62
+ /**
63
+ * Log a single verdict entry.
64
+ */
65
+ log(entry) {
66
+ const fullEntry = {
67
+ ...entry,
68
+ timestamp: new Date().toISOString(),
69
+ scanId: this.scanId,
70
+ promptVersion: this.promptVersion,
71
+ };
72
+ fs.appendFileSync(this.logPath, JSON.stringify(fullEntry) + '\n', 'utf-8');
73
+ }
74
+ /**
75
+ * Log a batch of verdict entries (from a Review Board response).
76
+ */
77
+ logBatch(entries) {
78
+ const lines = entries.map(entry => {
79
+ const fullEntry = {
80
+ ...entry,
81
+ timestamp: new Date().toISOString(),
82
+ scanId: this.scanId,
83
+ promptVersion: this.promptVersion,
84
+ };
85
+ return JSON.stringify(fullEntry);
86
+ });
87
+ fs.appendFileSync(this.logPath, lines.join('\n') + '\n', 'utf-8');
88
+ }
89
+ /**
90
+ * Get the path to the current log file.
91
+ */
92
+ getLogPath() {
93
+ return this.logPath;
94
+ }
95
+ /**
96
+ * Read all entries from a log file.
97
+ */
98
+ static readLog(logPath) {
99
+ if (!fs.existsSync(logPath))
100
+ return [];
101
+ return fs.readFileSync(logPath, 'utf-8')
102
+ .split('\n')
103
+ .filter(line => line.trim())
104
+ .map(line => {
105
+ try {
106
+ return JSON.parse(line);
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ })
112
+ .filter((entry) => entry !== null);
113
+ }
114
+ /**
115
+ * Read all log files from a directory.
116
+ */
117
+ static readAllLogs(logDir) {
118
+ if (!fs.existsSync(logDir))
119
+ return [];
120
+ const files = fs.readdirSync(logDir)
121
+ .filter(f => f.startsWith('verdicts-') && f.endsWith('.jsonl'));
122
+ const allEntries = [];
123
+ for (const file of files) {
124
+ allEntries.push(...FPVerdictLogger.readLog(path.join(logDir, file)));
125
+ }
126
+ return allEntries;
127
+ }
128
+ }
129
+ exports.FPVerdictLogger = FPVerdictLogger;
130
+ //# sourceMappingURL=fp-verdict-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fp-verdict-logger.js","sourceRoot":"","sources":["../../src/graduation/fp-verdict-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Sprint 13a Week 2: Graduation Codifier
3
+ *
4
+ * Stage 4 of the Graduation Pipeline.
5
+ * Takes approved graduation candidates and generates the code changes
6
+ * needed to codify them as permanent engine heuristics.
7
+ *
8
+ * Output: TypeScript code snippets ready to insert into classifyFile()
9
+ * or the scan loop in packages/engine/src/index.ts.
10
+ *
11
+ * This does NOT auto-apply changes. It generates code for Bobby to
12
+ * review and approve before merging.
13
+ */
14
+ import { GraduationCandidate } from './graduation-validator';
15
+ export interface CodegenResult {
16
+ /** Pattern being codified */
17
+ patternId: string;
18
+ /** Type of change */
19
+ changeType: 'classifyFile_pattern' | 'rule_suppression' | 'scan_loop_check';
20
+ /** Generated code snippet */
21
+ code: string;
22
+ /** Where to insert (file path + approximate location) */
23
+ insertLocation: string;
24
+ /** Human-readable explanation */
25
+ explanation: string;
26
+ /** Test case to validate the change */
27
+ testCase: string;
28
+ }
29
+ /**
30
+ * Generate code for a single graduation candidate.
31
+ */
32
+ export declare function generateCode(candidate: GraduationCandidate): CodegenResult;
33
+ /**
34
+ * Generate code for all eligible candidates.
35
+ */
36
+ export declare function generateAllCode(candidates: GraduationCandidate[]): CodegenResult[];
37
+ export declare function formatCodegenReport(results: CodegenResult[]): string;
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * Sprint 13a Week 2: Graduation Codifier
4
+ *
5
+ * Stage 4 of the Graduation Pipeline.
6
+ * Takes approved graduation candidates and generates the code changes
7
+ * needed to codify them as permanent engine heuristics.
8
+ *
9
+ * Output: TypeScript code snippets ready to insert into classifyFile()
10
+ * or the scan loop in packages/engine/src/index.ts.
11
+ *
12
+ * This does NOT auto-apply changes. It generates code for Bobby to
13
+ * review and approve before merging.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.generateCode = generateCode;
17
+ exports.generateAllCode = generateAllCode;
18
+ exports.formatCodegenReport = formatCodegenReport;
19
+ // ─── Code Generation ────────────────────────────────────────────────────────
20
+ /**
21
+ * Generate code for a single graduation candidate.
22
+ */
23
+ function generateCode(candidate) {
24
+ switch (candidate.recommendedHeuristic) {
25
+ case 'file_skip':
26
+ return generateFileSkipCode(candidate);
27
+ case 'rule_suppress':
28
+ return generateRuleSuppressionCode(candidate);
29
+ case 'severity_downgrade':
30
+ return generateSeverityDowngradeCode(candidate);
31
+ case 'context_check':
32
+ return generateContextCheckCode(candidate);
33
+ }
34
+ }
35
+ /**
36
+ * Generate code for all eligible candidates.
37
+ */
38
+ function generateAllCode(candidates) {
39
+ return candidates
40
+ .filter(c => c.eligible)
41
+ .map(c => generateCode(c));
42
+ }
43
+ // ─── Generators ─────────────────────────────────────────────────────────────
44
+ function generateFileSkipCode(candidate) {
45
+ const pattern = candidate.pattern;
46
+ const patternId = pattern.fpPatternId;
47
+ // Extract path signals from sample paths
48
+ const pathPatterns = inferPathPatterns(pattern.samplePaths);
49
+ const code = `// Graduated from FP pattern: ${patternId}
50
+ // ${pattern.totalDismissals} dismissals, avg confidence ${pattern.avgConfidence}
51
+ // Source: Graduation Pipeline Sprint 13a
52
+ if (${pathPatterns.map(p => `normalizedPath.includes('${p}')`).join(' || ')}) {
53
+ return {
54
+ ...baseClassification,
55
+ shouldSkip: true,
56
+ skipReason: '${patternId} (graduated)',
57
+ };
58
+ }`;
59
+ return {
60
+ patternId,
61
+ changeType: 'classifyFile_pattern',
62
+ code,
63
+ insertLocation: 'packages/engine/src/index.ts → classifyFile() function, before return statement',
64
+ explanation: `Skip files matching ${patternId} pattern. Based on ${pattern.totalDismissals} consistent dismissals across ${pattern.uniqueScans} scans with avg confidence ${pattern.avgConfidence}.`,
65
+ testCase: generateTestCase(patternId, pattern.samplePaths[0] || 'test/path', 'shouldSkip', true),
66
+ };
67
+ }
68
+ function generateRuleSuppressionCode(candidate) {
69
+ const pattern = candidate.pattern;
70
+ const patternId = pattern.fpPatternId;
71
+ const rules = pattern.affectedRules;
72
+ const code = `// Graduated from FP pattern: ${patternId}
73
+ // ${pattern.totalDismissals} dismissals, avg confidence ${pattern.avgConfidence}
74
+ const ${camelCase(patternId)}_SUPPRESS_RULES = new Set(${JSON.stringify(rules)});
75
+
76
+ // In scan loop, after classification:
77
+ if (classification.${inferClassificationFlag(patternId)} && ${camelCase(patternId)}_SUPPRESS_RULES.has(rule.id)) {
78
+ continue; // Skip this rule for ${patternId} files
79
+ }`;
80
+ return {
81
+ patternId,
82
+ changeType: 'rule_suppression',
83
+ code,
84
+ insertLocation: 'packages/engine/src/index.ts → scan loop, rule iteration block',
85
+ explanation: `Suppress rules [${rules.join(', ')}] when ${patternId} pattern detected. Based on ${pattern.totalDismissals} dismissals.`,
86
+ testCase: generateTestCase(patternId, pattern.samplePaths[0] || 'test/path', 'violations.length', 0),
87
+ };
88
+ }
89
+ function generateSeverityDowngradeCode(candidate) {
90
+ const pattern = candidate.pattern;
91
+ const patternId = pattern.fpPatternId;
92
+ const code = `// Graduated from FP pattern: ${patternId}
93
+ // ${pattern.totalDismissals} dismissals as downgrade, avg confidence ${pattern.avgConfidence}
94
+ if (${inferCondition(patternId)}) {
95
+ violation.severity = 'info'; // Downgraded from ${patternId}
96
+ violation.message += ' [Severity downgraded: ${patternId}]';
97
+ }`;
98
+ return {
99
+ patternId,
100
+ changeType: 'scan_loop_check',
101
+ code,
102
+ insertLocation: 'packages/engine/src/index.ts → after violation creation, before push to results',
103
+ explanation: `Downgrade severity for ${patternId} pattern. Mitigating factors present but not full dismissal.`,
104
+ testCase: generateTestCase(patternId, pattern.samplePaths[0] || 'test/path', 'severity', 'info'),
105
+ };
106
+ }
107
+ function generateContextCheckCode(candidate) {
108
+ const pattern = candidate.pattern;
109
+ const patternId = pattern.fpPatternId;
110
+ const code = `// Graduated from FP pattern: ${patternId}
111
+ // ${pattern.totalDismissals} dismissals, avg confidence ${pattern.avgConfidence}
112
+ // NOTE: This pattern requires surrounding code analysis.
113
+ // Consider adding to AI Review Board FP checklist instead of engine heuristic.
114
+ //
115
+ // Candidate code signals to check:
116
+ // ${pattern.fpReason || 'See FP library for details'}
117
+ //
118
+ // TODO: Implement context check or add to AI Review Board FP library`;
119
+ return {
120
+ patternId,
121
+ changeType: 'scan_loop_check',
122
+ code,
123
+ insertLocation: 'packages/engine/src/index.ts OR supabase/functions/ai-review/index.ts (FP checklists)',
124
+ explanation: `Context-dependent FP pattern. May be better served by expanding the AI Review Board FP checklist rather than engine heuristic.`,
125
+ testCase: `// Manual test: verify ${patternId} pattern is dismissed by Review Board`,
126
+ };
127
+ }
128
+ // ─── Helpers ────────────────────────────────────────────────────────────────
129
+ function inferPathPatterns(samplePaths) {
130
+ if (samplePaths.length === 0)
131
+ return ['UNKNOWN_PATTERN'];
132
+ // Find common path segments
133
+ const segments = samplePaths.flatMap(p => p.split('/'));
134
+ const commonSegments = new Map();
135
+ for (const seg of segments) {
136
+ if (seg && seg.length > 2 && !seg.includes('.')) {
137
+ commonSegments.set(seg, (commonSegments.get(seg) || 0) + 1);
138
+ }
139
+ }
140
+ // Return segments that appear in multiple paths
141
+ const patterns = [...commonSegments.entries()]
142
+ .filter(([, count]) => count >= Math.max(samplePaths.length / 2, 1))
143
+ .map(([seg]) => seg)
144
+ .slice(0, 3);
145
+ return patterns.length > 0 ? patterns : ['REVIEW_PATH_PATTERN'];
146
+ }
147
+ function inferClassificationFlag(patternId) {
148
+ if (patternId.includes('admin'))
149
+ return 'isAdmin';
150
+ if (patternId.includes('consent'))
151
+ return 'isConsent';
152
+ if (patternId.includes('test') || patternId.includes('mock'))
153
+ return 'isTest';
154
+ if (patternId.includes('vendor'))
155
+ return 'isVendor';
156
+ if (patternId.includes('doc'))
157
+ return 'isDocGenerator';
158
+ return 'shouldSkip';
159
+ }
160
+ function inferCondition(patternId) {
161
+ if (patternId.includes('framework'))
162
+ return `classification.language && ['jsx', 'tsx', 'vue', 'svelte'].includes(fileExt)`;
163
+ if (patternId.includes('sanitized'))
164
+ return `codeContent.includes('DOMPurify') || codeContent.includes('sanitize(')`;
165
+ if (patternId.includes('error-monitoring'))
166
+ return `codeContent.includes('Sentry') || codeContent.includes('Bugsnag')`;
167
+ return `/* TODO: define condition for ${patternId} */`;
168
+ }
169
+ function camelCase(str) {
170
+ return str.replace(/[-_](\w)/g, (_, c) => c.toUpperCase());
171
+ }
172
+ function generateTestCase(patternId, samplePath, assertion, expected) {
173
+ return `test('${patternId} graduated pattern', () => {
174
+ const result = classifyFile('${samplePath}');
175
+ expect(result.${assertion}).toBe(${JSON.stringify(expected)});
176
+ });`;
177
+ }
178
+ // ─── Report ─────────────────────────────────────────────────────────────────
179
+ function formatCodegenReport(results) {
180
+ const lines = [
181
+ '═══ Graduation Codifier — Generated Code ═══',
182
+ '',
183
+ `Total patterns codified: ${results.length}`,
184
+ '',
185
+ ];
186
+ for (const result of results) {
187
+ lines.push(`── ${result.patternId} (${result.changeType}) ──`);
188
+ lines.push(result.explanation);
189
+ lines.push('');
190
+ lines.push('Location: ' + result.insertLocation);
191
+ lines.push('');
192
+ lines.push('Code:');
193
+ lines.push('```typescript');
194
+ lines.push(result.code);
195
+ lines.push('```');
196
+ lines.push('');
197
+ lines.push('Test:');
198
+ lines.push('```typescript');
199
+ lines.push(result.testCase);
200
+ lines.push('```');
201
+ lines.push('');
202
+ }
203
+ return lines.join('\n');
204
+ }
205
+ //# sourceMappingURL=graduation-codifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graduation-codifier.js","sourceRoot":"","sources":["../../src/graduation/graduation-codifier.ts"],"names":[],"mappings":"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"}