claude-code-kr 0.3.10 → 0.3.12
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/lib/cckr-command.md +12 -0
- package/lib/commands.js +58 -0
- package/lib/hooks.js +11 -10
- package/lib/patcher.js +31 -0
- package/package.json +1 -1
- package/scripts/postinstall.js +16 -0
- package/scripts/preuninstall.js +12 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: cckr 한글 패치 버전 확인
|
|
3
|
+
---
|
|
4
|
+
<!-- managed-by: claude-code-kr -->
|
|
5
|
+
|
|
6
|
+
이 세션에 적용된 cckr 버전과 디스크 상태를 함께 보여줘. 다음 bash 한 번만 실행하고 결과를 그대로 출력:
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
echo "=== 이 세션 ==="; cat /tmp/cckr-session-$PPID.json 2>/dev/null || echo "(세션 정보 없음 — 새 세션을 시작하세요)"; echo ""; echo "=== 디스크 (현재 cli.js) ==="; cckr status
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
추가 해석/요약 없이 출력만 그대로.
|
package/lib/commands.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const os = require('os');
|
|
4
|
+
|
|
5
|
+
const COMMANDS_DIR = path.join(os.homedir(), '.claude', 'commands');
|
|
6
|
+
const TARGET_FILE = path.join(COMMANDS_DIR, 'cckr.md');
|
|
7
|
+
const SOURCE_FILE = path.join(__dirname, 'cckr-command.md');
|
|
8
|
+
const MARKER = 'managed-by: claude-code-kr';
|
|
9
|
+
|
|
10
|
+
// /cckr 슬래시 커맨드 설치
|
|
11
|
+
function install() {
|
|
12
|
+
try {
|
|
13
|
+
if (!fs.existsSync(SOURCE_FILE)) {
|
|
14
|
+
return { ok: false, error: 'cckr-command.md 원본 파일 없음' };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ~/.claude/commands/ 디렉토리 생성
|
|
18
|
+
if (!fs.existsSync(COMMANDS_DIR)) {
|
|
19
|
+
fs.mkdirSync(COMMANDS_DIR, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// 기존 파일이 있고 marker가 없으면 사용자 정의 — 건드리지 않음
|
|
23
|
+
if (fs.existsSync(TARGET_FILE)) {
|
|
24
|
+
const existing = fs.readFileSync(TARGET_FILE, 'utf8');
|
|
25
|
+
if (!existing.includes(MARKER)) {
|
|
26
|
+
return { ok: true, skipped: true, reason: 'user-customized' };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 복사
|
|
31
|
+
fs.copyFileSync(SOURCE_FILE, TARGET_FILE);
|
|
32
|
+
return { ok: true };
|
|
33
|
+
} catch (e) {
|
|
34
|
+
return { ok: false, error: e.message };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// /cckr 슬래시 커맨드 제거
|
|
39
|
+
function uninstall() {
|
|
40
|
+
try {
|
|
41
|
+
if (!fs.existsSync(TARGET_FILE)) {
|
|
42
|
+
return { ok: true, skipped: true, reason: 'not-found' };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// marker가 있는 우리 파일만 제거
|
|
46
|
+
const content = fs.readFileSync(TARGET_FILE, 'utf8');
|
|
47
|
+
if (!content.includes(MARKER)) {
|
|
48
|
+
return { ok: true, skipped: true, reason: 'user-customized' };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
fs.unlinkSync(TARGET_FILE);
|
|
52
|
+
return { ok: true };
|
|
53
|
+
} catch (e) {
|
|
54
|
+
return { ok: false, error: e.message };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = { install, uninstall, TARGET_FILE };
|
package/lib/hooks.js
CHANGED
|
@@ -3,7 +3,7 @@ const path = require('path');
|
|
|
3
3
|
const os = require('os');
|
|
4
4
|
|
|
5
5
|
const SETTINGS_PATH = path.join(os.homedir(), '.claude', 'settings.json');
|
|
6
|
-
const HOOK_COMMAND = 'cckr apply 2>/dev/null || true';
|
|
6
|
+
const HOOK_COMMAND = 'CCKR_SESSION_PPID=$PPID cckr apply 2>/dev/null || true';
|
|
7
7
|
const HOOK_ID = 'cckr-auto-patch';
|
|
8
8
|
|
|
9
9
|
function readSettings() {
|
|
@@ -20,22 +20,23 @@ function install() {
|
|
|
20
20
|
if (!settings.hooks) settings.hooks = {};
|
|
21
21
|
if (!settings.hooks.SessionStart) settings.hooks.SessionStart = [];
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
settings.hooks.SessionStart = settings.hooks.SessionStart.filter(entry =>
|
|
25
|
-
!entry.hooks?.some(h => h.command?.includes('cc-kr-auto-patch') || (h.command?.includes('cc-kr') && !h.command?.includes('claude-code-kr')))
|
|
26
|
-
);
|
|
23
|
+
const expectedCommand = `bash -c '# ${HOOK_ID}\n${HOOK_COMMAND}'`;
|
|
27
24
|
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
entry.hooks?.some(h =>
|
|
25
|
+
// 옛날 cc-kr hook 제거 + 기존 cckr hook도 제거 (커맨드 갱신을 위해)
|
|
26
|
+
settings.hooks.SessionStart = settings.hooks.SessionStart.filter(entry =>
|
|
27
|
+
!entry.hooks?.some(h =>
|
|
28
|
+
h.command?.includes('cc-kr-auto-patch') ||
|
|
29
|
+
(h.command?.includes('cc-kr') && !h.command?.includes('claude-code-kr')) ||
|
|
30
|
+
h.command?.includes(HOOK_ID)
|
|
31
|
+
)
|
|
31
32
|
);
|
|
32
|
-
if (exists) return { ok: true, skipped: true };
|
|
33
33
|
|
|
34
|
+
// 새로 등록 (항상 최신 커맨드로)
|
|
34
35
|
settings.hooks.SessionStart.push({
|
|
35
36
|
matcher: '.*',
|
|
36
37
|
hooks: [{
|
|
37
38
|
type: 'command',
|
|
38
|
-
command:
|
|
39
|
+
command: expectedCommand
|
|
39
40
|
}]
|
|
40
41
|
});
|
|
41
42
|
|
package/lib/patcher.js
CHANGED
|
@@ -130,6 +130,37 @@ function apply(cliJs, { force = false } = {}) {
|
|
|
130
130
|
} catch {}
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
// 세션 시작 시점 캡처 — SessionStart hook이 CCKR_SESSION_PPID env로 호출
|
|
134
|
+
// 패치 직전의 marker = 이 세션이 메모리에 로드한 cli.js 버전
|
|
135
|
+
const sessionPpid = process.env.CCKR_SESSION_PPID;
|
|
136
|
+
if (sessionPpid && /^\d+$/.test(sessionPpid)) {
|
|
137
|
+
let preMarker = null;
|
|
138
|
+
try {
|
|
139
|
+
preMarker = JSON.parse(fs.readFileSync(markerPath, 'utf8'));
|
|
140
|
+
} catch {}
|
|
141
|
+
const sessionInfo = {
|
|
142
|
+
capturedAt: new Date().toISOString(),
|
|
143
|
+
claudePid: sessionPpid,
|
|
144
|
+
ccVersion: ccVersion,
|
|
145
|
+
// 이 세션이 로드한 cli.js의 cckr 버전 (패치 직전)
|
|
146
|
+
// marker 없으면 cli.js가 unpatched 상태였음
|
|
147
|
+
sessionCckrVersion: preMarker?.cckrVersion || 'unpatched',
|
|
148
|
+
installedCckrVersion: pkg.version,
|
|
149
|
+
};
|
|
150
|
+
try {
|
|
151
|
+
fs.writeFileSync(`/tmp/cckr-session-${sessionPpid}.json`, JSON.stringify(sessionInfo, null, 2));
|
|
152
|
+
// 7일 이상 된 세션 파일 정리
|
|
153
|
+
const tmpFiles = fs.readdirSync('/tmp').filter(f => /^cckr-session-\d+\.json$/.test(f));
|
|
154
|
+
const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
|
|
155
|
+
for (const f of tmpFiles) {
|
|
156
|
+
try {
|
|
157
|
+
const stat = fs.statSync(`/tmp/${f}`);
|
|
158
|
+
if (stat.mtimeMs < sevenDaysAgo) fs.unlinkSync(`/tmp/${f}`);
|
|
159
|
+
} catch {}
|
|
160
|
+
}
|
|
161
|
+
} catch {}
|
|
162
|
+
}
|
|
163
|
+
|
|
133
164
|
const bakPath = cliJs + '.bak';
|
|
134
165
|
|
|
135
166
|
// 백업 생성 또는 백업에서 복원 (중복 패치 방지)
|
package/package.json
CHANGED
package/scripts/postinstall.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
try {
|
|
4
4
|
const patcher = require('../lib/patcher');
|
|
5
5
|
const hooks = require('../lib/hooks');
|
|
6
|
+
const commands = require('../lib/commands');
|
|
6
7
|
|
|
7
8
|
console.log('🇰🇷 claude-code-kr: Claude Code 한글화 설치 중...\n');
|
|
8
9
|
|
|
@@ -35,7 +36,22 @@ try {
|
|
|
35
36
|
console.log(` ⚠️ hook 등록 스킵: ${e.message}`);
|
|
36
37
|
}
|
|
37
38
|
|
|
39
|
+
// 3. /cckr 슬래시 커맨드 설치
|
|
40
|
+
try {
|
|
41
|
+
const cmdResult = commands.install();
|
|
42
|
+
if (cmdResult.ok && !cmdResult.skipped) {
|
|
43
|
+
console.log(' ✅ /cckr 슬래시 커맨드 설치');
|
|
44
|
+
} else if (cmdResult.skipped) {
|
|
45
|
+
console.log(` ⏭️ /cckr 커맨드 스킵 (${cmdResult.reason})`);
|
|
46
|
+
} else {
|
|
47
|
+
console.log(` ⚠️ /cckr 커맨드 설치 스킵: ${cmdResult.error}`);
|
|
48
|
+
}
|
|
49
|
+
} catch (e) {
|
|
50
|
+
console.log(` ⚠️ /cckr 커맨드 설치 스킵: ${e.message}`);
|
|
51
|
+
}
|
|
52
|
+
|
|
38
53
|
console.log('\n🎉 설치 완료! 새 세션에서 /도움, /근데, /압축 등을 사용하세요');
|
|
54
|
+
console.log(' /cckr 입력으로 cckr 버전 확인 가능');
|
|
39
55
|
} catch (e) {
|
|
40
56
|
// postinstall 실패가 npm install을 막으면 안 됨
|
|
41
57
|
console.log(`⚠️ claude-code-kr 설정 스킵: ${e.message}`);
|
package/scripts/preuninstall.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
try {
|
|
4
4
|
const patcher = require('../lib/patcher');
|
|
5
5
|
const hooks = require('../lib/hooks');
|
|
6
|
+
const commands = require('../lib/commands');
|
|
6
7
|
|
|
7
8
|
console.log('🇰🇷 claude-code-kr: 제거 중...\n');
|
|
8
9
|
|
|
@@ -24,6 +25,17 @@ try {
|
|
|
24
25
|
console.log(` ⚠️ hook 제거 스킵: ${e.message}`);
|
|
25
26
|
}
|
|
26
27
|
|
|
28
|
+
try {
|
|
29
|
+
const cmdResult = commands.uninstall();
|
|
30
|
+
if (cmdResult.ok && !cmdResult.skipped) {
|
|
31
|
+
console.log(' ✅ /cckr 슬래시 커맨드 제거');
|
|
32
|
+
} else if (cmdResult.skipped) {
|
|
33
|
+
console.log(` ⏭️ /cckr 커맨드 스킵 (${cmdResult.reason})`);
|
|
34
|
+
}
|
|
35
|
+
} catch (e) {
|
|
36
|
+
console.log(` ⚠️ /cckr 제거 스킵: ${e.message}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
27
39
|
console.log('\n👋 claude-code-kr 제거 완료');
|
|
28
40
|
} catch (e) {
|
|
29
41
|
console.log(`⚠️ claude-code-kr 정리 스킵: ${e.message}`);
|