一键导入
add-competitor
Add a new competitor to the AI Visibility Tool Directory — researches the tool, generates data, takes a screenshot, and inserts into the codebase
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Add a new competitor to the AI Visibility Tool Directory — researches the tool, generates data, takes a screenshot, and inserts into the codebase
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | add-competitor |
| description | Add a new competitor to the AI Visibility Tool Directory — researches the tool, generates data, takes a screenshot, and inserts into the codebase |
| argument-hint | <url> |
Add a new competitor to the AI visibility tool directory at apps/www/src/lib/competitors/data.ts.
The user will provide a URL. Follow these steps:
Important: Write objective, factual descriptions. Do not use marketing language, exaggerations, or the competitor's own promotional claims at face value. Describe what the tool does and how it works in neutral terms. Avoid superlatives like "industry-leading", "best-in-class", "revolutionary", etc. Stick to verifiable facts — features offered, platforms tracked, pricing tiers. Highlights should be factual differentiators, not praise.
Use WebFetch to read the competitor's website at $ARGUMENTS. Gather:
tracking, content, api-developer, ecommerce, seo-traditional, open-source, or otheractive, shutting-down, acquired, or betaRead the feature definitions in apps/www/src/lib/competitors/types.ts (the FEATURE_CATEGORIES constant). Based on your research, determine which features the competitor supports. Set each to true or omit it (defaults to false). The features are:
multiLlmTracking — tracks across multiple AI platforms (ChatGPT, Claude, Gemini, etc.)visibilityScore — provides an aggregate AI visibility scorecitationAnalytics — tracks citation sources in AI responsescompetitorBenchmarking — compare visibility against competitorsbrandMentionTracking — monitor brand mentions in AI responsespromptVolumeEstimates — estimated search/prompt volumessentimentAnalysis — brand sentiment in AI responsescrawlerAnalytics — track AI bot visits to your sitegeographicTracking — visibility by region/countrysocialMediaTracking — Reddit and social platform monitoringshoppingTracking — product visibility in AI shoppingmultiLanguage — multi-language supportactionRecommendations — prioritized action itemscontentGapAnalysis — detect content gaps vs competitorssiteAudits — AI site readiness auditskeywordResearch — AI keyword/prompt discoveryemailAlerts — automated alertsdataExportApi — CSV export or API accessbiConnectors — Looker Studio, NinjaCat, etc.whiteLabelAgency — white-label or agency featuresopenSource — source code availablecontentGeneration — AI content creationBe conservative — only mark features as true if you can confirm them from the website.
Extract the domain from the URL (e.g. https://www.example.com/foo → example.com). Then run:
cd apps/www && node scripts/fetch-domain-rating.mjs "<domain>"
This returns JSON with ahrefsDR, from Ahrefs' free public API (no API key required). Use it for the competitor entry.
Create a URL-friendly slug from the product name (lowercase, hyphens, no special chars). For example: "Otterly.ai" → "otterly", "SE Ranking" → "se-ranking".
Run the screenshot script:
cd apps/www && node scripts/screenshot-competitor.mjs "<slug>" "<url>"
This requires SCREENSHOT_ONE_ACCESS_KEY and BLOB_READ_WRITE_TOKEN in apps/www/.env.
If the script fails, inform the user and continue with the data entry — the screenshot can be added later.
Verify the capture — don't trust it blindly. ScreenshotOne uploads whatever the site serves, and sites with bot protection (Cloudflare, etc.) frequently return a captcha or block page to the headless browser, which then gets stored as the "screenshot." After a successful upload, download the blob URL the script printed and actually view the image:
curl -s -o /tmp/<slug>.jpg "<blob URL printed by the script>"
Open /tmp/<slug>.jpg and confirm it's genuinely the competitor's homepage/product — not a bot challenge ("Checking your browser…", "Select all squares with…", "verify you are human"), an access-denied / 403 page, or a blank/error page. If it's a challenge or error page, do NOT keep it: tell the user automated capture was blocked and ask them to send a real screenshot to upload manually (the script sets allowOverwrite: true, so re-uploading replaces the bad image).
Read apps/www/src/lib/competitors/data.ts and insert the new Competitor object into the competitors array (position in this array doesn't matter for display order).
Use the same code style as the existing entries. Example entry:
{
slug: "example-tool",
name: "Example Tool",
domain: "example.com",
url: "https://example.com",
tagline: "Short one-line description of what they do",
description:
"Longer 2-3 sentence description of the tool, its approach, and what makes it notable.",
category: "tracking",
ahrefsDR: 55,
status: "active",
features: {
multiLlmTracking: true,
visibilityScore: true,
citationAnalytics: true,
},
pricing: { hasFree: true, startingPrice: "$49/mo", hasEnterprise: false },
highlights: [
"First highlight",
"Second highlight",
"Third highlight",
],
},
In the same file (data.ts), find the aeoPopularityRanking array. This is a hardcoded list of slugs ordered from most popular to least popular as an AEO tool specifically. It determines both the display order in the directory and the A–F popularity grade.
Insert the new tool's slug at the appropriate position based on these criteria (in priority order):
The tiers in the ranking are:
If the tool is a large platform where AI visibility is NOT the primary product (e.g., a traditional SEO suite, analytics platform, or content tool that added AEO as a secondary feature), do NOT add it to aeoPopularityRanking. Instead, add its slug to the aeoNotApplicable set. These tools get an "N/A" grade and sort to the bottom of the directory.
Look at the tools already in each tier to calibrate where the new tool belongs. Insert the slug with a short comment explaining the placement.
Run TypeScript type checking to make sure the entry compiles:
pnpm exec tsc --noEmit
After completing all steps, tell the user:
/ai-visibility-tools/elmo-vs-<slug>