@claudeskill/cli 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/dist/api.d.ts +148 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +218 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/checkout.d.ts +8 -0
- package/dist/commands/checkout.d.ts.map +1 -0
- package/dist/commands/checkout.js +134 -0
- package/dist/commands/checkout.js.map +1 -0
- package/dist/commands/diff.d.ts +8 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +156 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/list.d.ts +14 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +251 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/log.d.ts +8 -0
- package/dist/commands/log.d.ts.map +1 -0
- package/dist/commands/log.js +74 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +201 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +8 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +33 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/pull.d.ts +11 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +123 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/push.d.ts +12 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +128 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +104 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.d.ts +24 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +54 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/menu.d.ts +8 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +130 -0
- package/dist/menu.js.map +1 -0
- package/dist/onboarding.d.ts +8 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +252 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/sync.d.ts +83 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +294 -0
- package/dist/sync.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status command - show sync status
|
|
3
|
+
*/
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { loadConfig, getDefaultConfig } from "../config.js";
|
|
6
|
+
import { loadCredentials } from "../credentials.js";
|
|
7
|
+
import { getSyncStatus, loadSyncIndex } from "../sync.js";
|
|
8
|
+
import * as api from "../api.js";
|
|
9
|
+
/**
|
|
10
|
+
* Format relative time
|
|
11
|
+
*/
|
|
12
|
+
const formatRelativeTime = (isoString) => {
|
|
13
|
+
const date = new Date(isoString);
|
|
14
|
+
const now = new Date();
|
|
15
|
+
const diffMs = now.getTime() - date.getTime();
|
|
16
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
17
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
18
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
19
|
+
if (diffMins < 1)
|
|
20
|
+
return "just now";
|
|
21
|
+
if (diffMins < 60)
|
|
22
|
+
return `${diffMins} min${diffMins === 1 ? "" : "s"} ago`;
|
|
23
|
+
if (diffHours < 24)
|
|
24
|
+
return `${diffHours} hour${diffHours === 1 ? "" : "s"} ago`;
|
|
25
|
+
if (diffDays < 30)
|
|
26
|
+
return `${diffDays} day${diffDays === 1 ? "" : "s"} ago`;
|
|
27
|
+
return date.toLocaleDateString();
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Run the status command
|
|
31
|
+
*/
|
|
32
|
+
export const runStatus = async () => {
|
|
33
|
+
const config = (await loadConfig()) ?? getDefaultConfig();
|
|
34
|
+
const credentials = await loadCredentials();
|
|
35
|
+
const spinner = p.spinner();
|
|
36
|
+
spinner.start("Checking status...");
|
|
37
|
+
// Get local sync index
|
|
38
|
+
const syncIndex = await loadSyncIndex();
|
|
39
|
+
const lastSyncAt = syncIndex.lastSyncAt
|
|
40
|
+
? formatRelativeTime(syncIndex.lastSyncAt)
|
|
41
|
+
: "never";
|
|
42
|
+
// Try to get full status if authenticated
|
|
43
|
+
let status = {
|
|
44
|
+
local: 0,
|
|
45
|
+
synced: 0,
|
|
46
|
+
pendingPush: 0,
|
|
47
|
+
pendingPull: 0,
|
|
48
|
+
};
|
|
49
|
+
let serverConnected = false;
|
|
50
|
+
if (config.mode !== "local" && credentials?.accessToken) {
|
|
51
|
+
const healthResult = await api.checkHealth();
|
|
52
|
+
serverConnected = healthResult.ok;
|
|
53
|
+
if (serverConnected) {
|
|
54
|
+
try {
|
|
55
|
+
status = await getSyncStatus();
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Failed to get status, use defaults
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Just count local skills
|
|
64
|
+
const { listAllSkills } = await import("@claudeskill/core");
|
|
65
|
+
const skills = await listAllSkills();
|
|
66
|
+
status.local = skills.length;
|
|
67
|
+
status.pendingPush = skills.length;
|
|
68
|
+
}
|
|
69
|
+
spinner.stop("Status loaded");
|
|
70
|
+
// Build tree output
|
|
71
|
+
console.log("");
|
|
72
|
+
console.log("Sync Status");
|
|
73
|
+
console.log(`├── Local: ${config.skillsPath}`);
|
|
74
|
+
if (config.mode === "cloud") {
|
|
75
|
+
const connStatus = serverConnected ? "connected" : "not connected";
|
|
76
|
+
console.log(`├── Remote: ${config.serverUrl} (${connStatus})`);
|
|
77
|
+
}
|
|
78
|
+
else if (config.mode === "selfhosted") {
|
|
79
|
+
const connStatus = serverConnected ? "connected" : "not connected";
|
|
80
|
+
console.log(`├── Remote: ${config.serverUrl} (${connStatus})`);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
console.log("├── Remote: (local only mode)");
|
|
84
|
+
}
|
|
85
|
+
console.log(`├── Last sync: ${lastSyncAt}`);
|
|
86
|
+
console.log("│");
|
|
87
|
+
// Skill counts
|
|
88
|
+
console.log(`├── ✓ ${status.synced} synced`);
|
|
89
|
+
console.log(`├── ○ ${status.local} local total`);
|
|
90
|
+
console.log(`├── ⬆ ${status.pendingPush} pending push`);
|
|
91
|
+
console.log(`└── ⬇ ${status.pendingPull} pending pull`);
|
|
92
|
+
console.log("");
|
|
93
|
+
// Helpful hints
|
|
94
|
+
if (!credentials?.accessToken && config.mode !== "local") {
|
|
95
|
+
p.log.info("Run 'claude-skill-sync login' to connect to the server.");
|
|
96
|
+
}
|
|
97
|
+
else if (status.pendingPush > 0) {
|
|
98
|
+
p.log.info("Run 'claude-skill-sync push' to upload your changes.");
|
|
99
|
+
}
|
|
100
|
+
else if (status.pendingPull > 0) {
|
|
101
|
+
p.log.info("Run 'claude-skill-sync pull' to download remote changes.");
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management
|
|
3
|
+
*/
|
|
4
|
+
import type { Config } from "@claudeskill/core";
|
|
5
|
+
/**
|
|
6
|
+
* Get the config directory path
|
|
7
|
+
*/
|
|
8
|
+
export declare const getConfigDir: () => string;
|
|
9
|
+
/**
|
|
10
|
+
* Get the config file path
|
|
11
|
+
*/
|
|
12
|
+
export declare const getConfigPath: () => string;
|
|
13
|
+
/**
|
|
14
|
+
* Load configuration from disk
|
|
15
|
+
*/
|
|
16
|
+
export declare const loadConfig: () => Promise<Config | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Save configuration to disk
|
|
19
|
+
*/
|
|
20
|
+
export declare const saveConfig: (config: Config) => Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Get default configuration
|
|
23
|
+
*/
|
|
24
|
+
export declare const getDefaultConfig: () => Config;
|
|
25
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAKhD;;GAEG;AACH,eAAO,MAAM,YAAY,QAAO,MAE/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,QAAO,MAEhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,MAAM,GAAG,IAAI,CAOxD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,GAAU,QAAQ,MAAM,kBAI9C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,QAAO,MASnC,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration management
|
|
3
|
+
*/
|
|
4
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
5
|
+
import { join, dirname } from "node:path";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
const CONFIG_DIR = ".config/claude-skill-sync";
|
|
8
|
+
const CONFIG_FILE = "config.json";
|
|
9
|
+
/**
|
|
10
|
+
* Get the config directory path
|
|
11
|
+
*/
|
|
12
|
+
export const getConfigDir = () => {
|
|
13
|
+
return join(homedir(), CONFIG_DIR);
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Get the config file path
|
|
17
|
+
*/
|
|
18
|
+
export const getConfigPath = () => {
|
|
19
|
+
return join(getConfigDir(), CONFIG_FILE);
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Load configuration from disk
|
|
23
|
+
*/
|
|
24
|
+
export const loadConfig = async () => {
|
|
25
|
+
try {
|
|
26
|
+
const content = await readFile(getConfigPath(), "utf-8");
|
|
27
|
+
return JSON.parse(content);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Save configuration to disk
|
|
35
|
+
*/
|
|
36
|
+
export const saveConfig = async (config) => {
|
|
37
|
+
const configPath = getConfigPath();
|
|
38
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
39
|
+
await writeFile(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Get default configuration
|
|
43
|
+
*/
|
|
44
|
+
export const getDefaultConfig = () => {
|
|
45
|
+
return {
|
|
46
|
+
mode: "cloud",
|
|
47
|
+
serverUrl: "https://api.claudeskill.io",
|
|
48
|
+
email: null,
|
|
49
|
+
skillsPath: join(homedir(), ".claude", "commands"),
|
|
50
|
+
autoSync: true,
|
|
51
|
+
syncInterval: 300,
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAC/C,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAW,EAAE;IACvC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,GAAW,EAAE;IACxC,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,IAA4B,EAAE;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IACjD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,SAAS,EAAE,4BAA4B;QACvC,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC;QAClD,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,GAAG;KAClB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credentials management
|
|
3
|
+
*
|
|
4
|
+
* Stores encrypted credentials locally.
|
|
5
|
+
* In the future, this could integrate with OS keychain.
|
|
6
|
+
*/
|
|
7
|
+
import type { Credentials } from "@claudeskill/core";
|
|
8
|
+
/**
|
|
9
|
+
* Get the credentials file path
|
|
10
|
+
*/
|
|
11
|
+
export declare const getCredentialsPath: () => string;
|
|
12
|
+
/**
|
|
13
|
+
* Load credentials from disk
|
|
14
|
+
*/
|
|
15
|
+
export declare const loadCredentials: () => Promise<Credentials | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Save credentials to disk
|
|
18
|
+
*/
|
|
19
|
+
export declare const saveCredentials: (credentials: Credentials) => Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Delete credentials from disk
|
|
22
|
+
*/
|
|
23
|
+
export declare const deleteCredentials: () => Promise<void>;
|
|
24
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAO,MAErC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,WAAW,GAAG,IAAI,CAOlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,aAAa,WAAW,kBAWzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,qBAO7B,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credentials management
|
|
3
|
+
*
|
|
4
|
+
* Stores encrypted credentials locally.
|
|
5
|
+
* In the future, this could integrate with OS keychain.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir, chmod } from "node:fs/promises";
|
|
8
|
+
import { join, dirname } from "node:path";
|
|
9
|
+
import { getConfigDir } from "./config.js";
|
|
10
|
+
const CREDENTIALS_FILE = "credentials.json";
|
|
11
|
+
/**
|
|
12
|
+
* Get the credentials file path
|
|
13
|
+
*/
|
|
14
|
+
export const getCredentialsPath = () => {
|
|
15
|
+
return join(getConfigDir(), CREDENTIALS_FILE);
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Load credentials from disk
|
|
19
|
+
*/
|
|
20
|
+
export const loadCredentials = async () => {
|
|
21
|
+
try {
|
|
22
|
+
const content = await readFile(getCredentialsPath(), "utf-8");
|
|
23
|
+
return JSON.parse(content);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Save credentials to disk
|
|
31
|
+
*/
|
|
32
|
+
export const saveCredentials = async (credentials) => {
|
|
33
|
+
const credentialsPath = getCredentialsPath();
|
|
34
|
+
await mkdir(dirname(credentialsPath), { recursive: true });
|
|
35
|
+
await writeFile(credentialsPath, JSON.stringify(credentials, null, 2), {
|
|
36
|
+
encoding: "utf-8",
|
|
37
|
+
mode: 0o600, // Only owner can read/write
|
|
38
|
+
});
|
|
39
|
+
// Ensure permissions are correct (in case file existed)
|
|
40
|
+
await chmod(credentialsPath, 0o600);
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Delete credentials from disk
|
|
44
|
+
*/
|
|
45
|
+
export const deleteCredentials = async () => {
|
|
46
|
+
const { unlink } = await import("node:fs/promises");
|
|
47
|
+
try {
|
|
48
|
+
await unlink(getCredentialsPath());
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Ignore if file doesn't exist
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAW,EAAE;IAC7C,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,IAAiC,EAAE;IACrE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,WAAwB,EACxB,EAAE;IACF,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,KAAK,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACrE,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,KAAK,EAAE,4BAA4B;KAC1C,CAAC,CAAC;IAEH,wDAAwD;IACxD,MAAM,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claude Skill Sync CLI
|
|
4
|
+
*
|
|
5
|
+
* Sync your Claude Code skills across devices with zero-knowledge encryption.
|
|
6
|
+
*/
|
|
7
|
+
import * as p from "@clack/prompts";
|
|
8
|
+
import { runOnboarding } from "./onboarding.js";
|
|
9
|
+
import { runInteractiveMenu } from "./menu.js";
|
|
10
|
+
import { runList } from "./commands/list.js";
|
|
11
|
+
import { runStatus } from "./commands/status.js";
|
|
12
|
+
import { runLogin } from "./commands/login.js";
|
|
13
|
+
import { runLogout } from "./commands/logout.js";
|
|
14
|
+
import { runPush } from "./commands/push.js";
|
|
15
|
+
import { runPull } from "./commands/pull.js";
|
|
16
|
+
import { runLog } from "./commands/log.js";
|
|
17
|
+
import { runCheckout } from "./commands/checkout.js";
|
|
18
|
+
import { runDiff } from "./commands/diff.js";
|
|
19
|
+
import { loadConfig } from "./config.js";
|
|
20
|
+
const VERSION = "0.1.0";
|
|
21
|
+
const showHelp = () => {
|
|
22
|
+
console.log(`
|
|
23
|
+
claude-skill-sync v${VERSION}
|
|
24
|
+
Sync your Claude Code skills across devices
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
claude-skill-sync [command] [options]
|
|
28
|
+
|
|
29
|
+
Commands:
|
|
30
|
+
(no command) Interactive setup or status
|
|
31
|
+
list List all skills
|
|
32
|
+
status Show sync status
|
|
33
|
+
push Push local changes to cloud
|
|
34
|
+
pull Pull remote changes to local
|
|
35
|
+
log <skill> Show version history for a skill
|
|
36
|
+
checkout <skill> <hash> Restore a specific version
|
|
37
|
+
diff <skill> <hash1> <hash2> Compare two versions
|
|
38
|
+
login Login to existing account
|
|
39
|
+
logout Logout and clear credentials
|
|
40
|
+
config Show or modify configuration
|
|
41
|
+
help Show this help message
|
|
42
|
+
|
|
43
|
+
List Options:
|
|
44
|
+
--tree Show dependency tree
|
|
45
|
+
--tools Show tool usage matrix
|
|
46
|
+
|
|
47
|
+
Push Options:
|
|
48
|
+
-m <message> Commit message for this version
|
|
49
|
+
|
|
50
|
+
Options:
|
|
51
|
+
--version, -v Show version
|
|
52
|
+
--help, -h Show help
|
|
53
|
+
|
|
54
|
+
Examples:
|
|
55
|
+
$ claude-skill-sync # First run: setup, otherwise: status
|
|
56
|
+
$ claude-skill-sync list # List all skills
|
|
57
|
+
$ claude-skill-sync list --tree # Show dependency graph
|
|
58
|
+
$ claude-skill-sync push # Push local changes
|
|
59
|
+
|
|
60
|
+
Learn more: https://claudeskill.io
|
|
61
|
+
`);
|
|
62
|
+
};
|
|
63
|
+
const main = async () => {
|
|
64
|
+
const args = process.argv.slice(2);
|
|
65
|
+
const command = args[0];
|
|
66
|
+
// Handle flags
|
|
67
|
+
if (command === "--version" || command === "-v") {
|
|
68
|
+
console.log(VERSION);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
if (command === "--help" || command === "-h" || command === "help") {
|
|
72
|
+
showHelp();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Check if configured
|
|
76
|
+
const config = await loadConfig();
|
|
77
|
+
const isConfigured = config !== null;
|
|
78
|
+
// Route to command
|
|
79
|
+
switch (command) {
|
|
80
|
+
case undefined:
|
|
81
|
+
// No command: run onboarding if not configured, otherwise interactive menu
|
|
82
|
+
if (!isConfigured) {
|
|
83
|
+
await runOnboarding();
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
await runInteractiveMenu();
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
case "list": {
|
|
90
|
+
const flags = args.slice(1);
|
|
91
|
+
const showTree = flags.includes("--tree");
|
|
92
|
+
const showTools = flags.includes("--tools");
|
|
93
|
+
await runList({ tree: showTree, tools: showTools });
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case "status":
|
|
97
|
+
await runStatus();
|
|
98
|
+
break;
|
|
99
|
+
case "push": {
|
|
100
|
+
const flags = args.slice(1);
|
|
101
|
+
const messageIndex = flags.indexOf("-m");
|
|
102
|
+
const message = messageIndex >= 0 ? flags[messageIndex + 1] : undefined;
|
|
103
|
+
await runPush({ message });
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
case "pull":
|
|
107
|
+
await runPull();
|
|
108
|
+
break;
|
|
109
|
+
case "log": {
|
|
110
|
+
const skillKey = args[1];
|
|
111
|
+
if (!skillKey) {
|
|
112
|
+
p.log.error("Usage: claude-skill-sync log <skill-key>");
|
|
113
|
+
p.log.info("Example: claude-skill-sync log skill:setup-eslint");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
await runLog(skillKey);
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case "checkout": {
|
|
120
|
+
const skillKey = args[1];
|
|
121
|
+
const hash = args[2];
|
|
122
|
+
if (!skillKey || !hash) {
|
|
123
|
+
p.log.error("Usage: claude-skill-sync checkout <skill-key> <hash>");
|
|
124
|
+
p.log.info("Example: claude-skill-sync checkout skill:setup-eslint abc123");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
await runCheckout(skillKey, hash);
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case "diff": {
|
|
131
|
+
const skillKey = args[1];
|
|
132
|
+
const hash1 = args[2];
|
|
133
|
+
const hash2 = args[3];
|
|
134
|
+
if (!skillKey || !hash1 || !hash2) {
|
|
135
|
+
p.log.error("Usage: claude-skill-sync diff <skill-key> <hash1> <hash2>");
|
|
136
|
+
p.log.info("Example: claude-skill-sync diff skill:setup-eslint abc123 def456");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
await runDiff(skillKey, hash1, hash2);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
case "login":
|
|
143
|
+
await runLogin();
|
|
144
|
+
break;
|
|
145
|
+
case "logout":
|
|
146
|
+
await runLogout();
|
|
147
|
+
break;
|
|
148
|
+
case "config":
|
|
149
|
+
if (config) {
|
|
150
|
+
console.log(JSON.stringify(config, null, 2));
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
p.log.warning("Not configured. Run 'claude-skill-sync' to set up.");
|
|
154
|
+
}
|
|
155
|
+
break;
|
|
156
|
+
default:
|
|
157
|
+
p.log.error(`Unknown command: ${command}`);
|
|
158
|
+
showHelp();
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
main().catch((error) => {
|
|
163
|
+
console.error("Error:", error);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,QAAQ,GAAG,GAAS,EAAE;IAC1B,OAAO,CAAC,GAAG,CAAC;qBACO,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsC3B,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAAmB,EAAE;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,eAAe;IACf,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACnE,QAAQ,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,sBAAsB;IACtB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,MAAM,KAAK,IAAI,CAAC;IAErC,mBAAmB;IACnB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,2EAA2E;YAC3E,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,aAAa,EAAE,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACN,MAAM,kBAAkB,EAAE,CAAC;YAC7B,CAAC;YACD,MAAM;QAER,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACpD,MAAM;QACR,CAAC;QAED,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QAER,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,OAAO,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;QAED,KAAK,MAAM;YACT,MAAM,OAAO,EAAE,CAAC;YAChB,MAAM;QAER,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBACxD,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBAChE,OAAO;YACT,CAAC;YACD,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QAED,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBACpE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;gBAC5E,OAAO;YACT,CAAC;YACD,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAClC,MAAM;QACR,CAAC;QAED,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBAClC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;gBACzE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;gBAC/E,OAAO;YACT,CAAC;YACD,MAAM,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM;QACR,CAAC;QAED,KAAK,OAAO;YACV,MAAM,QAAQ,EAAE,CAAC;YACjB,MAAM;QAER,KAAK,QAAQ;YACX,MAAM,SAAS,EAAE,CAAC;YAClB,MAAM;QAER,KAAK,QAAQ;YACX,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC;YACtE,CAAC;YACD,MAAM;QAER;YACE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC3C,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC,CAAC;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/menu.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH;;GAEG;AACH,eAAO,MAAM,kBAAkB,qBA4F9B,CAAC"}
|
package/dist/menu.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive menu for the CLI
|
|
3
|
+
*/
|
|
4
|
+
import * as p from "@clack/prompts";
|
|
5
|
+
import { runList } from "./commands/list.js";
|
|
6
|
+
import { runStatus } from "./commands/status.js";
|
|
7
|
+
import { runPush } from "./commands/push.js";
|
|
8
|
+
import { runPull } from "./commands/pull.js";
|
|
9
|
+
import { runLogin } from "./commands/login.js";
|
|
10
|
+
import { runLogout } from "./commands/logout.js";
|
|
11
|
+
import { loadConfig } from "./config.js";
|
|
12
|
+
/**
|
|
13
|
+
* Show the main interactive menu
|
|
14
|
+
*/
|
|
15
|
+
export const runInteractiveMenu = async () => {
|
|
16
|
+
p.intro("Claude Skill Sync");
|
|
17
|
+
let shouldContinue = true;
|
|
18
|
+
while (shouldContinue) {
|
|
19
|
+
const config = await loadConfig();
|
|
20
|
+
const isCloudMode = config?.mode === "cloud" || config?.mode === "selfhosted";
|
|
21
|
+
const options = [
|
|
22
|
+
{ value: "status", label: "Status", hint: "check sync status" },
|
|
23
|
+
{ value: "list", label: "List", hint: "view all skills" },
|
|
24
|
+
];
|
|
25
|
+
if (isCloudMode) {
|
|
26
|
+
options.push({ value: "push", label: "Push", hint: "upload local changes" }, { value: "pull", label: "Pull", hint: "download from cloud" });
|
|
27
|
+
}
|
|
28
|
+
options.push({ value: "login", label: "Login", hint: "switch account" }, { value: "logout", label: "Logout", hint: "sign out" }, { value: "help", label: "Help", hint: "show commands" }, { value: "exit", label: "Exit", hint: "quit" });
|
|
29
|
+
const action = await p.select({
|
|
30
|
+
message: "What would you like to do?",
|
|
31
|
+
options,
|
|
32
|
+
});
|
|
33
|
+
if (p.isCancel(action)) {
|
|
34
|
+
p.outro("Goodbye!");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const selectedAction = action;
|
|
38
|
+
switch (selectedAction) {
|
|
39
|
+
case "status":
|
|
40
|
+
await runStatus();
|
|
41
|
+
break;
|
|
42
|
+
case "list":
|
|
43
|
+
await runListInteractive();
|
|
44
|
+
break;
|
|
45
|
+
case "push":
|
|
46
|
+
await runPush({ interactive: true });
|
|
47
|
+
break;
|
|
48
|
+
case "pull":
|
|
49
|
+
await runPull({ interactive: true });
|
|
50
|
+
break;
|
|
51
|
+
case "login":
|
|
52
|
+
await runLogin();
|
|
53
|
+
break;
|
|
54
|
+
case "logout":
|
|
55
|
+
await runLogout();
|
|
56
|
+
shouldContinue = false;
|
|
57
|
+
break;
|
|
58
|
+
case "help":
|
|
59
|
+
showHelp();
|
|
60
|
+
break;
|
|
61
|
+
case "exit":
|
|
62
|
+
shouldContinue = false;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
// After action, ask what's next (unless exiting)
|
|
66
|
+
if (shouldContinue && selectedAction !== "exit" && selectedAction !== "logout") {
|
|
67
|
+
const next = await p.select({
|
|
68
|
+
message: "What's next?",
|
|
69
|
+
options: [
|
|
70
|
+
{ value: "menu", label: "Back to menu" },
|
|
71
|
+
{ value: "exit", label: "Exit" },
|
|
72
|
+
],
|
|
73
|
+
});
|
|
74
|
+
if (p.isCancel(next) || next === "exit") {
|
|
75
|
+
shouldContinue = false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
p.outro("Goodbye!");
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Interactive list with follow-up actions
|
|
83
|
+
*/
|
|
84
|
+
const runListInteractive = async () => {
|
|
85
|
+
await runList({});
|
|
86
|
+
const action = await p.select({
|
|
87
|
+
message: "View options:",
|
|
88
|
+
options: [
|
|
89
|
+
{ value: "tree", label: "Show dependency tree" },
|
|
90
|
+
{ value: "tools", label: "Show tool matrix" },
|
|
91
|
+
{ value: "done", label: "Done" },
|
|
92
|
+
],
|
|
93
|
+
});
|
|
94
|
+
if (p.isCancel(action) || action === "done") {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (action === "tree") {
|
|
98
|
+
await runList({ tree: true });
|
|
99
|
+
}
|
|
100
|
+
else if (action === "tools") {
|
|
101
|
+
await runList({ tools: true });
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Show help text
|
|
106
|
+
*/
|
|
107
|
+
const showHelp = () => {
|
|
108
|
+
console.log(`
|
|
109
|
+
Commands (can also be run directly):
|
|
110
|
+
|
|
111
|
+
claude-skill-sync Interactive menu (this)
|
|
112
|
+
claude-skill-sync list List all skills
|
|
113
|
+
claude-skill-sync list --tree Show dependency graph
|
|
114
|
+
claude-skill-sync list --tools Show tool usage matrix
|
|
115
|
+
claude-skill-sync status Show sync status
|
|
116
|
+
claude-skill-sync push Push local changes
|
|
117
|
+
claude-skill-sync pull Pull remote changes
|
|
118
|
+
claude-skill-sync login Login to account
|
|
119
|
+
claude-skill-sync logout Logout
|
|
120
|
+
|
|
121
|
+
Version History:
|
|
122
|
+
|
|
123
|
+
claude-skill-sync log <skill> Show version history
|
|
124
|
+
claude-skill-sync checkout <skill> <hash> Restore a version
|
|
125
|
+
claude-skill-sync diff <skill> <h1> <h2> Compare versions
|
|
126
|
+
|
|
127
|
+
Learn more: https://claudeskill.io
|
|
128
|
+
`);
|
|
129
|
+
};
|
|
130
|
+
//# sourceMappingURL=menu.js.map
|
package/dist/menu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.d.ts","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;GAEG;AACH,eAAO,MAAM,aAAa,qBAgSzB,CAAC"}
|