superkit-mcp-server 1.0.2 → 1.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/ARCHITECTURE.md +102 -102
- package/README.md +67 -63
- package/SUPERKIT.md +168 -168
- package/agents/code-archaeologist.md +106 -0
- package/agents/coder.md +90 -90
- package/agents/data-engineer.md +28 -28
- package/agents/devops-engineer.md +242 -0
- package/agents/git-manager.md +203 -203
- package/agents/orchestrator.md +4 -0
- package/agents/penetration-tester.md +188 -0
- package/agents/performance-optimizer.md +187 -0
- package/agents/planner.md +270 -270
- package/agents/qa-automation-engineer.md +103 -0
- package/agents/quant-developer.md +32 -28
- package/agents/reviewer.md +100 -100
- package/agents/scout.md +222 -222
- package/agents/tester.md +274 -274
- package/agents/ui-designer.md +208 -208
- package/build/index.js +53 -1
- package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
- package/build/tools/validators/__tests__/convertRules.test.js +5 -5
- package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
- package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
- package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
- package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
- package/build/tools/validators/__tests__/securityScan.test.js +6 -6
- package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
- package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
- package/package.json +33 -33
- package/skills/meta/README.md +30 -30
- package/skills/meta/api-design/SKILL.md +134 -134
- package/skills/meta/code-review/SKILL.md +44 -37
- package/skills/meta/code-review/checklists/pre-merge.md +25 -25
- package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
- package/skills/meta/code-review/workflows/performance-pass.md +27 -27
- package/skills/meta/code-review/workflows/security-pass.md +29 -29
- package/skills/meta/compound-docs/SKILL.md +133 -133
- package/skills/meta/debug/SKILL.md +40 -40
- package/skills/meta/debug/templates/bug-report.template.md +31 -31
- package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
- package/skills/meta/docker/SKILL.md +126 -126
- package/skills/meta/examples/supabase/SKILL.md +46 -46
- package/skills/meta/examples/supabase/references/best-practices.md +319 -319
- package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
- package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
- package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
- package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
- package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
- package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
- package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
- package/skills/meta/file-todos/SKILL.md +88 -88
- package/skills/meta/mobile/SKILL.md +140 -140
- package/skills/meta/nextjs/SKILL.md +101 -101
- package/skills/meta/performance/SKILL.md +130 -130
- package/skills/meta/react-patterns/SKILL.md +83 -83
- package/skills/meta/security/SKILL.md +114 -114
- package/skills/meta/session-resume/SKILL.md +96 -96
- package/skills/meta/tailwind/SKILL.md +139 -139
- package/skills/meta/testing/SKILL.md +43 -43
- package/skills/meta/testing/references/vitest-patterns.md +45 -45
- package/skills/meta/testing/templates/component-test.template.tsx +37 -37
- package/skills/tech/alpha-vantage/SKILL.md +142 -0
- package/skills/tech/alpha-vantage/references/commodities.md +153 -0
- package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -0
- package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -0
- package/skills/tech/alpha-vantage/references/fundamentals.md +223 -0
- package/skills/tech/alpha-vantage/references/intelligence.md +138 -0
- package/skills/tech/alpha-vantage/references/options.md +93 -0
- package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -0
- package/skills/tech/alpha-vantage/references/time-series.md +157 -0
- package/skills/tech/financial-modeling/SKILL.md +18 -0
- package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -0
- package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -0
- package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -0
- package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -0
- package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1211 -0
- package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -0
- package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -0
- package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -0
- package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -0
- package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -0
- package/skills/tech/intelligent-routing/SKILL.md +5 -5
- package/workflows/README.md +191 -191
- package/workflows/adr.md +174 -174
- package/workflows/changelog.md +74 -74
- package/workflows/compound.md +323 -323
- package/workflows/compound_health.md +74 -74
- package/workflows/create-agent-skill.md +139 -139
- package/workflows/cycle.md +144 -144
- package/workflows/deploy-docs.md +84 -84
- package/workflows/development-rules.md +37 -37
- package/workflows/doc.md +95 -95
- package/workflows/documentation-management.md +29 -29
- package/workflows/explore.md +146 -146
- package/workflows/generate_command.md +106 -106
- package/workflows/heal-skill.md +97 -97
- package/workflows/housekeeping.md +229 -229
- package/workflows/kit-setup.md +102 -102
- package/workflows/map-codebase.md +78 -0
- package/workflows/orchestration-protocol.md +38 -38
- package/workflows/plan-compound.md +439 -433
- package/workflows/plan_review.md +269 -248
- package/workflows/primary-workflow.md +32 -32
- package/workflows/promote_pattern.md +86 -86
- package/workflows/release-docs.md +82 -82
- package/workflows/report-bug.md +135 -135
- package/workflows/reproduce-bug.md +118 -118
- package/workflows/resolve_pr.md +133 -133
- package/workflows/resolve_todo.md +128 -128
- package/workflows/review-compound.md +376 -359
- package/workflows/skill-review.md +127 -127
- package/workflows/specs.md +257 -257
- package/workflows/triage-sprint.md +102 -102
- package/workflows/triage.md +152 -152
- package/workflows/work.md +399 -399
- package/workflows/xcode-test.md +93 -93
|
@@ -11,16 +11,16 @@ describe('mobileAudit', () => {
|
|
|
11
11
|
name: 'Screen.tsx',
|
|
12
12
|
isDirectory: () => false
|
|
13
13
|
}]);
|
|
14
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
-
import React from 'react';
|
|
16
|
-
import { View, ScrollView } from 'react-native';
|
|
17
|
-
export const Screen = () => {
|
|
18
|
-
return (
|
|
19
|
-
<ScrollView>
|
|
20
|
-
{data.map(d => <View key={index} />)}
|
|
21
|
-
</ScrollView>
|
|
22
|
-
)
|
|
23
|
-
}
|
|
14
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
+
import React from 'react';
|
|
16
|
+
import { View, ScrollView } from 'react-native';
|
|
17
|
+
export const Screen = () => {
|
|
18
|
+
return (
|
|
19
|
+
<ScrollView>
|
|
20
|
+
{data.map(d => <View key={index} />)}
|
|
21
|
+
</ScrollView>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
24
|
`);
|
|
25
25
|
const res = await runMobileAudit('.');
|
|
26
26
|
expect(res.passed).toBe(false);
|
|
@@ -31,8 +31,8 @@ describe('mobileAudit', () => {
|
|
|
31
31
|
name: 'regular.tsx',
|
|
32
32
|
isDirectory: () => false
|
|
33
33
|
}]);
|
|
34
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
-
export const App = () => <div>Hello Web</div>
|
|
34
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
+
export const App = () => <div>Hello Web</div>
|
|
36
36
|
`);
|
|
37
37
|
const res = await runMobileAudit('.');
|
|
38
38
|
expect(res.passed).toBe(true);
|
|
@@ -11,14 +11,14 @@ describe('reactPerformanceChecker', () => {
|
|
|
11
11
|
name: 'Home.tsx',
|
|
12
12
|
isDirectory: () => false
|
|
13
13
|
}]);
|
|
14
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
-
import { something } from '@/components/index';
|
|
16
|
-
|
|
17
|
-
async function loadData() {
|
|
18
|
-
const a = await fetchA();
|
|
19
|
-
const b = await fetchB();
|
|
20
|
-
return { a, b };
|
|
21
|
-
}
|
|
14
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
+
import { something } from '@/components/index';
|
|
16
|
+
|
|
17
|
+
async function loadData() {
|
|
18
|
+
const a = await fetchA();
|
|
19
|
+
const b = await fetchB();
|
|
20
|
+
return { a, b };
|
|
21
|
+
}
|
|
22
22
|
`);
|
|
23
23
|
const res = await runReactPerformanceChecker('.');
|
|
24
24
|
console.log("RPC BAD REPORT:", res.report);
|
|
@@ -31,15 +31,15 @@ describe('reactPerformanceChecker', () => {
|
|
|
31
31
|
name: 'App.tsx',
|
|
32
32
|
isDirectory: () => false
|
|
33
33
|
}]);
|
|
34
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
-
import { useQuery } from '@tanstack/react-query';
|
|
36
|
-
import Image from 'next/image';
|
|
37
|
-
|
|
38
|
-
const App = React.memo((props: Props) => {
|
|
39
|
-
const q = useQuery('data', fetchParallel);
|
|
40
|
-
return <Image src="foo" alt="bar" />
|
|
41
|
-
});
|
|
42
|
-
export default App;
|
|
34
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
+
import { useQuery } from '@tanstack/react-query';
|
|
36
|
+
import Image from 'next/image';
|
|
37
|
+
|
|
38
|
+
const App = React.memo((props: Props) => {
|
|
39
|
+
const q = useQuery('data', fetchParallel);
|
|
40
|
+
return <Image src="foo" alt="bar" />
|
|
41
|
+
});
|
|
42
|
+
export default App;
|
|
43
43
|
`);
|
|
44
44
|
const res = await runReactPerformanceChecker('.');
|
|
45
45
|
console.log("RPC GOOD REPORT:", res.report);
|
|
@@ -13,8 +13,8 @@ describe('securityScan', () => {
|
|
|
13
13
|
name: 'config.json',
|
|
14
14
|
isDirectory: () => false
|
|
15
15
|
}]);
|
|
16
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
17
|
-
{ "aws_key": "AKIA1234567890123456" }
|
|
16
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
17
|
+
{ "aws_key": "AKIA1234567890123456" }
|
|
18
18
|
`);
|
|
19
19
|
const result = await scanSecrets('/mock');
|
|
20
20
|
expect(result.findings).toBeDefined();
|
|
@@ -28,10 +28,10 @@ describe('securityScan', () => {
|
|
|
28
28
|
name: 'bad_code.js',
|
|
29
29
|
isDirectory: () => false
|
|
30
30
|
}]);
|
|
31
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
32
|
-
eval('2 + 2');
|
|
33
|
-
import { exec } from 'child_process';
|
|
34
|
-
child_process.exec('rm -rf /');
|
|
31
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
32
|
+
eval('2 + 2');
|
|
33
|
+
import { exec } from 'child_process';
|
|
34
|
+
child_process.exec('rm -rf /');
|
|
35
35
|
`);
|
|
36
36
|
const result = await scanCodePatterns('/mock');
|
|
37
37
|
expect(result.findings.length).toBeGreaterThan(1);
|
|
@@ -11,22 +11,22 @@ describe('seoChecker', () => {
|
|
|
11
11
|
name: 'index.tsx', // valid page layout file
|
|
12
12
|
isDirectory: () => false
|
|
13
13
|
}]);
|
|
14
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
-
export default function Index() {
|
|
16
|
-
return (
|
|
17
|
-
<html>
|
|
18
|
-
<head>
|
|
19
|
-
<title>Oops missing description and og</title>
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
<h1>Title</h1>
|
|
23
|
-
<h1>Duplicate Title</h1>
|
|
24
|
-
<img src="foo" />
|
|
25
|
-
<img src="bar" alt="" />
|
|
26
|
-
</body>
|
|
27
|
-
</html>
|
|
28
|
-
)
|
|
29
|
-
}
|
|
14
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
+
export default function Index() {
|
|
16
|
+
return (
|
|
17
|
+
<html>
|
|
18
|
+
<head>
|
|
19
|
+
<title>Oops missing description and og</title>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<h1>Title</h1>
|
|
23
|
+
<h1>Duplicate Title</h1>
|
|
24
|
+
<img src="foo" />
|
|
25
|
+
<img src="bar" alt="" />
|
|
26
|
+
</body>
|
|
27
|
+
</html>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
30
|
`);
|
|
31
31
|
const res = await runSeoChecker('.');
|
|
32
32
|
expect(res.passed).toBe(false);
|
|
@@ -14,9 +14,9 @@ describe('typeCoverage', () => {
|
|
|
14
14
|
isDirectory: () => false
|
|
15
15
|
}]);
|
|
16
16
|
// Mock readFile to return a snippet with an untyped function and an "any"
|
|
17
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
18
|
-
function test(): any { return 1; }
|
|
19
|
-
const test2 = (x) => console.log(x);
|
|
17
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
18
|
+
function test(): any { return 1; }
|
|
19
|
+
const test2 = (x) => console.log(x);
|
|
20
20
|
`);
|
|
21
21
|
const result = await checkTypescriptCoverage('/mock/folder');
|
|
22
22
|
expect(result.type).toBe('typescript');
|
|
@@ -29,8 +29,8 @@ describe('typeCoverage', () => {
|
|
|
29
29
|
name: 'good.ts',
|
|
30
30
|
isDirectory: () => false
|
|
31
31
|
}]);
|
|
32
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
33
|
-
function typedFunc(val: string): number { return val.length; }
|
|
32
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
33
|
+
function typedFunc(val: string): number { return val.length; }
|
|
34
34
|
`);
|
|
35
35
|
const result = await checkTypescriptCoverage('/mock/good');
|
|
36
36
|
expect(result.stats.any_count).toBe(0);
|
|
@@ -44,15 +44,15 @@ describe('typeCoverage', () => {
|
|
|
44
44
|
name: 'script.py',
|
|
45
45
|
isDirectory: () => false
|
|
46
46
|
}]);
|
|
47
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
48
|
-
def bad_func(arg):
|
|
49
|
-
pass
|
|
50
|
-
|
|
51
|
-
def good_func(arg: str) -> bool:
|
|
52
|
-
return True
|
|
53
|
-
|
|
54
|
-
def any_func(arg: Any) -> Any:
|
|
55
|
-
pass
|
|
47
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
48
|
+
def bad_func(arg):
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
def good_func(arg: str) -> bool:
|
|
52
|
+
return True
|
|
53
|
+
|
|
54
|
+
def any_func(arg: Any) -> Any:
|
|
55
|
+
pass
|
|
56
56
|
`);
|
|
57
57
|
const result = await checkPythonCoverage('/mock/py');
|
|
58
58
|
expect(result.stats.any_count).toBeGreaterThan(0);
|
package/package.json
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "superkit-mcp-server",
|
|
3
|
-
"version": "1.0
|
|
4
|
-
"type": "module",
|
|
5
|
-
"description": "An MCP server for exploring and loading Super-Kit AI agent resources.",
|
|
6
|
-
"main": "build/index.js",
|
|
7
|
-
"bin": {
|
|
8
|
-
"superkit-mcp-server": "./build/index.js"
|
|
9
|
-
},
|
|
10
|
-
"scripts": {
|
|
11
|
-
"build": "tsc",
|
|
12
|
-
"start": "node build/index.js",
|
|
13
|
-
"dev": "tsc --watch"
|
|
14
|
-
},
|
|
15
|
-
"dependencies": {
|
|
16
|
-
"@modelcontextprotocol/sdk": "^1.4.1",
|
|
17
|
-
"playwright": "^1.58.2",
|
|
18
|
-
"zod": "^3.23.8"
|
|
19
|
-
},
|
|
20
|
-
"devDependencies": {
|
|
21
|
-
"@types/node": "^22.19.13",
|
|
22
|
-
"typescript": "^5.7.2",
|
|
23
|
-
"vitest": "^4.0.18"
|
|
24
|
-
},
|
|
25
|
-
"files": [
|
|
26
|
-
"build/",
|
|
27
|
-
"agents/",
|
|
28
|
-
"skills/",
|
|
29
|
-
"workflows/",
|
|
30
|
-
"SUPERKIT.md",
|
|
31
|
-
"README.md",
|
|
32
|
-
"ARCHITECTURE.md"
|
|
33
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"name": "superkit-mcp-server",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "An MCP server for exploring and loading Super-Kit AI agent resources.",
|
|
6
|
+
"main": "build/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"superkit-mcp-server": "./build/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"start": "node build/index.js",
|
|
13
|
+
"dev": "tsc --watch"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@modelcontextprotocol/sdk": "^1.4.1",
|
|
17
|
+
"playwright": "^1.58.2",
|
|
18
|
+
"zod": "^3.23.8"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^22.19.13",
|
|
22
|
+
"typescript": "^5.7.2",
|
|
23
|
+
"vitest": "^4.0.18"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"build/",
|
|
27
|
+
"agents/",
|
|
28
|
+
"skills/",
|
|
29
|
+
"workflows/",
|
|
30
|
+
"SUPERKIT.md",
|
|
31
|
+
"README.md",
|
|
32
|
+
"ARCHITECTURE.md"
|
|
33
|
+
]
|
|
34
34
|
}
|
package/skills/meta/README.md
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# Agent Skills & Capabilities
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
The "brain" of the AI Agent. This directory contains the definitions, memories, and tools that enable the Agent to work effectively on the codebase.
|
|
5
|
-
|
|
6
|
-
## Components
|
|
7
|
-
|
|
8
|
-
| Component | Description |
|
|
9
|
-
|-----------|-------------|
|
|
10
|
-
| `compound-docs/` | Templates and logic for the Compounding Knowledge system. |
|
|
11
|
-
| `file-todos/` | Logic for the file-based task management system. |
|
|
12
|
-
| `session-resume/` | Context restoration protocols for new sessions. |
|
|
13
|
-
| `code-review/` | Checklists and workflows for automated code review. |
|
|
14
|
-
| `testing/` | Custom testing infrastructure and patterns. |
|
|
15
|
-
| `debug/` | Root-cause analysis and debugging protocols. |
|
|
16
|
-
| `react-hooks/` | Best practices and patterns for React development. |
|
|
17
|
-
| `examples/` | Project-specific or optional skill examples (e.g. Supabase). |
|
|
18
|
-
|
|
19
|
-
## Component Details
|
|
20
|
-
|
|
21
|
-
### `compound-docs/`
|
|
22
|
-
Contains the `SKILL.md` instruction set and template files used by the `/compound` workflow to generate persistent documentation.
|
|
23
|
-
|
|
24
|
-
### `file-todos/`
|
|
25
|
-
Contains the logic for managing the `todos/` directory, including status transitions and priority handling.
|
|
26
|
-
|
|
27
|
-
## Changelog
|
|
28
|
-
|
|
29
|
-
### 2025-12-23
|
|
30
|
-
- Initialized README documentation.
|
|
1
|
+
# Agent Skills & Capabilities
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
The "brain" of the AI Agent. This directory contains the definitions, memories, and tools that enable the Agent to work effectively on the codebase.
|
|
5
|
+
|
|
6
|
+
## Components
|
|
7
|
+
|
|
8
|
+
| Component | Description |
|
|
9
|
+
|-----------|-------------|
|
|
10
|
+
| `compound-docs/` | Templates and logic for the Compounding Knowledge system. |
|
|
11
|
+
| `file-todos/` | Logic for the file-based task management system. |
|
|
12
|
+
| `session-resume/` | Context restoration protocols for new sessions. |
|
|
13
|
+
| `code-review/` | Checklists and workflows for automated code review. |
|
|
14
|
+
| `testing/` | Custom testing infrastructure and patterns. |
|
|
15
|
+
| `debug/` | Root-cause analysis and debugging protocols. |
|
|
16
|
+
| `react-hooks/` | Best practices and patterns for React development. |
|
|
17
|
+
| `examples/` | Project-specific or optional skill examples (e.g. Supabase). |
|
|
18
|
+
|
|
19
|
+
## Component Details
|
|
20
|
+
|
|
21
|
+
### `compound-docs/`
|
|
22
|
+
Contains the `SKILL.md` instruction set and template files used by the `/compound` workflow to generate persistent documentation.
|
|
23
|
+
|
|
24
|
+
### `file-todos/`
|
|
25
|
+
Contains the logic for managing the `todos/` directory, including status transitions and priority handling.
|
|
26
|
+
|
|
27
|
+
## Changelog
|
|
28
|
+
|
|
29
|
+
### 2025-12-23
|
|
30
|
+
- Initialized README documentation.
|
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
# API Design Skill
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
RESTful API patterns, GraphQL design, and API best practices.
|
|
5
|
-
|
|
6
|
-
## RESTful Design Principles
|
|
7
|
-
|
|
8
|
-
### 1. Resource Naming
|
|
9
|
-
```
|
|
10
|
-
✅ Good:
|
|
11
|
-
GET /users # List users
|
|
12
|
-
GET /users/123 # Get user
|
|
13
|
-
POST /users # Create user
|
|
14
|
-
PUT /users/123 # Update user
|
|
15
|
-
DELETE /users/123 # Delete user
|
|
16
|
-
|
|
17
|
-
❌ Bad:
|
|
18
|
-
GET /getUsers
|
|
19
|
-
POST /createUser
|
|
20
|
-
GET /user/delete/123
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### 2. HTTP Status Codes
|
|
24
|
-
```typescript
|
|
25
|
-
// Success
|
|
26
|
-
200 OK - Successful GET/PUT
|
|
27
|
-
201 Created - Successful POST
|
|
28
|
-
204 No Content - Successful DELETE
|
|
29
|
-
|
|
30
|
-
// Client Errors
|
|
31
|
-
400 Bad Request - Invalid input
|
|
32
|
-
401 Unauthorized - Auth required
|
|
33
|
-
403 Forbidden - No permission
|
|
34
|
-
404 Not Found - Resource doesn't exist
|
|
35
|
-
422 Unprocessable - Validation failed
|
|
36
|
-
|
|
37
|
-
// Server Errors
|
|
38
|
-
500 Internal Error - Server bug
|
|
39
|
-
503 Service Unavailable - Maintenance
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### 3. Response Format
|
|
43
|
-
```typescript
|
|
44
|
-
// Success response
|
|
45
|
-
{
|
|
46
|
-
"data": {
|
|
47
|
-
"id": "123",
|
|
48
|
-
"name": "John",
|
|
49
|
-
"email": "john@example.com"
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Error response
|
|
54
|
-
{
|
|
55
|
-
"error": {
|
|
56
|
-
"code": "VALIDATION_ERROR",
|
|
57
|
-
"message": "Email is required",
|
|
58
|
-
"details": [
|
|
59
|
-
{ "field": "email", "message": "This field is required" }
|
|
60
|
-
]
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// List with pagination
|
|
65
|
-
{
|
|
66
|
-
"data": [...],
|
|
67
|
-
"meta": {
|
|
68
|
-
"page": 1,
|
|
69
|
-
"perPage": 20,
|
|
70
|
-
"total": 150,
|
|
71
|
-
"totalPages": 8
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### 4. Pagination
|
|
77
|
-
```typescript
|
|
78
|
-
// Offset-based
|
|
79
|
-
GET /posts?page=2&limit=20
|
|
80
|
-
|
|
81
|
-
// Cursor-based (better for large datasets)
|
|
82
|
-
GET /posts?cursor=abc123&limit=20
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 5. Filtering & Sorting
|
|
86
|
-
```typescript
|
|
87
|
-
// Filtering
|
|
88
|
-
GET /posts?status=published&author=123
|
|
89
|
-
|
|
90
|
-
// Sorting
|
|
91
|
-
GET /posts?sort=-createdAt,title // - for DESC
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## API Versioning
|
|
95
|
-
```typescript
|
|
96
|
-
// URL versioning (recommended)
|
|
97
|
-
GET /api/v1/users
|
|
98
|
-
|
|
99
|
-
// Header versioning
|
|
100
|
-
GET /api/users
|
|
101
|
-
Accept: application/vnd.myapp.v1+json
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
## Rate Limiting
|
|
105
|
-
```typescript
|
|
106
|
-
import rateLimit from 'express-rate-limit';
|
|
107
|
-
|
|
108
|
-
const limiter = rateLimit({
|
|
109
|
-
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
110
|
-
max: 100, // 100 requests per window
|
|
111
|
-
message: { error: 'Too many requests' },
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
app.use('/api/', limiter);
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## Input Validation
|
|
118
|
-
```typescript
|
|
119
|
-
import { z } from 'zod';
|
|
120
|
-
|
|
121
|
-
const CreateUserSchema = z.object({
|
|
122
|
-
name: z.string().min(2).max(100),
|
|
123
|
-
email: z.string().email(),
|
|
124
|
-
age: z.number().int().min(0).max(150).optional(),
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
function createUser(req, res) {
|
|
128
|
-
const result = CreateUserSchema.safeParse(req.body);
|
|
129
|
-
if (!result.success) {
|
|
130
|
-
return res.status(422).json({ error: result.error });
|
|
131
|
-
}
|
|
132
|
-
// Process validated data
|
|
133
|
-
}
|
|
134
|
-
```
|
|
1
|
+
# API Design Skill
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
RESTful API patterns, GraphQL design, and API best practices.
|
|
5
|
+
|
|
6
|
+
## RESTful Design Principles
|
|
7
|
+
|
|
8
|
+
### 1. Resource Naming
|
|
9
|
+
```
|
|
10
|
+
✅ Good:
|
|
11
|
+
GET /users # List users
|
|
12
|
+
GET /users/123 # Get user
|
|
13
|
+
POST /users # Create user
|
|
14
|
+
PUT /users/123 # Update user
|
|
15
|
+
DELETE /users/123 # Delete user
|
|
16
|
+
|
|
17
|
+
❌ Bad:
|
|
18
|
+
GET /getUsers
|
|
19
|
+
POST /createUser
|
|
20
|
+
GET /user/delete/123
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 2. HTTP Status Codes
|
|
24
|
+
```typescript
|
|
25
|
+
// Success
|
|
26
|
+
200 OK - Successful GET/PUT
|
|
27
|
+
201 Created - Successful POST
|
|
28
|
+
204 No Content - Successful DELETE
|
|
29
|
+
|
|
30
|
+
// Client Errors
|
|
31
|
+
400 Bad Request - Invalid input
|
|
32
|
+
401 Unauthorized - Auth required
|
|
33
|
+
403 Forbidden - No permission
|
|
34
|
+
404 Not Found - Resource doesn't exist
|
|
35
|
+
422 Unprocessable - Validation failed
|
|
36
|
+
|
|
37
|
+
// Server Errors
|
|
38
|
+
500 Internal Error - Server bug
|
|
39
|
+
503 Service Unavailable - Maintenance
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 3. Response Format
|
|
43
|
+
```typescript
|
|
44
|
+
// Success response
|
|
45
|
+
{
|
|
46
|
+
"data": {
|
|
47
|
+
"id": "123",
|
|
48
|
+
"name": "John",
|
|
49
|
+
"email": "john@example.com"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Error response
|
|
54
|
+
{
|
|
55
|
+
"error": {
|
|
56
|
+
"code": "VALIDATION_ERROR",
|
|
57
|
+
"message": "Email is required",
|
|
58
|
+
"details": [
|
|
59
|
+
{ "field": "email", "message": "This field is required" }
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// List with pagination
|
|
65
|
+
{
|
|
66
|
+
"data": [...],
|
|
67
|
+
"meta": {
|
|
68
|
+
"page": 1,
|
|
69
|
+
"perPage": 20,
|
|
70
|
+
"total": 150,
|
|
71
|
+
"totalPages": 8
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 4. Pagination
|
|
77
|
+
```typescript
|
|
78
|
+
// Offset-based
|
|
79
|
+
GET /posts?page=2&limit=20
|
|
80
|
+
|
|
81
|
+
// Cursor-based (better for large datasets)
|
|
82
|
+
GET /posts?cursor=abc123&limit=20
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 5. Filtering & Sorting
|
|
86
|
+
```typescript
|
|
87
|
+
// Filtering
|
|
88
|
+
GET /posts?status=published&author=123
|
|
89
|
+
|
|
90
|
+
// Sorting
|
|
91
|
+
GET /posts?sort=-createdAt,title // - for DESC
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## API Versioning
|
|
95
|
+
```typescript
|
|
96
|
+
// URL versioning (recommended)
|
|
97
|
+
GET /api/v1/users
|
|
98
|
+
|
|
99
|
+
// Header versioning
|
|
100
|
+
GET /api/users
|
|
101
|
+
Accept: application/vnd.myapp.v1+json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Rate Limiting
|
|
105
|
+
```typescript
|
|
106
|
+
import rateLimit from 'express-rate-limit';
|
|
107
|
+
|
|
108
|
+
const limiter = rateLimit({
|
|
109
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
110
|
+
max: 100, // 100 requests per window
|
|
111
|
+
message: { error: 'Too many requests' },
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
app.use('/api/', limiter);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Input Validation
|
|
118
|
+
```typescript
|
|
119
|
+
import { z } from 'zod';
|
|
120
|
+
|
|
121
|
+
const CreateUserSchema = z.object({
|
|
122
|
+
name: z.string().min(2).max(100),
|
|
123
|
+
email: z.string().email(),
|
|
124
|
+
age: z.number().int().min(0).max(150).optional(),
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
function createUser(req, res) {
|
|
128
|
+
const result = CreateUserSchema.safeParse(req.body);
|
|
129
|
+
if (!result.success) {
|
|
130
|
+
return res.status(422).json({ error: result.error });
|
|
131
|
+
}
|
|
132
|
+
// Process validated data
|
|
133
|
+
}
|
|
134
|
+
```
|