@zelari/core 0.7.12 → 0.7.14

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 (138) hide show
  1. package/dist/agents/councilApi.d.ts +135 -0
  2. package/dist/agents/councilApi.d.ts.map +1 -1
  3. package/dist/agents/councilApi.js +520 -7
  4. package/dist/agents/councilApi.js.map +1 -1
  5. package/dist/agents/roles.d.ts.map +1 -1
  6. package/dist/agents/roles.js +11 -3
  7. package/dist/agents/roles.js.map +1 -1
  8. package/dist/agents/toolSchemas.d.ts.map +1 -1
  9. package/dist/agents/toolSchemas.js +32 -3
  10. package/dist/agents/toolSchemas.js.map +1 -1
  11. package/dist/core/AgentHarness.d.ts +21 -0
  12. package/dist/core/AgentHarness.d.ts.map +1 -1
  13. package/dist/core/AgentHarness.js +153 -0
  14. package/dist/core/AgentHarness.js.map +1 -1
  15. package/dist/core/tools/builtin/filesystem.d.ts.map +1 -1
  16. package/dist/core/tools/builtin/filesystem.js +4 -2
  17. package/dist/core/tools/builtin/filesystem.js.map +1 -1
  18. package/dist/council/completion/buildCompletion.d.ts +23 -0
  19. package/dist/council/completion/buildCompletion.d.ts.map +1 -0
  20. package/dist/council/completion/buildCompletion.js +75 -0
  21. package/dist/council/completion/buildCompletion.js.map +1 -0
  22. package/dist/council/completion/index.d.ts +3 -0
  23. package/dist/council/completion/index.d.ts.map +1 -0
  24. package/dist/council/completion/index.js +3 -0
  25. package/dist/council/completion/index.js.map +1 -0
  26. package/dist/council/completion/types.d.ts +38 -0
  27. package/dist/council/completion/types.d.ts.map +1 -0
  28. package/dist/council/completion/types.js +2 -0
  29. package/dist/council/completion/types.js.map +1 -0
  30. package/dist/council/index.d.ts +4 -0
  31. package/dist/council/index.d.ts.map +1 -1
  32. package/dist/council/index.js +4 -0
  33. package/dist/council/index.js.map +1 -1
  34. package/dist/council/lessons/index.d.ts +7 -0
  35. package/dist/council/lessons/index.d.ts.map +1 -0
  36. package/dist/council/lessons/index.js +7 -0
  37. package/dist/council/lessons/index.js.map +1 -0
  38. package/dist/council/lessons/io.d.ts +5 -0
  39. package/dist/council/lessons/io.d.ts.map +1 -0
  40. package/dist/council/lessons/io.js +30 -0
  41. package/dist/council/lessons/io.js.map +1 -0
  42. package/dist/council/lessons/isAnswerLeak.d.ts +7 -0
  43. package/dist/council/lessons/isAnswerLeak.d.ts.map +1 -0
  44. package/dist/council/lessons/isAnswerLeak.js +26 -0
  45. package/dist/council/lessons/isAnswerLeak.js.map +1 -0
  46. package/dist/council/lessons/recallLessons.d.ts +8 -0
  47. package/dist/council/lessons/recallLessons.d.ts.map +1 -0
  48. package/dist/council/lessons/recallLessons.js +56 -0
  49. package/dist/council/lessons/recallLessons.js.map +1 -0
  50. package/dist/council/lessons/recordFailure.d.ts +7 -0
  51. package/dist/council/lessons/recordFailure.d.ts.map +1 -0
  52. package/dist/council/lessons/recordFailure.js +86 -0
  53. package/dist/council/lessons/recordFailure.js.map +1 -0
  54. package/dist/council/lessons/signatures.d.ts +6 -0
  55. package/dist/council/lessons/signatures.d.ts.map +1 -0
  56. package/dist/council/lessons/signatures.js +31 -0
  57. package/dist/council/lessons/signatures.js.map +1 -0
  58. package/dist/council/lessons/types.d.ts +27 -0
  59. package/dist/council/lessons/types.d.ts.map +1 -0
  60. package/dist/council/lessons/types.js +2 -0
  61. package/dist/council/lessons/types.js.map +1 -0
  62. package/dist/council/modeBanners.d.ts +24 -1
  63. package/dist/council/modeBanners.d.ts.map +1 -1
  64. package/dist/council/modeBanners.js +31 -4
  65. package/dist/council/modeBanners.js.map +1 -1
  66. package/dist/council/scope/extractTaskScope.d.ts +35 -0
  67. package/dist/council/scope/extractTaskScope.d.ts.map +1 -0
  68. package/dist/council/scope/extractTaskScope.js +174 -0
  69. package/dist/council/scope/extractTaskScope.js.map +1 -0
  70. package/dist/council/scope/index.d.ts +3 -0
  71. package/dist/council/scope/index.d.ts.map +1 -0
  72. package/dist/council/scope/index.js +3 -0
  73. package/dist/council/scope/index.js.map +1 -0
  74. package/dist/council/scope/nfrSpecWarn.d.ts +6 -0
  75. package/dist/council/scope/nfrSpecWarn.d.ts.map +1 -0
  76. package/dist/council/scope/nfrSpecWarn.js +21 -0
  77. package/dist/council/scope/nfrSpecWarn.js.map +1 -0
  78. package/dist/council/verification/autofix.d.ts +12 -0
  79. package/dist/council/verification/autofix.d.ts.map +1 -0
  80. package/dist/council/verification/autofix.js +41 -0
  81. package/dist/council/verification/autofix.js.map +1 -0
  82. package/dist/council/verification/citeVerify.d.ts +13 -0
  83. package/dist/council/verification/citeVerify.d.ts.map +1 -0
  84. package/dist/council/verification/citeVerify.js +73 -0
  85. package/dist/council/verification/citeVerify.js.map +1 -0
  86. package/dist/council/verification/completion.d.ts +19 -0
  87. package/dist/council/verification/completion.d.ts.map +1 -0
  88. package/dist/council/verification/completion.js +50 -0
  89. package/dist/council/verification/completion.js.map +1 -0
  90. package/dist/council/verification/degraded.d.ts +26 -0
  91. package/dist/council/verification/degraded.d.ts.map +1 -0
  92. package/dist/council/verification/degraded.js +35 -0
  93. package/dist/council/verification/degraded.js.map +1 -0
  94. package/dist/council/verification/honesty.d.ts +6 -0
  95. package/dist/council/verification/honesty.d.ts.map +1 -0
  96. package/dist/council/verification/honesty.js +28 -0
  97. package/dist/council/verification/honesty.js.map +1 -0
  98. package/dist/council/verification/implementationDelivery.d.ts +26 -0
  99. package/dist/council/verification/implementationDelivery.d.ts.map +1 -0
  100. package/dist/council/verification/implementationDelivery.js +70 -0
  101. package/dist/council/verification/implementationDelivery.js.map +1 -0
  102. package/dist/council/verification/index.d.ts +15 -0
  103. package/dist/council/verification/index.d.ts.map +1 -0
  104. package/dist/council/verification/index.js +15 -0
  105. package/dist/council/verification/index.js.map +1 -0
  106. package/dist/council/verification/inlineJsAutofix.d.ts +8 -0
  107. package/dist/council/verification/inlineJsAutofix.d.ts.map +1 -0
  108. package/dist/council/verification/inlineJsAutofix.js +85 -0
  109. package/dist/council/verification/inlineJsAutofix.js.map +1 -0
  110. package/dist/council/verification/microGate.d.ts +18 -0
  111. package/dist/council/verification/microGate.d.ts.map +1 -0
  112. package/dist/council/verification/microGate.js +81 -0
  113. package/dist/council/verification/microGate.js.map +1 -0
  114. package/dist/council/verification/motionAutofix.d.ts +8 -0
  115. package/dist/council/verification/motionAutofix.d.ts.map +1 -0
  116. package/dist/council/verification/motionAutofix.js +160 -0
  117. package/dist/council/verification/motionAutofix.js.map +1 -0
  118. package/dist/council/verification/parseCssMotion.d.ts +22 -0
  119. package/dist/council/verification/parseCssMotion.d.ts.map +1 -0
  120. package/dist/council/verification/parseCssMotion.js +142 -0
  121. package/dist/council/verification/parseCssMotion.js.map +1 -0
  122. package/dist/council/verification/runChecks.d.ts +10 -0
  123. package/dist/council/verification/runChecks.d.ts.map +1 -0
  124. package/dist/council/verification/runChecks.js +254 -0
  125. package/dist/council/verification/runChecks.js.map +1 -0
  126. package/dist/council/verification/synthesisAudit.d.ts +14 -0
  127. package/dist/council/verification/synthesisAudit.d.ts.map +1 -0
  128. package/dist/council/verification/synthesisAudit.js +106 -0
  129. package/dist/council/verification/synthesisAudit.js.map +1 -0
  130. package/dist/council/verification/tiers.d.ts +8 -0
  131. package/dist/council/verification/tiers.d.ts.map +1 -0
  132. package/dist/council/verification/tiers.js +46 -0
  133. package/dist/council/verification/tiers.js.map +1 -0
  134. package/dist/council/verification/types.d.ts +53 -0
  135. package/dist/council/verification/types.d.ts.map +1 -0
  136. package/dist/council/verification/types.js +5 -0
  137. package/dist/council/verification/types.js.map +1 -0
  138. package/package.json +1 -1
