skrift 0.1.0a1__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.
Files changed (68) hide show
  1. skrift/__init__.py +1 -0
  2. skrift/__main__.py +17 -0
  3. skrift/admin/__init__.py +11 -0
  4. skrift/admin/controller.py +452 -0
  5. skrift/admin/navigation.py +105 -0
  6. skrift/alembic/env.py +91 -0
  7. skrift/alembic/script.py.mako +26 -0
  8. skrift/alembic/versions/20260120_210154_09b0364dbb7b_initial_schema.py +70 -0
  9. skrift/alembic/versions/20260122_152744_0b7c927d2591_add_roles_and_permissions.py +57 -0
  10. skrift/alembic/versions/20260122_172836_cdf734a5b847_add_sa_orm_sentinel_column.py +31 -0
  11. skrift/alembic/versions/20260122_175637_a9c55348eae7_remove_page_type_column.py +43 -0
  12. skrift/alembic/versions/20260122_200000_add_settings_table.py +38 -0
  13. skrift/alembic.ini +77 -0
  14. skrift/asgi.py +545 -0
  15. skrift/auth/__init__.py +58 -0
  16. skrift/auth/guards.py +130 -0
  17. skrift/auth/roles.py +94 -0
  18. skrift/auth/services.py +184 -0
  19. skrift/cli.py +45 -0
  20. skrift/config.py +192 -0
  21. skrift/controllers/__init__.py +4 -0
  22. skrift/controllers/auth.py +371 -0
  23. skrift/controllers/web.py +67 -0
  24. skrift/db/__init__.py +3 -0
  25. skrift/db/base.py +7 -0
  26. skrift/db/models/__init__.py +6 -0
  27. skrift/db/models/page.py +26 -0
  28. skrift/db/models/role.py +56 -0
  29. skrift/db/models/setting.py +13 -0
  30. skrift/db/models/user.py +36 -0
  31. skrift/db/services/__init__.py +1 -0
  32. skrift/db/services/page_service.py +217 -0
  33. skrift/db/services/setting_service.py +206 -0
  34. skrift/lib/__init__.py +3 -0
  35. skrift/lib/exceptions.py +168 -0
  36. skrift/lib/template.py +108 -0
  37. skrift/setup/__init__.py +14 -0
  38. skrift/setup/config_writer.py +211 -0
  39. skrift/setup/controller.py +751 -0
  40. skrift/setup/middleware.py +89 -0
  41. skrift/setup/providers.py +163 -0
  42. skrift/setup/state.py +134 -0
  43. skrift/static/css/style.css +998 -0
  44. skrift/templates/admin/admin.html +19 -0
  45. skrift/templates/admin/base.html +24 -0
  46. skrift/templates/admin/pages/edit.html +32 -0
  47. skrift/templates/admin/pages/list.html +62 -0
  48. skrift/templates/admin/settings/site.html +32 -0
  49. skrift/templates/admin/users/list.html +58 -0
  50. skrift/templates/admin/users/roles.html +42 -0
  51. skrift/templates/auth/login.html +125 -0
  52. skrift/templates/base.html +52 -0
  53. skrift/templates/error-404.html +19 -0
  54. skrift/templates/error-500.html +19 -0
  55. skrift/templates/error.html +19 -0
  56. skrift/templates/index.html +9 -0
  57. skrift/templates/page.html +26 -0
  58. skrift/templates/setup/admin.html +24 -0
  59. skrift/templates/setup/auth.html +110 -0
  60. skrift/templates/setup/base.html +407 -0
  61. skrift/templates/setup/complete.html +17 -0
  62. skrift/templates/setup/database.html +125 -0
  63. skrift/templates/setup/restart.html +28 -0
  64. skrift/templates/setup/site.html +39 -0
  65. skrift-0.1.0a1.dist-info/METADATA +233 -0
  66. skrift-0.1.0a1.dist-info/RECORD +68 -0
  67. skrift-0.1.0a1.dist-info/WHEEL +4 -0
  68. skrift-0.1.0a1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,39 @@
