Finfocus dev
Skill rshade/finfocus/.claude/skills/finfocus-dev/finfocus-dev
FinFocus Core development workflow guide for contributors. Use when implementing features, fixing bugs, writing tests, running CI checks, or following project conventions in the finfocus Go codebase. Triggers on: adding CLI commands, writing Go tests, running make targets, debugging CI failures, understanding project structure, or any Go development task within finfocus-core.From its SKILL.md
npx -y skills add rshade/finfocus --skill finfocus-devAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 5 stars5 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.
- runs commandsInstructs the agent to run 7 commands, including `make build` and 6 more.
SKILL.md
3.3 KB, 730 tokens by cl100k_base, as published. Nobody here has run it
FinFocus Development Workflow
Quick Reference
make build # Build binary to bin/finfocus
make test # Unit tests (fast, default)
make lint # golangci-lint + markdownlint (5+ min, use extended timeout)
make validate # go mod tidy + go vet
make test-race # Race detector
make test-integration # Cross-component tests (10min timeout)
make build-all # Build binary + all plugins
Critical rules: Always run make lint and make test before claiming success.
Never run git commit (user commits manually). Never modify .golangci.yml.
Adding a CLI Command
- Create
internal/cli/your_command.go - Follow constructor pattern:
func NewYourCmd() *cobra.Command {
var flagVar string
cmd := &cobra.Command{
Use: "your-command",
Short: "Description",
RunE: func(cmd *cobra.Command, args []string) error {
// Use cmd.Printf() not fmt.Printf()
return nil
},
}
cmd.Flags().StringVar(&flagVar, "flag", "", "description")
return cmd
}
- Register in parent command (e.g.,
root.goorcost.go) - Use
RunE(notRun) for error handling - Defer cleanup immediately:
defer cleanup()
Resource Processing Pipeline
All cost commands follow:
ingest.LoadPulumiPlan(path) -> ingest.MapResources() -> registry.Open(ctx, adapter)
-> engine.GetProjectedCost/GetActualCost() -> engine.RenderResults(format, results)
Testing Standards
- Use
testify/assertandtestify/requireexclusively (never manualif/t.Errorf) require.*for setup that must succeed;assert.*for value checks- Table-driven tests for variations
- Package suffix
_testfor black-box testing t.TempDir()for temporary files (auto-cleanup)- Capture output:
cmd.SetOut(&buf)andcmd.SetErr(&buf) - Target 80% coverage minimum, 95% for critical paths
See references/testing-patterns.md for detailed test patterns and examples.
Project Structure
See references/project-structure.md for the complete package map and key file locations.
Error Handling
- Wrap errors:
fmt.Errorf("context: %w", err) - Return early on errors
- Plugin failures don't stop processing (graceful degradation)
- Validation prefix:
"VALIDATION: %v", plugin error prefix:"ERROR:"
Logging (zerolog)
log := logging.FromContext(ctx)
log.Debug().Ctx(ctx).Str("component", "engine").Msg("message")
Standard fields: trace_id, component, operation, duration_ms.
Enable debug: --debug flag or FINFOCUS_LOG_LEVEL=debug.
Date Handling
Support both "2006-01-02" and RFC3339. Default --to to time.Now().
Validate ranges (to must be after from).
Output Formats
Three formats via --output flag: table (default), json, ndjson.
Always use cmd.Printf() for testability.
What ships with it: 2 files
9.5 KB alongside SKILL.md
references/
- project-structure.md5.0 KB
- testing-patterns.md4.5 KB