158 lines
3.6 KiB
Bash
158 lines
3.6 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd)"
|
|
SOURCE_DIR="$(CDPATH='' cd -- "$SCRIPT_DIR/../.." && pwd)"
|
|
FORCE=0
|
|
TARGET_DIR=""
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Uso:
|
|
bash .vscode/automatizadores/bootstrap-workspace.sh /caminho/do/novo-workspace [--force]
|
|
|
|
O script copia a base compartilhavel do workspace DavinTI para um novo diretório:
|
|
- .claude/agents
|
|
- .claude/settings.local.json (versao portavel)
|
|
- .vscode
|
|
- .github
|
|
- CLAUDE.md
|
|
- .mcp.json
|
|
- Vitruvio/Documentação com todos os arquivos
|
|
|
|
Tambem cria as pastas:
|
|
- Andamento
|
|
- Concluidos
|
|
EOF
|
|
}
|
|
|
|
log() {
|
|
printf '%s\n' "$1"
|
|
}
|
|
|
|
fail() {
|
|
printf 'Erro: %s\n' "$1" >&2
|
|
exit 1
|
|
}
|
|
|
|
copy_entry() {
|
|
local relative_path="$1"
|
|
local source_path="$SOURCE_DIR/$relative_path"
|
|
local target_path="$TARGET_DIR/$relative_path"
|
|
|
|
[ -e "$source_path" ] || fail "Origem nao encontrada: $relative_path"
|
|
|
|
mkdir -p "$(dirname "$target_path")"
|
|
|
|
if [ -e "$target_path" ]; then
|
|
if [ "$FORCE" -ne 1 ]; then
|
|
fail "Destino ja existe: $relative_path. Use --force para sobrescrever."
|
|
fi
|
|
|
|
rm -rf "$target_path"
|
|
fi
|
|
|
|
cp -a "$source_path" "$target_path"
|
|
log "Copiado: $relative_path"
|
|
}
|
|
|
|
write_portable_claude_settings() {
|
|
local target_path="$TARGET_DIR/.claude/settings.local.json"
|
|
|
|
mkdir -p "$(dirname "$target_path")"
|
|
|
|
if [ -e "$target_path" ] && [ "$FORCE" -ne 1 ]; then
|
|
fail "Destino ja existe: .claude/settings.local.json. Use --force para sobrescrever."
|
|
fi
|
|
|
|
cat > "$target_path" <<'EOF'
|
|
{
|
|
"permissions": {
|
|
"allow": [
|
|
"mcp__oracle-davinti__run_query"
|
|
]
|
|
},
|
|
"enableAllProjectMcpServers": true,
|
|
"enabledMcpjsonServers": [
|
|
"oracle-davinti"
|
|
]
|
|
}
|
|
EOF
|
|
|
|
log "Gerado: .claude/settings.local.json"
|
|
}
|
|
|
|
cleanup_vscode_mcp_dir() {
|
|
local mcp_dir="$TARGET_DIR/.vscode/mcp-oracle-davinti"
|
|
|
|
rm -rf "$mcp_dir/node_modules"
|
|
rm -f "$mcp_dir/.env"
|
|
}
|
|
|
|
copy_vitruvio_documentation() {
|
|
local vitruvio_source_dir="$SOURCE_DIR/Vitruvio"
|
|
local documentation_source_dir
|
|
local documentation_dir_name
|
|
|
|
documentation_source_dir="$(find "$vitruvio_source_dir" -mindepth 1 -maxdepth 1 -type d \
|
|
\( -exec test -f '{}/eventos-vitruvio.md' ';' -a -exec test -f '{}/queries-padroes.md' ';' \) \
|
|
-print -quit)"
|
|
|
|
[ -n "$documentation_source_dir" ] || fail "Pasta de documentacao do Vitruvio nao encontrada na origem."
|
|
|
|
documentation_dir_name="$(basename "$documentation_source_dir")"
|
|
|
|
mkdir -p "$TARGET_DIR/Vitruvio"
|
|
copy_entry "Vitruvio/$documentation_dir_name"
|
|
}
|
|
|
|
create_base_directories() {
|
|
mkdir -p "$TARGET_DIR/Andamento"
|
|
mkdir -p "$TARGET_DIR/Concluidos"
|
|
|
|
log "Criadas pastas base do workspace"
|
|
}
|
|
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
--force)
|
|
FORCE=1
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
if [ -n "$TARGET_DIR" ]; then
|
|
fail "Argumento inesperado: $1"
|
|
fi
|
|
|
|
TARGET_DIR="$1"
|
|
shift
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[ -n "$TARGET_DIR" ] || {
|
|
usage
|
|
exit 1
|
|
}
|
|
|
|
TARGET_DIR="$(mkdir -p "$TARGET_DIR" && CDPATH='' cd -- "$TARGET_DIR" && pwd)"
|
|
|
|
[ "$TARGET_DIR" != "$SOURCE_DIR" ] || fail "O destino deve ser diferente da pasta do template."
|
|
|
|
copy_entry ".claude/agents"
|
|
write_portable_claude_settings
|
|
copy_entry ".vscode"
|
|
cleanup_vscode_mcp_dir
|
|
copy_entry ".github"
|
|
copy_entry "CLAUDE.md"
|
|
copy_entry ".mcp.json"
|
|
copy_vitruvio_documentation
|
|
create_base_directories
|
|
|
|
log "Workspace base criado em: $TARGET_DIR"
|
|
log "Proximo passo: copie .vscode/mcp-oracle-davinti/.env.example para .env e ajuste as credenciais locais." |