agentic-awesome-skills 14.0.0 → 14.2.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 +13 -9
- package/package.json +3 -2
- package/tools/bin/install.js +116 -31
- package/tools/lib/skill-utils.js +10 -0
package/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
<!-- registry-sync: version=14.
|
|
1
|
+
<!-- registry-sync: version=14.2.0; skills=1946; stars=42926; updated_at=2026-07-12T05:22:55+00:00 -->
|
|
2
2
|
[](https://github.com/sickn33/agentic-awesome-skills)
|
|
3
3
|
|
|
4
|
-
# 🌌 Agentic Awesome Skills: 1,
|
|
4
|
+
# 🌌 Agentic Awesome Skills: 1,946+ Agentic Skills for Claude Code, Gemini CLI, Cursor, Autohand Code, Copilot & More
|
|
5
5
|
|
|
6
|
-
> **Installable GitHub library of 1,
|
|
6
|
+
> **Installable GitHub library of 1,946+ agentic skills for Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, and other AI coding assistants.**
|
|
7
7
|
|
|
8
8
|
Agentic Awesome Skills is an installable GitHub library and npm installer for reusable `SKILL.md` playbooks. It is designed for Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, Kiro, OpenCode, GitHub Copilot, and other AI coding assistants that benefit from structured operating instructions. Instead of collecting one-off prompt snippets, this repository gives you a searchable, installable catalog of skills, bundles, workflows, plugin-safe distributions, and practical docs that help agents perform recurring tasks with better context, stronger constraints, and clearer outputs.
|
|
9
9
|
|
|
@@ -13,7 +13,7 @@ You can use this repo to install a broad multi-tool skill library, start from fo
|
|
|
13
13
|
|
|
14
14
|
The canonical project page is the GitHub repository at <https://github.com/sickn33/agentic-awesome-skills>; the hosted catalog is a companion discovery surface for search, plugins, and skill detail pages.
|
|
15
15
|
|
|
16
|
-
**Start here:** [Install in 1 minute](#installation) · [Recommended plugins](#recommended-specialized-plugins) · [Compare plugin packs](https://sickn33.github.io/agentic-awesome-skills/plugins) · [Choose your tool](#choose-your-tool) · [📚 Browse 1,
|
|
16
|
+
**Start here:** [Install in 1 minute](#installation) · [Recommended plugins](#recommended-specialized-plugins) · [Compare plugin packs](https://sickn33.github.io/agentic-awesome-skills/plugins) · [Choose your tool](#choose-your-tool) · [📚 Browse 1,946+ Skills](#browse-1946-skills) · [Bundles & workflows](#bundles--workflows) · [Support the project](#support-the-project)
|
|
17
17
|
|
|
18
18
|
[](https://github.com/sickn33/agentic-awesome-skills/stargazers)
|
|
19
19
|
[](https://x.com/AASkills_)
|
|
@@ -30,13 +30,13 @@ The canonical project page is the GitHub repository at <https://github.com/sickn
|
|
|
30
30
|
[](https://github.com/opencode-ai/opencode)
|
|
31
31
|
[](https://github.com/sickn33/agentic-awesome-skills)
|
|
32
32
|
|
|
33
|
-
**Current release: V14.
|
|
33
|
+
**Current release: V14.2.0.** Trusted by 43k+ GitHub stargazers, this repository combines official and community skill collections with bundles, workflows, installation paths, and docs that help you go from first install to daily use quickly.
|
|
34
34
|
|
|
35
35
|
## Why This Repo
|
|
36
36
|
|
|
37
37
|
- **Installable, not just inspirational**: use `npx agentic-awesome-skills` to put skills where your tool expects them.
|
|
38
38
|
- **Built for major agent workflows**: Claude Code, Cursor, Codex CLI, Autohand Code, Gemini CLI, Antigravity, Kiro, OpenCode, Copilot, and more.
|
|
39
|
-
- **Broad coverage with real utility**: 1,
|
|
39
|
+
- **Broad coverage with real utility**: 1,946+ skills across development, testing, security, infrastructure, product, and marketing.
|
|
40
40
|
- **Focused by default**: specialized plugins help you start with the web, security, data, docs, DevOps, QA, OSS, or agent/MCP workflows you actually need.
|
|
41
41
|
- **Useful whether you want breadth or curation**: install the full catalog, choose a specialized plugin, start with bundles, or compare alternatives before installing.
|
|
42
42
|
|
|
@@ -48,7 +48,7 @@ The canonical project page is the GitHub repository at <https://github.com/sickn
|
|
|
48
48
|
- [Choose Your Tool](#choose-your-tool)
|
|
49
49
|
- [Quick FAQ](#quick-faq)
|
|
50
50
|
- [Bundles & Workflows](#bundles--workflows)
|
|
51
|
-
- [Browse 1,
|
|
51
|
+
- [Browse 1,946+ Skills](#browse-1946-skills)
|
|
52
52
|
- [Troubleshooting](#troubleshooting)
|
|
53
53
|
- [Stable Skills Manifest v1](#stable-skills-manifest-v1)
|
|
54
54
|
- [Support the Project](#support-the-project)
|
|
@@ -159,7 +159,7 @@ Use the table above for install targets. Use specialized plugins when you are ch
|
|
|
159
159
|
|
|
160
160
|
### What is Agentic Awesome Skills?
|
|
161
161
|
|
|
162
|
-
**Agentic Awesome Skills** (Release 14.
|
|
162
|
+
**Agentic Awesome Skills** (Release 14.2.0) is a large, installable skill library for AI coding assistants. It packages 1,946+ reusable `SKILL.md` playbooks, specialized plugins, bundles, workflows, generated catalogs, and a CLI installer so Claude Code, Codex CLI, Autohand Code, Cursor, Gemini CLI, Antigravity, and similar tools can reuse proven operating instructions instead of one-off prompts.
|
|
163
163
|
|
|
164
164
|
### How do I install it?
|
|
165
165
|
|
|
@@ -224,7 +224,7 @@ If Antigravity starts hitting context limits with too many active skills, the ac
|
|
|
224
224
|
|
|
225
225
|
If you use OpenCode or another `.agents/skills` host, prefer a reduced install up front instead of copying the full library into a context-sensitive runtime. The installer now supports `--risk`, `--category`, and `--tags` so you can keep the installed set narrow.
|
|
226
226
|
|
|
227
|
-
## Browse 1,
|
|
227
|
+
## Browse 1,946+ Skills
|
|
228
228
|
|
|
229
229
|
Use the root repo as a landing page, then jump into the deeper surface that matches your intent.
|
|
230
230
|
|
|
@@ -329,6 +329,7 @@ Key source families include:
|
|
|
329
329
|
|
|
330
330
|
### Official Sources
|
|
331
331
|
|
|
332
|
+
- **[aislon/uizze-mcp](https://github.com/aislon/uizze-mcp)**: Official source for the `uizze-ui-research` skill and UIZZE MCP-assisted UI research workflows.
|
|
332
333
|
- **[anthropics/skills](https://github.com/anthropics/skills)**: Official Anthropic skills repository - Document manipulation (DOCX, PDF, PPTX, XLSX), Brand Guidelines, Internal Communications.
|
|
333
334
|
- **[anthropics/claude-cookbooks](https://github.com/anthropics/claude-cookbooks)**: Official notebooks and recipes for building with Claude.
|
|
334
335
|
- **[remotion-dev/skills](https://github.com/remotion-dev/skills)**: Official Remotion skills - Video creation in React with 28 modular rules.
|
|
@@ -363,6 +364,9 @@ Key source families include:
|
|
|
363
364
|
|
|
364
365
|
### Community Contributors
|
|
365
366
|
|
|
367
|
+
- **[supernovae-st/nika-agents](https://github.com/supernovae-st/nika-agents)**: Official upstream source for the `nika` skill and its deterministic, budget-aware AI workflow runner (MIT skill content; AGPL-3.0 engine).
|
|
368
|
+
- **[atdy/maoxuan-product-agent](https://github.com/atdy/maoxuan-product-agent)**: Source for the `product-decision-agent` skill - Chinese-first product judgment across prioritization, growth, operations, data, delivery, and cross-functional collaboration, with 36 tested scenarios (MIT).
|
|
369
|
+
- **[hafiz-actyte/idea-autopsy](https://github.com/hafiz-actyte/idea-autopsy)**: Source for the `idea-autopsy` skill - business-idea validation that hunts the one sentence that kills an idea before you build: kill-list check, five hard filters, free-AI one-prompt test, and live ad-market verification (MIT).
|
|
366
370
|
- **[cruisekkk/trading-ledger](https://github.com/cruisekkk/trading-ledger)**: Source for the `trading-ledger` skill - decision-quality trade journaling that captures entry thesis, plan, and emotion into the user's own Notion database (MIT).
|
|
367
371
|
- **[cruisekkk/time-ledger](https://github.com/cruisekkk/time-ledger)**: Source for the `time-ledger` skill - natural-language time tracking parsed into the user's own Notion database with ask-instead-of-guessing reconciliation (MIT).
|
|
368
372
|
- **[mattpocock/skills](https://github.com/mattpocock/skills)**: Source for 17 Matt Pocock workflow skills - codebase design, TDD, bug diagnosis, triage, PRDs, issues, prototyping, handoff, teaching, and skill-writing guidance (MIT).
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentic-awesome-skills",
|
|
3
|
-
"version": "14.
|
|
4
|
-
"description": "1,
|
|
3
|
+
"version": "14.2.0",
|
|
4
|
+
"description": "1,946+ agentic skills for Claude Code, Gemini CLI, Cursor, Antigravity & more. Installer CLI.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"validate": "node tools/scripts/run-python.js tools/scripts/validate_skills.py",
|
|
8
|
+
"validate:glossary": "bash scripts/validate-glossary.sh",
|
|
8
9
|
"validate:strict": "node tools/scripts/run-python.js tools/scripts/validate_skills.py --strict",
|
|
9
10
|
"audit:skills": "node tools/scripts/run-python.js tools/scripts/audit_skills.py",
|
|
10
11
|
"audit:skills:strict": "node tools/scripts/run-python.js tools/scripts/audit_skills.py --strict",
|
package/tools/bin/install.js
CHANGED
|
@@ -33,14 +33,15 @@ function resolveDir(p) {
|
|
|
33
33
|
return path.resolve(root, ...sanitizedSegments);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
function parseArgs() {
|
|
37
|
-
const a =
|
|
36
|
+
function parseArgs(argv = process.argv.slice(2)) {
|
|
37
|
+
const a = argv;
|
|
38
38
|
let pathArg = null;
|
|
39
39
|
let versionArg = null;
|
|
40
40
|
let tagArg = null;
|
|
41
41
|
let riskArg = null;
|
|
42
42
|
let categoryArg = null;
|
|
43
43
|
let tagsArg = null;
|
|
44
|
+
let versionInfo = false;
|
|
44
45
|
let cursor = false,
|
|
45
46
|
claude = false,
|
|
46
47
|
gemini = false,
|
|
@@ -51,28 +52,22 @@ function parseArgs() {
|
|
|
51
52
|
|
|
52
53
|
for (let i = 0; i < a.length; i++) {
|
|
53
54
|
if (a[i] === "--help" || a[i] === "-h") return { help: true };
|
|
54
|
-
if (a[i] === "--
|
|
55
|
-
|
|
55
|
+
if (a[i] === "--version") {
|
|
56
|
+
versionInfo = true;
|
|
56
57
|
continue;
|
|
57
58
|
}
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (a[i] === "--category" && a[i + 1]) {
|
|
71
|
-
categoryArg = a[++i];
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
if (a[i] === "--tags" && a[i + 1]) {
|
|
75
|
-
tagsArg = a[++i];
|
|
59
|
+
if (["--path", "--release", "--tag", "--risk", "--category", "--tags"].includes(a[i])) {
|
|
60
|
+
const value = a[i + 1];
|
|
61
|
+
if (!value || value.startsWith("--")) {
|
|
62
|
+
throw new Error(`Option ${a[i]} requires a value.`);
|
|
63
|
+
}
|
|
64
|
+
if (a[i] === "--path") pathArg = value;
|
|
65
|
+
if (a[i] === "--release") versionArg = value;
|
|
66
|
+
if (a[i] === "--tag") tagArg = value;
|
|
67
|
+
if (a[i] === "--risk") riskArg = value;
|
|
68
|
+
if (a[i] === "--category") categoryArg = value;
|
|
69
|
+
if (a[i] === "--tags") tagsArg = value;
|
|
70
|
+
i += 1;
|
|
76
71
|
continue;
|
|
77
72
|
}
|
|
78
73
|
if (a[i] === "--cursor") {
|
|
@@ -104,6 +99,7 @@ function parseArgs() {
|
|
|
104
99
|
continue;
|
|
105
100
|
}
|
|
106
101
|
if (a[i] === "install") continue;
|
|
102
|
+
throw new Error(`Unknown option or command: ${a[i]}`);
|
|
107
103
|
}
|
|
108
104
|
|
|
109
105
|
return {
|
|
@@ -113,6 +109,7 @@ function parseArgs() {
|
|
|
113
109
|
riskArg,
|
|
114
110
|
categoryArg,
|
|
115
111
|
tagsArg,
|
|
112
|
+
versionInfo,
|
|
116
113
|
cursor,
|
|
117
114
|
claude,
|
|
118
115
|
gemini,
|
|
@@ -182,7 +179,8 @@ Options:
|
|
|
182
179
|
--risk <csv> Install only skills matching these risk labels
|
|
183
180
|
--category <csv> Install only skills matching these categories
|
|
184
181
|
--tags <csv> Install only skills matching these tags
|
|
185
|
-
--version
|
|
182
|
+
--version Print the installer version
|
|
183
|
+
--release <ver> Clone tag v<ver> (e.g. 4.6.0 -> v4.6.0)
|
|
186
184
|
--tag <tag> Clone this tag or branch (e.g. v4.6.0, main)
|
|
187
185
|
|
|
188
186
|
Examples:
|
|
@@ -193,7 +191,7 @@ Examples:
|
|
|
193
191
|
npx agentic-awesome-skills --agy
|
|
194
192
|
npx agentic-awesome-skills --path .agents/skills --category development,backend --risk safe,none
|
|
195
193
|
npx agentic-awesome-skills --path .agents/skills --tags debugging,typescript-legacy-
|
|
196
|
-
npx agentic-awesome-skills --
|
|
194
|
+
npx agentic-awesome-skills --release 4.6.0
|
|
197
195
|
npx agentic-awesome-skills --path ./my-skills
|
|
198
196
|
npx agentic-awesome-skills --claude --codex Install to multiple targets
|
|
199
197
|
`);
|
|
@@ -312,7 +310,14 @@ function assertSafeDestinationPath(dest, destRoot) {
|
|
|
312
310
|
}
|
|
313
311
|
}
|
|
314
312
|
|
|
315
|
-
function copyRecursiveSync(
|
|
313
|
+
function copyRecursiveSync(
|
|
314
|
+
src,
|
|
315
|
+
dest,
|
|
316
|
+
rootDir = src,
|
|
317
|
+
skipGit = true,
|
|
318
|
+
destRoot = dest,
|
|
319
|
+
selectedSkillEntries = null,
|
|
320
|
+
) {
|
|
316
321
|
const stats = fs.lstatSync(src);
|
|
317
322
|
const resolvedSource = stats.isSymbolicLink()
|
|
318
323
|
? resolveSafeRealPath(rootDir, src)
|
|
@@ -324,6 +329,17 @@ function copyRecursiveSync(src, dest, rootDir = src, skipGit = true, destRoot =
|
|
|
324
329
|
}
|
|
325
330
|
|
|
326
331
|
const resolvedStats = fs.statSync(resolvedSource);
|
|
332
|
+
const relativeSource = path.relative(rootDir, resolvedSource);
|
|
333
|
+
if (
|
|
334
|
+
selectedSkillEntries &&
|
|
335
|
+
relativeSource &&
|
|
336
|
+
relativeSource !== "." &&
|
|
337
|
+
resolvedStats.isDirectory() &&
|
|
338
|
+
fs.existsSync(path.join(resolvedSource, "SKILL.md")) &&
|
|
339
|
+
!selectedSkillEntries.has(path.normalize(relativeSource))
|
|
340
|
+
) {
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
327
343
|
if (fs.existsSync(dest) && fs.lstatSync(dest).isSymbolicLink()) {
|
|
328
344
|
throw new Error(`Skipping unsafe destination symlink: ${dest}`);
|
|
329
345
|
}
|
|
@@ -344,6 +360,7 @@ function copyRecursiveSync(src, dest, rootDir = src, skipGit = true, destRoot =
|
|
|
344
360
|
rootDir,
|
|
345
361
|
skipGit,
|
|
346
362
|
destRoot,
|
|
363
|
+
selectedSkillEntries,
|
|
347
364
|
);
|
|
348
365
|
}
|
|
349
366
|
} finally {
|
|
@@ -354,6 +371,56 @@ function copyRecursiveSync(src, dest, rootDir = src, skipGit = true, destRoot =
|
|
|
354
371
|
}
|
|
355
372
|
}
|
|
356
373
|
|
|
374
|
+
function replaceManagedEntry(
|
|
375
|
+
src,
|
|
376
|
+
dest,
|
|
377
|
+
rootDir,
|
|
378
|
+
skipGit,
|
|
379
|
+
targetRoot,
|
|
380
|
+
selectedSkillEntries = null,
|
|
381
|
+
) {
|
|
382
|
+
if (!fs.existsSync(targetRoot)) {
|
|
383
|
+
fs.mkdirSync(targetRoot, { recursive: true });
|
|
384
|
+
}
|
|
385
|
+
assertSafeDestinationPath(dest, targetRoot);
|
|
386
|
+
const stageRoot = fs.mkdtempSync(path.join(targetRoot, ".antigravity-stage-"));
|
|
387
|
+
const stagedEntry = path.join(stageRoot, "entry");
|
|
388
|
+
const backupEntry = path.join(stageRoot, "previous");
|
|
389
|
+
let movedPreviousEntry = false;
|
|
390
|
+
|
|
391
|
+
try {
|
|
392
|
+
copyRecursiveSync(
|
|
393
|
+
src,
|
|
394
|
+
stagedEntry,
|
|
395
|
+
rootDir,
|
|
396
|
+
skipGit,
|
|
397
|
+
stageRoot,
|
|
398
|
+
selectedSkillEntries,
|
|
399
|
+
);
|
|
400
|
+
if (!fs.existsSync(stagedEntry)) {
|
|
401
|
+
throw new Error(`Unable to stage managed install entry: ${src}`);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
if (fs.existsSync(dest)) {
|
|
405
|
+
assertSafeDestinationPath(dest, targetRoot);
|
|
406
|
+
fs.renameSync(dest, backupEntry);
|
|
407
|
+
movedPreviousEntry = true;
|
|
408
|
+
}
|
|
409
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
410
|
+
fs.renameSync(stagedEntry, dest);
|
|
411
|
+
if (movedPreviousEntry) {
|
|
412
|
+
fs.rmSync(backupEntry, { recursive: true, force: true });
|
|
413
|
+
}
|
|
414
|
+
} catch (error) {
|
|
415
|
+
if (movedPreviousEntry && fs.existsSync(backupEntry) && !fs.existsSync(dest)) {
|
|
416
|
+
fs.renameSync(backupEntry, dest);
|
|
417
|
+
}
|
|
418
|
+
throw error;
|
|
419
|
+
} finally {
|
|
420
|
+
fs.rmSync(stageRoot, { recursive: true, force: true });
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
357
424
|
/** Copy contents of repo's skills/ into target so each skill is target/skill-name/ (for Claude Code etc.). */
|
|
358
425
|
function getInstallEntries(tempDir, selectors = buildInstallSelectors({})) {
|
|
359
426
|
const repoSkills = path.join(tempDir, "skills");
|
|
@@ -381,18 +448,22 @@ function getInstallEntries(tempDir, selectors = buildInstallSelectors({})) {
|
|
|
381
448
|
|
|
382
449
|
function installSkillsIntoTarget(tempDir, target, installEntries) {
|
|
383
450
|
const repoSkills = path.join(tempDir, "skills");
|
|
451
|
+
const selectedSkillEntries = new Set(
|
|
452
|
+
installEntries
|
|
453
|
+
.filter((entry) => entry !== "docs")
|
|
454
|
+
.map(normalizeSourceEntry),
|
|
455
|
+
);
|
|
384
456
|
installEntries.forEach((name) => {
|
|
385
457
|
const destName = normalizeInstallEntry(name);
|
|
386
458
|
if (destName === "docs") {
|
|
387
459
|
const repoDocs = path.join(tempDir, "docs");
|
|
388
460
|
const docsDest = path.join(target, "docs");
|
|
389
|
-
|
|
390
|
-
copyRecursiveSync(repoDocs, docsDest, repoDocs, true, target);
|
|
461
|
+
replaceManagedEntry(repoDocs, docsDest, repoDocs, true, target);
|
|
391
462
|
return;
|
|
392
463
|
}
|
|
393
464
|
const src = path.join(repoSkills, normalizeSourceEntry(name));
|
|
394
465
|
const dest = path.join(target, destName);
|
|
395
|
-
|
|
466
|
+
replaceManagedEntry(src, dest, repoSkills, true, target, selectedSkillEntries);
|
|
396
467
|
});
|
|
397
468
|
}
|
|
398
469
|
|
|
@@ -630,8 +701,8 @@ function installForTarget(tempDir, target, selectors = buildInstallSelectors({})
|
|
|
630
701
|
const installEntries = getInstallEntries(tempDir, selectors);
|
|
631
702
|
const managedEntries = getManagedEntries(installEntries, target);
|
|
632
703
|
const previousEntries = readInstallManifest(target.path);
|
|
633
|
-
pruneRemovedEntries(target.path, previousEntries, managedEntries);
|
|
634
704
|
installSkillsIntoTarget(tempDir, target.path, installEntries);
|
|
705
|
+
pruneRemovedEntries(target.path, previousEntries, managedEntries);
|
|
635
706
|
writeInstallManifest(target.path, managedEntries);
|
|
636
707
|
console.log(` ✓ Installed to ${target.path}`);
|
|
637
708
|
}
|
|
@@ -679,7 +750,14 @@ function getPostInstallMessages(targets, selectors = buildInstallSelectors({}))
|
|
|
679
750
|
}
|
|
680
751
|
|
|
681
752
|
function main() {
|
|
682
|
-
|
|
753
|
+
let opts;
|
|
754
|
+
try {
|
|
755
|
+
opts = parseArgs();
|
|
756
|
+
} catch (error) {
|
|
757
|
+
console.error(`Error: ${error.message}`);
|
|
758
|
+
process.exitCode = 1;
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
683
761
|
const selectors = buildInstallSelectors(opts);
|
|
684
762
|
const ref = resolveInstallRef(opts);
|
|
685
763
|
|
|
@@ -688,8 +766,13 @@ function main() {
|
|
|
688
766
|
return;
|
|
689
767
|
}
|
|
690
768
|
|
|
769
|
+
if (opts.versionInfo) {
|
|
770
|
+
console.log(packageMetadata.version);
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
|
|
691
774
|
const targets = getTargets(opts);
|
|
692
|
-
if (!targets.length || !HOME) {
|
|
775
|
+
if (!targets.length || (!HOME && !opts.pathArg)) {
|
|
693
776
|
console.error(
|
|
694
777
|
"Could not resolve home directory. Use --path <absolute-path>.",
|
|
695
778
|
);
|
|
@@ -735,6 +818,7 @@ if (require.main === module) {
|
|
|
735
818
|
|
|
736
819
|
module.exports = {
|
|
737
820
|
copyRecursiveSync,
|
|
821
|
+
replaceManagedEntry,
|
|
738
822
|
getPostInstallMessages,
|
|
739
823
|
buildCloneArgs,
|
|
740
824
|
buildInstallSelectors,
|
|
@@ -748,6 +832,7 @@ module.exports = {
|
|
|
748
832
|
matchesInstallSelectors,
|
|
749
833
|
normalizeInstallEntry,
|
|
750
834
|
parseSelectorArg,
|
|
835
|
+
parseArgs,
|
|
751
836
|
pruneRemovedEntries,
|
|
752
837
|
readInstallManifest,
|
|
753
838
|
resolveInstallRef,
|
package/tools/lib/skill-utils.js
CHANGED
|
@@ -158,6 +158,11 @@ function readSkill(skillDir, skillId) {
|
|
|
158
158
|
tags = tags.filter(Boolean);
|
|
159
159
|
const category = typeof data.category === 'string' ? data.category.trim() : '';
|
|
160
160
|
const risk = typeof data.risk === 'string' ? data.risk.trim() : '';
|
|
161
|
+
const source = typeof data.source === 'string' ? data.source.trim() : '';
|
|
162
|
+
const sourceType = typeof data.source_type === 'string' ? data.source_type.trim() : '';
|
|
163
|
+
const sourceRepo = typeof data.source_repo === 'string' ? data.source_repo.trim() : '';
|
|
164
|
+
const license = typeof data.license === 'string' ? data.license.trim() : '';
|
|
165
|
+
const licenseSource = typeof data.license_source === 'string' ? data.license_source.trim() : '';
|
|
161
166
|
|
|
162
167
|
return {
|
|
163
168
|
id: skillId,
|
|
@@ -165,6 +170,11 @@ function readSkill(skillDir, skillId) {
|
|
|
165
170
|
description,
|
|
166
171
|
category,
|
|
167
172
|
risk,
|
|
173
|
+
source,
|
|
174
|
+
sourceType,
|
|
175
|
+
sourceRepo,
|
|
176
|
+
license,
|
|
177
|
+
licenseSource,
|
|
168
178
|
tags,
|
|
169
179
|
path: skillPath,
|
|
170
180
|
content,
|