feat: scripts de projectos vindos do Hub (podcast, alojadamaria, clip, ocr, etc.)
Movidos do vault Hub para centralizar scripts. Hub mantem symlinks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Executable
+145
@@ -0,0 +1,145 @@
|
||||
#!/usr/bin/env bash
|
||||
# propagate-structure.sh — Aplica a estrutura padrão (PROC-DEV-STANDARD) a outro projecto
|
||||
#
|
||||
# Uso:
|
||||
# ./propagate-structure.sh /caminho/para/projecto [--dry-run]
|
||||
#
|
||||
# Cria (se não existirem): MEMORY.md, STATUS.md, AGENTS.md, CHANGELOG.md, desk.project,
|
||||
# docs/PLANS/, docs/SPECS/, docs/audit/, docs/audit/findings/
|
||||
#
|
||||
# Não sobrescreve ficheiros existentes — só preenche lacunas.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
TARGET="${1:-}"
|
||||
DRY="${2:-}"
|
||||
|
||||
if [[ -z "$TARGET" || ! -d "$TARGET" ]]; then
|
||||
echo "Uso: $0 /caminho/projecto [--dry-run]" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
PROJECT_NAME="$(basename "$TARGET")"
|
||||
TODAY="$(date +%Y-%m-%d)"
|
||||
CREATED=0
|
||||
SKIPPED=0
|
||||
|
||||
log() { echo " $1 $2"; }
|
||||
|
||||
run() {
|
||||
if [[ "$DRY" == "--dry-run" ]]; then
|
||||
log "[DRY]" "$1"
|
||||
else
|
||||
eval "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_dir() {
|
||||
if [[ -d "$1" ]]; then
|
||||
log "[SKIP]" "dir $1"
|
||||
SKIPPED=$((SKIPPED+1))
|
||||
else
|
||||
run "mkdir -p '$1'"
|
||||
log "[NEW]" "dir $1"
|
||||
CREATED=$((CREATED+1))
|
||||
fi
|
||||
}
|
||||
|
||||
ensure_file() {
|
||||
local path="$1"
|
||||
local content="$2"
|
||||
if [[ -f "$path" ]]; then
|
||||
log "[SKIP]" "file $(basename "$path")"
|
||||
SKIPPED=$((SKIPPED+1))
|
||||
else
|
||||
if [[ "$DRY" == "--dry-run" ]]; then
|
||||
log "[DRY]" "would create $path"
|
||||
else
|
||||
printf '%s' "$content" > "$path"
|
||||
log "[NEW]" "file $(basename "$path")"
|
||||
fi
|
||||
CREATED=$((CREATED+1))
|
||||
fi
|
||||
}
|
||||
|
||||
echo "=== Propagação de estrutura PROC-DEV-STANDARD ==="
|
||||
echo "Projecto: $TARGET"
|
||||
[[ "$DRY" == "--dry-run" ]] && echo "Modo: DRY-RUN (nada será escrito)"
|
||||
echo
|
||||
|
||||
# Directorias
|
||||
ensure_dir "$TARGET/docs/PLANS"
|
||||
ensure_dir "$TARGET/docs/SPECS"
|
||||
ensure_dir "$TARGET/docs/audit/findings"
|
||||
|
||||
# Ficheiros standard
|
||||
ensure_file "$TARGET/MEMORY.md" \
|
||||
"# MEMORY.md — $PROJECT_NAME
|
||||
|
||||
## $TODAY
|
||||
- Estrutura padrão aplicada via propagate-structure.sh
|
||||
"
|
||||
|
||||
ensure_file "$TARGET/STATUS.md" \
|
||||
"# STATUS.md — $PROJECT_NAME
|
||||
|
||||
**Versão:** 0.1 | **Data:** $TODAY | **Agente:** —
|
||||
|
||||
## Estado actual
|
||||
- Em curso: —
|
||||
- Bloqueios: —
|
||||
- Próximos passos: —
|
||||
"
|
||||
|
||||
ensure_file "$TARGET/AGENTS.md" \
|
||||
"# AGENTS.md — $PROJECT_NAME
|
||||
|
||||
Directrizes específicas deste projecto para agentes IA.
|
||||
|
||||
## Referências obrigatórias
|
||||
|
||||
- \`ECOSYSTEM.md\` — Hub/06-Operacoes/Documentacao/ECOSYSTEM.md
|
||||
- \`PROC-DEV-STANDARD\` — D7-SIS-006
|
||||
- \`PROC-AUDIT-STANDARD\` — D7-SIS-007
|
||||
|
||||
## Protocolo de sessão
|
||||
|
||||
Início: ler MEMORY.md + STATUS.md. Fim: actualizar ambos.
|
||||
|
||||
## Convenções específicas
|
||||
|
||||
- (a definir)
|
||||
"
|
||||
|
||||
ensure_file "$TARGET/CHANGELOG.md" \
|
||||
"# CHANGELOG — $PROJECT_NAME
|
||||
|
||||
## 0.1.0 — $TODAY
|
||||
### Adicionado
|
||||
- Estrutura padrão (PROC-DEV-STANDARD)
|
||||
"
|
||||
|
||||
if [[ ! -f "$TARGET/desk.project" ]]; then
|
||||
ensure_file "$TARGET/desk.project" \
|
||||
'{
|
||||
"task_id": null,
|
||||
"project_id": null,
|
||||
"customer_id": null,
|
||||
"gitea_repo": null
|
||||
}
|
||||
'
|
||||
echo " [AVISO] desk.project criado vazio — preencher task_id Desk CRM"
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "=== Resultado ==="
|
||||
echo " Criados: $CREATED"
|
||||
echo " Existentes: $SKIPPED"
|
||||
[[ "$DRY" == "--dry-run" ]] && echo " (dry-run — nada foi escrito)"
|
||||
echo
|
||||
|
||||
# Validação final
|
||||
if [[ "$DRY" != "--dry-run" && -x "$(dirname "$0")/validate-structure.sh" ]]; then
|
||||
echo "=== Validação ==="
|
||||
bash "$(dirname "$0")/validate-structure.sh" "$TARGET" || true
|
||||
fi
|
||||
Executable
+107
@@ -0,0 +1,107 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# validate-structure.sh — Valida a estrutura de um projecto contra o standard
|
||||
# ESTRUTURA.md do Modelo-Organizacao-Proc-Dev
|
||||
#
|
||||
# Uso: ./scripts/validate-structure.sh [caminho_do_projecto]
|
||||
# Se não for especificado caminho, valida o projecto actual (raiz)
|
||||
#
|
||||
# Exit codes:
|
||||
# 0 — Em conformidade
|
||||
# 1 — Não conforme (estrutura em falta)
|
||||
# 2 — Erro de execução
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="${1:-.}"
|
||||
ERRORS=0
|
||||
WARNINGS=0
|
||||
|
||||
echo "=== Validação Estrutural (ESTRUTURA.md) ==="
|
||||
echo "Projecto: $(cd "$ROOT" && pwd)"
|
||||
echo ""
|
||||
|
||||
# 1. docs/ existe
|
||||
if [ -d "$ROOT/docs" ]; then
|
||||
echo " [OK] docs/ existe"
|
||||
else
|
||||
echo " [FALHA] docs/ não existe"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# 2. docs/PLANS/ existe
|
||||
if [ -d "$ROOT/docs/PLANS" ]; then
|
||||
echo " [OK] docs/PLANS/ existe"
|
||||
else
|
||||
echo " [FALHA] docs/PLANS/ não existe"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# 3. docs/SPECS/ existe
|
||||
if [ -d "$ROOT/docs/SPECS" ]; then
|
||||
echo " [OK] docs/SPECS/ existe"
|
||||
else
|
||||
echo " [FALHA] docs/SPECS/ não existe"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# 4. AGENTS.md existe
|
||||
if [ -f "$ROOT/AGENTS.md" ]; then
|
||||
# Verificar se tem conteúdo mínimo
|
||||
LINES=$(wc -l < "$ROOT/AGENTS.md")
|
||||
if [ "$LINES" -ge 5 ]; then
|
||||
echo " [OK] AGENTS.md existe ($LINES linhas)"
|
||||
else
|
||||
echo " [AVISO] AGENTS.md existe mas tem apenas $LINES linhas"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
else
|
||||
echo " [FALHA] AGENTS.md não existe"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# 5. MEMORY.md existe
|
||||
if [ -f "$ROOT/MEMORY.md" ]; then
|
||||
echo " [OK] MEMORY.md existe"
|
||||
else
|
||||
echo " [FALHA] MEMORY.md não existe"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# 6. desk.project existe e é JSON válido
|
||||
if [ -f "$ROOT/desk.project" ]; then
|
||||
if jq -e . "$ROOT/desk.project" > /dev/null 2>&1; then
|
||||
TASK_ID=$(jq -r '.task_id // "vazio"' "$ROOT/desk.project")
|
||||
echo " [OK] desk.project existe (task_id: $TASK_ID)"
|
||||
else
|
||||
echo " [FALHA] desk.project existe mas não é JSON válido"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
else
|
||||
echo " [FALHA] desk.project não existe"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
|
||||
# 7. Anti-pattern: verificar se existem pastas docs/PROC ou docs/RUNBOOK
|
||||
if [ -d "$ROOT/docs/PROC" ]; then
|
||||
echo " [AVISO] docs/PROC existe — não devia. Usar 06-Operacoes/Procedimentos/ no Hub"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
if [ -d "$ROOT/docs/RUNBOOK" ]; then
|
||||
echo " [AVISO] docs/RUNBOOK existe — não devia. Usar 06-Operacoes/Runbooks/ no Hub"
|
||||
WARNINGS=$((WARNINGS + 1))
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== Resultado ==="
|
||||
if [ "$ERRORS" -gt 0 ]; then
|
||||
echo " FALHAS: $ERRORS"
|
||||
echo " AVISOS: $WARNINGS"
|
||||
echo " VEREDICTO: NÃO CONFORME"
|
||||
exit 1
|
||||
else
|
||||
echo " FALHAS: 0"
|
||||
echo " AVISOS: $WARNINGS"
|
||||
echo " VEREDICTO: CONFORME"
|
||||
exit 0
|
||||
fi
|
||||
Reference in New Issue
Block a user