From prontonlp-plugin
Generates a sector-level intelligence report analyzing all companies within an industry — ranking them by investment score and sentiment, identifying dominant events and themes, surfacing bullish and bearish signals, and tracking trending topics across the sector. Use when the user asks about an industry, sector, or market theme rather than a single company. Triggers on phrases like: 'analyze the [sector] sector', '[sector] industry report', 'what is happening in [sector]', 'which companies in [sector] are leading', 'sentiment in [sector]', 'top movers in [sector]', 'what themes are rising in [sector]', 'which sectors are most bullish', '[sector] outlook'. Do not use for a single named company — use the company intelligence skill. Do not use when comparing specific companies side by side — use the compare-companies skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/prontonlp-plugin:pronto-sector-intelligenceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Produces sector intelligence reports. Centerpiece: **cross-company view of a sector** — ranking companies by sentiment, investment score, and stock performance; identifying dominant themes and events; surfacing the most bullish and bearish voices; tracking what's RISING or FALLING across the industry.
Produces sector intelligence reports. Centerpiece: cross-company view of a sector — ranking companies by sentiment, investment score, and stock performance; identifying dominant themes and events; surfacing the most bullish and bearish voices; tracking what's RISING or FALLING across the industry.
Data gathering and cross-company analysis live here; final output is a regular standalone HTML report delegated to the pronto-html-renderer agent. This skill is not a live artifact.
⛔ TOOL RESTRICTION: Never call
showDocumentMindMapordeepResearch. These are user-triggered only.
Map the user's input to the correct sector string — exact strings only, case-sensitive.
Valid top-level sectors:
Financials | Industrials | Consumer Discretionary | Health Care | Information Technology | Materials | Real Estate | Consumer Staples | Communication Services | Energy | Utilities
Sub-sector drill-down: When the user's input names a specific sub-industry, use the sub-sector string instead of the top-level sector. Sub-sector strings narrow the company set and produce a more focused report.
| User says | Use this string |
|---|---|
| semiconductors, chips, chip makers | Information Technology-Semiconductors and Semiconductor Equipment |
| software, SaaS, cloud software | Information Technology-Software |
| IT services, tech consulting | Information Technology-IT Services |
| tech hardware, servers, storage | Information Technology-Technology Hardware, Storage and Peripherals |
| biotech, biopharmaceuticals | Health Care-Biotechnology |
| pharma, drug makers | Health Care-Pharmaceuticals |
| medtech, medical devices | Health Care-Health Care Equipment and Supplies |
| managed care, hospitals, health providers | Health Care-Health Care Providers and Services |
| banks, commercial banking | Financials-Banks |
| insurance | Financials-Insurance |
| capital markets, asset managers, exchanges | Financials-Capital Markets |
| fintech, financial services | Financials-Financial Services |
| ev, electric vehicles, auto | Consumer Discretionary-Automobiles |
| retail, specialty retail | Consumer Discretionary-Specialty Retail |
| restaurants, hotels, gaming, leisure | Consumer Discretionary-Hotels, Restaurants and Leisure |
| aerospace, defense | Industrials-Aerospace and Defense |
| machinery, industrial equipment | Industrials-Machinery |
| oil, gas, upstream energy | Energy-Oil, Gas and Consumable Fuels |
| oilfield services, drilling | Energy-Energy Equipment and Services |
| chemicals | Materials-Chemicals |
| mining, metals | Materials-Metals and Mining |
| social media, search, internet platforms | Communication Services-Interactive Media and Services |
| telecom, wireless | Communication Services-Wireless Telecommunication Services |
| media, entertainment, broadcast | Communication Services-Media |
Top-level aliases: "tech" → Information Technology · "healthcare / health" → Health Care · "financials / finance / banking" → Financials · "telecom" → Communication Services · "REITs / real estate" → Real Estate
Decision rule:
| Mode | Use when | Batches | Payload sections |
|---|---|---|---|
| Full Report (default) | "analyze tech sector", "sector report on healthcare" | 5 | all |
| Movers Report | "top movers in financials", "what's performing in energy" | 2 | meta, ranking |
| Theme Analysis | "what are tech companies talking about", "AI in semis" | 3 | meta, trends, themes |
| Sentiment Report | "sentiment in real estate", "how bullish is the sector" | 3 | meta, ranking, bullishVoices, bearishVoices |
Default to Full Report unless the user signals a narrower scope.
After Step 0, before calling any tools, present a short summary and wait for the user to confirm.
Show the user:
Information Technology-Semiconductors and Semiconductor Equipment)Then ask: "Ready to generate the report. Reply yes to continue, or clarify anything above."
Do not call any tools until the user confirms.
| # | Tool | Purpose | Sector param |
|---|---|---|---|
| 1 | getTopMovers | Company rankings by stock/sentiment/investment | sectors array |
| 2 | getTrends | Trending topics within sector | sectors array |
| 3 | getAnalytics | Sentiment scores, event types, aspects | sectors array |
| 4 | getSectors | Cross-sector topic distribution | topicSearchQuery (required) |
| 5 | getCompanies (companySearchMode: 'byDocuments') | Companies ranked by topic/event within sector | sectors array |
| 6 | getSpeakers (entityType: 'speaker') | Executive/analyst individual sentiment per company | companiesIds (per top company) |
| 7 | getSpeakers (entityType: 'company') | Analyst firm aggregate sentiment per company | companiesIds (per top company) |
| 8 | searchSentences | Key quotes (via search-summarizer) | — |
sectors is always an array of strings (e.g. ["Information Technology"]), never a plain string.getAnalytics max date range: 1 year — split longer requests into yearly calls.getTrends has no query parameter — scope with sectors.getCompanies(companySearchMode: 'byDocuments', eventTypes: [...]): one event type per call.getSpeakers(entityType: 'speaker') and getSpeakers(entityType: 'company') require companiesIds — resolve top company IDs from Batch 1 getTopMovers.getSectors requires topicSearchQuery — one topic per call.Batch 1 — foundation:
getTopMovers(
sectors: ["<sector>"],
documentTypes: ["Earnings Calls"],
sortBy: ["investmentScore", "sentimentScore", "stockChange",
"investmentScoreChange", "sentimentScoreChange"],
limit: 10,
dateRange: { gte: <sinceDay>, lte: <untilDay> })
→ save top company names and IDs for Batches 3–4
getTrends(
sectors: ["<sector>"],
documentTypes: ["Earnings Calls"],
sortBy: "score", sortOrder: "desc",
limit: 20,
dateRange: { gte: <sinceDay>, lte: <untilDay> })
→ save top trend names for Batch 2
getAnalytics(
sectors: ["<sector>"],
documentTypes: ["Earnings Calls"],
analyticsType: ["scores", "eventTypes", "aspects", "patternSentiment", "importance"],
dateRange: { gte: <sinceDay>, lte: <untilDay> })
→ save sentimentScore, investmentScore, eventTypes list
Post-Batch-1 Computation — no tool calls needed:
potentialBuy.items = companies that appear in BOTH:
- getTopMovers[investmentScore].topMovers (high investment score)
- getTopMovers[stockChange].underperforming (stock is falling)
Sort by investmentScore descending. Include: id, ticker, name, investmentScore, stockChange.
This is a cross-filter of data already in memory — compute before starting Batch 2.
Batch 2 — topic and event breakdown (needs eventTypes and trend names):
getCompanies(sectors: ["<sector>"], eventTypes: ["<top event 1>"], companySearchMode: 'byDocuments', dateRange: {gte, lte})
getCompanies(sectors: ["<sector>"], eventTypes: ["<top event 2>"], companySearchMode: 'byDocuments', dateRange: {gte, lte})
getCompanies(sectors: ["<sector>"], eventTypes: ["<top event 3>"], companySearchMode: 'byDocuments', dateRange: {gte, lte})
getCompanies(sectors: ["<sector>"], topicSearchQuery: "<top trend topic>", companySearchMode: 'byDocuments', dateRange: {gte, lte})
getSectors(topicSearchQuery: "<top trend 1>", documentTypes: ["Earnings Calls"], dateRange: {gte, lte})
getSectors(topicSearchQuery: "<top trend 2>", documentTypes: ["Earnings Calls"], dateRange: {gte, lte})
Batch 3 — speaker intelligence (top 2–3 companies by investment score, all parallel):
getSpeakers(entityType: 'speaker', companiesIds: [topCoId_N], speakerTypes: ["Executives"], sortBy: "sentiment", sortOrder: "desc", limit: 10)
getSpeakers(entityType: 'speaker', companiesIds: [topCoId_N], speakerTypes: ["Analysts"], sortBy: "sentiment", sortOrder: "desc", limit: 20)
getSpeakers(entityType: 'company', companiesIds: [topCoId_N], speakerTypes: ["Analysts"], sortBy: "sentiment", sortOrder: "desc", limit: 20)
Resolve top company IDs from getTopMovers[investmentScore].topMovers[0..2].id. Aggregate across companies.
Batch 4 — supporting quotes (REQUIRED — do not render until this completes):
Delegate to ONE pronto-search-summarizer (subagent_type: prontonlp-plugin:pronto-search-summarizer):
Fetch quotes for the [sector] sector intelligence report. Run these searches:
1. Bullish quotes about [top trend] for [top company 1] — companiesIds: [topCoId1], DLSentiment: ['positive'], documentTypes: ["Earnings Calls"], size: 3
2. Bearish/risk quotes for [top company 1] — companiesIds: [topCoId1], DLSentiment: ['negative'], documentTypes: ["Earnings Calls"], size: 3
3. Bullish quotes about [top trend] for [top company 2] — companiesIds: [topCoId2], DLSentiment: ['positive'], size: 3
4. Notable analyst questions for [top company 2] — companiesIds: [topCoId2], sections: EarningsCalls_Question, size: 3
Return with speaker name, role, date. Citation link is already embedded in the text field.
Tag each quote by role (bullish, bearish, analyst-question).
Batch 5 — render (see Step 3 below).
Focus on cross-company patterns. Always compute and include in the narrative:
underperforming bucket with high investment score)Divergences: high investment + falling stock = potential buy; high stock + low investment = potential overvalued.
Delegate HTML output to pronto-html-renderer (subagent_type: prontonlp-plugin:pronto-html-renderer).
report_type: sector
filename: <sector-slug>-report-<YYYYMMDD>.html
title: "<Sector Name> — Sector Intelligence Report"
subtitle: "<sinceDay> to <untilDay> · <N> companies · Earnings Calls"
data:
meta: { sectorName, asOfDate, sinceDay, untilDay, companyCount }
ranking: [ { rank, id, ticker, name, investmentScore, investmentScoreChange,
sentimentScore, sentimentScoreChange, stockChange, category } ]
leaderboards: # same shape as marketpulse
investmentScore: { topMovers: [...] }
investmentScoreChange: { topMovers: [...] }
sentimentScore: { topMovers: [...] }
sentimentScoreChange: { topMovers: [...], underperforming: [...] }
stockChange: { topMovers: [...] }
potentialBuy: { items: [...] } # cross-filtered signal
sectorScores:
sentimentScore: { value, direction } # direction ∈ RISING|FALLING
investmentScore:{ value, direction }
patternSentiment: { positive, negative }
topAspects: [ { name, sentiment } ]
trends: [ { name, score, hits, change, direction } ]
events:
positive: [ { name, count, topCompanies: [...] } ]
negative: [ { name, count, topCompanies: [...] } ]
companyRankingsByTheme: [ { theme, rows: [ { rank, company, sector, sentimentScore, mentions, signal } ] } ]
bullishVoices: [ { name, role, company, sentiment, quote } ] # quote ends with "[Source](url)"
bearishVoices: [ { name, firm, sentiment, quote } ]
themes: [ { title, insight, evidence: [ { text, company } ] } ] # text ends with "[Source](url)"
risks: [ { title, evidence } ] # evidence contains "[Source](url)"
narrative:
executiveSummary: "<overall direction + top 3 / bottom 3 + dominant theme + divergences + 3-point thesis>"
For narrower report modes, omit payload keys not gathered — renderer skips absent sections.
After the HTML renderer reports success, ask the user:
"Your report is ready:
<filename>.html. Want this also as an XLSX file? (yes/no)"
Skip the prompt if the user explicitly asked for XLSX up front (e.g. "give me the sector report as xlsx", "in spreadsheet form") — in that case generate both formats automatically.
If the user answers yes (or pre-asked), invoke anthropic-skills:xlsx directly from this skill (not via a sub-agent) using the same data you already built for the HTML renderer.
Filename: same as the HTML file but .xlsx extension.
Sheets to create (skip any whose source data is missing or empty):
#205262, no autofilter) — meta fields as Key / Value rows, then narrative.executiveSummary as a wrapped text blockleaderboards.investmentScore.topMovers: Rank, Name, Ticker, Investment Score, Stock Change, Sentiment Scoreleaderboards.investmentScoreChange.topMovers: same columnsleaderboards.sentimentScore.topMovers: same columnsleaderboards.sentimentScoreChange: topMovers (bullish) and underperforming (bearish) in one sheet with Group columnleaderboards.stockChange.topMovers: same columnsleaderboards.potentialBuy.items: Name, Ticker, Investment Score, Stock ChangecompanyRankingsByTheme)#6AA64A) — Name, Role, Company, Sentiment, Quote (with embedded Source link)#ED4545) — Firm, Sentiment, Quote (with embedded Source link)#ED4545) — Risk, Evidence (with embedded Source link)Styling (every sheet):
#205262, white bold text, height 22pt, frozen so it stays visible when scrolling#6AA64A (green) · Negative → #ED4545 (red)0.00 · Change/% columns: 0.0% · Counts: whole numbersReport the saved filename to the user when complete.
If the user answers no, end the skill normally.
All tool calls use dateRange: {gte, lte} format.
Past year (default): dateRange: { gte: "now-1y/d", lte: "now" }
Past quarter: dateRange: { gte: "now-90d/d", lte: "now" }
Past 6 months: dateRange: { gte: "now-6M/d", lte: "now" }
YTD: dateRange: { gte: "<YYYY>-01-01", lte: "now" }
Default to past year for Full Report, 90 days for Movers and Theme reports. getAnalytics max 1 year — split longer requests.
| Problem | What to do |
|---|---|
| Sector name not recognized | Check against valid list; fall back to top-level sector |
getTopMovers returns fewer than 5 companies | Widen date range; remove documentTypes filter |
getAnalytics returns no event types | Confirm range ≤ 1 year; try without documentTypes |
getCompanies returns empty for event type | Skip that event type; note it; proceed |
getTrends returns fewer than 10 | Widen date range; remove documentTypes |
getSpeakers returns nothing for a company | Try without date filter; widen window |
| No quotes returned | Omit themes/bullishVoices/bearishVoices keys — never fabricate |
| Ambiguous sector | Map to "Information Technology" (or appropriate top-level); note in narrative |
sectors as an array — ["Information Technology"], not "Information Technology".getCompanies(companySearchMode: 'byDocuments') once per event type — never merge event types.query to getTrends — it does not exist.underperforming with high investment score is the most actionable signal.getTopMovers before calling getSpeakers.| File | Purpose |
|---|---|
| reference/tool-cheatsheet.md | Tool parameters, response fields, batch plan, computed formulas |
| examples/information-technology.md | Full worked example: IT sector |
| evaluations/criteria.md | Evaluation rubric |
| evals/evals.json | Structured test cases |
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub prontonlp/prontonlp-plugin --plugin prontonlp-plugin