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.
- package/README.md +12 -7
- package/dist/{chunk-YQFLFWAY.js → chunk-C6TSR7NT.js} +513 -75
- package/dist/index.js +18 -6
- package/dist/json.d.cts +665 -2
- package/dist/json.d.ts +665 -2
- package/dist/{tui-P3HKRNHI.js → tui-3MBVYSVM.js} +24 -8
- package/package.json +6 -2
- package/skills/skilllib/SKILL.md +3 -3
|
@@ -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-
|
|
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)
|
|
1513
|
-
|
|
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
|
-
...
|
|
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(
|
|
1687
|
+
if (key.downArrow) return setModal({ ...m, cursor: Math.min(list2.length - 1, m.cursor + 1) });
|
|
1673
1688
|
if (input === " ") {
|
|
1674
|
-
const 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:
|
|
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:
|
|
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.
|
|
4
|
-
"description": "Manage your agent skills like dependencies. One library
|
|
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",
|
package/skills/skilllib/SKILL.md
CHANGED
|
@@ -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,
|
|
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;
|
|
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
|
|