From 2345065c9adafaa41971f62f4c6ab9414584f734 Mon Sep 17 00:00:00 2001 From: fOuttaMyPaint <154358121+TMHSDigital@users.noreply.github.com> Date: Sun, 16 Aug 2026 15:43:59 -0400 Subject: [PATCH 1/2] feat: add deployed-service archetype for mcp-servers without npm Declare the exemption in .drift-check.json so publish.yml and the catalog npm field are optional only when explicit, not inferred. Signed-off-by: fOuttaMyPaint <154358121+TMHSDigital@users.noreply.github.com> Co-authored-by: Cursor --- .github/workflows/validate.yml | 31 +++++- README.md | 6 +- STANDARDS_VERSION | 2 +- VERSION | 2 +- docs/index.html | 6 +- docs/search-index.json | 2 +- registry.json | 12 ++- scaffold/create-tool.py | 10 ++ scaffold/generator.py | 26 ++++- scaffold/templates/README.md.j2 | 4 + scaffold/templates/package.json.j2 | 11 +- scaffold/templates/release.mcp.yml.j2 | 15 ++- scaffold/templates/site.json.j2 | 6 ++ scripts/drift_check/checks/__init__.py | 2 +- .../drift_check/checks/required_workflows.py | 70 ++++++++++-- scripts/drift_check/snapshot.py | 41 ++++++- scripts/drift_check/types.py | 5 + standards/born-green-contract.md | 2 +- standards/ci-cd.md | 3 +- standards/mcp-server.md | 19 ++++ tests/test_archetype.py | 100 ++++++++++++++++++ tests/test_required_workflows.py | 55 +++++++++- tests/test_scaffold_born_green.py | 43 +++++++- 23 files changed, 437 insertions(+), 36 deletions(-) create mode 100644 tests/test_archetype.py diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 268bad4..f0656a4 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -44,10 +44,11 @@ jobs: "pagesType": str, "hasCI": bool, } - OPTIONAL = {"npm": str} + OPTIONAL = {"npm": str, "archetype": str} VALID_TYPES = {"cursor-plugin", "mcp-server"} VALID_STATUS = {"experimental", "beta", "active", "maintenance", "deprecated", "archived"} VALID_PAGES = {"static", "mkdocs", "none"} + VALID_ARCHETYPES = {"deployed-service"} errors = [] for i, tool in enumerate(data): label = "Entry %d (%s)" % (i, tool.get("name", "?")) @@ -69,6 +70,19 @@ jobs: pass elif not all(isinstance(t, str) for t in tool.get("topics", [])): errors.append("%s: topics must be array of strings" % label) + archetype = tool.get("archetype") + if "archetype" in tool: + if archetype not in VALID_ARCHETYPES: + errors.append("%s: archetype must be one of %s" % (label, VALID_ARCHETYPES)) + if tool.get("type") != "mcp-server": + errors.append("%s: archetype is only valid for mcp-server entries" % label) + if tool.get("type") == "mcp-server": + npm = tool.get("npm") + if archetype == "deployed-service": + if "npm" in tool: + errors.append("%s: deployed-service must omit npm" % label) + elif not (isinstance(npm, str) and npm.strip()): + errors.append("%s: mcp-server entries must have a non-empty npm field" % label) if errors: for e in errors: print("::error::" + e, file=sys.stderr) @@ -128,6 +142,21 @@ jobs: test -f /tmp/scaffold-test/ci-test-plugin/mcp-server/server.py echo "Scaffold test passed" + python3 scaffold/create-tool.py \ + --name "CI Deployed Service" \ + --description "Automated deployed-service test" \ + --type mcp-server \ + --deployed-service \ + --no-register \ + --output /tmp/scaffold-service + + test -f /tmp/scaffold-service/ci-deployed-service/.drift-check.json + test ! -f /tmp/scaffold-service/ci-deployed-service/.github/workflows/publish.yml + test -f /tmp/scaffold-service/ci-deployed-service/.github/workflows/release.yml + grep -q '"private": true' /tmp/scaffold-service/ci-deployed-service/package.json + grep -qv 'gh workflow run publish.yml' /tmp/scaffold-service/ci-deployed-service/.github/workflows/release.yml + echo "Deployed-service scaffold test passed" + - name: Scaffold YAML well-formed run: | # Catches Jinja2 trim_blocks bugs that collapse adjacent expression lines. diff --git a/README.md b/README.md index bbe591b..8c8a2f7 100644 --- a/README.md +++ b/README.md @@ -62,11 +62,11 @@ flowchart LR | **Monday Cursor Plugin** | Plugin | 21 | 8 | 45 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/Monday-Cursor-Plugin) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/Monday-Cursor-Plugin/) | | **Steam Cursor Plugin** | Plugin | 30 | 9 | 25 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/Steam-Cursor-Plugin) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/Steam-Cursor-Plugin/) | | **Steam MCP Server** | MCP Server | - | - | 25 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/steam-mcp) [![npm](https://img.shields.io/badge/npm-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/@tmhs/steam-mcp) | -| **Developer Tools MCP** | MCP Server | - | - | 7 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/Developer-Tools-MCP) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/Developer-Tools-MCP/) | -| **CFX MCP** | MCP Server | - | - | 0 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/cfx-mcp) | +| **Developer Tools MCP** | MCP Server | - | - | 7 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/Developer-Tools-MCP) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/Developer-Tools-MCP/) [![npm](https://img.shields.io/badge/npm-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/@tmhs/devtools-mcp) | +| **CFX MCP** | MCP Server | - | - | 0 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/cfx-mcp) [![npm](https://img.shields.io/badge/npm-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/@tmhsdigital/cfx-mcp) | | **Blender Developer Tools** | Plugin | 12 | 6 | 0 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/Blender-Developer-Tools) | | **Local AI MCP** | MCP Server | - | - | 16 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/local-ai-mcp) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/local-ai-mcp/) [![npm](https://img.shields.io/badge/npm-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/@tmhs/local-ai-mcp) | -| **Screencast MCP** | MCP Server | - | - | 25 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/screencast-mcp) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/screencast-mcp/) | +| **Screencast MCP** | MCP Server | - | - | 25 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/screencast-mcp) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/screencast-mcp/) [![npm](https://img.shields.io/badge/npm-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/@tmhs/screencast-mcp) | | **Tailscale MCP** | MCP Server | - | - | 6 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/tailscale-mcp) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/tailscale-mcp/) [![npm](https://img.shields.io/badge/npm-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/@tmhs/tailscale-mcp) | | **Godot Correctness MCP** | MCP Server | - | - | 10 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/godot-correctness-mcp) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/godot-correctness-mcp/) [![npm](https://img.shields.io/badge/npm-cb3837?logo=npm&logoColor=white)](https://www.npmjs.com/package/@tmhs/godot-correctness-mcp) | | **Bounty Radar MCP** | MCP Server | - | - | 1 | [![Repo](https://img.shields.io/badge/repo-blue?logo=github)](https://github.com/TMHSDigital/bounty-radar-mcp) [![Docs](https://img.shields.io/badge/docs-7c3aed)](https://tmhsdigital.github.io/bounty-radar-mcp/) | diff --git a/STANDARDS_VERSION b/STANDARDS_VERSION index 81c871d..1cac385 100644 --- a/STANDARDS_VERSION +++ b/STANDARDS_VERSION @@ -1 +1 @@ -1.10.0 +1.11.0 diff --git a/VERSION b/VERSION index 84cc529..815d5ca 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.18.0 +1.19.0 diff --git a/docs/index.html b/docs/index.html index f833cd8..f46b327 100644 --- a/docs/index.html +++ b/docs/index.html @@ -345,7 +345,7 @@

Scaffold Generator