@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.
@@ -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-PBHH6KMJ.js.map
3333
+ //# sourceMappingURL=chunk-HUMRYJPE.js.map