superkit-mcp-server 1.0.1 → 1.0.2
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/ARCHITECTURE.md +2 -3
- package/README.md +1 -0
- package/build/index.js +75 -0
- package/build/tools/autoPreview.js +99 -0
- package/build/tools/checklist.js +120 -0
- package/build/tools/sessionManager.js +107 -0
- package/build/tools/validators/__tests__/apiSchema.test.js +77 -0
- package/build/tools/validators/__tests__/convertRules.test.js +38 -0
- package/build/tools/validators/__tests__/frontendDesign.test.js +55 -0
- package/build/tools/validators/__tests__/geoChecker.test.js +45 -0
- package/build/tools/validators/__tests__/i18nChecker.test.js +32 -0
- package/build/tools/validators/__tests__/lintRunner.test.js +65 -0
- package/build/tools/validators/__tests__/mobileAudit.test.js +40 -0
- package/build/tools/validators/__tests__/playwrightRunner.test.js +55 -0
- package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +49 -0
- package/build/tools/validators/__tests__/securityScan.test.js +42 -0
- package/build/tools/validators/__tests__/seoChecker.test.js +44 -0
- package/build/tools/validators/__tests__/testRunner.test.js +49 -0
- package/build/tools/validators/__tests__/typeCoverage.test.js +62 -0
- package/build/tools/validators/accessibilityChecker.js +124 -0
- package/build/tools/validators/apiValidator.js +140 -0
- package/build/tools/validators/convertRules.js +170 -0
- package/build/tools/validators/geoChecker.js +176 -0
- package/build/tools/validators/i18nChecker.js +205 -0
- package/build/tools/validators/lighthouseAudit.js +50 -0
- package/build/tools/validators/lintRunner.js +106 -0
- package/build/tools/validators/mobileAudit.js +190 -0
- package/build/tools/validators/playwrightRunner.js +101 -0
- package/build/tools/validators/reactPerformanceChecker.js +199 -0
- package/build/tools/validators/schemaValidator.js +105 -0
- package/build/tools/validators/securityScan.js +215 -0
- package/build/tools/validators/seoChecker.js +122 -0
- package/build/tools/validators/testRunner.js +111 -0
- package/build/tools/validators/typeCoverage.js +150 -0
- package/build/tools/validators/uxAudit.js +222 -0
- package/build/tools/verifyAll.js +159 -0
- package/package.json +5 -3
- package/skills/tech/api-patterns/SKILL.md +1 -1
- package/skills/tech/clean-code/SKILL.md +14 -14
- package/skills/tech/doc.md +3 -3
- package/skills/tech/frontend-design/SKILL.md +1 -1
- package/skills/tech/geo-fundamentals/SKILL.md +1 -1
- package/skills/tech/i18n-localization/SKILL.md +1 -1
- package/skills/tech/lint-and-validate/SKILL.md +2 -2
- package/skills/tech/mobile-design/SKILL.md +1 -1
- package/skills/tech/nextjs-react-expert/SKILL.md +1 -1
- package/skills/tech/parallel-agents/SKILL.md +3 -3
- package/skills/tech/performance-profiling/SKILL.md +1 -1
- package/skills/tech/vulnerability-scanner/SKILL.md +1 -1
- package/skills/tech/webapp-testing/SKILL.md +3 -3
- package/workflows/review-compound.md +1 -1
- package/skills/tech/api-patterns/scripts/api_validator.py +0 -211
- package/skills/tech/database-design/scripts/schema_validator.py +0 -172
- package/skills/tech/frontend-design/scripts/accessibility_checker.py +0 -183
- package/skills/tech/frontend-design/scripts/ux_audit.py +0 -722
- package/skills/tech/geo-fundamentals/scripts/geo_checker.py +0 -289
- package/skills/tech/i18n-localization/scripts/i18n_checker.py +0 -241
- package/skills/tech/lint-and-validate/scripts/lint_runner.py +0 -184
- package/skills/tech/lint-and-validate/scripts/type_coverage.py +0 -173
- package/skills/tech/mobile-design/scripts/mobile_audit.py +0 -670
- package/skills/tech/nextjs-react-expert/scripts/convert_rules.py +0 -222
- package/skills/tech/nextjs-react-expert/scripts/react_performance_checker.py +0 -252
- package/skills/tech/performance-profiling/scripts/lighthouse_audit.py +0 -76
- package/skills/tech/seo-fundamentals/scripts/seo_checker.py +0 -219
- package/skills/tech/testing-patterns/scripts/test_runner.py +0 -219
- package/skills/tech/vulnerability-scanner/scripts/security_scan.py +0 -458
- package/skills/tech/webapp-testing/scripts/playwright_runner.py +0 -173
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Accessibility Checker - WCAG compliance audit
|
|
4
|
-
Checks HTML files for accessibility issues.
|
|
5
|
-
|
|
6
|
-
Usage:
|
|
7
|
-
python accessibility_checker.py <project_path>
|
|
8
|
-
|
|
9
|
-
Checks:
|
|
10
|
-
- Form labels
|
|
11
|
-
- ARIA attributes
|
|
12
|
-
- Color contrast hints
|
|
13
|
-
- Keyboard navigation
|
|
14
|
-
- Semantic HTML
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
import sys
|
|
18
|
-
import json
|
|
19
|
-
import re
|
|
20
|
-
from pathlib import Path
|
|
21
|
-
from datetime import datetime
|
|
22
|
-
|
|
23
|
-
# Fix Windows console encoding
|
|
24
|
-
try:
|
|
25
|
-
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
|
|
26
|
-
except:
|
|
27
|
-
pass
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
def find_html_files(project_path: Path) -> list:
|
|
31
|
-
"""Find all HTML/JSX/TSX files."""
|
|
32
|
-
patterns = ['**/*.html', '**/*.jsx', '**/*.tsx']
|
|
33
|
-
skip_dirs = {'node_modules', '.next', 'dist', 'build', '.git'}
|
|
34
|
-
|
|
35
|
-
files = []
|
|
36
|
-
for pattern in patterns:
|
|
37
|
-
for f in project_path.glob(pattern):
|
|
38
|
-
if not any(skip in f.parts for skip in skip_dirs):
|
|
39
|
-
files.append(f)
|
|
40
|
-
|
|
41
|
-
return files[:50]
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def check_accessibility(file_path: Path) -> list:
|
|
45
|
-
"""Check a single file for accessibility issues."""
|
|
46
|
-
issues = []
|
|
47
|
-
|
|
48
|
-
try:
|
|
49
|
-
content = file_path.read_text(encoding='utf-8', errors='ignore')
|
|
50
|
-
|
|
51
|
-
# Check for form inputs without labels
|
|
52
|
-
inputs = re.findall(r'<input[^>]*>', content, re.IGNORECASE)
|
|
53
|
-
for inp in inputs:
|
|
54
|
-
if 'type="hidden"' not in inp.lower():
|
|
55
|
-
if 'aria-label' not in inp.lower() and 'id=' not in inp.lower():
|
|
56
|
-
issues.append("Input without label or aria-label")
|
|
57
|
-
break
|
|
58
|
-
|
|
59
|
-
# Check for buttons without accessible text
|
|
60
|
-
buttons = re.findall(r'<button[^>]*>[^<]*</button>', content, re.IGNORECASE)
|
|
61
|
-
for btn in buttons:
|
|
62
|
-
# Check if button has text content or aria-label
|
|
63
|
-
if 'aria-label' not in btn.lower():
|
|
64
|
-
text = re.sub(r'<[^>]+>', '', btn)
|
|
65
|
-
if not text.strip():
|
|
66
|
-
issues.append("Button without accessible text")
|
|
67
|
-
break
|
|
68
|
-
|
|
69
|
-
# Check for missing lang attribute
|
|
70
|
-
if '<html' in content.lower() and 'lang=' not in content.lower():
|
|
71
|
-
issues.append("Missing lang attribute on <html>")
|
|
72
|
-
|
|
73
|
-
# Check for missing skip link
|
|
74
|
-
if '<main' in content.lower() or '<body' in content.lower():
|
|
75
|
-
if 'skip' not in content.lower() and '#main' not in content.lower():
|
|
76
|
-
issues.append("Consider adding skip-to-main-content link")
|
|
77
|
-
|
|
78
|
-
# Check for click handlers without keyboard support
|
|
79
|
-
onclick_count = content.lower().count('onclick=')
|
|
80
|
-
onkeydown_count = content.lower().count('onkeydown=') + content.lower().count('onkeyup=')
|
|
81
|
-
if onclick_count > 0 and onkeydown_count == 0:
|
|
82
|
-
issues.append("onClick without keyboard handler (onKeyDown)")
|
|
83
|
-
|
|
84
|
-
# Check for tabIndex misuse
|
|
85
|
-
if 'tabindex=' in content.lower():
|
|
86
|
-
if 'tabindex="-1"' not in content.lower() and 'tabindex="0"' not in content.lower():
|
|
87
|
-
positive_tabindex = re.findall(r'tabindex="([1-9]\d*)"', content, re.IGNORECASE)
|
|
88
|
-
if positive_tabindex:
|
|
89
|
-
issues.append("Avoid positive tabIndex values")
|
|
90
|
-
|
|
91
|
-
# Check for autoplay media
|
|
92
|
-
if 'autoplay' in content.lower():
|
|
93
|
-
if 'muted' not in content.lower():
|
|
94
|
-
issues.append("Autoplay media should be muted")
|
|
95
|
-
|
|
96
|
-
# Check for role usage
|
|
97
|
-
if 'role="button"' in content.lower():
|
|
98
|
-
# Divs with role button should have tabindex
|
|
99
|
-
div_buttons = re.findall(r'<div[^>]*role="button"[^>]*>', content, re.IGNORECASE)
|
|
100
|
-
for div in div_buttons:
|
|
101
|
-
if 'tabindex' not in div.lower():
|
|
102
|
-
issues.append("role='button' without tabindex")
|
|
103
|
-
break
|
|
104
|
-
|
|
105
|
-
except Exception as e:
|
|
106
|
-
issues.append(f"Error reading file: {str(e)[:50]}")
|
|
107
|
-
|
|
108
|
-
return issues
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def main():
|
|
112
|
-
project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
|
|
113
|
-
|
|
114
|
-
print(f"\n{'='*60}")
|
|
115
|
-
print(f"[ACCESSIBILITY CHECKER] WCAG Compliance Audit")
|
|
116
|
-
print(f"{'='*60}")
|
|
117
|
-
print(f"Project: {project_path}")
|
|
118
|
-
print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
119
|
-
print("-"*60)
|
|
120
|
-
|
|
121
|
-
# Find HTML files
|
|
122
|
-
files = find_html_files(project_path)
|
|
123
|
-
print(f"Found {len(files)} HTML/JSX/TSX files")
|
|
124
|
-
|
|
125
|
-
if not files:
|
|
126
|
-
output = {
|
|
127
|
-
"script": "accessibility_checker",
|
|
128
|
-
"project": str(project_path),
|
|
129
|
-
"files_checked": 0,
|
|
130
|
-
"issues_found": 0,
|
|
131
|
-
"passed": True,
|
|
132
|
-
"message": "No HTML files found"
|
|
133
|
-
}
|
|
134
|
-
print(json.dumps(output, indent=2))
|
|
135
|
-
sys.exit(0)
|
|
136
|
-
|
|
137
|
-
# Check each file
|
|
138
|
-
all_issues = []
|
|
139
|
-
|
|
140
|
-
for f in files:
|
|
141
|
-
issues = check_accessibility(f)
|
|
142
|
-
if issues:
|
|
143
|
-
all_issues.append({
|
|
144
|
-
"file": str(f.name),
|
|
145
|
-
"issues": issues
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
# Summary
|
|
149
|
-
print("\n" + "="*60)
|
|
150
|
-
print("ACCESSIBILITY ISSUES")
|
|
151
|
-
print("="*60)
|
|
152
|
-
|
|
153
|
-
if all_issues:
|
|
154
|
-
for item in all_issues[:10]:
|
|
155
|
-
print(f"\n{item['file']}:")
|
|
156
|
-
for issue in item["issues"]:
|
|
157
|
-
print(f" - {issue}")
|
|
158
|
-
|
|
159
|
-
if len(all_issues) > 10:
|
|
160
|
-
print(f"\n... and {len(all_issues) - 10} more files with issues")
|
|
161
|
-
else:
|
|
162
|
-
print("No accessibility issues found!")
|
|
163
|
-
|
|
164
|
-
total_issues = sum(len(item["issues"]) for item in all_issues)
|
|
165
|
-
# Accessibility issues are important but not blocking
|
|
166
|
-
passed = total_issues < 5 # Allow minor issues
|
|
167
|
-
|
|
168
|
-
output = {
|
|
169
|
-
"script": "accessibility_checker",
|
|
170
|
-
"project": str(project_path),
|
|
171
|
-
"files_checked": len(files),
|
|
172
|
-
"files_with_issues": len(all_issues),
|
|
173
|
-
"issues_found": total_issues,
|
|
174
|
-
"passed": passed
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
print("\n" + json.dumps(output, indent=2))
|
|
178
|
-
|
|
179
|
-
sys.exit(0 if passed else 1)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if __name__ == "__main__":
|
|
183
|
-
main()
|