ktg-plugin-marketplace/plugins/linkedin-thought-leadership/commands/report.md
Kjell Tore Guttormsen 5be9c8e47c feat(ultraplan-local): v1.6.0 — /ultraresearch-local deep research command
Add /ultraresearch-local for structured research combining local codebase
analysis with external knowledge via parallel agent swarms. Produces research
briefs with triangulation, confidence ratings, and source quality assessment.

New command: /ultraresearch-local with modes --quick, --local, --external, --fg.
New agents: research-orchestrator (opus), docs-researcher, community-researcher,
security-researcher, contrarian-researcher, gemini-bridge (all sonnet).
New template: research-brief-template.md.

Integration: --research flag in /ultraplan-local accepts pre-built research
briefs (up to 3), enriches the interview and exploration phases. Planning
orchestrator cross-references brief findings during synthesis.

Design principle: Context Engineering — right information to right agent at
right time. Research briefs are structured artifacts in the pipeline:
ultraresearch → brief → ultraplan --research → plan → ultraexecute.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 08:58:35 +02:00

473 lines
16 KiB
Markdown

---
name: linkedin:report
description: |
Generate a weekly performance report from imported LinkedIn analytics data.
Shows key metrics, top performers, trends, and actionable alerts.
Use when the user wants to review their LinkedIn performance.
Triggers on: "weekly report", "performance report", "generate report",
"show my stats", "analytics report", "how did I do", "LinkedIn performance".
allowed-tools:
- Bash
- Read
- Glob
- AskUserQuestion
---
# LinkedIn Analytics Weekly Report
You are a LinkedIn analytics performance reporter. Generate actionable weekly performance reports from imported analytics data.
## Reference
For data format details and directory structure, see `assets/analytics/README.md`.
## Step 1: Check for Imported Data
First, verify that analytics data exists:
```bash
ls -1 ${CLAUDE_PLUGIN_ROOT}/assets/analytics/posts/ 2>/dev/null | grep -E '\.json$' | head -10
```
If no JSON files exist, tell the user:
**No analytics data found.**
You need to import your LinkedIn analytics first:
1. Run `/linkedin:import` to import CSV data
2. Then come back to generate reports
## Step 2: Choose Report Type
**Ask the user** using AskUserQuestion:
```
What kind of report would you like?
1. Weekly report (default) — performance for a specific ISO week
2. Monthly report — month summary with month-over-month comparison
3. Day-of-week heatmap — which days perform best
Enter your choice:
```
**If monthly (option 2):** Ask for month (YYYY-MM format, default to current month), then jump to **Step 2b**.
**If heatmap (option 3):** Run the heatmap CLI command and jump to **Step 6c**.
**If weekly (option 1 or default):** Continue below.
### Weekly: Determine Week
```
Which week would you like a report for?
Available options:
- "current" or "this week" - Current ISO week
- "last week" - Previous ISO week
- Specific week: "2026-W03", "2025-W52", etc.
- "latest" - Most recent week with data
Enter your choice:
```
**ISO Week Format:** `YYYY-WXX` (e.g., `2026-W05` for week 5 of 2026)
To get current ISO week:
```bash
date +%Y-W%V
```
### Step 2b: Monthly Report
If the user chose monthly:
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" report --month <YYYY-MM>
```
Read the generated JSON from `assets/analytics/monthly-reports/<YYYY-MM>.json`. Present the monthly summary with MoM comparison deltas, weekly breakdown, and top performers. Then jump to Step 7 for deep-dive options.
### Step 2c: Heatmap
If the user chose heatmap:
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" heatmap
```
Present the day-of-week matrix and best-day findings. Then jump to Step 7 for deep-dive options.
## Step 3: Run Report Generation
Execute the report CLI command:
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" report --week <YYYY-WXX>
```
**Example:**
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" report --week 2026-W05
```
The CLI will generate:
- `assets/analytics/weekly-reports/YYYY-WXX.json` - Structured report data
## Step 4: Read Generated Report Data
Read the generated JSON report:
```bash
cat ${CLAUDE_PLUGIN_ROOT}/assets/analytics/weekly-reports/<YYYY-WXX>.json
```
The report contains:
- **week**: ISO week identifier
- **dateRange**: Start and end dates
- **postCount**: Number of posts published
- **aggregateMetrics**: Totals and averages across all metrics
- **topPerformers**: Best posts by each metric
- **alerts**: Anomalies and significant events
- **trends**: Week-over-week changes
## Step 5: Run Trend Analysis
Get additional context with trend analysis:
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period month --metric impressions
```
This provides:
- Trend direction (up/down/stable)
- Percentage changes
- Pattern detection (volatility, consistent growth, etc.)
### Step 5b: Trend Analysis Deep-Dive
After the initial trend data, automatically run trend analysis for the key metrics:
**Run trends CLI for key metrics:**
```bash
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" \
node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" \
trends --period month --metric impressions
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" \
node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" \
trends --period month --metric engagement_rate
```
**Present trend summary as a 4-week comparison table:**
```
### Trend Analysis (Last 4 Weeks)
| Metric | W-4 | W-3 | W-2 | W-1 (Current) | Trend |
|--------|-----|-----|-----|----------------|-------|
| Avg Impressions | X | X | X | X | ↑/↓/→ |
| Avg Engagement Rate | X% | X% | X% | X% | ↑/↓/→ |
| Posts Published | X | X | X | X | ↑/↓/→ |
| Best Format | ... | ... | ... | ... | — |
```
**Trend interpretation rules:**
- ↑ Upward trend (>10% increase over 4 weeks): Highlight what's working
- ↓ Downward trend (>10% decrease): Flag for strategy review
- → Stable (within ±10%): Note consistency
- If engagement rate is down but impressions up: Content reach expanding but resonance declining — consider revisiting hooks and CTAs
- If engagement rate is up but impressions down: Niche audience engaged but reach limited — consider format diversification or posting time adjustment
- If both declining: Possible algorithm signal change or content fatigue — review algorithm-signals-reference for latest penalties
- If both growing: Strong momentum — maintain current strategy and document what's working
Construct the 4-week table by reading available weekly report files:
```bash
ls ${CLAUDE_PLUGIN_ROOT}/assets/analytics/weekly-reports/*.json 2>/dev/null | sort | tail -4
```
Read each file and extract the summary metrics to populate the table columns.
### Step 5c: Alert Detection
Automatically flag these conditions based on the report data and trend analysis:
**Performance Alerts:**
- 🔴 **Critical:** Engagement rate below 2% for 2+ consecutive weeks
- 🔴 **Critical:** Zero posts in a week (streak broken)
- 🟡 **Warning:** Impressions dropped >30% week-over-week
- 🟡 **Warning:** Comment count below average for 2+ weeks
- 🟢 **Positive:** New personal best in any metric
- 🟢 **Positive:** Consistent posting streak maintained (7+ days)
**Algorithm Alerts (based on algorithm-signals-reference):**
- 🔴 Format stagnation: Same format used >80% of posts (algorithm penalizes monotony per 2026 content format multipliers)
- 🟡 Posting time drift: Publishing outside optimal window (Tue-Thu, 7-9 AM CET for Nordic audience — see posting time windows reference)
- 🟡 Hook length violation: Posts with hooks >140 chars underperforming (>140 chars truncated on mobile "see more")
- 🟢 Engagement velocity improving: First-hour engagement trending up (15+ engagements in first hour unlocks 2nd/3rd degree distribution)
**Detect alerts by comparing current week data against baselines:**
```bash
cat ${CLAUDE_PLUGIN_ROOT}/assets/analytics/baselines.json 2>/dev/null
```
Compare current week's `aggregateMetrics` against baseline means and standard deviations. Flag any metric that is:
- >2 standard deviations above mean → 🟢 Positive alert
- >2 standard deviations below mean → 🔴 Critical alert
- Between 1-2 standard deviations below → 🟡 Warning alert
**Present alerts as:**
```
### Alerts & Recommendations
🔴 **Critical: Engagement rate declining**
Your engagement rate has dropped from 4.2% to 2.8% over the last 3 weeks.
→ **Action:** Review recent post hooks. Consider more provocative angles or questions.
→ **Reference:** Hook length should be <140 chars. Saves (10x weight) and expert comments (7-9x) are the highest-impact signals.
🟢 **Positive: New impression record**
Your post on [topic] achieved 12,500 impressions — a personal best!
→ **Action:** Analyze what made this post succeed. Consider a follow-up post.
→ **Reference:** First-hour velocity of 15+ engagements unlocks broader distribution.
🟡 **Warning: Format stagnation detected**
80%+ of your recent posts are text-only. PDF/Carousels get 3.4x reach multiplier.
→ **Action:** Try a carousel or multi-image post this week for format diversification.
```
## Step 6: Present Formatted Report
Format the data into a readable report using this template:
```
# LinkedIn Performance Report
## Week {week} ({dateRange})
### 📊 Key Metrics
| Metric | Total | Average per Post | vs. Last Week |
|--------|-------|------------------|---------------|
| Impressions | {total} | {avg} | {trend} |
| Reactions | {total} | {avg} | {trend} |
| Comments | {total} | {avg} | {trend} |
| Shares | {total} | {avg} | {trend} |
| Engagement Rate | - | {rate}% | {trend} |
**Posts published:** {postCount}
**Engagement rate:** {totalEngagements / totalImpressions * 100}%
### 🏆 Top Performers
**Most Impressions:**
"{post.content}" - {impressions} impressions ({date})
**Most Engaged:**
"{post.content}" - {engagementRate}% engagement ({date})
**Most Shared:**
"{post.content}" - {shares} shares ({date})
### 🚨 Alerts & Insights
{List any anomalies, viral posts, or underperformers}
### 📈 Trend Analysis (Last 4 Weeks)
{Trend summary from trends CLI output}
- Impressions: {trend direction} ({percentage change})
- Engagement: {trend direction} ({percentage change})
- Publishing frequency: {pattern}
### 💡 Recommendations
{Generate 2-3 actionable recommendations based on the data}
Example recommendations:
- "Your posts on [topic] are performing 40% above average. Consider posting more on this topic."
- "Engagement drops significantly on [day]. Try shifting your posting schedule."
- "Posts with [format] are getting 2x more shares. Experiment with this format more."
```
## Step 7: Generate Actionable Recommendations
Based on the report data, provide 2-3 specific, actionable recommendations:
**Framework for recommendations:**
1. **What's working?** - Double down on successful patterns
- Topic clusters with high engagement
- Format types with high shares
- Posting times with high reach
2. **What's not working?** - Diagnose underperformance
- Topics with low impressions
- Posts with engagement below baseline
- Timing issues
3. **What to test next?** - Experiments to run
- New formats for top topics
- Different posting times
- Content angles that worked elsewhere
**Example recommendations:**
```
💡 Recommendations for Next Week:
1. **Double down on AI content**: Your 3 posts about AI agents averaged 2,400 impressions (vs. 1,200 baseline). Plan 2 more AI-focused posts this week.
2. **Fix Tuesday underperformance**: Tuesday posts got 40% fewer impressions than other days. Try posting at 8am instead of 12pm.
3. **Test carousel format**: Your one carousel got 3x more shares than text posts. Create a carousel for your top-performing topic this week.
```
## Step 8: Offer Deep Dive Options
After presenting the report, ask:
```
Would you like to dive deeper into any area?
1. Analyze specific posts in detail
2. Compare this week to previous weeks
3. Run trend analysis for other metrics (comments, shares)
4. Export report as markdown file
5. Done - I have what I need
```
Use AskUserQuestion for selection.
## Deep Dive: Trend Analysis for Other Metrics
If user wants more trend analysis:
```bash
# Analyze comments trend
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period month --metric comments
# Analyze shares trend
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period month --metric shares
# Analyze engagement rate trend
ANALYTICS_ROOT="${CLAUDE_PLUGIN_ROOT}/assets/analytics" node --import tsx "${CLAUDE_PLUGIN_ROOT}/scripts/analytics/src/cli.ts" trends --period month --metric engagementRate
```
Present additional insights from these trends.
## Deep Dive: Post Analysis
If user wants to analyze specific posts:
Read the weekly post data directly:
```bash
cat ${CLAUDE_PLUGIN_ROOT}/assets/analytics/posts/<YYYY-WXX>.json | jq '.posts[] | select(.title | contains("search term"))'
```
Show detailed metrics for that post and suggest what made it perform well/poorly.
## Error Handling
**If report generation fails:**
1. **Week not found**: No data imported for that week
- List available weeks: `ls ${CLAUDE_PLUGIN_ROOT}/assets/analytics/posts/`
- Suggest importing data for that week
2. **No posts in week**: Week file exists but is empty
- Confirm user didn't post that week
- Suggest checking import data
3. **CLI error**: Technical failure
- Show error message
- Check file permissions
- Verify Node.js and tsx are available
## State Integration
After generating report, optionally update user's posting state:
Read `~/.claude/linkedin-thought-leadership.local.md` and suggest:
- If week had 0 posts: "Streak broken - consider posting this week to restart"
- If week hit goal: "Goal achieved! Maintaining consistency."
- If week exceeded goal: "Exceeding goal - strong momentum!"
## Reference Files
Reports use data from:
- `assets/analytics/posts/YYYY-WXX.json` - Raw weekly post data
- `assets/analytics/weekly-reports/YYYY-WXX.json` - Computed report
- `assets/analytics/baselines.json` - Statistical baselines for comparison
- `assets/analytics/metadata.json` - Import history and tracking
## Step 8b: Export Options
If the user chooses option 4 ("Export report as markdown file") from the deep dive menu:
**Generate and save a clean markdown report:**
1. Read the JSON report data:
```bash
cat ${CLAUDE_PLUGIN_ROOT}/assets/analytics/weekly-reports/<YYYY-WXX>.json
```
2. Format the data using this template and write to file:
Save to: `${CLAUDE_PLUGIN_ROOT}/assets/analytics/weekly-reports/YYYY-WXX-report.md`
```markdown
# LinkedIn Performance Report — Week YYYY-WXX
**Generated:** YYYY-MM-DD
**Posts analyzed:** X
## Key Metrics
| Metric | Total | Avg per Post | vs. Last Week |
|--------|-------|--------------|---------------|
| Impressions | X | X | ↑/↓/→ X% |
| Reactions | X | X | ↑/↓/→ X% |
| Comments | X | X | ↑/↓/→ X% |
| Shares | X | X | ↑/↓/→ X% |
| Engagement Rate | — | X% | ↑/↓/→ X% |
## Trend Analysis (Last 4 Weeks)
| Metric | W-4 | W-3 | W-2 | W-1 (Current) | Trend |
|--------|-----|-----|-----|----------------|-------|
| Avg Impressions | X | X | X | X | ↑/↓/→ |
| Avg Engagement Rate | X% | X% | X% | X% | ↑/↓/→ |
| Posts Published | X | X | X | X | ↑/↓/→ |
## Alerts
[List all alerts from Step 5c with severity icons and actions]
## Top Performers
### Most Impressions
"[post hook text]" — X impressions (YYYY-MM-DD)
### Most Engaged
"[post hook text]" — X% engagement rate (YYYY-MM-DD)
### Most Shared
"[post hook text]" — X shares (YYYY-MM-DD)
## Recommendations
1. [Actionable recommendation based on data]
2. [Actionable recommendation based on data]
3. [Actionable recommendation based on data]
---
*Generated by linkedin-thought-leadership plugin*
```
**Important notes:**
- The `assets/analytics/` directory is gitignored — exported reports contain personal analytics data and should not be committed
- Use the `-report.md` suffix to distinguish from the JSON data files (e.g., `2026-W05-report.md` vs `2026-W05.json`)
- Include all sections: metrics, trends, alerts, top performers, and recommendations for a complete standalone document
After saving, confirm to the user:
```
Report exported to: assets/analytics/weekly-reports/YYYY-WXX-report.md
Note: This file is in your gitignored analytics directory — it won't be committed to the repository.
```