Skip to content

Commit 8f07c4e

Browse files
authored
Merge pull request #2 from vercel-labs/add-services-skill
Add services skill
2 parents 05c4b57 + 76d6dd1 commit 8f07c4e

13 files changed

Lines changed: 460 additions & 8 deletions

File tree

generated/build-from-skills.manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"version": 1,
3-
"generatedAt": "2026-03-12T01:01:33.146Z",
3+
"generatedAt": "2026-03-13T19:50:01.129Z",
44
"templates": [
55
{
66
"template": "agents/ai-architect.md.tmpl",

generated/skill-catalog.md

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# Skill Catalog
22

33
> Auto-generated by `scripts/generate-catalog.ts` — do not edit manually.
4-
> Generated: 2026-03-12T01:01:20.029Z
5-
> Skills: 46
4+
> Generated: 2026-03-13T19:55:41.251Z
5+
> Skills: 47
66
77
## Table of Contents
88

@@ -24,6 +24,7 @@
2424
| `ai-gateway` | 7 | 0 | 5 | 2 |
2525
| `env-vars` | 7 | 10 | 4 | 0 |
2626
| `vercel-api` | 7 | 2 | 6 | 0 |
27+
| `vercel-services` | 7 | 12 | 6 | 1 |
2728
| `vercel-storage` | 7 | 15 | 48 | 8 |
2829
| `verification` | 7 | 0 | 8 | 0 |
2930
| `ai-generation-persistence` | 6 | 10 | 0 | 5 |
@@ -389,6 +390,33 @@
389390
- `.mcp.json` (path)
390391
- `.vercel/project.json` (path)
391392

393+
#### `vercel-services` (priority 7)
394+
395+
**Path patterns:**
396+
- `backend/**`
397+
- `backend/main.py`
398+
- `backend/main.go`
399+
- `backend/go.mod`
400+
- `backend/pyproject.toml`
401+
- `backend/requirements.txt`
402+
- `frontend/**`
403+
- `apps/*/backend/**`
404+
- `apps/*/frontend/**`
405+
- `services/*/vercel.json`
406+
- `*/pyproject.toml`
407+
- `*/go.mod`
408+
409+
**Bash patterns:**
410+
- `\bvercel\s+dev\b.*-L`
411+
- `\bpip\s+install\b.*fastapi`
412+
- `\buv\s+(sync|pip|run)\b`
413+
- `\bgo\s+(run|build|mod)\b`
414+
- `\bpython\s+-m\s+uvicorn\b`
415+
- `\buvicorn\b`
416+
417+
**Import patterns:**
418+
- `fastapi`
419+
392420
#### `vercel-storage` (priority 7)
393421

394422
**Path patterns:**
@@ -1479,7 +1507,7 @@ Shows which skills compete on shared bash commands.
14791507

14801508
**Priority 8:** `ai-sdk`, `bootstrap`, `chat-sdk`, `investigation-mode`, `vercel-functions`
14811509

1482-
**Priority 7:** `ai-gateway`, `env-vars`, `vercel-api`, `vercel-storage`, `verification`
1510+
**Priority 7:** `ai-gateway`, `env-vars`, `vercel-api`, `vercel-services`, `vercel-storage`, `verification`
14831511

14841512
**Priority 6:** `ai-generation-persistence`, `auth`, `cron-jobs`, `deployments-cicd`, `next-forge`, `observability`, `routing-middleware`, `runtime-cache`, `shadcn`, `sign-in-with-vercel`, `vercel-flags`
14851513

generated/skill-manifest.json

Lines changed: 155 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"generatedAt": "2026-03-12T01:01:33.116Z",
2+
"generatedAt": "2026-03-13T19:50:01.103Z",
33
"version": 2,
44
"skills": {
55
"vercel-agent": {
@@ -2889,6 +2889,160 @@
28892889
"examples": []
28902890
}
28912891
},
2892+
"vercel-services": {
2893+
"priority": 7,
2894+
"summary": "Deploy multiple services in one Vercel project — e.g. a Python backend alongside a JS frontend",
2895+
"docs": [
2896+
"https://vercel.com/docs/services"
2897+
],
2898+
"sitemap": "https://vercel.com/sitemap/docs.xml",
2899+
"pathPatterns": [
2900+
"backend/**",
2901+
"backend/main.py",
2902+
"backend/main.go",
2903+
"backend/go.mod",
2904+
"backend/pyproject.toml",
2905+
"backend/requirements.txt",
2906+
"frontend/**",
2907+
"apps/*/backend/**",
2908+
"apps/*/frontend/**",
2909+
"services/*/vercel.json",
2910+
"*/pyproject.toml",
2911+
"*/go.mod"
2912+
],
2913+
"bashPatterns": [
2914+
"\\bvercel\\s+dev\\b.*-L",
2915+
"\\bpip\\s+install\\b.*fastapi",
2916+
"\\buv\\s+(sync|pip|run)\\b",
2917+
"\\bgo\\s+(run|build|mod)\\b",
2918+
"\\bpython\\s+-m\\s+uvicorn\\b",
2919+
"\\buvicorn\\b"
2920+
],
2921+
"importPatterns": [
2922+
"fastapi"
2923+
],
2924+
"bodyPath": "skills/vercel-services/SKILL.md",
2925+
"pathRegexSources": [
2926+
"^backend\\/.*$",
2927+
"^backend\\/main\\.py$",
2928+
"^backend\\/main\\.go$",
2929+
"^backend\\/go\\.mod$",
2930+
"^backend\\/pyproject\\.toml$",
2931+
"^backend\\/requirements\\.txt$",
2932+
"^frontend\\/.*$",
2933+
"^apps\\/[^/]*\\/backend\\/.*$",
2934+
"^apps\\/[^/]*\\/frontend\\/.*$",
2935+
"^services\\/[^/]*\\/vercel\\.json$",
2936+
"^[^/]*\\/pyproject\\.toml$",
2937+
"^[^/]*\\/go\\.mod$"
2938+
],
2939+
"bashRegexSources": [
2940+
"\\bvercel\\s+dev\\b.*-L",
2941+
"\\bpip\\s+install\\b.*fastapi",
2942+
"\\buv\\s+(sync|pip|run)\\b",
2943+
"\\bgo\\s+(run|build|mod)\\b",
2944+
"\\bpython\\s+-m\\s+uvicorn\\b",
2945+
"\\buvicorn\\b"
2946+
],
2947+
"importRegexSources": [
2948+
{
2949+
"source": "(?:from\\s+|require\\s*\\(\\s*|import\\s*\\(\\s*)['\"]fastapi(?:\\/[^'\"]*)?['\"]",
2950+
"flags": "m"
2951+
}
2952+
],
2953+
"validate": [
2954+
{
2955+
"pattern": "@app\\.(get|post|put|delete|patch)\\s*\\(\\s*[''\"]\\/api\\/",
2956+
"message": "Do not include routePrefix in backend routes — Vercel strips the prefix before forwarding. Use @app.get(\"/health\") not @app.get(\"/api/health\")",
2957+
"severity": "error"
2958+
},
2959+
{
2960+
"pattern": "http\\.HandleFunc\\s*\\(\\s*[''\"]\\/api\\/",
2961+
"message": "Do not include routePrefix in Go handlers — Vercel strips the prefix. Use \"/health\" not \"/api/health\"",
2962+
"severity": "error"
2963+
}
2964+
],
2965+
"promptSignals": {
2966+
"phrases": [
2967+
"services api",
2968+
"vercel services",
2969+
"multi-service",
2970+
"python backend",
2971+
"go backend",
2972+
"fastapi",
2973+
"deploy backend",
2974+
"backend and frontend",
2975+
"multiple services"
2976+
],
2977+
"allOf": [
2978+
[
2979+
"backend",
2980+
"frontend"
2981+
],
2982+
[
2983+
"python",
2984+
"vercel"
2985+
],
2986+
[
2987+
"go",
2988+
"vercel"
2989+
],
2990+
[
2991+
"backend",
2992+
"deploy"
2993+
],
2994+
[
2995+
"service",
2996+
"monorepo"
2997+
],
2998+
[
2999+
"fastapi",
3000+
"deploy"
3001+
]
3002+
],
3003+
"anyOf": [
3004+
"backend",
3005+
"monorepo",
3006+
"service",
3007+
"python",
3008+
"golang"
3009+
],
3010+
"noneOf": [
3011+
"turborepo cache",
3012+
"turbo.json",
3013+
"aws lambda",
3014+
"docker compose"
3015+
],
3016+
"minScore": 6
3017+
},
3018+
"retrieval": {
3019+
"aliases": [
3020+
"multi-service",
3021+
"backend service",
3022+
"services api",
3023+
"monorepo deploy",
3024+
"monorepo services"
3025+
],
3026+
"intents": [
3027+
"deploy backend and frontend together on vercel",
3028+
"set up python backend alongside next.js frontend",
3029+
"configure multi-service vercel project",
3030+
"add go backend to vercel project"
3031+
],
3032+
"entities": [
3033+
"experimentalServices",
3034+
"routePrefix",
3035+
"entrypoint",
3036+
"Services API",
3037+
"vercel.json services"
3038+
],
3039+
"examples": [
3040+
"deploy a fastapi backend with a react frontend",
3041+
"add a go api service to my vercel project",
3042+
"set up a multi-service monorepo on vercel"
3043+
]
3044+
}
3045+
},
28923046
"observability": {
28933047
"priority": 6,
28943048
"summary": "",

hooks/session-start-profiler.mjs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,11 @@ var FILE_MARKERS = [
3232
{ file: "middleware.js", skills: ["routing-middleware"] },
3333
{ file: "components.json", skills: ["shadcn"] },
3434
{ file: ".env.local", skills: ["env-vars"] },
35-
{ file: "pnpm-workspace.yaml", skills: ["turborepo"] }
35+
{ file: "pnpm-workspace.yaml", skills: ["turborepo"] },
36+
{ file: "backend/pyproject.toml", skills: ["vercel-services"] },
37+
{ file: "backend/main.py", skills: ["vercel-services"] },
38+
{ file: "backend/go.mod", skills: ["vercel-services"] },
39+
{ file: "backend/main.go", skills: ["vercel-services"] }
3640
];
3741
var PACKAGE_MARKERS = {
3842
"next": ["nextjs"],
@@ -127,6 +131,7 @@ function profileProject(projectRoot) {
127131
skills.add("routing-middleware");
128132
}
129133
if (vercelConfig.functions) skills.add("vercel-functions");
134+
if (vercelConfig.experimentalServices) skills.add("vercel-services");
130135
}
131136
return [...skills].sort();
132137
}

hooks/src/session-start-profiler.mts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ const FILE_MARKERS: FileMarker[] = [
8080
{ file: "components.json", skills: ["shadcn"] },
8181
{ file: ".env.local", skills: ["env-vars"] },
8282
{ file: "pnpm-workspace.yaml", skills: ["turborepo"] },
83+
{ file: "backend/pyproject.toml", skills: ["vercel-services"] },
84+
{ file: "backend/main.py", skills: ["vercel-services"] },
85+
{ file: "backend/go.mod", skills: ["vercel-services"] },
86+
{ file: "backend/main.go", skills: ["vercel-services"] },
8387
];
8488

8589
/**
@@ -206,6 +210,7 @@ export function profileProject(projectRoot: string): string[] {
206210
skills.add("routing-middleware");
207211
}
208212
if (vercelConfig.functions) skills.add("vercel-functions");
213+
if (vercelConfig.experimentalServices) skills.add("vercel-services");
209214
}
210215

211216
return [...skills].sort();

hooks/src/vercel-config.mts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ const KEY_SKILL_MAP: Record<string, string[]> = {
4242
framework: ["deployments-cicd"],
4343
devCommand: ["deployments-cicd"],
4444
ignoreCommand: ["deployments-cicd"],
45+
46+
// Services
47+
experimentalServices: ["vercel-services"],
4548
};
4649

4750
/**
@@ -53,6 +56,7 @@ export const VERCEL_JSON_SKILLS = new Set([
5356
"deployments-cicd",
5457
"routing-middleware",
5558
"vercel-functions",
59+
"vercel-services",
5660
]);
5761

5862
// ---------------------------------------------------------------------------

hooks/vercel-config.mjs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,16 @@ var KEY_SKILL_MAP = {
1919
outputDirectory: ["deployments-cicd"],
2020
framework: ["deployments-cicd"],
2121
devCommand: ["deployments-cicd"],
22-
ignoreCommand: ["deployments-cicd"]
22+
ignoreCommand: ["deployments-cicd"],
23+
// Services
24+
experimentalServices: ["vercel-services"]
2325
};
2426
var VERCEL_JSON_SKILLS = /* @__PURE__ */ new Set([
2527
"cron-jobs",
2628
"deployments-cicd",
2729
"routing-middleware",
28-
"vercel-functions"
30+
"vercel-functions",
31+
"vercel-services"
2932
]);
3033
function resolveVercelJsonSkills(filePath) {
3134
const content = safeReadFile(filePath);

0 commit comments

Comments
 (0)