@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
package/dist/api.d.ts ADDED
@@ -0,0 +1,148 @@
1
+ /**
2
+ * API client for Claude Skill Sync server
3
+ */
4
+ type ApiResponse<T> = {
5
+ ok: true;
6
+ data: T;
7
+ } | {
8
+ ok: false;
9
+ error: string;
10
+ status: number;
11
+ };
12
+ export type OtpRequestResponse = {
13
+ success: boolean;
14
+ message: string;
15
+ };
16
+ export declare const requestOtp: (email: string) => Promise<ApiResponse<OtpRequestResponse>>;
17
+ export type OtpVerifyResponse = {
18
+ accessToken: string;
19
+ refreshToken: string;
20
+ user: {
21
+ id: string;
22
+ email: string;
23
+ isNewUser: boolean;
24
+ };
25
+ };
26
+ export declare const verifyOtp: (email: string, code: string) => Promise<ApiResponse<OtpVerifyResponse>>;
27
+ export declare const logout: () => Promise<ApiResponse<{
28
+ success: boolean;
29
+ }>>;
30
+ export type AccountResponse = {
31
+ id: string;
32
+ email: string;
33
+ hasSalt: boolean;
34
+ hasRecoveryBlob: boolean;
35
+ blobCount: number;
36
+ createdAt: string;
37
+ };
38
+ export declare const getAccount: () => Promise<ApiResponse<AccountResponse>>;
39
+ export type SaltResponse = {
40
+ salt: string;
41
+ };
42
+ export declare const getSalt: () => Promise<ApiResponse<SaltResponse>>;
43
+ export declare const setSalt: (salt: string) => Promise<ApiResponse<{
44
+ success: boolean;
45
+ }>>;
46
+ export type RecoveryResponse = {
47
+ recoveryBlob: string;
48
+ };
49
+ export declare const getRecoveryBlob: () => Promise<ApiResponse<RecoveryResponse>>;
50
+ export declare const setRecoveryBlob: (recoveryBlob: string) => Promise<ApiResponse<{
51
+ success: boolean;
52
+ }>>;
53
+ export type MasterKeyResponse = {
54
+ encryptedMasterKey: string;
55
+ salt: string | null;
56
+ };
57
+ export declare const getMasterKey: () => Promise<ApiResponse<MasterKeyResponse>>;
58
+ export declare const setMasterKey: (encryptedMasterKey: string) => Promise<ApiResponse<{
59
+ success: boolean;
60
+ }>>;
61
+ export type BlobListItem = {
62
+ id: string;
63
+ updatedAt: string;
64
+ };
65
+ export type BlobListResponse = {
66
+ blobs: BlobListItem[];
67
+ };
68
+ export declare const listBlobs: () => Promise<ApiResponse<BlobListResponse>>;
69
+ export type BlobResponse = {
70
+ id: string;
71
+ encryptedData: string;
72
+ iv: string;
73
+ tag: string;
74
+ updatedAt: string;
75
+ };
76
+ export declare const getBlob: (id: string) => Promise<ApiResponse<BlobResponse>>;
77
+ export type BlobCreateResponse = {
78
+ id: string;
79
+ updatedAt: string;
80
+ };
81
+ export declare const createBlob: (encryptedData: string, iv: string, tag: string) => Promise<ApiResponse<BlobCreateResponse>>;
82
+ export declare const updateBlob: (id: string, encryptedData: string, iv: string, tag: string) => Promise<ApiResponse<BlobCreateResponse>>;
83
+ export declare const deleteBlob: (id: string) => Promise<ApiResponse<{
84
+ success: boolean;
85
+ }>>;
86
+ export type SkillListItem = {
87
+ id: string;
88
+ skillKey: string;
89
+ currentHash: string | null;
90
+ updatedAt: string;
91
+ };
92
+ export type SkillListResponse = {
93
+ skills: SkillListItem[];
94
+ };
95
+ export declare const listSkills: () => Promise<ApiResponse<SkillListResponse>>;
96
+ export type SkillVersionInfo = {
97
+ hash: string;
98
+ parentHash: string | null;
99
+ message: string | null;
100
+ createdAt: string;
101
+ };
102
+ export type SkillVersionsResponse = {
103
+ skillKey: string;
104
+ currentHash: string | null;
105
+ versions: SkillVersionInfo[];
106
+ };
107
+ export declare const getSkillVersions: (skillKey: string) => Promise<ApiResponse<SkillVersionsResponse>>;
108
+ export type SkillVersionResponse = {
109
+ skillKey: string;
110
+ hash: string;
111
+ encryptedData: string;
112
+ iv: string;
113
+ tag: string;
114
+ parentHash: string | null;
115
+ message: string | null;
116
+ createdAt: string;
117
+ };
118
+ export declare const getSkillVersion: (skillKey: string, hash: string) => Promise<ApiResponse<SkillVersionResponse>>;
119
+ export type SkillResponse = {
120
+ skillKey: string;
121
+ skillId: string;
122
+ hash: string;
123
+ encryptedData: string;
124
+ iv: string;
125
+ tag: string;
126
+ parentHash: string | null;
127
+ message: string | null;
128
+ createdAt: string;
129
+ };
130
+ export declare const getSkill: (skillKey: string) => Promise<ApiResponse<SkillResponse>>;
131
+ export type PushVersionResponse = {
132
+ skillId: string;
133
+ hash: string;
134
+ parentHash: string | null;
135
+ createdAt: string;
136
+ };
137
+ export declare const pushSkillVersion: (skillKey: string, hash: string, encryptedData: string, iv: string, tag: string, message: string | undefined) => Promise<ApiResponse<PushVersionResponse>>;
138
+ export declare const deleteSkill: (skillKey: string) => Promise<ApiResponse<{
139
+ success: boolean;
140
+ }>>;
141
+ export type HealthResponse = {
142
+ name: string;
143
+ version: string;
144
+ status: string;
145
+ };
146
+ export declare const checkHealth: () => Promise<ApiResponse<HealthResponse>>;
147
+ export {};
148
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/api.js ADDED
@@ -0,0 +1,218 @@
1
+ /**
2
+ * API client for Claude Skill Sync server
3
+ */
4
+ import { loadConfig } from "./config.js";
5
+ import { loadCredentials, saveCredentials } from "./credentials.js";
6
+ const DEFAULT_SERVER_URL = "https://api.claudeskill.io";
7
+ /**
8
+ * Get the server URL from config
9
+ */
10
+ const getServerUrl = async () => {
11
+ const config = await loadConfig();
12
+ return config?.serverUrl ?? DEFAULT_SERVER_URL;
13
+ };
14
+ /**
15
+ * Make an authenticated API request
16
+ */
17
+ const apiRequest = async (path, options = {}) => {
18
+ const serverUrl = await getServerUrl();
19
+ const credentials = await loadCredentials();
20
+ const headers = {
21
+ "Content-Type": "application/json",
22
+ ...options.headers,
23
+ };
24
+ if (credentials?.accessToken) {
25
+ headers["Authorization"] = `Bearer ${credentials.accessToken}`;
26
+ }
27
+ try {
28
+ const response = await fetch(`${serverUrl}${path}`, {
29
+ ...options,
30
+ headers,
31
+ });
32
+ const data = await response.json();
33
+ if (!response.ok) {
34
+ // Try to refresh token if unauthorized
35
+ if (response.status === 401 && credentials?.refreshToken) {
36
+ const refreshed = await refreshAccessToken();
37
+ if (refreshed) {
38
+ // Retry with new token
39
+ return apiRequest(path, options);
40
+ }
41
+ }
42
+ return {
43
+ ok: false,
44
+ error: data.error ?? "Request failed",
45
+ status: response.status,
46
+ };
47
+ }
48
+ return { ok: true, data: data };
49
+ }
50
+ catch (err) {
51
+ return {
52
+ ok: false,
53
+ error: err instanceof Error ? err.message : "Network error",
54
+ status: 0,
55
+ };
56
+ }
57
+ };
58
+ /**
59
+ * Refresh the access token using refresh token
60
+ */
61
+ const refreshAccessToken = async () => {
62
+ const credentials = await loadCredentials();
63
+ if (!credentials?.refreshToken)
64
+ return false;
65
+ const serverUrl = await getServerUrl();
66
+ try {
67
+ const response = await fetch(`${serverUrl}/auth/refresh`, {
68
+ method: "POST",
69
+ headers: { "Content-Type": "application/json" },
70
+ body: JSON.stringify({ refreshToken: credentials.refreshToken }),
71
+ });
72
+ if (!response.ok)
73
+ return false;
74
+ const data = await response.json();
75
+ await saveCredentials({
76
+ ...credentials,
77
+ accessToken: data.accessToken,
78
+ });
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ };
85
+ export const requestOtp = async (email) => {
86
+ const serverUrl = await getServerUrl();
87
+ try {
88
+ const response = await fetch(`${serverUrl}/auth/otp/request`, {
89
+ method: "POST",
90
+ headers: { "Content-Type": "application/json" },
91
+ body: JSON.stringify({ email }),
92
+ });
93
+ const data = await response.json();
94
+ if (!response.ok) {
95
+ return { ok: false, error: data.error ?? "Failed to send OTP", status: response.status };
96
+ }
97
+ return { ok: true, data: data };
98
+ }
99
+ catch (err) {
100
+ return { ok: false, error: err instanceof Error ? err.message : "Network error", status: 0 };
101
+ }
102
+ };
103
+ export const verifyOtp = async (email, code) => {
104
+ const serverUrl = await getServerUrl();
105
+ try {
106
+ const response = await fetch(`${serverUrl}/auth/otp/verify`, {
107
+ method: "POST",
108
+ headers: { "Content-Type": "application/json" },
109
+ body: JSON.stringify({ email, code }),
110
+ });
111
+ const data = await response.json();
112
+ if (!response.ok) {
113
+ return { ok: false, error: data.error ?? "Invalid code", status: response.status };
114
+ }
115
+ return { ok: true, data: data };
116
+ }
117
+ catch (err) {
118
+ return { ok: false, error: err instanceof Error ? err.message : "Network error", status: 0 };
119
+ }
120
+ };
121
+ export const logout = async () => {
122
+ const credentials = await loadCredentials();
123
+ return apiRequest("/auth/logout", {
124
+ method: "POST",
125
+ body: JSON.stringify({ refreshToken: credentials?.refreshToken }),
126
+ });
127
+ };
128
+ export const getAccount = async () => {
129
+ return apiRequest("/account");
130
+ };
131
+ export const getSalt = async () => {
132
+ return apiRequest("/account/salt");
133
+ };
134
+ export const setSalt = async (salt) => {
135
+ return apiRequest("/account/salt", {
136
+ method: "PUT",
137
+ body: JSON.stringify({ salt }),
138
+ });
139
+ };
140
+ export const getRecoveryBlob = async () => {
141
+ return apiRequest("/account/recovery");
142
+ };
143
+ export const setRecoveryBlob = async (recoveryBlob) => {
144
+ return apiRequest("/account/recovery", {
145
+ method: "PUT",
146
+ body: JSON.stringify({ recoveryBlob }),
147
+ });
148
+ };
149
+ export const getMasterKey = async () => {
150
+ return apiRequest("/account/master-key");
151
+ };
152
+ export const setMasterKey = async (encryptedMasterKey) => {
153
+ return apiRequest("/account/master-key", {
154
+ method: "PUT",
155
+ body: JSON.stringify({ encryptedMasterKey }),
156
+ });
157
+ };
158
+ export const listBlobs = async () => {
159
+ return apiRequest("/blobs");
160
+ };
161
+ export const getBlob = async (id) => {
162
+ return apiRequest(`/blobs/${id}`);
163
+ };
164
+ export const createBlob = async (encryptedData, iv, tag) => {
165
+ return apiRequest("/blobs", {
166
+ method: "POST",
167
+ body: JSON.stringify({ encryptedData, iv, tag }),
168
+ });
169
+ };
170
+ export const updateBlob = async (id, encryptedData, iv, tag) => {
171
+ return apiRequest(`/blobs/${id}`, {
172
+ method: "PUT",
173
+ body: JSON.stringify({ encryptedData, iv, tag }),
174
+ });
175
+ };
176
+ export const deleteBlob = async (id) => {
177
+ return apiRequest(`/blobs/${id}`, {
178
+ method: "DELETE",
179
+ });
180
+ };
181
+ export const listSkills = async () => {
182
+ return apiRequest("/skills");
183
+ };
184
+ export const getSkillVersions = async (skillKey) => {
185
+ return apiRequest(`/skills/${encodeURIComponent(skillKey)}/versions`);
186
+ };
187
+ export const getSkillVersion = async (skillKey, hash) => {
188
+ return apiRequest(`/skills/${encodeURIComponent(skillKey)}/versions/${hash}`);
189
+ };
190
+ export const getSkill = async (skillKey) => {
191
+ return apiRequest(`/skills/${encodeURIComponent(skillKey)}`);
192
+ };
193
+ export const pushSkillVersion = async (skillKey, hash, encryptedData, iv, tag, message) => {
194
+ return apiRequest(`/skills/${encodeURIComponent(skillKey)}/versions`, {
195
+ method: "POST",
196
+ body: JSON.stringify({ hash, encryptedData, iv, tag, message }),
197
+ });
198
+ };
199
+ export const deleteSkill = async (skillKey) => {
200
+ return apiRequest(`/skills/${encodeURIComponent(skillKey)}`, {
201
+ method: "DELETE",
202
+ });
203
+ };
204
+ export const checkHealth = async () => {
205
+ const serverUrl = await getServerUrl();
206
+ try {
207
+ const response = await fetch(serverUrl);
208
+ const data = await response.json();
209
+ if (!response.ok) {
210
+ return { ok: false, error: "Server unhealthy", status: response.status };
211
+ }
212
+ return { ok: true, data: data };
213
+ }
214
+ catch (err) {
215
+ return { ok: false, error: err instanceof Error ? err.message : "Network error", status: 0 };
216
+ }
217
+ };
218
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Checkout command - restore a specific version of a skill
3
+ */
4
+ /**
5
+ * Run the checkout command
6
+ */
7
+ export declare const runCheckout: (skillKey: string, hash: string) => Promise<void>;
8
+ //# sourceMappingURL=checkout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../../src/commands/checkout.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH;;GAEG;AACH,eAAO,MAAM,WAAW,GAAU,UAAU,MAAM,EAAE,MAAM,MAAM,kBAsI/D,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Checkout command - restore a specific version of a skill
3
+ */
4
+ import { writeFile, mkdir } from "node:fs/promises";
5
+ import { join } from "node:path";
6
+ import * as p from "@clack/prompts";
7
+ import { getClaudeDir } from "@claudeskill/core";
8
+ import { loadConfig } from "../config.js";
9
+ import { loadCredentials } from "../credentials.js";
10
+ import { getMasterKey, decryptSkill, loadSyncIndex, saveSyncIndex } from "../sync.js";
11
+ import * as api from "../api.js";
12
+ /** Get the target directory for a skill type */
13
+ const getSkillTypeDir = (type) => {
14
+ const claudeDir = getClaudeDir();
15
+ const typeDirs = {
16
+ command: "commands",
17
+ skill: "skills",
18
+ agent: "agents",
19
+ };
20
+ return join(claudeDir, typeDirs[type]);
21
+ };
22
+ /**
23
+ * Run the checkout command
24
+ */
25
+ export const runCheckout = async (skillKey, hash) => {
26
+ const config = await loadConfig();
27
+ if (!config) {
28
+ p.log.error("Not configured. Run 'claude-skill-sync' first to set up.");
29
+ return;
30
+ }
31
+ if (config.mode === "local") {
32
+ p.log.error("Cannot checkout in local-only mode.");
33
+ return;
34
+ }
35
+ const credentials = await loadCredentials();
36
+ if (!credentials?.accessToken) {
37
+ p.log.error("Not logged in. Run 'claude-skill-sync login' first.");
38
+ return;
39
+ }
40
+ // Check server connection
41
+ const healthResult = await api.checkHealth();
42
+ if (!healthResult.ok) {
43
+ p.log.error(`Cannot connect to server: ${healthResult.error}`);
44
+ return;
45
+ }
46
+ // Get passphrase to unlock vault
47
+ const passphrase = await p.password({
48
+ message: "Vault passphrase:",
49
+ mask: "*",
50
+ });
51
+ if (p.isCancel(passphrase)) {
52
+ p.cancel("Checkout cancelled.");
53
+ return;
54
+ }
55
+ // Get master key
56
+ const spinner = p.spinner();
57
+ spinner.start("Unlocking vault...");
58
+ const masterKey = await getMasterKey(passphrase);
59
+ if (!masterKey) {
60
+ spinner.stop("Failed to unlock vault");
61
+ p.log.error("Invalid passphrase or corrupted credentials.");
62
+ return;
63
+ }
64
+ spinner.stop("Vault unlocked");
65
+ // Get the specific version
66
+ spinner.start(`Fetching version ${hash}...`);
67
+ const result = await api.getSkillVersion(skillKey, hash);
68
+ if (!result.ok) {
69
+ spinner.stop("Failed");
70
+ if (result.status === 404) {
71
+ p.log.error(`Version ${hash} not found for ${skillKey}`);
72
+ }
73
+ else {
74
+ p.log.error(`Failed to get version: ${result.error}`);
75
+ }
76
+ return;
77
+ }
78
+ // Decrypt the skill
79
+ spinner.message("Decrypting...");
80
+ let decrypted;
81
+ try {
82
+ decrypted = decryptSkill(result.data.encryptedData, result.data.iv, result.data.tag, masterKey);
83
+ }
84
+ catch (err) {
85
+ spinner.stop("Failed");
86
+ p.log.error(`Failed to decrypt: ${err}`);
87
+ return;
88
+ }
89
+ // Write to local filesystem
90
+ spinner.message("Writing files...");
91
+ const skillType = decrypted.type ?? "command";
92
+ const baseDir = getSkillTypeDir(skillType);
93
+ try {
94
+ if (skillType === "skill" && decrypted.files) {
95
+ // Directory-based skill
96
+ const skillDir = join(baseDir, decrypted.name);
97
+ await mkdir(skillDir, { recursive: true });
98
+ // Write main skill file
99
+ await writeFile(join(skillDir, "SKILL.md"), decrypted.content, "utf-8");
100
+ // Write supporting files
101
+ await Promise.all(decrypted.files.map((f) => writeFile(join(skillDir, f.name), f.content, "utf-8")));
102
+ }
103
+ else {
104
+ // File-based skill (command or agent)
105
+ await mkdir(baseDir, { recursive: true });
106
+ await writeFile(join(baseDir, `${decrypted.name}.md`), decrypted.content, "utf-8");
107
+ }
108
+ }
109
+ catch (err) {
110
+ spinner.stop("Failed");
111
+ p.log.error(`Failed to write files: ${err}`);
112
+ return;
113
+ }
114
+ // Update sync index
115
+ const index = await loadSyncIndex();
116
+ const hashContent = (content) => {
117
+ const hash = Array.from(content).reduce((hash, char) => {
118
+ const code = char.charCodeAt(0);
119
+ const newHash = (hash << 5) - hash + code;
120
+ return newHash & newHash;
121
+ }, 0);
122
+ return hash.toString(16);
123
+ };
124
+ index.skills[skillKey] = {
125
+ hash,
126
+ blobId: null,
127
+ localHash: hashContent(decrypted.content + JSON.stringify(decrypted.files ?? [])),
128
+ remoteUpdatedAt: result.data.createdAt,
129
+ };
130
+ await saveSyncIndex(index);
131
+ spinner.stop(`Checked out ${skillKey} @ ${hash}`);
132
+ p.log.success(`Restored ${skillType}/${decrypted.name} to version ${hash}`);
133
+ };
134
+ //# sourceMappingURL=checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkout.js","sourceRoot":"","sources":["../../src/commands/checkout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Diff command - compare two versions of a skill
3
+ */
4
+ /**
5
+ * Run the diff command
6
+ */
7
+ export declare const runDiff: (skillKey: string, hash1: string, hash2: string) => Promise<void>;
8
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkDH;;GAEG;AACH,eAAO,MAAM,OAAO,GAAU,UAAU,MAAM,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,kBAqI3E,CAAC"}