Configuration — config.yaml & ignore files
The .repowise/ directory, the config.yaml file repowise generates on first init, and how to control which files get indexed with .gitignore, nested .gitignore, .repowiseIgnore, and --exclude.
Everything repowise knows about a repository lives in a .repowise/
directory at the repo root, created on the first
repowise init. The main configuration file is
.repowise/config.yaml — repowise writes it for you during init, and
you can edit it by hand afterwards.
The .repowise/ directory
.repowise/
├── wiki.db # SQLite — pages, symbols, graph, git metadata, decisions
├── lancedb/ # Vector search index
├── omissions/ # Distill omission store + savings ledger (omissions.db)
├── config.yaml # Provider, model, embedder, exclude patterns
├── health-rules.json # Per-file code-health marker overrides
├── state.json # Last sync commit, page counts, token usage
├── mcp.json # MCP server configuration
└── .env # API keys (gitignored automatically)repowise adds .repowise/ to your .gitignore automatically. It's a
local cache, not a source of truth — don't commit it.
config.yaml
Generated after the first init and updated when you pass flags like
--commit-limit or --follow-renames. You can also edit it directly;
changes take effect on the next init, update, serve, or mcp run.
config.yaml has no schema validation. It's loaded as a plain YAML
dict, so an unknown or misspelled key is silently ignored — it won't
error and won't take effect. The only part that's validated is the
distill: block, and only when you run repowise doctor. If a setting
doesn't seem to take effect, check spelling and indentation first.
provider: anthropic # LLM provider
model: claude-sonnet-4-6 # Model identifier
embedder: gemini # Embedding provider for semantic search
reasoning: auto # auto | off | none | minimal | low | medium | high | xhigh | max
exclude_patterns: # Gitignore-style patterns
- vendor/
- "*.generated.*"
- proto/
commit_limit: 500 # Max commits per file for git analysis
follow_renames: false # Track file renames in git history
enable_onboarding: true # Show first-run onboarding promptsProp
Type
Provider keys and a few runtime knobs are set via environment
variables, not config.yaml — see
Environment variables. Code-health rules
are configured separately in .repowise/health-rules.json.
The distill: block
Controls output distillation for this repo.
Everything defaults sensibly when the block is absent; repowise doctor
validates it.
distill:
enabled: true # master switch for this repo
commands:
enabled: true # the command path (CLI + hook rewrites)
permission: ask # ask | allow | off — rewrite-hook posture
families: # per-filter overrides
test_output: allow # auto-allow rewrites for test runs
git_diff: deny # never rewrite git diff here
disabled_filters: [] # filters to skip entirely, e.g. [logs]
omission_store:
ttl_days: 7 # prune stored omissions after this many days
max_mb: 50 # size cap; oldest entries pruned firstfamilies keys are filter names (test_output, build_output,
lint_output, git_status, git_log, git_diff, search_results,
file_listing, logs) and accept ask | allow | off | deny. Declining
the repowise init opt-in prompt writes commands.enabled: false, so a
rewrite hook installed globally from another repo stays inert here.
Under Codex, only families set to allow are rewritten — its hook
protocol has no ask-with-mutation (see Distill).
The refactoring: block
Controls the refactoring-intelligence layer: the structured Extract
Class / Extract Helper / Move Method / Break Cycle / Split File plans
surfaced by repowise health --refactoring-targets,
get_health(include=["refactoring"]), and the web Refactoring tab.
refactoring:
enabled: true # the deterministic plans (zero LLM, in the health pass)
detectors:
disabled: [] # e.g. [move_method] to silence one detector
min_confidence: null # low | medium | high (confidence floor; null = no floor)
llm:
enabled: true # code generation, on by default; set false to disableThe deterministic layer is zero-LLM and runs in the init / update
health pass. Code generation is the only part that calls a provider —
it's on by default but never runs during indexing, only on an explicit
request (set llm.enabled: false to disable it). enabled: false
skips the whole deterministic detector pass; detectors.disabled
silences named detectors while the rest keep running.
skip_tests, skip_infra, and include_submodules are CLI-flag-only
— --skip-tests, --skip-infra, --include-submodules — they don't
persist to config.yaml, so pass them again on each init/update
run if you want the same exclusions.
Controlling what gets indexed
repowise decides which files to document using, in order:
.gitignore— respected automatically, using the samegitwildmatchformat git uses. repowise reads the repo-root.gitignoreand nested.gitignorefiles in subdirectories, just like git: a.gitignorein any directory applies to that directory's contents..repowiseIgnore— same syntax as.gitignore, for repowise-only exclusions you don't want in git. Honoured at the repo root and in any subdirectory.exclude_patterns/--exclude— extra patterns from the CLI, persisted toconfig.yamland reapplied on everyupdate.- Built-in exclusions (always applied):
.git/,.repowise/,node_modules/,.venv/,dist/,build/,__pycache__/, binary files, lockfiles, and minified assets (*.min.js,*.min.css).
Monorepos & yarn/npm workspaces — because nested .gitignore files
are honoured, a workspace package that keeps its own .gitignore
(excluding that package's build output, generated bundles, coverage,
etc.) is respected without any extra configuration. You don't need to
duplicate those patterns at the repo root.
Add extra patterns on the command line — they're saved to config.yaml
and reused by later update runs:
repowise init -x vendor/ -x "*.generated.ts" -x proto/ -x "**/*.pb.go"Or drop a .repowiseIgnore file at the repo root or in any subdirectory
for granular control without touching .gitignore:
# packages/web/.repowiseIgnore
generated/
*.stories.tsxYou can also skip categories of files with flags: --skip-tests
excludes test files, and --skip-infra excludes Dockerfiles, Makefiles,
and shell scripts.
Submodules
Git submodule directories are excluded by default (repowise reads
.gitmodules to detect them). Include them with:
repowise init --include-submodules