1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Ingestion API
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
All ingesters accept a `GraphStore` instance and return an `IngestionResult` dataclass.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from navegador.graph import GraphStore
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from navegador.ingest import RepoIngester, KnowledgeIngester, WikiIngester, PlanopticonIngester
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## IngestionResult
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
@dataclass
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class IngestionResult:
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
nodes_created: int
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
nodes_updated: int
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
edges_created: int
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
files_processed: int
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
errors: list[str]
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
duration_seconds: float
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## RepoIngester
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Parses a source tree and writes code layer nodes and edges.
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class RepoIngester:
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def __init__(self, store: GraphStore) -> None: ...
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest(
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
clear: bool = False,
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
incremental: bool = False,
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
redact: bool = False,
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
monorepo: bool = False,
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest_file(
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
redact: bool = False,
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Usage
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store = GraphStore.sqlite(".navegador/navegador.db")
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ingester = RepoIngester(store)
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# full repo ingest
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest("./src")
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
print(f"{result.nodes_created} nodes, {result.edges_created} edges")
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# incremental ingest — only reprocesses files whose content hash has changed
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest("./src", incremental=True)
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# incremental: single file
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest_file("./src/auth/service.py")
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# wipe + rebuild
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest("./src", clear=True)
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# redact sensitive content (strips tokens, passwords, keys from string literals)
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest("./src", redact=True)
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# monorepo — traverse workspace sub-packages
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest("./monorepo", monorepo=True)
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Supported languages
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Language | File extensions | Parser | Extra required |
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|---|
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Python | `.py` | tree-sitter-python | — (included) |
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| TypeScript | `.ts`, `.tsx` | tree-sitter-typescript | — (included) |
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| JavaScript | `.js`, `.jsx` | tree-sitter-javascript | — (included) |
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Go | `.go` | tree-sitter-go | — (included) |
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Rust | `.rs` | tree-sitter-rust | — (included) |
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Java | `.java` | tree-sitter-java | — (included) |
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Kotlin | `.kt`, `.kts` | tree-sitter-kotlin | `navegador[languages]` |
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| C# | `.cs` | tree-sitter-c-sharp | `navegador[languages]` |
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| PHP | `.php` | tree-sitter-php | `navegador[languages]` |
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Ruby | `.rb` | tree-sitter-ruby | `navegador[languages]` |
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Swift | `.swift` | tree-sitter-swift | `navegador[languages]` |
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| C | `.c`, `.h` | tree-sitter-c | `navegador[languages]` |
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| C++ | `.cpp`, `.cc`, `.cxx`, `.hpp` | tree-sitter-cpp | `navegador[languages]` |
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Adding a new language parser
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. Install the tree-sitter grammar: `pip install tree-sitter-<lang>`
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. Subclass `navegador.ingest.base.LanguageParser`:
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from navegador.ingest.base import LanguageParser, ParseResult
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
105
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class RubyParser(LanguageParser):
106
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
language = "ruby"
107
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
extensions = [".rb"]
108
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
109
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def parse(self, source: str, file_path: str) -> ParseResult:
110
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# use self.tree_sitter_language to build the tree
111
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# return ParseResult with nodes and edges
112
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
...
113
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
114
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
115
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. Register in `navegador/ingest/registry.py`:
116
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
117
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
118
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from .ruby import RubyParser
119
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
PARSERS["ruby"] = RubyParser
120
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
121
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
122
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`RepoIngester` dispatches to registered parsers by file extension.
123
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
124
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Framework enrichers
125
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
126
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
After parsing, `RepoIngester` runs framework-specific enrichers that annotate nodes with framework context. Enrichers are discovered automatically based on what frameworks are detected in the repo.
127
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
128
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Framework | What gets enriched |
129
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|
130
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Django | Models, views, URL patterns, admin registrations |
131
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| FastAPI | Route handlers, dependency injections, Pydantic schemas |
132
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| React | Components, hooks, prop types |
133
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Express | Route handlers, middleware chains |
134
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| React Native | Screens, navigators |
135
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Rails | Controllers, models, routes |
136
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Spring Boot | Beans, controllers, repositories |
137
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Laravel | Controllers, models, routes |
138
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
139
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
140
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
141
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## KnowledgeIngester
142
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
143
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Writes knowledge layer nodes. Wraps the `navegador add` commands programmatically.
144
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
145
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
146
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class KnowledgeIngester:
147
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def __init__(self, store: GraphStore) -> None: ...
148
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
149
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def add_concept(
150
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
151
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: str,
152
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
153
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
description: str = "",
154
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
domain: str = "",
155
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
status: str = "",
156
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str: ... # returns node ID
157
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
158
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def add_rule(
159
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
160
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: str,
161
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
162
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
description: str = "",
163
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
domain: str = "",
164
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
severity: str = "info",
165
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
rationale: str = "",
166
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str: ...
167
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
168
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def add_decision(
169
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
170
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: str,
171
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
172
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
description: str = "",
173
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
domain: str = "",
174
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
rationale: str = "",
175
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
alternatives: str = "",
176
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
date: str = "",
177
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
status: str = "proposed",
178
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str: ...
179
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
180
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def add_person(
181
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
182
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: str,
183
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
184
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
email: str = "",
185
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
role: str = "",
186
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
team: str = "",
187
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str: ...
188
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
189
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def add_domain(
190
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
191
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name: str,
192
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
193
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
description: str = "",
194
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> str: ...
195
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
196
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def annotate(
197
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
198
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
code_name: str,
199
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
200
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
node_type: str = "Function",
201
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
concept: str = "",
202
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
rule: str = "",
203
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> None: ...
204
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
205
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
206
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Usage
207
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
208
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
209
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store = GraphStore.sqlite(".navegador/navegador.db")
210
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ingester = KnowledgeIngester(store)
211
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
212
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ingester.add_domain("Payments", description="Payment processing and billing")
213
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ingester.add_concept("Idempotency", domain="Payments",
214
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
description="Operations safe to retry without side effects")
215
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ingester.add_rule("RequireIdempotencyKey",
216
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
domain="Payments", severity="critical",
217
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
rationale="Card networks retry on timeout")
218
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ingester.annotate("process_payment", node_type="Function",
219
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
concept="Idempotency", rule="RequireIdempotencyKey")
220
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
221
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
222
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
223
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
224
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## WikiIngester
225
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
226
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Fetches GitHub wiki pages and writes `WikiPage` nodes.
227
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
228
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
229
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class WikiIngester:
230
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def __init__(self, store: GraphStore) -> None: ...
231
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
232
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest_repo(
233
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
234
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
repo: str,
235
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
236
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
token: str = "",
237
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
use_api: bool = False,
238
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
239
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
240
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest_dir(
241
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
242
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
243
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
244
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
245
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
246
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Usage
247
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
248
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
249
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
import os
250
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store = GraphStore.sqlite(".navegador/navegador.db")
251
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
ingester = WikiIngester(store)
252
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
253
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# from GitHub API
254
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest_repo("myorg/myrepo", token=os.environ["GITHUB_TOKEN"])
255
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
256
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# from local clone
257
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
result = ingester.ingest_dir("./myrepo.wiki")
258
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
259
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
260
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
261
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
262
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## PlanopticonIngester
263
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
264
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Ingests Planopticon knowledge graph output into the knowledge layer.
265
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
266
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
267
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class PlanopticonIngester:
268
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def __init__(self, store: GraphStore) -> None: ...
269
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
270
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest(
271
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
272
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
273
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
274
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
input_type: str = "auto",
275
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source: str = "",
276
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
277
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
278
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest_manifest(
279
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
280
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
281
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
282
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source: str = "",
283
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
284
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
285
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest_kg(
286
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
287
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
288
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
289
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source: str = "",
290
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
291
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
292
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest_interchange(
293
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
294
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
295
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
296
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source: str = "",
297
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
298
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
299
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
def ingest_batch(
300
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
self,
301
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
path: str | Path,
302
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
*,
303
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
source: str = "",
304
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
) -> IngestionResult: ...
305
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
306
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
307
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
`input_type` values: `"auto"`, `"manifest"`, `"kg"`, `"interchange"`, `"batch"`.
308
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
309
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
See [Planopticon guide](../guide/planopticon.md) for format details and entity mapping.
310
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
311
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
312
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
313
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Export and import
314
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
315
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Navegador can export the full graph (or a subset) to JSONL for backup, migration, or sharing. The JSONL format is one JSON object per line, where each object is either a node or an edge.
316
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
317
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
318
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
navegador export > graph.jsonl
319
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
navegador export --nodes-only > nodes.jsonl
320
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
navegador import graph.jsonl
321
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
322
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
323
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Python API:
324
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
325
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
326
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from navegador.graph import GraphStore
327
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
328
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store = GraphStore.sqlite(".navegador/navegador.db")
329
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
330
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# export
331
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
with open("graph.jsonl", "w") as f:
332
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store.export_jsonl(f)
333
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
334
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# import into a new store
335
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
new_store = GraphStore.sqlite(".navegador/new.db")
336
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
with open("graph.jsonl") as f:
337
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
new_store.import_jsonl(f)
338
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
339
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
340
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
---
341
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
342
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Schema migrations
343
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
344
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
When upgrading navegador, run `navegador migrate` before re-ingesting to apply schema changes (new node properties, new edge types, index updates):
345
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
346
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
347
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
navegador migrate
348
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
349
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
350
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Migrations are idempotent — safe to run multiple times. The migration state is stored in the graph itself under a `_MigrationState` node.
351
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
352
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Python API:
353
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
354
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
355
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
from navegador.graph import GraphStore, migrate
356
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
357
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
store = GraphStore.sqlite(".navegador/navegador.db")
358
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
migrate(store) # applies any pending migrations
359
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
360
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!