create-qa-architect 5.0.6 → 5.0.7
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/dependabot-auto-merge.yml +32 -0
- package/LICENSE +3 -3
- package/README.md +8 -14
- package/docs/ARCHITECTURE.md +16 -12
- package/docs/PREFLIGHT_REPORT.md +32 -40
- package/docs/TESTING.md +3 -4
- package/lib/billing-dashboard.html +6 -12
- package/lib/licensing.js +10 -12
- package/lib/validation/config-security.js +4 -0
- package/lib/validation/workflow-validation.js +27 -22
- package/package.json +7 -7
- package/setup.js +8 -3
- package/templates/QUALITY_TROUBLESHOOTING.md +32 -33
- package/templates/scripts/smart-test-strategy.sh +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name: Dependabot Auto-Merge
|
|
2
|
+
|
|
3
|
+
on: pull_request
|
|
4
|
+
|
|
5
|
+
permissions:
|
|
6
|
+
contents: write
|
|
7
|
+
pull-requests: write
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
dependabot:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
if: github.actor == 'dependabot[bot]'
|
|
13
|
+
steps:
|
|
14
|
+
- name: Dependabot metadata
|
|
15
|
+
id: metadata
|
|
16
|
+
uses: dependabot/fetch-metadata@v2
|
|
17
|
+
with:
|
|
18
|
+
github-token: '${{ secrets.GITHUB_TOKEN }}'
|
|
19
|
+
|
|
20
|
+
- name: Enable auto-merge for patch and minor updates
|
|
21
|
+
if: steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor'
|
|
22
|
+
run: gh pr merge --auto --squash "$PR_URL"
|
|
23
|
+
env:
|
|
24
|
+
PR_URL: ${{ github.event.pull_request.html_url }}
|
|
25
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
26
|
+
|
|
27
|
+
- name: Approve PR
|
|
28
|
+
if: steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor'
|
|
29
|
+
run: gh pr review --approve "$PR_URL"
|
|
30
|
+
env:
|
|
31
|
+
PR_URL: ${{ github.event.pull_request.html_url }}
|
|
32
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
package/LICENSE
CHANGED
|
@@ -17,17 +17,17 @@ TERMS OF USE:
|
|
|
17
17
|
- Standard pre-commit hooks
|
|
18
18
|
|
|
19
19
|
2. PAID TIERS
|
|
20
|
-
- Pro: $
|
|
20
|
+
- Pro: $19/month or $190/year
|
|
21
21
|
- Security scanning (Gitleaks + ESLint security)
|
|
22
22
|
- Smart Test Strategy
|
|
23
23
|
- Multi-language support
|
|
24
24
|
- Unlimited repos
|
|
25
|
-
- Team:
|
|
25
|
+
- Team: Contact us (coming soon)
|
|
26
26
|
- All Pro features
|
|
27
27
|
- RBAC and team policies
|
|
28
28
|
- Slack alerts
|
|
29
29
|
- Multi-repo dashboard
|
|
30
|
-
- Enterprise:
|
|
30
|
+
- Enterprise: Contact us (coming soon)
|
|
31
31
|
- All Team features
|
|
32
32
|
- SSO/SAML integration
|
|
33
33
|
- Custom policies
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Quality automation CLI for JavaScript/TypeScript and Python projects. One command adds ESLint, Prettier, Husky, lint-staged, and GitHub Actions. Pro tiers add security scanning (Gitleaks), Smart Test Strategy, and multi-language support.
|
|
4
4
|
|
|
5
|
-
**This repo = the free CLI.** For the Pro dashboard with repo analytics, CI integration, and automation workflows, see [QA Architect Pro](https://vibebuildlab.com/
|
|
5
|
+
**This repo = the free CLI.** For the Pro dashboard with repo analytics, CI integration, and automation workflows, see [QA Architect Pro](https://vibebuildlab.com/qa-architect) (included in VBL Starter Kit).
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -41,12 +41,12 @@ npx create-qa-architect@latest
|
|
|
41
41
|
|
|
42
42
|
## Pricing
|
|
43
43
|
|
|
44
|
-
| Tier | Price
|
|
45
|
-
| -------------- |
|
|
46
|
-
| **Free** | $0
|
|
47
|
-
| **Pro** | $
|
|
48
|
-
| **Team** |
|
|
49
|
-
| **Enterprise** |
|
|
44
|
+
| Tier | Price | What You Get |
|
|
45
|
+
| -------------- | ----------------- | -------------------------------------------------------------------------------------------------- |
|
|
46
|
+
| **Free** | $0 | CLI tool, basic linting/formatting, npm audit (capped: 1 private repo, 50 runs/mo) |
|
|
47
|
+
| **Pro** | $19/mo or $190/yr | **Security scanning (Gitleaks + ESLint security)**, Smart Test Strategy, multi-language, unlimited |
|
|
48
|
+
| **Team** | Contact us | + RBAC, Slack alerts, multi-repo dashboard, team audit log _(coming soon)_ |
|
|
49
|
+
| **Enterprise** | Contact us | + SSO/SAML, custom policies, compliance pack, dedicated TAM _(coming soon)_ |
|
|
50
50
|
|
|
51
51
|
> **Pro included in [VBL Starter Kit](https://vibebuildlab.com/starter-kit)** — Team/Enterprise are standalone purchases.
|
|
52
52
|
|
|
@@ -188,13 +188,7 @@ npm run validate:pre-push # Pre-push validation
|
|
|
188
188
|
|
|
189
189
|
## Roadmap
|
|
190
190
|
|
|
191
|
-
|
|
192
|
-
- [x] Progressive quality (maturity detection)
|
|
193
|
-
- [x] Python toolchain support
|
|
194
|
-
- [x] Smart test strategy (Pro)
|
|
195
|
-
- [x] Monorepo support (Nx, Turborepo, Lerna, Rush, npm/pnpm/yarn workspaces)
|
|
196
|
-
- [ ] Rust and Go support
|
|
197
|
-
- [ ] VS Code extension
|
|
191
|
+
See [ROADMAP.md](ROADMAP.md) for planned features and strategic direction.
|
|
198
192
|
|
|
199
193
|
## Contributing
|
|
200
194
|
|
package/docs/ARCHITECTURE.md
CHANGED
|
@@ -9,18 +9,18 @@ QA Architect is a CLI tool that bootstraps quality automation in JavaScript/Type
|
|
|
9
9
|
```
|
|
10
10
|
create-qa-architect/
|
|
11
11
|
├── setup.js # Main CLI entry point
|
|
12
|
-
├── lib/
|
|
13
|
-
│ ├── smart-strategy-generator.js # Smart test strategy (Pro)
|
|
14
|
-
│ ├── dependency-monitoring-*.js # Dependency monitoring
|
|
15
|
-
│ └── validation/ # Validation utilities
|
|
12
|
+
├── lib/ # Core logic (validation, licensing, maturity, telemetry, dependency monitoring)
|
|
16
13
|
├── templates/ # Project templates
|
|
17
|
-
│ ├──
|
|
18
|
-
│ ├── .
|
|
19
|
-
│ ├──
|
|
20
|
-
│
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
14
|
+
│ ├── ci/ # GitHub Actions + CircleCI/GitLab samples
|
|
15
|
+
│ ├── scripts/ # Helper scripts (smart test strategy, etc.)
|
|
16
|
+
│ ├── integration-tests/# Starter integration tests
|
|
17
|
+
│ ├── test-stubs/ # Unit/E2E placeholders
|
|
18
|
+
│ ├── python/ # Python quality config
|
|
19
|
+
│ └── QUALITY_TROUBLESHOOTING.md
|
|
20
|
+
├── config/ # Defaults and language-specific configs
|
|
21
|
+
│ ├── pyproject.toml
|
|
22
|
+
│ └── quality-python.yml
|
|
23
|
+
└── docs/ # Architecture/testing/SLA/security docs
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
## Data Flow
|
|
@@ -50,4 +50,8 @@ Risk-based pre-push validation that adapts to change context:
|
|
|
50
50
|
- `--deps` - Dependency monitoring only
|
|
51
51
|
- `--security-config` - Security validation
|
|
52
52
|
- `--check-maturity` - Project maturity report
|
|
53
|
-
- `--comprehensive` - Full validation suite
|
|
53
|
+
- `--validate` / `--comprehensive` - Full validation suite
|
|
54
|
+
- `--validate-docs` - Documentation validation only
|
|
55
|
+
- `--validate-config` - Validate `.qualityrc.json`
|
|
56
|
+
- `--alerts-slack` / `--pr-comments` - Collaboration hooks
|
|
57
|
+
- `--license-status` - Show current tier/features
|
package/docs/PREFLIGHT_REPORT.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Preflight Review: QA Architect (create-qa-architect)
|
|
2
2
|
|
|
3
3
|
**Depth**: standard
|
|
4
|
-
**Date**: 2025-12-
|
|
5
|
-
**Version**: 5.0.
|
|
4
|
+
**Date**: 2025-12-13
|
|
5
|
+
**Version**: 5.0.7
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## Overall Status: ✅ PASS
|
|
9
|
+
## Overall Status: ✅ PASS (prerelease suite)
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Prerelease (`npm run prerelease`) executed for 5.0.7, including docs check, command patterns, full test suite, command tests, and e2e package validation.
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
@@ -22,44 +22,44 @@ All critical launch blockers pass. Minor issues documented below are acceptable
|
|
|
22
22
|
|
|
23
23
|
## Important Issues (P1) - Should Fix
|
|
24
24
|
|
|
25
|
-
| Issue | Category | Location | Recommendation
|
|
26
|
-
| ------------------------ | -------- | ---------------- |
|
|
27
|
-
| Gitleaks false positives | Security | tests/\*.test.js | Test fixtures use fake API key patterns (QAA-XXXX format);
|
|
28
|
-
|
|
|
25
|
+
| Issue | Category | Location | Recommendation |
|
|
26
|
+
| ------------------------ | -------- | ---------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
27
|
+
| Gitleaks false positives | Security | tests/\*.test.js | Test fixtures use fake API key patterns (QAA-XXXX format); consider a scoped `.gitleaksignore` for fixtures. |
|
|
28
|
+
| Publish verification | Release | package.json | Confirm npm shows 5.0.7 after publishing; update if propagation is pending. |
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
32
32
|
## P0 Functional Checks
|
|
33
33
|
|
|
34
|
-
| Check | Status | Notes
|
|
35
|
-
| ----------------- | ------ |
|
|
36
|
-
| All tests passing | ✅ |
|
|
37
|
-
| npm audit |
|
|
38
|
-
| ESLint |
|
|
39
|
-
| Build/validation | ✅ |
|
|
34
|
+
| Check | Status | Notes |
|
|
35
|
+
| ----------------- | ------ | ------------------------------------------------------------------ |
|
|
36
|
+
| All tests passing | ✅ | `npm run prerelease` (includes full test suite) |
|
|
37
|
+
| npm audit | ⚠️ | Not run in prerelease; run `npm run security:audit` before publish |
|
|
38
|
+
| ESLint | ⚠️ | Not run in prerelease; run `npm run lint` if desired |
|
|
39
|
+
| Build/validation | ✅ | Covered via prerelease command + e2e package test |
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
43
43
|
## P0 Security Checks
|
|
44
44
|
|
|
45
|
-
| Check | Status | Notes
|
|
46
|
-
| ------------------------- | ------ |
|
|
47
|
-
| npm audit (high/critical) |
|
|
48
|
-
| Hardcoded secrets scan | ⚠️ |
|
|
49
|
-
| No production secrets | ✅ | No `.env` files, no real API keys
|
|
45
|
+
| Check | Status | Notes |
|
|
46
|
+
| ------------------------- | ------ | ------------------------------------------------------------------------------------- |
|
|
47
|
+
| npm audit (high/critical) | ⚠️ | Not run in prerelease; run `npm run security:audit` |
|
|
48
|
+
| Hardcoded secrets scan | ⚠️ | Re-run gitleaks/`npm run security:secrets`; expect fixture false positives (QAA-XXXX) |
|
|
49
|
+
| No production secrets | ✅ | No `.env` files, no real API keys committed |
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
53
53
|
## Product Packaging
|
|
54
54
|
|
|
55
|
-
| Item | Status | Notes
|
|
56
|
-
| ------------ | ------ |
|
|
57
|
-
| CHANGELOG.md | ✅ | Present
|
|
58
|
-
| LICENSE | ✅ | Present
|
|
59
|
-
| README.md | ✅ | Present
|
|
60
|
-
| .env.example | N/A | Not needed for CLI tool
|
|
61
|
-
| Version tags |
|
|
62
|
-
| Git status |
|
|
55
|
+
| Item | Status | Notes |
|
|
56
|
+
| ------------ | ------ | ------------------------------ |
|
|
57
|
+
| CHANGELOG.md | ✅ | Present |
|
|
58
|
+
| LICENSE | ✅ | Present |
|
|
59
|
+
| README.md | ✅ | Present |
|
|
60
|
+
| .env.example | N/A | Not needed for CLI tool |
|
|
61
|
+
| Version tags | ⚠️ | Confirm v5.0.7 tag pushed |
|
|
62
|
+
| Git status | ⚠️ | Verify clean before publishing |
|
|
63
63
|
|
|
64
64
|
---
|
|
65
65
|
|
|
@@ -87,22 +87,14 @@ All critical launch blockers pass. Minor issues documented below are acceptable
|
|
|
87
87
|
|
|
88
88
|
## Next Steps
|
|
89
89
|
|
|
90
|
-
1.
|
|
91
|
-
2.
|
|
92
|
-
3.
|
|
90
|
+
1. Run `npm run security:audit` (and optional gitleaks scan) before publish
|
|
91
|
+
2. Confirm npm publish and tag for 5.0.7 are visible on npm/GitHub
|
|
92
|
+
3. Add `.gitleaksignore` scoped to test fixtures if false positives remain
|
|
93
93
|
|
|
94
94
|
---
|
|
95
95
|
|
|
96
96
|
## Recommendation
|
|
97
97
|
|
|
98
|
-
**✅
|
|
98
|
+
**✅ Cleared for launch (5.0.7)**
|
|
99
99
|
|
|
100
|
-
This
|
|
101
|
-
|
|
102
|
-
- Tests passing
|
|
103
|
-
- No security vulnerabilities
|
|
104
|
-
- No real secrets
|
|
105
|
-
- Clean git state
|
|
106
|
-
- Proper versioning and packaging
|
|
107
|
-
|
|
108
|
-
The gitleaks findings are false positives on intentional test fixtures using fake license key formats.
|
|
100
|
+
Prerelease suite passed for 5.0.7. Run `npm run security:audit`, confirm publish/tag visibility, and handle fixture gitleaks ignores if needed; then proceed with release comms. This remains an npm CLI package (no web surface), so focus stays on docs/CI/security validation.
|
package/docs/TESTING.md
CHANGED
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
QA Architect uses
|
|
5
|
+
QA Architect uses plain Node-based test runners (no Jest) with a heavy focus on integration tests that validate real CLI workflows end to end.
|
|
6
6
|
|
|
7
7
|
## Running Tests
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
npm test # Run all tests
|
|
11
|
-
npm run test:coverage # Run with coverage report
|
|
12
|
-
npm run test:watch # Watch mode for development
|
|
10
|
+
npm test # Run all tests (sequential Node scripts)
|
|
11
|
+
npm run test:coverage # Run with coverage report via c8
|
|
13
12
|
```
|
|
14
13
|
|
|
15
14
|
## Test Structure
|
|
@@ -311,9 +311,9 @@
|
|
|
311
311
|
onclick="selectTier('pro')"
|
|
312
312
|
>
|
|
313
313
|
<div class="tier-name">Pro</div>
|
|
314
|
-
<div class="tier-price">$
|
|
314
|
+
<div class="tier-price">$19<span class="period">/month</span></div>
|
|
315
315
|
<div style="color: #22c55e; font-size: 0.9rem">
|
|
316
|
-
or $
|
|
316
|
+
or $190/year (save $38)
|
|
317
317
|
</div>
|
|
318
318
|
|
|
319
319
|
<ul class="tier-features">
|
|
@@ -329,12 +329,8 @@
|
|
|
329
329
|
<!-- Team Tier -->
|
|
330
330
|
<div class="tier-card" data-tier="team" onclick="selectTier('team')">
|
|
331
331
|
<div class="tier-name">Team</div>
|
|
332
|
-
<div class="tier-price">
|
|
333
|
-
|
|
334
|
-
</div>
|
|
335
|
-
<div style="color: #666; font-size: 0.9rem">
|
|
336
|
-
5-seat minimum ($75/mo)
|
|
337
|
-
</div>
|
|
332
|
+
<div class="tier-price">Contact us</div>
|
|
333
|
+
<div style="color: #666; font-size: 0.9rem">Coming soon</div>
|
|
338
334
|
|
|
339
335
|
<ul class="tier-features">
|
|
340
336
|
<li>All PRO features included</li>
|
|
@@ -353,10 +349,8 @@
|
|
|
353
349
|
onclick="selectTier('enterprise')"
|
|
354
350
|
>
|
|
355
351
|
<div class="tier-name">Enterprise</div>
|
|
356
|
-
<div class="tier-price"
|
|
357
|
-
<div style="color: #666; font-size: 0.9rem">
|
|
358
|
-
annual + $499 onboarding
|
|
359
|
-
</div>
|
|
352
|
+
<div class="tier-price">Contact us</div>
|
|
353
|
+
<div style="color: #666; font-size: 0.9rem">Coming soon</div>
|
|
360
354
|
|
|
361
355
|
<ul class="tier-features">
|
|
362
356
|
<li>All TEAM features included</li>
|
package/lib/licensing.js
CHANGED
|
@@ -36,11 +36,11 @@ Object.defineProperty(exports, 'LICENSE_FILE', {
|
|
|
36
36
|
* Standardized to use SCREAMING_SNAKE_CASE for both keys and values
|
|
37
37
|
* for consistency with ErrorCategory and other enums in the codebase.
|
|
38
38
|
*
|
|
39
|
-
* Pricing
|
|
39
|
+
* Pricing:
|
|
40
40
|
* - FREE: $0 (Hobby/OSS - capped)
|
|
41
|
-
* - PRO: $
|
|
42
|
-
* - TEAM:
|
|
43
|
-
* - ENTERPRISE:
|
|
41
|
+
* - PRO: $19/mo or $190/yr (Solo Devs/Small Teams)
|
|
42
|
+
* - TEAM: Contact us (Organizations) - coming soon
|
|
43
|
+
* - ENTERPRISE: Contact us (Large Orgs) - coming soon
|
|
44
44
|
*/
|
|
45
45
|
const LICENSE_TIERS = {
|
|
46
46
|
FREE: 'FREE',
|
|
@@ -384,7 +384,7 @@ function showUpgradeMessage(feature) {
|
|
|
384
384
|
if (license.tier === LICENSE_TIERS.FREE) {
|
|
385
385
|
console.log('\n🚀 Upgrade to PRO')
|
|
386
386
|
console.log('')
|
|
387
|
-
console.log(' 💰 $
|
|
387
|
+
console.log(' 💰 $19/month or $190/year (save $38)')
|
|
388
388
|
console.log('')
|
|
389
389
|
console.log(' ✅ Unlimited repos, LOC, and runs')
|
|
390
390
|
console.log(' ✅ Smart Test Strategy (70% faster pre-push)')
|
|
@@ -396,16 +396,14 @@ function showUpgradeMessage(feature) {
|
|
|
396
396
|
console.log('')
|
|
397
397
|
console.log(' 🎁 Start 14-day free trial - no credit card required')
|
|
398
398
|
console.log('')
|
|
399
|
-
console.log('🚀 Upgrade: https://vibebuildlab.com/
|
|
399
|
+
console.log('🚀 Upgrade: https://vibebuildlab.com/qa-architect')
|
|
400
400
|
console.log(
|
|
401
401
|
'🔑 Activate: npx create-qa-architect@latest --activate-license'
|
|
402
402
|
)
|
|
403
403
|
} else if (license.tier === LICENSE_TIERS.PRO) {
|
|
404
404
|
console.log('\n👥 Upgrade to TEAM')
|
|
405
405
|
console.log('')
|
|
406
|
-
console.log(
|
|
407
|
-
' 💰 $15/user/month (5-seat min) or $150/user/year (save $30/user)'
|
|
408
|
-
)
|
|
406
|
+
console.log(' 💰 Contact us for Team pricing')
|
|
409
407
|
console.log('')
|
|
410
408
|
console.log(' ✅ All PRO features included')
|
|
411
409
|
console.log(' ✅ Per-seat licensing for your org')
|
|
@@ -414,9 +412,9 @@ function showUpgradeMessage(feature) {
|
|
|
414
412
|
console.log(' ✅ Slack/email alerts for failures')
|
|
415
413
|
console.log(' ✅ Priority support (business hours)')
|
|
416
414
|
console.log('')
|
|
417
|
-
console.log('👥 Upgrade: https://vibebuildlab.com/
|
|
415
|
+
console.log('👥 Upgrade: https://vibebuildlab.com/qa-architect')
|
|
418
416
|
} else if (license.tier === LICENSE_TIERS.TEAM) {
|
|
419
|
-
console.log('\n🏢 Upgrade to ENTERPRISE -
|
|
417
|
+
console.log('\n🏢 Upgrade to ENTERPRISE - Contact us for pricing')
|
|
420
418
|
console.log('')
|
|
421
419
|
console.log(' ✅ All TEAM features included')
|
|
422
420
|
console.log(' ✅ SSO/SAML integration')
|
|
@@ -958,7 +956,7 @@ function showLicenseStatus() {
|
|
|
958
956
|
// Show upgrade path
|
|
959
957
|
if (license.tier === LICENSE_TIERS.FREE) {
|
|
960
958
|
console.log('\n💡 Upgrade to PRO for unlimited access + security scanning')
|
|
961
|
-
console.log(' → https://vibebuildlab.com/
|
|
959
|
+
console.log(' → https://vibebuildlab.com/qa-architect')
|
|
962
960
|
}
|
|
963
961
|
}
|
|
964
962
|
|
|
@@ -15,6 +15,8 @@ const GITLEAKS_VERSION = '8.28.0'
|
|
|
15
15
|
const GITLEAKS_CHECKSUMS = {
|
|
16
16
|
'linux-x64':
|
|
17
17
|
'5fd1b3b0073269484d40078662e921d07427340ab9e6ed526ccd215a565b3298',
|
|
18
|
+
'linux-arm64':
|
|
19
|
+
'3770c7ebeb625e3e96c183525ca18285a01aedef2d75a2c41ceb3e141af2e8b7',
|
|
18
20
|
'darwin-x64':
|
|
19
21
|
'cf09ad7a85683d90221db8324f036f23c8c29107145e1fc4a0dffbfa9e89c09a',
|
|
20
22
|
'darwin-arm64':
|
|
@@ -200,6 +202,7 @@ class ConfigSecurityScanner {
|
|
|
200
202
|
'darwin-x64': 'darwin_x64',
|
|
201
203
|
'darwin-arm64': 'darwin_arm64',
|
|
202
204
|
'linux-x64': 'linux_x64',
|
|
205
|
+
'linux-arm64': 'linux_arm64',
|
|
203
206
|
'win32-x64': 'windows_x64',
|
|
204
207
|
}
|
|
205
208
|
|
|
@@ -350,6 +353,7 @@ class ConfigSecurityScanner {
|
|
|
350
353
|
timeout: 60000, // 60 second timeout for audit operations
|
|
351
354
|
encoding: 'utf8',
|
|
352
355
|
})
|
|
356
|
+
spinner.succeed('npm audit completed - no high/critical vulnerabilities')
|
|
353
357
|
} catch (error) {
|
|
354
358
|
if (error.signal === 'SIGTERM') {
|
|
355
359
|
// Timeout occurred
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
const fs = require('fs')
|
|
4
4
|
const path = require('path')
|
|
5
|
-
const { execSync } = require('child_process')
|
|
6
5
|
const { showProgress } = require('../ui-helpers')
|
|
7
6
|
|
|
8
7
|
/**
|
|
@@ -85,32 +84,38 @@ class WorkflowValidator {
|
|
|
85
84
|
const spinner = showProgress('Running actionlint on workflow files...')
|
|
86
85
|
|
|
87
86
|
try {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
87
|
+
const { createLinter } = require('actionlint')
|
|
88
|
+
const workflowFiles = fs
|
|
89
|
+
.readdirSync(workflowDir)
|
|
90
|
+
.filter(file => file.endsWith('.yml') || file.endsWith('.yaml'))
|
|
91
|
+
|
|
92
|
+
const linter = await createLinter()
|
|
93
|
+
let issueCount = 0
|
|
94
|
+
|
|
95
|
+
for (const file of workflowFiles) {
|
|
96
|
+
const filePath = path.join(workflowDir, file)
|
|
97
|
+
const content = fs.readFileSync(filePath, 'utf8')
|
|
98
|
+
const results = linter(content, filePath) || []
|
|
99
|
+
|
|
100
|
+
if (Array.isArray(results) && results.length > 0) {
|
|
101
|
+
issueCount += results.length
|
|
102
|
+
results.forEach(result => {
|
|
103
|
+
this.issues.push(
|
|
104
|
+
`actionlint: ${result.file}:${result.line}:${result.column} ${result.kind} - ${result.message}`
|
|
105
|
+
)
|
|
107
106
|
})
|
|
108
|
-
} else {
|
|
109
|
-
spinner.succeed('actionlint validation passed')
|
|
110
107
|
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (issueCount > 0) {
|
|
111
|
+
spinner.fail(`actionlint found ${issueCount} issue(s)`)
|
|
111
112
|
} else {
|
|
112
113
|
spinner.succeed('actionlint validation passed')
|
|
113
114
|
}
|
|
115
|
+
} catch (error) {
|
|
116
|
+
spinner.fail('actionlint failed to run')
|
|
117
|
+
const reason = error?.message || 'Unknown error'
|
|
118
|
+
this.issues.push(`actionlint: Failed to run - ${reason}`)
|
|
114
119
|
}
|
|
115
120
|
}
|
|
116
121
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-qa-architect",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.7",
|
|
4
4
|
"description": "QA Architect - Bootstrap quality automation for JavaScript/TypeScript and Python projects with GitHub Actions, pre-commit hooks, linting, formatting, and smart test strategy",
|
|
5
5
|
"main": "setup.js",
|
|
6
6
|
"bin": {
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"bugs": {
|
|
92
92
|
"url": "https://github.com/vibebuildlab/qa-architect/issues"
|
|
93
93
|
},
|
|
94
|
-
"homepage": "https://vibebuildlab.com/
|
|
94
|
+
"homepage": "https://vibebuildlab.com/qa-architect",
|
|
95
95
|
"engines": {
|
|
96
96
|
"node": ">=20"
|
|
97
97
|
},
|
|
@@ -110,13 +110,13 @@
|
|
|
110
110
|
"actionlint": "^2.0.6",
|
|
111
111
|
"typescript": "^5",
|
|
112
112
|
"c8": "^10.1.2",
|
|
113
|
-
"eslint": "^9.
|
|
113
|
+
"eslint": "^9.39.2",
|
|
114
114
|
"eslint-plugin-security": "^3.0.1",
|
|
115
115
|
"globals": "^15.9.0",
|
|
116
116
|
"husky": "^9.1.4",
|
|
117
117
|
"lint-staged": "^15.2.10",
|
|
118
|
-
"prettier": "^3.
|
|
119
|
-
"stylelint": "^16.
|
|
118
|
+
"prettier": "^3.7.4",
|
|
119
|
+
"stylelint": "^16.26.1",
|
|
120
120
|
"stylelint-config-standard": "^37.0.0"
|
|
121
121
|
},
|
|
122
122
|
"volta": {
|
|
@@ -159,11 +159,11 @@
|
|
|
159
159
|
]
|
|
160
160
|
},
|
|
161
161
|
"dependencies": {
|
|
162
|
-
"@npmcli/package-json": "^7.0.
|
|
162
|
+
"@npmcli/package-json": "^7.0.4",
|
|
163
163
|
"ajv": "^8.17.1",
|
|
164
164
|
"ajv-formats": "^3.0.1",
|
|
165
165
|
"js-yaml": "^4.1.0",
|
|
166
|
-
"markdownlint-cli2": "^0.
|
|
166
|
+
"markdownlint-cli2": "^0.20.0",
|
|
167
167
|
"ora": "^8.1.1",
|
|
168
168
|
"tar": "^7.4.3"
|
|
169
169
|
}
|
package/setup.js
CHANGED
|
@@ -355,6 +355,7 @@ function parseArguments(rawArgs) {
|
|
|
355
355
|
const disableActionlint = sanitizedArgs.includes('--no-actionlint')
|
|
356
356
|
const disableMarkdownlint = sanitizedArgs.includes('--no-markdownlint')
|
|
357
357
|
const disableEslintSecurity = sanitizedArgs.includes('--no-eslint-security')
|
|
358
|
+
const allowLatestGitleaks = sanitizedArgs.includes('--allow-latest-gitleaks')
|
|
358
359
|
|
|
359
360
|
return {
|
|
360
361
|
sanitizedArgs,
|
|
@@ -381,6 +382,7 @@ function parseArguments(rawArgs) {
|
|
|
381
382
|
disableActionlint,
|
|
382
383
|
disableMarkdownlint,
|
|
383
384
|
disableEslintSecurity,
|
|
385
|
+
allowLatestGitleaks,
|
|
384
386
|
}
|
|
385
387
|
}
|
|
386
388
|
|
|
@@ -418,6 +420,7 @@ function parseArguments(rawArgs) {
|
|
|
418
420
|
disableActionlint,
|
|
419
421
|
disableMarkdownlint,
|
|
420
422
|
disableEslintSecurity,
|
|
423
|
+
allowLatestGitleaks,
|
|
421
424
|
} = parsedConfig
|
|
422
425
|
|
|
423
426
|
// Initialize telemetry session (opt-in only, fails silently)
|
|
@@ -490,6 +493,7 @@ function parseArguments(rawArgs) {
|
|
|
490
493
|
disableActionlint,
|
|
491
494
|
disableMarkdownlint,
|
|
492
495
|
disableEslintSecurity,
|
|
496
|
+
allowLatestGitleaks,
|
|
493
497
|
} = parsedConfig)
|
|
494
498
|
|
|
495
499
|
console.log('📋 Configuration after interactive selections applied\n')
|
|
@@ -652,6 +656,7 @@ HELP:
|
|
|
652
656
|
disableActionlint,
|
|
653
657
|
disableMarkdownlint,
|
|
654
658
|
disableEslintSecurity,
|
|
659
|
+
allowLatestGitleaks,
|
|
655
660
|
}
|
|
656
661
|
const validator = new ValidationRunner(validationOptions)
|
|
657
662
|
|
|
@@ -741,7 +746,7 @@ HELP:
|
|
|
741
746
|
if (!capCheck.allowed) {
|
|
742
747
|
console.error(`❌ ${capCheck.reason}`)
|
|
743
748
|
console.error(
|
|
744
|
-
' Upgrade to Pro, Team, or Enterprise for unlimited runs: https://vibebuildlab.com/
|
|
749
|
+
' Upgrade to Pro, Team, or Enterprise for unlimited runs: https://vibebuildlab.com/qa-architect'
|
|
745
750
|
)
|
|
746
751
|
process.exit(1)
|
|
747
752
|
}
|
|
@@ -1027,7 +1032,7 @@ HELP:
|
|
|
1027
1032
|
if (!repoCheck.allowed) {
|
|
1028
1033
|
console.error(`\n❌ ${repoCheck.reason}`)
|
|
1029
1034
|
console.error(
|
|
1030
|
-
' Upgrade to Pro for unlimited repos: https://vibebuildlab.com/
|
|
1035
|
+
' Upgrade to Pro for unlimited repos: https://vibebuildlab.com/qa-architect'
|
|
1031
1036
|
)
|
|
1032
1037
|
process.exit(1)
|
|
1033
1038
|
}
|
|
@@ -1714,7 +1719,7 @@ try {
|
|
|
1714
1719
|
const CAP = 50
|
|
1715
1720
|
if (usage.prePushRuns >= CAP) {
|
|
1716
1721
|
console.error('❌ Free tier limit reached: ' + usage.prePushRuns + '/' + CAP + ' pre-push runs this month')
|
|
1717
|
-
console.error(' Upgrade to Pro, Team, or Enterprise: https://vibebuildlab.com/
|
|
1722
|
+
console.error(' Upgrade to Pro, Team, or Enterprise: https://vibebuildlab.com/qa-architect')
|
|
1718
1723
|
process.exit(1)
|
|
1719
1724
|
}
|
|
1720
1725
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
13
|
# Check if tests are TypeScript validated
|
|
14
|
-
npm run type-check:tests
|
|
14
|
+
npm run type-check:tests || npx tsc --noEmit --project tests/tsconfig.json
|
|
15
15
|
|
|
16
16
|
# If command doesn't exist, add to package.json:
|
|
17
17
|
{
|
|
@@ -29,13 +29,13 @@ npm run type-check:tests
|
|
|
29
29
|
"compilerOptions": {
|
|
30
30
|
"rootDir": "..",
|
|
31
31
|
"noEmit": true,
|
|
32
|
-
"types": ["
|
|
32
|
+
"types": ["node"] // add your test runner types (jest/vitest) if used
|
|
33
33
|
},
|
|
34
34
|
"include": ["../src/**/*", "../tests/**/*"]
|
|
35
35
|
}
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
**Prevention**: Run `npm run
|
|
38
|
+
**Prevention**: Run `npm run lint && npm test` (or `npm run validate:pre-push` if available) before commits
|
|
39
39
|
|
|
40
40
|
### Pre-commit Hooks Too Narrow
|
|
41
41
|
|
|
@@ -47,7 +47,8 @@ npm run type-check:tests
|
|
|
47
47
|
cat .husky/pre-commit
|
|
48
48
|
|
|
49
49
|
# Should run comprehensive checks:
|
|
50
|
-
npx lint-staged && npm run
|
|
50
|
+
npx lint-staged && npm run lint && npm test
|
|
51
|
+
# If your project has TypeScript, add: npm run type-check || npm run type-check:all
|
|
51
52
|
```
|
|
52
53
|
|
|
53
54
|
**Fix**: Enhance `.husky/pre-commit`:
|
|
@@ -55,8 +56,9 @@ npx lint-staged && npm run type-check:all && npm test
|
|
|
55
56
|
```bash
|
|
56
57
|
#!/usr/bin/env sh
|
|
57
58
|
npx lint-staged
|
|
58
|
-
npm run
|
|
59
|
-
npm
|
|
59
|
+
npm run lint
|
|
60
|
+
npm test
|
|
61
|
+
# Optional: npm run type-check || npm run type-check:all
|
|
60
62
|
```
|
|
61
63
|
|
|
62
64
|
## 🔍 Diagnostic Commands
|
|
@@ -64,15 +66,15 @@ npm run test:fast
|
|
|
64
66
|
### Quick Health Check
|
|
65
67
|
|
|
66
68
|
```bash
|
|
67
|
-
# Run
|
|
68
|
-
npm run
|
|
69
|
-
|
|
70
|
-
# If this fails, debug individual components:
|
|
71
|
-
npm run type-check:all # TypeScript issues
|
|
72
|
-
npm run lint # ESLint issues
|
|
73
|
-
npm run format:check # Prettier issues
|
|
69
|
+
# Run core quality gates (should complete without errors)
|
|
70
|
+
npm run lint # ESLint/Stylelint
|
|
71
|
+
npm run format:check # Prettier
|
|
74
72
|
npm test # Test failures
|
|
75
73
|
npm run security:audit # Security vulnerabilities
|
|
74
|
+
|
|
75
|
+
# If you use TypeScript:
|
|
76
|
+
npm run type-check || npx tsc --noEmit
|
|
77
|
+
npm run type-check:all # when defined to cover src + tests
|
|
76
78
|
```
|
|
77
79
|
|
|
78
80
|
### TypeScript Troubleshooting
|
|
@@ -89,7 +91,7 @@ npx tsc --noEmit path/to/file.ts
|
|
|
89
91
|
|
|
90
92
|
# Common issues:
|
|
91
93
|
# 1. Missing type definitions: npm install --save-dev @types/package-name
|
|
92
|
-
# 2. Test globals: Add
|
|
94
|
+
# 2. Test globals: Add your test runner types (e.g., jest or vitest) to tsconfig
|
|
93
95
|
# 3. Node types: Add "node" to types array
|
|
94
96
|
```
|
|
95
97
|
|
|
@@ -99,10 +101,12 @@ npx tsc --noEmit path/to/file.ts
|
|
|
99
101
|
# Run tests with verbose output
|
|
100
102
|
npm test -- --reporter=verbose
|
|
101
103
|
|
|
102
|
-
# Run specific test file
|
|
103
|
-
|
|
104
|
+
# Run specific test file (Node-based runner)
|
|
105
|
+
node path/to/test.test.js
|
|
104
106
|
|
|
105
|
-
# Debug integration tests
|
|
107
|
+
# Debug integration tests (when scripts exist)
|
|
108
|
+
DEBUG=* npm test
|
|
109
|
+
# or
|
|
106
110
|
DEBUG=* npm run test:integration
|
|
107
111
|
|
|
108
112
|
# Common issues:
|
|
@@ -135,10 +139,10 @@ npx eslint . --ext .js,.ts --config eslint-security.config.js
|
|
|
135
139
|
|
|
136
140
|
```bash
|
|
137
141
|
# Database connection tests
|
|
138
|
-
npm run test:integration
|
|
142
|
+
npm run test:integration # if defined; otherwise run npm test
|
|
139
143
|
|
|
140
144
|
# API endpoint tests
|
|
141
|
-
npm run test:e2e
|
|
145
|
+
npm run test:e2e # if defined
|
|
142
146
|
|
|
143
147
|
# Common issues:
|
|
144
148
|
# 1. Database not running: docker-compose up db
|
|
@@ -150,13 +154,13 @@ npm run test:e2e
|
|
|
150
154
|
|
|
151
155
|
```bash
|
|
152
156
|
# Component integration tests
|
|
153
|
-
npm run test:component
|
|
157
|
+
npm run test:component # if defined
|
|
154
158
|
|
|
155
159
|
# Browser E2E tests
|
|
156
|
-
npm run test:e2e
|
|
160
|
+
npm run test:e2e # if defined
|
|
157
161
|
|
|
158
162
|
# Accessibility checks
|
|
159
|
-
npm run accessibility:check
|
|
163
|
+
npm run accessibility:check # if defined
|
|
160
164
|
|
|
161
165
|
# Common issues:
|
|
162
166
|
# 1. Build process: npm run build && npm run test:e2e
|
|
@@ -187,7 +191,7 @@ npm run type-check && tsc --noEmit --skipLibCheck
|
|
|
187
191
|
# Profile test performance
|
|
188
192
|
npm test -- --reporter=verbose --logHeapUsage
|
|
189
193
|
|
|
190
|
-
# Run only fast tests for development
|
|
194
|
+
# Run only fast tests for development (if defined)
|
|
191
195
|
npm run test:fast
|
|
192
196
|
|
|
193
197
|
# Optimize strategies:
|
|
@@ -316,14 +320,9 @@ npm audit --package=package-name
|
|
|
316
320
|
# Generate coverage report
|
|
317
321
|
npm run test:coverage
|
|
318
322
|
|
|
319
|
-
# Check coverage thresholds
|
|
320
|
-
npx vitest run --coverage --reporter=verbose
|
|
321
|
-
|
|
322
323
|
# Common targets:
|
|
323
|
-
# - Lines:
|
|
324
|
-
# -
|
|
325
|
-
# - Branches: >70%
|
|
326
|
-
# - Statements: >80%
|
|
324
|
+
# - Lines/Statements/Functions/Branches: >=75% overall
|
|
325
|
+
# - Critical files (e.g., setup.js): >=80%
|
|
327
326
|
```
|
|
328
327
|
|
|
329
328
|
### Code Quality Metrics
|
|
@@ -382,7 +381,6 @@ npm run type-check:all # Should pass
|
|
|
382
381
|
|
|
383
382
|
- [ESLint Troubleshooting](https://eslint.org/docs/user-guide/troubleshooting)
|
|
384
383
|
- [TypeScript Handbook](https://www.typescriptlang.org/docs/)
|
|
385
|
-
- [Vitest Documentation](https://vitest.dev/guide/)
|
|
386
384
|
- [Playwright Debugging](https://playwright.dev/docs/debug)
|
|
387
385
|
|
|
388
386
|
### Debug Environment Setup
|
|
@@ -392,10 +390,11 @@ npm run type-check:all # Should pass
|
|
|
392
390
|
export DEBUG=quality-automation:*
|
|
393
391
|
|
|
394
392
|
# Run with verbose output
|
|
395
|
-
npm run
|
|
393
|
+
npm run lint -- --max-warnings=0
|
|
394
|
+
npm test -- --reporter=verbose
|
|
396
395
|
|
|
397
396
|
# Generate debug report
|
|
398
|
-
npm run validate:
|
|
397
|
+
npm run validate:pre-push > debug-report.txt 2>&1
|
|
399
398
|
```
|
|
400
399
|
|
|
401
400
|
---
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
# Smart Test Strategy - {{PROJECT_NAME}}
|
|
3
3
|
# Generated by create-qa-architect (Pro/Team/Enterprise feature)
|
|
4
|
-
# https://vibebuildlab.com/
|
|
4
|
+
# https://vibebuildlab.com/qa-architect
|
|
5
5
|
set -e
|
|
6
6
|
|
|
7
7
|
echo "🧠 Analyzing changes for optimal test strategy..."
|