feat: GSD Go-native — replaces 8 npm GSD skills + absorb skill-code-p… #383
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # SPDX-License-Identifier: MIT | |
| # Purpose: keep ECOSYSTEM.md, requirements-ecosystem.txt and | |
| # internal/mcpclient/config.go in sync (ECOSYSTEM.md sync rules 2+3). | |
| name: ecosystem-sync | |
| on: | |
| pull_request: | |
| paths: | |
| - "ECOSYSTEM.md" | |
| - "requirements-ecosystem.txt" | |
| - "cmd/sin-code/internal/mcpclient/config.go" | |
| - "cmd/sin-code/internal/permission_defaults.go" | |
| push: | |
| branches: [main] | |
| jobs: | |
| check: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Every registry server has an ECOSYSTEM.md row | |
| run: | | |
| set -e | |
| # Extract short server names from the shortName map and any explicit | |
| # Name: "..." entries in DefaultServers. This avoids false positives | |
| # from quoted strings like "stdio", "serve", or "mcp". | |
| servers=$( (sed -n '/func shortName/,/^}/p' cmd/sin-code/internal/mcpclient/config.go \ | |
| | awk -F'"' '/".*": *".*"/{print $4}' ; \ | |
| grep -oE 'Name: *"[a-z]+"' cmd/sin-code/internal/mcpclient/config.go \ | |
| | sed -E 's/Name: *"([^"]+)"/\1/') \ | |
| | sort -u) | |
| missing=0 | |
| for s in $servers; do | |
| if ! grep -q "\`${s}__\*\`" ECOSYSTEM.md; then | |
| echo "::error::server '$s' in config.go but not in ECOSYSTEM.md" | |
| missing=1 | |
| fi | |
| done | |
| exit $missing | |
| - name: Every registry server has a permission policy | |
| run: | | |
| set -e | |
| servers=$( (sed -n '/func shortName/,/^}/p' cmd/sin-code/internal/mcpclient/config.go \ | |
| | awk -F'"' '/".*": *".*"/{print $4}' ; \ | |
| grep -oE 'Name: *"[a-z]+"' cmd/sin-code/internal/mcpclient/config.go \ | |
| | sed -E 's/Name: *"([^"]+)"/\1/') \ | |
| | sort -u) | |
| missing=0 | |
| for s in $servers; do | |
| if ! grep -q "${s}__\*" cmd/sin-code/internal/permission_defaults.go; then | |
| echo "::error::server '$s' has no rule in permission_defaults.go" | |
| missing=1 | |
| fi | |
| done | |
| exit $missing | |
| - name: Every ACTIVE repo is pinned in requirements-ecosystem.txt | |
| run: | | |
| set -e | |
| # Extract the repo name from the second column, trim spaces, and drop | |
| # parenthetical qualifiers like "SIN-Code (security)" which are built-in | |
| # SIN-Code capabilities, not separate ecosystem repos. | |
| repos=$(grep -E '\| (SIN-|Simone-|coder-|web_search_bundle)' ECOSYSTEM.md \ | |
| | grep 'ACTIVE' | awk -F'|' '{print $2}' | tr -d ' ' \ | |
| | grep -vE '^(SIN-Code|SIN-Code-WebUI-v2)$' \ | |
| | grep -vE '\(.*\)' || true) | |
| missing=0 | |
| for r in $repos; do | |
| if ! grep -q "^${r}==" requirements-ecosystem.txt; then | |
| echo "::error::repo '$r' is ACTIVE in ECOSYSTEM.md but missing from requirements-ecosystem.txt" | |
| missing=1 | |
| fi | |
| done | |
| exit $missing |