create-qa-architect 5.10.3 → 5.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/quality.yml +99 -104
- package/README.md +49 -6
- package/config/defaults.js +2 -2
- package/config/quality-python.yml +19 -1
- package/config/shell-ci.yml +12 -0
- package/config/shell-quality.yml +12 -0
- package/docs/DEVELOPMENT-WORKFLOW.md +127 -589
- package/eslint.config.cjs +14 -4
- package/lib/billing-dashboard.html +0 -100
- package/lib/dependency-monitoring-premium.js +5 -7
- package/lib/error-reporter.js +5 -43
- package/lib/github-api.js +2 -2
- package/lib/license-validator.js +10 -7
- package/lib/licensing.js +4 -4
- package/lib/package-utils.js +2 -2
- package/lib/prelaunch-validator.js +3 -2
- package/lib/setup-enhancements.js +2 -1
- package/lib/smart-strategy-generator.js +2 -5
- package/lib/ui-helpers.js +1 -1
- package/lib/workflow-config.js +107 -6
- package/package.json +3 -3
- package/setup.js +124 -65
- package/templates/integration-tests/api-service.test.js +1 -1
- package/.github/CLAUDE_MD_AUTOMATION.md +0 -248
- package/.github/PROGRESSIVE_QUALITY_IMPLEMENTATION.md +0 -408
- package/.github/PROGRESSIVE_QUALITY_PROPOSAL.md +0 -443
- package/docs/ADOPTION-SUMMARY.md +0 -41
- package/docs/ARCHITECTURE-IMPROVEMENTS.md +0 -176
- package/docs/ARCHITECTURE-REVIEW-2026-01-08.md +0 -514
- package/docs/ARCHITECTURE-REVIEW.md +0 -67
- package/docs/ARCHITECTURE.md +0 -41
- package/docs/CODE-REVIEW.md +0 -100
- package/docs/LAZY_LOADING_IMPLEMENTATION.md +0 -309
- package/docs/MIGRATION-5.8.0.md +0 -157
- package/docs/MONOREPO-COMPATIBILITY-FIX.md +0 -103
- package/docs/OPTIMAL_QUALITY_STRATEGY.md +0 -421
- package/docs/OWNER-LICENSE-FIX.md +0 -143
- package/docs/PERFORMANCE_QUICKSTART.md +0 -156
- package/docs/PREFLIGHT_REPORT.md +0 -100
- package/docs/QUALITY_AUTOMATION_ANALYSIS.md +0 -339
- package/docs/REQUIREMENTS.md +0 -148
- package/docs/ROLLOUT-v5.10.0.md +0 -442
- package/docs/SECURITY-AUDIT.md +0 -68
- package/docs/SIMPLE_STRATEGY.md +0 -48
- package/docs/SLA_GATES.md +0 -28
- package/docs/STRIPE-LIVE-MODE-CHECKLIST.md +0 -88
- package/docs/STRIPE-LIVE-MODE-DEPLOYMENT.md +0 -288
- package/docs/TEST-COVERAGE-IMPROVEMENTS.md +0 -18
- package/docs/TESTING_AND_REVIEW_FLOW.md +0 -364
- package/docs/performance/README.md +0 -328
- package/docs/security/SOC2_STARTER.md +0 -29
- package/docs/test-trace-matrix.md +0 -28
- package/marketing/README.md +0 -34
- package/marketing/reference/landing-page.html +0 -615
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
name: Quality Checks
|
|
2
2
|
|
|
3
|
-
#
|
|
4
|
-
# Minimal projects: Only Prettier
|
|
5
|
-
# Bootstrap projects: + ESLint
|
|
6
|
-
# Development projects: + Tests + Security
|
|
7
|
-
# Production-ready: All checks enabled
|
|
3
|
+
# Industry best practice: "Fail fast locally, verify comprehensively remotely"
|
|
8
4
|
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
5
|
+
# Local (pre-commit): Lint + format (staged files) - instant feedback
|
|
6
|
+
# Local (pre-push): Type check + tests (changed files) - catches logic bugs
|
|
7
|
+
# CI (this workflow): Full test suite + E2E + security - comprehensive verification
|
|
8
|
+
#
|
|
9
|
+
# Note: Lint/format NOT duplicated here - pre-commit already did it
|
|
10
|
+
# This avoids redundant work and reduces CI costs
|
|
11
11
|
|
|
12
12
|
on:
|
|
13
13
|
push:
|
|
@@ -86,6 +86,21 @@ jobs:
|
|
|
86
86
|
echo "turbo-prefix=" >> $GITHUB_OUTPUT
|
|
87
87
|
fi
|
|
88
88
|
|
|
89
|
+
- name: Setup pnpm
|
|
90
|
+
if: steps.detect-pm.outputs.manager == 'pnpm'
|
|
91
|
+
uses: pnpm/action-setup@v4
|
|
92
|
+
with:
|
|
93
|
+
version: '8.15.0'
|
|
94
|
+
|
|
95
|
+
- name: Setup Bun
|
|
96
|
+
if: steps.detect-pm.outputs.manager == 'bun'
|
|
97
|
+
uses: oven-sh/setup-bun@v2
|
|
98
|
+
with:
|
|
99
|
+
bun-version: '1.0.0'
|
|
100
|
+
|
|
101
|
+
- name: Install dependencies for maturity detection
|
|
102
|
+
run: ${{ steps.detect-pm.outputs.install-cmd }}
|
|
103
|
+
|
|
89
104
|
- name: Detect Project Maturity
|
|
90
105
|
id: detect
|
|
91
106
|
run: |
|
|
@@ -109,63 +124,12 @@ jobs:
|
|
|
109
124
|
echo "Has documentation: ${{ steps.detect.outputs.has-docs }}"
|
|
110
125
|
echo "Has CSS files: ${{ steps.detect.outputs.has-css }}"
|
|
111
126
|
|
|
112
|
-
#
|
|
113
|
-
#
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
needs: detect-maturity
|
|
117
|
-
|
|
118
|
-
steps:
|
|
119
|
-
- name: Checkout code
|
|
120
|
-
uses: actions/checkout@v5
|
|
121
|
-
|
|
122
|
-
- name: Setup Node.js
|
|
123
|
-
uses: actions/setup-node@v6
|
|
124
|
-
with:
|
|
125
|
-
node-version: '22'
|
|
126
|
-
cache: ${{ needs.detect-maturity.outputs.package-manager }}
|
|
127
|
-
|
|
128
|
-
- name: Install dependencies
|
|
129
|
-
run: ${{ needs.detect-maturity.outputs.install-cmd }}
|
|
130
|
-
|
|
131
|
-
- name: Prettier check
|
|
132
|
-
run: |
|
|
133
|
-
echo "✨ Running Prettier formatting check (required for all projects)"
|
|
134
|
-
npm run format:check
|
|
135
|
-
|
|
136
|
-
# Step 3: Linting - run if source files exist (bootstrap+)
|
|
137
|
-
# Note: Runs on Node 20 only - linting tools are less sensitive to Node version differences
|
|
138
|
-
# Core runtime compatibility is tested via matrix in tests job when enabled
|
|
139
|
-
linting:
|
|
140
|
-
runs-on: ubuntu-latest
|
|
141
|
-
needs: detect-maturity
|
|
142
|
-
if: fromJSON(needs.detect-maturity.outputs.source-count) > 0
|
|
143
|
-
|
|
144
|
-
steps:
|
|
145
|
-
- name: Checkout code
|
|
146
|
-
uses: actions/checkout@v5
|
|
147
|
-
|
|
148
|
-
- name: Setup Node.js
|
|
149
|
-
uses: actions/setup-node@v6
|
|
150
|
-
with:
|
|
151
|
-
node-version: '20'
|
|
152
|
-
cache: ${{ needs.detect-maturity.outputs.package-manager }}
|
|
127
|
+
# Note: Lint/format jobs REMOVED - pre-commit already does this locally
|
|
128
|
+
# This follows industry best practice: "Each layer does unique work"
|
|
129
|
+
# Pre-commit = lint + format on staged files
|
|
130
|
+
# CI = full tests + E2E + security (things that can't be done locally)
|
|
153
131
|
|
|
154
|
-
|
|
155
|
-
run: ${{ needs.detect-maturity.outputs.install-cmd }}
|
|
156
|
-
|
|
157
|
-
- name: ESLint
|
|
158
|
-
run: |
|
|
159
|
-
echo "🔍 Linting ${{ needs.detect-maturity.outputs.source-count }} source files..."
|
|
160
|
-
npx eslint .
|
|
161
|
-
|
|
162
|
-
- name: Stylelint
|
|
163
|
-
if: needs.detect-maturity.outputs.has-css == 'true'
|
|
164
|
-
run: |
|
|
165
|
-
echo "🎨 Linting CSS files..."
|
|
166
|
-
npx stylelint "**/*.{css,scss,sass,less,pcss}" --allow-empty-input
|
|
167
|
-
|
|
168
|
-
# Step 4: Security checks - run if dependencies exist
|
|
132
|
+
# Step 2: Security checks - run if dependencies exist
|
|
169
133
|
#
|
|
170
134
|
# Optional Enhanced Token Configuration:
|
|
171
135
|
# - GITLEAKS_TOKEN: Enhanced GitHub token for gitleaks (fallback: GITHUB_TOKEN)
|
|
@@ -189,6 +153,18 @@ jobs:
|
|
|
189
153
|
node-version: '20'
|
|
190
154
|
cache: ${{ needs.detect-maturity.outputs.package-manager }}
|
|
191
155
|
|
|
156
|
+
- name: Setup pnpm
|
|
157
|
+
if: needs.detect-maturity.outputs.package-manager == 'pnpm'
|
|
158
|
+
uses: pnpm/action-setup@v4
|
|
159
|
+
with:
|
|
160
|
+
version: '8.15.0'
|
|
161
|
+
|
|
162
|
+
- name: Setup Bun
|
|
163
|
+
if: needs.detect-maturity.outputs.package-manager == 'bun'
|
|
164
|
+
uses: oven-sh/setup-bun@v2
|
|
165
|
+
with:
|
|
166
|
+
bun-version: '1.0.0'
|
|
167
|
+
|
|
192
168
|
- name: Install dependencies
|
|
193
169
|
run: ${{ needs.detect-maturity.outputs.install-cmd }}
|
|
194
170
|
|
|
@@ -291,11 +267,14 @@ jobs:
|
|
|
291
267
|
SEMGREP_VERSION: '1.85.0'
|
|
292
268
|
SEMGREP_ENABLE_VERSION_CHECK: 'false'
|
|
293
269
|
|
|
294
|
-
# Step
|
|
270
|
+
# Step 3: Tests - run if test files exist (development+)
|
|
271
|
+
# Smart skip: Draft PRs skip tests (saves CI costs during WIP)
|
|
295
272
|
tests:
|
|
296
273
|
runs-on: ubuntu-latest
|
|
297
274
|
needs: detect-maturity
|
|
298
|
-
if:
|
|
275
|
+
if: |
|
|
276
|
+
fromJSON(needs.detect-maturity.outputs.test-count) > 0 &&
|
|
277
|
+
(github.event.pull_request.draft != true || github.event_name != 'pull_request')
|
|
299
278
|
strategy:
|
|
300
279
|
fail-fast: false
|
|
301
280
|
matrix:
|
|
@@ -311,6 +290,18 @@ jobs:
|
|
|
311
290
|
node-version: ${{ matrix.node-version }}
|
|
312
291
|
cache: ${{ needs.detect-maturity.outputs.package-manager }}
|
|
313
292
|
|
|
293
|
+
- name: Setup pnpm
|
|
294
|
+
if: needs.detect-maturity.outputs.package-manager == 'pnpm'
|
|
295
|
+
uses: pnpm/action-setup@v4
|
|
296
|
+
with:
|
|
297
|
+
version: '8.15.0'
|
|
298
|
+
|
|
299
|
+
- name: Setup Bun
|
|
300
|
+
if: needs.detect-maturity.outputs.package-manager == 'bun'
|
|
301
|
+
uses: oven-sh/setup-bun@v2
|
|
302
|
+
with:
|
|
303
|
+
bun-version: '1.0.0'
|
|
304
|
+
|
|
314
305
|
- name: Install dependencies
|
|
315
306
|
run: |
|
|
316
307
|
echo "⏱️ Performance Budget: Dependency installation must complete within 2 minutes"
|
|
@@ -352,7 +343,7 @@ jobs:
|
|
|
352
343
|
echo "🔐 Running real gitleaks binary verification test..."
|
|
353
344
|
QAA_DEVELOPER=true RUN_REAL_BINARY_TEST=1 node tests/gitleaks-real-binary-test.js
|
|
354
345
|
|
|
355
|
-
# Step
|
|
346
|
+
# Step 4: Documentation - run for production-ready projects
|
|
356
347
|
documentation:
|
|
357
348
|
runs-on: ubuntu-latest
|
|
358
349
|
needs: detect-maturity
|
|
@@ -368,6 +359,18 @@ jobs:
|
|
|
368
359
|
node-version: '20'
|
|
369
360
|
cache: ${{ needs.detect-maturity.outputs.package-manager }}
|
|
370
361
|
|
|
362
|
+
- name: Setup pnpm
|
|
363
|
+
if: needs.detect-maturity.outputs.package-manager == 'pnpm'
|
|
364
|
+
uses: pnpm/action-setup@v4
|
|
365
|
+
with:
|
|
366
|
+
version: '8.15.0'
|
|
367
|
+
|
|
368
|
+
- name: Setup Bun
|
|
369
|
+
if: needs.detect-maturity.outputs.package-manager == 'bun'
|
|
370
|
+
uses: oven-sh/setup-bun@v2
|
|
371
|
+
with:
|
|
372
|
+
bun-version: '1.0.0'
|
|
373
|
+
|
|
371
374
|
- name: Install dependencies
|
|
372
375
|
run: ${{ needs.detect-maturity.outputs.install-cmd }}
|
|
373
376
|
|
|
@@ -438,42 +441,53 @@ jobs:
|
|
|
438
441
|
echo "ℹ️ Not an npm package or no package.json found - skipping package validation"
|
|
439
442
|
fi
|
|
440
443
|
|
|
444
|
+
- name: Detect web app
|
|
445
|
+
id: detect-webapp
|
|
446
|
+
run: |
|
|
447
|
+
# Only run Lighthouse for actual web apps, not CLI tools
|
|
448
|
+
IS_WEBAPP=false
|
|
449
|
+
|
|
450
|
+
# Check for web app indicators
|
|
451
|
+
if [ -f "index.html" ] || [ -f "public/index.html" ] || [ -f "src/index.html" ]; then
|
|
452
|
+
IS_WEBAPP=true
|
|
453
|
+
elif [ -d "dist" ] && [ -f "dist/index.html" ]; then
|
|
454
|
+
IS_WEBAPP=true
|
|
455
|
+
elif grep -q '"start".*"next\|vite\|react-scripts\|serve"' package.json 2>/dev/null; then
|
|
456
|
+
IS_WEBAPP=true
|
|
457
|
+
fi
|
|
458
|
+
|
|
459
|
+
echo "is-webapp=$IS_WEBAPP" >> $GITHUB_OUTPUT
|
|
460
|
+
echo "Web app detected: $IS_WEBAPP"
|
|
461
|
+
|
|
441
462
|
- name: Lighthouse CI
|
|
442
|
-
if: hashFiles('.lighthouserc.js', '.lighthouserc.json', 'lighthouserc.js') != ''
|
|
463
|
+
if: hashFiles('.lighthouserc.js', '.lighthouserc.json', 'lighthouserc.js') != '' && steps.detect-webapp.outputs.is-webapp == 'true'
|
|
443
464
|
id: lighthouse
|
|
444
465
|
run: |
|
|
445
|
-
echo "
|
|
466
|
+
echo "Running Lighthouse CI..."
|
|
446
467
|
npx lhci autorun
|
|
447
468
|
continue-on-error: true
|
|
448
469
|
|
|
449
470
|
- name: Report Lighthouse Failures
|
|
450
471
|
if: steps.lighthouse.outcome == 'failure'
|
|
451
|
-
env:
|
|
452
|
-
MATURITY: ${{ needs.detect-maturity.outputs.maturity }}
|
|
453
472
|
run: |
|
|
454
|
-
echo "::
|
|
473
|
+
echo "::warning::Lighthouse CI failed - performance budgets or quality thresholds violated"
|
|
455
474
|
echo "Review the Lighthouse report to see which metrics failed."
|
|
456
475
|
echo "Common failures: performance score, accessibility issues, SEO problems"
|
|
457
476
|
|
|
458
477
|
# Add to job summary for visibility
|
|
459
|
-
echo "##
|
|
478
|
+
echo "## Lighthouse CI Failed" >> $GITHUB_STEP_SUMMARY
|
|
460
479
|
echo "Performance budgets or quality thresholds were violated." >> $GITHUB_STEP_SUMMARY
|
|
461
|
-
echo "This is currently a soft failure (continue-on-error: true)." >> $GITHUB_STEP_SUMMARY
|
|
462
480
|
echo "Review the Lighthouse report in the Actions logs above." >> $GITHUB_STEP_SUMMARY
|
|
463
481
|
|
|
464
|
-
#
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
exit 1
|
|
468
|
-
fi
|
|
482
|
+
# Soft warning, not hard fail - Lighthouse issues shouldn't block releases
|
|
483
|
+
# Teams can enforce by adding 'error' level assertions in their lighthouserc
|
|
484
|
+
echo "::notice::Lighthouse failures are warnings. Add 'error' assertions in .lighthouserc.js to enforce."
|
|
469
485
|
|
|
470
|
-
# Step
|
|
486
|
+
# Step 5: Summary - report what checks ran
|
|
471
487
|
summary:
|
|
472
488
|
runs-on: ubuntu-latest
|
|
473
489
|
needs:
|
|
474
490
|
- detect-maturity
|
|
475
|
-
- core-checks
|
|
476
|
-
- linting
|
|
477
491
|
- security
|
|
478
492
|
- tests
|
|
479
493
|
- documentation
|
|
@@ -482,8 +496,6 @@ jobs:
|
|
|
482
496
|
steps:
|
|
483
497
|
- name: Generate Check Summary
|
|
484
498
|
env:
|
|
485
|
-
CORE_RESULT: ${{ needs.core-checks.result }}
|
|
486
|
-
LINTING_RESULT: ${{ needs.linting.result }}
|
|
487
499
|
SECURITY_RESULT: ${{ needs.security.result }}
|
|
488
500
|
TESTS_RESULT: ${{ needs.tests.result }}
|
|
489
501
|
DOCS_RESULT: ${{ needs.documentation.result }}
|
|
@@ -499,26 +511,9 @@ jobs:
|
|
|
499
511
|
echo "- Has documentation: ${{ needs.detect-maturity.outputs.has-docs }}" >> $GITHUB_STEP_SUMMARY
|
|
500
512
|
echo "" >> $GITHUB_STEP_SUMMARY
|
|
501
513
|
echo "### Checks Executed" >> $GITHUB_STEP_SUMMARY
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
echo "- ✅ Core checks: Passed" >> $GITHUB_STEP_SUMMARY
|
|
506
|
-
elif [ "$CORE_RESULT" == "failure" ]; then
|
|
507
|
-
echo "- ❌ Core checks: Failed" >> $GITHUB_STEP_SUMMARY
|
|
508
|
-
else
|
|
509
|
-
echo "- ⚠️ Core checks: $CORE_RESULT" >> $GITHUB_STEP_SUMMARY
|
|
510
|
-
fi
|
|
511
|
-
|
|
512
|
-
# Linting
|
|
513
|
-
if [ "$LINTING_RESULT" == "success" ]; then
|
|
514
|
-
echo "- ✅ Linting: Passed" >> $GITHUB_STEP_SUMMARY
|
|
515
|
-
elif [ "$LINTING_RESULT" == "failure" ]; then
|
|
516
|
-
echo "- ❌ Linting: Failed" >> $GITHUB_STEP_SUMMARY
|
|
517
|
-
elif [ "$LINTING_RESULT" == "skipped" ]; then
|
|
518
|
-
echo "- ⏭️ Linting: Skipped (no source files)" >> $GITHUB_STEP_SUMMARY
|
|
519
|
-
else
|
|
520
|
-
echo "- ⚠️ Linting: $LINTING_RESULT" >> $GITHUB_STEP_SUMMARY
|
|
521
|
-
fi
|
|
514
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
515
|
+
echo "Note: Lint/format checks run locally in pre-commit (not duplicated here)" >> $GITHUB_STEP_SUMMARY
|
|
516
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
522
517
|
|
|
523
518
|
# Security
|
|
524
519
|
if [ "$SECURITY_RESULT" == "success" ]; then
|
|
@@ -526,7 +521,7 @@ jobs:
|
|
|
526
521
|
elif [ "$SECURITY_RESULT" == "failure" ]; then
|
|
527
522
|
echo "- ❌ Security: Failed" >> $GITHUB_STEP_SUMMARY
|
|
528
523
|
elif [ "$SECURITY_RESULT" == "skipped" ]; then
|
|
529
|
-
echo "- ⏭️ Security: Skipped (
|
|
524
|
+
echo "- ⏭️ Security: Skipped (runs on schedule/manual trigger)" >> $GITHUB_STEP_SUMMARY
|
|
530
525
|
else
|
|
531
526
|
echo "- ⚠️ Security: $SECURITY_RESULT" >> $GITHUB_STEP_SUMMARY
|
|
532
527
|
fi
|
package/README.md
CHANGED
|
@@ -15,9 +15,9 @@ Quality automation CLI for JavaScript/TypeScript, Python, and shell script proje
|
|
|
15
15
|
## Features
|
|
16
16
|
|
|
17
17
|
- **Prettier Code Formatting** - Consistent code style across your project
|
|
18
|
-
- **Husky Git Hooks** - Pre-commit (lint
|
|
19
|
-
- **lint-staged Processing** - Only process
|
|
20
|
-
- **Pre-push
|
|
18
|
+
- **Husky Git Hooks** - Pre-commit (lint + format) and pre-push (type check + tests)
|
|
19
|
+
- **lint-staged Processing** - Only process staged files for speed
|
|
20
|
+
- **Delta Testing** - Pre-push runs tests on changed files only (fast feedback)
|
|
21
21
|
- **GitHub Actions** - Automated quality checks in CI/CD
|
|
22
22
|
- **TypeScript Smart** - Auto-detects and configures TypeScript projects
|
|
23
23
|
- **Python Support** - Complete Python toolchain with Black, Ruff, isort, mypy, pytest
|
|
@@ -26,7 +26,7 @@ Quality automation CLI for JavaScript/TypeScript, Python, and shell script proje
|
|
|
26
26
|
- **Progressive Quality** - Adaptive checks based on project maturity
|
|
27
27
|
- **Smart Test Strategy** - Risk-based pre-push validation (Pro feature)
|
|
28
28
|
|
|
29
|
-
### Quality Tools
|
|
29
|
+
### Quality Tools
|
|
30
30
|
|
|
31
31
|
- **Lighthouse CI** - Performance, accessibility, SEO audits (Free: basic, Pro: thresholds)
|
|
32
32
|
- **Bundle Size Limits** - Enforce bundle budgets with size-limit (Pro)
|
|
@@ -34,7 +34,7 @@ Quality automation CLI for JavaScript/TypeScript, Python, and shell script proje
|
|
|
34
34
|
- **Conventional Commits** - commitlint with commit-msg hook (Free)
|
|
35
35
|
- **Coverage Thresholds** - Enforce code coverage minimums (Pro)
|
|
36
36
|
|
|
37
|
-
### Pre-Launch Validation
|
|
37
|
+
### Pre-Launch Validation
|
|
38
38
|
|
|
39
39
|
- **SEO Validation** - Sitemap, robots.txt, meta tags validation (Free)
|
|
40
40
|
- **Link Validation** - Broken link detection with linkinator (Free)
|
|
@@ -100,9 +100,42 @@ npx create-qa-architect@latest
|
|
|
100
100
|
| ---------------------------- | ---- | ---- |
|
|
101
101
|
| GitHub Actions cost analyzer | ❌ | ✅ |
|
|
102
102
|
|
|
103
|
+
### Get Pro
|
|
104
|
+
|
|
105
|
+
**Purchase:** [vibebuildlab.com/qa-architect](https://vibebuildlab.com/qa-architect)
|
|
106
|
+
|
|
107
|
+
After purchase, you'll receive a license key via email (QAA-XXXX-XXXX-XXXX-XXXX).
|
|
108
|
+
|
|
109
|
+
**Activate your license:**
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
npx create-qa-architect@latest --activate-license
|
|
113
|
+
# Enter your license key when prompted
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Check license status:**
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
npx create-qa-architect@latest --license-status
|
|
120
|
+
```
|
|
121
|
+
|
|
103
122
|
## Workflow Tiers (GitHub Actions Cost Optimization)
|
|
104
123
|
|
|
105
|
-
qa-architect
|
|
124
|
+
qa-architect follows industry best practice: **"Fail fast locally, verify comprehensively remotely"**
|
|
125
|
+
|
|
126
|
+
### The Testing Pyramid
|
|
127
|
+
|
|
128
|
+
| Layer | Time | What Runs | Why |
|
|
129
|
+
| -------------- | -------- | ---------------------------------- | -------------------------- |
|
|
130
|
+
| **Pre-commit** | < 5s | Lint + format (staged files) | Instant feedback |
|
|
131
|
+
| **Pre-push** | < 30s | Type check + tests (changed files) | Catches bugs before push |
|
|
132
|
+
| **CI** | 3-10 min | Full test suite + security | Comprehensive verification |
|
|
133
|
+
|
|
134
|
+
Note: CI does NOT re-run lint/format (pre-commit already did it). This avoids redundant work and reduces CI costs.
|
|
135
|
+
|
|
136
|
+
### Workflow Tiers (GitHub Actions Cost)
|
|
137
|
+
|
|
138
|
+
qa-architect defaults to **minimal CI** to avoid unexpected GitHub Actions bills. Choose the tier that matches your needs:
|
|
106
139
|
|
|
107
140
|
### Minimal (Default) - $0-5/month
|
|
108
141
|
|
|
@@ -148,6 +181,16 @@ npx create-qa-architect@latest --workflow-standard
|
|
|
148
181
|
npx create-qa-architect@latest --workflow-comprehensive
|
|
149
182
|
```
|
|
150
183
|
|
|
184
|
+
### Matrix Testing for Libraries
|
|
185
|
+
|
|
186
|
+
**Publishing an npm package or CLI tool?** Use `--matrix` to test on multiple Node.js versions:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
npx create-qa-architect@latest --matrix
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
This adds Node.js 20 + 22 matrix testing - recommended for published packages that support multiple runtime versions. Not needed for web apps you deploy (you control the Node version).
|
|
193
|
+
|
|
151
194
|
### Switching Between Tiers
|
|
152
195
|
|
|
153
196
|
Already using qa-architect? Convert to minimal to reduce costs:
|
package/config/defaults.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
'use strict'
|
|
2
|
-
/* eslint-disable security/detect-object-injection */
|
|
3
2
|
|
|
4
3
|
const STYLELINT_EXTENSIONS = ['css', 'scss', 'sass', 'less', 'pcss']
|
|
5
4
|
const DEFAULT_STYLELINT_TARGET = `**/*.{${STYLELINT_EXTENSIONS.join(',')}}`
|
|
@@ -18,6 +17,7 @@ const baseScripts = {
|
|
|
18
17
|
test: 'vitest run --passWithNoTests',
|
|
19
18
|
'test:watch': 'vitest',
|
|
20
19
|
'test:coverage': 'vitest run --coverage',
|
|
20
|
+
'test:changed': 'vitest run --changed HEAD~1 --passWithNoTests',
|
|
21
21
|
'security:audit':
|
|
22
22
|
'[ -f pnpm-lock.yaml ] && pnpm audit --audit-level high || [ -f yarn.lock ] && yarn audit || npm audit --audit-level high',
|
|
23
23
|
'security:secrets':
|
|
@@ -29,7 +29,7 @@ const baseScripts = {
|
|
|
29
29
|
'validate:comprehensive': 'npx create-qa-architect@latest --comprehensive',
|
|
30
30
|
'validate:all': 'npm run validate:comprehensive && npm run security:audit',
|
|
31
31
|
'validate:pre-push':
|
|
32
|
-
'npm run test:patterns --if-present && npm run
|
|
32
|
+
'npm run test:patterns --if-present && npm run test:commands --if-present && npm run test:changed --if-present || npm test --if-present',
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
const normalizeStylelintTargets = stylelintTargets => {
|
|
@@ -3,15 +3,33 @@ name: Python Quality Checks
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
branches: [main, master, develop]
|
|
6
|
+
paths:
|
|
7
|
+
- '**.py'
|
|
8
|
+
- 'pyproject.toml'
|
|
9
|
+
- 'setup.py'
|
|
10
|
+
- 'requirements*.txt'
|
|
11
|
+
- 'poetry.lock'
|
|
12
|
+
- 'Pipfile*'
|
|
6
13
|
pull_request:
|
|
7
14
|
branches: [main, master, develop]
|
|
15
|
+
paths:
|
|
16
|
+
- '**.py'
|
|
17
|
+
- 'pyproject.toml'
|
|
18
|
+
- 'setup.py'
|
|
19
|
+
- 'requirements*.txt'
|
|
20
|
+
- 'poetry.lock'
|
|
21
|
+
- 'Pipfile*'
|
|
22
|
+
|
|
23
|
+
concurrency:
|
|
24
|
+
group: python-${{ github.workflow }}-${{ github.ref }}
|
|
25
|
+
cancel-in-progress: true
|
|
8
26
|
|
|
9
27
|
jobs:
|
|
10
28
|
quality:
|
|
11
29
|
runs-on: ubuntu-latest
|
|
12
30
|
strategy:
|
|
13
31
|
matrix:
|
|
14
|
-
python-version: ['3.
|
|
32
|
+
python-version: ['3.12']
|
|
15
33
|
|
|
16
34
|
steps:
|
|
17
35
|
- name: Checkout code
|
package/config/shell-ci.yml
CHANGED
|
@@ -3,8 +3,20 @@ name: Shell Script CI
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
branches: [main, master, develop]
|
|
6
|
+
paths:
|
|
7
|
+
- '**.sh'
|
|
8
|
+
- '**.bash'
|
|
9
|
+
- '**.bats'
|
|
6
10
|
pull_request:
|
|
7
11
|
branches: [main, master, develop]
|
|
12
|
+
paths:
|
|
13
|
+
- '**.sh'
|
|
14
|
+
- '**.bash'
|
|
15
|
+
- '**.bats'
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: shell-ci-${{ github.workflow }}-${{ github.ref }}
|
|
19
|
+
cancel-in-progress: true
|
|
8
20
|
|
|
9
21
|
jobs:
|
|
10
22
|
shellcheck:
|
package/config/shell-quality.yml
CHANGED
|
@@ -3,8 +3,20 @@ name: Shell Script Quality Checks
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
5
|
branches: [main, master, develop]
|
|
6
|
+
paths:
|
|
7
|
+
- '**.sh'
|
|
8
|
+
- '**.bash'
|
|
9
|
+
- '**.bats'
|
|
6
10
|
pull_request:
|
|
7
11
|
branches: [main, master, develop]
|
|
12
|
+
paths:
|
|
13
|
+
- '**.sh'
|
|
14
|
+
- '**.bash'
|
|
15
|
+
- '**.bats'
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: shell-quality-${{ github.workflow }}-${{ github.ref }}
|
|
19
|
+
cancel-in-progress: true
|
|
8
20
|
|
|
9
21
|
jobs:
|
|
10
22
|
documentation:
|