Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 65 additions & 63 deletions .github/workflows/dod.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
# DoD gate — valida Definition of Done em todo PR antes do merge
# Verifica: coverage >= 80%, evidência Playwright presente, conventional commit,
# referência a task no body, ADR linkado se houver mudanças em architecture/
# DoD Gate — validates Definition of Done on every PR before merge.
#
# This repo is a Python CLI (cli/cli.py + pyproject.toml) plus an optional
# Remotion subproject (remotion-tutorial/). Heavy lifting (ruff/mypy/py_compile,
# install.sh smoke, shellcheck, markdown links) is already handled by ci.yml
# and lint.yml — this gate stays meta and only enforces what those don't:
#
# 1. PR title follows Conventional Commits.
# 2. PR body is non-empty.
# 3. Changes under .specs/architecture/ link to an ADR.
# 4. When remotion-tutorial/ changes, the TypeScript composition typechecks.

name: DoD Gate

Expand All @@ -23,82 +31,37 @@ jobs:
dod-check:
name: Definition of Done
runs-on: ubuntu-latest
timeout-minutes: 15
timeout-minutes: 8
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm

- name: Install dependencies
run: npm ci

# Roda testes com coverage para gerar relatório
- name: Run unit tests with coverage
run: npm test -- --coverage

# Bloqueia se coverage < 80%
- name: Check coverage threshold (>=80%)
run: |
set -euo pipefail
if [ ! -f coverage/coverage-summary.json ]; then
echo "::error::coverage/coverage-summary.json não encontrado. Configure o reporter json-summary no test runner."
exit 1
fi
PCT=$(node -e "const c=require('./coverage/coverage-summary.json');console.log(c.total.lines.pct)")
echo "Coverage de linhas: ${PCT}%"
awk -v p="$PCT" 'BEGIN { if (p+0 < 80) { print "::error::Coverage abaixo de 80% (atual: " p "%)"; exit 1 } }'

# Instala browsers e roda Playwright para gerar evidências
- name: Install Playwright browsers
run: npx playwright install --with-deps

- name: Run Playwright tests
run: npx playwright test

# Bloqueia se evidência Playwright (junit ou test-results) não existe
- name: Verify Playwright evidence
run: |
set -euo pipefail
if [ ! -d test-results ] && [ ! -f test-results/results.xml ] && [ ! -f test-results/results.json ]; then
echo "::error::Evidência Playwright ausente. Rode 'npx playwright test' e gere artifacts em test-results/."
exit 1
fi
echo "Evidência Playwright OK em test-results/"

# Lint do título do PR seguindo conventional commits
- name: Validate PR title (conventional commit)
env:
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
set -euo pipefail
echo "$PR_TITLE" | npx --yes commitlint --extends @commitlint/config-conventional || {
echo "::error::Título do PR não segue Conventional Commits (ex: feat: ..., fix: ..., chore: ...)."
# Types per .skills/conventional-commits/SKILL.md
if ! echo "$PR_TITLE" | grep -Eq '^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\([a-zA-Z0-9_.-]+\))?!?: .+'; then
echo "::error::PR title must follow Conventional Commits (feat:, fix:, docs:, ...). Got: $PR_TITLE"
exit 1
}
fi
echo "PR title OK: $PR_TITLE"

# Verifica se PR body referencia uma task (#NNN, task-NNN.md, etc.)
- name: Check task reference in PR body
- name: Verify PR body is non-empty
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
set -euo pipefail
if [ -z "${PR_BODY:-}" ]; then
echo "::error::PR body vazio. Inclua referência à task (ex: 'Closes #42' ou link para .specs/sprints/.../task.md)."
exit 1
fi
if ! echo "$PR_BODY" | grep -Eq '(#[0-9]+|task-?[0-9]+\.md|\.specs/sprints/.+\.task\.md)'; then
echo "::error::PR body deve referenciar uma task (#NNN, task-NNN.md ou link em .specs/sprints/)."
stripped=$(printf '%s' "${PR_BODY:-}" | tr -d '[:space:]')
if [ -z "$stripped" ]; then
echo "::error::PR body is empty. Describe what changed and why."
exit 1
fi
echo "PR body present (${#PR_BODY} chars)."

