stylemcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -0
- package/action/action.yml +59 -0
- package/action/package.json +24 -0
- package/action/src/index.ts +455 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +335 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/rewriter/index.d.ts +45 -0
- package/dist/rewriter/index.d.ts.map +1 -0
- package/dist/rewriter/index.js +163 -0
- package/dist/rewriter/index.js.map +1 -0
- package/dist/schema/copy-patterns.d.ts +298 -0
- package/dist/schema/copy-patterns.d.ts.map +1 -0
- package/dist/schema/copy-patterns.js +53 -0
- package/dist/schema/copy-patterns.js.map +1 -0
- package/dist/schema/cta-rules.d.ts +274 -0
- package/dist/schema/cta-rules.d.ts.map +1 -0
- package/dist/schema/cta-rules.js +45 -0
- package/dist/schema/cta-rules.js.map +1 -0
- package/dist/schema/index.d.ts +2172 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +92 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/tests.d.ts +274 -0
- package/dist/schema/tests.d.ts.map +1 -0
- package/dist/schema/tests.js +37 -0
- package/dist/schema/tests.js.map +1 -0
- package/dist/schema/tokens.d.ts +632 -0
- package/dist/schema/tokens.d.ts.map +1 -0
- package/dist/schema/tokens.js +68 -0
- package/dist/schema/tokens.js.map +1 -0
- package/dist/schema/voice.d.ts +280 -0
- package/dist/schema/voice.d.ts.map +1 -0
- package/dist/schema/voice.js +52 -0
- package/dist/schema/voice.js.map +1 -0
- package/dist/server/billing.d.ts +53 -0
- package/dist/server/billing.d.ts.map +1 -0
- package/dist/server/billing.js +216 -0
- package/dist/server/billing.js.map +1 -0
- package/dist/server/http.d.ts +5 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +470 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +480 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware/auth.d.ts +15 -0
- package/dist/server/middleware/auth.d.ts.map +1 -0
- package/dist/server/middleware/auth.js +83 -0
- package/dist/server/middleware/auth.js.map +1 -0
- package/dist/utils/pack-loader.d.ts +13 -0
- package/dist/utils/pack-loader.d.ts.map +1 -0
- package/dist/utils/pack-loader.js +98 -0
- package/dist/utils/pack-loader.js.map +1 -0
- package/dist/validator/index.d.ts +21 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +60 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/rules/constraints.d.ts +8 -0
- package/dist/validator/rules/constraints.d.ts.map +1 -0
- package/dist/validator/rules/constraints.js +150 -0
- package/dist/validator/rules/constraints.js.map +1 -0
- package/dist/validator/rules/cta.d.ts +11 -0
- package/dist/validator/rules/cta.d.ts.map +1 -0
- package/dist/validator/rules/cta.js +113 -0
- package/dist/validator/rules/cta.js.map +1 -0
- package/dist/validator/rules/voice.d.ts +6 -0
- package/dist/validator/rules/voice.d.ts.map +1 -0
- package/dist/validator/rules/voice.js +106 -0
- package/dist/validator/rules/voice.js.map +1 -0
- package/package.json +61 -0
- package/packs/saas/copy_patterns.yaml +423 -0
- package/packs/saas/cta_rules.yaml +362 -0
- package/packs/saas/manifest.yaml +16 -0
- package/packs/saas/tests.yaml +305 -0
- package/packs/saas/tokens.json +226 -0
- package/packs/saas/voice.yaml +232 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0",
|
|
3
|
+
"name": "SaaS Design Tokens",
|
|
4
|
+
"description": "A neutral, professional design token set for B2B SaaS products",
|
|
5
|
+
|
|
6
|
+
"colors": {
|
|
7
|
+
"primary": {
|
|
8
|
+
"50": { "value": "#eff6ff", "description": "Lightest primary, backgrounds" },
|
|
9
|
+
"100": { "value": "#dbeafe", "description": "Light primary, hover states" },
|
|
10
|
+
"200": { "value": "#bfdbfe", "description": "Light primary" },
|
|
11
|
+
"300": { "value": "#93c5fd", "description": "Medium-light primary" },
|
|
12
|
+
"400": { "value": "#60a5fa", "description": "Medium primary" },
|
|
13
|
+
"500": { "value": "#3b82f6", "description": "Base primary, buttons" },
|
|
14
|
+
"600": { "value": "#2563eb", "description": "Dark primary, pressed states" },
|
|
15
|
+
"700": { "value": "#1d4ed8", "description": "Darker primary" },
|
|
16
|
+
"800": { "value": "#1e40af", "description": "Very dark primary" },
|
|
17
|
+
"900": { "value": "#1e3a8a", "description": "Darkest primary" }
|
|
18
|
+
},
|
|
19
|
+
"neutral": {
|
|
20
|
+
"50": { "value": "#f9fafb", "description": "Page background" },
|
|
21
|
+
"100": { "value": "#f3f4f6", "description": "Card background, subtle" },
|
|
22
|
+
"200": { "value": "#e5e7eb", "description": "Borders, dividers" },
|
|
23
|
+
"300": { "value": "#d1d5db", "description": "Disabled state" },
|
|
24
|
+
"400": { "value": "#9ca3af", "description": "Placeholder text" },
|
|
25
|
+
"500": { "value": "#6b7280", "description": "Secondary text" },
|
|
26
|
+
"600": { "value": "#4b5563", "description": "Body text" },
|
|
27
|
+
"700": { "value": "#374151", "description": "Dark text" },
|
|
28
|
+
"800": { "value": "#1f2937", "description": "Headings" },
|
|
29
|
+
"900": { "value": "#111827", "description": "Darkest text" }
|
|
30
|
+
},
|
|
31
|
+
"semantic": {
|
|
32
|
+
"success": {
|
|
33
|
+
"light": { "value": "#d1fae5", "description": "Success background" },
|
|
34
|
+
"default": { "value": "#10b981", "description": "Success primary" },
|
|
35
|
+
"dark": { "value": "#047857", "description": "Success text on light" }
|
|
36
|
+
},
|
|
37
|
+
"warning": {
|
|
38
|
+
"light": { "value": "#fef3c7", "description": "Warning background" },
|
|
39
|
+
"default": { "value": "#f59e0b", "description": "Warning primary" },
|
|
40
|
+
"dark": { "value": "#b45309", "description": "Warning text on light" }
|
|
41
|
+
},
|
|
42
|
+
"error": {
|
|
43
|
+
"light": { "value": "#fee2e2", "description": "Error background" },
|
|
44
|
+
"default": { "value": "#ef4444", "description": "Error primary" },
|
|
45
|
+
"dark": { "value": "#b91c1c", "description": "Error text on light" }
|
|
46
|
+
},
|
|
47
|
+
"info": {
|
|
48
|
+
"light": { "value": "#dbeafe", "description": "Info background" },
|
|
49
|
+
"default": { "value": "#3b82f6", "description": "Info primary" },
|
|
50
|
+
"dark": { "value": "#1d4ed8", "description": "Info text on light" }
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"background": {
|
|
54
|
+
"primary": { "value": "#ffffff", "description": "Main background" },
|
|
55
|
+
"secondary": { "value": "#f9fafb", "description": "Secondary/subtle background" },
|
|
56
|
+
"tertiary": { "value": "#f3f4f6", "description": "Card background" }
|
|
57
|
+
},
|
|
58
|
+
"text": {
|
|
59
|
+
"primary": { "value": "#111827", "description": "Main text, headings" },
|
|
60
|
+
"secondary": { "value": "#6b7280", "description": "Secondary text, captions" },
|
|
61
|
+
"tertiary": { "value": "#9ca3af", "description": "Placeholder, disabled" },
|
|
62
|
+
"inverse": { "value": "#ffffff", "description": "Text on dark backgrounds" }
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
"typography": {
|
|
67
|
+
"fontFamilies": {
|
|
68
|
+
"sans": "Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
|
|
69
|
+
"mono": "JetBrains Mono, Menlo, Monaco, 'Courier New', monospace"
|
|
70
|
+
},
|
|
71
|
+
"fontWeights": {
|
|
72
|
+
"regular": 400,
|
|
73
|
+
"medium": 500,
|
|
74
|
+
"semibold": 600,
|
|
75
|
+
"bold": 700
|
|
76
|
+
},
|
|
77
|
+
"fontSizes": {
|
|
78
|
+
"xs": "0.75rem",
|
|
79
|
+
"sm": "0.875rem",
|
|
80
|
+
"base": "1rem",
|
|
81
|
+
"lg": "1.125rem",
|
|
82
|
+
"xl": "1.25rem",
|
|
83
|
+
"2xl": "1.5rem",
|
|
84
|
+
"3xl": "1.875rem",
|
|
85
|
+
"4xl": "2.25rem"
|
|
86
|
+
},
|
|
87
|
+
"lineHeights": {
|
|
88
|
+
"tight": 1.25,
|
|
89
|
+
"snug": 1.375,
|
|
90
|
+
"normal": 1.5,
|
|
91
|
+
"relaxed": 1.625
|
|
92
|
+
},
|
|
93
|
+
"styles": {
|
|
94
|
+
"h1": {
|
|
95
|
+
"fontFamily": "Inter, sans-serif",
|
|
96
|
+
"fontSize": "2.25rem",
|
|
97
|
+
"fontWeight": 700,
|
|
98
|
+
"lineHeight": 1.25,
|
|
99
|
+
"letterSpacing": "-0.025em"
|
|
100
|
+
},
|
|
101
|
+
"h2": {
|
|
102
|
+
"fontFamily": "Inter, sans-serif",
|
|
103
|
+
"fontSize": "1.875rem",
|
|
104
|
+
"fontWeight": 600,
|
|
105
|
+
"lineHeight": 1.25,
|
|
106
|
+
"letterSpacing": "-0.025em"
|
|
107
|
+
},
|
|
108
|
+
"h3": {
|
|
109
|
+
"fontFamily": "Inter, sans-serif",
|
|
110
|
+
"fontSize": "1.5rem",
|
|
111
|
+
"fontWeight": 600,
|
|
112
|
+
"lineHeight": 1.375
|
|
113
|
+
},
|
|
114
|
+
"h4": {
|
|
115
|
+
"fontFamily": "Inter, sans-serif",
|
|
116
|
+
"fontSize": "1.25rem",
|
|
117
|
+
"fontWeight": 600,
|
|
118
|
+
"lineHeight": 1.375
|
|
119
|
+
},
|
|
120
|
+
"body": {
|
|
121
|
+
"fontFamily": "Inter, sans-serif",
|
|
122
|
+
"fontSize": "1rem",
|
|
123
|
+
"fontWeight": 400,
|
|
124
|
+
"lineHeight": 1.5
|
|
125
|
+
},
|
|
126
|
+
"bodySmall": {
|
|
127
|
+
"fontFamily": "Inter, sans-serif",
|
|
128
|
+
"fontSize": "0.875rem",
|
|
129
|
+
"fontWeight": 400,
|
|
130
|
+
"lineHeight": 1.5
|
|
131
|
+
},
|
|
132
|
+
"caption": {
|
|
133
|
+
"fontFamily": "Inter, sans-serif",
|
|
134
|
+
"fontSize": "0.75rem",
|
|
135
|
+
"fontWeight": 400,
|
|
136
|
+
"lineHeight": 1.5
|
|
137
|
+
},
|
|
138
|
+
"label": {
|
|
139
|
+
"fontFamily": "Inter, sans-serif",
|
|
140
|
+
"fontSize": "0.875rem",
|
|
141
|
+
"fontWeight": 500,
|
|
142
|
+
"lineHeight": 1.25
|
|
143
|
+
},
|
|
144
|
+
"button": {
|
|
145
|
+
"fontFamily": "Inter, sans-serif",
|
|
146
|
+
"fontSize": "0.875rem",
|
|
147
|
+
"fontWeight": 500,
|
|
148
|
+
"lineHeight": 1.25
|
|
149
|
+
},
|
|
150
|
+
"code": {
|
|
151
|
+
"fontFamily": "JetBrains Mono, monospace",
|
|
152
|
+
"fontSize": "0.875rem",
|
|
153
|
+
"fontWeight": 400,
|
|
154
|
+
"lineHeight": 1.5
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
"spacing": {
|
|
160
|
+
"0": { "value": "0", "description": "No spacing" },
|
|
161
|
+
"1": { "value": "0.25rem", "description": "4px" },
|
|
162
|
+
"2": { "value": "0.5rem", "description": "8px" },
|
|
163
|
+
"3": { "value": "0.75rem", "description": "12px" },
|
|
164
|
+
"4": { "value": "1rem", "description": "16px - base unit" },
|
|
165
|
+
"5": { "value": "1.25rem", "description": "20px" },
|
|
166
|
+
"6": { "value": "1.5rem", "description": "24px" },
|
|
167
|
+
"8": { "value": "2rem", "description": "32px" },
|
|
168
|
+
"10": { "value": "2.5rem", "description": "40px" },
|
|
169
|
+
"12": { "value": "3rem", "description": "48px" },
|
|
170
|
+
"16": { "value": "4rem", "description": "64px" },
|
|
171
|
+
"20": { "value": "5rem", "description": "80px" },
|
|
172
|
+
"24": { "value": "6rem", "description": "96px" }
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
"borderRadius": {
|
|
176
|
+
"none": { "value": "0", "description": "No radius" },
|
|
177
|
+
"sm": { "value": "0.125rem", "description": "2px - subtle" },
|
|
178
|
+
"default": { "value": "0.375rem", "description": "6px - default for buttons, inputs" },
|
|
179
|
+
"md": { "value": "0.5rem", "description": "8px - cards" },
|
|
180
|
+
"lg": { "value": "0.75rem", "description": "12px - modals" },
|
|
181
|
+
"xl": { "value": "1rem", "description": "16px - large cards" },
|
|
182
|
+
"full": { "value": "9999px", "description": "Fully rounded (pills, avatars)" }
|
|
183
|
+
},
|
|
184
|
+
|
|
185
|
+
"shadows": {
|
|
186
|
+
"sm": { "value": "0 1px 2px 0 rgb(0 0 0 / 0.05)", "description": "Subtle shadow" },
|
|
187
|
+
"default": { "value": "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", "description": "Default shadow" },
|
|
188
|
+
"md": { "value": "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)", "description": "Medium shadow" },
|
|
189
|
+
"lg": { "value": "0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)", "description": "Large shadow" },
|
|
190
|
+
"xl": { "value": "0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)", "description": "Extra large shadow" }
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
"breakpoints": {
|
|
194
|
+
"sm": { "value": "640px", "description": "Small devices" },
|
|
195
|
+
"md": { "value": "768px", "description": "Medium devices (tablets)" },
|
|
196
|
+
"lg": { "value": "1024px", "description": "Large devices (laptops)" },
|
|
197
|
+
"xl": { "value": "1280px", "description": "Extra large devices" },
|
|
198
|
+
"2xl": { "value": "1536px", "description": "2XL devices" }
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
"zIndex": {
|
|
202
|
+
"dropdown": 1000,
|
|
203
|
+
"sticky": 1020,
|
|
204
|
+
"fixed": 1030,
|
|
205
|
+
"modalBackdrop": 1040,
|
|
206
|
+
"modal": 1050,
|
|
207
|
+
"popover": 1060,
|
|
208
|
+
"tooltip": 1070,
|
|
209
|
+
"toast": 1080
|
|
210
|
+
},
|
|
211
|
+
|
|
212
|
+
"transitions": {
|
|
213
|
+
"duration": {
|
|
214
|
+
"fast": "75ms",
|
|
215
|
+
"normal": "150ms",
|
|
216
|
+
"slow": "300ms",
|
|
217
|
+
"slower": "500ms"
|
|
218
|
+
},
|
|
219
|
+
"easing": {
|
|
220
|
+
"linear": "linear",
|
|
221
|
+
"in": "cubic-bezier(0.4, 0, 1, 1)",
|
|
222
|
+
"out": "cubic-bezier(0, 0, 0.2, 1)",
|
|
223
|
+
"inOut": "cubic-bezier(0.4, 0, 0.2, 1)"
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
name: "SaaS Professional"
|
|
3
|
+
description: "Clear, confident, and helpful. We're experts who make complex things simple."
|
|
4
|
+
|
|
5
|
+
tone:
|
|
6
|
+
summary: "Professional but approachable. Confident but not arrogant. Helpful without being patronizing."
|
|
7
|
+
attributes:
|
|
8
|
+
- name: professional
|
|
9
|
+
weight: 0.8
|
|
10
|
+
description: "Expert, competent, trustworthy"
|
|
11
|
+
- name: clear
|
|
12
|
+
weight: 0.9
|
|
13
|
+
description: "Simple, direct, jargon-free unless necessary"
|
|
14
|
+
- name: helpful
|
|
15
|
+
weight: 0.7
|
|
16
|
+
description: "Solution-oriented, empathetic, supportive"
|
|
17
|
+
- name: confident
|
|
18
|
+
weight: 0.6
|
|
19
|
+
description: "Assured but not boastful"
|
|
20
|
+
- name: friendly
|
|
21
|
+
weight: 0.5
|
|
22
|
+
description: "Warm but not overly casual"
|
|
23
|
+
|
|
24
|
+
vocabulary:
|
|
25
|
+
rules:
|
|
26
|
+
- preferred: "use"
|
|
27
|
+
avoid: ["utilize", "leverage", "employ"]
|
|
28
|
+
context: "General usage"
|
|
29
|
+
- preferred: "help"
|
|
30
|
+
avoid: ["assist", "aid", "facilitate"]
|
|
31
|
+
context: "When offering support"
|
|
32
|
+
- preferred: "start"
|
|
33
|
+
avoid: ["commence", "initiate", "begin"]
|
|
34
|
+
context: "Starting actions"
|
|
35
|
+
- preferred: "end"
|
|
36
|
+
avoid: ["terminate", "conclude", "finalize"]
|
|
37
|
+
context: "Ending actions"
|
|
38
|
+
- preferred: "get"
|
|
39
|
+
avoid: ["obtain", "acquire", "retrieve"]
|
|
40
|
+
context: "Receiving or accessing"
|
|
41
|
+
- preferred: "show"
|
|
42
|
+
avoid: ["display", "exhibit", "demonstrate"]
|
|
43
|
+
context: "Revealing information"
|
|
44
|
+
- preferred: "need"
|
|
45
|
+
avoid: ["require", "necessitate"]
|
|
46
|
+
context: "Requirements"
|
|
47
|
+
- preferred: "about"
|
|
48
|
+
avoid: ["approximately", "roughly", "circa"]
|
|
49
|
+
context: "Approximations"
|
|
50
|
+
- preferred: "buy"
|
|
51
|
+
avoid: ["purchase", "procure"]
|
|
52
|
+
context: "Transactions"
|
|
53
|
+
- preferred: "try"
|
|
54
|
+
avoid: ["attempt", "endeavor"]
|
|
55
|
+
context: "Attempting actions"
|
|
56
|
+
- preferred: "change"
|
|
57
|
+
avoid: ["modify", "alter", "adjust"]
|
|
58
|
+
context: "Making changes"
|
|
59
|
+
- preferred: "set up"
|
|
60
|
+
avoid: ["configure", "establish"]
|
|
61
|
+
context: "Initial setup"
|
|
62
|
+
- preferred: "fix"
|
|
63
|
+
avoid: ["rectify", "resolve", "remediate"]
|
|
64
|
+
context: "Correcting problems"
|
|
65
|
+
|
|
66
|
+
forbidden:
|
|
67
|
+
- "synergy"
|
|
68
|
+
- "synergize"
|
|
69
|
+
- "paradigm"
|
|
70
|
+
- "paradigm shift"
|
|
71
|
+
- "disrupt"
|
|
72
|
+
- "disruptive"
|
|
73
|
+
- "revolutionary"
|
|
74
|
+
- "game-changing"
|
|
75
|
+
- "best-in-class"
|
|
76
|
+
- "world-class"
|
|
77
|
+
- "cutting-edge"
|
|
78
|
+
- "bleeding-edge"
|
|
79
|
+
- "state-of-the-art"
|
|
80
|
+
- "next-generation"
|
|
81
|
+
- "robust"
|
|
82
|
+
- "scalable solution"
|
|
83
|
+
- "holistic"
|
|
84
|
+
- "move the needle"
|
|
85
|
+
- "circle back"
|
|
86
|
+
- "touch base"
|
|
87
|
+
- "low-hanging fruit"
|
|
88
|
+
- "boil the ocean"
|
|
89
|
+
- "at the end of the day"
|
|
90
|
+
- "going forward"
|
|
91
|
+
- "it is what it is"
|
|
92
|
+
- "no-brainer"
|
|
93
|
+
- "pain point"
|
|
94
|
+
- "value-add"
|
|
95
|
+
- "value proposition"
|
|
96
|
+
- "bandwidth"
|
|
97
|
+
- "leverage" # as a verb
|
|
98
|
+
- "utilize"
|
|
99
|
+
- "incentivize"
|
|
100
|
+
- "operationalize"
|
|
101
|
+
- "democratize"
|
|
102
|
+
- "10x"
|
|
103
|
+
- "100x"
|
|
104
|
+
|
|
105
|
+
encouraged:
|
|
106
|
+
- "you"
|
|
107
|
+
- "your"
|
|
108
|
+
- "we"
|
|
109
|
+
- "our"
|
|
110
|
+
- "team"
|
|
111
|
+
|
|
112
|
+
doNot:
|
|
113
|
+
- pattern: "\\bplease\\b.*\\bplease\\b"
|
|
114
|
+
isRegex: true
|
|
115
|
+
reason: "Double 'please' sounds desperate"
|
|
116
|
+
severity: warning
|
|
117
|
+
suggestion: "Use 'please' once or not at all"
|
|
118
|
+
|
|
119
|
+
- pattern: "^sorry"
|
|
120
|
+
isRegex: true
|
|
121
|
+
reason: "Don't start with apology unless actually apologizing for a mistake"
|
|
122
|
+
severity: info
|
|
123
|
+
suggestion: "Lead with solution or action"
|
|
124
|
+
|
|
125
|
+
- pattern: "\\b(obviously|clearly|simply|just|easily)\\b"
|
|
126
|
+
isRegex: true
|
|
127
|
+
reason: "These words can make users feel stupid if something isn't obvious to them"
|
|
128
|
+
severity: warning
|
|
129
|
+
suggestion: "Remove the word entirely"
|
|
130
|
+
|
|
131
|
+
- pattern: "\\bwe're sorry for any inconvenience\\b"
|
|
132
|
+
isRegex: true
|
|
133
|
+
reason: "Corporate non-apology"
|
|
134
|
+
severity: error
|
|
135
|
+
suggestion: "Be specific about what went wrong and what you're doing about it"
|
|
136
|
+
|
|
137
|
+
- pattern: "\\bclick here\\b"
|
|
138
|
+
isRegex: true
|
|
139
|
+
reason: "Poor accessibility and unclear destination"
|
|
140
|
+
severity: error
|
|
141
|
+
suggestion: "Describe the destination: 'View your dashboard' or 'Read the documentation'"
|
|
142
|
+
|
|
143
|
+
- pattern: "\\b(please do not hesitate|don't hesitate|feel free)\\b"
|
|
144
|
+
isRegex: true
|
|
145
|
+
reason: "Implies hesitation is expected"
|
|
146
|
+
severity: info
|
|
147
|
+
suggestion: "Just tell them what to do"
|
|
148
|
+
|
|
149
|
+
- pattern: "!"
|
|
150
|
+
isRegex: false
|
|
151
|
+
reason: "Exclamation marks feel unprofessional in most SaaS contexts"
|
|
152
|
+
severity: info
|
|
153
|
+
suggestion: "Use periods. Let the content convey enthusiasm."
|
|
154
|
+
|
|
155
|
+
- pattern: "\\b(very|really|extremely|incredibly|absolutely)\\b"
|
|
156
|
+
isRegex: true
|
|
157
|
+
reason: "Intensifiers weaken writing"
|
|
158
|
+
severity: info
|
|
159
|
+
suggestion: "Use stronger verbs or nouns instead"
|
|
160
|
+
|
|
161
|
+
- pattern: "\\bours? is the (best|only|first|most)\\b"
|
|
162
|
+
isRegex: true
|
|
163
|
+
reason: "Unsubstantiated superlatives hurt credibility"
|
|
164
|
+
severity: warning
|
|
165
|
+
suggestion: "Be specific about what makes you different"
|
|
166
|
+
|
|
167
|
+
- pattern: "\\bfyi\\b"
|
|
168
|
+
isRegex: true
|
|
169
|
+
reason: "Informal abbreviation"
|
|
170
|
+
severity: info
|
|
171
|
+
suggestion: "Spell it out or rephrase"
|
|
172
|
+
|
|
173
|
+
- pattern: "\\betc\\.?\\b"
|
|
174
|
+
isRegex: true
|
|
175
|
+
reason: "Lazy writing that doesn't help the reader"
|
|
176
|
+
severity: info
|
|
177
|
+
suggestion: "Be specific or use 'and more'"
|
|
178
|
+
|
|
179
|
+
- pattern: "\\bASAP\\b"
|
|
180
|
+
isRegex: true
|
|
181
|
+
reason: "Vague and pressure-inducing"
|
|
182
|
+
severity: warning
|
|
183
|
+
suggestion: "Give a specific timeframe"
|
|
184
|
+
|
|
185
|
+
examples:
|
|
186
|
+
- bad: "We're excited to announce our revolutionary new feature!"
|
|
187
|
+
good: "Introducing batch exports. Now you can export up to 1,000 records at once."
|
|
188
|
+
explanation: "Specifics beat hyperbole"
|
|
189
|
+
|
|
190
|
+
- bad: "Please don't hesitate to reach out if you have any questions."
|
|
191
|
+
good: "Questions? Email support@example.com."
|
|
192
|
+
explanation: "Direct and actionable"
|
|
193
|
+
|
|
194
|
+
- bad: "We're sorry for any inconvenience this may have caused."
|
|
195
|
+
good: "Your export failed because the file was too large. We're increasing the limit to 500MB this week."
|
|
196
|
+
explanation: "Acknowledge the specific issue and state the fix"
|
|
197
|
+
|
|
198
|
+
- bad: "Click here to learn more."
|
|
199
|
+
good: "Read the migration guide."
|
|
200
|
+
explanation: "Accessible and descriptive"
|
|
201
|
+
|
|
202
|
+
- bad: "We utilize cutting-edge technology to leverage synergies."
|
|
203
|
+
good: "We built our own search engine so your queries return in under 100ms."
|
|
204
|
+
explanation: "Concrete claims beat jargon"
|
|
205
|
+
|
|
206
|
+
- bad: "Simply configure your settings and you're good to go!"
|
|
207
|
+
good: "Set up your preferences in Settings > Notifications."
|
|
208
|
+
explanation: "Specific guidance, no 'simply'"
|
|
209
|
+
|
|
210
|
+
- bad: "Due to unforeseen circumstances, your request could not be processed at this time."
|
|
211
|
+
good: "We couldn't process your request. Our payment provider is down. We'll retry automatically in 10 minutes."
|
|
212
|
+
explanation: "Tell them what happened and what's next"
|
|
213
|
+
|
|
214
|
+
- bad: "Thank you for your patience."
|
|
215
|
+
good: "This is taking longer than usual. Here's why: [specific reason]."
|
|
216
|
+
explanation: "Don't thank people for something they didn't choose"
|
|
217
|
+
|
|
218
|
+
- bad: "Invalid input."
|
|
219
|
+
good: "Email addresses need an @ symbol. Example: name@company.com"
|
|
220
|
+
explanation: "Show what's wrong and how to fix it"
|
|
221
|
+
|
|
222
|
+
- bad: "Are you sure you want to delete this? This action cannot be undone."
|
|
223
|
+
good: "Delete this project? You'll lose all 47 tasks and 12 files. This can't be undone."
|
|
224
|
+
explanation: "Show what they'll lose, not just that something will happen"
|
|
225
|
+
|
|
226
|
+
constraints:
|
|
227
|
+
maxSentenceLength: 25
|
|
228
|
+
maxParagraphLength: 4
|
|
229
|
+
readingLevel: moderate
|
|
230
|
+
personPov: first-plural
|
|
231
|
+
contractions: allowed
|
|
232
|
+
oxfordComma: true
|