skeleton-framework 0.1.0__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.
- skeleton/__init__.py +0 -0
- skeleton/cli.py +151 -0
- skeleton/client.py +269 -0
- skeleton/infrastructure/__init__.py +1 -0
- skeleton/infrastructure/bootstrap/__init__.py +0 -0
- skeleton/infrastructure/bootstrap/src/__init__.py +0 -0
- skeleton/infrastructure/bootstrap/src/commands/__init__.py +0 -0
- skeleton/infrastructure/bootstrap/src/commands/client/__init__.py +0 -0
- skeleton/infrastructure/bootstrap/src/commands/client/init.py +486 -0
- skeleton/infrastructure/bootstrap/src/commands/client/install.py +113 -0
- skeleton/infrastructure/bootstrap/src/commands/dev/__init__.py +0 -0
- skeleton/infrastructure/bootstrap/src/commands/dev/build.py +80 -0
- skeleton/infrastructure/bootstrap/src/commands/dev/init.py +80 -0
- skeleton/infrastructure/bootstrap/src/commands/dev/install.py +168 -0
- skeleton/infrastructure/bootstrap/src/commands/dev/pack.py +55 -0
- skeleton/infrastructure/bootstrap/src/config.py +54 -0
- skeleton/infrastructure/bootstrap/src/copy.py +56 -0
- skeleton/infrastructure/bootstrap/src/load.py +221 -0
- skeleton/infrastructure/bootstrap/src/templates/app/backend/requirements.txt +1 -0
- skeleton/infrastructure/bootstrap/src/templates/app/backend/routes.json +10 -0
- skeleton/infrastructure/bootstrap/src/templates/app/backend/src/__init__.py +0 -0
- skeleton/infrastructure/bootstrap/src/templates/app/backend/src/main.py +35 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/package.json +21 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/skeleton-config.json +29 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/index.html +16 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/main.tsx +15 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/css/styles.css +28 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/img/skeleton.png +0 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/js/script.js +1 -0
- skeleton/infrastructure/bootstrap/src/templates/app/frontend/tsconfig.json +90 -0
- skeleton/infrastructure/bootstrap/src/templates/config/.gitignore +21 -0
- skeleton/infrastructure/bootstrap/src/templates/config/skeleton-dependencies.json +21 -0
- skeleton/infrastructure/bootstrap/src/templates/config/skeleton-layout.json +11 -0
- skeleton/infrastructure/bootstrap/src/templates/config/skeleton-schemas.json +20 -0
- skeleton/infrastructure/bootstrap/src/templates/config/skeleton-servers.json +16 -0
- skeleton/infrastructure/common/__init__.py +1 -0
- skeleton/infrastructure/common/config.json +8 -0
- skeleton/infrastructure/common/src/__init__.py +0 -0
- skeleton/infrastructure/common/src/config.py +37 -0
- skeleton/infrastructure/common/src/constants.py +4 -0
- skeleton/infrastructure/common/src/context.py +15 -0
- skeleton/infrastructure/common/src/env.py +12 -0
- skeleton/infrastructure/common/src/layout.py +68 -0
- skeleton/infrastructure/common/src/loader.py +8 -0
- skeleton/infrastructure/common/src/repository.py +12 -0
- skeleton/infrastructure/common/src/utils.py +26 -0
- skeleton/infrastructure/gateway/__init__.py +0 -0
- skeleton/infrastructure/gateway/settings/proxy.json +24 -0
- skeleton/infrastructure/gateway/settings/services.json +10 -0
- skeleton/infrastructure/gateway/src/__init__.py +0 -0
- skeleton/infrastructure/gateway/src/app.py +98 -0
- skeleton/infrastructure/gateway/src/client.py +68 -0
- skeleton/infrastructure/gateway/src/config.py +29 -0
- skeleton/infrastructure/gateway/src/context.py +31 -0
- skeleton/infrastructure/gateway/src/headers.py +17 -0
- skeleton/infrastructure/gateway/src/lifespan.py +17 -0
- skeleton/infrastructure/gateway/src/loader.py +113 -0
- skeleton/infrastructure/gateway/src/logging.py +37 -0
- skeleton/infrastructure/gateway/src/main.py +139 -0
- skeleton/infrastructure/gateway/src/parser.py +59 -0
- skeleton/infrastructure/gateway/src/registry.py +30 -0
- skeleton/infrastructure/gateway/src/reverseproxy.py +54 -0
- skeleton/infrastructure/gateway/src/router.py +74 -0
- skeleton/infrastructure/gateway/src/schemas.py +21 -0
- skeleton/infrastructure/gateway/src/service.py +123 -0
- skeleton/infrastructure/gateway/src/utils.py +48 -0
- skeleton/infrastructure/gateway/src/validation.py +89 -0
- skeleton/infrastructure/layout.json +12 -0
- skeleton/infrastructure/runners/__init__.py +0 -0
- skeleton/infrastructure/runners/src/__init__.py +0 -0
- skeleton/infrastructure/runners/src/actions.py +4 -0
- skeleton/infrastructure/runners/src/browser.py +18 -0
- skeleton/infrastructure/runners/src/cmd.py +7 -0
- skeleton/infrastructure/runners/src/command.py +7 -0
- skeleton/infrastructure/runners/src/frontend.py +35 -0
- skeleton/infrastructure/runners/src/gateway.py +104 -0
- skeleton/infrastructure/runners/src/hook.py +53 -0
- skeleton/infrastructure/runners/src/main.py +78 -0
- skeleton/infrastructure/runners/src/packages.py +35 -0
- skeleton/infrastructure/runners/src/parser.py +84 -0
- skeleton/infrastructure/runners/src/process.py +99 -0
- skeleton/infrastructure/runners/src/services.py +16 -0
- skeleton/infrastructure/runners/src/utils.py +6 -0
- skeleton/infrastructure/runners/src/validation.py +28 -0
- skeleton/packages/.skeleton/skeleton-cli-1.0.0.tgz +0 -0
- skeleton/packages/.skeleton/skeleton-webpack-1.0.0.tgz +0 -0
- skeleton/root.py +234 -0
- skeleton_framework-0.1.0.dist-info/METADATA +440 -0
- skeleton_framework-0.1.0.dist-info/RECORD +93 -0
- skeleton_framework-0.1.0.dist-info/WHEEL +5 -0
- skeleton_framework-0.1.0.dist-info/entry_points.txt +2 -0
- skeleton_framework-0.1.0.dist-info/licenses/LICENSE +146 -0
- skeleton_framework-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -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.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
skeleton/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
skeleton/cli.py,sha256=LU7nE5ssQzxYJim8_D7TBbVfNQVxRmv19HTGw21a34o,3836
|
|
3
|
+
skeleton/client.py,sha256=jWJ1a628OqYiHUDfCud9tldY-Wg4RboDRPDl7zDAnv8,6793
|
|
4
|
+
skeleton/root.py,sha256=8_aAEaWtYSamRMYflo9ZLjcrwO7m5aSA0uO9cxgBE3Q,5751
|
|
5
|
+
skeleton/infrastructure/__init__.py,sha256=KltEOVi157Y3ygDZfTU1_JnrL16jfsAOHn3x7SdcOgI,52
|
|
6
|
+
skeleton/infrastructure/layout.json,sha256=f5VGBp2AMPV5x9j_N-p-CbNKfYmHt9wotpVJ1MmPlwQ,300
|
|
7
|
+
skeleton/infrastructure/bootstrap/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
skeleton/infrastructure/bootstrap/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
+
skeleton/infrastructure/bootstrap/src/config.py,sha256=i5fICvF7DYjicSkYc7rVOOvv3DCnI1kHOGv79djBsi4,1094
|
|
10
|
+
skeleton/infrastructure/bootstrap/src/copy.py,sha256=6gbt6vPfWgahAOkBLpjz40iH_1nuUf5HDgOEKJkLaWE,1227
|
|
11
|
+
skeleton/infrastructure/bootstrap/src/load.py,sha256=6E4nVuf_wEinvPBWhShZjjr4hjcJiqSJ8iM18XTjj-s,6095
|
|
12
|
+
skeleton/infrastructure/bootstrap/src/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
+
skeleton/infrastructure/bootstrap/src/commands/client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
skeleton/infrastructure/bootstrap/src/commands/client/init.py,sha256=mKZ04KKmYfpulQDJtI5rA2Z8J2UUKg8f3yTBAhlpAQk,13416
|
|
15
|
+
skeleton/infrastructure/bootstrap/src/commands/client/install.py,sha256=2YvYu7oKdMKyTUSfedS1CvVVs_WfLP2u6KadjWxnAeI,2893
|
|
16
|
+
skeleton/infrastructure/bootstrap/src/commands/dev/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
skeleton/infrastructure/bootstrap/src/commands/dev/build.py,sha256=76nhdorZtlXUIPVO89THOi3knOUdcNPTYnwO-Z2xfvA,2157
|
|
18
|
+
skeleton/infrastructure/bootstrap/src/commands/dev/init.py,sha256=qvCUUhMBCdmIZtglra3t4li_8Ghs5rZOu_JPuHhnrwk,2049
|
|
19
|
+
skeleton/infrastructure/bootstrap/src/commands/dev/install.py,sha256=p1gZagECUAb4kVHJyqEMTUmHJa0i6WPBuz2BBdb7q-0,4125
|
|
20
|
+
skeleton/infrastructure/bootstrap/src/commands/dev/pack.py,sha256=OTlUaul-4lJnrCIf5JkOjnpjvk5oB9uzmcNb0kjWjTQ,1376
|
|
21
|
+
skeleton/infrastructure/bootstrap/src/templates/app/backend/requirements.txt,sha256=b233Yr8BnRREw1U4p_kAhEAdEfSV5AOKc6FRkI0dbVU,21
|
|
22
|
+
skeleton/infrastructure/bootstrap/src/templates/app/backend/routes.json,sha256=o_4IjEviqX_jRpB3bJQDuXPDzzSNq3S_9agQ_A1eX28,198
|
|
23
|
+
skeleton/infrastructure/bootstrap/src/templates/app/backend/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
|
+
skeleton/infrastructure/bootstrap/src/templates/app/backend/src/main.py,sha256=8lnvh-x1ksFB4TB5xaoY_UFPvHCVFDlN2eS-Vv3RG5s,947
|
|
25
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/package.json,sha256=02-jgPIWQFpYXKCoNbcTPdEMUTz9ByvYRvviUnjzZJA,623
|
|
26
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/skeleton-config.json,sha256=GIe3u0XjBqb-0k8av0ykkBF6TjSvztHovVOXhRn1_qs,586
|
|
27
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/tsconfig.json,sha256=Y_QwGoIBlFfISEfAj3TrMTW5l7yOdrvM3-GKwddaJ8U,2611
|
|
28
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/index.html,sha256=bbhlsix3soLFm5vrh-GNU_CiqjjpGjXq_QSYppo4EWo,348
|
|
29
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/main.tsx,sha256=SgUpKXfLOs9B7DyqGRlh3N4Cm14K3g-rCJE9LsjtMl0,318
|
|
30
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/css/styles.css,sha256=hCW-KPwztaYTcNwrsx3tr0xmTEmCQq9sme7y6PJc8qU,373
|
|
31
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/img/skeleton.png,sha256=yKKjSDqj_FV-YL492NnnfuBukraww9VEFfsNckPKw2U,80501
|
|
32
|
+
skeleton/infrastructure/bootstrap/src/templates/app/frontend/src/static/js/script.js,sha256=o0BlwEasGXt4VddoQhrtHmbJX8L4GlsZ9-ymzNvKgPU,34
|
|
33
|
+
skeleton/infrastructure/bootstrap/src/templates/config/.gitignore,sha256=VpQljPHKZQk92c3EANerwZL2DFYCS58QjFf6GwTE09U,230
|
|
34
|
+
skeleton/infrastructure/bootstrap/src/templates/config/skeleton-dependencies.json,sha256=PHmnRbkmCZo5CIp78kudvJ_mdYsu3X4qqT_zJHQoMA0,511
|
|
35
|
+
skeleton/infrastructure/bootstrap/src/templates/config/skeleton-layout.json,sha256=-bnhMs8l0QPjE0eH8lXQtCRx-6Mhcw2mJ6ivzmtSRgI,169
|
|
36
|
+
skeleton/infrastructure/bootstrap/src/templates/config/skeleton-schemas.json,sha256=4S1Xitcp6QGG2S2UfdpPoSeiPoi0nCy2ACn4hClsMEQ,408
|
|
37
|
+
skeleton/infrastructure/bootstrap/src/templates/config/skeleton-servers.json,sha256=hQ3GGHhy2JDtRlwf7oCeSEMj-qwGVtiYG9sy73tHZaQ,311
|
|
38
|
+
skeleton/infrastructure/common/__init__.py,sha256=shZKw4MkjKu2UCoQtqly7RkI0e_3iVDDoohDNUaBDu8,44
|
|
39
|
+
skeleton/infrastructure/common/config.json,sha256=60-C4K6iGkUGj-EXUqAgGwDga5McNCnDxKq4YJpTvBE,269
|
|
40
|
+
skeleton/infrastructure/common/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
|
+
skeleton/infrastructure/common/src/config.py,sha256=6XAsgNkLT81Xu8ijl5fQheRuJGHLdDnM21gmNl9wq9o,985
|
|
42
|
+
skeleton/infrastructure/common/src/constants.py,sha256=pW-ansbaoCXVi0wmhwtsWvcyw0Mn7OzfVRUdyZ0b6yQ,165
|
|
43
|
+
skeleton/infrastructure/common/src/context.py,sha256=hWX4pWhVzFTm7AdfHq68KKGNbbW85FnehjUwayJENZ8,442
|
|
44
|
+
skeleton/infrastructure/common/src/env.py,sha256=h2xuN1gMjGugktlUSzJK8vxcRarBceDOIt2Q-06Lcew,281
|
|
45
|
+
skeleton/infrastructure/common/src/layout.py,sha256=flCvJk6kdePiYG3UpVOvJrjKMjPIi9NNJik-5KcoxaQ,1861
|
|
46
|
+
skeleton/infrastructure/common/src/loader.py,sha256=XpfblWMMvmOLpXD7OXRqGnxl0H8K284p40D0KQilCgI,206
|
|
47
|
+
skeleton/infrastructure/common/src/repository.py,sha256=7h1r0h-hB-7DukEE6CfX-asZWLLFuTm8m4sl4j1-_w0,392
|
|
48
|
+
skeleton/infrastructure/common/src/utils.py,sha256=vryE93jk3a_4areACcRCQkityhXNsyfapiIVzdH-Rek,743
|
|
49
|
+
skeleton/infrastructure/gateway/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
|
+
skeleton/infrastructure/gateway/settings/proxy.json,sha256=1Y1mS6WAo33cORkmYb1K-jTamPiQVf3Cu2UeCPNmJxY,532
|
|
51
|
+
skeleton/infrastructure/gateway/settings/services.json,sha256=QaMZyYpZ-71kcFk39FqQSUF3j2VZsLr1ZqCoX8OFrlU,186
|
|
52
|
+
skeleton/infrastructure/gateway/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
skeleton/infrastructure/gateway/src/app.py,sha256=49TuqO1_witHG2bra1iuAkalfBzb_fGqkuvU7NoR9fU,3010
|
|
54
|
+
skeleton/infrastructure/gateway/src/client.py,sha256=TXiWdEI9vvXtLOt60VDkOLYIDBTOsR7guvV7M3lLuRs,2060
|
|
55
|
+
skeleton/infrastructure/gateway/src/config.py,sha256=MVoSF7bqhlQRFtMZKWyHMOS3kBFHdt1dIQjrQDR8RAc,670
|
|
56
|
+
skeleton/infrastructure/gateway/src/context.py,sha256=11DS2xT3HIJt7sSta9yp5njSMPgGZniDtpY_lVTLHsw,707
|
|
57
|
+
skeleton/infrastructure/gateway/src/headers.py,sha256=u-fqIyMTSrtyvg5Av2ZKYj1whDpr015OdnyzIKlOeCU,339
|
|
58
|
+
skeleton/infrastructure/gateway/src/lifespan.py,sha256=5JPE4Tq4eLjkB9yeV-gVeBoL3a1mj7rUXKiXE7eqFLY,489
|
|
59
|
+
skeleton/infrastructure/gateway/src/loader.py,sha256=VSY4dwMViwS059F9OAJOxLqnLpSygrWGQ-t_zNOTLao,2988
|
|
60
|
+
skeleton/infrastructure/gateway/src/logging.py,sha256=2p1m11QMnMTY1TiYXzOrg7jrwtkMjP2zQPNhUpft7xg,755
|
|
61
|
+
skeleton/infrastructure/gateway/src/main.py,sha256=qb81pnMSwau6B96I3qaJoxjodTJ-Z6wYqqpBqVunsPk,4113
|
|
62
|
+
skeleton/infrastructure/gateway/src/parser.py,sha256=D7iLUZaTBlQTtlD_xj_M1hdozmhz6aUqVbFfLYl5MtY,1368
|
|
63
|
+
skeleton/infrastructure/gateway/src/registry.py,sha256=1OnbBh6M4ZZnx0ERhryIaSeWzNS-8yMzufQOv-c8EhY,807
|
|
64
|
+
skeleton/infrastructure/gateway/src/reverseproxy.py,sha256=7kQiuVWJSXhI_4Qti5tBV7aF62MkNxRcj95-1CstxbU,1557
|
|
65
|
+
skeleton/infrastructure/gateway/src/router.py,sha256=yZv_xNBtbZBewN84F7jEHygVDGDCsFE2AI2YCREoi64,2399
|
|
66
|
+
skeleton/infrastructure/gateway/src/schemas.py,sha256=-CIgLsHjlF6z2_osM6jUvH6dc4LYzQ8Xq27izeBE6wQ,541
|
|
67
|
+
skeleton/infrastructure/gateway/src/service.py,sha256=IcfgifPBO-dLZv3tkY7MCVriRybiJxvzEs4zp_3Ngew,3843
|
|
68
|
+
skeleton/infrastructure/gateway/src/utils.py,sha256=luM8bqHf0V0h2zfvPzH3emo8guWTPbPWfoibj-knJEE,1335
|
|
69
|
+
skeleton/infrastructure/gateway/src/validation.py,sha256=jck-NHstEqii1TYr1hg3Hgpu69UdnHrAA6kg8l5114o,2096
|
|
70
|
+
skeleton/infrastructure/runners/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
|
+
skeleton/infrastructure/runners/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
72
|
+
skeleton/infrastructure/runners/src/actions.py,sha256=Ri_WY8OMqNVZYjTkPKuTbL0WQoeJ78Ej5s6PzDgI-30,64
|
|
73
|
+
skeleton/infrastructure/runners/src/browser.py,sha256=inYDUCb8N1EiKy2FceZJVDbXGh2bxkdtjH9y4YtW2sw,434
|
|
74
|
+
skeleton/infrastructure/runners/src/cmd.py,sha256=vKEfw4ZpR84Y8OyHF4B9F8QN3fwfN_zeEoAN6RG3Rtw,163
|
|
75
|
+
skeleton/infrastructure/runners/src/command.py,sha256=c9Z-sC17RQT_9UOFmSTBFE9oLwCI5WtPy3y1hWE-nqk,166
|
|
76
|
+
skeleton/infrastructure/runners/src/frontend.py,sha256=tuVvSkwaEjB2fu7dQnSMYDSQ3aORFl2P8KQpymyOZ9Q,843
|
|
77
|
+
skeleton/infrastructure/runners/src/gateway.py,sha256=pwv9YLq_7xhEJYErqmlf2RIKzQnJ3iz6JMJHBQMwJ-s,2745
|
|
78
|
+
skeleton/infrastructure/runners/src/hook.py,sha256=jpWmCEkLxOAcWk1M2gnYsugQku871YrnDli-jUsADY4,1523
|
|
79
|
+
skeleton/infrastructure/runners/src/main.py,sha256=qupGXN42VBpqJmPbGjHmXzzR9lrq2Doy39XyoCeGwnU,2109
|
|
80
|
+
skeleton/infrastructure/runners/src/packages.py,sha256=CJI6qhJe856VdN1srB0Vw2jCP75VBHkyIdMqX0T986c,807
|
|
81
|
+
skeleton/infrastructure/runners/src/parser.py,sha256=57SshPvBSoCMnX4LBCeh4m2o9zmIaauysL5VR1TZ08k,1932
|
|
82
|
+
skeleton/infrastructure/runners/src/process.py,sha256=8KkRdJKFUUBZ8mSlnEen4BtTRCWKHARfgP33HHUpbfs,2843
|
|
83
|
+
skeleton/infrastructure/runners/src/services.py,sha256=CZI4Kz888Ur0fHcZF-Rx9EKRhHfZtd_Qg1hDguywOt8,331
|
|
84
|
+
skeleton/infrastructure/runners/src/utils.py,sha256=SqOxvtKYt8MsTPHE9fxR_CxjCgL4SXBtrTHmLep_qmI,148
|
|
85
|
+
skeleton/infrastructure/runners/src/validation.py,sha256=qcEfiE7V3QTWMI9NTCC-q7WvRtugaNzWJ0BVmS2WVD8,818
|
|
86
|
+
skeleton/packages/.skeleton/skeleton-cli-1.0.0.tgz,sha256=qHXeRyleNN8REz6jp9rNVVVYrSe_7CJ6ifxYX_H4nZg,4093
|
|
87
|
+
skeleton/packages/.skeleton/skeleton-webpack-1.0.0.tgz,sha256=qHYI1pvU-kgoiF8OZrAnYaUpLNhuiIezVhD9STob9Fo,5158
|
|
88
|
+
skeleton_framework-0.1.0.dist-info/licenses/LICENSE,sha256=d4pZaAGu-YxzhpwVl5jQeQb4bKiGIBqSopbANTbUKx4,6876
|
|
89
|
+
skeleton_framework-0.1.0.dist-info/METADATA,sha256=m7hmUEq2o5JGcqRueUzfrvpL5CljVc2GK18PBYNvxQU,12801
|
|
90
|
+
skeleton_framework-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
91
|
+
skeleton_framework-0.1.0.dist-info/entry_points.txt,sha256=NChiQqrPEDdkMfxzTpaFOAfgmKGAIj5o3Egh0HwLpP0,47
|
|
92
|
+
skeleton_framework-0.1.0.dist-info/top_level.txt,sha256=2ls-hT2yeKVYh-Xr9njYfuk65NUGhAkJmf93Uf5G_dM,9
|
|
93
|
+
skeleton_framework-0.1.0.dist-info/RECORD,,
|