skeleton-framework 0.1.0__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.
Files changed (98) hide show
  1. skeleton_framework-0.1.0/LICENSE +146 -0
  2. skeleton_framework-0.1.0/PKG-INFO +440 -0
  3. skeleton_framework-0.1.0/README.md +426 -0
  4. skeleton_framework-0.1.0/pyproject.toml +34 -0
  5. skeleton_framework-0.1.0/setup.cfg +4 -0
  6. skeleton_framework-0.1.0/skeleton/__init__.py +0 -0
  7. skeleton_framework-0.1.0/skeleton/cli.py +151 -0
  8. skeleton_framework-0.1.0/skeleton/client.py +269 -0
  9. skeleton_framework-0.1.0/skeleton/infrastructure/__init__.py +1 -0
  10. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/__init__.py +0 -0
  11. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/__init__.py +0 -0
  12. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/__init__.py +0 -0
  13. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/client/__init__.py +0 -0
  14. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/client/init.py +486 -0
  15. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/client/install.py +113 -0
  16. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/dev/__init__.py +0 -0
  17. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/dev/build.py +80 -0
  18. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/dev/init.py +80 -0
  19. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/dev/install.py +168 -0
  20. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/commands/dev/pack.py +55 -0
  21. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/config.py +54 -0
  22. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/copy.py +56 -0
  23. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/load.py +221 -0
  24. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/backend/requirements.txt +1 -0
  25. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/backend/routes.json +10 -0
  26. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/backend/src/__init__.py +0 -0
  27. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/backend/src/main.py +35 -0
  28. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/package.json +21 -0
  29. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/skeleton-config.json +29 -0
  30. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/index.html +16 -0
  31. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/main.tsx +15 -0
  32. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/css/styles.css +28 -0
  33. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/img/skeleton.png +0 -0
  34. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/js/script.js +1 -0
  35. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/app/frontend/tsconfig.json +90 -0
  36. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/config/.gitignore +21 -0
  37. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/config/skeleton-dependencies.json +21 -0
  38. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/config/skeleton-layout.json +11 -0
  39. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/config/skeleton-schemas.json +20 -0
  40. skeleton_framework-0.1.0/skeleton/infrastructure/bootstrap/src/templates/config/skeleton-servers.json +16 -0
  41. skeleton_framework-0.1.0/skeleton/infrastructure/common/__init__.py +1 -0
  42. skeleton_framework-0.1.0/skeleton/infrastructure/common/config.json +8 -0
  43. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/__init__.py +0 -0
  44. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/config.py +37 -0
  45. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/constants.py +4 -0
  46. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/context.py +15 -0
  47. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/env.py +12 -0
  48. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/layout.py +68 -0
  49. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/loader.py +8 -0
  50. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/repository.py +12 -0
  51. skeleton_framework-0.1.0/skeleton/infrastructure/common/src/utils.py +26 -0
  52. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/__init__.py +0 -0
  53. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/settings/proxy.json +24 -0
  54. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/settings/services.json +10 -0
  55. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/__init__.py +0 -0
  56. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/app.py +98 -0
  57. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/client.py +68 -0
  58. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/config.py +29 -0
  59. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/context.py +31 -0
  60. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/headers.py +17 -0
  61. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/lifespan.py +17 -0
  62. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/loader.py +113 -0
  63. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/logging.py +37 -0
  64. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/main.py +139 -0
  65. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/parser.py +59 -0
  66. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/registry.py +30 -0
  67. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/reverseproxy.py +54 -0
  68. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/router.py +74 -0
  69. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/schemas.py +21 -0
  70. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/service.py +123 -0
  71. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/utils.py +48 -0
  72. skeleton_framework-0.1.0/skeleton/infrastructure/gateway/src/validation.py +89 -0
  73. skeleton_framework-0.1.0/skeleton/infrastructure/layout.json +12 -0
  74. skeleton_framework-0.1.0/skeleton/infrastructure/runners/__init__.py +0 -0
  75. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/__init__.py +0 -0
  76. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/actions.py +4 -0
  77. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/browser.py +18 -0
  78. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/cmd.py +7 -0
  79. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/command.py +7 -0
  80. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/frontend.py +35 -0
  81. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/gateway.py +104 -0
  82. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/hook.py +53 -0
  83. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/main.py +78 -0
  84. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/packages.py +35 -0
  85. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/parser.py +84 -0
  86. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/process.py +99 -0
  87. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/services.py +16 -0
  88. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/utils.py +6 -0
  89. skeleton_framework-0.1.0/skeleton/infrastructure/runners/src/validation.py +28 -0
  90. skeleton_framework-0.1.0/skeleton/packages/.skeleton/skeleton-cli-1.0.0.tgz +0 -0
  91. skeleton_framework-0.1.0/skeleton/packages/.skeleton/skeleton-webpack-1.0.0.tgz +0 -0
  92. skeleton_framework-0.1.0/skeleton/root.py +234 -0
  93. skeleton_framework-0.1.0/skeleton_framework.egg-info/PKG-INFO +440 -0
  94. skeleton_framework-0.1.0/skeleton_framework.egg-info/SOURCES.txt +96 -0
  95. skeleton_framework-0.1.0/skeleton_framework.egg-info/dependency_links.txt +1 -0
  96. skeleton_framework-0.1.0/skeleton_framework.egg-info/entry_points.txt +2 -0
  97. skeleton_framework-0.1.0/skeleton_framework.egg-info/requires.txt +4 -0
  98. skeleton_framework-0.1.0/skeleton_framework.egg-info/top_level.txt +1 -0
