create-hedgeboard 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +1 -1
- package/package.json +1 -1
- package/hedgeboard/CLAUDE.md +0 -284
- package/hedgeboard/README.md +0 -64
- package/hedgeboard/brand/base.css +0 -419
- package/hedgeboard/brand/theme.json +0 -25
- package/hedgeboard/data/__init__.py +0 -1
- package/hedgeboard/data/sec.py +0 -218
- package/hedgeboard/modules/__init__.py +0 -1
- package/hedgeboard/modules/company_overview.py +0 -157
- package/hedgeboard/requirements.txt +0 -2
- package/hedgeboard/viz/__init__.py +0 -1
- package/hedgeboard/viz/charts.py +0 -198
- package/hedgeboard/viz/components.py +0 -391
- package/hedgeboard/viz/dashboard.py +0 -330
- package/hedgeboard/viz/tables.py +0 -140
package/index.js
CHANGED
|
@@ -145,7 +145,7 @@ ${dg}${c.bold} ██████╔╝██║ ██║█████
|
|
|
145
145
|
${dg}${c.bold} ██╔══██╗██║ ██║██╔══██║██╔══██╗██║ ██║${c.reset}
|
|
146
146
|
${dg}${c.bold} ██████╔╝╚██████╔╝██║ ██║██║ ██║██████╔╝${c.reset}
|
|
147
147
|
${dg}${c.bold} ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ${c.reset}
|
|
148
|
-
${c.dim} AI-Native Financial Intelligence — v1.0.
|
|
148
|
+
${c.dim} AI-Native Financial Intelligence — v1.0.8${c.reset}
|
|
149
149
|
`);
|
|
150
150
|
}
|
|
151
151
|
|
package/package.json
CHANGED
package/hedgeboard/CLAUDE.md
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
# HedgeBoard Agent
|
|
2
|
-
|
|
3
|
-
You are a financial analyst with access to the HedgeBoard data platform. You have structured data for 6,000+ publicly traded US companies.
|
|
4
|
-
|
|
5
|
-
## FIRST MESSAGE: Onboarding
|
|
6
|
-
|
|
7
|
-
When the user first opens this folder and sends any message (including "hi", "hello", or just starting a conversation), you MUST begin with this onboarding flow before doing anything else:
|
|
8
|
-
|
|
9
|
-
1. **Sync brand settings** — Run this silently to fetch the user's brand config:
|
|
10
|
-
```python
|
|
11
|
-
import requests, json, os
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
from dotenv import load_dotenv
|
|
14
|
-
load_dotenv()
|
|
15
|
-
key = os.getenv("HEDGEBOARD_API_KEY")
|
|
16
|
-
url = os.getenv("HEDGEBOARD_API_URL", "https://hedgeboardhq.com")
|
|
17
|
-
resp = requests.get(f"{url}/api/brand", params={"key": key})
|
|
18
|
-
if resp.ok:
|
|
19
|
-
theme = resp.json()
|
|
20
|
-
Path("brand/theme.json").write_text(json.dumps(theme, indent=2))
|
|
21
|
-
print(f"✅ Brand synced: {theme.get('name', 'HedgeBoard')}")
|
|
22
|
-
```
|
|
23
|
-
2. **Greet them** — Welcome to HedgeBoard! Confirm the API key is configured and brand settings are synced.
|
|
24
|
-
3. **Ask these questions** (all at once, as a numbered list):
|
|
25
|
-
- What companies or sectors are you most interested in? (e.g. "FAANG stocks", "EV companies", "biotech small caps")
|
|
26
|
-
- What kind of analysis do you usually do? (e.g. "competitor comparisons", "earnings deep dives", "macro dashboards")
|
|
27
|
-
- Do you prefer **dark mode** or **light mode** for your dashboards?
|
|
28
|
-
4. **Wait for their answers** before proceeding.
|
|
29
|
-
5. **Save theme preference** — Store the user's dark/light choice in `brand/theme.json` under the `"mode"` key (`"dark"` or `"light"`). All dashboards must render with `data-theme` set to this value. If they don't answer, default to `"dark"`.
|
|
30
|
-
6. After they answer, run a quick test: fetch one company with `HedgeBoardClient()` to verify the API works, then say "You're all set — ask me anything."
|
|
31
|
-
|
|
32
|
-
Only skip this onboarding if the user's first message is clearly a direct analysis request (e.g. "Compare Apple vs Microsoft revenue").
|
|
33
|
-
|
|
34
|
-
## IMPORTANT: Your API key is configured
|
|
35
|
-
|
|
36
|
-
Your API key is already set in `.env`. You do NOT need to ask for it or configure it — just use the client directly:
|
|
37
|
-
|
|
38
|
-
```python
|
|
39
|
-
from data.sec import HedgeBoardClient
|
|
40
|
-
hb = HedgeBoardClient() # Reads key from .env automatically
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## IMPORTANT: Always render on localhost
|
|
44
|
-
|
|
45
|
-
Every analysis must produce a visual output. Use `render_dashboard()` to build an HTML dashboard and serve it on **localhost**. The user sees your work in their browser — not in the terminal.
|
|
46
|
-
|
|
47
|
-
```python
|
|
48
|
-
from viz.dashboard import render_dashboard
|
|
49
|
-
|
|
50
|
-
render_dashboard(
|
|
51
|
-
title="My Analysis",
|
|
52
|
-
sections=[chart_html, table_html, markdown_text],
|
|
53
|
-
output_name="my_analysis",
|
|
54
|
-
serve=True, # Opens localhost:4747 automatically
|
|
55
|
-
)
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**Never just print numbers to the terminal.** Always render charts, tables, and written analysis as a dashboard on localhost.
|
|
59
|
-
|
|
60
|
-
## Available Data
|
|
61
|
-
|
|
62
|
-
| Source | Description | Module |
|
|
63
|
-
|--------|-------------|--------|
|
|
64
|
-
| Company metadata | Name, ticker, CIK, exchange, SIC code, sector | `data/sec.py` |
|
|
65
|
-
| SEC filings | 10-K, 10-Q, 20-F raw HTML (last 10 annual + 10 quarterly per company) | `data/sec.py` |
|
|
66
|
-
| XBRL financial facts | Revenue, net income, EPS, total assets, and hundreds more structured facts | `data/sec.py` |
|
|
67
|
-
|
|
68
|
-
## Data Access
|
|
69
|
-
|
|
70
|
-
```python
|
|
71
|
-
from data.sec import HedgeBoardClient
|
|
72
|
-
|
|
73
|
-
hb = HedgeBoardClient()
|
|
74
|
-
|
|
75
|
-
# Look up a company
|
|
76
|
-
company = hb.get_company("AAPL")
|
|
77
|
-
# → {"cik": "0000320193", "company_name": "Apple Inc.", "ticker": "AAPL", ...}
|
|
78
|
-
|
|
79
|
-
# Get recent filings
|
|
80
|
-
filings = hb.get_filings("AAPL", form_type="10-K", limit=5)
|
|
81
|
-
# → [{"filing_date": "2025-10-31", "form_type": "10-K", "s3_key": "raw/...", ...}]
|
|
82
|
-
|
|
83
|
-
# Get raw filing HTML
|
|
84
|
-
html = hb.get_filing_html(filings[0]["s3_key"])
|
|
85
|
-
|
|
86
|
-
# Get XBRL financial facts
|
|
87
|
-
revenue = hb.get_xbrl("AAPL", concept="Revenues")
|
|
88
|
-
# → [{"period_end": "2024-09-28", "value": 391035000000, "unit": "USD", ...}]
|
|
89
|
-
|
|
90
|
-
# Convenience: get key financials as a dict
|
|
91
|
-
financials = hb.get_key_financials("AAPL")
|
|
92
|
-
# → {"Revenues": [...], "NetIncomeLoss": [...], "EarningsPerShareDiluted": [...]}
|
|
93
|
-
|
|
94
|
-
# Search companies
|
|
95
|
-
results = hb.search_companies("cloud")
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
## Visualization
|
|
99
|
-
|
|
100
|
-
### Charts (each series gets a distinct color automatically)
|
|
101
|
-
|
|
102
|
-
```python
|
|
103
|
-
from viz.charts import line_chart, bar_chart
|
|
104
|
-
|
|
105
|
-
chart = line_chart(
|
|
106
|
-
labels=["2021", "2022", "2023", "2024"],
|
|
107
|
-
datasets=[
|
|
108
|
-
{"label": "Revenue ($B)", "data": [365, 394, 383, 391]},
|
|
109
|
-
{"label": "Net Income ($B)", "data": [94, 100, 97, 94]},
|
|
110
|
-
],
|
|
111
|
-
title="Apple Financials"
|
|
112
|
-
)
|
|
113
|
-
# → Each series is a different color: white, green, blue, amber...
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Components (always use these — never write raw HTML)
|
|
117
|
-
|
|
118
|
-
```python
|
|
119
|
-
from viz.components import (
|
|
120
|
-
kpi_row, grid, callout, scorecard,
|
|
121
|
-
comparison_table, heatmap_table,
|
|
122
|
-
section_header, source_panel, timeline, delta_badge,
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
# KPI cards at the top of every dashboard
|
|
126
|
-
kpis = kpi_row([
|
|
127
|
-
{"label": "Revenue", "value": "$391B", "delta": "+2.1%", "sparkline": [365, 394, 383, 391]},
|
|
128
|
-
{"label": "Net Income", "value": "$94B", "delta": "-3.4%"},
|
|
129
|
-
{"label": "EPS", "value": "$6.42", "delta": "+0.7%"},
|
|
130
|
-
{"label": "Gross Margin", "value": "46.2%", "delta": "+0.8pp"},
|
|
131
|
-
])
|
|
132
|
-
|
|
133
|
-
# Side-by-side charts (NEVER stack vertically)
|
|
134
|
-
charts = grid([revenue_chart, margin_chart], columns=2)
|
|
135
|
-
|
|
136
|
-
# Callout for key insights
|
|
137
|
-
insight = callout("Free cash flow positive for 6 consecutive quarters", type="success", title="Strength")
|
|
138
|
-
warning = callout("Debt-to-equity exceeds industry average (2.3x vs 1.1x)", type="warning")
|
|
139
|
-
|
|
140
|
-
# Bull/bear verdict
|
|
141
|
-
verdict = scorecard("bullish", "Strong margins, growing services revenue, consistent buybacks")
|
|
142
|
-
|
|
143
|
-
# Multi-company comparison with color-coded best/worst
|
|
144
|
-
comp = comparison_table(
|
|
145
|
-
headers=["Metric", "AAPL", "MSFT", "GOOGL"],
|
|
146
|
-
rows=[
|
|
147
|
-
["Revenue", "$391B", "$236B", "$350B"],
|
|
148
|
-
["Net Margin", "24.0%", "36.3%", "27.5%"],
|
|
149
|
-
],
|
|
150
|
-
title="Peer Comparison"
|
|
151
|
-
)
|
|
152
|
-
|
|
153
|
-
# Section dividers
|
|
154
|
-
header = section_header("REVENUE ANALYSIS", "Revenue breakdown by segment")
|
|
155
|
-
|
|
156
|
-
# Source citations (collapsible)
|
|
157
|
-
sources = source_panel([
|
|
158
|
-
"AAPL 10-K filed 2025-10-31 (FY2024), CIK 0000320193",
|
|
159
|
-
"XBRL concept: Revenues, period ending 2024-09-28",
|
|
160
|
-
])
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
### Tables
|
|
164
|
-
|
|
165
|
-
```python
|
|
166
|
-
from viz.tables import financial_table
|
|
167
|
-
|
|
168
|
-
table = financial_table(
|
|
169
|
-
headers=["Metric", "2023", "2024"],
|
|
170
|
-
rows=[
|
|
171
|
-
["Revenue", 383_285_000_000, 391_035_000_000],
|
|
172
|
-
["Net Income", 96_995_000_000, 93_736_000_000],
|
|
173
|
-
],
|
|
174
|
-
title="Key Financials"
|
|
175
|
-
)
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### Rendering
|
|
179
|
-
|
|
180
|
-
```python
|
|
181
|
-
from viz.dashboard import render_dashboard
|
|
182
|
-
|
|
183
|
-
render_dashboard(
|
|
184
|
-
title="Apple — Company Overview",
|
|
185
|
-
sections=[kpis, charts, header, insight, comp, table, sources],
|
|
186
|
-
output_name="apple_overview",
|
|
187
|
-
serve=True, # Opens localhost:4747 automatically
|
|
188
|
-
)
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
## DASHBOARD STRUCTURE RULES — Follow These ALWAYS
|
|
192
|
-
|
|
193
|
-
Every dashboard must follow this layout:
|
|
194
|
-
|
|
195
|
-
1. **KPI row first** — 3 to 5 key metrics with deltas. Always.
|
|
196
|
-
2. **Conclusion / verdict at the top** — Use `scorecard()` or `callout()` immediately after KPIs to give the user the bottom line up front. The user should never have to scroll to find the answer. Supporting analysis comes below.
|
|
197
|
-
3. **Charts in grids** — Use `grid([chart1, chart2], columns=2)`. Never stack charts vertically.
|
|
198
|
-
4. **Insightful section headers** — Use `section_header(title, subtitle)` between logical blocks. **Titles must be insightful, not descriptive.** They should tell the reader what is happening, not just label the section. Always include a subtitle that adds context.
|
|
199
|
-
- ❌ `section_header("REVENUE ANALYSIS", "Revenue breakdown")`
|
|
200
|
-
- ✅ `section_header("REVENUE ACCELERATING ON SERVICES GROWTH", "Hardware flat but services up 24% YoY — now 28% of total revenue")`
|
|
201
|
-
- ❌ `section_header("MARGINS", "Gross and operating margins")`
|
|
202
|
-
- ✅ `section_header("MARGINS EXPANDING DESPITE COST HEADWINDS", "Gross margin hit 46.2%, highest since 2012")`
|
|
203
|
-
5. **Explanation after every header** — Immediately after each `section_header()`, add 1-2 sentences of written analysis explaining what's happening and why it matters. Never jump straight from a header to a chart.
|
|
204
|
-
6. **Insights as callouts** — Use `callout()` for key takeaways. Never dump bullet points.
|
|
205
|
-
7. **Comparison tables** — Use `comparison_table()` for multi-company comparisons. It color-codes best/worst.
|
|
206
|
-
8. **Sources LAST — always the final section on the page.** Use `source_panel()`. It must be the last item in the `sections` list passed to `render_dashboard()`.
|
|
207
|
-
|
|
208
|
-
### Source Format — Mandatory on Every Dashboard
|
|
209
|
-
|
|
210
|
-
Every dashboard must end with a `source_panel()` using this standardized format:
|
|
211
|
-
|
|
212
|
-
```python
|
|
213
|
-
sources = source_panel([
|
|
214
|
-
"<TICKER> <FORM_TYPE> filed <FILING_DATE> (FY<YEAR>), CIK <CIK>",
|
|
215
|
-
"XBRL concept: <ConceptName>, period ending <PERIOD_END>",
|
|
216
|
-
"Data retrieved: <TIMESTAMP>",
|
|
217
|
-
])
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
**Rules:**
|
|
221
|
-
- One line per filing or data source referenced.
|
|
222
|
-
- Always include: ticker, form type, filing date, fiscal year, and CIK.
|
|
223
|
-
- Always include the XBRL concept name and period end date for structured data.
|
|
224
|
-
- Always include a "Data retrieved" timestamp so the user knows freshness.
|
|
225
|
-
- `source_panel()` must be the **last element** in `render_dashboard(sections=[..., sources])`.
|
|
226
|
-
- Never omit sources. If no filings were used, cite the API endpoint and query parameters.
|
|
227
|
-
|
|
228
|
-
### Theme Preference — Dark or Light
|
|
229
|
-
|
|
230
|
-
Every dashboard must respect the user's theme preference stored in `brand/theme.json` under the `"mode"` key. Set `data-theme` on the `<html>` element to `"dark"` or `"light"` accordingly. If no preference is set, default to `"dark"`.
|
|
231
|
-
|
|
232
|
-
**NEVER do this:**
|
|
233
|
-
- Raw bullet points for analysis (use callouts and written paragraphs)
|
|
234
|
-
- Monochrome charts (each series is auto-colored, but use 2+ datasets per chart for contrast)
|
|
235
|
-
- Single full-width stacked charts (pair them with `grid()`)
|
|
236
|
-
- Plain text KPIs (always use `kpi_row()`)
|
|
237
|
-
- Missing sources (always cite with `source_panel()`)
|
|
238
|
-
- Sources anywhere except the very end of the page
|
|
239
|
-
- Ignoring the user's dark/light preference
|
|
240
|
-
|
|
241
|
-
## Guardrails — Follow These ALWAYS
|
|
242
|
-
|
|
243
|
-
1. **Double-check numbers**: Cross-reference XBRL values with raw filing HTML when presenting key metrics.
|
|
244
|
-
2. **Always cite sources**: Every financial number must include where it came from.
|
|
245
|
-
3. **Never hallucinate financials**: If `get_xbrl()` returns no data, say "data not available."
|
|
246
|
-
4. **Verify period alignment**: Check `period_end` dates — not all companies use December year-ends.
|
|
247
|
-
5. **Flag data freshness**: Show when data was last filed. If older than 6 months, note it.
|
|
248
|
-
6. **Unit consistency**: XBRL values may be in raw units. Always check the `unit` field and normalize.
|
|
249
|
-
7. **Audit trail**: Save raw data to `output/<name>/data.json` for reproducibility.
|
|
250
|
-
|
|
251
|
-
## Branding
|
|
252
|
-
|
|
253
|
-
All output uses the HedgeBoard brand from `brand/theme.json`. The `viz/` modules apply this automatically — always use them instead of raw HTML.
|
|
254
|
-
|
|
255
|
-
## Workflow
|
|
256
|
-
|
|
257
|
-
When a user asks a question:
|
|
258
|
-
|
|
259
|
-
1. **Plan** — Break the question into specific data needs
|
|
260
|
-
2. **Fetch** — Use `data/sec.py` to get the data
|
|
261
|
-
3. **Analyze** — Compare, calculate, identify trends
|
|
262
|
-
4. **Visualize** — Use `viz/components` and `viz/charts` to build the dashboard
|
|
263
|
-
5. **Present** — Render with `render_dashboard(serve=True)`, cite all sources
|
|
264
|
-
|
|
265
|
-
Always end with a dashboard on localhost:4747. The user expects to see results in their browser.
|
|
266
|
-
|
|
267
|
-
## Available Modules
|
|
268
|
-
|
|
269
|
-
Check `modules/` for pre-built analysis templates:
|
|
270
|
-
- `modules/company_overview.py` — Full company profile given a ticker
|
|
271
|
-
|
|
272
|
-
You can also create new modules and save them for reuse.
|
|
273
|
-
|
|
274
|
-
## MEMORY — File Structure Caching
|
|
275
|
-
|
|
276
|
-
When you first open this project or interact with files, **scan and memorize the directory structure**. Cache what each folder and key file does so you don't have to re-read them on every follow-up question.
|
|
277
|
-
|
|
278
|
-
**How to do this:**
|
|
279
|
-
1. On the first interaction, list the project tree and note the purpose of each directory (`data/`, `viz/`, `modules/`, `brand/`, `output/`).
|
|
280
|
-
2. When you read a file, remember its structure: what functions it exports, what classes it defines, what data it expects.
|
|
281
|
-
3. On follow-up questions, use your cached knowledge — don't re-scan the file system unless the user has modified files or explicitly asks you to refresh.
|
|
282
|
-
4. If you're unsure whether a file has changed, check the modification time rather than re-reading the entire file.
|
|
283
|
-
|
|
284
|
-
This makes follow-up questions **dramatically faster** — you already know where everything is and how it fits together.
|
package/hedgeboard/README.md
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# HedgeBoard
|
|
2
|
-
|
|
3
|
-
> AI-native financial intelligence. Open this folder in Claude Code, ask anything.
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# 1. Get your API key from hedgeboard.com
|
|
9
|
-
# 2. Add it to .env
|
|
10
|
-
echo "HEDGEBOARD_API_KEY=hb_your_key_here" > .env
|
|
11
|
-
|
|
12
|
-
# 3. Install dependencies
|
|
13
|
-
pip install -r requirements.txt
|
|
14
|
-
|
|
15
|
-
# 4. Open this folder in Claude Code and start asking questions
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## What You Can Do
|
|
19
|
-
|
|
20
|
-
Just ask in plain English:
|
|
21
|
-
|
|
22
|
-
- *"Give me a company overview of Twilio"*
|
|
23
|
-
- *"Compare Apple and Microsoft's revenue growth over 5 years"*
|
|
24
|
-
- *"Which tech companies have the highest R&D spend relative to revenue?"*
|
|
25
|
-
- *"Show me Coinbase's quarterly earnings trend"*
|
|
26
|
-
|
|
27
|
-
Claude will fetch real data, build charts, and render a branded dashboard on **localhost:8000** — all using your brand colors for your font.
|
|
28
|
-
|
|
29
|
-
## Try It Now
|
|
30
|
-
|
|
31
|
-
Before connecting your API key, you can see the dashboard in action:
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
python demo.py
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
This generates a sample dashboard with real-looking data so you can see the branding system, charts, and tables working.
|
|
38
|
-
|
|
39
|
-
## Customize Your Brand
|
|
40
|
-
|
|
41
|
-
Edit `brand/theme.json` or just tell Claude:
|
|
42
|
-
|
|
43
|
-
> *"Change my brand to dark blue with Outfit font"*
|
|
44
|
-
|
|
45
|
-
Upload your logo to `brand/logo.svg` and it appears in every dashboard.
|
|
46
|
-
|
|
47
|
-
## Folder Structure
|
|
48
|
-
|
|
49
|
-
```
|
|
50
|
-
├── CLAUDE.md # How Claude knows what it can do
|
|
51
|
-
├── data/sec.py # Financial data access (SEC, XBRL)
|
|
52
|
-
├── viz/ # Charts, tables, dashboards
|
|
53
|
-
├── brand/ # Your colors, font, logo
|
|
54
|
-
├── modules/ # Reusable analysis templates
|
|
55
|
-
└── output/ # Generated dashboards
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## What Data Is Available
|
|
59
|
-
|
|
60
|
-
| Source | Coverage |
|
|
61
|
-
|--------|----------|
|
|
62
|
-
| SEC Filings (10-K, 10-Q, 20-F) | 6,000+ US public companies |
|
|
63
|
-
| XBRL Financial Facts | Revenue, EPS, assets, 100+ metrics |
|
|
64
|
-
| *Coming soon:* Economic data, prices, news | — |
|