-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·230 lines (205 loc) · 10 KB
/
Copy pathinstall.sh
File metadata and controls
executable file
·230 lines (205 loc) · 10 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#!/usr/bin/env bash
# =============================================================================
# install.sh — OpenCode Profiles Installer
# =============================================================================
# Instala ou atualiza o sistema de perfis do opencode.
#
# Uso:
# ./install.sh Instala/atualiza interativamente
# ./install.sh --help Mostra esta ajuda
# ./install.sh --dry-run Mostra o que seria feito sem modificar nada
# ./install.sh --force Instala sem confirmação
# =============================================================================
set -euo pipefail
# ─── Configuração ────────────────────────────────────────────────────────────
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_DIR="${HOME}/.config/opencode"
CLAUDE_FILE="${HOME}/.claude/CLAUDE.md"
ZSHRC_FILE="${HOME}/.zshrc"
# Cores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
BOLD='\033[1m'
NC='\033[0m'
DRY_RUN=false
FORCE=false
# ─── Parse flags ────────────────────────────────────────────────────────────
for arg in "$@"; do
case "$arg" in
--help|-h)
echo "${BOLD}install.sh — OpenCode Profiles Installer${NC}"
echo ""
echo "Instala ou atualiza o sistema de perfis do opencode."
echo ""
echo "${BOLD}Uso:${NC}"
echo " ./install.sh Instala/atualiza interativamente"
echo " ./install.sh --help Mostra esta ajuda"
echo " ./install.sh --dry-run Simula sem modificar nada"
echo " ./install.sh --force Instala sem confirmação"
echo ""
echo "${BOLD}O que será instalado:${NC}"
echo " 1. ${BLUE}op.sh${NC} → ${CONFIG_DIR}/op.sh (script de ativação)"
echo " 2. ${BLUE}perfis${NC} → ${CONFIG_DIR}/profile.*.md (personalidades)"
echo " 3. ${BLUE}alias op${NC} → .zshrc (atalho no terminal)"
echo " 4. ${BLUE}PROFILE:BEGIN${NC} → CLAUDE.md (loader de personalidade)"
echo ""
exit 0
;;
--dry-run)
DRY_RUN=true
;;
--force)
FORCE=true
;;
esac
done
echo "${BOLD}══════════════════════════════════════════${NC}"
echo "${BOLD} OpenCode Profiles — Instalação${NC}"
echo "${BOLD}══════════════════════════════════════════${NC}"
echo ""
# ─── Pré-verificação ─────────────────────────────────────────────────────────
if [[ "$DRY_RUN" == "false" ]] && [[ "$FORCE" == "false" ]]; then
echo "${YELLOW}Isso irá instalar/atualizar o sistema de perfis no diretório:${NC}"
echo " ${BLUE}${CONFIG_DIR}${NC}"
echo ""
echo "${BOLD}Ações:${NC}"
echo " • Instalar/atualizar ${GREEN}op.sh${NC} em ${BLUE}${CONFIG_DIR}${NC}"
echo " • Copiar ${GREEN}8 perfis${NC} para ${BLUE}${CONFIG_DIR}/profile.*.md${NC}"
echo " • Adicionar alias 'op' no ${BLUE}.zshrc${NC}"
echo " • Verificar bloco PROFILE:BEGIN no ${BLUE}CLAUDE.md${NC}"
echo ""
read -p "Continuar? (S/n) " -n 1 -r REPLY
echo
if [[ ! "$REPLY" =~ ^[Ss]$ ]] && [[ -n "$REPLY" ]]; then
echo "${YELLOW}Instalação cancelada.${NC}"
exit 0
fi
fi
# ─── 1. Instalar op.sh ───────────────────────────────────────────────────────
echo ""
echo "${BOLD}1. ${GREEN}op.sh${NC} → ${BLUE}${CONFIG_DIR}/op.sh${NC}${NC}"
if [[ "$DRY_RUN" == "true" ]]; then
echo " [DRY-RUN] Copiar: ${REPO_DIR}/bin/op.sh → ${CONFIG_DIR}/op.sh"
echo " [DRY-RUN] Permissão: chmod +x ${CONFIG_DIR}/op.sh"
else
cp "$REPO_DIR/bin/op.sh" "$CONFIG_DIR/op.sh"
chmod +x "$CONFIG_DIR/op.sh"
echo " ✅ op.sh instalado em ${CONFIG_DIR}/op.sh"
fi
# ─── 2. Copiar profiles para $CONFIG_DIR/ (CLAUDE.md lê daqui) ────────────────
echo ""
echo "${BOLD}2. ${GREEN}Perfis${NC} → ${BLUE}${CONFIG_DIR}/profile.*.md${NC}${NC}"
if [[ "$DRY_RUN" == "true" ]]; then
echo " [DRY-RUN] Copiar ${REPO_DIR}/profiles/profile.*.md → ${CONFIG_DIR}/ (sem sobrescrever)"
echo " [DRY-RUN] Opcional: ln -s ${REPO_DIR}/profiles ${CONFIG_DIR}/profiles"
else
# Copia cada profile sem sobrescrever (-n)
local count=0
for f in "$REPO_DIR"/profiles/profile.*.md; do
[[ -f "$f" ]] || continue
name=$(basename "$f")
if [[ ! -f "${CONFIG_DIR}/${name}" ]]; then
cp "$f" "${CONFIG_DIR}/${name}"
echo " + ${name}"
else
echo " ℹ️ ${name} já existe, mantido"
fi
((count++))
done
# Cria symlink para o diretório de profiles do repo (fonte git)
if [[ ! -L "${CONFIG_DIR}/profiles" ]]; then
ln -sf "$REPO_DIR/profiles" "${CONFIG_DIR}/profiles" 2>/dev/null || true
echo " ℹ️ Symlink criado: ${CONFIG_DIR}/profiles → ${REPO_DIR}/profiles"
fi
echo " ✅ $count perfis sincronizados"
fi
# ─── 3. Alias no .zshrc ──────────────────────────────────────────────────────
echo ""
echo "${BOLD}3. ${GREEN}Alias 'op'${NC} no .zshrc${NC}"
ALIAS_LINE='alias op="${HOME}/.config/opencode/op.sh"'
if grep -q 'alias op=' "$ZSHRC_FILE" 2>/dev/null; then
echo " ℹ️ Alias 'op' já existe no .zshrc"
elif [[ "$DRY_RUN" == "true" ]]; then
echo " [DRY-RUN] Adicionar: ${ALIAS_LINE} → ${ZSHRC_FILE}"
else
echo "" >> "$ZSHRC_FILE"
echo "# ─── OpenCode Profiles ─────────────────────────────────" >> "$ZSHRC_FILE"
echo "${ALIAS_LINE}" >> "$ZSHRC_FILE"
echo " ✅ Alias 'op' adicionado ao .zshrc"
fi
# ─── 4. Verificar/instalar bloco PROFILE:BEGIN no CLAUDE.md ──────────────────
echo ""
echo "${BOLD}4. ${GREEN}PROFILE:BEGIN${NC} no CLAUDE.md${NC}"
# Bloco PROFILE:BEGIN (escrito via here-doc para evitar escapes)
PROFILE_BLOCK=$(cat << 'PROFILE_EOF'
<!-- PROFILE:BEGIN — managed by install.sh, do not edit this block -->
## Ative Profile Personality
This session runs under a specific **profile** that defines your persona, priorities, and available skills.
1. **Read the active profile name**:
`~/.config/opencode/.active_profile`
2. **Load the personality instructions** for that profile:
`~/.config/opencode/profile.<name>.md`
Replace `<name>` with the content of `.active_profile`.
3. **Follow the profile's behavior rules** as your primary operating instructions for this session.
4. **Skills listed in the profile are recommendations** — you must still call `skill("name")` to load them. The profile tells you *which* skills to prioritize, not *when* to load them.
If `.active_profile` doesn't exist or the profile file is missing, fall back to the `full` profile:
`~/.config/opencode/profile.full.md`
<!-- PROFILE:END -->
PROFILE_EOF
)
if [[ -f "$CLAUDE_FILE" ]]; then
if grep -q 'PROFILE:BEGIN' "$CLAUDE_FILE" 2>/dev/null; then
echo " ✅ Bloco PROFILE:BEGIN já existe no CLAUDE.md"
elif [[ "$DRY_RUN" == "true" ]]; then
echo " [DRY-RUN] Adicionar bloco PROFILE:BEGIN ao final do CLAUDE.md"
else
echo "" >> "$CLAUDE_FILE"
echo "$PROFILE_BLOCK" >> "$CLAUDE_FILE"
echo " ✅ Bloco PROFILE:BEGIN adicionado ao CLAUDE.md"
fi
else
echo " ${YELLOW}⚠️ CLAUDE.md não encontrado em ${CLAUDE_FILE}${NC}"
if [[ "$DRY_RUN" == "false" ]]; then
mkdir -p "$(dirname "$CLAUDE_FILE")"
echo "$PROFILE_BLOCK" > "$CLAUDE_FILE"
echo " ✅ CLAUDE.md criado com bloco PROFILE:BEGIN"
fi
fi
# ─── 5. Templates (opcional) ─────────────────────────────────────────────────
echo ""
echo "${BOLD}5. ${GREEN}Templates${NC} (referência)${NC}"
TEMPLATES_SRC="${REPO_DIR}/templates"
if [[ -d "$TEMPLATES_SRC" ]]; then
if [[ "$DRY_RUN" == "true" ]]; then
echo " [DRY-RUN] Templates disponíveis em: ${TEMPLATES_SRC}"
else
echo " ℹ️ Templates disponíveis em: ${TEMPLATES_SRC}"
echo " ℹ️ Use 'cp ${TEMPLATES_SRC}/opencode.example.json ~/.config/opencode/opencode.<nome>.json'"
echo " ℹ️ Use 'cp ${REPO_DIR}/profiles/profile.example.md ~/.config/opencode/profile.<nome>.md'"
fi
fi
# ─── Resumo ──────────────────────────────────────────────────────────────────
echo ""
echo "${BOLD}══════════════════════════════════════════${NC}"
if [[ "$DRY_RUN" == "true" ]]; then
echo "${YELLOW} DRY-RUN concluído — nada foi modificado${NC}"
else
echo "${GREEN} ✅ Instalação concluída!${NC}"
echo ""
echo " Para começar:"
echo " ${GREEN}op${NC} Lista perfis disponíveis"
echo " ${GREEN}op build${NC} Ativa perfil 'build'"
echo " ${GREEN}op full${NC} Ativa perfil 'full'"
echo " ${GREEN}op build ~/projeto${NC} Ativa perfil e abre projeto"
echo ""
echo " Para criar um novo perfil:"
echo " ${BLUE}cp ${TEMPLATES_SRC}/opencode.example.json ~/.config/opencode/opencode.<nome>.json${NC}"
echo " ${BLUE}cp ${REPO_DIR}/profiles/profile.example.md ~/.config/opencode/profile.<nome>.md${NC}"
echo ""
if [[ -f "$ZSHRC_FILE" ]] && grep -q 'alias op=' "$ZSHRC_FILE" 2>/dev/null; then
echo " ${YELLOW}⚠️ Recarregue seu .zshrc: source ${ZSHRC_FILE}${NC}"
fi
fi
echo "${BOLD}══════════════════════════════════════════${NC}"