This file tells AI coding agents how the Developer Tools Directory repo works and how to contribute correctly.
Catalog site: https://tmhsdigital.github.io/Developer-Tools-Directory/ (auto-deployed on push to main)
This is a meta-repository -- it does not contain a Cursor plugin or MCP server itself. It catalogs, standardizes, and scaffolds other TMHSDigital developer tool repos. It contains:
registry.json-- single source of truth for all tool repos (9 entries). The catalog site and README tables are derived from it.standards/-- 9 Markdown docs defining conventions for folder structure, CI/CD, plugin manifests, GitHub Pages, commit conventions, README format, AGENTS.md format, and versioning.scaffold/-- Python repo generator (create-tool.py) with Jinja2 templates that produce a fully standards-compliant new tool repo.site-template/-- shared GitHub Pages build system for tool repos.build_site.pyreads.cursor-plugin/plugin.json,site.json,skills/,rules/, andmcp-tools.jsonfrom a tool repo and rendersdocs/index.htmlviatemplate.html.j2. Self-hosts Inter and JetBrains Mono fonts. Tool repos clone this directory in CI and run the build script at deploy time.docs/-- static GitHub Pages catalog site (vanilla HTML/CSS/JS, no build step). Readsregistry.jsonat runtime to render tool cards.assets/-- logo image..github/workflows/-- CI/CD for this repo (validate, pages, release, release-drafter, stale, codeql, dependency-review, label-sync).
- Single branch:
mainonly. No develop/release branches. - Conventional commits are required:
feat:-- new tool added to registry, new standard doc, new scaffold templatefix:-- corrections to existing contentchore:-- dependency updates, CI changesdocs:-- documentation-only changes
- Commit messages should be concise and describe the "why", not the "what".
Checks:
registry.jsonis valid JSON with correct schema (required fields, valid types, integer counts)docs/index.html,docs/style.css,docs/script.jsexistscaffold/create-tool.pycompiles without syntax errors- Scaffold dry-run test: generates a test repo and verifies key files exist
- Copies
registry.jsonintodocs/for client-side fetch - Copies
assets/intodocs/assets/ - Uploads
docs/as a Pages artifact - Deploys to GitHub Pages via
actions/deploy-pages
- Gets the latest git tag
- Determines version bump from conventional commit prefixes since last tag
- Creates annotated tag and pushes it
- Creates a GitHub Release with auto-generated notes
Has a concurrency guard -- only one release can run at a time. Commits with [skip ci] are ignored.
The repo About section (description, homepage, topics) must be updated manually after registry changes since the GITHUB_TOKEN lacks permission for gh repo edit. Run locally:
gh repo edit TMHSDigital/Developer-Tools-Directory --description "Centralized catalog, standards, and scaffolding for <N> TMHSDigital developer tools - <S> skills, <R> rules, <M> MCP tools"
Auto-drafts release notes from merged PR titles/labels. Config in .github/release-drafter.yml defines categories (Features, Standards, Scaffold, Bug Fixes, Documentation, CI) and version resolution rules.
Marks and closes inactive issues and PRs. Issues: 60-day stale / 14-day close. PRs: 30-day stale / 14-day close. Exempt labels: pinned, security, enhancement.
Runs GitHub CodeQL security scanning for Python code.
Audits new dependencies for known vulnerabilities. Comments a summary in the PR. Fails on high severity.
Auto-labels PRs by changed file paths: standards/ -> standards, scaffold/ -> scaffold, docs/ -> documentation, registry.json -> registry, .github/ -> ci.
Array of tool objects. Required fields per entry:
| Field | Type | Description |
|---|---|---|
name |
string | Display name |
repo |
string | Owner/RepoName |
slug |
string | Kebab-case identifier |
description |
string | One-line summary |
type |
string | cursor-plugin or mcp-server |
homepage |
string | Docs site URL (empty string if none) |
skills |
int | Number of skills |
rules |
int | Number of rules |
mcpTools |
int | Number of MCP tools |
extras |
object | Optional extra counts (snippets, templates, natives, events) |
npm |
string | npm package name (empty string or omit if none) |
topics |
string[] | Discovery tags |
status |
string | active, beta, deprecated |
version |
string | Current semver version |
language |
string | Primary language |
license |
string | SPDX identifier |
pagesType |
string | static, mkdocs, or none |
hasCI |
bool | Whether the repo has CI workflows |
The catalog site. It embeds a copy of the registry data in a <script type="application/json"> tag as a fallback, and also fetches registry.json at runtime. When updating the registry, also update the embedded copy in index.html to keep them in sync.
Python script using Jinja2. Templates live in scaffold/templates/. The script accepts CLI args (--name, --description, --type, --mcp-server, --skills, --rules, --license, --output).
Pure documentation -- no code. Each file documents a convention derived from analyzing existing TMHSDigital tool repos (CFX, Docker, Steam, Home Lab, etc.).
- Add an entry to
registry.jsonfollowing the schema above - Update the embedded registry in
docs/index.htmlto match - Update the tools table and aggregate stats line in
README.md - Use
feat:commit prefix
- Edit or create the file in
standards/ - If new, add a row to the standards table in
README.mdand instandards/README.md - If the standard affects the scaffold output, update the corresponding
.j2template inscaffold/templates/ - Use
docs:commit prefix for docs-only changes,feat:if adding a new standard
- Edit templates in
scaffold/templates/ - If adding a new template file, update
scaffold/create-tool.pyto render it - Test with:
python scaffold/create-tool.py --name "Test" --description "Test" --mcp-server --skills 2 --rules 1 --output /tmp/test - CI runs a dry-run test on every push
- Every entry requires all fields listed in the schema table above. CI validates this on every push and PR.
typemust be exactlycursor-pluginormcp-server. No other values are accepted.skills,rules, andmcpToolsmust be integers, not strings.statusmust beactive,beta, ordeprecated.- After adding or modifying an entry, you must also update:
- The embedded registry copy in
docs/index.html-- find the<script type="application/json" id="registry-data">tag and sync it withregistry.json - The tools table in
README.md-- add/update the row - The tool descriptions
<details>block inREADME.md-- add/update the description - The aggregate stats line in
README.md(total repos, skills, rules, MCP tools)
- The embedded registry copy in
- Use
feat:commit prefix when adding a new tool,fix:when correcting existing entries.
- Standards are pure Markdown documentation. They contain no executable code.
- Each standard should have an H1 title, a brief overview paragraph, and H2 sections for major topics.
- Write for public readership. Do not reference internal repos, private URLs, or credentials.
- No em dashes or en dashes -- use hyphens or rewrite.
- If adding a new standard document:
- Create the
.mdfile instandards/ - Add a row to the table in
standards/README.md - Add a row to the Standards table in the main
README.md
- Create the
- If a standard change affects what the scaffold should generate, update the corresponding
.j2template inscaffold/templates/to match. - Use
docs:commit prefix for edits,feat:for entirely new standards.
- The generator script is
scaffold/create-tool.py. It uses Jinja2EnvironmentwithFileSystemLoaderpointed atscaffold/templates/. - Templates use
.j2extension. Available context variables:name,slug,description,type,has_mcp,skills,rules,skill_count,rule_count,license_spdx,license_key,author_name,author_email,repo_owner,repo_name. - If adding a new template file:
- Create the
.j2file inscaffold/templates/(or a subdirectory for MCP server templates) - Add a
write_file()call increate-tool.pyto render and write it - If the file is conditional (e.g., MCP-only), wrap the call in
if args.mcp_server
- Create the
- Always test changes locally before committing:
python scaffold/create-tool.py --name "Test" --description "Test" --mcp-server --skills 2 --rules 1 --output /tmp/test - CI runs a scaffold dry-run test on every push. If you add a new required file, add a
test -fcheck to thevalidate.ymlscaffold test step. - The
LICENSE.j2template has conditional logic for MIT, Apache-2.0, and CC-BY-NC-ND-4.0. If adding a new license option, update both the template and theLICENSE_FILES/SPDXdicts increate-tool.py.
site-template/build_site.pyis the build script that generates GitHub Pages sites for tool repos. It reads data from the tool repo and renders HTML viatemplate.html.j2.site-template/template.html.j2is a Jinja2 template producing a single-page site with: sticky nav, hero with animated stats, collapsible MCP tool categories, search/filter, back-to-top, toast copy feedback, and mobile hamburger nav.site-template/fonts/contains self-hosted Inter (400/500/700) and JetBrains Mono (400) woff2 files.site-template/SETUP-PROMPT.mdis a copy-paste prompt for applying the template to a new tool repo.- Tool repos consume this template via their
pages.ymlworkflow, which clones Developer-Tools-Directory with sparse checkout and runsbuild_site.py --repo-root . --out docs. - Data sources in each tool repo:
.cursor-plugin/plugin.json(metadata),site.json(branding/colors),skills/*/SKILL.md(parsed for name/description via frontmatter),rules/*.mdc(parsed for name/scope/description),mcp-tools.json(manually maintained tool list). - Changes to the template or build script affect all tool repos on their next deploy. Test locally before pushing:
python site-template/build_site.py --repo-root /path/to/tool-repo --out /path/to/tool-repo/docs
docs/index.htmlis the single-page catalog site. It embeds a copy ofregistry.jsoninside a<script type="application/json" id="registry-data">tag as a fallback for when the direct fetch fails.docs/script.jsfetchesregistry.jsonat runtime. If the fetch fails, it reads the embedded copy. It renders aggregate stats (total skills, rules, MCP tools) and tool cards with filtering by type and topic.docs/style.csscontains all styling -- dark theme, responsive layout, card design. No CSS framework.- No external CDN dependencies. The site must work fully offline except for badge images. No jQuery, no Bootstrap, no Google Fonts.
- The
pages.ymlworkflow copiesregistry.jsonandassets/intodocs/at deploy time. You do not need to manually place these files indocs/. - When testing locally, open
docs/index.htmldirectly in a browser. The embedded fallback will kick in sinceregistry.jsonwon't be indocs/locally. - Do not use
innerHTMLorevalwith registry data. UsetextContentfor any user-facing text to prevent XSS.
validate.ymlruns on PR and push to main. It has three jobs: registry validation, docs existence checks, and scaffold syntax + dry-run test. Keep checks fast -- avoid installing unnecessary dependencies.pages.ymldeploys to GitHub Pages on push to main whendocs/,assets/, orregistry.jsonchange. It copiesregistry.jsonintodocs/andassets/intodocs/assets/before uploading. Usesactions/deploy-pages.release.ymlauto-creates a GitHub release on push to main (excluding docs/md/standards changes). It determines the version bump from conventional commit prefixes since the last tag. Has a concurrency guard -- only one release can run at a time. Commits containing[skip ci]are ignored. The repo About section must be updated manually viagh repo editafter registry changes (the GITHUB_TOKEN lacks permission for this).release-drafter.ymlauto-drafts release notes from merged PR titles/labels. Config is in.github/release-drafter.yml. Categories: Features, Standards, Scaffold, Bug Fixes, Documentation, CI/Infrastructure. The autolabeler assigns labels based on changed file paths.stale.ymlruns weekly (Sunday midnight UTC). Issues: 60-day stale, 14-day close. PRs: 30-day stale, 14-day close. Labels exempt from staleness:pinned,security,enhancement(issues) andpinned,security(PRs).codeql.ymlruns Python security scanning on push/PR to main and weekly (Monday 06:00 UTC). Usesgithub/codeql-actionv3.dependency-review.ymlruns on PRs to main. Audits new dependencies and comments a summary in the PR. Fails onhighseverity vulnerabilities.label-sync.ymlruns on PR open/sync. Labels PRs based on changed paths:standards/-> standards,scaffold/-> scaffold,docs/-> documentation,registry.json-> registry,.github/-> ci.
- No hardcoded credentials anywhere
- No em dashes or en dashes -- use hyphens or rewrite
registry.jsonmust be valid JSON at all times -- CI enforces this- The catalog site uses no external CDN dependencies -- everything is self-contained
- Standards docs are written for public readership -- no internal references or private repo mentions
- Conventional commits are required (
feat:,fix:,chore:,docs:) - Single branch:
mainonly
This repo has one Python dependency: Jinja2 (in requirements.txt). The docs site has zero dependencies -- vanilla HTML, CSS, and JavaScript.
CC-BY-NC-ND-4.0. All contributions fall under this license.