name: ci

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:

# 并发收敛：同分支新推取消旧跑（省 runner 分钟，结果只看最新）
concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '24'
        # mock.module 内置模块 named exports 枚举在 node 22 不全（appendFileSync 等缺失实证 38859877373）——统一 24 与本地开发环一致
      - name: lint（check-syntax 全文件）
        run: npm run lint --silent

  test:
    runs-on: ubuntu-latest
    # 全量套件本地实测 10-20 分钟（run-tests 并发 4-12），CI 2 核放 40 分钟裕量
    timeout-minutes: 40
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '24'
        # mock.module 内置模块 named exports 枚举在 node 22 不全（appendFileSync 等缺失实证 38859877373）——统一 24 与本地开发环一致
      # 依赖必须装：测试框架零三方（node:sqlite/test 内置）但被测 CLI 本体 import 7 个
      # 运行时依赖（js-yaml/chalk/@inquirer/prompts 等，src 下 10+ 文件）——CI 首跑
      # （121a33ee）无 install 步实证两 job 全灭（Cannot find package 'js-yaml'）
      - name: install（npm ci 锁定 package-lock）
        run: npm ci --no-audit --no-fund
      - name: 诊断：node/dash 可用性（run-tests 子进程 shell 语义面）
        run: |
          which node
          node -e "0" && echo "sh 直跑 node -e OK"
          /bin/sh -c 'node -e "0"' && echo "sh -c 内嵌引号 OK"
      - name: test（run-tests 并发池 + TEMP/HOME 套件隔离）
        run: npm test --silent

  docs-gate:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '24'
        # mock.module 内置模块 named exports 枚举在 node 22 不全（appendFileSync 等缺失实证 38859877373）——统一 24 与本地开发环一致
      # docs-check.js 同样 import js-yaml——无 install 首跑 7s 即灭（同 test job 根因）
      - name: install（npm ci 锁定 package-lock）
        run: npm ci --no-audit --no-fund
      # ratchet：docs 失效引用数 ≤ 基线（.sillyspec/docs-check-baseline）放行——
      # 与 pre-push 同一门，推 CI 后本地 pre-push 可降级（见 .husky/pre-push 注记）
      - name: docs gate ratchet（--against HEAD）
        run: node bin/sillyspec.js docs gate --against HEAD
