@cleocode/caamp 1.0.3 → 1.0.5
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/{chunk-PBHH6KMJ.js → chunk-HUMRYJPE.js} +165 -165
- package/dist/{chunk-PBHH6KMJ.js.map → chunk-HUMRYJPE.js.map} +1 -1
- package/dist/cli.js +1531 -376
- package/dist/cli.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
|
@@ -1813,95 +1813,6 @@ function isMarketplaceScoped(input) {
|
|
|
1813
1813
|
return /^@[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/.test(input);
|
|
1814
1814
|
}
|
|
1815
1815
|
|
|
1816
|
-
// src/core/skills/lock.ts
|
|
1817
|
-
import { simpleGit } from "simple-git";
|
|
1818
|
-
async function recordSkillInstall(skillName, scopedName, source, sourceType, agents, canonicalPath, isGlobal, projectDir, version) {
|
|
1819
|
-
await updateLockFile((lock) => {
|
|
1820
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1821
|
-
const existing = lock.skills[skillName];
|
|
1822
|
-
lock.skills[skillName] = {
|
|
1823
|
-
name: skillName,
|
|
1824
|
-
scopedName: existing?.scopedName ?? scopedName,
|
|
1825
|
-
source: existing?.source ?? source,
|
|
1826
|
-
sourceType: existing?.sourceType ?? sourceType,
|
|
1827
|
-
version: version ?? existing?.version,
|
|
1828
|
-
installedAt: existing?.installedAt ?? now,
|
|
1829
|
-
updatedAt: now,
|
|
1830
|
-
agents: [.../* @__PURE__ */ new Set([...existing?.agents ?? [], ...agents])],
|
|
1831
|
-
canonicalPath,
|
|
1832
|
-
isGlobal: existing?.isGlobal ?? isGlobal,
|
|
1833
|
-
projectDir: existing?.projectDir ?? projectDir
|
|
1834
|
-
};
|
|
1835
|
-
});
|
|
1836
|
-
}
|
|
1837
|
-
async function removeSkillFromLock(skillName) {
|
|
1838
|
-
let removed = false;
|
|
1839
|
-
await updateLockFile((lock) => {
|
|
1840
|
-
if (!(skillName in lock.skills)) return;
|
|
1841
|
-
delete lock.skills[skillName];
|
|
1842
|
-
removed = true;
|
|
1843
|
-
});
|
|
1844
|
-
return removed;
|
|
1845
|
-
}
|
|
1846
|
-
async function getTrackedSkills() {
|
|
1847
|
-
const lock = await readLockFile();
|
|
1848
|
-
return lock.skills;
|
|
1849
|
-
}
|
|
1850
|
-
async function fetchLatestSha(repoUrl, ref) {
|
|
1851
|
-
try {
|
|
1852
|
-
const git = simpleGit();
|
|
1853
|
-
const target = ref ?? "HEAD";
|
|
1854
|
-
const args = target === "HEAD" ? [repoUrl, "HEAD"] : ["--refs", repoUrl, target];
|
|
1855
|
-
const result = await git.listRemote(args);
|
|
1856
|
-
const firstLine = result.trim().split("\n")[0];
|
|
1857
|
-
if (!firstLine) return null;
|
|
1858
|
-
const sha = firstLine.split(" ")[0];
|
|
1859
|
-
return sha ?? null;
|
|
1860
|
-
} catch {
|
|
1861
|
-
return null;
|
|
1862
|
-
}
|
|
1863
|
-
}
|
|
1864
|
-
async function checkSkillUpdate(skillName) {
|
|
1865
|
-
const lock = await readLockFile();
|
|
1866
|
-
const entry = lock.skills[skillName];
|
|
1867
|
-
if (!entry) {
|
|
1868
|
-
return { hasUpdate: false, status: "unknown" };
|
|
1869
|
-
}
|
|
1870
|
-
if (entry.sourceType !== "github" && entry.sourceType !== "gitlab") {
|
|
1871
|
-
return {
|
|
1872
|
-
hasUpdate: false,
|
|
1873
|
-
currentVersion: entry.version,
|
|
1874
|
-
status: "unknown"
|
|
1875
|
-
};
|
|
1876
|
-
}
|
|
1877
|
-
const parsed = parseSource(entry.source);
|
|
1878
|
-
if (!parsed.owner || !parsed.repo) {
|
|
1879
|
-
return {
|
|
1880
|
-
hasUpdate: false,
|
|
1881
|
-
currentVersion: entry.version,
|
|
1882
|
-
status: "unknown"
|
|
1883
|
-
};
|
|
1884
|
-
}
|
|
1885
|
-
const host = parsed.type === "gitlab" ? "gitlab.com" : "github.com";
|
|
1886
|
-
const repoUrl = `https://${host}/${parsed.owner}/${parsed.repo}.git`;
|
|
1887
|
-
const latestSha = await fetchLatestSha(repoUrl, parsed.ref);
|
|
1888
|
-
if (!latestSha) {
|
|
1889
|
-
return {
|
|
1890
|
-
hasUpdate: false,
|
|
1891
|
-
currentVersion: entry.version,
|
|
1892
|
-
status: "unknown"
|
|
1893
|
-
};
|
|
1894
|
-
}
|
|
1895
|
-
const currentVersion = entry.version;
|
|
1896
|
-
const hasUpdate = !currentVersion || !latestSha.startsWith(currentVersion.slice(0, 7));
|
|
1897
|
-
return {
|
|
1898
|
-
hasUpdate,
|
|
1899
|
-
currentVersion: currentVersion ?? "unknown",
|
|
1900
|
-
latestVersion: latestSha.slice(0, 12),
|
|
1901
|
-
status: hasUpdate ? "update-available" : "up-to-date"
|
|
1902
|
-
};
|
|
1903
|
-
}
|
|
1904
|
-
|
|
1905
1816
|
// src/core/network/fetch.ts
|
|
1906
1817
|
var DEFAULT_FETCH_TIMEOUT_MS = 1e4;
|
|
1907
1818
|
var NetworkError = class extends Error {
|
|
@@ -2152,73 +2063,6 @@ var MarketplaceClient = class {
|
|
|
2152
2063
|
}
|
|
2153
2064
|
};
|
|
2154
2065
|
|
|
2155
|
-
// src/core/skills/discovery.ts
|
|
2156
|
-
import { readFile as readFile7, readdir } from "fs/promises";
|
|
2157
|
-
import { existsSync as existsSync11 } from "fs";
|
|
2158
|
-
import { join as join6 } from "path";
|
|
2159
|
-
import matter from "gray-matter";
|
|
2160
|
-
async function parseSkillFile(filePath) {
|
|
2161
|
-
try {
|
|
2162
|
-
const content = await readFile7(filePath, "utf-8");
|
|
2163
|
-
const { data } = matter(content);
|
|
2164
|
-
if (!data.name || !data.description) {
|
|
2165
|
-
return null;
|
|
2166
|
-
}
|
|
2167
|
-
const allowedTools = data["allowed-tools"] ?? data.allowedTools;
|
|
2168
|
-
return {
|
|
2169
|
-
name: String(data.name),
|
|
2170
|
-
description: String(data.description),
|
|
2171
|
-
license: data.license ? String(data.license) : void 0,
|
|
2172
|
-
compatibility: data.compatibility ? String(data.compatibility) : void 0,
|
|
2173
|
-
metadata: data.metadata,
|
|
2174
|
-
allowedTools: typeof allowedTools === "string" ? allowedTools.split(/\s+/) : Array.isArray(allowedTools) ? allowedTools.map(String) : void 0,
|
|
2175
|
-
version: data.version ? String(data.version) : void 0
|
|
2176
|
-
};
|
|
2177
|
-
} catch {
|
|
2178
|
-
return null;
|
|
2179
|
-
}
|
|
2180
|
-
}
|
|
2181
|
-
async function discoverSkill(skillDir) {
|
|
2182
|
-
const skillFile = join6(skillDir, "SKILL.md");
|
|
2183
|
-
if (!existsSync11(skillFile)) return null;
|
|
2184
|
-
const metadata = await parseSkillFile(skillFile);
|
|
2185
|
-
if (!metadata) return null;
|
|
2186
|
-
return {
|
|
2187
|
-
name: metadata.name,
|
|
2188
|
-
scopedName: metadata.name,
|
|
2189
|
-
path: skillDir,
|
|
2190
|
-
metadata
|
|
2191
|
-
};
|
|
2192
|
-
}
|
|
2193
|
-
async function discoverSkills(rootDir) {
|
|
2194
|
-
if (!existsSync11(rootDir)) return [];
|
|
2195
|
-
const entries = await readdir(rootDir, { withFileTypes: true });
|
|
2196
|
-
const skills = [];
|
|
2197
|
-
for (const entry of entries) {
|
|
2198
|
-
if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
|
|
2199
|
-
const skillDir = join6(rootDir, entry.name);
|
|
2200
|
-
const skill = await discoverSkill(skillDir);
|
|
2201
|
-
if (skill) {
|
|
2202
|
-
skills.push(skill);
|
|
2203
|
-
}
|
|
2204
|
-
}
|
|
2205
|
-
return skills;
|
|
2206
|
-
}
|
|
2207
|
-
async function discoverSkillsMulti(dirs) {
|
|
2208
|
-
const all = [];
|
|
2209
|
-
const seen = /* @__PURE__ */ new Set();
|
|
2210
|
-
for (const dir of dirs) {
|
|
2211
|
-
const skills = await discoverSkills(dir);
|
|
2212
|
-
for (const skill of skills) {
|
|
2213
|
-
if (!seen.has(skill.name)) {
|
|
2214
|
-
seen.add(skill.name);
|
|
2215
|
-
all.push(skill);
|
|
2216
|
-
}
|
|
2217
|
-
}
|
|
2218
|
-
}
|
|
2219
|
-
return all;
|
|
2220
|
-
}
|
|
2221
|
-
|
|
2222
2066
|
// src/core/skills/catalog.ts
|
|
2223
2067
|
var catalog_exports = {};
|
|
2224
2068
|
__export(catalog_exports, {
|
|
@@ -2348,6 +2192,162 @@ function isCatalogAvailable() {
|
|
|
2348
2192
|
}
|
|
2349
2193
|
}
|
|
2350
2194
|
|
|
2195
|
+
// src/core/skills/discovery.ts
|
|
2196
|
+
import { readFile as readFile7, readdir } from "fs/promises";
|
|
2197
|
+
import { existsSync as existsSync11 } from "fs";
|
|
2198
|
+
import { join as join6 } from "path";
|
|
2199
|
+
import matter from "gray-matter";
|
|
2200
|
+
async function parseSkillFile(filePath) {
|
|
2201
|
+
try {
|
|
2202
|
+
const content = await readFile7(filePath, "utf-8");
|
|
2203
|
+
const { data } = matter(content);
|
|
2204
|
+
if (!data.name || !data.description) {
|
|
2205
|
+
return null;
|
|
2206
|
+
}
|
|
2207
|
+
const allowedTools = data["allowed-tools"] ?? data.allowedTools;
|
|
2208
|
+
return {
|
|
2209
|
+
name: String(data.name),
|
|
2210
|
+
description: String(data.description),
|
|
2211
|
+
license: data.license ? String(data.license) : void 0,
|
|
2212
|
+
compatibility: data.compatibility ? String(data.compatibility) : void 0,
|
|
2213
|
+
metadata: data.metadata,
|
|
2214
|
+
allowedTools: typeof allowedTools === "string" ? allowedTools.split(/\s+/) : Array.isArray(allowedTools) ? allowedTools.map(String) : void 0,
|
|
2215
|
+
version: data.version ? String(data.version) : void 0
|
|
2216
|
+
};
|
|
2217
|
+
} catch {
|
|
2218
|
+
return null;
|
|
2219
|
+
}
|
|
2220
|
+
}
|
|
2221
|
+
async function discoverSkill(skillDir) {
|
|
2222
|
+
const skillFile = join6(skillDir, "SKILL.md");
|
|
2223
|
+
if (!existsSync11(skillFile)) return null;
|
|
2224
|
+
const metadata = await parseSkillFile(skillFile);
|
|
2225
|
+
if (!metadata) return null;
|
|
2226
|
+
return {
|
|
2227
|
+
name: metadata.name,
|
|
2228
|
+
scopedName: metadata.name,
|
|
2229
|
+
path: skillDir,
|
|
2230
|
+
metadata
|
|
2231
|
+
};
|
|
2232
|
+
}
|
|
2233
|
+
async function discoverSkills(rootDir) {
|
|
2234
|
+
if (!existsSync11(rootDir)) return [];
|
|
2235
|
+
const entries = await readdir(rootDir, { withFileTypes: true });
|
|
2236
|
+
const skills = [];
|
|
2237
|
+
for (const entry of entries) {
|
|
2238
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
|
|
2239
|
+
const skillDir = join6(rootDir, entry.name);
|
|
2240
|
+
const skill = await discoverSkill(skillDir);
|
|
2241
|
+
if (skill) {
|
|
2242
|
+
skills.push(skill);
|
|
2243
|
+
}
|
|
2244
|
+
}
|
|
2245
|
+
return skills;
|
|
2246
|
+
}
|
|
2247
|
+
async function discoverSkillsMulti(dirs) {
|
|
2248
|
+
const all = [];
|
|
2249
|
+
const seen = /* @__PURE__ */ new Set();
|
|
2250
|
+
for (const dir of dirs) {
|
|
2251
|
+
const skills = await discoverSkills(dir);
|
|
2252
|
+
for (const skill of skills) {
|
|
2253
|
+
if (!seen.has(skill.name)) {
|
|
2254
|
+
seen.add(skill.name);
|
|
2255
|
+
all.push(skill);
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
}
|
|
2259
|
+
return all;
|
|
2260
|
+
}
|
|
2261
|
+
|
|
2262
|
+
// src/core/skills/lock.ts
|
|
2263
|
+
import { simpleGit } from "simple-git";
|
|
2264
|
+
async function recordSkillInstall(skillName, scopedName, source, sourceType, agents, canonicalPath, isGlobal, projectDir, version) {
|
|
2265
|
+
await updateLockFile((lock) => {
|
|
2266
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
2267
|
+
const existing = lock.skills[skillName];
|
|
2268
|
+
lock.skills[skillName] = {
|
|
2269
|
+
name: skillName,
|
|
2270
|
+
scopedName: existing?.scopedName ?? scopedName,
|
|
2271
|
+
source: existing?.source ?? source,
|
|
2272
|
+
sourceType: existing?.sourceType ?? sourceType,
|
|
2273
|
+
version: version ?? existing?.version,
|
|
2274
|
+
installedAt: existing?.installedAt ?? now,
|
|
2275
|
+
updatedAt: now,
|
|
2276
|
+
agents: [.../* @__PURE__ */ new Set([...existing?.agents ?? [], ...agents])],
|
|
2277
|
+
canonicalPath,
|
|
2278
|
+
isGlobal: existing?.isGlobal ?? isGlobal,
|
|
2279
|
+
projectDir: existing?.projectDir ?? projectDir
|
|
2280
|
+
};
|
|
2281
|
+
});
|
|
2282
|
+
}
|
|
2283
|
+
async function removeSkillFromLock(skillName) {
|
|
2284
|
+
let removed = false;
|
|
2285
|
+
await updateLockFile((lock) => {
|
|
2286
|
+
if (!(skillName in lock.skills)) return;
|
|
2287
|
+
delete lock.skills[skillName];
|
|
2288
|
+
removed = true;
|
|
2289
|
+
});
|
|
2290
|
+
return removed;
|
|
2291
|
+
}
|
|
2292
|
+
async function getTrackedSkills() {
|
|
2293
|
+
const lock = await readLockFile();
|
|
2294
|
+
return lock.skills;
|
|
2295
|
+
}
|
|
2296
|
+
async function fetchLatestSha(repoUrl, ref) {
|
|
2297
|
+
try {
|
|
2298
|
+
const git = simpleGit();
|
|
2299
|
+
const target = ref ?? "HEAD";
|
|
2300
|
+
const args = target === "HEAD" ? [repoUrl, "HEAD"] : ["--refs", repoUrl, target];
|
|
2301
|
+
const result = await git.listRemote(args);
|
|
2302
|
+
const firstLine = result.trim().split("\n")[0];
|
|
2303
|
+
if (!firstLine) return null;
|
|
2304
|
+
const sha = firstLine.split(" ")[0];
|
|
2305
|
+
return sha ?? null;
|
|
2306
|
+
} catch {
|
|
2307
|
+
return null;
|
|
2308
|
+
}
|
|
2309
|
+
}
|
|
2310
|
+
async function checkSkillUpdate(skillName) {
|
|
2311
|
+
const lock = await readLockFile();
|
|
2312
|
+
const entry = lock.skills[skillName];
|
|
2313
|
+
if (!entry) {
|
|
2314
|
+
return { hasUpdate: false, status: "unknown" };
|
|
2315
|
+
}
|
|
2316
|
+
if (entry.sourceType !== "github" && entry.sourceType !== "gitlab") {
|
|
2317
|
+
return {
|
|
2318
|
+
hasUpdate: false,
|
|
2319
|
+
currentVersion: entry.version,
|
|
2320
|
+
status: "unknown"
|
|
2321
|
+
};
|
|
2322
|
+
}
|
|
2323
|
+
const parsed = parseSource(entry.source);
|
|
2324
|
+
if (!parsed.owner || !parsed.repo) {
|
|
2325
|
+
return {
|
|
2326
|
+
hasUpdate: false,
|
|
2327
|
+
currentVersion: entry.version,
|
|
2328
|
+
status: "unknown"
|
|
2329
|
+
};
|
|
2330
|
+
}
|
|
2331
|
+
const host = parsed.type === "gitlab" ? "gitlab.com" : "github.com";
|
|
2332
|
+
const repoUrl = `https://${host}/${parsed.owner}/${parsed.repo}.git`;
|
|
2333
|
+
const latestSha = await fetchLatestSha(repoUrl, parsed.ref);
|
|
2334
|
+
if (!latestSha) {
|
|
2335
|
+
return {
|
|
2336
|
+
hasUpdate: false,
|
|
2337
|
+
currentVersion: entry.version,
|
|
2338
|
+
status: "unknown"
|
|
2339
|
+
};
|
|
2340
|
+
}
|
|
2341
|
+
const currentVersion = entry.version;
|
|
2342
|
+
const hasUpdate = !currentVersion || !latestSha.startsWith(currentVersion.slice(0, 7));
|
|
2343
|
+
return {
|
|
2344
|
+
hasUpdate,
|
|
2345
|
+
currentVersion: currentVersion ?? "unknown",
|
|
2346
|
+
latestVersion: latestSha.slice(0, 12),
|
|
2347
|
+
status: hasUpdate ? "update-available" : "up-to-date"
|
|
2348
|
+
};
|
|
2349
|
+
}
|
|
2350
|
+
|
|
2351
2351
|
// src/core/skills/recommendation.ts
|
|
2352
2352
|
var RECOMMENDATION_ERROR_CODES = {
|
|
2353
2353
|
QUERY_INVALID: "E_SKILLS_QUERY_INVALID",
|
|
@@ -3299,16 +3299,8 @@ export {
|
|
|
3299
3299
|
getLastSelectedAgents,
|
|
3300
3300
|
parseSource,
|
|
3301
3301
|
isMarketplaceScoped,
|
|
3302
|
-
recordSkillInstall,
|
|
3303
|
-
removeSkillFromLock,
|
|
3304
|
-
getTrackedSkills,
|
|
3305
|
-
checkSkillUpdate,
|
|
3306
3302
|
formatNetworkError,
|
|
3307
3303
|
MarketplaceClient,
|
|
3308
|
-
parseSkillFile,
|
|
3309
|
-
discoverSkill,
|
|
3310
|
-
discoverSkills,
|
|
3311
|
-
discoverSkillsMulti,
|
|
3312
3304
|
listSkills,
|
|
3313
3305
|
getSkill,
|
|
3314
3306
|
getSkillDir,
|
|
@@ -3316,6 +3308,14 @@ export {
|
|
|
3316
3308
|
resolveProfile,
|
|
3317
3309
|
isCatalogAvailable,
|
|
3318
3310
|
catalog_exports,
|
|
3311
|
+
parseSkillFile,
|
|
3312
|
+
discoverSkill,
|
|
3313
|
+
discoverSkills,
|
|
3314
|
+
discoverSkillsMulti,
|
|
3315
|
+
recordSkillInstall,
|
|
3316
|
+
removeSkillFromLock,
|
|
3317
|
+
getTrackedSkills,
|
|
3318
|
+
checkSkillUpdate,
|
|
3319
3319
|
RECOMMENDATION_ERROR_CODES,
|
|
3320
3320
|
tokenizeCriteriaValue,
|
|
3321
3321
|
validateRecommendationCriteria,
|
|
@@ -3330,4 +3330,4 @@ export {
|
|
|
3330
3330
|
toSarif,
|
|
3331
3331
|
validateSkill
|
|
3332
3332
|
};
|
|
3333
|
-
//# sourceMappingURL=chunk-
|
|
3333
|
+
//# sourceMappingURL=chunk-HUMRYJPE.js.map
|