claude-token-saver 3.36.0 → 3.37.0

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.ko.md CHANGED
@@ -406,6 +406,20 @@ Claude Code의 output style로도 같은 일을 할 수 있지만, output style
406
406
 
407
407
  기술적 내용은 양쪽이 동일합니다. 지침은 판단이나 정확도가 아니라 문장의 완성도에만 관여하므로, 답이 달라지는 것이 아니라 같은 답을 다시 읽지 않아도 되는 형태로 만들어 줍니다. 슬랙처럼 사람이 스크롤하며 읽는 채널에서는 이 차이가 되묻는 횟수를 줄이고, 되묻지 않는 만큼 토큰도 아낍니다.
408
408
 
409
+ ### 보강 지침: 응집성과 보수적 교정 규칙 (v3.37.0)
410
+
411
+ 들여온 fluent-korean 본문은 원형 그대로 두고, 그 뒤로 수집한 지침은 별도 파일(`presets/korean-style/supplement.md`)에 담아 같은 주입에 이어 붙입니다. 수집 기준은 보수적입니다. 거의 항상 고치는 편이 나은 조항만 실었고, 출처는 국립국어원 공공언어 지침, 쿠버네티스 문서 한글화 가이드, 그리고 한국어 텍스트 응집성을 다룬 학술 논문 세 편입니다.
412
+
413
+ 세 층이 더해집니다.
414
+
415
+ - **번역투**: 이중 피동, 일본어에서 온 굳은 표현, '~에 있어서', 영어 have를 직역한 '가지다' 남용. 기계가 판정할 수 있는 것은 쓰기 시점 검사(아래)에도 함께 들어갑니다.
416
+ - **상투 패턴**: 자동으로 붙는 수식어("다양한", "핵심적인"), 표지판 문장, 수사적 질문 뒤 즉답, 근거 없는 긍정 마무리.
417
+ - **응집성**: 문장이 이어지는 방식이라 정규식으로는 검사하지 못합니다. 이 절의 방향을 정한 연구 결과가 있습니다. 접속어·지시어 같은 표층 연결 장치는 글의 품질과 상관이 없거나 오히려 부적 상관이고, 앞 문장이 내놓은 정보를 다음 문장이 받아 풀어 주는 상술형 연결만 정적 상관을 보였습니다. 그래서 지침은 연결이 어색할 때 접속어를 더하지 말고 정보의 배열(아는 것 먼저, 새 것 나중)을 고치라고 말합니다.
418
+
419
+ 응집성 층의 원칙 대부분은 한국어에만 해당하지 않습니다. 구정보 우선 배열, 대명사의 단일 지시, 문단 안 주어 유지, 비약을 잇는 다리 문장, 짧은 반복 문장 병합은 영어 산문에도 그대로 적용됩니다. 논문이 한국어 학습자를 다뤘을 뿐, 검증된 원칙은 텍스트언어학의 표준 응집성 모형입니다.
420
+
421
+ 마지막 절은 고치면 안 되는 것을 명시합니다. 정착된 전문 용어, 문어체, 원문 인용이 그것이고, 검사가 내는 지적은 판정이 아니라 확인 요청입니다.
422
+
409
423
  ### 쓰기 시점 검사 (v3.24.0)
410
424
 
411
425
  지침을 세션 시작에 한 번 넣는 것만으로는 부족했습니다. 모델은 지침을 한 번 읽고 그 뒤로 파일 수십 개를 쓰는데, 그동안 결과물을 다시 읽어 보는 단계가 없었습니다. 그래서 지침이 켜진 세션이 규약에 어긋나는 문장을 문서에 그대로 실어 보냈고, 사람이 완성본을 읽을 때에야 드러났습니다. 2026년 8월에 적용 범위 문장을 고쳐서 같은 문제를 잡으려 했지만, 문장을 고쳐도 검사 단계가 없다는 조건은 그대로였기 때문에 재발했습니다.
@@ -587,6 +601,7 @@ npm uninstall -g claude-cache-monitor && npm i -g claude-token-saver
587
601
 
588
602
  전체 내역은 [CHANGELOG.md](./CHANGELOG.md)로 옮겼습니다. 최근 변경은 다음과 같습니다.
589
603
 
604
+ - **v3.37.0**: 한국어 지침에 보강 지침(supplement)이 붙습니다. 번역투·상투 패턴·응집성(문장 이어짐) 조항이며, 쓰기 시점 검사에도 번역투 5종이 추가됐습니다. 실파일 255개 실측에서 오탐 1건으로 검증했습니다.
590
605
  - **v3.35.0**: 이번 달 1일 00시 이후 지출 추정치를 `💵 Sep $42` 세그먼트로 상시 표시합니다. LiteLLM 게이트웨이 사용자는 키의 max_budget/spend 를 `🔑 budget` 게이지로 봅니다 (5h/7d cap 이 없는 Bedrock·LiteLLM 환경 대응).
