Skip to content

Instantly share code, notes, and snippets.

@wagnerpinheiro
Created July 13, 2026 22:53
Show Gist options
  • Select an option

  • Save wagnerpinheiro/947b27b963d817b7968e505bbb8062f0 to your computer and use it in GitHub Desktop.

Select an option

Save wagnerpinheiro/947b27b963d817b7968e505bbb8062f0 to your computer and use it in GitHub Desktop.
Automação para KB local
# Makefile — instalação e operação do graphify para KB
#
# Transforma o material de origem em ./raw em uma base de conhecimento (KB)
# navegável usando o graphify. A extração semântica roda INLINE através de um
# agente CLI (Claude Code ou opencode) — o próprio agente é o LLM que a skill
# /graphify orquestra. Não é necessário API key de backend LLM próprio.
#
# Uso rápido:
# make install # instala graphify + dependências
# make setup # cria pastas e configura .graphifyignore
# make init # constrói o KB de ./raw (formato wiki)
# make update # re-extração incremental de ./raw
#
# Parâmetros (sobrescrevíveis: make init FORMAT=obsidian RUNNER=claude):
# RUNNER=claude|opencode # agente que executa a skill (default opencode)
# MODEL=claude-sonnet-4.6 # modelo LLM (opencode usa PROVIDER/MODEL)
# MODEL_PROVIDER=github-copilot # provider do opencode (default github-copilot)
# FORMAT=wiki|obsidian|both|html # saída gerada no init/update (default wiki)
#
# Obs.: o default MODEL 'claude-sonnet-4.6' é o id do provider github-copilot.
# Se usar RUNNER=claude, passe o id do Claude Code, ex.: MODEL=sonnet.
# ---------------------------------------------------------------------------
# Variáveis (todas sobrescrevíveis na linha de comando)
# ---------------------------------------------------------------------------
RAW ?= ./raw
OUT ?= graphify-out
FORMAT ?= wiki
RUNNER ?= opencode
MODEL ?= claude-sonnet-4.6
MODEL_PROVIDER ?= github-copilot
EXTRAS ?= pdf,office
PKG ?= graphifyy[$(EXTRAS)]
CLAUDE ?= claude
CLAUDE_FLAGS ?= --permission-mode bypassPermissions --verbose
OPENCODE_FLAGS ?= --dangerously-skip-permissions
# MODE=headless (default, não-interativo) | interactive (abre a TUI para você
# responder perguntas da skill, ex.: aviso de corpus grande / "quer explorar?")
MODE ?= headless
# ---------------------------------------------------------------------------
# FORMAT -> flags da skill /graphify
# ---------------------------------------------------------------------------
ifeq ($(FORMAT),wiki)
GRAPHIFY_FLAGS := --wiki
else ifeq ($(FORMAT),obsidian)
GRAPHIFY_FLAGS := --obsidian
else ifeq ($(FORMAT),both)
GRAPHIFY_FLAGS := --wiki --obsidian
else ifeq ($(FORMAT),html)
GRAPHIFY_FLAGS :=
else
$(error FORMAT inválido: '$(FORMAT)'. Use wiki | obsidian | both | html)
endif
# ---------------------------------------------------------------------------
# RUNNER x MODE -> comando de execução (RUN) e flag do prompt (PFLAG)
# init/update chamam sempre: $(RUN) $(PFLAG) "/graphify ..."
# headless -> não-interativo (bufferiza; falha se a skill fizer pergunta)
# interactive -> abre a TUI já com o prompt, você responde as perguntas
# ---------------------------------------------------------------------------
ifeq ($(RUNNER),claude)
ifeq ($(MODE),interactive)
RUN := $(CLAUDE) --permission-mode bypassPermissions --model $(MODEL)
PFLAG :=
else
RUN := $(CLAUDE) $(CLAUDE_FLAGS) --model $(MODEL)
PFLAG := -p
endif
else ifeq ($(RUNNER),opencode)
ifeq ($(MODE),interactive)
RUN := opencode -m $(MODEL_PROVIDER)/$(MODEL) --prompt
PFLAG :=
else
RUN := opencode run $(OPENCODE_FLAGS) -m $(MODEL_PROVIDER)/$(MODEL)
PFLAG :=
endif
else
$(error RUNNER inválido: '$(RUNNER)'. Use claude | opencode)
endif
ifeq ($(filter headless interactive,$(MODE)),)
$(error MODE inválido: '$(MODE)'. Use headless | interactive)
endif
.DEFAULT_GOAL := help
.PHONY: help install setup init update clean
# ---------------------------------------------------------------------------
help:
@echo "graphify KB — alvos disponíveis:"
@echo ""
@echo " make install instala graphify + dependências ($(PKG))"
@echo " make setup cria pastas necessárias e configura .graphifyignore"
@echo " make init constrói o KB a partir de $(RAW) (FORMAT=$(FORMAT))"
@echo " make update re-extração incremental de $(RAW)"
@echo " make clean remove $(OUT)"
@echo ""
@echo "Parâmetros (defaults entre colchetes):"
@echo " RUNNER=claude|opencode [$(RUNNER)]"
@echo " MODEL=<modelo> [$(MODEL)]"
@echo " MODEL_PROVIDER=<provider> [$(MODEL_PROVIDER)] (só opencode)"
@echo " FORMAT=wiki|obsidian|both|html [$(FORMAT)]"
@echo " MODE=headless|interactive [$(MODE)]"
@echo " RAW=<pasta> [$(RAW)]"
@echo ""
@echo "Exemplos:"
@echo " make init FORMAT=obsidian"
@echo " make init MODE=interactive"
@echo " make init RUNNER=opencode MODEL=claude-sonnet-4-6"
# ---------------------------------------------------------------------------
install:
@echo ">> Instalando graphify ($(PKG))..."
@if command -v uv >/dev/null 2>&1; then \
uv tool install --upgrade "$(PKG)"; \
elif command -v pipx >/dev/null 2>&1; then \
pipx install --force "$(PKG)"; \
else \
python3 -m pip install --upgrade "$(PKG)"; \
fi
@command -v $(RUNNER) >/dev/null 2>&1 \
|| echo "AVISO: runner '$(RUNNER)' não encontrado no PATH — necessário para 'make init/update'."
@graphify --version 2>/dev/null || true
@echo ">> graphify instalado."
# ---------------------------------------------------------------------------
setup:
@command -v graphify >/dev/null 2>&1 \
|| { echo "ERRO: graphify não instalado. Rode 'make install'."; exit 1; }
@command -v $(RUNNER) >/dev/null 2>&1 \
|| { echo "ERRO: runner '$(RUNNER)' não encontrado no PATH (necessário p/ extração inline)."; exit 1; }
@echo ">> Registrando a skill /graphify para claude e opencode..."
@graphify install --platform claude || echo "AVISO: falha ao registrar a skill /graphify para claude."
@graphify install --platform opencode || echo "AVISO: falha ao registrar a skill /graphify para opencode."
@mkdir -p $(RAW) $(OUT) wiki
@touch .graphifyignore
@for entry in "src/" "docs/"; do \
grep -qxF "$$entry" .graphifyignore || echo "$$entry" >> .graphifyignore; \
done
@for d in .claude .agents .opencode; do \
if [ -d "$$d" ]; then \
grep -qxF "$$d/" .graphifyignore || echo "$$d/" >> .graphifyignore; \
fi; \
done
@echo ">> Setup concluído. .graphifyignore atualizado."
# ---------------------------------------------------------------------------
init: setup
@echo ">> Inicializando KB a partir de $(RAW) (runner=$(RUNNER), model=$(MODEL), format=$(FORMAT))..."
$(RUN) $(PFLAG) "/graphify $(RAW) $(GRAPHIFY_FLAGS)"
# ---------------------------------------------------------------------------
update: setup
@echo ">> Atualizando KB com base em $(RAW) (runner=$(RUNNER), model=$(MODEL), format=$(FORMAT))..."
$(RUN) $(PFLAG) "/graphify $(RAW) --update $(GRAPHIFY_FLAGS)"
# ---------------------------------------------------------------------------
clean:
@echo ">> Removendo $(OUT)..."
@rm -rf $(OUT)
@echo ">> Limpo."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment