@djolex999/vir-cli 0.24.0 → 0.24.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +40 -20
  2. package/dist/cli/costLabel.js +4 -1
  3. package/dist/cli/costLabel.js.map +1 -1
  4. package/dist/cli/init.js +13 -13
  5. package/dist/cli/init.js.map +1 -1
  6. package/dist/cli/notesDir.js +9 -0
  7. package/dist/cli/notesDir.js.map +1 -0
  8. package/dist/cli/projects.js +8 -7
  9. package/dist/cli/projects.js.map +1 -1
  10. package/dist/cli/reconcile.js +99 -12
  11. package/dist/cli/reconcile.js.map +1 -1
  12. package/dist/cli/review.js +12 -4
  13. package/dist/cli/review.js.map +1 -1
  14. package/dist/cli.js +22 -11
  15. package/dist/cli.js.map +1 -1
  16. package/dist/config.js +12 -6
  17. package/dist/config.js.map +1 -1
  18. package/dist/cost/report.js +5 -2
  19. package/dist/cost/report.js.map +1 -1
  20. package/dist/diagnostics/doctor.js +23 -0
  21. package/dist/diagnostics/doctor.js.map +1 -1
  22. package/dist/mcp/server.js +2 -2
  23. package/dist/mcp/server.js.map +1 -1
  24. package/dist/output/json.js +2 -2
  25. package/dist/pipeline/distillSession.js +30 -1
  26. package/dist/pipeline/distillSession.js.map +1 -1
  27. package/dist/pipeline/distiller.js +13 -6
  28. package/dist/pipeline/distiller.js.map +1 -1
  29. package/dist/pipeline/parser.js +2 -2
  30. package/dist/pipeline/parser.js.map +1 -1
  31. package/dist/pipeline/projects.js +1 -1
  32. package/dist/pipeline/projects.js.map +1 -1
  33. package/dist/pipeline/run.js +32 -20
  34. package/dist/pipeline/run.js.map +1 -1
  35. package/dist/pipeline/scrubber.js +4 -4
  36. package/dist/pipeline/scrubber.js.map +1 -1
  37. package/dist/pipeline/toolCallFilter.js +25 -1
  38. package/dist/pipeline/toolCallFilter.js.map +1 -1
  39. package/dist/prune/classify.js +8 -2
  40. package/dist/prune/classify.js.map +1 -1
  41. package/dist/prune/prune.js +9 -6
  42. package/dist/prune/prune.js.map +1 -1
  43. package/dist/sources/claudeCode.js +35 -0
  44. package/dist/sources/claudeCode.js.map +1 -0
  45. package/dist/sources/registry.js +49 -0
  46. package/dist/sources/registry.js.map +1 -0
  47. package/dist/sources/types.js +2 -0
  48. package/dist/sources/types.js.map +1 -0
  49. package/dist/state/db.js +2 -3
  50. package/dist/state/db.js.map +1 -1
  51. package/dist/version.js +2 -1
  52. package/dist/version.js.map +1 -1
  53. package/package.json +1 -1
package/README.md CHANGED
@@ -5,7 +5,8 @@
5
5
  <h1 align="center">vir</h1>
6
6
 
7
7
  <p align="center">
8
- An LLM Wiki for Claude Code, in your Obsidian vault.
8
+ Karpathy's LLM Wiki, built automatically from your Claude Code sessions.<br>
9
+ Plain markdown you own: best in Obsidian, fine without it.
9
10
  </p>
10
11
 
11
12
  <p align="center">
@@ -22,7 +23,7 @@ developer-tools, mcp, local-first, cross-platform, llm-wiki
22
23
  <a href="https://www.npmjs.com/package/@djolex999/vir-cli"><img src="https://img.shields.io/npm/v/@djolex999/vir-cli?color=7c6af7&label=npm" alt="npm version"></a>
23
24
  <a href="https://www.npmjs.com/package/@djolex999/vir-cli"><img src="https://img.shields.io/npm/dw/@djolex999/vir-cli?color=4fd1a0" alt="npm downloads"></a>
24
25
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-22d3ee" alt="license"></a>
25
- <a href="#project-status"><img src="https://img.shields.io/badge/tests-612%20passing-22c55e" alt="tests"></a>
26
+ <a href="#project-status"><img src="https://img.shields.io/badge/tests-1075%20passing-22c55e" alt="tests"></a>
26
27
  <a href="#project-status"><img src="https://img.shields.io/badge/platforms-macOS%20%7C%20Linux-lightgrey" alt="platforms"></a>
27
28
  <a href="https://modelcontextprotocol.io"><img src="https://img.shields.io/badge/MCP-server-c084fc" alt="mcp"></a>
28
29
  <a href="#"><img src="https://img.shields.io/badge/local--first-yes-f59e0b" alt="local-first"></a>