591
606
  - **v3.34.0**: seed 프리셋 제안, 설치 시 출력 언어 선택, 컨텍스트 경고 500k 상향. 상세는 CHANGELOG 참고.
592
607
 
package/README.md CHANGED
@@ -418,6 +418,20 @@ Three things change. Clauses chained with em dashes become separate sentences, s
418
418
 
419
419
  The technical content is identical in both. The guidance touches sentence construction only, not judgement or accuracy: the answer does not change, it just stops needing a second read. In a channel people scroll through, that difference cuts follow-up questions — and the tokens those follow-ups would have cost.
420
420
 
421
+ ### The supplement: cohesion and conservative correctness rules
422
+
423
+ The vendored fluent-korean text ships unmodified; everything collected since lives in a separate supplement (`presets/korean-style/supplement.md`) appended to the same injection. It was compiled conservatively — only clauses that are nearly always an improvement, sourced from the National Institute of Korean Language's public-language guidelines, the Kubernetes Korean localization guide, and three peer-reviewed studies on text cohesion in Korean writing.
424
+
425
+ It adds three layers:
426
+
427
+ - **Translationese**: double passives, Japanese-derived calques, `~에 있어서`, possession-verb renderings of English *have*. The machine-checkable ones also run in the write-time lint (below).
428
+ - **AI-writing tics**: automatic intensifiers ("다양한", "핵심적인"), signpost sentences, rhetorical question-then-answer, unconditionally upbeat endings.
429
+ - **Cohesion** — how sentences connect, which no regex can check. The research finding that shapes this section: surface connectives (conjunctions, demonstratives) correlate *negatively or not at all* with judged text quality, while elaboration — the next sentence picking up and unpacking what the previous one introduced — is the only connection type with a positive correlation. So the guidance says: when a transition feels rough, fix the information order (given before new), don't add a connective.
430
+
431
+ **Most of the cohesion layer is not Korean-specific.** Given-before-new ordering (the "given-new contract"), one clear referent per pronoun, keeping one subject per paragraph, bridging sentences instead of leaping, and merging choppy repetitive sentences into a modifier-plus-core structure apply to English prose the same way — the studies happen to be about Korean learners, but the principles they validate are the standard cohesion model from text linguistics. If you write English deliverables with Claude, those five rules are worth pinning in your own CLAUDE.md even with this feature off.
432
+
433
+ A final subsection lists what must **not** be "corrected": settled domain terms, formal register, and verbatim quotations — every lint finding is a request to confirm, not a verdict.
434
+
421
435
  ### The write-time check (v3.24.0)
422
436
 
423
437
  Injecting the guidance once at session start turned out to be half the job. The model reads it, then writes dozens of files over the next hours with nothing re-reading the output. Sessions with the guidance active still shipped violations into documents, and it surfaced only when a human read the finished artifact. An August 2026 fix reworded the scope sentence to address this; it recurred, because rewording an instruction does not add a checkpoint.
