From 0d01471cb5e0ea837eb207785ae3eaa9a29bd6b8 Mon Sep 17 00:00:00 2001 From: lihbr Date: Mon, 11 May 2026 11:01:09 +0900 Subject: [PATCH] refactor: use vercel detect-agent for repo creation --- package-lock.json | 11 ++++++++++ package.json | 1 + src/clients/wroom.ts | 8 +++++--- src/commands/repo-create.ts | 3 --- src/lib/ai.ts | 40 ------------------------------------- src/tracking.ts | 5 +++-- 6 files changed, 20 insertions(+), 48 deletions(-) delete mode 100644 src/lib/ai.ts diff --git a/package-lock.json b/package-lock.json index 1d7661e..12799bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@prismicio/types-internal": "3.16.1", "@sentry/node-core": "10.42.0", "@types/node": "25.0.9", + "@vercel/detect-agent": "^1.2.3", "change-case": "5.4.4", "concurrently": "^9.2.1", "cross-env": "^10.1.0", @@ -1837,6 +1838,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@vercel/detect-agent": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vercel/detect-agent/-/detect-agent-1.2.3.tgz", + "integrity": "sha512-VYNCgUc0nOmC4WJmWw9GkrKdfr8Zl4/rxhC5SvgacBgxiW9W/9NRttUoHHXV8xdII3MaRgkZZVX8Ikzc/Jmjag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@vitest/expect": { "version": "4.0.17", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.17.tgz", diff --git a/package.json b/package.json index cb61555..13ebad3 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "@prismicio/types-internal": "3.16.1", "@sentry/node-core": "10.42.0", "@types/node": "25.0.9", + "@vercel/detect-agent": "^1.2.3", "change-case": "5.4.4", "concurrently": "^9.2.1", "cross-env": "^10.1.0", diff --git a/src/clients/wroom.ts b/src/clients/wroom.ts index 4e04add..50dec4d 100644 --- a/src/clients/wroom.ts +++ b/src/clients/wroom.ts @@ -1,3 +1,4 @@ +import { determineAgent } from "@vercel/detect-agent"; import * as z from "zod/mini"; import { NotFoundRequestError, request } from "../lib/request"; @@ -320,14 +321,15 @@ export async function createRepository(config: { domain: string; name?: string; framework: string; - agent: string | undefined; token: string | undefined; host: string; }): Promise { - const { domain, name, framework, agent, token, host } = config; + const { domain, name, framework, token, host } = config; const url = new URL("app/dashboard/repositories", getDashboardUrl(host)); url.searchParams.set("app", "cli"); - if (agent) url.searchParams.set("agent", agent); + + const { isAgent, agent } = await determineAgent(); + if (isAgent) url.searchParams.set("agent", agent.name); const body: Record = { domain, framework, plan: "personal" }; if (name) { diff --git a/src/commands/repo-create.ts b/src/commands/repo-create.ts index b63a77a..1a2bcf6 100644 --- a/src/commands/repo-create.ts +++ b/src/commands/repo-create.ts @@ -4,7 +4,6 @@ import { getAdapter } from "../adapters"; import { getHost, getToken } from "../auth"; import { completeOnboardingStepsSilently } from "../clients/repository"; import { checkIsDomainAvailable, createRepository } from "../clients/wroom"; -import { detectAgent } from "../lib/ai"; import { CommandError, createCommand, type CommandConfig } from "../lib/command"; import { UnknownRequestError } from "../lib/request"; @@ -68,14 +67,12 @@ export async function createRepo(config: { const adapter = await getAdapter().catch(() => undefined); const framework = adapter?.id ?? "other"; - const agent = await detectAgent(); try { await createRepository({ domain, name: displayName, framework, - agent, token, host, }); diff --git a/src/lib/ai.ts b/src/lib/ai.ts deleted file mode 100644 index cfd6efc..0000000 --- a/src/lib/ai.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { exists } from "./file"; - -export async function detectAgent(): Promise { - if (process.env.AI_AGENT) return process.env.AI_AGENT.toLowerCase(); - - if (process.env.CLAUDE_CODE_IS_COWORK === "1" || process.env.CLAUDE_CODE_IS_COWORK === "true") { - return "claude-cowork"; - } - if (process.env.CLAUDECODE === "1" || process.env.CLAUDE_CODE) return "claude-code"; - if (process.env.CODEX_CI === "1" || process.env.CODEX_SANDBOX || process.env.CODEX_THREAD_ID) { - return "codex"; - } - if (process.env.CURSOR_AGENT === "1" || process.env.CURSOR_EXTENSION_HOST_ROLE === "agent-exec") { - return "cursor"; - } - if (process.env.CLINE_ACTIVE === "true") return "cline"; - if (process.env.ANTIGRAVITY_AGENT) return "antigravity"; - if (process.env.AUGMENT_AGENT === "1") return "augment"; - if (process.env.OPENCODE_CLIENT === "1") return "opencode"; - if (process.env.GEMINI_CLI === "1") return "gemini-cli"; - if (process.env.TRAE_AI_SHELL_ID) return "trae"; - if (process.env.REPL_ID) return "replit"; - if ( - process.env.COPILOT_MODEL || - process.env.COPILOT_ALLOW_ALL || - process.env.COPILOT_GITHUB_TOKEN - ) { - return "github-copilot"; - } - - const agent = process.env.AGENT?.toLowerCase(); - if (agent === "goose" || agent === "amp") return agent; - - if (process.platform === "linux") { - const isDevin = await exists(new URL("file:///opt/.devin")); - if (isDevin) return "devin"; - } - - if (process.env.IS_SANDBOX === "yes") return "unknown-sandbox"; -} diff --git a/src/tracking.ts b/src/tracking.ts index f7b6486..effa0cf 100644 --- a/src/tracking.ts +++ b/src/tracking.ts @@ -1,11 +1,11 @@ import { homedir } from "node:os"; import { pathToFileURL } from "node:url"; +import { determineAgent } from "@vercel/detect-agent"; import * as z from "zod/mini"; import type { Profile } from "./clients/user"; import { DEFAULT_PRISMIC_HOST, env } from "./env"; -import { detectAgent } from "./lib/ai"; import { readJsonFile } from "./lib/file"; import { initSegment, trackEvent, trackIdentity } from "./lib/segment"; import { appendTrailingSlash } from "./lib/url"; @@ -22,7 +22,8 @@ export async function initTracking(config: { host: string }): Promise { const enabled = await isTelemetryEnabled(); if (!enabled) return; const writeKey = host === DEFAULT_PRISMIC_HOST ? PROD_WRITE_KEY : STAGING_WRITE_KEY; - agent = await detectAgent(); + const result = await determineAgent(); + agent = result.isAgent ? result.agent.name : undefined; await initSegment({ writeKey }); }