.claude/skills/ci-organization/SKILL.md
CI organization principles and workflow structure for this project. Use whenever modifying, adding, or reviewing GitHub Actions workflows — including adding jobs, changing job order, updating action versions, modifying cache keys, adding build targets, or debugging CI failures.
npx skillsauth add cedricziel/assistant ci-organizationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
| File | Trigger | Purpose |
| -------------------------------------- | ------------------- | ------------------------------------------------------------------------ |
| .github/workflows/ci.yml | push/PR to main | Check, test, lint, format, visual regression, integration smoke |
| .github/workflows/docker.yml | workflow_dispatch | Manual Docker build from source (dev/tag builds) |
| .github/workflows/release-please.yml | push to main | Release automation → binary matrix → Docker → OS packages → package repo |
ci.yml)Jobs run in parallel. Order of gates (fast → slow):
cargo fmt --all -- --check. No apt deps, no cache needed. Fails fastest.cargo check --workspace --all-features. Requires protobuf-compiler ffmpeg.cargo clippy --workspace -- -D warnings + separate signal feature clippy.cargo test --workspace.subosito/flutter-action@v2) and flutter pub get before the cargo build step. continue-on-error: true.continue-on-error: true, timeout-minutes: 45.key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: ${{ runner.os }}-cargo-
Always hash **/Cargo.lock. Cross-compile jobs add the target to the key prefix:
${{ runner.os }}-${{ matrix.target }}-cargo-.
sudo apt-get update -y && sudo apt-get install -y protobuf-compiler ffmpeg
protobuf-compiler is required for --all-features (signal feature uses protobuf). ffmpeg is needed for transcription. macOS uses brew install protobuf.
- name: cargo clippy (signal feature)
run: cargo clippy -p assistant-interface-signal --features signal -- -D warnings
Always include this step in the lint job — the signal feature is not covered by --workspace.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
visual-regression and integration use continue-on-error: true — they are informational and depend on external services (Ollama, Playwright). Do not make them blocking.
Every job that produces output files must upload them as artifacts using actions/upload-artifact@v7. This applies to:
.deb, .rpm, .apk)Use if: always() for reports so they're available even on failure:
- name: Upload test report
if: always()
uses: actions/upload-artifact@v7
with:
name: my-report
path: path/to/report/
retention-days: 14
For binaries passed between jobs (e.g. build → docker), use retention-days: 1 since they are transient.
All non-cleanup jobs guard with:
if: github.event.action != 'closed'
release-please.yml)Job dependency chain:
release-please → build-binaries (matrix, 6 targets) → build-docker → build-packages → publish-repo
cross for cross-compilation targets.build-binaries — does not rebuild from source. Multi-arch (amd64 + arm64), Alpine image via docker/Dockerfile.assistant-alpine..deb, .rpm, .apk via nfpm.gh-pages to keep APT/YUM/APK indices small.Always use these versions when adding new steps:
| Action | Version |
| ---------------------------- | --------- |
| actions/checkout | @v6 |
| actions/cache | @v5 |
| actions/upload-artifact | @v7 |
| actions/download-artifact | @v8 |
| actions/setup-node | @v6 |
| actions/github-script | @v8 |
| dtolnay/rust-toolchain | @stable |
| docker/build-push-action | @v7 |
| docker/login-action | @v4 |
| docker/metadata-action | @v6 |
| docker/setup-buildx-action | @v4 |
| docker/setup-qemu-action | @v4 |
tools
Enforces OpenAPI spec discipline when working on REST API endpoints in this project. Triggers whenever adding, modifying, or removing HTTP routes, request/response types, or API handlers in the Rust web-ui crate (`crates/web-ui`). Reminds the agent to (1) update the committed `openapi.json` spec, (2) run `make dump-openapi` to re-export the spec from the running server, and (3) run `make generate-flutter-client` to regenerate the Dart/dio client in `app/packages/assistant_api/`. Also applies when changing route parameters, status codes, or authentication on existing endpoints.
tools
Browser automation via @playwright/mcp (Microsoft). Use this when the user wants to navigate websites, fill forms, take screenshots, scrape web content, test web apps, or run any multi-step browser workflow. Requires no display (headless mode supported).
testing
A minimal example WASM skill that returns a greeting. Use to verify that the WASM execution tier is working correctly.
development
Run coding agents (Claude Code, Codex, OpenCode, or others) as background processes for programmatic control. Use when you need non-blocking execution, parallel agents, PR reviews, or long-running coding tasks. Prefer this over direct bash for any task that takes more than ~20 seconds.