@design-guard/core 0.3.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.
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/research/business-researcher.d.ts +42 -0
- package/dist/research/business-researcher.d.ts.map +1 -0
- package/dist/research/business-researcher.js +888 -0
- package/dist/research/business-researcher.js.map +1 -0
- package/dist/research/design-synthesizer.d.ts +47 -0
- package/dist/research/design-synthesizer.d.ts.map +1 -0
- package/dist/research/design-synthesizer.js +628 -0
- package/dist/research/design-synthesizer.js.map +1 -0
- package/dist/research/research-cache.d.ts +7 -0
- package/dist/research/research-cache.d.ts.map +1 -0
- package/dist/research/research-cache.js +62 -0
- package/dist/research/research-cache.js.map +1 -0
- package/dist/research/types.d.ts +99 -0
- package/dist/research/types.d.ts.map +1 -0
- package/dist/research/types.js +6 -0
- package/dist/research/types.js.map +1 -0
- package/dist/templates/design-md.d.ts +53 -0
- package/dist/templates/design-md.d.ts.map +1 -0
- package/dist/templates/design-md.js +315 -0
- package/dist/templates/design-md.js.map +1 -0
- package/dist/templates/prompts.d.ts +32 -0
- package/dist/templates/prompts.d.ts.map +1 -0
- package/dist/templates/prompts.js +39 -0
- package/dist/templates/prompts.js.map +1 -0
- package/dist/tokens/dtcg-converter.d.ts +62 -0
- package/dist/tokens/dtcg-converter.d.ts.map +1 -0
- package/dist/tokens/dtcg-converter.js +385 -0
- package/dist/tokens/dtcg-converter.js.map +1 -0
- package/dist/utils/prompt-enhancer.d.ts +22 -0
- package/dist/utils/prompt-enhancer.d.ts.map +1 -0
- package/dist/utils/prompt-enhancer.js +104 -0
- package/dist/utils/prompt-enhancer.js.map +1 -0
- package/dist/utils/validators.d.ts +126 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +110 -0
- package/dist/utils/validators.js.map +1 -0
- package/dist/validation/design-validator.d.ts +45 -0
- package/dist/validation/design-validator.d.ts.map +1 -0
- package/dist/validation/design-validator.js +396 -0
- package/dist/validation/design-validator.js.map +1 -0
- package/dist/validation/output-validator.d.ts +46 -0
- package/dist/validation/output-validator.d.ts.map +1 -0
- package/dist/validation/output-validator.js +146 -0
- package/dist/validation/output-validator.js.map +1 -0
- package/dist/validation/rules/alt-text.d.ts +8 -0
- package/dist/validation/rules/alt-text.d.ts.map +1 -0
- package/dist/validation/rules/alt-text.js +35 -0
- package/dist/validation/rules/alt-text.js.map +1 -0
- package/dist/validation/rules/business-alignment.d.ts +7 -0
- package/dist/validation/rules/business-alignment.d.ts.map +1 -0
- package/dist/validation/rules/business-alignment.js +98 -0
- package/dist/validation/rules/business-alignment.js.map +1 -0
- package/dist/validation/rules/color-adherence.d.ts +8 -0
- package/dist/validation/rules/color-adherence.d.ts.map +1 -0
- package/dist/validation/rules/color-adherence.js +92 -0
- package/dist/validation/rules/color-adherence.js.map +1 -0
- package/dist/validation/rules/empty-body.d.ts +6 -0
- package/dist/validation/rules/empty-body.d.ts.map +1 -0
- package/dist/validation/rules/empty-body.js +24 -0
- package/dist/validation/rules/empty-body.js.map +1 -0
- package/dist/validation/rules/heading-hierarchy.d.ts +8 -0
- package/dist/validation/rules/heading-hierarchy.d.ts.map +1 -0
- package/dist/validation/rules/heading-hierarchy.js +48 -0
- package/dist/validation/rules/heading-hierarchy.js.map +1 -0
- package/dist/validation/rules/index.d.ts +21 -0
- package/dist/validation/rules/index.d.ts.map +1 -0
- package/dist/validation/rules/index.js +66 -0
- package/dist/validation/rules/index.js.map +1 -0
- package/dist/validation/rules/no-centered-everything.d.ts +6 -0
- package/dist/validation/rules/no-centered-everything.d.ts.map +1 -0
- package/dist/validation/rules/no-centered-everything.js +59 -0
- package/dist/validation/rules/no-centered-everything.js.map +1 -0
- package/dist/validation/rules/no-default-fonts.d.ts +8 -0
- package/dist/validation/rules/no-default-fonts.d.ts.map +1 -0
- package/dist/validation/rules/no-default-fonts.js +111 -0
- package/dist/validation/rules/no-default-fonts.js.map +1 -0
- package/dist/validation/rules/no-div-soup.d.ts +6 -0
- package/dist/validation/rules/no-div-soup.d.ts.map +1 -0
- package/dist/validation/rules/no-div-soup.js +45 -0
- package/dist/validation/rules/no-div-soup.js.map +1 -0
- package/dist/validation/rules/no-duplicate-ctas.d.ts +6 -0
- package/dist/validation/rules/no-duplicate-ctas.d.ts.map +1 -0
- package/dist/validation/rules/no-duplicate-ctas.js +32 -0
- package/dist/validation/rules/no-duplicate-ctas.js.map +1 -0
- package/dist/validation/rules/no-generic-hero.d.ts +7 -0
- package/dist/validation/rules/no-generic-hero.d.ts.map +1 -0
- package/dist/validation/rules/no-generic-hero.js +46 -0
- package/dist/validation/rules/no-generic-hero.js.map +1 -0
- package/dist/validation/rules/no-icon-grid.d.ts +8 -0
- package/dist/validation/rules/no-icon-grid.d.ts.map +1 -0
- package/dist/validation/rules/no-icon-grid.js +43 -0
- package/dist/validation/rules/no-icon-grid.js.map +1 -0
- package/dist/validation/rules/no-lorem-ipsum.d.ts +6 -0
- package/dist/validation/rules/no-lorem-ipsum.d.ts.map +1 -0
- package/dist/validation/rules/no-lorem-ipsum.js +66 -0
- package/dist/validation/rules/no-lorem-ipsum.js.map +1 -0
- package/dist/validation/rules/no-missing-meta.d.ts +6 -0
- package/dist/validation/rules/no-missing-meta.d.ts.map +1 -0
- package/dist/validation/rules/no-missing-meta.js +49 -0
- package/dist/validation/rules/no-missing-meta.js.map +1 -0
- package/dist/validation/rules/no-missing-responsive.d.ts +6 -0
- package/dist/validation/rules/no-missing-responsive.d.ts.map +1 -0
- package/dist/validation/rules/no-missing-responsive.js +30 -0
- package/dist/validation/rules/no-missing-responsive.js.map +1 -0
- package/dist/validation/rules/no-placeholder-images.d.ts +6 -0
- package/dist/validation/rules/no-placeholder-images.d.ts.map +1 -0
- package/dist/validation/rules/no-placeholder-images.js +73 -0
- package/dist/validation/rules/no-placeholder-images.js.map +1 -0
- package/dist/validation/rules/no-saas-speak.d.ts +6 -0
- package/dist/validation/rules/no-saas-speak.d.ts.map +1 -0
- package/dist/validation/rules/no-saas-speak.js +74 -0
- package/dist/validation/rules/no-saas-speak.js.map +1 -0
- package/dist/validation/rules/no-slop-gradients.d.ts +6 -0
- package/dist/validation/rules/no-slop-gradients.d.ts.map +1 -0
- package/dist/validation/rules/no-slop-gradients.js +24 -0
- package/dist/validation/rules/no-slop-gradients.js.map +1 -0
- package/dist/validation/rules/no-uniform-spacing.d.ts +6 -0
- package/dist/validation/rules/no-uniform-spacing.d.ts.map +1 -0
- package/dist/validation/rules/no-uniform-spacing.js +64 -0
- package/dist/validation/rules/no-uniform-spacing.js.map +1 -0
- package/dist/validation/rules/types.d.ts +36 -0
- package/dist/validation/rules/types.d.ts.map +1 -0
- package/dist/validation/rules/types.js +7 -0
- package/dist/validation/rules/types.js.map +1 -0
- package/dist/validation/tailwind-parser.d.ts +36 -0
- package/dist/validation/tailwind-parser.d.ts.map +1 -0
- package/dist/validation/tailwind-parser.js +214 -0
- package/dist/validation/tailwind-parser.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ColorRoleSchema: z.ZodObject<{
|
|
3
|
+
name: z.ZodString;
|
|
4
|
+
hex: z.ZodString;
|
|
5
|
+
usage: z.ZodString;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
hex: string;
|
|
8
|
+
name: string;
|
|
9
|
+
usage: string;
|
|
10
|
+
}, {
|
|
11
|
+
hex: string;
|
|
12
|
+
name: string;
|
|
13
|
+
usage: string;
|
|
14
|
+
}>;
|
|
15
|
+
export declare const DesignMdSchema: z.ZodObject<{
|
|
16
|
+
visualTheme: z.ZodString;
|
|
17
|
+
colorPalette: z.ZodArray<z.ZodObject<{
|
|
18
|
+
name: z.ZodString;
|
|
19
|
+
hex: z.ZodString;
|
|
20
|
+
usage: z.ZodString;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
hex: string;
|
|
23
|
+
name: string;
|
|
24
|
+
usage: string;
|
|
25
|
+
}, {
|
|
26
|
+
hex: string;
|
|
27
|
+
name: string;
|
|
28
|
+
usage: string;
|
|
29
|
+
}>, "many">;
|
|
30
|
+
typography: z.ZodObject<{
|
|
31
|
+
heading: z.ZodString;
|
|
32
|
+
body: z.ZodString;
|
|
33
|
+
sizes: z.ZodRecord<z.ZodString, z.ZodString>;
|
|
34
|
+
}, "strip", z.ZodTypeAny, {
|
|
35
|
+
body: string;
|
|
36
|
+
heading: string;
|
|
37
|
+
sizes: Record<string, string>;
|
|
38
|
+
}, {
|
|
39
|
+
body: string;
|
|
40
|
+
heading: string;
|
|
41
|
+
sizes: Record<string, string>;
|
|
42
|
+
}>;
|
|
43
|
+
spacing: z.ZodObject<{
|
|
44
|
+
baseUnit: z.ZodString;
|
|
45
|
+
scale: z.ZodArray<z.ZodString, "many">;
|
|
46
|
+
}, "strip", z.ZodTypeAny, {
|
|
47
|
+
baseUnit: string;
|
|
48
|
+
scale: string[];
|
|
49
|
+
}, {
|
|
50
|
+
baseUnit: string;
|
|
51
|
+
scale: string[];
|
|
52
|
+
}>;
|
|
53
|
+
componentPatterns: z.ZodArray<z.ZodObject<{
|
|
54
|
+
name: z.ZodString;
|
|
55
|
+
description: z.ZodString;
|
|
56
|
+
}, "strip", z.ZodTypeAny, {
|
|
57
|
+
name: string;
|
|
58
|
+
description: string;
|
|
59
|
+
}, {
|
|
60
|
+
name: string;
|
|
61
|
+
description: string;
|
|
62
|
+
}>, "many">;
|
|
63
|
+
iconography: z.ZodString;
|
|
64
|
+
imagery: z.ZodString;
|
|
65
|
+
dos: z.ZodArray<z.ZodString, "many">;
|
|
66
|
+
donts: z.ZodArray<z.ZodString, "many">;
|
|
67
|
+
}, "strip", z.ZodTypeAny, {
|
|
68
|
+
typography: {
|
|
69
|
+
body: string;
|
|
70
|
+
heading: string;
|
|
71
|
+
sizes: Record<string, string>;
|
|
72
|
+
};
|
|
73
|
+
dos: string[];
|
|
74
|
+
donts: string[];
|
|
75
|
+
visualTheme: string;
|
|
76
|
+
colorPalette: {
|
|
77
|
+
hex: string;
|
|
78
|
+
name: string;
|
|
79
|
+
usage: string;
|
|
80
|
+
}[];
|
|
81
|
+
spacing: {
|
|
82
|
+
baseUnit: string;
|
|
83
|
+
scale: string[];
|
|
84
|
+
};
|
|
85
|
+
componentPatterns: {
|
|
86
|
+
name: string;
|
|
87
|
+
description: string;
|
|
88
|
+
}[];
|
|
89
|
+
iconography: string;
|
|
90
|
+
imagery: string;
|
|
91
|
+
}, {
|
|
92
|
+
typography: {
|
|
93
|
+
body: string;
|
|
94
|
+
heading: string;
|
|
95
|
+
sizes: Record<string, string>;
|
|
96
|
+
};
|
|
97
|
+
dos: string[];
|
|
98
|
+
donts: string[];
|
|
99
|
+
visualTheme: string;
|
|
100
|
+
colorPalette: {
|
|
101
|
+
hex: string;
|
|
102
|
+
name: string;
|
|
103
|
+
usage: string;
|
|
104
|
+
}[];
|
|
105
|
+
spacing: {
|
|
106
|
+
baseUnit: string;
|
|
107
|
+
scale: string[];
|
|
108
|
+
};
|
|
109
|
+
componentPatterns: {
|
|
110
|
+
name: string;
|
|
111
|
+
description: string;
|
|
112
|
+
}[];
|
|
113
|
+
iconography: string;
|
|
114
|
+
imagery: string;
|
|
115
|
+
}>;
|
|
116
|
+
export declare const PROMPT_MAX_CHARS = 5000;
|
|
117
|
+
export declare function validatePrompt(prompt: string): {
|
|
118
|
+
valid: boolean;
|
|
119
|
+
errors: string[];
|
|
120
|
+
};
|
|
121
|
+
export declare function validateQuota(used: number, limit: number): {
|
|
122
|
+
allowed: boolean;
|
|
123
|
+
remaining: number;
|
|
124
|
+
};
|
|
125
|
+
export type DesignMd = z.infer<typeof DesignMdSchema>;
|
|
126
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,eAAe;;;;;;;;;;;;EAI1B,CAAC;AAGH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBzB,CAAC;AAGH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA+CnF;AAuCD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAGlG;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// Hex color validation
|
|
3
|
+
const hexColor = z.string().regex(/^#[0-9A-Fa-f]{6}$/, 'Must be a 6-digit hex color');
|
|
4
|
+
// DESIGN.md color role schema
|
|
5
|
+
export const ColorRoleSchema = z.object({
|
|
6
|
+
name: z.string().min(1),
|
|
7
|
+
hex: hexColor,
|
|
8
|
+
usage: z.string().min(1),
|
|
9
|
+
});
|
|
10
|
+
// DESIGN.md validation schema
|
|
11
|
+
export const DesignMdSchema = z.object({
|
|
12
|
+
visualTheme: z.string().min(20, 'Visual theme must be at least 20 characters'),
|
|
13
|
+
colorPalette: z.array(ColorRoleSchema).min(5, 'Need at least 5 color roles'),
|
|
14
|
+
typography: z.object({
|
|
15
|
+
heading: z.string().min(1),
|
|
16
|
+
body: z.string().min(1),
|
|
17
|
+
sizes: z.record(z.string()),
|
|
18
|
+
}),
|
|
19
|
+
spacing: z.object({
|
|
20
|
+
baseUnit: z.string().regex(/^\d+(px|rem)$/, 'Must be px or rem value'),
|
|
21
|
+
scale: z.array(z.string()).min(3),
|
|
22
|
+
}),
|
|
23
|
+
componentPatterns: z.array(z.object({
|
|
24
|
+
name: z.string(),
|
|
25
|
+
description: z.string(),
|
|
26
|
+
})).min(3, 'Need at least 3 component patterns'),
|
|
27
|
+
iconography: z.string().min(10),
|
|
28
|
+
imagery: z.string().min(10),
|
|
29
|
+
dos: z.array(z.string()).min(3, 'Need at least 3 Do rules'),
|
|
30
|
+
donts: z.array(z.string()).min(3, 'Need at least 3 Don\'t rules'),
|
|
31
|
+
});
|
|
32
|
+
// Prompt validation
|
|
33
|
+
export const PROMPT_MAX_CHARS = 5000;
|
|
34
|
+
export function validatePrompt(prompt) {
|
|
35
|
+
const errors = [];
|
|
36
|
+
// Reject empty or whitespace-only prompts
|
|
37
|
+
if (!prompt.trim()) {
|
|
38
|
+
errors.push('Prompt is empty. Describe the screen you want to generate.');
|
|
39
|
+
return { valid: false, errors };
|
|
40
|
+
}
|
|
41
|
+
if (prompt.length > PROMPT_MAX_CHARS) {
|
|
42
|
+
errors.push(`Prompt is ${prompt.length} chars, max is ${PROMPT_MAX_CHARS}. ` +
|
|
43
|
+
`Try splitting into an initial prompt (describe the page) and refinement prompts (adjust specific sections).`);
|
|
44
|
+
}
|
|
45
|
+
// Detect multiple screens
|
|
46
|
+
const multiScreenPatterns = [
|
|
47
|
+
/\band\s+a\s+\w+\s+page\b/i,
|
|
48
|
+
/\bpage\s*1\b.*\bpage\s*2\b/is,
|
|
49
|
+
/\bfirst screen\b.*\bsecond screen\b/is,
|
|
50
|
+
/\b(create|build|generate|make|design)\s+.*(,\s*\w+\s+page\s*){2,}/i,
|
|
51
|
+
/\b(landing|home|pricing|about|contact|dashboard|login|signup)\s+page\b.*\b(landing|home|pricing|about|contact|dashboard|login|signup)\s+page\b/is,
|
|
52
|
+
/\bmultiple\s+(pages?|screens?)\b/i,
|
|
53
|
+
/\b(two|three|four|five|2|3|4|5)\s+(pages?|screens?)\b/i,
|
|
54
|
+
/\bpage\s+for\s+\w+\b.*\band\b.*\bpage\s+for\s+\w+\b/is,
|
|
55
|
+
];
|
|
56
|
+
for (const pattern of multiScreenPatterns) {
|
|
57
|
+
if (pattern.test(prompt)) {
|
|
58
|
+
errors.push('Detected multiple screens in one prompt. Generate one screen at a time — ' +
|
|
59
|
+
'run `dg generate` once per page for best results.');
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Detect vague refinements — use word-level scoring instead of exact match
|
|
64
|
+
if (isVaguePrompt(prompt.trim())) {
|
|
65
|
+
errors.push('Prompt is too vague. Be specific about what to change. For example:\n' +
|
|
66
|
+
' Instead of "make it better" try:\n' +
|
|
67
|
+
' "On the hero section, increase the heading size to 4rem and change the CTA button color to #F5A623"');
|
|
68
|
+
}
|
|
69
|
+
return { valid: errors.length === 0, errors };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Detect vague prompts using word-level analysis instead of fragile regex.
|
|
73
|
+
* A prompt is vague if it's short AND contains only vague verbs/adjectives
|
|
74
|
+
* without any concrete UI terms (hex values, measurements, component names).
|
|
75
|
+
*/
|
|
76
|
+
function isVaguePrompt(prompt) {
|
|
77
|
+
// Short prompts with vague intent
|
|
78
|
+
const words = prompt.toLowerCase().replace(/[^\w\s]/g, '').split(/\s+/);
|
|
79
|
+
if (words.length > 20)
|
|
80
|
+
return false; // Long prompts are likely specific enough
|
|
81
|
+
const vagueVerbs = ['make', 'get', 'fix', 'improve', 'enhance', 'update', 'change', 'tweak', 'do'];
|
|
82
|
+
const vagueAdj = ['better', 'nicer', 'good', 'pretty', 'nice', 'cool', 'bad', 'ugly', 'wrong', 'off', 'weird', 'professional', 'appealing'];
|
|
83
|
+
const vagueObjects = ['it', 'this', 'that', 'the design', 'the page', 'the layout', 'the look'];
|
|
84
|
+
const fillerWords = ['just', 'please', 'can', 'you', 'a', 'bit', 'more', 'something', 'about', 'looks', 'look'];
|
|
85
|
+
// Concrete signals that indicate specificity
|
|
86
|
+
const hasHexColor = /#[0-9a-f]{3,6}/i.test(prompt);
|
|
87
|
+
const hasMeasurement = /\d+\s*(px|rem|em|%|vh|vw)\b/.test(prompt);
|
|
88
|
+
const hasComponent = /\b(hero|header|footer|nav|sidebar|card|button|input|form|grid|section|modal|carousel|accordion|tab|table|banner|cta)\b/i.test(prompt);
|
|
89
|
+
const hasSpecificAction = /\b(color|font|size|width|height|padding|margin|spacing|border|radius|shadow|background|align|position)\b/i.test(prompt);
|
|
90
|
+
if (hasHexColor || hasMeasurement || hasComponent || hasSpecificAction)
|
|
91
|
+
return false;
|
|
92
|
+
const hasVagueVerb = words.some(w => vagueVerbs.includes(w));
|
|
93
|
+
const hasVagueAdj = words.some(w => vagueAdj.includes(w));
|
|
94
|
+
const meaningfulWords = words.filter(w => !fillerWords.includes(w) && w.length > 1);
|
|
95
|
+
// If the meaningful content is just a vague verb + vague adjective/object, it's vague
|
|
96
|
+
if (meaningfulWords.length <= 6 && hasVagueVerb && hasVagueAdj)
|
|
97
|
+
return true;
|
|
98
|
+
if (meaningfulWords.length <= 4 && hasVagueVerb)
|
|
99
|
+
return true;
|
|
100
|
+
// Complaints without direction: "it looks bad", "this is ugly"
|
|
101
|
+
if (meaningfulWords.length <= 3 && hasVagueAdj)
|
|
102
|
+
return true;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
// Validate quota
|
|
106
|
+
export function validateQuota(used, limit) {
|
|
107
|
+
const remaining = limit - used;
|
|
108
|
+
return { allowed: remaining > 0, remaining };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/utils/validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design Quality Validator for DESIGN.md files.
|
|
3
|
+
*
|
|
4
|
+
* Scores a DESIGN.md across four dimensions — specificity, differentiation,
|
|
5
|
+
* completeness, and actionability — and surfaces concrete issues.
|
|
6
|
+
*/
|
|
7
|
+
import type { BusinessResearchResult, CompetitorAnalysis, DesignQualityIssue, DesignQualityScore } from '../research/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Euclidean distance between two hex colors in RGB space.
|
|
10
|
+
* Threshold for "too similar": distance < 50.
|
|
11
|
+
*/
|
|
12
|
+
export declare function hexDistance(a: string, b: string): number;
|
|
13
|
+
/**
|
|
14
|
+
* Scores how specific and concrete the DESIGN.md is (0-25).
|
|
15
|
+
* Penalizes placeholders, generic adjectives, missing hex values, etc.
|
|
16
|
+
*/
|
|
17
|
+
export declare function scoreSpecificity(markdown: string): number;
|
|
18
|
+
/**
|
|
19
|
+
* Scores how differentiated the design is from competitors (0-25).
|
|
20
|
+
* Without competitor data, caps at 15 (cannot assess differentiation).
|
|
21
|
+
*/
|
|
22
|
+
export declare function scoreDifferentiation(markdown: string, competitors?: CompetitorAnalysis[]): number;
|
|
23
|
+
/**
|
|
24
|
+
* Scores structural completeness of the DESIGN.md (0-25).
|
|
25
|
+
* Checks for all 8 sections, color count, component patterns, do/don't counts.
|
|
26
|
+
*/
|
|
27
|
+
export declare function scoreCompleteness(markdown: string): number;
|
|
28
|
+
/**
|
|
29
|
+
* Scores how actionable and implementation-ready the rules are (0-25).
|
|
30
|
+
* Penalizes vague language, color words without hex, non-numeric sizes.
|
|
31
|
+
*/
|
|
32
|
+
export declare function scoreActionability(markdown: string): number;
|
|
33
|
+
/**
|
|
34
|
+
* Checks for cultural alignment issues in the DESIGN.md.
|
|
35
|
+
*/
|
|
36
|
+
export declare function checkCulturalAlignment(markdown: string, locale?: string, audience?: string): DesignQualityIssue[];
|
|
37
|
+
/**
|
|
38
|
+
* Orchestrates all sub-scorers and returns a complete quality score.
|
|
39
|
+
*/
|
|
40
|
+
export declare function scoreDesignMd(markdown: string, research?: BusinessResearchResult): DesignQualityScore;
|
|
41
|
+
/**
|
|
42
|
+
* Formats a DesignQualityScore into a human-readable report.
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatDesignQualityReport(score: DesignQualityScore): string;
|
|
45
|
+
//# sourceMappingURL=design-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"design-validator.d.ts","sourceRoot":"","sources":["../../src/validation/design-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAY9B;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxD;AAgDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAsDzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,kBAAkB,EAAE,GACjC,MAAM,CAiER;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuC1D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuD3D;AAID;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,kBAAkB,EAAE,CAuCtB;AAID;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,sBAAsB,GAChC,kBAAkB,CAoFpB;AAID;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,kBAAkB,GACxB,MAAM,CA6BR"}
|