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.
- package/.editorconfig +12 -0
- package/.github/CLAUDE_MD_AUTOMATION.md +248 -0
- package/.github/PROGRESSIVE_QUALITY_IMPLEMENTATION.md +408 -0
- package/.github/PROGRESSIVE_QUALITY_PROPOSAL.md +443 -0
- package/.github/RELEASE_CHECKLIST.md +100 -0
- package/.github/dependabot.yml +50 -0
- package/.github/git-sync.sh +48 -0
- package/.github/workflows/claude-md-validation.yml +82 -0
- package/.github/workflows/nightly-gitleaks-verification.yml +176 -0
- package/.github/workflows/pnpm-ci.yml.example +53 -0
- package/.github/workflows/python-ci.yml.example +69 -0
- package/.github/workflows/quality-legacy.yml.backup +165 -0
- package/.github/workflows/quality-progressive.yml.example +291 -0
- package/.github/workflows/quality.yml +436 -0
- package/.github/workflows/release.yml +53 -0
- package/.nvmrc +1 -0
- package/.prettierignore +14 -0
- package/.prettierrc +9 -0
- package/.stylelintrc.json +5 -0
- package/README.md +212 -0
- package/config/.lighthouserc.js +45 -0
- package/config/.pre-commit-config.yaml +66 -0
- package/config/constants.js +128 -0
- package/config/defaults.js +124 -0
- package/config/pyproject.toml +124 -0
- package/config/quality-config.schema.json +97 -0
- package/config/quality-python.yml +89 -0
- package/config/requirements-dev.txt +15 -0
- package/create-saas-monetization.js +1465 -0
- package/eslint.config.cjs +117 -0
- package/eslint.config.ts.cjs +99 -0
- package/legal/README.md +106 -0
- package/legal/copyright.md +76 -0
- package/legal/disclaimer.md +146 -0
- package/legal/privacy-policy.html +324 -0
- package/legal/privacy-policy.md +196 -0
- package/legal/terms-of-service.md +224 -0
- package/lib/billing-dashboard.html +645 -0
- package/lib/config-validator.js +163 -0
- package/lib/dependency-monitoring-basic.js +185 -0
- package/lib/dependency-monitoring-premium.js +1490 -0
- package/lib/error-reporter.js +444 -0
- package/lib/interactive/prompt.js +128 -0
- package/lib/interactive/questions.js +146 -0
- package/lib/license-validator.js +403 -0
- package/lib/licensing.js +989 -0
- package/lib/package-utils.js +187 -0
- package/lib/project-maturity.js +516 -0
- package/lib/security-enhancements.js +340 -0
- package/lib/setup-enhancements.js +317 -0
- package/lib/smart-strategy-generator.js +344 -0
- package/lib/telemetry.js +323 -0
- package/lib/template-loader.js +252 -0
- package/lib/typescript-config-generator.js +210 -0
- package/lib/ui-helpers.js +74 -0
- package/lib/validation/base-validator.js +174 -0
- package/lib/validation/cache-manager.js +158 -0
- package/lib/validation/config-security.js +741 -0
- package/lib/validation/documentation.js +326 -0
- package/lib/validation/index.js +186 -0
- package/lib/validation/validation-factory.js +153 -0
- package/lib/validation/workflow-validation.js +172 -0
- package/lib/yaml-utils.js +120 -0
- package/marketing/beta-user-email-campaign.md +372 -0
- package/marketing/landing-page.html +721 -0
- package/package.json +165 -0
- 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)
|