cc-proficiency 0.2.7 → 0.2.8

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.
Files changed (116) hide show
  1. package/README.es.md +395 -0
  2. package/README.fr.md +395 -0
  3. package/README.ja.md +395 -0
  4. package/README.ko.md +395 -0
  5. package/README.md +27 -6
  6. package/README.zh-CN.md +27 -6
  7. package/dist/cli/commands/achievements.d.ts.map +1 -1
  8. package/dist/cli/commands/achievements.js +6 -4
  9. package/dist/cli/commands/achievements.js.map +1 -1
  10. package/dist/cli/commands/analyze.d.ts.map +1 -1
  11. package/dist/cli/commands/analyze.js +3 -2
  12. package/dist/cli/commands/analyze.js.map +1 -1
  13. package/dist/cli/commands/badge.d.ts.map +1 -1
  14. package/dist/cli/commands/badge.js +6 -7
  15. package/dist/cli/commands/badge.js.map +1 -1
  16. package/dist/cli/commands/config.d.ts.map +1 -1
  17. package/dist/cli/commands/config.js +8 -3
  18. package/dist/cli/commands/config.js.map +1 -1
  19. package/dist/cli/commands/explain.d.ts.map +1 -1
  20. package/dist/cli/commands/explain.js +21 -21
  21. package/dist/cli/commands/explain.js.map +1 -1
  22. package/dist/cli/commands/init.d.ts.map +1 -1
  23. package/dist/cli/commands/init.js +19 -21
  24. package/dist/cli/commands/init.js.map +1 -1
  25. package/dist/cli/commands/leaderboard.d.ts.map +1 -1
  26. package/dist/cli/commands/leaderboard.js +12 -10
  27. package/dist/cli/commands/leaderboard.js.map +1 -1
  28. package/dist/cli/commands/process.js +5 -5
  29. package/dist/cli/commands/process.js.map +1 -1
  30. package/dist/cli/commands/refresh.d.ts.map +1 -1
  31. package/dist/cli/commands/refresh.js +2 -4
  32. package/dist/cli/commands/refresh.js.map +1 -1
  33. package/dist/cli/commands/share.d.ts.map +1 -1
  34. package/dist/cli/commands/share.js +30 -28
  35. package/dist/cli/commands/share.js.map +1 -1
  36. package/dist/cli/commands/status.d.ts.map +1 -1
  37. package/dist/cli/commands/status.js +17 -15
  38. package/dist/cli/commands/status.js.map +1 -1
  39. package/dist/cli/commands/uninstall.d.ts.map +1 -1
  40. package/dist/cli/commands/uninstall.js +6 -4
  41. package/dist/cli/commands/uninstall.js.map +1 -1
  42. package/dist/cli/commands/update.d.ts.map +1 -1
  43. package/dist/cli/commands/update.js +14 -12
  44. package/dist/cli/commands/update.js.map +1 -1
  45. package/dist/cli/index.js +22 -19
  46. package/dist/cli/index.js.map +1 -1
  47. package/dist/cli/services/hooks.d.ts.map +1 -1
  48. package/dist/cli/services/hooks.js +5 -4
  49. package/dist/cli/services/hooks.js.map +1 -1
  50. package/dist/cli/services/publishing.d.ts.map +1 -1
  51. package/dist/cli/services/publishing.js +15 -16
  52. package/dist/cli/services/publishing.js.map +1 -1
  53. package/dist/cli/utils/formatting.d.ts.map +1 -1
  54. package/dist/cli/utils/formatting.js +17 -11
  55. package/dist/cli/utils/formatting.js.map +1 -1
  56. package/dist/cli/utils/locale.d.ts +1 -1
  57. package/dist/cli/utils/locale.d.ts.map +1 -1
  58. package/dist/cli/utils/locale.js +4 -6
  59. package/dist/cli/utils/locale.js.map +1 -1
  60. package/dist/cli/utils/update-check.d.ts.map +1 -1
  61. package/dist/cli/utils/update-check.js +3 -2
  62. package/dist/cli/utils/update-check.js.map +1 -1
  63. package/dist/gist/registry.d.ts.map +1 -1
  64. package/dist/gist/registry.js +5 -15
  65. package/dist/gist/registry.js.map +1 -1
  66. package/dist/i18n/index.d.ts +17 -0
  67. package/dist/i18n/index.d.ts.map +1 -0
  68. package/dist/i18n/index.js +71 -0
  69. package/dist/i18n/index.js.map +1 -0
  70. package/dist/i18n/locales/en.d.ts +3 -0
  71. package/dist/i18n/locales/en.d.ts.map +1 -0
  72. package/dist/i18n/locales/en.js +276 -0
  73. package/dist/i18n/locales/en.js.map +1 -0
  74. package/dist/i18n/locales/es.d.ts +3 -0
  75. package/dist/i18n/locales/es.d.ts.map +1 -0
  76. package/dist/i18n/locales/es.js +276 -0
  77. package/dist/i18n/locales/es.js.map +1 -0
  78. package/dist/i18n/locales/fr.d.ts +3 -0
  79. package/dist/i18n/locales/fr.d.ts.map +1 -0
  80. package/dist/i18n/locales/fr.js +276 -0
  81. package/dist/i18n/locales/fr.js.map +1 -0
  82. package/dist/i18n/locales/ja.d.ts +3 -0
  83. package/dist/i18n/locales/ja.d.ts.map +1 -0
  84. package/dist/i18n/locales/ja.js +276 -0
  85. package/dist/i18n/locales/ja.js.map +1 -0
  86. package/dist/i18n/locales/ko.d.ts +3 -0
  87. package/dist/i18n/locales/ko.d.ts.map +1 -0
  88. package/dist/i18n/locales/ko.js +276 -0
  89. package/dist/i18n/locales/ko.js.map +1 -0
  90. package/dist/i18n/locales/zh-CN.d.ts +3 -0
  91. package/dist/i18n/locales/zh-CN.d.ts.map +1 -0
  92. package/dist/i18n/locales/zh-CN.js +276 -0
  93. package/dist/i18n/locales/zh-CN.js.map +1 -0
  94. package/dist/i18n/types.d.ts +245 -0
  95. package/dist/i18n/types.d.ts.map +1 -0
  96. package/dist/i18n/types.js +5 -0
  97. package/dist/i18n/types.js.map +1 -0
  98. package/dist/renderer/animated-svg.d.ts +2 -3
  99. package/dist/renderer/animated-svg.d.ts.map +1 -1
  100. package/dist/renderer/animated-svg.js +47 -20
  101. package/dist/renderer/animated-svg.js.map +1 -1
  102. package/dist/renderer/svg.d.ts +11 -6
  103. package/dist/renderer/svg.d.ts.map +1 -1
  104. package/dist/renderer/svg.js +99 -69
  105. package/dist/renderer/svg.js.map +1 -1
  106. package/dist/store/achievements.d.ts +2 -1
  107. package/dist/store/achievements.d.ts.map +1 -1
  108. package/dist/store/achievements.js +2 -31
  109. package/dist/store/achievements.js.map +1 -1
  110. package/dist/types.d.ts +0 -2
  111. package/dist/types.d.ts.map +1 -1
  112. package/dist/utils/display-width.d.ts +10 -0
  113. package/dist/utils/display-width.d.ts.map +1 -0
  114. package/dist/utils/display-width.js +58 -0
  115. package/dist/utils/display-width.js.map +1 -0
  116. package/package.json +1 -1
