vibetuner 2.10.1__tar.gz → 2.14.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.10.1 → vibetuner-2.14.1}/PKG-INFO +12 -10
  2. {vibetuner-2.10.1 → vibetuner-2.14.1}/README.md +6 -5
  3. vibetuner-2.14.1/pyproject.toml +86 -0
  4. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/cli/__init__.py +11 -2
  5. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/cli/scaffold.py +35 -37
  6. vibetuner-2.10.1/pyproject.toml +0 -95
  7. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/__init__.py +0 -0
  8. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/__main__.py +0 -0
  9. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/cli/run.py +0 -0
  10. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/config.py +0 -0
  11. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/context.py +0 -0
  12. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/AGENTS.md +0 -0
  13. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/CLAUDE.md +0 -0
  14. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/__init__.py +0 -0
  15. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/context.py +0 -0
  16. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/deps.py +0 -0
  17. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/email.py +0 -0
  18. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/hotreload.py +0 -0
  19. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/lifespan.py +0 -0
  20. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/middleware.py +0 -0
  21. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/oauth.py +0 -0
  22. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/routes/__init__.py +0 -0
  23. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/routes/auth.py +0 -0
  24. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/routes/debug.py +0 -0
  25. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/routes/health.py +0 -0
  26. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/routes/language.py +0 -0
  27. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/routes/meta.py +0 -0
  28. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/routes/user.py +0 -0
  29. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/frontend/templates.py +0 -0
  30. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/logging.py +0 -0
  31. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/AGENTS.md +0 -0
  32. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/CLAUDE.md +0 -0
  33. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/__init__.py +0 -0
  34. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/blob.py +0 -0
  35. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/email_verification.py +0 -0
  36. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/mixins.py +0 -0
  37. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/oauth.py +0 -0
  38. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/registry.py +0 -0
  39. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/types.py +0 -0
  40. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/models/user.py +0 -0
  41. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/mongo.py +0 -0
  42. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/paths.py +0 -0
  43. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/services/AGENTS.md +0 -0
  44. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/services/CLAUDE.md +0 -0
  45. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/services/__init__.py +0 -0
  46. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/services/blob.py +0 -0
  47. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/services/email.py +0 -0
  48. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/tasks/AGENTS.md +0 -0
  49. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/tasks/CLAUDE.md +0 -0
  50. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/tasks/__init__.py +0 -0
  51. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/tasks/context.py +0 -0
  52. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/tasks/worker.py +0 -0
  53. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/email/AGENTS.md +0 -0
  54. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/email/CLAUDE.md +0 -0
  55. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/email/default/magic_link.html.jinja +0 -0
  56. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/email/default/magic_link.txt.jinja +0 -0
  57. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/AGENTS.md +0 -0
  58. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/CLAUDE.md +0 -0
  59. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/base/favicons.html.jinja +0 -0
  60. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/base/footer.html.jinja +0 -0
  61. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/base/header.html.jinja +0 -0
  62. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/base/opengraph.html.jinja +0 -0
  63. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/base/skeleton.html.jinja +0 -0
  64. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/debug/collections.html.jinja +0 -0
  65. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/debug/components/debug_nav.html.jinja +0 -0
  66. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/debug/index.html.jinja +0 -0
  67. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/debug/info.html.jinja +0 -0
  68. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/debug/users.html.jinja +0 -0
  69. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/debug/version.html.jinja +0 -0
  70. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/email/magic_link.txt.jinja +0 -0
  71. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/email_sent.html.jinja +0 -0
  72. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/index.html.jinja +0 -0
  73. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/lang/select.html.jinja +0 -0
  74. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/login.html.jinja +0 -0
  75. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/meta/browserconfig.xml.jinja +0 -0
  76. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/meta/robots.txt.jinja +0 -0
  77. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/meta/site.webmanifest.jinja +0 -0
  78. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/meta/sitemap.xml.jinja +0 -0
  79. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/user/edit.html.jinja +0 -0
  80. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/frontend/user/profile.html.jinja +0 -0
  81. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/markdown/.placeholder +0 -0
  82. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/markdown/AGENTS.md +0 -0
  83. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates/markdown/CLAUDE.md +0 -0
  84. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/templates.py +0 -0
  85. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/time.py +0 -0
  86. {vibetuner-2.10.1 → vibetuner-2.14.1}/src/vibetuner/versioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: vibetuner
3
- Version: 2.10.1
3
+ Version: 2.14.1
4
4
  Summary: Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects
