claude-token-saver 3.11.1 β 3.11.2
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.
- package/README.en.md +2 -2
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/formatters/statusline.js +11 -8
package/README.en.md
CHANGED
|
@@ -77,7 +77,7 @@ The statusline appears at the bottom of Claude Code right away. If auto-registra
|
|
|
77
77
|
| `β¦ current` / `π
weekly` | 5-hour / 7-day rate-limit window usage + reset time |
|
|
78
78
|
| `π¦` | Context usage (e.g. `Ctx 68% of 1M`) β colored by fill. Current models default to 1M with no premium, but token volume itself drives per-turn cost and 5H/7D burn |
|
|
79
79
|
| `π°` | Cumulative savings from prompt caching |
|
|
80
|
-
| `π` | Cumulative savings from
|
|
80
|
+
| `π` | **Cumulative savings from model routing** β what work handled by a cheaper model instead of this one saved. A different number from prompt-cache savings (`π°`). Hidden until a delegation has actually been measured |
|
|
81
81
|
|
|
82
82
|
When something is wrong, a **warning chip leads the line**:
|
|
83
83
|
|
|
@@ -302,7 +302,7 @@ Also update `statusLine.command` in `~/.claude/settings.json` to `claude-token-s
|
|
|
302
302
|
## Release notes
|
|
303
303
|
|
|
304
304
|
### v3.11.0 (2026-08-21)
|
|
305
|
-
- **
|
|
305
|
+
- **Routing savings chip in the statusline** β `π Routing saved $3.2`. Cumulative savings from model routing, placed right after the model name so it reads early in the line. The existing `π° Cache saved` covers the prompt cache and is a different number. Zero or missing data hides the chip entirely, so nothing changes for direct-API users. The statusline only reads `model-rules.json` β it never triggers a scan (it re-renders every few seconds). Segment name: `delegated`.
|
|
306
306
|
- **Role-learning mis-classification fixed** β subagent records sometimes land in the parent transcript without an `isSidechain` flag, and that circumstantial evidence could outvote stated evidence, confirming a haiku profile as the session model (measured: 16 against 1, agreement exactly at the 80% line). Stated evidence (`Task(model:)` parameters, agent-definition frontmatter) and inferred evidence are now tallied separately, and an inference is not adopted when stated evidence contradicts it. Undecided ids stay `unknown` and leave the aggregate.
|
|
307
307
|
|
|
308
308
|
### v3.10.0 (2026-08-20)
|
package/README.md
CHANGED
|
@@ -76,7 +76,7 @@ npm i -g claude-token-saver
|
|
|
76
76
|
| `β¦ current` / `π
weekly` | 5μκ° / 7μΌ rate-limit μλ μ¬μ©λ₯ + 리μ
μκ° |
|
|
77
77
|
| `π¦` | 컨ν
μ€νΈ μ¬μ©λ₯ (μ: `Ctx 68% of 1M`) β μ¬μ©λ₯ κΈ°μ€ λ
Ή/ν©/μ . νμ¬ λͺ¨λΈμ 1Mμ΄ κΈ°λ³ΈΒ·ν리미μ μμμ΄μ§λ§, ν ν°λ μμ²΄κ° ν΄λΉ λΉμ©κ³Ό 5H/7D νλλ₯Ό νμλλ€ |
|
|
78
78
|
| `π°` | μΊμκ° μ μ½ν΄μ€ λμ κΈμ‘ |
|
|
79
|
-
| `π` |
|
|
79
|
+
| `π` | **λͺ¨λΈ μμμΌλ‘ μλ λμ λΉμ©** β κ°μ μΌμ λ μΌ λͺ¨λΈμ΄ λμ μ²λ¦¬ν΄μ μλ κΈμ‘μ΄λ©°, ν둬ννΈ μΊμ μ κ°(`π°`)κ³Όλ λ€λ₯Έ μμΉμ
λλ€. μ€μΈ‘ μμμ΄ μμΌλ©΄ νμλμ§ μμ΅λλ€ |
|
|
80
80
|
|
|
81
81
|
λ¬Έμ κ° κ°μ§λλ©΄ **κ²½κ³ μΉ©μ΄ λ§¨ μμ** λΆμ΅λλ€:
|
|
82
82
|
|
|
@@ -258,7 +258,7 @@ npm uninstall -g claude-cache-monitor && npm i -g claude-token-saver
|
|
|
258
258
|
## λ¦΄λ¦¬μ€ λ
ΈνΈ
|
|
259
259
|
|
|
260
260
|
### v3.11.0 (2026-08-21)
|
|
261
|
-
- **statuslineμ μμ μ κ° μΉ© μΆκ°** β `π
|
|
261
|
+
- **statuslineμ μμ μ κ° μΉ© μΆκ°** β `π Routing saved $3.2`. λͺ¨λΈ μμμΌλ‘ μλ λμ λΉμ©μ΄λ©°, λͺ¨λΈ μ΄λ¦ λ°λ‘ λ€μ λμ¬ μ€ μμͺ½μμ μ½νλλ€. κΈ°μ‘΄ `π° Cache saved`(ν둬ννΈ μΊμ μ κ°)μλ λ€λ₯Έ μμΉμ
λλ€. κ°μ΄ 0μ΄κ±°λ λ°μ΄ν°κ° μμΌλ©΄ μΉ©μ μμ κ·Έλ¦¬μ§ μμ μ§μ API μ¬μ©μμκ²λ μ무κ²λ λμ§ μμ΅λλ€. statuslineμ `model-rules.json`μ μ½κΈ°λ§ νλ©° μ€μΊμ λλ¦¬μ§ μμ΅λλ€(5μ΄λ§λ€ νΈμΆλλ μ리μ
λλ€). μΈκ·Έλ¨ΌνΈ μ΄λ¦μ `delegated`μ
λλ€.
|
|
262
262
|
- **μν νμ΅μ μ€λΆλ₯ μμ ** β μλΈμμ΄μ νΈ λ μ½λκ° λΆλͺ¨ νΈλμ€ν¬λ¦½νΈμ `isSidechain` μμ΄ μμ¬ λ€μ΄μ€λ κ²½μ°κ° μμ΄, κ·Έ μ ν© μ¦κ±°κ° λͺ
μ μ¦κ±°λ₯Ό μ΄κ²¨ haiku νλ‘νμΌμ΄ μΈμ
λͺ¨λΈλ‘ νμ λκ³€ νμ΅λλ€(μ€μΈ‘ 16건 λ 1건, ν©μμ¨ μ νν 80%). μ΄μ **λͺ
μ μ¦κ±°(`Task(model:)` νλΌλ―Έν°Β·μμ΄μ νΈ μ μ frontmatter)μ μ ν© μ¦κ±°(sidechain νλκ·Έ λΆμ¬)λ₯Ό λΆλ¦¬ν΄ μ§κ³**νκ³ , λͺ
μ μ¦κ±°κ° μ΄λ₯Ό λ°λ°νλ©΄ μ ν© μΆλ‘ μ μ±ννμ§ μμ΅λλ€. νμ μ΄ μ λλ©΄ `unknown`μΌλ‘ λ¨μ μ§κ³μμ λΉ μ§λλ€.
|
|
263
263
|
|
|
264
264
|
### v3.10.0 (2026-08-20)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-token-saver",
|
|
3
|
-
"version": "3.11.
|
|
3
|
+
"version": "3.11.2",
|
|
4
4
|
"description": "Route the easy work your expensive Claude model keeps repeating down to haiku/sonnet β post-hoc session analysis, no realtime router, no extra LLM calls.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -260,14 +260,15 @@ export function formatReport(data, { color = true, verbose = false, timer = true
|
|
|
260
260
|
// tier saved, summed from the rule registry route-scan maintains. Hidden
|
|
261
261
|
// when zero or absent: a permanent "$0" is noise for direct-API users and
|
|
262
262
|
// for anyone who has not delegated yet.
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
//
|
|
266
|
-
//
|
|
263
|
+
// "Routing saved" says what earned the money β work that ran on a cheaper
|
|
264
|
+
// model instead of this one. It leads the line rather than trailing it
|
|
265
|
+
// because it is the headline number of the whole tool, not a footnote.
|
|
266
|
+
// text: "Routing saved $3.2" | same in verbose
|
|
267
|
+
// icon: "π $3.2" | verbose: "π Routing saved $3.2"
|
|
267
268
|
const delegationSaved = Number(data.delegationSaved) || 0;
|
|
268
269
|
const delegateLabel = isIcon
|
|
269
|
-
? (verbose ? 'π
|
|
270
|
-
: '
|
|
270
|
+
? (verbose ? 'π Routing saved' : 'π')
|
|
271
|
+
: 'Routing saved';
|
|
271
272
|
const delegateSeg = delegationSaved > 0
|
|
272
273
|
? `${c(GREEN)}${delegateLabel}${c(RESET)} ${formatMoney(delegationSaved)}`
|
|
273
274
|
: null;
|
|
@@ -489,6 +490,10 @@ export function formatReport(data, { color = true, verbose = false, timer = true
|
|
|
489
490
|
if (spikeSeg && want('spike')) segs.push(spikeSeg);
|
|
490
491
|
if (harnessSeg && want('harness')) segs.push(harnessSeg);
|
|
491
492
|
if (modelSeg && want('model')) segs.push(modelSeg);
|
|
493
|
+
// Delegation savings ride up front, next to the model that would otherwise
|
|
494
|
+
// have done the work. "Cache saved" stays at the tail: it is a lifetime brag
|
|
495
|
+
// stat, while this one is the point of the tool.
|
|
496
|
+
if (delegateSeg && want('delegated')) segs.push(delegateSeg);
|
|
492
497
|
if (want('hit')) segs.push(hitSeg);
|
|
493
498
|
if (want('ttl')) segs.push(ttlSeg);
|
|
494
499
|
for (const { key, seg } of usageSegs) {
|
|
@@ -499,8 +504,6 @@ export function formatReport(data, { color = true, verbose = false, timer = true
|
|
|
499
504
|
// it sits near the tail. The period label closes the line as a quiet
|
|
500
505
|
// timeframe footer.
|
|
501
506
|
if (want('saved')) segs.push(saveSeg);
|
|
502
|
-
// Both savings numbers sit side by side, then the period label closes the line.
|
|
503
|
-
if (delegateSeg && want('delegated')) segs.push(delegateSeg);
|
|
504
507
|
if (want('period')) segs.push(periodSeg);
|
|
505
508
|
// Trailing erase-to-end-of-line so any leftover characters from a previous
|
|
506
509
|
// (longer) statusline render don't bleed into ours. \x1b[K is the standard
|