# Se mexeu em architecture/, exige ADR linkado no body
- name: Require ADR link when architecture changes
env:
PR_BODY: ${{ github.event.pull_request.body }}
Expand All @@ -107,10 +70,49 @@ jobs:
run: |
set -euo pipefail
CHANGED=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA" || true)
if echo "$CHANGED" | grep -Eq '^\.specs/architecture/|^architecture/'; then
echo "Mudanças detectadas em architecture/. Verificando ADR linkado..."
if ! echo "${PR_BODY:-}" | grep -Eq '(ADR-[0-9]+|adr-[0-9]+)'; then
echo "::error::Mudanças em architecture/ exigem ADR linkado no PR body (ex: ADR-001, ADR-042)."
if echo "$CHANGED" | grep -Eq '^\.specs/architecture/'; then
echo "Changes detected under .specs/architecture/. Checking ADR reference..."
if ! echo "${PR_BODY:-}" | grep -Eiq '(ADR-[0-9]+)'; then
echo "::error::Changes under .specs/architecture/ require an ADR link in the PR body (e.g. ADR-001)."
exit 1
fi
echo "ADR reference OK."
else
echo "No architecture changes — skipping ADR requirement."
fi

- name: Detect remotion-tutorial changes
id: remotion
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
run: |
set -euo pipefail
CHANGED=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA" || true)
if echo "$CHANGED" | grep -Eq '^remotion-tutorial/'; then
echo "changed=true" >> "$GITHUB_OUTPUT"
echo "remotion-tutorial/ touched — typecheck enabled."
else
echo "changed=false" >> "$GITHUB_OUTPUT"
echo "remotion-tutorial/ untouched — skipping typecheck."
fi

- name: Setup Node (for Remotion typecheck)
if: steps.remotion.outputs.changed == 'true'
uses: actions/setup-node@v4
with:
node-version: '22'

- name: Install Remotion deps
if: steps.remotion.outputs.changed == 'true'
working-directory: remotion-tutorial
run: npm install --no-audit --no-fund --loglevel=error

- name: Typecheck Remotion composition
if: steps.remotion.outputs.changed == 'true'
working-directory: remotion-tutorial
run: npx tsc -p tsconfig.json --noEmit

