@lyse-labs/lyse 0.1.0-alpha.2 → 0.2.0-alpha.1

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 (140) hide show
  1. package/LICENSE +0 -5
  2. package/dist/cli.js +67 -11
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/__tests__/add-ci-gate.test.d.ts +1 -0
  5. package/dist/commands/__tests__/add-ci-gate.test.js +149 -0
  6. package/dist/commands/__tests__/add-ci-gate.test.js.map +1 -0
  7. package/dist/commands/add-ci-gate.d.ts +26 -0
  8. package/dist/commands/add-ci-gate.js +429 -0
  9. package/dist/commands/add-ci-gate.js.map +1 -0
  10. package/dist/commands/audit-pipeline.js +1 -1
  11. package/dist/commands/audit-pipeline.js.map +1 -1
  12. package/dist/commands/fix.d.ts +8 -8
  13. package/dist/commands/init.d.ts +3 -3
  14. package/dist/commands/init.js +1 -1
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/mcp-setup.js +1 -1
  17. package/dist/commands/mcp-setup.js.map +1 -1
  18. package/dist/config/schema.d.ts +14 -14
  19. package/dist/llm/__tests__/layer4-stage.test.d.ts +1 -0
  20. package/dist/llm/__tests__/layer4-stage.test.js +157 -0
  21. package/dist/llm/__tests__/layer4-stage.test.js.map +1 -0
  22. package/dist/llm/__tests__/validator.test.d.ts +1 -0
  23. package/dist/llm/__tests__/validator.test.js +156 -0
  24. package/dist/llm/__tests__/validator.test.js.map +1 -0
  25. package/dist/llm/connectors/__tests__/anthropic-adapter.test.d.ts +1 -0
  26. package/dist/llm/connectors/__tests__/anthropic-adapter.test.js +99 -0
  27. package/dist/llm/connectors/__tests__/anthropic-adapter.test.js.map +1 -0
  28. package/dist/llm/connectors/__tests__/cache.test.d.ts +1 -0
  29. package/dist/llm/connectors/__tests__/cache.test.js +50 -0
  30. package/dist/llm/connectors/__tests__/cache.test.js.map +1 -0
  31. package/dist/llm/connectors/__tests__/noop-adapter.test.d.ts +1 -0
  32. package/dist/llm/connectors/__tests__/noop-adapter.test.js +21 -0
  33. package/dist/llm/connectors/__tests__/noop-adapter.test.js.map +1 -0
  34. package/dist/llm/connectors/__tests__/openai-compatible-adapter.test.d.ts +1 -0
  35. package/dist/llm/connectors/__tests__/openai-compatible-adapter.test.js +82 -0
  36. package/dist/llm/connectors/__tests__/openai-compatible-adapter.test.js.map +1 -0
  37. package/dist/llm/connectors/__tests__/resolver.test.d.ts +1 -0
  38. package/dist/llm/connectors/__tests__/resolver.test.js +140 -0
  39. package/dist/llm/connectors/__tests__/resolver.test.js.map +1 -0
  40. package/dist/llm/connectors/anthropic-adapter.d.ts +12 -0
  41. package/dist/llm/connectors/anthropic-adapter.js +57 -0
  42. package/dist/llm/connectors/anthropic-adapter.js.map +1 -0
  43. package/dist/llm/connectors/cache.d.ts +15 -0
  44. package/dist/llm/connectors/cache.js +57 -0
  45. package/dist/llm/connectors/cache.js.map +1 -0
  46. package/dist/llm/connectors/noop-adapter.d.ts +4 -0
  47. package/dist/llm/connectors/noop-adapter.js +12 -0
  48. package/dist/llm/connectors/noop-adapter.js.map +1 -0
  49. package/dist/llm/connectors/openai-compatible-adapter.d.ts +13 -0
  50. package/dist/llm/connectors/openai-compatible-adapter.js +47 -0
  51. package/dist/llm/connectors/openai-compatible-adapter.js.map +1 -0
  52. package/dist/llm/connectors/resolver.d.ts +9 -0
  53. package/dist/llm/connectors/resolver.js +162 -0
  54. package/dist/llm/connectors/resolver.js.map +1 -0
  55. package/dist/llm/connectors/types.d.ts +25 -0
  56. package/dist/llm/connectors/types.js +13 -0
  57. package/dist/llm/connectors/types.js.map +1 -0
  58. package/dist/llm/layer4-stage.d.ts +8 -6
  59. package/dist/llm/layer4-stage.js +145 -9
  60. package/dist/llm/layer4-stage.js.map +1 -1
  61. package/dist/llm/rubric-stub.d.ts +8 -0
  62. package/dist/llm/rubric-stub.js +4 -0
  63. package/dist/llm/rubric-stub.js.map +1 -0
  64. package/dist/llm/validator.d.ts +18 -0
  65. package/dist/llm/validator.js +81 -0
  66. package/dist/llm/validator.js.map +1 -0
  67. package/dist/parsers/ai-tokens.d.ts +10 -0
  68. package/dist/parsers/ai-tokens.js +156 -0
  69. package/dist/parsers/ai-tokens.js.map +1 -0
  70. package/dist/reliability/catalogue/__tests__/sub-axes.test.js +13 -3
  71. package/dist/reliability/catalogue/__tests__/sub-axes.test.js.map +1 -1
  72. package/dist/reliability/catalogue/sub-axes.js +16 -0
  73. package/dist/reliability/catalogue/sub-axes.js.map +1 -1
  74. package/dist/reliability/types.d.ts +1 -1
  75. package/dist/rule-runner.js +1 -1
  76. package/dist/rule-runner.js.map +1 -1
  77. package/dist/rules/ai-governance-ai-content-live-region.d.ts +11 -0
  78. package/dist/rules/ai-governance-ai-content-live-region.js +304 -0
  79. package/dist/rules/ai-governance-ai-content-live-region.js.map +1 -0
  80. package/dist/rules/ai-governance-ai-loading-error-states.d.ts +9 -0
  81. package/dist/rules/ai-governance-ai-loading-error-states.js +214 -0
  82. package/dist/rules/ai-governance-ai-loading-error-states.js.map +1 -0
  83. package/dist/rules/ai-governance-ai-marker-anti-patterns.d.ts +15 -0
  84. package/dist/rules/ai-governance-ai-marker-anti-patterns.js +178 -0
  85. package/dist/rules/ai-governance-ai-marker-anti-patterns.js.map +1 -0
  86. package/dist/rules/ai-governance-ai-marker-component-present.d.ts +28 -0
  87. package/dist/rules/ai-governance-ai-marker-component-present.js +320 -0
  88. package/dist/rules/ai-governance-ai-marker-component-present.js.map +1 -0
  89. package/dist/rules/ai-governance-ai-token-requires-marker.d.ts +17 -0
  90. package/dist/rules/ai-governance-ai-token-requires-marker.js +206 -0
  91. package/dist/rules/ai-governance-ai-token-requires-marker.js.map +1 -0
  92. package/dist/rules/ai-governance-ai-tokens-reserved.d.ts +8 -0
  93. package/dist/rules/ai-governance-ai-tokens-reserved.js +85 -0
  94. package/dist/rules/ai-governance-ai-tokens-reserved.js.map +1 -0
  95. package/dist/rules/ai-governance-disclaimer-present.d.ts +18 -0
  96. package/dist/rules/ai-governance-disclaimer-present.js +210 -0
  97. package/dist/rules/ai-governance-disclaimer-present.js.map +1 -0
  98. package/dist/rules/ai-governance-explainability-affordance.d.ts +14 -0
  99. package/dist/rules/ai-governance-explainability-affordance.js +196 -0
  100. package/dist/rules/ai-governance-explainability-affordance.js.map +1 -0
  101. package/dist/rules/ai-governance-feedback-control-present.d.ts +19 -0
  102. package/dist/rules/ai-governance-feedback-control-present.js +223 -0
  103. package/dist/rules/ai-governance-feedback-control-present.js.map +1 -0
  104. package/dist/rules/ai-governance-human-control-affordances.d.ts +16 -0
  105. package/dist/rules/ai-governance-human-control-affordances.js +228 -0
  106. package/dist/rules/ai-governance-human-control-affordances.js.map +1 -0
  107. package/dist/rules/ai-governance-value-gate-doc-present.d.ts +18 -0
  108. package/dist/rules/ai-governance-value-gate-doc-present.js +206 -0
  109. package/dist/rules/ai-governance-value-gate-doc-present.js.map +1 -0
  110. package/dist/rules/ai-surface-agent-instruction-files.d.ts +33 -0
  111. package/dist/rules/ai-surface-agent-instruction-files.js +310 -0
  112. package/dist/rules/ai-surface-agent-instruction-files.js.map +1 -0
  113. package/dist/rules/ai-surface-llms-txt-structure.d.ts +18 -0
  114. package/dist/rules/ai-surface-llms-txt-structure.js +200 -0
  115. package/dist/rules/ai-surface-llms-txt-structure.js.map +1 -0
  116. package/dist/rules/ai-surface-mcp-config-present.d.ts +23 -0
  117. package/dist/rules/ai-surface-mcp-config-present.js +193 -0
  118. package/dist/rules/ai-surface-mcp-config-present.js.map +1 -0
  119. package/dist/rules/ai-surface-shadcn-registry-valid.d.ts +22 -0
  120. package/dist/rules/ai-surface-shadcn-registry-valid.js +247 -0
  121. package/dist/rules/ai-surface-shadcn-registry-valid.js.map +1 -0
  122. package/dist/rules/components-contracts-strictness.d.ts +48 -0
  123. package/dist/rules/components-contracts-strictness.js +372 -0
  124. package/dist/rules/components-contracts-strictness.js.map +1 -0
  125. package/dist/rules/registry.js +32 -0
  126. package/dist/rules/registry.js.map +1 -1
  127. package/dist/rules/tokens-dtcg-conformance.d.ts +55 -19
  128. package/dist/rules/tokens-dtcg-conformance.js +320 -82
  129. package/dist/rules/tokens-dtcg-conformance.js.map +1 -1
  130. package/dist/scorer.js +4 -3
  131. package/dist/scorer.js.map +1 -1
  132. package/dist/types.d.ts +2 -2
  133. package/dist/types.js.map +1 -1
  134. package/package.json +41 -16
  135. package/rules-manifest.json +431 -6
  136. package/schemas/v1/lyse-rules.json +1 -1
  137. package/dist/commands/ci-setup.d.ts +0 -9
  138. package/dist/commands/ci-setup.js +0 -42
  139. package/dist/commands/ci-setup.js.map +0 -1
  140. package/dist/commands/templates/lyse-workflow.yml.template +0 -30
