@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.
Files changed (65) hide show
  1. package/dist/api.d.ts +148 -0
  2. package/dist/api.d.ts.map +1 -0
  3. package/dist/api.js +218 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/commands/checkout.d.ts +8 -0
  6. package/dist/commands/checkout.d.ts.map +1 -0
  7. package/dist/commands/checkout.js +134 -0
  8. package/dist/commands/checkout.js.map +1 -0
  9. package/dist/commands/diff.d.ts +8 -0
  10. package/dist/commands/diff.d.ts.map +1 -0
  11. package/dist/commands/diff.js +156 -0
  12. package/dist/commands/diff.js.map +1 -0
  13. package/dist/commands/list.d.ts +14 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +251 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/log.d.ts +8 -0
  18. package/dist/commands/log.d.ts.map +1 -0
  19. package/dist/commands/log.js +74 -0
  20. package/dist/commands/log.js.map +1 -0
  21. package/dist/commands/login.d.ts +8 -0
  22. package/dist/commands/login.d.ts.map +1 -0
  23. package/dist/commands/login.js +201 -0
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/logout.d.ts +8 -0
  26. package/dist/commands/logout.d.ts.map +1 -0
  27. package/dist/commands/logout.js +33 -0
  28. package/dist/commands/logout.js.map +1 -0
  29. package/dist/commands/pull.d.ts +11 -0
  30. package/dist/commands/pull.d.ts.map +1 -0
  31. package/dist/commands/pull.js +123 -0
  32. package/dist/commands/pull.js.map +1 -0
  33. package/dist/commands/push.d.ts +12 -0
  34. package/dist/commands/push.d.ts.map +1 -0
  35. package/dist/commands/push.js +128 -0
  36. package/dist/commands/push.js.map +1 -0
  37. package/dist/commands/status.d.ts +8 -0
  38. package/dist/commands/status.d.ts.map +1 -0
  39. package/dist/commands/status.js +104 -0
  40. package/dist/commands/status.js.map +1 -0
  41. package/dist/config.d.ts +25 -0
  42. package/dist/config.d.ts.map +1 -0
  43. package/dist/config.js +54 -0
  44. package/dist/config.js.map +1 -0
  45. package/dist/credentials.d.ts +24 -0
  46. package/dist/credentials.d.ts.map +1 -0
  47. package/dist/credentials.js +54 -0
  48. package/dist/credentials.js.map +1 -0
  49. package/dist/index.d.ts +8 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +166 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/menu.d.ts +8 -0
  54. package/dist/menu.d.ts.map +1 -0
  55. package/dist/menu.js +130 -0
  56. package/dist/menu.js.map +1 -0
  57. package/dist/onboarding.d.ts +8 -0
  58. package/dist/onboarding.d.ts.map +1 -0
  59. package/dist/onboarding.js +252 -0
  60. package/dist/onboarding.js.map +1 -0
  61. package/dist/sync.d.ts +83 -0
  62. package/dist/sync.d.ts.map +1 -0
  63. package/dist/sync.js +294 -0
  64. package/dist/sync.js.map +1 -0
  65. 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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"}
@@ -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"}
@@ -0,0 +1,8 @@
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
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
package/dist/menu.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Interactive menu for the CLI
3
+ */
4
+ /**
5
+ * Show the main interactive menu
6
+ */
7
+ export declare const runInteractiveMenu: () => Promise<void>;
8
+ //# sourceMappingURL=menu.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../src/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Interactive onboarding flow for new users
3
+ */
4
+ /**
5
+ * Run the interactive onboarding flow
6
+ */
7
+ export declare const runOnboarding: () => Promise<void>;
8
+ //# sourceMappingURL=onboarding.d.ts.map
@@ -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"}