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.
Files changed (24) hide show
  1. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/PKG-INFO +169 -17
  2. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/README.md +160 -8
  3. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/pyproject.toml +12 -7
  4. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/_version.py +1 -1
  5. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/apply_command.py +86 -16
  6. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/deployment_commands.py +3 -5
  7. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/development_commands.py +10 -3
  8. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/module_commands.py +2 -2
  9. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/module_config.py +302 -9
  10. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/plan_command.py +15 -15
  11. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/remove_command.py +9 -7
  12. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/config_schema.py +4 -3
  13. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/project_manager.py +12 -0
  14. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/railway_utils.py +4 -21
  15. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/__init__.py +0 -0
  16. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/__init__.py +0 -0
  17. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/commands/status_command.py +0 -0
  18. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/main.py +0 -0
  19. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/__init__.py +0 -0
  20. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/delta.py +0 -0
  21. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/schema/state_schema.py +0 -0
  22. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/__init__.py +0 -0
  23. {quickscale_cli-0.72.0 → quickscale_cli-0.74.2}/src/quickscale_cli/utils/dependency_utils.py +0 -0
  24. {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
1
+ Metadata-Version: 2.4
2
2
  Name: quickscale-cli
3
- Version: 0.72.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.10,<4.0
9
+ Requires-Python: >=3.12,<4.0
11
10
  Classifier: Development Status :: 3 - Alpha
12
11
  Classifier: Framework :: Django
13
- Classifier: Framework :: Django :: 5.0
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
- Requires-Dist: click (>=8.3.0,<9.0.0)
21
- Requires-Dist: quickscale-core @ file:///home/victor/Code/quickscale/quickscale_core
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
+ [![PyPI version](https://img.shields.io/pypi/v/quickscale.svg)](https://pypi.org/project/quickscale/)
29
+ [![CI](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml/badge.svg)](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
30
+ [![Coverage](https://img.shields.io/badge/coverage-90%25-green.svg)](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
31
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
32
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
33
+ [![Version](https://img.shields.io/badge/version-0.74.0-green.svg)](https://github.com/Experto-AI/quickscale/releases)
34
+ [![Code style: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](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. `quickscale apply` → Generates production-ready Django project
97
- 3. Add your custom Django apps and features
98
- 4. Build your unique client application
99
- 5. Deploy to Railway with `quickscale deploy railway` (or use standard Django deployment)
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
- ## Quick Start
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
- # Execute the configuration
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
+ [![PyPI version](https://img.shields.io/pypi/v/quickscale.svg)](https://pypi.org/project/quickscale/)
4
+ [![CI](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml/badge.svg)](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
5
+ [![Coverage](https://img.shields.io/badge/coverage-90%25-green.svg)](https://github.com/Experto-AI/quickscale/actions/workflows/ci.yml)
6
+ [![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](https://www.python.org/downloads/)
7
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
8
+ [![Version](https://img.shields.io/badge/version-0.74.0-green.svg)](https://github.com/Experto-AI/quickscale/releases)
9
+ [![Code style: Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](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. `quickscale apply` → Generates production-ready Django project
72
- 3. Add your custom Django apps and features
73
- 4. Build your unique client application
74
- 5. Deploy to Railway with `quickscale deploy railway` (or use standard Django deployment)
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
- ## Quick Start
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
- # Execute the configuration
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.72.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 :: 5.0",
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.10"
27
- click = "^8.3.0"
28
- quickscale-core = {path = "../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.72.0"
2
+ __version__ = "0.74.2"
@@ -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 in ["showcase_htmx", "showcase_react"]:
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
- f"\n💡 The '{config.project.theme}' theme is planned for a future release:",
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(project_path: Path, build: bool = True) -> bool:
200
- """Start Docker services using quickscale up"""
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
- success, _ = _run_command(
206
- cmd,
207
- project_path,
208
- "Starting Docker services",
209
- )
210
- return success
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, force: bool, no_docker: bool, no_modules: bool
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(ctx.output_path, ctx.qs_config.docker.build):
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
- def apply(config: str, force: bool, no_docker: bool, no_modules: bool) -> None:
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)