Install
openclaw skills install competitive-opsAI competitive intelligence pipeline -- analyze competitors, generate reports, track changes
openclaw skills install competitive-opsDetermine the mode from {{mode}}:
| Input | Mode |
|---|---|
| (empty / no args) | discovery -- Show command menu |
setup | setup -- Install dependencies and configure system |
add <company> | add -- Add competitor to tracking |
analyze <company> [html] | analyze -- Full analysis with SWOT + report (add html for HTML output) |
compare <A> vs <B> [html] | compare -- Side-by-side comparison (add html for HTML output) |
update <company> | update -- Check for changes |
pricing <company> [html] | pricing -- Pricing research (add html for HTML output) |
pricing-deep-dive <company> | pricing-deep-dive -- Deep pricing analysis with value scoring |
batch | batch -- Batch processing |
report [html] | report -- Generate consolidated report (add html for HTML output) |
track | track -- View tracking dashboard |
monitor [interval] | monitor -- Set up scheduled monitoring (default: weekly) |
pdf [report] | pdf -- Export report to PDF |
png [report] | png -- Export report to PNG image |
Show this menu:
competitive-ops -- Competitive Intelligence Command Center
Available commands:
/competitive-ops add <company> → Add competitor to tracking
/competitive-ops analyze <company> → Full analysis: SWOT + scoring + HTML report
/competitive-ops compare <A> vs <B> → Side-by-side feature matrix
/competitive-ops update <company> → Check for changes since last analysis
/competitive-ops pricing <company> → Pricing research with change detection
/competitive-ops pricing-deep-dive <company> → Deep pricing analysis with value scoring
/competitive-ops batch → Batch process multiple competitors
/competitive-ops report → Generate consolidated report
/competitive-ops track → View tracking dashboard
/competitive-ops monitor [daily|weekly|monthly] → Set up scheduled monitoring
/competitive-ops pdf [report] → Export report to PDF
/competitive-ops png [report] → Export report to PNG image
First time? Say "setup" to configure your company info.
If {{mode}} is "setup":
Check for required tools and install if missing:
Playwright for screenshots (required):
npx playwright install chromiumnpx playwright --versionui-ux-pro-max for HTML reports:
npx -y uipro-cli init --ai claude (in project directory){project}/.claude/skills/ui-ux-pro-max//skill ui-ux-pro-maxTavily MCP (optional, for fallback search):
tavily-mcp (NOT @tavily/tavily-mcp)claude mcp add tavily -- npx -y tavily-mcpTAVILY_API_KEY=your_keyPython dependencies (required, use virtual environment):
python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt
pip install -r requirements.txt (in project directory)Check if the system is configured:
data/competitors.md exists
# Competitors Tracker
| # | Company | Tier | Score | Status | Last Updated | Notes |
|---|---------|------|-------|--------|--------------|-------|
cv.md and config/profile.yml
Output setup status:
✅ competitive-ops v2 ready!
Installed:
✅ Playwright (screenshots)
✅ ui-ux-pro-max (HTML reports: npx -y uipro-cli init --ai claude)
✅ Tavily MCP (fallback search)
✅ Python dependencies
Required:
✅ data/competitors.md
Optional (for scoring context):
[?] cv.md (your product)
[?] config/profile.yml
When {{mode}} is add:
{{company}} from argsdata/competitors.md
When researching competitors, use this search order:
Tavily MCP Usage:
Use Tavily MCP server for competitive intelligence search:
- tavily-search for company overview, products, pricing
- tavily-search with topic="business" for business intelligence
- tavily-search with topic="news" for recent news
Fallback Detection:
web-search returns no results or error → try web-fetchweb-fetch fails or unavailable → invoke Tavily MCP serverWhen {{mode}} is analyze:
{{company}} and optional {{html}} flag from argsdata/competitors.md
data/competitors.md firstdata/reports/{date}/{company}-{date}.md
rm -f data/reports/latest/{company}.md
ln -s ../{date}/{company}-{date}.md data/reports/latest/{company}.md
This ensures latest/ always reflects the most recent analysis, regardless of date.html flag is present in args:
/skill ui-ux-pro-maxdata/reports/html/{company}-{date}.htmldata/competitors.md with new score and dateNote: For incremental change tracking, use update mode instead. analyze always creates fresh analysis.
When {{mode}} is compare:
A vs B and optional {{html}} flag from argsdata/reports/latest/data/reports/{date}/compare-{A}-vs-{B}-{date}.mdhtml flag is present:
/skill ui-ux-pro-maxdata/reports/html/compare-{A}-vs-{B}-{date}.htmlWhen {{mode}} is update:
{{company}} from argsdata/reports/{company}-{prev-date}.md as baselinedata/reports/{company}-{date}.mddata/snapshots/{company}/{date}.jsonWhen {{mode}} is pricing:
{{company}} and optional {{html}} flag from argsdata/snapshots/pricing/{company}.jsondata/snapshots/pricing/{company}.jsondata/reports/{date}/pricing-{company}-{date}.mdhtml flag is present:
/skill ui-ux-pro-maxdata/reports/html/pricing-{company}-{date}.htmlWhen {{mode}} is pricing-deep-dive:
{{company}} from argsdata/pricing-snapshots/{company}.json (if exists)from scripts.pricing_analyzer import PricingSnapshot, Plan, PricingAnalyzer, save_snapshot
snapshot = PricingSnapshot(
company="CompanyName",
last_updated="2026-04-07",
plans=[
Plan(
name="Pro",
type="subscription",
price=20.0,
period="monthly",
users=10,
api_access=True,
price_per_1m_input=1.0,
price_per_1m_output=3.0,
features=["API Access", "Advanced Analytics", "Priority Support"]
)
],
enterprise=True,
free_tier=True,
sources=["https://example.com/pricing"]
)
analyzer = PricingAnalyzer(subscription_baseline=10.0, api_baseline=1.0)
for plan in snapshot.plans:
score = analyzer.compute_value_score(plan)
print(f"{plan.name}: {score:.2f}")
from scripts.pricing_analyzer import PricingChangeDetector
detector = PricingChangeDetector(any_change=True) # Alert on ANY change
if old_snapshot:
changes = detector.detect_change(old_snapshot, new_snapshot)
for change in changes:
print(f"ALERT: {change.description}")
data/pricing-snapshots/{company}.jsontemplates/report/markdown/pricing-deep-dive-template.mddata/reports/{date}/pricing-deep-dive-{company}-{date}.mdKey Features:
Multi-Agent Parallel Implementation (see modes/batch.md for full details)
When {{mode}} is batch:
batch tier 1 → only Tier 1)data/batch-queue.md file with list of companiestier 1 → only ## Tier 1 section)analyze workflow independentlydata/batch-status.jsonKey Feature: Uses Claude Code multi-agent for ~3x speedup
Create data/batch-queue.md:
# Batch Queue
## Tier 1 (Direct Competitors)
- Anthropic
- OpenAI
- Google DeepMind
## Tier 2 (Indirect Competitors)
- Mistral
- Cohere
- Meta AI
## Tier 3 (Emerging)
- Character.AI
- Inflection
Or use CSV format in data/batch-queue.csv:
company,tier,priority
Anthropic,1,high
OpenAI,1,high
Mistral,2,medium
When {{mode}} is report:
html flag and filters in args (company, date range)data/reports/data/reports/{date}/consolidated-{date}.mdhtml flag is present in args:
data/snapshots/pricing/{company}.jsondata/reports/html/index.htmlECharts Integration:
https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.jsHTML Template CSS (include in <head>):
<style>
section { page-break-inside: avoid; break-inside: avoid; }
div { page-break-inside: avoid; break-inside: avoid; }
table { page-break-inside: avoid; break-inside: avoid; }
</style>
Every section, inner div, and table should have page-break-inside: avoid to prevent content from splitting across PDF pages.
Chart Layout Guidelines:
grid-cols-2 for radar + heatmap side-by-side layoutWhen {{mode}} is monitor:
Use /loop skill to set up continuous competitive intelligence monitoring:
interval from args (e.g., monitor daily, monitor weekly)
daily, weekly, monthlydata/competitors.md/loop:
/loop [interval] /competitive-ops update [company]
/loop [interval] /competitive-ops batch
data/.monitor-schedule.json:
{
"enabled": true,
"interval": "weekly",
"last_run": "2026-04-07",
"next_run": "2026-04-14",
"companies": ["Anthropic", "OpenAI", "..."]
}
Available Intervals:
daily -- 57 8 * * * (8:57 AM local, off-minute to avoid load spike)weekly -- 57 8 * * 1 (Monday 8:57 AM local)monthly -- 57 8 1 * * (1st of month 8:57 AM local)Monitoring Scope:
When {{mode}} is pdf:
Export reports to PDF for external sharing:
report arg (default: latest consolidated report)
pdf → export data/reports/html/index.htmlpdf anthropic → export data/reports/html/anthropic-{date}.htmlnode scripts/export_pdf.js data/reports/html/index.html
The script uses Playwright to:
data/reports/pdf/{date}/{report}-{date}.pdfPDF Script Implementation (scripts/export_pdf.js):
const { chromium } = require('playwright');
// - Launches headless Chromium
// - Sets viewport to 1200x1600 for proper rendering
// - Waits for networkidle + 3s for ECharts
// - Generates A4 PDF with margins and page numbers
// - Adds footer: "Page X of Y | competitive-ops v2 | {date}"
HTML CSS for PDF Page Breaks:
Add to <head> of HTML reports:
<style>
section { page-break-inside: avoid; break-inside: avoid; }
div { page-break-inside: avoid; break-inside: avoid; }
table { page-break-inside: avoid; break-inside: avoid; }
</style>
PDF Output Locations:
| Report | PDF Location |
|---|---|
| Consolidated | data/reports/pdf/{date}/index-{date}.pdf |
| Company | data/reports/pdf/{date}/{company}-{date}.pdf |
| Comparison | data/reports/pdf/{date}/compare-{A}-vs-{B}-{date}.pdf |
Styling for PDF:
When {{mode}} is png:
Export reports to PNG/JPEG image for visual sharing:
report arg (default: latest consolidated report)
png → export data/reports/html/index.htmlpng anthropic → export specific company reportnode scripts/export_image.js data/reports/html/index.html
The script uses Playwright to:
data/reports/images/{date}/{report}-{date}.pngImage Script Options (scripts/export_image.js):
node scripts/export_image.js [html-path] [options]
-o, --output <path> Output file path
-f, --full Capture full page (not just viewport)
-j, --jpeg Export as JPEG (default: PNG)
Image Output Locations:
| Report | Image Location |
|---|---|
| Consolidated | data/reports/images/{date}/index-{date}.png |
| Company | data/reports/images/{date}/{company}-{date}.png |
Image Features:
When {{mode}} is track:
data/competitors.mdAll modes have access to:
cv.md -- Your company/product definitionconfig/profile.yml -- Configurationconfig/sources.yml -- Trusted data sourcesmodes/_shared.md -- Scoring system, archetypes, rulesmodes/_profile.md -- Your customizationsReference values (customizable in modes/_profile.md or config/profile.yml):
| Dimension | Default Weight |
|---|---|
| Product Maturity | 20% |
| Feature Coverage | 20% |
| Pricing | 15% |
| Market Presence | 15% |
| Growth Trajectory | 10% |
| Brand Strength | 10% |
Confidence Levels (customizable):
Reference types (customizable in modes/_profile.md or config/profile.yml):
Classify competitors into:
Standard Structure: All reports are organized by date in data/reports/{date}/, with latest/ containing symlinks only.
| Output | Location |
|---|---|
| Analysis Report | data/reports/{date}/{company}-{date}.md |
| Latest Symlink | data/reports/latest/{company}.md → ../{date}/{company}-{date}.md |
| Comparison Report | data/reports/{date}/compare-{A}-vs-{B}-{date}.md |
| Pricing Report | data/reports/{date}/pricing-{company}-{date}.md |
| Pricing Deep Dive Report | data/reports/{date}/pricing-deep-dive-{company}-{date}.md |
| Pricing Snapshot (JSON) | data/pricing-snapshots/{company}.json |
| Consolidated Report | data/reports/{date}/consolidated-{date}.md |
| HTML Report | data/reports/html/{company}-{date}.html |
| PDF Report | data/reports/pdf/{date}/{company}-{date}.pdf |
| Image (PNG) | data/reports/images/{date}/{company}-{date}.png |
| Snapshot (update diff) | data/snapshots/{company}/{date}.json |
| Pricing Snapshot | data/snapshots/pricing/{company}.json |
| Monitor Schedule | data/.monitor-schedule.json |
| Screenshot (Playwright) | data/reports/screenshots/{company}-{date}.png |
| Competitor Tracker | data/competitors.md |
Snapshot Usage:
update mode compares old vs new report scores (default ≥5% triggers alert, customizable)pricing mode compares historical pricing changesPlaywright Usage:
analyze / report modeNote: Reports are never overwritten — each run creates a new dated file. Use update mode for incremental change tracking.
After routing, execute the selected mode by reading:
modes/{mode}.md for mode-specific instructionsmodes/_shared.md for system contextmodes/_profile.md for user customizationsFor batch mode, use multi-agent architecture:
/competitive-ops batch tier 1
↓
TeamCreate: competitive-batch-{timestamp}
↓
Agent analyzer-1 → analyze Anthropic (parallel)
Agent analyzer-2 → analyze OpenAI (parallel)
Agent analyzer-3 → analyze Google DeepMind (parallel)
↓
Wait for all agents to complete
↓
Consolidate results → output batch summary
Each agent executes independently using the analyze workflow.