@booklib/skills 1.5.2 → 1.7.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.
Files changed (39) hide show
  1. package/CONTRIBUTING.md +23 -1
  2. package/README.md +55 -0
  3. package/agents/architecture-reviewer.md +136 -0
  4. package/agents/booklib-reviewer.md +90 -0
  5. package/agents/data-reviewer.md +107 -0
  6. package/agents/jvm-reviewer.md +146 -0
  7. package/agents/python-reviewer.md +128 -0
  8. package/agents/rust-reviewer.md +115 -0
  9. package/agents/ts-reviewer.md +110 -0
  10. package/agents/ui-reviewer.md +117 -0
  11. package/bin/skills.js +368 -73
  12. package/commands/animation-at-work.md +10 -0
  13. package/commands/clean-code-reviewer.md +10 -0
  14. package/commands/data-intensive-patterns.md +10 -0
  15. package/commands/data-pipelines.md +10 -0
  16. package/commands/design-patterns.md +10 -0
  17. package/commands/domain-driven-design.md +10 -0
  18. package/commands/effective-java.md +10 -0
  19. package/commands/effective-kotlin.md +10 -0
  20. package/commands/effective-python.md +10 -0
  21. package/commands/effective-typescript.md +10 -0
  22. package/commands/kotlin-in-action.md +10 -0
  23. package/commands/lean-startup.md +10 -0
  24. package/commands/microservices-patterns.md +10 -0
  25. package/commands/programming-with-rust.md +10 -0
  26. package/commands/refactoring-ui.md +10 -0
  27. package/commands/rust-in-action.md +10 -0
  28. package/commands/skill-router.md +10 -0
  29. package/commands/spring-boot-in-action.md +10 -0
  30. package/commands/storytelling-with-data.md +10 -0
  31. package/commands/system-design-interview.md +10 -0
  32. package/commands/using-asyncio-python.md +10 -0
  33. package/commands/web-scraping-python.md +10 -0
  34. package/package.json +4 -1
  35. package/scripts/gen-og.mjs +142 -0
  36. package/skills/skill-router/SKILL.md +23 -0
  37. package/demo.gif +0 -0
  38. package/demo.tape +0 -40
  39. package/docs/index.html +0 -362
