claude-token-saver 3.19.0 โ†’ 3.20.1

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 CHANGED
@@ -4,54 +4,64 @@
4
4
 
5
5
  # claude-token-saver
6
6
 
7
- ## ๐Ÿ”€ Routing saved โ€” the reason this tool exists
7
+ **Moves the easy work your expensive model keeps repeating onto cheaper ones, and shows what that actually saved โ€” measured, in your statusline.** Zero dependencies, one-line install.
8
8
 
9
9
  ![statusline example โ€” routing savings on row 1, diagnostics on row 2](./docs/statusline.png)
10
10
 
11
- **That figure on the first statusline row is the headline metric.** It is money actually saved by moving the easy work your expensive model kept repeating onto cheaper ones, and right beside it is which model that money moved off, and onto what.
11
+ ```bash
12
+ npm i -g claude-token-saver
13
+ ```
12
14
 
13
- The other half of the savings comes from the **๐Ÿ…ท Harness and ratchet**. The harness blocks the habits that waste the most tokens โ€” completion claims with no evidence, skipped verification โ€” with five principles, and the ratchet freezes each error you hit into a rule so it does not recur. The measured โˆ’18.6% figure below comes from adopting those two, not from routing ([details](#real-world-impact--beforeafter-report)); routing savings sit on top of it. One install sets up all three.
15
+ ## Three parts, working together
14
16
 
15
- It is not an estimate or a marketing number: it comes out of a **ledger**. For every delegated subagent run it records
17
+ | | What it does | Effect |
18
+ |---|---|---|
19
+ | ๐Ÿ”€ **Routing** | Delegates recurring easy work to cheaper models | Savings recorded per run in a ledger |
20
+ | ๐Ÿ…ท **Harness** | Blocks the token-burning habits: unevidenced "done", skipped verification (5 principles) | **โˆ’18.6% cost** ([measured](#real-world-impact--beforeafter-report)) |
21
+ | โš™๏ธ **Ratchet** | Freezes each error you hit into a rule | Same mistake stops recurring |
22
+
23
+ One install sets up all three. The measured โˆ’18.6% comes from the harness and ratchet; routing savings sit on top of it.
16
24
 
17
- - **before** โ€” the model that handled this category before the rule existed
18
- - **after** โ€” the model that actually ran it
19
- - **the gap** โ€” the same token counts priced against both
25
+ ## ๐Ÿ”€ The savings figure is a ledger entry, not an estimate
20
26
 
21
- so `route-scan savings` traces **every dollar back to the rule that produced it.**
27
+ Every delegated run is recorded like this:
28
+
29
+ ```
30
+ before after gap
31
+ claude-opus-5 โ†’ haiku-4-5 = $0.57
32
+ (the model (what (same token counts,
33
+ handling this actually priced against
34
+ before the rule) ran it) both models)
35
+ ```
22
36
 
23
37
  ```bash
24
- $ claude-token-saver route-scan savings
38
+ $ claude-token-saver route-scan savings # trace every dollar back to its rule
25
39
 
26
40
  ๐Ÿ”€ Routing saved, lifetime $2.09 (last 7d $1.40 ยท 30d $2.09)
27
41
 
28
42
  By model change:
29
- claude-fable-5 โ†’ claude-sonnet-5 โ€” 1 run, $0.72
30
- claude-opus-5 โ†’ claude-haiku-4-5 โ€” 1 run, $0.57
43
+ claude-fable-5 โ†’ claude-sonnet-5 โ€” 1 run, $0.72
44
+ claude-opus-5 โ†’ claude-haiku-4-5 โ€” 1 run, $0.57
31
45
 
32
46
  By run (newest first):
33
47
  2026-08-22 $0.51 claude-fable-5 โ†’ claude-haiku-4-5
34
48
  rule: T2|paste|-Users-me-projects-my-app
35
49
  ```
36
50
 
37
- **Counting honestly is the design principle.** Delegations no registered rule covers โ€” `Explore`, your own agents, a plugin's subagents โ€” were not routed by this tool, so they are **excluded**. When the pricing table cannot recognize a model id, the run is **dropped** rather than priced wrong. The number may be small, but it is real.
51
+ **What is excluded** โ€” an honest number beats a big one:
38
52
 
39
- ```bash
40
- npm i -g claude-token-saver # postinstall auto-registers the statusline + Skill
41
- ```
53
+ - Delegations no registered rule covers (`Explore`, your own agents, plugin subagents): this tool did not route them.
54
+ - Model ids the pricing table cannot recognize: the run is dropped rather than priced wrong.
42
55
 
43
56
  ---
44
57
 
45
- ## โšก Why โ€” the 30-second pitch
58
+ ## โšก What else the statusline catches
46
59
 
47
60
  | | |
48
61
  |---|---|
49
- | ๐Ÿ”€ **Measured routing savings** | Every delegated run's saving is recorded in a ledger โ†’ lifetime total plus the model-change breakdown on statusline row 1 (audit it all with `route-scan savings`) |
50
- | ๐ŸŽฏ **Model-fitting delegation** | Classifies the easy work your expensive model (opus/fable) keeps repeating into tiers (T0/T1/T2) โ†’ promotes haiku/sonnet delegation rules, auto-applied from the next session |
51
- | ๐Ÿ’ธ **โˆ’18.6% measured cost** | Cost per user message $2.35 โ†’ $1.91 after adopting harness+ratchet (author's logs, [details](#real-world-impact--beforeafter-report)) |
52
- | ๐Ÿšจ **No surprise rate limits** | Instant warning when the 5H/7D window hits 90% + `handoff` to back up your work |
53
- | ๐Ÿง  **Cache waste detection** | Hit rate, TTL countdown, 1M-context detection โ€” token spikes diagnosed with issue codes |
54
- | ๐Ÿ…ท **Stop repeating mistakes** | Recurring errors get promoted to ratchet rules โ€” auto-applied from the next session |
62
+ | ๐Ÿšจ **No surprise rate limits** | Warns when the 5H/7D window hits 90%; `handoff` backs up your work |
63
+ | ๐Ÿง  **Cache waste detection** | Hit rate, TTL, 1M-context detection โ€” spikes diagnosed with issue codes |
64
+ | ๐Ÿ‡ฐ๐Ÿ‡ท **Korean writing guidance** | Enabled automatically on a Korean locale ([below](#-korean-writing-guidance)) |
55
65
 
56
66
  ## Not a router โ€” 60 seconds
57
67
 
@@ -369,6 +379,9 @@ Also update `statusLine.command` in `~/.claude/settings.json` to `claude-token-s
369
379
 
370
380
  ## Release notes
371
381
 
382
+ ### v3.20.0 (2026-08-22)
383
+ - **The README opening is now scannable** โ€” prose replaced by a one-line summary, the screenshot, and the install command up top. The three parts (routing, harness, ratchet) are a table; how a saving is computed (before โ†’ after โ†’ gap) is a diagram. The old 30-second pitch table, which repeated all of it, now lists only what the statusline additionally catches.
384
+
372
385
  ### v3.19.0 (2026-08-22)
373
386
  - **Korean writing guidance** โ€” corrects how Claude writes Korean (dropped sentence parts, noun-stopped sentences, translationese, em-dash overuse), injected once per session. Claude Code's output styles occupy a single global slot and must be configured per machine; this ships the guidance in the package and delivers it through the SessionStart hook already installed, so it **applies in every project and leaves the output-style slot free.** Text vendored from [fluent-korean](https://github.com/snflkd/fluent-korean) (Copyright (c) 2026 snflkd, MIT), license included.
374
387
  - **Decided at install time** โ€” a Korean system locale turns it on; anything else leaves it off. Your own on/off choice is preserved, so upgrades never override it. Skip with `CTS_NO_KOREAN=1`; a `๊ฐ€` chip shows in the statusline when active.
package/README.md CHANGED
@@ -4,54 +4,64 @@
4
4
 
5
5
  # claude-token-saver
6
6
 
7
- ## ๐Ÿ”€ Routing saved: ์ด ๋„๊ตฌ๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ 
7
+ **๋น„์‹ผ ๋ชจ๋ธ์ด ๋ฐ˜๋ณตํ•˜๋˜ ์‰ฌ์šด ์ž‘์—…์„ ์‹ผ ๋ชจ๋ธ๋กœ ๋‚ด๋ ค๋ณด๋‚ด๊ณ , ๊ทธ๋ ‡๊ฒŒ ์•„๋‚€ ๊ธˆ์•ก์„ statusline์— ์‹ค์ธก์œผ๋กœ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.** ์˜์กด์„ฑ 0, ์„ค์น˜ ํ•œ ์ค„.
8
8
 
9
9
  ![statusline ์˜ˆ์‹œ. ์ฒซ์งธ ์ค„์€ ๋ผ์šฐํŒ… ์ ˆ๊ฐ์•ก์ด๊ณ  ๋‘˜์งธ ์ค„์€ ์ง„๋‹จ ์นฉ์ž…๋‹ˆ๋‹ค](./docs/statusline.png)
10
10
 
11
- **statusline ์ฒซ์งธ ์ค„์˜ ์ด ๊ธˆ์•ก์ด ์ด ๋„๊ตฌ์˜ ๋Œ€ํ‘œ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.** ๋น„์‹ผ ๋ชจ๋ธ์ด ๋ฐ˜๋ณตํ•ด์„œ ์ฒ˜๋ฆฌํ•ด ์˜จ ์‰ฌ์šด ์ž‘์—…์„ ๋” ์‹ผ ๋ชจ๋ธ์— ๋„˜๊ฒจ์„œ **์‹ค์ œ๋กœ ์ ˆ๊ฐํ•œ ๋น„์šฉ**์ด๋ฉฐ, ๊ทธ ์˜†์—๋Š” ์–ด๋А ๋ชจ๋ธ์—์„œ ์–ด๋А ๋ชจ๋ธ๋กœ ์ž‘์—…์ด ์˜ฎ๊ฒจ ๊ฐ€๋ฉด์„œ ๊ทธ ๊ธˆ์•ก์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€๊ฐ€ ํ•จ๊ป˜ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
11
+ ```bash
12
+ npm i -g claude-token-saver
13
+ ```
14
+
15
+ ## ์„ธ ๊ฐ€์ง€๊ฐ€ ํ•จ๊ป˜ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค
16
+
17
+ | | ํ•˜๋Š” ์ผ | ํšจ๊ณผ |
18
+ |---|---|---|
19
+ | ๐Ÿ”€ **๋ผ์šฐํŒ…** | ๋ฐ˜๋ณต๋˜๋Š” ์‰ฌ์šด ์ž‘์—…์„ ๋” ์‹ผ ๋ชจ๋ธ์— ์œ„์ž„ | ์ ˆ๊ฐ์•ก์„ ์›์žฅ์— ์‹ค์ธก ๊ธฐ๋ก |
20
+ | ๐Ÿ…ท **Harness** | ์ฆ๊ฑฐ ์—†๋Š” ์™„๋ฃŒ ๋ณด๊ณ ยท๊ฒ€์ฆ ์ƒ๋žต ์ฐจ๋‹จ (5์›์น™) | **๋น„์šฉ โˆ’18.6%** ([์‹ค์ธก](#์‹ค์ œ-ํšจ๊ณผ-๋„์ž…-์ „ํ›„-๋ฆฌํฌํŠธ)) |
21
+ | โš™๏ธ **Ratchet** | ํ•œ ๋ฒˆ ๊ฒช์€ ์—๋Ÿฌ๋ฅผ ๋ฃฐ๋กœ ๊ณ ์ • | ๊ฐ™์€ ์‹ค์ˆ˜ ์žฌ๋ฐœ ์ฐจ๋‹จ |
12
22
 
13
- ์ด ๊ธˆ์•ก์„ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜์€ **๐Ÿ…ท Harness์™€ ratchet**์ž…๋‹ˆ๋‹ค. Harness๋Š” ์ฆ๊ฑฐ ์—†๋Š” ์™„๋ฃŒ ๋ณด๊ณ ์™€ ๊ฒ€์ฆ ์ƒ๋žต์ฒ˜๋Ÿผ ํ† ํฐ์„ ๊ฐ€์žฅ ๋งŽ์ด ๋‚ญ๋น„ํ•˜๋Š” ์Šต๊ด€์„ ๋‹ค์„ฏ ๊ฐ€์ง€ ์›์น™์œผ๋กœ ๋ง‰๊ณ , ratchet์€ ํ•œ ๋ฒˆ ๊ฒช์€ ์—๋Ÿฌ๋ฅผ ๋ฃฐ๋กœ ๊ตณํ˜€ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋น„์šฉ์„ 18.6% ์ค„์ธ ์‹ค์ธก์น˜๋Š” ๋ผ์šฐํŒ…์ด ์•„๋‹ˆ๋ผ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ๋„์ž…ํ•œ ์ „ํ›„๋ฅผ ๋น„๊ตํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค([์ƒ์„ธ](#์‹ค์ œ-ํšจ๊ณผ-๋„์ž…-์ „ํ›„-๋ฆฌํฌํŠธ)). ๋ผ์šฐํŒ… ์ ˆ๊ฐ์•ก์€ ๊ทธ ์œ„์— ์–นํžˆ๋Š” ๋ชซ์ด๋ฉฐ, ์„ธ ๊ธฐ๋Šฅ์€ ์„ค์น˜ ํ•œ ๋ฒˆ์œผ๋กœ ํ•จ๊ป˜ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
23
+ ์„ค์น˜ ํ•œ ๋ฒˆ์ด๋ฉด ์…‹ ๋‹ค ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ธก โˆ’18.6%๋Š” Harness์™€ ratchet์˜ ๋ชซ์ด๊ณ , ๋ผ์šฐํŒ… ์ ˆ๊ฐ์•ก์€ ๊ทธ ์œ„์— ์–นํž™๋‹ˆ๋‹ค.
14
24
 
15
- ์ด ์ˆซ์ž๋Š” ์ถ”์ •์น˜๋‚˜ ํ™๋ณด ๋ฌธ๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ **์›์žฅ(ledger)์— ๊ธฐ๋ก๋œ ์‹ค์ธก๊ฐ’์ž…๋‹ˆ๋‹ค.** ์œ„์ž„๋œ ์„œ๋ธŒ์—์ด์ „ํŠธ ์‹คํ–‰ ํ•˜๋‚˜ํ•˜๋‚˜๋งˆ๋‹ค ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
25
+ ## ๐Ÿ”€ ์ ˆ๊ฐ์•ก์€ ์ถ”์ •์ด ์•„๋‹ˆ๋ผ ์›์žฅ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค
16
26
 
17
- - **๊ธฐ์ค€ ๋ชจ๋ธ(before):** ๋ฃฐ์„ ์Šน๊ฒฉํ•˜๊ธฐ ์ „์— ๊ทธ ์œ ํ˜•์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
18
- - **์‹คํ–‰ ๋ชจ๋ธ(after):** ๊ทธ ์ž‘์—…์„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
19
- - **์ฐจ์•ก:** ๋™์ผํ•œ ํ† ํฐ๋Ÿ‰์— ๋‘ ๋ชจ๋ธ์˜ ๊ฐ€๊ฒฉํ‘œ๋ฅผ ๊ฐ๊ฐ ์ ์šฉํ•ด ๊ณ„์‚ฐํ•œ ๊ฐ’์ž…๋‹ˆ๋‹ค.
27
+ ์œ„์ž„๋œ ์‹คํ–‰ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ์ด๋ ‡๊ฒŒ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
20
28
 
21
- ๊ทธ๋ž˜์„œ `route-scan savings` ๋ช…๋ น ํ•œ ๋ฒˆ์ด๋ฉด **๋ชจ๋“  ๊ธˆ์•ก์„ ์–ด๋–ค ๋ฃฐ์ด ๋งŒ๋“ค์–ด ๋ƒˆ๋Š”์ง€๊นŒ์ง€ ๊ฑฐ์Šฌ๋Ÿฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.**
29
+ ```
30
+ ๊ธฐ์ค€ ๋ชจ๋ธ ์‹คํ–‰ ๋ชจ๋ธ ์ฐจ์•ก
31
+ claude-opus-5 โ†’ haiku-4-5 = $0.57
32
+ (๋ฃฐ ์Šน๊ฒฉ ์ „ (์‹ค์ œ๋กœ (๊ฐ™์€ ํ† ํฐ๋Ÿ‰์—
33
+ ์ด ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•œ ๋‘ ๋ชจ๋ธ ๊ฐ€๊ฒฉํ‘œ๋ฅผ
34
+ ์ฒ˜๋ฆฌํ•˜๋˜ ๋ชจ๋ธ) ๋ชจ๋ธ) ๊ฐ๊ฐ ์ ์šฉ)
35
+ ```
22
36
 
23
37
  ```bash
24
- $ claude-token-saver route-scan savings
38
+ $ claude-token-saver route-scan savings # ๋ชจ๋“  ๊ธˆ์•ก์„ ๋ฃฐ ๋‹จ์œ„๊นŒ์ง€ ์—ญ์ถ”์ 
25
39
 
26
40
  ๐Ÿ”€ ๋ผ์šฐํŒ… ์ ˆ๊ฐ ๋ˆ„์  $2.09 (์ตœ๊ทผ 7์ผ $1.40 ยท 30์ผ $2.09)
27
41
 
28
42
  ๋ชจ๋ธ ์ด๋™๋ณ„:
29
- claude-fable-5 โ†’ claude-sonnet-5 โ€” 1ํšŒ, $0.72
30
- claude-opus-5 โ†’ claude-haiku-4-5 โ€” 1ํšŒ, $0.57
43
+ claude-fable-5 โ†’ claude-sonnet-5 โ€” 1ํšŒ, $0.72
44
+ claude-opus-5 โ†’ claude-haiku-4-5 โ€” 1ํšŒ, $0.57
31
45
 
32
46
  ์‹คํ–‰๋ณ„ (์ตœ๊ทผ์ˆœ):
33
47
  2026-08-22 $0.51 claude-fable-5 โ†’ claude-haiku-4-5
34
48
  ๋ฃฐ: T2|paste|-Users-me-projects-my-app
35
49
  ```
36
50
 
37
- **์ •์งํ•˜๊ฒŒ ์ง‘๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ด ๋„๊ตฌ์˜ ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค.** ๋“ฑ๋ก๋œ ๋ฃฐ์ด ๋‹ด๋‹นํ•˜์ง€ ์•Š๋Š” ์œ„์ž„(`Explore`, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ์—์ด์ „ํŠธ, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ œ๊ณตํ•˜๋Š” ์—์ด์ „ํŠธ)์€ ์ด ๋„๊ตฌ๊ฐ€ ๋ผ์šฐํŒ…ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ **๊ธˆ์•ก์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.** ๊ฐ€๊ฒฉํ‘œ๊ฐ€ ๋ชจ๋ธ๋ช…์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํ‹€๋ฆฐ ๊ธˆ์•ก์„ ํ‘œ์‹œํ•˜๋Š” ๋Œ€์‹  **๊ทธ ์‹คํ–‰์„ ์ง‘๊ณ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.** ๊ทธ๋ž˜์„œ ๊ธˆ์•ก์ด ์ž‘๊ฒŒ ๋‚˜์˜ฌ ์ˆ˜๋Š” ์žˆ์–ด๋„, ํ‘œ์‹œ๋˜๋Š” ๊ฐ’์€ ์–ธ์ œ๋‚˜ ์‹ค์ œ๋กœ ์ ˆ๊ฐํ•œ ๊ธˆ์•ก์ž…๋‹ˆ๋‹ค.
51
+ **์ง‘๊ณ„์—์„œ ๋นผ๋Š” ๊ฒƒ๋“ค** โ€” ์ •์งํ•œ ์ˆซ์ž๊ฐ€ ์ž‘์€ ์ˆซ์ž๋ณด๋‹ค ๋‚ซ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
38
52
 
39
- ```bash
40
- npm i -g claude-token-saver # postinstall์ด statusline + Skill ์ž๋™ ๋“ฑ๋ก
41
- ```
53
+ - ๋“ฑ๋ก๋œ ๋ฃฐ์ด ๋‹ด๋‹นํ•˜์ง€ ์•Š๋Š” ์œ„์ž„(`Explore`, ์ง์ ‘ ๋งŒ๋“  ์—์ด์ „ํŠธ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์—์ด์ „ํŠธ): ์ด ๋„๊ตฌ๊ฐ€ ๋ผ์šฐํŒ…ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
54
+ - ๊ฐ€๊ฒฉํ‘œ๊ฐ€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ชจ๋ธ๋ช…: ํ‹€๋ฆฐ ๊ธˆ์•ก์„ ์“ฐ๋А๋‹ˆ ๊ทธ ์‹คํ–‰์„ ๋บ๋‹ˆ๋‹ค.
42
55
 
43
56
  ---
44
57
 
45
- ## โšก ์™œ ์“ฐ๋Š”๊ฐ€: 30์ดˆ ์š”์•ฝ
58
+ ## โšก ๊ทธ ๋ฐ–์— statusline์ด ์žก์•„ ์ฃผ๋Š” ๊ฒƒ
46
59
 
47
60
  | | |
48
61
  |---|---|
49
- | ๐Ÿ”€ **๋ผ์šฐํŒ… ์ ˆ๊ฐ์•ก ์‹ค์ธก** | ์œ„์ž„์œผ๋กœ ์ ˆ๊ฐํ•œ ๊ธˆ์•ก์„ ์‹คํ–‰ ๋‹จ์œ„๋กœ ์›์žฅ์— ๊ธฐ๋กํ•˜๊ณ , statusline ์ฒซ์งธ ์ค„์— ๋ˆ„์ ์•ก๊ณผ ๋ชจ๋ธ ์ด๋™ ๋‚ด์—ญ์„ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค (`route-scan savings`๋กœ ์ „์ˆ˜ ํ™•์ธ) |
50
- | ๐ŸŽฏ **๋ชจ๋ธ ํ”ผํŒ… ์œ„์ž„** | ์ƒ์œ„ ๋ชจ๋ธ(opusยทfable)์ด ๋ฐ˜๋ณต ์ฒ˜๋ฆฌํ•ด ์˜จ ์‰ฌ์šด ์ž‘์—…์„ ํ‹ฐ์–ด(T0/T1/T2)๋กœ ๋ถ„๋ฅ˜ํ•œ ๋’ค haikuยทsonnet ์œ„์ž„ ๋ฃฐ๋กœ ์Šน๊ฒฉํ•˜๊ณ , ๋‹ค์Œ ์„ธ์…˜๋ถ€ํ„ฐ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค |
51
- | ๐Ÿ’ธ **๋น„์šฉ ์‹ค์ธก โˆ’18.6%** | harness์™€ ratchet์„ ๋„์ž…ํ•˜๊ธฐ ์ „ํ›„๋กœ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋‹น ๋น„์šฉ์ด $2.35์—์„œ $1.91๋กœ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค (์ €์ž์˜ ์‹ค์‚ฌ์šฉ ๋กœ๊ทธ, [์ƒ์„ธ](#์‹ค์ œ-ํšจ๊ณผ-๋„์ž…-์ „ํ›„-๋ฆฌํฌํŠธ)) |
52
- | ๐Ÿšจ **ํ•œ๋„ ์ดˆ๊ณผ ์˜ˆ๋ฐฉ** | 5์‹œ๊ฐ„ยท7์ผ rate-limit ์œˆ๋„๊ฐ€ 90%์— ๋„๋‹ฌํ•˜๋ฉด ์ฆ‰์‹œ ๊ฒฝ๊ณ ํ•˜๊ณ , `handoff`๋กœ ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค |
53
- | ๐Ÿง  **์บ์‹œ ๋‚ญ๋น„ ๊ฐ์ง€** | ํžˆํŠธ์œจ๊ณผ TTL ์นด์šดํŠธ๋‹ค์šด, 1M ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ด ํ† ํฐ์ด ๊ธ‰์ฆํ•œ ์›์ธ์„ ์ฝ”๋“œ๋กœ ์ง„๋‹จํ•ฉ๋‹ˆ๋‹ค |
54
- | ๐Ÿ…ท **๊ฐ™์€ ์‹ค์ˆ˜ ์ฐจ๋‹จ** | ๋ฐ˜๋ณต๋˜๋Š” ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•ด ratchet ๋ฃฐ๋กœ ์Šน๊ฒฉํ•˜๊ณ , ๋‹ค์Œ ์„ธ์…˜๋ถ€ํ„ฐ ์ž๋™์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค |
62
+ | ๐Ÿšจ **ํ•œ๋„ ์ดˆ๊ณผ ์˜ˆ๋ฐฉ** | 5์‹œ๊ฐ„ยท7์ผ rate-limit ์œˆ๋„๊ฐ€ 90%์— ๋‹ฟ์œผ๋ฉด ๊ฒฝ๊ณ ํ•˜๊ณ , `handoff`๋กœ ์ž‘์—…์„ ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค |
63
+ | ๐Ÿง  **์บ์‹œ ๋‚ญ๋น„ ๊ฐ์ง€** | ํžˆํŠธ์œจยทTTLยท1M ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ์ง€ํ•ด ํ† ํฐ ๊ธ‰์ฆ ์›์ธ์„ ์ฝ”๋“œ๋กœ ์ง„๋‹จํ•ฉ๋‹ˆ๋‹ค |
64
+ | ๐Ÿ‡ฐ๐Ÿ‡ท **ํ•œ๊ตญ์–ด ๋ฌธ์ฒด ๊ต์ •** | ํ•œ๊ตญ์–ด ํ™˜๊ฒฝ์ด๋ฉด ์ž๋™์œผ๋กœ ์ผœ์ง‘๋‹ˆ๋‹ค ([์•„๋ž˜](#-ํ•œ๊ตญ์–ด-๋ฌธ์ฒด-์ง€์นจ)) |
55
65
 
56
66
  ## ๋ผ์šฐํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค: 60์ดˆ ์„ค๋ช…
57
67
 
@@ -335,6 +345,9 @@ npm uninstall -g claude-cache-monitor && npm i -g claude-token-saver
335
345
 
336
346
  ## ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ
337
347
 
348
+ ### v3.20.0 (2026-08-22)
349
+ - **README ์ฒซ ํ™”๋ฉด์„ ํ›‘์–ด ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋‹ค์‹œ ์งฐ์Šต๋‹ˆ๋‹ค** โ€” ์„ค๋ช… ๋ฌธ๋‹จ์„ ๊ฑท์–ด๋‚ด๊ณ  ํ•œ ์ค„ ์š”์•ฝ, ์Šคํฌ๋ฆฐ์ƒท, ์„ค์น˜ ๋ช…๋ น์„ ์•ž์— ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํŒ…ยทHarnessยทratchet ์„ธ ๊ธฐ๋Šฅ์€ ํ‘œ๋กœ, ์ ˆ๊ฐ์•ก ๊ณ„์‚ฐ ๋ฐฉ์‹(๊ธฐ์ค€ ๋ชจ๋ธ โ†’ ์‹คํ–‰ ๋ชจ๋ธ โ†’ ์ฐจ์•ก)์€ ๋„์‹์œผ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๋’ค์—์„œ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋ฐ˜๋ณตํ•˜๋˜ "30์ดˆ ์š”์•ฝ" ํ‘œ๋Š” statusline์ด ์ถ”๊ฐ€๋กœ ์žก์•„ ์ฃผ๋Š” ํ•ญ๋ชฉ๋งŒ ๋‚จ๊ฒจ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
350
+
338
351
  ### v3.19.0 (2026-08-22)
339
352
  - **ํ•œ๊ตญ์–ด ๋ฌธ์ฒด ์ง€์นจ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค** โ€” Claude๊ฐ€ ํ•œ๊ตญ์–ด๋ฅผ ์“ธ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฌธ์ฒด ๊ฒฐํ•จ(๋ฌธ์žฅ ์„ฑ๋ถ„ ์ƒ๋žต, ๋ช…์‚ฌํ˜• ์ข…๊ฒฐ, ๋ฒˆ์—ญ์ฒด, ์— ๋Œ€์‹œ ๋‚จ์šฉ)์„ ๊ต์ •ํ•˜๋Š” ์ง€์นจ์„ ์„ธ์…˜ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. Claude Code์˜ output style์€ ์ „์—ญ ์Šฌ๋กฏ ํ•˜๋‚˜๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ๋จธ์‹ ๋งˆ๋‹ค ์„ค์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ, ์ด ๊ธฐ๋Šฅ์€ ์ง€์นจ์„ ํŒจํ‚ค์ง€์— ๋‹ด๊ณ  ์ด๋ฏธ ์„ค์น˜๋œ SessionStart ํ›…์œผ๋กœ ์ „๋‹ฌํ•˜๋ฏ€๋กœ **CLI๊ฐ€ ์„ค์น˜๋œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์ ์šฉ๋˜๋ฉฐ output style ์Šฌ๋กฏ์€ ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค.** ์ง€์นจ ์›๋ฌธ์€ [fluent-korean](https://github.com/snflkd/fluent-korean)(Copyright (c) 2026 snflkd, MIT)์—์„œ ๊ฐ€์ ธ์™”๊ณ  ๋ผ์ด์„ ์Šค ์ „๋ฌธ์„ ํ•จ๊ป˜ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
340
353
  - **์„ค์น˜์™€ ๋™์‹œ์— ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค** โ€” ์‹œ์Šคํ…œ ๋กœ์บ˜์ด ํ•œ๊ตญ์–ด์ด๋ฉด ์„ค์น˜ ์‹œ ์ž๋™์œผ๋กœ ์ผœ์ง€๊ณ , ์•„๋‹ˆ๋ฉด ๊บผ ๋‘ก๋‹ˆ๋‹ค. ์ง์ ‘ ์ผœ๊ฑฐ๋‚˜ ๋ˆ ๋’ค์—๋Š” ๊ทธ ์„ ํƒ์„ ์œ ์ง€ํ•˜๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๊ฒฐ์ •์„ ๋˜๋Œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `CTS_NO_KOREAN=1`๋กœ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๊ณ , ์ผœ์ ธ ์žˆ์œผ๋ฉด statusline์— `๊ฐ€` ์นฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-token-saver",
3
- "version": "3.19.0",
3
+ "version": "3.20.1",
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": {
@@ -145,11 +145,12 @@ export function pickCapWarn(caps) {
145
145
  function buildKoreanSeg(c, isIcon, verbose) {
146
146
  try {
147
147
  if (!koreanStyleEnabled()) return null;
148
- // Deliberately quiet (gray, one syllable): this is a "yes, it is on"
148
+ // Deliberately quiet (gray, one glyph): this is a "yes, it is on"
149
149
  // confirmation, not a warning. Without it a silently-failed hook looks
150
150
  // exactly like a working one, because the style only shows up when the
151
- // model happens to write Korean.
152
- if (isIcon) return `${c(GRAY)}${verbose ? '๊ฐ€ Korean style' : '๊ฐ€'}${c(RESET)}`;
151
+ // model happens to write Korean. The icon says "writing guidance", not
152
+ // "Korean" โ€” the verbose label already carries the language.
153
+ if (isIcon) return `${c(GRAY)}${verbose ? 'โœ๏ธ Korean style' : 'โœ๏ธ'}${c(RESET)}`;
153
154
  return `${c(GRAY)}Korean style${c(RESET)}`;
154
155
  } catch {
155
156
  return null;