Update docs for category-first README organization

CONTRIBUTING.md:
- New entry format requires inline language tags (`Python`, `Rust`, etc.)
- Updated section placement to list new category sections

CLAUDE.md:
- Updated architecture: README organized by category, not language
- Entry format includes inline language tags
- parse.py and site/generate.py extract languages from backtick tags

review-pr skill:
- Step 5a: validate that entries include required language tags
- Step 5c: updated section list to new category-first organization
This commit is contained in:
Wilson Freitas
2026-03-28 11:14:49 -03:00
parent 010d0b4782
commit c9557e7fd0
3 changed files with 95 additions and 43 deletions
+37 -23
View File
@@ -38,28 +38,33 @@ For every new line added to `README.md`, check the following:
#### 5a. Entry format
Each entry MUST match one of these accepted formats:
Each entry MUST include one or more language tags and match one of these accepted formats:
**GitHub project:**
**Single language:**
```
- [Project Name](https://github.com/owner/repo) - Short description ending with a period.
- [Project Name](https://github.com/owner/repo) - `Python` - Short description ending with a period.
```
**Multiple languages:**
```
- [Project Name](https://github.com/owner/repo) - `Python` `Rust` - Short description ending with a period.
```
**Project with website and GitHub repo:**
```
- [Project Name](https://project-site.com) - Short description ending with a period. [GitHub](https://github.com/owner/repo)
- [Project Name](https://project-site.com) - `Python` - Short description ending with a period. [GitHub](https://github.com/owner/repo)
```
**CRAN project (with optional GitHub link):**
```
- [Package Name](https://cran.r-project.org/package=pkgname) - Short description ending with a period.
- [Package Name](https://cran.r-project.org/package=pkgname) - Short description ending with a period. [GitHub](https://github.com/owner/repo)
- [Package Name](https://cran.r-project.org/package=pkgname) - `R` - Short description ending with a period.
- [Package Name](https://cran.r-project.org/package=pkgname) - `R` - Short description ending with a period. [GitHub](https://github.com/owner/repo)
```
**PyPI project (with optional GitHub link):**
```
- [package-name](https://pypi.org/project/package-name/) - Short description ending with a period.
- [package-name](https://pypi.org/project/package-name/) - Short description ending with a period. [GitHub](https://github.com/owner/repo)
- [package-name](https://pypi.org/project/package-name/) - `Python` - Short description ending with a period.
- [package-name](https://pypi.org/project/package-name/) - `Python` - Short description ending with a period. [GitHub](https://github.com/owner/repo)
```
The core regex used by `parse.py` to extract entries is: `^\s*- \[(.*)\]\((.*)\) - (.*)$`
@@ -68,11 +73,12 @@ Specifically check:
- Starts with `- ` (dash + space)
- Followed by a markdown link `[Name](URL)`
- Followed by ` - ` (space, dash, space)
- **MUST include one or more language tags in backticks** (e.g., `` `Python` ``, `` `Python` `Rust` ``) followed by ` - `
- Followed by a description that ends with a period `.`
- The period must come before the optional `[GitHub](url)` link
- The `[GitHub]` link, if present, must use the exact format `[GitHub](https://github.com/owner/repo)`
If the entry doesn't match, report exactly what's wrong (missing period, wrong separator, etc.).
If the entry doesn't match, report exactly what's wrong (missing language tags, missing period, wrong separator, etc.).
#### 5b. URL validation
@@ -85,26 +91,34 @@ If the entry doesn't match, report exactly what's wrong (missing period, wrong s
#### 5c. Section placement
Look at which `##` (language) and `###` (category) heading the entry was added under. Evaluate whether the project fits that section:
The README is now organized by **category** (not by language). Look at which `##` (category) heading the entry was added under. Evaluate whether the project fits that section:
- Does the project's language match the section? (e.g., a Python library should be under `## Python`)
- Does the project's purpose match the category? (e.g., a backtesting framework should be under `### Trading & Backtesting`, not `### Indicators`)
- Does the project's purpose match the category? (e.g., a backtesting framework should be under `## Trading & Backtesting`, not under `## Technical Indicators`)
- Commercial/proprietary projects must go under `## Commercial & Proprietary Services`.
- If the placement seems wrong, suggest a better section.
The current sections in the README are:
The current category sections in the README are:
**Python**: Numerical Libraries & Data Structures, Financial Instruments and Pricing, Indicators, Trading & Backtesting, Risk Analysis, Factor Analysis, Sentiment Analysis, Quant Research Environment, Time Series, Calendars, Data Sources, Excel Integration, Visualization
1. Numerical Libraries & Data Structures
2. Financial Instruments & Pricing
3. Technical Indicators
4. Trading & Backtesting
5. Portfolio Optimization & Risk Analysis
6. Factor Analysis
7. Sentiment Analysis & Alternative Data
8. Time Series Analysis
9. Market Data & Data Sources
10. Prediction Markets
11. Calendars & Market Hours
12. Visualization
13. Excel & Spreadsheet Integration
14. Quant Research Environments
15. Cross-Language Frameworks
16. Reproducing Works, Training & Books
17. Commercial & Proprietary Services
18. Related Lists
**R**: Numerical Libraries & Data Structures, Data Sources, Financial Instruments and Pricing, Trading, Backtesting, Risk Analysis, Factor Analysis, Time Series, Calendars
**Other languages**: Matlab, Julia, Java, JavaScript, Haskell, Scala, Ruby, Elixir/Erlang, Golang, CPP, CSharp, Rust
**Cross-language**: Frameworks, Reproducing Works Training & Books
**Commercial & Proprietary Services**
If the project doesn't fit any existing section, suggest the closest match or recommend creating a new subsection (rare).
If the project doesn't fit any existing section, suggest the closest match or recommend creating a new category section (rare).
#### 5d. Duplicate check
+20 -11
View File
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Project Overview
**awesome-quant** is a curated list of quantitative finance libraries, packages, and resources. The primary content lives in `README.md` — a large markdown file organized by programming language (Python, R, Matlab, Julia, Java, JavaScript, etc.) with categorized links to open-source projects.
**awesome-quant** is a curated list of quantitative finance libraries, packages, and resources. The primary content lives in `README.md` — a large markdown file **organized by category** (Numerical Libraries, Trading & Backtesting, Market Data, etc.) with inline language tags that identify which programming languages each project supports.
A companion website is generated from this data and deployed to GitHub Pages.
@@ -12,9 +12,15 @@ A companion website is generated from this data and deployed to GitHub Pages.
The pipeline works as follows:
1. **`README.md`** — The source of truth. All library entries follow the format: `- [name](url) - Description.`
2. **`parse.py`** — Parses `README.md`, extracts GitHub/CRAN/PyPI URLs, fetches last commit dates and stars via the GitHub API (using `PyGithub` with multithreading), and writes `site/projects.csv`.
3. **`site/generate.py`** — Reads `projects.csv` (or parses `README.md` directly) and generates a static HTML site with search, filtering, sorting, and dark mode.
1. **`README.md`** — The source of truth. All library entries follow the format: `- [name](url) - \`Language\` - Description.`
- Entries are grouped under category headings (`##`), not language headings
- Language is identified via inline backtick tags (e.g., `` `Python` ``, `` `Rust` ``) in the description
- Multi-language projects have multiple tags (e.g., `` `Python` `Rust` ``)
2. **`parse.py`** — Parses `README.md`, extracts language from backtick tags, fetches last commit dates and stars via the GitHub API (using `PyGithub` with multithreading), and writes `site/projects.csv` with a `languages` column (comma-separated).
3. **`site/generate.py`** — Reads `projects.csv` (or parses `README.md` directly) and generates a static HTML site with search, filtering by language/category/source, sorting, and dark mode.
4. **CI** (`.github/workflows/build.yml`) — Runs daily and on push to `main`: runs `parse.py`, runs `site/generate.py`, and deploys to GitHub Pages via `gh-pages` branch.
Supporting scripts:
@@ -36,17 +42,20 @@ uv run python site/generate.py
## Contributing Entries
See `CONTRIBUTING.md` for full guidelines. Accepted entry formats:
See `CONTRIBUTING.md` for full guidelines. All entries must include language tags:
```
- [Project Name](https://github.com/owner/repo) - Description ending with a period.
- [Project Name](https://site.com) - Description ending with a period. [GitHub](https://github.com/owner/repo)
- [Package Name](https://cran.r-project.org/package=pkg) - Description ending with a period.
- [package-name](https://pypi.org/project/pkg/) - Description ending with a period.
- [Project Name](https://github.com/owner/repo) - `Python` - Description ending with a period.
- [Project Name](https://github.com/owner/repo) - `Python` `Rust` - Multi-language project description.
- [Project Name](https://site.com) - `Python` - Description ending with a period. [GitHub](https://github.com/owner/repo)
- [Package Name](https://cran.r-project.org/package=pkg) - `R` - Description ending with a period.
- [package-name](https://pypi.org/project/pkg/) - `Python` - Description ending with a period.
```
CRAN and PyPI entries may optionally append `[GitHub](url)` after the description.
Entries are grouped under language headings (`##`) and category subheadings (`###`). Commercial/proprietary projects go under `## Commercial & Proprietary Services`.
Entries are grouped under category headings (`##`), not language headings. Language is identified via inline backtick tags. Commercial/proprietary projects go under `## Commercial & Proprietary Services`.
`parse.py` relies on this regex to extract entries: `^\s*- \[(.*)\]\((.*)\) - (.*)$`
`parse.py` and `site/generate.py` rely on this regex to extract entries: `^\s*- \[(.*)\]\((.*)\) - (.*)$`
The description text (group 3) may start with language tags in the format `` `Language1` `Language2` - `` followed by the actual description.
+38 -9
View File
@@ -4,12 +4,20 @@ Your contributions are always welcome! Please ensure your pull request meets the
## Entry Format
Each entry must follow one of these formats:
Each entry must include one or more language tags and follow one of these formats:
### GitHub project
### Single language
```markdown
- [Project Name](https://github.com/owner/repo) - Short description ending with a period.
- [Project Name](https://github.com/owner/repo) - `Python` - Short description ending with a period.
```
### Multiple languages
For projects available in multiple languages, list them as backtick-delimited tags:
```markdown
- [Project Name](https://github.com/owner/repo) - `Python` `Rust` - Short description ending with a period.
```
### Project with website and GitHub repo
@@ -17,7 +25,7 @@ Each entry must follow one of these formats:
For projects that have a dedicated website, link to the site and append the GitHub repo in the description:
```markdown
- [Project Name](https://project-site.com) - Short description ending with a period. [GitHub](https://github.com/owner/repo)
- [Project Name](https://project-site.com) - `Python` - Short description ending with a period. [GitHub](https://github.com/owner/repo)
```
### CRAN project
@@ -25,8 +33,8 @@ For projects that have a dedicated website, link to the site and append the GitH
Link to the CRAN package page. If the project has a GitHub repo, append it after the description:
```markdown
- [Package Name](https://cran.r-project.org/package=pkgname) - Short description ending with a period.
- [Package Name](https://cran.r-project.org/package=pkgname) - Short description ending with a period. [GitHub](https://github.com/owner/repo)
- [Package Name](https://cran.r-project.org/package=pkgname) - `R` - Short description ending with a period.
- [Package Name](https://cran.r-project.org/package=pkgname) - `R` - Short description ending with a period. [GitHub](https://github.com/owner/repo)
```
### PyPI project
@@ -34,8 +42,8 @@ Link to the CRAN package page. If the project has a GitHub repo, append it after
Link to the PyPI package page. If the project has a GitHub repo, append it after the description:
```markdown
- [package-name](https://pypi.org/project/package-name/) - Short description ending with a period.
- [package-name](https://pypi.org/project/package-name/) - Short description ending with a period. [GitHub](https://github.com/owner/repo)
- [package-name](https://pypi.org/project/package-name/) - `Python` - Short description ending with a period.
- [package-name](https://pypi.org/project/package-name/) - `Python` - Short description ending with a period. [GitHub](https://github.com/owner/repo)
```
### General rules
@@ -57,7 +65,28 @@ Commercial and proprietary projects are welcome. They will be placed under the *
## Section Placement
Add your entry under the correct language heading (`##`) and category subheading (`###`). If the project is a Python backtesting library, it goes under `## Python``### Trading & Backtesting`, not under `### Indicators`.
The README is organized by **category** (not by language). Add your entry under the appropriate category heading (`##`). The available categories are:
- Numerical Libraries & Data Structures
- Financial Instruments & Pricing
- Technical Indicators
- Trading & Backtesting
- Portfolio Optimization & Risk Analysis
- Factor Analysis
- Sentiment Analysis & Alternative Data
- Time Series Analysis
- Market Data & Data Sources
- Prediction Markets
- Calendars & Market Hours
- Visualization
- Excel & Spreadsheet Integration
- Quant Research Environments
- Cross-Language Frameworks
- Reproducing Works, Training & Books
- Commercial & Proprietary Services
- Related Lists
For example, if your project is a Python backtesting library, it goes under `## Trading & Backtesting` (not under Technical Indicators or another category).
If no existing category fits, suggest a new one in your PR description.