Intent-Based Composition
Intent-Based Composition Skill
Overview
The Intent-Based Composition Engine transforms a high-level description of what you want to achieve into a concrete, ordered plan of which plugins to install and how to configure them. Instead of manually inspecting each plugin's capabilities and dependencies, you describe your intent and the engine figures out the rest.
The engine operates in three phases:
- Capability Matching -- find which plugins satisfy your requirements
- Dependency Resolution -- determine the correct install/execution order
- Configuration Inference -- auto-generate sensible defaults from your project
When to Use Intent-Based Composition
Use this skill when:
- You know what you want to accomplish but not which plugins provide it
- You need to install multiple plugins that must work together
- You want automatic dependency ordering so plugins install in the right sequence
- You want configuration that adapts to your existing project stack
- You are onboarding a new project and want a recommended plugin set
Do not use this skill when:
- You already know exactly which single plugin to install
- You need to manually control every configuration value
- You are debugging a specific plugin (use the plugin's own diagnostics instead)
How Capability Matching Works
The Problem: Set Cover
Given N plugins each providing a different subset of capabilities, find the smallest collection of plugins that covers all the capabilities you need. This is the classic minimum set cover problem.
The Algorithm: Greedy Set Cover
Optimal set cover is NP-hard, but the greedy heuristic produces a solution within a factor of ln(n)+1 of optimal -- more than good enough for plugin selection.
Input:
U = { cap-A, cap-B, cap-C, cap-D } -- capabilities you need
S = {
plugin-1 provides { cap-A, cap-B },
plugin-2 provides { cap-B, cap-C },
plugin-3 provides { cap-C, cap-D },
plugin-4 provides { cap-A, cap-B, cap-C },
}
Round 1: plugin-4 covers 3 of 4 remaining (cap-A, cap-B, cap-C)
U = { cap-D }
Round 2: plugin-3 covers 1 of 1 remaining (cap-D)
U = {} -- done!
Result: [ plugin-4, plugin-3 ] (2 plugins instead of 4)
Tie-Breaking Rules
When two plugins cover the same number of uncovered capabilities, the engine breaks ties by:
- Preferred provider -- if the user specified
provider: "my-plugin"for a capability, that plugin wins - Coverage count -- more capabilities covered wins
- Alphabetical name -- for deterministic, reproducible output
Conflict Detection
After matching, the engine checks each selected plugin's conflicts array. If plugin A declares a conflict with capability X and plugin B provides capability X, the composition is rejected with a clear error message.
How Dependency Resolution Works
The Problem: Topological Ordering
Selected plugins may depend on each other: plugin A requires capability X, which plugin B provides. Plugin B must be installed before plugin A. With many plugins and cross-dependencies, finding a valid ordering requires a topological sort.
The Algorithm: Kahn's Algorithm (BFS Topological Sort)
Kahn's algorithm is a breadth-first approach to topological sorting that also naturally detects cycles.
Input graph (edges mean "must come before"):
plugin-B -> plugin-A (B provides what A requires)
plugin-C -> plugin-A (C provides what A requires)
plugin-D -> plugin-B (D provides what B requires)
Step 1: Compute in-degrees
plugin-D: 0 (no one must come before D)
plugin-C: 0
plugin-B: 1 (D must come before B)
plugin-A: 2 (B and C must come before A)
Step 2: Start queue with in-degree 0 nodes
queue = [plugin-C, plugin-D] (alphabetical for determinism)
Step 3: Process queue
Dequeue plugin-C -> output: [C]
plugin-A in-degree: 2 -> 1
Dequeue plugin-D -> output: [C, D]
plugin-B in-degree: 1 -> 0 -> enqueue B
Dequeue plugin-B -> output: [C, D, B]
plugin-A in-degree: 1 -> 0 -> enqueue A
Dequeue plugin-A -> output: [C, D, B, A]
Install order: plugin-C, plugin-D, plugin-B, plugin-A
Cycle Detection
If the output list has fewer nodes than the graph, some nodes could never reach in-degree 0 -- they form a cycle. The engine reports the exact cycle path:
ERROR: Cycle detected!
auth-plugin -> user-plugin -> auth-plugin (via capability "authentication")
How Configuration Inference Works
The engine scans your project root for well-known files and directories to build a technology fingerprint:
| Detected File | Technologies Added |
|---|---|
package.json |
node, javascript |
tsconfig.json |
typescript |
Dockerfile |
docker, containers |
Chart.yaml |
helm, kubernetes |
.github/ |
github, github-actions |
main.tf |
terraform, iac |
requirements.txt |
python |
go.mod |
go, golang |
vite.config.ts |
vite, frontend |
.mcp.json |
mcp, claude-code |
For Node.js projects, the engine also reads package.json dependencies to detect frameworks like React, Vue, Next.js, Express, and database ORMs.
Each detected technology maps to configuration fragments that are merged into plugin configs. For example, detecting TypeScript adds { language: "typescript", strictMode: true } to each plugin's configuration.
Composition YAML Format
Create a composition.yaml file to define your intent:
# Basic composition
intent: "Set up a CI/CD pipeline with security scanning"
requirements:
- capability: ci-cd
- capability: supply-chain-security
- capability: plugin-composition
# With provider preferences and constraints
intent: "Deploy a full-stack application with monitoring"
requirements:
- capability: kubernetes
provider: fullstack-iac
- capability: ci-cd
provider: deployment-pipeline
- capability: supply-chain-security
- capability: contextual-recommendations
constraints:
env: production
region: us-east-1
strictMode: "true"
# Minimal - just capabilities
intent: "Plugin development toolkit"
requirements:
- capability: plugin-dev-tools
- capability: plugin-composition
- capability: trust-scoring
Field Reference
| Field | Type | Required | Description |
|---|---|---|---|
intent |
string | yes | Human-readable goal description |
requirements |
array | yes | List of capability requirements |
requirements[].capability |
string | yes | Capability identifier to satisfy |
requirements[].provider |
string | no | Preferred plugin to provide this capability |
constraints |
object | no | Key-value pairs merged into all plugin configs |
Extending with Custom Capabilities
Declaring Capabilities in Your Plugin
Add a capabilities block to your plugin's .claude-plugin/plugin.json:
{
"name": "my-custom-plugin",
"version": "1.0.0",
"description": "My plugin description",
"capabilities": {
"provides": [
"my-custom-capability",
"another-capability"
],
"requires": [
"plugin-registry"
],
"conflicts": [
"legacy-capability"
]
}
}
Capability Naming Conventions
- Use lowercase kebab-case:
supply-chain-security, notSupplyChainSecurity - Be specific:
kubernetes-helm-deployis better thandeploy - Use domain prefixes for plugin-specific capabilities:
mp-trust-scoring - Document what the capability means in your plugin's description
Making Your Plugin Composable
For best results with the composition engine:
- Declare all provided capabilities -- the engine can only match what it knows about
- Declare all required capabilities -- this enables correct dependency ordering
- Declare conflicts -- prevents incompatible plugins from being composed together
- Keep capabilities granular --
auth-jwtandauth-oauthare better than justauth - Avoid circular dependencies -- if A requires B and B requires A, the engine cannot order them
Architecture
IntentSpec (YAML/JSON)
|
v
CapabilityMatcher (greedy set cover)
| reads: plugins/*/.claude-plugin/plugin.json
| output: MatchResult { selected, uncovered, conflicts }
v
DependencyResolver (Kahn's toposort)
| input: selected plugins + all manifests
| output: DependencyGraph { nodes, edges, hasCycles }
v
ConfigurationInferrer (project fingerprinting)
| scans: project root files
| output: InferredConfig[] per plugin
v
CompositionPlan
{ intent, plugins[], installOrder[], warnings[] }
Source Files
- Types:
src/composition/types.ts-- all interfaces, error classes, enums - Engine:
src/composition/engine.ts-- CapabilityMatcher, DependencyResolver, ConfigurationInferrer, CompositionEngine - Command:
commands/compose.md-- the/mp:composeslash command
Related Skills and Commands
/mp:compose-- the slash command that invokes this engine- Supply Chain Security module --
src/security/trust-engine.ts - Contextual Intelligence module --
src/intelligence/fingerprint.ts - Dev Studio module --
src/devstudio/server.ts - Federation module --
src/federation/registry.ts