5
5
  Keywords: fastapi,mongodb,htmx,web-framework,scaffolding,oauth,background-jobs
6
6
  Author: All Tuner Labs, S.L.
@@ -22,14 +22,14 @@ Requires-Dist: asyncer>=0.0.10
22
22
  Requires-Dist: authlib>=1.6.5
23
23
  Requires-Dist: beanie[zstd]>=2.0.0
24
24
  Requires-Dist: click>=8.3.0
25
- Requires-Dist: copier>=9.9.0,<9.9.1
25
+ Requires-Dist: copier>=9.10.3,<9.10.4
26
26
  Requires-Dist: email-validator>=2.3.0
27
27
  Requires-Dist: fastapi[standard-no-fastapi-cloud-cli]>=0.121.0
28
- Requires-Dist: granian[pname]>=2.5.6
28
+ Requires-Dist: granian[pname]>=2.5.7
29
29
  Requires-Dist: httpx[http2]>=0.28.1
30
30
  Requires-Dist: itsdangerous>=2.2.0
31
31
  Requires-Dist: loguru>=0.7.3
32
- Requires-Dist: pydantic[email]>=2.12.3
32
+ Requires-Dist: pydantic[email]>=2.12.4
33
33
  Requires-Dist: pydantic-extra-types[pycountry]>=2.10.6
34
34
  Requires-Dist: pydantic-settings>=2.11.0
35
35
  Requires-Dist: pyyaml>=6.0.3
@@ -45,7 +45,7 @@ Requires-Dist: cloudflare>=4.3.1 ; extra == 'dev'
45
45
  Requires-Dist: djlint>=1.36.4 ; extra == 'dev'
46
46
  Requires-Dist: dunamai>=1.25.0 ; extra == 'dev'
47
47
  Requires-Dist: gh-bin>=2.81.0 ; extra == 'dev'
48
- Requires-Dist: granian[pname,reload]>=2.5.6 ; extra == 'dev'
48
+ Requires-Dist: granian[pname,reload]>=2.5.7 ; extra == 'dev'
49
49
  Requires-Dist: just-bin>=1.43.0 ; extra == 'dev'
50
50
  Requires-Dist: pre-commit>=4.3.0 ; extra == 'dev'
51
51
  Requires-Dist: pysemver>=0.5.0 ; extra == 'dev'
@@ -59,6 +59,7 @@ Requires-Dist: types-authlib>=1.6.5.20251005 ; extra == 'dev'
59
59
  Requires-Dist: types-pyyaml>=6.0.12.20250915 ; extra == 'dev'
60
60
  Requires-Dist: uv-bump>=0.3.1 ; extra == 'dev'
61
61
  Requires-Python: >=3.11
62
+ Project-URL: Changelog, https://github.com/alltuner/vibetuner/blob/main/CHANGELOG.md
62
63
  Project-URL: Documentation, https://github.com/alltuner/vibetuner#readme
63
64
  Project-URL: Homepage, https://github.com/alltuner/vibetuner
64
65
  Project-URL: Issues, https://github.com/alltuner/vibetuner/issues
@@ -110,6 +111,7 @@ just dev
110
111
  ```
111
112
 
112
113
  This will generate a complete project with:
114
+
113
115
  - Pre-configured FastAPI application
114
116
  - Authentication system (OAuth + magic links)
115
117
  - MongoDB models and configuration
@@ -229,8 +231,8 @@ See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for detai
229
231
 
230
232
  ## Links
231
233
 
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
234
+ - **Main Repository**: <https://github.com/alltuner/vibetuner>
235
+ - **Documentation**: <https://github.com/alltuner/vibetuner#readme>
236
+ - **Issues**: <https://github.com/alltuner/vibetuner/issues>
237
+ - **PyPI**: <https://pypi.org/project/vibetuner/>
238
+ - **npm Package**: <https://www.npmjs.com/package/@alltuner/vibetuner>
@@ -42,6 +42,7 @@ just dev
42
42
  ```
43
43
 
44
44
  This will generate a complete project with:
45
+
45
46
  - Pre-configured FastAPI application
46
47
  - Authentication system (OAuth + magic links)
47
48
  - MongoDB models and configuration
