#!/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