@bacnh85/agent-skills 0.1.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 (52) hide show
  1. package/README.md +229 -0
  2. package/dist/src/cli.d.ts +12 -0
  3. package/dist/src/cli.js +224 -0
  4. package/dist/src/cli.js.map +1 -0
  5. package/dist/src/config.d.ts +9 -0
  6. package/dist/src/config.js +14 -0
  7. package/dist/src/config.js.map +1 -0
  8. package/dist/src/discovery.d.ts +16 -0
  9. package/dist/src/discovery.js +161 -0
  10. package/dist/src/discovery.js.map +1 -0
  11. package/dist/src/installer.d.ts +9 -0
  12. package/dist/src/installer.js +131 -0
  13. package/dist/src/installer.js.map +1 -0
  14. package/dist/src/manager.d.ts +8 -0
  15. package/dist/src/manager.js +229 -0
  16. package/dist/src/manager.js.map +1 -0
  17. package/dist/src/registry.d.ts +5 -0
  18. package/dist/src/registry.js +46 -0
  19. package/dist/src/registry.js.map +1 -0
  20. package/dist/src/skill.d.ts +2 -0
  21. package/dist/src/skill.js +50 -0
  22. package/dist/src/skill.js.map +1 -0
  23. package/dist/src/types.d.ts +39 -0
  24. package/dist/src/types.js +2 -0
  25. package/dist/src/types.js.map +1 -0
  26. package/dist/src/ui.d.ts +14 -0
  27. package/dist/src/ui.js +70 -0
  28. package/dist/src/ui.js.map +1 -0
  29. package/dist/test/cli.test.d.ts +1 -0
  30. package/dist/test/cli.test.js +168 -0
  31. package/dist/test/cli.test.js.map +1 -0
  32. package/dist/test/config.test.d.ts +1 -0
  33. package/dist/test/config.test.js +12 -0
  34. package/dist/test/config.test.js.map +1 -0
  35. package/dist/test/discovery.test.d.ts +1 -0
  36. package/dist/test/discovery.test.js +42 -0
  37. package/dist/test/discovery.test.js.map +1 -0
  38. package/dist/test/installer.test.d.ts +1 -0
  39. package/dist/test/installer.test.js +159 -0
  40. package/dist/test/installer.test.js.map +1 -0
  41. package/dist/test/manager.test.d.ts +1 -0
  42. package/dist/test/manager.test.js +150 -0
  43. package/dist/test/manager.test.js.map +1 -0
  44. package/dist/test/skill.test.d.ts +1 -0
  45. package/dist/test/skill.test.js +27 -0
  46. package/dist/test/skill.test.js.map +1 -0
  47. package/dist/test/ui.test.d.ts +1 -0
  48. package/dist/test/ui.test.js +28 -0
  49. package/dist/test/ui.test.js.map +1 -0
  50. package/package.json +54 -0
  51. package/skills/frontend-design/LICENSE.txt +177 -0
  52. package/skills/frontend-design/SKILL.md +55 -0
