vibetuner 2.8.2__tar.gz → 2.9.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of vibetuner might be problematic. Click here for more details.

Files changed (86) hide show
  1. vibetuner-2.9.1/PKG-INFO +236 -0
  2. vibetuner-2.9.1/README.md +168 -0
  3. {vibetuner-2.8.2 → vibetuner-2.9.1}/pyproject.toml +45 -3
  4. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/cli/__init__.py +2 -0
  5. vibetuner-2.9.1/src/vibetuner/cli/scaffold.py +189 -0
  6. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/versioning.py +1 -1
  7. vibetuner-2.8.2/PKG-INFO +0 -48
  8. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/__init__.py +0 -0
  9. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/__main__.py +0 -0
  10. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/cli/run.py +0 -0
  11. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/config.py +0 -0
  12. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/context.py +0 -0
  13. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/AGENTS.md +0 -0
  14. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/CLAUDE.md +0 -0
  15. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/__init__.py +0 -0
  16. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/context.py +0 -0
  17. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/deps.py +0 -0
  18. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/email.py +0 -0
  19. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/hotreload.py +0 -0
  20. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/lifespan.py +0 -0
  21. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/middleware.py +0 -0
  22. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/oauth.py +0 -0
  23. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/routes/__init__.py +0 -0
  24. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/routes/auth.py +0 -0
  25. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/routes/debug.py +0 -0
  26. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/routes/health.py +0 -0
  27. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/routes/language.py +0 -0
  28. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/routes/meta.py +0 -0
  29. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/routes/user.py +0 -0
  30. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/frontend/templates.py +0 -0
  31. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/logging.py +0 -0
  32. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/AGENTS.md +0 -0
  33. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/CLAUDE.md +0 -0
  34. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/__init__.py +0 -0
  35. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/blob.py +0 -0
  36. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/email_verification.py +0 -0
  37. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/mixins.py +0 -0
  38. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/oauth.py +0 -0
  39. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/registry.py +0 -0
  40. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/types.py +0 -0
  41. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/models/user.py +0 -0
  42. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/mongo.py +0 -0
  43. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/paths.py +0 -0
  44. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/services/AGENTS.md +0 -0
  45. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/services/CLAUDE.md +0 -0
  46. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/services/__init__.py +0 -0
  47. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/services/blob.py +0 -0
  48. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/services/email.py +0 -0
  49. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/tasks/AGENTS.md +0 -0
  50. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/tasks/CLAUDE.md +0 -0
  51. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/tasks/__init__.py +0 -0
  52. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/tasks/context.py +0 -0
  53. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/tasks/worker.py +0 -0
  54. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/email/AGENTS.md +0 -0
  55. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/email/CLAUDE.md +0 -0
  56. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/email/default/magic_link.html.jinja +0 -0
  57. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/email/default/magic_link.txt.jinja +0 -0
  58. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/AGENTS.md +0 -0
  59. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/CLAUDE.md +0 -0
  60. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/base/favicons.html.jinja +0 -0
  61. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/base/footer.html.jinja +0 -0
  62. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/base/header.html.jinja +0 -0
  63. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/base/opengraph.html.jinja +0 -0
  64. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/base/skeleton.html.jinja +0 -0
  65. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/debug/collections.html.jinja +0 -0
  66. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/debug/components/debug_nav.html.jinja +0 -0
  67. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/debug/index.html.jinja +0 -0
  68. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/debug/info.html.jinja +0 -0
  69. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/debug/users.html.jinja +0 -0
  70. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/debug/version.html.jinja +0 -0
  71. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/email/magic_link.txt.jinja +0 -0
  72. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/email_sent.html.jinja +0 -0
  73. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/index.html.jinja +0 -0
  74. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/lang/select.html.jinja +0 -0
  75. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/login.html.jinja +0 -0
  76. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/meta/browserconfig.xml.jinja +0 -0
  77. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/meta/robots.txt.jinja +0 -0
  78. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/meta/site.webmanifest.jinja +0 -0
  79. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/meta/sitemap.xml.jinja +0 -0
  80. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/user/edit.html.jinja +0 -0
  81. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/frontend/user/profile.html.jinja +0 -0
  82. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/markdown/.placeholder +0 -0
  83. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/markdown/AGENTS.md +0 -0
  84. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates/markdown/CLAUDE.md +0 -0
  85. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/templates.py +0 -0
  86. {vibetuner-2.8.2 → vibetuner-2.9.1}/src/vibetuner/time.py +0 -0