@@ -0,0 +1,156 @@
1
+ // Pure (repoRoot: string) => string[] helper that surfaces reserved AI-marker
2
+ // design tokens declared in a repository. Consumed both by the
3
+ // `ai-governance/ai-tokens-reserved` inventory rule and by Track 3.3
4
+ // (`ai-governance/ai-token-requires-marker`), so the contract is intentionally
5
+ // minimal: glob + read, no logging, no Rule context, no network. Same input →
6
+ // same output, deterministic ordering.
7
+ import { readFileSync, statSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import fg from "fast-glob";
10
+ const JSON_TOKEN_PATTERNS = [
11
+ "tokens.json",
12
+ "tokens/**/*.json",
13
+ "*.tokens.json",
14
+ "**/tokens.json",
15
+ "**/tokens/**/*.json",
16
+ "**/*.tokens.json",
17
+ ];
18
+ const CSS_PATTERNS = ["**/*.css"];
19
+ const IGNORE = [
20
+ "**/node_modules/**",
21
+ "**/dist/**",
22
+ "**/build/**",
23
+ "**/.git/**",
24
+ "**/.next/**",
25
+ "**/out/**",
26
+ "**/coverage/**",
27
+ ];
28
+ const MAX_FILE_BYTES = 2_000_000;
29
+ // `--p-color-bg-magic` (CSS) / `color.ai.primary` (JSON) → name segments.
30
+ // Splitting on `-`, `_`, `.`, `/`, whitespace gives us segment-boundary
31
+ // matching so the substring `ai` in larger words (rain, paint, mainColor,
32
+ // captain, detail) does NOT match.
33
+ const SEGMENT_SPLIT = /[-_./\s]+/;
34
+ export function isReservedTokenName(rawName) {
35
+ const lower = rawName.toLowerCase();
36
+ if (lower.includes("dragon-fruit") || lower.includes("dragonfruit")) {
37
+ return true;
38
+ }
39
+ const segments = lower.split(SEGMENT_SPLIT).filter((s) => s.length > 0);
40
+ for (const seg of segments) {
41
+ if (seg === "ai")
42
+ return true;
43
+ if (seg.startsWith("magic"))
44
+ return true;
45
+ }
46
+ return false;
47
+ }
48
+ function safeReadText(absPath) {
49
+ try {
50
+ const stat = statSync(absPath);
51
+ if (!stat.isFile() || stat.size > MAX_FILE_BYTES || stat.size === 0) {
52
+ return null;
53
+ }
54
+ return readFileSync(absPath, "utf8");
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ function collectJsonLeafPaths(node, prefix, out) {
61
+ if (node === null || node === undefined)
62
+ return;
63
+ if (typeof node !== "object") {
64
+ if (prefix.length > 0)
65
+ out.add(prefix);
66
+ return;
67
+ }
68
+ if (Array.isArray(node)) {
69
+ // Arrays in design-token files (e.g. fontFamily: ["Inter", ...]) are
70
+ // value lists; the parent path is the token name.
71
+ if (prefix.length > 0)
72
+ out.add(prefix);
73
+ return;
74
+ }
75
+ const obj = node;
76
+ const keys = Object.keys(obj);
77
+ // DTCG leaf shape: `{ value: "...", type: "color", ... }` — treat as a leaf.
78
+ if ("value" in obj && (typeof obj.value !== "object" || obj.value === null)) {
79
+ if (prefix.length > 0)
80
+ out.add(prefix);
81
+ return;
82
+ }
83
+ for (const k of keys) {
84
+ const childPath = prefix.length === 0 ? k : `${prefix}.${k}`;
85
+ collectJsonLeafPaths(obj[k], childPath, out);
86
+ }
87
+ }
88
+ // `--token-name: ...` declarations in CSS. Captures the identifier only.
89
+ const CSS_CUSTOM_PROPERTY = /(--[a-zA-Z_][a-zA-Z0-9_-]*)\s*:/g;
90
+ function extractCssCustomPropertyNames(source) {
91
+ CSS_CUSTOM_PROPERTY.lastIndex = 0;
92
+ const out = [];
93
+ let m;
94
+ while ((m = CSS_CUSTOM_PROPERTY.exec(source)) !== null) {
95
+ if (m[1])
96
+ out.push(m[1]);
97
+ }
98
+ return out;
99
+ }
100
+ function discoverFiles(repoRoot, patterns) {
101
+ try {
102
+ return fg.sync(patterns, {
103
+ cwd: repoRoot,
104
+ absolute: false,
105
+ dot: false,
106
+ ignore: IGNORE,
107
+ followSymbolicLinks: false,
108
+ onlyFiles: true,
109
+ unique: true,
110
+ });
111
+ }
112
+ catch {
113
+ return [];
114
+ }
115
+ }
116
+ export function detectReservedAiTokens(repoRoot) {
117
+ if (!repoRoot)
118
+ return [];
119
+ const found = new Set();
120
+ const jsonFiles = discoverFiles(repoRoot, JSON_TOKEN_PATTERNS);
121
+ for (const rel of jsonFiles) {
122
+ const text = safeReadText(join(repoRoot, rel));
123
+ if (text === null)
124
+ continue;
125
+ let parsed;
126
+ try {
127
+ parsed = JSON.parse(text);
128
+ }
129
+ catch {
130
+ continue;
131
+ }
132
+ const leaves = new Set();
133
+ collectJsonLeafPaths(parsed, "", leaves);
134
+ for (const leaf of leaves) {
135
+ if (isReservedTokenName(leaf))
136
+ found.add(leaf);
137
+ }
138
+ }
139
+ const cssFiles = discoverFiles(repoRoot, CSS_PATTERNS);
140
+ for (const rel of cssFiles) {
141
+ const text = safeReadText(join(repoRoot, rel));
142
+ if (text === null)
143
+ continue;
144
+ for (const name of extractCssCustomPropertyNames(text)) {
145
+ if (isReservedTokenName(name))
146
+ found.add(name);
147
+ }
148
+ }
149
+ return Array.from(found).sort();
150
+ }
151
+ export const _internal = {
152
+ isReservedTokenName,
153
+ collectJsonLeafPaths,
154
+ extractCssCustomPropertyNames,
155
+ };
156
+ //# sourceMappingURL=ai-tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-tokens.js","sourceRoot":"","sources":["../../src/parsers/ai-tokens.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { SUB_AXES, getSubAxis } from "../sub-axes.js";
3
- const VALID_AXES = new Set(["tokens", "a11y", "components", "stories", "ai-surface"]);
3
+ import { ruleObjects } from "../../../rules/registry.js";
4
+ const VALID_AXES = new Set(["tokens", "a11y", "components", "stories", "ai-surface", "ai-governance"]);
4
5
  describe("SUB_AXES catalogue", () => {
5
- it("contains exactly 12 sub-axes (1 per shipped rule)", () => {
6
- expect(SUB_AXES.length).toBe(12);
6
+ it("contains one sub-axis per shipped rule", () => {
7
+ expect(SUB_AXES.length).toBe(ruleObjects.length);
7
8
  });
8
9
  it("each id is unique", () => {
9
10
  const ids = SUB_AXES.map((s) => s.id);
@@ -23,5 +24,14 @@ describe("SUB_AXES catalogue", () => {
23
24
  expect(VALID_AXES.has(s.axis)).toBe(true);
24
25
  }
25
26
  });
27
+ it("no sub-axis is promoted to `stable` without calibration evidence", () => {
28
+ for (const s of SUB_AXES) {
29
+ if (s.status === "stable") {
30
+ expect(s.recallWilsonLowerBound, `${s.id}: stable promotion requires recallWilsonLowerBound`).not.toBeNull();
31
+ expect(s.recallWilsonLowerBound).toBeGreaterThanOrEqual(0.9);
32
+ expect(s.lastCalibrated, `${s.id}: stable promotion requires lastCalibrated timestamp`).not.toBeNull();
33
+ }
34
+ }
35
+ });
26
36
  });
27
37
  //# sourceMappingURL=sub-axes.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sub-axes.test.js","sourceRoot":"","sources":["../../../../src/reliability/catalogue/__tests__/sub-axes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;AAEtF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"sub-axes.test.js","sourceRoot":"","sources":["../../../../src/reliability/catalogue/__tests__/sub-axes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;AAEvG,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,CAAC,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,EAAE,oDAAoD,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC7G,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,EAAE,sDAAsD,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzG,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -5,12 +5,28 @@ export const SUB_AXES = [
5
5
  { id: "tokens.description-coverage", axis: "tokens", name: "Token description coverage", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["tokens/description-coverage"], llmDriven: false },
6
6
  { id: "a11y.essentials", axis: "a11y", name: "jsx-a11y essentials", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["a11y/essentials"], llmDriven: false },
7
7
  { id: "components.native-shadows", axis: "components", name: "Native shadow elements", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["components/no-native-shadows"], llmDriven: false },
8
+ { id: "components.contracts-strictness", axis: "components", name: "Component prop contract strictness", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["components/contracts-strictness"], llmDriven: false },
8
9
  { id: "components.naming-component-pascalcase", axis: "components", name: "Component PascalCase", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["naming/component-pascalcase"], llmDriven: false },
9
10
  { id: "components.naming-hook-prefix", axis: "components", name: "Hook `use` prefix", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["naming/hook-prefix"], llmDriven: false },
10
11
  { id: "stories.coverage", axis: "stories", name: "Storybook coverage", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["stories/coverage"], llmDriven: false },
11
12
  { id: "ai-surface.agents-md-quality", axis: "ai-surface", name: "AGENTS.md quality", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-surface/agents-md-quality"], llmDriven: false },
12
13
  { id: "ai-surface.component-manifest-json", axis: "ai-surface", name: "Component manifest JSON", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-surface/component-manifest-json"], llmDriven: false },
13
14
  { id: "ai-surface.ds-index-exported", axis: "ai-surface", name: "DS index export", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-surface/ds-index-exported"], llmDriven: false },
15
+ { id: "ai-surface.mcp-config-present", axis: "ai-surface", name: "MCP config present", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-surface/mcp-config-present"], llmDriven: false },
16
+ { id: "ai-surface.llms-txt-structure", axis: "ai-surface", name: "llms.txt structure", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-surface/llms-txt-structure"], llmDriven: false },
17
+ { id: "ai-surface.shadcn-registry-valid", axis: "ai-surface", name: "shadcn registry validity", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-surface/shadcn-registry-valid"], llmDriven: false },
18
+ { id: "ai-surface.agent-instruction-files", axis: "ai-surface", name: "Agent instruction files (Cursor / Claude)", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-surface/agent-instruction-files"], llmDriven: false },
19
+ { id: "ai-governance.ai-tokens-reserved", axis: "ai-governance", name: "Reserved AI-marker tokens inventory", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/ai-tokens-reserved"], llmDriven: false },
20
+ { id: "ai-governance.ai-marker-component-present", axis: "ai-governance", name: "AI-marker component present", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/ai-marker-component-present"], llmDriven: false },
21
+ { id: "ai-governance.explainability-affordance", axis: "ai-governance", name: "Explainability affordance", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/explainability-affordance"], llmDriven: false },
22
+ { id: "ai-governance.ai-token-requires-marker", axis: "ai-governance", name: "AI token requires co-located marker", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/ai-token-requires-marker"], llmDriven: false },
23
+ { id: "ai-governance.ai-loading-error-states", axis: "ai-governance", name: "AI loading state & error state", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/ai-loading-error-states"], llmDriven: false },
24
+ { id: "ai-governance.human-control-affordances", axis: "ai-governance", name: "Human-control affordances", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/human-control-affordances"], llmDriven: false },
25
+ { id: "ai-governance.ai-marker-anti-patterns", axis: "ai-governance", name: "AI-marker anti-patterns", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/ai-marker-anti-patterns"], llmDriven: false },
26
+ { id: "ai-governance.ai-content-live-region", axis: "ai-governance", name: "AI content live region", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/ai-content-live-region"], llmDriven: false },
27
+ { id: "ai-governance.disclaimer-present", axis: "ai-governance", name: "AI disclaimer present", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/disclaimer-present"], llmDriven: false },
28
+ { id: "ai-governance.feedback-control-present", axis: "ai-governance", name: "AI feedback control present", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/feedback-control-present"], llmDriven: false },
29
+ { id: "ai-governance.value-gate-doc-present", axis: "ai-governance", name: "AI value-gate governance doc", status: "experimental", precisionMeasured: null, recallMeasured: null, precisionWilsonLowerBound: null, recallWilsonLowerBound: null, lastCalibrated: null, contributesToScore: false, ruleIds: ["ai-governance/value-gate-doc-present"], llmDriven: false },
14
30
  ];
15
31
  export function getSubAxis(id) {
16
32
  return SUB_AXES.find((s) => s.id === id);
@@ -1 +1 @@
1
- {"version":3,"file":"sub-axes.js","sourceRoot":"","sources":["../../../src/reliability/catalogue/sub-axes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sub-axes.js","sourceRoot":"","sources":["../../../src/reliability/catalogue/sub-axes.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  export type ScoringVersion = `scoring-v${number}`;
2
2
  export type SubAxisStatus = "stable" | "experimental" | "disabled";
3
3
  export type SubAxisId = string;
4
- export type AxisLabel = "tokens" | "a11y" | "components" | "stories" | "ai-surface";
4
+ export type AxisLabel = "tokens" | "a11y" | "components" | "stories" | "ai-surface" | "ai-governance";
5
5
  export interface SubAxisRecord {
6
6
  id: SubAxisId;
7
7
  axis: AxisLabel;
@@ -1,4 +1,4 @@
1
- const ZERO = { tokens: 0, a11y: 0, components: 0, stories: 0, "ai-surface": 0 };
1
+ const ZERO = { tokens: 0, a11y: 0, components: 0, stories: 0, "ai-surface": 0, "ai-governance": 0 };
2
2
  export async function runRules(rules, ctx, parsed) {
3
3
  const findings = [];
4
4
  const opportunitiesByAxis = { ...ZERO };
@@ -1 +1 @@
1
- {"version":3,"file":"rule-runner.js","sourceRoot":"","sources":["../src/rule-runner.ts"],"names":[],"mappings":"AASA,MAAM,IAAI,GAA6B,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;AAE1G,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,GAAgB,EAAE,MAAmB;IACjF,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,mBAAmB,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAClE,MAAM,cAAc,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;QAClD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,CAAC,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAW,CAAC;QACzD,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"rule-runner.js","sourceRoot":"","sources":["../src/rule-runner.ts"],"names":[],"mappings":"AASA,MAAM,IAAI,GAA6B,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;AAE9H,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,GAAgB,EAAE,MAAmB;IACjF,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,mBAAmB,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAClE,MAAM,cAAc,GAA6B,EAAE,GAAG,IAAI,EAAE,CAAC;IAC7D,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC7B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC;QAClD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,CAAC,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAW,CAAC;QACzD,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7E,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Rule } from "../types.js";
2
+ export declare function detectAiOutputSurface(source: string): boolean;
3
+ export declare function detectLiveRegion(source: string): boolean;
4
+ export declare const rule: Rule;
5
+ export declare const _internal: {
6
+ detectAiOutputSurface: typeof detectAiOutputSurface;
7
+ detectLiveRegion: typeof detectLiveRegion;
8
+ isAllowlisted: (repoRoot: string) => boolean;
9
+ DISABLE_DIRECTIVE: string;
10
+ ALLOWLIST_CANDIDATES: string[];
11
+ };
@@ -0,0 +1,304 @@
1
+ import { join } from "node:path";
2
+ import fg from "fast-glob";
3
+ import { createLyseRule } from "./_rule-module.js";
4
+ import { isAiMarkerName, safeReadText, COMPONENT_GLOB, SCAN_IGNORE, makeAllowlistCheck, } from "./ai-governance-ai-marker-component-present.js";
5
+ const RULE_ID = "ai-governance/ai-content-live-region";
6
+ const DISABLE_DIRECTIVE = `lyse-disable ${RULE_ID}`;
7
+ const ALLOWLIST_CANDIDATES = [
8
+ "README.md",
9
+ "README",
10
+ "README.mdx",
11
+ "readme.md",
12
+ ".lyse.yaml",
13
+ ".lyse.yml",
14
+ ];
15
+ const isAllowlisted = makeAllowlistCheck(DISABLE_DIRECTIVE);
16
+ // Fix 3: match "AIResponse" or "ChatMessage" as a complete PascalCase segment
17
+ // within a component tag name — not as an arbitrary substring.
18
+ //
19
+ // Rules (by example):
20
+ // ChatAIResponse → match (AIResponse is a terminal segment after a prior word)
21
+ // AIResponseBlock → match (AIResponse is a leading segment before a following word)
22
+ // ChatMessage → match (exact or terminal)
23
+ // MyChatMessage → match (ChatMessage is terminal)
24
+ // SystemChatMessageDisplay → NO match (ChatMessage is in the middle with Display after it)
25
+ //
26
+ // Implementation: the keyword must either start the tag name (at index 0)
27
+ // OR be preceded by at least one lowercase character (end of a prior word),
28
+ // AND the keyword must end the tag name OR be followed by an uppercase letter
29
+ // (start of the next segment). We use two conditions:
30
+ // "ends the name after a prior word" → /[a-z]KEYWORD$/
31
+ // "starts the name with more after" → /^KEYWORD[A-Z]/
32
+ // "is the entire name" → exact equality
33
+ function hasAiResponseSegment(tagName) {
34
+ for (const kw of ["AIResponse", "ChatMessage"]) {
35
+ if (tagName === kw)
36
+ return true;
37
+ // Terminal: preceded by lowercase (end of another word), at end of string.
38
+ if (new RegExp(`[a-z]${kw}$`).test(tagName))
39
+ return true;
40
+ // Leading: at start of string, followed by uppercase (more words after).
41
+ if (new RegExp(`^${kw}[A-Z]`).test(tagName))
42
+ return true;
43
+ }
44
+ return false;
45
+ }
46
+ // Fix 2: streaming prop detection restricted to JSX prop context.
47
+ // Scan JSX open tags and test their attribute text for the prop names.
48
+ const JSX_TAG_WITH_ATTRS_RE = /<([A-Z][A-Za-z\d.]*)\b([^>]*?)(?:\/?>)/gms;
49
+ const STREAMING_ATTR_RE = /\b(?:isStreaming|isGenerating)\b/;
50
+ // JSX/Vue open-tag scanner.
51
+ const JSX_OPEN_TAG_RE = /<\s*([A-Za-z][\w.]*)/g;
52
+ export function detectAiOutputSurface(source) {
53
+ JSX_OPEN_TAG_RE.lastIndex = 0;
54
+ let m;
55
+ while ((m = JSX_OPEN_TAG_RE.exec(source)) !== null) {
56
+ const tag = m[1];
57
+ if (!tag)
58
+ continue;
59
+ if (isAiMarkerName(tag))
60
+ return true;
61
+ // Fix 3: segment-level match, not substring.
62
+ if (hasAiResponseSegment(tag))
63
+ return true;
64
+ }
65
+ // Fix 2: only credit isStreaming/isGenerating when used as a JSX prop.
66
+ JSX_TAG_WITH_ATTRS_RE.lastIndex = 0;
67
+ let tm;
68
+ while ((tm = JSX_TAG_WITH_ATTRS_RE.exec(source)) !== null) {
69
+ const attrs = tm[2] ?? "";
70
+ if (STREAMING_ATTR_RE.test(attrs))
71
+ return true;
72
+ }
73
+ return false;
74
+ }
75
+ // aria-live with polite or assertive value (not "off").
76
+ const ARIA_LIVE_RE = /\baria-live\s*=\s*["'`](polite|assertive)["'`]/i;
77
+ // role="status" or role="alert" (ARIA live-region roles).
78
+ const ROLE_LIVE_RE = /\brole\s*=\s*["'`](status|alert)["'`]/i;
79
+ // PatternFly isLiveRegion prop (boolean or ={true}).
80
+ const IS_LIVE_REGION_RE = /\bisLiveRegion\b/;
81
+ export function detectLiveRegion(source) {
82
+ return ARIA_LIVE_RE.test(source) || ROLE_LIVE_RE.test(source) || IS_LIVE_REGION_RE.test(source);
83
+ }
84
+ function describeLiveRegion(source) {
85
+ const ariaMatch = source.match(/aria-live\s*=\s*["'`](polite|assertive)["'`]/i);
86
+ if (ariaMatch)
87
+ return `aria-live="${ariaMatch[1] ?? "polite"}"`;
88
+ if (/\brole\s*=\s*["'`]status["'`]/i.test(source))
89
+ return `role="status"`;
90
+ if (/\brole\s*=\s*["'`]alert["'`]/i.test(source))
91
+ return `role="alert"`;
92
+ return "isLiveRegion";
93
+ }
94
+ // Fix 1: Proximity check — credit info only when the live-region attribute
95
+ // wraps the AI-output component, not just co-exists in the same file.
96
+ //
97
+ // Pragmatic static approximation (documented limitation):
98
+ // We extract JSX/template "return blocks" by splitting on `return (` and `};`
99
+ // boundaries, then check if both a live-region attribute AND an AI-output tag
100
+ // appear within the same block. A live-region element that is in a separate
101
+ // component function (e.g. a toast) does not wrap the AI output.
102
+ //
103
+ // Additionally, within a candidate block, we require that the live-region
104
+ // open tag appears BEFORE the AI-output tag in source order (wraps it from
105
+ // above), which is the correct DOM wrapping direction.
106
+ //
107
+ // Limitation: does not handle all patterns (e.g. conditional renders that
108
+ // conditionally include both) — bias is conservative (WARNING when in doubt).
109
+ const LIVE_REGION_OPEN_RE = /<[A-Za-z][\w.]*\b[^>]*?(?:aria-live\s*=\s*["'`](?:polite|assertive)["'`]|\brole\s*=\s*["'`](?:status|alert)["'`]|\bisLiveRegion\b)[^>]*?(?:\/?>)/gms;
110
+ function isLiveRegionProximate(source) {
111
+ // Collect positions of live-region open tags.
112
+ const livePositions = [];
113
+ LIVE_REGION_OPEN_RE.lastIndex = 0;
114
+ let lm;
115
+ while ((lm = LIVE_REGION_OPEN_RE.exec(source)) !== null) {
116
+ livePositions.push(lm.index);
117
+ }
118
+ if (livePositions.length === 0)
119
+ return false;
120
+ // Collect positions of AI-output tags.
121
+ const aiPositions = [];
122
+ JSX_OPEN_TAG_RE.lastIndex = 0;
123
+ let am;
124
+ while ((am = JSX_OPEN_TAG_RE.exec(source)) !== null) {
125
+ const tag = am[1];
126
+ if (!tag)
127
+ continue;
128
+ if (isAiMarkerName(tag) || hasAiResponseSegment(tag)) {
129
+ aiPositions.push(am.index);
130
+ }
131
+ }
132
+ // Also collect positions of streaming-prop JSX tags.
133
+ JSX_TAG_WITH_ATTRS_RE.lastIndex = 0;
134
+ let tm2;
135
+ while ((tm2 = JSX_TAG_WITH_ATTRS_RE.exec(source)) !== null) {
136
+ const attrs = tm2[2] ?? "";
137
+ if (STREAMING_ATTR_RE.test(attrs)) {
138
+ aiPositions.push(tm2.index);
139
+ }
140
+ }
141
+ if (aiPositions.length === 0)
142
+ return false;
143
+ // For proximity: split the source into component-function "slots" by
144
+ // detecting JSX return blocks. A simple heuristic: a "block" is the region
145
+ // between consecutive occurrences of `return (` or `return <` (function
146
+ // body boundaries). We check whether any (livePos, aiPos) pair share the
147
+ // same slot AND live region opens before the AI-output tag.
148
+ //
149
+ // Slot boundaries: positions of `return ` keyword + open paren/angle.
150
+ const RETURN_RE = /\breturn\s*[(<]/g;
151
+ const returnPositions = [0];
152
+ let rm;
153
+ RETURN_RE.lastIndex = 0;
154
+ while ((rm = RETURN_RE.exec(source)) !== null) {
155
+ returnPositions.push(rm.index);
156
+ }
157
+ returnPositions.push(source.length);
158
+ function slotOf(pos) {
159
+ let slot = 0;
160
+ for (let i = 0; i < returnPositions.length - 1; i++) {
161
+ const start = returnPositions[i];
162
+ const end = returnPositions[i + 1];
163
+ if (start !== undefined && end !== undefined && pos >= start && pos < end) {
164
+ slot = i;
165
+ break;
166
+ }
167
+ }
168
+ return slot;
169
+ }
170
+ for (const aiPos of aiPositions) {
171
+ const aiSlot = slotOf(aiPos);
172
+ for (const livePos of livePositions) {
173
+ if (slotOf(livePos) === aiSlot && livePos < aiPos)
174
+ return true;
175
+ }
176
+ }
177
+ return false;
178
+ }
179
+ const MAX_LISTED_FILES = 20;
180
+ const evaluate = async (ctx, _files) => {
181
+ const findings = [];
182
+ if (!ctx.repoRoot)
183
+ return { findings, opportunities: 0 };
184
+ if (isAllowlisted(ctx.repoRoot))
185
+ return { findings, opportunities: 0 };
186
+ let componentFiles = [];
187
+ try {
188
+ componentFiles = fg.sync(COMPONENT_GLOB, {
189
+ cwd: ctx.repoRoot,
190
+ absolute: false,
191
+ dot: false,
192
+ ignore: SCAN_IGNORE,
193
+ onlyFiles: true,
194
+ unique: true,
195
+ });
196
+ }
197
+ catch {
198
+ return { findings, opportunities: 0 };
199
+ }
200
+ componentFiles.sort();
201
+ let hasAiSurface = false;
202
+ const missingLiveRegionFiles = [];
203
+ for (const rel of componentFiles) {
204
+ const abs = join(ctx.repoRoot, rel);
205
+ const source = safeReadText(abs);
206
+ if (!source)
207
+ continue;
208
+ if (!detectAiOutputSurface(source))
209
+ continue;
210
+ hasAiSurface = true;
211
+ // Fix 1: require proximity — live region must wrap the AI output, not just
212
+ // co-exist in the same file (e.g. a toast component in a different function).
213
+ if (isLiveRegionProximate(source)) {
214
+ const mechanism = describeLiveRegion(source);
215
+ findings.push({
216
+ ruleId: RULE_ID,
217
+ axis: "ai-governance",
218
+ severity: "info",
219
+ location: { file: rel, line: 1, column: 1 },
220
+ message: `AI output component is announced to assistive technology via ${mechanism} (WAI-ARIA live region / PatternFly isLiveRegion)`,
221
+ suggestion: "Live region detected — verify that the region wraps AI output directly and uses aria-live=\"polite\" for non-urgent streaming content.",
222
+ });
223
+ }
224
+ else {
225
+ missingLiveRegionFiles.push(rel);
226
+ }
227
+ }
228
+ if (!hasAiSurface)
229
+ return { findings: [], opportunities: 0 };
230
+ if (missingLiveRegionFiles.length > 0) {
231
+ const listed = missingLiveRegionFiles.slice(0, MAX_LISTED_FILES);
232
+ const overflow = missingLiveRegionFiles.length - listed.length;
233
+ const fileList = listed.join(", ") + (overflow > 0 ? `, +${overflow} more` : "");
234
+ findings.unshift({
235
+ ruleId: RULE_ID,
236
+ axis: "ai-governance",
237
+ severity: "warning",
238
+ location: { file: missingLiveRegionFiles[0] ?? "src/index.ts", line: 1, column: 1 },
239
+ message: `${missingLiveRegionFiles.length} file${missingLiveRegionFiles.length === 1 ? "" : "s"} contain an AI output or streaming component with no live region — screen-reader users will not hear streamed content: ${fileList}. Wrap each output in aria-live="polite", role="status", or PatternFly isLiveRegion.`,
240
+ suggestion: "Add aria-live=\"polite\" (or role=\"status\") to the container wrapping the AI output component, or use PatternFly's isLiveRegion prop.",
241
+ });
242
+ }
243
+ return { findings, opportunities: componentFiles.length };
244
+ };
245
+ export const rule = createLyseRule({
246
+ meta: {
247
+ axis: "ai-governance",
248
+ lyseRuleId: RULE_ID,
249
+ defaultSeverity: "warning",
250
+ shortDescription: "Detect ARIA live region on AI output / streaming components",
251
+ fullDescription: "Globs `**/*.{tsx,jsx,vue}` and runs two per-file detectors: one that identifies AI-output/streaming surfaces (AI_MARKER_NAMES, *AIResponse*, *ChatMessage*, isStreaming, isGenerating props), another that detects live-region attributes (aria-live=\"polite|assertive\", role=\"status\", role=\"alert\", PatternFly isLiveRegion). Cross-condition: AI surface present but no live region → `warning`; AI surface inside a live region → `info` naming the mechanism; no AI/streaming surface → no finding.",
252
+ helpUri: "https://github.com/lyse-labs/lyse/blob/main/docs/rules/ai-governance-ai-content-live-region.md",
253
+ rationale: `Why it matters
254
+
255
+ Screen-reader users rely on ARIA live regions to hear dynamically updated content. When an AI model streams a response token-by-token, the DOM updates silently unless the container carries aria-live="polite", role="status", role="alert", or an equivalent framework mechanism. Without a live region, visually impaired users miss the entire AI response — a failure of both accessibility and AI-governance (the system produces output that some users cannot perceive).
256
+
257
+ WAI-ARIA specifies that aria-live="polite" announces changes after the user is idle (appropriate for non-urgent AI output); aria-live="assertive" / role="alert" interrupt immediately (use only for errors). PatternFly provides isLiveRegion as a prop on several container components to avoid hand-rolling the attribute.
258
+
259
+ This rule checks the static presence of a live-region mechanism in the same file as an AI-output or streaming component — it does not verify runtime behaviour or dynamic DOM updates.`,
260
+ examples: [
261
+ {
262
+ good: `// aria-live wraps AI output (React)
263
+ export function AiAnswer({ content }: { content: string }) {
264
+ return (
265
+ <div aria-live="polite">
266
+ <AILabel>AI</AILabel>
267
+ <p>{content}</p>
268
+ </div>
269
+ );
270
+ }`,
271
+ bad: `// AI output with no live region
272
+ export function AiAnswer({ content }: { content: string }) {
273
+ return (
274
+ <div className="response">
275
+ <ChatAIResponse content={content} />
276
+ </div>
277
+ );
278
+ }`,
279
+ },
280
+ {
281
+ good: `// PatternFly isLiveRegion
282
+ <TextContent isLiveRegion>{streamedContent}</TextContent>`,
283
+ bad: `// isStreaming prop but no live region wrapper
284
+ <OutputBlock isGenerating={generating} />`,
285
+ },
286
+ ],
287
+ allowlist: [
288
+ "repos containing `lyse-disable ai-governance/ai-content-live-region` in an adjacent README or `.lyse.yaml` — rule is N/A",
289
+ "repos with no AI-output or streaming component — no AI surface detected, rule emits nothing",
290
+ "files larger than 1 MB — skipped to avoid pathological cases",
291
+ "files under `node_modules/`, `dist/`, `build/`, `.git/`, `.next/`, `out/`, `coverage/`",
292
+ ],
293
+ },
294
+ defaultOptions: [],
295
+ create: () => ({ evaluate }),
296
+ });
297
+ export const _internal = {
298
+ detectAiOutputSurface,
299
+ detectLiveRegion,
300
+ isAllowlisted,
301
+ DISABLE_DIRECTIVE,
302
+ ALLOWLIST_CANDIDATES,
303
+ };
304
+ //# sourceMappingURL=ai-governance-ai-content-live-region.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-governance-ai-content-live-region.js","sourceRoot":"","sources":["../../src/rules/ai-governance-ai-content-live-region.ts"],"names":[],"mappings":"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"}