Proactive Discovery
The Proactive Discovery module analyzes workflow context and proactively suggests relevant skills from external sources BEFORE the user asks. It triggers based on pattern detection, file context, tool usage, and user intent.
Installation
import { createProactiveDiscovery, createExternalSkillLoader } from 'auto-skill';
Usage
Basic Example
import {
createExternalSkillLoader,
createProactiveDiscovery,
type DetectedPattern,
} from 'auto-skill';
// Initialize loader and discovery
const loader = createExternalSkillLoader({
githubToken: process.env.GITHUB_TOKEN,
});
const discovery = createProactiveDiscovery(loader);
await loader.start();
try {
// Simulate a detected pattern
const pattern: DetectedPattern = {
id: 'pattern-abc123',
toolSequence: ['Read', 'Grep', 'Edit', 'Bash'],
occurrenceCount: 5,
confidence: 0.85,
sessionIds: ['session-1', 'session-2'],
firstSeen: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
lastSeen: new Date().toISOString(),
successRate: 0.9,
suggestedName: 'react-test-workflow',
suggestedDescription: 'Workflow for testing React components',
// Context hints
sessionContext: {
primary_intent: 'test',
problem_domains: ['react', 'typescript'],
workflow_type: 'TDD',
tool_success_rate: 0.9,
},
codeContext: {
primary_languages: ['typescript'],
analyzed_files: 10,
},
};
// Get recommendations
const recommendations = await discovery.discoverForPattern(pattern);
console.log(`Found ${recommendations.length} recommendations:\n`);
for (const rec of recommendations) {
console.log(`🎯 ${rec.skill.title}`);
console.log(` Confidence: ${Math.round(rec.confidence * 100)}%`);
console.log(` Reason: ${rec.reason}`);
console.log(` Trigger: ${rec.trigger}`);
console.log(` URL: ${rec.skill.skillsShUrl}`);
}
} finally {
await loader.stop();
}
API Reference
createProactiveDiscovery(loader)
Factory function to create a Proactive Discovery instance.
loader
ExternalSkillLoader
required
An instance of ExternalSkillLoader for searching external skills.
An instance of the Proactive Discovery service.
discoverForPattern(pattern)
Analyze a detected pattern and recommend relevant external skills.
A detected workflow pattern with context information.
Array of skill recommendations with reasoning and confidence scores.
clearCache()
Clear the internal recommendation cache.
Types
WorkflowContext
Context extracted from the current session.
Detected frameworks (e.g., ["react", "nextjs", "vue"]).
Detected languages (e.g., ["typescript", "python", "rust"]).
Tool sequence being used.
User intent: "debug", "implement", "test", "refactor", etc.
File extensions being modified.
Import/require statements detected in code.
SkillRecommendation
A skill recommendation with reasoning.
The recommended external skill.
Human-readable explanation for why this skill is recommended.
Confidence score between 0 and 1.
trigger
'pattern' | 'context' | 'tool-sequence' | 'framework'
What triggered this recommendation.
Triggers
Proactive Discovery automatically triggers on:
- Pattern Detection: Repetitive tool sequences (3+ occurrences)
- Framework Context: Detected frameworks like React, Next.js, Vue
- Tool Sequences: Specific tool combinations (e.g., Read + Grep + Edit)
- User Intent: Debugging, testing, implementing, refactoring
The discovery engine extracts context from:
- Session Context: Primary intent, problem domains, workflow type
- Code Context: Languages, file paths, imports
- Tool Usage: Tool sequences and success rates
const pattern: DetectedPattern = {
// ... other fields
sessionContext: {
primary_intent: 'test', // Triggers testing-related skills
problem_domains: ['react'], // Triggers React skills
workflow_type: 'TDD', // Triggers TDD skills
},
codeContext: {
primary_languages: ['typescript'], // Triggers TypeScript skills
analyzed_files: 10,
},
};
Query Generation
The system automatically generates search queries based on context:
- Framework + Intent:
"react testing", "nextjs debugging"
- Tool-based:
"code search patterns", "workflow automation"
- Generic Intent:
"testing best practices", "test-driven development"
Confidence Scoring
Confidence is calculated using:
confidence = (installCount / 1000) * 0.5 + (relevanceScore / 100) * 0.5
Factors:
- Install Count: Higher installs = higher confidence
- Relevance Score: Match quality to search query
- Capped at 1.0: Maximum confidence is 100%
Advanced Usage
Custom Context
const pattern: DetectedPattern = {
id: 'custom-pattern',
toolSequence: ['Bash', 'Task'],
occurrenceCount: 3,
confidence: 0.8,
// ... other required fields
sessionContext: {
primary_intent: 'implement',
problem_domains: ['api', 'graphql', 'authentication'],
workflow_type: 'backend',
},
};
const recommendations = await discovery.discoverForPattern(pattern);
Filtering Recommendations
const recommendations = await discovery.discoverForPattern(pattern);
// Filter by confidence
const highConfidence = recommendations.filter(r => r.confidence >= 0.7);
// Filter by trigger type
const frameworkBased = recommendations.filter(r => r.trigger === 'framework');
// Get top recommendation
const top = recommendations[0]; // Already sorted by confidence
Caching Behavior
Recommendations are cached per pattern ID:
// First call - performs search
const recs1 = await discovery.discoverForPattern(pattern);
// Second call - returns cached results
const recs2 = await discovery.discoverForPattern(pattern);
// Clear cache to force refresh
discovery.clearCache();
const recs3 = await discovery.discoverForPattern(pattern);
Example: React Testing Workflow
Complete example from examples/proactive-discovery.ts:
import {
createExternalSkillLoader,
createProactiveDiscovery,
type DetectedPattern,
} from 'auto-skill';
const loader = createExternalSkillLoader({
githubToken: process.env.GITHUB_TOKEN,
});
const discovery = createProactiveDiscovery(loader);
await loader.start();
try {
const pattern: DetectedPattern = {
id: 'pattern-abc123',
toolSequence: ['Read', 'Grep', 'Edit', 'Bash'],
occurrenceCount: 5,
confidence: 0.85,
sessionIds: ['session-1', 'session-2'],
firstSeen: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
lastSeen: new Date().toISOString(),
successRate: 0.9,
suggestedName: 'react-test-workflow',
suggestedDescription: 'Workflow for testing React components',
sessionContext: {
primary_intent: 'test',
problem_domains: ['react', 'typescript'],
workflow_type: 'TDD',
tool_success_rate: 0.9,
},
codeContext: {
primary_languages: ['typescript'],
analyzed_files: 10,
},
designPatterns: [],
problemSolvingApproach: null,
mentalContext: null,
};
const recommendations = await discovery.discoverForPattern(pattern);
console.log(`Found ${recommendations.length} recommendations:\n`);
for (const rec of recommendations) {
console.log(`🎯 ${rec.skill.title}`);
console.log(` Confidence: ${Math.round(rec.confidence * 100)}%`);
console.log(` Reason: ${rec.reason}`);
console.log(` Trigger: ${rec.trigger}`);
console.log(` Installs: ${rec.skill.installCount}`);
console.log(` URL: ${rec.skill.skillsShUrl}`);
console.log();
}
} finally {
await loader.stop();
}