oliver-kriska/claude-elixir-phoenix-phx-boundaries
Analyze Phoenix context boundaries and module coupling via mix xref. Use when checking cross-context calls…
npx skills add https://github.com/oliver-kriska/claude-elixir-phoenix --skill phx-boundaries
Analyze module dependencies to ensure clean context separation and proper architectural boundaries.
$elixir-phoenix:phx-boundaries # Check for violations
$elixir-phoenix:phx-boundaries --assess # Score context health (0-100)
$elixir-phoenix:phx-boundaries --fix # Suggest fixes for violations
--assess Mode: Context Health ScoreEvaluate overall boundary health with a quantified score.
| Metric | Healthy Range | Red Flag | Weight |
|--------|---------------|----------|--------|
| Modules per context | 3-15 | >20 or <2 | 20% |
| Public API surface | 5-30 funcs | >40 funcs | 15% |
| Fan-out (contexts called) | 1-4 | >6 | 20% |
| Fan-in (called by contexts) | 1-6 | >10 | 15% |
| Circular dependencies | 0 | >0 | 15% |
| Boundary violations | 0 | >0 | 15% |
Use Glob to count .ex files per context directory under lib/my_app/*/.
Use Grep to count public function definitions per context file under lib/my_app/*.ex.
Run mix xref graph --format stats for dependency analysis.
Run mix xref graph --format cycles --label compile for compile-time circular dependencies.
## Context Health Assessment
### Overall Score: 82/100 (Good)
| Context | Modules | API | Fan-Out | Fan-In | Score |
|---------|---------|-----|---------|--------|-------|
| Accounts | 5 | 12 | 2 | 4 | 95 |
| Orders | 18 | 45 | 8 | 3 | 62 |
| Shared | 2 | 8 | 0 | 12 | 78 |
### Issues Found
1. **Orders** - Too large (18 modules, 45 funcs)
- Consider: Extract Fulfillment, Invoicing sub-contexts
2. **Orders** - High fan-out (8 contexts)
- Consider: Review if all dependencies necessary
### Recommendations
- Split Orders into Orders + Fulfillment
- Review Accounts ← Billing dependency
mix xref first — Refactoring without dependency data creates new violations; always map the dependency graph before moving modules| Layer | Can Call | Cannot Call |
|-------|----------|-------------|
| Controllers | Contexts, Plug, Conn | Repo, Schemas directly |
| LiveViews | Contexts, Components, PubSub | Repo, Schemas directly |
| Contexts | Own schemas, Repo, other contexts | Web layer modules |
| Schemas | Ecto types, validations | Contexts, Repo |
Run mix xref graph --label compile-connected.
Run mix xref graph --sink MyApp.Accounts --label compile.
Run mix xref callers MyApp.Accounts.get_user!/1.
Run mix xref graph --format cycles --label compile.
| Issue | Detection Command | Fix |
|-------|------------------|-----|
| Repo in web layer | grep -r "Repo\." lib/my_app_web/ | Move to context |
| Schema with queries | grep -r "import Ecto.Query" lib/my_app/**/schemas/ | Move queries to context |
| Cross-context schema import | grep -r "alias MyApp.Other.Schema" lib/my_app/ctx/ | Call context API |
| Business logic in LiveView | grep -r "Repo\.\|Ecto\.Multi" lib/my_app_web/live/ | Extract to context |
mix xref graph --label compile-connected for overviewAlways end with actionable follow-up — findings without a plan
get lost:
- `$elixir-phoenix:phx-plan` — Create a plan to fix violations (recommended for 3+ issues)
- `$elixir-phoenix:phx-quick` — Fix a single boundary violation directly
- `$elixir-phoenix:phx-review` — Review specific modules for deeper issues
For detailed patterns, see:
references/context-design.md - Context design principlesreferences/refactoring-boundaries.md - Fixing boundary violationsTake oliver-kriska/claude-elixir-phoenix-phx-boundaries from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.