agileflow 3.2.1 → 3.4.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 (134) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +6 -6
  3. package/lib/feature-flags.js +32 -4
  4. package/lib/skill-loader.js +0 -1
  5. package/package.json +1 -1
  6. package/scripts/agileflow-statusline.sh +81 -0
  7. package/scripts/babysit-clear-restore.js +154 -0
  8. package/scripts/claude-tmux.sh +120 -24
  9. package/scripts/claude-watchdog.sh +225 -0
  10. package/scripts/generators/agent-registry.js +14 -1
  11. package/scripts/generators/inject-babysit.js +22 -9
  12. package/scripts/generators/inject-help.js +19 -9
  13. package/scripts/lib/README-portable-tasks.md +424 -0
  14. package/scripts/lib/audit-cleanup.js +250 -0
  15. package/scripts/lib/audit-registry.js +248 -0
  16. package/scripts/lib/configure-detect.js +20 -0
  17. package/scripts/lib/feature-catalog.js +13 -2
  18. package/scripts/lib/gate-enforcer.js +295 -0
  19. package/scripts/lib/model-profiles.js +98 -0
  20. package/scripts/lib/signal-detectors.js +1 -1
  21. package/scripts/lib/skill-catalog.js +557 -0
  22. package/scripts/lib/skill-recommender.js +311 -0
  23. package/scripts/lib/tdd-phase-manager.js +455 -0
  24. package/scripts/lib/team-events.js +76 -8
  25. package/scripts/lib/tmux-group-colors.js +113 -0
  26. package/scripts/messaging-bridge.js +209 -1
  27. package/scripts/spawn-audit-sessions.js +549 -0
  28. package/scripts/team-manager.js +37 -16
  29. package/scripts/tmux-close-windows.sh +180 -0
  30. package/scripts/tmux-restore-window.sh +67 -0
  31. package/scripts/tmux-save-closed-window.sh +35 -0
  32. package/src/core/agents/ads-audit-budget.md +181 -0
  33. package/src/core/agents/ads-audit-compliance.md +169 -0
  34. package/src/core/agents/ads-audit-creative.md +164 -0
  35. package/src/core/agents/ads-audit-google.md +226 -0
  36. package/src/core/agents/ads-audit-meta.md +183 -0
  37. package/src/core/agents/ads-audit-tracking.md +197 -0
  38. package/src/core/agents/ads-consensus.md +322 -0
  39. package/src/core/agents/brainstorm-analyzer-features.md +169 -0
  40. package/src/core/agents/brainstorm-analyzer-growth.md +161 -0
  41. package/src/core/agents/brainstorm-analyzer-integration.md +172 -0
  42. package/src/core/agents/brainstorm-analyzer-market.md +147 -0
  43. package/src/core/agents/brainstorm-analyzer-ux.md +167 -0
  44. package/src/core/agents/brainstorm-consensus.md +237 -0
  45. package/src/core/agents/completeness-analyzer-api.md +190 -0
  46. package/src/core/agents/completeness-analyzer-conditional.md +201 -0
  47. package/src/core/agents/completeness-analyzer-handlers.md +159 -0
  48. package/src/core/agents/completeness-analyzer-imports.md +159 -0
  49. package/src/core/agents/completeness-analyzer-routes.md +182 -0
  50. package/src/core/agents/completeness-analyzer-state.md +188 -0
  51. package/src/core/agents/completeness-analyzer-stubs.md +198 -0
  52. package/src/core/agents/completeness-consensus.md +286 -0
  53. package/src/core/agents/perf-consensus.md +2 -2
  54. package/src/core/agents/security-consensus.md +2 -2
  55. package/src/core/agents/seo-analyzer-content.md +167 -0
  56. package/src/core/agents/seo-analyzer-images.md +187 -0
  57. package/src/core/agents/seo-analyzer-performance.md +206 -0
  58. package/src/core/agents/seo-analyzer-schema.md +176 -0
  59. package/src/core/agents/seo-analyzer-sitemap.md +172 -0
  60. package/src/core/agents/seo-analyzer-technical.md +144 -0
  61. package/src/core/agents/seo-consensus.md +289 -0
  62. package/src/core/agents/test-consensus.md +2 -2
  63. package/src/core/commands/ads/audit.md +375 -0
  64. package/src/core/commands/ads/budget.md +97 -0
  65. package/src/core/commands/ads/competitor.md +112 -0
  66. package/src/core/commands/ads/creative.md +85 -0
  67. package/src/core/commands/ads/google.md +112 -0
  68. package/src/core/commands/ads/landing.md +119 -0
  69. package/src/core/commands/ads/linkedin.md +112 -0
  70. package/src/core/commands/ads/meta.md +91 -0
  71. package/src/core/commands/ads/microsoft.md +115 -0
  72. package/src/core/commands/ads/plan.md +321 -0
  73. package/src/core/commands/ads/tiktok.md +129 -0
  74. package/src/core/commands/ads/youtube.md +124 -0
  75. package/src/core/commands/ads.md +128 -0
  76. package/src/core/commands/babysit.md +250 -1344
  77. package/src/core/commands/code/completeness.md +466 -0
  78. package/src/core/commands/{audit → code}/legal.md +26 -16
  79. package/src/core/commands/{audit → code}/logic.md +27 -16
  80. package/src/core/commands/{audit → code}/performance.md +30 -20
  81. package/src/core/commands/{audit → code}/security.md +32 -19
  82. package/src/core/commands/{audit → code}/test.md +30 -20
  83. package/src/core/commands/{discovery → ideate}/brief.md +12 -12
  84. package/src/core/commands/{discovery/new.md → ideate/discover.md} +13 -13
  85. package/src/core/commands/ideate/features.md +435 -0
  86. package/src/core/commands/seo/audit.md +373 -0
  87. package/src/core/commands/seo/competitor.md +174 -0
  88. package/src/core/commands/seo/content.md +107 -0
  89. package/src/core/commands/seo/geo.md +229 -0
  90. package/src/core/commands/seo/hreflang.md +140 -0
  91. package/src/core/commands/seo/images.md +96 -0
  92. package/src/core/commands/seo/page.md +198 -0
  93. package/src/core/commands/seo/plan.md +163 -0
  94. package/src/core/commands/seo/programmatic.md +131 -0
  95. package/src/core/commands/seo/references/cwv-thresholds.md +64 -0
  96. package/src/core/commands/seo/references/eeat-framework.md +110 -0
  97. package/src/core/commands/seo/references/quality-gates.md +91 -0
  98. package/src/core/commands/seo/references/schema-types.md +102 -0
  99. package/src/core/commands/seo/schema.md +183 -0
  100. package/src/core/commands/seo/sitemap.md +97 -0
  101. package/src/core/commands/seo/technical.md +100 -0
  102. package/src/core/commands/seo.md +107 -0
  103. package/src/core/commands/skill/list.md +68 -212
  104. package/src/core/commands/skill/recommend.md +216 -0
  105. package/src/core/commands/tdd-next.md +238 -0
  106. package/src/core/commands/tdd.md +210 -0
  107. package/src/core/experts/_core-expertise.yaml +105 -0
  108. package/src/core/experts/analytics/expertise.yaml +5 -99
  109. package/src/core/experts/codebase-query/expertise.yaml +3 -72
  110. package/src/core/experts/compliance/expertise.yaml +6 -72
  111. package/src/core/experts/database/expertise.yaml +9 -52
  112. package/src/core/experts/documentation/expertise.yaml +7 -140
  113. package/src/core/experts/integrations/expertise.yaml +7 -127
  114. package/src/core/experts/mentor/expertise.yaml +8 -35
  115. package/src/core/experts/monitoring/expertise.yaml +7 -49
  116. package/src/core/experts/performance/expertise.yaml +1 -26
  117. package/src/core/experts/security/expertise.yaml +9 -34
  118. package/src/core/experts/ui/expertise.yaml +6 -36
  119. package/src/core/knowledge/ads/ad-audit-checklist-scoring.md +424 -0
  120. package/src/core/knowledge/ads/ad-optimization-logic.md +590 -0
  121. package/src/core/knowledge/ads/ad-technical-specifications.md +385 -0
  122. package/src/core/knowledge/ads/definitive-advertising-reference-2026.md +506 -0
  123. package/src/core/knowledge/ads/paid-advertising-research-2026.md +445 -0
  124. package/src/core/templates/agileflow-metadata.json +15 -1
  125. package/tools/cli/installers/ide/_base-ide.js +42 -5
  126. package/tools/cli/installers/ide/claude-code.js +13 -4
  127. package/tools/cli/lib/content-injector.js +160 -12
  128. package/tools/cli/lib/docs-setup.js +1 -1
  129. package/src/core/commands/skill/create.md +0 -698
  130. package/src/core/commands/skill/delete.md +0 -316
  131. package/src/core/commands/skill/edit.md +0 -359
  132. package/src/core/commands/skill/test.md +0 -394
  133. package/src/core/commands/skill/upgrade.md +0 -552
  134. package/src/core/templates/skill-template.md +0 -117
