vibetuner 2.14.1__py3-none-any.whl → 2.18.1__py3-none-any.whl

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 (41) hide show
  1. vibetuner/config.py +20 -9
  2. vibetuner/context.py +3 -0
  3. vibetuner/frontend/lifespan.py +12 -7
  4. vibetuner/frontend/middleware.py +2 -2
  5. vibetuner/frontend/routes/debug.py +1 -1
  6. vibetuner/frontend/routes/user.py +1 -1
  7. vibetuner/mongo.py +3 -3
  8. vibetuner/tasks/worker.py +1 -1
  9. vibetuner/templates/email/{default/magic_link.html.jinja → magic_link.html.jinja} +2 -1
  10. vibetuner/templates/frontend/base/favicons.html.jinja +1 -1
  11. vibetuner/templates/frontend/base/skeleton.html.jinja +5 -2
  12. vibetuner/templates/frontend/debug/collections.html.jinja +2 -0
  13. vibetuner/templates/frontend/debug/components/debug_nav.html.jinja +6 -6
  14. vibetuner/templates/frontend/debug/index.html.jinja +6 -4
  15. vibetuner/templates/frontend/debug/info.html.jinja +2 -0
  16. vibetuner/templates/frontend/debug/users.html.jinja +4 -2
  17. vibetuner/templates/frontend/debug/version.html.jinja +2 -0
  18. vibetuner/templates/frontend/email_sent.html.jinja +2 -1
  19. vibetuner/templates/frontend/index.html.jinja +1 -0
  20. vibetuner/templates/frontend/login.html.jinja +8 -3
  21. vibetuner/templates/frontend/user/edit.html.jinja +3 -2
  22. vibetuner/templates/frontend/user/profile.html.jinja +2 -1
  23. {vibetuner-2.14.1.dist-info → vibetuner-2.18.1.dist-info}/METADATA +20 -17
  24. {vibetuner-2.14.1.dist-info → vibetuner-2.18.1.dist-info}/RECORD +27 -41
  25. {vibetuner-2.14.1.dist-info → vibetuner-2.18.1.dist-info}/WHEEL +1 -1
  26. vibetuner/frontend/AGENTS.md +0 -113
  27. vibetuner/frontend/CLAUDE.md +0 -113
  28. vibetuner/models/AGENTS.md +0 -165
  29. vibetuner/models/CLAUDE.md +0 -165
  30. vibetuner/services/AGENTS.md +0 -104
  31. vibetuner/services/CLAUDE.md +0 -104
  32. vibetuner/tasks/AGENTS.md +0 -98
  33. vibetuner/tasks/CLAUDE.md +0 -98
  34. vibetuner/templates/email/AGENTS.md +0 -48
  35. vibetuner/templates/email/CLAUDE.md +0 -48
  36. vibetuner/templates/frontend/AGENTS.md +0 -74
  37. vibetuner/templates/frontend/CLAUDE.md +0 -74
  38. vibetuner/templates/markdown/AGENTS.md +0 -29
  39. vibetuner/templates/markdown/CLAUDE.md +0 -29
  40. /vibetuner/templates/email/{default/magic_link.txt.jinja → magic_link.txt.jinja} +0 -0
  41. {vibetuner-2.14.1.dist-info → vibetuner-2.18.1.dist-info}/entry_points.txt +0 -0
@@ -3,29 +3,25 @@ vibetuner/__main__.py,sha256=Ye9oBAgXhcYQ4I4yZli3TIXF5lWQ9yY4tTPs4XnDDUY,29
3
3
  vibetuner/cli/__init__.py,sha256=IY2wJ_ErX2PimyYSe5SL_zGrENSWLgW-cXgMRXNC7pE,1992
4
4
  vibetuner/cli/run.py,sha256=mHvZypizNfVwdLo7k8SvBO7HPUF4Vka9hjJlECZCGfA,5009
5
5
  vibetuner/cli/scaffold.py,sha256=qADWxx1gYECQ8N6dgvJmlucT6mZ29rxWu3VZhbWmhC0,5710
6
- vibetuner/config.py,sha256=R3u23RHv5gcVuU27WEo-8MrSZYbqSNbALJJKR3ACaQQ,3714
7
- vibetuner/context.py,sha256=VdgfX-SFmVwiwKPFID4ElIRnFADTlagqsh9RKXNiLCs,725
8
- vibetuner/frontend/AGENTS.md,sha256=mds0nTl3RBblTA7EFhC9dxx86mn1FH5ESXNSj_1R1Jk,3253
9
- vibetuner/frontend/CLAUDE.md,sha256=mds0nTl3RBblTA7EFhC9dxx86mn1FH5ESXNSj_1R1Jk,3253
6
+ vibetuner/config.py,sha256=Z-o7jP1dLvPR0yVzW9wPvRgQezbl6Be40EpuG9i9Eos,4157
7
+ vibetuner/context.py,sha256=h4f4FfkmLlOD6WiSLhx7-IjFvIA4zcrsAp6478l6npg,743
10
8
  vibetuner/frontend/__init__.py,sha256=QpQY9kUWvKzMtMCh9Lcoyz1dNdYfW1d_Ue4WUnzz_No,3017
