@deepdiver_sj/claude-settings 0.1.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.md +60 -0
- package/dist/bin/claude-settings.d.ts +51 -0
- package/dist/bin/claude-settings.d.ts.map +1 -0
- package/dist/bin/claude-settings.js +218 -0
- package/dist/bin/claude-settings.js.map +1 -0
- package/dist/core/constants.d.ts +609 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +463 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/paths.d.ts +134 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +318 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/snapshot/exporter.d.ts +14 -0
- package/dist/snapshot/exporter.d.ts.map +1 -0
- package/dist/snapshot/exporter.js +168 -0
- package/dist/snapshot/exporter.js.map +1 -0
- package/dist/snapshot/importer.d.ts +11 -0
- package/dist/snapshot/importer.d.ts.map +1 -0
- package/dist/snapshot/importer.js +118 -0
- package/dist/snapshot/importer.js.map +1 -0
- package/dist/snapshot/types.d.ts +57 -0
- package/dist/snapshot/types.d.ts.map +1 -0
- package/dist/snapshot/types.js +5 -0
- package/dist/snapshot/types.js.map +1 -0
- package/package.json +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# @deepdiver_sj/claude-settings
|
|
2
|
+
|
|
3
|
+
Windows, macOS, Linux에서 Claude Code 환경 설정(`~/.claude`)을 백업하고 다른 PC에서 그대로 복원하는 CLI 도구입니다.
|
|
4
|
+
|
|
5
|
+
## 설치
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @deepdiver_sj/claude-settings
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
또는 설치 없이 바로 실행:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @deepdiver_sj/claude-settings export
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 빠른 시작
|
|
18
|
+
|
|
19
|
+
**현재 PC에서 환경 내보내기**
|
|
20
|
+
```bash
|
|
21
|
+
npx @deepdiver_sj/claude-settings export
|
|
22
|
+
# → env-snapshot.json 생성
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**새 PC에서 환경 복원**
|
|
26
|
+
```bash
|
|
27
|
+
npx @deepdiver_sj/claude-settings import --file ./env-snapshot.json
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
자세한 사용법은 [manual.md](./manual.md)를 참고하세요.
|
|
31
|
+
|
|
32
|
+
## 주요 기능
|
|
33
|
+
|
|
34
|
+
- **크로스 플랫폼**: Windows → macOS, Linux → Windows 등 OS 간 이동 지원
|
|
35
|
+
- **경로 자동 변환**: hooks의 절대 경로를 이식 가능한 형태로 자동 정규화
|
|
36
|
+
- **선택적 복사**: 환경 파일(rules, hooks, skills)만 복사, 캐시·대화 기록 제외
|
|
37
|
+
- **Dry-run 지원**: 실제 적용 전 무엇이 변경되는지 미리 확인 가능
|
|
38
|
+
|
|
39
|
+
## 포함되는 항목
|
|
40
|
+
|
|
41
|
+
| 항목 | 설명 |
|
|
42
|
+
|------|------|
|
|
43
|
+
| `CLAUDE.md` | 전역 Claude 지시문 |
|
|
44
|
+
| `settings.json` | hooks 포함 전역 설정 |
|
|
45
|
+
| `executables/` | hooks 스크립트, 커스텀 스킬 |
|
|
46
|
+
| `rules/` | 전역 규칙 파일 |
|
|
47
|
+
| `.omc-config.json` | OMC 설정 |
|
|
48
|
+
|
|
49
|
+
## 제외되는 항목
|
|
50
|
+
|
|
51
|
+
`projects/`(대화 기록), `cache/`, `file-history/`, `.credentials.json` 등은 복사되지 않습니다.
|
|
52
|
+
|
|
53
|
+
## 요구사항
|
|
54
|
+
|
|
55
|
+
- Node.js 20 이상
|
|
56
|
+
- Claude Code 설치 (`~/.claude` 디렉토리 존재)
|
|
57
|
+
|
|
58
|
+
## 라이선스
|
|
59
|
+
|
|
60
|
+
MIT
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @file src/bin/claude-settings.ts
|
|
4
|
+
* @description Claude Settings CLI 명령어 구현
|
|
5
|
+
*
|
|
6
|
+
* 명령어:
|
|
7
|
+
* - npx claude-settings export [--output=<path>] : ~/.claude 환경을 스냅샷 JSON으로 내보내기
|
|
8
|
+
* - npx claude-settings import --file=<path> [--dry-run] : 스냅샷 JSON을 ~/.claude로 복원
|
|
9
|
+
* - npx claude-settings help : 도움말 표시
|
|
10
|
+
* - npx claude-settings version : 버전 정보 출력
|
|
11
|
+
* - npx claude-settings -v/--version : 버전 정보 (단축 옵션)
|
|
12
|
+
*
|
|
13
|
+
* @version 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* CLI 명령어 결과 인터페이스
|
|
17
|
+
*/
|
|
18
|
+
interface ICliResult {
|
|
19
|
+
success: boolean;
|
|
20
|
+
message: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
exitCode: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* CLI 엔진 클래스
|
|
26
|
+
*/
|
|
27
|
+
declare class CliEngine {
|
|
28
|
+
private readonly VERSION;
|
|
29
|
+
/**
|
|
30
|
+
* help 명령어 구현
|
|
31
|
+
*/
|
|
32
|
+
help(command?: string): ICliResult;
|
|
33
|
+
/**
|
|
34
|
+
* version 명령어 구현
|
|
35
|
+
*/
|
|
36
|
+
version(): string;
|
|
37
|
+
/**
|
|
38
|
+
* export 명령어 구현
|
|
39
|
+
*/
|
|
40
|
+
runExport(args: string[]): Promise<ICliResult>;
|
|
41
|
+
/**
|
|
42
|
+
* import 명령어 구현
|
|
43
|
+
*/
|
|
44
|
+
runImport(args: string[]): Promise<ICliResult>;
|
|
45
|
+
/**
|
|
46
|
+
* 동기 명령어 실행 (export/import는 main에서 별도 처리)
|
|
47
|
+
*/
|
|
48
|
+
execute(args: string[]): ICliResult;
|
|
49
|
+
}
|
|
50
|
+
export { CliEngine, type ICliResult };
|
|
51
|
+
//# sourceMappingURL=claude-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings.d.ts","sourceRoot":"","sources":["../../src/bin/claude-settings.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAKH;;GAEG;AACH,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,cAAM,SAAS;IACb,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IAEnC;;OAEG;IACI,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU;IA+DzC;;OAEG;IACI,OAAO,IAAI,MAAM;IAIxB;;OAEG;IACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAqB3D;;OAEG;IACU,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IA8B3D;;OAEG;IACI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU;CA0C3C;AA2CD,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @file src/bin/claude-settings.ts
|
|
4
|
+
* @description Claude Settings CLI 명령어 구현
|
|
5
|
+
*
|
|
6
|
+
* 명령어:
|
|
7
|
+
* - npx claude-settings export [--output=<path>] : ~/.claude 환경을 스냅샷 JSON으로 내보내기
|
|
8
|
+
* - npx claude-settings import --file=<path> [--dry-run] : 스냅샷 JSON을 ~/.claude로 복원
|
|
9
|
+
* - npx claude-settings help : 도움말 표시
|
|
10
|
+
* - npx claude-settings version : 버전 정보 출력
|
|
11
|
+
* - npx claude-settings -v/--version : 버전 정보 (단축 옵션)
|
|
12
|
+
*
|
|
13
|
+
* @version 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
import { exportSnapshot } from '../snapshot/exporter.js';
|
|
16
|
+
import { importSnapshot } from '../snapshot/importer.js';
|
|
17
|
+
/**
|
|
18
|
+
* CLI 엔진 클래스
|
|
19
|
+
*/
|
|
20
|
+
class CliEngine {
|
|
21
|
+
VERSION = '1.0.0';
|
|
22
|
+
/**
|
|
23
|
+
* help 명령어 구현
|
|
24
|
+
*/
|
|
25
|
+
help(command) {
|
|
26
|
+
const commandHelps = {
|
|
27
|
+
export: `export - ~/.claude 환경 내보내기
|
|
28
|
+
사용법: npx claude-settings export [--output=<path>]
|
|
29
|
+
설명: ~/.claude 환경을 포터블 스냅샷 JSON 파일로 내보냅니다.
|
|
30
|
+
옵션:
|
|
31
|
+
--output=<path> 출력 파일 경로 (기본값: ./claude-snapshot.json)`,
|
|
32
|
+
import: `import - 스냅샷에서 ~/.claude 환경 복원
|
|
33
|
+
사용법: npx claude-settings import --file=<path> [--dry-run]
|
|
34
|
+
설명: 스냅샷 JSON 파일을 읽어 ~/.claude 환경을 복원합니다.
|
|
35
|
+
옵션:
|
|
36
|
+
--file=<path> 스냅샷 파일 경로 (필수)
|
|
37
|
+
--dry-run 실제 파일을 쓰지 않고 작업 내용만 미리 확인`,
|
|
38
|
+
help: `help - 도움말 표시
|
|
39
|
+
사용법: npx claude-settings help [명령어]
|
|
40
|
+
설명: 명령어 사용법을 표시합니다.`,
|
|
41
|
+
version: `version - 버전 정보 출력
|
|
42
|
+
사용법: npx claude-settings version
|
|
43
|
+
또는: npx claude-settings -v / --version
|
|
44
|
+
설명: Claude Settings의 버전을 표시합니다.`,
|
|
45
|
+
};
|
|
46
|
+
if (command && commandHelps[command]) {
|
|
47
|
+
return { success: true, message: commandHelps[command], exitCode: 0 };
|
|
48
|
+
}
|
|
49
|
+
if (command && !commandHelps[command]) {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
message: `알 수 없는 명령어: ${command}`,
|
|
53
|
+
error: 'Unknown command',
|
|
54
|
+
exitCode: 1,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const helpText = [
|
|
58
|
+
`Claude Settings v${this.VERSION}`,
|
|
59
|
+
'',
|
|
60
|
+
'사용법:',
|
|
61
|
+
' npx claude-settings <명령어> [옵션]',
|
|
62
|
+
'',
|
|
63
|
+
'명령어:',
|
|
64
|
+
' export [--output=<path>] ~/.claude 환경을 스냅샷 JSON으로 내보내기',
|
|
65
|
+
' import --file=<path> [--dry-run] 스냅샷 JSON을 ~/.claude로 복원',
|
|
66
|
+
' help [명령어] 도움말 (help <명령어> 상세정보)',
|
|
67
|
+
' version 버전 정보',
|
|
68
|
+
'',
|
|
69
|
+
'옵션:',
|
|
70
|
+
' -v, --version 버전 정보 출력',
|
|
71
|
+
' -h, --help 도움말 출력',
|
|
72
|
+
'',
|
|
73
|
+
'예시:',
|
|
74
|
+
' npx claude-settings export --output=./my-snapshot.json',
|
|
75
|
+
' npx claude-settings import --file=./my-snapshot.json --dry-run',
|
|
76
|
+
' npx claude-settings -v',
|
|
77
|
+
].join('\n');
|
|
78
|
+
return { success: true, message: helpText, exitCode: 0 };
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* version 명령어 구현
|
|
82
|
+
*/
|
|
83
|
+
version() {
|
|
84
|
+
return this.VERSION;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* export 명령어 구현
|
|
88
|
+
*/
|
|
89
|
+
async runExport(args) {
|
|
90
|
+
const outputArg = args.find((a) => a.startsWith('--output='));
|
|
91
|
+
const outputPath = outputArg ? outputArg.split('=')[1] : undefined;
|
|
92
|
+
const result = await exportSnapshot({ outputPath });
|
|
93
|
+
if (result.success) {
|
|
94
|
+
const message = [
|
|
95
|
+
result.message,
|
|
96
|
+
` Files: ${result.fileCount ?? 0}`,
|
|
97
|
+
` Plugins: ${result.pluginCount ?? 0}`,
|
|
98
|
+
].join('\n');
|
|
99
|
+
return { success: true, message, exitCode: 0 };
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
return {
|
|
103
|
+
success: false,
|
|
104
|
+
message: `Export failed: ${result.message}`,
|
|
105
|
+
error: result.message,
|
|
106
|
+
exitCode: 1,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* import 명령어 구현
|
|
112
|
+
*/
|
|
113
|
+
async runImport(args) {
|
|
114
|
+
const fileArg = args.find((a) => a.startsWith('--file='));
|
|
115
|
+
const snapshotPath = fileArg ? fileArg.split('=')[1] : args[1] ?? '';
|
|
116
|
+
const dryRun = args.includes('--dry-run');
|
|
117
|
+
if (!snapshotPath) {
|
|
118
|
+
return {
|
|
119
|
+
success: false,
|
|
120
|
+
message: 'Usage: claude-settings import --file=<path> [--dry-run]',
|
|
121
|
+
error: 'Missing snapshot path',
|
|
122
|
+
exitCode: 1,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const result = await importSnapshot({ snapshotPath, dryRun });
|
|
126
|
+
if (result.errors?.length) {
|
|
127
|
+
const errorLines = result.errors.map((e) => ` Error: ${e}`).join('\n');
|
|
128
|
+
return {
|
|
129
|
+
success: result.success,
|
|
130
|
+
message: `${result.message}\n${errorLines}`,
|
|
131
|
+
exitCode: result.success ? 0 : 1,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
success: result.success,
|
|
136
|
+
message: result.message,
|
|
137
|
+
exitCode: result.success ? 0 : 1,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 동기 명령어 실행 (export/import는 main에서 별도 처리)
|
|
142
|
+
*/
|
|
143
|
+
execute(args) {
|
|
144
|
+
if (args.length === 0) {
|
|
145
|
+
return this.help();
|
|
146
|
+
}
|
|
147
|
+
const command = args[0];
|
|
148
|
+
if (command === '-v' || command === '--version') {
|
|
149
|
+
return { success: true, message: `v${this.version()}`, exitCode: 0 };
|
|
150
|
+
}
|
|
151
|
+
if (command === '-h' || command === '--help') {
|
|
152
|
+
return this.help();
|
|
153
|
+
}
|
|
154
|
+
switch (command) {
|
|
155
|
+
case 'help': {
|
|
156
|
+
const helpCommand = args[1];
|
|
157
|
+
return this.help(helpCommand);
|
|
158
|
+
}
|
|
159
|
+
case 'version':
|
|
160
|
+
return { success: true, message: `v${this.version()}`, exitCode: 0 };
|
|
161
|
+
case 'export':
|
|
162
|
+
case 'import':
|
|
163
|
+
// These are handled asynchronously in main(); should not reach here.
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
message: `명령어 '${command}'는 비동기 처리가 필요합니다.`,
|
|
167
|
+
exitCode: 1,
|
|
168
|
+
};
|
|
169
|
+
default:
|
|
170
|
+
return {
|
|
171
|
+
success: false,
|
|
172
|
+
message: `알 수 없는 명령어: ${command}\n'npx claude-settings help'를 실행하면 사용 가능한 명령어를 확인할 수 있습니다.`,
|
|
173
|
+
error: 'Unknown command',
|
|
174
|
+
exitCode: 1,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ============================================================================
|
|
180
|
+
// Main: CLI 실행
|
|
181
|
+
// ============================================================================
|
|
182
|
+
async function main() {
|
|
183
|
+
try {
|
|
184
|
+
const args = process.argv.slice(2);
|
|
185
|
+
const command = args[0];
|
|
186
|
+
const cli = new CliEngine();
|
|
187
|
+
if (command === 'export') {
|
|
188
|
+
const result = await cli.runExport(args);
|
|
189
|
+
console.log(result.message);
|
|
190
|
+
if (result.error)
|
|
191
|
+
console.error(`에러: ${result.error}`);
|
|
192
|
+
process.exitCode = result.exitCode;
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (command === 'import') {
|
|
196
|
+
const result = await cli.runImport(args);
|
|
197
|
+
console.log(result.message);
|
|
198
|
+
if (result.error)
|
|
199
|
+
console.error(`에러: ${result.error}`);
|
|
200
|
+
process.exitCode = result.exitCode;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const result = cli.execute(args);
|
|
204
|
+
console.log(result.message);
|
|
205
|
+
if (result.error) {
|
|
206
|
+
console.error(`에러: ${result.error}`);
|
|
207
|
+
}
|
|
208
|
+
process.exit(result.exitCode);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
212
|
+
console.error(`예상치 못한 오류: ${errorMsg}`);
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
main();
|
|
217
|
+
export { CliEngine };
|
|
218
|
+
//# sourceMappingURL=claude-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-settings.js","sourceRoot":"","sources":["../../src/bin/claude-settings.ts"],"names":[],"mappings":"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"}
|