Thank you for your interest in contributing. This guide covers everything you need to get started.
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/Developer-Tools-Directory.git cd Developer-Tools-Directory - Install dependencies:
pip install -r requirements.txt
- Create a feature branch:
git checkout -b feat/your-feature-name
Developer-Tools-Directory/
registry.json # Tool catalog (source of truth)
standards/ # Convention documentation (9 docs)
scaffold/
create-tool.py # Repo generator script
templates/ # Jinja2 templates for new repos
site-template/
build_site.py # Shared GitHub Pages build for tool repos
template.html.j2 # HTML template with configurable branding
fonts/ # Self-hosted Inter + JetBrains Mono woff2
docs/ # GitHub Pages catalog site
assets/ # Logo image
.github/workflows/ # CI/CD automation
- Open
registry.jsonand add a new entry at the end of the array:
{
"name": "Your Tool Name",
"repo": "TMHSDigital/Your-Tool-Repo",
"slug": "your-tool-repo",
"description": "One-line description of the tool",
"type": "cursor-plugin",
"homepage": "https://tmhsdigital.github.io/Your-Tool-Repo/",
"skills": 0,
"rules": 0,
"mcpTools": 0,
"extras": {},
"npm": "",
"topics": ["topic-1", "topic-2"],
"status": "active",
"version": "0.1.0",
"language": "Python",
"license": "CC-BY-NC-ND-4.0",
"pagesType": "static",
"hasCI": true
}-
Update the embedded registry copy in
docs/index.html- find the<script type="application/json" id="registry-data">tag and add the same entry there. -
Update
README.md:- Add a row to the Tools table
- Add a row to the Tool descriptions table (inside the
<details>block) - Update the aggregate stats line (total repos, skills, rules, MCP tools)
-
Commit with
feat: add <tool-name> to registry
| Field | Type | Constraints |
|---|---|---|
name |
string | Display name |
repo |
string | Owner/RepoName format |
slug |
string | Kebab-case, matches repo name |
description |
string | One line, no em dashes |
type |
string | cursor-plugin or mcp-server |
homepage |
string | URL or empty string |
skills |
int | >= 0 |
rules |
int | >= 0 |
mcpTools |
int | >= 0 |
extras |
object | Optional counts (snippets, templates, etc.) |
topics |
string[] | Discovery tags |
status |
string | active, beta, or deprecated |
version |
string | Semver |
language |
string | Primary language |
license |
string | SPDX identifier |
pagesType |
string | static, mkdocs, or none |
hasCI |
bool | Whether repo has CI workflows |
-
Create a new Markdown file in
standards/:# Example: standards/testing.md -
Structure the document:
- Start with an H1 title
- Include a brief overview paragraph
- Use H2 sections for major topics
- Include concrete examples and code blocks
- Write for public readership - no internal references
-
Add the standard to two index locations:
standards/README.md- add a row to the tableREADME.md- add a row to the Standards table
-
If the standard affects scaffold output, update the corresponding
.j2template inscaffold/templates/. -
Commit with
feat: add <standard-name> standard
- Edit the
.j2file inscaffold/templates/ - Test locally:
python scaffold/create-tool.py \ --name "Test Plugin" \ --description "Test description" \ --mcp-server \ --skills 2 \ --rules 1 \ --output /tmp/scaffold-test
- Verify the generated files look correct
- Commit with
fix:orchore:prefix
- Create the
.j2file inscaffold/templates/ - Update
scaffold/create-tool.pyto render it viawrite_file() - Run a test generation and verify the new file appears
- Update
README.md"What it generates" section if visible to users - Commit with
feat: add <template-name> scaffold template
Templates use Jinja2. Available context variables:
| Variable | Type | Description |
|---|---|---|
name |
string | Display name |
slug |
string | Kebab-case identifier |
description |
string | One-line description |
type |
string | cursor-plugin or mcp-server |
has_mcp |
bool | Whether MCP server scaffold is included |
skills |
list | Skill name strings |
rules |
list | Rule name strings |
skill_count |
int | Number of skills |
rule_count |
int | Number of rules |
license_spdx |
string | SPDX license identifier |
license_key |
string | License key for template selection |
author_name |
string | Author name |
author_email |
string | Author email |
repo_owner |
string | GitHub org (TMHSDigital) |
repo_name |
string | Repository name (same as slug) |
The catalog site lives in docs/ and is vanilla HTML/CSS/JS with zero dependencies.
docs/index.html- page structure, embedded registry fallbackdocs/style.css- dark theme, responsive cardsdocs/script.js- fetches registry.json, renders stats and tool cards, filtering
The pages.yml workflow copies registry.json and assets/ into docs/ at deploy time, so you don't need to manually copy files.
To test locally, open docs/index.html in a browser. The script falls back to the embedded registry data.
The unified site template (site-template/) powers GitHub Pages for all tool repos. Changes to the template affect every site at next deploy.
| File | Purpose |
|---|---|
site-template/template.html.j2 |
Jinja2 HTML template rendered by each tool repo |
site-template/build_site.py |
Build script that reads repo data and renders the template |
site-template/fonts/ |
Self-hosted Inter and JetBrains Mono woff2 files |
site-template/SETUP-PROMPT.md |
Full schema reference for site.json, mcp-tools.json, data flow |
python site-template/build_site.py --repo-root E:\Docker-Developer-Tools --out /tmp/docker-testOpen the generated index.html in a browser to verify. Repeat for at least one other tool repo to confirm the template works across different data shapes.
After modifying template.html.j2 or build_site.py, rebuild all 4 tool repos locally:
for repo in Docker-Developer-Tools Home-Lab-Developer-Tools Steam-Cursor-Plugin Monday-Cursor-Plugin; do
python site-template/build_site.py --repo-root "E:\$repo" --out "E:\$repo\docs"
doneThen commit the updated docs/index.html in each repo.
- Add the field to
build_site.py- load it fromsite.jsonand pass it in the template context - Use the field in
template.html.j2with a Jinja2 conditional so existing repos without the field still render correctly - Document the field in
site-template/SETUP-PROMPT.md(schema table, example, and customization guide) - Add a default value to the scaffold's
site.json.j2template if applicable - Test with a repo that uses the field and one that doesn't
- Commit with
feat: add <field-name> support to site template
Use descriptive branch names with a type prefix:
feat/add-tool-name- new registry entries or standardsfix/correct-registry-field- correctionschore/update-jinja2- dependency or CI changesdocs/improve-scaffold-docs- documentation improvements
Follow Conventional Commits:
feat: add kubernetes developer tools to registry
fix: correct homepage URL for steam-mcp
docs: clarify scaffold --license flag usage
chore: bump Jinja2 to 3.1.5
Before submitting a PR, verify:
-
registry.jsonis valid JSON (runpython -c "import json; json.load(open('registry.json'))") - No em dashes or en dashes in any content
- No hardcoded credentials or tokens
- If registry changed: embedded copy in
docs/index.htmlis updated - If registry changed: README.md tools table and stats are updated
- If standard added: both
standards/README.mdandREADME.mdtables are updated - If scaffold changed: dry-run test passes
- Commit messages follow conventional format
All PRs must pass:
- Registry schema validation
- Docs file existence
- Scaffold syntax and dry-run test
- CodeQL security scan
- Dependency review
- No em dashes. Use regular hyphens (-) or rewrite the sentence.
- No hardcoded credentials. Environment variables or config files only.
- Concise descriptions. No filler text or marketing language.
- Public readership. All content should make sense to external contributors.
- Consistent formatting. Use existing files as reference for Markdown structure.
This project follows the Contributor Covenant Code of Conduct. By participating, you agree to uphold this code.