11
9
  vibetuner/frontend/context.py,sha256=yd9mJ8Cj9AUeHE533dofEoyCkw6oSPowdq397whfN_s,169
12
10
  vibetuner/frontend/deps.py,sha256=b3ocC_ryaK2Jp51SfcFqckrXiaL7V-chkFRqLjzgA_c,1296
13
11
  vibetuner/frontend/email.py,sha256=k0d7FCZCge5VYOKp3fLsbx7EA5_SrtBkpMs57o4W7u0,1119
14
12
  vibetuner/frontend/hotreload.py,sha256=Gl7FIKJaiCVVoyWQqdErBUOKDP1cGBFUpGzqHMiJd10,285
15
- vibetuner/frontend/lifespan.py,sha256=SDLcsfyQoa1H13KeISWPhe3B28oDF9L2TpZnyOos-N0,525
16
- vibetuner/frontend/middleware.py,sha256=oKKAgqE4opAdP3WEk_PhKkQxdmAoWBvuW0PCsqRYVI8,4980
13
+ vibetuner/frontend/lifespan.py,sha256=iKrRcEaPn5Q2B4ZZhMKzXE-hBM8OxjwMn6A5Q1FUbWY,679
14
+ vibetuner/frontend/middleware.py,sha256=aVsEeXGuBqcBB_IlmtBW_3icuvVix7P3A63AkyeX_38,4957
17
15
  vibetuner/frontend/oauth.py,sha256=EzEwoOZ_8xn_CiqAWpNoEdhV2NPxZKKwF2bA6W6Bkj0,5884
18
16
  vibetuner/frontend/routes/__init__.py,sha256=nHhiylHIUPZ2R-Bd7vXEGHLJBQ7fNuzPTJodjJR3lyc,428
19
17
  vibetuner/frontend/routes/auth.py,sha256=vKE-Dm2yPXReaOLvcxfT4a6df1dKUoteZ4p46v8Elm4,4331
20
- vibetuner/frontend/routes/debug.py,sha256=1YHM_y0FSfA6RON5acVHmnhtKCFiCj57eAzp5AkYWXc,12735
18
+ vibetuner/frontend/routes/debug.py,sha256=Mzbyx3gv_mCxg0sdjY4p7LXgH1wI3BoEyn1sRZuGY90,12743
21
19
  vibetuner/frontend/routes/health.py,sha256=_XkMpdMNUemu7qzkGkqn5TBnZmGrArA3Xps5CWCcGlg,959
22
20
  vibetuner/frontend/routes/language.py,sha256=wHNfdewqWfK-2JLXwglu0Q0b_e00HFGd0A2-PYT44LE,1240
23
21
  vibetuner/frontend/routes/meta.py,sha256=pSyIxQsiB0QZSYwCQbS07KhkT5oHC5r9jvjUDIqZRGw,1409
24
- vibetuner/frontend/routes/user.py,sha256=DnewxYkiU0uiheNrzVyaAWfOk8jreJGTNrGuYf3DVCc,2658
22
+ vibetuner/frontend/routes/user.py,sha256=b8ow6IGnfsHosSwSmEIYZtuQJnW_tacnNjp_aMnqWxU,2666
25
23
  vibetuner/frontend/templates.py,sha256=1k2jCGBdMx9U9RDcHmuO6fiNEXrRYZ0Mzk51H9XAlrM,5322
26
24
  vibetuner/logging.py,sha256=9eNofqVtKZCBDS33NbBI7Sv2875gM8MNStTSCjX2AXQ,2409
27
- vibetuner/models/AGENTS.md,sha256=5wtNuzZFA8R3A1DGA0ackzO3JsKZPSc_WHuWu8bT-YA,3809
28
- vibetuner/models/CLAUDE.md,sha256=5wtNuzZFA8R3A1DGA0ackzO3JsKZPSc_WHuWu8bT-YA,3809
29
25
  vibetuner/models/__init__.py,sha256=JvmQvzDIxaI7zlk-ROCWEbuzxXSUOqCshINUjgu-AfQ,325
30
26
  vibetuner/models/blob.py,sha256=F30HFS4Z_Bji_PGPflWIv4dOwqKLsEWQHcjW1Oz_79M,2523
31
27
  vibetuner/models/email_verification.py,sha256=iwDnbPhceugY6vQZwyp0AKCEID61NbAxqA7tdQKHHAI,2488
@@ -34,53 +30,43 @@ vibetuner/models/oauth.py,sha256=BdOZbW47Das9ntHTtRmVdl1lB5zLCcXW2fyVJ-tQ_F8,150
34
30
  vibetuner/models/registry.py,sha256=O5YG7vOrWluqpH5N7m44v72wbscMhU_Pu3TJw_u0MTk,311
35
31
  vibetuner/models/types.py,sha256=Lj3ASEvx5eNgQMcVhNyKQHHolJqDxj2yH8S-M9oa4J8,402
36
32
  vibetuner/models/user.py,sha256=ttcSH4mVREPhA6bCFUWXKfJ9_8_Iq3lEYXe3rDrslw4,2696
