Deep analysis of the full `lore` CLI command surface (34 commands across 6 categories) covering command inventory, data flow, overlap analysis, and optimization proposals. Document structure: - Main consolidated doc: docs/command-surface-analysis.md (1251 lines) - Split sections in docs/command-surface-analysis/ for navigation: 00-overview.md - Summary, inventory, priorities 01-entity-commands.md - issues, mrs, notes, search, count 02-intelligence-commands.md - who, timeline, me, file-history, trace, related, drift 03-pipeline-and-infra.md - sync, ingest, generate-docs, embed, diagnostics 04-data-flow.md - Shared data source map, command network graph 05-overlap-analysis.md - Quantified overlap percentages for every command pair 06-agent-workflows.md - Common agent flows, round-trip costs, token profiles 07-consolidation-proposals.md - 5 proposals to reduce 34 commands to 29 08-robot-optimization-proposals.md - 6 proposals for --include, --batch, --depth 09-appendices.md - Robot output envelope, field presets, exit codes Key findings: - High overlap pairs: who-workload/me (~85%), health/doctor (~90%) - 5 consolidation proposals to reduce command count by 15% - 6 robot-mode optimization proposals targeting agent round-trip reduction - Full DB table mapping and data flow documentation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1252 lines
42 KiB
Markdown
1252 lines
42 KiB
Markdown
# Lore Command Surface Analysis
|
|
|
|
**Date:** 2026-02-26
|
|
**Version:** v0.9.1 (439c20e)
|
|
**Scope:** Full command inventory, overlap analysis, consolidation proposals, robot-mode optimization proposals
|
|
|
|
---
|
|
|
|
## 1. Command Inventory
|
|
|
|
34 commands across 6 categories.
|
|
|
|
| Category | Commands | Count |
|
|
|---|---|---|
|
|
| Entity Query | `issues`, `mrs`, `notes`, `search`, `count` | 5 |
|
|
| Intelligence | `who` (5 modes), `timeline`, `related`, `drift`, `me`, `file-history`, `trace` | 7 (11 with who sub-modes) |
|
|
| Data Pipeline | `sync`, `ingest`, `generate-docs`, `embed` | 4 |
|
|
| Diagnostics | `health`, `auth`, `doctor`, `status`, `stats` | 5 |
|
|
| Setup | `init`, `token`, `cron`, `migrate` | 4 |
|
|
| Meta | `version`, `completions`, `robot-docs` | 3 |
|
|
|
|
### 1.1 Entity Query Commands
|
|
|
|
#### `issues` (alias: `issue`)
|
|
|
|
List or show issues from local database.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `[IID]` | positional | — | Omit to list, provide to show detail |
|
|
| `-n, --limit` | int | 50 | Max results |
|
|
| `--fields` | string | — | Select output columns (preset: `minimal`) |
|
|
| `-s, --state` | enum | — | `opened\|closed\|all` |
|
|
| `-p, --project` | string | — | Filter by project (fuzzy) |
|
|
| `-a, --author` | string | — | Filter by author username |
|
|
| `-A, --assignee` | string | — | Filter by assignee username |
|
|
| `-l, --label` | string[] | — | Filter by labels (AND logic, repeatable) |
|
|
| `-m, --milestone` | string | — | Filter by milestone title |
|
|
| `--status` | string[] | — | Filter by work-item status (COLLATE NOCASE, OR logic) |
|
|
| `--since` | duration/date | — | Filter by created date (`7d`, `2w`, `YYYY-MM-DD`) |
|
|
| `--due-before` | date | — | Filter by due date |
|
|
| `--has-due` | flag | — | Show only issues with due dates |
|
|
| `--sort` | enum | `updated` | `updated\|created\|iid` |
|
|
| `--asc` | flag | — | Sort ascending |
|
|
| `-o, --open` | flag | — | Open first match in browser |
|
|
|
|
**DB tables:** `issues`, `projects`, `issue_assignees`, `issue_labels`, `labels`
|
|
**Detail mode adds:** `discussions`, `notes`, `entity_references` (closing MRs)
|
|
|
|
**Robot output (list):**
|
|
```json
|
|
{
|
|
"ok": true,
|
|
"data": {
|
|
"issues": [
|
|
{
|
|
"iid": 42, "title": "Fix auth", "state": "opened",
|
|
"author_username": "jdoe", "labels": ["backend"],
|
|
"assignees": ["jdoe"], "discussion_count": 3,
|
|
"unresolved_count": 1, "created_at_iso": "...",
|
|
"updated_at_iso": "...", "web_url": "...",
|
|
"project_path": "group/repo",
|
|
"status_name": "In progress"
|
|
}
|
|
],
|
|
"total_count": 150, "showing": 50
|
|
},
|
|
"meta": { "elapsed_ms": 40, "available_statuses": ["Open", "In progress", "Closed"] }
|
|
}
|
|
```
|
|
|
|
**Minimal preset:** `iid`, `title`, `state`, `updated_at_iso`
|
|
|
|
---
|
|
|
|
#### `mrs` (aliases: `mr`, `merge-request`, `merge-requests`)
|
|
|
|
List or show merge requests.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `[IID]` | positional | — | Omit to list, provide to show detail |
|
|
| `-n, --limit` | int | 50 | Max results |
|
|
| `--fields` | string | — | Select output columns (preset: `minimal`) |
|
|
| `-s, --state` | enum | — | `opened\|merged\|closed\|locked\|all` |
|
|
| `-p, --project` | string | — | Filter by project |
|
|
| `-a, --author` | string | — | Filter by author |
|
|
| `-A, --assignee` | string | — | Filter by assignee |
|
|
| `-r, --reviewer` | string | — | Filter by reviewer |
|
|
| `-l, --label` | string[] | — | Filter by labels (AND) |
|
|
| `--since` | duration/date | — | Filter by created date |
|
|
| `-d, --draft` | flag | — | Draft MRs only |
|
|
| `-D, --no-draft` | flag | — | Exclude drafts |
|
|
| `--target` | string | — | Filter by target branch |
|
|
| `--source` | string | — | Filter by source branch |
|
|
| `--sort` | enum | `updated` | `updated\|created\|iid` |
|
|
| `--asc` | flag | — | Sort ascending |
|
|
| `-o, --open` | flag | — | Open in browser |
|
|
|
|
**DB tables:** `merge_requests`, `projects`, `mr_reviewers`, `mr_labels`, `labels`, `mr_assignees`
|
|
**Detail mode adds:** `discussions`, `notes`, `mr_diffs`
|
|
|
|
**Minimal preset:** `iid`, `title`, `state`, `updated_at_iso`
|
|
|
|
---
|
|
|
|
#### `notes` (alias: `note`)
|
|
|
|
List discussion notes/comments with fine-grained filters.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `-n, --limit` | int | 50 | Max results |
|
|
| `--fields` | string | — | Preset: `minimal` |
|
|
| `-a, --author` | string | — | Filter by author |
|
|
| `--note-type` | enum | — | `DiffNote\|DiscussionNote` |
|
|
| `--contains` | string | — | Body text substring filter |
|
|
| `--note-id` | int | — | Internal note ID |
|
|
| `--gitlab-note-id` | int | — | GitLab note ID |
|
|
| `--discussion-id` | string | — | Discussion ID filter |
|
|
| `--include-system` | flag | — | Include system notes |
|
|
| `--for-issue` | int | — | Notes on specific issue (requires `-p`) |
|
|
| `--for-mr` | int | — | Notes on specific MR (requires `-p`) |
|
|
| `-p, --project` | string | — | Scope to project |
|
|
| `--since` | duration/date | — | Created after |
|
|
| `--until` | date | — | Created before (inclusive) |
|
|
| `--path` | string | — | File path filter (exact or prefix with `/`) |
|
|
| `--resolution` | enum | — | `any\|unresolved\|resolved` |
|
|
| `--sort` | enum | `created` | `created\|updated` |
|
|
| `--asc` | flag | — | Sort ascending |
|
|
| `--open` | flag | — | Open in browser |
|
|
|
|
**DB tables:** `notes`, `discussions`, `projects`, `issues`, `merge_requests`
|
|
|
|
**Minimal preset:** `id`, `author_username`, `body`, `created_at_iso`
|
|
|
|
---
|
|
|
|
#### `search` (aliases: `find`, `query`)
|
|
|
|
Semantic + full-text search across indexed documents.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `<QUERY>` | positional | required | Search query string |
|
|
| `--mode` | enum | `hybrid` | `lexical\|hybrid\|semantic` |
|
|
| `--type` | enum | — | `issue\|mr\|discussion\|note` |
|
|
| `--author` | string | — | Filter by author |
|
|
| `-p, --project` | string | — | Scope to project |
|
|
| `--label` | string[] | — | Filter by labels (AND) |
|
|
| `--path` | string | — | File path filter |
|
|
| `--since` | duration/date | — | Created after |
|
|
| `--updated-since` | duration/date | — | Updated after |
|
|
| `-n, --limit` | int | 20 | Max results (max: 100) |
|
|
| `--fields` | string | — | Preset: `minimal` |
|
|
| `--explain` | flag | — | Show ranking breakdown |
|
|
| `--fts-mode` | enum | `safe` | `safe\|raw` |
|
|
|
|
**DB tables:** `documents`, `documents_fts` (FTS5), `embeddings` (vec0), `document_labels`, `document_paths`, `projects`
|
|
|
|
**Robot output:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"query": "authentication bug",
|
|
"mode": "hybrid",
|
|
"total_results": 15,
|
|
"results": [
|
|
{
|
|
"document_id": 1234, "source_type": "issue",
|
|
"title": "Fix SSO auth", "url": "...",
|
|
"author": "jdoe", "project_path": "group/repo",
|
|
"labels": ["auth"], "paths": ["src/auth/"],
|
|
"snippet": "...matching text...",
|
|
"score": 0.85,
|
|
"explain": { "vector_rank": 2, "fts_rank": 1, "rrf_score": 0.85 }
|
|
}
|
|
],
|
|
"warnings": []
|
|
}
|
|
}
|
|
```
|
|
|
|
**Minimal preset:** `document_id`, `title`, `source_type`, `score`
|
|
|
|
---
|
|
|
|
#### `count`
|
|
|
|
Count entities in local database.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `<ENTITY>` | positional | required | `issues\|mrs\|discussions\|notes\|events` |
|
|
| `-f, --for` | enum | — | Parent type: `issue\|mr` |
|
|
|
|
**DB tables:** Conditional aggregation on `issues`, `merge_requests`, `discussions`, `notes`, event tables
|
|
|
|
**Robot output:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"entity": "merge_requests",
|
|
"count": 1234,
|
|
"breakdown": { "opened": 100, "closed": 50, "merged": 1084 }
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 1.2 Intelligence Commands
|
|
|
|
#### `who` (People Intelligence)
|
|
|
|
Five sub-modes, dispatched by argument shape.
|
|
|
|
| Mode | Trigger | Purpose |
|
|
|---|---|---|
|
|
| **expert** | `who <path>` or `who --path <path>` | Who knows about a code area? |
|
|
| **workload** | `who @username` | What is this person working on? |
|
|
| **reviews** | `who @username --reviews` | Review pattern analysis |
|
|
| **active** | `who --active` | Unresolved discussions needing attention |
|
|
| **overlap** | `who --overlap <path>` | Who else touches these files? |
|
|
|
|
**Shared flags:**
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `-p, --project` | string | — | Scope to project |
|
|
| `-n, --limit` | int | varies | Max results (1-500) |
|
|
| `--fields` | string | — | Preset: `minimal` |
|
|
| `--since` | duration/date | — | Time window |
|
|
| `--include-bots` | flag | — | Include bot users |
|
|
| `--include-closed` | flag | — | Include closed issues/MRs |
|
|
| `--all-history` | flag | — | Query all history |
|
|
|
|
**Expert-only flags:** `--detail` (per-MR breakdown), `--as-of` (score at point in time), `--explain-score` (score breakdown)
|
|
|
|
**DB tables by mode:**
|
|
|
|
| Mode | Primary Tables |
|
|
|---|---|
|
|
| expert | `notes` (INDEXED BY idx_notes_diffnote_path_created), `merge_requests`, `mr_reviewers` |
|
|
| workload | `issues`, `merge_requests`, `mr_reviewers` |
|
|
| reviews | `merge_requests`, `discussions`, `notes` |
|
|
| active | `discussions`, `notes`, `issues`, `merge_requests` |
|
|
| overlap | `notes`, `mr_file_changes`, `merge_requests` |
|
|
|
|
**Robot output (expert):**
|
|
```json
|
|
{
|
|
"data": {
|
|
"mode": "expert",
|
|
"result": {
|
|
"experts": [
|
|
{ "username": "jdoe", "score": 42.5, "detail": { "mr_ids_author": [99, 101] } }
|
|
]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Minimal presets:** expert: `username, score` | workload: `iid, title, state` | reviews: `name, count, percentage` | active: `entity_type, iid, title, participants` | overlap: `username, touch_count`
|
|
|
|
---
|
|
|
|
#### `timeline`
|
|
|
|
Reconstruct chronological event history for a topic/entity with cross-reference expansion.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `<QUERY>` | positional | required | Search text or entity ref (`issue:42`, `mr:99`) |
|
|
| `-p, --project` | string | — | Scope to project |
|
|
| `--since` | duration/date | — | Filter events after |
|
|
| `--depth` | int | 1 | Cross-ref expansion depth (0=none) |
|
|
| `--no-mentions` | flag | — | Skip "mentioned" edges, keep "closes"/"related" |
|
|
| `-n, --limit` | int | 100 | Max events |
|
|
| `--fields` | string | — | Preset: `minimal` |
|
|
| `--max-seeds` | int | 10 | Max seed entities from search |
|
|
| `--max-entities` | int | 50 | Max expanded entities |
|
|
| `--max-evidence` | int | 10 | Max evidence notes |
|
|
|
|
**Pipeline:** SEED -> HYDRATE -> EXPAND -> COLLECT -> RENDER
|
|
|
|
**DB tables:** `issues`, `merge_requests`, `discussions`, `notes`, `entity_references`, `resource_state_events`, `resource_label_events`, `resource_milestone_events`, `documents` (for search seeding)
|
|
|
|
**Robot output:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"query": "authentication", "event_count": 25,
|
|
"seed_entities": [{ "type": "issue", "iid": 42, "project": "group/repo" }],
|
|
"expanded_entities": [
|
|
{ "type": "mr", "iid": 99, "project": "group/repo", "depth": 1,
|
|
"via": { "from": { "type": "issue", "iid": 42 }, "reference_type": "closes" } }
|
|
],
|
|
"events": [
|
|
{
|
|
"timestamp": "2026-01-15T10:30:00Z", "entity_type": "issue",
|
|
"entity_iid": 42, "project": "group/repo",
|
|
"event_type": "state_changed", "summary": "Reopened",
|
|
"actor": "jdoe", "is_seed": true,
|
|
"evidence_notes": [{ "author": "jdoe", "snippet": "..." }]
|
|
}
|
|
]
|
|
},
|
|
"meta": {
|
|
"elapsed_ms": 150, "search_mode": "fts",
|
|
"expansion_depth": 1, "include_mentions": true,
|
|
"total_entities": 5, "total_events": 25
|
|
}
|
|
}
|
|
```
|
|
|
|
**Minimal preset:** `timestamp`, `type`, `entity_iid`, `detail`
|
|
|
|
---
|
|
|
|
#### `me` (Personal Dashboard)
|
|
|
|
Personal work dashboard with issues, MRs, activity, and since-last-check inbox.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `--issues` | flag | — | Open issues section only |
|
|
| `--mrs` | flag | — | MRs section only |
|
|
| `--activity` | flag | — | Activity feed only |
|
|
| `--since` | duration/date | `30d` | Activity window |
|
|
| `-p, --project` | string | — | Scope to one project |
|
|
| `--all` | flag | — | All synced projects |
|
|
| `--user` | string | — | Override configured username |
|
|
| `--fields` | string | — | Preset: `minimal` |
|
|
| `--reset-cursor` | flag | — | Clear since-last-check cursor |
|
|
|
|
**Sections (no flags = all):** Issues, MRs authored, MRs reviewing, Activity feed, Inbox (since last check)
|
|
|
|
**DB tables:** `issues`, `merge_requests`, `resource_state_events`, `projects`, `issue_labels`, `mr_labels`
|
|
|
|
**Robot output:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"username": "jdoe",
|
|
"summary": {
|
|
"project_count": 3, "open_issue_count": 5,
|
|
"authored_mr_count": 2, "reviewing_mr_count": 1,
|
|
"needs_attention_count": 3
|
|
},
|
|
"since_last_check": {
|
|
"cursor_iso": "2026-02-25T18:00:00Z",
|
|
"total_event_count": 8,
|
|
"groups": [
|
|
{
|
|
"entity_type": "issue", "entity_iid": 42,
|
|
"entity_title": "Fix auth", "project": "group/repo",
|
|
"events": [
|
|
{ "timestamp_iso": "...", "event_type": "comment",
|
|
"actor": "reviewer", "summary": "New comment" }
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"open_issues": [
|
|
{ "project": "group/repo", "iid": 42, "title": "Fix auth",
|
|
"state": "opened", "attention_state": "needs_attention",
|
|
"status_name": "In progress", "labels": ["auth"],
|
|
"updated_at_iso": "..." }
|
|
],
|
|
"open_mrs_authored": [...],
|
|
"reviewing_mrs": [...],
|
|
"activity": [...]
|
|
}
|
|
}
|
|
```
|
|
|
|
**Minimal presets:** Items: `iid, title, attention_state, updated_at_iso` | Activity: `timestamp_iso, event_type, entity_iid, actor`
|
|
|
|
---
|
|
|
|
#### `file-history`
|
|
|
|
Show which MRs touched a file, with linked discussions.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `<PATH>` | positional | required | File path to trace |
|
|
| `-p, --project` | string | — | Scope to project |
|
|
| `--discussions` | flag | — | Include DiffNote snippets |
|
|
| `--no-follow-renames` | flag | — | Skip rename chain resolution |
|
|
| `--merged` | flag | — | Only merged MRs |
|
|
| `-n, --limit` | int | 50 | Max MRs |
|
|
|
|
**DB tables:** `mr_file_changes`, `merge_requests`, `notes` (DiffNotes), `projects`
|
|
|
|
**Robot output:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"path": "src/auth/middleware.rs",
|
|
"rename_chain": [
|
|
{ "previous_path": "src/auth.rs", "mr_iid": 55, "merged_at": "..." }
|
|
],
|
|
"merge_requests": [
|
|
{ "iid": 99, "title": "Refactor auth", "state": "merged",
|
|
"author": "jdoe", "merged_at": "...", "change_type": "modified" }
|
|
],
|
|
"discussions": [
|
|
{ "discussion_id": 123, "mr_iid": 99, "author": "reviewer",
|
|
"body_snippet": "...", "path": "src/auth/middleware.rs" }
|
|
]
|
|
},
|
|
"meta": { "elapsed_ms": 30, "total_mrs": 5, "renames_followed": true }
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `trace`
|
|
|
|
File -> MR -> issue -> discussion chain to understand why code was introduced.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `<PATH>` | positional | required | File path (future: `:line` suffix) |
|
|
| `-p, --project` | string | — | Scope to project |
|
|
| `--discussions` | flag | — | Include DiffNote snippets |
|
|
| `--no-follow-renames` | flag | — | Skip rename chain |
|
|
| `-n, --limit` | int | 20 | Max chains |
|
|
|
|
**DB tables:** `mr_file_changes`, `merge_requests`, `issues`, `discussions`, `notes`, `entity_references`
|
|
|
|
**Robot output:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"path": "src/auth/middleware.rs",
|
|
"resolved_paths": ["src/auth/middleware.rs", "src/auth.rs"],
|
|
"trace_chains": [
|
|
{
|
|
"mr_iid": 99, "mr_title": "Refactor auth", "mr_state": "merged",
|
|
"mr_author": "jdoe", "change_type": "modified",
|
|
"merged_at_iso": "...", "web_url": "...",
|
|
"issues": [42],
|
|
"discussions": [
|
|
{ "discussion_id": 123, "author_username": "reviewer",
|
|
"body_snippet": "...", "path": "src/auth/middleware.rs" }
|
|
]
|
|
}
|
|
]
|
|
},
|
|
"meta": { "tier": "api_only", "total_chains": 3, "renames_followed": 1 }
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `related`
|
|
|
|
Find semantically related entities via vector search.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `<QUERY_OR_TYPE>` | positional | required | Entity type (`issues`, `mrs`) or free text |
|
|
| `[IID]` | positional | — | Entity IID (required with entity type) |
|
|
| `-n, --limit` | int | 10 | Max results |
|
|
| `-p, --project` | string | — | Scope to project |
|
|
|
|
**Two modes:**
|
|
- Entity mode: `related issues 42` — find entities similar to issue #42
|
|
- Query mode: `related "auth flow"` — find entities matching free text
|
|
|
|
**DB tables:** `documents`, `embeddings` (vec0), `projects`
|
|
|
|
**Requires:** Ollama running (for query mode embedding)
|
|
|
|
---
|
|
|
|
#### `drift`
|
|
|
|
Detect discussion divergence from original intent.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `<ENTITY_TYPE>` | positional | required | Currently only `issues` |
|
|
| `<IID>` | positional | required | Entity IID |
|
|
| `--threshold` | f32 | 0.4 | Similarity threshold (0.0-1.0) |
|
|
| `-p, --project` | string | — | Scope to project |
|
|
|
|
**DB tables:** `issues`, `discussions`, `notes`, `embeddings`
|
|
|
|
**Requires:** Ollama running
|
|
|
|
---
|
|
|
|
### 1.3 Data Pipeline Commands
|
|
|
|
#### `sync` (Full Pipeline)
|
|
|
|
Complete sync: ingest -> generate-docs -> embed.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `--full` | flag | — | Full re-sync (reset cursors) |
|
|
| `-f, --force` | flag | — | Override stale lock |
|
|
| `--no-embed` | flag | — | Skip embedding |
|
|
| `--no-docs` | flag | — | Skip doc generation |
|
|
| `--no-events` | flag | — | Skip resource events |
|
|
| `--no-file-changes` | flag | — | Skip MR file changes |
|
|
| `--no-status` | flag | — | Skip work-item status enrichment |
|
|
| `--dry-run` | flag | — | Preview without changes |
|
|
| `-t, --timings` | flag | — | Show timing breakdown |
|
|
| `--lock` | flag | — | Acquire file lock |
|
|
| `--issue` | int[] | — | Surgically sync specific issues (repeatable) |
|
|
| `--mr` | int[] | — | Surgically sync specific MRs (repeatable) |
|
|
| `-p, --project` | string | — | Required with `--issue`/`--mr` |
|
|
| `--preflight-only` | flag | — | Validate without DB writes |
|
|
|
|
**Stages:** Ingest -> GraphQL status enrichment -> Generate docs -> Embed
|
|
|
|
#### `ingest`
|
|
|
|
Fetch data from GitLab API only.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `[ENTITY]` | positional | — | `issues` or `mrs` (omit for all) |
|
|
| `-p, --project` | string | — | Filter to single project |
|
|
| `-f, --force` | flag | — | Override stale lock |
|
|
| `--full` | flag | — | Full re-sync |
|
|
| `--dry-run` | flag | — | Preview |
|
|
|
|
#### `generate-docs`
|
|
|
|
Create searchable documents from ingested data.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `--full` | flag | — | Full rebuild |
|
|
| `-p, --project` | string | — | Single project rebuild |
|
|
|
|
#### `embed`
|
|
|
|
Generate vector embeddings via Ollama.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `--full` | flag | — | Re-embed all |
|
|
| `--retry-failed` | flag | — | Retry failed embeddings |
|
|
|
|
**Requires:** Ollama running with `nomic-embed-text`
|
|
|
|
---
|
|
|
|
### 1.4 Diagnostic Commands
|
|
|
|
#### `health`
|
|
|
|
Quick pre-flight check. Exit 0 = healthy, exit 19 = unhealthy.
|
|
|
|
**Checks:** config found, DB found, schema current.
|
|
|
|
```json
|
|
{
|
|
"data": {
|
|
"healthy": true,
|
|
"config_found": true, "db_found": true,
|
|
"schema_current": true, "schema_version": 28
|
|
}
|
|
}
|
|
```
|
|
|
|
#### `auth`
|
|
|
|
Verify GitLab authentication.
|
|
|
|
**Checks:** token set, GitLab reachable, user identity.
|
|
|
|
#### `doctor`
|
|
|
|
Comprehensive environment check.
|
|
|
|
**Checks:** config validity, token, GitLab connectivity, DB health, migration status, Ollama availability, model status.
|
|
|
|
```json
|
|
{
|
|
"data": {
|
|
"config": { "valid": true, "path": "..." },
|
|
"token": { "set": true, "gitlab": { "reachable": true, "user": "jdoe" } },
|
|
"database": { "exists": true, "version": 28, "tables": 25 },
|
|
"ollama": { "available": true, "model_ready": true }
|
|
}
|
|
}
|
|
```
|
|
|
|
#### `status` (alias: `st`)
|
|
|
|
Show sync state per project (last sync times, cursors).
|
|
|
|
```json
|
|
{
|
|
"data": {
|
|
"projects": [
|
|
{ "project_path": "group/repo", "last_synced_at": "...",
|
|
"document_count": 5000, "discussion_count": 2000 }
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
#### `stats` (alias: `stat`)
|
|
|
|
Document and index statistics with optional integrity checks.
|
|
|
|
| Flag | Type | Default | Purpose |
|
|
|---|---|---|---|
|
|
| `--check` | flag | — | Run integrity checks |
|
|
| `--repair` | flag | — | Fix issues (implies `--check`) |
|
|
| `--dry-run` | flag | — | Preview repairs |
|
|
|
|
```json
|
|
{
|
|
"data": {
|
|
"documents": { "total": 61652, "issues": 5000, "mrs": 2000, "notes": 50000 },
|
|
"embeddings": { "total": 80000, "synced": 79500, "pending": 500 },
|
|
"fts": { "total_docs": 61652 },
|
|
"queues": { "pending": 0, "in_progress": 0, "failed": 0 },
|
|
"integrity": { "ok": true }
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 1.5 Setup Commands
|
|
|
|
| Command | Purpose |
|
|
|---|---|
|
|
| `init` | Initialize config + DB (interactive or `--non-interactive`) |
|
|
| `token set` | Store GitLab token (interactive or `--token`) |
|
|
| `token show` | Display token (`--unmask` for full) |
|
|
| `cron install` | Schedule auto-sync (`--interval` minutes, default 8) |
|
|
| `cron uninstall` | Remove cron job |
|
|
| `cron status` | Check cron installation |
|
|
| `migrate` | Run pending DB migrations |
|
|
|
|
### 1.6 Meta Commands
|
|
|
|
| Command | Purpose |
|
|
|---|---|
|
|
| `version` | Show version string |
|
|
| `completions <shell>` | Generate shell completions (bash/zsh/fish/powershell) |
|
|
| `robot-docs` | Machine-readable command manifest (`--brief` for smaller) |
|
|
|
|
---
|
|
|
|
## 2. Shared Data Source Map
|
|
|
|
Which DB tables power which commands. Higher overlap = more consolidation potential.
|
|
|
|
| Table | Read By |
|
|
|---|---|
|
|
| `issues` | issues, me, who-workload, search, timeline, trace, count, stats |
|
|
| `merge_requests` | mrs, me, who-workload, search, timeline, trace, file-history, count, stats |
|
|
| `notes` | notes, issues-detail, mrs-detail, who-expert, who-active, search, timeline, trace, file-history |
|
|
| `discussions` | notes, issues-detail, mrs-detail, who-active, who-reviews, timeline, trace |
|
|
| `entity_references` | trace, timeline |
|
|
| `mr_file_changes` | trace, file-history, who-overlap |
|
|
| `resource_state_events` | timeline, me-activity |
|
|
| `resource_label_events` | timeline |
|
|
| `resource_milestone_events` | timeline |
|
|
| `documents` + FTS | search, stats |
|
|
| `embeddings` | search, related, drift |
|
|
| `document_labels` | search |
|
|
| `document_paths` | search |
|
|
| `issue_labels` | issues, me |
|
|
| `mr_labels` | mrs, me |
|
|
| `mr_reviewers` | mrs, who-expert, who-workload |
|
|
| `issue_assignees` | issues, me |
|
|
| `sync_cursors` | status |
|
|
| `dirty_sources` | stats |
|
|
|
|
---
|
|
|
|
## 3. Command Network Graph
|
|
|
|
### 3.1 Data Flow (command A feeds into command B)
|
|
|
|
```
|
|
┌─────────┐
|
|
│ search │─────────────────────────────┐
|
|
└────┬────┘ │
|
|
│ iid │ topic
|
|
┌────▼────┐ ┌────▼─────┐
|
|
┌─────│ issues │◄───────────────────────│ timeline │
|
|
│ │ mrs │ (detail) └──────────┘
|
|
│ └────┬────┘ ▲
|
|
│ │ iid │ entity ref
|
|
│ ┌────▼────┐ ┌──────────────┐ │
|
|
│ │ related │ │ file-history │───────┘
|
|
│ │ drift │ └──────┬───────┘
|
|
│ └─────────┘ │ MR iids
|
|
│ ┌────▼────┐
|
|
│ │ trace │──── issues (linked)
|
|
│ └────┬────┘
|
|
│ │ paths
|
|
│ ┌────▼────┐
|
|
│ │ who │
|
|
│ │ (expert)│
|
|
│ └─────────┘
|
|
│
|
|
file paths ┌─────────┐
|
|
│ │ me │──── issues, mrs (dashboard)
|
|
▼ └─────────┘
|
|
┌──────────┐ ▲
|
|
│ notes │ │ (same data)
|
|
└──────────┘ ┌────┴──────┐
|
|
│who workload│
|
|
└───────────┘
|
|
```
|
|
|
|
### 3.2 Shared-Data Clusters
|
|
|
|
Commands that read from the same primary tables form natural clusters:
|
|
|
|
**Cluster A: Issue/MR entities** — `issues`, `mrs`, `me`, `who workload`, `count`
|
|
All read from `issues` + `merge_requests` with similar filter patterns.
|
|
|
|
**Cluster B: Notes/discussions** — `notes`, `issues detail`, `mrs detail`, `who expert`, `who active`, `timeline`
|
|
All traverse the `discussions` -> `notes` join path.
|
|
|
|
**Cluster C: File genealogy** — `trace`, `file-history`, `who overlap`
|
|
All use `mr_file_changes` with rename chain BFS.
|
|
|
|
**Cluster D: Semantic/vector** — `search`, `related`, `drift`
|
|
All use `documents` + `embeddings` (require Ollama).
|
|
|
|
**Cluster E: Diagnostics** — `health`, `auth`, `doctor`, `status`, `stats`
|
|
All check system state at various granularities.
|
|
|
|
---
|
|
|
|
## 4. Overlap Analysis
|
|
|
|
### 4.1 High Overlap (>70% functional duplication)
|
|
|
|
#### `who workload` vs `me`
|
|
|
|
| Dimension | `who @user` (workload) | `me --user @user` |
|
|
|---|---|---|
|
|
| Assigned issues | Yes | Yes |
|
|
| Authored MRs | Yes | Yes |
|
|
| Reviewing MRs | Yes | Yes |
|
|
| Attention state | No | **Yes** |
|
|
| Activity feed | No | **Yes** |
|
|
| Since-last-check inbox | No | **Yes** |
|
|
| Cross-project | Yes | **Yes** |
|
|
|
|
**Verdict:** `who workload` is a strict subset of `me`. 85% overlap.
|
|
|
|
#### `health` vs `doctor`
|
|
|
|
| Check | `health` | `doctor` |
|
|
|---|---|---|
|
|
| Config found | Yes | Yes |
|
|
| DB exists | Yes | Yes |
|
|
| Schema current | Yes | Yes |
|
|
| Token valid | No | **Yes** |
|
|
| GitLab reachable | No | **Yes** |
|
|
| Ollama available | No | **Yes** |
|
|
|
|
**Verdict:** `health` is a strict subset of `doctor`. 90% overlap (but `health` is fast pre-flight with different exit code semantics).
|
|
|
|
#### `file-history` vs `trace`
|
|
|
|
| Feature | `file-history` | `trace` |
|
|
|---|---|---|
|
|
| Find MRs for file | Yes | Yes |
|
|
| Rename chain BFS | Yes | Yes |
|
|
| DiffNote discussions | `--discussions` | `--discussions` |
|
|
| Follow to linked issues | No | **Yes** |
|
|
| `--merged` filter | **Yes** | No |
|
|
|
|
**Verdict:** `trace` is a superset minus the `--merged` flag. 75% overlap.
|
|
|
|
#### `related` (query mode) vs `search --mode semantic`
|
|
|
|
| Feature | `related "text"` | `search "text" --mode semantic` |
|
|
|---|---|---|
|
|
| Vector similarity | Yes | Yes |
|
|
| FTS component | No | No (semantic mode) |
|
|
| Filters (labels, author, since) | No | **Yes** |
|
|
| Explain ranking | No | **Yes** |
|
|
| Field selection | No | **Yes** |
|
|
|
|
**Verdict:** `related` query mode is `search --mode semantic` without filters. 80% overlap.
|
|
|
|
### 4.2 Medium Overlap (40-70%)
|
|
|
|
| Pair | Overlap % | Notes |
|
|
|---|---|---|
|
|
| `who expert` vs `who overlap` | ~50% | Both answer "who works on this file"; expert has decay scoring, overlap has raw counts |
|
|
| `timeline` vs `trace` | ~45% | Both follow `entity_references`; timeline is entity-centric, trace is file-centric |
|
|
| `auth` vs `doctor` | ~100% of auth | auth is fully contained within doctor |
|
|
| `count` vs `stats` | ~40% | Both answer "how much data" at different layers (entity vs document index) |
|
|
| `notes` vs `issues/mrs detail` | ~50% | Detail embeds notes inline; `notes` adds independent filtering |
|
|
|
|
### 4.3 No Significant Overlap
|
|
|
|
| Command | Reason |
|
|
|---|---|
|
|
| `drift` | Unique: semantic divergence detection |
|
|
| `timeline` | Unique: multi-entity chronological reconstruction |
|
|
| `search` (hybrid) | Unique: FTS + vector combined ranking |
|
|
| `me` (inbox) | Unique: cursor-based since-last-check |
|
|
| `who expert` | Unique: half-life decay scoring with signal types |
|
|
| `who reviews` | Unique: review pattern analysis |
|
|
|
|
---
|
|
|
|
## 5. Agent Workflow Analysis
|
|
|
|
### 5.1 Common Workflows with Round-Trip Counts
|
|
|
|
#### Flow 1: "What should I work on?" — 4 round trips
|
|
|
|
```
|
|
me → dashboard overview
|
|
issues <iid> -p proj → detail on picked issue
|
|
trace src/relevant/file.rs → understand code context
|
|
who src/relevant/file.rs → find domain experts
|
|
```
|
|
|
|
#### Flow 2: "What happened with this feature?" — 3 round trips
|
|
|
|
```
|
|
search "feature name" → find relevant entities
|
|
timeline "feature name" → reconstruct chronological history
|
|
related issues 42 → discover connected work
|
|
```
|
|
|
|
#### Flow 3: "Why was this code changed?" — 3 round trips
|
|
|
|
```
|
|
trace src/file.rs → file -> MR -> issue chain
|
|
issues <iid> -p proj → full issue detail
|
|
timeline "issue:42" → full history with cross-refs
|
|
```
|
|
|
|
#### Flow 4: "Is the system healthy?" — 2-4 round trips
|
|
|
|
```
|
|
health → quick pre-flight
|
|
doctor → detailed diagnostics
|
|
status → sync state per project
|
|
stats → document/index health
|
|
```
|
|
|
|
#### Flow 5: "Who can review this?" — 2-3 round trips
|
|
|
|
```
|
|
who src/auth/ → find file experts
|
|
who @jdoe --reviews → check reviewer's patterns
|
|
```
|
|
|
|
#### Flow 6: "Find and understand an issue" — 4 round trips
|
|
|
|
```
|
|
search "query" → discover entities
|
|
issues <iid> → full detail with discussions
|
|
timeline "issue:42" → chronological context
|
|
related issues 42 → connected entities
|
|
```
|
|
|
|
### 5.2 Token Cost Profiles
|
|
|
|
Measured typical response sizes in robot mode:
|
|
|
|
| Command | Typical Tokens | Notes |
|
|
|---|---|---|
|
|
| `me` (full) | 2000-5000 | Scales with open items |
|
|
| `me --fields minimal` | 500-1500 | Good reduction |
|
|
| `issues` (list, n=50) | 1500-3000 | Labels inflate it |
|
|
| `issues <iid>` (detail) | 1000-8000 | Discussions dominate |
|
|
| `timeline` (limit=100) | 2000-6000 | Events + evidence |
|
|
| `search` (n=20) | 1000-3000 | Snippets dominate |
|
|
| `who expert` | 300-800 | Compact |
|
|
| `trace` | 500-2000 | Depends on chain depth |
|
|
| `health` | ~100 | Very compact |
|
|
| `stats` | ~500 | Fixed structure |
|
|
|
|
---
|
|
|
|
## 6. Proposals
|
|
|
|
### 6.1 Command Consolidations
|
|
|
|
#### A. Absorb `file-history` into `trace --shallow`
|
|
|
|
**Rationale:** 75% code overlap. Both do rename chain BFS on `mr_file_changes`, both optionally include DiffNote discussions. `trace` just follows entity_references one step further.
|
|
|
|
**Change:**
|
|
- `trace <path>` — full chain: file -> MR -> issue -> discussions (existing)
|
|
- `trace <path> --shallow` — MR-only, no issue chain (replaces `file-history`)
|
|
- Move `--merged` flag from `file-history` to `trace`
|
|
- Deprecate `file-history` with alias redirect
|
|
|
|
**Impact:** -1 command. No functionality lost.
|
|
|
|
#### B. Absorb `auth` into `doctor`
|
|
|
|
**Rationale:** `auth` checks token + GitLab connectivity. `doctor` checks the same plus DB + Ollama. `auth` is 100% contained within `doctor`.
|
|
|
|
**Change:**
|
|
- `doctor` — full check (existing)
|
|
- `doctor --auth` — token + GitLab only (replaces `auth`)
|
|
- Keep `health` separate (fast pre-flight, different exit code contract)
|
|
- Deprecate `auth` with alias redirect
|
|
|
|
**Impact:** -1 command. `health` stays because its ~50ms pre-flight with exit 0/19 contract is valuable for scripting.
|
|
|
|
#### C. Remove `related` query-mode, keep entity-mode
|
|
|
|
**Rationale:** `related "auth flow"` is functionally identical to `search "auth flow" --mode semantic` but with fewer filter options.
|
|
|
|
**Change:**
|
|
- `related issues 42` — entity-seeded mode (keep, it's unique)
|
|
- `related "free text"` — print deprecation, suggest `search --mode semantic`
|
|
- Eventually remove query-mode entirely
|
|
|
|
**Impact:** -1 mode. Entity-seeded mode stays because it seeds from a specific entity's embedding rather than generating a new one.
|
|
|
|
#### D. Merge `who overlap` into `who expert` output
|
|
|
|
**Rationale:** `who overlap` reports who touches a file (raw count). `who expert` reports who knows a file (scored). Overlap is strictly less information.
|
|
|
|
**Change:**
|
|
- `who <path>` (expert) adds `touch_count` and `last_touch_at` fields to each expert row
|
|
- `who --overlap <path>` becomes an alias for `who <path> --fields username,touch_count`
|
|
- Deprecate `--overlap` flag with redirect
|
|
|
|
**Impact:** -1 sub-mode. Agents get both perspectives in one call.
|
|
|
|
#### E. Merge `count` and `status` into `stats`
|
|
|
|
**Rationale:** Three commands answer "how much data do I have?":
|
|
- `count issues` — entity counts with state breakdown
|
|
- `status` — sync cursor positions per project
|
|
- `stats` — document/index counts + integrity
|
|
|
|
**Change:**
|
|
- `stats` — document/index health (existing)
|
|
- `stats --entities` — adds entity counts (replaces `count`)
|
|
- `stats --sync` — adds sync cursor positions (replaces `status`)
|
|
- `stats --all` — everything
|
|
- Bare `stats` keeps current behavior (documents + queues + integrity)
|
|
- Deprecate `count` and `status` with alias redirects
|
|
|
|
**Impact:** -2 commands. Progressive disclosure via flags.
|
|
|
|
#### Consolidation Summary
|
|
|
|
| Before | After | Commands Removed |
|
|
|---|---|---|
|
|
| `file-history`, `trace` | `trace` (+ `--shallow`) | -1 |
|
|
| `auth`, `doctor` | `doctor` (+ `--auth`) | -1 |
|
|
| `related` query-mode | `search --mode semantic` | -1 mode |
|
|
| `who overlap`, `who expert` | `who expert` (+ touch_count) | -1 sub-mode |
|
|
| `count`, `status`, `stats` | `stats` (+ `--entities`, `--sync`) | -2 |
|
|
|
|
**Total: 34 commands -> 29 commands** (5 fewer entry points for agents to learn).
|
|
|
|
---
|
|
|
|
### 6.2 Robot-Mode Optimizations
|
|
|
|
These are additive changes that reduce round trips and token waste without removing commands.
|
|
|
|
#### A. `--include` flag for embedded sub-queries
|
|
|
|
The single highest-impact optimization. Agents constantly fetch an entity and then immediately need related context.
|
|
|
|
**Syntax:**
|
|
```bash
|
|
lore -J issues 42 -p proj --include timeline,related
|
|
lore -J mrs 99 -p proj --include timeline,trace
|
|
lore -J trace src/auth/ -p proj --include experts
|
|
lore -J me --include detail
|
|
```
|
|
|
|
**Response shape (embedded data uses `_` prefix):**
|
|
```json
|
|
{
|
|
"ok": true,
|
|
"data": {
|
|
"iid": 42, "title": "Fix auth", "state": "opened",
|
|
"discussions": [...],
|
|
"_timeline": {
|
|
"event_count": 15,
|
|
"events": [...]
|
|
},
|
|
"_related": {
|
|
"similar_entities": [...]
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Include matrix (which includes are valid on which commands):**
|
|
|
|
| Base Command | Valid Includes | Default Limits |
|
|
|---|---|---|
|
|
| `issues <iid>` | `timeline`, `related`, `trace` | 20 events, 5 related, 5 chains |
|
|
| `mrs <iid>` | `timeline`, `related`, `file-changes` | 20 events, 5 related |
|
|
| `trace <path>` | `experts`, `timeline` | 5 experts, 20 events |
|
|
| `me` | `detail` (inline top-N item details) | 3 items detailed |
|
|
| `search` | `detail` (inline top-N result details) | 3 results detailed |
|
|
|
|
**Round-trip savings:**
|
|
|
|
| Workflow | Before | After | Savings |
|
|
|---|---|---|---|
|
|
| Understand an issue | 4 calls | 1 call | **75%** |
|
|
| Why was code changed | 3 calls | 1 call | **67%** |
|
|
| Find and understand | 4 calls | 2 calls | **50%** |
|
|
|
|
**Implementation notes:**
|
|
- Each include runs its sub-query with reduced limits (configurable via `--include-limit`)
|
|
- Sub-query errors are non-fatal: returned as `"_timeline_error": "Ollama unavailable"` instead of failing the whole request
|
|
- `--fields minimal` applies to included data too
|
|
- Timing breakdown in meta: `"_timeline_ms": 45, "_related_ms": 120`
|
|
|
|
#### B. `--batch` flag for multi-entity detail lookups
|
|
|
|
After search/timeline, agents typically need detail on multiple entities:
|
|
|
|
```bash
|
|
# Before: N round trips
|
|
lore -J issues 42 -p proj
|
|
lore -J issues 55 -p proj
|
|
lore -J issues 71 -p proj
|
|
|
|
# After: 1 round trip
|
|
lore -J issues --batch 42,55,71 -p proj
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"data": {
|
|
"results": [
|
|
{ "iid": 42, "title": "Fix auth", ... },
|
|
{ "iid": 55, "title": "Add SSO", ... },
|
|
{ "iid": 71, "title": "Token refresh", ... }
|
|
],
|
|
"errors": []
|
|
}
|
|
}
|
|
```
|
|
|
|
**Constraints:**
|
|
- Max 20 IIDs per batch
|
|
- Errors for individual items don't fail the batch
|
|
- Works with `--include` for maximum efficiency
|
|
|
|
#### C. `--depth` control on `me`
|
|
|
|
The `me` command returns everything by default, which is token-wasteful when an agent just wants to check "do I have work?".
|
|
|
|
```bash
|
|
# Counts only (~100 tokens)
|
|
lore -J me --depth counts
|
|
|
|
# Counts + titles (~400 tokens)
|
|
lore -J me --depth titles
|
|
|
|
# Full (current behavior, 2000+ tokens)
|
|
lore -J me --depth full
|
|
```
|
|
|
|
**Depth levels:**
|
|
|
|
| Level | Returns | Typical Tokens |
|
|
|---|---|---|
|
|
| `counts` | `summary` block only | ~100 |
|
|
| `titles` | summary + item lists (iid, title, attention_state only) | ~400 |
|
|
| `full` | Everything including discussions, activity, inbox | ~2000+ |
|
|
|
|
#### D. Composite `context` command
|
|
|
|
Purpose-built for the most common agent workflow: "give me everything I need to understand this entity."
|
|
|
|
```bash
|
|
lore -J context issues 42 -p proj
|
|
lore -J context mrs 99 -p proj
|
|
```
|
|
|
|
**Equivalent to:**
|
|
```bash
|
|
lore -J issues 42 -p proj --include timeline,related
|
|
```
|
|
|
|
But with optimized defaults:
|
|
- Timeline limited to 20 most recent events
|
|
- Related limited to top 5
|
|
- Discussions truncated after 5 threads
|
|
- Evidence notes capped at 3
|
|
|
|
**Response:** Same shape as `issues <iid> --include timeline,related` but with tighter defaults.
|
|
|
|
**Rationale:** Rather than teaching agents the `--include` syntax, provide a single "give me full context" command.
|
|
|
|
#### E. `--max-tokens` response budget
|
|
|
|
Let the agent cap response size. The server truncates arrays, omits low-priority fields, and uses shorter representations to stay within budget.
|
|
|
|
```bash
|
|
lore -J me --max-tokens 500
|
|
lore -J timeline "feature" --max-tokens 1000
|
|
lore -J context issues 42 --max-tokens 2000
|
|
```
|
|
|
|
**Truncation strategy (in priority order):**
|
|
1. Apply `--fields minimal` if not already set
|
|
2. Reduce array lengths (newest/highest-score items survive)
|
|
3. Truncate string fields (description, snippets)
|
|
4. Omit null/empty fields
|
|
5. Drop included sub-queries (if using `--include`)
|
|
|
|
**Meta includes truncation notice:**
|
|
```json
|
|
{
|
|
"meta": {
|
|
"elapsed_ms": 50,
|
|
"truncated": true,
|
|
"original_tokens": 3500,
|
|
"budget_tokens": 1000,
|
|
"dropped": ["_related", "discussions[5:]"]
|
|
}
|
|
}
|
|
```
|
|
|
|
#### F. `--format tsv` for maximum token efficiency
|
|
|
|
Beyond JSON, offer a TSV mode for list commands where structured data is simple:
|
|
|
|
```bash
|
|
lore -J issues --format tsv --fields iid,title,state -n 10
|
|
```
|
|
|
|
**Output:**
|
|
```
|
|
iid title state
|
|
42 Fix auth opened
|
|
55 Add SSO opened
|
|
71 Token refresh closed
|
|
```
|
|
|
|
**Estimated savings:** ~60-70% fewer tokens vs JSON for list responses.
|
|
|
|
**Applicable to:** `issues` (list), `mrs` (list), `notes` (list), `who expert`, `count`.
|
|
|
|
**Not applicable to:** Detail views, timeline, search (nested structures).
|
|
|
|
---
|
|
|
|
### 6.3 Robot-Mode Optimization Impact Matrix
|
|
|
|
| Optimization | Effort | Round-Trip Savings | Token Savings | Breaking? |
|
|
|---|---|---|---|---|
|
|
| `--include` flag | High | **50-75%** | Moderate | No (additive) |
|
|
| `--batch` flag | Medium | **N-1 per batch** | Moderate | No (additive) |
|
|
| `--depth` on `me` | Low | None | **60-80%** | No (additive) |
|
|
| `context` command | Medium | **67-75%** | Moderate | No (additive) |
|
|
| `--max-tokens` | High | None | **Variable, up to 80%** | No (additive) |
|
|
| `--format tsv` | Medium | None | **60-70% on lists** | No (additive) |
|
|
|
|
---
|
|
|
|
## 7. Priority Ranking
|
|
|
|
Ordered by impact on robot-mode efficiency (round-trip reduction x token savings x implementation ease):
|
|
|
|
| Priority | Proposal | Category | Effort | Impact |
|
|
|---|---|---|---|---|
|
|
| **P0** | `--include` flag | Robot optimization | High | Eliminates 2-3 round trips per workflow |
|
|
| **P0** | `--depth` on `me` | Robot optimization | Low | 60-80% token reduction on most-used command |
|
|
| **P1** | `--batch` for detail views | Robot optimization | Medium | Eliminates N+1 after search/timeline |
|
|
| **P1** | Absorb `file-history` into `trace` | Consolidation | Low | Cleaner surface, shared code |
|
|
| **P1** | Merge `who overlap` into `who expert` | Consolidation | Low | -1 round trip in review flows |
|
|
| **P2** | `context` composite command | Robot optimization | Medium | Single entry point for understanding entities |
|
|
| **P2** | Merge `count`+`status` into `stats` | Consolidation | Medium | -2 commands, progressive disclosure |
|
|
| **P2** | Absorb `auth` into `doctor` | Consolidation | Low | -1 command |
|
|
| **P2** | Remove `related` query-mode | Consolidation | Low | -1 confusing choice |
|
|
| **P3** | `--max-tokens` budget | Robot optimization | High | Flexible but hard to implement well |
|
|
| **P3** | `--format tsv` | Robot optimization | Medium | High savings but limited applicability |
|
|
|
|
---
|
|
|
|
## 8. Appendix: Robot Output Envelope
|
|
|
|
All robot-mode responses follow:
|
|
|
|
```json
|
|
{
|
|
"ok": true,
|
|
"data": { /* command-specific */ },
|
|
"meta": { "elapsed_ms": 42 }
|
|
}
|
|
```
|
|
|
|
Errors (to stderr):
|
|
```json
|
|
{
|
|
"error": {
|
|
"code": "CONFIG_NOT_FOUND",
|
|
"message": "Configuration file not found",
|
|
"suggestion": "Run 'lore init'",
|
|
"actions": ["lore init"]
|
|
}
|
|
}
|
|
```
|
|
|
|
Exit codes: 0 (success), 1 (internal), 2 (usage), 3 (config invalid), 4 (token missing), 5 (auth failed), 6 (resource not found), 7 (rate limited), 8 (network), 9 (DB locked), 10 (DB error), 11 (migration), 12 (I/O), 13 (transform), 14 (Ollama unavailable), 15 (model missing), 16 (embedding failed), 17 (not found), 18 (ambiguous match), 19 (health failed), 20 (config not found).
|
|
|
|
---
|
|
|
|
## 9. Appendix: Field Selection Presets
|
|
|
|
The `--fields` flag supports both presets and custom field lists:
|
|
|
|
```bash
|
|
lore -J issues --fields minimal # Preset
|
|
lore -J mrs --fields iid,title,state,draft # Custom
|
|
```
|
|
|
|
| Command | Minimal Preset Fields |
|
|
|---|---|
|
|
| `issues` (list) | `iid`, `title`, `state`, `updated_at_iso` |
|
|
| `mrs` (list) | `iid`, `title`, `state`, `updated_at_iso` |
|
|
| `notes` (list) | `id`, `author_username`, `body`, `created_at_iso` |
|
|
| `search` | `document_id`, `title`, `source_type`, `score` |
|
|
| `timeline` | `timestamp`, `type`, `entity_iid`, `detail` |
|
|
| `who expert` | `username`, `score` |
|
|
| `who workload` | `iid`, `title`, `state` |
|
|
| `who reviews` | `name`, `count`, `percentage` |
|
|
| `who active` | `entity_type`, `iid`, `title`, `participants` |
|
|
| `who overlap` | `username`, `touch_count` |
|
|
| `me` (items) | `iid`, `title`, `attention_state`, `updated_at_iso` |
|
|
| `me` (activity) | `timestamp_iso`, `event_type`, `entity_iid`, `actor` |
|