@ecology91/skills 0.1.5 → 0.1.6

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.
@@ -0,0 +1,45 @@
1
+ {
2
+ "metadata": {
3
+ "pluginRoot": "./skills"
4
+ },
5
+ "plugins": [
6
+ {
7
+ "name": "engineering",
8
+ "source": "./engineering",
9
+ "skills": [
10
+ "./diagnose",
11
+ "./grill-with-docs",
12
+ "./improve-codebase-architecture",
13
+ "./prototype",
14
+ "./setup-agent-skills",
15
+ "./setup-coding-quality-checks",
16
+ "./tdd",
17
+ "./to-issues",
18
+ "./to-prd",
19
+ "./to-qa",
20
+ "./triage",
21
+ "./zoom-out"
22
+ ]
23
+ },
24
+ {
25
+ "name": "productivity",
26
+ "source": "./productivity",
27
+ "skills": [
28
+ "./caveman",
29
+ "./grill-me",
30
+ "./handoff",
31
+ "./write-a-skill"
32
+ ]
33
+ },
34
+ {
35
+ "name": "misc",
36
+ "source": "./misc",
37
+ "skills": [
38
+ "./git-guardrails-opencode",
39
+ "./migrate-to-shoehorn",
40
+ "./scaffold-exercises",
41
+ "./setup-pre-commit"
42
+ ]
43
+ }
44
+ ]
45
+ }
package/README.md CHANGED
@@ -17,6 +17,8 @@ These skills are designed to be small, easy to adapt, and composable. They work
17
17
  npx skills@latest add ecology9191/skills -g
18
18
  ```
19
19
 
20
+ The install menu is grouped by bucket (`engineering`, `productivity`, `misc`). Toggle a whole category or pick individual skills in one screen.
21
+
20
22
  1. Or install from a git checkout or the published npm package:
21
23
 
22
24
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ecology91/skills",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "opencode agent skills for real engineering workflows.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -13,6 +13,7 @@
13
13
  "files": [
14
14
  "bin/",
15
15
  "scripts/",
16
+ ".claude-plugin/",
16
17
  "skills/engineering/",
17
18
  "skills/productivity/",
18
19
  "skills/misc/",
@@ -40,11 +41,12 @@
40
41
  "access": "public"
41
42
  },
42
43
  "scripts": {
43
- "typecheck": "node --check bin/install.mjs && node --check bin/collect-skills.mjs && node --check bin/prompt-skills.mjs && node --check bin/resolve-selection.mjs && node --check bin/resolve-selection.test.mjs && node --check scripts/verify-package-files.mjs",
44
+ "typecheck": "node --check bin/install.mjs && node --check bin/collect-skills.mjs && node --check bin/prompt-skills.mjs && node --check bin/resolve-selection.mjs && node --check bin/resolve-selection.test.mjs && node --check scripts/generate-marketplace.mjs && node --check scripts/verify-marketplace.mjs && node --check scripts/verify-package-files.mjs",
44
45
  "test": "node --test bin/resolve-selection.test.mjs && node bin/install.mjs --dry-run --copy --all",
45
46
  "test:unit": "node --test bin/resolve-selection.test.mjs",
46
47
  "link-skills": "./scripts/link-skills.sh",
47
- "build": "node scripts/verify-package-files.mjs",
48
+ "build": "node scripts/verify-package-files.mjs && node scripts/verify-marketplace.mjs",
49
+ "generate:marketplace": "node scripts/generate-marketplace.mjs",
48
50
  "validate:fast": "npm run typecheck && npm run test",
49
51
  "validate": "npm run validate:fast && npm run build"
50
52
  }
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { collectSkillsByBucket } from "../bin/collect-skills.mjs";
6
+
7
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
8
+ const outPath = path.join(root, ".claude-plugin", "marketplace.json");
9
+
10
+ const catalog = collectSkillsByBucket(root, "/tmp/unused");
11
+
12
+ const manifest = {
13
+ metadata: { pluginRoot: "./skills" },
14
+ plugins: catalog.map((bucket) => ({
15
+ name: bucket.id,
16
+ source: `./${bucket.id}`,
17
+ skills: bucket.skills.map((skill) => `./${skill.name}`),
18
+ })),
19
+ };
20
+
21
+ fs.mkdirSync(path.dirname(outPath), { recursive: true });
22
+ fs.writeFileSync(outPath, `${JSON.stringify(manifest, null, 2)}\n`);
23
+
24
+ console.log(`Wrote ${path.relative(root, outPath)} (${catalog.flatMap((b) => b.skills).length} skills).`);
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { collectSkillsByBucket } from "../bin/collect-skills.mjs";
6
+
7
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
8
+ const marketplacePath = path.join(root, ".claude-plugin", "marketplace.json");
9
+
10
+ const catalog = collectSkillsByBucket(root, "/tmp/unused");
11
+ const expected = {
12
+ metadata: { pluginRoot: "./skills" },
13
+ plugins: catalog.map((bucket) => ({
14
+ name: bucket.id,
15
+ source: `./${bucket.id}`,
16
+ skills: bucket.skills.map((skill) => `./${skill.name}`),
17
+ })),
18
+ };
19
+
20
+ if (!fs.existsSync(marketplacePath)) {
21
+ console.error("Missing .claude-plugin/marketplace.json — run: npm run generate:marketplace");
22
+ process.exit(1);
23
+ }
24
+
25
+ const actual = JSON.parse(fs.readFileSync(marketplacePath, "utf8"));
26
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) {
27
+ console.error(
28
+ ".claude-plugin/marketplace.json is out of date — run: npm run generate:marketplace",
29
+ );
30
+ process.exit(1);
31
+ }
32
+
33
+ console.log("Verified .claude-plugin/marketplace.json matches promoted skills.");