quickscale-cli 0.72.0__tar.gz → 0.74.2__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.
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/PKG-INFO +169 -17
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/README.md +160 -8
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/pyproject.toml +12 -7
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/_version.py +1 -1
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/apply_command.py +86 -16
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/deployment_commands.py +3 -5
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/development_commands.py +10 -3
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/module_commands.py +2 -2
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/module_config.py +302 -9
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/plan_command.py +15 -15
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/remove_command.py +9 -7
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/config_schema.py +4 -3
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/project_manager.py +12 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/railway_utils.py +4 -21
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/__init__.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/__init__.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/status_command.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/main.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/__init__.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/delta.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/state_schema.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/__init__.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/dependency_utils.py +0 -0
- {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/docker_utils.py +0 -0
|
@@ -1,30 +1,38 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: quickscale-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.74.2
|
|
4
4
|
Summary: Command-line interface for QuickScale Django project generator
|
|
5
|
-
Home-page: https://github.com/Experto-AI/quickscale
|
|
6
5
|
License: Apache-2.0
|
|
7
6
|
Keywords: django,cli,project-generator,saas
|
|
8
7
|
Author: Experto AI
|
|
9
8
|
Author-email: victor@experto.ai
|
|
10
|
-
Requires-Python: >=3.
|
|
9
|
+
Requires-Python: >=3.12,<4.0
|
|
11
10
|
Classifier: Development Status :: 3 - Alpha
|
|
12
11
|
Classifier: Framework :: Django
|
|
13
|
-
Classifier: Framework :: Django ::
|
|
12
|
+
Classifier: Framework :: Django :: 6.0
|
|
14
13
|
Classifier: Intended Audience :: Developers
|
|
15
14
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
16
15
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
18
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
19
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Requires-Dist: click (>=8.3.1,<9.0.0)
|
|
20
|
+
Requires-Dist: quickscale-core (>=0.74.2,<0.75.0)
|
|
22
21
|
Project-URL: Documentation, https://github.com/Experto-AI/quickscale/tree/main/docs
|
|
22
|
+
Project-URL: Homepage, https://github.com/Experto-AI/quickscale
|
|
23
23
|
Project-URL: Repository, https://github.com/Experto-AI/quickscale
|
|
24
24
|
Description-Content-Type: text/markdown
|
|
25
25
|
|
|
26
26
|
# 🚀 QuickScale
|
|
27
27
|
|
|
28
|
+
[](https://pypi.org/project/quickscale/)
|
|
29
|
+
[](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
|
|
30
|
+
[](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
|
|
31
|
+
[](https://www.python.org/downloads/)
|
|
32
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
33
|
+
[](https://github.com/Experto-AI/quickscale/releases)
|
|
34
|
+
[](https://github.com/astral-sh/ruff)
|
|
35
|
+
|
|
28
36
|
> **You are here**: **QuickScale README** (Project Overview)
|
|
29
37
|
> **Related docs**: [Start Here](START_HERE.md) | [Glossary](GLOSSARY.md) | [Decisions](docs/technical/decisions.md) | [User Manual](docs/technical/user_manual.md)
|
|
30
38
|
|
|
@@ -93,10 +101,11 @@ See [decisions.md - Glossary section](./docs/technical/decisions.md#document-res
|
|
|
93
101
|
|
|
94
102
|
### Development Flow
|
|
95
103
|
1. `quickscale plan myapp` → Interactive configuration wizard
|
|
96
|
-
2. `
|
|
97
|
-
3.
|
|
98
|
-
4.
|
|
99
|
-
5.
|
|
104
|
+
2. `cd myapp` → Navigate to your project directory
|
|
105
|
+
3. `quickscale apply` → Generates production-ready Django project
|
|
106
|
+
4. Add your custom Django apps and features
|
|
107
|
+
5. Build your unique client application
|
|
108
|
+
6. Deploy to Railway with `quickscale deploy railway` (or use standard Django deployment)
|
|
100
109
|
|
|
101
110
|
ℹ️ The [MVP Feature Matrix](./docs/technical/decisions.md#mvp-feature-matrix-authoritative) is the single source of truth for what's in or out.
|
|
102
111
|
|
|
@@ -104,6 +113,7 @@ See [decisions.md - Glossary section](./docs/technical/decisions.md#document-res
|
|
|
104
113
|
|
|
105
114
|
Running `quickscale plan myapp && quickscale apply` generates a **production-ready Django project** with:
|
|
106
115
|
|
|
116
|
+
- ✅ **React + shadcn/ui** frontend (TypeScript, Vite, Tailwind CSS) — **NEW in v0.74.0**
|
|
107
117
|
- ✅ **Docker** setup (development + production)
|
|
108
118
|
- ✅ **PostgreSQL** configuration
|
|
109
119
|
- ✅ **Environment-based** settings (dev/prod split)
|
|
@@ -115,6 +125,8 @@ Running `quickscale plan myapp && quickscale apply` generates a **production-rea
|
|
|
115
125
|
- ✅ **Poetry** for dependency management
|
|
116
126
|
- ✅ **One-Command Deployment**: Deploy to Railway with `quickscale deploy railway` - fully automated setup
|
|
117
127
|
|
|
128
|
+
**Alternative**: Use `quickscale plan myapp --theme showcase_html` for pure HTML/CSS (simpler projects).
|
|
129
|
+
|
|
118
130
|
**See the complete project structure:** [scaffolding.md - Generated Project Output](./docs/technical/scaffolding.md#5-generated-project-output)
|
|
119
131
|
|
|
120
132
|
The generated project is **yours to own and modify** - no vendor lock-in, just Django best practices.
|
|
@@ -132,8 +144,148 @@ See [competitive_analysis.md](./docs/overview/competitive_analysis.md) for detai
|
|
|
132
144
|
|
|
133
145
|
---
|
|
134
146
|
|
|
147
|
+
## Installation
|
|
148
|
+
|
|
149
|
+
QuickScale can be installed in two ways:
|
|
150
|
+
|
|
151
|
+
### Method 1: Install from PyPI (Recommended)
|
|
152
|
+
|
|
153
|
+
**Quick install:**
|
|
154
|
+
```bash
|
|
155
|
+
pip install quickscale
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Or with Poetry:**
|
|
159
|
+
```bash
|
|
160
|
+
poetry add quickscale
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**Then use directly:**
|
|
164
|
+
```bash
|
|
165
|
+
quickscale plan myapp
|
|
166
|
+
cd myapp
|
|
167
|
+
quickscale apply
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Method 2: Install from Source
|
|
171
|
+
|
|
172
|
+
**For those who prefer building from source:**
|
|
173
|
+
```bash
|
|
174
|
+
git clone https://github.com/Experto-AI/quickscale.git
|
|
175
|
+
cd quickscale
|
|
176
|
+
./scripts/install_global.sh
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Then use directly:**
|
|
180
|
+
```bash
|
|
181
|
+
quickscale plan myapp
|
|
182
|
+
cd myapp
|
|
183
|
+
quickscale apply
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Both methods use the same command syntax:** `quickscale plan`, `quickscale apply`, etc.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
### For Contributors
|
|
191
|
+
|
|
192
|
+
If you want to contribute to QuickScale development, see the [Development Guide](./docs/technical/development.md) for setup instructions.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 🚀 5-Minute Quickstart
|
|
197
|
+
|
|
198
|
+
**Want to see QuickScale in action right now?** Here's the fastest path to a working Django SaaS:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
# 1. Install QuickScale
|
|
202
|
+
./scripts/install_global.sh
|
|
203
|
+
|
|
204
|
+
# 2. Create your project configuration
|
|
205
|
+
quickscale plan myapp
|
|
206
|
+
# → Accept defaults: theme (showcase_html), no modules, Docker enabled
|
|
207
|
+
|
|
208
|
+
# 3. Generate and enter the project
|
|
209
|
+
cd myapp
|
|
210
|
+
quickscale apply
|
|
211
|
+
# → Docker services auto-start! (default: docker.start=true)
|
|
212
|
+
|
|
213
|
+
# 4. Setup and verify
|
|
214
|
+
quickscale manage migrate
|
|
215
|
+
quickscale manage createsuperuser
|
|
216
|
+
quickscale ps # Check services are running
|
|
217
|
+
|
|
218
|
+
# 5. Open http://localhost:8000
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**That's it!** 🎉 You now have a production-ready Django SaaS running with Docker + PostgreSQL.
|
|
222
|
+
|
|
223
|
+
**Note**: Services started automatically during `quickscale apply`. No need to run `quickscale up` manually!
|
|
224
|
+
|
|
225
|
+
**Prefer native Python?** After step 3, run:
|
|
226
|
+
```bash
|
|
227
|
+
poetry install
|
|
228
|
+
poetry run python manage.py migrate
|
|
229
|
+
poetry run python manage.py runserver
|
|
230
|
+
# Open http://localhost:8000
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Understanding Docker Auto-Start
|
|
236
|
+
|
|
237
|
+
**When does `quickscale apply` start Docker automatically?**
|
|
238
|
+
|
|
239
|
+
✅ **Services auto-start** (no `quickscale up` needed):
|
|
240
|
+
- First-time project generation
|
|
241
|
+
- When `docker.start: true` in quickscale.yml (**default**)
|
|
242
|
+
- When `--no-docker` flag is NOT used
|
|
243
|
+
|
|
244
|
+
❌ **Manual start required** (`quickscale up` needed):
|
|
245
|
+
- You set `docker.start: false` during `quickscale plan` wizard
|
|
246
|
+
- After stopping services with `quickscale down`
|
|
247
|
+
- When running `quickscale apply --no-docker`
|
|
248
|
+
- Adding modules to existing project (incremental apply)
|
|
135
249
|
|
|
136
|
-
|
|
250
|
+
**Example - No manual start needed:**
|
|
251
|
+
```bash
|
|
252
|
+
quickscale plan myapp # Accept defaults (docker.start: true)
|
|
253
|
+
cd myapp
|
|
254
|
+
quickscale apply # ← Docker services auto-start!
|
|
255
|
+
|
|
256
|
+
# Already running - just check status:
|
|
257
|
+
quickscale ps
|
|
258
|
+
curl http://localhost:8000 # ✅ Works immediately
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Example - Manual start needed:**
|
|
262
|
+
```bash
|
|
263
|
+
quickscale plan myapp
|
|
264
|
+
# During wizard, set: "Docker start? [Y/n]: n"
|
|
265
|
+
cd myapp
|
|
266
|
+
quickscale apply # Services do NOT start
|
|
267
|
+
|
|
268
|
+
# Must start manually:
|
|
269
|
+
quickscale up
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
**Docker configuration options** in quickscale.yml:
|
|
273
|
+
|
|
274
|
+
```yaml
|
|
275
|
+
docker:
|
|
276
|
+
start: true # Auto-start services during apply?
|
|
277
|
+
build: true # Rebuild images? (slower but ensures latest)
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
- `start: true` + `build: true` → Full rebuild + start (slowest, most reliable)
|
|
281
|
+
- `start: true` + `build: false` → Start with cached images (faster)
|
|
282
|
+
- `start: false` → Manual control with `quickscale up`
|
|
283
|
+
|
|
284
|
+
**Need more details?** See [Docker Workflows Guide](./docs/technical/docker_workflows.md) for comprehensive scenarios and troubleshooting.
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Full Documentation & Setup
|
|
137
289
|
|
|
138
290
|
```bash
|
|
139
291
|
# Install QuickScale globally
|
|
@@ -142,11 +294,11 @@ See [competitive_analysis.md](./docs/overview/competitive_analysis.md) for detai
|
|
|
142
294
|
# Create a configuration interactively
|
|
143
295
|
quickscale plan myapp
|
|
144
296
|
# → Select theme, modules, Docker options
|
|
145
|
-
# → Generates quickscale.yml
|
|
297
|
+
# → Generates quickscale.yml in myapp/ directory
|
|
146
298
|
|
|
147
|
-
#
|
|
148
|
-
quickscale apply
|
|
299
|
+
# Navigate to project and execute the configuration
|
|
149
300
|
cd myapp
|
|
301
|
+
quickscale apply
|
|
150
302
|
```
|
|
151
303
|
|
|
152
304
|
**Choose your development workflow:**
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# 🚀 QuickScale
|
|
2
2
|
|
|
3
|
+
[](https://pypi.org/project/quickscale/)
|
|
4
|
+
[](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
|
|
5
|
+
[](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.python.org/downloads/)
|
|
7
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
8
|
+
[](https://github.com/Experto-AI/quickscale/releases)
|
|
9
|
+
[](https://github.com/astral-sh/ruff)
|
|
10
|
+
|
|
3
11
|
> **You are here**: **QuickScale README** (Project Overview)
|
|
4
12
|
> **Related docs**: [Start Here](START_HERE.md) | [Glossary](GLOSSARY.md) | [Decisions](docs/technical/decisions.md) | [User Manual](docs/technical/user_manual.md)
|
|
5
13
|
|
|
@@ -68,10 +76,11 @@ See [decisions.md - Glossary section](./docs/technical/decisions.md#document-res
|
|
|
68
76
|
|
|
69
77
|
### Development Flow
|
|
70
78
|
1. `quickscale plan myapp` → Interactive configuration wizard
|
|
71
|
-
2. `
|
|
72
|
-
3.
|
|
73
|
-
4.
|
|
74
|
-
5.
|
|
79
|
+
2. `cd myapp` → Navigate to your project directory
|
|
80
|
+
3. `quickscale apply` → Generates production-ready Django project
|
|
81
|
+
4. Add your custom Django apps and features
|
|
82
|
+
5. Build your unique client application
|
|
83
|
+
6. Deploy to Railway with `quickscale deploy railway` (or use standard Django deployment)
|
|
75
84
|
|
|
76
85
|
ℹ️ The [MVP Feature Matrix](./docs/technical/decisions.md#mvp-feature-matrix-authoritative) is the single source of truth for what's in or out.
|
|
77
86
|
|
|
@@ -79,6 +88,7 @@ See [decisions.md - Glossary section](./docs/technical/decisions.md#document-res
|
|
|
79
88
|
|
|
80
89
|
Running `quickscale plan myapp && quickscale apply` generates a **production-ready Django project** with:
|
|
81
90
|
|
|
91
|
+
- ✅ **React + shadcn/ui** frontend (TypeScript, Vite, Tailwind CSS) — **NEW in v0.74.0**
|
|
82
92
|
- ✅ **Docker** setup (development + production)
|
|
83
93
|
- ✅ **PostgreSQL** configuration
|
|
84
94
|
- ✅ **Environment-based** settings (dev/prod split)
|
|
@@ -90,6 +100,8 @@ Running `quickscale plan myapp && quickscale apply` generates a **production-rea
|
|
|
90
100
|
- ✅ **Poetry** for dependency management
|
|
91
101
|
- ✅ **One-Command Deployment**: Deploy to Railway with `quickscale deploy railway` - fully automated setup
|
|
92
102
|
|
|
103
|
+
**Alternative**: Use `quickscale plan myapp --theme showcase_html` for pure HTML/CSS (simpler projects).
|
|
104
|
+
|
|
93
105
|
**See the complete project structure:** [scaffolding.md - Generated Project Output](./docs/technical/scaffolding.md#5-generated-project-output)
|
|
94
106
|
|
|
95
107
|
The generated project is **yours to own and modify** - no vendor lock-in, just Django best practices.
|
|
@@ -107,8 +119,148 @@ See [competitive_analysis.md](./docs/overview/competitive_analysis.md) for detai
|
|
|
107
119
|
|
|
108
120
|
---
|
|
109
121
|
|
|
122
|
+
## Installation
|
|
123
|
+
|
|
124
|
+
QuickScale can be installed in two ways:
|
|
125
|
+
|
|
126
|
+
### Method 1: Install from PyPI (Recommended)
|
|
127
|
+
|
|
128
|
+
**Quick install:**
|
|
129
|
+
```bash
|
|
130
|
+
pip install quickscale
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Or with Poetry:**
|
|
134
|
+
```bash
|
|
135
|
+
poetry add quickscale
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Then use directly:**
|
|
139
|
+
```bash
|
|
140
|
+
quickscale plan myapp
|
|
141
|
+
cd myapp
|
|
142
|
+
quickscale apply
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Method 2: Install from Source
|
|
146
|
+
|
|
147
|
+
**For those who prefer building from source:**
|
|
148
|
+
```bash
|
|
149
|
+
git clone https://github.com/Experto-AI/quickscale.git
|
|
150
|
+
cd quickscale
|
|
151
|
+
./scripts/install_global.sh
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Then use directly:**
|
|
155
|
+
```bash
|
|
156
|
+
quickscale plan myapp
|
|
157
|
+
cd myapp
|
|
158
|
+
quickscale apply
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Both methods use the same command syntax:** `quickscale plan`, `quickscale apply`, etc.
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### For Contributors
|
|
166
|
+
|
|
167
|
+
If you want to contribute to QuickScale development, see the [Development Guide](./docs/technical/development.md) for setup instructions.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## 🚀 5-Minute Quickstart
|
|
172
|
+
|
|
173
|
+
**Want to see QuickScale in action right now?** Here's the fastest path to a working Django SaaS:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# 1. Install QuickScale
|
|
177
|
+
./scripts/install_global.sh
|
|
178
|
+
|
|
179
|
+
# 2. Create your project configuration
|
|
180
|
+
quickscale plan myapp
|
|
181
|
+
# → Accept defaults: theme (showcase_html), no modules, Docker enabled
|
|
182
|
+
|
|
183
|
+
# 3. Generate and enter the project
|
|
184
|
+
cd myapp
|
|
185
|
+
quickscale apply
|
|
186
|
+
# → Docker services auto-start! (default: docker.start=true)
|
|
187
|
+
|
|
188
|
+
# 4. Setup and verify
|
|
189
|
+
quickscale manage migrate
|
|
190
|
+
quickscale manage createsuperuser
|
|
191
|
+
quickscale ps # Check services are running
|
|
192
|
+
|
|
193
|
+
# 5. Open http://localhost:8000
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
**That's it!** 🎉 You now have a production-ready Django SaaS running with Docker + PostgreSQL.
|
|
197
|
+
|
|
198
|
+
**Note**: Services started automatically during `quickscale apply`. No need to run `quickscale up` manually!
|
|
199
|
+
|
|
200
|
+
**Prefer native Python?** After step 3, run:
|
|
201
|
+
```bash
|
|
202
|
+
poetry install
|
|
203
|
+
poetry run python manage.py migrate
|
|
204
|
+
poetry run python manage.py runserver
|
|
205
|
+
# Open http://localhost:8000
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Understanding Docker Auto-Start
|
|
211
|
+
|
|
212
|
+
**When does `quickscale apply` start Docker automatically?**
|
|
213
|
+
|
|
214
|
+
✅ **Services auto-start** (no `quickscale up` needed):
|
|
215
|
+
- First-time project generation
|
|
216
|
+
- When `docker.start: true` in quickscale.yml (**default**)
|
|
217
|
+
- When `--no-docker` flag is NOT used
|
|
218
|
+
|
|
219
|
+
❌ **Manual start required** (`quickscale up` needed):
|
|
220
|
+
- You set `docker.start: false` during `quickscale plan` wizard
|
|
221
|
+
- After stopping services with `quickscale down`
|
|
222
|
+
- When running `quickscale apply --no-docker`
|
|
223
|
+
- Adding modules to existing project (incremental apply)
|
|
110
224
|
|
|
111
|
-
|
|
225
|
+
**Example - No manual start needed:**
|
|
226
|
+
```bash
|
|
227
|
+
quickscale plan myapp # Accept defaults (docker.start: true)
|
|
228
|
+
cd myapp
|
|
229
|
+
quickscale apply # ← Docker services auto-start!
|
|
230
|
+
|
|
231
|
+
# Already running - just check status:
|
|
232
|
+
quickscale ps
|
|
233
|
+
curl http://localhost:8000 # ✅ Works immediately
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
**Example - Manual start needed:**
|
|
237
|
+
```bash
|
|
238
|
+
quickscale plan myapp
|
|
239
|
+
# During wizard, set: "Docker start? [Y/n]: n"
|
|
240
|
+
cd myapp
|
|
241
|
+
quickscale apply # Services do NOT start
|
|
242
|
+
|
|
243
|
+
# Must start manually:
|
|
244
|
+
quickscale up
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**Docker configuration options** in quickscale.yml:
|
|
248
|
+
|
|
249
|
+
```yaml
|
|
250
|
+
docker:
|
|
251
|
+
start: true # Auto-start services during apply?
|
|
252
|
+
build: true # Rebuild images? (slower but ensures latest)
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
- `start: true` + `build: true` → Full rebuild + start (slowest, most reliable)
|
|
256
|
+
- `start: true` + `build: false` → Start with cached images (faster)
|
|
257
|
+
- `start: false` → Manual control with `quickscale up`
|
|
258
|
+
|
|
259
|
+
**Need more details?** See [Docker Workflows Guide](./docs/technical/docker_workflows.md) for comprehensive scenarios and troubleshooting.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## Full Documentation & Setup
|
|
112
264
|
|
|
113
265
|
```bash
|
|
114
266
|
# Install QuickScale globally
|
|
@@ -117,11 +269,11 @@ See [competitive_analysis.md](./docs/overview/competitive_analysis.md) for detai
|
|
|
117
269
|
# Create a configuration interactively
|
|
118
270
|
quickscale plan myapp
|
|
119
271
|
# → Select theme, modules, Docker options
|
|
120
|
-
# → Generates quickscale.yml
|
|
272
|
+
# → Generates quickscale.yml in myapp/ directory
|
|
121
273
|
|
|
122
|
-
#
|
|
123
|
-
quickscale apply
|
|
274
|
+
# Navigate to project and execute the configuration
|
|
124
275
|
cd myapp
|
|
276
|
+
quickscale apply
|
|
125
277
|
```
|
|
126
278
|
|
|
127
279
|
**Choose your development workflow:**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "quickscale-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.74.2"
|
|
4
4
|
description = "Command-line interface for QuickScale Django project generator"
|
|
5
5
|
authors = ["Experto AI <victor@experto.ai>"]
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -14,18 +14,18 @@ classifiers = [
|
|
|
14
14
|
"Intended Audience :: Developers",
|
|
15
15
|
"License :: OSI Approved :: Apache Software License",
|
|
16
16
|
"Programming Language :: Python :: 3",
|
|
17
|
-
"Programming Language :: Python :: 3.10",
|
|
18
|
-
"Programming Language :: Python :: 3.11",
|
|
19
17
|
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
"Programming Language :: Python :: 3.14",
|
|
20
20
|
"Framework :: Django",
|
|
21
|
-
"Framework :: Django ::
|
|
21
|
+
"Framework :: Django :: 6.0",
|
|
22
22
|
]
|
|
23
23
|
packages = [{include = "quickscale_cli", from = "src"}]
|
|
24
24
|
|
|
25
25
|
[tool.poetry.dependencies]
|
|
26
|
-
python = "^3.
|
|
27
|
-
click = "^8.3.
|
|
28
|
-
quickscale-core =
|
|
26
|
+
python = "^3.12"
|
|
27
|
+
click = "^8.3.1"
|
|
28
|
+
quickscale-core = "^0.74.2"
|
|
29
29
|
|
|
30
30
|
[tool.poetry.group.dev.dependencies]
|
|
31
31
|
# Dev dependencies centralized in root pyproject.toml
|
|
@@ -49,6 +49,7 @@ addopts = [
|
|
|
49
49
|
"--cov=quickscale_cli",
|
|
50
50
|
"--cov-report=term-missing",
|
|
51
51
|
"--cov-report=html",
|
|
52
|
+
"--cov-fail-under=90",
|
|
52
53
|
"-m", "not e2e", # Skip E2E tests by default (run with: pytest -m e2e)
|
|
53
54
|
]
|
|
54
55
|
markers = [
|
|
@@ -57,6 +58,10 @@ markers = [
|
|
|
57
58
|
"e2e: end-to-end tests",
|
|
58
59
|
]
|
|
59
60
|
|
|
61
|
+
[tool.coverage.report]
|
|
62
|
+
fail_under = 90
|
|
63
|
+
# Per-file minimum target: 80% (enforced via code review)
|
|
64
|
+
|
|
60
65
|
# Ruff and mypy configurations centralized in root ruff.toml and mypy.ini
|
|
61
66
|
# Package-specific isort override
|
|
62
67
|
[tool.ruff.lint.isort]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# Auto-generated by scripts/version_tool.sh
|
|
2
|
-
__version__ = "0.
|
|
2
|
+
__version__ = "0.74.2"
|
{quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/apply_command.py
RENAMED
|
@@ -23,6 +23,7 @@ from quickscale_cli.schema.state_schema import (
|
|
|
23
23
|
QuickScaleState,
|
|
24
24
|
StateManager,
|
|
25
25
|
)
|
|
26
|
+
from quickscale_core.utils.git_utils import is_working_directory_clean
|
|
26
27
|
from quickscale_core.generator import ProjectGenerator
|
|
27
28
|
from quickscale_core.manifest import ModuleManifest
|
|
28
29
|
from quickscale_core.manifest.loader import get_manifest_for_module
|
|
@@ -91,18 +92,21 @@ def _generate_project(config: QuickScaleConfig, output_path: Path) -> bool:
|
|
|
91
92
|
click.echo(f"⏳ Generating project: {config.project.name}...")
|
|
92
93
|
|
|
93
94
|
# Validate theme availability
|
|
94
|
-
if config.project.theme
|
|
95
|
+
if config.project.theme == "showcase_htmx":
|
|
95
96
|
click.secho(
|
|
96
97
|
f"❌ Error: Theme '{config.project.theme}' is not yet implemented",
|
|
97
98
|
fg="red",
|
|
98
99
|
err=True,
|
|
99
100
|
)
|
|
100
101
|
click.echo(
|
|
101
|
-
|
|
102
|
+
"\n💡 The 'showcase_htmx' theme is planned for a future release:",
|
|
103
|
+
err=True,
|
|
104
|
+
)
|
|
105
|
+
click.echo(" - showcase_htmx: Coming in v0.78.0", err=True)
|
|
106
|
+
click.echo(
|
|
107
|
+
" - Use 'showcase_react' (default) or 'showcase_html' instead",
|
|
102
108
|
err=True,
|
|
103
109
|
)
|
|
104
|
-
click.echo(" - showcase_htmx: Coming in v0.70.0", err=True)
|
|
105
|
-
click.echo(" - showcase_react: Coming in v0.71.0", err=True)
|
|
106
110
|
return False
|
|
107
111
|
|
|
108
112
|
generator = ProjectGenerator(theme=config.project.theme)
|
|
@@ -196,18 +200,54 @@ def _run_migrations(project_path: Path) -> bool:
|
|
|
196
200
|
)[0]
|
|
197
201
|
|
|
198
202
|
|
|
199
|
-
def _start_docker(
|
|
200
|
-
|
|
203
|
+
def _start_docker(
|
|
204
|
+
project_path: Path, build: bool = True, verbose: bool = False
|
|
205
|
+
) -> bool:
|
|
206
|
+
"""Start Docker services using quickscale up
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
project_path: Path to the project directory
|
|
210
|
+
build: Whether to build images before starting
|
|
211
|
+
verbose: Whether to show Docker build output (useful for debugging)
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
True if Docker started successfully, False otherwise
|
|
215
|
+
"""
|
|
201
216
|
cmd = ["quickscale", "up"]
|
|
202
217
|
if build:
|
|
203
218
|
cmd.append("--build")
|
|
204
219
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
"
|
|
209
|
-
|
|
210
|
-
|
|
220
|
+
if verbose:
|
|
221
|
+
# Show Docker build output for debugging
|
|
222
|
+
click.echo("⏳ Starting Docker services (showing build output)...")
|
|
223
|
+
click.echo("=" * 50)
|
|
224
|
+
try:
|
|
225
|
+
result = subprocess.run(
|
|
226
|
+
cmd,
|
|
227
|
+
cwd=project_path,
|
|
228
|
+
text=True,
|
|
229
|
+
check=False,
|
|
230
|
+
)
|
|
231
|
+
click.echo("=" * 50)
|
|
232
|
+
if result.returncode == 0:
|
|
233
|
+
click.secho("✅ Starting Docker services", fg="green")
|
|
234
|
+
return True
|
|
235
|
+
else:
|
|
236
|
+
click.secho("❌ Starting Docker services failed", fg="red")
|
|
237
|
+
return False
|
|
238
|
+
except FileNotFoundError:
|
|
239
|
+
click.secho(f"❌ Command not found: {cmd[0]}", fg="red", err=True)
|
|
240
|
+
return False
|
|
241
|
+
except Exception as e:
|
|
242
|
+
click.secho(f"❌ Unexpected error: {e}", fg="red", err=True)
|
|
243
|
+
return False
|
|
244
|
+
else:
|
|
245
|
+
success, _ = _run_command(
|
|
246
|
+
cmd,
|
|
247
|
+
project_path,
|
|
248
|
+
"Starting Docker services",
|
|
249
|
+
)
|
|
250
|
+
return success
|
|
211
251
|
|
|
212
252
|
|
|
213
253
|
def _load_module_manifests(
|
|
@@ -516,6 +556,9 @@ def _embed_modules_step(
|
|
|
516
556
|
f"⚠️ Module embedding failed for {module_name}, continuing...",
|
|
517
557
|
fg="yellow",
|
|
518
558
|
)
|
|
559
|
+
# Commit any partial changes to allow subsequent modules to be embedded
|
|
560
|
+
if not is_working_directory_clean(output_path):
|
|
561
|
+
_git_commit(output_path, f"Partial module: {module_name} (incomplete)")
|
|
519
562
|
else:
|
|
520
563
|
embedded_modules.append(module_name)
|
|
521
564
|
_git_commit(output_path, f"Add module: {module_name}")
|
|
@@ -642,7 +685,11 @@ def _prepare_apply_context(config_path: Path) -> ApplyContext:
|
|
|
642
685
|
|
|
643
686
|
|
|
644
687
|
def _execute_apply_steps(
|
|
645
|
-
ctx: ApplyContext,
|
|
688
|
+
ctx: ApplyContext,
|
|
689
|
+
force: bool,
|
|
690
|
+
no_docker: bool,
|
|
691
|
+
no_modules: bool,
|
|
692
|
+
verbose_docker: bool = False,
|
|
646
693
|
) -> None:
|
|
647
694
|
"""Execute the apply steps after confirmation."""
|
|
648
695
|
click.echo("\n" + "=" * 50)
|
|
@@ -681,7 +728,9 @@ def _execute_apply_steps(
|
|
|
681
728
|
|
|
682
729
|
# Start Docker
|
|
683
730
|
if not no_docker and ctx.qs_config.docker.start:
|
|
684
|
-
if not _start_docker(
|
|
731
|
+
if not _start_docker(
|
|
732
|
+
ctx.output_path, ctx.qs_config.docker.build, verbose_docker
|
|
733
|
+
):
|
|
685
734
|
click.secho("⚠️ Docker start failed, continuing...", fg="yellow")
|
|
686
735
|
|
|
687
736
|
# Save state
|
|
@@ -720,7 +769,14 @@ def _execute_apply_steps(
|
|
|
720
769
|
is_flag=True,
|
|
721
770
|
help="Skip module embedding",
|
|
722
771
|
)
|
|
723
|
-
|
|
772
|
+
@click.option(
|
|
773
|
+
"--verbose-docker",
|
|
774
|
+
is_flag=True,
|
|
775
|
+
help="Show Docker build output (useful for debugging build issues)",
|
|
776
|
+
)
|
|
777
|
+
def apply(
|
|
778
|
+
config: str, force: bool, no_docker: bool, no_modules: bool, verbose_docker: bool
|
|
779
|
+
) -> None:
|
|
724
780
|
"""
|
|
725
781
|
Execute project configuration from quickscale.yml.
|
|
726
782
|
|
|
@@ -733,6 +789,7 @@ def apply(config: str, force: bool, no_docker: bool, no_modules: bool) -> None:
|
|
|
733
789
|
quickscale apply myapp/quickscale.yml # Use specific config file
|
|
734
790
|
quickscale apply --force # Overwrite existing project
|
|
735
791
|
quickscale apply --no-docker # Skip Docker operations
|
|
792
|
+
quickscale apply --verbose-docker # Show Docker build output
|
|
736
793
|
|
|
737
794
|
\b
|
|
738
795
|
Execution Order:
|
|
@@ -756,10 +813,23 @@ def apply(config: str, force: bool, no_docker: bool, no_modules: bool) -> None:
|
|
|
756
813
|
# Check output directory
|
|
757
814
|
_check_output_directory(ctx.output_path, ctx.existing_state, force)
|
|
758
815
|
|
|
816
|
+
# Ask about Docker build output visibility if Docker will be started
|
|
817
|
+
show_docker_output = verbose_docker
|
|
818
|
+
if (
|
|
819
|
+
not no_docker
|
|
820
|
+
and ctx.qs_config.docker.start
|
|
821
|
+
and ctx.qs_config.docker.build
|
|
822
|
+
and not verbose_docker
|
|
823
|
+
):
|
|
824
|
+
show_docker_output = click.confirm(
|
|
825
|
+
"\n🐳 Show Docker build output? (useful for debugging build issues)",
|
|
826
|
+
default=False,
|
|
827
|
+
)
|
|
828
|
+
|
|
759
829
|
# Confirm before proceeding
|
|
760
830
|
if not click.confirm("\n❓ Proceed with apply?", default=True):
|
|
761
831
|
click.echo("❌ Cancelled")
|
|
762
832
|
raise click.Abort()
|
|
763
833
|
|
|
764
834
|
# Execute apply steps
|
|
765
|
-
_execute_apply_steps(ctx, force, no_docker, no_modules)
|
|
835
|
+
_execute_apply_steps(ctx, force, no_docker, no_modules, show_docker_output)
|