37
- vibetuner/mongo.py,sha256=mG4-78xjdNKWGV4PFddqdRL1zxFRH0P0fGgcmni4cx0,494
33
+ vibetuner/mongo.py,sha256=F8AzD33LWQ6jq7kFUqQPSPDSr7KPlbOy8THsvXHFKdg,504
38
34
  vibetuner/paths.py,sha256=WFHuaanFOBI7v7xOHjyLvNMYKwX0KqOyi63x62wLE-M,7470
39
- vibetuner/services/AGENTS.md,sha256=-0_QNcASfPv_a2dWMpnAQh4wdH7kgvskuRpxwF7d4Vo,2323
40
- vibetuner/services/CLAUDE.md,sha256=-0_QNcASfPv_a2dWMpnAQh4wdH7kgvskuRpxwF7d4Vo,2323
41
35
  vibetuner/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
36
  vibetuner/services/blob.py,sha256=-lEGIWe30yR2IuTfy5bB9Sg_PX0HoYC_WMTQ3VN28gU,5660
43
37
  vibetuner/services/email.py,sha256=IavJZS5MI40LlF_cjBpPPRx_S2r1JD4GcFg3-dWkzPA,1626
44
- vibetuner/tasks/AGENTS.md,sha256=CAXTU5QAEY36ziVjxrZ2QER36aRo3i_SMCa4EukjOGY,2581
45
- vibetuner/tasks/CLAUDE.md,sha256=CAXTU5QAEY36ziVjxrZ2QER36aRo3i_SMCa4EukjOGY,2581
46
38
  vibetuner/tasks/__init__.py,sha256=uETtKOA5rJ48NBx-LN4niRJDzkb6--NHAPW3jReHABI,71
47
39
  vibetuner/tasks/context.py,sha256=FOFUDWGNo1h8G8qlE-1Gbkh-Kd1z3WZTqSMHkvZ68v8,869
48
- vibetuner/tasks/worker.py,sha256=UUknSuVl0orXl3hrW8EPpaGgRI8wYoVm-p5FnDki0Gc,437
49
- vibetuner/templates/email/AGENTS.md,sha256=oRCocZqDM0qKCg6REwU-MwTtDbDTbL5DwpmkshVhIEY,1274
50
- vibetuner/templates/email/CLAUDE.md,sha256=oRCocZqDM0qKCg6REwU-MwTtDbDTbL5DwpmkshVhIEY,1274
51
- vibetuner/templates/email/default/magic_link.html.jinja,sha256=7npaw9XzttjAe4Y5pk7J47eZJ3K0vR_h7Dz01YT3Xis,567
52
- vibetuner/templates/email/default/magic_link.txt.jinja,sha256=dANak9ion1cpILt45V3GcI2qnL_gKFPj7PsZKYV0m5s,200
53
- vibetuner/templates/frontend/AGENTS.md,sha256=LHUslpKlYJ2eQXY7s3uyuAvhyCIoK_6Qox0O0rwIuaI,2299
54
- vibetuner/templates/frontend/CLAUDE.md,sha256=LHUslpKlYJ2eQXY7s3uyuAvhyCIoK_6Qox0O0rwIuaI,2299
55
- vibetuner/templates/frontend/base/favicons.html.jinja,sha256=TIFiB013aWvQN1zMuHK9K_10AS2zjW7ZtWCxJJmD1kg,70
40
+ vibetuner/tasks/worker.py,sha256=-PKQ2kqvMe8X5ninULh3Vrp3M-gwh-ht2kmitvkHTVg,429
41
+ vibetuner/templates/email/magic_link.html.jinja,sha256=DzaCnBsYoau2JQh5enPAa2FMFFTyCwdyiM3vGhBQdtA,553
42
+ vibetuner/templates/email/magic_link.txt.jinja,sha256=dANak9ion1cpILt45V3GcI2qnL_gKFPj7PsZKYV0m5s,200
43
+ vibetuner/templates/frontend/base/favicons.html.jinja,sha256=A7s7YXuE82tRd7ZLJs1jGEGwBRiMPrqlWd507xL1iZg,70
56
44
  vibetuner/templates/frontend/base/footer.html.jinja,sha256=P5EKssUk-HHz0yFE3auj1WtSqsJxAzi39XbRxjBtLLg,165
57
45
  vibetuner/templates/frontend/base/header.html.jinja,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
46
  vibetuner/templates/frontend/base/opengraph.html.jinja,sha256=wjmLAE3C4OZqxPhPCce1kD3XDN-BZgp3v0GwlToUoBc,419
