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.
Files changed (67) hide show
  1. package/ARCHITECTURE.md +2 -3
  2. package/README.md +1 -0
  3. package/build/index.js +75 -0
  4. package/build/tools/autoPreview.js +99 -0
  5. package/build/tools/checklist.js +120 -0
  6. package/build/tools/sessionManager.js +107 -0
  7. package/build/tools/validators/__tests__/apiSchema.test.js +77 -0
  8. package/build/tools/validators/__tests__/convertRules.test.js +38 -0
  9. package/build/tools/validators/__tests__/frontendDesign.test.js +55 -0
  10. package/build/tools/validators/__tests__/geoChecker.test.js +45 -0
  11. package/build/tools/validators/__tests__/i18nChecker.test.js +32 -0
  12. package/build/tools/validators/__tests__/lintRunner.test.js +65 -0
  13. package/build/tools/validators/__tests__/mobileAudit.test.js +40 -0
  14. package/build/tools/validators/__tests__/playwrightRunner.test.js +55 -0
  15. package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +49 -0
  16. package/build/tools/validators/__tests__/securityScan.test.js +42 -0
  17. package/build/tools/validators/__tests__/seoChecker.test.js +44 -0
  18. package/build/tools/validators/__tests__/testRunner.test.js +49 -0
  19. package/build/tools/validators/__tests__/typeCoverage.test.js +62 -0
  20. package/build/tools/validators/accessibilityChecker.js +124 -0
  21. package/build/tools/validators/apiValidator.js +140 -0
  22. package/build/tools/validators/convertRules.js +170 -0
  23. package/build/tools/validators/geoChecker.js +176 -0
  24. package/build/tools/validators/i18nChecker.js +205 -0
  25. package/build/tools/validators/lighthouseAudit.js +50 -0
  26. package/build/tools/validators/lintRunner.js +106 -0
  27. package/build/tools/validators/mobileAudit.js +190 -0
  28. package/build/tools/validators/playwrightRunner.js +101 -0
  29. package/build/tools/validators/reactPerformanceChecker.js +199 -0
  30. package/build/tools/validators/schemaValidator.js +105 -0
  31. package/build/tools/validators/securityScan.js +215 -0
  32. package/build/tools/validators/seoChecker.js +122 -0
  33. package/build/tools/validators/testRunner.js +111 -0
  34. package/build/tools/validators/typeCoverage.js +150 -0
  35. package/build/tools/validators/uxAudit.js +222 -0
  36. package/build/tools/verifyAll.js +159 -0
  37. package/package.json +5 -3
  38. package/skills/tech/api-patterns/SKILL.md +1 -1
  39. package/skills/tech/clean-code/SKILL.md +14 -14
  40. package/skills/tech/doc.md +3 -3
  41. package/skills/tech/frontend-design/SKILL.md +1 -1
  42. package/skills/tech/geo-fundamentals/SKILL.md +1 -1
  43. package/skills/tech/i18n-localization/SKILL.md +1 -1
  44. package/skills/tech/lint-and-validate/SKILL.md +2 -2
  45. package/skills/tech/mobile-design/SKILL.md +1 -1
  46. package/skills/tech/nextjs-react-expert/SKILL.md +1 -1
  47. package/skills/tech/parallel-agents/SKILL.md +3 -3
  48. package/skills/tech/performance-profiling/SKILL.md +1 -1
  49. package/skills/tech/vulnerability-scanner/SKILL.md +1 -1
  50. package/skills/tech/webapp-testing/SKILL.md +3 -3
  51. package/workflows/review-compound.md +1 -1
  52. package/skills/tech/api-patterns/scripts/api_validator.py +0 -211
  53. package/skills/tech/database-design/scripts/schema_validator.py +0 -172
  54. package/skills/tech/frontend-design/scripts/accessibility_checker.py +0 -183
  55. package/skills/tech/frontend-design/scripts/ux_audit.py +0 -722
  56. package/skills/tech/geo-fundamentals/scripts/geo_checker.py +0 -289
  57. package/skills/tech/i18n-localization/scripts/i18n_checker.py +0 -241
  58. package/skills/tech/lint-and-validate/scripts/lint_runner.py +0 -184
  59. package/skills/tech/lint-and-validate/scripts/type_coverage.py +0 -173
  60. package/skills/tech/mobile-design/scripts/mobile_audit.py +0 -670
  61. package/skills/tech/nextjs-react-expert/scripts/convert_rules.py +0 -222
  62. package/skills/tech/nextjs-react-expert/scripts/react_performance_checker.py +0 -252
  63. package/skills/tech/performance-profiling/scripts/lighthouse_audit.py +0 -76
  64. package/skills/tech/seo-fundamentals/scripts/seo_checker.py +0 -219
  65. package/skills/tech/testing-patterns/scripts/test_runner.py +0 -219
  66. package/skills/tech/vulnerability-scanner/scripts/security_scan.py +0 -458
  67. 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()