superskills 0.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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +363 -0
  3. package/bin/superskills +6 -0
  4. package/dist/catalog/index.d.ts +11 -0
  5. package/dist/catalog/index.d.ts.map +1 -0
  6. package/dist/catalog/index.js +203 -0
  7. package/dist/catalog/index.js.map +1 -0
  8. package/dist/catalog/tools-catalog.json +243 -0
  9. package/dist/catalog/types.d.ts +59 -0
  10. package/dist/catalog/types.d.ts.map +1 -0
  11. package/dist/catalog/types.js +2 -0
  12. package/dist/catalog/types.js.map +1 -0
  13. package/dist/catalog/ui.d.ts +4 -0
  14. package/dist/catalog/ui.d.ts.map +1 -0
  15. package/dist/catalog/ui.js +86 -0
  16. package/dist/catalog/ui.js.map +1 -0
  17. package/dist/cli/colors.d.ts +8 -0
  18. package/dist/cli/colors.d.ts.map +1 -0
  19. package/dist/cli/colors.js +11 -0
  20. package/dist/cli/colors.js.map +1 -0
  21. package/dist/discovery/analyze.d.ts +5 -0
  22. package/dist/discovery/analyze.d.ts.map +1 -0
  23. package/dist/discovery/analyze.js +190 -0
  24. package/dist/discovery/analyze.js.map +1 -0
  25. package/dist/discovery/core.d.ts +16 -0
  26. package/dist/discovery/core.d.ts.map +1 -0
  27. package/dist/discovery/core.js +51 -0
  28. package/dist/discovery/core.js.map +1 -0
  29. package/dist/discovery/index.d.ts +4 -0
  30. package/dist/discovery/index.d.ts.map +1 -0
  31. package/dist/discovery/index.js +233 -0
  32. package/dist/discovery/index.js.map +1 -0
  33. package/dist/discovery/schema.d.ts +111 -0
  34. package/dist/discovery/schema.d.ts.map +1 -0
  35. package/dist/discovery/schema.js +87 -0
  36. package/dist/discovery/schema.js.map +1 -0
  37. package/dist/discovery/types.d.ts +56 -0
  38. package/dist/discovery/types.d.ts.map +1 -0
  39. package/dist/discovery/types.js +2 -0
  40. package/dist/discovery/types.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +523 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/scaffold/index.d.ts +4 -0
  46. package/dist/scaffold/index.d.ts.map +1 -0
  47. package/dist/scaffold/index.js +262 -0
  48. package/dist/scaffold/index.js.map +1 -0
  49. package/dist/scaffold/templates/claude-md.d.ts +4 -0
  50. package/dist/scaffold/templates/claude-md.d.ts.map +1 -0
  51. package/dist/scaffold/templates/claude-md.js +229 -0
  52. package/dist/scaffold/templates/claude-md.js.map +1 -0
  53. package/dist/scaffold/templates/claude-settings.d.ts +3 -0
  54. package/dist/scaffold/templates/claude-settings.d.ts.map +1 -0
  55. package/dist/scaffold/templates/claude-settings.js +48 -0
  56. package/dist/scaffold/templates/claude-settings.js.map +1 -0
  57. package/dist/scaffold/templates/env-example.d.ts +3 -0
  58. package/dist/scaffold/templates/env-example.d.ts.map +1 -0
  59. package/dist/scaffold/templates/env-example.js +103 -0
  60. package/dist/scaffold/templates/env-example.js.map +1 -0
  61. package/dist/scaffold/templates/package-json.d.ts +2 -0
  62. package/dist/scaffold/templates/package-json.d.ts.map +1 -0
  63. package/dist/scaffold/templates/package-json.js +56 -0
  64. package/dist/scaffold/templates/package-json.js.map +1 -0
  65. package/dist/scaffold/templates/project-files.d.ts +4 -0
  66. package/dist/scaffold/templates/project-files.d.ts.map +1 -0
  67. package/dist/scaffold/templates/project-files.js +459 -0
  68. package/dist/scaffold/templates/project-files.js.map +1 -0
  69. package/dist/scaffold/templates/skill-agents.d.ts +4 -0
  70. package/dist/scaffold/templates/skill-agents.d.ts.map +1 -0
  71. package/dist/scaffold/templates/skill-agents.js +68 -0
  72. package/dist/scaffold/templates/skill-agents.js.map +1 -0
  73. package/dist/scaffold/templates/skill-commands.d.ts +3 -0
  74. package/dist/scaffold/templates/skill-commands.d.ts.map +1 -0
  75. package/dist/scaffold/templates/skill-commands.js +509 -0
  76. package/dist/scaffold/templates/skill-commands.js.map +1 -0
  77. package/dist/scaffold/templates/teammate-prompts.d.ts +8 -0
  78. package/dist/scaffold/templates/teammate-prompts.d.ts.map +1 -0
  79. package/dist/scaffold/templates/teammate-prompts.js +506 -0
  80. package/dist/scaffold/templates/teammate-prompts.js.map +1 -0
  81. package/dist/scaffold/types.d.ts +68 -0
  82. package/dist/scaffold/types.d.ts.map +1 -0
  83. package/dist/scaffold/types.js +2 -0
  84. package/dist/scaffold/types.js.map +1 -0
  85. package/dist/scaffold/ui.d.ts +5 -0
  86. package/dist/scaffold/ui.d.ts.map +1 -0
  87. package/dist/scaffold/ui.js +127 -0
  88. package/dist/scaffold/ui.js.map +1 -0
  89. package/dist/utils/logger.d.ts +3 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +8 -0
  92. package/dist/utils/logger.js.map +1 -0
  93. package/package.json +69 -0
