@h1dr0n/skill-pool 0.1.0
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/LICENSE +21 -0
- package/README.md +296 -0
- package/bin/cli.js +157 -0
- package/package.json +41 -0
- package/skills/api/agents/backend-specialist.md +69 -0
- package/skills/api/agents/database-optimizer.md +176 -0
- package/skills/api/manifest.yaml +20 -0
- package/skills/api/rules/auth-security.md +45 -0
- package/skills/api/skills/api-patterns/SKILL.md +81 -0
- package/skills/api/skills/api-patterns/api-style.md +42 -0
- package/skills/api/skills/api-patterns/auth.md +24 -0
- package/skills/api/skills/api-patterns/documentation.md +26 -0
- package/skills/api/skills/api-patterns/graphql.md +41 -0
- package/skills/api/skills/api-patterns/rate-limiting.md +31 -0
- package/skills/api/skills/api-patterns/response.md +37 -0
- package/skills/api/skills/api-patterns/rest.md +40 -0
- package/skills/api/skills/api-patterns/scripts/api_validator.py +211 -0
- package/skills/api/skills/api-patterns/security-testing.md +122 -0
- package/skills/api/skills/api-patterns/trpc.md +41 -0
- package/skills/api/skills/api-patterns/versioning.md +22 -0
- package/skills/api/skills/database-patterns.md +126 -0
- package/skills/api/skills/deployment-patterns.md +105 -0
- package/skills/api/skills/docker-patterns.md +135 -0
- package/skills/common/agents/code-reviewer.md +78 -0
- package/skills/common/agents/planner.md +80 -0
- package/skills/common/agents/security-reviewer.md +82 -0
- package/skills/common/agents/software-architect.md +81 -0
- package/skills/common/manifest.yaml +25 -0
- package/skills/common/rules/coding-style.md +39 -0
- package/skills/common/rules/git-workflow.md +33 -0
- package/skills/common/rules/security.md +25 -0
- package/skills/common/skills/architecture/SKILL.md +55 -0
- package/skills/common/skills/architecture/context-discovery.md +43 -0
- package/skills/common/skills/architecture/examples.md +94 -0
- package/skills/common/skills/architecture/pattern-selection.md +68 -0
- package/skills/common/skills/architecture/patterns-reference.md +50 -0
- package/skills/common/skills/architecture/trade-off-analysis.md +77 -0
- package/skills/common/skills/brainstorming/SKILL.md +163 -0
- package/skills/common/skills/brainstorming/dynamic-questioning.md +350 -0
- package/skills/common/skills/clean-code.md +99 -0
- package/skills/common/skills/code-review-checklist.md +86 -0
- package/skills/common/skills/plan-writing/SKILL.md +152 -0
- package/skills/common/skills/skill-feedback.md +94 -0
- package/skills/common/skills/tdd-workflow.md +130 -0
- package/skills/common/skills/verification-loop.md +112 -0
- package/skills/cpp/agents/cpp-build-resolver.md +90 -0
- package/skills/cpp/agents/cpp-reviewer.md +72 -0
- package/skills/cpp/manifest.yaml +15 -0
- package/skills/cpp/skills/cpp-coding-standards.md +722 -0
- package/skills/cpp/skills/cpp-testing.md +323 -0
- package/skills/devops/agents/devops-automator.md +376 -0
- package/skills/devops/agents/sre.md +90 -0
- package/skills/devops/manifest.yaml +20 -0
- package/skills/devops/skills/deployment-patterns.md +427 -0
- package/skills/devops/skills/deployment-procedures/SKILL.md +241 -0
- package/skills/devops/skills/docker-patterns.md +364 -0
- package/skills/devops/skills/e2e-testing.md +326 -0
- package/skills/devops/skills/github-ops.md +144 -0
- package/skills/django/manifest.yaml +16 -0
- package/skills/django/skills/django-patterns.md +734 -0
- package/skills/django/skills/django-security.md +593 -0
- package/skills/django/skills/django-tdd.md +729 -0
- package/skills/django/skills/django-verification.md +469 -0
- package/skills/dotnet/agents/csharp-reviewer.md +101 -0
- package/skills/dotnet/manifest.yaml +14 -0
- package/skills/dotnet/skills/csharp-testing.md +321 -0
- package/skills/dotnet/skills/dotnet-patterns.md +321 -0
- package/skills/go/agents/code-reviewer.md +76 -0
- package/skills/go/agents/go-build-resolver.md +94 -0
- package/skills/go/agents/go-reviewer.md +76 -0
- package/skills/go/manifest.yaml +17 -0
- package/skills/go/rules/go-style.md +55 -0
- package/skills/go/skills/golang-patterns.md +674 -0
- package/skills/go/skills/golang-testing.md +720 -0
- package/skills/java/agents/java-build-resolver.md +153 -0
- package/skills/java/agents/java-reviewer.md +92 -0
- package/skills/java/manifest.yaml +18 -0
- package/skills/java/skills/java-coding-standards.md +147 -0
- package/skills/java/skills/jpa-patterns.md +151 -0
- package/skills/java/skills/springboot-patterns.md +314 -0
- package/skills/java/skills/springboot-security.md +272 -0
- package/skills/kotlin/agents/kotlin-build-resolver.md +118 -0
- package/skills/kotlin/agents/kotlin-reviewer.md +159 -0
- package/skills/kotlin/manifest.yaml +17 -0
- package/skills/kotlin/skills/kotlin-coroutines-flows.md +284 -0
- package/skills/kotlin/skills/kotlin-patterns.md +711 -0
- package/skills/kotlin/skills/kotlin-testing.md +824 -0
- package/skills/laravel/manifest.yaml +15 -0
- package/skills/laravel/skills/laravel-patterns.md +409 -0
- package/skills/laravel/skills/laravel-security.md +279 -0
- package/skills/laravel/skills/laravel-tdd.md +277 -0
- package/skills/laravel/skills/laravel-verification.md +173 -0
- package/skills/mobile/agents/dart-build-resolver.md +201 -0
- package/skills/mobile/agents/flutter-reviewer.md +243 -0
- package/skills/mobile/manifest.yaml +19 -0
- package/skills/mobile/skills/android-clean-architecture.md +339 -0
- package/skills/mobile/skills/dart-flutter-patterns.md +563 -0
- package/skills/mobile/skills/swiftui-patterns.md +259 -0
- package/skills/nestjs/manifest.yaml +13 -0
- package/skills/nestjs/skills/nestjs-patterns.md +230 -0
- package/skills/perl/manifest.yaml +13 -0
- package/skills/perl/skills/perl-patterns.md +504 -0
- package/skills/perl/skills/perl-security.md +503 -0
- package/skills/perl/skills/perl-testing.md +475 -0
- package/skills/python/agents/python-reviewer.md +98 -0
- package/skills/python/manifest.yaml +18 -0
- package/skills/python/rules/python-style.md +69 -0
- package/skills/python/skills/python-patterns/SKILL.md +441 -0
- package/skills/python/skills/python-patterns.md +90 -0
- package/skills/python/skills/python-testing.md +81 -0
- package/skills/rust/agents/rust-build-resolver.md +148 -0
- package/skills/rust/agents/rust-reviewer.md +94 -0
- package/skills/rust/manifest.yaml +16 -0
- package/skills/rust/rules/rust-style.md +107 -0
- package/skills/rust/skills/rust-patterns.md +499 -0
- package/skills/rust/skills/rust-testing.md +500 -0
- package/skills/security/agents/accessibility-auditor.md +316 -0
- package/skills/security/agents/security-reviewer.md +108 -0
- package/skills/security/manifest.yaml +19 -0
- package/skills/security/skills/red-team-tactics/SKILL.md +199 -0
- package/skills/security/skills/security-bounty-hunter.md +99 -0
- package/skills/security/skills/security-review.md +495 -0
- package/skills/security/skills/security-scan.md +165 -0
- package/skills/security/skills/vulnerability-scanner/SKILL.md +276 -0
- package/skills/security/skills/vulnerability-scanner/checklists.md +121 -0
- package/skills/security/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/skills/swift/manifest.yaml +16 -0
- package/skills/swift/skills/swift-actor-persistence.md +142 -0
- package/skills/swift/skills/swift-concurrency.md +216 -0
- package/skills/swift/skills/swift-protocol-di-testing.md +190 -0
- package/skills/swift/skills/swiftui-patterns.md +259 -0
- package/skills/unity/agents/game-designer.md +167 -0
- package/skills/unity/agents/unity-architect.md +52 -0
- package/skills/unity/agents/unity-editor-tool-developer.md +310 -0
- package/skills/unity/agents/unity-multiplayer-engineer.md +321 -0
- package/skills/unity/agents/unity-shader-graph-artist.md +269 -0
- package/skills/unity/manifest.yaml +21 -0
- package/skills/unity/rules/csharp-patterns.md +48 -0
- package/skills/unity/rules/unity-specific.md +53 -0
- package/skills/unity/skills/systematic-debugging.md +92 -0
- package/skills/unity/skills/unity-architecture.md +173 -0
- package/skills/unreal/agents/level-designer.md +208 -0
- package/skills/unreal/agents/technical-artist.md +229 -0
- package/skills/unreal/agents/unreal-multiplayer-architect.md +313 -0
- package/skills/unreal/agents/unreal-systems-engineer.md +310 -0
- package/skills/unreal/agents/unreal-technical-artist.md +256 -0
- package/skills/unreal/agents/unreal-world-builder.md +273 -0
- package/skills/unreal/manifest.yaml +21 -0
- package/skills/unreal/skills/unreal-patterns.md +183 -0
- package/skills/web/agents/frontend-specialist.md +71 -0
- package/skills/web/agents/ui-designer.md +383 -0
- package/skills/web/agents/ux-architect.md +469 -0
- package/skills/web/manifest.yaml +22 -0
- package/skills/web/rules/accessibility.md +54 -0
- package/skills/web/rules/css-performance.md +52 -0
- package/skills/web/skills/e2e-testing.md +132 -0
- package/skills/web/skills/frontend-design/SKILL.md +452 -0
- package/skills/web/skills/frontend-design/animation-guide.md +331 -0
- package/skills/web/skills/frontend-design/color-system.md +311 -0
- package/skills/web/skills/frontend-design/decision-trees.md +418 -0
- package/skills/web/skills/frontend-design/motion-graphics.md +306 -0
- package/skills/web/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/skills/web/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/skills/web/skills/frontend-design/typography-system.md +345 -0
- package/skills/web/skills/frontend-design/ux-psychology.md +1116 -0
- package/skills/web/skills/frontend-design/visual-effects.md +383 -0
- package/skills/web/skills/react-nextjs.md +135 -0
- package/skills/web/skills/tailwind-patterns/SKILL.md +269 -0
- package/src/adapters/antigravity.js +164 -0
- package/src/adapters/claude.js +188 -0
- package/src/adapters/cursor.js +161 -0
- package/src/adapters/index.js +67 -0
- package/src/adapters/windsurf.js +158 -0
- package/src/commands/add.js +266 -0
- package/src/commands/create.js +127 -0
- package/src/commands/diff.js +78 -0
- package/src/commands/info.js +88 -0
- package/src/commands/init.js +224 -0
- package/src/commands/install.js +90 -0
- package/src/commands/list.js +54 -0
- package/src/commands/remove.js +101 -0
- package/src/commands/targets.js +32 -0
- package/src/commands/update.js +57 -0
- package/src/core/manifest.js +57 -0
- package/src/core/plugins.js +86 -0
- package/src/core/resolver.js +84 -0
- package/src/core/tracker.js +49 -0
- package/src/utils/fs.js +80 -0
- package/src/utils/git.js +52 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
API Validator - Checks API endpoints for best practices.
|
|
4
|
+
Validates OpenAPI specs, response formats, and common issues.
|
|
5
|
+
"""
|
|
6
|
+
import sys
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
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 find_api_files(project_path: Path) -> list:
|
|
19
|
+
"""Find API-related files."""
|
|
20
|
+
patterns = [
|
|
21
|
+
"**/*api*.ts", "**/*api*.js", "**/*api*.py",
|
|
22
|
+
"**/routes/*.ts", "**/routes/*.js", "**/routes/*.py",
|
|
23
|
+
"**/controllers/*.ts", "**/controllers/*.js",
|
|
24
|
+
"**/endpoints/*.ts", "**/endpoints/*.py",
|
|
25
|
+
"**/*.openapi.json", "**/*.openapi.yaml",
|
|
26
|
+
"**/swagger.json", "**/swagger.yaml",
|
|
27
|
+
"**/openapi.json", "**/openapi.yaml"
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
files = []
|
|
31
|
+
for pattern in patterns:
|
|
32
|
+
files.extend(project_path.glob(pattern))
|
|
33
|
+
|
|
34
|
+
# Exclude node_modules, etc.
|
|
35
|
+
return [f for f in files if not any(x in str(f) for x in ['node_modules', '.git', 'dist', 'build', '__pycache__'])]
|
|
36
|
+
|
|
37
|
+
def check_openapi_spec(file_path: Path) -> dict:
|
|
38
|
+
"""Check OpenAPI/Swagger specification."""
|
|
39
|
+
issues = []
|
|
40
|
+
passed = []
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
content = file_path.read_text(encoding='utf-8')
|
|
44
|
+
|
|
45
|
+
if file_path.suffix == '.json':
|
|
46
|
+
spec = json.loads(content)
|
|
47
|
+
else:
|
|
48
|
+
# Basic YAML check
|
|
49
|
+
if 'openapi:' in content or 'swagger:' in content:
|
|
50
|
+
passed.append("[OK] OpenAPI/Swagger version defined")
|
|
51
|
+
else:
|
|
52
|
+
issues.append("[X] No OpenAPI version found")
|
|
53
|
+
|
|
54
|
+
if 'paths:' in content:
|
|
55
|
+
passed.append("[OK] Paths section exists")
|
|
56
|
+
else:
|
|
57
|
+
issues.append("[X] No paths defined")
|
|
58
|
+
|
|
59
|
+
if 'components:' in content or 'definitions:' in content:
|
|
60
|
+
passed.append("[OK] Schema components defined")
|
|
61
|
+
|
|
62
|
+
return {'file': str(file_path), 'passed': passed, 'issues': issues, 'type': 'openapi'}
|
|
63
|
+
|
|
64
|
+
# JSON OpenAPI checks
|
|
65
|
+
if 'openapi' in spec or 'swagger' in spec:
|
|
66
|
+
passed.append("[OK] OpenAPI version defined")
|
|
67
|
+
|
|
68
|
+
if 'info' in spec:
|
|
69
|
+
if 'title' in spec['info']:
|
|
70
|
+
passed.append("[OK] API title defined")
|
|
71
|
+
if 'version' in spec['info']:
|
|
72
|
+
passed.append("[OK] API version defined")
|
|
73
|
+
if 'description' not in spec['info']:
|
|
74
|
+
issues.append("[!] API description missing")
|
|
75
|
+
|
|
76
|
+
if 'paths' in spec:
|
|
77
|
+
path_count = len(spec['paths'])
|
|
78
|
+
passed.append(f"[OK] {path_count} endpoints defined")
|
|
79
|
+
|
|
80
|
+
# Check each path
|
|
81
|
+
for path, methods in spec['paths'].items():
|
|
82
|
+
for method, details in methods.items():
|
|
83
|
+
if method in ['get', 'post', 'put', 'patch', 'delete']:
|
|
84
|
+
if 'responses' not in details:
|
|
85
|
+
issues.append(f"[X] {method.upper()} {path}: No responses defined")
|
|
86
|
+
if 'summary' not in details and 'description' not in details:
|
|
87
|
+
issues.append(f"[!] {method.upper()} {path}: No description")
|
|
88
|
+
|
|
89
|
+
except Exception as e:
|
|
90
|
+
issues.append(f"[X] Parse error: {e}")
|
|
91
|
+
|
|
92
|
+
return {'file': str(file_path), 'passed': passed, 'issues': issues, 'type': 'openapi'}
|
|
93
|
+
|
|
94
|
+
def check_api_code(file_path: Path) -> dict:
|
|
95
|
+
"""Check API code for common issues."""
|
|
96
|
+
issues = []
|
|
97
|
+
passed = []
|
|
98
|
+
|
|
99
|
+
try:
|
|
100
|
+
content = file_path.read_text(encoding='utf-8')
|
|
101
|
+
|
|
102
|
+
# Check for error handling
|
|
103
|
+
error_patterns = [
|
|
104
|
+
r'try\s*{', r'try:', r'\.catch\(',
|
|
105
|
+
r'except\s+', r'catch\s*\('
|
|
106
|
+
]
|
|
107
|
+
has_error_handling = any(re.search(p, content) for p in error_patterns)
|
|
108
|
+
if has_error_handling:
|
|
109
|
+
passed.append("[OK] Error handling present")
|
|
110
|
+
else:
|
|
111
|
+
issues.append("[X] No error handling found")
|
|
112
|
+
|
|
113
|
+
# Check for status codes
|
|
114
|
+
status_patterns = [
|
|
115
|
+
r'status\s*\(\s*\d{3}\s*\)', r'statusCode\s*[=:]\s*\d{3}',
|
|
116
|
+
r'HttpStatus\.', r'status_code\s*=\s*\d{3}',
|
|
117
|
+
r'\.status\(\d{3}\)', r'res\.status\('
|
|
118
|
+
]
|
|
119
|
+
has_status = any(re.search(p, content) for p in status_patterns)
|
|
120
|
+
if has_status:
|
|
121
|
+
passed.append("[OK] HTTP status codes used")
|
|
122
|
+
else:
|
|
123
|
+
issues.append("[!] No explicit HTTP status codes")
|
|
124
|
+
|
|
125
|
+
# Check for validation
|
|
126
|
+
validation_patterns = [
|
|
127
|
+
r'validate', r'schema', r'zod', r'joi', r'yup',
|
|
128
|
+
r'pydantic', r'@Body\(', r'@Query\('
|
|
129
|
+
]
|
|
130
|
+
has_validation = any(re.search(p, content, re.I) for p in validation_patterns)
|
|
131
|
+
if has_validation:
|
|
132
|
+
passed.append("[OK] Input validation present")
|
|
133
|
+
else:
|
|
134
|
+
issues.append("[!] No input validation detected")
|
|
135
|
+
|
|
136
|
+
# Check for auth middleware
|
|
137
|
+
auth_patterns = [
|
|
138
|
+
r'auth', r'jwt', r'bearer', r'token',
|
|
139
|
+
r'middleware', r'guard', r'@Authenticated'
|
|
140
|
+
]
|
|
141
|
+
has_auth = any(re.search(p, content, re.I) for p in auth_patterns)
|
|
142
|
+
if has_auth:
|
|
143
|
+
passed.append("[OK] Authentication/authorization detected")
|
|
144
|
+
|
|
145
|
+
# Check for rate limiting
|
|
146
|
+
rate_patterns = [r'rateLimit', r'throttle', r'rate.?limit']
|
|
147
|
+
has_rate = any(re.search(p, content, re.I) for p in rate_patterns)
|
|
148
|
+
if has_rate:
|
|
149
|
+
passed.append("[OK] Rate limiting present")
|
|
150
|
+
|
|
151
|
+
# Check for logging
|
|
152
|
+
log_patterns = [r'console\.log', r'logger\.', r'logging\.', r'log\.']
|
|
153
|
+
has_logging = any(re.search(p, content) for p in log_patterns)
|
|
154
|
+
if has_logging:
|
|
155
|
+
passed.append("[OK] Logging present")
|
|
156
|
+
|
|
157
|
+
except Exception as e:
|
|
158
|
+
issues.append(f"[X] Read error: {e}")
|
|
159
|
+
|
|
160
|
+
return {'file': str(file_path), 'passed': passed, 'issues': issues, 'type': 'code'}
|
|
161
|
+
|
|
162
|
+
def main():
|
|
163
|
+
target = sys.argv[1] if len(sys.argv) > 1 else "."
|
|
164
|
+
project_path = Path(target)
|
|
165
|
+
|
|
166
|
+
print("\n" + "=" * 60)
|
|
167
|
+
print(" API VALIDATOR - Endpoint Best Practices Check")
|
|
168
|
+
print("=" * 60 + "\n")
|
|
169
|
+
|
|
170
|
+
api_files = find_api_files(project_path)
|
|
171
|
+
|
|
172
|
+
if not api_files:
|
|
173
|
+
print("[!] No API files found.")
|
|
174
|
+
print(" Looking for: routes/, controllers/, api/, openapi.json/yaml")
|
|
175
|
+
sys.exit(0)
|
|
176
|
+
|
|
177
|
+
results = []
|
|
178
|
+
for file_path in api_files[:15]: # Limit
|
|
179
|
+
if 'openapi' in file_path.name.lower() or 'swagger' in file_path.name.lower():
|
|
180
|
+
result = check_openapi_spec(file_path)
|
|
181
|
+
else:
|
|
182
|
+
result = check_api_code(file_path)
|
|
183
|
+
results.append(result)
|
|
184
|
+
|
|
185
|
+
# Print results
|
|
186
|
+
total_issues = 0
|
|
187
|
+
total_passed = 0
|
|
188
|
+
|
|
189
|
+
for result in results:
|
|
190
|
+
print(f"\n[FILE] {result['file']} [{result['type']}]")
|
|
191
|
+
for item in result['passed']:
|
|
192
|
+
print(f" {item}")
|
|
193
|
+
total_passed += 1
|
|
194
|
+
for item in result['issues']:
|
|
195
|
+
print(f" {item}")
|
|
196
|
+
if item.startswith("[X]"):
|
|
197
|
+
total_issues += 1
|
|
198
|
+
|
|
199
|
+
print("\n" + "=" * 60)
|
|
200
|
+
print(f"[RESULTS] {total_passed} passed, {total_issues} critical issues")
|
|
201
|
+
print("=" * 60)
|
|
202
|
+
|
|
203
|
+
if total_issues == 0:
|
|
204
|
+
print("[OK] API validation passed")
|
|
205
|
+
sys.exit(0)
|
|
206
|
+
else:
|
|
207
|
+
print("[X] Fix critical issues before deployment")
|
|
208
|
+
sys.exit(1)
|
|
209
|
+
|
|
210
|
+
if __name__ == "__main__":
|
|
211
|
+
main()
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# API Security Testing
|
|
2
|
+
|
|
3
|
+
> Principles for testing API security. OWASP API Top 10, authentication, authorization testing.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## OWASP API Security Top 10
|
|
8
|
+
|
|
9
|
+
| Vulnerability | Test Focus |
|
|
10
|
+
|---------------|------------|
|
|
11
|
+
| **API1: BOLA** | Access other users' resources |
|
|
12
|
+
| **API2: Broken Auth** | JWT, session, credentials |
|
|
13
|
+
| **API3: Property Auth** | Mass assignment, data exposure |
|
|
14
|
+
| **API4: Resource Consumption** | Rate limiting, DoS |
|
|
15
|
+
| **API5: Function Auth** | Admin endpoints, role bypass |
|
|
16
|
+
| **API6: Business Flow** | Logic abuse, automation |
|
|
17
|
+
| **API7: SSRF** | Internal network access |
|
|
18
|
+
| **API8: Misconfiguration** | Debug endpoints, CORS |
|
|
19
|
+
| **API9: Inventory** | Shadow APIs, old versions |
|
|
20
|
+
| **API10: Unsafe Consumption** | Third-party API trust |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Authentication Testing
|
|
25
|
+
|
|
26
|
+
### JWT Testing
|
|
27
|
+
|
|
28
|
+
| Check | What to Test |
|
|
29
|
+
|-------|--------------|
|
|
30
|
+
| Algorithm | None, algorithm confusion |
|
|
31
|
+
| Secret | Weak secrets, brute force |
|
|
32
|
+
| Claims | Expiration, issuer, audience |
|
|
33
|
+
| Signature | Manipulation, key injection |
|
|
34
|
+
|
|
35
|
+
### Session Testing
|
|
36
|
+
|
|
37
|
+
| Check | What to Test |
|
|
38
|
+
|-------|--------------|
|
|
39
|
+
| Generation | Predictability |
|
|
40
|
+
| Storage | Client-side security |
|
|
41
|
+
| Expiration | Timeout enforcement |
|
|
42
|
+
| Invalidation | Logout effectiveness |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Authorization Testing
|
|
47
|
+
|
|
48
|
+
| Test Type | Approach |
|
|
49
|
+
|-----------|----------|
|
|
50
|
+
| **Horizontal** | Access peer users' data |
|
|
51
|
+
| **Vertical** | Access higher privilege functions |
|
|
52
|
+
| **Context** | Access outside allowed scope |
|
|
53
|
+
|
|
54
|
+
### BOLA/IDOR Testing
|
|
55
|
+
|
|
56
|
+
1. Identify resource IDs in requests
|
|
57
|
+
2. Capture request with user A's session
|
|
58
|
+
3. Replay with user B's session
|
|
59
|
+
4. Check for unauthorized access
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Input Validation Testing
|
|
64
|
+
|
|
65
|
+
| Injection Type | Test Focus |
|
|
66
|
+
|----------------|------------|
|
|
67
|
+
| SQL | Query manipulation |
|
|
68
|
+
| NoSQL | Document queries |
|
|
69
|
+
| Command | System commands |
|
|
70
|
+
| LDAP | Directory queries |
|
|
71
|
+
|
|
72
|
+
**Approach:** Test all parameters, try type coercion, test boundaries, check error messages.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Rate Limiting Testing
|
|
77
|
+
|
|
78
|
+
| Aspect | Check |
|
|
79
|
+
|--------|-------|
|
|
80
|
+
| Existence | Is there any limit? |
|
|
81
|
+
| Bypass | Headers, IP rotation |
|
|
82
|
+
| Scope | Per-user, per-IP, global |
|
|
83
|
+
|
|
84
|
+
**Bypass techniques:** X-Forwarded-For, different HTTP methods, case variations, API versioning.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## GraphQL Security
|
|
89
|
+
|
|
90
|
+
| Test | Focus |
|
|
91
|
+
|------|-------|
|
|
92
|
+
| Introspection | Schema disclosure |
|
|
93
|
+
| Batching | Query DoS |
|
|
94
|
+
| Nesting | Depth-based DoS |
|
|
95
|
+
| Authorization | Field-level access |
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Security Testing Checklist
|
|
100
|
+
|
|
101
|
+
**Authentication:**
|
|
102
|
+
- [ ] Test for bypass
|
|
103
|
+
- [ ] Check credential strength
|
|
104
|
+
- [ ] Verify token security
|
|
105
|
+
|
|
106
|
+
**Authorization:**
|
|
107
|
+
- [ ] Test BOLA/IDOR
|
|
108
|
+
- [ ] Check privilege escalation
|
|
109
|
+
- [ ] Verify function access
|
|
110
|
+
|
|
111
|
+
**Input:**
|
|
112
|
+
- [ ] Test all parameters
|
|
113
|
+
- [ ] Check for injection
|
|
114
|
+
|
|
115
|
+
**Config:**
|
|
116
|
+
- [ ] Check CORS
|
|
117
|
+
- [ ] Verify headers
|
|
118
|
+
- [ ] Test error handling
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
> **Remember:** APIs are the backbone of modern apps. Test them like attackers will.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# tRPC Principles
|
|
2
|
+
|
|
3
|
+
> End-to-end type safety for TypeScript monorepos.
|
|
4
|
+
|
|
5
|
+
## When to Use
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
✅ Perfect fit:
|
|
9
|
+
├── TypeScript on both ends
|
|
10
|
+
├── Monorepo structure
|
|
11
|
+
├── Internal tools
|
|
12
|
+
├── Rapid development
|
|
13
|
+
└── Type safety critical
|
|
14
|
+
|
|
15
|
+
❌ Poor fit:
|
|
16
|
+
├── Non-TypeScript clients
|
|
17
|
+
├── Public API
|
|
18
|
+
├── Need REST conventions
|
|
19
|
+
└── Multiple language backends
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Key Benefits
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Why tRPC:
|
|
26
|
+
├── Zero schema maintenance
|
|
27
|
+
├── End-to-end type inference
|
|
28
|
+
├── IDE autocomplete across stack
|
|
29
|
+
├── Instant API changes reflected
|
|
30
|
+
└── No code generation step
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Integration Patterns
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
Common setups:
|
|
37
|
+
├── Next.js + tRPC (most common)
|
|
38
|
+
├── Monorepo with shared types
|
|
39
|
+
├── Remix + tRPC
|
|
40
|
+
└── Any TS frontend + backend
|
|
41
|
+
```
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Versioning Strategies
|
|
2
|
+
|
|
3
|
+
> Plan for API evolution from day one.
|
|
4
|
+
|
|
5
|
+
## Decision Factors
|
|
6
|
+
|
|
7
|
+
| Strategy | Implementation | Trade-offs |
|
|
8
|
+
|----------|---------------|------------|
|
|
9
|
+
| **URI** | /v1/users | Clear, easy caching |
|
|
10
|
+
| **Header** | Accept-Version: 1 | Cleaner URLs, harder discovery |
|
|
11
|
+
| **Query** | ?version=1 | Easy to add, messy |
|
|
12
|
+
| **None** | Evolve carefully | Best for internal, risky for public |
|
|
13
|
+
|
|
14
|
+
## Versioning Philosophy
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
Consider:
|
|
18
|
+
├── Public API? → Version in URI
|
|
19
|
+
├── Internal only? → May not need versioning
|
|
20
|
+
├── GraphQL? → Typically no versions (evolve schema)
|
|
21
|
+
├── tRPC? → Types enforce compatibility
|
|
22
|
+
```
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-patterns
|
|
3
|
+
description: Database design and optimization - schema design, query optimization, N+1 prevention, migrations, connection pooling. Use when working with databases.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Database Patterns
|
|
7
|
+
|
|
8
|
+
## When to Activate
|
|
9
|
+
- Designing database schema
|
|
10
|
+
- Optimizing slow queries
|
|
11
|
+
- Writing migrations
|
|
12
|
+
- Debugging N+1 queries
|
|
13
|
+
- Setting up connection pooling
|
|
14
|
+
|
|
15
|
+
## Schema Design
|
|
16
|
+
|
|
17
|
+
### Primary Keys
|
|
18
|
+
| Option | When | Example |
|
|
19
|
+
|--------|------|---------|
|
|
20
|
+
| UUID v4 | Distributed systems | No coordination needed |
|
|
21
|
+
| ULID | Sorted + distributed | Time-sortable UUID |
|
|
22
|
+
| Auto-increment | Simple apps | Single database |
|
|
23
|
+
|
|
24
|
+
### Standard Columns
|
|
25
|
+
Every table should have:
|
|
26
|
+
```sql
|
|
27
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
28
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
29
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
30
|
+
deleted_at TIMESTAMPTZ -- soft delete (nullable)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Normalization vs Denormalization
|
|
34
|
+
- Normalize to 3NF by default
|
|
35
|
+
- Denormalize intentionally for read-heavy access patterns
|
|
36
|
+
- Document every denormalization with the reason
|
|
37
|
+
|
|
38
|
+
## Query Optimization
|
|
39
|
+
|
|
40
|
+
### Index Strategy
|
|
41
|
+
- Add indexes for WHERE, JOIN, ORDER BY columns
|
|
42
|
+
- Composite indexes: column order matters (most selective first)
|
|
43
|
+
- Partial indexes for filtered queries
|
|
44
|
+
- Always verify with `EXPLAIN ANALYZE`
|
|
45
|
+
|
|
46
|
+
### N+1 Prevention
|
|
47
|
+
|
|
48
|
+
```sql
|
|
49
|
+
-- BAD: N+1 (one query per user for orders)
|
|
50
|
+
SELECT * FROM users;
|
|
51
|
+
-- then for EACH user:
|
|
52
|
+
SELECT * FROM orders WHERE user_id = ?;
|
|
53
|
+
|
|
54
|
+
-- GOOD: JOIN
|
|
55
|
+
SELECT u.*, o.id as order_id, o.total
|
|
56
|
+
FROM users u
|
|
57
|
+
LEFT JOIN orders o ON o.user_id = u.id;
|
|
58
|
+
|
|
59
|
+
-- GOOD: Batch
|
|
60
|
+
SELECT * FROM orders WHERE user_id IN (?, ?, ?, ...);
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### ORM Equivalents
|
|
64
|
+
```
|
|
65
|
+
# Django: select_related (JOIN) / prefetch_related (batch)
|
|
66
|
+
User.objects.select_related('profile').prefetch_related('orders')
|
|
67
|
+
|
|
68
|
+
# Prisma: include
|
|
69
|
+
prisma.user.findMany({ include: { orders: true } })
|
|
70
|
+
|
|
71
|
+
# TypeORM: relations
|
|
72
|
+
userRepo.find({ relations: ['orders'] })
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Migrations
|
|
76
|
+
|
|
77
|
+
### Rules
|
|
78
|
+
1. One migration per schema change
|
|
79
|
+
2. Always include rollback (down migration)
|
|
80
|
+
3. Never modify deployed migrations
|
|
81
|
+
4. Test on production-size data before deploying
|
|
82
|
+
5. Separate data migrations from schema migrations
|
|
83
|
+
|
|
84
|
+
### Safe Migration Patterns
|
|
85
|
+
|
|
86
|
+
| Operation | Safe Approach |
|
|
87
|
+
|-----------|--------------|
|
|
88
|
+
| Add column | Add nullable, backfill, then add NOT NULL |
|
|
89
|
+
| Remove column | Stop reading first, then drop in next deploy |
|
|
90
|
+
| Rename column | Add new, copy data, update code, drop old |
|
|
91
|
+
| Add index | `CREATE INDEX CONCURRENTLY` (Postgres) |
|
|
92
|
+
|
|
93
|
+
## Connection Pooling
|
|
94
|
+
|
|
95
|
+
### Pool Size Formula
|
|
96
|
+
```
|
|
97
|
+
connections = (CPU cores * 2) + disk_spindles
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Configuration
|
|
101
|
+
| Setting | Recommended |
|
|
102
|
+
|---------|------------|
|
|
103
|
+
| Min connections | 2-5 |
|
|
104
|
+
| Max connections | 20-50 |
|
|
105
|
+
| Idle timeout | 10-30 seconds |
|
|
106
|
+
| Max lifetime | 30 minutes |
|
|
107
|
+
| Connection timeout | 5 seconds |
|
|
108
|
+
|
|
109
|
+
## Security
|
|
110
|
+
|
|
111
|
+
- Parameterized queries ONLY (never string interpolation)
|
|
112
|
+
- Least-privilege database users per service
|
|
113
|
+
- Encrypt sensitive columns at rest
|
|
114
|
+
- Audit trail for sensitive data access
|
|
115
|
+
- Regular backup testing (restore drills)
|
|
116
|
+
|
|
117
|
+
## Anti-Patterns
|
|
118
|
+
|
|
119
|
+
| Don't | Do Instead |
|
|
120
|
+
|-------|-----------|
|
|
121
|
+
| `SELECT *` | Specify needed columns |
|
|
122
|
+
| String concatenation in SQL | Parameterized queries |
|
|
123
|
+
| No indexes on foreign keys | Index all FK columns |
|
|
124
|
+
| Modify deployed migrations | Create new migration |
|
|
125
|
+
| Store files in DB | Store in object storage, reference by URL |
|
|
126
|
+
| Unbounded queries | Always add LIMIT |
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deployment-patterns
|
|
3
|
+
description: Production deployment workflows - platform selection, pre-deploy checks, rollback strategies, zero-downtime patterns. Use when deploying or planning deployment.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Deployment Patterns
|
|
7
|
+
|
|
8
|
+
## When to Activate
|
|
9
|
+
- Deploying to production
|
|
10
|
+
- Setting up CI/CD pipelines
|
|
11
|
+
- Planning deployment strategy
|
|
12
|
+
- Handling deployment failures
|
|
13
|
+
|
|
14
|
+
## Platform Decision Tree
|
|
15
|
+
|
|
16
|
+
| App Type | Recommended | Alternative |
|
|
17
|
+
|----------|------------|-------------|
|
|
18
|
+
| Static site | Vercel, Cloudflare Pages | Netlify, S3+CloudFront |
|
|
19
|
+
| Web app (SSR) | Vercel, Railway | Fly.io, Render |
|
|
20
|
+
| API service | Railway, Fly.io | AWS ECS, GCP Cloud Run |
|
|
21
|
+
| Microservices | Kubernetes | Docker Swarm, Nomad |
|
|
22
|
+
| Serverless | AWS Lambda, Cloudflare Workers | Vercel Functions |
|
|
23
|
+
|
|
24
|
+
## Pre-Deployment Checklist
|
|
25
|
+
|
|
26
|
+
### Code Quality
|
|
27
|
+
- [ ] All tests passing
|
|
28
|
+
- [ ] Build succeeds locally
|
|
29
|
+
- [ ] No linting errors
|
|
30
|
+
- [ ] Code reviewed and approved
|
|
31
|
+
|
|
32
|
+
### Environment
|
|
33
|
+
- [ ] Environment variables configured
|
|
34
|
+
- [ ] Secrets rotated if needed
|
|
35
|
+
- [ ] Database migrations ready
|
|
36
|
+
- [ ] Feature flags set correctly
|
|
37
|
+
|
|
38
|
+
### Safety
|
|
39
|
+
- [ ] Rollback plan documented
|
|
40
|
+
- [ ] Database backup taken
|
|
41
|
+
- [ ] Monitoring alerts configured
|
|
42
|
+
- [ ] On-call team notified
|
|
43
|
+
|
|
44
|
+
## Deployment Workflow
|
|
45
|
+
|
|
46
|
+
### Phase 1: Prepare
|
|
47
|
+
- Run full test suite
|
|
48
|
+
- Build production artifacts
|
|
49
|
+
- Verify environment config
|
|
50
|
+
|
|
51
|
+
### Phase 2: Backup
|
|
52
|
+
- Database snapshot
|
|
53
|
+
- Note current deployed version (git SHA)
|
|
54
|
+
- Export current config
|
|
55
|
+
|
|
56
|
+
### Phase 3: Deploy
|
|
57
|
+
- Run database migrations
|
|
58
|
+
- Deploy application
|
|
59
|
+
- Verify health checks pass
|
|
60
|
+
|
|
61
|
+
### Phase 4: Verify
|
|
62
|
+
- [ ] Health endpoint responding
|
|
63
|
+
- [ ] Key user flows working
|
|
64
|
+
- [ ] No error rate spike
|
|
65
|
+
- [ ] Performance metrics normal
|
|
66
|
+
- [ ] Logs show expected behavior
|
|
67
|
+
|
|
68
|
+
### Phase 5: Confirm or Rollback
|
|
69
|
+
- If all checks pass: mark deployment complete
|
|
70
|
+
- If issues found: execute rollback plan
|
|
71
|
+
|
|
72
|
+
## Zero-Downtime Strategies
|
|
73
|
+
|
|
74
|
+
| Strategy | How It Works | Best For |
|
|
75
|
+
|----------|-------------|----------|
|
|
76
|
+
| **Rolling** | Replace instances one at a time | Standard deployments |
|
|
77
|
+
| **Blue-Green** | Switch traffic between two environments | Critical services |
|
|
78
|
+
| **Canary** | Route small % of traffic to new version | High-risk changes |
|
|
79
|
+
|
|
80
|
+
## Rollback Plan
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Quick rollback
|
|
84
|
+
git revert HEAD
|
|
85
|
+
git push origin main
|
|
86
|
+
|
|
87
|
+
# Database rollback
|
|
88
|
+
npm run migrate:rollback
|
|
89
|
+
# OR: flyway undo / alembic downgrade
|
|
90
|
+
|
|
91
|
+
# Container rollback
|
|
92
|
+
docker pull app:previous-version
|
|
93
|
+
docker-compose up -d
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Anti-Patterns
|
|
97
|
+
|
|
98
|
+
| Don't | Do Instead |
|
|
99
|
+
|-------|-----------|
|
|
100
|
+
| Deploy on Friday afternoon | Deploy early in the week |
|
|
101
|
+
| Skip staging | Always test in staging first |
|
|
102
|
+
| Deploy without monitoring | Set up alerts before deploy |
|
|
103
|
+
| Big bang releases | Small, incremental deployments |
|
|
104
|
+
| Manual deployments | Automate with CI/CD |
|
|
105
|
+
| Skip database backups | Always backup before migrations |
|