@@ -0,0 +1,98 @@
1
+ /**
2
+ * model-profiles.js - Model resolution for audit subagents
3
+ *
4
+ * Resolves which model (haiku/sonnet/opus) to use for agent subagents.
5
+ * Models are specified inline via command arguments (MODEL=opus).
6
+ *
7
+ * Resolution order:
8
+ * 1. Explicit MODEL= argument (highest priority)
9
+ * 2. Agent frontmatter model (from .md file)
10
+ * 3. Fallback: 'haiku'
11
+ *
12
+ * Usage:
13
+ * const { resolveModel, estimateCost } = require('./model-profiles');
14
+ * const model = resolveModel('opus', 'haiku'); // returns 'opus'
15
+ * const model2 = resolveModel(null, 'sonnet'); // returns 'sonnet'
16
+ * const model3 = resolveModel(null, null); // returns 'haiku'
17
+ */
18
+
19
+ const VALID_MODELS = ['haiku', 'sonnet', 'opus'];
20
+
21
+ /**
22
+ * Resolve which model to use for a given agent.
23
+ *
24
+ * Resolution order:
25
+ * 1. Explicit model argument (MODEL= from command)
26
+ * 2. Agent frontmatter model
27
+ * 3. Fallback: 'haiku'
28
+ *
29
+ * @param {string} [explicitModel] - MODEL= argument value
30
+ * @param {string} [frontmatterModel] - Model from agent .md frontmatter
31
+ * @returns {string} Model name: 'haiku', 'sonnet', or 'opus'
32
+ */
33
+ function resolveModel(explicitModel, frontmatterModel) {
34
+ // 1. Explicit MODEL= argument
35
+ if (explicitModel && VALID_MODELS.includes(explicitModel.toLowerCase())) {
36
+ return explicitModel.toLowerCase();
37
+ }
38
+
39
+ // 2. Frontmatter model
40
+ if (frontmatterModel && VALID_MODELS.includes(frontmatterModel.toLowerCase())) {
41
+ return frontmatterModel.toLowerCase();
42
+ }
43
+
44
+ // 3. Fallback
45
+ return 'haiku';
46
+ }
47
+
48
+ /**
49
+ * Validate a model name.
50
+ *
51
+ * @param {string} model - Model name to validate
52
+ * @returns {boolean} True if valid
53
+ */
54
+ function isValidModel(model) {
55
+ return !!model && VALID_MODELS.includes(model.toLowerCase());
56
+ }
57
+
58
+ /**
59
+ * Estimate cost multiplier for a model relative to haiku baseline.
60
+ *
61
+ * @param {string} model - Model name
62
+ * @param {number} [analyzerCount=5] - Number of analyzers
63
+ * @returns {{ multiplier: number, model: string, perAnalyzerCost: string }}
64
+ */
65
+ function estimateCost(model, analyzerCount) {
66
+ let MODEL_PRICING;
67
+ try {
68
+ MODEL_PRICING = require('./team-events').MODEL_PRICING;
69
+ } catch (_) {
70
+ MODEL_PRICING = {
71
+ haiku: { input: 0.8, output: 4.0 },
72
+ sonnet: { input: 3.0, output: 15.0 },
73
+ opus: { input: 15.0, output: 75.0 },
74
+ };
75
+ }
76
+
77
+ const count = analyzerCount || 5;
78
+ const resolved = resolveModel(model);
79
+ const pricing = MODEL_PRICING[resolved] || MODEL_PRICING.haiku;
80
+ const haikuPricing = MODEL_PRICING.haiku;
81
+
82
+ const multiplier = pricing.output / haikuPricing.output;
83
+ const perAnalyzer = `$${((pricing.input * 50000) / 1_000_000 + (pricing.output * 10000) / 1_000_000).toFixed(3)}`;
84
+
85
+ return {
86
+ multiplier: Math.round(multiplier * 100) / 100,
87
+ model: resolved,
88
+ perAnalyzerCost: perAnalyzer,
89
+ totalEstimate: `~$${(count * ((pricing.input * 50000) / 1_000_000 + (pricing.output * 10000) / 1_000_000)).toFixed(2)}`,
90
+ };
91
+ }
92
+
93
+ module.exports = {
94
+ VALID_MODELS,
95
+ resolveModel,
96
+ isValidModel,
97
+ estimateCost,
98
+ };
@@ -546,7 +546,7 @@ const FEATURE_DETECTORS = {
546
546
  priority: 'medium',
547
547
  trigger: `${coreFiles} source files modified - logic audit available`,
548
548
  action: 'offer',
549
- command: '/agileflow:audit:logic',
549
+ command: '/agileflow:code:logic',
550
550
  phase: 'post-impl',
551
551
  });
