feat: sync UX + statusline/RVF root-cause fixes, full-codebase hardening, docs audit #79
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 | |
| - 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 | |
| APPDATA: ${{ runner.temp }}\kit-home\AppData\Roaming | |
| run: | | |
| mkdir -p "$HOME" | |
| 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 |