Finfocus routing
FinOps CLI for Pulumi — projected costs, actual spend tracking, budget enforcement, and cost optimization for cloud infrastructure
npx -y skills add rshade/finfocus --skill finfocus-routingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Configure and debug FinFocus intelligent plugin routing. Use when setting up multi-plugin routing, configuring priority and fallback rules, writing pattern matching for resource types, testing route selection, or debugging why a plugin isn't receiving cost queries. Triggers on: "configure routing", "plugin priority", "fallback chain", "route test", "multi-region routing", "pattern matching", "config routes", "plugin selection", "routing config", or any task involving finfocus plugin routing configuration and debugging.
SKILL.md
4.3 KB, as published. Nobody here has run it
FinFocus Plugin Routing
Route cost queries to the right plugin based on provider, region, patterns, and priority.
No Config = No Routing
Without a routing: section in config.yaml, the engine queries all plugins
for every resource. Add routing config only when you need control.
Config Format
# ~/.finfocus/config.yaml (or $PROJECT/.finfocus/config.yaml)
routing:
plugins:
- name: aws-public # Must match installed plugin name
priority: 10 # Higher = preferred (default: 0)
features: # Limit capabilities (default: all)
- ProjectedCosts
patterns: # Declarative type matching (optional)
- type: glob
pattern: "aws:ec2:*"
fallback: true # Try next on failure (default: true)
Priority and Fallback
- Higher number = higher priority (sorted descending, stable sort)
- Equal priority (all 0) = plugins queried in parallel
- $0.00 is a VALID result — does NOT trigger fallback
- Only nil/empty results or errors trigger fallback to next plugin
InvalidArgumentdoes NOT trigger fallback (plugin explicitly rejected)
Features
| Feature | gRPC Method | Capability |
|---|---|---|
ProjectedCosts | GetProjectedCost | PLUGIN_CAPABILITY_PROJECTED_COSTS |
ActualCosts | GetActualCost | PLUGIN_CAPABILITY_ACTUAL_COSTS |
Recommendations | GetRecommendations | PLUGIN_CAPABILITY_RECOMMENDATIONS |
Carbon | GetCarbonFootprint | PLUGIN_CAPABILITY_CARBON |
DryRun | PerformDryRun | PLUGIN_CAPABILITY_DRY_RUN |
Budgets | GetBudgetStatus + 3 others | PLUGIN_CAPABILITY_BUDGETS |
BatchCost | BatchCost | PLUGIN_CAPABILITY_BATCH_COST |
Empty features list = all features enabled. Feature names are case-sensitive.
Pattern Matching
Two types for declarative resource type matching:
- glob:
filepath.Matchsemantics,*matches across/boundaries. Example:aws:ec2:*matchesaws:ec2:Instance - regex: RE2 syntax.
Example:
aws:(ec2|rds)/.*matchesaws:ec2/instance:Instance
Patterns take highest precedence over automatic provider matching.
Matching Precedence
- Declarative patterns — glob/regex against resource type
- Automatic provider —
SupportedProvidersfromGetPluginInfo - Global plugins — empty or
["*"]SupportedProviders
Internal Pulumi types (pulumi:*) skip automatic matching unless explicitly
matched by a pattern.
Region Matching
Region extracted from resource properties in order: region >
availabilityZone > availability_zone > location > ARN.
- AZs normalized:
us-west-2a→us-west-2,us-central1-a→us-central1 - Empty region on either side = wildcard (matches anything)
- Comparison is case-insensitive
CLI Commands
# Show effective routing rules
finfocus config routes list
finfocus config routes list --output json
# Simulate plugin selection (no plugin contact needed)
finfocus config routes test aws:ec2:Instance
finfocus config routes test aws:ec2:Instance us-east-1
finfocus config routes test aws:ec2:Instance --output json
Common Scenarios
See references/routing-scenarios.md for multi-region, feature-based, pattern-based, and multi-cloud configurations with complete YAML examples.
Validation
# Validation runs automatically on config load
# Errors are blocking, warnings are non-blocking
- Errors: empty name, missing plugin, invalid regex, negative priority, invalid pattern type, empty pattern
- Warnings: duplicate plugin config, unknown feature names