59
- vibetuner/templates/frontend/base/skeleton.html.jinja,sha256=fEMGjE7pXQphsqMlPh-CEXfwNJgjtzbUO_86QvEz92Y,1695
60
- vibetuner/templates/frontend/debug/collections.html.jinja,sha256=YpvUaqKJDQ_Rre1p-Yh5mc2FBSxUbQRAkAtGCFvQidc,7092
61
- vibetuner/templates/frontend/debug/components/debug_nav.html.jinja,sha256=czC5xsguAU3m-LC_DDna067B-pJY9k-i7hXRh5hihHY,2963
62
- vibetuner/templates/frontend/debug/index.html.jinja,sha256=FGIvBfmOGJ0OI2_e8oYiFQ9WCLjy2e-aIxyM6qdIzW8,4890
63
- vibetuner/templates/frontend/debug/info.html.jinja,sha256=lylzLX-K2TbDq8SmrLOzo8rKUng3njmkwQAgmFNqy5I,14966
64
- vibetuner/templates/frontend/debug/users.html.jinja,sha256=CqC1lBGsuea-JgIqgeQAHRUILtZbRMCC4kVotifTUc8,7767
65
- vibetuner/templates/frontend/debug/version.html.jinja,sha256=nLh_zUzkO5OuyYHs_SH3Bu9Fa2b2N-YJLiQBTTmQVJM,2899
47
+ vibetuner/templates/frontend/base/skeleton.html.jinja,sha256=uOEUt577Mfv83nLOKLPKvBJHh8PG6w7YwDYv1GVwnaQ,1698
48
+ vibetuner/templates/frontend/debug/collections.html.jinja,sha256=LogTicEMSzy-sYrHQ8Kjqf_6Il9Cv5cRElMgivcJC2U,7094
49
+ vibetuner/templates/frontend/debug/components/debug_nav.html.jinja,sha256=SntW7esMV6TDkIHcoevZX7j-fCv3h6pblOJ--_-5fUI,2963
50
+ vibetuner/templates/frontend/debug/index.html.jinja,sha256=qheuA53UYGBBeVvsNL8APJ2Y7FxjL3g8LWafY2U1MSA,4892
51
+ vibetuner/templates/frontend/debug/info.html.jinja,sha256=Z9yZxW-dyOZ1kWsY1_ZX7jvPQ4IaM9hJMVD6Sk8QxgA,14968
52
+ vibetuner/templates/frontend/debug/users.html.jinja,sha256=BjTiJbOMadZYZJYvtYW0KeFcYN7ooI7_YylhOnfbLD4,7809
53
+ vibetuner/templates/frontend/debug/version.html.jinja,sha256=pJ-QuDRuvB7X04nC43upZiXLaFCC6vmI5QhRS62rt6k,2901
66
54
  vibetuner/templates/frontend/email/magic_link.txt.jinja,sha256=fTVl3Wjfvp3EJAB5DYt01EL_O7o9r8lHedDH05YP44c,192
67
- vibetuner/templates/frontend/email_sent.html.jinja,sha256=Cpvzza80v9KmON66hKmhwIgvd9tkhjhM7O8qe0YLjF4,5235
68
- vibetuner/templates/frontend/index.html.jinja,sha256=P4pcI1JKrr5YBMGbgjTSrKlvORRgzi87VvNKsh1B5GE,924
55
+ vibetuner/templates/frontend/email_sent.html.jinja,sha256=Pq3J_WOwY_zFe9QJkvO29o6pw06JEnYxh068kyl_ZEg,5236
56
+ vibetuner/templates/frontend/index.html.jinja,sha256=m8_xNS1O7JlrfWOHy0y7prf64HyVokQEeKvFqRWjxrQ,925
69
57
  vibetuner/templates/frontend/lang/select.html.jinja,sha256=4jHo8QWvMOIeK_KqHzSaDzgvuT3v8MlmjTrrYIl2sjk,224
70
- vibetuner/templates/frontend/login.html.jinja,sha256=9jzEyeCdB2Xe_braaojf1lCLH0qaLN6-lPUHPoGfGRM,5365
58
+ vibetuner/templates/frontend/login.html.jinja,sha256=Y_dKk47-H6M8StepiFXntJcorBNXiOXKjORJN--SjOA,5548
71
59
  vibetuner/templates/frontend/meta/browserconfig.xml.jinja,sha256=5DE-Dowxw3fRg4UJerW6tVrUYdHWUsUOfS_YucoRVXQ,300
72
60
  vibetuner/templates/frontend/meta/robots.txt.jinja,sha256=SUBJqQCOW5FFdD4uIkReo04NcAYnjITLyB4Wk1wBcS4,46
73
61
  vibetuner/templates/frontend/meta/site.webmanifest.jinja,sha256=QCg2Z2GXd2AwJ3C8CnW9Brvu3cbXcZiquLNEzA8FsOc,150
74
62
  vibetuner/templates/frontend/meta/sitemap.xml.jinja,sha256=IhBjk7p5OdqszyK6DR3eUAdeAucKk2s_PpnOfYxgNCo,170
75
- vibetuner/templates/frontend/user/edit.html.jinja,sha256=nMaEjcT7VZy_eHa108HCrsV1KrKXFFa02A2k9RhbHp0,5442
76
- vibetuner/templates/frontend/user/profile.html.jinja,sha256=A3Tqs6mCtXcCTirZ0ZNGjCs2RM_8g4MP2LkutzsDsxQ,9963
63
+ vibetuner/templates/frontend/user/edit.html.jinja,sha256=dhmLFsokTWbtnmIE10S8gC6rDHToC6vNIUB2BRximKQ,5443
64
+ vibetuner/templates/frontend/user/profile.html.jinja,sha256=qXFonyeCy99JE5o3rEtaOHtnxgg2-AlNykwIZyxpk_M,9964
77
65
  vibetuner/templates/markdown/.placeholder,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
