diff --git a/.cursorrules b/.cursorrules index e625490..ff1eff3 100644 --- a/.cursorrules +++ b/.cursorrules @@ -3,7 +3,7 @@ You are working on Developer Tools Directory, a meta-repository that catalogs, s ## Repo structure - `registry.json` -- single source of truth for all 9 tool repos (name, type, counts, links, status) -- `standards/` -- 9 Markdown docs defining conventions (folder structure, CI/CD, manifests, pages, commits, README, AGENTS.md, versioning) +- `standards/` -- 18 Markdown docs defining conventions (folder structure, CI/CD, manifests, pages, commits, README, AGENTS.md, versioning, and more) - `scaffold/create-tool.py` -- Python repo generator using Jinja2 templates - `scaffold/templates/` -- Jinja2 templates producing a standards-compliant repo - `site-template/` -- shared GitHub Pages build system for tool repos (build_site.py + template.html.j2 + fonts) @@ -33,7 +33,8 @@ Use conventional commits. Prefix determines changelog category: ## When editing registry.json -- Every entry needs all required fields: name, repo, slug, description, type, homepage, skills, rules, mcpTools, extras, topics, status, version, language, license, pagesType, hasCI. +- Every entry needs all required fields: name, repo, slug, description, type, homepage, skills, rules, mcpTools, extras, topics, status, language, license, pagesType, hasCI. +- Do not add a per-tool `version` field. It was removed because tool repos auto-bump patch on every content merge, so a catalog-pinned version re-stales on each tool's next content PR. The catalog tracks tools by repo and homepage, not by patch version. - `type` must be `cursor-plugin` or `mcp-server`. - `skills`, `rules`, `mcpTools` must be integers. - After editing registry.json, also update: diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index c52d69c..b153b1c 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - uses: actions/dependency-review-action@v4 + - uses: actions/dependency-review-action@v5 with: fail-on-severity: high comment-summary-in-pr: always diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 44ca4cc..e87eb64 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -39,7 +39,6 @@ jobs: "extras": dict, "topics": list, "status": str, - "version": str, "language": str, "license": str, "pagesType": str, @@ -92,7 +91,7 @@ jobs: steps: - uses: actions/checkout@v6 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.12" @@ -153,17 +152,27 @@ jobs: - name: Scaffold regression checks for DTD#41 patterns run: | + # Meta action pins are DERIVED from the meta VERSION at generation + # time, so assert against the derived train rather than a hardcoded + # literal (which would itself go stale on the next meta release). + VERSION=$(cat VERSION) + IFS='.' read -r META_MAJOR META_MINOR META_PATCH <<< "$VERSION" + # validate-counts job present grep -q 'validate-counts' /tmp/scaffold-test/ci-test-plugin/.github/workflows/validate.yml \ || { echo "::error::validate.yml missing validate-counts job"; exit 1; } - # drift-check pinned to @v1.9 - grep -q 'drift-check@v1.9' /tmp/scaffold-test/ci-test-plugin/.github/workflows/drift-check.yml \ - || { echo "::error::drift-check.yml not pinned to @v1.9"; exit 1; } + # drift-check pinned to @vMAJOR.MINOR (derived from meta VERSION) + grep -q "drift-check@v${META_MAJOR}.${META_MINOR}" /tmp/scaffold-test/ci-test-plugin/.github/workflows/drift-check.yml \ + || { echo "::error::drift-check.yml not pinned to derived @v${META_MAJOR}.${META_MINOR}"; exit 1; } + + # release.yml consumes release-doc-sync@vMAJOR (derived from meta VERSION) + grep -q "release-doc-sync@v${META_MAJOR}" /tmp/scaffold-test/ci-test-plugin/.github/workflows/release.yml \ + || { echo "::error::release.yml does not consume derived release-doc-sync@v${META_MAJOR}"; exit 1; } - # release.yml consumes release-doc-sync@v1 - grep -q 'release-doc-sync@v1' /tmp/scaffold-test/ci-test-plugin/.github/workflows/release.yml \ - || { echo "::error::release.yml does not consume release-doc-sync@v1"; exit 1; } + # release.yml pins release-doc-sync meta-repo-ref to the full meta release tag + grep -q "meta-repo-ref: v${META_MAJOR}.${META_MINOR}.${META_PATCH}" /tmp/scaffold-test/ci-test-plugin/.github/workflows/release.yml \ + || { echo "::error::release.yml meta-repo-ref not pinned to derived v${META_MAJOR}.${META_MINOR}.${META_PATCH}"; exit 1; } # release.yml has the initial-release version-handling branch grep -q 'Initial release' /tmp/scaffold-test/ci-test-plugin/.github/workflows/release.yml \ @@ -195,9 +204,12 @@ jobs: grep -q ' -**Totals:** 177 skills, 71 rules, 371 MCP tools across 9 repos +**Totals:** 189 skills, 77 rules, 378 MCP tools across 11 repos ## Development Workflow @@ -164,3 +169,66 @@ Open `docs/index.html` in a browser. The script falls back to embedded registry | Jinja2 >=3.1,<4.0 | Scaffold template rendering | `requirements.txt` | The docs site has zero runtime dependencies. The sync script is pure stdlib. + +# context-mode — MANDATORY routing rules + +You have context-mode MCP tools available. These rules are NOT optional — they protect your context window from flooding. A single unrouted command can dump 56 KB into context and waste the entire session. + +## BLOCKED commands — do NOT attempt these + +### curl / wget — BLOCKED +Any Bash command containing `curl` or `wget` is intercepted and replaced with an error message. Do NOT retry. +Instead use: +- `ctx_fetch_and_index(url, source)` to fetch and index web pages +- `ctx_execute(language: "javascript", code: "const r = await fetch(...)")` to run HTTP calls in sandbox + +### Inline HTTP — BLOCKED +Any Bash command containing `fetch('http`, `requests.get(`, `requests.post(`, `http.get(`, or `http.request(` is intercepted and replaced with an error message. Do NOT retry with Bash. +Instead use: +- `ctx_execute(language, code)` to run HTTP calls in sandbox — only stdout enters context + +### WebFetch — BLOCKED +WebFetch calls are denied entirely. The URL is extracted and you are told to use `ctx_fetch_and_index` instead. +Instead use: +- `ctx_fetch_and_index(url, source)` then `ctx_search(queries)` to query the indexed content + +## REDIRECTED tools — use sandbox equivalents + +### Bash (>20 lines output) +Bash is ONLY for: `git`, `mkdir`, `rm`, `mv`, `cd`, `ls`, `npm install`, `pip install`, and other short-output commands. +For everything else, use: +- `ctx_batch_execute(commands, queries)` — run multiple commands + search in ONE call +- `ctx_execute(language: "shell", code: "...")` — run in sandbox, only stdout enters context + +### Read (for analysis) +If you are reading a file to **Edit** it → Read is correct (Edit needs content in context). +If you are reading to **analyze, explore, or summarize** → use `ctx_execute_file(path, language, code)` instead. Only your printed summary enters context. The raw file content stays in the sandbox. + +### Grep (large results) +Grep results can flood context. Use `ctx_execute(language: "shell", code: "grep ...")` to run searches in sandbox. Only your printed summary enters context. + +## Tool selection hierarchy + +1. **GATHER**: `ctx_batch_execute(commands, queries)` — Primary tool. Runs all commands, auto-indexes output, returns search results. ONE call replaces 30+ individual calls. +2. **FOLLOW-UP**: `ctx_search(queries: ["q1", "q2", ...])` — Query indexed content. Pass ALL questions as array in ONE call. +3. **PROCESSING**: `ctx_execute(language, code)` | `ctx_execute_file(path, language, code)` — Sandbox execution. Only stdout enters context. +4. **WEB**: `ctx_fetch_and_index(url, source)` then `ctx_search(queries)` — Fetch, chunk, index, query. Raw HTML never enters context. +5. **INDEX**: `ctx_index(content, source)` — Store content in FTS5 knowledge base for later search. + +## Subagent routing + +When spawning subagents (Agent/Task tool), the routing block is automatically injected into their prompt. Bash-type subagents are upgraded to general-purpose so they have access to MCP tools. You do NOT need to manually instruct subagents about context-mode. + +## Output constraints + +- Keep responses under 500 words. +- Write artifacts (code, configs, PRDs) to FILES — never return them as inline text. Return only: file path + 1-line description. +- When indexing content, use descriptive source labels so others can `ctx_search(source: "label")` later. + +## ctx commands + +| Command | Action | +|---------|--------| +| `ctx stats` | Call the `ctx_stats` MCP tool and display the full output verbatim | +| `ctx doctor` | Call the `ctx_doctor` MCP tool, run the returned shell command, display as checklist | +| `ctx upgrade` | Call the `ctx_upgrade` MCP tool, run the returned shell command, display as checklist | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f66a118..855564f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,7 +24,7 @@ Thank you for your interest in contributing. This guide covers everything you ne ``` Developer-Tools-Directory/ registry.json # Tool catalog (source of truth) - standards/ # Convention documentation (9 docs) + standards/ # Convention documentation (18 docs) scaffold/ create-tool.py # Repo generator script templates/ # Jinja2 templates for new repos diff --git a/README.md b/README.md index 93c56ba..60f370d 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@
- 9 repos • 177 skills • 71 rules • 371 MCP tools + 11 repos • 189 skills • 77 rules • 378 MCP tools
@@ -62,6 +62,9 @@ flowchart LR | **Monday Cursor Plugin** | Plugin | 21 | 8 | 45 | [](https://github.com/TMHSDigital/Monday-Cursor-Plugin) [](https://tmhsdigital.github.io/Monday-Cursor-Plugin/) | | **Steam Cursor Plugin** | Plugin | 30 | 9 | 25 | [](https://github.com/TMHSDigital/Steam-Cursor-Plugin) [](https://tmhsdigital.github.io/Steam-Cursor-Plugin/) | | **Steam MCP Server** | MCP Server | - | - | 25 | [](https://github.com/TMHSDigital/steam-mcp) [](https://www.npmjs.com/package/@tmhs/steam-mcp) | +| **Developer Tools MCP** | MCP Server | - | - | 7 | [](https://github.com/TMHSDigital/Developer-Tools-MCP) [](https://tmhsdigital.github.io/Developer-Tools-MCP/) | +| **CFX MCP** | MCP Server | - | - | 0 | [](https://github.com/TMHSDigital/cfx-mcp) | +| **Blender Developer Tools** | Plugin | 12 | 6 | 0 | [](https://github.com/TMHSDigital/Blender-Developer-Tools) |GitHub Actions workflows every repo must have
Documentation site setup and deployment
Conventional commits and version bumping rules
-Semver management and automated release flow
Standard README structure and required sections
AI agent guidance file structure
+Semver management and automated release flow
+Composite action contract for keeping CHANGELOG, CLAUDE, and ROADMAP in sync after a release
+Test frameworks, minimum coverage bar, and CI wiring
+SKILL.md structure and frontmatter conventions
+.mdc structure, globs, and the secrets rule pattern
+Tool naming, runtime, transport, and destructive operation handling
+Vulnerability disclosure, secrets handling, and workflow supply chain
+DCO + inbound license grant model
+What belongs in the directory and what does not
+Tool status transitions from experimental to archived
+Prose conventions across all repos