contextual-intelligence
Contextual Plugin Intelligence
Analyze a project's technology stack and recommend plugins using machine learning techniques: $ARGUMENTS
Overview
The intelligence module provides three core capabilities:
- Project Fingerprinting — Scans a project directory to extract a feature vector covering frameworks, languages, infrastructure, and architectural patterns.
- Association Rule Mining (Apriori) — Discovers which features commonly co-occur across projects, then identifies capability gaps in the current project.
- Plugin Recommendations — Ranks available plugins by cosine similarity to the project fingerprint, weighted by gap-filling potential.
Architecture
ProjectFingerprinter
|
|-- detectFrameworks() -> package.json, pyproject.toml, go.mod, Cargo.toml
|-- detectLanguages() -> file extension distribution (recursive walk)
|-- detectInfrastructure() -> config files (Dockerfile, Chart.yaml, .github/workflows, etc.)
|-- detectPatterns() -> monorepo, event-driven, api-gateway, microservices, serverless
|-- findGaps() -> uses AprioriMiner rules to identify missing capabilities
|
v
ProjectFingerprint { frameworks, languages, infrastructure, patterns, missing }
|
v
RecommendationEngine
|-- buildVocabulary() -> union of all feature terms
|-- toBinaryVector() -> project/plugin features -> [0,1,0,1,...] vectors
|-- cosineSimilarity() -> dot(A,B) / (||A|| * ||B||)
|-- computeGapCoverage() -> weighted gap fill score
|-- recommend() -> ranked PluginRecommendation[]
|
v
RecommendationReport { projectSummary, recommendations, gaps, scanDate }
Key Algorithms
Apriori Algorithm
The Apriori algorithm mines association rules from a dataset of project profiles. It works in two phases:
Phase 1: Find Frequent Itemsets
L1 = { items appearing in >= minSupport fraction of transactions }
k = 2
while L(k-1) is non-empty:
Candidates = apriori-gen(L(k-1)) // join + prune
Count each candidate's support across all transactions
L(k) = candidates with support >= minSupport
k++
The Apriori principle (anti-monotone property) states: if {A,B} is infrequent, no superset {A,B,C,...} can be frequent. This allows aggressive pruning of the candidate space.
Phase 2: Generate Rules
For each frequent itemset S where |S| >= 2:
For each item B in S:
A = S \ {B}
confidence = support(S) / support(A)
lift = confidence / support({B})
if confidence >= minConfidence: emit rule A => {B}
Cosine Similarity
Projects and plugins are both represented as binary vectors over a shared vocabulary of feature terms:
vocabulary = sorted union of all terms
project_vector[i] = 1 if vocabulary[i] in project_features else 0
plugin_vector[i] = 1 if vocabulary[i] in plugin_capabilities else 0
similarity = dot(project, plugin) / (norm(project) * norm(plugin))
Final Scoring
relevance = 0.6 * cosine_similarity + 0.4 * gap_coverage
gap_coverage = sum(confidence[gap] for filled gaps) / sum(confidence[gap] for all gaps)
File Structure
plugins/marketplace-pro/
src/intelligence/
types.ts — All TypeScript interfaces
fingerprint.ts — ProjectFingerprinter, AprioriMiner, RecommendationEngine
config/
project-profiles.json — Training dataset (~22 project profiles)
commands/
recommend.md — /mp:recommend slash command
skills/intelligence/
SKILL.md — This file
Usage Examples
Scan Current Project
import { ProjectFingerprinter } from './src/intelligence/fingerprint.js';
const fp = new ProjectFingerprinter('/path/to/project');
const fingerprint = await fp.scan();
console.log('Frameworks:', fingerprint.frameworks);
console.log('Languages:', fingerprint.languages);
console.log('Infrastructure:', fingerprint.infrastructure);
console.log('Patterns:', fingerprint.patterns);
console.log('Missing capabilities:', fingerprint.missing);
Mine Association Rules
import { AprioriMiner } from './src/intelligence/fingerprint.js';
const profiles = [
{ features: ['typescript', 'react', 'nextjs', 'eslint', 'jest', 'ci-cd'] },
{ features: ['typescript', 'nodejs', 'express', 'docker', 'kubernetes', 'helm', 'ci-cd'] },
{ features: ['python', 'fastapi', 'docker', 'terraform', 'aws', 'monitoring'] },
// ...more profiles
];
const miner = new AprioriMiner(profiles, 0.3, 0.6);
const rules = miner.mineRules();
for (const rule of rules) {
console.log(
`{${rule.antecedent.join(', ')}} => {${rule.consequent.join(', ')}}`,
`support=${rule.support} confidence=${rule.confidence} lift=${rule.lift}`
);
}
// Example output:
// {kubernetes, helm} => {ci-cd} support=0.318 confidence=0.875 lift=1.05
// {docker, kubernetes} => {monitoring} support=0.364 confidence=0.8 lift=1.12
Get Plugin Recommendations
import { RecommendationEngine } from './src/intelligence/fingerprint.js';
import type { PluginCapability } from './src/intelligence/types.js';
const plugins: PluginCapability[] = [
{
name: 'ci-pipeline-pro',
description: 'CI/CD pipeline generator',
capabilities: ['ci-cd', 'testing', 'deployment'],
targetInfrastructure: ['docker', 'kubernetes'],
},
{
name: 'monitoring-stack',
description: 'Observability setup with Prometheus + Grafana',
capabilities: ['monitoring', 'alerting', 'dashboards'],
targetInfrastructure: ['kubernetes', 'docker'],
},
];
const engine = new RecommendationEngine();
const report = engine.recommend(fingerprint, plugins);
for (const rec of report.recommendations) {
console.log(`${rec.pluginName}: relevance=${rec.relevance}`);
console.log(` Reason: ${rec.reason}`);
console.log(` Gaps filled: ${rec.gapsFilled.join(', ')}`);
}
Full Analysis (Convenience Function)
import { analyzeProject } from './src/intelligence/fingerprint.js';
const report = await analyzeProject('/path/to/project', availablePlugins);
console.log(JSON.stringify(report, null, 2));
Configuration
Support and Confidence Thresholds
The AprioriMiner accepts two thresholds:
| Parameter | Default | Description |
|---|---|---|
minSupport |
0.3 | Minimum fraction of profiles containing an itemset to be "frequent" |
minConfidence |
0.6 | Minimum conditional probability for a rule to be emitted |
Lower support finds more rules but may include noise. Higher confidence produces more reliable gap predictions.
Gap Filtering
Only gaps with confidence >= 0.6 are surfaced to users. This threshold is hardcoded in ProjectFingerprinter.findGaps() to avoid noisy suggestions.
Training Data
The Apriori miner learns from config/project-profiles.json. Add new profiles to improve rule quality:
{
"label": "my-custom-stack",
"features": ["typescript", "react", "nextjs", "docker", "ci-cd", "monitoring"]
}
More diverse profiles = better association rules = more accurate gap detection.