@@ -161,8 +162,8 @@ See [LICENSE](https://github.com/alltuner/vibetuner/blob/main/LICENSE) for detai
161
162
 
162
163
  ## Links
163
164
 
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
165
+ - **Main Repository**: <https://github.com/alltuner/vibetuner>
166
+ - **Documentation**: <https://github.com/alltuner/vibetuner#readme>
167
+ - **Issues**: <https://github.com/alltuner/vibetuner/issues>
168
+ - **PyPI**: <https://pypi.org/project/vibetuner/>
169
+ - **npm Package**: <https://www.npmjs.com/package/@alltuner/vibetuner>
@@ -0,0 +1,86 @@
1
+ [project]
2
+ name = "vibetuner"
3
+ description = "Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects"
4
+ version = "2.14.1"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ license = { text = "MIT" }
8
+ authors = [{ name = "All Tuner Labs, S.L." }]
9
+ keywords = ["fastapi", "mongodb", "htmx", "web-framework", "scaffolding", "oauth", "background-jobs"]
10
+ classifiers = [
11
+ "Development Status :: 4 - Beta",
12
+ "Intended Audience :: Developers",
13
+ "License :: OSI Approved :: MIT License",
14
+ "Programming Language :: Python :: 3",
15
+ "Programming Language :: Python :: 3.11",
16
+ "Programming Language :: Python :: 3.12",
17
+ "Programming Language :: Python :: 3.13",
18
+ "Programming Language :: Python :: 3.14",
19
+ "Framework :: FastAPI",
20
+ "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
21
+ "Topic :: Software Development :: Libraries :: Application Frameworks",
22
+ ]
23
+ dependencies = [
24
+ # These are the base dependencies of AllTuner's blessed stack
25
+ "aioboto3>=15.5.0",
26
+ "arel>=0.4.0",
27
+ "asyncer>=0.0.10",
28
+ "authlib>=1.6.5",
29
+ "beanie[zstd]>=2.0.0",
30
+ "click>=8.3.0",
31
+ "copier>=9.10.3,<9.10.4",
32
+ "email-validator>=2.3.0",
33
+ "fastapi[standard-no-fastapi-cloud-cli]>=0.121.0",
34
+ "granian[pname]>=2.5.7",
35
+ "httpx[http2]>=0.28.1",
36
+ "itsdangerous>=2.2.0",
37
+ "loguru>=0.7.3",
38
+ "pydantic[email]>=2.12.4",
39
+ "pydantic-extra-types[pycountry]>=2.10.6",
40
+ "pydantic-settings>=2.11.0",
41
+ "pyyaml>=6.0.3",
42
+ "redis[hiredis]>=7.0.1",
43
+ "rich>=14.2.0",
44
+ "sse-starlette>=3.0.3",
45
+ "starlette-babel>=1.0.3",
46
+ "starlette-htmx>=0.1.1",
47
+ "streaq[web]<6.0.0",
48
+ "typer-slim[standard]>=0.20.0",
49
+ ]
50
+
51
+ [project.scripts]
52
+ vibetuner = "vibetuner.cli:app"
53
+
54
+ [project.urls]
55
+ Homepage = "https://github.com/alltuner/vibetuner"
56
+ Documentation = "https://github.com/alltuner/vibetuner#readme"
57
+ Repository = "https://github.com/alltuner/vibetuner"
58
+ Issues = "https://github.com/alltuner/vibetuner/issues"
59
+ Changelog = "https://github.com/alltuner/vibetuner/blob/main/CHANGELOG.md"
60
+
61
+ [project.optional-dependencies]
62
+ dev = [
63
+ # These are the development dependencies of AllTuner's blessed stack
64
+ "babel>=2.17.0",
65
+ "cloudflare>=4.3.1",
66
+ "djlint>=1.36.4",
67
+ "dunamai>=1.25.0",
68
+ "gh-bin>=2.81.0",
69
+ "granian[pname,reload]>=2.5.7",
70
+ "just-bin>=1.43.0",
71
+ "pre-commit>=4.3.0",
72
+ "pysemver>=0.5.0",
73
+ "ruff>=0.14.3",
74
+ "rumdl>=0.0.171",
75
+ "semver>=3.0.4",
76
+ "taplo>=0.9.3",
77
+ "ty>=0.0.1a25",
78
+ "types-aioboto3[s3,ses]>=15.5.0",
79
+ "types-authlib>=1.6.5.20251005",
80
+ "types-pyyaml>=6.0.12.20250915",
81
+ "uv-bump>=0.3.1",
82
+ ]
83
+
84
+ [build-system]
85
+ requires = ["uv_build>=0.9,<0.10"]
86
+ build-backend = "uv_build"
@@ -10,7 +10,6 @@ from rich.console import Console
10
10
 
11
11
  from vibetuner.cli.run import run_app
12
12
  from vibetuner.cli.scaffold import scaffold_app
13
- from vibetuner.config import settings
14
13
  from vibetuner.logging import LogLevel, setup_logging
15
14
 
16
15
 
@@ -44,7 +43,16 @@ class AsyncTyper(typer.Typer):
44
43
  return partial(self.maybe_run_async, decorator)
45
44
 
46
45
 
47
- app = AsyncTyper(help=f"{settings.project.project_name.title()} CLI")
46
+ def _get_app_help():
47
+ try:
48
+ from vibetuner.config import settings
49
+
50
+ return f"{settings.project.project_name.title()} CLI"
51
+ except (RuntimeError, ImportError):
52
+ return "Vibetuner CLI"
53
+
54
+
55
+ app = AsyncTyper(help=_get_app_help())
48
56
 
49
57
  LOG_LEVEL_OPTION = typer.Option(
50
58
  LogLevel.INFO,
@@ -68,3 +76,4 @@ try:
68
76
  import_module("app.cli")
69
77
  except (ImportError, ModuleNotFoundError):
70
78
  pass
79
+ # Cache buster
@@ -15,16 +15,6 @@ scaffold_app = typer.Typer(
15
15
  )
16
16
 
17
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
18
  @scaffold_app.command(name="new")
29
19
  def new(
30
20
  destination: Annotated[
@@ -34,14 +24,6 @@ def new(
34
24
  exists=False,
35
25
  ),
36
26
  ],
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
27
  defaults: Annotated[
46
28
  bool,
47
29
  typer.Option(
@@ -57,6 +39,14 @@ def new(
57
39
  help="Override template variables in key=value format (can be used multiple times)",
58
40
  ),
59
41
  ] = None,
42
+ branch: Annotated[
43
+ str | None,
44
+ typer.Option(
45
+ "--branch",
46
+ "-b",
47
+ help="Use specific branch/tag from the vibetuner template repository",
48
+ ),
49
+ ] = None,
60
50
  ) -> None:
61
51
  """Create a new project from the vibetuner template.
62
52
 
@@ -71,24 +61,28 @@ def new(
71
61
  # Override specific values
72
62
  vibetuner scaffold new my-project --data project_name="My App" --data python_version="3.13"
73
63
 
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
64
+ # Use specific branch for testing
65
+ vibetuner scaffold new my-project --branch fix/scaffold-command
77
66
  """
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]")
67
+ # Use the official vibetuner template from GitHub
68
+ template_src = "gh:alltuner/vibetuner"
69
+ vcs_ref = branch or "main" # Use specified branch or default to main
70
+
71
+ if branch:
72
+ console.print(
73
+ f"[dim]Using vibetuner template from GitHub ({branch} branch)[/dim]"
74
+ )
82
75
  else:
83
- template_src = template
84
- console.print(f"[dim]Using template: {template_src}[/dim]")
76
+ console.print("[dim]Using vibetuner template from GitHub (main branch)[/dim]")
85
77
 
86
78
  # Parse data overrides
87
79
  data_dict = {}
88
80
  if data:
89
81
  for item in data:
90
82
  if "=" not in item:
91
- console.print(f"[red]Error: Invalid data format '{item}'. Expected key=value[/red]")
83
+ console.print(
84
+ f"[red]Error: Invalid data format '{item}'. Expected key=value[/red]"
85
+ )
92
86
  raise typer.Exit(code=1)
93
87
  key, value = item.split("=", 1)
94
88
  data_dict[key] = value
@@ -115,26 +109,27 @@ def new(
115
109
  defaults=defaults,
116
110
  quiet=defaults, # Suppress prompts when using defaults
117
111
  unsafe=True, # Allow running post-generation tasks
112
+ vcs_ref=vcs_ref, # Use the specified branch or default to main
118
113
  )
119
114
 
120
- console.print(f"\n[green]✓ Project created successfully![/green]")
121
- console.print(f"\nNext steps:")
115
+ console.print("\n[green]✓ Project created successfully![/green]")
116
+ console.print("\nNext steps:")
122
117
  console.print(f" cd {destination}")
123
- console.print(f" just dev")
118
+ console.print(" just dev")
124
119
 
125
120
  except Exception as e:
126
121
  console.print(f"[red]Error creating project: {e}[/red]")
127
- raise typer.Exit(code=1)
122
+ raise typer.Exit(code=1) from None
128
123
 
129
124
 
130
125
  @scaffold_app.command(name="update")
131
126
  def update(
132
127
  path: Annotated[
133
- Path,
128
+ Path | None,
134
129
  typer.Argument(
135
130
  help="Path to the project to update",
136
131
  ),
137
- ] = Path.cwd(),
132
+ ] = None,
138
133
  skip_answered: Annotated[
139
134
  bool,
140
135
  typer.Option(
@@ -160,6 +155,9 @@ def update(
160
155
  # Re-prompt for all questions
161
156
  vibetuner scaffold update --no-skip-answered
162
157
  """
158
+ if path is None:
159
+ path = Path.cwd()
160
+
163
161
  if not path.exists():
164
162
  console.print(f"[red]Error: Directory does not exist: {path}[/red]")
165
163
  raise typer.Exit(code=1)
@@ -168,7 +166,7 @@ def update(
168
166
  answers_file = path / ".copier-answers.yml"
169
167
  if not answers_file.exists():
170
168
  console.print(
171
- f"[red]Error: Not a copier project (missing .copier-answers.yml)[/red]"
169
+ "[red]Error: Not a copier project (missing .copier-answers.yml)[/red]"
172
170
  )
173
171
  console.print(f"[yellow]Directory: {path}[/yellow]")
174
172
  raise typer.Exit(code=1)
@@ -182,8 +180,8 @@ def update(
182
180
  unsafe=True, # Allow running post-generation tasks
183
181
  )
184
182
 
185
- console.print(f"\n[green]✓ Project updated successfully![/green]")
183
+ console.print("\n[green]✓ Project updated successfully![/green]")
186
184
 
187
185
  except Exception as e:
188
186
  console.print(f"[red]Error updating project: {e}[/red]")
189
- raise typer.Exit(code=1)
187
+ raise typer.Exit(code=1) from None
@@ -1,95 +0,0 @@
1
- [project]
2
- name = "vibetuner"
3
- description = "Core Python framework and blessed dependencies for production-ready FastAPI + MongoDB + HTMX projects"
4
- version = "2.10.1"
5
- readme = "README.md"
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
- ]
33
- dependencies = [
34
- # These are the base dependencies of AllTuner's blessed stack
35
- "aioboto3>=15.5.0",
36
- "arel>=0.4.0",
37
- "asyncer>=0.0.10",
38
- "authlib>=1.6.5",
39
- "beanie[zstd]>=2.0.0",
40
- "click>=8.3.0",
41
- "copier>=9.9.0,<9.9.1",
42
- "email-validator>=2.3.0",
43
- "fastapi[standard-no-fastapi-cloud-cli]>=0.121.0",
44
- "granian[pname]>=2.5.6",
45
- "httpx[http2]>=0.28.1",
46
- "itsdangerous>=2.2.0",
47
- "loguru>=0.7.3",
48
- "pydantic[email]>=2.12.3",
49
- "pydantic-extra-types[pycountry]>=2.10.6",
50
- "pydantic-settings>=2.11.0",
51
- "pyyaml>=6.0.3",
52
- "redis[hiredis]>=7.0.1",
53
- "rich>=14.2.0",
54
- "sse-starlette>=3.0.3",
55
- "starlette-babel>=1.0.3",
56
- "starlette-htmx>=0.1.1",
57
- "streaq[web]<6.0.0",
58
- "typer-slim[standard]>=0.20.0",
59
- ]
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
-
70
- [project.optional-dependencies]
71
- dev = [
72
- # These are the development dependencies of AllTuner's blessed stack
73
- "babel>=2.17.0",
74
- "cloudflare>=4.3.1",
75
- "djlint>=1.36.4",
76
- "dunamai>=1.25.0",
77
- "gh-bin>=2.81.0",
78
- "granian[pname,reload]>=2.5.6",
79
- "just-bin>=1.43.0",
80
- "pre-commit>=4.3.0",
81
- "pysemver>=0.5.0",
82
- "ruff>=0.14.3",
83
- "rumdl>=0.0.171",
84
- "semver>=3.0.4",
85
- "taplo>=0.9.3",
86
- "ty>=0.0.1a25",
87
- "types-aioboto3[s3,ses]>=15.5.0",
88
- "types-authlib>=1.6.5.20251005",
89
- "types-pyyaml>=6.0.12.20250915",
90
- "uv-bump>=0.3.1",
91
- ]
92
-
93
- [build-system]
94
- requires = ["uv_build>=0.9,<0.10"]
95
- build-backend = "uv_build"