- vibetuner/templates/markdown/AGENTS.md,sha256=jcvoQNazCj-t54s0gr-4_qyxLMP8iPf2urlaAj887n0,814
79
- vibetuner/templates/markdown/CLAUDE.md,sha256=jcvoQNazCj-t54s0gr-4_qyxLMP8iPf2urlaAj887n0,814
80
66
  vibetuner/templates.py,sha256=xRoMb_oyAI5x4kxfpg56UcLKkT8e9HVn-o3KFAu9ISE,5094
81
67
  vibetuner/time.py,sha256=3_DtveCCzI20ocTnAlTh2u7FByUXtINaUoQZO-_uZow,1188
82
68
  vibetuner/versioning.py,sha256=UAHGoNsv3QEPAJgHyt_Q8I26SW7ng2FnZlX2-0M6r6U,156
83
- vibetuner-2.14.1.dist-info/WHEEL,sha256=5w2T7AS2mz1-rW9CNagNYWRCaB0iQqBMYLwKdlgiR4Q,78
84
- vibetuner-2.14.1.dist-info/entry_points.txt,sha256=aKIj9YCCXizjYupx9PeWkUJePg3ncHke_LTS5rmCsfs,49
85
- vibetuner-2.14.1.dist-info/METADATA,sha256=OBZZuVDKo5H-_477impRGHFQOEvofy19w1g6Ecvi-yM,8141
86
- vibetuner-2.14.1.dist-info/RECORD,,
69
+ vibetuner-2.18.1.dist-info/WHEEL,sha256=DpNsHFUm_gffZe1FgzmqwuqiuPC6Y-uBCzibcJcdupM,78
70
+ vibetuner-2.18.1.dist-info/entry_points.txt,sha256=aKIj9YCCXizjYupx9PeWkUJePg3ncHke_LTS5rmCsfs,49
71
+ vibetuner-2.18.1.dist-info/METADATA,sha256=c_aNrSkA_hSWfazWl6Nn-9O38DWtgnofBZanp8892fo,8061
72
+ vibetuner-2.18.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.9.7
2
+ Generator: uv 0.9.8
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,113 +0,0 @@
1
- # Core Frontend Module
2
-
3
- **IMMUTABLE SCAFFOLDING CODE** - This is the framework's core frontend infrastructure.
4
-
5
- ## What's Here
6
-
7
- This module contains the scaffolding's core frontend components:
8
-
9
- - **routes/** - Essential default routes (auth, health, debug, language, user, meta)
10
- - **templates.py** - Template rendering with automatic context injection
11
- - **deps.py** - FastAPI dependencies (authentication, language, etc.)
12
- - **middleware.py** - Request/response middleware
13
- - **oauth.py** - OAuth provider integration
14
- - **email.py** - Magic link email authentication
15
- - **lifespan.py** - Application startup/shutdown lifecycle
16
- - **context.py** - Request context management
17
- - **hotreload.py** - Development hot-reload support
18
-
19
- ## Important Rules
20
-
21
- ⚠️ **DO NOT MODIFY** these core frontend components directly.
22
-
23
- **For changes to core frontend:**
24
-
25
- - File an issue at `https://github.com/alltuner/scaffolding`
26
- - Core changes benefit all projects using the scaffolding
27
-
28
- **For your application routes:**
29
-
30
- - Create them in `src/app/frontend/routes/` instead
31
- - Import core components when needed:
32
- - `from vibetuner.frontend.deps import get_current_user`
33
- - `from vibetuner.frontend.templates import render_template`
34
-
35
- ## User Route Pattern (for reference)
36
-
37
- Your application routes in `src/app/frontend/routes/` should follow this pattern:
38
-
39
- ```python
40
- # src/app/frontend/routes/dashboard.py
41
- from fastapi import APIRouter, Request, Depends
42
- from vibetuner.frontend.deps import get_current_user
43
- from vibetuner.frontend.templates import render_template
44
-
45
- router = APIRouter()
46
-
47
- @router.get("/dashboard")
48
- async def dashboard(request: Request, user=Depends(get_current_user)):
49
- return render_template("dashboard.html.jinja", request, {"user": user})
50
- ```
51
-
52
- ## Template Rendering
53
-
54
- ```python
55
- # Automatic context in every template:
56
- {
57
- "request": request,
58
- "DEBUG": settings.DEBUG,
59
- "hotreload": hotreload, # Dev mode
60
- # ... plus your custom context
61
- }
62
- ```
63
-
64
- ### Template Filters
65
-
66
- - `{{ datetime | timeago }}` - "2 hours ago"
67
- - `{{ datetime | format_date }}` - "January 15, 2024"
68
- - `{{ text | markdown }}` - Convert Markdown to HTML
69
-
70
- ## Core Dependencies Available
71
-
72
- Import these from `vibetuner.frontend.deps`:
73
-
74
- - `get_current_user` - Require authenticated user (raises 403 if not authenticated)
75
- - `get_current_user_optional` - Optional auth check (returns None if not authenticated)
76
- - `LangDep` - Current language from cookie/header
77
- - `MagicCookieDep` - Magic link cookie for authentication
78
-
79
- ## HTMX Patterns
80
-
81
- ```html
82
- <!-- Partial updates -->
83
- <button hx-post="/api/action" hx-target="#result">Click</button>
84
-
85
- <!-- Form submission -->
86
- <form hx-post="/submit" hx-swap="outerHTML">...</form>
87
-
88
- <!-- Polling -->
89
- <div hx-get="/status" hx-trigger="every 2s">...</div>
90
- ```
91
-
92
- ## Default Routes Provided
93
-
94
- The following routes are automatically available (DO NOT MODIFY):
95
-
96
- - **/auth/*** - OAuth and magic link authentication
97
- - **/health/ping** - Health check endpoint
98
- - **/debug/** - Debug info (only in DEBUG mode)
99
- - **/lang/** - Language selection
100
- - **/user/** - User profile routes
101
- - **/meta/** - Metadata endpoints
102
-
103
- ## Development
104
-
105
- **CRITICAL**: Both processes required:
106
-
107
- ```bash
108
- # Terminal 1: Frontend assets
109
- bun dev
110
-
111
- # Terminal 2: Backend server
112
- just local-dev
113
- ```
@@ -1,113 +0,0 @@
1
- # Core Frontend Module
2
-
3
- **IMMUTABLE SCAFFOLDING CODE** - This is the framework's core frontend infrastructure.
4
-
5
- ## What's Here
6
-
7
- This module contains the scaffolding's core frontend components:
8
-
9
- - **routes/** - Essential default routes (auth, health, debug, language, user, meta)
10
- - **templates.py** - Template rendering with automatic context injection
11
- - **deps.py** - FastAPI dependencies (authentication, language, etc.)
12
- - **middleware.py** - Request/response middleware
13
- - **oauth.py** - OAuth provider integration
14
- - **email.py** - Magic link email authentication
15
- - **lifespan.py** - Application startup/shutdown lifecycle
16
- - **context.py** - Request context management
17
- - **hotreload.py** - Development hot-reload support
18
-
19
- ## Important Rules
20
-
21
- ⚠️ **DO NOT MODIFY** these core frontend components directly.
22
-
23
- **For changes to core frontend:**
24
-
25
- - File an issue at `https://github.com/alltuner/scaffolding`
26
- - Core changes benefit all projects using the scaffolding
27
-
28
- **For your application routes:**
29
-
30
- - Create them in `src/app/frontend/routes/` instead
31
- - Import core components when needed:
32
- - `from vibetuner.frontend.deps import get_current_user`
33
- - `from vibetuner.frontend.templates import render_template`
34
-
35
- ## User Route Pattern (for reference)
36
-
37
- Your application routes in `src/app/frontend/routes/` should follow this pattern:
38
-
39
- ```python
40
- # src/app/frontend/routes/dashboard.py
41
- from fastapi import APIRouter, Request, Depends
42
- from vibetuner.frontend.deps import get_current_user
43
- from vibetuner.frontend.templates import render_template
44
-
45
- router = APIRouter()
46
-
47
- @router.get("/dashboard")
48
- async def dashboard(request: Request, user=Depends(get_current_user)):
49
- return render_template("dashboard.html.jinja", request, {"user": user})
50
- ```
51
-
52
- ## Template Rendering
53
-
54
- ```python
55
- # Automatic context in every template:
56
- {
57
- "request": request,
58
- "DEBUG": settings.DEBUG,
59
- "hotreload": hotreload, # Dev mode
60
- # ... plus your custom context
61
- }
62
- ```
63
-
64
- ### Template Filters
65
-
66
- - `{{ datetime | timeago }}` - "2 hours ago"
67
- - `{{ datetime | format_date }}` - "January 15, 2024"
68
- - `{{ text | markdown }}` - Convert Markdown to HTML
69
-
70
- ## Core Dependencies Available
71
-
72
- Import these from `vibetuner.frontend.deps`:
73
-
74
- - `get_current_user` - Require authenticated user (raises 403 if not authenticated)
75
- - `get_current_user_optional` - Optional auth check (returns None if not authenticated)
76
- - `LangDep` - Current language from cookie/header
77
- - `MagicCookieDep` - Magic link cookie for authentication
78
-
79
- ## HTMX Patterns
80
-
81
- ```html
82
- <!-- Partial updates -->
83
- <button hx-post="/api/action" hx-target="#result">Click</button>
84
-
85
- <!-- Form submission -->
86
- <form hx-post="/submit" hx-swap="outerHTML">...</form>
87
-
88
- <!-- Polling -->
89
- <div hx-get="/status" hx-trigger="every 2s">...</div>
90
- ```
91
-
92
- ## Default Routes Provided
93
-
94
- The following routes are automatically available (DO NOT MODIFY):
95
-
96
- - **/auth/*** - OAuth and magic link authentication
97
- - **/health/ping** - Health check endpoint
98
- - **/debug/** - Debug info (only in DEBUG mode)
99
- - **/lang/** - Language selection
100
- - **/user/** - User profile routes
101
- - **/meta/** - Metadata endpoints
102
-
103
- ## Development
104
-
105
- **CRITICAL**: Both processes required:
106
-
107
- ```bash
108
- # Terminal 1: Frontend assets
109
- bun dev
110
-
111
- # Terminal 2: Backend server
112
- just local-dev
113
- ```
@@ -1,165 +0,0 @@
1
- # Core Models Module
2
-
3
- **IMMUTABLE SCAFFOLDING CODE** - These are the framework's core models that provide essential functionality.
4
-
5
- ## What's Here
6
-
7
- This module contains the scaffolding's core models:
8
-
9
- - **UserModel** - Base user model with authentication support
10
- - **OAuthAccountModel** - OAuth provider account linking
11
- - **EmailVerificationTokenModel** - Magic link authentication tokens
12
- - **BlobModel** - File storage and blob management
13
- - **Mixins** - Reusable model behaviors (TimeStampMixin, etc.)
14
- - **Types** - Common field types and validators
15
-
16
- ## Important Rules
17
-
18
- ⚠️ **DO NOT MODIFY** these core models directly.
19
-
20
- **For changes to core models:**
21
-
22
- - File an issue at `https://github.com/alltuner/scaffolding`
23
- - Core changes benefit all projects using the scaffolding
24
-
25
- **For your application models:**
26
-
27
- - Create them in `src/app/models/` instead
28
- - Import core models when needed: `from vibetuner.models import UserModel`
29
- - Use mixins from here: `from vibetuner.models.mixins import TimeStampMixin`
30
-
31
- ## User Model Pattern (for reference)
32
-
33
- Your application models in `src/app/models/` should follow this pattern:
34
-
35
- ```python
36
- from beanie import Document
37
- from pydantic import Field
38
- from vibetuner.models.mixins import TimeStampMixin
39
-
40
- class Product(Document, TimeStampMixin):
41
- name: str
42
- price: float = Field(gt=0)
43
- stock: int = Field(ge=0)
44
-
45
- class Settings:
46
- name = "products"
47
- indexes = ["name"]
48
- ```
49
-
50
- ## Available Mixins
51
-
52
- ### TimeStampMixin
53
-
54
- Automatic timestamps for all models:
55
-
56
- - `db_insert_dt` - Created at (UTC)
57
- - `db_update_dt` - Updated at (UTC)
58
- - Methods: `age()`, `age_in()`, `is_older_than()`
59
-
60
- Import in your app models:
61
-
62
- ```python
63
- from vibetuner.models.mixins import TimeStampMixin
64
- ```
65
-
66
- ## Queries
67
-
68
- ### Finding Documents
69
-
70
- ```python
71
- from beanie.operators import Eq, In, Gt, Lt
72
-
73
- # By ID (preferred method)
74
- product = await Product.get(product_id)
75
-
76
- # By field (use Beanie operators)
77
- product = await Product.find_one(Eq(Product.name, "Widget"))
78
- products = await Product.find(Lt(Product.price, 100)).to_list()
79
-
80
- # Multiple conditions
81
- results = await Product.find(
82
- Eq(Product.category, "electronics"),
83
- Gt(Product.price, 50)
84
- ).to_list()
85
-
86
- # With In operator
87
- products = await Product.find(
88
- In(Product.category, ["electronics", "gadgets"])
89
- ).to_list()
90
- ```
91
-
92
- ### Save/Delete
93
-
94
- ```python
95
- # Create
96
- product = Product(name="Widget", price=9.99, stock=100)
97
- await product.insert()
98
-
99
- # Update
100
- product.price = 19.99
101
- await product.save()
102
-
103
- # Delete
104
- await product.delete()
105
- ```
106
-
107
- ### Aggregation
108
-
109
- ```python
110
- results = await Product.aggregate([
111
- {"$match": {"price": {"$gt": 50}}},
112
- {"$group": {"_id": "$category", "total": {"$sum": 1}}}
113
- ]).to_list()
114
- ```
115
-
116
- ## Indexes
117
-
118
- ```python
119
- from pymongo import IndexModel, TEXT
120
-
121
- class Settings:
122
- indexes = [
123
- "field_name", # Simple index
124
- [("field1", 1), ("field2", -1)], # Compound index
125
- IndexModel([("text_field", TEXT)]) # Text search
126
- ]
127
- ```
128
-
129
- ## Relationships
130
-
131
- ```python
132
- from beanie import Link
133
-
134
- class Order(Document):
135
- user: Link[User]
136
- products: list[Link[Product]]
137
-
138
- # Fetch with relations
139
- order = await Order.get(order_id, fetch_links=True)
140
- print(order.user.email) # Automatically loaded
141
- ```
142
-
143
- ## Extending Core Models
144
-
145
- If you need to add fields to User or other core models:
146
-
147
- 1. **Option A**: File an issue at `https://github.com/alltuner/scaffolding` for widely useful fields
148
- 2. **Option B**: Create a related model in `src/app/models/` that links to the core model:
149
-
150
- ```python
151
- from beanie import Document, Link
152
- from vibetuner.models import UserModel
153
-
154
- class UserProfile(Document):
155
- user: Link[UserModel]
156
- bio: str
157
- avatar_url: str
158
-
159
- class Settings:
160
- name = "user_profiles"
161
- ```
162
-
163
- ## MongoDB MCP
164
-
165
- Claude Code has MongoDB MCP access for database operations, queries, and debugging.
@@ -1,165 +0,0 @@
1
- # Core Models Module
2
-
3
- **IMMUTABLE SCAFFOLDING CODE** - These are the framework's core models that provide essential functionality.
4
-
5
- ## What's Here
6
-
7
- This module contains the scaffolding's core models:
8
-
9
- - **UserModel** - Base user model with authentication support
10
- - **OAuthAccountModel** - OAuth provider account linking
11
- - **EmailVerificationTokenModel** - Magic link authentication tokens
12
- - **BlobModel** - File storage and blob management
13
- - **Mixins** - Reusable model behaviors (TimeStampMixin, etc.)
14
- - **Types** - Common field types and validators
15
-
16
- ## Important Rules
17
-
18
- ⚠️ **DO NOT MODIFY** these core models directly.
19
-
20
- **For changes to core models:**
21
-
22
- - File an issue at `https://github.com/alltuner/scaffolding`
23
- - Core changes benefit all projects using the scaffolding
24
-
25
- **For your application models:**
26
-
27
- - Create them in `src/app/models/` instead
28
- - Import core models when needed: `from vibetuner.models import UserModel`
29
- - Use mixins from here: `from vibetuner.models.mixins import TimeStampMixin`
30
-
31
- ## User Model Pattern (for reference)
32
-
33
- Your application models in `src/app/models/` should follow this pattern:
34
-
35
- ```python
36
- from beanie import Document
37
- from pydantic import Field
38
- from vibetuner.models.mixins import TimeStampMixin
39
-
40
- class Product(Document, TimeStampMixin):
41
- name: str
42
- price: float = Field(gt=0)
43
- stock: int = Field(ge=0)
44
-
45
- class Settings:
46
- name = "products"
47
- indexes = ["name"]
48
- ```
49
-
50
- ## Available Mixins
51
-
52
- ### TimeStampMixin
53
-
54
- Automatic timestamps for all models:
55
-
56
- - `db_insert_dt` - Created at (UTC)
57
- - `db_update_dt` - Updated at (UTC)
58
- - Methods: `age()`, `age_in()`, `is_older_than()`
59
-
60
- Import in your app models:
61
-
62
- ```python
63
- from vibetuner.models.mixins import TimeStampMixin
64
- ```
65
-
66
- ## Queries
67
-
68
- ### Finding Documents
69
-
70
- ```python
71
- from beanie.operators import Eq, In, Gt, Lt
72
-
73
- # By ID (preferred method)
74
- product = await Product.get(product_id)
75
-
76
- # By field (use Beanie operators)
77
- product = await Product.find_one(Eq(Product.name, "Widget"))
78
- products = await Product.find(Lt(Product.price, 100)).to_list()
79
-
80
- # Multiple conditions
81
- results = await Product.find(
82
- Eq(Product.category, "electronics"),
83
- Gt(Product.price, 50)
84
- ).to_list()
85
-
86
- # With In operator
87
- products = await Product.find(
88
- In(Product.category, ["electronics", "gadgets"])
89
- ).to_list()
90
- ```
91
-
92
- ### Save/Delete
93
-
94
- ```python
95
- # Create
96
- product = Product(name="Widget", price=9.99, stock=100)
97
- await product.insert()
98
-
99
- # Update
100
- product.price = 19.99
101
- await product.save()
102
-
103
- # Delete
104
- await product.delete()
105
- ```
106
-
107
- ### Aggregation
108
-
109
- ```python
110
- results = await Product.aggregate([
111
- {"$match": {"price": {"$gt": 50}}},
112
- {"$group": {"_id": "$category", "total": {"$sum": 1}}}
113
- ]).to_list()
114
- ```
115
-
116
- ## Indexes
117
-
118
- ```python
119
- from pymongo import IndexModel, TEXT
120
-
121
- class Settings:
122
- indexes = [
123
- "field_name", # Simple index
124
- [("field1", 1), ("field2", -1)], # Compound index
125
- IndexModel([("text_field", TEXT)]) # Text search
126
- ]
127
- ```
128
-
129
- ## Relationships
130
-
131
- ```python
132
- from beanie import Link
133
-
134
- class Order(Document):
135
- user: Link[User]
136
- products: list[Link[Product]]
137
-
138
- # Fetch with relations
139
- order = await Order.get(order_id, fetch_links=True)
140
- print(order.user.email) # Automatically loaded
141
- ```
142
-
143
- ## Extending Core Models
144
-
145
- If you need to add fields to User or other core models:
146
-
147
- 1. **Option A**: File an issue at `https://github.com/alltuner/scaffolding` for widely useful fields
148
- 2. **Option B**: Create a related model in `src/app/models/` that links to the core model:
149
-
150
- ```python
151
- from beanie import Document, Link
152
- from vibetuner.models import UserModel
153
-
154
- class UserProfile(Document):
155
- user: Link[UserModel]
156
- bio: str
157
- avatar_url: str
158
-
159
- class Settings:
160
- name = "user_profiles"
161
- ```
162
-
163
- ## MongoDB MCP
164
-
165
- Claude Code has MongoDB MCP access for database operations, queries, and debugging.