@@ -56,7 +57,7 @@ vir init
56
57
  vir run
57
58
  ```
58
59
 
59
- `vir init` is a wizard: provider, models, vault path. `vir run` does one pass
60
+ `vir init` is a wizard: provider, models, notes folder. `vir run` does one pass
60
61
  over your sessions and writes notes. When you like the output,
61
62
  `vir schedule install` registers a daemon that keeps the vault current.
62
63
 
@@ -87,7 +88,7 @@ Claude Code sessions
87
88
  ↓
88
89
  vir
89
90
  ↓
90
- Obsidian vault
91
+ markdown notes (Obsidian vault optional)
91
92
  ↓
92
93
  CLAUDE.md
93
94
  ↓
@@ -112,12 +113,15 @@ Several open source implementations of this pattern now exist
112
113
  [nashsu/llm_wiki](https://github.com/nashsu/llm_wiki) among them). Each takes
113
114
  a different shape.
114
115
 
115
- Vir is the Obsidian-native one. It treats Obsidian as the primary frontend,
116
- not just a storage location: a sidebar plugin
116
+ Vir is the one built from your own coding sessions, and it is Obsidian-native
117
+ when you want it. In Obsidian it is a frontend, not just a storage location: a
118
+ sidebar plugin
117
119
  ([vir-obsidian](https://github.com/djolex999/vir-obsidian)),
118
120
  dataview-compatible frontmatter, wikilinked notes that show up in the graph.
119
121
  It reads AI coding session transcripts retroactively, so months of existing
120
- history become a queryable knowledge base in one run.
122
+ history become a queryable knowledge base in one run. Without Obsidian it is a
123
+ folder of markdown, and `vir query` and the MCP server work with no editor at
124
+ all.
121
125
 
122
126
  [Karpathy's post →](https://x.com/karpathy/status/2039805659525644595)
123
127
 
@@ -141,13 +145,13 @@ worse results, not better."_ Fair. Vir addresses it in layers:
141
145
  - **Opt-in `CLAUDE.md` sync.** Nothing vir generates touches your prompt
142
146
  context automatically. `vir sync-claude` shows a diff and waits for your
143
147
  confirmation. You decide what reaches Claude.
144
- - **Plain markdown output.** Every note is a file in your Obsidian vault. Read
148
+ - **Plain markdown output.** Every note is a file in your notes folder. Read
145
149
  it, edit it, delete it. Nothing is hidden in a database you can't inspect.
146
150
  - **Lint and dedupe.** `vir lint` flags contradictions and stale notes;
147
151
  `vir dedupe` merges near-duplicate notes that have drifted apart.
148
152
  - **Active learning** via `vir review`. Walk through new distillations and
149
- approve, edit, or reject each one. Verified notes rank first in retrieval
150
- (in `vir query` and the MCP server). Rejected notes move to `.rejected/`,
153
+ approve, edit, or reject each one. Verified notes get a ranking boost in
154
+ retrieval (in `vir query` and the MCP server). Rejected notes move to `.rejected/`,
151
155
  recoverable, not deleted.
152
156
  - **MMR-diverse retrieval.** Queries return notes covering different aspects
153
157
  of the topic, not 5 similar duplicates.
@@ -206,8 +210,8 @@ Different tools for different needs:
206
210
  capture and vector storage, use claude-mem.
207
211
  - **If you're building AI applications that need to remember users**
208
212
  long-term, use mem0 (different layer entirely).
209
- - **If you want an Obsidian-native LLM Wiki** that reads your existing Claude
210
- Code sessions, use vir.
213
+ - **If you want an LLM Wiki that reads your existing Claude Code sessions**,
214
+ Obsidian-native or just a folder of markdown, use vir.
211
215
 
212
216
  ## Numbers from a real run
213
217
 
@@ -224,7 +228,8 @@ Output from my first run across 226 Claude Code sessions:
224
228
 
225
229
  Other LLM Wiki implementations would produce similar results with the same
226
230
  input. The distinguishing question for vir is workflow fit: does
227
- Obsidian-native plus retroactive match how you actually work?
231
+ retroactive distillation of your own sessions, Obsidian-native when you want
232
+ it, match how you actually work?
228
233
 
229
234
  Example query against the distilled vault:
230
235
 
@@ -255,13 +260,28 @@ sources 4 · via embedding · searched 126
255
260
  - macOS or Linux (systemd or cron)
256
261
  - Node.js 20+
257
262
  - Claude Code (sessions at `~/.claude/projects/`)
258
- - Obsidian vault
263
+ - A folder for notes. An Obsidian vault works great but is optional; see
264
+ [Without Obsidian](#without-obsidian).
259
265
  - A distill provider — any one of:
260
266
  - Anthropic API key (predictable per-session cost, no effect on your Claude Code limits)
261
267
  - Your Claude Code subscription (`provider: "claude-cli"` — free and keyless; distills consume your Claude Code usage limits)
262
268
  - Kie.ai API key (~72% cheaper, third-party proxy — used for testing and calibration runs, not recommended for your real vault)
263
269
  - Optional: Ollama + `nomic-embed-text` for semantic search
264
270
 
271
+
272
+ ## Without Obsidian
273
+
274
+ vir writes plain markdown with YAML frontmatter. Obsidian is the nicest way to
275
+ browse it, but nothing depends on it:
276
+
277
+ - **Any editor works.** Notes are ordinary `.md` files under `<notes folder>/vir/`.
278
+ `[[wikilinks]]` read fine as text, and VS Code with Foam or Markdown Memo
279
+ resolves them as links.
280
+ - **No editor needed for retrieval.** `vir query "<question>"` and the MCP server
281
+ (`vir mcp install`) search the folder directly.
282
+ - **Point `vir init` at any folder.** If no Obsidian vault exists, it suggests
283
+ `~/notes` and creates it.
284
+
265
285
  ## Cost
266
286
 
267
287
  Vir runs two API calls per session: a Haiku classify (cheap) and a distill
@@ -408,8 +428,8 @@ Restart Claude Code. The vault is now queryable mid-session via six tools:
408
428
  `vir_query`, `vir_status`, `vir_recent_notes`, `vir_recent_articles`,
409
429
  `vir_project_summary`, `vir_compose`. `vir_query` takes a `type` filter
410
430
  (`session` | `article` | `topic` | `pdf` | `all`). Human-verified notes
411
- (approved via `vir review`) rank first; pass `verified_only: true` to see
412
- only those. The server never writes the vault. `vir_query` is the one tool
431
+ (approved via `vir review`) get a +0.2 score boost; pass `verified_only: true`
432
+ to see only those. The server never writes the vault. `vir_query` is the one tool
413
433
  that spends tokens: it synthesizes an answer with your provider, and
414
434
  `synthesize: false` returns just the matching notes.
415
435
 
@@ -456,7 +476,7 @@ Located at `~/.vir/config.json`.
456
476
 
457
477
  | Field | Default | Description |
458
478
  | ------------------- | --------------------------- | ---------------------------------------------------------- |
459
- | `vaultPath` | (required) | Absolute path to Obsidian vault |
479
+ | `vaultPath` | (required) | Absolute path to your notes folder (Obsidian vault optional) |
460
480
  | `outputDir` | `vir` | Subdir inside vault |
461
481
  | `claudeProjectsDir` | `~/.claude/projects` | Claude Code sessions |
462
482
  | `cadenceHours` | `3` | Daemon run frequency (hours) |
@@ -524,8 +544,8 @@ improvements. Delete it any time; disable it with `"logQueries": false` in
524
544
 
525
545
  | | |
526
546
  | -------------- | ----------------------------------------- |
527
- | Version | 0.22.0 |
528
- | Tests | 887 passing |
547
+ | Version | 0.24.2 |
548
+ | Tests | 1073 passing |
529
549
  | Platforms | macOS (launchd), Linux (systemd/cron) |
530
550
  | Node | 20+ |
531
551
  | First-run cost | $1 to $5 (Kie.ai optional, ~72% cheaper) |
@@ -536,7 +556,7 @@ improvements. Delete it any time; disable it with `"logQueries": false` in
536
556
  Shipped:
537
557
 
538
558
  - [x] Linux support (systemd timer + cron fallback), experimental
539
- - [x] Active learning: `vir review`, verified notes ranked first in retrieval
559
+ - [x] Active learning: `vir review`, verified notes boosted in retrieval
540
560
  - [x] Web article ingestion (Obsidian Web Clipper folder → same vault)
541
561
  - [x] PDF and paper ingestion
542
562
  - [x] Obsidian plugin: [vir-obsidian](https://github.com/djolex999/vir-obsidian), sidebar queries against the vault
@@ -1,4 +1,4 @@
1
- import { computeCost } from "../cost/pricing.js";
1
+ import { computeCost, resolvePricing } from "../cost/pricing.js";
2
2
  import * as ui from "../ui/display.js";
3
3
  // Dollar-estimate label for the ACTIVE provider. On the subscription path the
4
4
  // honest label is quota, never "$0.00" — a zero would read as "free API call"
@@ -6,6 +6,9 @@ import * as ui from "../ui/display.js";
6
6
  export function estCostLabel(cfg, model, inputTokens, outputTokens) {
7
7
  if (cfg.provider === "claude-cli")
8
8
  return "subscription quota (no $)";
9
+ if (resolvePricing(cfg.provider, model, cfg.pricing, cfg.kieTopUpTier) === null) {
10
+ return `unknown (no price for ${model})`;
11
+ }
9
12
  return ui.formatUsd(computeCost(cfg.provider, model, inputTokens, outputTokens, cfg.pricing, cfg.kieTopUpTier));
10
13
  }
11
14
  //# sourceMappingURL=costLabel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"costLabel.js","sourceRoot":"","sources":["../../src/cli/costLabel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,8EAA8E;AAC9E,8EAA8E;AAC9E,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,KAAa,EACb,WAAmB,EACnB,YAAoB;IAEpB,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAO,2BAA2B,CAAC;IACtE,OAAO,EAAE,CAAC,SAAS,CACjB,WAAW,CACT,GAAG,CAAC,QAAQ,EACZ,KAAK,EACL,WAAW,EACX,YAAY,EACZ,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,YAAY,CACjB,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"costLabel.js","sourceRoot":"","sources":["../../src/cli/costLabel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEvC,8EAA8E;AAC9E,8EAA8E;AAC9E,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAC1B,GAAW,EACX,KAAa,EACb,WAAmB,EACnB,YAAoB;IAEpB,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY;QAAE,OAAO,2BAA2B,CAAC;IACtE,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;QAChF,OAAO,yBAAyB,KAAK,GAAG,CAAC;IAC3C,CAAC;IACD,OAAO,EAAE,CAAC,SAAS,CACjB,WAAW,CACT,GAAG,CAAC,QAAQ,EACZ,KAAK,EACL,WAAW,EACX,YAAY,EACZ,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,YAAY,CACjB,CACF,CAAC;AACJ,CAAC"}
package/dist/cli/init.js CHANGED
@@ -7,11 +7,12 @@ import { homedir } from "node:os";
7
7
  import { join } from "node:path";
8
8
  import { CONFIG_PATH, maskSecret, ConfigSchema, configExists, ensureVirDir, expandHome, loadConfig, saveConfig, } from "../config.js";
9
9
  import { setupNotifications } from "./notificationsSetup.js";
10
- import { categorizeTranscriptHead, classifyTranscript, estimateSessionCost, groupByProject, readTranscriptHead, } from "../pipeline/projects.js";
10
+ import { categorizeTranscriptHead, estimateSessionCost, readTranscriptHead, } from "../pipeline/projects.js";
11
+ import { buildSources, groupSessions, resolveSource, scanAll, } from "../sources/registry.js";
11
12
  import { promptProjectDecisions } from "./projectSelect.js";
12
- import { scanSessions } from "../pipeline/scanner.js";
13
13
  import { normalizeModelName } from "../pipeline/distiller.js";
14
14
  import { buildInitConfig } from "./initConfig.js";
15
+ import { defaultNotesDir } from "./notesDir.js";
15
16
  import { installToClaudeCode } from "../mcp/install.js";
16
17
  import * as ui from "../ui/display.js";
17
18
  export async function cmdInit() {
@@ -23,15 +24,14 @@ export async function cmdInit() {
23
24
  let vaultPath = "";
24
25
  for (;;) {
25
26
  vaultPath = await input({
26
- message: "Obsidian vault path",
27
- default: existing?.vaultPath ??
28
- join(homedir(), "Documents", "Obsidian", "MyVault"),
27
+ message: "Notes folder (any folder of markdown — an Obsidian vault works too)",
28
+ default: existing?.vaultPath ?? defaultNotesDir(homedir(), existsSync),
29
29
  });
30
30
  const expanded = expandHome(vaultPath);
31
31
  if (existsSync(expanded))
32
32
  break;
33
33
  const create = await confirm({
34
- message: `Vault path does not exist (${expanded}). Create it?`,
34
+ message: `Folder does not exist (${expanded}). Create it?`,
35
35
  default: true,
36
36
  });
37
37
  if (create) {
@@ -45,7 +45,7 @@ export async function cmdInit() {
45
45
  }
46
46
  }
47
47
  const outputDir = await input({
48
- message: "Output subdir inside vault",
48
+ message: "Output subfolder inside the notes folder",
49
49
  default: existing?.outputDir ?? "vir",
50
50
  });
51
51
  // ── claude projects dir ─────────────────────────────────────────────────
@@ -69,15 +69,14 @@ export async function cmdInit() {
69
69
  // ── web articles (optional second input source) ─────────────────────────
70
70
  let articlesDir = existing?.articlesDir;
71
71
  const wantsArticles = await confirm({
72
- message: "Do you save web articles to a folder (e.g. Obsidian Web Clipper)?",
72
+ message: "Do you save web articles as markdown to a folder (e.g. a web clipper)?",
73
73
  default: existing?.articlesDir !== undefined,
74
74
  });
75
75
  if (wantsArticles) {
76
76
  for (;;) {
77
77
  articlesDir = await input({
78
78
  message: "Articles (raw/) directory",
79
- default: existing?.articlesDir ??
80
- join(homedir(), "Documents", "Obsidian", "raw"),
79
+ default: existing?.articlesDir ?? join(expandHome(vaultPath), "raw"),
81
80
  });
82
81
  const expanded = expandHome(articlesDir);
83
82
  if (existsSync(expanded))
@@ -255,12 +254,13 @@ export async function cmdInit() {
255
254
  let agentTranscriptsAnswer;
256
255
  try {
257
256
  const projectsDirX = expandHome(claudeProjectsDir);
258
- const allFound = scanSessions(projectsDirX);
257
+ const sources = buildSources({ claudeProjectsDir: projectsDirX });
258
+ const allFound = scanAll(sources);
259
259
  // Triage counts + the agent-transcript question. Only top-level
260
260
  // transcripts count (nested workflow/sidechain have their own filter),
261
261
  // and agent transcripts are excluded from the per-project multi-select
262
262
  // numbers so the costs shown reflect what would actually distill.
263
- const topLevel = allFound.filter((s) => classifyTranscript(s.path, projectsDirX) === "session");
263
+ const topLevel = allFound.filter((s) => resolveSource(sources, s.path).category(s.path) === "session");
264
264
  const counts = { interactive: 0, agent: 0, stub: 0 };
265
265
  const agentPaths = new Set();
266
266
  for (const s of topLevel) {
@@ -287,7 +287,7 @@ export async function cmdInit() {
287
287
  const found = agentTranscriptsAnswer !== "include"
288
288
  ? topLevel.filter((s) => !agentPaths.has(s.path))
289
289
  : topLevel;
290
- const groups = [...groupByProject(found, projectsDirX).values()];
290
+ const groups = [...groupSessions(found, sources).values()];
291
291
  if (groups.length > 0) {
292
292
  const classifyId = normalizeModelName(classifyModel, provider);
293
293
  const distillId = normalizeModelName(distillModel, provider);
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { join } from "node:path";
2
+ // vir writes plain markdown; an Obsidian vault is one valid home for it, not a
3
+ // requirement. Prefer the conventional vault when it exists, else ~/notes
4
+ // (notes then land in ~/notes/vir/ via the default outputDir).
5
+ export function defaultNotesDir(home, exists) {
6
+ const vault = join(home, "Documents", "Obsidian", "MyVault");
7
+ return exists(vault) ? vault : join(home, "notes");
8
+ }
9
+ //# sourceMappingURL=notesDir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notesDir.js","sourceRoot":"","sources":["../../src/cli/notesDir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,+EAA+E;AAC/E,0EAA0E;AAC1E,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,MAA8B;IAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC"}
@@ -1,6 +1,6 @@
1
- import { classifyTranscript, estimateSessionCost, groupByProject, readTranscriptHead, sniffAgentEntrypoint, } from "../pipeline/projects.js";
1
+ import { estimateSessionCost, } from "../pipeline/projects.js";
2
2
  import { normalizeModelName } from "../pipeline/distiller.js";
3
- import { scanSessions } from "../pipeline/scanner.js";
3
+ import { buildSources, groupSessions, resolveSource, scanAll } from "../sources/registry.js";
4
4
  import { StateDb } from "../state/db.js";
5
5
  // Aggregate the scan (every project seen on disk) against DB state into the
6
6
  // `vir projects` table. Pure — the command wires in scan/DB/config and an
@@ -56,7 +56,8 @@ export function buildProjectsReport(groups, meta, decisions, estCost, nested) {
56
56
  // dir, read DB status, apply config decisions. Opens its own StateDb unless
57
57
  // one is passed in.
58
58
  export function gatherProjectsReport(cfg) {
59
- const found = scanSessions(cfg.claudeProjectsDir);
59
+ const sources = buildSources(cfg);
60
+ const found = scanAll(sources);
60
61
  // Partition out nested agent-internal transcripts (unless the knob says
61
62
  // include) so they annotate the table instead of counting as sessions.
62
63
  let inScope = found;
@@ -66,7 +67,7 @@ export function gatherProjectsReport(cfg) {
66
67
  if (cfg.workflowTranscripts !== "include") {
67
68
  inScope = [];
68
69
  for (const s of found) {
69
- const cat = classifyTranscript(s.path, cfg.claudeProjectsDir);
70
+ const cat = resolveSource(sources, s.path).category(s.path);
70
71
  if (cat === "session")
71
72
  inScope.push(s);
72
73
  else {
@@ -79,7 +80,7 @@ export function gatherProjectsReport(cfg) {
79
80
  if (cfg.agentTranscripts !== "include") {
80
81
  const stillHuman = [];
81
82
  for (const s of inScope) {
82
- if (sniffAgentEntrypoint(readTranscriptHead(s.path)) !== null) {
83
+ if (resolveSource(sources, s.path).agentEntrypoint(s.path) !== null) {
83
84
  filteredOut.push(s);
84
85
  catByPath.set(s.path, "agent");
85
86
  }
@@ -89,14 +90,14 @@ export function gatherProjectsReport(cfg) {
89
90
  }
90
91
  inScope = stillHuman;
91
92
  }
92
- for (const g of groupByProject(filteredOut, cfg.claudeProjectsDir).values()) {
93
+ for (const g of groupSessions(filteredOut, sources).values()) {
93
94
  const counts = { workflow: 0, sidechain: 0, agent: 0 };
94
95
  for (const s of g.sessions) {
95
96
  counts[catByPath.get(s.path) ?? "sidechain"] += 1;
96
97
  }
97
98
  nested.set(g.name, counts);
98
99
  }
99
- const groups = [...groupByProject(inScope, cfg.claudeProjectsDir).values()];
100
+ const groups = [...groupSessions(inScope, sources).values()];
100
101
  // A project whose transcripts are ALL nested would vanish from the table —
101
102
  // keep it visible with an empty session group.
102
103
  for (const name of nested.keys()) {
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/cli/projects.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GAErB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAgCzC,4EAA4E;AAC5E,0EAA0E;AAC1E,yCAAyC;AACzC,kDAAkD;AAClD,oEAAoE;AACpE,sEAAsE;AACtE,qEAAqE;AACrE,sCAAsC;AACtC,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,IAAsB,EACtB,SAAgD,EAChD,OAAsC,EACtC,MAGC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAuB,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC;QAClD,MAAM,YAAY,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,GAAG,GAAqB;YAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ;YACR,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM;YAC3B,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,CAAC;YACX,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE,YAAY,EAAE,QAAQ,IAAI,CAAC;YAC7C,iBAAiB,EAAE,YAAY,EAAE,SAAS,IAAI,CAAC;YAC/C,aAAa,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;SACxC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBAC/C,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC;gBACnB,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,CAAC,EAAE,UAAU,IAAI,IAAI,CAAC;YACrC,IAAI,MAAM,KAAK,iBAAiB,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,WAAW,CAAC,EAAE,CAAC;gBACrE,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;gBACjB,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;iBAAM,IACL,MAAM,KAAK,kBAAkB;gBAC7B,CAAC,CAAC,CAAC,IAAI,QAAQ,KAAK,SAAS,CAAC,EAC9B,CAAC;gBACD,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,IAAI,CACP,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC9E,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,4EAA4E;AAC5E,oBAAoB;AACpB,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAClD,wEAAwE;IACxE,uEAAuE;IACvE,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,MAAM,GAAG,IAAI,GAAG,EAGnB,CAAC;IACJ,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8C,CAAC;IACxE,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAC9D,IAAI,GAAG,KAAK,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAClC,CAAC;gBACJ,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IACD,yEAAyE;IACzE,IAAI,GAAG,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,UAAU,GAAiB,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,oBAAoB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9D,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,UAAU,CAAC;IACvB,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,2EAA2E;IAC3E,+CAA+C;IAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;IACzB,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IACD,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvE,OAAO,mBAAmB,CACxB,MAAM,EACN,IAAI,EACJ,GAAG,CAAC,QAAQ,EACZ,CAAC,IAAI,EAAE,EAAE,CACP,mBAAmB,CACjB,GAAG,CAAC,QAAQ,EACZ,UAAU,EACV,SAAS,EACT,IAAI,EACJ,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,YAAY,CACjB,EACH,MAAM,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/cli/projects.ts"],"names":[],"mappings":"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"}
@@ -7,8 +7,8 @@ import { computeCost } from "../cost/pricing.js";
7
7
  import { Distiller, normalizeModelName, resolveModelShorthand } from "../pipeline/distiller.js";
8
8
  import { ClaudeCliLimitError } from "../pipeline/claudeCli.js";
9
9
  import { acquireLock, LockHeldError, releaseLock } from "../pipeline/lock.js";
10
- import { parseSession } from "../pipeline/parser.js";
11
- import { projectNameFor } from "../pipeline/projects.js";
10
+ import { decideProject } from "../pipeline/projects.js";
11
+ import { buildSources, resolveSource } from "../sources/registry.js";
12
12
  import { scrub } from "../pipeline/scrubber.js";
13
13
  import { filterToolCalls } from "../pipeline/toolCallFilter.js";
14
14
  import { VaultWriter } from "../pipeline/writer.js";
@@ -38,6 +38,32 @@ export function selectReconcileTargets(rows, force = false) {
38
38
  (r.error !== null && r.error !== "")) &&
39
39
  (force || (r.attempts ?? 0) < MAX_DISTILL_ATTEMPTS));
40
40
  }
41
+ // The filters `vir run` applies before any paid call, in the same order:
42
+ // transcript category, SDK-agent entrypoint, project decision. A row that
43
+ // errored before these existed (or before a project was excluded) must not be
44
+ // retried past them. Returns the skip reason, or null when the row may retry.
45
+ export function reconcileGate(t, cfg) {
46
+ const source = resolveSource(buildSources(cfg), t.path);
47
+ if (cfg.workflowTranscripts !== "include") {
48
+ const cat = source.category(t.path);
49
+ if (cat !== "session") {
50
+ return {
51
+ reason: cat === "workflow" ? "workflow-transcript" : "sidechain-transcript",
52
+ };
53
+ }
54
+ }
55
+ if (cfg.agentTranscripts !== "include") {
56
+ const entrypoint = source.agentEntrypoint(t.path);
57
+ if (entrypoint !== null)
58
+ return { reason: "agent-transcript", entrypoint };
59
+ }
60
+ const decision = decideProject(source.projectName(t.path), cfg.projects ?? {});
61
+ if (decision === "exclude")
62
+ return { reason: "project-excluded" };
63
+ if (decision === "pending")
64
+ return { reason: "project-pending" };
65
+ return null;
66
+ }
41
67
  // A target whose transcript is gone can't be retried. If an earlier good
42
68
  // distill survives (the orphan shape: error set, content kept), the stale
43
69
  // error is the only thing hiding that note from listDistilled — clear it.
@@ -48,6 +74,11 @@ export function handleMissingSource(t, clearError) {
48
74
  clearError(t.path);
49
75
  return "restored";
50
76
  }
77
+ // Retry cost for display: the subscription path spends quota, not dollars,
78
+ // so it never shows a misleading $0.
79
+ export function reconcileCostLabel(provider, usd) {
80
+ return provider === "claude-cli" ? "quota" : ui.formatUsd(usd);
81
+ }
51
82
  // Build the per-target summary (cost estimate + collateral flag) without doing
52
83
  // any network work. Used by both the dry-run report and the live confirmation.
53
84
  export function summarizeReconcileTargets(cfg, targets, costSessionIds, forceDistillModel) {
@@ -62,10 +93,11 @@ export function summarizeReconcileTargets(cfg, targets, costSessionIds, forceDis
62
93
  if (hadCostRecord)
63
94
  collateralCount += 1;
64
95
  let estimatedCost = 0;
96
+ const missing = !existsSync(t.path);
65
97
  // Subscription path: retries cost quota, not dollars — estimate stays 0.
66
- if (cfg.provider !== "claude-cli" && existsSync(t.path)) {
98
+ if (cfg.provider !== "claude-cli" && !missing) {
67
99
  try {
68
- const parsed = parseSession(t.path, t.hash);
100
+ const parsed = resolveSource(buildSources(cfg), t.path).parse(t.path, t.hash);
69
101
  const classifyIn = Math.ceil(scrub(parsed.rawSummary).length / CHARS_PER_TOKEN);
70
102
  const distillIn = Math.ceil(scrub(filterToolCalls(parsed.transcriptText, cfg.filterToolCalls).filtered).length / CHARS_PER_TOKEN);
71
103
  estimatedCost =
@@ -82,6 +114,7 @@ export function summarizeReconcileTargets(cfg, targets, costSessionIds, forceDis
82
114
  sessionId,
83
115
  hadCostRecord,
84
116
  estimatedCost,
117
+ missing,
85
118
  });
86
119
  }
87
120
  return { rows, totalCost, collateralCount };
@@ -119,7 +152,40 @@ export async function runReconcile(cfg, opts = {}) {
119
152
  try {
120
153
  ui.header(opts.dryRun ? "reconcile --dry-run" : "reconcile");
121
154
  ui.blank();
122
- const targets = selectReconcileTargets(db.listReconcileTargets(), opts.force === true);
155
+ const candidates = selectReconcileTargets(db.listReconcileTargets(), opts.force === true);
156
+ // Same filters as `vir run`. A gated row leaves the retry list with its
157
+ // skip reason (it re-enters if the config changes); one that still holds
158
+ // an earlier good note keeps it, since excluding never touches notes.
159
+ const targets = [];
160
+ const gatedBy = new Map();
161
+ for (const t of candidates) {
162
+ const gate = existsSync(t.path) ? reconcileGate(t, cfg) : null;
163
+ if (gate === null) {
164
+ targets.push(t);
165
+ continue;
166
+ }
167
+ gatedBy.set(gate.reason, (gatedBy.get(gate.reason) ?? 0) + 1);
168
+ if (opts.dryRun)
169
+ continue;
170
+ if (t.content !== null && t.content !== "") {
171
+ db.keepNote(t.path, t.hash);
172
+ }
173
+ else {
174
+ db.record({
175
+ path: t.path,
176
+ hash: t.hash,
177
+ skipped: true,
178
+ notePaths: [],
179
+ skipReason: gate.reason,
180
+ ...(gate.entrypoint ? { entrypoint: gate.entrypoint } : {}),
181
+ });
182
+ }
183
+ }
184
+ if (gatedBy.size > 0) {
185
+ const total = [...gatedBy.values()].reduce((a, b) => a + b, 0);
186
+ const parts = [...gatedBy.entries()].map(([r, n]) => `${n} ${r}`).join(", ");
187
+ ui.row(ui.warn(ui.WARN_GLYPH), ui.text(`${total} excluded by the same filters as vir run (${parts})${opts.dryRun ? "" : " — recorded, not retried"}`));
188
+ }
123
189
  if (targets.length === 0) {
124
190
  ui.row(ui.success(ui.CHECK), ui.text("nothing to reconcile — every session has content"));
125
191
  return;
@@ -140,13 +206,24 @@ export async function runReconcile(cfg, opts = {}) {
140
206
  for (const r of rows) {
141
207
  const id = r.sessionId.slice(0, 8);
142
208
  const marker = r.hadCostRecord ? ui.warn("$") : ui.dim(" ");
143
- ui.line(` ${ui.dim(ui.BULLET)} ${marker} ${ui.text(id.padEnd(10))} ${ui.dim(`est ${ui.formatUsd(r.estimatedCost)}`)}`);
209
+ const est = r.missing
210
+ ? "transcript gone"
211
+ : `est ${reconcileCostLabel(cfg.provider, r.estimatedCost)}`;
212
+ ui.line(` ${ui.dim(ui.BULLET)} ${marker} ${ui.text(id.padEnd(10))} ${ui.dim(est)}`);
144
213
  }
214
+ const missingCount = rows.filter((r) => r.missing).length;
145
215
  ui.blank();
146
216
  ui.divider();
147
217
  ui.summary({
148
- recoverable: { value: rows.length, color: ui.info },
149
- "est. retry cost": { value: ui.formatUsd(totalCost), color: ui.warn },
218
+ recoverable: { value: rows.length - missingCount, color: ui.info },
219
+ "transcript gone": {
220
+ value: missingCount,
221
+ color: missingCount > 0 ? ui.warn : ui.dim,
222
+ },
223
+ "est. retry cost": {
224
+ value: reconcileCostLabel(cfg.provider, totalCost),
225
+ color: ui.warn,
226
+ },
150
227
  "false-cost collateral": {
151
228
  value: collateralCount,
152
229
  color: collateralCount > 0 ? ui.warn : ui.dim,
@@ -185,7 +262,8 @@ export async function runReconcile(cfg, opts = {}) {
185
262
  // are cached but we know their stored content is empty, so we want a
186
263
  // forced retry. Parse, score, distill, then update the row in place.
187
264
  try {
188
- const parsed = parseSession(t.path, t.hash, projectNameFor(t.path, cfg.claudeProjectsDir));
265
+ const source = resolveSource(buildSources(cfg), t.path);
266
+ const parsed = source.parse(t.path, t.hash, source.projectName(t.path));
189
267
  const outcome = await distillOneSession(parsed, t, {
190
268
  cfg,
191
269
  db,
@@ -216,11 +294,20 @@ export async function runReconcile(cfg, opts = {}) {
216
294
  process.exitCode = 1;
217
295
  break;
218
296
  }
219
- // A retry that fails again must leave the row as-is (content still
220
- // null/empty) so the next reconcile pass can catch it. Do NOT mark
221
- // it processed-with-empty.
297
+ // A retry that fails again stays a reconcile target (content still
298
+ // null/empty, never marked processed-with-empty).
222
299
  stillFailed += 1;
223
300
  const msg = err.message ?? String(err);
301
+ // Count the failure like vir run does: recordError keeps the row's
302
+ // hash and content and bumps attempts, so a target that keeps failing
303
+ // is parked after MAX_DISTILL_ATTEMPTS instead of retried (and paid
304
+ // for) on every pass. --force still retries parked rows.
305
+ try {
306
+ db.recordError(t.path, t.hash, msg);
307
+ }
308
+ catch {
309
+ // a bookkeeping failure must not hide the retry result
310
+ }
224
311
  ui.row(ui.errorColor(ui.CROSS), ui.text(`retry failed: ${deriveSessionId(t.path).slice(0, 8)} — ${msg}`));
225
312
  }
226
313
  }