skilllib 1.12.2 → 1.13.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.
@@ -1,4 +1,5 @@
1
1
  import {
2
+ FEATURED_HARNESSES,
2
3
  HARNESSES,
3
4
  PROJECT_SKILLS_DIR,
4
5
  addRefusal,
@@ -87,7 +88,7 @@ import {
87
88
  versionHistory,
88
89
  visibleProjects,
89
90
  withoutForceHint
90
- } from "./chunk-YQFLFWAY.js";
91
+ } from "./chunk-C6TSR7NT.js";
91
92
 
92
93
  // src/tui/index.tsx
93
94
  import { render } from "ink";
@@ -1509,8 +1510,11 @@ function App({ initial, reload, loadUsage: loadUsage2 }) {
1509
1510
  }
1510
1511
  useEffect(() => {
1511
1512
  const folder = () => !initial.roots.length && askForFolder("Where are your projects? skilllib finds the git repos in there");
1512
- if (!initial.agentsChosen) setModal({ kind: "agents", selected: initial.agents, cursor: 0, then: folder });
1513
- else folder();
1513
+ if (!initial.agentsChosen) {
1514
+ const installed = HARNESSES.filter((h) => h.installed()).map((h) => h.id);
1515
+ const ids = [...FEATURED_HARNESSES, ...installed.filter((id) => !FEATURED_HARNESSES.includes(id))];
1516
+ setModal({ kind: "agents", selected: initial.agents, ids, cursor: 0, then: folder });
1517
+ } else folder();
1514
1518
  }, []);
1515
1519
  function openInGlobal(name) {
1516
1520
  goPlace("global");
@@ -1530,14 +1534,24 @@ function App({ initial, reload, loadUsage: loadUsage2 }) {
1530
1534
  cells: [{ text, width: 34, color: c }, { text: sub, grow: true, color: color.faint }],
1531
1535
  onEnter
1532
1536
  });