@@ -0,0 +1,146 @@
1
+ # Skeleton Framework Proprietary Licence
2
+
3
+ **Copyright © 2026 lambdadotjoburg. All rights reserved.**
4
+
5
+ This licence applies to Skeleton Framework, including its original source code,
6
+ framework components, documentation, templates, configuration files,
7
+ and associated materials owned by the copyright holder (collectively, the "Software").
8
+
9
+ By accessing, downloading, installing, or using the Software, you acknowledge the terms of this licence.
10
+
11
+ ## 1. Ownership and Copyright
12
+
13
+ The Software is proprietary software. All copyright and other intellectual property rights
14
+ in the Software remain with the copyright holder, except for third-party materials governed
15
+ by their respective licences.
16
+
17
+ No ownership rights are transferred to any user by this licence.
18
+ All rights not expressly granted are reserved by the copyright holder.
19
+
20
+ ## 2. Permitted Personal and Educational Use
21
+
22
+ Subject to the terms of this licence, the copyright holder grants individuals a limited,
23
+ non-exclusive, non-transferable, revocable licence to access and use the Software solely
24
+ for personal learning, educational activities, experimentation, and non-commercial evaluation.
25
+
26
+ This permission includes running the Software and making modifications reasonably necessary
27
+ for the permitted non-commercial purposes, provided that the Software or modifications are
28
+ not used for commercial purposes or redistributed without written permission.
29
+
30
+ This permission does not grant any right to commercially deploy, sell, sublicense,
31
+ distribute, or provide the Software as part of a commercial product or service.
32
+
33
+ ## 3. Commercial Use Requires a Paid Licence
34
+
35
+ Commercial use is not permitted under the free personal and educational licence.
36
+
37
+ Any commercial use requires a separate written commercial licence issued by
38
+ the copyright holder and payment of the applicable licence fees, as specified in that agreement.
39
+
40
+ Commercial use includes, without limitation:
41
+
42
+ - Using the Software in a business, commercial product, or revenue-generating service.
43
+ - Deploying the Software for a commercial organisation or its customers.
44
+ - Incorporating the Software into a product or service offered for sale or commercial advantage.
45
+ - Providing access to the Software or a framework-based service as part of a paid offering.
46
+
47
+ The copyright holder may offer different commercial licence terms, fees,
48
+ usage limits, and support arrangements under separate written agreements.
49
+
50
+ ## 4. Modification
51
+
52
+ Modification is permitted only within the scope of an applicable licence.
53
+
54
+ Users operating under the free personal and educational licence may modify
55
+ the Software solely for the permitted non-commercial purposes described in Section 2.
56
+
57
+ Commercial modifications, modifications outside the permitted scope,
58
+ and any other use not expressly authorised by this licence require
59
+ separate written permission or an applicable commercial licence.
60
+
61
+ Modifications do not transfer ownership of the original Software to
62
+ the person making them. Ownership and licensing of independently created
63
+ modifications will be determined by applicable law and any separate written agreement.
64
+
65
+ ## 5. Redistribution and Sublicensing
66
+
67
+ Redistribution of the Software, in source-code or compiled form, requires the copyright holder's prior written permission.
68
+
69
+ Without that permission, you may not:
70
+
71
+ - Republish or distribute copies of the Software.
72
+ - Bundle or redistribute the Software with another product or package.
73
+ - Mirror or host copies of the Software for third-party distribution.
74
+ - Sublicense, sell, rent, lease, or otherwise transfer rights to the Software.
75
+ - Distribute modified versions of the Software.
76
+
77
+ Access to a public repository or package registry does not, by itself, grant permission to redistribute the Software.
78
+
79
+ ## 6. Contributions
80
+
81
+ No contribution transfers copyright ownership to the copyright holder merely because it is submitted.
82
+
83
+ Contributions intended for inclusion in the Software must be accompanied by a separate written agreement,
84
+ or other expressly accepted contribution terms, establishing the rights necessary for the copyright holder
85
+ to use, modify, distribute, and license the contribution as intended.
86
+
87
+ Contributors remain responsible for ensuring they have the rights necessary to submit their contributions.
88
+
89
+ ## 7. Third-Party Components
90
+
91
+ The Software may include or depend on third-party software, packages, libraries, or other materials.
92
+
93
+ Such components remain subject to their own applicable licences.
94
+ This licence does not override third-party licence obligations
95
+ or grant rights that the copyright holder does not possess.
96
+
97
+ Users are responsible for complying with applicable third-party licence terms.
98
+
99
+ ## 8. Restrictions
100
+
101
+ Except as expressly authorised by this licence or applicable law,
102
+ you may not use the Software outside the scope of the permissions granted,
103
+ remove or misrepresent copyright notices, or claim ownership of the original Software.
104
+
105
+ Nothing in this licence excludes rights that cannot lawfully be excluded or restricted under applicable law.
106
+
107
+ ## 9. Termination
108
+
109
+ Permission under this licence terminates automatically if you materially breach its terms.
110
+ Upon termination, you must cease the use that is no longer authorised and comply with applicable legal obligations.
111
+
112
+ Termination does not extinguish rights or obligations that have accrued before termination or provisions that by their nature continue to apply.
113
+
114
+ ## 10. Disclaimer of Warranty
115
+
116
+ To the maximum extent permitted by applicable law, the Software is provided "AS IS"
117
+ and without warranties of any kind, whether express or implied, including warranties
118
+ of merchantability, fitness for a particular purpose, and non-infringement.
119
+
120
+ The copyright holder does not guarantee that the Software will be error-free, secure, uninterrupted, or suitable for any particular purpose.
121
+
122
+ ## 11. Limitation of Liability
123
+
124
+ To the maximum extent permitted by applicable law, the copyright holder
125
+ will not be liable for indirect, incidental, special, consequential,
126
+ or exemplary damages arising from the use of, or inability to use, the Software.
127
+
128
+ Nothing in this section excludes or limits liability that cannot lawfully be excluded or limited.
129
+
130
+ ## 12. Commercial Licensing and Contact
131
+
132
+ For commercial licensing, written permissions, redistribution requests, or contribution agreements, contact:
133
+
134
+ **Copyright holder:** lambdadotjoburg
135
+ **Email:** lambdadotjoburg@gmail.com
136
+
137
+ No commercial licence or redistribution permission is granted unless expressly agreed in writing by the copyright holder.
138
+
139
+ ## 13. Governing Law
140
+
141
+ The governing law and jurisdiction for this licence should be specified
142
+ in a separate written agreement or, where applicable, determined under applicable law.
143
+
144
+ ---
145
+
146
+ **All rights reserved.**
@@ -0,0 +1,440 @@
1
+ Metadata-Version: 2.4
2
+ Name: skeleton-framework
3
+ Version: 0.1.0
4
+ Summary: A full-stack app framework: Python orchestration + FastAPI + WebPack frontend.
5
+ License-Expression: LicenseRef-Proprietary
6
+ Requires-Python: >=3.11
7
+ Description-Content-Type: text/markdown
8
+ License-File: LICENSE
9
+ Requires-Dist: uvicorn
10
+ Requires-Dist: fastapi
11
+ Requires-Dist: httpx
12
+ Requires-Dist: watchfiles
13
+ Dynamic: license-file
14
+
15
+ # Skeleton Framework
16
+
17
+ <img width="200px" src ="./skeleton.png"/>
18
+
19
+ Skeleton is a full-stack application framework that combines Python orchestration, a FastAPI reverse-proxy gateway, a Python backend, and a TypeScript frontend.
20
+
21
+ It provides a structured development workflow for configuring, initializing, installing, running, and building full-stack applications.
22
+
23
+ ## Features
24
+
25
+ - **Python orchestration** for application setup and service execution.
26
+ - **FastAPI gateway** for centralized request routing and communication with backend services.
27
+ - **Python backend** for application APIs.
28
+ - **TypeScript frontend** with React and Webpack tooling.
29
+ - **Configurable project structure** through JSON configuration files.
30
+ - **Separate environments** for framework development and client application dependencies.
31
+ - **Command-line tooling** for initialization, development, building, and cleanup.
32
+
33
+ ## Architecture
34
+
35
+ Skeleton separates the application into cooperating layers:
36
+
37
+ | Layer | Technology |
38
+ |---|---|
39
+ | Orchestration and CLI | Python |
40
+ | Gateway and backend APIs | FastAPI |
41
+ | HTTP server | Uvicorn |
42
+ | HTTP communication | HTTPX |
43
+ | Frontend | TypeScript and React |
44
+ | Frontend bundling | Webpack |
45
+ | Development file watching | watchfiles |
46
+ | Dependency management | pip and npm |
47
+
48
+ The gateway provides a central entry point for browser requests and coordinates communication between the frontend and backend.
49
+
50
+ ## Requirements
51
+
52
+ Before getting started, install:
53
+
54
+ - Python 3.11 or later.
55
+ - Node.js and npm.
56
+ - pip, included with standard Python installations.
57
+
58
+ ## Installation
59
+
60
+ Install Skeleton from PyPI:
61
+
62
+ ```bash
63
+ python -m pip install skeleton-framework
64
+ ```
65
+
66
+ The installed Python distribution provides the `skeleton` command.
67
+
68
+ ## Quickstart
69
+
70
+ Create or enter an empty directory for your application:
71
+
72
+ ```bash
73
+ mkdir my-app
74
+ cd my-app
75
+ ```
76
+
77
+ Configure the project, initialize its files, and install its dependencies:
78
+
79
+ ```bash
80
+ skeleton --quickstart
81
+ ```
82
+
83
+ This combines the configuration, initialization, and installation stages.
84
+
85
+ To run the application:
86
+
87
+ ```bash
88
+ skeleton --start
89
+ ```
90
+
91
+ Follow the terminal output for service startup information and open the application at the configured local address.
92
+
93
+ ## Client project workflow
94
+
95
+ Skeleton also exposes the individual stages when you want to configure the application before installing dependencies.
96
+
97
+ ### 1. Generate configuration
98
+
99
+ ```bash
100
+ skeleton --config
101
+ ```
102
+
103
+ This generates the project's configuration files:
104
+
105
+ - `skeleton-layout.json` — defines the application layout.
106
+ - `skeleton-dependencies.json` — declares frontend and backend dependencies.
107
+ - `skeleton-schemas.json` — provides schema configuration.
108
+ - `skeleton-servers.json` — defines server configuration.
109
+ - `.gitignore` — establishes ignore rules for generated files.
110
+
111
+ Review and customize these files before initialization if necessary.
112
+
113
+ ### 2. Initialize the project
114
+
115
+ ```bash
116
+ skeleton --init
117
+ ```
118
+
119
+ Initialization creates the configured frontend and backend structure from the framework's templates, prepares dependency manifests, and configures the local frontend tooling packages.
120
+
121
+ ### 3. Install dependencies
122
+
123
+ ```bash
124
+ skeleton --install
125
+ ```
126
+
127
+ This installs frontend dependencies using npm and backend Python dependencies into the backend's `.venv` environment.
128
+
129
+ ### 4. Start services
130
+
131
+ ```bash
132
+ skeleton --start
133
+ ```
134
+
135
+ You can also explicitly select services:
136
+
137
+ ```bash
138
+ skeleton --start frontend gateway packages --open
139
+ ```
140
+
141
+ The selected services and runtime options determine which processes are started.
142
+
143
+ ## Frontend commands
144
+
145
+ Run these commands from the client project root:
146
+
147
+ | Command | Purpose |
148
+ |---|---|
149
+ | `skeleton --serve` | Start the frontend development server. |
150
+ | `skeleton --build` | Build the frontend for distribution. |
151
+ | `skeleton --preview` | Run the configured frontend preview script. |
152
+ | `skeleton --clean` | Remove generated frontend build artifacts. |
153
+ | `skeleton --purge` | Remove frontend build artifacts and disposable development dependencies. |
154
+
155
+ These commands invoke the corresponding scripts defined in the configured frontend directory's `package.json`.
156
+
157
+ ## Default development ports
158
+
159
+ The default development configuration uses the following ports:
160
+
161
+ | Service | Address |
162
+ |---|---|
163
+ | Gateway / reverse proxy | `http://127.0.0.1:8000` |
164
+ | Backend API | `http://127.0.0.1:8080` |
165
+ | Frontend development server | `http://127.0.0.1:3000` |
166
+
167
+ The gateway is the normal entry point for browser access.
168
+
169
+ For example, the test API endpoint can be accessed through:
170
+
171
+ ```text
172
+ http://127.0.0.1:8000/api/test
173
+ ```
174
+
175
+ The corresponding backend endpoint may be available directly at:
176
+
177
+ ```text
178
+ http://127.0.0.1:8080/test
179
+ ```
180
+
181
+ Actual routes depend on the application's server and gateway configuration.
182
+
183
+ ## Project structure
184
+
185
+ A generated client project follows the configured layout. A typical structure is:
186
+
187
+ ```text
188
+ my-app/
189
+ ├── skeleton-layout.json
190
+ ├── skeleton-dependencies.json
191
+ ├── skeleton-schemas.json
192
+ ├── skeleton-servers.json
193
+ ├── frontend/
194
+ ├── backend/
195
+ └── .skeleton/
196
+ ```
197
+
198
+ The frontend contains the TypeScript application and its npm tooling. The backend contains the Python application and its own virtual environment. The `.skeleton/` directory holds local framework tooling and generated assets.
199
+
200
+ The exact structure depends on the project's configuration.
201
+
202
+ ## Cleanup
203
+
204
+ Run `skeleton --clean` to remove generated frontend build outputs.
205
+
206
+ Run `skeleton --purge` when you want to remove the generated build outputs and disposable frontend development dependencies.
207
+
208
+ **Warning:** Purging is destructive. It may remove `node_modules`, lockfiles, and generated local tooling artifacts. Dependencies may need to be installed again.
209
+
210
+ ## Troubleshooting
211
+
212
+ ### The command is not found
213
+
214
+ Confirm that Skeleton is installed in the Python environment whose scripts directory is available on your terminal's `PATH`.
215
+
216
+ ```bash
217
+ python -m pip show skeleton-framework
218
+ ```
219
+
220
+ ### Frontend or backend dependencies are missing
221
+
222
+ From the client project root, run:
223
+
224
+ ```bash
225
+ skeleton --install
226
+ ```
227
+
228
+ If the project has not yet been initialized, run `skeleton --init` first.
229
+
230
+ ### Application startup fails
231
+
232
+ Check that:
233
+
234
+ - The project has been configured and initialized.
235
+ - Dependencies have been installed.
236
+ - The selected services are included in the startup command.
237
+ - The required ports are available.
238
+ - The server configuration matches the configured project layout.
239
+
240
+ ### Framework tooling packages are missing
241
+
242
+ If working directly from the framework source repository, run the framework's packaging command before initializing a client project:
243
+
244
+ ```bash
245
+ python run.py --pack
246
+ ```
247
+
248
+ ## Framework development
249
+
250
+ These commands are intended for contributors working in the Skeleton framework source repository, not ordinary client projects.
251
+
252
+ Initialize the framework development environment:
253
+
254
+ ```bash
255
+ python run.py --bootstrap
256
+ ```
257
+
258
+ Prepare the framework's distributable tooling packages:
259
+
260
+ ```bash
261
+ python run.py --pack
262
+ ```
263
+
264
+ Build the Python distribution:
265
+
266
+ ```bash
267
+ python run.py --build
268
+ ```
269
+
270
+ Additional development and cleanup commands are available:
271
+
272
+ ```bash
273
+ python run.py --init
274
+ python run.py --install
275
+ python run.py --clean
276
+ python run.py --purge
277
+ ```
278
+
279
+ The framework's Python development environment and root `requirements.txt` are separate from the environments created for client applications.
280
+
281
+ ## Project status
282
+
283
+ Skeleton is an experimental framework under active development. Its goal is to provide a clear, reproducible foundation for full-stack application development while keeping configuration, orchestration, frontend tooling, and backend services independently manageable.
284
+
285
+ ## Framework development
286
+
287
+ These commands are intended for contributors working in the Skeleton framework source repository, not ordinary client projects.
288
+
289
+ ### Initialize the framework development environment
290
+
291
+ ```bash
292
+ python run.py --bootstrap
293
+ ```
294
+
295
+ This combines `--init` and `--install` to initialize and install the framework's development environment.
296
+
297
+ ### Build the framework distribution
298
+
299
+ ```bash
300
+ python run.py --dist
301
+ ```
302
+
303
+ This combines `--pack` and `--build`. It prepares the distributable tooling packages and builds the Python distribution in `dist/`.
304
+
305
+ ### Cleanup
306
+
307
+ ```bash
308
+ python run.py --clean
309
+ python run.py --purge
310
+ ```
311
+
312
+ The framework's Python development environment and root `requirements.txt` are preserved by framework cleanup.
313
+
314
+ ## Framework Developer: Testing a Local Installation
315
+
316
+ Use this workflow to test the locally built `skeleton-framework` distribution in a separate client project. This verifies that the installed package works independently of the framework source repository.
317
+
318
+ ### 1. Build the distribution
319
+
320
+ From the framework repository root:
321
+
322
+ ```bash
323
+ python run.py --dist
324
+ ```
325
+
326
+ The generated wheel will be located in the framework's `dist/` directory.
327
+
328
+ ### 2. Create a separate test project
329
+
330
+ From the framework repository root, create a sibling directory outside the framework source tree:
331
+
332
+ ```bash
333
+ mkdir -p ../skeleton-test-project
334
+ cd ../skeleton-test-project
335
+ ```
336
+
337
+ ### 3. Create and activate the test environment
338
+
339
+ ```bash
340
+ python -m venv .venv
341
+ source .venv/Scripts/activate
342
+ ```
343
+
344
+ On macOS or Linux, use:
345
+
346
+ ```bash
347
+ source .venv/bin/activate
348
+ ```
349
+
350
+ ### 4. Install the locally built wheel
351
+
352
+ From the test project directory:
353
+
354
+ ```bash
355
+ python -m pip install --force-reinstall ../framework/dist/skeleton_framework-0.1.0-py3-none-any.whl
356
+ ```
357
+
358
+ Adjust the relative path, wheel filename, and version to match your framework checkout and build output.
359
+
360
+ The `--force-reinstall` option reinstalls the wheel even if that version is already present. `--no-deps` prevents pip from reinstalling the package's dependencies; use this option when those dependencies are already available in the environment. Otherwise, omit `--no-deps`.
361
+
362
+ ### 5. Verify the installation
363
+
364
+ ```bash
365
+ python -m pip show skeleton-framework
366
+ python -m pip show -f skeleton-framework
367
+ ```
368
+
369
+ The first command displays the installed distribution's metadata. The second lists its installed files.
370
+
371
+ ### 6. Test the installed CLI
372
+
373
+ From the test project root, run the complete client setup:
374
+
375
+ ```bash
376
+ skeleton --quickstart
377
+ ```
378
+
379
+ Then start the application:
380
+
381
+ ```bash
382
+ skeleton --start
383
+ ```
384
+
385
+ Alternatively, test the individual setup stages:
386
+
387
+ ```bash
388
+ skeleton --config
389
+ skeleton --init
390
+ skeleton --install
391
+ skeleton --start
392
+ ```
393
+
394
+ You can also test the remaining client commands:
395
+
396
+ ```bash
397
+ skeleton --serve
398
+ skeleton --build
399
+ skeleton --preview
400
+ skeleton --clean
401
+ skeleton --purge
402
+ ```
403
+
404
+ ### 7. Test framework changes
405
+
406
+ Whenever you modify the framework, rebuild the distribution from the framework repository:
407
+
408
+ ```bash
409
+ python run.py --dist
410
+ ```
411
+
412
+ Then reinstall the newly built wheel in the test project's virtual environment using the installation command above.
413
+
414
+ This workflow lets you test packaging, bundled tooling, configuration files, templates,
415
+ and CLI behavior without running the client project directly from the framework source tree.
416
+
417
+ **Important:**
418
+ The framework development environment and the test project's `.venv` are independent.
419
+ Install the locally built wheel into the test environment, and run the client commands
420
+ from the test project directory.
421
+
422
+ ## Licence
423
+
424
+ Skeleton Framework is proprietary software. Copyright © 2026 lambdadotjoburg. All rights reserved.
425
+
426
+ The source code is publicly available for inspection, but public availability
427
+ does not grant unrestricted rights to use, modify, or redistribute the framework.
428
+
429
+ Personal learning, educational activities, and non-commercial experimentation are permitted
430
+ under the terms of the root [LICENSE](./LICENSE) file.
431
+
432
+ Commercial use requires a separate paid licence from the copyright holder.
433
+ Redistribution requires prior written permission.
434
+
435
+ Third-party dependencies remain subject to their respective licences.
436
+
437
+ For commercial licensing, redistribution requests, or other permissions,
438
+ contact [lambdadotjoburg@gmail.com](mailto:lambdadotjoburg@gmail.com).
439
+
440
+ See the [LICENSE](./LICENSE) file for the complete terms.