skillshop 2.0.0 → 2.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 +273 -100
- package/agents-content/000_communication-writing.block.md +11 -0
- package/agents-content/001_external-actions.block.md +9 -0
- package/agents-content/AGENTS.md +11 -0
- package/package.json +6 -3
- package/skills-content/architecture-scanner/SKILL.md +274 -0
- package/skills-content/architecture-scanner/files.json +10 -0
- package/skills-content/architecture-scanner/scan.sh +823 -0
- package/skills-content/change-review/SKILL.md +76 -0
- package/skills-content/change-review/agents/openai.yaml +4 -0
- package/skills-content/changelog/SKILL.md +99 -0
- package/skills-content/changeset/changeset.md +80 -0
- package/skills-content/code-buddy/SKILL.md +136 -0
- package/skills-content/design-system-catalog/SKILL.md +106 -0
- package/skills-content/design-system-catalog/extract-components.mjs +441 -0
- package/skills-content/design-system-catalog/generate-catalog.sh +255 -0
- package/skills-content/flare/SKILL.md +96 -0
- package/skills-content/grilling/SKILL.md +31 -0
- package/skills-content/install-sigmap/SKILL.md +97 -0
- package/skills-content/one-shot/SKILL.md +51 -0
- package/skills-content/release/SKILL.md +128 -0
- package/skills-content/shadow-clone/SKILL.md +228 -0
- package/skills-content/shadow-clone/extract-signatures.mjs +202 -0
- package/skills-content/shadow-clone/scan-repo.mjs +343 -0
- package/skills-content/ship/SKILL.md +95 -0
- package/skills-content/shots/SKILL.md +89 -0
- package/skills-content/shots/agents/openai.yaml +4 -0
- package/skills-content/skillshop/SKILL.md +157 -0
- package/skills-content/skillz/SKILL.md +15 -0
- package/skills-content/transcript-clean/SKILL.md +55 -0
- package/skills-content/transcript-edit/SKILL.md +80 -0
- package/skills-content/vitest/GENERATION.md +5 -0
- package/skills-content/vitest/SKILL.md +52 -0
- package/skills-content/vitest/references/advanced-environments.md +264 -0
- package/skills-content/vitest/references/advanced-projects.md +300 -0
- package/skills-content/vitest/references/advanced-type-testing.md +237 -0
- package/skills-content/vitest/references/advanced-vi.md +249 -0
- package/skills-content/vitest/references/core-cli.md +166 -0
- package/skills-content/vitest/references/core-config.md +174 -0
- package/skills-content/vitest/references/core-describe.md +193 -0
- package/skills-content/vitest/references/core-expect.md +219 -0
- package/skills-content/vitest/references/core-hooks.md +244 -0
- package/skills-content/vitest/references/core-test-api.md +233 -0
- package/skills-content/vitest/references/features-concurrency.md +250 -0
- package/skills-content/vitest/references/features-context.md +238 -0
- package/skills-content/vitest/references/features-coverage.md +207 -0
- package/skills-content/vitest/references/features-filtering.md +211 -0
- package/skills-content/vitest/references/features-mocking.md +265 -0
- package/skills-content/vitest/references/features-snapshots.md +207 -0
- package/skills-content/workleaf/SKILL.md +77 -0
- package/skills-content/worklog/SKILL.md +145 -0
- package/skills-content/worklog/references/summary-format.md +114 -0
- package/skills-content/worktree/SKILL.md +71 -0
- package/src/agents-instructions.js +256 -0
- package/src/cli.js +87 -23
- package/src/import.js +12 -7
- package/src/index.js +1 -0
- package/src/legacy-agents-content.js +36 -0
- package/src/legacy-cli.js +1822 -0
- package/src/library.js +9 -0
- package/src/specifier.js +11 -0
- package/src/user-install.js +48 -0
package/src/library.js
CHANGED
|
@@ -231,6 +231,15 @@ export function validateSkillLibrary(root = process.cwd()) {
|
|
|
231
231
|
if (typeof pkg.name !== 'string' || !pkg.name.trim()) throw new Error('package.json must have a package name');
|
|
232
232
|
const library = readSkillLibrary(packageRoot, { required: true });
|
|
233
233
|
const skills = validateExports(packageRoot, pkg, library);
|
|
234
|
+
const userInstall = pkg.skillshop?.userInstall ?? [];
|
|
235
|
+
if (!Array.isArray(userInstall) || new Set(userInstall).size !== userInstall.length ||
|
|
236
|
+
userInstall.some((specifier) => {
|
|
237
|
+
try {
|
|
238
|
+
return normalizeSkillSpecifier(specifier) !== specifier || !Object.hasOwn(library.exports, specifier);
|
|
239
|
+
} catch { return true; }
|
|
240
|
+
})) {
|
|
241
|
+
throw new Error('package.json#skillshop.userInstall must list unique exported skill specifiers');
|
|
242
|
+
}
|
|
234
243
|
return { packageName: pkg.name, library, skills };
|
|
235
244
|
}
|
|
236
245
|
|
package/src/specifier.js
CHANGED
|
@@ -14,3 +14,14 @@ export function normalizeSkillSpecifier(value) {
|
|
|
14
14
|
export function skillName(value) {
|
|
15
15
|
return parseSkillSpecifier(value).name;
|
|
16
16
|
}
|
|
17
|
+
|
|
18
|
+
export function parseLibrarySkillReference(value) {
|
|
19
|
+
if (typeof value !== 'string') throw new TypeError('library skill reference must be a string');
|
|
20
|
+
const separator = value.lastIndexOf(':');
|
|
21
|
+
if (separator <= 0 || separator === value.length - 1) {
|
|
22
|
+
throw new Error(`Invalid library skill reference: ${value}. Expected <library>:<skill>`);
|
|
23
|
+
}
|
|
24
|
+
const library = value.slice(0, separator);
|
|
25
|
+
const skill = parseSkillSpecifier(`skill:${value.slice(separator + 1)}`);
|
|
26
|
+
return Object.freeze({ library, specifier: skill.specifier, name: skill.name });
|
|
27
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { importSkill } from './import.js';
|
|
5
|
+
import { normalizeSkillSpecifier, skillName } from './specifier.js';
|
|
6
|
+
|
|
7
|
+
function declaredUserSkills(packageRoot) {
|
|
8
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
9
|
+
const declared = pkg.skillshop?.userInstall ?? [];
|
|
10
|
+
if (!Array.isArray(declared) || new Set(declared).size !== declared.length ||
|
|
11
|
+
declared.some((specifier) => {
|
|
12
|
+
try { return normalizeSkillSpecifier(specifier) !== specifier; }
|
|
13
|
+
catch { return true; }
|
|
14
|
+
})) {
|
|
15
|
+
throw new Error('package.json#skillshop.userInstall must list unique skill specifiers');
|
|
16
|
+
}
|
|
17
|
+
return declared;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export async function installUserSkill({
|
|
21
|
+
library,
|
|
22
|
+
specifier,
|
|
23
|
+
cwd = process.cwd(),
|
|
24
|
+
userSkillsDir = path.join(os.homedir(), '.agents', 'skills'),
|
|
25
|
+
}) {
|
|
26
|
+
const normalized = normalizeSkillSpecifier(specifier);
|
|
27
|
+
return importSkill({
|
|
28
|
+
library,
|
|
29
|
+
specifier: normalized,
|
|
30
|
+
targetDir: path.resolve(userSkillsDir, skillName(normalized)),
|
|
31
|
+
cwd,
|
|
32
|
+
overwrite: true,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export async function installDeclaredUserSkills({
|
|
37
|
+
library = process.cwd(),
|
|
38
|
+
userSkillsDir,
|
|
39
|
+
cwd = process.cwd(),
|
|
40
|
+
} = {}) {
|
|
41
|
+
const packageRoot = path.resolve(cwd, library);
|
|
42
|
+
const declared = declaredUserSkills(packageRoot);
|
|
43
|
+
const results = [];
|
|
44
|
+
for (const specifier of declared) {
|
|
45
|
+
results.push(await installUserSkill({ library: packageRoot, specifier, cwd, userSkillsDir }));
|
|
46
|
+
}
|
|
47
|
+
return results;
|
|
48
|
+
}
|