OPS ► COMPETITORS — Intel Dashboard skill
OPS on-demand: This skill should be used when the user asks to "competitor intel", "what did they…
by Lifecycle-Innovations-Limited·MIT license·★ 543 Stars on the repo·GitHub ↗
npx degit Lifecycle-Innovations-Limited/claude-ops/claude-ops/skills/ops-competitors#main ~/.claude/skills/ops-competitorsChecked ·commit main
Inside this skill
SKILL.md · the author's own words## Runtime Context Before rendering, load competitor context: ```bash PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname $(which ops-competitors 2>/dev/null) 2>/dev/null)/..}" OPS_DATA_DIR="${OPS_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}" source "$PLUGIN_ROOT/scripts/lib/competitor/context.sh" 2>/dev/null || true CTX=$(competitor_context 2>/dev/null || echo '{"configured":false,"reason":"lib_not_found"}') ``` # OPS ► COMPETITORS — Intel Dashboard Load `ops-rules` before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If `AskUserQuestion` / `Work… Parse `$ARGUMENTS` and dispatch to the matching mode below.
Word-for-word excerpt, not a result. Read the full SKILL.md ↓
Files of OPS ► COMPETITORS — Intel Dashboard
Show the full text182 lines
Runtime Context
Before rendering, load competitor context:
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname $(which ops-competitors 2>/dev/null) 2>/dev/null)/..}"
OPS_DATA_DIR="${OPS_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}"
source "$PLUGIN_ROOT/scripts/lib/competitor/context.sh" 2>/dev/null || true
CTX=$(competitor_context 2>/dev/null || echo '{"configured":false,"reason":"lib_not_found"}')
OPS ► COMPETITORS — Intel Dashboard
Load ops-rules before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If AskUserQuestion / Workflow are missing, follow Rule 10 in ops-rules (Hermes: numbered options / two-turn Telegram card; delegate_task).
Parse $ARGUMENTS and dispatch to the matching mode below.
Mode: No args — Dashboard
Show all tracked brands with last_run, alert counts, and recent activity. Use competitor_briefing_line for each brand row.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► COMPETITORS — [date]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
TRACKED BRANDS ([n] total)
[brand] last run [date] [n] alerts · [n] med · [n] low
...
PENDING QUEUES
immediate: [n] daily: [n]
RECENT HIGH ALERTS (last 7d)
[timestamp] [brand] [competitor] [snippet…]
...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
If configured == false: print setup hint and stop.
# Load context
source "$PLUGIN_ROOT/scripts/lib/competitor/context.sh"
competitor_context --window-days 7
competitor_briefing_line
Mobile mode (Rule 7): one line per brand, no banner, no box-drawing.
Mode: <brand-name> — Drill-down
Full event timeline (last 30d), top competitors, latest report, per-competitor signal breakdown.
- Run
competitor_context --brand "<brand>" --window-days 30 - Print brand metadata: category, competitor list, last_run, last_discovery
- Print per-competitor signal breakdown (group events by
.competitor) - Read latest report:
SLUG=$(echo "<brand>" | tr '[:upper:] /' '[:lower:]--' | tr -cd 'a-z0-9-_.') REPORT="$OPS_DATA_DIR/reports/competitor-intel/latest-${SLUG}.md" [[ -f "$REPORT" ]] && head -80 "$REPORT" - Print full high-severity event timeline sorted newest-first
Output format:
BRAND: [name] category: [cat] last run: [date]
competitors: [a, b, c, ...]
SIGNAL BREAKDOWN
[competitor] high: [n] med: [n] low: [n]
LATEST REPORT (excerpt)
[first 80 lines of report]
EVENT TIMELINE (30d — [n] total)
[timestamp] HIGH [competitor] [source] [snippet…]
...
Mode: refresh [brand]
Manually triggers the weekly intel cron immediately.
PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-...}"
CRON_SCRIPT="$PLUGIN_ROOT/scripts/ops-cron-competitor-intel.sh"
# If a specific brand is given, pass it via env override
if [[ -n "$BRAND_ARG" ]]; then
BRAND_NAME="$BRAND_ARG" bash "$CRON_SCRIPT"
else
bash "$CRON_SCRIPT"
fi
Stream output. Inform the user when done and show updated competitor_briefing_line.
Mode: add-url <brand> <competitor> <kind> <url>
Add a page-diff monitored URL to preferences.json. Valid <kind> values: pricing, features, changelog, careers.
- Validate args — if any missing, explain usage and stop.
- Show the proposed change:
Add URL for [brand] → [competitor] ([kind]): [url] - AskUserQuestion:
[Add]/[Cancel] - On confirm, merge via jq:
PREFS="$OPS_DATA_DIR/preferences.json" jq --arg brand "$BRAND" --arg comp "$COMP" --arg kind "$KIND" --arg url "$URL" ' .competitor_intel.urls[$brand][$comp][$kind] = $url ' "$PREFS" > /tmp/prefs-tmp.json && mv /tmp/prefs-tmp.json "$PREFS" - Confirm written.
Mode: alerts
Tail the last 20 lines of the alerts log:
ALERTS="$OPS_DATA_DIR/reports/competitor-intel/alerts.log"
if [[ -f "$ALERTS" ]]; then
tail -20 "$ALERTS"
else
echo "No alerts log found at $ALERTS"
fi
Mode: help / unknown args
Print available subcommands:
ops-competitors — dashboard (all brands)
ops-competitors <brand> — drill-down: events, report, breakdown
ops-competitors refresh [brand] — run intel cron now (optional brand filter)
ops-competitors add-url <b> <c> <k> <url> — add page-diff URL to preferences.json
ops-competitors alerts — tail alerts.log (last 20 lines)
ops-competitors help — this message
Error states
configured == false→ print"Competitor-intel not configured. Run /ops:setup competitor-intel to get started."and stop.CRON_SCRIPTnot found → print path and stop.PREFSnot writable foradd-url→ surface error, do not silently fail.
| 1 | |
| 2 | name ops-competitors |
| 3 | description "OPS on-demand: This skill should be used when the user asks to \"competitor intel\", \"what did they…" |
| 4 | argument-hint '[brand-name|refresh [brand]|add-url <brand> <competitor> <kind> <url>|alerts|help]' |
| 5 | allowed-tools |
| 6 | - Bash |
| 7 | - Read |
| 8 | - Edit |
| 9 | - AskUserQuestion |
| 10 | effort low |
| 11 | maxTurns 15 |
| 12 | disallowedTools |
| 13 | - Write |
| 14 | - NotebookEdit |
| 15 | |
| 16 | |
| 17 | ## Runtime Context |
| 18 | |
| 19 | Before rendering, load competitor context: |
| 20 | |
| 21 | |
| 22 | PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-$(dirname $(which ops-competitors 2>/dev/null) 2>/dev/null)/..}" |
| 23 | OPS_DATA_DIR="${OPS_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}" |
| 24 | source "$PLUGIN_ROOT/scripts/lib/competitor/context.sh" 2>/dev/null || true |
| 25 | CTX=$(competitor_context 2>/dev/null || echo '{"configured":false,"reason":"lib_not_found"}') |
| 26 | |
| 27 | |
| 28 | # OPS ► COMPETITORS — Intel Dashboard |
| 29 | |
| 30 | Load `ops-rules` before acting. Public repo (no personal data). Outbound: one draft → one approval → one send. If `AskUserQuestion` / `Workflow` are missing, follow Rule 10 in `ops-rules` (Hermes: numbered options / two-turn Telegram card; `delegate_task`). |
| 31 | |
| 32 | Parse `$ARGUMENTS` and dispatch to the matching mode below. |
| 33 | |
| 34 | |
| 35 | |
| 36 | ## Mode: No args — Dashboard |
| 37 | |
| 38 | Show all tracked brands with last_run, alert counts, and recent activity. Use `competitor_briefing_line` for each brand row. |
| 39 | |
| 40 | |
| 41 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 42 | OPS ► COMPETITORS — [date] |
| 43 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 44 | |
| 45 | TRACKED BRANDS ([n] total) |
| 46 | [brand] last run [date] [n] alerts · [n] med · [n] low |
| 47 | ... |
| 48 | |
| 49 | PENDING QUEUES |
| 50 | immediate: [n] daily: [n] |
| 51 | |
| 52 | RECENT HIGH ALERTS (last 7d) |
| 53 | [timestamp] [brand] [competitor] [snippet…] |
| 54 | ... |
| 55 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 56 | |
| 57 | |
| 58 | If `configured == false`: print setup hint and stop. |
| 59 | |
| 60 | |
| 61 | # Load context |
| 62 | source "$PLUGIN_ROOT/scripts/lib/competitor/context.sh" |
| 63 | competitor_context --window-days 7 |
| 64 | competitor_briefing_line |
| 65 | |
| 66 | |
| 67 | Mobile mode (Rule 7): one line per brand, no banner, no box-drawing. |
| 68 | |
| 69 | |
| 70 | |
| 71 | ## Mode: `<brand-name>` — Drill-down |
| 72 | |
| 73 | Full event timeline (last 30d), top competitors, latest report, per-competitor signal breakdown. |
| 74 | |
| 75 | Run `competitor_context --brand "<brand>" --window-days 30` |
| 76 | Print brand metadata: category, competitor list, last_run, last_discovery |
| 77 | Print per-competitor signal breakdown (group events by `.competitor`) |
| 78 | Read latest report: |
| 79 | |
| 80 | SLUG=$(echo "<brand>" | tr '[:upper:] /' '[:lower:]--' | tr -cd 'a-z0-9-_.') |
| 81 | REPORT="$OPS_DATA_DIR/reports/competitor-intel/latest-${SLUG}.md" |
| 82 | [[ -f "$REPORT" ]] && head -80 "$REPORT" |
| 83 | |
| 84 | Print full high-severity event timeline sorted newest-first |
| 85 | |
| 86 | Output format: |
| 87 | |
| 88 | |
| 89 | BRAND: [name] category: [cat] last run: [date] |
| 90 | competitors: [a, b, c, ...] |
| 91 | |
| 92 | SIGNAL BREAKDOWN |
| 93 | [competitor] high: [n] med: [n] low: [n] |
| 94 | |
| 95 | LATEST REPORT (excerpt) |
| 96 | [first 80 lines of report] |
| 97 | |
| 98 | EVENT TIMELINE (30d — [n] total) |
| 99 | [timestamp] HIGH [competitor] [source] [snippet…] |
| 100 | ... |
| 101 | |
| 102 | |
| 103 | |
| 104 | |
| 105 | ## Mode: `refresh [brand]` |
| 106 | |
| 107 | Manually triggers the weekly intel cron immediately. |
| 108 | |
| 109 | |
| 110 | PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-...}" |
| 111 | CRON_SCRIPT="$PLUGIN_ROOT/scripts/ops-cron-competitor-intel.sh" |
| 112 | |
| 113 | # If a specific brand is given, pass it via env override |
| 114 | if [[ -n "$BRAND_ARG" ]]; then |
| 115 | BRAND_NAME="$BRAND_ARG" bash "$CRON_SCRIPT" |
| 116 | else |
| 117 | bash "$CRON_SCRIPT" |
| 118 | fi |
| 119 | |
| 120 | |
| 121 | Stream output. Inform the user when done and show updated `competitor_briefing_line`. |
| 122 | |
| 123 | |
| 124 | |
| 125 | ## Mode: `add-url <brand> <competitor> <kind> <url>` |
| 126 | |
| 127 | Add a page-diff monitored URL to `preferences.json`. Valid `<kind>` values: `pricing`, `features`, `changelog`, `careers`. |
| 128 | |
| 129 | Validate args — if any missing, explain usage and stop. |
| 130 | Show the proposed change: |
| 131 | |
| 132 | Add URL for [brand] → [competitor] ([kind]): |
| 133 | [url] |
| 134 | |
| 135 | AskUserQuestion: `[Add]` / `[Cancel]` |
| 136 | On confirm, merge via jq: |
| 137 | |
| 138 | PREFS="$OPS_DATA_DIR/preferences.json" |
| 139 | jq --arg brand "$BRAND" --arg comp "$COMP" --arg kind "$KIND" --arg url "$URL" ' |
| 140 | .competitor_intel.urls[$brand][$comp][$kind] = $url |
| 141 | ' "$PREFS" > /tmp/prefs-tmp.json && mv /tmp/prefs-tmp.json "$PREFS" |
| 142 | |
| 143 | Confirm written. |
| 144 | |
| 145 | |
| 146 | |
| 147 | ## Mode: `alerts` |
| 148 | |
| 149 | Tail the last 20 lines of the alerts log: |
| 150 | |
| 151 | |
| 152 | ALERTS="$OPS_DATA_DIR/reports/competitor-intel/alerts.log" |
| 153 | if [[ -f "$ALERTS" ]]; then |
| 154 | tail -20 "$ALERTS" |
| 155 | else |
| 156 | echo "No alerts log found at $ALERTS" |
| 157 | fi |
| 158 | |
| 159 | |
| 160 | |
| 161 | |
| 162 | ## Mode: `help` / unknown args |
| 163 | |
| 164 | Print available subcommands: |
| 165 | |
| 166 | |
| 167 | ops-competitors — dashboard (all brands) |
| 168 | ops-competitors <brand> — drill-down: events, report, breakdown |
| 169 | ops-competitors refresh [brand] — run intel cron now (optional brand filter) |
| 170 | ops-competitors add-url <b> <c> <k> <url> — add page-diff URL to preferences.json |
| 171 | ops-competitors alerts — tail alerts.log (last 20 lines) |
| 172 | ops-competitors help — this message |
| 173 | |
| 174 | |
| 175 | |
| 176 | |
| 177 | ## Error states |
| 178 | |
| 179 | `configured == false` → print `"Competitor-intel not configured. Run /ops:setup competitor-intel to get started."` and stop. |
| 180 | `CRON_SCRIPT` not found → print path and stop. |
| 181 | `PREFS` not writable for `add-url` → surface error, do not silently fail. |
| 182 |
Discussion
Alternatives
Browse more free Claude skills or everything in Data & analytics.