skills 1.7.0 → 1.7.1

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 (3) hide show
  1. package/README.md +1 -3
  2. package/dist/cli.mjs +27 -10
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -290,7 +290,7 @@ Skills can be installed to any of these agents:
290
290
  | IBM Bob | `bob` | `.bob/skills/` | `~/.bob/skills/` |
291
291
  | Claude Code | `claude-code` | `.claude/skills/` | `~/.claude/skills/` |
292
292
  | OpenClaw | `openclaw` | `skills/` | `~/.openclaw/skills/` |
293
- | Cline, Dexto, Kimi Code CLI, Loaf, Sarvam Code, Warp, Zed | `cline`, `dexto`, `kimi-code-cli`, `loaf`, `sarvam-code`, `warp`, `zed` | `.agents/skills/` | `~/.agents/skills/` |
293
+ | Cline, Dexto, Kimi Code CLI, Loaf, Pi, Sarvam Code, Warp, Zed | `cline`, `dexto`, `kimi-code-cli`, `loaf`, `pi`, `sarvam-code`, `warp`, `zed` | `.agents/skills/` | `~/.agents/skills/` |
294
294
  | CodeArts Agent | `codearts-agent` | `.codeartsdoer/skills/` | `~/.codeartsdoer/skills/` |
295
295
  | CodeBuddy | `codebuddy` | `.codebuddy/skills/` | `~/.codebuddy/skills/` |
296
296
  | Codemaker | `codemaker` | `.codemaker/skills/` | `~/.codemaker/skills/` |
@@ -330,7 +330,6 @@ Skills can be installed to any of these agents:
330
330
  | OpenCode | `opencode` | `.agents/skills/` | `~/.config/opencode/skills/` |
331
331
  | OpenHands | `openhands` | `.openhands/skills/` | `~/.openhands/skills/` |
332
332
  | Ona | `ona` | `.ona/skills/` | `~/.ona/skills/` |
333
- | Pi | `pi` | `.pi/skills/` | `~/.pi/agent/skills/` |
334
333
  | Posit Assistant | `posit-assistant` | `.posit/assistant/skills/` | `~/.posit/assistant/skills/` |
335
334
  | Qoder | `qoder` | `.qoder/skills/` | `~/.qoder/skills/` |
336
335
  | Qoder CN | `qoder-cn` | `.qoder/skills/` | `~/.qoder-cn/skills/` |
