reports
Skill1.7k starsChanged 7 months agoMITView on GitHub
Report generation with .report.json format, interactive chart types (bar, line, area, pie, donut, radar, scatter, funnel), panel sizes, filter types, inline chat reports, and post-report checklist.
7 other projects use a version of this.
Trending
Quiet since February.thin dataabout the whole repository
Most recently taken up by
- lubusIN/frappe-skillstheir own version, first seen Nov 4, 2026
- garrytan/gbraintheir own version, first seen Oct 17, 2026
- DenchHQ/DenchClawword for word, first seen Oct 8, 2026
- hurttlocker/o8their own version, first seen Oct 4, 2026
- msrv-tech/skillstheir own version, first seen Oct 2, 2026
- supermodo/skillstheir own version, first seen Sep 26, 2026
Who's talking about DenchHQ/ironclaw
The biggest 1 of 1 mention linking to the repository that our crawl found. Each line is their own headline.
Other versions7 projects use a version of this.
Word for word · 1
- DenchHQ/DenchClaw★ 1.7k100% same
Edited · 0
None found.
Wrote their own version · 6
- garrytan/gbrain★ 32ksame name
- lubusIN/frappe-skills★ 68same name
- msrv-tech/skills★ 60same name
- hurttlocker/o8★ 24same name
- supermodo/skills★ 1same name
- yuntian05/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository35 other files it gives its agents.
- .cursor/rules/git-rules.mdcCursor rule
- agent-builderSkill
- data-builderSkill
- game-builderSkill
- platform-apiSkill
- app-builderSkill
- composio-appsSkill
- actionsSkill
- documentsSkill
- duckdb-operationsSkill
- object-builderSkill
- database-crm-systemSkill
- views-filtersSkill
- dench-integrationsSkill
- benchmarkSkill
- canarySkill
- carefulSkill
- design-consultationSkill
- design-reviewSkill
- document-releaseSkill
- freezeSkill
- guardSkill
- investigateSkill
- land-and-deploySkill
- office-hoursSkill
- plan-ceo-reviewSkill
- plan-design-reviewSkill
- plan-eng-reviewSkill
- qa-onlySkill
- qaSkill
- retroSkill
- reviewSkill
- shipSkill
- gstack-workflowSkill
- unfreezeSkill
The file
We split this skill into the rules it gives an agent
11 rules. 0 are common, 2 are distinctive, and 9 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
2
Distinctive
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 75
Always use the auto-generated v_{object} PIVOT views — never raw EAV queries
- Very specific: line 78
Use DATE_TRUNC('month', created_at) for time-series grouping
- Very specific: line 79
Always include ORDER BY for consistent chart rendering
- Very specific: line 80
Use aggregate functions: COUNT(*), SUM(...), AVG(...), MIN(...), MAX(...)
- Very specific: line 82
Verify the PIVOT view exists before writing report SQL: run SELECT COUNT(*) FROM v_{object} first.
- Distinctive: line 88
Test each panel's SQL individually: Run each query to confirm it returns data before assembling the report JSON.
- Distinctive: line 92
If a view exists but returns 0 rows, the chart will render but show nothing.
- Very specific: line 95
Do entries have field values?
- Very specific: line 163
When a user asks for analytics in chat (without explicitly asking to save a report), emit the report JSON inside a fenced code block with …
- Very specific: line 181
After creating a .report.json file:
- Very specific: line 200
When in doubt, bar is the safest default
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
CRM Reports
This skill covers report generation and inline chat charts. For workspace fundamentals, see the parent crm skill (crm/SKILL.md). For DuckDB queries used in report SQL, see duckdb-operations (crm/duckdb-operations/SKILL.md).
Report Generation (Analytics / Charts)
Reports are JSON config files (.report.json) that the web app renders as live interactive dashboards using Recharts. The agent creates these files to give the user visual analytics over their CRM data.
Report file format
Store reports as .report.json files in {{WORKSPACE_PATH}}/** (wherever appropriate / create directories if you need for better structure). The JSON schema:
{
"version": 1,
"title": "Report Title",
"description": "Brief description of what this report shows",
"panels": [
{
"id": "unique-panel-id",
"title": "Panel Title",
"type": "bar",
"sql": "SELECT ... FROM v_{object} ...",
"mapping": { "xAxis": "column_name", "yAxis": ["value_column"] },
"size": "half"
}
],
"filters": [
{
"id": "filter-id",
"type": "dateRange",
"label": "Date Range",
"column": "created_at"
}
]
}Chart types
| Type | Best for | Required mapping |
bar | Comparing categories | xAxis, yAxis |
line | Trends over time | xAxis, yAxis |
area | Volume trends | xAxis, yAxis |
pie | Distribution/share | nameKey, valueKey |
donut | Distribution (with center) | nameKey, valueKey |
radar | Multi-dimensional comparison | xAxis (or nameKey), yAxis |
scatter | Correlation | xAxis, yAxis |
funnel | Pipeline/conversion | nameKey, valueKey |
Panel sizes
"full"— spans full width (6 columns)"half"— spans half width (3 columns) — default"third"— spans one third (2 columns)
Filter types
dateRange— date picker (from/to), filters oncolumnselect— single-select dropdown, needssqlto fetch optionsmultiSelect— multi-select chips, needssqlto fetch optionsnumber— min/max numeric range
SQL query rules for reports
- Always use the auto-generated
v_{object}PIVOT views — never raw EAV queries - SQL must be SELECT-only (no INSERT/UPDATE/DELETE)
- Cast numeric fields:
"Amount"::NUMERICorCAST("Amount" AS NUMERIC) - Use
DATE_TRUNC('month', created_at)for time-series grouping - Always include
ORDER BYfor consistent chart rendering - Use aggregate functions:
COUNT(*),SUM(...),AVG(...),MIN(...),MAX(...) - Double-quote field names with spaces:
"Full Name","Email Address","Assigned To" - Verify the PIVOT view exists before writing report SQL: run
SELECT COUNT(*) FROM v_{object}first. If the view doesn't exist, create it (see duckdb-operations skill).
Before writing a report
- Verify the PIVOT view exists:
duckdb {{WORKSPACE_PATH}}/workspace.duckdb "SELECT COUNT(*) FROM v_{object}"— if this fails, the view needs to be created first. - Check the view columns:
duckdb {{WORKSPACE_PATH}}/workspace.duckdb -json "SELECT * FROM v_{object} LIMIT 1"— use the actual column names in your SQL (they are case-sensitive and may contain spaces). - Test each panel's SQL individually: Run each query to confirm it returns data before assembling the report JSON.
Handling empty data
If a view exists but returns 0 rows, the chart will render but show nothing. This is fine — no special handling needed. However, if the user asks "why is the chart empty?", check:
- Are there entries in the object?
SELECT COUNT(*) FROM entries WHERE object_id = (SELECT id FROM objects WHERE name = '{object}') - Do entries have field values?
SELECT COUNT(*) FROM entry_fields WHERE entry_id IN (SELECT id FROM entries WHERE object_id = ...)
Example Reports
Pipeline Funnel
{
"version": 1,
"title": "Deal Pipeline",
"description": "Deal count and value by stage",
"panels": [
{
"id": "deals-by-stage",
"title": "Deals by Stage",
"type": "funnel",
"sql": "SELECT \"Stage\", COUNT(*) as count FROM v_deal GROUP BY \"Stage\" ORDER BY count DESC",
"mapping": { "nameKey": "Stage", "valueKey": "count" },
"size": "half"
},
{
"id": "revenue-by-stage",
"title": "Revenue by Stage",
"type": "bar",
"sql": "SELECT \"Stage\", SUM(\"Amount\"::NUMERIC) as total FROM v_deal GROUP BY \"Stage\" ORDER BY total DESC",
"mapping": { "xAxis": "Stage", "yAxis": ["total"] },
"size": "half"
}
],
"filters": [
{ "id": "date", "type": "dateRange", "label": "Created", "column": "created_at" },
{
"id": "assignee",
"type": "select",
"label": "Assigned To",
"sql": "SELECT DISTINCT \"Assigned To\" as value FROM v_deal WHERE \"Assigned To\" IS NOT NULL",
"column": "Assigned To"
}
]
}Contact Growth
{
"version": 1,
"title": "Contact Growth",
"description": "New contacts over time",
"panels": [
{
"id": "growth-trend",
"title": "Contacts Over Time",
"type": "area",
"sql": "SELECT DATE_TRUNC('month', created_at) as month, COUNT(*) as count FROM v_people GROUP BY month ORDER BY month",
"mapping": { "xAxis": "month", "yAxis": ["count"] },
"size": "full"
}
]
}Inline Chat Reports
When a user asks for analytics in chat (without explicitly asking to save a report), emit the report JSON inside a fenced code block with language report-json. The web UI will render interactive charts inline:
Here's your pipeline analysis:
```report-json
{"version":1,"title":"Deals by Stage","panels":[{"id":"p1","title":"Deal Count","type":"bar","sql":"SELECT \"Stage\", COUNT(*) as count FROM v_deal GROUP BY \"Stage\" ORDER BY count DESC","mapping":{"xAxis":"Stage","yAxis":["count"]},"size":"full"}]}
```
Most deals are currently in the Discovery stage.The user can then "Pin" the inline report to save it as a .report.json file.
Post-Report Checklist
After creating a .report.json file:
- Verify the PIVOT view exists:
duckdb {{WORKSPACE_PATH}}/workspace.duckdb "SELECT COUNT(*) FROM v_{object}"— create the view if missing - Test each panel's SQL individually: Run each query against the DB to confirm it returns valid data
- Verify the report JSON is valid (proper JSON syntax, no trailing commas)
- Choose which directory the report should be created in
{{WORKSPACE_PATH}}based on the context of the conversation, if nothing very relevant, create/use the{{WORKSPACE_PATH}}/reports/directory. - Write the file:
{{WORKSPACE_PATH}}/**/{slug}.report.json - Tell the user they can view it in the workspace sidebar under whichever directory it was rightfully placed in based on the context.
Choosing the Right Chart Type
- Comparing categories (status breakdown, source distribution):
barorpie - Time series (growth, trends, revenue over time):
lineorarea - Pipeline/conversion (deal stages, lead funnel):
funnel - Distribution/proportion (market share, segment split):
pieordonut - Multi-metric comparison (performance scores):
radar - Correlation (price vs. size, score vs. revenue):
scatter - When in doubt,
baris the safest default
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