@@ -0,0 +1,506 @@
1
+ export function createStrategyPrompt(discovery) {
2
+ return `# Strategy Skill
3
+
4
+ Strategy and opportunity checks for **${discovery.projectName}**.
5
+
6
+ ## Primary Output
7
+
8
+ Append findings to the Architecture Decisions section of CLAUDE.md. Never delete previous entries.
9
+
10
+ ## What This Does
11
+
12
+ Two things:
13
+ 1. **Alignment check** — verify changes stay aligned with the EIID framework
14
+ 2. **Opportunity scan** — proactively suggest new enrichment sources, inference patterns, interpretation angles, and delivery channels that the project is not using yet
15
+
16
+ The opportunity scan is the more valuable output. The alignment check catches drift. The opportunity scan opens new value.
17
+
18
+ Max 400 words per review. Flag issues, skip praise. Suggest concretely.
19
+
20
+ ## Project Context
21
+
22
+ **Problem:** ${discovery.problem}
23
+
24
+ **Desired Outcome:** ${discovery.desiredOutcome}
25
+
26
+ **Strategic Analysis:**
27
+ - Industry context: ${discovery.strategicAnalysis.industryContext}
28
+ - Value movement: ${discovery.strategicAnalysis.valueMovement}
29
+ - Current position: ${discovery.strategicAnalysis.currentPosition}
30
+ - Target position: ${discovery.strategicAnalysis.targetPosition}
31
+
32
+ ## EIID Framework (current mapping)
33
+
34
+ **Enrichment:**
35
+ - Existing data: ${discovery.eiidMapping.enrichment.existingData.join(', ') || 'None specified'}
36
+ - Missing data: ${discovery.eiidMapping.enrichment.missingData.join(', ') || 'None specified'}
37
+ - Sources: ${discovery.eiidMapping.enrichment.sources.join(', ') || 'None specified'}
38
+
39
+ **Inference:**
40
+ - Patterns to detect: ${discovery.eiidMapping.inference.patterns.join(', ') || 'None specified'}
41
+ - Predictions: ${discovery.eiidMapping.inference.predictions.join(', ') || 'None specified'}
42
+ - Anomalies: ${discovery.eiidMapping.inference.anomalies.join(', ') || 'None specified'}
43
+
44
+ **Interpretation:**
45
+ - Insights: ${discovery.eiidMapping.interpretation.insights.join(', ') || 'None specified'}
46
+
47
+ **Delivery:**
48
+ - Channels: ${discovery.eiidMapping.delivery.channels.join(', ') || 'None specified'}
49
+ - Triggers: ${discovery.eiidMapping.delivery.triggers.join(', ') || 'None specified'}
50
+
51
+ ## Part 1: Alignment Check
52
+
53
+ For each change, check:
54
+
55
+ 1. **EIID Alignment** — Does this change support one of the four layers?
56
+ 2. **Strategic Fit** — Does this move toward the target position?
57
+ 3. **Scope Creep** — Is this feature in scope? Should it be deferred?
58
+
59
+ If everything aligns, write "Aligned" and move to Part 2.
60
+
61
+ ## Part 2: Opportunity Scan
62
+
63
+ This is the proactive part. Look at the current codebase and EIID mapping and suggest:
64
+
65
+ ### Enrichment Opportunities
66
+ - Data sources available but not connected (public APIs, partner data, user behavior data)
67
+ - Data the project collects but does not use for inference
68
+ - Cross-referencing opportunities between existing sources
69
+
70
+ ### Inference Opportunities
71
+ - Patterns that could be detected from existing data but are not being analyzed
72
+ - Predictions that the data supports but no one has built yet
73
+ - Anomaly detection that would catch problems before they reach users
74
+
75
+ ### Interpretation Opportunities
76
+ - Insights the system generates but does not surface clearly enough
77
+ - New angles on existing data (e.g., trend over time, comparison across segments, outlier explanation)
78
+ - Context that would make existing insights more actionable
79
+
80
+ ### Delivery Opportunities
81
+ - Channels the users frequent but the system does not reach
82
+ - Timing improvements (deliver sooner, deliver at the right moment)
83
+ - Trigger conditions that would catch events currently missed
84
+
85
+ ### Examples of good opportunity findings
86
+
87
+ - "Supplier data is available but not used for delay prediction. Enrichment opportunity."
88
+ - "Order anomaly patterns could predict customer churn. Inference opportunity."
89
+ - "The weekly report summarizes but does not explain why metrics changed. Interpretation opportunity."
90
+ - "Email reports work but Slack would reach the ops team faster. Delivery opportunity."
91
+ - "User login timestamps are collected but not analyzed for usage patterns. Inference opportunity."
92
+
93
+ ## Output Format
94
+
95
+ Append to CLAUDE.md Architecture Decisions:
96
+
97
+ ### [Date] - [Brief Title]
98
+
99
+ **Type:** alignment-check | opportunity | drift-warning | decision
100
+
101
+ **Layer:** enrichment | inference | interpretation | delivery | general
102
+
103
+ **Summary:** 1-2 sentences max.
104
+
105
+ **Recommendation:** What to do next.
106
+
107
+ ## Done Condition
108
+
109
+ Stop after:
110
+ 1. Alignment check (one sentence per EIID layer)
111
+ 2. At least one opportunity suggestion (or "No new opportunities found" if genuinely none)
112
+
113
+ ## Limits
114
+
115
+ - Advisory only. Does not block.
116
+ - Strategy scope only, not implementation details.
117
+ - Opportunities are suggestions, not requirements. The human decides.
118
+ - When uncertain, flag the question for the human.`;
119
+ }
120
+ export function createDesignPrompt(discovery) {
121
+ return `# Design Skill
122
+
123
+ Design checks for **${discovery.projectName}**.
124
+
125
+ ## Primary Output
126
+
127
+ Append design findings to CLAUDE.md after every review.
128
+
129
+ ## What This Checks
130
+
131
+ Correct use of shadcnblocks, shadcn, design tokens, accessibility, and responsive design.
132
+ Max 300 words. One issue per block, max 5 issues per review.
133
+
134
+ ## HARD RULES
135
+
136
+ These rules are non-negotiable. Every violation is a finding.
137
+
138
+ ### Rule 1: shadcnblocks FIRST
139
+
140
+ Before building any UI section, check if a shadcnblocks block exists for it.
141
+ shadcnblocks has 1351 blocks across 90+ categories: hero, pricing, dashboard, auth, settings, e-commerce, features, testimonials, FAQ, footer, navbar, sidebar, stats, CTA, contact, blog, 404, and more.
142
+
143
+ Install blocks via the shadcn CLI with the \`@shadcnblocks\` namespace:
144
+
145
+ \`\`\`bash
146
+ npx shadcn add @shadcnblocks/hero125
147
+ npx shadcn add @shadcnblocks/pricing3
148
+ npx shadcn add @shadcnblocks/login1
149
+ npx shadcn add @shadcnblocks/sidebar10
150
+ \`\`\`
151
+
152
+ If a block exists for the use case, USE IT. Do not build from scratch.
153
+ Pro blocks require SHADCNBLOCKS_API_KEY configured in components.json.
154
+
155
+ ### Rule 2: shadcn base SECOND
156
+
157
+ If no shadcnblocks block fits, use standard shadcn components: button, card, input, label, badge, dialog, dropdown-menu, table, tabs, sheet, separator, avatar, tooltip.
158
+
159
+ \`\`\`bash
160
+ npx shadcn add button card input label
161
+ \`\`\`
162
+
163
+ ### Rule 3: NEVER custom CSS classes
164
+
165
+ No \`.my-card\`, no \`.custom-header\`, no \`.hero-section\`. Zero custom CSS class names.
166
+ All styling through Tailwind utility classes that read from theme variables.
167
+
168
+ ### Rule 4: Global token file required
169
+
170
+ \`src/app/globals.css\` must define CSS custom properties for:
171
+ - Colors in HSL format (--primary, --secondary, --accent, --destructive, --muted, --card, --popover, --border, --ring, --background, --foreground)
172
+ - Border radius (--radius)
173
+ - Spacing scale if non-default
174
+
175
+ \`tailwind.config.ts\` extends the theme to read from these CSS variables.
176
+ Components inherit colors and radius from the theme. No component sets its own colors.
177
+
178
+ ### Rule 5: Zero inline arbitrary values
179
+
180
+ No \`text-[#FF5733]\`, no \`p-[13px]\`, no \`w-[237px]\`, no \`bg-[var(--thing)]\`.
181
+ Only Tailwind scale values (p-4, text-lg, w-full, gap-6) and theme classes (bg-primary, text-muted-foreground, border-border).
182
+
183
+ If a value is not in the Tailwind scale or theme, add it to the global token file first.
184
+
185
+ ## Project Context
186
+
187
+ **Product:** ${discovery.projectName}
188
+ **Purpose:** ${discovery.desiredOutcome}
189
+ **Delivery channels:** ${discovery.eiidMapping.delivery.channels.join(', ') || 'None specified'}
190
+
191
+ ## Review Checklist
192
+
193
+ ### 1. Component Source Check
194
+
195
+ For every UI section in the codebase:
196
+ - Could a shadcnblocks block replace this? → FINDING if yes
197
+ - Could a standard shadcn component replace this? → FINDING if yes
198
+ - Is a custom component justified? Only if shadcn has nothing equivalent
199
+
200
+ ### 2. Token Compliance
201
+
202
+ - Does \`src/app/globals.css\` define all required CSS variables?
203
+ - Does \`tailwind.config.ts\` extend from those variables?
204
+ - Are there hardcoded hex/rgb values in component files? → FINDING
205
+ - Are there arbitrary Tailwind values (square brackets)? → FINDING
206
+
207
+ ### 3. Accessibility (WCAG 2.1 AA)
208
+
209
+ - Color contrast >= 4.5:1 normal text, 3:1 large text
210
+ - Visible focus states on all interactive elements
211
+ - Alt text on images (or aria-hidden if decorative)
212
+ - Labels on form inputs
213
+ - Accessible names on buttons
214
+ - Skip links for keyboard navigation
215
+
216
+ ### 4. Responsive
217
+
218
+ - Works at 320px?
219
+ - Breakpoints consistent (sm/md/lg/xl)?
220
+ - Touch targets >= 44x44px?
221
+
222
+ ## Output Format
223
+
224
+ Per issue:
225
+
226
+ **File:** path/to/file.tsx
227
+ **Rule Violated:** Rule [1-5] or a11y or responsive
228
+ **Issue:** Brief description
229
+ **Severity:** critical | warning | suggestion
230
+ **Fix:** What to change (include the exact shadcn/shadcnblocks command if applicable)
231
+
232
+ Max 5 issues. Most critical first.
233
+
234
+ ## Limits
235
+
236
+ - Advisory only. Does not block.
237
+ - UX and consistency scope, not business logic.
238
+ - Strategy decides what to build. Trust decides what is safe.`;
239
+ }
240
+ export function createTrustPrompt(discovery) {
241
+ const industry = discovery.context.industry || 'Not specified';
242
+ const dataHandled = discovery.availableData.join(', ') || 'Not specified';
243
+ return `# Trust Skill
244
+
245
+ Security checks for **${discovery.projectName}**.
246
+
247
+ ## Blocking Rules
248
+
249
+ This skill blocks on these five conditions:
250
+
251
+ 1. **Credentials in code** — API keys, passwords, tokens hardcoded
252
+ 2. **SQL injection** — Unsanitized user input in queries
253
+ 3. **XSS** — Unescaped user content rendered as HTML
254
+ 4. **Auth bypass** — Missing auth checks on protected routes
255
+ 5. **PII exposure** — Personal data logged, in errors, or in URLs
256
+
257
+ Blocking format:
258
+
259
+ BLOCKED: [reason]
260
+ File: [path], Line: [number]
261
+ Issue: [description]
262
+ Fix required before merging.
263
+
264
+ Non-critical issues get a WARN, not a block.
265
+
266
+ ## Primary Output
267
+
268
+ Append security findings to CLAUDE.md after every audit.
269
+
270
+ ## What This Checks
271
+
272
+ Security vulnerabilities and compliance gaps, ordered by severity.
273
+ Max 500 words per audit. Critical issues first.
274
+
275
+ ## Project Context
276
+
277
+ **Industry:** ${industry}
278
+ **Data Handled:** ${dataHandled}
279
+
280
+ ## Review Checklist
281
+
282
+ ### 1. OWASP Top 10
283
+
284
+ 1. **Broken Access Control** — API routes protected? RLS enforced? Users isolated?
285
+ 2. **Cryptographic Failures** — Data encrypted at rest? Passwords hashed (bcrypt/argon2)?
286
+ 3. **Injection** — SQL parameterized? XSS escaped? No command injection?
287
+ 4. **Insecure Design** — Rate limiting? Account lockout? Secure password reset?
288
+ 5. **Security Misconfiguration** — Debug off in prod? CORS configured?
289
+ 6. **Vulnerable Components** — Known CVEs in dependencies?
290
+ 7. **Auth Failures** — Sessions secure? JWT validated? Logout works?
291
+ 8. **Data Integrity** — Input validated? File uploads restricted?
292
+ 9. **Logging Failures** — Security events logged? No PII in logs?
293
+ 10. **SSRF** — User-provided URLs validated? Internal access restricted?
294
+
295
+ ### 2. GDPR Compliance
296
+
297
+ - Consent before collecting personal data
298
+ - Data minimization (only collect what is needed)
299
+ - Right to access (users can export data)
300
+ - Right to delete (users can delete account)
301
+ - Data retention policy defined
302
+ - Breach notification capability
303
+
304
+ ### 3. Secrets Management
305
+
306
+ - No secrets in code or git history
307
+ - Environment variables for all credentials
308
+ - Different keys for dev/staging/prod
309
+
310
+ ## Output Format
311
+
312
+ Per issue:
313
+
314
+ **Severity:** BLOCK | HIGH | MEDIUM | LOW
315
+ **File:** path:line
316
+ **Issue:** description
317
+ **Fix:** what to do
318
+
319
+ Critical issues first. Max 10 issues per audit.
320
+
321
+ ## Limits
322
+
323
+ - BLOCK for the five conditions above.
324
+ - WARN for everything else. The human decides.
325
+ - Security scope only, not code style.
326
+ - When the risk level is unclear, flag it for the human.`;
327
+ }
328
+ export function createEfficiencyPrompt(discovery, tools) {
329
+ const channels = discovery.eiidMapping.delivery.channels.join(', ') || 'None';
330
+ const dataSources = [...discovery.availableData, ...discovery.eiidMapping.enrichment.sources].join(', ') || 'None';
331
+ const toolsList = tools
332
+ ? tools.all.map(t => `${t.tool.name} (${t.tool.sdk || 'no SDK'})`).join(', ')
333
+ : 'Not available';
334
+ return `# Efficiency Skill
335
+
336
+ Performance and cost checks for **${discovery.projectName}**.
337
+
338
+ ## Primary Output
339
+
340
+ Append performance findings and cost estimates to CLAUDE.md after every review.
341
+
342
+ ## What This Checks
343
+
344
+ Bundle size, load times, database query patterns, and API costs.
345
+ Max 400 words. Quantify everything.
346
+
347
+ ## Project Context
348
+
349
+ **Delivery channels:** ${channels}
350
+ **Data sources:** ${dataSources}
351
+ **Tools stack:** ${toolsList}
352
+ **Problem:** ${discovery.problem}
353
+
354
+ ## Review Checklist
355
+
356
+ ### 1. Bundle Size
357
+
358
+ - **Warning:** Bundle increase >10% from baseline
359
+ - **Critical:** Bundle exceeds 200KB gzipped for initial load
360
+
361
+ Look for:
362
+ - Unnecessary dependencies imported
363
+ - Large libraries replaceable (moment->date-fns, lodash->native)
364
+ - Missing tree shaking
365
+ - Dynamic imports missing for heavy components
366
+
367
+ ### 2. Core Web Vitals
368
+
369
+ - **LCP** (Largest Contentful Paint): Target < 2.5s
370
+ - **FID** (First Input Delay): Target < 100ms
371
+ - **CLS** (Cumulative Layout Shift): Target < 0.1
372
+
373
+ ### 3. Database Queries
374
+
375
+ - **N+1 queries:** Queries in loops
376
+ - **Missing indexes:** Queries on unindexed columns
377
+ - **Over-fetching:** SELECT * when few columns needed
378
+ - **Under-batching:** Many small queries instead of one batch
379
+
380
+ ### 4. API Costs
381
+
382
+ Estimate monthly costs for:
383
+ - **LLM calls (Anthropic):** Count call sites, estimate tokens/call, estimate $/month
384
+ - **Embedding calls (OpenAI):** Count vectors, estimate $/month
385
+ - **Third-party APIs:** Rate limits respected? Responses cached?
386
+ - **Delivery costs:** ${channels} — estimate messages/month
387
+
388
+ ### 5. Caching Opportunities
389
+
390
+ - Static data that could be cached
391
+ - Expensive computations that repeat
392
+ - API responses that rarely change
393
+ - Database queries that could use cache
394
+
395
+ ## Output Format
396
+
397
+ Per issue:
398
+
399
+ **Category:** bundle | performance | database | api-costs | caching
400
+ **Issue:** description
401
+ **Impact:** quantified (e.g., "adds 50KB to bundle", "~$30/month in LLM calls")
402
+ **Fix:** what to change
403
+ **Estimated savings:** quantified
404
+
405
+ Max 5 issues. Highest impact first.
406
+
407
+ ## Limits
408
+
409
+ - Advisory only. Does not block.
410
+ - Measurable improvements only, not micro-optimizations.
411
+ - Strategy decides whether a feature is worth the cost.
412
+ - Trust handles security-related performance (rate limiting).`;
413
+ }
414
+ export function createTestingPrompt(discovery) {
415
+ const channels = discovery.eiidMapping.delivery.channels;
416
+ const triggers = discovery.eiidMapping.delivery.triggers;
417
+ const patterns = discovery.eiidMapping.inference.patterns;
418
+ const fence = '```';
419
+ return `# Testing Skill
420
+
421
+ Test verification for **${discovery.projectName}**.
422
+
423
+ ## Primary Output
424
+
425
+ Append test results and coverage status to CLAUDE.md after every run.
426
+
427
+ ## What This Checks
428
+
429
+ Whether the application behaves correctly and critical flows pass.
430
+ Max 300 words. Failures first, then coverage gaps.
431
+
432
+ ## Project Context
433
+
434
+ **Problem:** ${discovery.problem}
435
+ **Desired Outcome:** ${discovery.desiredOutcome}
436
+ **Delivery channels:** ${channels.join(', ') || 'None specified'}
437
+ **Triggers:** ${triggers.join(', ') || 'None specified'}
438
+ **Patterns to verify:** ${patterns.join(', ') || 'None specified'}
439
+
440
+ ## Critical Flows
441
+
442
+ Based on the EIID mapping, these four flows must be tested:
443
+
444
+ 1. **Data enrichment pipeline** — Can the system receive and process data from: ${discovery.eiidMapping.enrichment.sources.join(', ') || 'configured sources'}?
445
+ 2. **Inference verification** — Do the pattern detectors work for: ${patterns.join(', ') || 'configured patterns'}?
446
+ 3. **Delivery end-to-end** — Do notifications reach: ${channels.join(', ') || 'configured channels'}?
447
+ 4. **Trigger activation** — Do these triggers fire correctly: ${triggers.join(', ') || 'configured triggers'}?
448
+
449
+ ## Tools
450
+
451
+ - **vitest** for unit and integration tests
452
+ - **Playwright** for E2E browser tests
453
+ - **axe-core** (via Playwright) for accessibility testing
454
+
455
+ ## Review Checklist
456
+
457
+ ### 1. Unit Tests (vitest)
458
+
459
+ - Pure logic functions tested in isolation
460
+ - External dependencies mocked (API calls, database)
461
+ - Edge cases covered: empty inputs, error conditions, boundary values
462
+ - Co-located with source: tests/unit/ or src/lib/__tests__/
463
+
464
+ ### 2. E2E Tests (Playwright)
465
+
466
+ - The 4 critical flows above
467
+ - Page loads and renders correctly
468
+ - Form submissions and navigation
469
+ - Accessibility via axe-core
470
+
471
+ ### 3. Coverage Expectations
472
+
473
+ - Business logic: >80% coverage
474
+ - API routes: happy path + error cases
475
+ - E2E: the 4 critical flows
476
+ - Delivery stubs: called with correct args
477
+
478
+ ## Output Format
479
+
480
+ ${fence}
481
+ ## Test Report
482
+
483
+ **Passed:** [count] | **Failed:** [count] | **Skipped:** [count]
484
+
485
+ ### Failures (fix these first)
486
+ - [test name]: [error] (file:line)
487
+
488
+ ### Coverage Gaps (add these next)
489
+ - [untested area]: [why it matters]
490
+ ${fence}
491
+
492
+ Max 10 items. Failures first, then gaps.
493
+
494
+ ## Blocking Behavior
495
+
496
+ If tests fail, respond with {"ok": false, "reason": "X tests failing"}.
497
+ Task completion is blocked while tests fail.
498
+
499
+ ## Limits
500
+
501
+ - Tests verify behavior, not implementation details.
502
+ - Integration tests preferred over unit tests for UI.
503
+ - Framework behavior not tested (Next.js routing, React rendering).
504
+ - User-facing behavior only.`;
505
+ }
506
+ //# sourceMappingURL=teammate-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teammate-prompts.js","sourceRoot":"","sources":["../../../src/scaffold/templates/teammate-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { DiscoveryResult } from '../discovery/types.js';
2
+ import type { SelectionResult } from '../catalog/types.js';
3
+ export interface ScaffoldInput {
4
+ discovery: DiscoveryResult;
5
+ tools: SelectionResult;
6
+ }
7
+ export interface ScaffoldOptions {
8
+ outputDir: string;
9
+ verbose?: boolean;
10
+ skipInstall?: boolean;
11
+ }
12
+ export interface SkillConfig {
13
+ name: string;
14
+ focus: string;
15
+ triggers: string[];
16
+ systemPrompt: string;
17
+ }
18
+ /** @deprecated Use SkillConfig instead */
19
+ export type TeammateConfig = SkillConfig;
20
+ export interface AgentTeamConfig {
21
+ skills: SkillConfig[];
22
+ hooks: HooksConfig;
23
+ }
24
+ export interface HooksConfig {
25
+ sessionStart: SessionStartHook[];
26
+ preToolUse: PreToolUseHook[];
27
+ postToolUse: PostToolUseHook[];
28
+ stop: StopHook[];
29
+ }
30
+ export interface SessionStartHook {
31
+ matcher: string;
32
+ hooks: Array<{
33
+ type: 'command';
34
+ command: string;
35
+ statusMessage?: string;
36
+ }>;
37
+ }
38
+ export interface PreToolUseHook {
39
+ matcher: string;
40
+ hooks: Array<{
41
+ type: 'prompt';
42
+ prompt: string;
43
+ timeout?: number;
44
+ }>;
45
+ }
46
+ export interface PostToolUseHook {
47
+ matcher: string;
48
+ hooks: Array<{
49
+ type: 'prompt';
50
+ prompt: string;
51
+ timeout?: number;
52
+ }>;
53
+ }
54
+ export interface StopHook {
55
+ hooks: Array<{
56
+ type: 'agent' | 'prompt';
57
+ prompt: string;
58
+ timeout?: number;
59
+ }>;
60
+ }
61
+ export interface ScaffoldResult {
62
+ projectPath: string;
63
+ filesCreated: string[];
64
+ packagesToInstall: string[];
65
+ envVars: string[];
66
+ agentTeam: AgentTeamConfig;
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scaffold/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,eAAe,CAAC;IAC3B,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,eAAe,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scaffold/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { DiscoveryResult } from '../discovery/types.js';
2
+ import type { SelectionResult } from '../catalog/types.js';
3
+ import type { ScaffoldResult } from './types.js';
4
+ export declare function runScaffold(discovery: DiscoveryResult, tools: SelectionResult): Promise<ScaffoldResult | null>;
5
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/scaffold/ui.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,wBAAsB,WAAW,CAC/B,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAkFhC"}