1
+ {% extends "setup/base.html" %}
2
+
3
+ {% block title %}Site Settings - Skrift{% endblock %}
4
+
5
+ {% block content %}
6
+ <h2>Site Settings</h2>
7
+ <p class="description">Configure your site's basic information.</p>
8
+
9
+ <form method="post" action="/setup/site">
10
+ <div class="form-group">
11
+ <label for="site_name">Site Name *</label>
12
+ <input type="text" id="site_name" name="site_name" value="{{ settings.site_name }}" required>
13
+ <small>The name displayed in the header and browser title</small>
14
+ </div>
15
+
16
+ <div class="form-group">
17
+ <label for="site_tagline">Site Tagline</label>
18
+ <input type="text" id="site_tagline" name="site_tagline" value="{{ settings.site_tagline }}">
19
+ <small>A short description or slogan for your site</small>
20
+ </div>
21
+
22
+ <div class="form-group">
23
+ <label for="site_copyright_holder">Copyright Holder</label>
24
+ <input type="text" id="site_copyright_holder" name="site_copyright_holder" value="{{ settings.site_copyright_holder }}">
25
+ <small>Name displayed in the copyright notice (defaults to site name if empty)</small>
26
+ </div>
27
+
28
+ <div class="form-group">
29
+ <label for="site_copyright_start_year">Copyright Start Year</label>
30
+ <input type="number" id="site_copyright_start_year" name="site_copyright_start_year" value="{{ settings.site_copyright_start_year }}" min="1900" max="2100">
31
+ <small>If different from current year, will show a range (e.g., 2020-2026)</small>
32
+ </div>
33
+
34
+ <div class="form-actions">
35
+ <a href="/setup/auth" class="btn-secondary" role="button">Back</a>
36
+ <button type="submit">Save &amp; Continue</button>
37
+ </div>
38
+ </form>
39
+ {% endblock %}
@@ -0,0 +1,233 @@
1
+ Metadata-Version: 2.4
2
+ Name: skrift
3
+ Version: 0.1.0a1
4
+ Summary: A lightweight async Python CMS for crafting modern websites
5
+ Requires-Python: >=3.13
6
+ Requires-Dist: advanced-alchemy>=0.26.0
7
+ Requires-Dist: aiosqlite>=0.20.0
8
+ Requires-Dist: alembic>=1.14.0
9
+ Requires-Dist: asyncpg>=0.30.0
10
+ Requires-Dist: httpx>=0.28.0
11
+ Requires-Dist: litestar[cryptography,jinja,standard]>=2.14.0
12
+ Requires-Dist: pydantic-settings>=2.7.0
13
+ Requires-Dist: python-dotenv>=1.0.0
14
+ Requires-Dist: pyyaml>=6.0.0
15
+ Requires-Dist: ruamel-yaml>=0.18.0
16
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.36
17
+ Requires-Dist: uvicorn>=0.34.0
18
+ Description-Content-Type: text/markdown
19
+
20
+ # Skrift
21
+
22
+ A modern Litestar-powered content management framework with multi-provider OAuth authentication, role-based access control, and WordPress-like template resolution.
23
+
24
+ ## Features
25
+
26
+ - **Multi-Provider OAuth**: Authenticate with Google, GitHub, Microsoft, Discord, Facebook, or Twitter/X
27
+ - **Role-Based Access Control**: Flexible permission system with Admin, Editor, Author, and Moderator roles
28
+ - **Setup Wizard**: Guided first-time configuration without manual file editing
29
+ - **Admin Interface**: Web-based management for users, pages, and site settings
30
+ - **WordPress-like Templates**: Hierarchical template resolution for content pages
31
+ - **Dynamic Controllers**: Load controllers from `app.yaml` configuration
32
+ - **SQLAlchemy Integration**: Async database support with SQLite/PostgreSQL
33
+ - **Client-Side Sessions**: Encrypted cookie sessions for horizontal scalability
34
+
35
+ ## Quick Start
36
+
37
+ ### Prerequisites
38
+
39
+ - Python 3.13+
40
+
41
+ ### Installation
42
+
43
+ ```bash
44
+ # Install Skrift
45
+ pip install skrift
46
+
47
+ # Or install from git
48
+ pip install git+https://github.com/ZechCodes/skrift.git
49
+ ```
50
+
51
+ ### Getting Started
52
+
53
+ Create a project directory and set up your environment:
54
+
55
+ ```bash
56
+ mkdir mysite && cd mysite
57
+
58
+ # Create minimal environment file
59
+ echo "SECRET_KEY=$(python -c 'import secrets; print(secrets.token_urlsafe(32))')" > .env
60
+
61
+ # Start Skrift
62
+ skrift
63
+ ```
64
+
65
+ Open http://localhost:8080 to launch the setup wizard.
66
+
67
+ ### Setup Wizard
68
+
69
+ The setup wizard guides you through initial configuration:
70
+
71
+ 1. **Database Configuration**: Choose SQLite (dev) or PostgreSQL (production)
72
+ 2. **Authentication Providers**: Configure OAuth credentials
73
+ 3. **Site Settings**: Set site name, tagline, and copyright info
74
+ 4. **Admin Account**: Create your first admin user via OAuth login
75
+
76
+ After completing the wizard, an `app.yaml` configuration file is created in your project directory.
77
+
78
+ ### Manual Configuration
79
+
80
+ Alternatively, create `app.yaml` manually:
81
+
82
+ ```yaml
83
+ controllers:
84
+ - skrift.controllers.auth:AuthController
85
+ - skrift.admin.controller:AdminController
86
+ - skrift.controllers.web:WebController
87
+
88
+ db:
89
+ url: sqlite+aiosqlite:///./app.db
90
+
91
+ auth:
92
+ redirect_base_url: http://localhost:8080
93
+ providers:
94
+ google:
95
+ client_id: $GOOGLE_CLIENT_ID
96
+ client_secret: $GOOGLE_CLIENT_SECRET
97
+ scopes: [openid, email, profile]
98
+ ```
99
+
100
+ Then run migrations and start the server:
101
+
102
+ ```bash
103
+ skrift-db upgrade head
104
+ skrift
105
+ ```
106
+
107
+ ## Documentation
108
+
109
+ - **[Full Documentation](docs/README.md)**: Comprehensive guide covering all features
110
+ - **[Deployment Guide](docs/deployment.md)**: VPS, Docker, and Kubernetes deployment
111
+ - **[CSS Framework](docs/css-framework.md)**: Styling documentation
112
+
113
+ ## Project Structure
114
+
115
+ ```
116
+ skrift/
117
+ ├── skrift/ # Main Python package
118
+ │ ├── asgi.py # Application factory
119
+ │ ├── config.py # Settings management
120
+ │ ├── controllers/ # Route handlers
121
+ │ ├── admin/ # Admin panel
122
+ │ ├── auth/ # RBAC and guards
123
+ │ ├── db/ # Models and services
124
+ │ ├── lib/ # Template resolver
125
+ │ └── setup/ # Setup wizard
126
+ ├── templates/ # Jinja2 templates
127
+ ├── static/ # Static assets
128
+ ├── alembic/ # Database migrations
129
+ ├── docs/ # Documentation
130
+ ├── app.yaml # Application config (generated)
131
+ └── main.py # Development entry point
132
+ ```
133
+
134
+ ## Configuration
135
+
136
+ ### Environment Variables
137
+
138
+ | Variable | Required | Description |
139
+ |----------|----------|-------------|
140
+ | `SECRET_KEY` | Yes | Session encryption key |
141
+ | `DEBUG` | No | Enable debug mode (default: false) |
142
+ | `DATABASE_URL` | No | Database connection string |
143
+ | `OAUTH_REDIRECT_BASE_URL` | No | OAuth callback base URL |
144
+
145
+ OAuth credentials are configured per-provider (e.g., `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`).
146
+
147
+ ### app.yaml
148
+
149
+ Application configuration is stored in `app.yaml` (generated by setup wizard):
150
+
151
+ ```yaml
152
+ controllers:
153
+ - skrift.controllers.auth:AuthController
154
+ - skrift.admin.controller:AdminController
155
+ - skrift.controllers.web:WebController
156
+
157
+ db:
158
+ url: $DATABASE_URL
159
+ pool_size: 5
160
+
161
+ auth:
162
+ redirect_base_url: $OAUTH_REDIRECT_BASE_URL
163
+ providers:
164
+ google:
165
+ client_id: $GOOGLE_CLIENT_ID
166
+ client_secret: $GOOGLE_CLIENT_SECRET
167
+ ```
168
+
169
+ Environment variables (prefixed with `$`) are interpolated at runtime.
170
+
171
+ ## Deployment
172
+
173
+ ### Minimal VPS Deployment
174
+
175
+ ```bash
176
+ # Install Skrift
177
+ pip install skrift
178
+
179
+ # Create project directory
180
+ mkdir -p /opt/skrift && cd /opt/skrift
181
+
182
+ # Configure environment
183
+ cat > .env << EOF
184
+ SECRET_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(32))")
185
+ DATABASE_URL=sqlite+aiosqlite:///./app.db
186
+ OAUTH_REDIRECT_BASE_URL=https://yourdomain.com
187
+ EOF
188
+
189
+ # Start server (use setup wizard or create app.yaml manually)
190
+ skrift
191
+ ```
192
+
193
+ ### Production with Gunicorn
194
+
195
+ ```bash
196
+ pip install gunicorn
197
+ gunicorn skrift.asgi:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8080
198
+ ```
199
+
200
+ See the [Deployment Guide](docs/deployment.md) for detailed instructions including Docker, Docker Compose, and Kubernetes deployments.
201
+
202
+ ## Database Migrations
203
+
204
+ ```bash
205
+ # Apply migrations
206
+ skrift-db upgrade head
207
+
208
+ # Create new migration
209
+ skrift-db revision --autogenerate -m "description"
210
+
211
+ # Rollback
212
+ skrift-db downgrade -1
213
+ ```
214
+
215
+ ## Template Resolution
216
+
217
+ Templates follow WordPress-like hierarchical resolution:
218
+
219
+ | URL Path | Templates Tried |
220
+ |----------|-----------------|
221
+ | `/about` | `page-about.html` -> `page.html` |
222
+ | `/services/web` | `page-services-web.html` -> `page-services.html` -> `page.html` |
223
+
224
+ ## Contributing
225
+
226
+ 1. Fork the repository
227
+ 2. Create a feature branch
228
+ 3. Make your changes
229
+ 4. Submit a pull request
230
+
231
+ ## License
232
+
233
+ MIT
@@ -0,0 +1,68 @@
1
+ skrift/__init__.py,sha256=eXE5PFVkJpH5XsV_ZlrTIeFPUPrmcHYAj4GpRS3R5PY,29
2
+ skrift/__main__.py,sha256=Fs17xxkqTjZpJn9MMC6pzkW4sOzNhV5RGLsA2ONPFww,271
3
+ skrift/alembic.ini,sha256=aq1sNDUgKvdON-N28lN9fncRcYtg430HE2DsuEMIDtk,1782
4
+ skrift/asgi.py,sha256=62fWbHMwAqUBveboWK-bwmplREvXXBlBna8-0kAcKOI,18836
5
+ skrift/cli.py,sha256=rrm0cSc2LhQ1FA5-ucDN1sDTwFwKnDk1DCYf746SYyo,1522
6
+ skrift/config.py,sha256=fwB8oGKFmSkGEHqjM5Z9dJvcztjx8WSUqyCkvQXfIBo,5640
7
+ skrift/admin/__init__.py,sha256=x81Cj_ilVmv6slaMl16HHyT_AgrnLxKEWkS0RPa4V9s,289
8
+ skrift/admin/controller.py,sha256=5ZDypvKHXLNDESsKNsdsH2E3Si5OqlpzttFl7Ot8aF0,15651
9
+ skrift/admin/navigation.py,sha256=VwttFoIUIJy5rONKIkJd5w4CNkUpeK22_OfLGHecN34,3382
10
+ skrift/alembic/env.py,sha256=vYy8dBm7zW8F5izsQdVgQyJ6yGmRbqUfGoWgefD49vQ,2609
11
+ skrift/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
12
+ skrift/alembic/versions/20260120_210154_09b0364dbb7b_initial_schema.py,sha256=X6w1vbVKFurhEcblTLGO4Nd_IKkMVtb8TsptV4gpAJ4,2750
13
+ skrift/alembic/versions/20260122_152744_0b7c927d2591_add_roles_and_permissions.py,sha256=yCGjnMTpfSMHVYQCsPTD6wdDI8pJSUtGRESO6bz0KfU,2672
14
+ skrift/alembic/versions/20260122_172836_cdf734a5b847_add_sa_orm_sentinel_column.py,sha256=96TCvvQbYk3RGpZdEQ0x4bIDXxBLc3Gv7VTItTq9T54,850
15
+ skrift/alembic/versions/20260122_175637_a9c55348eae7_remove_page_type_column.py,sha256=XJ55LhwzgN07MAREk6w4Bx2Vu3KvMe_bDkIjgE6EfqM,1223
16
+ skrift/alembic/versions/20260122_200000_add_settings_table.py,sha256=aG4pxp18fwonGAWt7EoT0XaiIEmu7zltSrj8e2a8QZU,1310
17
+ skrift/auth/__init__.py,sha256=uHMqty3dgDSYlReVT96WhygzH6qNAWSVDWoxumzxmsA,1155
18
+ skrift/auth/guards.py,sha256=QePajHsGnJ4R_hlhzblr5IoAgZcY5jzeZ64bJwDL9hM,4451
19
+ skrift/auth/roles.py,sha256=jpqK4qaavqAhJRxhptm2x5mUb6KkwEALaml8sEH4Sug,2267
20
+ skrift/auth/services.py,sha256=h6GTXdN5UMRYglnaFz4asMoutVkSSAyL3_Vt56N26pA,5441
21
+ skrift/controllers/__init__.py,sha256=bVr0tsSGz7jBi002Lqd1AA1FQd7ZA_IagsqTKpiHiK0,147
22
+ skrift/controllers/auth.py,sha256=fqn-E2YCiMKJU1lh2fzUwVdx9cHfrFiBIi-cdBkjwN0,13282
23
+ skrift/controllers/web.py,sha256=vmoBS1u5G9gCBu65S49yqZn_WBKlmsqlcvX5tYXTKnE,2348
24
+ skrift/db/__init__.py,sha256=uSghyDFT2K4SFiEqUzdjCGzWpS-Oy6Sd1FUappau-v0,52
25
+ skrift/db/base.py,sha256=QJplFj9235kZdScASEpvyNHln6YW2hqbHwJEYZ3OSsc,173
26
+ skrift/db/models/__init__.py,sha256=8ivPDjVMDZPvl06ZWBjp4YmSfC4qhbq76PDJ8MWqzv4,269
27
+ skrift/db/models/page.py,sha256=CI5W2sWq0zbKHxfwH5TpmGdJ4zlTicckzpdZtaqjJVE,1019
28
+ skrift/db/models/role.py,sha256=VkwkF3XWemmFtkUpQRk6RTIBfcukrU-0PUPCeo8x834,1768
29
+ skrift/db/models/setting.py,sha256=Am4HTyq2LFR408R6BZb--slys1xM8YLYq9HTq_gybD0,392
30
+ skrift/db/models/user.py,sha256=zqZ-sYcYa0StFsSGsPcovy7EpswFo_PtrObBJ8TyHiA,1310
31
+ skrift/db/services/__init__.py,sha256=qAC24IPOYg6AampUWonmLeajljQRMwUw0lgXksQG6Nk,69
32
+ skrift/db/services/page_service.py,sha256=cXJ-urV7LjUDoVsT1P52f6wcOsur3T-pvqKkGG4xlvI,5246
33
+ skrift/db/services/setting_service.py,sha256=eqFxukn8QFrDHQbaBILOLjP1nr34JPIPFT_NnhmeaTY,5613
34
+ skrift/lib/__init__.py,sha256=PL66bS4_-90zJDMsQSnzqkkxwkO_3aLcYl9l9cDrE2Y,65
35
+ skrift/lib/exceptions.py,sha256=p8ceLIQCc7agCwW6-mhBDAuMAMxZDcf9TDLC6PfztU4,5803
36
+ skrift/lib/template.py,sha256=4_urkRfvth75yNeQ5TyGTHvkvs3vVef7TcwZx0k285k,4226
37
+ skrift/setup/__init__.py,sha256=3VjFPMES5y0M5cQ9R4C1xazqiEPEDqTPjX9-3rBMXnA,478
38
+ skrift/setup/config_writer.py,sha256=FkAfS4xa_R0tmgdp2Ac-0QlVXte2xUo1TWpxWBGBkUA,6260
39
+ skrift/setup/controller.py,sha256=HZs6Q2lNdvNh-JakmznMVL-1sj_6wD9axr3ESL1iIaA,29202
40
+ skrift/setup/middleware.py,sha256=Nai8ZG2vHldngmAhq7kWzAwKRNcP5tHKhJHa5dCh404,2941
41
+ skrift/setup/providers.py,sha256=XQQ7q_4axkTkspHyN66wn-zVaCzGZCf4BClEhNbEnWU,6171
42
+ skrift/setup/state.py,sha256=JRFh6ZSbznLtTwyPBATR75heHdG4uuk8JcCFHawTrPI,3711
43
+ skrift/static/css/style.css,sha256=4874DhxJD9oD81PjvJGwiQwdVjUDKWAZ2V8Gq62Igew,20755
44
+ skrift/templates/base.html,sha256=4bg4s4VdES0dSvhJYLgrfrN26ynqeq1-3jyKPkWWVWk,2065
45
+ skrift/templates/error-404.html,sha256=sJrDaF3Or3Nyki8mxo3wBxLLzgy4wkB9p9wdS8pRA6k,409
46
+ skrift/templates/error-500.html,sha256=MR0wJ1JKLqdmdvsoJbQnZxLkxDPE59LrlbtVPKLM8-A,401
47
+ skrift/templates/error.html,sha256=tg45Hj0wNc9QiZKBVVQ2WsqDiAkByXZnuehTdJPclXc,415
48
+ skrift/templates/index.html,sha256=lzZlnoZ2luY__OtRVa61mpQIgcopAbkKa2rS9XRfRlI,172
49
+ skrift/templates/page.html,sha256=kY1j7TH6dFnvWnYwBEGCIEvardjLhnFMnM3NbAnKszQ,759
50
+ skrift/templates/admin/admin.html,sha256=8sErpGKedl7Hf_CMeu53bUEHptH1FqdBX9LT3z-1HcU,454
51
+ skrift/templates/admin/base.html,sha256=JX1MPw9XTY8jCT2M6iHUwEj8NPNOdZPca2cDUEs9kfQ,659
52
+ skrift/templates/admin/pages/edit.html,sha256=s-uZ4BYG7BdnWYTBSS1mr5aFL8XfT8h-KNiSIraWmHw,1322
53
+ skrift/templates/admin/pages/list.html,sha256=LYh1vEwSHkyXihjcy5PIo33iA7UeIxprw4Gsn1WZMm4,2185
54
+ skrift/templates/admin/settings/site.html,sha256=xHZCZGj9XqyLKCe2eoBlpI3oFIx5VoG_5FP-VAF2mz4,1516
55
+ skrift/templates/admin/users/list.html,sha256=9GWql1la5Srm-OOgooHR9Eouk7ZL66K_FXY6HAAB5lA,1732
56
+ skrift/templates/admin/users/roles.html,sha256=pos-ZM-gXYCN_D8DZpzwEBEm_WvmOKMMPz-3xJqs7nY,1473
57
+ skrift/templates/auth/login.html,sha256=hafLcmmRgiLhFjTDzGvEla31JoKl6dfw7sLdzQyzGmA,6195
58
+ skrift/templates/setup/admin.html,sha256=BSIztZT2iqxVSW23Tfg7ZM51SdGrKL422CR05DPjNic,804
59
+ skrift/templates/setup/auth.html,sha256=0DVL0kU6DlJ2pWe4zwc3DsIVfBAdqpMJxPYvS4zm4OM,4953
60
+ skrift/templates/setup/base.html,sha256=LTXqbnHMvx1wDsxFvo4BSieBPD9pcLMj6NM4ZGzErFM,10372
61
+ skrift/templates/setup/complete.html,sha256=oyT-rYPl0uuyOjPXgNeLr8YoptW9QjHTlScZSViDvTk,630
62
+ skrift/templates/setup/database.html,sha256=gU4-315-QraHa2Eq4Fh3b55QpOM2CkJzh27_Yz13frA,5495
63
+ skrift/templates/setup/restart.html,sha256=GHg31F_e2uLFhWUzJoalk0Y0oYLqsFWyZXWKX3mblbY,1355
64
+ skrift/templates/setup/site.html,sha256=PSOH-q1-ZBl47iSW9-Ad6lEfJn_fzdGD3Pk4vb3xgK4,1680
65
+ skrift-0.1.0a1.dist-info/METADATA,sha256=lrfb40qZ-KZ5o5U7j1A9ablJG4cbqXexdcOTkMMuD54,6365
66
+ skrift-0.1.0a1.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
67
+ skrift-0.1.0a1.dist-info/entry_points.txt,sha256=4AIrmbeWKOdZnvTsKT3US6N3X9rrgk9jEDsYOPEZ1AE,74
68
+ skrift-0.1.0a1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.28.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ skrift = skrift.__main__:main
3
+ skrift-db = skrift.cli:db