@flitzrrr/agent-skills 1.0.2 → 1.1.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/.cursorrules +2 -2
- package/.github/copilot-instructions.md +59 -0
- package/.lovable +1 -1
- package/AGENTS.md +2 -2
- package/CHEATSHEET.md +84 -86
- package/CLAUDE.md +2 -2
- package/LICENSE +27 -0
- package/README.md +147 -100
- package/bin/build-catalog.js +208 -0
- package/bin/cli.js +7 -3
- package/bin/sync-docs.js +147 -0
- package/bin/sync-skills.sh +17 -0
- package/bin/test-cli.js +115 -0
- package/bin/update-wiki.js +102 -0
- package/package.json +9 -2
- package/skills/dispatch-parallel-agents/skill.md +95 -0
- package/skills/execute-work-package/SKILL.md +279 -0
- package/skills/execute-work-package/tpl-execution-blueprint.md +39 -0
- package/skills/execute-work-package/tpl-execution-digest.md +24 -0
- package/skills/execute-work-package/tpl-implementer-execute-prompt.md +57 -0
- package/skills/execute-work-package/tpl-implementer-preflight-prompt.md +66 -0
- package/skills/product-description-seo/CROSS-SELL.md +31 -0
- package/skills/product-description-seo/KEYWORDS.md +35 -0
- package/skills/product-description-seo/SKILL.md +361 -0
- package/skills/product-description-seo/scripts/analyze_catalog.py +136 -0
- package/skills/product-description-seo/scripts/check_quality.py +204 -0
- package/skills/product-description-seo/scripts/extract_category.py +88 -0
- package/skills/product-description-seo/scripts/track_progress.py +140 -0
- package/skills/product-description-seo/scripts/update_catalog.py +80 -0
- package/skills/product-description-seo/scripts/validate_json.py +87 -0
- package/skills/systematic-debugging/skill.md +87 -0
- package/skills/tob-gh-cli/SKILL.md +71 -0
package/README.md
CHANGED
|
@@ -1,126 +1,173 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
> **121 AI agent skills** from **15 industry-leading sources** — organized, evaluated, and **multiplatform-ready** for all major AI coding IDEs.
|
|
4
|
-
|
|
5
|
-
## ✅ Supported Platforms
|
|
6
|
-
|
|
7
|
-
| Platform | Config File | Setup |
|
|
8
|
-
|----------|------------|-------|
|
|
9
|
-
| **Claude Code** | `CLAUDE.md` | Clone repo, skills auto-discovered |
|
|
10
|
-
| **Antigravity** | `skills/` dir | Symlink `skills/` into agent skill dir |
|
|
11
|
-
| **Codex** (OpenAI) | `AGENTS.md` | Clone repo, `AGENTS.md` auto-loaded |
|
|
12
|
-
| **OpenCode** | `AGENTS.md` + `skills/` | Clone repo, reference skills in prompts |
|
|
13
|
-
| **Cursor** | `.cursorrules` | Clone repo into workspace, rules auto-loaded |
|
|
14
|
-
| **Lovable** | `.lovable` | Add as project dependency |
|
|
15
|
-
| **Windsurf** | `AGENTS.md` | Clone repo, reference skill paths |
|
|
16
|
-
| **Generic Agent** | `SKILL.md` per skill | Read `skills/<name>/SKILL.md` |
|
|
17
|
-
|
|
18
|
-
## Sources (15)
|
|
19
|
-
|
|
20
|
-
| # | Source | Skills | Focus |
|
|
21
|
-
|---|--------|--------|-------|
|
|
22
|
-
| 1 | [getsentry/skills](https://github.com/getsentry/skills) | 24 | Security, code review, Git workflow, Django |
|
|
23
|
-
| 2 | [Bhanunamikaze/Agentic-SEO-Skill](https://github.com/Bhanunamikaze/Agentic-SEO-Skill) | 16 | Comprehensive SEO auditing |
|
|
24
|
-
| 3 | [DasDigitaleMomentum/opencode-processing-skills](https://github.com/DasDigitaleMomentum/opencode-processing-skills) | 9 | Multi-session planning & docs |
|
|
25
|
-
| 4 | [anthropics/skills](https://github.com/anthropics/skills) | 17 | Document gen, creative design, MCP, API |
|
|
26
|
-
| 5 | [vercel-labs/agent-skills](https://github.com/vercel-labs/agent-skills) | 5 | React/Next.js, web design, deployment |
|
|
27
|
-
| 6 | [trailofbits/skills](https://github.com/trailofbits/skills) | 30 | Advanced security auditing, static analysis, smart contracts |
|
|
28
|
-
| 7 | [cloudflare/skills](https://github.com/cloudflare/skills) | 9 | Workers, Durable Objects, MCP, web perf |
|
|
29
|
-
| 8 | [stripe/ai](https://github.com/stripe/ai) | 2 | Stripe best practices & SDK upgrades |
|
|
30
|
-
| 9 | [expo/skills](https://github.com/expo/skills) | 3 | Expo app design, deployment, upgrades |
|
|
31
|
-
| 10 | [google-labs-code/stitch-skills](https://github.com/google-labs-code/stitch-skills) | 7 | Design-to-code, shadcn/ui, Remotion |
|
|
32
|
-
| 11 | [hashicorp/agent-skills](https://github.com/hashicorp/agent-skills) | 3 | Terraform code/module/provider generation |
|
|
33
|
-
| 12 | [supabase/agent-skills](https://github.com/supabase/agent-skills) | 1 | Postgres best practices |
|
|
34
|
-
| 13 | [callstackincubator/agent-skills](https://github.com/callstackincubator/agent-skills) | 5 | React Native, GitHub workflows |
|
|
35
|
-
| 14 | [K-Dense-AI/claude-scientific-skills](https://github.com/K-Dense-AI/claude-scientific-skills) | 100+ | Science, bioinformatics, ML, chemistry |
|
|
36
|
-
| 15 | [ComposioHQ/skills](https://github.com/ComposioHQ/skills) | 1 | Connect agents to 1000+ external apps |
|
|
37
|
-
|
|
38
|
-
## Repository Structure
|
|
1
|
+
# Agent Skills Hub
|
|
39
2
|
|
|
40
|
-
|
|
41
|
-
agent-skills/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
├── .cursorrules ← Cursor IDE
|
|
47
|
-
├── .lovable ← Lovable AI
|
|
48
|
-
├── CHEATSHEET.md ← Decision guide: which skill when
|
|
49
|
-
└── README.md ← This file
|
|
50
|
-
```
|
|
3
|
+
[](https://www.npmjs.com/package/@flitzrrr/agent-skills)
|
|
4
|
+
[](https://www.npmjs.com/package/@flitzrrr/agent-skills)
|
|
5
|
+
[](skills/)
|
|
6
|
+
[](vendor/)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](.github/workflows/skill-discovery.yml)
|
|
51
9
|
|
|
52
|
-
|
|
10
|
+
**504 curated AI agent skills** from **19 verified sources**. One install, every major coding assistant.
|
|
53
11
|
|
|
54
|
-
|
|
55
|
-
# Clone with all submodules
|
|
56
|
-
git clone --recurse-submodules git@github.com:flitzrrr/agent-skills.git
|
|
12
|
+
[Full catalog](https://flitzrrr.github.io/agent-skills/) | [Decision guide](CHEATSHEET.md)
|
|
57
13
|
|
|
58
|
-
|
|
59
|
-
git submodule update --remote --merge
|
|
60
|
-
```
|
|
14
|
+
---
|
|
61
15
|
|
|
62
|
-
##
|
|
16
|
+
## Quick Start
|
|
63
17
|
|
|
64
18
|
```bash
|
|
65
19
|
npx @flitzrrr/agent-skills install
|
|
66
20
|
```
|
|
67
21
|
|
|
68
|
-
|
|
22
|
+
Detects installed platforms and provisions skills for each. Target a single platform with:
|
|
69
23
|
|
|
70
|
-
### Claude Code
|
|
71
24
|
```bash
|
|
72
|
-
|
|
73
|
-
# CLAUDE.md auto-discovered
|
|
25
|
+
npx @flitzrrr/agent-skills install <platform>
|
|
74
26
|
```
|
|
75
27
|
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
ln -sf /path/to/agent-skills/skills/* ~/.gemini/antigravity/skills/
|
|
79
|
-
```
|
|
28
|
+
Where `<platform>` is one of: `vscode`, `codex`, `antigravity`, `opencode`.
|
|
80
29
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
git clone --recurse-submodules git@github.com:flitzrrr/agent-skills.git
|
|
84
|
-
# AGENTS.md auto-discovered
|
|
85
|
-
```
|
|
30
|
+
<details>
|
|
31
|
+
<summary>Manual setup (git clone)</summary>
|
|
86
32
|
|
|
87
|
-
### Cursor
|
|
88
33
|
```bash
|
|
89
34
|
git clone --recurse-submodules git@github.com:flitzrrr/agent-skills.git
|
|
90
|
-
|
|
91
|
-
```
|
|
35
|
+
cd agent-skills
|
|
92
36
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
ln -sf /
|
|
37
|
+
# Symlink into target platform(s):
|
|
38
|
+
ln -sf $(pwd)/skills/* ~/.copilot/skills/ # VS Code / GitHub Copilot
|
|
39
|
+
ln -sf $(pwd)/skills/* ~/.codex/skills/ # Codex
|
|
40
|
+
ln -sf $(pwd)/skills/* ~/.gemini/antigravity/skills/ # Antigravity
|
|
41
|
+
ln -sf $(pwd)/skills/* ~/.config/opencode/skills/ # OpenCode
|
|
42
|
+
|
|
43
|
+
# Pull upstream updates:
|
|
44
|
+
git submodule update --remote --merge
|
|
97
45
|
```
|
|
98
46
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
47
|
+
</details>
|
|
48
|
+
|
|
49
|
+
<details>
|
|
50
|
+
<summary>All CLI commands</summary>
|
|
51
|
+
|
|
52
|
+
| Command | Description |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| `npx @flitzrrr/agent-skills install` | Install for all detected platforms |
|
|
55
|
+
| `npx @flitzrrr/agent-skills install <platform>` | Install for a single platform |
|
|
56
|
+
| `npx @flitzrrr/agent-skills update` | Pull latest upstream skills |
|
|
57
|
+
| `npx @flitzrrr/agent-skills list` | List all available skills |
|
|
58
|
+
|
|
59
|
+
</details>
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Platform Support
|
|
64
|
+
|
|
65
|
+
| Platform | Discovery Mechanism | Install Method |
|
|
66
|
+
| --- | --- | --- |
|
|
67
|
+
| VS Code (GitHub Copilot) | `.github/copilot-instructions.md` + `~/.copilot/skills/` | `install vscode` |
|
|
68
|
+
| Claude Code | `CLAUDE.md` (project-level) | Clone into project |
|
|
69
|
+
| Codex | `AGENTS.md` | `install codex` |
|
|
70
|
+
| Cursor | `.cursorrules` (project-level) | Clone into workspace |
|
|
71
|
+
| Lovable | `.lovable` | Clone into workspace |
|
|
72
|
+
| Windsurf | `AGENTS.md` | Clone into workspace |
|
|
73
|
+
| Antigravity | `~/.gemini/antigravity/skills/` | `install antigravity` |
|
|
74
|
+
| OpenCode | `AGENTS.md` + `skills/` | `install opencode` |
|
|
75
|
+
| Any agent | Read `skills/<name>/SKILL.md` directly | Manual |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Skill Categories
|
|
80
|
+
|
|
81
|
+
| Category | Examples | Sources |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| Security and code review | `security-review`, `code-review`, `find-bugs`, `gha-security-review` | Sentry, Trail of Bits |
|
|
84
|
+
| Git workflow | `commit`, `create-branch`, `pr-writer`, `iterate-pr` | Sentry |
|
|
85
|
+
| Project planning | `create-plan`, `resume-plan`, `execute-work-package`, `generate-handover` | DasDigitaleMomentum |
|
|
86
|
+
| Document generation | `anthropic-pdf`, `anthropic-docx`, `anthropic-pptx`, `anthropic-xlsx` | Anthropic |
|
|
87
|
+
| Frontend and React | `vercel-react-best-practices`, `vercel-web-design-guidelines`, `anthropic-frontend-design` | Vercel, Anthropic |
|
|
88
|
+
| Infrastructure | `aws-lambda`, `terraform-code-generation`, `cloudflare-wrangler` | AWS, HashiCorp, Cloudflare |
|
|
89
|
+
| Finance | `finance-equity-research`, `finance-ib-advisory`, `finance-wealth-mgmt` | Anthropic |
|
|
90
|
+
| Science and ML | `scientific-bioinformatics`, `scientific-alphafold`, `scientific-chembl` | K-Dense-AI |
|
|
91
|
+
| Marketing and SEO | `content-strategy`, `seo-audit`, `product-description-seo` | Coreyhaines, Bhanunamikaze |
|
|
92
|
+
| Developer tools | `anthropic-mcp-builder`, `anthropic-webapp-testing`, `systematic-debugging` | Anthropic, Sentry |
|
|
93
|
+
| Django | `django-access-review`, `django-perf-review` | Sentry |
|
|
94
|
+
| Deployment | `vercel-deploy-to-vercel`, `stitch-shadcn-ui` | Vercel, Google |
|
|
95
|
+
|
|
96
|
+
See [CHEATSHEET.md](CHEATSHEET.md) for a decision guide on which skill to use for a given task.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Sources
|
|
101
|
+
|
|
102
|
+
| Source | Skills | Focus |
|
|
103
|
+
| --- | ---: | --- |
|
|
104
|
+
| [K-Dense-AI/claude-scientific-skills](https://github.com/K-Dense-AI/claude-scientific-skills) | 175 | Science, bioinformatics, ML, chemistry |
|
|
105
|
+
| [trailofbits/skills](https://github.com/trailofbits/skills) | 60 | Security auditing, static analysis, smart contracts |
|
|
106
|
+
| [anthropics/financial-services-plugins](https://github.com/anthropics/financial-services-plugins) | 56 | Finance: IB, equity research, PE, wealth mgmt |
|
|
107
|
+
| [MoizIbnYousaf/Ai-Agent-Skills](https://github.com/MoizIbnYousaf/Ai-Agent-Skills) | 48 | Database design, debugging, code patterns |
|
|
108
|
+
| [coreyhaines31/marketingskills](https://github.com/coreyhaines31/marketingskills) | 33 | Marketing: SEO, email, content, analytics |
|
|
109
|
+
| [getsentry/skills](https://github.com/getsentry/skills) | 24 | Security, code review, Git workflow, Django |
|
|
110
|
+
| [itsmostafa/aws-agent-skills](https://github.com/itsmostafa/aws-agent-skills) | 18 | AWS infrastructure and services |
|
|
111
|
+
| [anthropics/skills](https://github.com/anthropics/skills) | 17 | Document gen, creative design, MCP |
|
|
112
|
+
| [hashicorp/agent-skills](https://github.com/hashicorp/agent-skills) | 14 | Terraform generation |
|
|
113
|
+
| [expo/skills](https://github.com/expo/skills) | 11 | Expo design and deployment |
|
|
114
|
+
| [cloudflare/skills](https://github.com/cloudflare/skills) | 9 | Workers, Durable Objects, MCP |
|
|
115
|
+
| [DasDigitaleMomentum/opencode-processing-skills](https://github.com/DasDigitaleMomentum/opencode-processing-skills) | 9 | Multi-session planning |
|
|
116
|
+
| [google-labs-code/stitch-skills](https://github.com/google-labs-code/stitch-skills) | 7 | Design-to-code, shadcn/ui, Remotion |
|
|
117
|
+
| [vercel-labs/agent-skills](https://github.com/vercel-labs/agent-skills) | 5 | React, Next.js, web design |
|
|
118
|
+
| [callstackincubator/agent-skills](https://github.com/callstackincubator/agent-skills) | 5 | React Native, GitHub workflows |
|
|
119
|
+
| [JackyST0/awesome-agent-skills](https://github.com/JackyST0/awesome-agent-skills) | 5 | General-purpose agent patterns |
|
|
120
|
+
| [stripe/ai](https://github.com/stripe/ai) | 2 | Stripe best practices |
|
|
121
|
+
| [Bhanunamikaze/Agentic-SEO-Skill](https://github.com/Bhanunamikaze/Agentic-SEO-Skill) | 1 | SEO auditing (16 sub-skills) |
|
|
122
|
+
| [supabase/agent-skills](https://github.com/supabase/agent-skills) | 1 | Postgres best practices |
|
|
123
|
+
|
|
124
|
+
New sources are discovered weekly via [GitHub Actions](.github/workflows/skill-discovery.yml) and security-scanned before integration.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Architecture
|
|
129
|
+
|
|
102
130
|
```
|
|
131
|
+
agent-skills/
|
|
132
|
+
skills/ 504 entries (symlinks to vendor + local forks)
|
|
133
|
+
vendor/ 19 Git submodules (upstream sources)
|
|
134
|
+
bin/ CLI and build scripts
|
|
135
|
+
docs/ GitHub Pages catalog and project documentation
|
|
136
|
+
.github/ CI workflows and copilot-instructions.md
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Skills are exposed as a flat directory under `skills/`. Most entries are symlinks into `vendor/` submodules. Skills with local extensions (e.g., `execute-work-package` with multi-transport support) are maintained as real directories alongside the symlinks.
|
|
140
|
+
|
|
141
|
+
### Naming Convention
|
|
142
|
+
|
|
143
|
+
Skills are namespaced by source to avoid collisions: `anthropic-pdf`, `tob-static-analysis`, `cloudflare-wrangler`, `terraform-code-generation`, `scientific-bioinformatics`, `aws-lambda`, `finance-equity-research`, `callstack-react-native-best-practices`. Sentry and marketing skills are un-prefixed (`code-review`, `content-strategy`).
|
|
144
|
+
|
|
145
|
+
### Automation
|
|
146
|
+
|
|
147
|
+
| Workflow | Trigger | Purpose |
|
|
148
|
+
| --- | --- | --- |
|
|
149
|
+
| [Skill Discovery](.github/workflows/skill-discovery.yml) | Weekly | Find trending skill repos, security-scan, auto-add |
|
|
150
|
+
| [Submodule Update](.github/workflows/submodule-update.yml) | Weekly | Pull upstream changes, open PR |
|
|
151
|
+
| [MegaLinter](.github/workflows/megalinter.yml) | Push / PR | Lint markdown, YAML, JSON |
|
|
152
|
+
| [npm Publish](.github/workflows/npm-publish.yml) | Tag `v*` | Publish to npm, create GitHub Release |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## MCP Execution Backend (l4l)
|
|
157
|
+
|
|
158
|
+
The [execute-work-package](skills/execute-work-package) skill supports three transport modes for delegating implementation to a sub-agent:
|
|
159
|
+
|
|
160
|
+
| Transport | Mechanism | When to use |
|
|
161
|
+
| --- | --- | --- |
|
|
162
|
+
| **MCP via l4l** (default) | [l4l](https://github.com/flitzrrr/l4l) exposes 5 MCP tools for the gated precheck-approve-execute lifecycle | Any IDE with MCP support |
|
|
163
|
+
| **Fresh Agent** | IDE spawns a new sub-agent per step (no external server) | Fallback when l4l is not configured |
|
|
164
|
+
| **Stateful Session** | Sub-agent session resumed across steps | OpenCode only |
|
|
165
|
+
|
|
166
|
+
When l4l MCP tools are available (`precheck_new`, `precheck_iterate`, `approve_blueprint`, `execute`, `handle_report`), the skill uses them automatically. See the [l4l setup guide](https://github.com/flitzrrr/l4l/blob/main/docs/CLAUDE_CODE_SETUP.md) for configuration.
|
|
103
167
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
| Source | Prefix | Example |
|
|
107
|
-
|--------|--------|---------|
|
|
108
|
-
| Sentry | *(none)* | `code-review`, `security-review` |
|
|
109
|
-
| SEO | `seo` | `seo` |
|
|
110
|
-
| OpenCode | *(none)* | `create-plan`, `resume-plan` |
|
|
111
|
-
| Anthropic | `anthropic-` | `anthropic-pdf`, `anthropic-mcp-builder` |
|
|
112
|
-
| Vercel | `vercel-` | `vercel-react-best-practices` |
|
|
113
|
-
| Trail of Bits | `tob-` | `tob-static-analysis`, `tob-semgrep-rule-creator` |
|
|
114
|
-
| Cloudflare | `cloudflare-` | `cloudflare-wrangler`, `cloudflare-web-perf` |
|
|
115
|
-
| Stripe | `stripe-` | `stripe-stripe-best-practices` |
|
|
116
|
-
| Expo | `expo` | `expo` |
|
|
117
|
-
| Google Stitch | `stitch-` | `stitch-shadcn-ui`, `stitch-remotion` |
|
|
118
|
-
| HashiCorp | `terraform-` | `terraform-code-generation` |
|
|
119
|
-
| Supabase | `supabase-` | `supabase-postgres` |
|
|
120
|
-
| CallStack | `callstack-` | `callstack-react-native-best-practices` |
|
|
121
|
-
| Scientific | `scientific` | `scientific` (100+ sub-skills) |
|
|
122
|
-
| Composio | `composio` | `composio` |
|
|
168
|
+
---
|
|
123
169
|
|
|
124
170
|
## License
|
|
125
171
|
|
|
126
|
-
|
|
172
|
+
MIT -- applies to the CLI, workflows, and documentation in this repository.
|
|
173
|
+
Each vendored submodule in `vendor/` retains its own original license.
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Build catalog.json from all SKILL.md frontmatter.
|
|
5
|
+
* Searches recursively for SKILL.md and generates descriptions
|
|
6
|
+
* for skills that lack frontmatter descriptions.
|
|
7
|
+
*
|
|
8
|
+
* Run: node bin/build-catalog.js
|
|
9
|
+
* Output: docs/catalog.json
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require("fs");
|
|
13
|
+
const path = require("path");
|
|
14
|
+
|
|
15
|
+
const ROOT = path.join(__dirname, "..");
|
|
16
|
+
const SKILLS_DIR = path.join(ROOT, "skills");
|
|
17
|
+
const OUT = path.join(ROOT, "docs", "catalog.json");
|
|
18
|
+
|
|
19
|
+
function findSkillMd(dir, maxDepth) {
|
|
20
|
+
if (maxDepth <= 0) return null;
|
|
21
|
+
try {
|
|
22
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
23
|
+
// Check current directory first
|
|
24
|
+
for (const e of entries) {
|
|
25
|
+
if (e.isFile() && e.name.toLowerCase() === "skill.md") {
|
|
26
|
+
return path.join(dir, e.name);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Then recurse into subdirectories
|
|
30
|
+
for (const e of entries) {
|
|
31
|
+
if (e.isDirectory() && e.name !== ".git" && e.name !== "node_modules") {
|
|
32
|
+
const found = findSkillMd(path.join(dir, e.name), maxDepth - 1);
|
|
33
|
+
if (found) return found;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
} catch {}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function extractDescription(skillMdPath) {
|
|
41
|
+
const content = fs.readFileSync(skillMdPath, "utf8");
|
|
42
|
+
const fmMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
43
|
+
if (fmMatch) {
|
|
44
|
+
const fm = fmMatch[1];
|
|
45
|
+
let desc = null;
|
|
46
|
+
|
|
47
|
+
// 1. Quoted description: description: "..."
|
|
48
|
+
const quotedMatch = fm.match(/description:\s*"([\s\S]*?)"/);
|
|
49
|
+
if (quotedMatch) {
|
|
50
|
+
desc = quotedMatch[1];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 2. YAML multi-line (>, >-, |, |-): collect indented lines
|
|
54
|
+
if (!desc) {
|
|
55
|
+
const multiMatch = fm.match(/description:\s*[>|]-?\s*\n([\s\S]*?)(?=\n\S|\n*$)/);
|
|
56
|
+
if (multiMatch) {
|
|
57
|
+
desc = multiMatch[1]
|
|
58
|
+
.split("\n")
|
|
59
|
+
.map((l) => l.replace(/^\s{2,}/, "").trim())
|
|
60
|
+
.filter(Boolean)
|
|
61
|
+
.join(" ");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 3. Single-line description
|
|
66
|
+
if (!desc) {
|
|
67
|
+
const singleMatch = fm.match(/description:\s*(.+?)(?:\n|$)/);
|
|
68
|
+
if (singleMatch) {
|
|
69
|
+
desc = singleMatch[1];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (desc) {
|
|
74
|
+
desc = desc.replace(/\s+/g, " ").trim();
|
|
75
|
+
// First sentence
|
|
76
|
+
const sentEnd = desc.match(/[.!?]\s/);
|
|
77
|
+
if (sentEnd) desc = desc.substring(0, sentEnd.index + 1);
|
|
78
|
+
if (desc.length > 150) desc = desc.substring(0, 147) + "...";
|
|
79
|
+
// Reject garbage (too short, only symbols, YAML artifacts)
|
|
80
|
+
if (desc.length >= 10 && /[a-zA-Z]{3,}/.test(desc)) {
|
|
81
|
+
return desc;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Fallback: first real paragraph after frontmatter
|
|
86
|
+
const noFm = content.replace(/^---[\s\S]*?---\s*/, "");
|
|
87
|
+
const lines = noFm
|
|
88
|
+
.split("\n")
|
|
89
|
+
.filter((l) => l.trim() && !l.startsWith("#") && !l.startsWith("```") && !l.startsWith("-"));
|
|
90
|
+
if (lines.length > 0) {
|
|
91
|
+
let desc = lines[0].trim();
|
|
92
|
+
const sentEnd = desc.match(/[.!?]\s/);
|
|
93
|
+
if (sentEnd) desc = desc.substring(0, sentEnd.index + 1);
|
|
94
|
+
if (desc.length > 150) desc = desc.substring(0, 147) + "...";
|
|
95
|
+
if (desc.length >= 10 && /[a-zA-Z]{3,}/.test(desc)) {
|
|
96
|
+
return desc;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Generate a human-readable description from the skill name
|
|
103
|
+
function descFromName(name) {
|
|
104
|
+
const map = {
|
|
105
|
+
"expo": "Expo SDK integration for React Native mobile app development.",
|
|
106
|
+
"scientific": "Scientific computing and research automation toolkit.",
|
|
107
|
+
// finance
|
|
108
|
+
"finance-equity-research": "Equity research analysis and investment recommendations.",
|
|
109
|
+
"finance-financial-analysis": "Financial modeling, valuation, and quantitative analysis.",
|
|
110
|
+
"finance-investment-banking": "Investment banking deal execution and M&A advisory.",
|
|
111
|
+
"finance-lseg": "LSEG (London Stock Exchange Group) data integration.",
|
|
112
|
+
"finance-private-equity": "Private equity deal sourcing and portfolio management.",
|
|
113
|
+
"finance-spglobal": "S&P Global market intelligence data integration.",
|
|
114
|
+
"finance-wealth-management": "Wealth management and financial planning advisory.",
|
|
115
|
+
// terraform
|
|
116
|
+
"terraform-code-generation": "Generate Terraform HCL code from infrastructure requirements.",
|
|
117
|
+
"terraform-module-generation": "Create reusable Terraform modules following best practices.",
|
|
118
|
+
"terraform-provider-development": "Build custom Terraform providers for new infrastructure APIs.",
|
|
119
|
+
// tob skills without parseable YAML
|
|
120
|
+
"tob-debug-buttercup": "Debug Buttercup password manager issues and extension failures.",
|
|
121
|
+
"tob-differential-review": "Security-focused differential code review for pull requests.",
|
|
122
|
+
"tob-gh-cli": "Automate GitHub workflows using the gh CLI for issues, PRs, and releases.",
|
|
123
|
+
"tob-static-analysis": "Run and interpret static analysis tools across multiple languages.",
|
|
124
|
+
"tob-testing-handbook-skills": "Apply Trail of Bits testing handbook best practices.",
|
|
125
|
+
"tob-workflow-skill-design": "Design and structure new Claude Code skills and workflows.",
|
|
126
|
+
"tob-yara-authoring": "Author and validate YARA rules for malware detection and threat hunting.",
|
|
127
|
+
// seo
|
|
128
|
+
"seo": "Deterministic LLM-first SEO audits for websites, blogs, and repositories.",
|
|
129
|
+
};
|
|
130
|
+
if (map[name]) return map[name];
|
|
131
|
+
|
|
132
|
+
// Auto-generate from name (strip known prefixes)
|
|
133
|
+
const cleaned = name
|
|
134
|
+
.replace(/^(tob|anthropic|agents|cloudflare|sentry|google|finance|terraform)-/, "");
|
|
135
|
+
const parts = cleaned.split("-");
|
|
136
|
+
const readable = parts.map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join(" ");
|
|
137
|
+
// Make it a full sentence
|
|
138
|
+
return `${readable} tooling and automation.`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function main() {
|
|
142
|
+
if (!fs.existsSync(SKILLS_DIR)) {
|
|
143
|
+
console.error("skills/ directory not found");
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const entries = fs.readdirSync(SKILLS_DIR);
|
|
148
|
+
const catalog = [];
|
|
149
|
+
|
|
150
|
+
for (const entry of entries) {
|
|
151
|
+
const entryPath = path.join(SKILLS_DIR, entry);
|
|
152
|
+
let realDir;
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
const stats = fs.lstatSync(entryPath);
|
|
156
|
+
if (stats.isSymbolicLink()) {
|
|
157
|
+
const linkTarget = fs.readlinkSync(entryPath);
|
|
158
|
+
const normalized = linkTarget.replace(/^\.\.\/\.\.\//, "");
|
|
159
|
+
realDir = path.join(ROOT, normalized);
|
|
160
|
+
} else if (stats.isDirectory()) {
|
|
161
|
+
realDir = entryPath;
|
|
162
|
+
} else {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
} catch {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const prefix = entry.split("-")[0];
|
|
170
|
+
let description = null;
|
|
171
|
+
|
|
172
|
+
if (fs.existsSync(realDir) && fs.statSync(realDir).isDirectory()) {
|
|
173
|
+
// Search recursively for SKILL.md (max depth 4)
|
|
174
|
+
const skillMd = findSkillMd(realDir, 4);
|
|
175
|
+
if (skillMd) {
|
|
176
|
+
description = extractDescription(skillMd);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Fallback: generate from name
|
|
181
|
+
if (!description) {
|
|
182
|
+
description = descFromName(entry);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
catalog.push({
|
|
186
|
+
name: entry,
|
|
187
|
+
source: prefix,
|
|
188
|
+
description,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
catalog.sort((a, b) => a.name.localeCompare(b.name));
|
|
193
|
+
|
|
194
|
+
const output = {
|
|
195
|
+
generated: new Date().toISOString(),
|
|
196
|
+
total: catalog.length,
|
|
197
|
+
skills: catalog,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
fs.mkdirSync(path.dirname(OUT), { recursive: true });
|
|
201
|
+
fs.writeFileSync(OUT, JSON.stringify(output, null, 2));
|
|
202
|
+
|
|
203
|
+
const withDesc = catalog.filter((s) => s.description).length;
|
|
204
|
+
console.log(`Built catalog: ${output.total} skills, ${withDesc} with descriptions`);
|
|
205
|
+
console.log(`Output: ${OUT}`);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
main();
|
package/bin/cli.js
CHANGED
|
@@ -26,6 +26,10 @@ const PLATFORMS = {
|
|
|
26
26
|
name: "OpenCode",
|
|
27
27
|
dir: path.join(os.homedir(), ".config", "opencode", "skills"),
|
|
28
28
|
},
|
|
29
|
+
vscode: {
|
|
30
|
+
name: "VS Code (GitHub Copilot)",
|
|
31
|
+
dir: path.join(os.homedir(), ".copilot", "skills"),
|
|
32
|
+
},
|
|
29
33
|
cursor: {
|
|
30
34
|
name: "Cursor",
|
|
31
35
|
dir: null,
|
|
@@ -38,7 +42,7 @@ function log(msg) {
|
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
function header(msg) {
|
|
41
|
-
console.log(`\n
|
|
45
|
+
console.log(`\n> ${msg}\n`);
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
function cloneRepo() {
|
|
@@ -128,7 +132,7 @@ switch (command) {
|
|
|
128
132
|
}
|
|
129
133
|
}
|
|
130
134
|
|
|
131
|
-
log("\
|
|
135
|
+
log("\nDone. See CHEATSHEET.md for which skill to use when.");
|
|
132
136
|
log(` ${SKILL_DIR}/CHEATSHEET.md`);
|
|
133
137
|
break;
|
|
134
138
|
}
|
|
@@ -136,7 +140,7 @@ switch (command) {
|
|
|
136
140
|
case "update": {
|
|
137
141
|
header("Updating Agent Skills...");
|
|
138
142
|
cloneRepo();
|
|
139
|
-
log("\
|
|
143
|
+
log("\nAll skills updated to latest versions.");
|
|
140
144
|
break;
|
|
141
145
|
}
|
|
142
146
|
|
package/bin/sync-docs.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Regenerates README.md badges/counts, sources table, repo structure,
|
|
5
|
+
* AGENTS.md, CLAUDE.md, and .cursorrules based on current skills/ and vendor/ state.
|
|
6
|
+
*
|
|
7
|
+
* Run: node bin/sync-docs.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const path = require("path");
|
|
12
|
+
const { execSync } = require("child_process");
|
|
13
|
+
|
|
14
|
+
const ROOT = path.resolve(__dirname, "..");
|
|
15
|
+
const SKILLS_DIR = path.join(ROOT, "skills");
|
|
16
|
+
const VENDOR_DIR = path.join(ROOT, "vendor");
|
|
17
|
+
|
|
18
|
+
// Count skills and sources
|
|
19
|
+
const skills = fs
|
|
20
|
+
.readdirSync(SKILLS_DIR)
|
|
21
|
+
.filter((f) => !f.startsWith("."));
|
|
22
|
+
const sources = fs
|
|
23
|
+
.readdirSync(VENDOR_DIR)
|
|
24
|
+
.filter((f) => !f.startsWith(".") && fs.statSync(path.join(VENDOR_DIR, f)).isDirectory());
|
|
25
|
+
|
|
26
|
+
const skillCount = skills.length;
|
|
27
|
+
const sourceCount = sources.length;
|
|
28
|
+
|
|
29
|
+
console.log(`Found ${skillCount} skills from ${sourceCount} sources`);
|
|
30
|
+
|
|
31
|
+
// --- Update README.md ---
|
|
32
|
+
const readmePath = path.join(ROOT, "README.md");
|
|
33
|
+
let readme = fs.readFileSync(readmePath, "utf8");
|
|
34
|
+
|
|
35
|
+
// Update badge counts
|
|
36
|
+
readme = readme.replace(
|
|
37
|
+
/skills-\d+-blue/,
|
|
38
|
+
`skills-${skillCount}-blue`
|
|
39
|
+
);
|
|
40
|
+
readme = readme.replace(
|
|
41
|
+
/sources-\d+-green/,
|
|
42
|
+
`sources-${sourceCount}-green`
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// Update intro line
|
|
46
|
+
readme = readme.replace(
|
|
47
|
+
/\*\*\d+ agent skills\*\* from \*\*\d+ industry-leading sources\*\*/,
|
|
48
|
+
`**${skillCount} agent skills** from **${sourceCount} industry-leading sources**`
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
// Update repo structure counts
|
|
52
|
+
readme = readme.replace(
|
|
53
|
+
/skills\/\s+\d+ symlinks/,
|
|
54
|
+
`skills/ ${skillCount} symlinks`
|
|
55
|
+
);
|
|
56
|
+
readme = readme.replace(
|
|
57
|
+
/vendor\/\s+\d+ Git submodules/,
|
|
58
|
+
`vendor/ ${sourceCount} Git submodules`
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
fs.writeFileSync(readmePath, readme, "utf8");
|
|
62
|
+
console.log("Updated README.md");
|
|
63
|
+
|
|
64
|
+
// --- Update AGENTS.md ---
|
|
65
|
+
const agentsPath = path.join(ROOT, "AGENTS.md");
|
|
66
|
+
if (fs.existsSync(agentsPath)) {
|
|
67
|
+
let agents = fs.readFileSync(agentsPath, "utf8");
|
|
68
|
+
agents = agents.replace(/\d+ skills/g, `${skillCount} skills`);
|
|
69
|
+
agents = agents.replace(/\d+ sources/g, `${sourceCount} sources`);
|
|
70
|
+
fs.writeFileSync(agentsPath, agents, "utf8");
|
|
71
|
+
console.log("Updated AGENTS.md");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// --- Update CLAUDE.md ---
|
|
75
|
+
const claudePath = path.join(ROOT, "CLAUDE.md");
|
|
76
|
+
if (fs.existsSync(claudePath)) {
|
|
77
|
+
let claude = fs.readFileSync(claudePath, "utf8");
|
|
78
|
+
claude = claude.replace(/\d+ skills/g, `${skillCount} skills`);
|
|
79
|
+
claude = claude.replace(/\d+ sources/g, `${sourceCount} sources`);
|
|
80
|
+
fs.writeFileSync(claudePath, claude, "utf8");
|
|
81
|
+
console.log("Updated CLAUDE.md");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// --- Update .cursorrules ---
|
|
85
|
+
const cursorPath = path.join(ROOT, ".cursorrules");
|
|
86
|
+
if (fs.existsSync(cursorPath)) {
|
|
87
|
+
let cursor = fs.readFileSync(cursorPath, "utf8");
|
|
88
|
+
cursor = cursor.replace(/\d+ skills/g, `${skillCount} skills`);
|
|
89
|
+
cursor = cursor.replace(/\d+ sources/g, `${sourceCount} sources`);
|
|
90
|
+
fs.writeFileSync(cursorPath, cursor, "utf8");
|
|
91
|
+
console.log("Updated .cursorrules");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// --- Update .lovable ---
|
|
95
|
+
const lovablePath = path.join(ROOT, ".lovable");
|
|
96
|
+
if (fs.existsSync(lovablePath)) {
|
|
97
|
+
let lovable = fs.readFileSync(lovablePath, "utf8");
|
|
98
|
+
lovable = lovable.replace(/\d+ curated AI agent skills/, `${skillCount} curated AI agent skills`);
|
|
99
|
+
lovable = lovable.replace(/\d+ skills/g, `${skillCount} skills`);
|
|
100
|
+
lovable = lovable.replace(/\d+ sources/g, `${sourceCount} sources`);
|
|
101
|
+
fs.writeFileSync(lovablePath, lovable, "utf8");
|
|
102
|
+
console.log("Updated .lovable");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// --- Update .github/copilot-instructions.md ---
|
|
106
|
+
const copilotPath = path.join(ROOT, ".github", "copilot-instructions.md");
|
|
107
|
+
if (fs.existsSync(copilotPath)) {
|
|
108
|
+
let copilot = fs.readFileSync(copilotPath, "utf8");
|
|
109
|
+
copilot = copilot.replace(/\d+ curated AI agent skills/, `${skillCount} curated AI agent skills`);
|
|
110
|
+
fs.writeFileSync(copilotPath, copilot, "utf8");
|
|
111
|
+
console.log("Updated .github/copilot-instructions.md");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// --- Update CHEATSHEET.md ---
|
|
115
|
+
const cheatsheetPath = path.join(ROOT, "CHEATSHEET.md");
|
|
116
|
+
if (fs.existsSync(cheatsheetPath)) {
|
|
117
|
+
let cheatsheet = fs.readFileSync(cheatsheetPath, "utf8");
|
|
118
|
+
cheatsheet = cheatsheet.replace(/\d+ skills/g, `${skillCount} skills`);
|
|
119
|
+
cheatsheet = cheatsheet.replace(/\d+ sources/g, `${sourceCount} sources`);
|
|
120
|
+
fs.writeFileSync(cheatsheetPath, cheatsheet, "utf8");
|
|
121
|
+
console.log("Updated CHEATSHEET.md");
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// --- Generate skills list for AGENTS.md / CLAUDE.md ---
|
|
125
|
+
const skillList = skills.sort().map((s) => `- ${s}`).join("\n");
|
|
126
|
+
const marker = "<!-- SKILL_LIST -->";
|
|
127
|
+
const endMarker = "<!-- /SKILL_LIST -->";
|
|
128
|
+
|
|
129
|
+
for (const filePath of [agentsPath, claudePath]) {
|
|
130
|
+
if (!fs.existsSync(filePath)) continue;
|
|
131
|
+
let content = fs.readFileSync(filePath, "utf8");
|
|
132
|
+
const startIdx = content.indexOf(marker);
|
|
133
|
+
const endIdx = content.indexOf(endMarker);
|
|
134
|
+
if (startIdx !== -1 && endIdx !== -1) {
|
|
135
|
+
content =
|
|
136
|
+
content.substring(0, startIdx + marker.length) +
|
|
137
|
+
"\n" +
|
|
138
|
+
skillList +
|
|
139
|
+
"\n" +
|
|
140
|
+
content.substring(endIdx);
|
|
141
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
142
|
+
console.log(`Updated skill list in ${path.basename(filePath)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
console.log("Done.");
|
|
147
|
+
|