vibey-architecturelisted
Install: claude install-skill the-vibey-project/vibey
# vibey architecture
Dependencies point inward. `import-linter` enforces this in CI via four
contracts: onion-layers, domain-independence, application-independence, and
interfaces-declare-only.
```
src/vibey/
├── domain/ # PURE. stdlib only. No I/O, no async, no third-party.
├── application/ # Protocol ports + use cases. Imports domain + stdlib.
├── infrastructure/ # Adapters. ONLY layer that may import asyncpg, httpx, etc.
├── cli/ # Typer. Calls application via bootstrap.
├── tui/ # Textual. Calls application via bootstrap.
└── bootstrap.py # Composition root — the ONE module that sees every layer.
```
## Where does new code go?
1. **Touches FS, network, clock, database, or an SDK?** → `infrastructure/`,
behind a `Protocol` in `application/interfaces/<area>.py` (`azure`, `build`,
`design`, `engines`, `gates`, `ledger`, `observability`, `projects`, `queue`,
`review`, `system`, `visual`). `application/ports.py` is a compatibility
re-export shim of seven names — never add to it. Never `import asyncpg` or
vendor SDKs elsewhere.
2. **Pure decision, zero I/O?** → `domain/`. Examples: `phase.py`,
`rotation.py`, `noloss.py`, `circuit.py`, `effort.py`.
3. **Orchestration (port → domain → port)?** → `application/`.
4. **Argument parsing / terminal formatting?** → `cli/` or `tui/`.
5. **Wiring concrete implementations to Protocols?** → `bootstrap.py` ONLY.
When in doubt, push logic inward. `lint-imports` name