@@ -0,0 +1,236 @@
1
+ Metadata-Version: 2.3
2
+ Name: vibetuner
3
+ Version: 2.9.1
4
+ Summary: Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects
5
+ Keywords: fastapi,mongodb,htmx,web-framework,scaffolding,oauth,background-jobs
6
+ Author: All Tuner Labs, S.L.
7
+ License: MIT
8
+ Classifier: Development Status :: 4 - Beta
9
+ Classifier: Intended Audience :: Developers
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Classifier: Framework :: FastAPI
17
+ Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
18
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
19
+ Requires-Dist: aioboto3>=15.5.0
20
+ Requires-Dist: arel>=0.4.0
21
+ Requires-Dist: asyncer>=0.0.10
22
+ Requires-Dist: authlib>=1.6.5
23
+ Requires-Dist: beanie[zstd]>=2.0.0
24
+ Requires-Dist: click>=8.3.0
25
+ Requires-Dist: copier>=9.9.0,<9.9.1
26
+ Requires-Dist: email-validator>=2.3.0
27
+ Requires-Dist: fastapi[standard-no-fastapi-cloud-cli]>=0.121.0
28
+ Requires-Dist: granian[pname]>=2.5.6
29
+ Requires-Dist: httpx[http2]>=0.28.1
30
+ Requires-Dist: itsdangerous>=2.2.0
31
+ Requires-Dist: loguru>=0.7.3
32
+ Requires-Dist: pydantic[email]>=2.12.3
33
+ Requires-Dist: pydantic-extra-types[pycountry]>=2.10.6
34
+ Requires-Dist: pydantic-settings>=2.11.0
35
+ Requires-Dist: pyyaml>=6.0.3
36
+ Requires-Dist: redis[hiredis]>=7.0.1
37
+ Requires-Dist: rich>=14.2.0
38
+ Requires-Dist: sse-starlette>=3.0.3
39
+ Requires-Dist: starlette-babel>=1.0.3
40
+ Requires-Dist: starlette-htmx>=0.1.1
41
+ Requires-Dist: streaq[web]<6.0.0
42
+ Requires-Dist: typer-slim[standard]>=0.20.0
43
+ Requires-Dist: babel>=2.17.0 ; extra == 'dev'
44
+ Requires-Dist: cloudflare>=4.3.1 ; extra == 'dev'
45
+ Requires-Dist: djlint>=1.36.4 ; extra == 'dev'
46
+ Requires-Dist: dunamai>=1.25.0 ; extra == 'dev'
47
+ Requires-Dist: gh-bin>=2.81.0 ; extra == 'dev'
48
+ Requires-Dist: granian[pname,reload]>=2.5.6 ; extra == 'dev'
49
+ Requires-Dist: just-bin>=1.43.0 ; extra == 'dev'
50
+ Requires-Dist: pre-commit>=4.3.0 ; extra == 'dev'
51
+ Requires-Dist: pysemver>=0.5.0 ; extra == 'dev'
52
+ Requires-Dist: ruff>=0.14.3 ; extra == 'dev'
53
+ Requires-Dist: rumdl>=0.0.171 ; extra == 'dev'
54
+ Requires-Dist: semver>=3.0.4 ; extra == 'dev'
55
+ Requires-Dist: taplo>=0.9.3 ; extra == 'dev'
56
+ Requires-Dist: ty>=0.0.1a25 ; extra == 'dev'
57
+ Requires-Dist: types-aioboto3[s3,ses]>=15.5.0 ; extra == 'dev'
58
+ Requires-Dist: types-authlib>=1.6.5.20251005 ; extra == 'dev'
59
+ Requires-Dist: types-pyyaml>=6.0.12.20250915 ; extra == 'dev'
60
+ Requires-Dist: uv-bump>=0.3.1 ; extra == 'dev'
61
+ Requires-Python: >=3.11
62
+ Project-URL: Documentation, https://github.com/alltuner/vibetuner#readme
63
+ Project-URL: Homepage, https://github.com/alltuner/vibetuner
64
+ Project-URL: Issues, https://github.com/alltuner/vibetuner/issues
65
+ Project-URL: Repository, https://github.com/alltuner/vibetuner
66
+ Provides-Extra: dev
67
+ Description-Content-Type: text/markdown
68
+
69
+ # vibetuner
70
+
71
+ **Core Python framework and blessed dependencies for Vibetuner projects**
72
+
73
+ This package provides the complete Python framework and curated dependency set for building modern web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to authentication, background jobs, and CLI tools.
74
+
75
+ ## What is Vibetuner?
76
+
77
+ Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications. This package (`vibetuner`) is the Python component that provides:
78
+
79
+ - Complete web application framework built on FastAPI
80
+ - MongoDB integration with Beanie ODM
81
+ - OAuth and magic link authentication out of the box
82
+ - Background job processing with Redis + Streaq
83
+ - CLI framework with Typer
84
+ - Email services, blob storage, and more
85
+
86
+ **This package is designed to be used within projects generated by the Vibetuner scaffolding tool.** For standalone use, you'll need to set up the project structure manually.
87
+
88
+ ## Installation
89
+
90
+ ```bash
91
+ # In a Vibetuner-generated project (automatic)
92
+ uv sync
93
+
94
+ # Add to an existing project
95
+ uv add vibetuner
96
+
97
+ # With development dependencies
98
+ uv add vibetuner[dev]
99
+ ```
100
+
101
+ ## Quick Start
102
+
103
+ The recommended way to use Vibetuner is via the scaffolding tool:
104
+
105
+ ```bash
106
+ # Create a new project with all the framework code
107
+ uvx vibetuner scaffold new my-project
108
+ cd my-project
109
+ just dev
110
+ ```
111
+
112
+ This will generate a complete project with:
113
+ - Pre-configured FastAPI application
114
+ - Authentication system (OAuth + magic links)
115
+ - MongoDB models and configuration
116
+ - Frontend templates and asset pipeline
117
+ - Docker setup for development and production
118
+ - CLI commands and background job infrastructure
119
+
120
+ ## What's Included
121
+
122
+ ### Core Framework (`src/vibetuner/`)
123
+
124
+ - **`frontend/`**: FastAPI app, routes, middleware, auth
125
+ - **`models/`**: User, OAuth, email verification, blob storage models
126
+ - **`services/`**: Email (SES), blob storage (S3)
127
+ - **`tasks/`**: Background job infrastructure
128
+ - **`cli/`**: CLI framework with scaffold, run commands
129
+ - **`config.py`**: Pydantic settings management
130
+ - **`mongo.py`**: MongoDB/Beanie setup
131
+ - **`logging.py`**: Structured logging configuration
132
+
133
+ ### Blessed Dependencies
134
+
135
+ - **FastAPI** (0.121+): Modern, fast web framework
136
+ - **Beanie**: Async MongoDB ODM with Pydantic
137
+ - **Authlib**: OAuth 1.0/2.0 client
138
+ - **Granian**: High-performance ASGI server
139
+ - **Redis** + **Streaq**: Background task processing
140
+ - **Typer**: CLI framework
141
+ - **Rich**: Beautiful terminal output
142
+ - **Loguru**: Structured logging
143
+ - **Pydantic**: Data validation and settings
144
+
145
+ See [pyproject.toml](./pyproject.toml) for the complete dependency list.
146
+
147
+ ## CLI Tools
148
+
149
+ When installed, provides the `vibetuner` command:
150
+
151
+ ```bash
152
+ # Create new project from template
153
+ vibetuner scaffold new my-project
154
+ vibetuner scaffold new my-project --defaults
155
+
156
+ # Update existing project
157
+ vibetuner scaffold update
158
+
159
+ # Run development server (in generated projects)
160
+ vibetuner run dev frontend
161
+ vibetuner run dev worker
162
+
163
+ # Run production server (in generated projects)
164
+ vibetuner run prod frontend
165
+ vibetuner run prod worker
166
+ ```
167
+
168
+ ## Development Dependencies
169
+
170
+ The `[dev]` extra includes all tools needed for development:
171
+
172
+ - **Ruff**: Fast linting and formatting
173
+ - **djlint**: Template linting
174
+ - **Babel**: i18n message extraction
175
+ - **pre-commit**: Git hooks
176
+ - **Type stubs**: For aioboto3, authlib, PyYAML
177
+ - And more...
178
+
179
+ ## Usage in Generated Projects
180
+
181
+ In a Vibetuner-generated project, import from `vibetuner`:
182
+
183
+ ```python
184
+ # Use core models
185
+ from vibetuner.models import UserModel, OAuthAccountModel
186
+
187
+ # Use services
188
+ from vibetuner.services.email import send_email
189
+
190
+ # Use configuration
191
+ from vibetuner.config import settings
192
+
193
+ # Extend core routes
194
+ from vibetuner.frontend import app
195
+
196
+ # Add your routes
197
+ @app.get("/api/hello")
198
+ async def hello():
199
+ return {"message": "Hello World"}
200
+ ```
201
+
202
+ ## Documentation
203
+
204
+ For complete documentation, guides, and examples, see the main Vibetuner repository:
205
+
206
+ **📖 [Vibetuner Documentation](https://github.com/alltuner/vibetuner#readme)**
207
+
208
+ ## Package Ecosystem
209
+
210
+ Vibetuner consists of three packages that work together:
211
+
212
+ 1. **vibetuner** (this package): Python framework and dependencies
213
+ 2. **[@alltuner/vibetuner](https://www.npmjs.com/package/@alltuner/vibetuner)**: JavaScript/CSS build dependencies
214
+ 3. **Scaffolding template**: Copier template for project generation
215
+
216
+ All three are version-locked and tested together to ensure compatibility.
217
+
218
+ ## Contributing
219
+
220
+ Contributions welcome! See the main repository for contribution guidelines:
221
+
222
+ **🤝 [Contributing to Vibetuner](https://github.com/alltuner/vibetuner/blob/main/CONTRIBUTING.md)**
223
+
224
+ ## License
225
+
226
+ MIT License - Copyright (c) 2025 All Tuner Labs, S.L.
227
+
228
+ See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for details.
229
+
230
+ ## Links
231
+
232
+ - **Main Repository**: https://github.com/alltuner/vibetuner
233
+ - **Documentation**: https://github.com/alltuner/vibetuner#readme
234
+ - **Issues**: https://github.com/alltuner/vibetuner/issues
235
+ - **PyPI**: https://pypi.org/project/vibetuner/
236
+ - **npm Package**: https://www.npmjs.com/package/@alltuner/vibetuner
@@ -0,0 +1,168 @@
1
+ # vibetuner
2
+
3
+ **Core Python framework and blessed dependencies for Vibetuner projects**
4
+
5
+ This package provides the complete Python framework and curated dependency set for building modern web applications with Vibetuner. It includes everything from FastAPI and MongoDB integration to authentication, background jobs, and CLI tools.
6
+
7
+ ## What is Vibetuner?
8
+
9
+ Vibetuner is a production-ready scaffolding tool for FastAPI + MongoDB + HTMX web applications. This package (`vibetuner`) is the Python component that provides:
10
+
11
+ - Complete web application framework built on FastAPI
12
+ - MongoDB integration with Beanie ODM
13
+ - OAuth and magic link authentication out of the box
14
+ - Background job processing with Redis + Streaq
15
+ - CLI framework with Typer
16
+ - Email services, blob storage, and more
17
+
18
+ **This package is designed to be used within projects generated by the Vibetuner scaffolding tool.** For standalone use, you'll need to set up the project structure manually.
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ # In a Vibetuner-generated project (automatic)
24
+ uv sync
25
+
26
+ # Add to an existing project
27
+ uv add vibetuner
28
+
29
+ # With development dependencies
30
+ uv add vibetuner[dev]
31
+ ```
32
+
33
+ ## Quick Start
34
+
35
+ The recommended way to use Vibetuner is via the scaffolding tool:
36
+
37
+ ```bash
38
+ # Create a new project with all the framework code
39
+ uvx vibetuner scaffold new my-project
40
+ cd my-project
41
+ just dev
42
+ ```
43
+
44
+ This will generate a complete project with:
45
+ - Pre-configured FastAPI application
46
+ - Authentication system (OAuth + magic links)
47
+ - MongoDB models and configuration
48
+ - Frontend templates and asset pipeline
49
+ - Docker setup for development and production
50
+ - CLI commands and background job infrastructure
51
+
52
+ ## What's Included
53
+
54
+ ### Core Framework (`src/vibetuner/`)
55
+
56
+ - **`frontend/`**: FastAPI app, routes, middleware, auth
57
+ - **`models/`**: User, OAuth, email verification, blob storage models
58
+ - **`services/`**: Email (SES), blob storage (S3)
59
+ - **`tasks/`**: Background job infrastructure
60
+ - **`cli/`**: CLI framework with scaffold, run commands
61
+ - **`config.py`**: Pydantic settings management
62
+ - **`mongo.py`**: MongoDB/Beanie setup
63
+ - **`logging.py`**: Structured logging configuration
64
+
65
+ ### Blessed Dependencies
66
+
67
+ - **FastAPI** (0.121+): Modern, fast web framework
68
+ - **Beanie**: Async MongoDB ODM with Pydantic
69
+ - **Authlib**: OAuth 1.0/2.0 client
70
+ - **Granian**: High-performance ASGI server
71
+ - **Redis** + **Streaq**: Background task processing
72
+ - **Typer**: CLI framework
73
+ - **Rich**: Beautiful terminal output
74
+ - **Loguru**: Structured logging
75
+ - **Pydantic**: Data validation and settings
76
+
77
+ See [pyproject.toml](./pyproject.toml) for the complete dependency list.
78
+
79
+ ## CLI Tools
80
+
81
+ When installed, provides the `vibetuner` command:
82
+
83
+ ```bash
84
+ # Create new project from template
85
+ vibetuner scaffold new my-project
86
+ vibetuner scaffold new my-project --defaults
87
+
88
+ # Update existing project
89
+ vibetuner scaffold update
90
+
91
+ # Run development server (in generated projects)
92
+ vibetuner run dev frontend
93
+ vibetuner run dev worker
94
+
95
+ # Run production server (in generated projects)
96
+ vibetuner run prod frontend
97
+ vibetuner run prod worker
98
+ ```
99
+
100
+ ## Development Dependencies
101
+
102
+ The `[dev]` extra includes all tools needed for development:
103
+
104
+ - **Ruff**: Fast linting and formatting
105
+ - **djlint**: Template linting
106
+ - **Babel**: i18n message extraction
107
+ - **pre-commit**: Git hooks
108
+ - **Type stubs**: For aioboto3, authlib, PyYAML
109
+ - And more...
110
+
111
+ ## Usage in Generated Projects
112
+
113
+ In a Vibetuner-generated project, import from `vibetuner`:
114
+
115
+ ```python
116
+ # Use core models
117
+ from vibetuner.models import UserModel, OAuthAccountModel
118
+
119
+ # Use services
120
+ from vibetuner.services.email import send_email
121
+
122
+ # Use configuration
123
+ from vibetuner.config import settings
124
+
125
+ # Extend core routes
126
+ from vibetuner.frontend import app
127
+
128
+ # Add your routes
129
+ @app.get("/api/hello")
130
+ async def hello():
131
+ return {"message": "Hello World"}
132
+ ```
133
+
134
+ ## Documentation
135
+
136
+ For complete documentation, guides, and examples, see the main Vibetuner repository:
137
+
138
+ **📖 [Vibetuner Documentation](https://github.com/alltuner/vibetuner#readme)**
139
+
140
+ ## Package Ecosystem
141
+
142
+ Vibetuner consists of three packages that work together:
143
+
144
+ 1. **vibetuner** (this package): Python framework and dependencies
145
+ 2. **[@alltuner/vibetuner](https://www.npmjs.com/package/@alltuner/vibetuner)**: JavaScript/CSS build dependencies
146
+ 3. **Scaffolding template**: Copier template for project generation
147
+
148
+ All three are version-locked and tested together to ensure compatibility.
149
+
150
+ ## Contributing
151
+
152
+ Contributions welcome! See the main repository for contribution guidelines:
153
+
154
+ **🤝 [Contributing to Vibetuner](https://github.com/alltuner/vibetuner/blob/main/CONTRIBUTING.md)**
155
+
156
+ ## License
157
+
158
+ MIT License - Copyright (c) 2025 All Tuner Labs, S.L.
159
+
160
+ See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for details.
161
+
162
+ ## Links
163
+
164
+ - **Main Repository**: https://github.com/alltuner/vibetuner
165
+ - **Documentation**: https://github.com/alltuner/vibetuner#readme
166
+ - **Issues**: https://github.com/alltuner/vibetuner/issues
167
+ - **PyPI**: https://pypi.org/project/vibetuner/
168
+ - **npm Package**: https://www.npmjs.com/package/@alltuner/vibetuner
@@ -1,8 +1,35 @@
1
1
  [project]
2
2
  name = "vibetuner"
3
- description = "Blessed Python dependencies for Vibetuner projects"
4
- version = "2.8.2"
3
+ description = "Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects"
4
+ version = "2.9.1"
5
+ readme = "README.md"
5
6
  requires-python = ">=3.11"
7
+ license = {text = "MIT"}
8
+ authors = [
9
+ {name = "All Tuner Labs, S.L."},
10
+ ]
11
+ keywords = [
12
+ "fastapi",
13
+ "mongodb",
14
+ "htmx",
15
+ "web-framework",
16
+ "scaffolding",
17
+ "oauth",
18
+ "background-jobs",
19
+ ]
20
+ classifiers = [
21
+ "Development Status :: 4 - Beta",
22
+ "Intended Audience :: Developers",
23
+ "License :: OSI Approved :: MIT License",
24
+ "Programming Language :: Python :: 3",
25
+ "Programming Language :: Python :: 3.11",
26
+ "Programming Language :: Python :: 3.12",
27
+ "Programming Language :: Python :: 3.13",
28
+ "Programming Language :: Python :: 3.14",
29
+ "Framework :: FastAPI",
30
+ "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
31
+ "Topic :: Software Development :: Libraries :: Application Frameworks",
32
+ ]
6
33
  dependencies = [
7
34
  # These are the base dependencies of AllTuner's blessed stack
8
35
  "aioboto3>=15.5.0",
@@ -11,6 +38,7 @@ dependencies = [
11
38
  "authlib>=1.6.5",
12
39
  "beanie[zstd]>=2.0.0",
13
40
  "click>=8.3.0",
41
+ "copier>=9.9.0,<9.9.1",
14
42
  "email-validator>=2.3.0",
15
43
  "fastapi[standard-no-fastapi-cloud-cli]>=0.121.0",
16
44
  "granian[pname]>=2.5.6",
@@ -30,12 +58,20 @@ dependencies = [
30
58
  "typer-slim[standard]>=0.20.0",
31
59
  ]
32
60
 
61
+ [project.scripts]
62
+ vibetuner = "vibetuner.cli:app"
63
+
64
+ [project.urls]
65
+ Homepage = "https://github.com/alltuner/vibetuner"
66
+ Documentation = "https://github.com/alltuner/vibetuner#readme"
67
+ Repository = "https://github.com/alltuner/vibetuner"
68
+ Issues = "https://github.com/alltuner/vibetuner/issues"
69
+
33
70
  [project.optional-dependencies]
34
71
  dev = [
35
72
  # These are the development dependencies of AllTuner's blessed stack
36
73
  "babel>=2.17.0",
37
74
  "cloudflare>=4.3.1",
38
- "copier>=9.9.0,<9.9.1",
39
75
  "djlint>=1.36.4",
40
76
  "dunamai>=1.25.0",
41
77
  "gh-bin>=2.81.0",
@@ -54,6 +90,12 @@ dev = [
54
90
  "uv-bump>=0.3.1",
55
91
  ]
56
92
 
93
+ [dependency-groups]
94
+ docs = [
95
+ "mkdocs>=1.6.0",
96
+ "mkdocs-material>=9.5.0",
97
+ ]
98
+
57
99
  [build-system]
58
100
  requires = ["uv_build>=0.9,<0.10"]
59
101
  build-backend = "uv_build"
@@ -9,6 +9,7 @@ import typer
9
9
  from rich.console import Console
10
10
 
11
11
  from vibetuner.cli.run import run_app
12
+ from vibetuner.cli.scaffold import scaffold_app
12
13
  from vibetuner.config import settings
13
14
  from vibetuner.logging import LogLevel, setup_logging
14
15
 
@@ -61,6 +62,7 @@ def callback(log_level: LogLevel | None = LOG_LEVEL_OPTION) -> None:
61
62
 
62
63
 
63
64
  app.add_typer(run_app, name="run")
65
+ app.add_typer(scaffold_app, name="scaffold")
64
66
 
65
67
  try:
66
68
  import_module("app.cli")
@@ -0,0 +1,189 @@
1
+ # ABOUTME: Scaffolding commands for creating new projects from the vibetuner template
2
+ # ABOUTME: Uses Copier to generate FastAPI+MongoDB+HTMX projects with interactive prompts
3
+ from pathlib import Path
4
+ from typing import Annotated
5
+
6
+ import copier
7
+ import typer
8
+ from rich.console import Console
9
+
10
+
11
+ console = Console()
12
+
13
+ scaffold_app = typer.Typer(
14
+ help="Create new projects from the vibetuner template", no_args_is_help=True
15
+ )
16
+
17
+
18
+ def get_template_path() -> Path:
19
+ """Get the path to the vibetuner template directory."""
20
+ # This file is at: vibetuner-py/src/vibetuner/cli/scaffold.py
21
+ # Template is at: ./ (root of repo)
22
+ current_file = Path(__file__).resolve()
23
+ # Go up: scaffold.py -> cli -> vibetuner -> src -> vibetuner-py -> repo_root
24
+ template_path = current_file.parent.parent.parent.parent.parent
25
+ return template_path
26
+
27
+
28
+ @scaffold_app.command(name="new")
29
+ def new(
30
+ destination: Annotated[
31
+ Path,
32
+ typer.Argument(
33
+ help="Destination directory for the new project",
34
+ exists=False,
35
+ ),
36
+ ],
37
+ template: Annotated[
38
+ str | None,
39
+ typer.Option(
40
+ "--template",
41
+ "-t",
42
+ help="Template source (git URL, local path, or github:user/repo). Defaults to local vibetuner template.",
43
+ ),
44
+ ] = None,
45
+ defaults: Annotated[
46
+ bool,
47
+ typer.Option(
48
+ "--defaults",
49
+ "-d",
50
+ help="Use default values for all prompts (non-interactive mode)",
51
+ ),
52
+ ] = False,
53
+ data: Annotated[
54
+ list[str] | None,
55
+ typer.Option(
56
+ "--data",
57
+ help="Override template variables in key=value format (can be used multiple times)",
58
+ ),
59
+ ] = None,
60
+ ) -> None:
61
+ """Create a new project from the vibetuner template.
62
+
63
+ Examples:
64
+
65
+ # Interactive mode (prompts for all values)
66
+ vibetuner scaffold new my-project
67
+
68
+ # Use defaults for all prompts
69
+ vibetuner scaffold new my-project --defaults
70
+
71
+ # Override specific values
72
+ vibetuner scaffold new my-project --data project_name="My App" --data python_version="3.13"
73
+
74
+ # Use a different template source
75
+ vibetuner scaffold new my-project --template gh:alltuner/vibetuner
76
+ vibetuner scaffold new my-project --template /path/to/template
77
+ """
78
+ # Determine template source
79
+ if template is None:
80
+ template_src = get_template_path()
81
+ console.print(f"[dim]Using local template: {template_src}[/dim]")
82
+ else:
83
+ template_src = template
84
+ console.print(f"[dim]Using template: {template_src}[/dim]")
85
+
86
+ # Parse data overrides
87
+ data_dict = {}
88
+ if data:
89
+ for item in data:
90
+ if "=" not in item:
91
+ console.print(f"[red]Error: Invalid data format '{item}'. Expected key=value[/red]")
92
+ raise typer.Exit(code=1)
93
+ key, value = item.split("=", 1)
94
+ data_dict[key] = value
95
+
96
+ # When using defaults, provide sensible default values for required fields
97
+ if defaults:
98
+ default_values = {
99
+ "company_name": "Acme Corp",
100
+ "author_name": "Developer",
101
+ "author_email": "dev@example.com",
102
+ "supported_languages": [],
103
+ }
104
+ # Merge: user overrides take precedence over defaults
105
+ data_dict = {**default_values, **data_dict}
106
+
107
+ # Run copier
108
+ try:
109
+ console.print(f"\n[green]Creating new project in: {destination}[/green]\n")
110
+
111
+ copier.run_copy(
112
+ src_path=str(template_src),
113
+ dst_path=destination,
114
+ data=data_dict if data_dict else None,
115
+ defaults=defaults,
116
+ quiet=defaults, # Suppress prompts when using defaults
117
+ unsafe=True, # Allow running post-generation tasks
118
+ )
119
+
120
+ console.print(f"\n[green]✓ Project created successfully![/green]")
121
+ console.print(f"\nNext steps:")
122
+ console.print(f" cd {destination}")
123
+ console.print(f" just dev")
124
+
125
+ except Exception as e:
126
+ console.print(f"[red]Error creating project: {e}[/red]")
127
+ raise typer.Exit(code=1)
128
+
129
+
130
+ @scaffold_app.command(name="update")
131
+ def update(
132
+ path: Annotated[
133
+ Path,
134
+ typer.Argument(
135
+ help="Path to the project to update",
136
+ ),
137
+ ] = Path.cwd(),
138
+ skip_answered: Annotated[
139
+ bool,
140
+ typer.Option(
141
+ "--skip-answered",
142
+ "-s",
143
+ help="Skip questions that have already been answered",
144
+ ),
145
+ ] = True,
146
+ ) -> None:
147
+ """Update an existing project to the latest template version.
148
+
149
+ This will update the project's files to match the latest template version,
150
+ while preserving your answers to the original questions.
151
+
152
+ Examples:
153
+
154
+ # Update current directory
155
+ vibetuner scaffold update
156
+
157
+ # Update specific directory
158
+ vibetuner scaffold update /path/to/project
159
+
160
+ # Re-prompt for all questions
161
+ vibetuner scaffold update --no-skip-answered
162
+ """
163
+ if not path.exists():
164
+ console.print(f"[red]Error: Directory does not exist: {path}[/red]")
165
+ raise typer.Exit(code=1)
166
+
167
+ # Check if it's a copier project
168
+ answers_file = path / ".copier-answers.yml"
169
+ if not answers_file.exists():
170
+ console.print(
171
+ f"[red]Error: Not a copier project (missing .copier-answers.yml)[/red]"
172
+ )
173
+ console.print(f"[yellow]Directory: {path}[/yellow]")
174
+ raise typer.Exit(code=1)
175
+
176
+ try:
177
+ console.print(f"\n[green]Updating project: {path}[/green]\n")
178
+
179
+ copier.run_update(
180
+ dst_path=path,
181
+ skip_answered=skip_answered,
182
+ unsafe=True, # Allow running post-generation tasks
183
+ )
184
+
185
+ console.print(f"\n[green]✓ Project updated successfully![/green]")
186
+
187
+ except Exception as e:
188
+ console.print(f"[red]Error updating project: {e}[/red]")
189
+ raise typer.Exit(code=1)
@@ -1,7 +1,7 @@
1
1
  __version__ = "0.0.0-default"
2
2
 
3
3
  try:
4
- from .._version import version as __version__ # type: ignore
4
+ from app._version import version as __version__ # type: ignore
5
5
  except ImportError:
6
6
  pass
7
7
 
vibetuner-2.8.2/PKG-INFO DELETED
@@ -1,48 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: vibetuner
3
- Version: 2.8.2
4
- Summary: Blessed Python dependencies for Vibetuner projects
5
- Requires-Dist: aioboto3>=15.5.0
6
- Requires-Dist: arel>=0.4.0
7
- Requires-Dist: asyncer>=0.0.10
8
- Requires-Dist: authlib>=1.6.5
9
- Requires-Dist: beanie[zstd]>=2.0.0
10
- Requires-Dist: click>=8.3.0
11
- Requires-Dist: email-validator>=2.3.0
12
- Requires-Dist: fastapi[standard-no-fastapi-cloud-cli]>=0.121.0
13
- Requires-Dist: granian[pname]>=2.5.6
14
- Requires-Dist: httpx[http2]>=0.28.1
15
- Requires-Dist: itsdangerous>=2.2.0
16
- Requires-Dist: loguru>=0.7.3
17
- Requires-Dist: pydantic[email]>=2.12.3
18
- Requires-Dist: pydantic-extra-types[pycountry]>=2.10.6
19
- Requires-Dist: pydantic-settings>=2.11.0
20
- Requires-Dist: pyyaml>=6.0.3
21
- Requires-Dist: redis[hiredis]>=7.0.1
22
- Requires-Dist: rich>=14.2.0
23
- Requires-Dist: sse-starlette>=3.0.3
24
- Requires-Dist: starlette-babel>=1.0.3
25
- Requires-Dist: starlette-htmx>=0.1.1
26
- Requires-Dist: streaq[web]<6.0.0
27
- Requires-Dist: typer-slim[standard]>=0.20.0
28
- Requires-Dist: babel>=2.17.0 ; extra == 'dev'
29
- Requires-Dist: cloudflare>=4.3.1 ; extra == 'dev'
30
- Requires-Dist: copier>=9.9.0,<9.9.1 ; extra == 'dev'
31
- Requires-Dist: djlint>=1.36.4 ; extra == 'dev'
32
- Requires-Dist: dunamai>=1.25.0 ; extra == 'dev'
33
- Requires-Dist: gh-bin>=2.81.0 ; extra == 'dev'
34
- Requires-Dist: granian[pname,reload]>=2.5.6 ; extra == 'dev'
35
- Requires-Dist: just-bin>=1.43.0 ; extra == 'dev'
36
- Requires-Dist: pre-commit>=4.3.0 ; extra == 'dev'
37
- Requires-Dist: pysemver>=0.5.0 ; extra == 'dev'
38
- Requires-Dist: ruff>=0.14.3 ; extra == 'dev'
39
- Requires-Dist: rumdl>=0.0.171 ; extra == 'dev'
40
- Requires-Dist: semver>=3.0.4 ; extra == 'dev'
41
- Requires-Dist: taplo>=0.9.3 ; extra == 'dev'
42
- Requires-Dist: ty>=0.0.1a25 ; extra == 'dev'
43
- Requires-Dist: types-aioboto3[s3,ses]>=15.5.0 ; extra == 'dev'
44
- Requires-Dist: types-authlib>=1.6.5.20251005 ; extra == 'dev'
45
- Requires-Dist: types-pyyaml>=6.0.12.20250915 ; extra == 'dev'
46
- Requires-Dist: uv-bump>=0.3.1 ; extra == 'dev'
47
- Requires-Python: >=3.11
48
- Provides-Extra: dev