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,184 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Lint Runner - Unified linting and type checking
4
- Runs appropriate linters based on project type.
5
-
6
- Usage:
7
- python lint_runner.py <project_path>
8
-
9
- Supports:
10
- - Node.js: npm run lint, npx tsc --noEmit
11
- - Python: ruff check, mypy
12
- """
13
-
14
- import subprocess
15
- import sys
16
- import json
17
- import platform
18
- import shutil
19
- from pathlib import Path
20
- from datetime import datetime
21
-
22
- # Fix Windows console encoding
23
- try:
24
- sys.stdout.reconfigure(encoding='utf-8', errors='replace')
25
- except:
26
- pass
27
-
28
-
29
- def detect_project_type(project_path: Path) -> dict:
30
- """Detect project type and available linters."""
31
- result = {
32
- "type": "unknown",
33
- "linters": []
34
- }
35
-
36
- # Node.js project
37
- package_json = project_path / "package.json"
38
- if package_json.exists():
39
- result["type"] = "node"
40
- try:
41
- pkg = json.loads(package_json.read_text(encoding='utf-8'))
42
- scripts = pkg.get("scripts", {})
43
- deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
44
-
45
- # Check for lint script
46
- if "lint" in scripts:
47
- result["linters"].append({"name": "npm lint", "cmd": ["npm", "run", "lint"]})
48
- elif "eslint" in deps:
49
- result["linters"].append({"name": "eslint", "cmd": ["npx", "eslint", "."]})
50
-
51
- # Check for TypeScript
52
- if "typescript" in deps or (project_path / "tsconfig.json").exists():
53
- result["linters"].append({"name": "tsc", "cmd": ["npx", "tsc", "--noEmit"]})
54
-
55
- except:
56
- pass
57
-
58
- # Python project
59
- if (project_path / "pyproject.toml").exists() or (project_path / "requirements.txt").exists():
60
- result["type"] = "python"
61
-
62
- # Check for ruff
63
- result["linters"].append({"name": "ruff", "cmd": ["ruff", "check", "."]})
64
-
65
- # Check for mypy
66
- if (project_path / "mypy.ini").exists() or (project_path / "pyproject.toml").exists():
67
- result["linters"].append({"name": "mypy", "cmd": ["mypy", "."]})
68
-
69
- return result
70
-
71
-
72
- def run_linter(linter: dict, cwd: Path) -> dict:
73
- """Run a single linter and return results."""
74
- result = {
75
- "name": linter["name"],
76
- "passed": False,
77
- "output": "",
78
- "error": ""
79
- }
80
-
81
- try:
82
- cmd = linter["cmd"]
83
-
84
- # Windows compatibility for npm/npx
85
- if platform.system() == "Windows":
86
- if cmd[0] in ["npm", "npx"]:
87
- # Force .cmd extension on Windows
88
- if not cmd[0].lower().endswith(".cmd"):
89
- cmd[0] = f"{cmd[0]}.cmd"
90
-
91
- proc = subprocess.run(
92
- cmd,
93
- cwd=str(cwd),
94
- capture_output=True,
95
- text=True,
96
- encoding='utf-8',
97
- errors='replace',
98
- timeout=120,
99
- shell=platform.system() == "Windows" # Shell=True often helps with path resolution on Windows
100
- )
101
-
102
- result["output"] = proc.stdout[:2000] if proc.stdout else ""
103
- result["error"] = proc.stderr[:500] if proc.stderr else ""
104
- result["passed"] = proc.returncode == 0
105
-
106
- except FileNotFoundError:
107
- result["error"] = f"Command not found: {linter['cmd'][0]}"
108
- except subprocess.TimeoutExpired:
109
- result["error"] = "Timeout after 120s"
110
- except Exception as e:
111
- result["error"] = str(e)
112
-
113
- return result
114
-
115
-
116
- def main():
117
- project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
118
-
119
- print(f"\n{'='*60}")
120
- print(f"[LINT RUNNER] Unified Linting")
121
- print(f"{'='*60}")
122
- print(f"Project: {project_path}")
123
- print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
124
-
125
- # Detect project type
126
- project_info = detect_project_type(project_path)
127
- print(f"Type: {project_info['type']}")
128
- print(f"Linters: {len(project_info['linters'])}")
129
- print("-"*60)
130
-
131
- if not project_info["linters"]:
132
- print("No linters found for this project type.")
133
- output = {
134
- "script": "lint_runner",
135
- "project": str(project_path),
136
- "type": project_info["type"],
137
- "checks": [],
138
- "passed": True,
139
- "message": "No linters configured"
140
- }
141
- print(json.dumps(output, indent=2))
142
- sys.exit(0)
143
-
144
- # Run each linter
145
- results = []
146
- all_passed = True
147
-
148
- for linter in project_info["linters"]:
149
- print(f"\nRunning: {linter['name']}...")
150
- result = run_linter(linter, project_path)
151
- results.append(result)
152
-
153
- if result["passed"]:
154
- print(f" [PASS] {linter['name']}")
155
- else:
156
- print(f" [FAIL] {linter['name']}")
157
- if result["error"]:
158
- print(f" Error: {result['error'][:200]}")
159
- all_passed = False
160
-
161
- # Summary
162
- print("\n" + "="*60)
163
- print("SUMMARY")
164
- print("="*60)
165
-
166
- for r in results:
167
- icon = "[PASS]" if r["passed"] else "[FAIL]"
168
- print(f"{icon} {r['name']}")
169
-
170
- output = {
171
- "script": "lint_runner",
172
- "project": str(project_path),
173
- "type": project_info["type"],
174
- "checks": results,
175
- "passed": all_passed
176
- }
177
-
178
- print("\n" + json.dumps(output, indent=2))
179
-
180
- sys.exit(0 if all_passed else 1)
181
-
182
-
183
- if __name__ == "__main__":
184
- main()
@@ -1,173 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- Type Coverage Checker - Measures TypeScript/Python type coverage.
4
- Identifies untyped functions, any usage, and type safety issues.
5
- """
6
- import sys
7
- import re
8
- import subprocess
9
- from pathlib import Path
10
-
11
- # Fix Windows console encoding for Unicode output
12
- try:
13
- sys.stdout.reconfigure(encoding='utf-8', errors='replace')
14
- sys.stderr.reconfigure(encoding='utf-8', errors='replace')
15
- except AttributeError:
16
- pass # Python < 3.7
17
-
18
- def check_typescript_coverage(project_path: Path) -> dict:
19
- """Check TypeScript type coverage."""
20
- issues = []
21
- passed = []
22
- stats = {'any_count': 0, 'untyped_functions': 0, 'total_functions': 0}
23
-
24
- ts_files = list(project_path.rglob("*.ts")) + list(project_path.rglob("*.tsx"))
25
- ts_files = [f for f in ts_files if 'node_modules' not in str(f) and '.d.ts' not in str(f)]
26
-
27
- if not ts_files:
28
- return {'type': 'typescript', 'files': 0, 'passed': [], 'issues': ["[!] No TypeScript files found"], 'stats': stats}
29
-
30
- for file_path in ts_files[:30]: # Limit
31
- try:
32
- content = file_path.read_text(encoding='utf-8', errors='ignore')
33
-
34
- # Count 'any' usage
35
- any_matches = re.findall(r':\s*any\b', content)
36
- stats['any_count'] += len(any_matches)
37
-
38
- # Find functions without return types
39
- # function name(params) { - no return type
40
- untyped = re.findall(r'function\s+\w+\s*\([^)]*\)\s*{', content)
41
- # Arrow functions without types: const fn = (x) => or (x) =>
42
- untyped += re.findall(r'=\s*\([^:)]*\)\s*=>', content)
43
- stats['untyped_functions'] += len(untyped)
44
-
45
- # Count typed functions
46
- typed = re.findall(r'function\s+\w+\s*\([^)]*\)\s*:\s*\w+', content)
47
- typed += re.findall(r':\s*\([^)]*\)\s*=>\s*\w+', content)
48
- stats['total_functions'] += len(typed) + len(untyped)
49
-
50
- except Exception:
51
- continue
52
-
53
- # Analyze results
54
- if stats['any_count'] == 0:
55
- passed.append("[OK] No 'any' types found")
56
- elif stats['any_count'] <= 5:
57
- issues.append(f"[!] {stats['any_count']} 'any' types found (acceptable)")
58
- else:
59
- issues.append(f"[X] {stats['any_count']} 'any' types found (too many)")
60
-
61
- if stats['total_functions'] > 0:
62
- typed_ratio = (stats['total_functions'] - stats['untyped_functions']) / stats['total_functions'] * 100
63
- if typed_ratio >= 80:
64
- passed.append(f"[OK] Type coverage: {typed_ratio:.0f}%")
65
- elif typed_ratio >= 50:
66
- issues.append(f"[!] Type coverage: {typed_ratio:.0f}% (improve)")
67
- else:
68
- issues.append(f"[X] Type coverage: {typed_ratio:.0f}% (too low)")
69
-
70
- passed.append(f"[OK] Analyzed {len(ts_files)} TypeScript files")
71
-
72
- return {'type': 'typescript', 'files': len(ts_files), 'passed': passed, 'issues': issues, 'stats': stats}
73
-
74
- def check_python_coverage(project_path: Path) -> dict:
75
- """Check Python type hints coverage."""
76
- issues = []
77
- passed = []
78
- stats = {'untyped_functions': 0, 'typed_functions': 0, 'any_count': 0}
79
-
80
- py_files = list(project_path.rglob("*.py"))
81
- py_files = [f for f in py_files if not any(x in str(f) for x in ['venv', '__pycache__', '.git', 'node_modules'])]
82
-
83
- if not py_files:
84
- return {'type': 'python', 'files': 0, 'passed': [], 'issues': ["[!] No Python files found"], 'stats': stats}
85
-
86
- for file_path in py_files[:30]: # Limit
87
- try:
88
- content = file_path.read_text(encoding='utf-8', errors='ignore')
89
-
90
- # Count Any usage
91
- any_matches = re.findall(r':\s*Any\b', content)
92
- stats['any_count'] += len(any_matches)
93
-
94
- # Find functions with type hints
95
- typed_funcs = re.findall(r'def\s+\w+\s*\([^)]*:[^)]+\)', content)
96
- typed_funcs += re.findall(r'def\s+\w+\s*\([^)]*\)\s*->', content)
97
- stats['typed_functions'] += len(typed_funcs)
98
-
99
- # Find functions without type hints
100
- all_funcs = re.findall(r'def\s+\w+\s*\(', content)
101
- stats['untyped_functions'] += len(all_funcs) - len(typed_funcs)
102
-
103
- except Exception:
104
- continue
105
-
106
- total = stats['typed_functions'] + stats['untyped_functions']
107
-
108
- if total > 0:
109
- typed_ratio = stats['typed_functions'] / total * 100
110
- if typed_ratio >= 70:
111
- passed.append(f"[OK] Type hints coverage: {typed_ratio:.0f}%")
112
- elif typed_ratio >= 40:
113
- issues.append(f"[!] Type hints coverage: {typed_ratio:.0f}%")
114
- else:
115
- issues.append(f"[X] Type hints coverage: {typed_ratio:.0f}% (add type hints)")
116
-
117
- if stats['any_count'] == 0:
118
- passed.append("[OK] No 'Any' types found")
119
- elif stats['any_count'] <= 3:
120
- issues.append(f"[!] {stats['any_count']} 'Any' types found")
121
- else:
122
- issues.append(f"[X] {stats['any_count']} 'Any' types found")
123
-
124
- passed.append(f"[OK] Analyzed {len(py_files)} Python files")
125
-
126
- return {'type': 'python', 'files': len(py_files), 'passed': passed, 'issues': issues, 'stats': stats}
127
-
128
- def main():
129
- target = sys.argv[1] if len(sys.argv) > 1 else "."
130
- project_path = Path(target)
131
-
132
- print("\n" + "=" * 60)
133
- print(" TYPE COVERAGE CHECKER")
134
- print("=" * 60 + "\n")
135
-
136
- results = []
137
-
138
- # Check TypeScript
139
- ts_result = check_typescript_coverage(project_path)
140
- if ts_result['files'] > 0:
141
- results.append(ts_result)
142
-
143
- # Check Python
144
- py_result = check_python_coverage(project_path)
145
- if py_result['files'] > 0:
146
- results.append(py_result)
147
-
148
- if not results:
149
- print("[!] No TypeScript or Python files found.")
150
- sys.exit(0)
151
-
152
- # Print results
153
- critical_issues = 0
154
- for result in results:
155
- print(f"\n[{result['type'].upper()}]")
156
- print("-" * 40)
157
- for item in result['passed']:
158
- print(f" {item}")
159
- for item in result['issues']:
160
- print(f" {item}")
161
- if item.startswith("[X]"):
162
- critical_issues += 1
163
-
164
- print("\n" + "=" * 60)
165
- if critical_issues == 0:
166
- print("[OK] TYPE COVERAGE: ACCEPTABLE")
167
- sys.exit(0)
168
- else:
169
- print(f"[X] TYPE COVERAGE: {critical_issues} critical issues")
170
- sys.exit(1)
171
-
172
- if __name__ == "__main__":
173
- main()