@claudeskill/cli 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/api.d.ts +213 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +123 -0
- package/dist/api.js.map +1 -1
- package/dist/commands/checkout.js +3 -3
- package/dist/commands/checkout.js.map +1 -1
- package/dist/commands/diff.js +2 -2
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/log.js +2 -2
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/login.js +2 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/pull.js +3 -3
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +26 -3
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/status.js +3 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/team.d.ts +74 -0
- package/dist/commands/team.d.ts.map +1 -0
- package/dist/commands/team.js +551 -0
- package/dist/commands/team.js.map +1 -0
- package/dist/index.js +195 -13
- package/dist/index.js.map +1 -1
- package/dist/menu.js +12 -12
- package/dist/onboarding.js +5 -5
- package/dist/onboarding.js.map +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +35 -11
- package/dist/sync.js.map +1 -1
- package/dist/team.d.ts +51 -0
- package/dist/team.d.ts.map +1 -0
- package/dist/team.js +246 -0
- package/dist/team.js.map +1 -0
- package/package.json +4 -4
package/dist/team.js
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team skill sync module
|
|
3
|
+
*
|
|
4
|
+
* Manages local team skill directories and syncs with the server.
|
|
5
|
+
* Team skills are stored in ~/.config/claude-skill-sync/teams/<slug>/
|
|
6
|
+
*/
|
|
7
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
8
|
+
import { dirname, join, resolve } from "node:path";
|
|
9
|
+
import { computeSkillHash, listDirectorySkills, listSkills, } from "@claudeskill/core";
|
|
10
|
+
import { getConfigDir } from "./config.js";
|
|
11
|
+
import { decryptSkill, encryptSkill } from "./sync.js";
|
|
12
|
+
import * as api from "./api.js";
|
|
13
|
+
const TEAM_INDEX_FILE = ".sync-index.json";
|
|
14
|
+
const hashContent = (content) => {
|
|
15
|
+
const hash = Array.from(content).reduce((hashValue, char) => {
|
|
16
|
+
const code = char.charCodeAt(0);
|
|
17
|
+
const newHash = (hashValue << 5) - hashValue + code;
|
|
18
|
+
return newHash | 0;
|
|
19
|
+
}, 0);
|
|
20
|
+
return hash.toString(16);
|
|
21
|
+
};
|
|
22
|
+
export const getManagedTeamsRoot = () => {
|
|
23
|
+
return join(getConfigDir(), "teams");
|
|
24
|
+
};
|
|
25
|
+
export const getTeamRoot = (teamSlug) => {
|
|
26
|
+
return join(getManagedTeamsRoot(), teamSlug);
|
|
27
|
+
};
|
|
28
|
+
export const getTeamTypeDir = (teamSlug, type) => {
|
|
29
|
+
const typeDirs = {
|
|
30
|
+
command: "commands",
|
|
31
|
+
skill: "skills",
|
|
32
|
+
agent: "agents",
|
|
33
|
+
};
|
|
34
|
+
return join(getTeamRoot(teamSlug), typeDirs[type]);
|
|
35
|
+
};
|
|
36
|
+
const getTeamIndexPath = (teamSlug) => {
|
|
37
|
+
return join(getTeamRoot(teamSlug), TEAM_INDEX_FILE);
|
|
38
|
+
};
|
|
39
|
+
export const loadTeamSyncIndex = async (teamSlug) => {
|
|
40
|
+
try {
|
|
41
|
+
const content = await readFile(getTeamIndexPath(teamSlug), "utf8");
|
|
42
|
+
return JSON.parse(content);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return { skills: {}, lastSyncAt: "" };
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
export const saveTeamSyncIndex = async (teamSlug, index) => {
|
|
49
|
+
const indexPath = getTeamIndexPath(teamSlug);
|
|
50
|
+
await mkdir(dirname(indexPath), { recursive: true });
|
|
51
|
+
await writeFile(indexPath, JSON.stringify(index, null, 2), "utf8");
|
|
52
|
+
};
|
|
53
|
+
export const listManagedTeamSkills = async (teamSlug) => {
|
|
54
|
+
const skillArrays = await Promise.all([
|
|
55
|
+
listSkills(getTeamTypeDir(teamSlug, "command"), "command"),
|
|
56
|
+
listDirectorySkills(getTeamTypeDir(teamSlug, "skill"), "skill"),
|
|
57
|
+
listSkills(getTeamTypeDir(teamSlug, "agent"), "agent"),
|
|
58
|
+
]);
|
|
59
|
+
return skillArrays.flat().sort((a, b) => {
|
|
60
|
+
if (a.type !== b.type) {
|
|
61
|
+
const order = { command: 0, skill: 1, agent: 2 };
|
|
62
|
+
return order[a.type] - order[b.type];
|
|
63
|
+
}
|
|
64
|
+
return a.name.localeCompare(b.name);
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Validate that a resolved path stays within the expected base directory.
|
|
69
|
+
* Throws if path traversal is detected.
|
|
70
|
+
*/
|
|
71
|
+
const assertWithinDir = (filePath, baseDir) => {
|
|
72
|
+
const resolved = resolve(filePath);
|
|
73
|
+
const resolvedBase = resolve(baseDir);
|
|
74
|
+
if (!resolved.startsWith(resolvedBase + "/") && resolved !== resolvedBase) {
|
|
75
|
+
throw new Error(`Path traversal detected: ${filePath} escapes ${resolvedBase}`);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
export const writeTeamSkill = async (teamSlug, decrypted) => {
|
|
79
|
+
const skillType = decrypted.type ?? "command";
|
|
80
|
+
const baseDir = getTeamTypeDir(teamSlug, skillType);
|
|
81
|
+
const teamRoot = getTeamRoot(teamSlug);
|
|
82
|
+
if (skillType === "skill" && decrypted.files) {
|
|
83
|
+
const skillDir = join(baseDir, decrypted.name);
|
|
84
|
+
assertWithinDir(skillDir, teamRoot);
|
|
85
|
+
await mkdir(skillDir, { recursive: true });
|
|
86
|
+
const mainFilePath = join(skillDir, "SKILL.md");
|
|
87
|
+
assertWithinDir(mainFilePath, teamRoot);
|
|
88
|
+
await writeFile(mainFilePath, decrypted.content, "utf8");
|
|
89
|
+
await Promise.all(decrypted.files.map((file) => {
|
|
90
|
+
const filePath = join(skillDir, file.name);
|
|
91
|
+
assertWithinDir(filePath, teamRoot);
|
|
92
|
+
return writeFile(filePath, file.content, "utf8");
|
|
93
|
+
}));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const filePath = join(baseDir, `${decrypted.name}.md`);
|
|
97
|
+
assertWithinDir(filePath, teamRoot);
|
|
98
|
+
await mkdir(baseDir, { recursive: true });
|
|
99
|
+
await writeFile(filePath, decrypted.content, "utf8");
|
|
100
|
+
};
|
|
101
|
+
export const pushTeamSkills = async (params) => {
|
|
102
|
+
const allSkills = await listManagedTeamSkills(params.teamSlug);
|
|
103
|
+
const filtered = params.skillFilter
|
|
104
|
+
? allSkills.filter((skill) => skill.name === params.skillFilter ||
|
|
105
|
+
`${skill.type}:${skill.name}` === params.skillFilter)
|
|
106
|
+
: allSkills;
|
|
107
|
+
const index = await loadTeamSyncIndex(params.teamSlug);
|
|
108
|
+
const results = await Promise.all(filtered.map(async (skill) => {
|
|
109
|
+
const skillKey = `${skill.type}:${skill.name}`;
|
|
110
|
+
const localHash = hashContent(skill.content + JSON.stringify(skill.files ?? []));
|
|
111
|
+
const hash = computeSkillHash(skill);
|
|
112
|
+
if (index.skills[skillKey]?.hash === hash) {
|
|
113
|
+
params.onProgress?.(`Skipping ${skillKey} (unchanged)`);
|
|
114
|
+
return { type: "skipped" };
|
|
115
|
+
}
|
|
116
|
+
params.onProgress?.(`Pushing ${skillKey}...`);
|
|
117
|
+
const encrypted = encryptSkill(skill, params.teamKey);
|
|
118
|
+
const result = await api.pushTeamSkillVersion(params.teamId, skillKey, hash, encrypted.encryptedData, encrypted.iv, encrypted.tag, params.teamKeyVersion, params.message);
|
|
119
|
+
if (!result.ok) {
|
|
120
|
+
return {
|
|
121
|
+
type: "error",
|
|
122
|
+
message: `Failed to push ${skillKey}: ${result.error}`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
type: "success",
|
|
127
|
+
skillKey,
|
|
128
|
+
hash,
|
|
129
|
+
localHash,
|
|
130
|
+
remoteUpdatedAt: result.data.createdAt,
|
|
131
|
+
};
|
|
132
|
+
}));
|
|
133
|
+
for (const result of results) {
|
|
134
|
+
if (result.type === "success") {
|
|
135
|
+
index.skills[result.skillKey] = {
|
|
136
|
+
hash: result.hash,
|
|
137
|
+
localHash: result.localHash,
|
|
138
|
+
remoteUpdatedAt: result.remoteUpdatedAt,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
index.lastSyncAt = new Date().toISOString();
|
|
143
|
+
await saveTeamSyncIndex(params.teamSlug, index);
|
|
144
|
+
return {
|
|
145
|
+
pushed: results.filter((result) => result.type === "success").length,
|
|
146
|
+
errors: results
|
|
147
|
+
.filter((result) => result.type === "error")
|
|
148
|
+
.map((result) => (result.type === "error" ? result.message : "")),
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Read the current local content for a team skill to detect local modifications.
|
|
153
|
+
*/
|
|
154
|
+
const readLocalTeamSkillContent = async (teamSlug, skillKey) => {
|
|
155
|
+
// skillKey format is "type:name"
|
|
156
|
+
const [type, ...nameParts] = skillKey.split(":");
|
|
157
|
+
const name = nameParts.join(":");
|
|
158
|
+
const skillType = type ?? "command";
|
|
159
|
+
const baseDir = getTeamTypeDir(teamSlug, skillType);
|
|
160
|
+
try {
|
|
161
|
+
if (skillType === "skill") {
|
|
162
|
+
const content = await readFile(join(baseDir, name, "SKILL.md"), "utf8");
|
|
163
|
+
return content;
|
|
164
|
+
}
|
|
165
|
+
const content = await readFile(join(baseDir, `${name}.md`), "utf8");
|
|
166
|
+
return content;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
export const pullTeamSkills = async (params) => {
|
|
173
|
+
const index = await loadTeamSyncIndex(params.teamSlug);
|
|
174
|
+
const listResult = await api.listTeamSkills(params.teamId);
|
|
175
|
+
if (!listResult.ok) {
|
|
176
|
+
return { pulled: 0, errors: [`Failed to list team skills: ${listResult.error}`], conflicts: [] };
|
|
177
|
+
}
|
|
178
|
+
const conflicts = [];
|
|
179
|
+
const results = await Promise.all(listResult.data.skills.map(async (remoteSkill) => {
|
|
180
|
+
if (!remoteSkill.currentHash) {
|
|
181
|
+
return { type: "skipped" };
|
|
182
|
+
}
|
|
183
|
+
const existing = index.skills[remoteSkill.skillKey];
|
|
184
|
+
if (existing?.hash === remoteSkill.currentHash) {
|
|
185
|
+
params.onProgress?.(`Skipping ${remoteSkill.skillKey} (unchanged)`);
|
|
186
|
+
return { type: "skipped" };
|
|
187
|
+
}
|
|
188
|
+
// Check for local modifications that would be overwritten
|
|
189
|
+
if (existing?.localHash) {
|
|
190
|
+
const localContent = await readLocalTeamSkillContent(params.teamSlug, remoteSkill.skillKey);
|
|
191
|
+
if (localContent !== null) {
|
|
192
|
+
const currentLocalHash = hashContent(localContent);
|
|
193
|
+
if (currentLocalHash !== existing.localHash) {
|
|
194
|
+
conflicts.push({
|
|
195
|
+
skillKey: remoteSkill.skillKey,
|
|
196
|
+
reason: "Local file has been modified since last sync",
|
|
197
|
+
});
|
|
198
|
+
return { type: "skipped" };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const skillResult = await api.getTeamSkill(params.teamId, remoteSkill.skillKey);
|
|
203
|
+
if (!skillResult.ok) {
|
|
204
|
+
return {
|
|
205
|
+
type: "error",
|
|
206
|
+
message: `Failed to fetch ${remoteSkill.skillKey}: ${skillResult.error}`,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const decrypted = decryptSkill(skillResult.data.encryptedData, skillResult.data.iv, skillResult.data.tag, params.teamKey);
|
|
211
|
+
await writeTeamSkill(params.teamSlug, decrypted);
|
|
212
|
+
return {
|
|
213
|
+
type: "success",
|
|
214
|
+
skillKey: remoteSkill.skillKey,
|
|
215
|
+
hash: remoteSkill.currentHash,
|
|
216
|
+
localHash: hashContent(decrypted.content + JSON.stringify(decrypted.files ?? [])),
|
|
217
|
+
remoteUpdatedAt: remoteSkill.updatedAt,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return {
|
|
222
|
+
type: "error",
|
|
223
|
+
message: `Failed to decrypt/write ${remoteSkill.skillKey}: ${error}`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}));
|
|
227
|
+
for (const result of results) {
|
|
228
|
+
if (result.type === "success") {
|
|
229
|
+
index.skills[result.skillKey] = {
|
|
230
|
+
hash: result.hash,
|
|
231
|
+
localHash: result.localHash,
|
|
232
|
+
remoteUpdatedAt: result.remoteUpdatedAt,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
index.lastSyncAt = new Date().toISOString();
|
|
237
|
+
await saveTeamSyncIndex(params.teamSlug, index);
|
|
238
|
+
return {
|
|
239
|
+
pulled: results.filter((result) => result.type === "success").length,
|
|
240
|
+
errors: results
|
|
241
|
+
.filter((result) => result.type === "error")
|
|
242
|
+
.map((result) => (result.type === "error" ? result.message : "")),
|
|
243
|
+
conflicts,
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
//# sourceMappingURL=team.js.map
|
package/dist/team.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team.js","sourceRoot":"","sources":["../src/team.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,GAGX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAchC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,MAAM,WAAW,GAAG,CAAC,OAAe,EAAU,EAAE;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;QACpD,OAAO,OAAO,GAAG,CAAC,CAAC;IACrB,CAAC,EAAE,CAAC,CAAC,CAAC;IACN,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAW,EAAE;IAC9C,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAU,EAAE;IACtD,OAAO,IAAI,CAAC,mBAAmB,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,IAAe,EAAU,EAAE;IAC1E,MAAM,QAAQ,GAA8B;QAC1C,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,QAAQ;KAChB,CAAC;IACF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAU,EAAE;IACpD,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAgB,EAA0B,EAAE;IAClF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACxC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,QAAgB,EAChB,KAAoB,EACL,EAAE;IACjB,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,QAAgB,EAAoB,EAAE;IAChF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpC,UAAU,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC;QAC1D,mBAAmB,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAC/D,UAAU,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;KACvD,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAQ,EAAE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,YAAY,YAAY,EAAE,CAAC,CAAC;IAClF,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,QAAgB,EAChB,SAA0C,EAC3B,EAAE;IACjB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/C,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChD,eAAe,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEzD,MAAM,OAAO,CAAC,GAAG,CACf,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACpC,OAAO,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC,CAAC,CACH,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC;IACvD,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,MAQpC,EAAiD,EAAE;IAClD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW;QACjC,CAAC,CAAC,SAAS,CAAC,MAAM,CACd,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW;YACjC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,WAAW,CACvD;QACH,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;YAC1C,MAAM,CAAC,UAAU,EAAE,CAAC,YAAY,QAAQ,cAAc,CAAC,CAAC;YACxD,OAAO,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,CAAC,UAAU,EAAE,CAAC,WAAW,QAAQ,KAAK,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAC3C,MAAM,CAAC,MAAM,EACb,QAAQ,EACR,IAAI,EACJ,SAAS,CAAC,aAAa,EACvB,SAAS,CAAC,EAAE,EACZ,SAAS,CAAC,GAAG,EACb,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,OAAO,CACf,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,OAAgB;gBACtB,OAAO,EAAE,kBAAkB,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE;aACvD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,SAAkB;YACxB,QAAQ;YACR,IAAI;YACJ,SAAS;YACT,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS;SACvC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;gBAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEhD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM;QACpE,MAAM,EAAE,OAAO;aACZ,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;aAC3C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACpE,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,yBAAyB,GAAG,KAAK,EACrC,QAAgB,EAChB,QAAgB,EACQ,EAAE;IAC1B,iCAAiC;IACjC,MAAM,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,SAAS,GAAI,IAAkB,IAAI,SAAS,CAAC;IACnD,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;YACxE,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,MAKpC,EAAgF,EAAE;IACjF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,+BAA+B,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACnG,CAAC;IAED,MAAM,SAAS,GAAuB,EAAE,CAAC;IAEzC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;QAC/C,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,QAAQ,EAAE,IAAI,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;YAC/C,MAAM,CAAC,UAAU,EAAE,CAAC,YAAY,WAAW,CAAC,QAAQ,cAAc,CAAC,CAAC;YACpE,OAAO,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;QACtC,CAAC;QAED,0DAA0D;QAC1D,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;YACxB,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC5F,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBAC1B,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;gBACnD,IAAI,gBAAgB,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC5C,SAAS,CAAC,IAAI,CAAC;wBACb,QAAQ,EAAE,WAAW,CAAC,QAAQ;wBAC9B,MAAM,EAAE,8CAA8C;qBACvD,CAAC,CAAC;oBACH,OAAO,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YACpB,OAAO;gBACL,IAAI,EAAE,OAAgB;gBACtB,OAAO,EAAE,mBAAmB,WAAW,CAAC,QAAQ,KAAK,WAAW,CAAC,KAAK,EAAE;aACzE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAC5B,WAAW,CAAC,IAAI,CAAC,aAAa,EAC9B,WAAW,CAAC,IAAI,CAAC,EAAE,EACnB,WAAW,CAAC,IAAI,CAAC,GAAG,EACpB,MAAM,CAAC,OAAO,CACf,CAAC;YACF,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAEjD,OAAO;gBACL,IAAI,EAAE,SAAkB;gBACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,IAAI,EAAE,WAAW,CAAC,WAAW;gBAC7B,SAAS,EAAE,WAAW,CACpB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAC1D;gBACD,eAAe,EAAE,WAAW,CAAC,SAAS;aACvC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,OAAgB;gBACtB,OAAO,EAAE,2BAA2B,WAAW,CAAC,QAAQ,KAAK,KAAK,EAAE;aACrE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG;gBAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,eAAe,EAAE,MAAM,CAAC,eAAe;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAEhD,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM;QACpE,MAAM,EAAE,OAAO;aACZ,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;aAC3C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,SAAS;KACV,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@claudeskill/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Sync your Claude Code skills across devices with zero-knowledge encryption",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@claudeskill/core": "*",
|
|
26
|
-
"@clack/prompts": "^
|
|
26
|
+
"@clack/prompts": "^1.1.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@types/node": "^
|
|
29
|
+
"@types/node": "^25.0.3",
|
|
30
30
|
"typescript": "^5.7.2"
|
|
31
31
|
},
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
33
|
+
"node": ">=20.19.0"
|
|
34
34
|
},
|
|
35
35
|
"keywords": [
|
|
36
36
|
"claude",
|