- name: DoD summary
run: |
echo "::notice::DoD gate passed — PR title, body, ADR rule and Remotion typecheck (if applicable) are all green."
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@ htmlcov/
*.mp3
!references/**/*.png
!examples/**/*.png
!docs/media/**
63 changes: 63 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,69 @@

> One install. Every agent. Full WaveSpeedAI inference platform — 700+ media models and 290+ OpenAI-compatible LLMs — wired into Claude Code, Codex, Hermes Agent, OpenClaw, Cursor, Windsurf, and any other host that follows the [agentskills.io](https://agentskills.io) `SKILL.md` spec.

## 60-second tour

<p align="center">
<a href="docs/media/tutorial-en.mp4">
<img src="docs/media/tutorial-poster-en.png" alt="WaveSpeedAI Skill — animated tutorial" width="900" />
</a>
</p>

<p align="center">
<strong>▶ <a href="docs/media/tutorial-en.mp4">Watch the 60s MP4</a></strong> &nbsp;·&nbsp;
1920×1080 · 30 fps
</p>

<details>
<summary><strong>Play inline on GitHub (auto-embedded video)</strong></summary>

https://github.com/wesleysimplicio/WaveSpeedAI-Skills/raw/main/docs/media/tutorial-en.mp4

</details>

### Storyboard — every scene, frame-by-frame

The tutorial is a 7-scene Remotion composition. Each still below is a frame from the middle of its scene, captured after the entrance animations have settled.

<table>
<tr>
<td align="center" width="33%">
<img src="docs/media/scenes/en/01-intro.png" alt="Scene 1 — Intro" width="100%" /><br/>
<sub><strong>1 · Intro</strong> — 5.0 s · logo, title, host chips, waveform pulse</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/en/02-what.png" alt="Scene 2 — What is the skill" width="100%" /><br/>
<sub><strong>2 · What is the skill</strong> — 9.0 s · 700+ media · 290+ LLMs · one CLI</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/en/03-install.png" alt="Scene 3 — Install" width="100%" /><br/>
<sub><strong>3 · Install</strong> — 10.0 s · animated terminal + installer steps</sub>
</td>
</tr>
<tr>
<td align="center" width="33%">
<img src="docs/media/scenes/en/04-hosts.png" alt="Scene 4 — Hosts" width="100%" /><br/>
<sub><strong>4 · Supported hosts</strong> — 8.0 s · grid of 7 hosts + SKILL.md paths</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/en/05-cli.png" alt="Scene 5 — CLI" width="100%" /><br/>
<sub><strong>5 · CLI in action</strong> — 12.0 s · wavespeed-cli typing demo</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/en/06-examples.png" alt="Scene 6 — Examples" width="100%" /><br/>
<sub><strong>6 · Examples</strong> — 10.0 s · image · video · LLM previews</sub>
</td>
</tr>
<tr>
<td align="center" colspan="3" width="100%">
<img src="docs/media/scenes/en/07-outro.png" alt="Scene 7 — Outro" width="60%" /><br/>
<sub><strong>7 · Outro / CTA</strong> — 6.0 s · one-line install + repo + license</sub>
</td>
</tr>
</table>

> Source code for the video lives in [`remotion-tutorial/`](remotion-tutorial/) — pure [Remotion](https://www.remotion.dev/) (TypeScript + React), no external assets. Re-render with `cd remotion-tutorial && npm install && npm run build:en` (or `npm run build` for the Portuguese version embedded in [README.pt-BR.md](README.pt-BR.md)). Higher-resolution stills are in [`docs/media/scenes/en/`](docs/media/scenes/en/).

```bash
# One-line install (interactive, picks the agents you have)
bash <(curl -fsSL https://raw.githubusercontent.com/wesleysimplicio/WaveSpeedAI-Skills/main/install.sh)
Expand Down
64 changes: 64 additions & 0 deletions README.pt-BR.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,70 @@

> Uma instalação. Todo agente. Plataforma WaveSpeedAI completa — 700+ modelos de mídia e 290+ LLMs compatíveis com OpenAI — conectada em Claude Code, Codex, Hermes Agent, OpenClaw, Cursor, Windsurf e qualquer host que siga a spec [agentskills.io](https://agentskills.io) `SKILL.md`.

## Tour de 60 segundos

<p align="center">
<a href="docs/media/tutorial.mp4">
<img src="docs/media/tutorial-poster.png" alt="WaveSpeedAI Skill — tutorial animado" width="900" />
</a>
</p>

<p align="center">
<strong>▶ <a href="docs/media/tutorial.mp4">Assista ao MP4 de 60 s</a></strong> &nbsp;·&nbsp;
<a href="docs/media/tutorial.webm">WebM (VP9)</a> &nbsp;·&nbsp;
1920×1080 · 30 fps
</p>

<details>
<summary><strong>Tocar inline no GitHub (vídeo embedado)</strong></summary>

https://github.com/wesleysimplicio/WaveSpeedAI-Skills/raw/main/docs/media/tutorial.mp4

</details>

### Storyboard — cena por cena

O tutorial é uma composição Remotion de 7 cenas. Cada still abaixo é um frame do meio da cena, depois das animações de entrada estabilizarem.

<table>
<tr>
<td align="center" width="33%">
<img src="docs/media/scenes/01-intro.png" alt="Cena 1 — Intro" width="100%" /><br/>
<sub><strong>1 · Intro</strong> — 5,0 s · logo, título, chips de hosts, pulse de waveform</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/02-what.png" alt="Cena 2 — O que é a skill" width="100%" /><br/>
<sub><strong>2 · O que é a skill</strong> — 9,0 s · 700+ mídia · 290+ LLMs · uma CLI</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/03-install.png" alt="Cena 3 — Instalação" width="100%" /><br/>
<sub><strong>3 · Instalação</strong> — 10,0 s · terminal animado + checklist do instalador</sub>
</td>
</tr>
<tr>
<td align="center" width="33%">
<img src="docs/media/scenes/04-hosts.png" alt="Cena 4 — Hosts" width="100%" /><br/>
<sub><strong>4 · Hosts suportados</strong> — 8,0 s · grid de 7 hosts + paths SKILL.md</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/05-cli.png" alt="Cena 5 — CLI" width="100%" /><br/>
<sub><strong>5 · CLI em ação</strong> — 12,0 s · wavespeed-cli typing demo</sub>
</td>
<td align="center" width="33%">
<img src="docs/media/scenes/06-examples.png" alt="Cena 6 — Exemplos" width="100%" /><br/>
<sub><strong>6 · Exemplos</strong> — 10,0 s · imagem · vídeo · LLM previews</sub>
</td>
</tr>
<tr>
<td align="center" colspan="3" width="100%">
<img src="docs/media/scenes/07-outro.png" alt="Cena 7 — Outro" width="60%" /><br/>
<sub><strong>7 · Outro / CTA</strong> — 6,0 s · install one-line + repo + licença</sub>
</td>
</tr>
</table>

> O código-fonte do vídeo fica em [`remotion-tutorial/`](remotion-tutorial/) — puro [Remotion](https://www.remotion.dev/) (TypeScript + React), sem assets externos. Re-renderize com `cd remotion-tutorial && npm install && npm run build`. Stills em maior resolução em [`docs/media/scenes/`](docs/media/scenes/).

```bash
# Instalação one-line (interativo, escolhe os agentes que você tem)
bash <(curl -fsSL https://raw.githubusercontent.com/wesleysimplicio/WaveSpeedAI-Skills/main/install.sh)
Expand Down
Binary file added docs/media/scenes/01-intro.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/02-what.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/03-install.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/04-hosts.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/05-cli.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/06-examples.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/07-outro.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
36 changes: 36 additions & 0 deletions docs/media/scenes/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Tutorial scene evidence

Per-scene stills rendered from the Remotion composition `WaveSpeedSkillTutorial`
(see [`remotion-tutorial/`](../../../remotion-tutorial/)). Each PNG is captured
at a representative frame near the middle of its scene, after entrance
animations have settled.

These stills are the regression evidence for the animated tutorial: if a
future change to the composition silently breaks one of the scenes, a new
render here will surface the visual diff.

| # | Scene | File | Frame | Highlights |
|---|---|---|---:|---|
| 1 | Intro | [01-intro.png](01-intro.png) | 90 | Logo, title, host chips, animated waveform pulse |
| 2 | What is the skill | [02-what.png](02-what.png) | 240 | 3 feature cards: 700+ media · 290+ LLMs · CLI |
| 3 | Install | [03-install.png](03-install.png) | 520 | Animated terminal + installer step checklist |
| 4 | Supported hosts | [04-hosts.png](04-hosts.png) | 820 | Grid of 7 hosts with each `SKILL.md` path |
| 5 | CLI in action | [05-cli.png](05-cli.png) | 1180 | `wavespeed-cli run` typing demo + subcommand grid |
| 6 | Examples | [06-examples.png](06-examples.png) | 1460 | Image · video · LLM previews |
| 7 | Outro / CTA | [07-outro.png](07-outro.png) | 1720 | One-line install + repo + license + spec badges |

## Re-generate

```bash
cd remotion-tutorial
npm install
mkdir -p out/regression
npx remotion still WaveSpeedSkillTutorial out/regression/01-intro.png --frame=90
npx remotion still WaveSpeedSkillTutorial out/regression/02-what.png --frame=240
npx remotion still WaveSpeedSkillTutorial out/regression/03-install.png --frame=520
npx remotion still WaveSpeedSkillTutorial out/regression/04-hosts.png --frame=820
npx remotion still WaveSpeedSkillTutorial out/regression/05-cli.png --frame=1180
npx remotion still WaveSpeedSkillTutorial out/regression/06-examples.png --frame=1460
npx remotion still WaveSpeedSkillTutorial out/regression/07-outro.png --frame=1720
cp out/regression/*.png ../docs/media/scenes/
```
Binary file added docs/media/scenes/en/01-intro.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/en/02-what.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/en/03-install.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/en/04-hosts.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/en/05-cli.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/en/06-examples.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/scenes/en/07-outro.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/tutorial-en.mp4
Binary file not shown.
Binary file added docs/media/tutorial-poster-en.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/tutorial-poster.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/media/tutorial.mp4
Binary file not shown.
Binary file added docs/media/tutorial.webm
Binary file not shown.
5 changes: 5 additions & 0 deletions remotion-tutorial/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
node_modules/
out/
.cache/
*.log
.DS_Store
Loading
Loading