@claudeskill/cli 0.1.0 → 0.1.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.md +139 -0
- package/dist/onboarding.d.ts.map +1 -1
- package/dist/onboarding.js +145 -96
- package/dist/onboarding.js.map +1 -1
- package/package.json +5 -2
package/README.md
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# @claudeskill/cli
|
|
2
|
+
|
|
3
|
+
Sync your Claude Code skills across devices with zero-knowledge encryption.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Try without installing
|
|
9
|
+
npx @claudeskill/cli
|
|
10
|
+
|
|
11
|
+
# Or install globally
|
|
12
|
+
npm install -g @claudeskill/cli
|
|
13
|
+
claudeskill
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Features
|
|
17
|
+
|
|
18
|
+
- **Interactive TUI** - Navigate with arrow keys, no commands to memorize
|
|
19
|
+
- **Zero-knowledge encryption** - Your skills are encrypted client-side. The server never sees your content.
|
|
20
|
+
- **Cross-device sync** - Access your skills from any device
|
|
21
|
+
- **Version history** - Track changes and restore previous versions
|
|
22
|
+
- **Self-host option** - Run your own server for complete control
|
|
23
|
+
|
|
24
|
+
## Interactive Mode
|
|
25
|
+
|
|
26
|
+
Simply run `claudeskill` to access the interactive menu:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
claudeskill
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Navigate through options using arrow keys:
|
|
33
|
+
- **Status** - Check sync status
|
|
34
|
+
- **List** - View all skills with dependency trees
|
|
35
|
+
- **Push** - Upload local changes (with preview and confirmation)
|
|
36
|
+
- **Pull** - Download from cloud (with preview and confirmation)
|
|
37
|
+
- **Login** - Switch account or add device
|
|
38
|
+
- **Logout** - Sign out
|
|
39
|
+
|
|
40
|
+
## Commands
|
|
41
|
+
|
|
42
|
+
All features are also available as direct commands:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
claudeskill # Interactive menu (recommended)
|
|
46
|
+
claudeskill status # Show sync status
|
|
47
|
+
claudeskill list # List all skills
|
|
48
|
+
claudeskill list --tree # Show dependency graph
|
|
49
|
+
claudeskill list --tools # Show tool usage matrix
|
|
50
|
+
claudeskill push # Push local changes to cloud
|
|
51
|
+
claudeskill push -m "message" # Push with commit message
|
|
52
|
+
claudeskill pull # Pull remote changes to local
|
|
53
|
+
claudeskill login # Login to existing account
|
|
54
|
+
claudeskill logout # Logout and clear credentials
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Version History
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
claudeskill log <skill> # Show version history
|
|
61
|
+
claudeskill checkout <skill> <hash> # Restore a specific version
|
|
62
|
+
claudeskill diff <skill> <hash1> <hash2> # Compare two versions
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## First Run
|
|
66
|
+
|
|
67
|
+
On first run, you'll be guided through setup:
|
|
68
|
+
|
|
69
|
+
1. **Choose sync mode** - Cloud (free), self-hosted, or local-only
|
|
70
|
+
2. **Enter your email** - Used for authentication (OTP-based, no passwords)
|
|
71
|
+
3. **Create a passphrase** - Encrypts your skills locally (never sent to server)
|
|
72
|
+
4. **Save your recovery key** - 8-word backup phrase for account recovery
|
|
73
|
+
|
|
74
|
+
## Adding a Second Device
|
|
75
|
+
|
|
76
|
+
On additional devices, use the login command:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
claudeskill login
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Enter your email, verify the OTP code, and use your **existing passphrase** to unlock your vault.
|
|
83
|
+
|
|
84
|
+
## How It Works
|
|
85
|
+
|
|
86
|
+
### Encryption
|
|
87
|
+
|
|
88
|
+
1. You create a **passphrase** (never sent to server)
|
|
89
|
+
2. A **master key** is generated and encrypted with your passphrase
|
|
90
|
+
3. Your skills are encrypted with the master key using AES-256-GCM
|
|
91
|
+
4. Only encrypted blobs are stored on the server
|
|
92
|
+
|
|
93
|
+
### Authentication
|
|
94
|
+
|
|
95
|
+
1. Enter your email
|
|
96
|
+
2. Receive a 6-digit OTP code
|
|
97
|
+
3. Verify the code to get access tokens
|
|
98
|
+
4. No passwords stored - just email + encryption passphrase
|
|
99
|
+
|
|
100
|
+
### Recovery
|
|
101
|
+
|
|
102
|
+
- A **recovery key** (8 words) is generated during setup
|
|
103
|
+
- Store it safely - it's the only way to recover if you forget your passphrase
|
|
104
|
+
- We cannot recover your data without it
|
|
105
|
+
|
|
106
|
+
## Security
|
|
107
|
+
|
|
108
|
+
- All encryption happens client-side using AES-256-GCM
|
|
109
|
+
- Key derivation uses Argon2id (memory-hard, resistant to GPU attacks)
|
|
110
|
+
- Server only stores encrypted blobs - zero knowledge of content
|
|
111
|
+
- OTP codes expire after 10 minutes
|
|
112
|
+
- Access tokens expire after 1 hour
|
|
113
|
+
- Refresh tokens expire after 30 days
|
|
114
|
+
|
|
115
|
+
## Self-Hosting
|
|
116
|
+
|
|
117
|
+
Point the CLI to your own server:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
claudeskill
|
|
121
|
+
# Choose "Self-hosted" mode
|
|
122
|
+
# Enter your server URL: https://skills.example.com
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
See the [main repository](https://github.com/user/claude-skill-sync) for server setup instructions.
|
|
126
|
+
|
|
127
|
+
## Requirements
|
|
128
|
+
|
|
129
|
+
- Node.js 18+
|
|
130
|
+
|
|
131
|
+
## License
|
|
132
|
+
|
|
133
|
+
MIT
|
|
134
|
+
|
|
135
|
+
## Learn More
|
|
136
|
+
|
|
137
|
+
- Documentation: https://claudeskill.io
|
|
138
|
+
- GitHub: https://github.com/user/claude-skill-sync
|
|
139
|
+
- Report issues: https://github.com/user/claude-skill-sync/issues
|
package/dist/onboarding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;GAEG;AACH,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;GAEG;AACH,eAAO,MAAM,aAAa,qBAwVzB,CAAC"}
|
package/dist/onboarding.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import * as p from "@clack/prompts";
|
|
5
5
|
import { generateSalt, generateMasterKey, generateRecoveryKey, deriveKeyFromPassphrase, encryptMasterKey, formatRecoveryKey, toBase64, listAllSkills, } from "@claudeskill/core";
|
|
6
6
|
import { saveConfig, getDefaultConfig, getConfigDir } from "./config.js";
|
|
7
|
-
import { saveCredentials } from "./credentials.js";
|
|
7
|
+
import { saveCredentials, loadCredentials } from "./credentials.js";
|
|
8
8
|
import * as api from "./api.js";
|
|
9
9
|
import { pushSkills } from "./sync.js";
|
|
10
10
|
/**
|
|
@@ -125,65 +125,113 @@ export const runOnboarding = async () => {
|
|
|
125
125
|
}
|
|
126
126
|
spinner.stop("Verified!");
|
|
127
127
|
const { accessToken, refreshToken, user } = verifyResult.data;
|
|
128
|
-
//
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
encryptedMasterKeyFull.set(encryptedMaster.encrypted, encryptedMaster.iv.length + encryptedMaster.tag.length);
|
|
169
|
-
// Save credentials first so API calls have the access token
|
|
170
|
-
await saveCredentials({
|
|
171
|
-
accessToken,
|
|
172
|
-
refreshToken,
|
|
173
|
-
encryptedMasterKey: toBase64(encryptedMasterKeyFull),
|
|
174
|
-
salt: toBase64(salt),
|
|
175
|
-
});
|
|
176
|
-
// Upload salt to server
|
|
177
|
-
const saltResult = await api.setSalt(toBase64(salt));
|
|
178
|
-
if (!saltResult.ok) {
|
|
179
|
-
spinner.stop("Failed to save encryption settings");
|
|
180
|
-
p.log.error(saltResult.error);
|
|
181
|
-
process.exit(1);
|
|
128
|
+
// Check if this is an existing user (already has encryption set up)
|
|
129
|
+
if (!user.isNewUser) {
|
|
130
|
+
// Existing user - redirect to login flow
|
|
131
|
+
p.log.info("Welcome back! Enter your passphrase to unlock.");
|
|
132
|
+
// Get salt from server
|
|
133
|
+
// First save tokens temporarily so API calls work
|
|
134
|
+
await saveCredentials({
|
|
135
|
+
accessToken,
|
|
136
|
+
refreshToken,
|
|
137
|
+
encryptedMasterKey: "",
|
|
138
|
+
salt: "",
|
|
139
|
+
});
|
|
140
|
+
const saltResult = await api.getSalt();
|
|
141
|
+
if (!saltResult.ok) {
|
|
142
|
+
p.log.error(`Failed to get encryption settings: ${saltResult.error}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
const passphrase = await p.password({
|
|
146
|
+
message: "Vault passphrase:",
|
|
147
|
+
mask: "*",
|
|
148
|
+
});
|
|
149
|
+
if (p.isCancel(passphrase)) {
|
|
150
|
+
p.cancel("Setup cancelled.");
|
|
151
|
+
process.exit(0);
|
|
152
|
+
}
|
|
153
|
+
// Get master key from server
|
|
154
|
+
const existingCreds = await loadCredentials();
|
|
155
|
+
let encryptedMasterKey = existingCreds?.encryptedMasterKey ?? "";
|
|
156
|
+
const masterKeyResult = await api.getMasterKey();
|
|
157
|
+
if (masterKeyResult.ok && masterKeyResult.data.encryptedMasterKey) {
|
|
158
|
+
encryptedMasterKey = masterKeyResult.data.encryptedMasterKey;
|
|
159
|
+
}
|
|
160
|
+
// Save credentials
|
|
161
|
+
await saveCredentials({
|
|
162
|
+
accessToken,
|
|
163
|
+
refreshToken,
|
|
164
|
+
encryptedMasterKey,
|
|
165
|
+
salt: saltResult.data.salt,
|
|
166
|
+
});
|
|
167
|
+
p.log.success("Logged in successfully!");
|
|
182
168
|
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
169
|
+
else {
|
|
170
|
+
// New user - create passphrase and encryption keys
|
|
171
|
+
const passphrase = await p.password({
|
|
172
|
+
message: "Create a vault passphrase:",
|
|
173
|
+
mask: "*",
|
|
174
|
+
validate: (value) => {
|
|
175
|
+
if (!value)
|
|
176
|
+
return "Passphrase is required";
|
|
177
|
+
if (value.length < 8)
|
|
178
|
+
return "Passphrase must be at least 8 characters";
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
if (p.isCancel(passphrase)) {
|
|
182
|
+
p.cancel("Setup cancelled.");
|
|
183
|
+
process.exit(0);
|
|
184
|
+
}
|
|
185
|
+
const confirmPassphrase = await p.password({
|
|
186
|
+
message: "Confirm passphrase:",
|
|
187
|
+
mask: "*",
|
|
188
|
+
validate: (value) => {
|
|
189
|
+
if (value !== passphrase)
|
|
190
|
+
return "Passphrases do not match";
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
if (p.isCancel(confirmPassphrase)) {
|
|
194
|
+
p.cancel("Setup cancelled.");
|
|
195
|
+
process.exit(0);
|
|
196
|
+
}
|
|
197
|
+
// Generate encryption keys
|
|
198
|
+
spinner.start("Generating encryption keys...");
|
|
199
|
+
const salt = generateSalt();
|
|
200
|
+
const masterKey = generateMasterKey();
|
|
201
|
+
const recoveryKey = generateRecoveryKey();
|
|
202
|
+
const derivedKey = deriveKeyFromPassphrase(passphrase, salt);
|
|
203
|
+
const encryptedMaster = encryptMasterKey(masterKey, derivedKey.key);
|
|
204
|
+
// Combine IV + tag + ciphertext for storage
|
|
205
|
+
const encryptedMasterKeyFull = new Uint8Array(encryptedMaster.iv.length +
|
|
206
|
+
encryptedMaster.tag.length +
|
|
207
|
+
encryptedMaster.encrypted.length);
|
|
208
|
+
encryptedMasterKeyFull.set(encryptedMaster.iv, 0);
|
|
209
|
+
encryptedMasterKeyFull.set(encryptedMaster.tag, encryptedMaster.iv.length);
|
|
210
|
+
encryptedMasterKeyFull.set(encryptedMaster.encrypted, encryptedMaster.iv.length + encryptedMaster.tag.length);
|
|
211
|
+
// Save credentials first so API calls have the access token
|
|
212
|
+
await saveCredentials({
|
|
213
|
+
accessToken,
|
|
214
|
+
refreshToken,
|
|
215
|
+
encryptedMasterKey: toBase64(encryptedMasterKeyFull),
|
|
216
|
+
salt: toBase64(salt),
|
|
217
|
+
});
|
|
218
|
+
// Upload salt to server
|
|
219
|
+
const saltResult = await api.setSalt(toBase64(salt));
|
|
220
|
+
if (!saltResult.ok) {
|
|
221
|
+
spinner.stop("Failed to save encryption settings");
|
|
222
|
+
p.log.error(saltResult.error);
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
// Upload encrypted master key to server (for web dashboard decryption)
|
|
226
|
+
const masterKeyUploadResult = await api.setMasterKey(toBase64(encryptedMasterKeyFull));
|
|
227
|
+
if (!masterKeyUploadResult.ok) {
|
|
228
|
+
// Non-fatal - dashboard decryption won't work but CLI will
|
|
229
|
+
p.log.warn("Could not sync master key for web dashboard");
|
|
230
|
+
}
|
|
231
|
+
spinner.stop("Encryption keys generated");
|
|
232
|
+
// Show recovery key
|
|
233
|
+
const formattedRecoveryKey = formatRecoveryKey(recoveryKey);
|
|
234
|
+
p.note(`
|
|
187
235
|
${formattedRecoveryKey}
|
|
188
236
|
|
|
189
237
|
This is the ONLY way to recover your skills if you
|
|
@@ -191,46 +239,47 @@ export const runOnboarding = async () => {
|
|
|
191
239
|
(password manager, printed paper, etc).
|
|
192
240
|
|
|
193
241
|
We cannot recover your data.
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
message: "I have saved my recovery key",
|
|
197
|
-
});
|
|
198
|
-
if (p.isCancel(savedRecoveryKey) || !savedRecoveryKey) {
|
|
199
|
-
const showAgain = await p.confirm({
|
|
200
|
-
message: "Show recovery key again?",
|
|
201
|
-
});
|
|
202
|
-
if (showAgain) {
|
|
203
|
-
p.note(formattedRecoveryKey, "RECOVERY KEY");
|
|
204
|
-
}
|
|
205
|
-
const reallySaved = await p.confirm({
|
|
242
|
+
`.trim(), "SAVE YOUR RECOVERY KEY");
|
|
243
|
+
const savedRecoveryKey = await p.confirm({
|
|
206
244
|
message: "I have saved my recovery key",
|
|
207
245
|
});
|
|
208
|
-
if (p.isCancel(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
// Step 10: Check for existing skills and offer to sync
|
|
215
|
-
const skills = await listAllSkills();
|
|
216
|
-
if (skills.length > 0) {
|
|
217
|
-
const syncNow = await p.confirm({
|
|
218
|
-
message: `Found ${skills.length} item${skills.length === 1 ? "" : "s"} (skills, commands, agents). Push them now?`,
|
|
219
|
-
});
|
|
220
|
-
if (!p.isCancel(syncNow) && syncNow) {
|
|
221
|
-
spinner.start("Pushing skills...");
|
|
222
|
-
const { pushed, errors } = await pushSkills(masterKey, (msg) => {
|
|
223
|
-
spinner.message(msg);
|
|
224
|
-
}, undefined);
|
|
225
|
-
spinner.stop("Push complete");
|
|
226
|
-
if (pushed > 0) {
|
|
227
|
-
p.log.success(`Pushed ${pushed} skill${pushed === 1 ? "" : "s"}`);
|
|
246
|
+
if (p.isCancel(savedRecoveryKey) || !savedRecoveryKey) {
|
|
247
|
+
const showAgain = await p.confirm({
|
|
248
|
+
message: "Show recovery key again?",
|
|
249
|
+
});
|
|
250
|
+
if (showAgain) {
|
|
251
|
+
p.note(formattedRecoveryKey, "RECOVERY KEY");
|
|
228
252
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
253
|
+
const reallySaved = await p.confirm({
|
|
254
|
+
message: "I have saved my recovery key",
|
|
255
|
+
});
|
|
256
|
+
if (p.isCancel(reallySaved) || !reallySaved) {
|
|
257
|
+
p.cancel("You must save your recovery key to continue.");
|
|
258
|
+
process.exit(0);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
p.log.success("Encryption configured");
|
|
262
|
+
// Check for existing skills and offer to sync
|
|
263
|
+
const skills = await listAllSkills();
|
|
264
|
+
if (skills.length > 0) {
|
|
265
|
+
const syncNow = await p.confirm({
|
|
266
|
+
message: `Found ${skills.length} item${skills.length === 1 ? "" : "s"} (skills, commands, agents). Push them now?`,
|
|
267
|
+
});
|
|
268
|
+
if (!p.isCancel(syncNow) && syncNow) {
|
|
269
|
+
spinner.start("Pushing skills...");
|
|
270
|
+
const { pushed, errors } = await pushSkills(masterKey, (msg) => {
|
|
271
|
+
spinner.message(msg);
|
|
272
|
+
}, undefined);
|
|
273
|
+
spinner.stop("Push complete");
|
|
274
|
+
if (pushed > 0) {
|
|
275
|
+
p.log.success(`Pushed ${pushed} skill${pushed === 1 ? "" : "s"}`);
|
|
276
|
+
}
|
|
277
|
+
if (errors.length > 0) {
|
|
278
|
+
p.log.warning("Some skills failed:");
|
|
279
|
+
errors.forEach((error) => {
|
|
280
|
+
p.log.error(` ${error}`);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
234
283
|
}
|
|
235
284
|
}
|
|
236
285
|
}
|
package/dist/onboarding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudeskill/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Sync your Claude Code skills across devices with zero-knowledge encryption",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"claudeskill": "./dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
|
-
"files": [
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
11
14
|
"publishConfig": {
|
|
12
15
|
"access": "public"
|
|
13
16
|
},
|