Skip to content

feat: GSD Go-native — replaces 8 npm GSD skills + absorb skill-code-p… #383

feat: GSD Go-native — replaces 8 npm GSD skills + absorb skill-code-p…

feat: GSD Go-native — replaces 8 npm GSD skills + absorb skill-code-p… #383

# 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