@@ -463,7 +462,6 @@ discover `SKILL.md` files outside these container directories (e.g. under
463
462
  - `.mux/skills/`
464
463
  - `.openhands/skills/`
465
464
  - `.ona/skills/`
466
- - `.pi/skills/`
467
465
  - `.posit/assistant/skills/`
468
466
  - `.qoder/skills/`
469
467
  - `.qwen/skills/`
package/dist/cli.mjs CHANGED
@@ -1918,8 +1918,8 @@ const agents = {
1918
1918
  pi: {
1919
1919
  name: "pi",
1920
1920
  displayName: "Pi",
1921
- skillsDir: ".pi/skills",
1922
- globalSkillsDir: join(home, ".pi/agent/skills"),
1921
+ skillsDir: ".agents/skills",
1922
+ globalSkillsDir: join(home, ".agents/skills"),
1923
1923
  detectInstalled: async () => {
1924
1924
  return existsSync(join(home, ".pi/agent"));
1925
1925
  }
@@ -2785,8 +2785,8 @@ async function listInstalledSkills(options = {}) {
2785
2785
  } catch {}
2786
2786
  return Array.from(skillsMap.values());
2787
2787
  }
2788
- const TELEMETRY_URL = "https://add-skill.vercel.sh/t";
2789
- const AUDIT_URL = "https://add-skill.vercel.sh/audit";
2788
+ const TELEMETRY_URL = "https://www.skills.sh/tele/t";
2789
+ const AUDIT_URL = "https://www.skills.sh/tele/audit";
2790
2790
  let cliVersion = null;
2791
2791
  let detectedAgentName = null;
2792
2792
  function setDetectedAgent(agentName) {
@@ -4172,7 +4172,7 @@ async function tryBlobInstall(ownerRepo, options = {}) {
4172
4172
  tree
4173
4173
  };
4174
4174
  }
4175
- var version$1 = "1.7.0";
4175
+ var version$1 = "1.7.1";
4176
4176
  const NOTION_API_VERSION = "2026-03-11";
4177
4177
  const NTN_TIMEOUT_MS = 3e4;
4178
4178
  const NTN_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
@@ -5623,9 +5623,9 @@ async function runAdd(args, options = {}) {
5623
5623
  installedSkillHashes.set(skillDisplayName, computedHash);
5624
5624
  } catch {}
5625
5625
  }
5626
- if (successful.length > 0 && installGlobally && normalizedSource) {
5626
+ if (successful.length > 0 && installGlobally && (normalizedSource || parsed.type === "local" && !directDownload)) {
5627
5627
  let cachedTree;
5628
- if (parsed.type === "github" && !blobResult) cachedTree = await fetchRepoTree(normalizedSource, parsed.ref, getGitHubToken);
5628
+ if (parsed.type === "github" && !blobResult && normalizedSource) cachedTree = await fetchRepoTree(normalizedSource, parsed.ref, getGitHubToken);
5629
5629
  for (const skill of selectedSkills) {
5630
5630
  const skillDisplayName = getSkillDisplayName(skill);
5631
5631
  if (successfulSkillNames.has(skillDisplayName)) try {
@@ -5640,9 +5640,12 @@ async function runAdd(args, options = {}) {
5640
5640
  } else if (skillPathValue && tempDir) {
5641
5641
  const hash = await computeSkillFolderHash(join(tempDir, dirname(skillPathValue)));
5642
5642
  if (hash) skillFolderHash = hash;
5643
+ } else if (parsed.type === "local") {
5644
+ const hash = await computeSkillFolderHash(skill.path);
5645
+ if (hash) skillFolderHash = hash;
5643
5646
  }
5644
5647
  await addSkillToLock(skill.name, {
5645
- source: lockSource || normalizedSource,
5648
+ source: lockSource || normalizedSource || parsed.url,
5646
5649
  sourceType: parsed.type,
5647
5650
  sourceUrl: parsed.url,
5648
5651
  ref: parsed.ref,
@@ -6925,7 +6928,7 @@ async function removeCommand(skillNames, options) {
6925
6928
  if (successful.length > 0) {
6926
6929
  const bySource = /* @__PURE__ */ new Map();
6927
6930
  for (const r of successful) {
6928
- const source = r.source || "local";
6931
+ const source = r.sourceType === "local" ? "local" : r.source || "local";
6929
6932
  const existing = bySource.get(source) || { skills: [] };
6930
6933
  existing.skills.push(r.skill);
6931
6934
  existing.sourceType = r.sourceType;
@@ -7545,7 +7548,7 @@ async function updateProjectSkills(options = {}) {
7545
7548
  if (hasUniversal) targetParts.push("Universal");
7546
7549
  targetParts.push(...targetAgentNames);
7547
7550
  if (targetParts.length > 0) console.log(`${TEXT$1}Updating for: ${targetParts.join(", ")}${RESET$1}`);
7548
- console.log(`${TEXT$1}Refreshing ${updatable.length + wellKnownCount} skill(s)…${RESET$1}`);
7551
+ console.log(`${TEXT$1}Checking ${updatable.length + wellKnownCount} skill(s)…${RESET$1}`);
7549
7552
  console.log();
7550
7553
  const { successCount: wkSuccessCount, failCount: wkFailCount } = await processWellKnownUpdates(wellKnownGroups, false, options);
7551
7554
  successCount += wkSuccessCount;
@@ -7559,6 +7562,7 @@ async function updateProjectSkills(options = {}) {
7559
7562
  }
7560
7563
  const localLock = await readLocalLock();
7561
7564
  const cliEntry = join(__dirname$1, "..", "bin", "cli.mjs");
7565
+ let upToDateCount = 0;
7562
7566
  if (updatable.length > 0 && !existsSync(cliEntry)) {
7563
7567
  console.log(`${DIM$1}✗ CLI entrypoint not found at ${cliEntry}${RESET$1}`);
7564
7568
  return {
@@ -7576,6 +7580,7 @@ async function updateProjectSkills(options = {}) {
7576
7580
  let tempDir = null;
7577
7581
  let deletedSkills = [];
7578
7582
  let resolvedPaths = null;
7583
+ const latestHashes = /* @__PURE__ */ new Map();
7579
7584
  if (cloneSource === null) {
7580
7585
  failCount += skillsForSource.length;
7581
7586
  console.log(`${DIM$1}✗ Cannot update ${source}: skills-lock.json is missing sourceUrl for this generic Git source${RESET$1}`);
@@ -7593,6 +7598,10 @@ async function updateProjectSkills(options = {}) {
7593
7598
  const resolution = await checkAndPromptForDeletions(source, allLockedForSource, localLock.skills, false, options, discoveredLocations);
7594
7599
  deletedSkills = resolution.deletedSkills;
7595
7600
  resolvedPaths = resolution.resolvedPaths;
7601
+ for (const [name, skillPath] of resolution.resolvedPaths) try {
7602
+ const hash = await computeSkillFolderHash(join(tempDir, dirname(skillPath)));
7603
+ if (hash) latestHashes.set(name, hash);
7604
+ } catch {}
7596
7605
  } catch (error) {
7597
7606
  console.log(`${DIM$1}✗ Failed to check for deleted skills from ${source}${RESET$1}`);
7598
7607
  } finally {
@@ -7611,6 +7620,12 @@ async function updateProjectSkills(options = {}) {
7611
7620
  ...skill.entry,
7612
7621
  skillPath: resolvedPath
7613
7622
  } : skill.entry;
7623
+ const relocated = entry.skillPath !== skill.entry.skillPath;
7624
+ const latestHash = latestHashes.get(skill.name);
7625
+ if (!relocated && latestHash && latestHash === skill.entry.computedHash) {
7626
+ upToDateCount++;
7627
+ continue;
7628
+ }
7614
7629
  console.log(`${TEXT$1}Updating ${safeName}…${RESET$1}`);
7615
7630
  const installUrl = buildLocalUpdateSource(entry);
7616
7631
  if (!installUrl) {
@@ -7647,6 +7662,8 @@ async function updateProjectSkills(options = {}) {
7647
7662
  }
7648
7663
  }
7649
7664
  }
7665
+ if (upToDateCount > 0) if (upToDateCount === updatable.length && wkSuccessCount === 0 && wkFailCount === 0) console.log(`${TEXT$1}✓ All project skills are up to date${RESET$1}`);
7666
+ else console.log(`${DIM$1}${upToDateCount} project skill(s) already up to date${RESET$1}`);
7650
7667
  printLegacyProjectSkills(legacy);
7651
7668
  return {
7652
7669
  successCount,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skills",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "description": "The open agent skills ecosystem",
5
5
  "type": "module",
6
6
  "bin": {