552
552
  },
@@ -0,0 +1,557 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * skill-catalog.js
4
+ *
5
+ * Two-tier skill discovery for AgileFlow:
6
+ *
7
+ * Tier 1: Curated picks (~60 vetted skills shipped with AgileFlow)
8
+ * - Organized by category (Frontend, Backend, Database, Testing, DevOps, Security)
9
+ * - Each entry has name, repo, description, tags, category, installCmd
10
+ *
11
+ * Tier 2: Live search from skills.sh via `npx skills search <keyword>`
12
+ * - Users always see curated picks first, then "Browse more on skills.sh"
13
+ */
14
+
15
+ 'use strict';
16
+
17
+ // =============================================================================
18
+ // Curated Skill Catalog
19
+ // =============================================================================
20
+
21
+ /**
22
+ * Create a curated skill entry.
23
+ * @param {string} name - Skill display name
24
+ * @param {string} repo - GitHub owner/repo or registry identifier
25
+ * @param {string} description - Short description
26
+ * @param {string[]} tags - Technology tags for matching
27
+ * @param {string} category - Category grouping
28
+ * @returns {Object} Curated skill entry
29
+ */
30
+ function skill(name, repo, description, tags, category) {
31
+ return {
32
+ name,
33
+ repo,
34
+ description,
35
+ tags,
36
+ category,
37
+ installCmd: `npx skills add ${repo}`,
38
+ };
39
+ }
40
+
41
+ /**
42
+ * Full curated catalog of vetted skills.
43
+ * Organized by category for display and filtered by tags for recommendations.
44
+ */
45
+ const CURATED_SKILLS = [
46
+ // ===== Frontend (13) =====
47
+ skill(
48
+ 'react-best-practices',
49
+ 'vercel/agent-skills',
50
+ 'React patterns, hooks, and component architecture',
51
+ ['react', 'jsx', 'hooks'],
52
+ 'Frontend'
53
+ ),
54
+ skill(
55
+ 'next-best-practices',
56
+ 'vercel/next-skills',
57
+ 'Next.js App Router, RSC, and data fetching patterns',
58
+ ['next', 'nextjs', 'react', 'app-router'],
59
+ 'Frontend'
60
+ ),
61
+ skill(
62
+ 'web-design-guidelines',
63
+ 'vercel/agent-skills',
64
+ 'Web design principles and responsive layouts',
65
+ ['design', 'css', 'responsive'],
66
+ 'Frontend'
67
+ ),
68
+ skill(
69
+ 'frontend-design',
70
+ 'anthropics/skills',
71
+ 'Frontend design system and component patterns',
72
+ ['frontend', 'design-system', 'components'],
73
+ 'Frontend'
74
+ ),
75
+ skill(
76
+ 'web-artifacts-builder',
77
+ 'anthropics/skills',
78
+ 'Build interactive web artifacts and prototypes',
79
+ ['html', 'css', 'javascript', 'prototype'],
80
+ 'Frontend'
81
+ ),
82
+ skill(
83
+ 'svelte5-sveltekit',
84
+ 'claude-skills/sveltekit-svelte5-tailwind-skill',
85
+ 'Svelte 5 runes, SvelteKit routing, and Tailwind integration',
86
+ ['svelte', 'sveltekit', 'tailwind'],
87
+ 'Frontend'
88
+ ),
89
+ skill(
90
+ 'vue-development',
91
+ 'alexanderop/claude-skill-vue-development',
92
+ 'Vue 3 Composition API and ecosystem patterns',
93
+ ['vue', 'vuejs', 'vue3', 'pinia'],
94
+ 'Frontend'
95
+ ),
96
+ skill(
97
+ 'typescript-pro',
98
+ 'anthropics/skills',
99
+ 'Advanced TypeScript patterns, generics, and type utilities',
100
+ ['typescript', 'ts'],
101
+ 'Frontend'
102
+ ),
103
+ skill(
104
+ 'tailwind-mastery',
105
+ 'anthropics/skills',
106
+ 'Tailwind CSS utility patterns and custom configurations',
107
+ ['tailwind', 'tailwindcss', 'css'],
108
+ 'Frontend'
109
+ ),
110
+ skill(
111
+ 'angular-best-practices',
112
+ 'anthropics/skills',
113
+ 'Angular signals, standalone components, and RxJS patterns',
114
+ ['angular', 'rxjs'],
115
+ 'Frontend'
116
+ ),
117
+ skill(
118
+ 'component-library',
119
+ 'anthropics/skills',
120
+ 'Building reusable component libraries with design tokens',
121
+ ['components', 'design-tokens', 'storybook'],
122
+ 'Frontend'
123
+ ),
124
+ skill(
125
+ 'react-native-guidelines',
126
+ 'anthropics/skills',
127
+ 'React Native mobile development patterns',
128
+ ['react-native', 'mobile', 'expo'],
129
+ 'Frontend'
130
+ ),
131
+ skill(
132
+ 'composition-patterns',
133
+ 'anthropics/skills',
134
+ 'Composition over inheritance in frontend architectures',
135
+ ['composition', 'patterns', 'architecture'],
136
+ 'Frontend'
137
+ ),
138
+
139
+ // ===== Backend (11) =====
140
+ skill(
141
+ 'graphql-api-dev',
142
+ 'anthropics/skills',
143
+ 'GraphQL schema design, resolvers, and federation',
144
+ ['graphql', 'apollo', 'api'],
145
+ 'Backend'
146
+ ),
147
+ skill(
148
+ 'apollo-skills',
149
+ 'apollographql/skills',
150
+ 'Apollo GraphQL server and client best practices',
151
+ ['apollo', 'graphql'],
152
+ 'Backend'
153
+ ),
154
+ skill(
155
+ 'backend-patterns',
156
+ 'affaan-m/everything-claude-code',
157
+ 'Comprehensive backend architecture patterns',
158
+ ['backend', 'api', 'architecture'],
159
+ 'Backend'
160
+ ),
161
+ skill(
162
+ 'express-best-practices',
163
+ 'anthropics/skills',
164
+ 'Express.js middleware, routing, and error handling',
165
+ ['express', 'expressjs', 'node'],
166
+ 'Backend'
167
+ ),
168
+ skill(
169
+ 'fastapi-pydantic',
170
+ 'anthropics/skills',
171
+ 'FastAPI with Pydantic models and dependency injection',
172
+ ['fastapi', 'python', 'pydantic'],
173
+ 'Backend'
174
+ ),
175
+ skill(
176
+ 'nodejs-patterns',
177
+ 'Jeffallan/claude-skills',
178
+ 'Node.js patterns for scalable applications',
179
+ ['node', 'nodejs', 'javascript'],
180
+ 'Backend'
181
+ ),
182
+ skill(
183
+ 'python-backend',
184
+ 'greyhaven-ai/claude-code-config',
185
+ 'Python backend development with best practices',
186
+ ['python', 'django', 'flask'],
187
+ 'Backend'
188
+ ),
189
+ skill(
190
+ 'microservices-arch',
191
+ 'anthropics/skills',
192
+ 'Microservices architecture and communication patterns',
193
+ ['microservices', 'distributed', 'event-driven'],
194
+ 'Backend'
195
+ ),
196
+ skill(
197
+ 'websocket-patterns',
198
+ 'anthropics/skills',
199
+ 'WebSocket real-time communication patterns',
200
+ ['websocket', 'ws', 'socket.io', 'real-time'],
201
+ 'Backend'
202
+ ),
203
+ skill(
204
+ 'api-design-mastery',
205
+ 'anthropics/skills',
206
+ 'REST API design, versioning, and documentation',
207
+ ['rest', 'api', 'openapi'],
208
+ 'Backend'
209
+ ),
210
+ skill(
211
+ 'go-backend',
212
+ 'anthropics/skills',
213
+ 'Go backend patterns with net/http and standard library',
214
+ ['go', 'golang'],
215
+ 'Backend'
216
+ ),
217
+
218
+ // ===== Database (8) =====
219
+ skill(
220
+ 'prisma-orm',
221
+ 'mcpmarket/skills',
222
+ 'Prisma schema design, migrations, and query patterns',
223
+ ['prisma', 'orm', 'database'],
224
+ 'Database'
225
+ ),
226
+ skill(
227
+ 'supabase-ops',
228
+ 'supabase/agent-skills',
229
+ 'Supabase database, auth, storage, and edge functions',
230
+ ['supabase', 'postgres', 'auth'],
231
+ 'Database'
232
+ ),
233
+ skill(
234
+ 'mongodb-patterns',
235
+ 'anthropics/skills',
236
+ 'MongoDB schema design, aggregation, and indexing',
237
+ ['mongodb', 'mongoose', 'nosql'],
238
+ 'Database'
239
+ ),
240
+ skill(
241
+ 'postgresql-advanced',
242
+ 'anthropics/skills',
243
+ 'PostgreSQL advanced queries, indexing, and performance',
244
+ ['postgresql', 'postgres', 'pg', 'sql'],
245
+ 'Database'
246
+ ),
247
+ skill(
248
+ 'redis-patterns',
249
+ 'anthropics/skills',
250
+ 'Redis caching, pub/sub, and data structure patterns',
251
+ ['redis', 'cache', 'pub-sub'],
252
+ 'Database'
253
+ ),
254
+ skill(
255
+ 'db-migrations',
256
+ 'anthropics/skills',
257
+ 'Database migration strategies and zero-downtime changes',
258
+ ['migrations', 'database', 'schema'],
259
+ 'Database'
260
+ ),
261
+ skill(
262
+ 'drizzle-orm',
263
+ 'anthropics/skills',
264
+ 'Drizzle ORM schema definition and type-safe queries',
265
+ ['drizzle', 'orm', 'typescript'],
266
+ 'Database'
267
+ ),
268
+ skill(
269
+ 'data-pipelines',
270
+ 'K-Dense-AI/claude-scientific-skills',
271
+ 'Data pipeline design and ETL patterns',
272
+ ['data', 'pipeline', 'etl'],
273
+ 'Database'
274
+ ),
275
+
276
+ // ===== Testing (10) =====
277
+ skill(
278
+ 'tdd-enforcement',
279
+ 'jmagly/claude-skills',
280
+ 'Test-driven development workflow and patterns',
281
+ ['tdd', 'testing', 'test-first'],
282
+ 'Testing'
283
+ ),
284
+ skill(
285
+ 'python-testing',
286
+ 'laurigates/claude-plugins',
287
+ 'Python testing with pytest, fixtures, and mocks',
288
+ ['pytest', 'python', 'testing'],
289
+ 'Testing'
290
+ ),
291
+ skill(
292
+ 'playwright-automation',
293
+ 'anthropics/skills',
294
+ 'Playwright end-to-end testing and browser automation',
295
+ ['playwright', 'e2e', 'testing'],
296
+ 'Testing'
297
+ ),
298
+ skill(
299
+ 'jest-testing',
300
+ 'anthropics/skills',
301
+ 'Jest unit and integration testing patterns',
302
+ ['jest', 'testing', 'javascript'],
303
+ 'Testing'
304
+ ),
305
+ skill(
306
+ 'k6-load-testing',
307
+ 'anthropics/skills',
308
+ 'k6 performance and load testing scripts',
309
+ ['k6', 'load-testing', 'performance'],
310
+ 'Testing'
311
+ ),
312
+ skill(
313
+ 'cypress-e2e',
314
+ 'anthropics/skills',
315
+ 'Cypress end-to-end testing with component tests',
316
+ ['cypress', 'e2e', 'testing'],
317
+ 'Testing'
318
+ ),
319
+ skill(
320
+ 'accessibility-testing',
321
+ 'anthropics/skills',
322
+ 'Automated accessibility testing with axe and WAVE',
323
+ ['a11y', 'accessibility', 'wcag'],
324
+ 'Testing'
325
+ ),
326
+ skill(
327
+ 'unit-test-patterns',
328
+ 'anthropics/skills',
329
+ 'Unit testing patterns, mocking, and test organization',
330
+ ['unit-test', 'testing', 'mocking'],
331
+ 'Testing'
332
+ ),
333
+ skill(
334
+ 'integration-testing',
335
+ 'anthropics/skills',
336
+ 'Integration testing strategies for APIs and databases',
337
+ ['integration', 'testing', 'api-testing'],
338
+ 'Testing'
339
+ ),
340
+ skill(
341
+ 'vitest-framework',
342
+ 'anthropics/skills',
343
+ 'Vitest fast unit testing with Vite integration',
344
+ ['vitest', 'vite', 'testing'],
345
+ 'Testing'
346
+ ),
347
+
348
+ // ===== DevOps (9) =====
349
+ skill(
350
+ 'devops-engineer',
351
+ 'Jeffallan/claude-skills',
352
+ 'DevOps best practices and infrastructure patterns',
353
+ ['devops', 'infrastructure', 'ci-cd'],
354
+ 'DevOps'
355
+ ),
356
+ skill(
357
+ 'devops-cloudskills',
358
+ 'ahmedasmar/devops-claude-skills',
359
+ 'Cloud-native DevOps with AWS, GCP, and Azure',
360
+ ['aws', 'gcp', 'azure', 'cloud'],
361
+ 'DevOps'
362
+ ),
363
+ skill(
364
+ 'github-actions',
365
+ 'anthropics/skills',
366
+ 'GitHub Actions workflow design and optimization',
367
+ ['github-actions', 'ci', 'automation'],
368
+ 'DevOps'
369
+ ),
370
+ skill(
371
+ 'dockerfile-best-practices',
372
+ 'anthropics/skills',
373
+ 'Dockerfile optimization, multi-stage builds, and security',
374
+ ['docker', 'dockerfile', 'containers'],
375
+ 'DevOps'
376
+ ),
377
+ skill(
378
+ 'kubernetes-troubleshooting',
379
+ 'anthropics/skills',
380
+ 'Kubernetes debugging, scaling, and resource management',
381
+ ['kubernetes', 'k8s', 'helm'],
382
+ 'DevOps'
383
+ ),
384
+ skill(
385
+ 'terraform-iac',
386
+ 'anthropics/skills',
387
+ 'Terraform infrastructure as code patterns',
388
+ ['terraform', 'iac', 'infrastructure'],
389
+ 'DevOps'
390
+ ),
391
+ skill(
392
+ 'vercel-deploy',
393
+ 'vercel/agent-skills',
394
+ 'Vercel deployment, edge functions, and configuration',
395
+ ['vercel', 'deployment', 'edge'],
396
+ 'DevOps'
397
+ ),
398
+ skill(
399
+ 'nginx-config',
400
+ 'anthropics/skills',
401
+ 'Nginx reverse proxy, load balancing, and TLS setup',
402
+ ['nginx', 'reverse-proxy', 'tls'],
403
+ 'DevOps'
404
+ ),
405
+ skill(
406
+ 'monitoring-observability',
407
+ 'anthropics/skills',
408
+ 'Application monitoring with Prometheus, Grafana, and OpenTelemetry',
409
+ ['monitoring', 'prometheus', 'grafana'],
410
+ 'DevOps'
411
+ ),
412
+
413
+ // ===== Security (8) =====
414
+ skill(
415
+ 'owasp-2025',
416
+ 'agamm/claude-code-owasp',
417
+ 'OWASP Top 10 2025 security checks and prevention',
418
+ ['owasp', 'security', 'vulnerabilities'],
419
+ 'Security'
420
+ ),
421
+ skill(
422
+ 'security-code-review',
423
+ 'harperaa/secure-claude-skills',
424
+ 'Security-focused code review patterns',
425
+ ['security', 'code-review', 'audit'],
426
+ 'Security'
427
+ ),
428
+ skill(
429
+ 'trail-of-bits',
430
+ 'trailofbits/agent-skills',
431
+ 'Trail of Bits security analysis patterns',
432
+ ['security', 'audit', 'vulnerabilities'],
433
+ 'Security'
434
+ ),
435
+ skill(
436
+ 'input-validation',
437
+ 'anthropics/skills',
438
+ 'Input validation and sanitization patterns',
439
+ ['validation', 'sanitization', 'security'],
440
+ 'Security'
441
+ ),
442
+ skill(
443
+ 'auth-patterns',
444
+ 'anthropics/skills',
445
+ 'Authentication with JWT, OAuth, and session management',
446
+ ['auth', 'jwt', 'oauth', 'session'],
447
+ 'Security'
448
+ ),
449
+ skill(
450
+ 'authz-rbac',
451
+ 'anthropics/skills',
452
+ 'Authorization with RBAC, ABAC, and policy engines',
453
+ ['rbac', 'authorization', 'permissions'],
454
+ 'Security'
455
+ ),
456
+ skill(
457
+ 'security-headers',
458
+ 'anthropics/skills',
459
+ 'HTTP security headers and CSP configuration',
460
+ ['security-headers', 'csp', 'cors'],
461
+ 'Security'
462
+ ),
463
+ skill(
464
+ 'php-security-audit',
465
+ 'anthropics/skills',
466
+ 'PHP security audit for common vulnerabilities',
467
+ ['php', 'security', 'audit'],
468
+ 'Security'
469
+ ),
470
+ ];
471
+
472
+ // =============================================================================
473
+ // Catalog Query Functions
474
+ // =============================================================================
475
+
476
+ /**
477
+ * Get all curated skills.
478
+ * @returns {Object[]} Full curated catalog
479
+ */
480
+ function getAllCuratedSkills() {
481
+ return CURATED_SKILLS;
482
+ }
483
+
484
+ /**
485
+ * Get curated skills by category.
486
+ * @param {string} category - Category name
487
+ * @returns {Object[]} Skills in that category
488
+ */
489
+ function getByCategory(category) {
490
+ return CURATED_SKILLS.filter(s => s.category === category);
491
+ }
492
+
493
+ /**
494
+ * Get all category names with counts.
495
+ * @returns {Object} Map of category name to count
496
+ */
497
+ function getCategoryCounts() {
498
+ const counts = {};
499
+ for (const s of CURATED_SKILLS) {
500
+ counts[s.category] = (counts[s.category] || 0) + 1;
501
+ }
502
+ return counts;
503
+ }
504
+
505
+ /**
506
+ * Search curated skills by tag.
507
+ * @param {string} tag - Tag to search for
508
+ * @returns {Object[]} Matching skills
509
+ */
510
+ function searchByTag(tag) {
511
+ const lower = tag.toLowerCase();
512
+ return CURATED_SKILLS.filter(s => s.tags.some(t => t.includes(lower)));
513
+ }
514
+
515
+ /**
516
+ * Search curated skills by keyword (searches name + description + tags).
517
+ * @param {string} keyword - Keyword to search for
518
+ * @returns {Object[]} Matching skills sorted by relevance
519
+ */
520
+ function searchByKeyword(keyword) {
521
+ const lower = keyword.toLowerCase();
522
+ return CURATED_SKILLS.filter(s => {
523
+ return (
524
+ s.name.toLowerCase().includes(lower) ||
525
+ s.description.toLowerCase().includes(lower) ||
526
+ s.tags.some(t => t.includes(lower))
527
+ );
528
+ });
529
+ }
530
+
531
+ /**
532
+ * Get the live search command for skills.sh marketplace.
533
+ * @param {string} keyword - Search term
534
+ * @returns {string} Command to run
535
+ */
536
+ function getLiveSearchCommand(keyword) {
537
+ return `npx skills search ${keyword}`;
538
+ }
539
+
540
+ /**
541
+ * Get the full marketplace browse command.
542
+ * @returns {string} Command to run
543
+ */
544
+ function getBrowseCommand() {
545
+ return 'npx skills find';
546
+ }
547
+
548
+ module.exports = {
549
+ CURATED_SKILLS,
550
+ getAllCuratedSkills,
551
+ getByCategory,
552
+ getCategoryCounts,
553
+ searchByTag,
554
+ searchByKeyword,
555
+ getLiveSearchCommand,
556
+ getBrowseCommand,
557
+ };