1537
+ const shown = [
1538
+ ...FEATURED_HARNESSES.map((id) => harness(id)),
1539
+ ...world.agents.filter((id) => !FEATURED_HARNESSES.includes(id)).map((id) => harness(id))
1540
+ ];
1533
1541
  return [
1534
1542
  header("#agents", "Agents"),
1535
- ...HARNESSES.map(
1543
+ ...shown.map(
1536
1544
  (h) => row(`agent:${h.id}`, `${world.agents.includes(h.id) ? "[x]" : "[ ]"} ${h.icon} ${h.name}`, h.projectDirs.join(", "), () => {
1537
1545
  const wasOn = world.agents.includes(h.id);
1538
1546
  apply((w) => (w.ops.setAgents(wasOn ? w.agents.filter((a) => a !== h.id) : HARNESSES.map((x) => x.id).filter((id) => id === h.id || w.agents.includes(id))), `${h.name} ${wasOn ? "off" : "on"}`));
1539
1547
  })
1540
1548
  ),
1549
+ row(
1550
+ "agents:more",
1551
+ "More agents\u2026",
1552
+ "Copilot, Gemini, OpenCode, Windsurf, and the rest",
1553
+ () => setModal({ kind: "agents", selected: world.agents, ids: HARNESSES.map((h) => h.id), cursor: 0 })
1554
+ ),
1541
1555
  // The skill that lets your agents use skilllib: installing adds a global skill, so it asks first.
1542
1556
  row(
1543
1557
  "agent-skill",
@@ -1667,11 +1681,13 @@ function App({ initial, reload, loadUsage: loadUsage2 }) {
1667
1681
  if (m.kind === "add") return addKeys(m, input, key);
1668
1682
  }
1669
1683
  function agentsKeys(m, input, key) {
1684
+ const list2 = m.ids.map((id) => harness(id));
1670
1685
  if (key.escape && !m.then) return setModal(null);
1671
1686
  if (key.upArrow) return setModal({ ...m, cursor: Math.max(0, m.cursor - 1) });
1672
- if (key.downArrow) return setModal({ ...m, cursor: Math.min(HARNESSES.length - 1, m.cursor + 1) });
1687
+ if (key.downArrow) return setModal({ ...m, cursor: Math.min(list2.length - 1, m.cursor + 1) });
1673
1688
  if (input === " ") {
1674
- const id = HARNESSES[m.cursor].id;
1689
+ const id = list2[m.cursor]?.id;
1690
+ if (!id) return;
1675
1691
  return setModal({ ...m, selected: m.selected.includes(id) ? m.selected.filter((x) => x !== id) : [...m.selected, id] });
1676
1692
  }
1677
1693
  if (key.return) {
@@ -1905,11 +1921,11 @@ function App({ initial, reload, loadUsage: loadUsage2 }) {
1905
1921
  empty: "",
1906
1922
  header: /* @__PURE__ */ jsx2(Text2, { color: color.muted, children: "skilllib makes your skills visible to each one. Detected ones are ticked." }),
1907
1923
  headerHeight: 1,
1908
- rows: HARNESSES.map((h) => ({
1924
+ rows: modal.ids.map((id) => harness(id)).map((h) => ({
1909
1925
  key: h.id,
1910
1926
  cells: [
1911
1927
  { text: modal.selected.includes(h.id) ? "[x] " : "[ ] ", width: 4, color: modal.selected.includes(h.id) ? color.green : color.faint },
1912
- { text: `${h.icon} ${h.name}`, width: 18, color: h.color },
1928
+ { text: `${h.icon} ${h.name}`, width: 22, color: h.color },
1913
1929
  { text: `reads ${h.projectDirs.join(", ")}`, grow: true, color: color.faint }
1914
1930
  ]
1915
1931
  }))
package/package.json CHANGED
@@ -1,15 +1,19 @@
1
1
  {
2
2
  "name": "skilllib",
3
- "version": "1.12.2",
4
- "description": "Manage your agent skills like dependencies. One library for all your skills; each repo gets only the ones it needs, and every agent can see them. Works with Claude Code, Cursor, Codex, Zed and Grok.",
3
+ "version": "1.13.0",
4
+ "description": "Manage your agent skills like dependencies. One library, install from skills.sh, and every agent you use can see them.",
5
5
  "keywords": [
6
6
  "agent-skills",
7
7
  "skills",
8
+ "skills.sh",
8
9
  "skill-md",
9
10
  "claude-code",
10
11
  "claude",
11
12
  "cursor",
12
13
  "codex",
14
+ "gemini",
15
+ "github-copilot",
16
+ "opencode",
13
17
  "zed",
14
18
  "grok",
15
19
  "ai-agents",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: skilllib
3
- description: Agent skills (SKILL.md) loaded in this repo and the user's skill library, via the skilllib CLI. Use for which skills you can use here and where each comes from, which library skills to add, what's out of date, broken or duplicated, and adding, removing or updating skills.
3
+ description: Agent skills (SKILL.md) loaded in this repo and the user's skill library, via the skilllib CLI. Use for which skills you can use here and where each comes from, which library skills to add, what's out of date, broken or duplicated, adding, removing or updating skills, and installing skills from skills.sh or GitHub.
4
4
  allowed-tools: Bash(skilllib:*)
5
5
  ---
6
6
 
@@ -8,7 +8,7 @@ allowed-tools: Bash(skilllib:*)
8
8
 
9
9
  The user manages agent skills with the `skilllib` CLI. Their **library** (`~/.skilllib/library`, "my skills", "the registry") holds versioned skills that load nowhere until added to a repo. A repo pins its skills in `skilllib.json` (shared, committed), or in the user's personal pins (`~/.skilllib/pins`, kept out of git: `personal: true` in the output).
10
10
 
11
- Always pass `--json` (one line of JSON on stdout; messages go to stderr). A failure exits 1 with `{"error": "..."}` as that line. `link`, `tidy`, `global` (its listing, `keep` and `unkeep`), `restore`, `new`, `folders`, `harnesses`, `scan` and `unhide` print messages only (read the exit code). Unknown flags are errors. Never run bare `skilllib` or `skilllib ui`: that's an interactive app.
11
+ Always pass `--json` (one line of JSON on stdout; messages go to stderr). A failure exits 1 with `{"error": "..."}` as that line. `link`, `tidy`, `global` (its listing, `keep` and `unkeep`), `restore`, `new`, `folders`, `harnesses`, `scan`, `search` (without `--json`) and `unhide` print messages only (read the exit code). Unknown flags are errors. Never run bare `skilllib` or `skilllib ui`: that's an interactive app.
12
12
 
13
13
  ## Reading
14
14
 
@@ -42,7 +42,7 @@ Also: `usage --json` (Claude Code usage only, so "unused" is a hint; each skill
42
42
 
43
43
  **Fixes and decisions.** `apply <id> [choice]` runs one problem's `fix`, or the choice you name: its label (safest), or its number from 1. With several choices it needs one. Prints `{id, applied, ok, message}`. Ids come from `issues` in `status --json` (Now, below) or from `doctor --json` (every repo; pass `apply` the same `--days` you gave `doctor`). A few issues span repos and offer different choices in each; then `apply` takes only the label.
44
44
 
45
- **Importing.** `import <dir>...` copies skill folders (each with a `SKILL.md`) into the library; skilllib doesn't download anything. For a skill on GitHub, clone the repo into a temporary folder, `import` the skill's folder, then `add` it here.
45
+ **Importing and installing.** `import <dir>...` copies skill folders (each with a `SKILL.md`) into the library; it doesn't download anything. `install <source>...` does: `owner/repo`, `owner/repo@skill`, a `https://skills.sh/...` or GitHub URL, or a local folder. It puts each skill in the library. In a repo it also adds them here; `--global` loads them in every repo instead (and marks them kept). A repo with several skills is listed, not installed, until you pass `@name` or `--all`. `search <query>` lists matches from skills.sh. `install` and `search` accept `--json`.
46
46
 
47
47
  ## Now
48
48