|
4be3595…
|
lmata
|
1 |
#!/usr/bin/env bash |
|
4be3595…
|
lmata
|
2 |
# navegador bootstrap — install, initialise, and ingest a project |
|
4be3595…
|
lmata
|
3 |
# |
|
4be3595…
|
lmata
|
4 |
# Usage: |
|
4be3595…
|
lmata
|
5 |
# curl -fsSL https://raw.githubusercontent.com/ConflictHQ/navegador/main/hooks/bootstrap.sh | bash |
|
4be3595…
|
lmata
|
6 |
# # or locally: |
|
4be3595…
|
lmata
|
7 |
# bash hooks/bootstrap.sh [--repo owner/repo] [--wiki] [--agent claude|gemini|openai] |
|
4be3595…
|
lmata
|
8 |
|
|
4be3595…
|
lmata
|
9 |
set -euo pipefail |
|
4be3595…
|
lmata
|
10 |
|
|
4be3595…
|
lmata
|
11 |
NAV_DB="${NAVEGADOR_DB:-.navegador/graph.db}" |
|
4be3595…
|
lmata
|
12 |
REPO_PATH="${REPO_PATH:-.}" |
|
4be3595…
|
lmata
|
13 |
GITHUB_REPO="${GITHUB_REPO:-}" |
|
4be3595…
|
lmata
|
14 |
INSTALL_AGENT="${INSTALL_AGENT:-}" |
|
4be3595…
|
lmata
|
15 |
INGEST_WIKI=false |
|
4be3595…
|
lmata
|
16 |
|
|
4be3595…
|
lmata
|
17 |
# ── Parse args ──────────────────────────────────────────────────────────────── |
|
4be3595…
|
lmata
|
18 |
while [[ $# -gt 0 ]]; do |
|
4be3595…
|
lmata
|
19 |
case $1 in |
|
4be3595…
|
lmata
|
20 |
--repo) GITHUB_REPO="$2"; shift 2 ;; |
|
4be3595…
|
lmata
|
21 |
--wiki) INGEST_WIKI=true; shift ;; |
|
4be3595…
|
lmata
|
22 |
--agent) INSTALL_AGENT="$2"; shift 2 ;; |
|
4be3595…
|
lmata
|
23 |
--db) NAV_DB="$2"; shift 2 ;; |
|
4be3595…
|
lmata
|
24 |
*) echo "Unknown option: $1"; exit 1 ;; |
|
4be3595…
|
lmata
|
25 |
esac |
|
4be3595…
|
lmata
|
26 |
done |
|
4be3595…
|
lmata
|
27 |
|
|
4be3595…
|
lmata
|
28 |
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" |
|
4be3595…
|
lmata
|
29 |
echo " Navegador bootstrap" |
|
4be3595…
|
lmata
|
30 |
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" |
|
4be3595…
|
lmata
|
31 |
|
|
4be3595…
|
lmata
|
32 |
# ── Install ─────────────────────────────────────────────────────────────────── |
|
4be3595…
|
lmata
|
33 |
if ! command -v navegador &>/dev/null; then |
|
4be3595…
|
lmata
|
34 |
echo "→ Installing navegador..." |
|
4be3595…
|
lmata
|
35 |
pip install "navegador[sqlite]" --quiet |
|
4be3595…
|
lmata
|
36 |
else |
|
4be3595…
|
lmata
|
37 |
echo "→ navegador $(navegador --version 2>&1 | head -1) already installed" |
|
4be3595…
|
lmata
|
38 |
fi |
|
4be3595…
|
lmata
|
39 |
|
|
4be3595…
|
lmata
|
40 |
# ── Initialise DB directory ─────────────────────────────────────────────────── |
|
4be3595…
|
lmata
|
41 |
mkdir -p "$(dirname "$NAV_DB")" |
|
4be3595…
|
lmata
|
42 |
echo "→ Graph DB: $NAV_DB" |
|
4be3595…
|
lmata
|
43 |
|
|
4be3595…
|
lmata
|
44 |
# ── Ingest code ─────────────────────────────────────────────────────────────── |
|
4be3595…
|
lmata
|
45 |
echo "→ Ingesting code from $REPO_PATH ..." |
|
4be3595…
|
lmata
|
46 |
navegador --db "$NAV_DB" ingest "$REPO_PATH" --json | \ |
|
4be3595…
|
lmata
|
47 |
python3 -c "import json,sys; d=json.load(sys.stdin); print(f\" files={d['files']} functions={d['functions']} classes={d['classes']} edges={d['edges']}\")" |
|
4be3595…
|
lmata
|
48 |
|
|
4be3595…
|
lmata
|
49 |
# ── Ingest wiki ─────────────────────────────────────────────────────────────── |
|
4be3595…
|
lmata
|
50 |
if [[ "$INGEST_WIKI" == "true" && -n "$GITHUB_REPO" ]]; then |
|
4be3595…
|
lmata
|
51 |
echo "→ Ingesting GitHub wiki for $GITHUB_REPO ..." |
|
4be3595…
|
lmata
|
52 |
navegador --db "$NAV_DB" wiki ingest --repo "$GITHUB_REPO" ${GITHUB_TOKEN:+--token "$GITHUB_TOKEN"} || true |
|
4be3595…
|
lmata
|
53 |
fi |
|
4be3595…
|
lmata
|
54 |
|
|
4be3595…
|
lmata
|
55 |
# ── Install agent hook ──────────────────────────────────────────────────────── |
|
4be3595…
|
lmata
|
56 |
HOOK_SRC_BASE="https://raw.githubusercontent.com/ConflictHQ/navegador/main/hooks" |
|
4be3595…
|
lmata
|
57 |
|
|
4be3595…
|
lmata
|
58 |
install_claude_hook() { |
|
4be3595…
|
lmata
|
59 |
mkdir -p .claude/hooks |
|
4be3595…
|
lmata
|
60 |
curl -fsSL "$HOOK_SRC_BASE/claude-hook.py" -o .claude/hooks/navegador.py |
|
4be3595…
|
lmata
|
61 |
chmod +x .claude/hooks/navegador.py |
|
4be3595…
|
lmata
|
62 |
|
|
4be3595…
|
lmata
|
63 |
SETTINGS=".claude/settings.json" |
|
4be3595…
|
lmata
|
64 |
if [[ ! -f "$SETTINGS" ]]; then |
|
4be3595…
|
lmata
|
65 |
cat > "$SETTINGS" <<'JSON' |
|
4be3595…
|
lmata
|
66 |
{ |
|
4be3595…
|
lmata
|
67 |
"hooks": { |
|
4be3595…
|
lmata
|
68 |
"PostToolUse": [ |
|
4be3595…
|
lmata
|
69 |
{ |
|
4be3595…
|
lmata
|
70 |
"matcher": "Edit|Write", |
|
4be3595…
|
lmata
|
71 |
"hooks": [{ "type": "command", "command": "python3 .claude/hooks/navegador.py" }] |
|
4be3595…
|
lmata
|
72 |
} |
|
4be3595…
|
lmata
|
73 |
] |
|
4be3595…
|
lmata
|
74 |
} |
|
4be3595…
|
lmata
|
75 |
} |
|
4be3595…
|
lmata
|
76 |
JSON |
|
4be3595…
|
lmata
|
77 |
echo " Created $SETTINGS" |
|
4be3595…
|
lmata
|
78 |
else |
|
4be3595…
|
lmata
|
79 |
echo " $SETTINGS exists — add the hook manually (see .claude/hooks/navegador.py)" |
|
4be3595…
|
lmata
|
80 |
fi |
|
4be3595…
|
lmata
|
81 |
} |
|
4be3595…
|
lmata
|
82 |
|
|
4be3595…
|
lmata
|
83 |
install_gemini_hook() { |
|
4be3595…
|
lmata
|
84 |
mkdir -p .gemini/hooks |
|
4be3595…
|
lmata
|
85 |
curl -fsSL "$HOOK_SRC_BASE/gemini-hook.py" -o .gemini/hooks/navegador.py |
|
4be3595…
|
lmata
|
86 |
chmod +x .gemini/hooks/navegador.py |
|
4be3595…
|
lmata
|
87 |
echo " Add to GEMINI.md: python3 .gemini/hooks/navegador.py <tool> <file>" |
|
4be3595…
|
lmata
|
88 |
} |
|
4be3595…
|
lmata
|
89 |
|
|
4be3595…
|
lmata
|
90 |
install_openai_hook() { |
|
4be3595…
|
lmata
|
91 |
curl -fsSL "$HOOK_SRC_BASE/openai-hook.py" -o navegador-openai.py |
|
4be3595…
|
lmata
|
92 |
chmod +x navegador-openai.py |
|
4be3595…
|
lmata
|
93 |
echo " Register tool schemas from hooks/openai-tools.json with your assistant" |
|
4be3595…
|
lmata
|
94 |
} |
|
4be3595…
|
lmata
|
95 |
|
|
4be3595…
|
lmata
|
96 |
case "$INSTALL_AGENT" in |
|
4be3595…
|
lmata
|
97 |
claude) echo "→ Installing Claude Code hook..."; install_claude_hook ;; |
|
4be3595…
|
lmata
|
98 |
gemini) echo "→ Installing Gemini CLI hook..."; install_gemini_hook ;; |
|
4be3595…
|
lmata
|
99 |
openai) echo "→ Installing OpenAI hook..."; install_openai_hook ;; |
|
4be3595…
|
lmata
|
100 |
"") ;; |
|
4be3595…
|
lmata
|
101 |
*) echo "Unknown agent: $INSTALL_AGENT (use claude|gemini|openai)" ;; |
|
4be3595…
|
lmata
|
102 |
esac |
|
4be3595…
|
lmata
|
103 |
|
|
4be3595…
|
lmata
|
104 |
# ── Stats ───────────────────────────────────────────────────────────────────── |
|
4be3595…
|
lmata
|
105 |
echo "" |
|
4be3595…
|
lmata
|
106 |
echo "→ Graph stats:" |
|
4be3595…
|
lmata
|
107 |
navegador --db "$NAV_DB" stats 2>/dev/null || true |
|
4be3595…
|
lmata
|
108 |
|
|
4be3595…
|
lmata
|
109 |
echo "" |
|
4be3595…
|
lmata
|
110 |
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" |
|
4be3595…
|
lmata
|
111 |
echo " Done. Quick start:" |
|
4be3595…
|
lmata
|
112 |
echo " navegador search \"your query\"" |
|
4be3595…
|
lmata
|
113 |
echo " navegador explain MyClass" |
|
4be3595…
|
lmata
|
114 |
echo " navegador stats" |
|
4be3595…
|
lmata
|
115 |
echo " navegador add concept \"Payment\" --domain billing" |
|
4be3595…
|
lmata
|
116 |
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" |