
Capability Graph Builder
- 114 installs
- 33 repo stars
- Updated December 25, 2025
- daffy0208/ai-dev-standards
Model agent capabilities as structured graphs mapping tools, permissions, dependencies, and invocation paths so LLM agents route tasks correctly and avoid unsafe or redundant actions.
About
Builds capability graphs for LLM agents: encodes tools, skills, and constraints as navigable structures, defines safe invocation paths, and validates routing logic so multi-tool agents select the right actions under policy limits.
- Capability node and edge modeling
- Tool permission and dependency mapping
- Agent routing and fallback paths
- Graph validation against agent policies
Capability Graph Builder by the numbers
- 114 all-time installs (skills.sh)
- Ranked #3,946 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Jul 30, 2026 (Skillselion catalog sync)
npx skills add https://github.com/daffy0208/ai-dev-standards --skill capability-graph-builderAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 114 |
|---|---|
| repo stars | ★ 33 |
| Last updated | December 25, 2025 |
| Repository | daffy0208/ai-dev-standards ↗ |
What it does
Model agent capabilities as structured graphs mapping tools, permissions, dependencies, and invocation paths so LLM agents route tasks correctly and avoid unsafe or redundant actions.
Files
Capability Graph Builder
Build queryable capability graphs from manifests using Codex for relationship inference
Purpose
Consumes capability manifests (generated by manifest-generator) and constructs a queryable graph structure representing all capabilities and their relationships. Uses OpenAI Codex to infer missing relationships and validate compatibility declarations.
When to Use
- After generating manifests for skills/MCPs/tools
- When building the orchestration system's knowledge base
- To discover capability relationships and dependencies
- To validate manifest consistency across resources
- To enable graph-based queries for orchestration planning
Key Capabilities
- Graph Construction: Builds nodes (capabilities) and edges (relationships) from manifests
- Relationship Inference: Uses Codex to discover implicit relationships from descriptions
- Consistency Validation: Validates bidirectional relationships (if A enables B, does B require A?)
- Path Finding: Supports queries like "what skills are needed to achieve X?"
- Subgraph Extraction: Finds all capabilities in a domain or with specific effects
Inputs
inputs:
manifest_dir: string # Directory containing manifest.yaml files (e.g., SKILLS/)
output_path: string # Where to write capability-graph.json
validate_consistency: boolean # Run Codex validation on relationships
infer_missing: boolean # Use Codex to infer missing compatibility fieldsProcess
Step 1: Scan and Load Manifests
#!/bin/bash
# Find all manifest.yaml files
MANIFESTS=$(find SKILLS MCP-SERVERS TOOLS COMPONENTS INTEGRATIONS -name 'manifest.yaml' 2>/dev/null)
# Load each manifest
echo "Loading manifests..."
for manifest in $MANIFESTS; do
echo " - $manifest"
doneStep 2: Build Initial Graph
// Pseudocode for graph construction
const graph = {
nodes: [],
edges: [],
domains: {},
effects: {}
}
for (const manifest of manifests) {
// Add node
graph.nodes.push({
id: manifest.name,
kind: manifest.kind,
description: manifest.description,
preconditions: manifest.preconditions,
effects: manifest.effects,
domains: manifest.domains,
cost: manifest.cost,
latency: manifest.latency,
risk_level: manifest.risk_level
})
// Add edges from compatibility
if (manifest.compatibility) {
if (manifest.compatibility.requires) {
for (const required of manifest.compatibility.requires) {
graph.edges.push({
from: required,
to: manifest.name,
type: 'requires'
})
}
}
if (manifest.compatibility.enables) {
for (const enabled of manifest.compatibility.enables) {
graph.edges.push({
from: manifest.name,
to: enabled,
type: 'enables'
})
}
}
if (manifest.compatibility.conflicts_with) {
for (const conflict of manifest.compatibility.conflicts_with) {
graph.edges.push({
from: manifest.name,
to: conflict,
type: 'conflicts_with'
})
}
}
if (manifest.compatibility.composes_with) {
for (const compose of manifest.compatibility.composes_with) {
graph.edges.push({
from: manifest.name,
to: compose,
type: 'composes_with'
})
}
}
}
// Index by domain
for (const domain of manifest.domains) {
if (!graph.domains[domain]) graph.domains[domain] = []
graph.domains[domain].push(manifest.name)
}
// Index by effect
for (const effect of manifest.effects) {
if (!graph.effects[effect]) graph.effects[effect] = []
graph.effects[effect].push(manifest.name)
}
}Step 3: Infer Missing Relationships with Codex
# For each pair of capabilities, ask Codex about relationships
for capability_a in "${capabilities[@]}"; do
for capability_b in "${capabilities[@]}"; do
if [ "$capability_a" != "$capability_b" ]; then
# Get manifests
MANIFEST_A=$(cat "path/to/$capability_a/manifest.yaml")
MANIFEST_B=$(cat "path/to/$capability_b/manifest.yaml")
# Ask Codex
codex exec "
Analyze these two capabilities and determine their relationship:
CAPABILITY A:
$MANIFEST_A
CAPABILITY B:
$MANIFEST_B
Questions:
1. Does A require B to function?
2. Does A enable B (make B possible)?
3. Do A and B conflict (can't coexist)?
4. Do A and B compose well together?
5. Are there any implicit dependencies or relationships?
Output JSON:
{
\"requires\": boolean,
\"enables\": boolean,
\"conflicts_with\": boolean,
\"composes_with\": boolean,
\"reasoning\": \"explanation\"
}
" > /tmp/relationship-${capability_a}-${capability_b}.json
fi
done
doneStep 4: Validate Consistency
# Check bidirectional relationships
codex exec "
Analyze this capability graph for consistency issues:
GRAPH:
$(cat /tmp/capability-graph.json)
Check for:
1. Asymmetric relationships (A enables B but B doesn't require A)
2. Conflicting declarations (A enables B but B conflicts with A)
3. Missing transitive relationships (A requires B, B requires C, but A doesn't require C)
4. Circular dependencies (A requires B, B requires A)
Output JSON array of issues:
[
{
\"type\": \"asymmetric_enables\",
\"from\": \"capability-a\",
\"to\": \"capability-b\",
\"issue\": \"A enables B but B doesn't list A as required\",
\"severity\": \"warning\"
}
]
"Step 5: Write Graph
# Write final graph with metadata
cat > META/capability-graph.json <<EOF
{
"version": "1.0.0",
"generated_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"node_count": ${node_count},
"edge_count": ${edge_count},
"graph": $(cat /tmp/capability-graph.json)
}
EOFGraph Query API
The generated graph supports these queries:
Find Capabilities by Effect
// Find all capabilities that create vector indexes
const creators = graph.effects['creates_vector_index']
// => ['rag-implementer', 'pinecone-mcp', 'weaviate-mcp']Find Capabilities by Domain
// Find all RAG-related capabilities
const ragCapabilities = graph.domains['rag']
// => ['rag-implementer', 'embedding-generator-mcp', 'vector-search-tool', ...]Find Dependencies
// What does rag-implementer require?
const deps = findDependencies('rag-implementer')
// => ['openai-integration', 'pinecone-mcp']
function findDependencies(capabilityName) {
return graph.edges.filter(e => e.to === capabilityName && e.type === 'requires').map(e => e.from)
}Find Enabled Capabilities
// What does having openai-integration enable?
const enabled = findEnabled('openai-integration')
// => ['rag-implementer', 'embedding-generator-mcp', 'gpt-vision-analyzer']
function findEnabled(capabilityName) {
return graph.edges.filter(e => e.from === capabilityName && e.type === 'enables').map(e => e.to)
}Find Conflicts
// What conflicts with existing-vector-database?
const conflicts = findConflicts('existing-vector-database')
// => ['rag-implementer']
function findConflicts(capabilityName) {
return graph.edges
.filter(
e => (e.from === capabilityName || e.to === capabilityName) && e.type === 'conflicts_with'
)
.map(e => (e.from === capabilityName ? e.to : e.from))
}Find Composition Partners
// What composes well with rag-implementer?
const partners = findCompositionPartners('rag-implementer')
// => ['pinecone-mcp', 'weaviate-mcp', 'semantic-search-tool']
function findCompositionPartners(capabilityName) {
return graph.edges
.filter(
e => (e.from === capabilityName || e.to === capabilityName) && e.type === 'composes_with'
)
.map(e => (e.from === capabilityName ? e.to : e.from))
}Find Path to Goal
// What capabilities are needed to achieve "semantic_search"?
const path = findPathToEffect('semantic_search')
// => ['openai-integration', 'rag-implementer', 'vector-search-tool']
function findPathToEffect(effect) {
// BFS through requires/enables edges
const capabilities = graph.effects[effect] || []
const visited = new Set()
const path = []
for (const cap of capabilities) {
const deps = findAllDependencies(cap, visited)
path.push(...deps, cap)
}
return [...new Set(path)]
}
function findAllDependencies(capabilityName, visited = new Set()) {
if (visited.has(capabilityName)) return []
visited.add(capabilityName)
const directDeps = graph.edges
.filter(e => e.to === capabilityName && e.type === 'requires')
.map(e => e.from)
const allDeps = []
for (const dep of directDeps) {
allDeps.push(...findAllDependencies(dep, visited), dep)
}
return allDeps
}Example Output
{
"version": "1.0.0",
"generated_at": "2025-10-28T12:00:00Z",
"node_count": 109,
"edge_count": 287,
"graph": {
"nodes": [
{
"id": "rag-implementer",
"kind": "skill",
"description": "Implement retrieval-augmented generation systems",
"preconditions": [
{ "check": "file_exists('package.json')", "required": true },
{ "check": "env_var_set('OPENAI_API_KEY')", "required": true }
],
"effects": ["creates_vector_index", "adds_embedding_pipeline", "configures_retrieval_api"],
"domains": ["rag", "ai", "search"],
"cost": "medium",
"latency": "slow",
"risk_level": "low"
},
{
"id": "pinecone-mcp",
"kind": "mcp",
"description": "Vector database operations for Pinecone",
"effects": ["creates_vector_index", "performs_similarity_search"],
"domains": ["rag", "vector-db"],
"cost": "low",
"latency": "fast",
"risk_level": "safe"
}
],
"edges": [
{
"from": "openai-integration",
"to": "rag-implementer",
"type": "requires"
},
{
"from": "rag-implementer",
"to": "pinecone-mcp",
"type": "composes_with"
},
{
"from": "rag-implementer",
"to": "semantic-search",
"type": "enables"
}
],
"domains": {
"rag": ["rag-implementer", "pinecone-mcp", "weaviate-mcp", "embedding-generator-mcp"],
"auth": ["frontend-builder", "api-designer", "security-engineer"],
"api": ["api-designer", "frontend-builder", "performance-optimizer"]
},
"effects": {
"creates_vector_index": ["rag-implementer", "pinecone-mcp", "weaviate-mcp"],
"adds_auth": ["frontend-builder", "api-designer"],
"configures_database": ["api-designer", "data-engineer"]
}
}
}Integration
With manifest-generator
Consumes manifests generated by manifest-generator skill.
With orchestration-planner
Provides queryable graph for finding capabilities matching goal requirements.
With skill-validator
Graph structure helps validate that claimed relationships actually exist.
Success Metrics
- ✅ Graph includes all 109 capabilities
- ✅ All edges validated for bidirectional consistency
- ✅ Domain and effect indexes complete
- ✅ Path finding queries return correct results
- ✅ Graph can be serialized/deserialized efficiently
Related Skills
- manifest-generator: Generates manifests that feed this builder
- orchestration-planner: Uses graph for planning
- skill-validator: Validates graph consistency
#!/bin/bash
# Build capability graph from manifests using Codex
set -e
# Parse arguments
MANIFEST_DIR="${1:-.}"
OUTPUT_PATH="${2:-META/capability-graph.json}"
VALIDATE="${3:-true}"
echo "Building capability graph..."
echo " Manifest directory: $MANIFEST_DIR"
echo " Output path: $OUTPUT_PATH"
echo " Validation: $VALIDATE"
# Find all manifest.yaml files
echo ""
echo "Scanning for manifests..."
MANIFESTS=$(find "$MANIFEST_DIR" -name 'manifest.yaml' -type f 2>/dev/null | sort)
MANIFEST_COUNT=$(echo "$MANIFESTS" | wc -l | tr -d ' ')
if [ "$MANIFEST_COUNT" -eq 0 ]; then
echo "❌ No manifests found in $MANIFEST_DIR"
exit 1
fi
echo "✅ Found $MANIFEST_COUNT manifests"
# Collect all manifests into a single JSON structure
echo ""
echo "Loading manifests..."
MANIFESTS_JSON="[]"
while IFS= read -r manifest_path; do
if [ -f "$manifest_path" ]; then
CAPABILITY_NAME=$(basename "$(dirname "$manifest_path")")
echo " - $CAPABILITY_NAME"
# Convert YAML to JSON and add to array
MANIFEST_JSON=$(python3 -c "
import yaml, json, sys
with open('$manifest_path') as f:
data = yaml.safe_load(f)
print(json.dumps(data))
")
# Append to manifests array
MANIFESTS_JSON=$(echo "$MANIFESTS_JSON" | python3 -c "
import json, sys
manifests = json.load(sys.stdin)
new_manifest = $MANIFEST_JSON
manifests.append(new_manifest)
print(json.dumps(manifests))
")
fi
done <<< "$MANIFESTS"
# Use Codex to build the graph
echo ""
echo "Building graph with Codex..."
cd "$(dirname "$0")/../.."
codex exec "
Build a capability graph from these manifests.
MANIFESTS:
$MANIFESTS_JSON
Task: Create a graph structure with nodes, edges, and indexes.
Structure:
{
\"nodes\": [
{
\"id\": \"capability-name\",
\"kind\": \"skill|mcp|tool|component|integration\",
\"description\": \"...\",
\"preconditions\": [...],
\"effects\": [...],
\"domains\": [...],
\"cost\": \"free|low|medium|high\",
\"latency\": \"instant|fast|slow\",
\"risk_level\": \"safe|low|medium|high\"
}
],
\"edges\": [
{
\"from\": \"capability-a\",
\"to\": \"capability-b\",
\"type\": \"requires|enables|conflicts_with|composes_with\"
}
],
\"domains\": {
\"rag\": [\"capability-1\", \"capability-2\"],
\"auth\": [\"capability-3\"]
},
\"effects\": {
\"creates_vector_index\": [\"capability-1\"],
\"adds_auth\": [\"capability-2\", \"capability-3\"]
}
}
Instructions:
1. Create a node for each manifest
2. Extract edges from compatibility fields (requires, enables, conflicts_with, composes_with)
3. Build domain index (domain -> list of capabilities)
4. Build effect index (effect -> list of capabilities)
5. Infer missing relationships from descriptions and effects
6. Validate bidirectional consistency (if A enables B, B should require A)
Output ONLY valid JSON. No markdown, no explanatory text.
" > /tmp/capability-graph-raw.json
# Validate generated JSON
echo "Validating graph..."
if python3 -c "import json; json.load(open('/tmp/capability-graph-raw.json'))" 2>/dev/null; then
# Add metadata
NODE_COUNT=$(python3 -c "import json; g = json.load(open('/tmp/capability-graph-raw.json')); print(len(g['nodes']))")
EDGE_COUNT=$(python3 -c "import json; g = json.load(open('/tmp/capability-graph-raw.json')); print(len(g['edges']))")
python3 -c "
import json
from datetime import datetime
with open('/tmp/capability-graph-raw.json') as f:
graph = json.load(f)
output = {
'version': '1.0.0',
'generated_at': datetime.utcnow().isoformat() + 'Z',
'node_count': len(graph['nodes']),
'edge_count': len(graph['edges']),
'graph': graph
}
with open('$OUTPUT_PATH', 'w') as f:
json.dump(output, f, indent=2)
"
echo ""
echo "✅ Capability graph generated:"
echo " - Nodes: $NODE_COUNT"
echo " - Edges: $EDGE_COUNT"
echo " - Output: $OUTPUT_PATH"
# Cleanup
rm /tmp/capability-graph-raw.json
exit 0
else
echo "❌ Generated graph JSON is invalid"
cat /tmp/capability-graph-raw.json
exit 1
fi
name: capability-graph-builder
kind: skill
description: Builds a queryable capability graph from manifests, infers missing relationships with Codex, and validates compatibility consistency for orchestration planning.
inputs_schema:
type: object
required:
- manifest_dir
- output_path
properties:
manifest_dir:
type: string
description: Directory containing capability manifest.yaml files to ingest.
output_path:
type: string
description: Destination file path for the generated capability-graph.json.
validate_consistency:
type: boolean
description: Run Codex-powered checks for asymmetric, conflicting, and cyclic relationships.
default: true
infer_missing:
type: boolean
description: Use Codex analysis to infer unspecified compatibility edges.
default: true
preconditions:
- check: directory_exists(inputs.manifest_dir)
description: Capability manifests must be available for ingestion.
required: true
- check: file_glob_exists(inputs.manifest_dir, '**/manifest.yaml')
description: At least one manifest.yaml must be present to populate the graph.
required: true
- check: env_var_set('OPENAI_API_KEY')
description: Codex access requires a configured OpenAI API key.
required: true
- check: tool_available('codex')
description: Codex CLI must be installed to perform relationship inference.
required: true
- check: path_writable(inputs.output_path)
description: Output location must be writable to persist the graph artifact.
required: true
effects:
- creates_capability_graph_json
- adds_domain_index
- adds_effect_index
- updates_manifest_relationships
- generates_consistency_report
domains:
- knowledge-graph
- ai
- orchestration
- validation
cost: medium
latency: slow
risk_level: low
side_effects:
- makes_api_calls
- modifies_files
- emits_logs
idempotent: false
success_signal: capability_graph_written(inputs.output_path) && consistency_validation_passed()
failure_signals:
- codex_inference_error
- manifest_consistency_failure
- output_write_failure
compatibility:
requires:
- manifest-generator
- openai-integration
composes_with:
- skill-validator
- orchestration-planner
- capability-graph-visualizer
enables:
- orchestration-planner
- capability-query-api
- skill-validator
observability:
logs:
- capability_graph.node_count
- capability_graph.edge_count
- capability_graph.consistency_issues
metrics:
- codex.calls.count
- codex.tokens.total
- graph.builders.duration_ms
metadata:
version: "1.0.0"
author: AI Systems Team
created_at: "2024-10-01T00:00:00Z"
updated_at: "2025-02-18T00:00:00Z"
tags:
- capability-graph
- codex
- orchestration
examples:
- Build full capability knowledge base after manifest generation
- Validate compatibility declarations before deploying orchestration planner