claude-token-saver 3.2.1 → 3.2.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 +3 -0
- package/README.md +3 -0
- package/package.json +1 -1
- package/src/route-scan.js +14 -1
package/README.en.md
CHANGED
|
@@ -251,6 +251,9 @@ Also update `statusLine.command` in `~/.claude/settings.json` to `claude-token-s
|
|
|
251
251
|
|
|
252
252
|
## Release notes
|
|
253
253
|
|
|
254
|
+
### v3.2.2 (2026-07-13)
|
|
255
|
+
- **No re-proposing registered rules** — (tier|category|project) combinations that already have a model-fitting rule are excluded from scan candidates (a global rule covers every project). Fixes rules registered outside the promote flow (e.g. migrations) resurfacing as candidates.
|
|
256
|
+
|
|
254
257
|
### v3.2.1 (2026-07-13)
|
|
255
258
|
- **Instant pattern analysis on first setup** — `install` (including npm postinstall) analyzes your existing session logs inline when no cache exists, so tier-delegation candidates appear from the very first Claude Code session (previously the second).
|
|
256
259
|
|
package/README.md
CHANGED
|
@@ -208,6 +208,9 @@ npm uninstall -g claude-cache-monitor && npm i -g claude-token-saver
|
|
|
208
208
|
|
|
209
209
|
## 릴리스 노트
|
|
210
210
|
|
|
211
|
+
### v3.2.2 (2026-07-13)
|
|
212
|
+
- **등록 룰 재제안 차단** — 이미 모델 피팅 룰이 있는 (티어|카테고리|프로젝트) 조합은 스캔 후보에서 자동 제외 (글로벌 룰은 전 프로젝트 커버). promote를 거치지 않고 등록된 룰(마이그레이션 등)이 후보로 되살아나던 문제 수정.
|
|
213
|
+
|
|
211
214
|
### v3.2.1 (2026-07-13)
|
|
212
215
|
- **최초 설치 시 즉시 패턴 분석** — `install`(npm postinstall 포함)이 캐시가 없으면 기존 세션 로그를 그 자리에서 분석해, 첫 Claude Code 세션부터 티어 위임 후보가 표시됩니다 (기존에는 두 번째 세션부터).
|
|
213
216
|
|
package/package.json
CHANGED
package/src/route-scan.js
CHANGED
|
@@ -285,12 +285,25 @@ export async function runRouteScan({ days = 14 } = {}) {
|
|
|
285
285
|
const prev = readRouteScan();
|
|
286
286
|
const resolved = new Set(prev?.resolved || []);
|
|
287
287
|
|
|
288
|
+
// Never re-propose a pattern that already has a registered model-fitting
|
|
289
|
+
// rule (a global rule covers the category in every project). Without this,
|
|
290
|
+
// rules that entered the registry outside the promote flow — migrations,
|
|
291
|
+
// future imports — would resurface as candidates forever.
|
|
292
|
+
let registered = [];
|
|
293
|
+
try {
|
|
294
|
+
const { loadModelRules } = await import('./model-rules.js');
|
|
295
|
+
registered = loadModelRules().rules;
|
|
296
|
+
} catch { /* registry unreadable — candidates may repeat until promote */ }
|
|
297
|
+
const hasRule = (g) => registered.some((r) =>
|
|
298
|
+
r.tier === g.tier && r.category === g.category &&
|
|
299
|
+
(r.scope === 'global' || r.project === g.project));
|
|
300
|
+
|
|
288
301
|
const ruleText = (g) => g.tier === 'T2'
|
|
289
302
|
? `"${g.label}" 유형의 단순 요청(예: "${g.example}")은 ${g.agent}(haiku) 서브에이전트로 위임한다`
|
|
290
303
|
: `"${g.label}" 유형의 중간 난도 요청(예: "${g.example}")은 model: sonnet 서브에이전트로 위임한다 (설계 판단·반복 에러 발생 시 메인 모델이 이어받음)`;
|
|
291
304
|
|
|
292
305
|
const candidates = [...groups.values()]
|
|
293
|
-
.filter((g) => g.count >= MIN_RECURRENCE)
|
|
306
|
+
.filter((g) => g.count >= MIN_RECURRENCE && !hasRule(g))
|
|
294
307
|
.sort((a, b) => b.count - a.count)
|
|
295
308
|
.slice(0, 8)
|
|
296
309
|
.map((g, i) => ({
|