## Description Auto-ingest knowledge from external tools at session end and on schedule. ### LoreIngester ABC ```python class LoreIngester(ABC): trigger: Literal["hook", "scheduled", "manual"] review_policy: Literal["immediate", "pr_based"] @abstractmethod def detect(self, project_dir: Path) -> bool: ... @abstractmethod def extract_delta(self, since: datetime | None) -> list[KnowledgeEntry]: ... @abstractmethod def transform(self, entries: list[KnowledgeEntry]) -> list[KnowledgeEntry]: ... @abstractmethod def load(self, entries: list[KnowledgeEntry]) -> None: ... ``` ### Session-End Auto-Detection ``` session ends → hook fires → detect local sources: .wolf/ exists? → OpenWolfIngester reasons.db exists? → ReasonsDBIngester MEMORY.md exists? → OpenClawIngester → ingest deltas, log summary ``` ### Adapters | Source | Trigger | Review | Detect | |--------|---------|--------|--------| | ReasonsForge | hook + manual | Immediate (pre-verified) | \`reasons.db\` exists | | OpenWolf | hook | PR-based | \`.wolf/\` exists | | OpenClaw | hook | Immediate (personal) | \`MEMORY.md\` exists | | sdlc-mcp | scheduled + manual | Immediate (human-authored) | MCP config found | | context-server | scheduled + manual | Immediate | DB path configured | | Jira | scheduled | PR-based | Jira project configured | ### CLI \`lore ingest --source <name> [--since <date>]\` ### Provenance Each ingested entry: \`ingested_from\` field + source-specific metadata. ## Acceptance - [ ] LoreIngester ABC defined - [ ] Session-end hook auto-detects local sources - [ ] At least 2 adapters implemented (ReasonsForge + OpenWolf) - [ ] \`lore ingest\` CLI works - [ ] Provenance tracking on every ingested entry - [ ] Dedup via cosine distance on ingest ## Dependencies - MVP complete - #14 (hybrid search — dedup on ingest uses cosine distance)
Activity
itdove commentedon Jul 26, 2026
Pull request created: #81
itdove commentedon Jul 26, 2026
✅ Session Complete
Project: lore
Goal: #16: Ingester framework: LoreIngester ABC + adapters
Time Spent:
0h 28m total
Branch: 16
Already done — implemented that while you were typing.
Config added to
src/lore/config/models.py:Wired into:
detect_ingesters()in registry — skips names indisabled_sourcescfg.ingest.enabledbefore running, passesdisabled_sourceslore ingest --detect— respects config tooConfig example (in global or project
lore.json):{ "lore": { "ingest": { "enabled": true, "disabled_sources": ["reasonsforge"] } } }Set
"enabled": falseto turn off all auto-ingestion on session-end hooks. Or selectively disable specific sources viadisabled_sourceslist.Generated by DevAIFlow
Merge pull request #81 from itdove/16