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.
- vibetuner/config.py +20 -9
- vibetuner/context.py +3 -0
- vibetuner/frontend/lifespan.py +12 -7
- vibetuner/frontend/middleware.py +2 -2
- vibetuner/frontend/routes/debug.py +1 -1
- vibetuner/frontend/routes/user.py +1 -1
- vibetuner/mongo.py +3 -3
- vibetuner/tasks/worker.py +1 -1
- vibetuner/templates/email/{default/magic_link.html.jinja → magic_link.html.jinja} +2 -1
- vibetuner/templates/frontend/base/favicons.html.jinja +1 -1
- vibetuner/templates/frontend/base/skeleton.html.jinja +5 -2
- vibetuner/templates/frontend/debug/collections.html.jinja +2 -0
- vibetuner/templates/frontend/debug/components/debug_nav.html.jinja +6 -6
- vibetuner/templates/frontend/debug/index.html.jinja +6 -4
- vibetuner/templates/frontend/debug/info.html.jinja +2 -0
- vibetuner/templates/frontend/debug/users.html.jinja +4 -2
- vibetuner/templates/frontend/debug/version.html.jinja +2 -0
- vibetuner/templates/frontend/email_sent.html.jinja +2 -1
- vibetuner/templates/frontend/index.html.jinja +1 -0
- vibetuner/templates/frontend/login.html.jinja +8 -3
- vibetuner/templates/frontend/user/edit.html.jinja +3 -2
- vibetuner/templates/frontend/user/profile.html.jinja +2 -1
- {vibetuner-2.14.1.dist-info → vibetuner-2.18.1.dist-info}/METADATA +20 -17
- {vibetuner-2.14.1.dist-info → vibetuner-2.18.1.dist-info}/RECORD +27 -41
- {vibetuner-2.14.1.dist-info → vibetuner-2.18.1.dist-info}/WHEEL +1 -1
- vibetuner/frontend/AGENTS.md +0 -113
- vibetuner/frontend/CLAUDE.md +0 -113
- vibetuner/models/AGENTS.md +0 -165
- vibetuner/models/CLAUDE.md +0 -165
- vibetuner/services/AGENTS.md +0 -104
- vibetuner/services/CLAUDE.md +0 -104
- vibetuner/tasks/AGENTS.md +0 -98
- vibetuner/tasks/CLAUDE.md +0 -98
- vibetuner/templates/email/AGENTS.md +0 -48
- vibetuner/templates/email/CLAUDE.md +0 -48
- vibetuner/templates/frontend/AGENTS.md +0 -74
- vibetuner/templates/frontend/CLAUDE.md +0 -74
- vibetuner/templates/markdown/AGENTS.md +0 -29
- vibetuner/templates/markdown/CLAUDE.md +0 -29
- /vibetuner/templates/email/{default/magic_link.txt.jinja → magic_link.txt.jinja} +0 -0
- {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=
|
|
7
|
-
vibetuner/context.py,sha256=
|
|
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=
|
|
16
|
-
vibetuner/frontend/middleware.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
49
|
-
vibetuner/templates/email/
|
|
50
|
-
vibetuner/templates/email/
|
|
51
|
-
vibetuner/templates/
|
|
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=
|
|
60
|
-
vibetuner/templates/frontend/debug/collections.html.jinja,sha256=
|
|
61
|
-
vibetuner/templates/frontend/debug/components/debug_nav.html.jinja,sha256=
|
|
62
|
-
vibetuner/templates/frontend/debug/index.html.jinja,sha256=
|
|
63
|
-
vibetuner/templates/frontend/debug/info.html.jinja,sha256=
|
|
64
|
-
vibetuner/templates/frontend/debug/users.html.jinja,sha256=
|
|
65
|
-
vibetuner/templates/frontend/debug/version.html.jinja,sha256=
|
|
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=
|
|
68
|
-
vibetuner/templates/frontend/index.html.jinja,sha256=
|
|
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=
|
|
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=
|
|
76
|
-
vibetuner/templates/frontend/user/profile.html.jinja,sha256=
|
|
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.
|
|
84
|
-
vibetuner-2.
|
|
85
|
-
vibetuner-2.
|
|
86
|
-
vibetuner-2.
|
|
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,,
|
vibetuner/frontend/AGENTS.md
DELETED
|
@@ -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
|
-
```
|
vibetuner/frontend/CLAUDE.md
DELETED
|
@@ -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
|
-
```
|
vibetuner/models/AGENTS.md
DELETED
|
@@ -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.
|
vibetuner/models/CLAUDE.md
DELETED
|
@@ -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.
|