package/docs/index.html DELETED
@@ -1,362 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8"/>
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6
- <title>booklib-ai/skills — Book-grounded AI agent skills</title>
7
- <meta name="description" content="22 AI agent skills grounded in canonical programming books. Give your AI coding assistant expert knowledge from Clean Code, Effective Java, DDD, and more."/>
8
- <meta property="og:title" content="booklib-ai/skills"/>
9
- <meta property="og:description" content="Book-grounded AI agent skills for Claude Code, Cursor, Copilot, and Windsurf."/>
10
- <meta property="og:image" content="https://booklib-ai.github.io/skills/logo.png"/>
11
- <style>
12
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
13
-
14
- body {
15
- background: #0d0d1a;
16
- color: #e2e8f0;
17
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
18
- line-height: 1.6;
19
- }
20
-
21
- a { color: #818cf8; text-decoration: none; }
22
- a:hover { text-decoration: underline; }
23
-
24
- /* Hero */
25
- .hero {
26
- text-align: center;
27
- padding: 80px 24px 64px;
28
- max-width: 720px;
29
- margin: 0 auto;
30
- }
31
- .hero img.logo { width: 96px; height: 96px; margin-bottom: 24px; }
32
- .hero h1 { font-size: 2.5rem; font-weight: 700; color: #f1f5f9; letter-spacing: -0.03em; }
33
- .hero p {
34
- font-size: 1.125rem;
35
- color: #94a3b8;
36
- margin-top: 16px;
37
- max-width: 520px;
38
- margin-left: auto;
39
- margin-right: auto;
40
- }
41
-
42
- /* Install */
43
- #install {
44
- display: flex;
45
- align-items: center;
46
- justify-content: center;
47
- gap: 12px;
48
- margin-top: 36px;
49
- flex-wrap: wrap;
50
- }
51
- .install-box {
52
- background: #161625;
53
- border: 1px solid #2d2d4a;
54
- border-radius: 10px;
55
- padding: 12px 20px;
56
- font-family: "SF Mono", "Fira Code", monospace;
57
- font-size: 0.9rem;
58
- color: #a5b4fc;
59
- cursor: pointer;
60
- user-select: all;
61
- transition: border-color 0.2s;
62
- }
63
- .install-box.highlighted {
64
- border-color: #6366f1;
65
- color: #c7d2fe;
66
- }
67
- .copy-btn {
68
- background: #6366f1;
69
- color: white;
70
- border: none;
71
- border-radius: 8px;
72
- padding: 12px 20px;
73
- font-size: 0.875rem;
74
- font-weight: 600;
75
- cursor: pointer;
76
- transition: background 0.15s;
77
- }
78
- .copy-btn:hover { background: #4f46e5; }
79
-
80
- /* Badges */
81
- .badges {
82
- display: flex;
83
- justify-content: center;
84
- gap: 8px;
85
- margin-top: 28px;
86
- flex-wrap: wrap;
87
- }
88
- .badges img { height: 20px; }
89
-
90
- /* Skills grid */
91
- .skills-section {
92
- max-width: 1100px;
93
- margin: 64px auto;
94
- padding: 0 24px;
95
- }
96
- .skills-section h2 {
97
- font-size: 1.5rem;
98
- font-weight: 700;
99
- color: #f1f5f9;
100
- margin-bottom: 8px;
101
- text-align: center;
102
- }
103
- .skills-section .subtitle {
104
- text-align: center;
105
- color: #64748b;
106
- font-size: 0.9rem;
107
- margin-bottom: 32px;
108
- }
109
- .skills-grid {
110
- display: grid;
111
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
112
- gap: 20px;
113
- }
114
-
115
- /* Card */
116
- .skill-card {
117
- background: #11111f;
118
- border: 1px solid #1e1e35;
119
- border-radius: 12px;
120
- overflow: hidden;
121
- cursor: pointer;
122
- transition: border-color 0.15s, transform 0.15s, box-shadow 0.15s;
123
- display: flex;
124
- flex-direction: column;
125
- text-decoration: none;
126
- color: inherit;
127
- }
128
- .skill-card:hover {
129
- border-color: #6366f1;
130
- transform: translateY(-3px);
131
- box-shadow: 0 8px 24px rgba(99, 102, 241, 0.15);
132
- text-decoration: none;
133
- }
134
- .skill-card.active {
135
- border-color: #818cf8;
136
- box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.3);
137
- }
138
-
139
- /* Book cover area */
140
- .cover-wrap {
141
- width: 100%;
142
- aspect-ratio: 2 / 3;
143
- background: #161625;
144
- display: flex;
145
- align-items: center;
146
- justify-content: center;
147
- overflow: hidden;
148
- position: relative;
149
- }
150
- .cover-wrap img {
151
- width: 100%;
152
- height: 100%;
153
- object-fit: cover;
154
- display: block;
155
- }
156
- .cover-fallback {
157
- width: 100%;
158
- height: 100%;
159
- display: flex;
160
- flex-direction: column;
161
- align-items: center;
162
- justify-content: center;
163
- padding: 16px;
164
- text-align: center;
165
- gap: 8px;
166
- }
167
- .cover-fallback .initials {
168
- font-size: 2rem;
169
- font-weight: 700;
170
- color: #6366f1;
171
- line-height: 1;
172
- }
173
- .cover-fallback .fallback-title {
174
- font-size: 0.75rem;
175
- color: #64748b;
176
- line-height: 1.3;
177
- }
178
-
179
- /* Card body */
180
- .card-body {
181
- padding: 14px 16px 16px;
182
- flex: 1;
183
- display: flex;
184
- flex-direction: column;
185
- gap: 4px;
186
- }
187
- .card-body .skill-name {
188
- font-size: 0.8rem;
189
- font-weight: 700;
190
- color: #a5b4fc;
191
- font-family: "SF Mono", "Fira Code", monospace;
192
- word-break: break-all;
193
- }
194
- .card-body .book-title {
195
- font-size: 0.82rem;
196
- font-weight: 600;
197
- color: #e2e8f0;
198
- line-height: 1.3;
199
- margin-top: 2px;
200
- }
201
- .card-body .book-author {
202
- font-size: 0.75rem;
203
- color: #64748b;
204
- }
205
- .card-body .card-desc {
206
- font-size: 0.775rem;
207
- color: #475569;
208
- line-height: 1.45;
209
- margin-top: 6px;
210
- }
211
-
212
- /* Footer */
213
- footer {
214
- text-align: center;
215
- padding: 48px 24px;
216
- color: #475569;
217
- font-size: 0.875rem;
218
- border-top: 1px solid #1e1e35;
219
- }
220
- footer a { color: #6366f1; }
221
- </style>
222
- </head>
223
- <body>
224
-
225
- <section class="hero">
226
- <img class="logo" src="https://raw.githubusercontent.com/booklib-ai/skills/main/assets/logo.svg" alt="booklib-ai skills logo"/>
227
- <h1>Skills</h1>
228
- <p>Book-grounded AI agent skills — expert knowledge from canonical programming books, packaged for Claude Code, Cursor, Copilot, and Windsurf.</p>
229
-
230
- <div id="install">
231
- <div class="install-box" id="cmd">npx skills add booklib-ai/skills --all -g</div>
232
- <button class="copy-btn" onclick="copyCmd()">Copy</button>
233
- </div>
234
-
235
- <div class="badges">
236
- <img src="https://img.shields.io/npm/v/@booklib/skills.svg" alt="npm version"/>
237
- <img src="https://img.shields.io/npm/dw/@booklib/skills.svg" alt="downloads"/>
238
- <img src="https://img.shields.io/github/stars/booklib-ai/skills?style=flat" alt="stars"/>
239
- <img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="license"/>
240
- </div>
241
- </section>
242
-
243
- <section class="skills-section">
244
- <h2>22 skills, 22 books</h2>
245
- <p class="subtitle">Click any skill to see its install command</p>
246
- <div class="skills-grid" id="grid"></div>
247
- </section>
248
-
249
- <footer>
250
- <p>MIT License &middot; <a href="https://github.com/booklib-ai/skills">GitHub</a> &middot; <a href="https://github.com/booklib-ai/skills/blob/main/CONTRIBUTING.md">Contributing</a> &middot; <a href="https://github.com/booklib-ai/skills/blob/main/AGENTS.md">Agent Setup</a></p>
251
- </footer>
252
-
253
- <script>
254
- const SKILLS = [
255
- { name: "animation-at-work", book: "Animation at Work", author: "Rachel Nabors", isbn: "9781937557942", desc: "Motion perception, 12 animation principles, CSS transitions, and performance." },
256
- { name: "clean-code-reviewer", book: "Clean Code", author: "Robert C. Martin", isbn: "9780132350884", desc: "Naming, functions, comments, classes, and the Boy Scout Rule." },
257
- { name: "data-intensive-patterns",book: "Designing Data-Intensive Applications",author: "Martin Kleppmann", isbn: "9781449373320", desc: "Storage engines, replication, transactions, and distributed systems." },
258
- { name: "data-pipelines", book: "Data Pipelines Pocket Reference", author: "James Densmore", isbn: "9781492087601", desc: "Ingestion, streaming, transformation, and orchestration." },
259
- { name: "design-patterns", book: "Head First Design Patterns", author: "Freeman & Robson", isbn: "9781492078005", desc: "GoF creational, structural, and behavioral patterns in depth." },
260
- { name: "domain-driven-design", book: "Domain-Driven Design", author: "Eric Evans", isbn: "9780321125217", desc: "Aggregates, Value Objects, Bounded Contexts, Ubiquitous Language." },
261
- { name: "effective-java", book: "Effective Java", author: "Joshua Bloch", isbn: "9780134685991", desc: "Object creation, generics, enums, lambdas, and concurrency." },
262
- { name: "effective-kotlin", book: "Effective Kotlin", author: "Marcin Moskala", isbn: "9781803248776", desc: "Safety, readability, reusability, and abstraction." },
263
- { name: "effective-python", book: "Effective Python", author: "Brett Slatkin", isbn: "9780134853987", desc: "Pythonic thinking, functions, classes, concurrency, and testing." },
264
- { name: "effective-typescript", book: "Effective TypeScript", author: "Dan Vanderkam", isbn: "9781492053743", desc: "Type system, type design, avoiding any, declarations, and migration." },
265
- { name: "kotlin-in-action", book: "Kotlin in Action", author: "Elizarov & Isakova", isbn: "9781617293290", desc: "Functions, classes, lambdas, nullability, coroutines, and flows." },
266
- { name: "lean-startup", book: "The Lean Startup", author: "Eric Ries", isbn: "9780307887894", desc: "MVP testing, validated learning, Build-Measure-Learn loop." },
267
- { name: "microservices-patterns", book: "Microservices Patterns", author: "Chris Richardson", isbn: "9781617294549", desc: "Decomposition, sagas, API gateways, event sourcing, and CQRS." },
268
- { name: "programming-with-rust", book: "Programming with Rust", author: "Donis Marshall", isbn: "9780137889655", desc: "Ownership, borrowing, lifetimes, error handling, traits, concurrency." },
269
- { name: "refactoring-ui", book: "Refactoring UI", author: "Wathan & Schoger", isbn: null, desc: "Visual hierarchy, layout, typography, color, and spacing." },
270
- { name: "rust-in-action", book: "Rust in Action", author: "Tim McNamara", isbn: "9781617294556", desc: "Systems programming — smart pointers, memory, networking, OS." },
271
- { name: "skill-router", book: "Meta-skill", author: "booklib-ai", isbn: null, desc: "Automatically routes to the most relevant skill for any task." },
272
- { name: "spring-boot-in-action", book: "Spring Boot in Action", author: "Craig Walls", isbn: "9781617292545", desc: "Auto-configuration, starters, testing, Actuator, and deployment." },
273
- { name: "storytelling-with-data", book: "Storytelling with Data", author: "Cole Nussbaumer Knaflic",isbn: "9781119002253", desc: "Effective visuals, decluttering, and narrative structure." },
274
- { name: "system-design-interview",book: "System Design Interview", author: "Alex Xu", isbn: "9798664653403", desc: "Scaling, estimation, load balancing, caching, and sharding." },
275
- { name: "using-asyncio-python", book: "Using Asyncio in Python", author: "Caleb Hattingh", isbn: "9781492075325", desc: "Coroutines, event loop, tasks, and signal handling." },
276
- { name: "web-scraping-python", book: "Web Scraping with Python", author: "Ryan Mitchell", isbn: "9781491985564", desc: "BeautifulSoup, Scrapy, Selenium, and data storage." },
277
- ];
278
-
279
- const ALL_CMD = "npx skills add booklib-ai/skills --all -g";
280
- let activeCard = null;
281
-
282
- function initials(name) {
283
- return name.split(/[\s-]+/).map(w => w[0]).join("").toUpperCase().slice(0, 3);
284
- }
285
-
286
- function buildCard(skill) {
287
- const card = document.createElement("a");
288
- card.className = "skill-card";
289
- card.href = `https://github.com/booklib-ai/skills/tree/main/skills/${skill.name}`;
290
- card.target = "_blank";
291
- card.rel = "noopener";
292
-
293
- const coverHtml = skill.isbn
294
- ? `<img
295
- src="https://covers.openlibrary.org/b/isbn/${skill.isbn}-M.jpg"
296
- alt="${skill.book} cover"
297
- onerror="this.style.display='none';this.nextElementSibling.style.display='flex'"
298
- />
299
- <div class="cover-fallback" style="display:none">
300
- <div class="initials">${initials(skill.book)}</div>
301
- <div class="fallback-title">${skill.book}</div>
302
- </div>`
303
- : `<div class="cover-fallback">
304
- <div class="initials">${initials(skill.book)}</div>
305
- <div class="fallback-title">${skill.book}</div>
306
- </div>`;
307
-
308
- card.innerHTML = `
309
- <div class="cover-wrap">${coverHtml}</div>
310
- <div class="card-body">
311
- <div class="skill-name">${skill.name}</div>
312
- <div class="book-title">${skill.book}</div>
313
- <div class="book-author">${skill.author}</div>
314
- <div class="card-desc">${skill.desc}</div>
315
- </div>
316
- `;
317
-
318
- card.addEventListener("click", (e) => {
319
- e.preventDefault();
320
- selectSkill(skill, card);
321
- });
322
-
323
- return card;
324
- }
325
-
326
- function selectSkill(skill, card) {
327
- // Deactivate previous
328
- if (activeCard && activeCard !== card) {
329
- activeCard.classList.remove("active");
330
- }
331
- const cmdEl = document.getElementById("cmd");
332
-
333
- if (activeCard === card) {
334
- // Deselect — back to install all
335
- activeCard.classList.remove("active");
336
- activeCard = null;
337
- cmdEl.textContent = ALL_CMD;
338
- cmdEl.classList.remove("highlighted");
339
- } else {
340
- activeCard = card;
341
- card.classList.add("active");
342
- cmdEl.textContent = `npx skills add booklib-ai/skills ${skill.name} -g`;
343
- cmdEl.classList.add("highlighted");
344
- document.getElementById("install").scrollIntoView({ behavior: "smooth", block: "center" });
345
- }
346
- }
347
-
348
- function copyCmd() {
349
- const text = document.getElementById("cmd").textContent;
350
- navigator.clipboard.writeText(text);
351
- const btn = document.querySelector(".copy-btn");
352
- btn.textContent = "Copied!";
353
- setTimeout(() => btn.textContent = "Copy", 2000);
354
- }
355
-
356
- // Build grid
357
- const grid = document.getElementById("grid");
358
- SKILLS.forEach(skill => grid.appendChild(buildCard(skill)));
359
- </script>
360
-
361
- </body>
362
- </html>