Contract and dependencies
Every feature declares what it provides, requires, and allows to be overridden — all in pyproject.toml.
Table of contents
Feature contract
[tool.splent.contract]
description = "Authentication feature"
[tool.splent.contract.provides]
routes = ["/login", "/logout", "/signup/"]
blueprints = ["auth_bp"]
models = ["User"]
commands = []
hooks = ["layout.anonymous_sidebar"]
services = ["AuthenticationService"]
signals = ["user-registered"]
translations = ["es"]
docker = []
[tool.splent.contract.requires]
features = []
env_vars = ["SECRET_KEY"]
signals = []
The contract is auto-generated by feature:contract --write and updated during feature:release. If config.py is missing, feature:contract --write prompts to run feature:inject-config.
Extension points
Features declare which parts are safe to override:
[tool.splent.contract.extensible]
services = ["AuthenticationService"]
models = ["User"]
templates = ["auth/login_form.html"]
hooks = ["layout.anonymous_sidebar"]
routes = true
Auto-inferred from source code during release. See Extension points.
Dependency rules
Features declare dependencies via the UVL model. The fundamental rule:
If A depends on B (
A => B), then A may import from B, but B must never import from A.
| Allowed | Forbidden |
|---|---|
profile imports from auth |
auth imports from profile |
confirmemail imports from mail |
mail imports from confirmemail |
For upstream communication, use signals — never direct imports.
Validate with:
splent product:validate
Naming conventions
| Element | Convention | Example |
|---|---|---|
| Package name | splent_feature_<name> |
splent_feature_auth |
| Namespace | splent_io |
splent_io.splent_feature_auth |
| Blueprint | <name>_bp |
auth_bp |
| Template dir | templates/<name>/ |
templates/auth/ |
| Bundle file | <name>.bundle.js |
auth.bundle.js |
| Seeder class | <Name>Seeder |
AuthSeeder |
| Service class | <Name>Service |
AuthenticationService |
Creating a feature
splent feature:create splent-io/splent_feature_notes
Scaffolds the full directory structure. See feature:create.
See also
- pyproject.toml reference — full contract format
feature:contract— infer contract from sourcefeature:install— checks contract dependencies before installing- Extension points — how refinements use the contract