From prontonlp-plugin
Generates a broad market intelligence dashboard ranking companies across the entire market by investment score, sentiment shifts, and stock performance — based on recent earnings calls. Use when the user asks about the overall market rather than a specific company or sector. Triggers on phrases like: 'what's moving in the market', 'top movers', 'market recap', 'market summary', 'market overview', 'what happened in the market this week', 'stocks to watch', 'most bullish companies', 'biggest sentiment shifts', 'highest investment scores', 'earnings season highlights', 'which analyst firms are bearish', 'what large caps are outperforming'. Defaults to past 7 days when no time frame is specified. Do not use for a single named company — use the company intelligence skill. Do not use for a specific sector — use the sector intelligence skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/prontonlp-plugin:pronto-marketpulseThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generates a market intelligence dashboard from recent earnings calls — leaderboards, trending topics, and voice-of-the-market. Data gathering and section logic live here; final presentation is delegated to the `pronto-live-artifact` agent as a Claude live artifact. Market Pulse is the only ProntoNLP skill that should use a live artifact.
Generates a market intelligence dashboard from recent earnings calls — leaderboards, trending topics, and voice-of-the-market. Data gathering and section logic live here; final presentation is delegated to the pronto-live-artifact agent as a Claude live artifact. Market Pulse is the only ProntoNLP skill that should use a live artifact.
⛔ TOOL RESTRICTION: Never call
showDocumentMindMapordeepResearchfrom this skill. These are user-triggered only. Use only the tools listed in Step 2.
| User asked for | Sections |
|---|---|
| "top movers", "what's moving", specific metric ("best stocks this week") | Movers only — leaderboards |
| "what happened this week/month", "market recap/summary/overview", broad open-ended | Full — movers + Trending Topics + Voice of the Market |
| "show me trends", "what topics are trending" | Trends only |
| "what are executives saying" | Speakers only |
| "show me [specific thing] only" | Only that section |
Key distinction: "what's moving" (price/score) → Movers only. "What's happening" (narrative) → Full. When in doubt, lean Full.
At the end of a Movers-only report, tell the user they can ask for a full report to also see Trending Topics and Voice of the Market.
| User says | marketCaps filter |
|---|---|
| Nothing specific (default) | $300M+ — Small + Mid + Large + Mega |
| "large caps", "big companies" | $10B+ — Large + Mega |
| "mega cap", "only the biggest", "S&P 500 only" | $200B+ — Mega only |
| "small caps", "micro cap" | Drop filter; note in report |
| Specific sector/country/index | Apply those filters; keep $300M+ default |
marketCaps key strings (smallest → largest):
"Nano (under $50mln)""Micro ($50mln - $300mln)""Small ($300mln - $2bln)""Mid ($2bln - $10bln)""Large ($10bln - $200bln)""Mega ($200bln & more)"Default ($300M+): ["Small ($300mln - $2bln)", "Mid ($2bln - $10bln)", "Large ($10bln - $200bln)", "Mega ($200bln & more)"]
Large only ($10B+): ["Large ($10bln - $200bln)", "Mega ($200bln & more)"]
Mega only: ["Mega ($200bln & more)"]
sectors — e.g. ["Information Technology", "Financials"]country — e.g. "United States"indices — e.g. ["SP500_IND"]YYYY-MM-DD.All tool calls use dateRange: { gte, lte }. gte is always set; omit lte when the range is open-ended to now.
| User says | dateRange.gte | dateRange.lte |
|---|---|---|
| "past month", "last 30 days", "since March" | 1 month / 30 days / Mar 1 ago | omit — open until now |
| "past week", "last 7 days", "recently" | 7 days ago | omit — open until now |
| "in Q1 2025", "Jan to Feb 2026", fixed historical range | range start | range end (explicit) |
| No time frame | 7 days ago | omit — open until now |
Rule: omit lte whenever the period extends to "now / today". Only set lte for fully fixed historical ranges where the end date is explicitly in the past. Never pass today's date as lte — omitting it lets the API default to the current moment.
After Steps 0–1, before calling any tools, present a short summary and wait for the user to confirm.
Show the user:
Then ask: "Ready to generate the Market Pulse report. Reply yes to continue, or clarify anything above."
Do not call any tools until the user confirms.
Fire all applicable calls simultaneously.
Only make the calls needed for the sections chosen in Step 0.
Make one call with sortBy as an array of all needed criteria. The response is keyed by criterion.
getTopMovers(
dateRange: { gte: <period start>, lte: <period end — omit lte if open-ended to now> }
documentTypes: ["Earnings Calls"]
marketCaps: <filter from Step 0>
limit: 10
sortBy: ["stockChange", "investmentScore", "investmentScoreChange",
"sentimentScore", "sentimentScoreChange"]
)
If the user asked for only one metric, pass only that criterion.
Leaderboard mapping (renderer emits one card per criterion fetched):
| sortBy | Card title | Source array |
|---|---|---|
stockChange | Top Stock Movers | topMovers |
investmentScore | Highest Investment Score | topMovers |
investmentScoreChange | Biggest Investment Gain | topMovers |
sentimentScore | Most Positive Sentiment | topMovers |
sentimentScoreChange (bullish) | Biggest Sentiment Shift — Most Bullish | topMovers |
sentimentScoreChange (bearish) | Biggest Sentiment Shift — Most Bearish | underperforming |
Sparse data: if any leaderboard returns fewer than 5 companies, widen the date range by 7 days and re-call that criterion only. Note the expansion in the payload so the renderer can surface it.
getTrends(
documentTypes: ["Earnings Calls"]
dateRange: { gte: <period start>, lte: <period end — omit lte if open-ended to now> }
limit: 30
sortBy: "score"
)
Note:
getTrendsacceptsmarketCaps— apply the same filter if narrowing to a specific cap tier.
Most bullish (both speaker types): entityType: 'speaker', sortBy: "sentiment", sortOrder: "desc", limit: 20, documentTypes: ["Earnings Calls"], same dateRange.
Most bearish: same but sortOrder: "asc", limit: 10.
Each criterion key in getTopMovers contains topMovers, underperforming, and overperforming arrays. Use topMovers for each leaderboard. For the Sentiment Shift card, pair topMovers (bullish) with underperforming (bearish).
Build a deduplicated master list by id across all arrays for the total company count.
Field reference: reference/api-fields.md.
Delegate the final output to the pronto-live-artifact agent (subagent_type: prontonlp-plugin:pronto-live-artifact). Pass the structured data — do not render HTML here and do not save a standalone report file.
artifact_type: live_marketpulse
title: "Market Pulse — <date range label>"
subtitle: "<total companies> companies · <market cap filter label> · Earnings Calls"
data:
meta:
dateRangeLabel: <human label>
sinceDay: <YYYY-MM-DD>
untilDay: <YYYY-MM-DD — omit key entirely if open-ended to now>
marketCapFilter: <label>
totalCompanies: <deduped count>
sections: [<movers?>, <trends?>, <speakers?>]
filters: { sectors?, country?, indices? }
expansions?: [ { criterion, originalSinceDay, widenedSinceDay } ]
leaderboards:
# Only include keys that were fetched in Step 2a.
stockChange: { topMovers: [...] }
investmentScore: { topMovers: [...] }
investmentScoreChange:{ topMovers: [...] }
sentimentScore: { topMovers: [...] }
sentimentScoreChange: { topMovers: [...], underperforming: [...] }
trends: [ { name, explanation, score, hits, change }, ... ] # when trends fetched
speakers: # when speakers fetched
execBullish: [ { name, company, companyId, sentimentScore, numOfSentences } ]
execBearish: [ ... ]
analystBullish: [ ... ]
analystBearish: [ ... ]
refresh:
onOpen: true
allowManualRefresh: true
tools: [getTopMovers, getTrends, getSpeakers]
params:
dateRangeMode: <rolling-window or fixed-range>
sinceDay: <YYYY-MM-DD>
untilDay: <YYYY-MM-DD — omit key entirely if open-ended to now>
marketCaps: <filter array from Step 0>
filters: { sectors?, country?, indices? }
sections: [<movers?>, <trends?>, <speakers?>]
The live artifact agent is responsible for creating a Claude live artifact that refreshes when reopened. Do not fall back to the shared HTML renderer for Market Pulse.
After the live artifact is ready, summarize:
underperforming category)See examples/sample-delivery.md for delivery phrasing.
After delivering the summary, ask the user:
"Your live Market Pulse artifact is ready in Claude and refreshes on open. 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 market pulse 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 live artifact.
Filename: market-pulse-<YYYYMMDD>.xlsx
Sheets to create (skip any whose source data is missing or empty):
#205262, no autofilter) — meta fields as Key / Value rows (date range, market cap filter, total companies, filters applied)leaderboards.stockChange.topMovers: Rank, Name, Ticker, Sector, Stock Change, Investment Score, Sentiment Scoreleaderboards.investmentScore.topMovers: same columnsleaderboards.investmentScoreChange.topMovers: same columnsleaderboards.sentimentScore.topMovers: same columnsleaderboards.sentimentScoreChange: topMovers (bullish) and underperforming (bearish) in one sheet with a Group column (Bullish / Bearish)trends: Topic, Score, Change, Hits, Explanationspeakers all 4 groups in one sheet: Group (Exec Bullish / Exec Bearish / Analyst Bullish / Analyst Bearish), Name, Company, Sentiment Score, SentencesStyling (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.
marketCaps as an array — never a plain string.dateRange: {gte, lte} format — never sinceDay/untilDay.pronto-marketpulse is the only ProntoNLP skill that should create a Claude live artifact. All other ProntoNLP report skills remain regular standalone HTML outputs.npx claudepluginhub prontonlp/prontonlp-plugin --plugin prontonlp-pluginGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.