mirror of
https://github.com/vercel/vercel-plugin.git
synced 2026-09-14 15:39:47 +08:00
8e24d0694a
Add a chainTo frontmatter field to skills that triggers follow-up skill injection when PostToolUse file contents match regex patterns. Add upgradeToSkill/upgradeWhy fields to validation rules so validate errors can recommend loading a specific skill. Register posttooluse-bash-chain.mjs in hooks.json. Add ChainToRule interface to patterns.mts and skill-map-frontmatter.mts, with parseChainToRules() parser. Add duplicate-key detection to the YAML parser. Reset dedup claim dir and session file on clear/compact events in session-start-seen-skills so skills re-inject into fresh context windows. Add chainTo rules to: agent-browser-verify, agent-browser, ai-elements, ai-gateway, ai-generation-persistence, ai-sdk, auth, bootstrap, chat-sdk, cms, cron-jobs, deployments-cicd, email, env-vars, geist, investigation-mode, json-render, marketplace, micro, ncc, next-forge, nextjs, observability, payments, react-best-practices, routing-middleware, runtime-cache, satori, shadcn, sign-in-with-vercel, swr, turbopack, turborepo, v0-dev, vercel-agent, vercel-api, vercel-cli, vercel-firewall, vercel-flags, vercel-functions, vercel-queues, vercel-sandbox, vercel-storage, verification, workflow. Add upgradeToSkill to ai-elements and ai-sdk validate rules. Expand ai-sdk validate messages with Run Skill() hints. Update nextjs, vercel-storage, runtime-cache, workflow, turborepo skill bodies. Add new skills: geistdocs (Geist design system docs), zzz-test-meta-name-mask (test fixture). Add skills/_chain-audit.md chain coverage audit doc. Delete .claude-plugin/marketplace.json, .claude-plugin/plugin.json (deprecated), skills/edge-runtime/SKILL.md (consolidated into vercel-functions). Add tests: posttooluse-chain.test.ts (4699 lines, chain injection e2e), ai-sdk-companion.test.ts (181 lines). Expand build-skill-map.test.ts (+335 lines), validate-rules.test.ts (+936 lines), session-start-seen-skills.test.ts (+74 lines), skill-map-frontmatter.test.ts (+50 lines), verification-skill.test.ts (+20 lines). Update build-manifest.ts to emit chainTo rules and upgradeToSkill fields. Rebuild generated/skill-manifest.json, generated/skill-catalog.md, generated/build-from-skills.manifest.json. Rebuild all compiled hooks/*.mjs. Update CLAUDE.md lexical prompt default to on. Update vercel.md ecosystem graph, docs, and cli-reference.
65 lines
1.7 KiB
JavaScript
65 lines
1.7 KiB
JavaScript
// hooks/src/vercel-config.mts
|
|
import { safeReadFile } from "./hook-env.mjs";
|
|
var KEY_SKILL_MAP = {
|
|
// Routing
|
|
redirects: ["routing-middleware"],
|
|
rewrites: ["routing-middleware"],
|
|
headers: ["routing-middleware"],
|
|
cleanUrls: ["routing-middleware"],
|
|
trailingSlash: ["routing-middleware"],
|
|
// Cron
|
|
crons: ["cron-jobs"],
|
|
// Functions / compute
|
|
functions: ["vercel-functions"],
|
|
regions: ["vercel-functions"],
|
|
// Build / CI-CD
|
|
builds: ["deployments-cicd"],
|
|
buildCommand: ["deployments-cicd"],
|
|
installCommand: ["deployments-cicd"],
|
|
outputDirectory: ["deployments-cicd"],
|
|
framework: ["deployments-cicd"],
|
|
devCommand: ["deployments-cicd"],
|
|
ignoreCommand: ["deployments-cicd"]
|
|
};
|
|
var VERCEL_JSON_SKILLS = /* @__PURE__ */ new Set([
|
|
"cron-jobs",
|
|
"deployments-cicd",
|
|
"routing-middleware",
|
|
"vercel-functions"
|
|
]);
|
|
function resolveVercelJsonSkills(filePath) {
|
|
const content = safeReadFile(filePath);
|
|
if (content === null) return null;
|
|
let parsed;
|
|
try {
|
|
parsed = JSON.parse(content);
|
|
} catch {
|
|
return null;
|
|
}
|
|
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
return null;
|
|
}
|
|
const keys = Object.keys(parsed);
|
|
const relevantSkills = /* @__PURE__ */ new Set();
|
|
for (const key of keys) {
|
|
const skills = KEY_SKILL_MAP[key];
|
|
if (skills) {
|
|
for (const s of skills) {
|
|
relevantSkills.add(s);
|
|
}
|
|
}
|
|
}
|
|
return { relevantSkills, keys };
|
|
}
|
|
function isVercelJsonPath(filePath) {
|
|
if (typeof filePath !== "string") return false;
|
|
const normalized = filePath.replace(/\\/g, "/");
|
|
const base = normalized.split("/").pop();
|
|
return base === "vercel.json";
|
|
}
|
|
export {
|
|
VERCEL_JSON_SKILLS,
|
|
isVercelJsonPath,
|
|
resolveVercelJsonSkills
|
|
};
|