feat(opencode): add compact connected ruv gateway #349
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
| name: ci | |
| on: | |
| push: | |
| branches: [main, npm-kit] | |
| pull_request: | |
| workflow_dispatch: | |
| jobs: | |
| test: | |
| name: test (${{ matrix.os }}, node ${{ matrix.node }}) | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| node: [22, 24, 26] | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - uses: pnpm/action-setup@v6 # version comes from package.json packageManager | |
| - uses: actions/setup-node@v7 | |
| with: | |
| node-version: ${{ matrix.node }} | |
| # Zero runtime dependencies — no install step by design. | |
| - name: Unit + statusline tests | |
| run: pnpm test | |
| # Explicit guard: every dispatchable command must ship a --help/Examples | |
| # surface. Fails the build if a new command lands without one. | |
| - name: Dispatch surface (help/Examples for every command) | |
| run: pnpm run test:surface | |
| - name: CLI smoke (sandboxed HOME) | |
| shell: bash | |
| env: | |
| # Isolate every home-relative write (kit.json, CLAUDE.md, settings). | |
| HOME: ${{ runner.temp }}/kit-home | |
| USERPROFILE: ${{ runner.temp }}\kit-home | |
| XDG_CONFIG_HOME: ${{ runner.temp }}/kit-home/.config | |
| APPDATA: ${{ runner.temp }}\kit-home\AppData\Roaming | |
| run: | | |
| mkdir -p "$HOME" | |
| # The smoke test proves local CLI behavior, not npm reachability. | |
| # Seed a fresh empty drift cache so an offline Windows runner does | |
| # not pay four sequential 20s `npm view` timeouts inside status. | |
| node -e 'const fs=require("node:fs"),p=require("node:path"),base=process.platform==="win32"?process.env.APPDATA:process.env.XDG_CONFIG_HOME,dir=p.join(base,"agentic-kit"),last=Date.now();fs.mkdirSync(dir,{recursive:true});fs.writeFileSync(p.join(dir,"kit.json"),JSON.stringify({versionCheck:{last,seen:{},self:{last,best:null}}}))' | |
| node bin/agentic-kit.mjs --version | |
| node bin/agentic-kit.mjs --help --all > /dev/null | |
| # status must emit valid JSON and exit deterministically even on a | |
| # machine with no ruflo installed (rows degrade to warn/fail). | |
| node bin/agentic-kit.mjs status --json > status.json || true | |
| node -e "const s=require('./status.json'); if(!Array.isArray(s.rows)||!s.overall) throw new Error('bad status JSON'); console.log('status rows:', s.rows.length, 'overall:', s.overall)" | |
| # managed-block engine round-trip against the sandbox HOME | |
| node bin/agentic-kit.mjs x reference sync | |
| node -e "const fs=require('fs'),os=require('os'),p=require('path').join(os.homedir(),'.claude','CLAUDE.md'); const t=fs.readFileSync(p,'utf8'); for (const s of ['ruflo-preamble','ruflo-reference']) if(!t.includes('<!-- BEGIN '+s+' -->')) throw new Error('missing block '+s); console.log('blocks OK')" | |
| node bin/agentic-kit.mjs uninstall --dry-run | |
| # Static quality gates. Platform-independent → single OS. This is the only job | |
| # that installs devDependencies (the published package stays zero-runtime-dep). | |
| quality: | |
| name: quality (typecheck, lint, build, audit) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - uses: pnpm/action-setup@v6 | |
| - uses: actions/setup-node@v7 | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| - name: Install devDependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Typecheck (tsc --checkJs) | |
| run: pnpm run typecheck | |
| - name: Lint (eslint) | |
| run: pnpm run lint | |
| - name: Markdown lint | |
| run: pnpm run lint:md | |
| - name: Build (packaging + load validation) | |
| run: pnpm run build | |
| - name: Dependency audit | |
| run: pnpm run audit | |
| # Internal/relative links only (fast, deterministic). External links run in | |
| # nightly — network + rate-limits make them flaky per-PR. | |
| links: | |
| name: links (internal) | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v7 | |
| - name: Check internal links (offline) | |
| uses: lycheeverse/lychee-action@v2 | |
| with: | |
| args: "--offline --config lychee.toml README.md CLAUDE.md 'docs/**/*.md'" | |
| fail: true |