codeburn/docs/providers/cline.md
Rick Culpepper (claude) 448d470049 feat(providers): add cline-cli provider for Cline CLI sessions
The Cline CLI (npm `cline`, 3.x) stores sessions as
<sessions>/<id>/<id>.json + <id>.messages.json. The existing `cline`
provider only discovers tasks/<id>/ui_messages.json, so every CLI session
was silently reported as $0.00 — no warning, not even under --verbose.

Adds `cline-cli` as its own provider rather than a third root on `cline`,
leaving the shared Cline-family parser (Roo Code, KiloCode, IBM Bob)
untouched. It mirrors the CLI's own root resolution
(CLINE_SESSION_DATA_DIR -> CLINE_DATA_DIR -> CLINE_DIR -> ~/.cline),
implements probeRoots() so `doctor` can tell "not installed" from "wrong
override", emits one call per assistant message's `metrics` block, and
falls back to the session rollup when a session carries none. The
fallback reads `usage`, not `aggregateUsage`, which folds in spawned
subagents that are themselves separate session directories.

Two supporting changes, both required for CLI costs to report correctly:

- parser.ts re-priced cline-cli calls from tokens because the provider
  was not on the reported-cost allowlist, inflating a real 12-session
  local sample from $1.11 to $3.92.
- session-cache.ts gains the matching PROVIDER_ENV_VARS entry (so a
  changed override invalidates) and a `reported-cost-v1` parse version
  (so sessions cached before the allowlist fix re-parse once instead of
  being re-priced forever).

Cost is treated as metered only when actually present and non-negative,
so a metered $0 stays reported while a missing or negative cost falls
back to token pricing — applied identically on the per-message and
rollup paths. Timestamps promote a seconds-resolution value rather than
silently landing in 1970, matching the guard kiro.ts uses.

CLINE_DIR / CLINE_DATA_DIR / CLINE_SESSION_DATA_DIR are added to the test
env-isolation list so a developer's real sessions cannot bleed into
fixtures.

The VS Code variant discovery bug reported alongside this in #874 is
deliberately NOT fixed here — it shipped in #882.

Verified against 18 real local sessions: 142 calls, 4,934,762 input /
224,561 output tokens, and a cost matching the CLI's own metered total to
the cent. `codeburn doctor` reports "Cline CLI  OK".

Refs: #874
2026-08-04 02:45:16 +03:00

2.8 KiB

Cline

Cline VS Code extension and Cline home-data task storage.

Sessions from the Cline command-line agent use an unrelated layout and are handled by Cline CLI; this provider does not see them.

  • Source: src/providers/cline.ts
  • Loading: eager (src/providers/index.ts:2)
  • Test: tests/providers/cline.test.ts

Where it reads from

These task roots are scanned:

  1. VS Code extension globalStorage for saoudrizwan.claude-dev, in every supported VS Code variant: stable (Code), Insiders (Code - Insiders), and VSCodium. The per-platform paths come from getVSCodeGlobalStoragePaths in src/providers/vscode-cline-parser.ts, the same helper Roo Code and KiloCode use.
  2. Cline's home-data root at ~/.cline/data.

Every root is expected to contain a tasks/ child directory. Discovery is delegated to discoverClineTasks in src/providers/vscode-cline-parser.ts, so a task is only included when it has a ui_messages.json file.

Storage format

Per-task directories with:

tasks/<taskId>/
  ui_messages.json
  api_conversation_history.json
  task_metadata.json

ui_messages.json provides the api_req_started usage entries. api_conversation_history.json is used for model extraction. See vscode-cline-parser for the full schema description. task_metadata.json is part of Cline's task layout but is not read by CodeBurn today.

Caching

None at the provider level; delegates to the shared helper and normal parser/cache layers.

Deduplication

Discovery deduplicates by task id across all Cline roots so a task that exists in more than one root (a migration, or the same extension storage seen by two VS Code variants) is not scanned twice. If the same task id exists in multiple roots, the one with the newest ui_messages.json wins. Parsing still uses the shared per-call key: <providerName>:<taskId>:<index>.

Quirks

  • This provider is intentionally a thin wrapper over the shared Cline-family parser.
  • Cline can keep data in both VS Code globalStorage and ~/.cline/data, depending on version and workflow.
  • A user can run Cline in VS Code stable, Insiders, and VSCodium at the same time; each variant has its own globalStorage tree, so all of them must be scanned.
  • If Cline changes the JSON shape, fix vscode-cline-parser.ts only if Roo Code and KiloCode still pass. Branch provider-specific parsing rather than duplicating the whole parser.

When fixing a bug here

  1. Reproduce with a minimal task directory containing ui_messages.json and api_conversation_history.json.
  2. Run tests/providers/cline.test.ts, plus tests/providers/roo-code.test.ts and tests/providers/kilo-code.test.ts if the shared parser changes.
  3. Keep the provider name cline; downstream filters and dedup keys depend on it.