skills 1.3.6 → 1.3.8

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 CHANGED
@@ -210,7 +210,7 @@ Skills can be installed to any of these agents:
210
210
  |-------|-----------|--------------|-------------|
211
211
  | Amp, Kimi Code CLI, Replit | `amp`, `kimi-cli`, `replit` | `.agents/skills/` | `~/.config/agents/skills/` |
212
212
  | Antigravity | `antigravity` | `.agent/skills/` | `~/.gemini/antigravity/skills/` |
213
- | Augment | `augment` | `.augment/rules/` | `~/.augment/rules/` |
213
+ | Augment | `augment` | `.augment/skills/` | `~/.augment/skills/` |
214
214
  | Claude Code | `claude-code` | `.claude/skills/` | `~/.claude/skills/` |
215
215
  | OpenClaw | `openclaw` | `skills/` | `~/.moltbot/skills/` |
216
216
  | Cline | `cline` | `.cline/skills/` | `~/.cline/skills/` |
@@ -316,7 +316,7 @@ The CLI searches for skills in these locations within a repository:
316
316
  - `skills/.system/`
317
317
  - `.agents/skills/`
318
318
  - `.agent/skills/`
319
- - `.augment/rules/`
319
+ - `.augment/skills/`
320
320
  - `.claude/skills/`
321
321
  - `./skills/`
322
322
  - `.cline/skills/`
@@ -8,6 +8,23 @@ are set forth below. These licenses and notices are provided for informational p
8
8
  Third Party Code Components
9
9
  --------------------------------------------
10
10
 
11
+ ================================================================================
12
+ Package: @clack/core@0.4.1
13
+ License: MIT
14
+ Repository: https://github.com/natemoo-re/clack
15
+ --------------------------------------------------------------------------------
16
+
17
+ MIT License
18
+
19
+ Copyright (c) Nate Moore
20
+
21
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
22
+
23
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
24
+
25
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
+
27
+
11
28
  ================================================================================
12
29
  Package: @clack/prompts@0.11.0
13
30
  License: MIT
@@ -104,6 +121,35 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
104
121
  SOFTWARE.
105
122
 
106
123
 
124
+ ================================================================================
125
+ Package: sisteransi@1.0.5
126
+ License: MIT
127
+ Repository: https://github.com/terkelg/sisteransi
128
+ --------------------------------------------------------------------------------
129
+
130
+ MIT License
131
+
132
+ Copyright (c) 2018 Terkel Gjervig Nielsen
133
+
134
+ Permission is hereby granted, free of charge, to any person obtaining a copy
135
+ of this software and associated documentation files (the "Software"), to deal
136
+ in the Software without restriction, including without limitation the rights
137
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
138
+ copies of the Software, and to permit persons to whom the Software is
139
+ furnished to do so, subject to the following conditions:
140
+
141
+ The above copyright notice and this permission notice shall be included in all
142
+ copies or substantial portions of the Software.
143
+
144
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
145
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
146
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
147
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
148
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
149
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
150
+ SOFTWARE.
151
+
152
+
107
153
  ================================================================================
108
154
  Package: xdg-basedir@5.1.0
109
155
  License: MIT
package/dist/cli.mjs CHANGED
@@ -17,7 +17,7 @@ import "crypto";
17
17
  import { fileURLToPath } from "url";
18
18
  import * as readline from "readline";
19
19
  import { Writable } from "stream";
20
- import { access, cp, lstat, mkdir, mkdtemp, readFile, readdir, readlink, rm, stat, symlink, writeFile } from "fs/promises";
20
+ import { access, cp, lstat, mkdir, mkdtemp, readFile, readdir, readlink, realpath, rm, stat, symlink, writeFile } from "fs/promises";
21
21
  var import_picocolors = /* @__PURE__ */ __toESM(require_picocolors(), 1);
22
22
  function getOwnerRepo(parsed) {
23
23
  if (parsed.type === "local") return null;
@@ -117,12 +117,12 @@ function parseSource(input) {
117
117
  ref
118
118
  };
119
119
  }
