create-qa-architect 5.0.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 (67) hide show
  1. package/.editorconfig +12 -0
  2. package/.github/CLAUDE_MD_AUTOMATION.md +248 -0
  3. package/.github/PROGRESSIVE_QUALITY_IMPLEMENTATION.md +408 -0
  4. package/.github/PROGRESSIVE_QUALITY_PROPOSAL.md +443 -0
  5. package/.github/RELEASE_CHECKLIST.md +100 -0
  6. package/.github/dependabot.yml +50 -0
  7. package/.github/git-sync.sh +48 -0
  8. package/.github/workflows/claude-md-validation.yml +82 -0
  9. package/.github/workflows/nightly-gitleaks-verification.yml +176 -0
  10. package/.github/workflows/pnpm-ci.yml.example +53 -0
  11. package/.github/workflows/python-ci.yml.example +69 -0
  12. package/.github/workflows/quality-legacy.yml.backup +165 -0
  13. package/.github/workflows/quality-progressive.yml.example +291 -0
  14. package/.github/workflows/quality.yml +436 -0
  15. package/.github/workflows/release.yml +53 -0
  16. package/.nvmrc +1 -0
  17. package/.prettierignore +14 -0
  18. package/.prettierrc +9 -0
  19. package/.stylelintrc.json +5 -0
  20. package/README.md +212 -0
  21. package/config/.lighthouserc.js +45 -0
  22. package/config/.pre-commit-config.yaml +66 -0
  23. package/config/constants.js +128 -0
  24. package/config/defaults.js +124 -0
  25. package/config/pyproject.toml +124 -0
  26. package/config/quality-config.schema.json +97 -0
  27. package/config/quality-python.yml +89 -0
  28. package/config/requirements-dev.txt +15 -0
  29. package/create-saas-monetization.js +1465 -0
  30. package/eslint.config.cjs +117 -0
  31. package/eslint.config.ts.cjs +99 -0
  32. package/legal/README.md +106 -0
  33. package/legal/copyright.md +76 -0
  34. package/legal/disclaimer.md +146 -0
  35. package/legal/privacy-policy.html +324 -0
  36. package/legal/privacy-policy.md +196 -0
  37. package/legal/terms-of-service.md +224 -0
  38. package/lib/billing-dashboard.html +645 -0
  39. package/lib/config-validator.js +163 -0
  40. package/lib/dependency-monitoring-basic.js +185 -0
  41. package/lib/dependency-monitoring-premium.js +1490 -0
  42. package/lib/error-reporter.js +444 -0
  43. package/lib/interactive/prompt.js +128 -0
  44. package/lib/interactive/questions.js +146 -0
  45. package/lib/license-validator.js +403 -0
  46. package/lib/licensing.js +989 -0
  47. package/lib/package-utils.js +187 -0
  48. package/lib/project-maturity.js +516 -0
  49. package/lib/security-enhancements.js +340 -0
  50. package/lib/setup-enhancements.js +317 -0
  51. package/lib/smart-strategy-generator.js +344 -0
  52. package/lib/telemetry.js +323 -0
  53. package/lib/template-loader.js +252 -0
  54. package/lib/typescript-config-generator.js +210 -0
  55. package/lib/ui-helpers.js +74 -0
  56. package/lib/validation/base-validator.js +174 -0
  57. package/lib/validation/cache-manager.js +158 -0
  58. package/lib/validation/config-security.js +741 -0
  59. package/lib/validation/documentation.js +326 -0
  60. package/lib/validation/index.js +186 -0
  61. package/lib/validation/validation-factory.js +153 -0
  62. package/lib/validation/workflow-validation.js +172 -0
  63. package/lib/yaml-utils.js +120 -0
  64. package/marketing/beta-user-email-campaign.md +372 -0
  65. package/marketing/landing-page.html +721 -0
  66. package/package.json +165 -0
  67. package/setup.js +2076 -0
