Created
July 13, 2026 22:53
-
-
Save wagnerpinheiro/947b27b963d817b7968e505bbb8062f0 to your computer and use it in GitHub Desktop.
Automação para KB local
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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