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.
Files changed (83) hide show
  1. package/README.md +261 -0
  2. package/action/action.yml +59 -0
  3. package/action/package.json +24 -0
  4. package/action/src/index.ts +455 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +335 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +10 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/rewriter/index.d.ts +45 -0
  14. package/dist/rewriter/index.d.ts.map +1 -0
  15. package/dist/rewriter/index.js +163 -0
  16. package/dist/rewriter/index.js.map +1 -0
  17. package/dist/schema/copy-patterns.d.ts +298 -0
  18. package/dist/schema/copy-patterns.d.ts.map +1 -0
  19. package/dist/schema/copy-patterns.js +53 -0
  20. package/dist/schema/copy-patterns.js.map +1 -0
  21. package/dist/schema/cta-rules.d.ts +274 -0
  22. package/dist/schema/cta-rules.d.ts.map +1 -0
  23. package/dist/schema/cta-rules.js +45 -0
  24. package/dist/schema/cta-rules.js.map +1 -0
  25. package/dist/schema/index.d.ts +2172 -0
  26. package/dist/schema/index.d.ts.map +1 -0
  27. package/dist/schema/index.js +92 -0
  28. package/dist/schema/index.js.map +1 -0
  29. package/dist/schema/tests.d.ts +274 -0
  30. package/dist/schema/tests.d.ts.map +1 -0
  31. package/dist/schema/tests.js +37 -0
  32. package/dist/schema/tests.js.map +1 -0
  33. package/dist/schema/tokens.d.ts +632 -0
  34. package/dist/schema/tokens.d.ts.map +1 -0
  35. package/dist/schema/tokens.js +68 -0
  36. package/dist/schema/tokens.js.map +1 -0
  37. package/dist/schema/voice.d.ts +280 -0
  38. package/dist/schema/voice.d.ts.map +1 -0
  39. package/dist/schema/voice.js +52 -0
  40. package/dist/schema/voice.js.map +1 -0
  41. package/dist/server/billing.d.ts +53 -0
  42. package/dist/server/billing.d.ts.map +1 -0
  43. package/dist/server/billing.js +216 -0
  44. package/dist/server/billing.js.map +1 -0
  45. package/dist/server/http.d.ts +5 -0
  46. package/dist/server/http.d.ts.map +1 -0
  47. package/dist/server/http.js +470 -0
  48. package/dist/server/http.js.map +1 -0
  49. package/dist/server/index.d.ts +3 -0
  50. package/dist/server/index.d.ts.map +1 -0
  51. package/dist/server/index.js +480 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/middleware/auth.d.ts +15 -0
  54. package/dist/server/middleware/auth.d.ts.map +1 -0
  55. package/dist/server/middleware/auth.js +83 -0
  56. package/dist/server/middleware/auth.js.map +1 -0
  57. package/dist/utils/pack-loader.d.ts +13 -0
  58. package/dist/utils/pack-loader.d.ts.map +1 -0
  59. package/dist/utils/pack-loader.js +98 -0
  60. package/dist/utils/pack-loader.js.map +1 -0
  61. package/dist/validator/index.d.ts +21 -0
  62. package/dist/validator/index.d.ts.map +1 -0
  63. package/dist/validator/index.js +60 -0
  64. package/dist/validator/index.js.map +1 -0
  65. package/dist/validator/rules/constraints.d.ts +8 -0
  66. package/dist/validator/rules/constraints.d.ts.map +1 -0
  67. package/dist/validator/rules/constraints.js +150 -0
  68. package/dist/validator/rules/constraints.js.map +1 -0
  69. package/dist/validator/rules/cta.d.ts +11 -0
  70. package/dist/validator/rules/cta.d.ts.map +1 -0
  71. package/dist/validator/rules/cta.js +113 -0
  72. package/dist/validator/rules/cta.js.map +1 -0
  73. package/dist/validator/rules/voice.d.ts +6 -0
  74. package/dist/validator/rules/voice.d.ts.map +1 -0
  75. package/dist/validator/rules/voice.js +106 -0
  76. package/dist/validator/rules/voice.js.map +1 -0
  77. package/package.json +61 -0
  78. package/packs/saas/copy_patterns.yaml +423 -0
  79. package/packs/saas/cta_rules.yaml +362 -0
  80. package/packs/saas/manifest.yaml +16 -0
  81. package/packs/saas/tests.yaml +305 -0
  82. package/packs/saas/tokens.json +226 -0
  83. 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