ci(antipattern): broaden TS allowlist (cli, mod.ts, lsp-server, *vscode*, deno-*) #10
Workflow file for this run
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: PMPL-1.0 | |
| # RSR Anti-Pattern CI Check | |
| # | |
| # Enforces: No TypeScript, No ReScript, No Go, No Python (except SaltStack), No npm | |
| # Allows: AffineScript, Deno, WASM, Rust, OCaml, Haskell, Guile/Scheme | |
| name: RSR Anti-Pattern Check | |
| on: | |
| push: | |
| branches: [main, master, develop] | |
| pull_request: | |
| branches: [main, master, develop] | |
| permissions: | |
| contents: read | |
| jobs: | |
| antipattern-check: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| steps: | |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| - name: Check for TypeScript | |
| run: | | |
| # Allowlist (TS legitimate as a bridge/adapter to a non-ReScript ecosystem): | |
| # bindings/ - language bindings (Deno/TS/AssemblyScript FFI) | |
| # *.d.ts - TypeScript type declarations for ReScript FFI | |
| # tests/, test/ - Deno test runners | |
| # scripts/ - Deno build scripts | |
| # mcp-adapter/ - MCP server adapters (MCP is Deno/TS-typed by spec) | |
| # *vscode* - VSCode extensions (TS is the ecosystem default) | |
| # cli/ - CLI entry points (Deno scripts) | |
| # mod.ts - canonical Deno module entrypoint | |
| # *lsp-server.ts, *lsp.ts - Language Server Protocol implementations | |
| # deno-*/ - subprojects explicitly named for Deno | |
| TS_FILES=$(find . \( -name "*.ts" -o -name "*.tsx" \) \ | |
| | grep -v node_modules \ | |
| | grep -v '/bindings/' \ | |
| | grep -v '\.d\.ts$' \ | |
| | grep -v '/tests/' \ | |
| | grep -v '/test/' \ | |
| | grep -v '/scripts/' \ | |
| | grep -v '/mcp-adapter/' \ | |
| | grep -Ev '/[^/]*vscode[^/]*/' \ | |
| | grep -v '/cli/' \ | |
| | grep -v '/mod\.ts$' \ | |
| | grep -Ev 'lsp[-_]?server\.ts$' \ | |
| | grep -Ev '[/-]lsp\.ts$' \ | |
| | grep -Ev '/deno-[^/]+/' \ | |
| || true) | |
| if [ -n "$TS_FILES" ]; then | |
| echo "❌ TypeScript files detected - use ReScript instead" | |
| echo "$TS_FILES" | |
| exit 1 | |
| fi | |
| echo "✅ No TypeScript files outside allowlisted bridge/adapter paths" | |
| - name: Check for ReScript | |
| run: | | |
| # Estate policy: RS/TS/JS -> AffineScript -> typed-wasm. ReScript (.res) | |
| # is no longer used as the TS replacement; new code uses .affine instead. | |
| RES_FILES=$(find . -name "*.res" | grep -v node_modules || true) | |
| if [ -n "$RES_FILES" ]; then | |
| echo "❌ ReScript files detected - use AffineScript instead" | |
| echo "$RES_FILES" | |
| exit 1 | |
| fi | |
| echo "✅ No ReScript files" | |
| - name: Check for Go | |
| run: | | |
| if find . -name "*.go" | grep -q .; then | |
| echo "❌ Go files detected - use Rust/WASM instead" | |
| find . -name "*.go" | |
| exit 1 | |
| fi | |
| echo "✅ No Go files" | |
| - name: Check for Python (non-SaltStack) | |
| run: | | |
| PY_FILES=$(find . -name "*.py" | grep -v salt | grep -v _states | grep -v _modules | grep -v pillar | grep -v venv | grep -v __pycache__ || true) | |
| if [ -n "$PY_FILES" ]; then | |
| echo "❌ Python files detected - only allowed for SaltStack" | |
| echo "$PY_FILES" | |
| exit 1 | |
| fi | |
| echo "✅ No non-SaltStack Python files" | |
| - name: Check for npm lockfiles | |
| run: | | |
| if [ -f "package-lock.json" ] || [ -f "yarn.lock" ]; then | |
| echo "❌ npm/yarn lockfile detected - use Deno instead" | |
| exit 1 | |
| fi | |
| echo "✅ No npm lockfiles" | |
| - name: Check for tsconfig | |
| run: | | |
| if [ -f "tsconfig.json" ]; then | |
| echo "❌ tsconfig.json detected - use AffineScript instead" | |
| exit 1 | |
| fi | |
| echo "✅ No tsconfig.json" | |
| - name: Check for rescript.json | |
| run: | | |
| if [ -f "rescript.json" ] || [ -f "bsconfig.json" ]; then | |
| echo "❌ rescript.json/bsconfig.json detected - use AffineScript config instead" | |
| exit 1 | |
| fi | |
| echo "✅ No rescript.json/bsconfig.json" | |
| - name: Verify Deno presence (if package.json exists) | |
| run: | | |
| if [ -f "package.json" ]; then | |
| if [ ! -f "deno.json" ] && [ ! -f "deno.jsonc" ]; then | |
| echo "⚠️ Warning: package.json without deno.json - migration recommended" | |
| fi | |
| fi | |
| echo "✅ Deno configuration check complete" | |
| - name: Summary | |
| run: | | |
| echo "╔════════════════════════════════════════════════════════════╗" | |
| echo "║ RSR Anti-Pattern Check Passed ✅ ║" | |
| echo "║ ║" | |
| echo "║ Allowed: AffineScript, Deno, WASM, Rust, OCaml, Haskell, ║" | |
| echo "║ Guile/Scheme, SaltStack (Python) ║" | |
| echo "║ ║" | |
| echo "║ Blocked: TypeScript, ReScript, Go, npm, Python (non-Salt)║" | |
| echo "╚════════════════════════════════════════════════════════════╝" |