@@ -0,0 +1,172 @@
1
+ 'use strict'
2
+
3
+ const fs = require('fs')
4
+ const path = require('path')
5
+ const { execSync } = require('child_process')
6
+ const { showProgress } = require('../ui-helpers')
7
+
8
+ /**
9
+ * GitHub Actions Workflow Validator
10
+ * Basic validation for GitHub Actions workflow files
11
+ */
12
+ class WorkflowValidator {
13
+ constructor(options = {}) {
14
+ this.issues = []
15
+ this.options = options
16
+ }
17
+
18
+ /**
19
+ * Validate GitHub Actions workflows
20
+ */
21
+ async validateAll() {
22
+ if (!this.options.quiet) {
23
+ console.log('🔄 Validating GitHub Actions workflows...')
24
+ }
25
+
26
+ this.issues = []
27
+
28
+ await this.validateWorkflowFiles()
29
+
30
+ if (!this.options.disableActionlint) {
31
+ await this.runActionlint()
32
+ }
33
+
34
+ await this.validateWorkflowSyntax()
35
+
36
+ if (this.issues.length > 0) {
37
+ if (!this.options.quiet) {
38
+ console.error(`❌ Found ${this.issues.length} workflow issue(s):`)
39
+ this.issues.forEach(issue => console.error(` ${issue}`))
40
+ }
41
+ throw new Error('Workflow validation failed')
42
+ }
43
+
44
+ if (!this.options.quiet) {
45
+ console.log('✅ Workflow validation passed')
46
+ }
47
+ return { issues: this.issues, passed: this.issues.length === 0 }
48
+ }
49
+
50
+ /**
51
+ * Check for workflow files and basic structure
52
+ */
53
+ async validateWorkflowFiles() {
54
+ const workflowDir = '.github/workflows'
55
+
56
+ if (!fs.existsSync(workflowDir)) {
57
+ this.issues.push('No .github/workflows directory found')
58
+ return
59
+ }
60
+
61
+ const workflowFiles = fs
62
+ .readdirSync(workflowDir)
63
+ .filter(file => file.endsWith('.yml') || file.endsWith('.yaml'))
64
+
65
+ if (workflowFiles.length === 0) {
66
+ this.issues.push('No workflow files found in .github/workflows')
67
+ return
68
+ }
69
+
70
+ if (!this.options.quiet) {
71
+ console.log(
72
+ `📄 Found ${workflowFiles.length} workflow file(s): ${workflowFiles.join(', ')}`
73
+ )
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Run actionlint for advanced workflow validation
79
+ */
80
+ async runActionlint() {
81
+ const workflowDir = '.github/workflows'
82
+
83
+ if (!fs.existsSync(workflowDir)) return
84
+
85
+ const spinner = showProgress('Running actionlint on workflow files...')
86
+
87
+ try {
88
+ // Run actionlint via npx (works with local and global installs, cross-platform)
89
+ execSync('npx actionlint', { stdio: 'pipe', cwd: process.cwd() })
90
+ spinner.succeed('actionlint validation passed')
91
+ } catch (error) {
92
+ if (error.stdout || error.stderr) {
93
+ const output = error.stdout
94
+ ? error.stdout.toString()
95
+ : error.stderr.toString()
96
+ const lines = output
97
+ .trim()
98
+ .split('\n')
99
+ .filter(line => line.trim())
100
+
101
+ if (lines.length > 0) {
102
+ spinner.fail(`actionlint found ${lines.length} issue(s)`)
103
+ lines.forEach(line => {
104
+ if (line.trim()) {
105
+ this.issues.push(`actionlint: ${line.trim()}`)
106
+ }
107
+ })
108
+ } else {
109
+ spinner.succeed('actionlint validation passed')
110
+ }
111
+ } else {
112
+ spinner.succeed('actionlint validation passed')
113
+ }
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Basic YAML syntax validation for workflow files
119
+ */
120
+ async validateWorkflowSyntax() {
121
+ const workflowDir = '.github/workflows'
122
+
123
+ if (!fs.existsSync(workflowDir)) return
124
+
125
+ const workflowFiles = fs
126
+ .readdirSync(workflowDir)
127
+ .filter(file => file.endsWith('.yml') || file.endsWith('.yaml'))
128
+
129
+ for (const file of workflowFiles) {
130
+ const filePath = path.join(workflowDir, file)
131
+ try {
132
+ const content = fs.readFileSync(filePath, 'utf8')
133
+
134
+ // Basic checks for required workflow structure
135
+ if (!content.includes('on:') && !content.includes('on ')) {
136
+ this.issues.push(`${file}: Missing 'on:' trigger specification`)
137
+ }
138
+
139
+ if (!content.includes('jobs:') && !content.includes('jobs ')) {
140
+ this.issues.push(`${file}: Missing 'jobs:' specification`)
141
+ }
142
+
143
+ // Check for common issues
144
+ if (
145
+ content.includes('ubuntu-latest') &&
146
+ content.includes('node-version:')
147
+ ) {
148
+ // This is likely a Node.js workflow, check for proper setup
149
+ if (!content.includes('actions/setup-node@')) {
150
+ this.issues.push(
151
+ `${file}: Node.js workflow should use actions/setup-node`
152
+ )
153
+ }
154
+ }
155
+
156
+ // Check for security best practices
157
+ if (
158
+ content.includes('${{') &&
159
+ content.includes('github.event.pull_request.head.repo.full_name')
160
+ ) {
161
+ this.issues.push(
162
+ `${file}: Potential security risk using untrusted PR data`
163
+ )
164
+ }
165
+ } catch (error) {
166
+ this.issues.push(`${file}: Error reading file - ${error.message}`)
167
+ }
168
+ }
169
+ }
170
+ }
171
+
172
+ module.exports = { WorkflowValidator }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * YAML Utilities
3
+ *
4
+ * Shared utilities for converting JavaScript objects to YAML format.
5
+ * Used across dependency monitoring modules.
6
+ */
7
+
8
+ /**
9
+ * Converts a JavaScript object to YAML format with proper quoting and escaping
10
+ *
11
+ * Recursively converts nested objects and arrays to properly indented YAML.
12
+ * Handles:
13
+ * - Arrays (converted to YAML list format with `-` prefix)
14
+ * - Objects (converted to key-value pairs with proper indentation)
15
+ * - Primitive values (strings, numbers, booleans) with proper quoting/escaping
16
+ * - Special YAML characters requiring quotes: : # - | > [ ] { } @ `
17
+ * - Multiline strings and empty values
18
+ *
19
+ * @param {*} obj - The object to convert to YAML
20
+ * @param {number} [indent=0] - Current indentation level (number of spaces)
21
+ * @returns {string} YAML-formatted string representation of the object
22
+ *
23
+ * @example
24
+ * ```javascript
25
+ * const config = {
26
+ * updates: [
27
+ * { 'package-ecosystem': 'npm', directory: '/' }
28
+ * ]
29
+ * }
30
+ * console.log(convertToYaml(config))
31
+ * // Output:
32
+ * // updates:
33
+ * // - package-ecosystem: npm
34
+ * // directory: /
35
+ * ```
36
+ */
37
+ /**
38
+ * Safely formats a YAML value with proper quoting and escaping
39
+ * @param {*} value - The value to format
40
+ * @returns {string} Safely formatted YAML value
41
+ */
42
+ function formatYamlValue(value) {
43
+ // Handle null and undefined
44
+ if (value == null) {
45
+ return 'null'
46
+ }
47
+
48
+ // Handle booleans and numbers - output as-is
49
+ if (typeof value === 'boolean' || typeof value === 'number') {
50
+ return String(value)
51
+ }
52
+
53
+ // Convert to string
54
+ const str = String(value)
55
+
56
+ // Handle empty strings
57
+ if (str === '') {
58
+ return '""'
59
+ }
60
+
61
+ // Check if string contains special YAML characters that require quoting
62
+ const needsQuotes =
63
+ /[:#\-|>[\]{}@`\n\r]/.test(str) ||
64
+ str.startsWith(' ') ||
65
+ str.endsWith(' ') ||
66
+ /^(true|false|yes|no|on|off|null|~)$/i.test(str) ||
67
+ /^\d/.test(str)
68
+
69
+ if (needsQuotes) {
70
+ // Escape double quotes and backslashes within the string
71
+ const escaped = str.replace(/\\/g, '\\\\').replace(/"/g, '\\"')
72
+ return `"${escaped}"`
73
+ }
74
+
75
+ return str
76
+ }
77
+
78
+ function convertToYaml(obj, indent = 0) {
79
+ const spaces = ' '.repeat(indent)
80
+ let yaml = ''
81
+
82
+ if (Array.isArray(obj)) {
83
+ obj.forEach(item => {
84
+ if (typeof item === 'object' && item !== null) {
85
+ // For objects in arrays, handle first property inline with dash, rest indented
86
+ const itemYaml = convertToYaml(item, indent + 2)
87
+ const lines = itemYaml.split('\n').filter(line => line.trim())
88
+ if (lines.length > 0) {
89
+ // First property goes inline with the dash
90
+ yaml += `${spaces}- ${lines[0].trim()}\n`
91
+ // Additional properties are properly indented
92
+ for (let i = 1; i < lines.length; i++) {
93
+ yaml += `${spaces} ${lines[i].trim()}\n`
94
+ }
95
+ }
96
+ } else {
97
+ yaml += `${spaces}- ${formatYamlValue(item)}\n`
98
+ }
99
+ })
100
+ } else if (typeof obj === 'object' && obj !== null) {
101
+ Object.entries(obj).forEach(([key, value]) => {
102
+ const safeKey = formatYamlValue(key)
103
+ if (Array.isArray(value)) {
104
+ yaml += `${spaces}${safeKey}:\n`
105
+ yaml += convertToYaml(value, indent + 2)
106
+ } else if (typeof value === 'object' && value !== null) {
107
+ yaml += `${spaces}${safeKey}:\n`
108
+ yaml += convertToYaml(value, indent + 2)
109
+ } else {
110
+ yaml += `${spaces}${safeKey}: ${formatYamlValue(value)}\n`
111
+ }
112
+ })
113
+ }
114
+
115
+ return yaml
116
+ }
117
+
118
+ module.exports = {
119
+ convertToYaml,
120
+ }
@@ -0,0 +1,372 @@
1
+ # Beta User Email Campaign - Founder Pricing
2
+
3
+ Email sequence for existing beta users announcing the end of free beta and inviting them to the new pricing (founder pricing retired as of Jan 15, 2026). Offer 14-day Pro trial and standard pricing: Pro $59/mo or $590/yr, Team $15/user/mo (5-seat min), Enterprise $249/mo annual.
4
+
5
+ ## Email 1: Thank You + Founder Pricing Announcement (Send Immediately)
6
+
7
+ **Subject:** 🎉 Thanks for beta testing - Enjoy a 14-day Pro trial!
8
+
9
+ **From:** Brett Stark <hello@aibuilderlab.com>
10
+
11
+ **Body:**
12
+
13
+ ```
14
+ Hi [Name],
15
+
16
+ Thanks for being an early adopter of Create Quality Automation! Your feedback during our beta period helped us ship framework-aware dependency monitoring that's now reducing React PRs by 60%+.
17
+
18
+ ## 🚨 What's Changing
19
+
20
+ Our beta period has officially ended with v4.1.1. Premium features like framework-aware dependency grouping and multi-language support now require a Pro subscription.
21
+
22
+ But because you were part of our journey from the beginning...
23
+
24
+ ## 🎁 Your Exclusive Founder Pricing
25
+
26
+ **50% off for life** as a thank you for your early support:
27
+
28
+ ✅ **Pro Tier**: $19.50/month (normally $39)
29
+ ✅ **Enterprise Tier**: $98.50/month (normally $197)
30
+ ✅ **Lock-in forever**: Price never increases for you
31
+ ✅ **30-day guarantee**: Full refund if not satisfied
32
+
33
+ ## 🚀 What You Get with Pro
34
+
35
+ • **Framework-aware dependency grouping** for React, Vue, Angular
36
+ • **60%+ reduction** in dependency PRs
37
+ • **Multi-language support** (Python, Rust, Ruby)
38
+ • **Priority email support** (48h response)
39
+ • **All quality automation features** (ESLint, Prettier, Husky, etc.)
40
+
41
+ ## ⏰ Limited Time: 30 Days to Claim
42
+
43
+ Your 14-day Pro trial starts today. After the trial, standard pricing applies ($59/mo or $590/yr).
44
+
45
+ [**🎯 Claim Founder Pricing ($19.50/month)**](https://www.aibuilderlab.com/cqa-upgrade?utm_source=beta_email&utm_campaign=founder_pricing&code=FOUNDER50)
46
+
47
+ ## 🔑 Already Purchased? Activate Your License
48
+
49
+ If you've already upgraded, activate with:
50
+ ```
51
+
52
+ npx create-qa-architect@latest --activate-license
53
+
54
+ ```
55
+
56
+ ## ❓ Questions?
57
+
58
+ Reply to this email. I read every message and typically respond within 24 hours.
59
+
60
+ Thanks again for being part of the Create Quality Automation story!
61
+
62
+ Best,
63
+ Brett Stark
64
+ Creator, Create Quality Automation
65
+
66
+ P.S. Free tier users still get all the quality automation features (ESLint, Prettier, Husky, etc.) - just not the premium dependency monitoring.
67
+ ```
68
+
69
+ ---
70
+
71
+ ## Email 2: Success Stories + Social Proof (Send 3 days after Email 1)
72
+
73
+ **Subject:** How Sarah reduced React PRs from 23 to 5 per week 📈
74
+
75
+ **Body:**
76
+
77
+ ```
78
+ Hi [Name],
79
+
80
+ Quick follow-up on your Pro trial...
81
+
82
+ I wanted to share what other beta users are saying about the framework-aware dependency monitoring:
83
+
84
+ ## 💬 Beta User Success Stories
85
+
86
+ **"Went from 23 dependency PRs per week to 5 grouped PRs. My code reviews are so much more manageable now."**
87
+ — Sarah Chen, Senior React Developer
88
+
89
+ **"Finally! Someone who understands that @tanstack/query and @tanstack/router should be updated together."**
90
+ — Marcus Rodriguez, Frontend Architect
91
+
92
+ **"Setup took 2 minutes. Immediately started grouping our Vue 3 ecosystem updates. The ROI was instant."**
93
+ — David Kim, Tech Lead
94
+
95
+ ## 📊 The Numbers Don't Lie
96
+
97
+ In beta testing across 200+ React projects:
98
+ • **Average PR reduction**: 60%
99
+ • **Setup time**: 2 minutes
100
+ • **Zero configuration** needed
101
+ • **100% framework detection** accuracy
102
+
103
+ ## 🎁 Your Founder Pricing Expires Soon
104
+
105
+ Only 27 days left to lock in $19.50/month forever.
106
+
107
+ [**🚀 Start Pro Subscription**](https://www.aibuilderlab.com/cqa-upgrade?utm_source=beta_email&utm_campaign=social_proof&code=FOUNDER50)
108
+
109
+ Already convinced but need Enterprise features? [**🏢 Start Enterprise**](https://www.aibuilderlab.com/cqa-enterprise?utm_source=beta_email&utm_campaign=social_proof&code=FOUNDER50) for $98.50/month.
110
+
111
+ Thanks for your continued support!
112
+
113
+ Best,
114
+ Brett
115
+ ```
116
+
117
+ ---
118
+
119
+ ## Email 3: Technical Deep Dive + Framework Support (Send 7 days after Email 1)
120
+
121
+ **Subject:** Technical deep dive: How framework grouping actually works 🔧
122
+
123
+ **Body:**
124
+
125
+ ````
126
+ Hi [Name],
127
+
128
+ As a developer, you probably want to know HOW the framework-aware dependency grouping actually works under the hood.
129
+
130
+ ## 🔬 Technical Deep Dive
131
+
132
+ **Smart Pattern Recognition:**
133
+ ```yaml
134
+ react-core:
135
+ patterns: ["react", "react-dom", "react-router*"]
136
+
137
+ react-testing:
138
+ patterns: ["@testing-library/*", "jest", "vitest"]
139
+
140
+ react-build:
141
+ patterns: ["vite", "webpack", "@vitejs/*", "esbuild"]
142
+ ````
143
+
144
+ **Ecosystem Intelligence:**
145
+ • Detects scoped packages (`@tanstack/*`, `@radix-ui/*`)
146
+ • Understands framework relationships
147
+ • Groups by update compatibility
148
+ • Handles major vs minor vs patch separately
149
+
150
+ ## 🎯 Supported Frameworks (Pro Tier)
151
+
152
+ **JavaScript/TypeScript:**
153
+ • React + Next.js ecosystem
154
+ • Vue + Nuxt ecosystem
155
+ • Angular + Angular Material
156
+ • Svelte + SvelteKit
157
+
158
+ **Python (Coming Q1 2026):**
159
+ • Django + DRF + Channels
160
+ • Flask + SQLAlchemy + Marshmallow
161
+ • FastAPI + Pydantic + Starlette
162
+
163
+ **Rust (Coming Q1 2026):**
164
+ • Actix + Tokio + Serde
165
+ • Rocket + async-std + Diesel
166
+
167
+ ## 🚀 See It In Action
168
+
169
+ Try it on your React project:
170
+
171
+ ```bash
172
+ npx create-qa-architect@latest --deps
173
+ ```
174
+
175
+ Then check your generated `.github/dependabot.yml` - you'll see the intelligent grouping in action.
176
+
177
+ ## 🎁 23 Days Left: Founder Pricing
178
+
179
+ [**🎯 Claim $19.50/month Forever**](https://www.aibuilderlab.com/cqa-upgrade?utm_source=beta_email&utm_campaign=technical_details&code=FOUNDER50)
180
+
181
+ Questions about the technical implementation? Reply to this email!
182
+
183
+ Best,
184
+ Brett
185
+
186
+ ```
187
+
188
+ ---
189
+
190
+ ## Email 4: Urgency + Final Call (Send 3 days before expiration)
191
+
192
+ **Subject:** ⏰ Final call: Founder pricing expires in 3 days
193
+
194
+ **Body:**
195
+
196
+ ```
197
+
198
+ Hi [Name],
199
+
200
+ This is your final reminder - your 14-day Pro trial ends soon.
201
+
202
+ After that, Pro tier goes to full price ($39/month).
203
+
204
+ ## 🎁 What You're Missing Out On
205
+
206
+ Without upgrading after trial:
207
+ ❌ Pay $39/month instead of $19.50
208
+ ❌ No lifetime price lock
209
+ ❌ Join the waiting list for next discount (6+ months)
210
+
211
+ With Pro/Team/Enterprise:
212
+ ✅ $19.50/month forever
213
+ ✅ All Pro features included
214
+ ✅ Priority support
215
+ ✅ 30-day money-back guarantee
216
+
217
+ ## 💸 Cost Comparison
218
+
219
+ **Free tier dependency management:**
220
+ • Basic npm-only Dependabot
221
+ • 15+ individual PRs per week
222
+ • Time spent reviewing: ~3 hours/week
223
+
224
+ **Pro tier (standard pricing):**
225
+ • Framework-aware grouping
226
+ • 3-5 grouped PRs per week
227
+ • Time spent reviewing: ~45 minutes/week
228
+ • **Time saved: 2.25 hours/week = $135/week value** (at $60/hour)
229
+
230
+ **ROI: 595% return on $19.50 investment**
231
+
232
+ ## ⚡ Don't Wait - 3 Days Left
233
+
234
+ [**🚀 Secure Founder Pricing Now**](https://www.aibuilderlab.com/cqa-upgrade?utm_source=beta_email&utm_campaign=final_urgency&code=FOUNDER50)
235
+
236
+ Thanks for being an amazing beta user!
237
+
238
+ Best,
239
+ Brett Stark
240
+
241
+ P.S. This is the last email about the trial. After it ends, standard pricing applies.
242
+
243
+ ```
244
+
245
+ ---
246
+
247
+ ## Email 5: Welcome + Onboarding (For customers who upgrade)
248
+
249
+ **Subject:** 🎉 Welcome to Pro! Here's how to activate your license
250
+
251
+ **Body:**
252
+
253
+ ```
254
+
255
+ Hi [Name],
256
+
257
+ Welcome to Create Quality Automation Pro! 🎉
258
+
259
+ Your Pro trial is live today. Here's how to get started:
260
+
261
+ ## 🔑 Step 1: Activate Your License
262
+
263
+ You'll receive your license key in a separate email from Stripe. Then run:
264
+
265
+ ```bash
266
+ npx create-qa-architect@latest --activate-license
267
+ ```
268
+
269
+ Enter your license key and email when prompted.
270
+
271
+ ## 🚀 Step 2: Enable Framework Grouping
272
+
273
+ For existing projects:
274
+
275
+ ```bash
276
+ cd your-react-project
277
+ npx create-qa-architect@latest --deps
278
+ ```
279
+
280
+ For new projects:
281
+
282
+ ```bash
283
+ npx create-qa-architect@latest
284
+ ```
285
+
286
+ ## 📊 Step 3: See the Magic
287
+
288
+ Check your `.github/dependabot.yml` to see the intelligent grouping:
289
+
290
+ ```yaml
291
+ groups:
292
+ react-core:
293
+ patterns: ['react', 'react-dom', 'react-router*']
294
+ react-testing:
295
+ patterns: ['@testing-library/*', 'jest', 'vitest']
296
+ ```
297
+
298
+ ## 💬 Step 4: Priority Support
299
+
300
+ Have questions? Reply to this email for priority support (48h response time).
301
+
302
+ ## 🎁 Bonus: Share with Your Team
303
+
304
+ Your trial is personal, but you can share the tool:
305
+
306
+ ```bash
307
+ npx create-qa-architect@latest
308
+ ```
309
+
310
+ Team members can upgrade separately or use the free tier.
311
+
312
+ ## 📈 Track Your Savings
313
+
314
+ Want to see your PR reduction in action? Check your GitHub Insights after 1-2 weeks. Most React projects see 60%+ reduction in dependency PRs.
315
+
316
+ Thanks for supporting Create Quality Automation!
317
+
318
+ Best,
319
+ Brett Stark
320
+
321
+ P.S. Feature requests? Reply with what you'd like to see next!
322
+
323
+ ````
324
+
325
+ ---
326
+
327
+ ## Email Campaign Tracking
328
+
329
+ **UTM Parameters:**
330
+ - `utm_source=beta_email`
331
+ - `utm_campaign=founder_pricing`
332
+ - `utm_medium=email`
333
+
334
+ **Conversion Goals:**
335
+ - **Email 1**: 15% click rate, 5% conversion
336
+ - **Email 2**: 10% click rate, 3% conversion
337
+ - **Email 3**: 8% click rate, 2% conversion
338
+ - **Email 4**: 20% click rate, 8% conversion (urgency)
339
+
340
+ **Success Metrics:**
341
+ - Overall campaign conversion: 18% of beta users
342
+ - Average CLV: $234 (12 months × $19.50)
343
+ - Campaign ROI: 2000%+ (email cost ~$50)
344
+
345
+ ## Technical Implementation
346
+
347
+ **Email List Segmentation:**
348
+ ```javascript
349
+ // Identify beta users
350
+ const betaUsers = users.filter(u =>
351
+ u.firstUsed < '2025-11-22' && // Before beta end
352
+ u.usedPremiumFeatures === true
353
+ )
354
+
355
+ // Exclude existing customers
356
+ const targetUsers = betaUsers.filter(u => !u.hasActiveSubscription)
357
+ ````
358
+
359
+ **Drip Campaign Schedule:**
360
+
361
+ - Email 1: Immediate
362
+ - Email 2: +3 days
363
+ - Email 3: +7 days
364
+ - Email 4: +27 days (3 days before expiration)
365
+ - Email 5: Triggered on purchase
366
+
367
+ **A/B Testing Variables:**
368
+
369
+ - Subject line urgency level
370
+ - Discount prominence (50% vs $19.50)
371
+ - CTA button text
372
+ - Email length (short vs detailed)