Skip to content

feat(teams): comprehensive team management — role hierarchy, OIDC sync, admin UI team scoping #7233

feat(teams): comprehensive team management — role hierarchy, OIDC sync, admin UI team scoping

feat(teams): comprehensive team management — role hierarchy, OIDC sync, admin UI team scoping #7233

Workflow file for this run

# ===============================================================
# 🕸️ Web Lint & Static Analysis - Frontend Code Quality Gate
# ===============================================================
# Authors: Mihai Criveti
# - runs each web linter in its own matrix job for visibility
# - mirrors the actual CLI commands used locally (no `make`)
# - ensures fast-failure isolation: one failure doesn't hide others
# - installs tools per-job without package.json
# - logs are grouped and plain-text for readability
# ---------------------------------------------------------------
name: Web Lint & Static Analysis
on:
push:
branches: ["main"]
paths:
- "mcpgateway/static/**"
- "mcpgateway/templates/**"
- ".github/workflows/lint-web.yml"
pull_request:
types: [opened, synchronize, ready_for_review]
branches: ["main"]
paths:
- "mcpgateway/static/**"
- "mcpgateway/templates/**"
- ".github/workflows/lint-web.yml"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
jobs:
lint-web:
if: github.event_name != 'pull_request' || !github.event.pull_request.draft
strategy:
fail-fast: false
matrix:
include:
# -------------------------------------------------------
# 🧼 HTML/CSS/JS Linters & Validators
# -------------------------------------------------------
- id: htmlhint
cmd: |
npm install --no-save --legacy-peer-deps htmlhint
npx htmlhint "mcpgateway/templates/*.html"
- id: stylelint
cmd: |
npm install --no-save --legacy-peer-deps stylelint stylelint-config-standard @stylistic/stylelint-config stylelint-order
npx stylelint "mcpgateway/static/*.css"
- id: eslint
cmd: |
npm install --no-save eslint neostandard eslint-config-prettier eslint-plugin-prettier prettier
npx eslint "mcpgateway/static/*.js"
# -------------------------------------------------------
# 🔒 Security Scanners
# -------------------------------------------------------
- id: retire
cmd: |
npm install --no-save --legacy-peer-deps retire
npx retire --path mcpgateway/static
- id: npm-audit
cmd: |
if [ ! -f package.json ]; then
npm init -y >/dev/null
fi
npm audit --audit-level=high || true
# -------------------------------------------------------
# 🔍 Additional Code Quality Tools
# -------------------------------------------------------
- id: jshint
cmd: |
npm install --no-save --legacy-peer-deps jshint
if [ -f .jshintrc ]; then
npx jshint --config .jshintrc "mcpgateway/static/*.js"
else
npx jshint --esversion=11 "mcpgateway/static/*.js"
fi
- id: jscpd
cmd: |
npm install --no-save --legacy-peer-deps jscpd
npx jscpd "mcpgateway/static/" "mcpgateway/templates/"
# - id: markuplint
# cmd: |
# npm install --no-save --legacy-peer-deps markuplint
# npx markuplint mcpgateway/templates/*
name: ${{ matrix.id }}
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
# -----------------------------------------------------------
# 0️⃣ Checkout
# -----------------------------------------------------------
- name: ⬇️ Checkout source
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
fetch-depth: 1
# -----------------------------------------------------------
# 1️⃣ Node.js Setup
# -----------------------------------------------------------
- name: 📦 Install Node.js 20
run: |
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key \
| sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" \
| sudo tee /etc/apt/sources.list.d/nodesource.list > /dev/null
sudo apt-get update
sudo apt-get install -y nodejs
node --version
npm --version
# -----------------------------------------------------------
# 🔧 Configure npm
# -----------------------------------------------------------
- name: 🔧 Upgrade npm to minimum required version
run: sudo npm install -g npm@^11.10.0
- name: 🔧 Configure npm registry
run: npm config set registry https://registry.npmjs.org/
# -----------------------------------------------------------
# 2️⃣ Run Linter (install and execute in one step)
# -----------------------------------------------------------
- name: 🔍 Run ${{ matrix.id }}
run: ${{ matrix.cmd }}
# -------------------------------------------------------
# 🐍 Python-based JS Security Scanner (separate job)
# -------------------------------------------------------
nodejsscan:
if: github.event_name != 'pull_request' || !github.event.pull_request.draft
name: nodejsscan
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
# -----------------------------------------------------------
# 0️⃣ Checkout
# -----------------------------------------------------------
- name: ⬇️ Checkout source
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
with:
persist-credentials: false
fetch-depth: 1
# -----------------------------------------------------------
# 1️⃣ Python Setup
# -----------------------------------------------------------
- name: 🐍 Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: "3.12"
cache: pip
# -----------------------------------------------------------
# 2️⃣ Install nodejsscan
# -----------------------------------------------------------
- name: 🔧 Install nodejsscan
run: |
python3 -m pip install --upgrade pip
pip install nodejsscan
# -----------------------------------------------------------
# 3️⃣ Run nodejsscan
# -----------------------------------------------------------
- name: 🔒 Run nodejsscan
run: |
nodejsscan --directory ./mcpgateway/static