120
- const gitlabRepoMatch = input.match(/gitlab\.com\/([^/]+)\/([^/]+)/);
120
+ const gitlabRepoMatch = input.match(/gitlab\.com\/(.+?)(?:\.git)?\/?$/);
121
121
  if (gitlabRepoMatch) {
122
- const [, owner, repo] = gitlabRepoMatch;
123
- return {
122
+ const repoPath = gitlabRepoMatch[1];
123
+ if (repoPath.includes("/")) return {
124
124
  type: "gitlab",
125
- url: `https://gitlab.com/${owner}/${repo.replace(/\.git$/, "")}.git`
125
+ url: `https://gitlab.com/${repoPath}.git`
126
126
  };
127
127
  }
128
128
  const atSkillMatch = input.match(/^([^/]+)\/([^/@]+)@(.+)$/);
@@ -436,6 +436,7 @@ async function parseSkillMd(skillMdPath, options) {
436
436
  const content = await readFile(skillMdPath, "utf-8");
437
437
  const { data } = (0, import_gray_matter.default)(content);
438
438
  if (!data.name || !data.description) return null;
439
+ if (typeof data.name !== "string" || typeof data.description !== "string") return null;
439
440
  if (data.metadata?.internal === true && !shouldInstallInternalSkills() && !options?.includeInternal) return null;
440
441
  return {
441
442
  name: data.name,
@@ -566,8 +567,8 @@ const agents = {
566
567
  augment: {
567
568
  name: "augment",
568
569
  displayName: "Augment",
569
- skillsDir: ".augment/rules",
570
- globalSkillsDir: join(home, ".augment/rules"),
570
+ skillsDir: ".augment/skills",
571
+ globalSkillsDir: join(home, ".augment/skills"),
571
572
  detectInstalled: async () => {
572
573
  return existsSync(join(home, ".augment"));
573
574
  }
@@ -938,10 +939,21 @@ async function cleanAndCreateDirectory(path) {
938
939
  } catch {}
939
940
  await mkdir(path, { recursive: true });
940
941
  }
942
+ async function resolveParentSymlinks(path) {
943
+ const resolved = resolve(path);
944
+ const dir = dirname(resolved);
945
+ const base = basename(resolved);
946
+ try {
947
+ return join(await realpath(dir), base);
948
+ } catch {
949
+ return resolved;
950
+ }
951
+ }
941
952
  async function createSymlink(target, linkPath) {
942
953
  try {
943
954
  const resolvedTarget = resolve(target);
944
955
  if (resolvedTarget === resolve(linkPath)) return true;
956
+ if (await resolveParentSymlinks(target) === await resolveParentSymlinks(linkPath)) return true;
945
957
  try {
946
958
  if ((await lstat(linkPath)).isSymbolicLink()) {
947
959
  if (resolveSymlinkTarget(linkPath, await readlink(linkPath)) === resolvedTarget) return true;
@@ -954,7 +966,7 @@ async function createSymlink(target, linkPath) {
954
966
  }
955
967
  const linkDir = dirname(linkPath);
956
968
  await mkdir(linkDir, { recursive: true });
957
- await symlink(relative(linkDir, target), linkPath, platform() === "win32" ? "junction" : void 0);
969
+ await symlink(relative(await resolveParentSymlinks(linkDir), target), linkPath, platform() === "win32" ? "junction" : void 0);
958
970
  return true;
959
971
  } catch {
960
972
  return false;
@@ -1000,6 +1012,12 @@ async function installSkillForAgent(skill, agentType, options = {}) {
1000
1012
  }
1001
1013
  await cleanAndCreateDirectory(canonicalDir);
1002
1014
  await copyDirectory(skill.path, canonicalDir);
1015
+ if (isGlobal && isUniversalAgent(agentType)) return {
1016
+ success: true,
1017
+ path: canonicalDir,
1018
+ canonicalPath: canonicalDir,
1019
+ mode: "symlink"
1020
+ };
1003
1021
  if (!await createSymlink(canonicalDir, agentDir)) {
1004
1022
  await cleanAndCreateDirectory(agentDir);
1005
1023
  await copyDirectory(skill.path, agentDir);
@@ -1117,6 +1135,12 @@ async function installRemoteSkillForAgent(skill, agentType, options = {}) {
1117
1135
  }
1118
1136
  await cleanAndCreateDirectory(canonicalDir);
1119
1137
  await writeFile(join(canonicalDir, "SKILL.md"), skill.content, "utf-8");
1138
+ if (isGlobal && isUniversalAgent(agentType)) return {
1139
+ success: true,
1140
+ path: canonicalDir,
1141
+ canonicalPath: canonicalDir,
1142
+ mode: "symlink"
1143
+ };
1120
1144
  if (!await createSymlink(canonicalDir, agentDir)) {
1121
1145
  await cleanAndCreateDirectory(agentDir);
1122
1146
  await writeFile(join(agentDir, "SKILL.md"), skill.content, "utf-8");
@@ -1192,6 +1216,12 @@ async function installWellKnownSkillForAgent(skill, agentType, options = {}) {
1192
1216
  }
1193
1217
  await cleanAndCreateDirectory(canonicalDir);
1194
1218
  await writeSkillFiles(canonicalDir);
1219
+ if (isGlobal && isUniversalAgent(agentType)) return {
1220
+ success: true,
1221
+ path: canonicalDir,
1222
+ canonicalPath: canonicalDir,
1223
+ mode: "symlink"
1224
+ };
1195
1225
  if (!await createSymlink(canonicalDir, agentDir)) {
1196
1226
  await cleanAndCreateDirectory(agentDir);
1197
1227
  await writeSkillFiles(agentDir);
@@ -1766,7 +1796,7 @@ async function saveSelectedAgents(agents) {
1766
1796
  lock.lastSelectedAgents = agents;
1767
1797
  await writeSkillLock(lock);
1768
1798
  }
1769
- var version$1 = "1.3.6";
1799
+ var version$1 = "1.3.8";
1770
1800
  const isCancelled = (value) => typeof value === "symbol";
1771
1801
  async function isSourcePrivate(source) {
1772
1802
  const ownerRepo = parseOwnerRepo(source);
@@ -2104,7 +2134,7 @@ async function handleRemoteSkill(source, url, options, spinner) {
2104
2134
  for (const r of failed) M.message(` ${import_picocolors.default.red("✗")} ${r.skill} → ${r.agent}: ${import_picocolors.default.dim(r.error)}`);
2105
2135
  }
2106
2136
  console.log();
2107
- Se(import_picocolors.default.green("Done!"));
2137
+ Se(import_picocolors.default.green("Done!") + import_picocolors.default.dim(" Review skills before use; they run with full agent permissions."));
2108
2138
  await promptForFindSkills(options, targetAgents);
2109
2139
  }
2110
2140
  async function handleWellKnownSkills(source, url, options, spinner) {
@@ -2370,7 +2400,7 @@ async function handleWellKnownSkills(source, url, options, spinner) {
2370
2400
  for (const r of failed) M.message(` ${import_picocolors.default.red("✗")} ${r.skill} → ${r.agent}: ${import_picocolors.default.dim(r.error)}`);
2371
2401
  }
2372
2402
  console.log();
2373
- Se(import_picocolors.default.green("Done!"));
2403
+ Se(import_picocolors.default.green("Done!") + import_picocolors.default.dim(" Review skills before use; they run with full agent permissions."));
2374
2404
  await promptForFindSkills(options, targetAgents);
2375
2405
  }
2376
2406
  async function handleDirectUrlSkillLegacy(source, url, options, spinner) {
@@ -2552,7 +2582,7 @@ async function handleDirectUrlSkillLegacy(source, url, options, spinner) {
2552
2582
  for (const r of failed) M.message(` ${import_picocolors.default.red("✗")} ${r.skill} → ${r.agent}: ${import_picocolors.default.dim(r.error)}`);
2553
2583
  }
2554
2584
  console.log();
2555
- Se(import_picocolors.default.green("Done!"));
2585
+ Se(import_picocolors.default.green("Done!") + import_picocolors.default.dim(" Review skills before use; they run with full agent permissions."));
2556
2586
  await promptForFindSkills(options, targetAgents);
2557
2587
  }
2558
2588
  async function runAdd(args, options = {}) {
@@ -2914,7 +2944,7 @@ async function runAdd(args, options = {}) {
2914
2944
  for (const r of failed) M.message(` ${import_picocolors.default.red("✗")} ${r.skill} → ${r.agent}: ${import_picocolors.default.dim(r.error)}`);
2915
2945
  }
2916
2946
  console.log();
2917
- Se(import_picocolors.default.green("Done!"));
2947
+ Se(import_picocolors.default.green("Done!") + import_picocolors.default.dim(" Review skills before use; they run with full agent permissions."));
2918
2948
  await promptForFindSkills(options, targetAgents);
2919
2949
  } catch (error) {
2920
2950
  if (error instanceof GitCloneError) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skills",
3
- "version": "1.3.6",
3
+ "version": "1.3.8",
4
4
  "description": "The open agent skills ecosystem",
5
5
  "type": "module",
6
6
  "bin": {