@@ -708,6 +722,7 @@ Also update `statusLine.command` in `~/.claude/settings.json` to `claude-token-s
708
722
 
709
723
  The full history moved to [CHANGELOG.md](./CHANGELOG.md) (Korean; version headings and command names are language-neutral). Recent changes:
710
724
 
725
+ - **v3.37.0**: Korean guidance grows a conservative supplement (translationese, AI-writing tics, a research-backed cohesion section whose principles apply to English prose too) and the write-time lint gains 5 translationese patterns, validated at 1 false positive across 255 real files.
711
726
  - **v3.35.0**: A `💵 Sep $42` segment now shows estimated spend since 00:00 on the 1st of the current month, always on — including gateway setups with no 5h/7d caps. LiteLLM gateway users get a `🔑 budget ▰▱ 34% $34/$100` gauge built from the key's budget (`GET /key/info` + `GET /user/info`, team-membership budget first, then key, then internal user — verified against a Dockerized LiteLLM).
712
727
  - **v3.34.0**: seed presets offered one at a time, output-language choice at install, context warning raised to 500k.
713
728
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-token-saver",
3
- "version": "3.36.0",
3
+ "version": "3.37.0",
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": {
@@ -0,0 +1,93 @@
1
+ <!--
2
+ claude-token-saver's own supplement to the vendored fluent-korean guidance.
3
+ Compiled 2026-09-13 from:
4
+ - 국립국어원 「한눈에 알아보는 공공언어 바로 쓰기」 및 한글문화연대의 번역투 교정 사례 (urimal.org/4544)
5
+ - 쿠버네티스 문서 한글화 가이드 (kubernetes.io/ko/docs/contribute/localization_ko/)
6
+ - 「한국어 AI 글쓰기에서 피해야 할 상투적 패턴」 (gist: woonjangahn)
7
+ - 문장 연결 원칙: 생글생글 논술 첨삭노트 133 (sgsg.hankyung.com/article/2013012517791),
8
+ 구정보-신정보 배열과 주제 연쇄는 국어 글쓰기 교육의 통설
9
+ - 응집성 실증 근거: 「한국어 교육과 결속성(cohesion) 및 응집성(coherence)의 문제」
10
+ (KCI ART002501143: 결속 장치와 텍스트 질은 상관이 없거나 부적),
11
+ 「한국어 학습자의 쓰기 텍스트에 나타난 응결성과 응집성의 상관분석」
12
+ (KCI ART002240473, 우리말글: 대용 남발은 부적 상관, 상술형 접속만 정적 상관),
13
+ 「한국어 학습자 텍스트의 내용적 오류 양상: 응집성 중심」
14
+ (DBpia NODE11604445, 2023: 주제부-설명부 분석, 오류를 관련성·일관성으로 분류)
15
+ - 나무위키 「번역체 문장」의 과교정 경고
16
+
17
+ Only patterns that survive a conservative bar are included: each clause names
18
+ a form that is nearly always an improvement to change, and the final section
19
+ lists forms that must NOT be "corrected". This file is appended to the
20
+ session-start injection after fluent-korean.md; see src/korean-style.js.
21
+ -->
22
+
23
+ ## 보강 지침 (claude-token-saver 자체 수집분)
24
+
25
+ 앞의 fluent-korean 본문에 더해, 아래 지침도 같은 범위와 같은 우선순위로 적용합니다. 각 조항은 국립국어원의 공공언어 지침과 공개된 기술 문서 한글화 지침에서 보수적으로 골라 낸 것이므로, 판단이 갈리는 표현은 여기에 싣지 않았습니다.
26
+
27
+ ### 번역투 추가 조항
28
+
29
+ 1. 이중 피동을 쓰지 않습니다. 피동 표현이 필요하면 단일 피동으로 충분합니다.
30
+ - ✗ 보여집니다, 쓰여진, 잊혀진, 되어지고 → ○ 보입니다, 쓰인, 잊힌, 되고
31
+
32
+ 2. 일본어에서 온 굳은 번역투는 항상 바꿉니다.
33
+ - ✗ 성공에 다름 아니다 → ○ 성공일 뿐이다, 바로 성공이다
34
+ - ✗ 노력하지 않으면 안 됩니다 → ○ 노력해야 합니다
35
+
36
+ 3. 조사만으로 충분한 곳에 관용구를 끼우지 않습니다.
37
+ - ✗ 모든 분야에 있어서 기준이 필요하다 → ○ 모든 분야에서 기준이 필요하다
38
+ - ✗ 국민투표에 의하여 결정한다 → ○ 국민투표로 결정한다
39
+ - ✗ 미국 여행을 가기 위해 영어를 공부했다 → ○ 미국 여행을 가려고 영어를 공부했다
40
+
41
+ 4. 속성 서술에 '가지다'를 쓰지 않습니다. 영어 have의 직역이라 서술이 늘어집니다.
42
+ - ✗ 하나라는 의미를 가지고 있다 → ○ 하나라는 의미다
43
+ - ✗ 세 가지 장점을 가진다 → ○ 장점이 세 가지 있다
44
+
45
+ 5. 행위자가 분명한 문장은 능동으로 씁니다. 피동은 행위자를 밝힐 수 없거나 밝힐 필요가 없을 때만 씁니다.
46
+ - ✗ 아이들은 보육원에 의해 보호되었다 → ○ 보육원이 아이들을 보호했다
47
+
48
+ ### 상투 패턴 억제 조항
49
+
50
+ LLM 산출물에서 반복적으로 관찰되는 습관입니다. 금지가 아니라 절제 대상이므로, 한 문서 안에서 되풀이될 때 고칩니다.
51
+
52
+ 1. 수식어를 자동으로 붙이지 않습니다. '다양한', '핵심적인', '효과적으로', '성공적으로' 같은 수식어는 구체 정보가 없으면 빼고, 있으면 그 정보로 대체합니다.
53
+ - ✗ 다양한 분야에서 활용됩니다 → ○ 금융과 의료 분야에서 활용됩니다
54
+
55
+ 2. 표지판 문장을 줄입니다. '지금부터 살펴보겠습니다' 같은 도입, '결론적으로' 같은 마무리 표지는 본문이 짧으면 빼고 바로 내용을 적습니다.
56
+
57
+ 3. 수사적 질문을 던지고 곧바로 답하는 구성을 쓰지 않습니다.
58
+ - ✗ 해답은 무엇일까요? 바로 캐시입니다. → ○ 해답은 캐시입니다.
59
+
60
+ 4. '~뿐만 아니라 ~도' 구문은 한 문단에 한 번까지만 씁니다.
61
+
62
+ 5. 영어(한글) 병기는 용어가 처음 나올 때 한 번만 하고, 그 뒤로는 정착된 한쪽 표기만 씁니다. 이는 쿠버네티스 한글화 가이드의 병기 원칙과 같습니다.
63
+
64
+ 6. 근거 없이 긍정적으로 끝맺지 않습니다. '앞으로의 발전이 기대됩니다' 같은 마무리는 내용이 뒷받침할 때만 씁니다.
65
+
66
+ ### 문장 연결 조항 (응집성)
67
+
68
+ 문장 하나하나가 옳아도 이어짐이 어색하면 읽기 어렵습니다. 아래 원칙은 문장을 잇는 방법이므로, 문서와 내레이션처럼 이어 읽는 글에 우선 적용합니다. 연구 결과가 방향을 정해 줍니다. 접속어와 지시어 같은 표층 연결 장치는 글의 품질과 상관이 없거나 오히려 부적 상관이고, 앞 내용을 자세히 풀어 주는 상술형 연결만이 품질과 정적 상관을 보였습니다. 그러므로 연결이 어색할 때 접속어를 더하는 대신, 정보의 배열을 고치는 쪽으로 손질합니다.
69
+
70
+ 1. 아는 것에서 새 것으로 나아갑니다. 문장 앞부분에는 독자가 이미 아는 정보를 놓고, 새 정보는 뒷부분에 놓습니다. 다음 문장은 앞 문장이 끝에 내놓은 새 정보를 머리에서 받아 이어 갑니다.
71
+ - ✗ 캐시 적중률이 떨어졌다. 요청 사이의 간격이 TTL을 넘긴 것이 원인이다. 5분이 기본 TTL이다.
72
+ - ○ 캐시 적중률이 떨어졌다. 원인은 요청 사이의 간격이 TTL을 넘긴 것이다. 이 TTL의 기본값은 5분이다.
73
+
74
+ 2. 지시어에는 가리키는 대상이 하나만 있어야 합니다. '이', '그', '이러한'이 바로 앞 문장의 무엇을 받는지 즉시 답할 수 없으면, 지시어 대신 그 명사를 다시 적습니다. 대용 표현을 자주 쓸수록 의미 연결이 약해진다는 상관 분석 결과가 있으므로, 지시어는 아껴 씁니다.
75
+
76
+ 3. 한 문단 안에서는 주어나 관점을 유지합니다. 문장마다 주어가 바뀌면 독자가 매번 시점을 다시 잡아야 하므로, 바꿀 이유가 없으면 같은 주어로 잇거나 자연스럽게 생략합니다.
77
+
78
+ 4. 접속어는 논리 관계가 실제로 있을 때만 씁니다. '또한'과 '그리고'가 반복되면 문장들이 연결된 것이 아니라 나열만 된 상태라는 신호이므로, 접속어를 더할 것이 아니라 문장 순서와 정보 배열부터 다시 잡습니다. 인과가 있으면 '그래서'나 '~하므로'처럼 관계를 이름 붙여 잇습니다.
79
+
80
+ 5. 문장 사이의 비약을 없앱니다. 뒤 문장이 전제하는 조건이나 이유는 앞 문장이 미리 준비해 두어야 하며, 준비 없이 결론이 나오면 그 사이에 다리가 되는 문장을 하나 넣습니다.
81
+
82
+ 6. 짧은 문장 여러 개가 같은 대상을 반복하면, 덜 중요한 문장을 수식어구로 바꾸어 핵심 문장에 붙입니다.
83
+ - ✗ 토끼와 거북이가 경주를 했다. 토끼는 잠을 잤다. 거북이가 이겼다.
84
+ - ○ 잠을 잔 토끼와 달리, 거북이는 꾸준히 걸어 경주에서 이겼다.
85
+
86
+ ### 과교정 금지 조항
87
+
88
+ 교정 자체가 오류가 되는 경우입니다. 나무위키 번역체 문서와 국립국어원 논의가 공통으로 경고하는 지점이므로, 아래 표현에는 위 조항들을 적용하지 않습니다.
89
+
90
+ 1. 전문 용어와 정착된 관용 표기는 원형을 유지합니다. 분야에서 굳은 표기를 일반 어휘로 바꾸면 오히려 뜻이 흐려집니다.
91
+ 2. 문어체는 오류가 아닙니다. 구어로만 고쳐 쓰라는 요구는 이 지침에 없습니다.
92
+ 3. 원문을 그대로 옮기는 인용은 손보지 않습니다.
93
+ 4. 검사 도구의 지적은 확인 요청이지 판정이 아닙니다. 굳은 표현이라 판단해 유지할 때는 그 이유를 한 줄로 남깁니다.
@@ -80,6 +80,15 @@ const TRANSLATIONESE = [
80
80
  { re: /되어지/, fix: '이중 피동을 없애고 능동이나 단일 피동으로 씁니다' },
81
81
  { re: /하는 것을 통해/, fix: "'~해서'·'~함으로써'로 줄입니다" },
82
82
  { re: /라고 할 수 있다/, fix: '단정하거나 근거를 붙여 서술합니다' },
83
+ // Conservative additions (2026-09-13), sourced from 국립국어원 공공언어
84
+ // 지침·한글문화연대 교정 사례·쿠버네티스 한글화 가이드. Bar for inclusion:
85
+ // the form is nearly always an improvement to change, so a confirm-request
86
+ // on it is rarely noise. See presets/korean-style/supplement.md.
87
+ { re: /(?:보여|쓰여|불려|잊혀)[지집진질져]/, fix: "이중 피동입니다. '보인다'·'쓰인'·'불린'·'잊힌'처럼 단일 피동으로 씁니다" },
88
+ { re: /에 다름 아니/, fix: "일본어 번역투입니다. '~일 뿐이다'·'바로 ~이다'로 바꿉니다" },
89
+ { re: /지 않으면 안 [되된됩돼]/, fix: "이중 부정 번역투입니다. '~해야 합니다'로 바꿉니다" },
90
+ { re: /(?<!여기|거기|저기|어디)에 있어서/, fix: "'~에서'·'~에는'으로 바꿉니다" },
91
+ { re: /(?:의미|특징|장점|단점|성격|가능성|중요성|효과)[을를] 가지고 있/, fix: "'~이다'·'~가 있다'로 바꿉니다 (have 직역)" },
83
92
  ];
84
93
 
85
94
  // Guidance 3.7: a period belongs after a 종결어미, not after a nominal ending.
@@ -34,6 +34,10 @@ const require = createRequire(import.meta.url);
34
34
  const packageRoot = join(dirname(fileURLToPath(import.meta.url)), '..');
35
35
 
36
36
  export const KOREAN_STYLE_PATH = join(packageRoot, 'presets', 'korean-style', 'fluent-korean.md');
37
+ // Our own conservative additions (국립국어원 공공언어 지침, 쿠버네티스 한글화
38
+ // 가이드 등에서 수집). Appended after the vendored text so the vendored file
39
+ // stays byte-identical to upstream.
40
+ export const KOREAN_STYLE_SUPPLEMENT_PATH = join(packageRoot, 'presets', 'korean-style', 'supplement.md');
37
41
  export const KOREAN_STYLE_LICENSE_PATH = join(packageRoot, 'presets', 'korean-style', 'LICENSE-fluent-korean');
38
42
  // The separator here is a colon, not an em dash. The guidance this line cites
39
43
  // bans em dashes in Korean prose, and shipping one inside its own attribution
@@ -115,7 +119,18 @@ export function koreanStyleText() {
115
119
  if (!existsSync(KOREAN_STYLE_PATH)) return null;
116
120
  const raw = readFileSync(KOREAN_STYLE_PATH, 'utf8');
117
121
  const body = raw.replace(/^<!--[\s\S]*?-->\s*/, '').trim();
118
- return body || null;
122
+ if (!body) return null;
123
+ // The supplement is optional: a missing or empty file degrades to the
124
+ // vendored guidance alone rather than failing the injection.
125
+ try {
126
+ if (existsSync(KOREAN_STYLE_SUPPLEMENT_PATH)) {
127
+ const sup = readFileSync(KOREAN_STYLE_SUPPLEMENT_PATH, 'utf8')
128
+ .replace(/^<!--[\s\S]*?-->\s*/, '')
129
+ .trim();
130
+ if (sup) return `${body}\n\n${sup}`;
131
+ }
132
+ } catch { /* supplement unreadable: fall back to the vendored text */ }
133
+ return body;
119
134
  } catch {
120
135
  return null;
121
136
  }