@@ -0,0 +1,81 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { scanKeyframesViolations, scanTransitionViolations } from './parseCssMotion.js';
4
+ import { loadNfrSpec, DEFAULT_NFR_SPEC } from './runChecks.js';
5
+ function checkDeadHooksInHtml(html) {
6
+ const warnings = [];
7
+ const scripts = [];
8
+ const scriptRe = /<script[^>]*>([\s\S]*?)<\/script>/gi;
9
+ let sm;
10
+ while ((sm = scriptRe.exec(html)) !== null)
11
+ scripts.push(sm[1] ?? '');
12
+ const styleText = (html.match(/<style[^>]*>([\s\S]*?)<\/style>/gi) ?? []).join('\n');
13
+ const addRe = /classList\.add\(\s*['"]([\w-]+)['"]\s*\)/g;
14
+ for (const script of scripts) {
15
+ let am;
16
+ addRe.lastIndex = 0;
17
+ while ((am = addRe.exec(script)) !== null) {
18
+ const cls = am[1] ?? '';
19
+ const hasRule = new RegExp(`\\.${cls}\\b`).test(styleText) ||
20
+ new RegExp(`html\\.${cls}\\b`).test(styleText);
21
+ if (!hasRule) {
22
+ warnings.push({
23
+ id: 'css.dead-hook',
24
+ message: `classList.add('${cls}') has no CSS rule (.${cls})`,
25
+ file: '',
26
+ });
27
+ }
28
+ }
29
+ }
30
+ return warnings;
31
+ }
32
+ /**
33
+ * Quick subset of Gate A on a single file (HTML). Used for inline WARN after writes.
34
+ */
35
+ export function runMicroVerificationOnFile(projectRoot, relPath, zelariRoot) {
36
+ const abs = join(projectRoot, relPath);
37
+ if (!existsSync(abs) || !/\.html?$/i.test(relPath))
38
+ return [];
39
+ const spec = (zelariRoot ? loadNfrSpec(zelariRoot) : null) ?? DEFAULT_NFR_SPEC;
40
+ const anim = spec.animation ?? { compositorOnly: true, forbidLayoutProps: true };
41
+ const scanOpts = {
42
+ compositorOnly: anim.compositorOnly ?? true,
43
+ forbidLayoutProps: anim.forbidLayoutProps ?? true,
44
+ };
45
+ const html = readFileSync(abs, 'utf8');
46
+ const warnings = [];
47
+ for (const v of scanKeyframesViolations(html, scanOpts)) {
48
+ warnings.push({
49
+ id: 'motion.keyframes',
50
+ message: `@keyframes uses non-allowed property "${v.property}"`,
51
+ file: relPath,
52
+ line: v.line,
53
+ });
54
+ }
55
+ for (const v of scanTransitionViolations(html, scanOpts)) {
56
+ warnings.push({
57
+ id: 'motion.transitions',
58
+ message: `transition uses non-allowed property "${v.property}"`,
59
+ file: relPath,
60
+ line: v.line,
61
+ });
62
+ }
63
+ for (const w of checkDeadHooksInHtml(html)) {
64
+ warnings.push({ ...w, file: relPath });
65
+ }
66
+ return warnings;
67
+ }
68
+ export function parseProjectRootFromWorkspaceContext(ctx) {
69
+ const m = ctx.match(/Working directory:\s*(.+)/m);
70
+ return m?.[1]?.trim() ?? null;
71
+ }
72
+ /** Run micro-gate when Lucifero writes a target HTML file. */
73
+ export function runChairmanMicroGate(input) {
74
+ const normalized = input.relPath.replace(/\\/g, '/');
75
+ const spec = (input.zelariRoot ? loadNfrSpec(input.zelariRoot) : null) ?? DEFAULT_NFR_SPEC;
76
+ const inTarget = spec.targets.some((t) => normalized === t || normalized.endsWith(`/${t}`));
77
+ if (!inTarget && !/\.html?$/i.test(normalized))
78
+ return [];
79
+ return runMicroVerificationOnFile(input.projectRoot, normalized, input.zelariRoot);
80
+ }
81
+ //# sourceMappingURL=microGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microGate.js","sourceRoot":"","sources":["../../../src/council/verification/microGate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { VerificationReport } from './types.js';
2
+ /** Apply deterministic motion + .rm CSS fixes to HTML targets from a verify report. */
3
+ export declare function applyMotionAutofix(projectRoot: string, report: VerificationReport): {
4
+ applied: boolean;
5
+ filesChanged: string[];
6
+ fixes: string[];
7
+ };
8
+ //# sourceMappingURL=motionAutofix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motionAutofix.d.ts","sourceRoot":"","sources":["../../../src/council/verification/motionAutofix.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAkGrD,uFAAuF;AACvF,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,kBAAkB,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAiE/D"}
@@ -0,0 +1,160 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { COMPOSITOR_ONLY_PROPS, LAYOUT_MOTION_PROPS, scanKeyframesViolations, scanTransitionViolations, } from './parseCssMotion.js';
4
+ import { DEFAULT_NFR_SPEC } from './runChecks.js';
5
+ const FORBIDDEN_ANIM_PROPS = new Set([
6
+ ...LAYOUT_MOTION_PROPS,
7
+ 'box-shadow',
8
+ 'background',
9
+ 'background-color',
10
+ 'background-position',
11
+ 'color',
12
+ 'border-color',
13
+ 'filter',
14
+ 'all',
15
+ ]);
16
+ const RM_CSS = `
17
+ .rm *, .rm *::before, .rm *::after {
18
+ animation-duration: 0.001ms !important;
19
+ animation-iteration-count: 1 !important;
20
+ transition-duration: 0.001ms !important;
21
+ scroll-behavior: auto !important;
22
+ }
23
+ .rm .reveal { opacity: 1 !important; transform: none !important; }
24
+ .rm .section-title h2::after { transform: scaleX(1) !important; }
25
+ .rm .aurora { display: none; }
26
+ `;
27
+ function isForbiddenAnimProp(prop) {
28
+ const p = prop.toLowerCase();
29
+ if (COMPOSITOR_ONLY_PROPS.has(p))
30
+ return false;
31
+ return FORBIDDEN_ANIM_PROPS.has(p);
32
+ }
33
+ /** Keep only transform/opacity tokens in a transition shorthand fragment. */
34
+ function sanitizeTransitionPart(part) {
35
+ const tokens = part.trim().split(/\s+/);
36
+ if (tokens.length === 0)
37
+ return null;
38
+ const prop = tokens[0].toLowerCase();
39
+ if (prop === 'transform' || prop === 'opacity')
40
+ return part.trim();
41
+ return null;
42
+ }
43
+ function sanitizeTransitionValue(value) {
44
+ const parts = value.split(',').map((p) => p.trim()).filter(Boolean);
45
+ const kept = parts
46
+ .map(sanitizeTransitionPart)
47
+ .filter((p) => p !== null);
48
+ return kept.length > 0 ? kept.join(', ') : 'none';
49
+ }
50
+ const TRANSITION_DECL_RE = /(transition(?:-property)?)\s*:\s*([^;{}]+)/gi;
51
+ function sanitizeTransitionsInCss(css) {
52
+ return css.replace(TRANSITION_DECL_RE, (full, prop, value) => {
53
+ const next = sanitizeTransitionValue(value);
54
+ if (next === value.trim())
55
+ return full;
56
+ return `${prop}: ${next}`;
57
+ });
58
+ }
59
+ const FORBIDDEN_DECL_RE = /\s*(?:box-shadow|background-position|background-color|background|color|border-color|filter|height|width|padding(?:-top|-bottom)?|margin(?:-top|-bottom)?|grid-template-rows|grid-template-columns)\s*:[^;{}]+;?/gi;
60
+ function sanitizeKeyframeBlock(block) {
61
+ return block.replace(/\{([^{}]*)\}/g, (_m, body) => {
62
+ const cleaned = body.replace(FORBIDDEN_DECL_RE, '');
63
+ return `{${cleaned}}`;
64
+ });
65
+ }
66
+ const KEYFRAMES_BLOCK_RE = /@keyframes\s+[\w-]+\s*\{([^}]*(\{[^}]*\}[^}]*)*)\}/gs;
67
+ function sanitizeKeyframesInCss(css) {
68
+ KEYFRAMES_BLOCK_RE.lastIndex = 0;
69
+ return css.replace(KEYFRAMES_BLOCK_RE, (block) => sanitizeKeyframeBlock(block));
70
+ }
71
+ function injectRmCss(html) {
72
+ if (/\.\brm\b/.test(html) && /\.rm\s*\*/.test(html))
73
+ return html;
74
+ const styleClose = html.lastIndexOf('</style>');
75
+ if (styleClose < 0)
76
+ return html;
77
+ return html.slice(0, styleClose) + RM_CSS + html.slice(styleClose);
78
+ }
79
+ function sanitizeHtmlMotion(html) {
80
+ const styleRe = /(<style[^>]*>)([\s\S]*?)(<\/style>)/gi;
81
+ let changed = false;
82
+ const out = html.replace(styleRe, (_full, open, css, close) => {
83
+ let next = sanitizeTransitionsInCss(css);
84
+ next = sanitizeKeyframesInCss(next);
85
+ if (next !== css)
86
+ changed = true;
87
+ return open + next + close;
88
+ });
89
+ const withRm = injectRmCss(out);
90
+ if (withRm !== out)
91
+ changed = true;
92
+ return { html: withRm, changed };
93
+ }
94
+ /** Apply deterministic motion + .rm CSS fixes to HTML targets from a verify report. */
95
+ export function applyMotionAutofix(projectRoot, report) {
96
+ const motionFails = report.results.filter((r) => !r.ok &&
97
+ r.file &&
98
+ (r.id === 'motion.keyframes' ||
99
+ r.id === 'motion.transitions' ||
100
+ r.id === 'css.dead-hook'));
101
+ if (motionFails.length === 0) {
102
+ return { applied: false, filesChanged: [], fixes: [] };
103
+ }
104
+ const targets = new Set();
105
+ for (const r of motionFails) {
106
+ if (r.file)
107
+ targets.add(r.file);
108
+ }
109
+ if (targets.size === 0)
110
+ targets.add('index.html');
111
+ const filesChanged = [];
112
+ const fixes = [];
113
+ const scanOpts = {
114
+ compositorOnly: DEFAULT_NFR_SPEC.animation?.compositorOnly ?? true,
115
+ forbidLayoutProps: DEFAULT_NFR_SPEC.animation?.forbidLayoutProps ?? true,
116
+ };
117
+ for (const rel of targets) {
118
+ const abs = join(projectRoot, rel);
119
+ let html;
120
+ try {
121
+ html = readFileSync(abs, 'utf8');
122
+ }
123
+ catch {
124
+ continue;
125
+ }
126
+ const beforeK = scanKeyframesViolations(html, scanOpts).length;
127
+ const beforeT = scanTransitionViolations(html, scanOpts).length;
128
+ const needsRm = motionFails.some((r) => r.id === 'css.dead-hook' && r.file === rel && r.evidence?.includes("'rm'"));
129
+ const { html: next, changed: motionChanged } = sanitizeHtmlMotion(html);
130
+ let final = next;
131
+ if (needsRm && !/\.\brm\s*\*/.test(final)) {
132
+ final = injectRmCss(final);
133
+ }
134
+ const afterK = scanKeyframesViolations(final, scanOpts).length;
135
+ const afterT = scanTransitionViolations(final, scanOpts).length;
136
+ if (final !== html || beforeK > afterK || beforeT > afterT) {
137
+ writeFileSync(abs, final, 'utf8');
138
+ filesChanged.push(rel);
139
+ if (beforeK > afterK)
140
+ fixes.push(`${rel}: sanitized ${beforeK - afterK} keyframe violation(s)`);
141
+ if (beforeT > afterT)
142
+ fixes.push(`${rel}: sanitized ${beforeT - afterT} transition violation(s)`);
143
+ if (needsRm && /\.\brm\s*\*/.test(final))
144
+ fixes.push(`${rel}: added .rm reduced-motion CSS`);
145
+ if (!fixes.some((f) => f.startsWith(rel)))
146
+ fixes.push(`${rel}: motion CSS sanitized`);
147
+ }
148
+ else if (motionChanged) {
149
+ writeFileSync(abs, final, 'utf8');
150
+ filesChanged.push(rel);
151
+ fixes.push(`${rel}: motion CSS sanitized`);
152
+ }
153
+ }
154
+ return {
155
+ applied: filesChanged.length > 0,
156
+ filesChanged,
157
+ fixes,
158
+ };
159
+ }
160
+ //# sourceMappingURL=motionAutofix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motionAutofix.js","sourceRoot":"","sources":["../../../src/council/verification/motionAutofix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Lightweight CSS motion scanner — @keyframes and transition declarations.
3
+ * No full CSS parser; conservative regex over `<style>` blocks and inline CSS.
4
+ */
5
+ /** Properties always treated as non-compositor. */
6
+ export declare const LAYOUT_MOTION_PROPS: Set<string>;
7
+ export declare const COMPOSITOR_ONLY_PROPS: Set<string>;
8
+ export interface CssMotionViolation {
9
+ kind: 'keyframes' | 'transition';
10
+ property: string;
11
+ line: number;
12
+ snippet: string;
13
+ }
14
+ export declare function scanKeyframesViolations(html: string, opts: {
15
+ compositorOnly: boolean;
16
+ forbidLayoutProps: boolean;
17
+ }): CssMotionViolation[];
18
+ export declare function scanTransitionViolations(html: string, opts: {
19
+ compositorOnly: boolean;
20
+ forbidLayoutProps: boolean;
21
+ }): CssMotionViolation[];
22
+ //# sourceMappingURL=parseCssMotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseCssMotion.d.ts","sourceRoot":"","sources":["../../../src/council/verification/parseCssMotion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,mDAAmD;AACnD,eAAO,MAAM,mBAAmB,aAM9B,CAAC;AAEH,eAAO,MAAM,qBAAqB,aAAoC,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAqCD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAA;CAAE,GAC5D,kBAAkB,EAAE,CA2BtB;AAgCD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAA;CAAE,GAC5D,kBAAkB,EAAE,CAoCtB"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Lightweight CSS motion scanner — @keyframes and transition declarations.
3
+ * No full CSS parser; conservative regex over `<style>` blocks and inline CSS.
4
+ */
5
+ const KEYFRAMES_BLOCK_RE = /@keyframes\s+[\w-]+\s*\{([^}]*(\{[^}]*\}[^}]*)*)\}/gs;
6
+ /** Properties always treated as non-compositor. */
7
+ export const LAYOUT_MOTION_PROPS = new Set([
8
+ 'width', 'height', 'top', 'left', 'right', 'bottom',
9
+ 'margin', 'margin-top', 'margin-bottom', 'padding', 'padding-top', 'padding-bottom',
10
+ 'grid-template-rows', 'grid-template-columns',
11
+ 'max-height', 'min-height', 'max-width', 'min-width',
12
+ 'border-width', 'gap', 'line-height', 'font-size',
13
+ ]);
14
+ export const COMPOSITOR_ONLY_PROPS = new Set(['transform', 'opacity']);
15
+ function lineNumberAt(content, index) {
16
+ return content.slice(0, index).split('\n').length;
17
+ }
18
+ function extractStyleBlocks(html) {
19
+ const blocks = [];
20
+ const re = /<style[^>]*>([\s\S]*?)<\/style>/gi;
21
+ let m;
22
+ while ((m = re.exec(html)) !== null) {
23
+ blocks.push(m[1] ?? '');
24
+ }
25
+ return blocks.join('\n');
26
+ }
27
+ /** Strip block/line comments so annotation text (e.g. `COMPLIANT:`) is not parsed as declarations. */
28
+ function stripCssComments(css) {
29
+ return css
30
+ .replace(/\/\*[\s\S]*?\*\//g, '')
31
+ .replace(/(^|[^:])\/\/[^\n]*/g, '$1');
32
+ }
33
+ function propertiesInKeyframeBlock(block) {
34
+ const props = new Set();
35
+ const declRe = /([a-z-]+)\s*:/gi;
36
+ const body = stripCssComments(block);
37
+ let m;
38
+ while ((m = declRe.exec(body)) !== null) {
39
+ const name = (m[1] ?? '').toLowerCase();
40
+ if (name !== 'from' && name !== 'to' && !name.endsWith('%')) {
41
+ props.add(name);
42
+ }
43
+ }
44
+ return [...props];
45
+ }
46
+ export function scanKeyframesViolations(html, opts) {
47
+ const css = extractStyleBlocks(html);
48
+ const violations = [];
49
+ let match;
50
+ KEYFRAMES_BLOCK_RE.lastIndex = 0;
51
+ while ((match = KEYFRAMES_BLOCK_RE.exec(css)) !== null) {
52
+ const block = match[0] ?? '';
53
+ const props = propertiesInKeyframeBlock(block);
54
+ for (const prop of props) {
55
+ if (opts.compositorOnly && !COMPOSITOR_ONLY_PROPS.has(prop)) {
56
+ violations.push({
57
+ kind: 'keyframes',
58
+ property: prop,
59
+ line: lineNumberAt(html, match.index),
60
+ snippet: block.slice(0, 120),
61
+ });
62
+ }
63
+ else if (opts.forbidLayoutProps && LAYOUT_MOTION_PROPS.has(prop)) {
64
+ violations.push({
65
+ kind: 'keyframes',
66
+ property: prop,
67
+ line: lineNumberAt(html, match.index),
68
+ snippet: block.slice(0, 120),
69
+ });
70
+ }
71
+ }
72
+ }
73
+ return violations;
74
+ }
75
+ /** Parse property names from a transition shorthand or transition-property value. */
76
+ function parseTransitionProperties(value) {
77
+ const trimmed = value.trim().replace(/!important/g, '');
78
+ if (!trimmed || trimmed === 'none' || trimmed === 'all') {
79
+ return trimmed === 'all' ? ['all'] : [];
80
+ }
81
+ // Shorthand: property tokens before first duration (number or var()
82
+ const parts = trimmed.split(',').map((p) => p.trim());
83
+ const props = [];
84
+ for (const part of parts) {
85
+ const tokens = part.split(/\s+/);
86
+ const propTokens = [];
87
+ for (const tok of tokens) {
88
+ if (/^[\d.]+m?s$/.test(tok) || tok.startsWith('cubic-bezier') || tok.startsWith('var(') ||
89
+ ['ease', 'ease-in', 'ease-out', 'ease-in-out', 'linear', 'step-start', 'step-end'].includes(tok)) {
90
+ break;
91
+ }
92
+ propTokens.push(tok.toLowerCase());
93
+ }
94
+ if (propTokens.length > 0) {
95
+ props.push(...propTokens);
96
+ }
97
+ else if (parts.length === 1) {
98
+ props.push(tokens[0]?.toLowerCase() ?? '');
99
+ }
100
+ }
101
+ return props.filter(Boolean);
102
+ }
103
+ const TRANSITION_DECL_RE = /(transition(?:-property)?)\s*:\s*([^;{}]+)/gi;
104
+ export function scanTransitionViolations(html, opts) {
105
+ const css = extractStyleBlocks(html);
106
+ const violations = [];
107
+ let match;
108
+ TRANSITION_DECL_RE.lastIndex = 0;
109
+ while ((match = TRANSITION_DECL_RE.exec(css)) !== null) {
110
+ const value = match[2] ?? '';
111
+ const props = parseTransitionProperties(value);
112
+ for (const prop of props) {
113
+ if (prop === 'all') {
114
+ violations.push({
115
+ kind: 'transition',
116
+ property: 'all',
117
+ line: lineNumberAt(html, match.index),
118
+ snippet: match[0].slice(0, 100),
119
+ });
120
+ continue;
121
+ }
122
+ if (opts.compositorOnly && !COMPOSITOR_ONLY_PROPS.has(prop)) {
123
+ violations.push({
124
+ kind: 'transition',
125
+ property: prop,
126
+ line: lineNumberAt(html, match.index),
127
+ snippet: match[0].slice(0, 100),
128
+ });
129
+ }
130
+ else if (opts.forbidLayoutProps && LAYOUT_MOTION_PROPS.has(prop)) {
131
+ violations.push({
132
+ kind: 'transition',
133
+ property: prop,
134
+ line: lineNumberAt(html, match.index),
135
+ snippet: match[0].slice(0, 100),
136
+ });
137
+ }
138
+ }
139
+ }
140
+ return violations;
141
+ }
142
+ //# sourceMappingURL=parseCssMotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseCssMotion.js","sourceRoot":"","sources":["../../../src/council/verification/parseCssMotion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { NfrSpec, RunVerificationInput, VerificationReport } from './types.js';
2
+ export declare const DEFAULT_NFR_SPEC: NfrSpec;
3
+ export declare function loadNfrSpec(zelariRoot: string): NfrSpec | null;
4
+ /**
5
+ * Run all deterministic implementation verification checks.
6
+ */
7
+ export declare function runImplementationVerification(input: RunVerificationInput): VerificationReport;
8
+ /** Persist verification report to `.zelari/verification-report.json`. */
9
+ export declare function writeVerificationReport(zelariRoot: string, report: VerificationReport): string;
10
+ //# sourceMappingURL=runChecks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runChecks.d.ts","sourceRoot":"","sources":["../../../src/council/verification/runChecks.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,OAAO,EACP,oBAAoB,EAEpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,gBAAgB,EAAE,OAY9B,CAAC;AAEF,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAU9D;AA6ID;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,oBAAoB,GAAG,kBAAkB,CA0F7F;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAI9F"}