6035542b67
Movidos do vault Hub para centralizar scripts. Hub mantem symlinks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
146 lines
3.1 KiB
Bash
Executable File
146 lines
3.1 KiB
Bash
Executable File
#!/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
|