Compare commits

...

3 Commits

Author SHA1 Message Date
Frederico Castro
3ed285c9d1 Atualizar README com deploy automático, catálogo de tarefas e novos endpoints 2026-02-28 01:27:33 -03:00
Frederico Castro
6a21a4d711 Aumentar truncate dos cards de tarefas e adicionar margem no footer 2026-02-28 01:22:45 -03:00
Frederico Castro
bbfb9864bd Truncar textos dos cards de tarefas para layout padronizado
- Truncar descrição em 120 caracteres no JS com tooltip do texto completo
- Truncar nome com ellipsis via CSS
- Limitar descrição a 2 linhas com max-height
2026-02-28 00:59:25 -03:00
4 changed files with 114 additions and 10 deletions

View File

@@ -19,6 +19,13 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
- Ative, desative, edite, **duplique** ou exclua a qualquer momento
- Exporte/importe configurações completas em JSON
### Catálogo de Tarefas
- Crie e gerencie tarefas reutilizáveis com nome, categoria e descrição detalhada
- Categorias: Code Review, Segurança, Refatoração, Testes, Documentação, Performance
- Filtro por texto e categoria
- Execute qualquer tarefa diretamente no agente escolhido
- Cards com truncamento inteligente e tooltip com descrição completa
### Execução de Tarefas
- Execute tarefas sob demanda em qualquer agente ativo
- Templates rápidos incluídos (detecção de bugs, revisão OWASP, refatoração, testes, documentação, performance)
@@ -27,6 +34,7 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
### Terminal em Tempo Real
- Streaming chunk-a-chunk via WebSocket com indicador de conexão
- **Botão Interromper** para cancelar todas as execuções ativas
- **Busca** no output do terminal com navegação entre ocorrências
- **Download** da saída completa como `.txt`
- **Copiar** saída para a área de transferência
@@ -50,7 +58,9 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
### Pipelines
- Encadeie múltiplos agentes em fluxos sequenciais
- Saída de cada passo alimenta o próximo via template `{{input}}`
- **Diretório de trabalho** configurável por pipeline (pré-preenchido com base path)
- Portões de aprovação humana entre passos (human-in-the-loop)
- **Retomar pipelines falhas** a partir do passo onde pararam
- Ideal para fluxos como "analisar → corrigir → testar"
### Webhooks
@@ -87,18 +97,29 @@ Painel administrativo web para orquestração de agentes [Claude Code](https://d
A aplicação roda em container Docker na infraestrutura Nitro Cloud com HTTPS automático via Caddy + Let's Encrypt.
### Atualizar o sistema em produção
### Deploy automático (recomendado)
Um único comando faz push e deploy completo:
```bash
# 1. Push das alterações para o Gitea
git push nitro main
git deploy
```
# 2. Conectar no servidor
ssh -p 2222 fred@192.168.1.151
O script `scripts/deploy.sh` executa automaticamente:
# 3. Atualizar código e rebuild do container
cd ~/vps/apps/agents-orchestrator && git pull
cd ~/vps && docker compose up -d --build agents-orchestrator
1. Push para GitHub (origin) e Gitea (nitro)
2. Backup dos dados no VPS (`data-backup-YYYYMMDD-HHMMSS`)
3. Sincronização via rsync (exclui `data/`, `.git`, `node_modules`)
4. Correção de permissões do diretório de dados
5. Rebuild do container Docker
6. Verificação do container e integridade dos dados
7. Limpeza de backups antigos (mantém os 3 mais recentes)
Opções:
```bash
git deploy # Push + deploy completo
bash scripts/deploy.sh --skip-push # Apenas deploy, sem push
```
### Verificar status
@@ -121,6 +142,7 @@ ssh -p 2222 fred@192.168.1.151 "cd ~/vps && docker compose restart agents-orches
| `HOST` | Endereço de bind | `0.0.0.0` |
| `AUTH_TOKEN` | Token Bearer para autenticação da API | _(desabilitado)_ |
| `ALLOWED_ORIGIN` | Origin permitida para CORS | `https://agents.nitro-cloud.duckdns.org` |
| `ALLOWED_DIRECTORIES` | Diretórios permitidos para working directory (CSV) | _(todos)_ |
| `WEBHOOK_SECRET` | Segredo HMAC para assinatura de webhooks | _(desabilitado)_ |
| `CLAUDE_BIN` | Caminho para o binário do Claude CLI | _(auto-detectado)_ |
| `REDIS_URL` | URL do Redis para cache L2 (opcional) | _(somente memória)_ |
@@ -252,6 +274,7 @@ O executor invoca o binário `claude` com `--output-format stream-json`, parseia
| `POST` | `/api/pipelines/:id/cancel` | Cancelar pipeline |
| `POST` | `/api/pipelines/:id/approve` | Aprovar passo pendente |
| `POST` | `/api/pipelines/:id/reject` | Rejeitar passo pendente |
| `POST` | `/api/pipelines/resume/:execId` | Retomar pipeline falha |
### Webhooks
@@ -274,6 +297,7 @@ O executor invoca o binário `claude` com `--output-format stream-json`, parseia
| `GET` | `/api/executions/:id` | Detalhes de uma execução |
| `DELETE` | `/api/executions/:id` | Excluir execução do histórico |
| `POST` | `/api/executions/:id/retry` | Reexecutar execução falha |
| `POST` | `/api/executions/cancel-all` | Cancelar todas as execuções ativas |
| `DELETE` | `/api/executions` | Limpar histórico |
### Notificações

View File

@@ -3371,12 +3371,13 @@ tbody tr:hover td {
color: var(--text-secondary);
line-height: 1.5;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
}
.task-card-footer {
margin-top: 12px;
display: flex;
align-items: center;
justify-content: space-between;

View File

@@ -68,7 +68,7 @@ const TasksUI = {
<h4 class="task-card-name">${Utils.escapeHtml(task.name)}</h4>
<span class="badge ${categoryClass}">${Utils.escapeHtml(categoryLabel)}</span>
</div>
${task.description ? `<p class="task-card-description">${Utils.escapeHtml(task.description)}</p>` : ''}
${task.description ? `<p class="task-card-description" title="${Utils.escapeHtml(task.description)}">${Utils.escapeHtml(task.description.length > 240 ? task.description.slice(0, 240) + '…' : task.description)}</p>` : ''}
<div class="task-card-footer">
<span class="task-card-date">
<i data-lucide="calendar"></i>

79
scripts/deploy.sh Executable file
View File

@@ -0,0 +1,79 @@
#!/bin/bash
set -e
VPS_HOST="fred@192.168.1.151"
VPS_PORT=2222
VPS_APP_DIR="/home/fred/vps/apps/agents-orchestrator"
VPS_COMPOSE_DIR="/home/fred/vps"
SSH="ssh -p $VPS_PORT $VPS_HOST"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[deploy]${NC} $1"; }
warn() { echo -e "${YELLOW}[deploy]${NC} $1"; }
error() { echo -e "${RED}[deploy]${NC} $1"; }
SKIP_PUSH=false
for arg in "$@"; do
case "$arg" in
--skip-push) SKIP_PUSH=true ;;
esac
done
if [ "$SKIP_PUSH" = false ]; then
info "Fazendo push para origin..."
git push origin main
info "Fazendo push para nitro..."
git push nitro main 2>/dev/null || warn "Push para nitro falhou (não crítico)"
fi
info "Verificando dados no VPS antes do deploy..."
DATA_FILES=$($SSH "ls -1 $VPS_APP_DIR/data/*.json 2>/dev/null | wc -l")
info "Arquivos de dados encontrados: $DATA_FILES"
if [ "$DATA_FILES" -gt 0 ]; then
info "Criando backup dos dados..."
$SSH "cp -r $VPS_APP_DIR/data $VPS_APP_DIR/data-backup-\$(date +%Y%m%d-%H%M%S)"
fi
info "Sincronizando código com o VPS..."
rsync -avz --delete \
--exclude='node_modules' \
--exclude='data' \
--exclude='data-backup-*' \
--exclude='.git' \
--exclude='.env' \
--exclude='*.log' \
-e "ssh -p $VPS_PORT" \
./ "$VPS_HOST:$VPS_APP_DIR/"
info "Corrigindo permissões do diretório data..."
$SSH "sudo chown -R 1000:1000 $VPS_APP_DIR/data"
info "Rebuilding container..."
$SSH "cd $VPS_COMPOSE_DIR && docker compose up -d --build agents-orchestrator 2>&1 | tail -5"
info "Verificando container..."
sleep 2
STATUS=$($SSH "docker ps --filter name=agents-orchestrator --format '{{.Status}}'")
if echo "$STATUS" | grep -q "Up"; then
info "Container rodando: $STATUS"
else
error "Container não está rodando! Status: $STATUS"
exit 1
fi
DATA_AFTER=$($SSH "ls -1 $VPS_APP_DIR/data/*.json 2>/dev/null | wc -l")
info "Arquivos de dados após deploy: $DATA_AFTER"
if [ "$DATA_AFTER" -lt "$DATA_FILES" ]; then
error "ALERTA: Menos arquivos de dados após deploy! ($DATA_FILES -> $DATA_AFTER)"
error "Backup disponível em data-backup-*"
exit 1
fi
$SSH "ls -dt $VPS_APP_DIR/data-backup-* 2>/dev/null | tail -n +4 | xargs rm -rf 2>/dev/null" || true
info "Deploy concluído com sucesso!"