package/README.md ADDED
@@ -0,0 +1,229 @@
1
+ # Agent Skills
2
+
3
+ `agent-skills` manages a curated repository of AI agent skills and installs
4
+ those skills into project or user directories.
5
+
6
+ ## Requirements
7
+
8
+ - Node.js 20 or later
9
+ - Git for adding or updating skills from remote repositories
10
+
11
+ ## Install the CLI
12
+
13
+ Install the CLI globally from GitHub:
14
+
15
+ ```bash
16
+ npm install -g @bacnh85/agent-skills
17
+ ```
18
+
19
+ Verify the installed CLI:
20
+
21
+ ```bash
22
+ agent-skills --help
23
+ ```
24
+
25
+ You can also install it into a project and run it with `npx`:
26
+
27
+ ```bash
28
+ npm install @bacnh85/agent-skills
29
+ npx agent-skills --help
30
+ ```
31
+
32
+ Pin a branch, tag, or commit by adding a `#ref` suffix:
33
+
34
+ ```bash
35
+ npm install -g bacnh85/agent-skills#main
36
+ npm install bacnh85/agent-skills#main
37
+ ```
38
+
39
+ SSH/Git installs also work on development machines with GitHub SSH keys:
40
+
41
+ ```bash
42
+ npm install -g git+ssh://git@github.com/bacnh85/agent-skills.git
43
+ ```
44
+
45
+ Set `AGENT_SKILLS_REPO` to the local checkout that contains the curated
46
+ `skills/` directory and its registry:
47
+
48
+ ```bash
49
+ export AGENT_SKILLS_REPO=/absolute/path/to/agent-skills
50
+ ```
51
+
52
+ PowerShell on Windows:
53
+
54
+ ```powershell
55
+ $env:AGENT_SKILLS_REPO = "C:\path\to\agent-skills"
56
+ ```
57
+
58
+ To persist it for future PowerShell sessions:
59
+
60
+ ```powershell
61
+ [Environment]::SetEnvironmentVariable("AGENT_SKILLS_REPO", "C:\path\to\agent-skills", "User")
62
+ ```
63
+
64
+ When the variable is not set, `agent-skills` uses the current working
65
+ directory as the repository.
66
+
67
+ ## Install Skills for Agents
68
+
69
+ Run this command from a project directory to select skills interactively:
70
+
71
+ ```bash
72
+ agent-skills install
73
+ ```
74
+
75
+ Selected skills are installed in:
76
+
77
+ ```text
78
+ <current-directory>/.agents/skills/
79
+ ```
80
+
81
+ Install every skill without a prompt:
82
+
83
+ ```bash
84
+ agent-skills install --all
85
+ ```
86
+
87
+ Install selected skills for the current user:
88
+
89
+ ```bash
90
+ agent-skills install -g
91
+ ```
92
+
93
+ Install every skill for the current user:
94
+
95
+ ```bash
96
+ agent-skills install -g --all
97
+ ```
98
+
99
+ Global skills are installed in:
100
+
101
+ ```text
102
+ ~/.agents/skills/
103
+ ```
104
+
105
+ Installing a selected skill replaces its existing directory with the
106
+ repository version. Skills in the destination that were not selected are left
107
+ untouched.
108
+
109
+ Interactive selection requires a terminal. Use `--all` in scripts, CI, and
110
+ other non-interactive environments.
111
+
112
+ ## Uninstall Skills for Agents
113
+
114
+ Remove named skills from the current project:
115
+
116
+ ```bash
117
+ agent-skills uninstall demo notes
118
+ ```
119
+
120
+ Run without names to select installed project skills interactively:
121
+
122
+ ```bash
123
+ agent-skills uninstall
124
+ ```
125
+
126
+ Remove every installed project skill:
127
+
128
+ ```bash
129
+ agent-skills uninstall --all
130
+ ```
131
+
132
+ Use `-g` with named, interactive, or `--all` forms to remove skills from
133
+ `~/.agents/skills/`:
134
+
135
+ ```bash
136
+ agent-skills uninstall demo -g
137
+ agent-skills uninstall -g
138
+ agent-skills uninstall --all -g
139
+ ```
140
+
141
+ Only valid immediate skill directories are candidates. Uninstall leaves the
142
+ `.agents/skills` directory and all unselected or unrelated entries intact.
143
+
144
+ ## Manage the Curated Repository
145
+
146
+ The following commands read and update the repository selected by
147
+ `AGENT_SKILLS_REPO`, or the current directory when it is unset.
148
+
149
+ ### Add
150
+
151
+ Add skills from GitHub shorthand, a GitHub tree URL, any Git URL, or a local
152
+ path:
153
+
154
+ ```bash
155
+ agent-skills add vercel-labs/skills
156
+ agent-skills add https://github.com/acme/skills/tree/main/skills/demo
157
+ agent-skills add ssh://git@github.com/acme/skills.git
158
+ agent-skills add ./my-local-skills
159
+ ```
160
+
161
+ A direct skill source or a source containing one skill is selected
162
+ automatically. Sources containing multiple skills open an interactive
163
+ multiselect. Non-interactive callers must use a direct skill URL or path.
164
+
165
+ ### List
166
+
167
+ List skills registered in the curated repository:
168
+
169
+ ```bash
170
+ agent-skills list
171
+ ```
172
+
173
+ ### Remove
174
+
175
+ Remove named skills:
176
+
177
+ ```bash
178
+ agent-skills remove demo another-skill
179
+ ```
180
+
181
+ Run without names to select skills interactively:
182
+
183
+ ```bash
184
+ agent-skills remove
185
+ ```
186
+
187
+ ### Update
188
+
189
+ Update named skills from their recorded sources:
190
+
191
+ ```bash
192
+ agent-skills update demo another-skill
193
+ ```
194
+
195
+ Run without names to update every registered skill:
196
+
197
+ ```bash
198
+ agent-skills update
199
+ ```
200
+
201
+ Git skills track the branch or ref recorded when added. Local skills are
202
+ copied again from their original absolute path.
203
+
204
+ ## Command Reference
205
+
206
+ ```text
207
+ agent-skills add <source>
208
+ agent-skills remove [skills...]
209
+ agent-skills list
210
+ agent-skills update [skills...]
211
+ agent-skills install [-g] [--all]
212
+ agent-skills uninstall [skills...] [-g]
213
+ agent-skills uninstall --all [-g]
214
+ ```
215
+
216
+ ## Repository Metadata
217
+
218
+ `skill-registry.json` records each curated skill's repository-relative
219
+ destination, source, source-relative path, tracked ref and commit, content
220
+ hash, and timestamps. `skill-history.jsonl` contains append-only `add`,
221
+ `update`, and `remove` events.
222
+
223
+ These metadata files belong to the curated repository. The `install` command
224
+ copies only skill directories and does not create registry or history files in
225
+ `.agents/skills`.
226
+
227
+ Version 1 registries are migrated in memory and written as version 2 on the
228
+ next mutation. Legacy entries without enough source provenance remain listable
229
+ and removable, but must be re-added before they can be updated.
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ import type { RegistryEntry } from "./types.js";
3
+ export interface Args {
4
+ command?: "add" | "remove" | "list" | "update" | "install" | "uninstall";
5
+ values: string[];
6
+ all?: boolean;
7
+ global?: boolean;
8
+ }
9
+ export declare function usage(): string;
10
+ export declare function parseArgs(argv: string[]): Args;
11
+ export declare function isCliEntrypoint(moduleUrl: string, argvPath?: string): boolean;
12
+ export declare function formatRegistryList(entries: RegistryEntry[]): string;
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import pc from "picocolors";
6
+ import { resolveInstallTarget, resolveTargetRepo } from "./config.js";
7
+ import { discoverSkills, resolveSource } from "./discovery.js";
8
+ import { discoverInstalledSkills, installSkills, uninstallSkills } from "./installer.js";
9
+ import { addSkills, removeSkills, updateSkills } from "./manager.js";
10
+ import { readRegistry } from "./registry.js";
11
+ import { formatOperationResult, runOperation, selectDiscoveredSkills, selectInstalledSkills, selectRegistrySkills } from "./ui.js";
12
+ export function usage() {
13
+ return `Usage:
14
+ agent-skills add <source>
15
+ agent-skills remove [skills...]
16
+ agent-skills list
17
+ agent-skills update [skills...]
18
+ agent-skills install [-g] [--all]
19
+ agent-skills uninstall [skills...] [-g]
20
+ agent-skills uninstall --all [-g]`;
21
+ }
22
+ export function parseArgs(argv) {
23
+ if (!argv.length)
24
+ return { values: [] };
25
+ if (argv[0] === "--help" || argv[0] === "-h")
26
+ return { values: [] };
27
+ const command = argv[0];
28
+ if (!["add", "remove", "list", "update", "install", "uninstall"].includes(command)) {
29
+ throw new Error(`Unknown command: ${command}`);
30
+ }
31
+ const values = argv.slice(1);
32
+ if (command === "install") {
33
+ const allowed = new Set(["-g", "--all"]);
34
+ const option = values.find((value) => value.startsWith("-") && !allowed.has(value));
35
+ if (option)
36
+ throw new Error(`Unknown option: ${option}`);
37
+ const positional = values.find((value) => !value.startsWith("-"));
38
+ if (positional)
39
+ throw new Error("agent-skills install does not accept arguments.");
40
+ return {
41
+ command: "install",
42
+ values: [],
43
+ all: values.includes("--all"),
44
+ global: values.includes("-g")
45
+ };
46
+ }
47
+ if (command === "uninstall") {
48
+ const allowed = new Set(["-g", "--all"]);
49
+ const option = values.find((value) => value.startsWith("-") && !allowed.has(value));
50
+ if (option)
51
+ throw new Error(`Unknown option: ${option}`);
52
+ const names = values.filter((value) => !value.startsWith("-"));
53
+ const all = values.includes("--all");
54
+ if (all && names.length) {
55
+ throw new Error("agent-skills uninstall does not accept names with --all.");
56
+ }
57
+ return {
58
+ command: "uninstall",
59
+ values: names,
60
+ all,
61
+ global: values.includes("-g")
62
+ };
63
+ }
64
+ const option = values.find((value) => value.startsWith("-"));
65
+ if (option)
66
+ throw new Error(`Unknown option: ${option}`);
67
+ if (command === "add" && values.length !== 1) {
68
+ throw new Error("Usage: agent-skills add <source>");
69
+ }
70
+ if (command === "list" && values.length) {
71
+ throw new Error("agent-skills list does not accept arguments.");
72
+ }
73
+ return { command: command, values };
74
+ }
75
+ export function isCliEntrypoint(moduleUrl, argvPath) {
76
+ if (!argvPath)
77
+ return false;
78
+ try {
79
+ return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(argvPath);
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ export function formatRegistryList(entries) {
86
+ if (!entries.length)
87
+ return pc.dim("No project skills found.");
88
+ const rows = [...entries]
89
+ .sort((a, b) => a.name.localeCompare(b.name))
90
+ .map((entry) => ({
91
+ name: entry.name,
92
+ path: entry.path,
93
+ source: entry.source || "-",
94
+ ref: entry.ref || "-",
95
+ commit: entry.commit?.slice(0, 12) || "-",
96
+ updatedAt: entry.updatedAt || "-"
97
+ }));
98
+ const width = (values) => Math.max(...values.map((value) => value.length));
99
+ const widths = {
100
+ name: width(rows.map((row) => row.name)),
101
+ path: width(rows.map((row) => row.path)),
102
+ source: width(rows.map((row) => row.source)),
103
+ ref: width(rows.map((row) => row.ref)),
104
+ commit: width(rows.map((row) => row.commit))
105
+ };
106
+ const lines = rows.map((row) => [
107
+ pc.cyan(row.name.padEnd(widths.name)),
108
+ pc.dim(row.path.padEnd(widths.path)),
109
+ `${pc.dim("Source:")} ${row.source.padEnd(widths.source)}`,
110
+ `${pc.dim("Ref:")} ${row.ref.padEnd(widths.ref)}`,
111
+ `${pc.dim("Commit:")} ${row.commit.padEnd(widths.commit)}`,
112
+ `${pc.dim("Updated:")} ${row.updatedAt}`
113
+ ].join(" "));
114
+ return [pc.bold("Project Skills"), "", ...lines, ""].join("\n");
115
+ }
116
+ function printResults(results) {
117
+ for (const result of results) {
118
+ console.log(formatOperationResult(result));
119
+ }
120
+ }
121
+ async function main() {
122
+ const args = parseArgs(process.argv.slice(2));
123
+ if (!args.command) {
124
+ console.log(usage());
125
+ return;
126
+ }
127
+ const interactive = Boolean(process.stdout.isTTY);
128
+ if (args.command === "install") {
129
+ const repo = resolveTargetRepo();
130
+ const source = resolveSource(join(repo, "skills"));
131
+ try {
132
+ const discovered = discoverSkills(source);
133
+ if (!discovered.length)
134
+ throw new Error("No skills found in repository.");
135
+ let selected = discovered;
136
+ if (!args.all) {
137
+ if (!process.stdin.isTTY) {
138
+ throw new Error("Interactive skill selection requires a TTY. Use --all for unattended installation.");
139
+ }
140
+ selected = await selectDiscoveredSkills(discovered, "install");
141
+ if (!selected.length)
142
+ return;
143
+ }
144
+ const target = resolveInstallTarget({ global: args.global });
145
+ const count = selected.length;
146
+ printResults(runOperation(`Installing ${count} skill${count === 1 ? "" : "s"}...`, `Installed ${count} skill${count === 1 ? "" : "s"}`, interactive, () => installSkills(target, selected)));
147
+ }
148
+ finally {
149
+ source.cleanup();
150
+ }
151
+ return;
152
+ }
153
+ if (args.command === "uninstall") {
154
+ const target = resolveInstallTarget({ global: args.global });
155
+ const installed = discoverInstalledSkills(target);
156
+ if (!installed.length)
157
+ throw new Error(`No installed skills found in ${target}.`);
158
+ let names = args.all ? installed.map((skill) => skill.name) : args.values;
159
+ if (!args.all && !names.length) {
160
+ if (!process.stdin.isTTY) {
161
+ throw new Error("Interactive skill selection requires a TTY. Specify skills or use --all.");
162
+ }
163
+ names = await selectInstalledSkills(installed);
164
+ if (!names.length)
165
+ return;
166
+ }
167
+ const count = names.length;
168
+ printResults(runOperation(`Uninstalling ${count} skill${count === 1 ? "" : "s"}...`, `Uninstalled ${count} skill${count === 1 ? "" : "s"}`, interactive, () => uninstallSkills(target, names)));
169
+ return;
170
+ }
171
+ const repo = resolveTargetRepo();
172
+ if (args.command === "list") {
173
+ console.log(formatRegistryList(Object.values(readRegistry(repo).skills)));
174
+ return;
175
+ }
176
+ if (args.command === "remove") {
177
+ let names = args.values;
178
+ if (!names.length) {
179
+ if (!process.stdin.isTTY) {
180
+ throw new Error("No skills specified and interactive selection is unavailable.");
181
+ }
182
+ names = await selectRegistrySkills(Object.values(readRegistry(repo).skills));
183
+ if (!names.length)
184
+ return;
185
+ }
186
+ const count = names.length;
187
+ printResults(runOperation(`Removing ${count} skill${count === 1 ? "" : "s"}...`, `Removed ${count} skill${count === 1 ? "" : "s"}`, interactive, () => removeSkills(repo, names)));
188
+ return;
189
+ }
190
+ if (args.command === "update") {
191
+ const count = args.values.length || Object.keys(readRegistry(repo).skills).length;
192
+ printResults(runOperation(`Updating ${count} skill${count === 1 ? "" : "s"}...`, `Checked ${count} skill${count === 1 ? "" : "s"}`, interactive, (progress) => updateSkills(repo, args.values, (name, index, total) => {
193
+ progress.message(`Updating ${name} (${index}/${total})...`);
194
+ })));
195
+ return;
196
+ }
197
+ const source = resolveSource(args.values[0]);
198
+ try {
199
+ const discovered = discoverSkills(source);
200
+ if (!discovered.length)
201
+ throw new Error("No skills found in source.");
202
+ let selected = discovered;
203
+ if (discovered.length > 1) {
204
+ if (!process.stdin.isTTY) {
205
+ throw new Error(`Source contains ${discovered.length} skills; interactive selection requires a TTY. Use a direct skill URL or path.`);
206
+ }
207
+ selected = await selectDiscoveredSkills(discovered);
208
+ if (!selected.length)
209
+ return;
210
+ }
211
+ const count = selected.length;
212
+ printResults(runOperation(`Adding ${count} skill${count === 1 ? "" : "s"}...`, `Added ${count} skill${count === 1 ? "" : "s"}`, interactive, () => addSkills({ repo, source, selected })));
213
+ }
214
+ finally {
215
+ source.cleanup();
216
+ }
217
+ }
218
+ if (isCliEntrypoint(import.meta.url, process.argv[1])) {
219
+ main().catch((error) => {
220
+ console.error(error instanceof Error ? error.message : String(error));
221
+ process.exitCode = 1;
222
+ });
223
+ }
224
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function resolveTargetRepo(options?: {
2
+ cwd?: string;
3
+ env?: NodeJS.ProcessEnv;
4
+ }): string;
5
+ export declare function resolveInstallTarget(options?: {
6
+ cwd?: string;
7
+ home?: string;
8
+ global?: boolean;
9
+ }): string;
@@ -0,0 +1,14 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ export function resolveTargetRepo(options = {}) {
4
+ const cwd = options.cwd ?? process.cwd();
5
+ const configured = (options.env ?? process.env).AGENT_SKILLS_REPO;
6
+ return resolve(cwd, configured || ".");
7
+ }
8
+ export function resolveInstallTarget(options = {}) {
9
+ const root = options.global
10
+ ? options.home ?? homedir()
11
+ : options.cwd ?? process.cwd();
12
+ return join(root, ".agents", "skills");
13
+ }
14
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,iBAAiB,CAAC,UAG9B,EAAE;IACJ,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC;IAClE,OAAO,OAAO,CAAC,GAAG,EAAE,UAAU,IAAI,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAIjC,EAAE;IACJ,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM;QACzB,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE;QAC3B,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import type { DiscoveredSkill, ResolvedSource } from "./types.js";
3
+ export interface ParsedSource {
4
+ type: "git" | "local";
5
+ normalized: string;
6
+ cloneUrl?: string;
7
+ ref?: string;
8
+ directPath?: string;
9
+ localPath?: string;
10
+ }
11
+ export declare function parseSource(source: string, cwd?: string): ParsedSource;
12
+ export declare function resolveSource(source: string, options?: {
13
+ cwd?: string;
14
+ execute?: typeof execFileSync;
15
+ }): ResolvedSource;
16
+ export declare function discoverSkills(source: ResolvedSource): DiscoveredSkill[];