package/README.ko.md ADDED
@@ -0,0 +1,395 @@
1
+ <p align="center">
2
+ <img src="https://img.shields.io/badge/Claude_Code-%EC%88%99%EB%A0%A8%EB%8F%84_%EB%B0%B0%EC%A7%80-7c3aed?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0xMiAyTDIgN2wxMCA1IDEwLTV6Ii8+PHBhdGggZD0iTTIgMTdsMTAgNSAxMC01Ii8+PHBhdGggZD0iTTIgMTJsMTAgNSAxMC01Ii8+PC9zdmc+" alt="cc-proficiency" />
3
+ </p>
4
+
5
+ <p align="center">
6
+ <strong>Claude Code 사용 현황을 기반으로 숙련도 배지를 생성합니다. Claude Certified Architect 시험의 5개 도메인에 맞춰져 있습니다.</strong>
7
+ </p>
8
+
9
+ <p align="center">
10
+ <a href="https://www.npmjs.com/package/cc-proficiency"><img src="https://img.shields.io/npm/v/cc-proficiency?style=flat-square&color=cb3837&logo=npm" alt="npm 버전" /></a>
11
+ <a href="https://www.npmjs.com/package/cc-proficiency"><img src="https://img.shields.io/npm/dm/cc-proficiency?style=flat-square&color=cb3837&logo=npm" alt="npm 다운로드" /></a>
12
+ <a href="https://github.com/Z-M-Huang/cc-proficiency"><img src="https://img.shields.io/github/stars/Z-M-Huang/cc-proficiency?style=flat-square&logo=github" alt="GitHub stars" /></a>
13
+ <a href="https://github.com/Z-M-Huang/cc-proficiency/issues"><img src="https://img.shields.io/github/issues/Z-M-Huang/cc-proficiency?style=flat-square&logo=github" alt="GitHub issues" /></a>
14
+ <a href="https://github.com/Z-M-Huang/cc-proficiency/blob/main/LICENSE"><img src="https://img.shields.io/github/license/Z-M-Huang/cc-proficiency?style=flat-square" alt="라이선스" /></a>
15
+ </p>
16
+
17
+ <p align="center">
18
+ <img src="https://img.shields.io/badge/node-%3E%3D18.0.0-339933?style=flat-square&logo=node.js&logoColor=white" alt="Node.js" />
19
+ <img src="https://img.shields.io/badge/TypeScript-5.7+-3178c6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript" />
20
+ <img src="https://img.shields.io/badge/zero-runtime_deps-22c55e?style=flat-square" alt="런타임 의존성 없음" />
21
+ <img src="https://img.shields.io/badge/coverage-96%25-brightgreen?style=flat-square" alt="테스트 커버리지" />
22
+ <img src="https://visitor-badge.laobi.icu/badge?page_id=Z-M-Huang.cc-proficiency&style=flat-square" alt="방문자" />
23
+ </p>
24
+
25
+ <p align="center">
26
+ <a href="#설치">설치</a> &nbsp;&middot;&nbsp;
27
+ <a href="#사용법">사용법</a> &nbsp;&middot;&nbsp;
28
+ <a href="#readme에-삽입하기">삽입</a> &nbsp;&middot;&nbsp;
29
+ <a href="#스코어링-방식">스코어링</a> &nbsp;&middot;&nbsp;
30
+ <a href="#개인정보-보호">개인정보</a> &nbsp;&middot;&nbsp;
31
+ <a href="#현지화">현지화</a> &nbsp;&middot;&nbsp;
32
+ <a href="./README.md">English</a> &middot; <a href="./README.zh-CN.md">中文</a> &middot; <a href="./README.es.md">Espa&ntilde;ol</a> &middot; <a href="./README.fr.md">Fran&ccedil;ais</a> &middot; <a href="./README.ja.md">日本語</a> &middot; <strong>한국어</strong>
33
+ </p>
34
+
35
+ ---
36
+
37
+ ## 기능 소개
38
+
39
+ Claude Code 세션 기록을 **로컬**에서 규칙 기반 엔진으로 분석하여, 5개 도메인의 사용 패턴을 평가합니다:
40
+
41
+ | 도메인 | 비중 | 측정 내용 |
42
+ |--------|------|-----------|
43
+ | **CC Mastery** | 20% | CLAUDE.md, 훅, 플러그인, 플랜 모드, 스킬, 규칙 |
44
+ | **Tool & MCP** | 20% | 조사 체인, MCP 서버, LSP, 선택적 편집 |
45
+ | **Agentic** | 20% | 서브에이전트, 병렬 실행, 워크트리, 작업 관리 |
46
+ | **Prompt Craft** | 20% | 구조화된 프롬프트, 코드 블록, 오류 추적, 개선 |
47
+ | **Context Mgmt** | 20% | 세션 간 메모리, CLAUDE.md 업데이트, 지속 프로젝트 |
48
+
49
+ 또한 **8개 기능 미니바**(Hooks, Plugins, Skills, MCP, Agents, Plan, Memory, Rules)를 히트맵 행으로 표시합니다.
50
+
51
+ <p align="center">
52
+ <a href="https://github.com/Z-M-Huang/cc-proficiency">
53
+ <img src="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency.svg" alt="CC Proficiency 배지 — 정적" />
54
+ </a>
55
+ <br />
56
+ <a href="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated.svg">애니메이션 버전 보기</a>
57
+ </p>
58
+
59
+ > **면책 조항:** 이것은 비공식 사용 추정이며, Anthropic의 실제 인증 점수가 아닙니다. Anthropic과 무관합니다.
60
+
61
+ ## 설치
62
+
63
+ ```bash
64
+ npm install -g cc-proficiency
65
+ cc-proficiency init
66
+ ```
67
+
68
+ `init`은 다음을 수행합니다:
69
+ 1. GitHub 사용자명 감지 (`gh` CLI 사용)
70
+ 2. `~/.claude/settings.json`에 Stop 훅 주입
71
+ 3. 배지용 비공개 GitHub Gist 생성 (`gh`가 인증된 경우)
72
+
73
+ `gh`가 설치되지 않았거나 인증되지 않은 경우, 배지는 `~/.cc-proficiency/cc-proficiency.svg`에 로컬로 저장됩니다.
74
+
75
+ ## 사용법
76
+
77
+ ### 초기 설정
78
+
79
+ ```bash
80
+ $ cc-proficiency init
81
+
82
+ Initializing cc-proficiency...
83
+
84
+ GitHub user: @yourname
85
+ Creating private Gist...
86
+ Gist created: a1b2c3d4e5f6
87
+
88
+ Add to your README:
89
+ ![CC Proficiency](https://gist.githubusercontent.com/yourname/a1b2c3d4e5f6/raw/cc-proficiency.svg)
90
+
91
+ ✓ Configuration saved to /home/you/.cc-proficiency
92
+ ✓ Hook injected into ~/.claude/settings.json
93
+
94
+ Run 'cc-proficiency analyze' to compute your first scores.
95
+ ```
96
+
97
+ ### 숙련도 분석
98
+
99
+ ```bash
100
+ $ cc-proficiency analyze --full
101
+
102
+ Running full analysis...
103
+ Claude Code Proficiency — @yourname
104
+ ────────────────────────────────────────
105
+ CC Mastery ███████████████░░░░░ 77 ●
106
+ Tool & MCP ███████████████████░ 96 ◐
107
+ Agentic ██████████████░░░░░░ 69 ◐
108
+ Prompt Craft ████████████████░░░░ 81 ◐
109
+ Context Mgmt ████████████████████ 100 ●
110
+ ────────────────────────────────────────
111
+ Hooks Edit (1411x), Bash (928x), Write (542x) +5
112
+ Skills dev-buddy-once (5x), chatroom (2x) +5
113
+ Tools Read 2046 · Bash 1045 · Write 379 · Edit 367 (+12 more)
114
+ ────────────────────────────────────────
115
+ 139 sessions · 4 projects
116
+ ```
117
+
118
+ ### 개선 팁 확인
119
+
120
+ ```bash
121
+ $ cc-proficiency explain
122
+
123
+ Claude Code Proficiency — @yourname
124
+
125
+ Strengths:
126
+ Context Mgmt 100/100
127
+ Tool & MCP 96/100
128
+ Prompt Craft 81/100
129
+ CC Mastery 77/100
130
+ Agentic 69/100
131
+
132
+ Areas to Improve:
133
+ Agentic (69/100)
134
+ → Try more CC features: subagents, MCP servers, skills,
135
+ plan mode, worktrees
136
+ CC Mastery (77/100)
137
+ → Enhance CLAUDE.md with imports, add hooks with matchers,
138
+ create rules files
139
+
140
+ Feature Usage:
141
+ Hooks: Edit (1411x), Bash (928x), Write (542x) +5
142
+ Skills: dev-buddy-once (5x), chatroom (2x) +5
143
+ Tools: Read (2046), Bash (1045), Write (379) +12 more
144
+ Flags: ✓ Plan ✓ Memory ✗ Rules
145
+
146
+ 139 sessions · 4 projects
147
+ ```
148
+
149
+ ### 배지 생성 및 푸시
150
+
151
+ ```bash
152
+ # 배지를 로컬에 저장
153
+ $ cc-proficiency badge --output my-badge.svg
154
+ Badge written to my-badge.svg
155
+
156
+ # 또는 Gist에 직접 푸시
157
+ $ cc-proficiency push
158
+ ✓ Badge pushed to Gist
159
+ https://gist.githubusercontent.com/yourname/a1b2c3d4e5f6/raw/cc-proficiency.svg
160
+ ```
161
+
162
+ ### 자동 업데이트 (무설정)
163
+
164
+ `init` 후, Claude Code 세션이 종료될 때마다 Stop 훅이 자동으로 실행됩니다:
165
+
166
+ ```
167
+ 평소처럼 Claude Code 사용
168
+ → 세션 종료
169
+ → 훅이 세션을 큐에 추가 (<1초, 사용자에게 보이지 않음)
170
+ → 백그라운드 프로세스가 분석 + 배지 업데이트
171
+ → README의 배지에 최신 점수 반영
172
+ ```
173
+
174
+ 설정 후 수동 작업이 필요 없습니다.
175
+
176
+ ### GitHub CLI 없이 사용
177
+
178
+ `gh`가 설치되지 않았거나 로컬 전용 모드를 선호하는 경우:
179
+
180
+ ```bash
181
+ $ cc-proficiency init
182
+
183
+ ⚠ GitHub CLI not authenticated.
184
+ Badge will be saved locally to: ~/.cc-proficiency/cc-proficiency.svg
185
+ To enable auto-upload: gh auth login && cc-proficiency init
186
+
187
+ $ cc-proficiency analyze --full
188
+ $ cc-proficiency badge --output badge.svg
189
+ ```
190
+
191
+ ## README에 삽입하기
192
+
193
+ `cc-proficiency init`을 실행한 후, README에 다음을 추가합니다:
194
+
195
+ ```markdown
196
+ <!-- 정적 배지 -->
197
+ ![Claude Code Proficiency](https://gist.githubusercontent.com/<username>/<gist-id>/raw/cc-proficiency.svg)
198
+
199
+ <!-- 애니메이션 배지 (클릭하여 보기) -->
200
+ [애니메이션 버전 보기](https://gist.githubusercontent.com/<username>/<gist-id>/raw/cc-proficiency-animated.svg)
201
+ ```
202
+
203
+ 두 배지 모두 Claude Code 세션마다 자동 업데이트됩니다 (Stop 훅 경유).
204
+
205
+ ## 점진적 배지
206
+
207
+ 배지는 사용 가능한 데이터 양에 따라 자동 조정됩니다:
208
+
209
+ | 단계 | 세션 수 | 표시 내용 |
210
+ |------|---------|-----------|
211
+ | **보정 중** | 0–2 | 설정 체크리스트 + 첫 스코어링을 향한 진행률 |
212
+ | **초기 결과** | 3–9 | 5개 도메인 바 + 8개 기능 미니바 (낮은 신뢰도 표시 ○) |
213
+ | **전체 배지** | 10+ | 전체 도메인 바, 기능 히트맵, 신뢰도 점 (● ◐ ○) |
214
+
215
+ ## 점수 개선하기
216
+
217
+ **[게이미피케이션 가이드](https://github.com/Z-M-Huang/cc-proficiency/wiki/Gamification-Guide)**에서 다루는 내용:
218
+
219
+ - 첫날부터 전문가 수준까지의 진행 경로
220
+ - 5개 도메인 각각에 대한 팁
221
+ - 15개 업적 전체 잠금 해제 방법
222
+ - 각 기능 미니바를 0에서 100으로 올리는 요인
223
+ - 스트릭 시스템과 리더보드
224
+
225
+ > **[Gamification Guide](https://github.com/Z-M-Huang/cc-proficiency/wiki/Gamification-Guide)** | **[游戏化攻略(中文)](https://github.com/Z-M-Huang/cc-proficiency/wiki/Gamification-Guide-zh)**
226
+
227
+ ## 스코어링 방식
228
+
229
+ ### 규칙 기반 엔진
230
+
231
+ cc-proficiency는 도구 호출 횟수를 세는 대신, 5개 도메인에 걸쳐 ~55개의 규칙을 가진 **패턴 매칭 규칙 엔진**을 사용합니다. 각 규칙은 특정 행동 패턴을 감지하고 티어별로 점수를 부여합니다:
232
+
233
+ | 티어 | 점수 | 규칙 예시 |
234
+ |------|------|-----------|
235
+ | **초급** | 5 pts | 글로벌 CLAUDE.md 보유 |
236
+ | **중급** | 10–15 pts | 조사 체인: Grep → Read → Edit |
237
+ | **고급** | 15–25 pts | 다양한 서브에이전트 유형의 병렬 에이전트 |
238
+ | **안티패턴** | -5 ~ -10 pts | 5+ 병렬 도구에서 오류율 >50% |
239
+
240
+ ### 5개 도메인 바
241
+
242
+ | 도메인 | 측정 내용 |
243
+ |--------|-----------|
244
+ | **CC Mastery** | CLAUDE.md 구조, 매처 포함 훅, 플러그인, 플랜 모드, 스킬, 규칙 파일 |
245
+ | **Tool & MCP** | 조사 체인, Read-before-Edit, 도구 다양성, MCP 서버 사용, LSP, 선택적 편집 |
246
+ | **Agentic** | 서브에이전트 유형 다양성, 병렬 에이전트, 백그라운드 실행, 워크트리, 작업 관리 |
247
+ | **Prompt Craft** | 구조화된 요청, 코드 블록, 오류 추적, 파일 참조, 반복적 개선 |
248
+ | **Context Mgmt** | 활성 메모리 파일, CLAUDE.md 업데이트, 지속 프로젝트, 세션 깊이 |
249
+
250
+ ### 8개 기능 미니바
251
+
252
+ 도메인 바 아래에 기능별 깊이를 보여주는 히트맵 행이 있습니다:
253
+
254
+ `Hooks · Plugins · Skills · MCP · Agents · Plan · Memory · Rules`
255
+
256
+ 각 미니바는 기능을 한 번 사용해 봤는지가 아니라 실제 사용량을 반영하는 대수 곡선의 **깊이 기반 스코어링**을 사용합니다. 훅이 구성되면 ~30점을 획득하고, 수백 개의 세션에서 훅이 실행되면 100에 가까워집니다. 자세한 내용은 [게이미피케이션 가이드](https://github.com/Z-M-Huang/cc-proficiency/wiki/Gamification-Guide)를 참조하세요.
257
+
258
+ ### 버킷 집계와 상한
259
+
260
+ 점수는 단순 합계가 아닙니다. 각 도메인에는 상한이 있는 버킷이 있습니다:
261
+
262
+ | 버킷 | 최대 점수 | 소스 |
263
+ |------|----------|------|
264
+ | **Config** | 25 pts | 설정 기반 규칙 (CLAUDE.md, 훅, 플러그인; 즉시 사용 가능) |
265
+ | **Behavior** | 75 pts | 행동 기반 규칙 (트랜스크립트 패턴; 시간이 지남에 따라 성장) |
266
+ | **Penalty** | -15 pts 최대 | 안티패턴 감점 |
267
+
268
+ 이것의 의미:
269
+ - **신규 설치**는 도메인당 최대 ~25의 설정 점수를 획득 가능 (보정 중에는 2.0x 스케일링으로 ~50까지 증가)
270
+ - **보정 후** (10+ 세션) 설정만으로는 도메인당 ~25가 상한; 트랜스크립트 증거가 나머지를 견인
271
+ - **안티패턴에는 상한**이 있으므로, 몇 번의 나쁜 세션이 점수를 파괴하지 않음
272
+
273
+ ### 단계 인식 가중치
274
+
275
+ 설정 증거는 보정 중에 더 무겁게, 트랜스크립트가 축적됨에 따라 더 가볍게 가중됩니다:
276
+
277
+ | 단계 | 세션 수 | 설정 스케일 | 행동 스케일 |
278
+ |------|---------|------------|------------|
279
+ | 보정 중 | 0–2 | 2.0× | 0.8× |
280
+ | 초기 | 3–9 | 1.5× | 1.0× |
281
+ | 전체 | 10+ | 1.0× | 1.15× |
282
+
283
+ ### 부정 행위 방지
284
+
285
+ - 규칙은 **세션당 상한 적용**으로 발동됩니다; 같은 도구를 100번 반복해도 효과 없음
286
+ - **안티패턴 규칙**은 나쁜 습관에 대해 점수를 감점합니다 (산발적 병렬 호출, 구조화되지 않은 텍스트)
287
+ - 각 규칙에 `maxPerSession`이 있습니다; 조사 체인은 세션당 3회 상한
288
+ - 설정 점수는 **25가 상한**이므로, 플러그인만 설치해서 도메인을 최대화할 수 없음
289
+
290
+ ## 개인정보 보호
291
+
292
+ | 항목 | 처리 방식 |
293
+ |------|-----------|
294
+ | **데이터 위치** | 모든 분석은 **로컬 머신**에서 수행됩니다 |
295
+ | **저장 내용** | 집계 카운트, 비율, 불리언 플래그만 저장 (파일 경로, 코드, 프롬프트 없음) |
296
+ | **Gist 가시성** | **기본적으로 비공개** (비밀 URL, 프로필에 표시되지 않음) |
297
+ | **오프라인 모드** | `gh` CLI 없이 완전히 오프라인으로 작동 (로컬 전용 모드) |
298
+ | **CI/CD** | 비대화형 세션은 자동으로 감지 및 제외됩니다 |
299
+
300
+ ## 현지화
301
+
302
+ cc-proficiency는 6개 언어를 지원합니다: English, 中文, Español, Français, 日本語, 한국어.
303
+
304
+ `init` 시 시스템 환경에서 로케일이 자동 감지됩니다. 변경하려면:
305
+
306
+ ```bash
307
+ cc-proficiency config locale zh-CN # 중국어
308
+ cc-proficiency config locale es # 스페인어
309
+ cc-proficiency config locale fr # 프랑스어
310
+ cc-proficiency config locale ja # 일본어
311
+ cc-proficiency config locale ko # 한국어
312
+ cc-proficiency config locale en # 영어 (기본값)
313
+ ```
314
+
315
+ SVG 배지는 SVG `<switch>` 요소와 `systemLanguage` 속성을 사용하여 보는 사람의 선호 언어로 자동 표시됩니다. 6개 언어 모두 하나의 SVG 파일에 포함되어 있어 로케일별로 별도의 배지를 생성할 필요가 없습니다.
316
+
317
+ ### 번역 기여
318
+
319
+ 새 언어를 추가하려면 `src/i18n/locales/en.ts`를 `src/i18n/locales/<code>.ts`로 복사하고, 모든 문자열을 번역한 후, `src/i18n/index.ts`에 로케일을 등록하세요.
320
+
321
+ ## 명령어
322
+
323
+ | 명령어 | 설명 |
324
+ |--------|------|
325
+ | `cc-proficiency init` | 훅 및 Gist 설정 |
326
+ | `cc-proficiency analyze [--full]` | 세션 분석 및 점수 계산 |
327
+ | `cc-proficiency process` | 훅에서 대기 중인 세션 처리 |
328
+ | `cc-proficiency badge [--output <파일>]` | SVG 배지 생성 |
329
+ | `cc-proficiency push` | 배지를 Gist에 업로드 |
330
+ | `cc-proficiency explain` | 점수 요인 및 팁 표시 |
331
+ | `cc-proficiency achievements` | 업적 진행 상황 보기 |
332
+ | `cc-proficiency status` | 훅 활동, 큐, 설정 표시 |
333
+ | `cc-proficiency config [키] [값]` | 설정 보기/변경 |
334
+ | `cc-proficiency share [--remove]` | 커뮤니티 리더보드 참가/탈퇴 |
335
+ | `cc-proficiency leaderboard` | 커뮤니티 랭킹 보기 |
336
+ | `cc-proficiency update` | 최신 버전으로 업데이트 |
337
+ | `cc-proficiency uninstall` | 훅 제거 및 정리 |
338
+
339
+ ### 커뮤니티 리더보드
340
+
341
+ 커뮤니티 리더보드에 참가하여 다른 Claude Code 사용자와 숙련도를 비교하세요:
342
+
343
+ ```bash
344
+ # 리더보드 참가 (별도의 공개 프로필 생성)
345
+ $ cc-proficiency share
346
+
347
+ # 랭킹 보기
348
+ $ cc-proficiency leaderboard
349
+
350
+ # 리더보드 탈퇴
351
+ $ cc-proficiency share --remove
352
+ ```
353
+
354
+ 개인 데이터(세션 세부 정보, 프로젝트 이름, 파일 경로)는 공유되지 않습니다. 점수, 스트릭, 업적 수만 공개됩니다. 전체 문서는 [wiki](https://github.com/Z-M-Huang/cc-proficiency/wiki)를 참조하세요.
355
+
356
+ ## 아키텍처
357
+
358
+ ```
359
+ Stop 훅 발동 (< 1s)
360
+ → 세션 경로를 ~/.cc-proficiency/queue.jsonl에 기록
361
+ → `cc-proficiency process`를 분리된 자식 프로세스로 실행
362
+
363
+ cc-proficiency process
364
+ → queue.lock 획득 (60초 초과 시 만료 → 강제 획득)
365
+ → session_id로 중복 제거
366
+ → 트랜스크립트 분석 (스트리밍 JSONL, 라인별 오류 처리)
367
+ → 시그널 추출 → 점수 계산 → SVG 렌더링
368
+ → Gist에 푸시 (설정된 경우) 또는 로컬에 저장
369
+ → 큐를 원자적으로 교체
370
+ ```
371
+
372
+ ## 기여하기
373
+
374
+ 기여를 환영합니다! 변경하고 싶은 내용에 대해 먼저 issue를 열어 논의해 주세요.
375
+
376
+ ```bash
377
+ git clone https://github.com/Z-M-Huang/cc-proficiency.git
378
+ cd cc-proficiency
379
+ npm install
380
+ npm test # 200 tests
381
+ npm run build # dist/로 컴파일
382
+ npm run typecheck # tsc --noEmit
383
+ npm run lint # eslint
384
+ npm run check # typecheck + lint + test
385
+ ```
386
+
387
+ ## 라이선스
388
+
389
+ [Apache 2.0](LICENSE)
390
+
391
+ ---
392
+
393
+ <p align="center">
394
+ <sub>Claude Code로 구축되었습니다. Anthropic과 무관합니다.</sub>
395
+ </p>
package/README.md CHANGED
@@ -28,7 +28,8 @@
28
28
  <a href="#embed-in-your-readme">Embed</a> &nbsp;·&nbsp;
29
29
  <a href="#how-scoring-works">Scoring</a> &nbsp;·&nbsp;
30
30
  <a href="#privacy">Privacy</a> &nbsp;·&nbsp;
31
- <a href="./README.zh-CN.md">中文</a>
31
+ <a href="#localization">Localization</a> &nbsp;·&nbsp;
32
+ <strong>English</strong> · <a href="./README.zh-CN.md">中文</a> · <a href="./README.es.md">Español</a> · <a href="./README.fr.md">Français</a> · <a href="./README.ja.md">日本語</a> · <a href="./README.ko.md">한국어</a>
32
33
  </p>
33
34
 
34
35
  ---
@@ -51,9 +52,8 @@ Also shows **8 feature mini-bars** (Hooks, Plugins, Skills, MCP, Agents, Plan, M
51
52
  <a href="https://github.com/Z-M-Huang/cc-proficiency">
52
53
  <img src="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency.svg" alt="CC Proficiency Badge — Static" />
53
54
  </a>
54
- <a href="https://github.com/Z-M-Huang/cc-proficiency">
55
- <img src="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated.svg" alt="CC Proficiency Badge — Animated" />
56
- </a>
55
+ <br />
56
+ <a href="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated.svg">Click to see animated version</a>
57
57
  </p>
58
58
 
59
59
  > **Disclaimer:** This is an unofficial usage estimate, not an actual Anthropic certification score. Not affiliated with or endorsed by Anthropic.
@@ -196,8 +196,8 @@ After running `cc-proficiency init`, add this to your README:
196
196
  <!-- Static badge -->
197
197
  ![Claude Code Proficiency](https://gist.githubusercontent.com/<username>/<gist-id>/raw/cc-proficiency.svg)
198
198
 
199
- <!-- Animated badge (bars fill on load) -->
200
- ![Claude Code Proficiency](https://gist.githubusercontent.com/<username>/<gist-id>/raw/cc-proficiency-animated.svg)
199
+ <!-- Animated badge (click to view) -->
200
+ [Click to see animated version](https://gist.githubusercontent.com/<username>/<gist-id>/raw/cc-proficiency-animated.svg)
201
201
  ```
202
202
 
203
203
  Both badges update automatically after each Claude Code session (via the Stop hook).
@@ -297,6 +297,27 @@ Config evidence is weighted more heavily during calibration, less as transcripts
297
297
  | **Offline mode** | Works fully offline without `gh` CLI (local-only mode) |
298
298
  | **CI/CD** | Non-interactive sessions are automatically detected and excluded |
299
299
 
300
+ ## Localization
301
+
302
+ cc-proficiency supports 6 languages: English, 中文, Español, Français, 日本語, 한국어.
303
+
304
+ Your locale is auto-detected from system environment on `init`. To change it:
305
+
306
+ ```bash
307
+ cc-proficiency config locale zh-CN # Chinese
308
+ cc-proficiency config locale es # Spanish
309
+ cc-proficiency config locale fr # French
310
+ cc-proficiency config locale ja # Japanese
311
+ cc-proficiency config locale ko # Korean
312
+ cc-proficiency config locale en # English (default)
313
+ ```
314
+
315
+ SVG badges automatically display in the viewer's preferred language using SVG `<switch>` elements with `systemLanguage` attributes. All 6 languages are embedded in a single SVG file -- no need to generate separate badges per locale.
316
+
317
+ ### Contributing Translations
318
+
319
+ To add a new language, copy `src/i18n/locales/en.ts` to `src/i18n/locales/<code>.ts`, translate all strings, and register the locale in `src/i18n/index.ts`.
320
+
300
321
  ## Commands
301
322
 
302
323
  | Command | Description |
package/README.zh-CN.md CHANGED
@@ -28,7 +28,8 @@
28
28
  <a href="#嵌入到你的-readme">嵌入</a> &nbsp;·&nbsp;
29
29
  <a href="#评分系统">评分</a> &nbsp;·&nbsp;
30
30
  <a href="#隐私">隐私</a> &nbsp;·&nbsp;
31
- <a href="./README.md">English</a>
31
+ <a href="#本地化">本地化</a> &nbsp;·&nbsp;
32
+ <a href="./README.md">English</a> · <strong>中文</strong> · <a href="./README.es.md">Español</a> · <a href="./README.fr.md">Français</a> · <a href="./README.ja.md">日本語</a> · <a href="./README.ko.md">한국어</a>
32
33
  </p>
33
34
 
34
35
  ---
@@ -51,9 +52,8 @@
51
52
  <a href="https://github.com/Z-M-Huang/cc-proficiency">
52
53
  <img src="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency.svg" alt="CC Proficiency 徽章 — 静态" />
53
54
  </a>
54
- <a href="https://github.com/Z-M-Huang/cc-proficiency">
55
- <img src="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated.svg" alt="CC Proficiency 徽章 — 动画" />
56
- </a>
55
+ <br />
56
+ <a href="https://gist.githubusercontent.com/Z-M-Huang/2717fa94690c459d5093650c87f49868/raw/cc-proficiency-animated.svg">点击查看动画版本</a>
57
57
  </p>
58
58
 
59
59
  > **声明:** 这是一个非官方的使用评估工具,不代表 Anthropic 官方认证分数。与 Anthropic 无关联。
@@ -147,8 +147,8 @@ cc-proficiency badge
147
147
  <!-- 静态徽章 -->
148
148
  ![Claude Code Proficiency](https://gist.githubusercontent.com/<用户名>/<gist-id>/raw/cc-proficiency.svg)
149
149
 
150
- <!-- 动画徽章(加载时进度条填充) -->
151
- ![Claude Code Proficiency](https://gist.githubusercontent.com/<用户名>/<gist-id>/raw/cc-proficiency-animated.svg)
150
+ <!-- 动画徽章(点击查看) -->
151
+ [点击查看动画版本](https://gist.githubusercontent.com/<用户名>/<gist-id>/raw/cc-proficiency-animated.svg)
152
152
  ```
153
153
 
154
154
  ## 渐进式徽章
@@ -237,6 +237,27 @@ cc-proficiency 使用 **~55 条模式匹配规则**,而不是简单计数:
237
237
  | **离线模式** | 无需 `gh` CLI 即可完全离线工作(仅本地模式) |
238
238
  | **CI/CD** | 非交互式会话自动检测并排除 |
239
239
 
240
+ ## 本地化
241
+
242
+ cc-proficiency 支持 6 种语言:English、中文、Español、Français、日本語、한국어。
243
+
244
+ `init` 时会自动从系统环境检测你的语言。要手动更改:
245
+
246
+ ```bash
247
+ cc-proficiency config locale zh-CN # 中文
248
+ cc-proficiency config locale es # 西班牙语
249
+ cc-proficiency config locale fr # 法语
250
+ cc-proficiency config locale ja # 日语
251
+ cc-proficiency config locale ko # 韩语
252
+ cc-proficiency config locale en # 英语(默认)
253
+ ```
254
+
255
+ SVG 徽章会使用 SVG `<switch>` 元素和 `systemLanguage` 属性自动以查看者的首选语言显示。所有 6 种语言都嵌入在单个 SVG 文件中,无需为每种语言单独生成徽章。
256
+
257
+ ### 贡献翻译
258
+
259
+ 要添加新语言,将 `src/i18n/locales/en.ts` 复制为 `src/i18n/locales/<code>.ts`,翻译所有字符串,然后在 `src/i18n/index.ts` 中注册该语言。
260
+
240
261
  ## 命令
241
262
 
242
263
  | 命令 | 描述 |
@@ -1 +1 @@
1
- {"version":3,"file":"achievements.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/achievements.ts"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,IAAI,IAAI,CAgDtC"}
1
+ {"version":3,"file":"achievements.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/achievements.ts"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,IAAI,IAAI,CAiDtC"}
@@ -6,11 +6,12 @@ const uploader_js_1 = require("../../gist/uploader.js");
6
6
  const remote_store_js_1 = require("../../store/remote-store.js");
7
7
  const achievements_js_1 = require("../../store/achievements.js");
8
8
  const formatting_js_1 = require("../utils/formatting.js");
9
+ const index_js_1 = require("../../i18n/index.js");
9
10
  function cmdAchievements() {
10
11
  const store = (0, local_store_js_1.loadStore)();
11
12
  const config = (0, local_store_js_1.loadConfig)();
12
13
  if (!store.lastResult) {
13
- console.log("No analysis data. Run 'cc-proficiency analyze' first.");
14
+ console.log((0, index_js_1.t)().common.noAnalysisData);
14
15
  return;
15
16
  }
16
17
  let unlockedIds = [];
@@ -34,17 +35,18 @@ function cmdAchievements() {
34
35
  };
35
36
  const newLocal = (0, achievements_js_1.checkAchievements)(ctx, unlockedIds);
36
37
  const allUnlocked = new Set([...unlockedIds, ...newLocal]);
37
- console.log(`\n Achievements (${allUnlocked.size}/${achievements_js_1.ACHIEVEMENTS.length})\n`);
38
+ console.log(`\n${(0, index_js_1.t)().cli.achievements.title(allUnlocked.size, achievements_js_1.ACHIEVEMENTS.length)}\n`);
38
39
  for (const achievement of achievements_js_1.ACHIEVEMENTS) {
39
40
  const unlocked = allUnlocked.has(achievement.id);
40
41
  const { current, target } = achievement.progress(ctx);
41
42
  const pct = Math.min(100, Math.round((current / target) * 100));
42
43
  const bar = (0, formatting_js_1.progressBar)(pct, 12);
44
+ const name = (0, index_js_1.t)().achievements[achievement.id]?.name ?? achievement.id;
43
45
  if (unlocked) {
44
- console.log(` ${achievement.icon} ${achievement.name.padEnd(18)} ${bar} Done!`);
46
+ console.log(` ${achievement.icon} ${name.padEnd(18)} ${bar} ${(0, index_js_1.t)().cli.achievements.done}`);
45
47
  }
46
48
  else {
47
- console.log(` \u2591 ${achievement.name.padEnd(18)} ${bar} ${current}/${target}`);
49
+ console.log(` \u2591 ${name.padEnd(18)} ${bar} ${current}/${target}`);
48
50
  }
49
51
  }
50
52
  console.log("");
@@ -1 +1 @@
1
- {"version":3,"file":"achievements.js","sourceRoot":"","sources":["../../../src/cli/commands/achievements.ts"],"names":[],"mappings":";;AAMA,0CAgDC;AAtDD,+DAAmE;AACnE,wDAAyE;AACzE,iEAA+D;AAC/D,iEAA8E;AAC9E,0DAAqD;AAErD,SAAgB,eAAe;IAC7B,MAAM,KAAK,GAAG,IAAA,0BAAS,GAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAA,2BAAU,GAAE,CAAC;IAE5B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,WAAW,GAAa,EAAE,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM,IAAI,IAAA,+BAAiB,GAAE,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,IAAA,0BAAY,EAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAA,kCAAgB,EAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,IAAI,MAAM,EAAE,CAAC;YACX,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;IAChC,MAAM,GAAG,GAAG;QACV,aAAa,EAAE,MAAM,CAAC,YAAY;QAClC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;QACtC,aAAa,EAAE,MAAM,CAAC,YAAY;QAClC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK;KACzC,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAA,mCAAiB,EAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IAE3D,OAAO,CAAC,GAAG,CAAC,qBAAqB,WAAW,CAAC,IAAI,IAAI,8BAAY,CAAC,MAAM,KAAK,CAAC,CAAC;IAE/E,KAAK,MAAM,WAAW,IAAI,8BAAY,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,IAAA,2BAAW,EAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAEjC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"achievements.js","sourceRoot":"","sources":["../../../src/cli/commands/achievements.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC9D"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC9D"}
@@ -4,9 +4,10 @@ exports.cmdAnalyze = cmdAnalyze;
4
4
  const local_store_js_1 = require("../../store/local-store.js");
5
5
  const sessions_js_1 = require("../services/sessions.js");
6
6
  const formatting_js_1 = require("../utils/formatting.js");
7
+ const index_js_1 = require("../../i18n/index.js");
7
8
  async function cmdAnalyze(args) {
8
9
  const full = args.includes("--full");
9
- console.log(full ? "Running full analysis..." : "Running incremental analysis...\n");
10
+ console.log(full ? (0, index_js_1.t)().cli.analyze.runningFull : (0, index_js_1.t)().cli.analyze.runningIncremental + "\n");
10
11
  const { sessions, config } = await (0, sessions_js_1.gatherData)(full);
11
12
  // Always persist current cwd, even if no sessions found
12
13
  const store = (0, local_store_js_1.loadStore)();
@@ -15,7 +16,7 @@ async function cmdAnalyze(args) {
15
16
  store.knownProjectCwds = [...known];
16
17
  (0, local_store_js_1.saveStore)(store);
17
18
  if (sessions.length === 0) {
18
- console.log("No sessions found. Use Claude Code first, then run analyze again.");
19
+ console.log((0, index_js_1.t)().cli.analyze.noSessionsFound);
19
20
  return;
20
21
  }
21
22
  const userConfig = (0, local_store_js_1.loadConfig)();
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":";;AAIA,gCAsCC;AA1CD,+DAAmH;AACnH,yDAAkE;AAClE,0DAAqD;AAE9C,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC;IAErF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,IAAI,CAAC,CAAC;IAEpD,wDAAwD;IACxD,MAAM,KAAK,GAAG,IAAA,0BAAS,GAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzB,KAAK,CAAC,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,IAAA,0BAAS,EAAC,KAAK,CAAC,CAAC;IAEjB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,2BAAU,GAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;IAE/E,+CAA+C;IAC/C,IAAA,+BAAc,EAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,OAAO;QACpB,MAAM,EAAE,CAAC,CAAC,WAAW;KACtB,CAAC,CAAC,CAAC,CAAC;IAEL,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,IAAA,0BAAS,EAAC,KAAK,CAAC,CAAC;IAEjB,MAAM,YAAY,GAAG,IAAA,oCAAmB,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAA,2BAAW,EAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":";;AAKA,gCAsCC;AA3CD,+DAAmH;AACnH,yDAAkE;AAClE,0DAAqD;AACrD,kDAAwC;AAEjC,KAAK,UAAU,UAAU,CAAC,IAAc;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,YAAC,GAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,YAAC,GAAE,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IAE5F,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,IAAI,CAAC,CAAC;IAEpD,wDAAwD;IACxD,MAAM,KAAK,GAAG,IAAA,0BAAS,GAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IACpD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzB,KAAK,CAAC,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,IAAA,0BAAS,EAAC,KAAK,CAAC,CAAC;IAEjB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,IAAA,YAAC,GAAE,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,2BAAU,GAAE,CAAC;IAChC,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;IAE/E,+CAA+C;IAC/C,IAAA,+BAAc,EAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,OAAO;QACpB,MAAM,EAAE,CAAC,CAAC,WAAW;KACtB,CAAC,CAAC,CAAC,CAAC;IAEL,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,IAAA,0BAAS,EAAC,KAAK,CAAC,CAAC;IAEjB,MAAM,YAAY,GAAG,IAAA,oCAAmB,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAA,2BAAW,EAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/badge.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAsB7C"}
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/badge.ts"],"names":[],"mappings":"AAMA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAqB7C"}
@@ -5,27 +5,26 @@ const node_fs_1 = require("node:fs");
5
5
  const svg_js_1 = require("../../renderer/svg.js");
6
6
  const animated_svg_js_1 = require("../../renderer/animated-svg.js");
7
7
  const local_store_js_1 = require("../../store/local-store.js");
8
- const locale_js_1 = require("../utils/locale.js");
8
+ const index_js_1 = require("../../i18n/index.js");
9
9
  function cmdBadge(args) {
10
10
  const store = (0, local_store_js_1.loadStore)();
11
11
  if (!store.lastResult) {
12
- console.log("No analysis data. Run 'cc-proficiency analyze' first.");
12
+ console.log((0, index_js_1.t)().common.noAnalysisData);
13
13
  return;
14
14
  }
15
15
  const animated = args.includes("--animated");
16
- const locale = (0, locale_js_1.getConfigLocale)();
17
16
  const tokenWindows = (0, local_store_js_1.computeTokenWindows)(store.tokenLog);
18
17
  const svg = animated
19
- ? (0, animated_svg_js_1.renderAnimatedBadge)(store.lastResult, locale, tokenWindows)
20
- : (0, svg_js_1.renderBadge)(store.lastResult, locale, tokenWindows);
18
+ ? (0, animated_svg_js_1.renderAnimatedBadge)(store.lastResult, tokenWindows)
19
+ : (0, svg_js_1.renderBadge)(store.lastResult, tokenWindows);
21
20
  const outputIdx = args.indexOf("--output");
22
21
  if (outputIdx !== -1 && args[outputIdx + 1]) {
23
22
  (0, node_fs_1.writeFileSync)(args[outputIdx + 1], svg, "utf-8");
24
- console.log(`Badge written to ${args[outputIdx + 1]}`);
23
+ console.log((0, index_js_1.t)().cli.badge.writtenTo(args[outputIdx + 1]));
25
24
  }
26
25
  else {
27
26
  const path = animated ? (0, local_store_js_1.saveAnimatedBadge)(svg) : (0, local_store_js_1.saveBadge)(svg);
28
- console.log(`Badge saved to ${path}`);
27
+ console.log((0, index_js_1.t)().cli.badge.savedTo(path));
29
28
  }
30
29
  }
31
30
  //# sourceMappingURL=badge.js.map