Files
claude-plugins/acidaos/skills/devops/SKILL.md
T
ealmeida 24b0b68ed0 feat: adicionar plugin acidaos e skill prompt-refine
Plugin acidaos (novo):
- rust-dev: desenvolvimento Core em Rust (Axum, crates, debug compiler)
- spoke-dev: desenvolvimento Spokes em Next.js/TypeScript + Storybook
- devops: pipelines Gitea Actions CI/CD (adaptado de GitHub para Gitea)
- docs: rustdoc, TypeDoc, Outline e ADRs

dev-tools:
- prompt-refine: skill genérica de engenharia de prompts para agentes IA

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 22:11:22 +00:00

7.7 KiB

name, description, allowed-tools
name description allowed-tools
devops CI/CD pipelines para o AcidaOS via Gitea Actions — build, test, deploy para acidaos-core (Rust) e acidaos-dashboard (Next.js). Usar quando "pipeline acidaos", "gitea actions acidaos", "ci cd acidaos", "deploy acidaos", "workflow acidaos". Read, Write, Edit, Bash, mcp__gitea__list_repo_action_workflows, mcp__gitea__get_repo_action_workflow, mcp__gitea__create_file, mcp__gitea__update_file, mcp__memory-supabase__search_memories

AcidaOS DevOps — Gitea Actions

Skill para criar e gerir pipelines CI/CD do AcidaOS via Gitea Actions.

Atenção: O AcidaOS usa Gitea Actions, não GitHub Actions. A sintaxe é compatível mas o runner é self-hosted em mcp-hub.descomplicar.pt.

Contexto

Repositórios Gitea:
  acidaos-core      → Rust Core
  acidaos-dashboard → Next.js Dashboard

Runners:
  self-hosted @ mcp-hub.descomplicar.pt
  Labels: [self-hosted, linux, rust, node]

Deploy target:
  EasyPanel (projectName: "descomplicar")
  acidaos-core    → serviceName: "acidaos-core"
  acidaos-dashboard → serviceName: "acidaos-dashboard"

Protocolo Inicial

mcp__memory-supabase__search_memories "acidaos devops pipeline"
mcp__gitea__list_repo_action_workflows <repo>  # ver workflows existentes

Pipelines Disponíveis

1. Core Rust — CI Pipeline

Ficheiro: .gitea/workflows/ci.yml

name: AcidaOS Core CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  check:
    name: Verificar código
    runs-on: [self-hosted, linux, rust]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Cache Cargo
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      - name: Cargo check
        run: cargo check --all-features

      - name: Clippy
        run: cargo clippy --all-features -- -D warnings

      - name: Formatação
        run: cargo fmt --all -- --check

  test:
    name: Testes
    needs: check
    runs-on: [self-hosted, linux, rust]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Cache Cargo
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      - name: Testes unitários
        run: cargo test --all-features

      - name: Testes de integração
        run: cargo test --test '*' --all-features
        env:
          ACIDAOS_ENV: test
          DATABASE_URL: ${{ secrets.TEST_DATABASE_URL }}

  security:
    name: Auditoria de segurança
    runs-on: [self-hosted, linux, rust]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: cargo-audit
        run: |
          cargo install cargo-audit --quiet
          cargo audit

2. Core Rust — Deploy Pipeline

Ficheiro: .gitea/workflows/deploy.yml

name: AcidaOS Core Deploy

on:
  push:
    branches: [main]
    tags: ['v*']

jobs:
  deploy:
    name: Deploy para EasyPanel
    runs-on: [self-hosted, linux, rust]
    environment: production
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Build release
        run: cargo build --release

      - name: Build Docker image
        run: |
          docker build \
            -t acidaos-core:${{ gitea.sha }} \
            -t acidaos-core:latest \
            .

      - name: Push para registry
        run: |
          docker tag acidaos-core:latest \
            registry.descomplicar.pt/acidaos/core:latest
          docker push registry.descomplicar.pt/acidaos/core:latest
        env:
          DOCKER_REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}

      - name: Deploy via EasyPanel API
        run: |
          curl -X POST \
            "https://easypanel.descomplicar.pt/api/deploy" \
            -H "Authorization: Bearer ${{ secrets.EASYPANEL_TOKEN }}" \
            -H "Content-Type: application/json" \
            -d '{
              "projectName": "descomplicar",
              "serviceName": "acidaos-core",
              "image": "registry.descomplicar.pt/acidaos/core:latest"
            }'

      - name: Verificar health
        run: |
          sleep 10
          curl -f http://acidaos-core.descomplicar.pt/health || exit 1

3. Dashboard Next.js — CI Pipeline

Ficheiro: .gitea/workflows/ci.yml (no repo acidaos-dashboard)

name: AcidaOS Dashboard CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  lint-typecheck:
    name: Lint e TypeCheck
    runs-on: [self-hosted, linux, node]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'pnpm'

      - name: Instalar dependências
        run: pnpm install --frozen-lockfile

      - name: TypeScript check
        run: pnpm tsc --noEmit

      - name: ESLint
        run: pnpm lint

  test:
    name: Testes
    needs: lint-typecheck
    runs-on: [self-hosted, linux, node]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'pnpm'

      - name: Instalar dependências
        run: pnpm install --frozen-lockfile

      - name: Testes unitários
        run: pnpm test

      - name: Build de verificação
        run: pnpm build
        env:
          ACIDAOS_CORE_URL: http://localhost:3001

  e2e:
    name: Testes E2E
    needs: test
    runs-on: [self-hosted, linux, node]
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'pnpm'

      - name: Instalar dependências
        run: pnpm install --frozen-lockfile

      - name: Instalar Playwright
        run: pnpm exec playwright install --with-deps chromium

      - name: Testes E2E
        run: pnpm test:e2e
        env:
          BASE_URL: http://localhost:3000
          ACIDAOS_CORE_URL: http://localhost:3001

      - name: Upload relatório E2E
        if: failure()
        uses: actions/upload-artifact@v3
        with:
          name: playwright-report
          path: playwright-report/

Gestão via MCP Gitea

// Listar workflows de um repo
mcp__gitea__list_repo_action_workflows({ owner: "descomplicar", repo: "acidaos-core" })

// Ver runs recentes
mcp__gitea__list_repo_action_runs({ owner: "descomplicar", repo: "acidaos-core" })

// Desencadear workflow manualmente
mcp__gitea__dispatch_repo_action_workflow({
  owner: "descomplicar",
  repo: "acidaos-core",
  workflow_id: "deploy.yml",
  ref: "main"
})

// Ver logs de uma job
mcp__gitea__get_repo_action_job_log_preview({ owner: "descomplicar", repo: "acidaos-core", job_id: <id> })

Segredos necessários (Gitea Secrets)

Segredo Usado em Descrição
TEST_DATABASE_URL Core CI PostgreSQL de teste
REGISTRY_TOKEN Core Deploy Token registry Docker
EASYPANEL_TOKEN Core/Dashboard Deploy Token API EasyPanel

Checklist Pipeline Nova

  • Workflow criado em .gitea/workflows/
  • Runner labels correctas (self-hosted, linux, rust ou node)
  • Cache Cargo/pnpm configurado
  • Segredos referenciados (não hardcoded)
  • Health check no deploy
  • Tested com mcp__gitea__dispatch_repo_action_workflow

Versão: 1.0.0 | Autor: Descomplicar® | Plugin: acidaos