diff --git a/backend/.test_durations b/backend/.test_durations index 5c188901e..0ccf33f33 100644 --- a/backend/.test_durations +++ b/backend/.test_durations @@ -10142,7 +10142,7 @@ "tests/test_skills_bundled.py::test_bundled_skill_frontmatter_is_valid[skill-reviewer]": 0.0012424320001400702, "tests/test_skills_bundled.py::test_bundled_skill_frontmatter_is_valid[surprise-me]": 0.0012647949999973207, "tests/test_skills_bundled.py::test_bundled_skill_frontmatter_is_valid[systematic-literature-review]": 0.0013007800000650604, - "tests/test_skills_bundled.py::test_bundled_skill_frontmatter_is_valid[vercel-deploy-claimable]": 0.0014600299999756317, + "tests/test_skills_bundled.py::test_bundled_skill_frontmatter_is_valid[vercel-deploy]": 0.0014600299999756317, "tests/test_skills_bundled.py::test_bundled_skill_frontmatter_is_valid[video-generation]": 0.0011253740000256585, "tests/test_skills_bundled.py::test_bundled_skill_frontmatter_is_valid[web-design-guidelines]": 0.0014314249998506057, "tests/test_skills_bundled.py::test_runtime_registry_excludes_skill_reviewer_eval_fixtures": 0.015141091000032247, diff --git a/backend/tests/test_skills_bundled.py b/backend/tests/test_skills_bundled.py index a970d24c4..59090dab6 100644 --- a/backend/tests/test_skills_bundled.py +++ b/backend/tests/test_skills_bundled.py @@ -29,12 +29,23 @@ def test_bundled_skill_frontmatter_is_valid(skill_dir: Path) -> None: valid, msg, name = _validate_skill_frontmatter(skill_dir) assert valid, f"{skill_dir.relative_to(SKILLS_PUBLIC_DIR)}: {msg}" assert name, f"{skill_dir.relative_to(SKILLS_PUBLIC_DIR)}: no name extracted" + assert name == skill_dir.name, f"{skill_dir.relative_to(SKILLS_PUBLIC_DIR)}: frontmatter name {name!r} must match directory name {skill_dir.name!r}" def test_skills_public_dir_has_skills() -> None: assert BUNDLED_SKILL_DIRS, f"no SKILL.md found under {SKILLS_PUBLIC_DIR}" +def test_vercel_deploy_commands_use_the_mounted_script_path() -> None: + skills = get_or_new_skill_storage(skills_path=SKILLS_PUBLIC_DIR.parent).load_skills(enabled_only=False) + skill = next(skill for skill in skills if skill.name == "vercel-deploy") + mounted_script = f"{skill.get_container_path()}/scripts/deploy.sh" + content = skill.skill_file.read_text(encoding="utf-8") + + assert content.count(mounted_script) == 4 + assert content.count("deploy.sh") == content.count(mounted_script) + + def test_runtime_registry_excludes_skill_reviewer_eval_fixtures() -> None: skills = get_or_new_skill_storage(skills_path=SKILLS_PUBLIC_DIR.parent).load_skills(enabled_only=False) names = {skill.name for skill in skills} diff --git a/frontend/public/demo/threads/c02bb4d5-4202-490e-ae8f-ff4864fc0d2e/thread.json b/frontend/public/demo/threads/c02bb4d5-4202-490e-ae8f-ff4864fc0d2e/thread.json index 2924a1ba5..ca2c04014 100644 --- a/frontend/public/demo/threads/c02bb4d5-4202-490e-ae8f-ff4864fc0d2e/thread.json +++ b/frontend/public/demo/threads/c02bb4d5-4202-490e-ae8f-ff4864fc0d2e/thread.json @@ -589,7 +589,7 @@ "name": "read_file", "args": { "description": "Load vercel-deploy skill", - "path": "/mnt/skills/public/vercel-deploy-claimable/SKILL.md" + "path": "/mnt/skills/public/vercel-deploy/SKILL.md" }, "id": "read_file:11", "type": "tool_call" @@ -599,7 +599,7 @@ "usage_metadata": null }, { - "content": "---\nname: vercel-deploy\ndescription: Deploy applications and websites to Vercel. Use this skill when the user requests deployment actions such as \"Deploy my app\", \"Deploy this to production\", \"Create a preview deployment\", \"Deploy and give me the link\", or \"Push this live\". No authentication required - returns preview URL and claimable deployment link.\nmetadata:\n author: vercel\n version: \"1.0.0\"\n---\n\n# Vercel Deploy\n\nDeploy any project to Vercel instantly. No authentication required.\n\n## How It Works\n\n1. Packages your project into a tarball (excludes `node_modules` and `.git`)\n2. Auto-detects framework from `package.json`\n3. Uploads to deployment service\n4. Returns **Preview URL** (live site) and **Claim URL** (transfer to your Vercel account)\n\n## Usage\n\n```bash\nbash /mnt/skills/user/vercel-deploy/scripts/deploy.sh [path]\n```\n\n**Arguments:**\n- `path` - Directory to deploy, or a `.tgz` file (defaults to current directory)\n\n**Examples:**\n\n```bash\n# Deploy current directory\nbash /mnt/skills/user/vercel-deploy/scripts/deploy.sh\n\n# Deploy specific project\nbash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project\n\n# Deploy existing tarball\nbash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project.tgz\n```\n\n## Output\n\n```\nPreparing deployment...\nDetected framework: nextjs\nCreating deployment package...\nDeploying...\n✓ Deployment successful!\n\nPreview URL: https://skill-deploy-abc123.vercel.app\nClaim URL: https://vercel.com/claim-deployment?code=...\n```\n\nThe script also outputs JSON to stdout for programmatic use:\n\n```json\n{\n \"previewUrl\": \"https://skill-deploy-abc123.vercel.app\",\n \"claimUrl\": \"https://vercel.com/claim-deployment?code=...\",\n \"deploymentId\": \"dpl_...\",\n \"projectId\": \"prj_...\"\n}\n```\n\n## Framework Detection\n\nThe script auto-detects frameworks from `package.json`. Supported frameworks include:\n\n- **React**: Next.js, Gatsby, Create React App, Remix, React Router\n- **Vue**: Nuxt, Vitepress, Vuepress, Gridsome\n- **Svelte**: SvelteKit, Svelte, Sapper\n- **Other Frontend**: Astro, Solid Start, Angular, Ember, Preact, Docusaurus\n- **Backend**: Express, Hono, Fastify, NestJS, Elysia, h3, Nitro\n- **Build Tools**: Vite, Parcel\n- **And more**: Blitz, Hydrogen, RedwoodJS, Storybook, Sanity, etc.\n\nFor static HTML projects (no `package.json`), framework is set to `null`.\n\n## Static HTML Projects\n\nFor projects without a `package.json`:\n- If there's a single `.html` file not named `index.html`, it gets renamed automatically\n- This ensures the page is served at the root URL (`/`)\n\n## Present Results to User\n\nAlways show both URLs:\n\n```\n✓ Deployment successful!\n\nPreview URL: https://skill-deploy-abc123.vercel.app\nClaim URL: https://vercel.com/claim-deployment?code=...\n\nView your site at the Preview URL.\nTo transfer this deployment to your Vercel account, visit the Claim URL.\n```\n\n## Troubleshooting\n\n### Network Egress Error\n\nIf deployment fails due to network restrictions (common on claude.ai), tell the user:\n\n```\nDeployment failed due to network restrictions. To fix this:\n\n1. Go to https://claude.ai/settings/capabilities\n2. Add *.vercel.com to the allowed domains\n3. Try deploying again\n```\n", + "content": "---\nname: vercel-deploy\ndescription: Deploy applications and websites to Vercel. Use this skill when the user requests deployment actions such as \"Deploy my app\", \"Deploy this to production\", \"Create a preview deployment\", \"Deploy and give me the link\", or \"Push this live\". No authentication required - returns preview URL and claimable deployment link.\nmetadata:\n author: vercel\n version: \"1.0.0\"\n---\n\n# Vercel Deploy\n\nDeploy any project to Vercel instantly. No authentication required.\n\n## How It Works\n\n1. Packages your project into a tarball (excludes `node_modules` and `.git`)\n2. Auto-detects framework from `package.json`\n3. Uploads to deployment service\n4. Returns **Preview URL** (live site) and **Claim URL** (transfer to your Vercel account)\n\n## Usage\n\n```bash\nbash /mnt/skills/public/vercel-deploy/scripts/deploy.sh [path]\n```\n\n**Arguments:**\n- `path` - Directory to deploy, or a `.tgz` file (defaults to current directory)\n\n**Examples:**\n\n```bash\n# Deploy current directory\nbash /mnt/skills/public/vercel-deploy/scripts/deploy.sh\n\n# Deploy specific project\nbash /mnt/skills/public/vercel-deploy/scripts/deploy.sh /path/to/project\n\n# Deploy existing tarball\nbash /mnt/skills/public/vercel-deploy/scripts/deploy.sh /path/to/project.tgz\n```\n\n## Output\n\n```\nPreparing deployment...\nDetected framework: nextjs\nCreating deployment package...\nDeploying...\n✓ Deployment successful!\n\nPreview URL: https://skill-deploy-abc123.vercel.app\nClaim URL: https://vercel.com/claim-deployment?code=...\n```\n\nThe script also outputs JSON to stdout for programmatic use:\n\n```json\n{\n \"previewUrl\": \"https://skill-deploy-abc123.vercel.app\",\n \"claimUrl\": \"https://vercel.com/claim-deployment?code=...\",\n \"deploymentId\": \"dpl_...\",\n \"projectId\": \"prj_...\"\n}\n```\n\n## Framework Detection\n\nThe script auto-detects frameworks from `package.json`. Supported frameworks include:\n\n- **React**: Next.js, Gatsby, Create React App, Remix, React Router\n- **Vue**: Nuxt, Vitepress, Vuepress, Gridsome\n- **Svelte**: SvelteKit, Svelte, Sapper\n- **Other Frontend**: Astro, Solid Start, Angular, Ember, Preact, Docusaurus\n- **Backend**: Express, Hono, Fastify, NestJS, Elysia, h3, Nitro\n- **Build Tools**: Vite, Parcel\n- **And more**: Blitz, Hydrogen, RedwoodJS, Storybook, Sanity, etc.\n\nFor static HTML projects (no `package.json`), framework is set to `null`.\n\n## Static HTML Projects\n\nFor projects without a `package.json`:\n- If there's a single `.html` file not named `index.html`, it gets renamed automatically\n- This ensures the page is served at the root URL (`/`)\n\n## Present Results to User\n\nAlways show both URLs:\n\n```\n✓ Deployment successful!\n\n- [Preview URL](https://skill-deploy-abc123.vercel.app)\n- [Claim URL](https://vercel.com/claim-deployment?code=...)\n\nView your site at the Preview URL.\nTo transfer this deployment to your Vercel account, visit the Claim URL.\n```\n\n## Troubleshooting\n\n### Network Restriction Error\n\nIf deployment fails due to network restrictions (common on claude.ai), tell the user:\n\n```\nDeployment failed due to network restrictions. To fix this:\n\n1. Go to https://claude.ai/settings/capabilities\n2. Add *.vercel.com to the allowed domains\n3. Try deploying again\n```\n", "additional_kwargs": {}, "response_metadata": {}, "type": "tool", @@ -626,7 +626,7 @@ "name": "bash", "args": { "description": "Deploy to Vercel", - "command": "bash /mnt/skills/public/vercel-deploy-claimable/scripts/deploy.sh /mnt/user-data/outputs" + "command": "bash /mnt/skills/public/vercel-deploy/scripts/deploy.sh /mnt/user-data/outputs" }, "id": "bash:12", "type": "tool_call" diff --git a/skills/public/vercel-deploy-claimable/SKILL.md b/skills/public/vercel-deploy/SKILL.md similarity index 90% rename from skills/public/vercel-deploy-claimable/SKILL.md rename to skills/public/vercel-deploy/SKILL.md index 8d8fd683e..d9ca4400e 100644 --- a/skills/public/vercel-deploy-claimable/SKILL.md +++ b/skills/public/vercel-deploy/SKILL.md @@ -20,7 +20,7 @@ Deploy any project to Vercel instantly. No authentication required. ## Usage ```bash -bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh [path] +bash /mnt/skills/public/vercel-deploy/scripts/deploy.sh [path] ``` **Arguments:** @@ -30,13 +30,13 @@ bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh [path] ```bash # Deploy current directory -bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh +bash /mnt/skills/public/vercel-deploy/scripts/deploy.sh # Deploy specific project -bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project +bash /mnt/skills/public/vercel-deploy/scripts/deploy.sh /path/to/project # Deploy existing tarball -bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project.tgz +bash /mnt/skills/public/vercel-deploy/scripts/deploy.sh /path/to/project.tgz ``` ## Output @@ -99,7 +99,7 @@ To transfer this deployment to your Vercel account, visit the Claim URL. ## Troubleshooting -### Network Egress Error +### Network Restriction Error If deployment fails due to network restrictions (common on claude.ai), tell the user: diff --git a/skills/public/vercel-deploy-claimable/scripts/deploy.sh b/skills/public/vercel-deploy/scripts/deploy.sh similarity index 100% rename from skills/public/vercel-deploy-claimable/scripts/deploy.sh rename to skills/public/vercel-deploy/scripts/deploy.sh