quickscale-cli 0.61.0__tar.gz → 0.62.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,24 @@
1
+ Metadata-Version: 2.1
2
+ Name: quickscale-cli
3
+ Version: 0.62.0
4
+ Summary: Command-line interface for QuickScale Django project generator
5
+ Home-page: https://github.com/Experto-AI/quickscale
6
+ License: Apache-2.0
7
+ Keywords: django,cli,project-generator,saas
8
+ Author: Experto AI
9
+ Author-email: victor@experto.ai
10
+ Requires-Python: >=3.10,<4.0
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Framework :: Django
13
+ Classifier: Framework :: Django :: 4.2
14
+ Classifier: Framework :: Django :: 5.0
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: Apache Software License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Requires-Dist: click (>=8.1.0,<9.0.0)
22
+ Requires-Dist: quickscale-core (>=0.62.0,<0.63.0)
23
+ Project-URL: Documentation, https://github.com/Experto-AI/quickscale/tree/main/docs
24
+ Project-URL: Repository, https://github.com/Experto-AI/quickscale
@@ -1,10 +1,9 @@
1
1
  [tool.poetry]
2
2
  name = "quickscale-cli"
3
- version = "0.61.0"
3
+ version = "0.62.0"
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"
7
- readme = "README.md"
8
7
  keywords = ["django", "cli", "project-generator", "saas"]
9
8
  homepage = "https://github.com/Experto-AI/quickscale"
10
9
  repository = "https://github.com/Experto-AI/quickscale"
@@ -26,7 +25,7 @@ packages = [{include = "quickscale_cli", from = "src"}]
26
25
  [tool.poetry.dependencies]
27
26
  python = "^3.10"
28
27
  click = "^8.1.0"
29
- quickscale-core = "^0.61.0"
28
+ quickscale-core = "^0.62.0"
30
29
 
31
30
  [tool.poetry.group.dev.dependencies]
32
31
  pytest = "^7.4.0"
@@ -106,4 +105,8 @@ module = "tests.*"
106
105
  disallow_untyped_defs = false
107
106
  check_untyped_defs = false
108
107
 
108
+ [[tool.mypy.overrides]]
109
+ module = "quickscale_core.*"
110
+ ignore_missing_imports = true
111
+
109
112
 
@@ -1,2 +1,2 @@
1
1
  # Auto-generated by scripts/version_tool.sh
2
- __version__ = "0.61.0"
2
+ __version__ = "0.62.0"
@@ -0,0 +1,307 @@
1
+ """Module management commands for QuickScale CLI."""
2
+
3
+ from pathlib import Path
4
+
5
+ import click
6
+
7
+ from quickscale_core.config import add_module, load_config, update_module_version
8
+ from quickscale_core.utils.git_utils import (
9
+ GitError,
10
+ check_remote_branch_exists,
11
+ is_git_repo,
12
+ is_working_directory_clean,
13
+ run_git_subtree_add,
14
+ run_git_subtree_pull,
15
+ run_git_subtree_push,
16
+ )
17
+
18
+ # Available modules (placeholders in v0.62.0)
19
+ AVAILABLE_MODULES = ["auth", "billing", "teams"]
20
+
21
+
22
+ @click.command()
23
+ @click.option(
24
+ "--module",
25
+ required=True,
26
+ type=click.Choice(AVAILABLE_MODULES, case_sensitive=False),
27
+ help="Module name to embed",
28
+ )
29
+ @click.option(
30
+ "--remote",
31
+ default="https://github.com/Experto-AI/quickscale.git",
32
+ help="Git remote URL (default: QuickScale repository)",
33
+ )
34
+ def embed(module: str, remote: str) -> None:
35
+ r"""
36
+ Embed a QuickScale module into your project via git subtree.
37
+
38
+ \b
39
+ Examples:
40
+ quickscale embed --module auth
41
+ quickscale embed --module billing
42
+
43
+ \b
44
+ Available modules (v0.62.0 placeholders):
45
+ - auth: Authentication with django-allauth (placeholder)
46
+ - billing: Stripe integration with dj-stripe (placeholder)
47
+ - teams: Multi-tenancy and team management (placeholder)
48
+
49
+ \b
50
+ Note: In v0.62.0, modules contain only placeholder READMEs explaining
51
+ they're not yet implemented. Full implementations coming in v0.63.0+.
52
+ """
53
+ try:
54
+ # Validate git repository
55
+ if not is_git_repo():
56
+ click.secho("❌ Error: Not a git repository", fg="red", err=True)
57
+ click.echo("\n💡 Tip: Run 'git init' to initialize a git repository", err=True)
58
+ raise click.Abort()
59
+
60
+ # Check working directory is clean
61
+ if not is_working_directory_clean():
62
+ click.secho("❌ Error: Working directory has uncommitted changes", fg="red", err=True)
63
+ click.echo("\n💡 Tip: Commit or stash your changes before embedding modules", err=True)
64
+ raise click.Abort()
65
+
66
+ # Check if module already exists
67
+ module_path = Path.cwd() / "modules" / module
68
+ if module_path.exists():
69
+ click.secho(
70
+ f"❌ Error: Module '{module}' already exists at {module_path}", fg="red", err=True
71
+ )
72
+ click.echo("\n💡 Tip: Remove the existing module directory first", err=True)
73
+ raise click.Abort()
74
+
75
+ # Check if branch exists on remote
76
+ branch = f"splits/{module}-module"
77
+ click.echo(f"🔍 Checking if {branch} exists on remote...")
78
+
79
+ if not check_remote_branch_exists(remote, branch):
80
+ click.secho(
81
+ f"❌ Error: Module '{module}' is not yet implemented",
82
+ fg="red",
83
+ err=True,
84
+ )
85
+ click.echo(
86
+ f"\n💡 The '{module}' module infrastructure is ready but contains "
87
+ "only placeholder files.",
88
+ err=True,
89
+ )
90
+ click.echo(" Full implementation coming in v0.63.0+", err=True)
91
+ click.echo(f"\n📖 Branch '{branch}' does not exist on remote: {remote}", err=True)
92
+ raise click.Abort()
93
+
94
+ # Embed module via git subtree
95
+ prefix = f"modules/{module}"
96
+ click.echo(f"\n📦 Embedding {module} module from {branch}...")
97
+
98
+ run_git_subtree_add(prefix=prefix, remote=remote, branch=branch, squash=True)
99
+
100
+ # Update configuration
101
+ add_module(
102
+ module_name=module,
103
+ prefix=prefix,
104
+ branch=branch,
105
+ version="v0.62.0", # Placeholder version
106
+ )
107
+
108
+ # Success message
109
+ click.secho(f"\n✅ Module '{module}' embedded successfully!", fg="green", bold=True)
110
+ click.echo(f" Location: {module_path}")
111
+ click.echo(f" Branch: {branch}")
112
+
113
+ # Next steps
114
+ click.echo("\n📋 Next steps:")
115
+ click.echo(f" 1. Review the module code in modules/{module}/")
116
+ click.echo(f" 2. Add to INSTALLED_APPS in settings: 'modules.{module}'")
117
+ click.echo(" 3. Run migrations: python manage.py migrate")
118
+ click.echo("\n💡 Note: This is a v0.62.0 placeholder. Full implementation coming soon!")
119
+
120
+ except GitError as e:
121
+ click.secho(f"❌ Git error: {e}", fg="red", err=True)
122
+ raise click.Abort()
123
+ except Exception as e:
124
+ click.secho(f"❌ Unexpected error: {e}", fg="red", err=True)
125
+ raise click.Abort()
126
+
127
+
128
+ @click.command()
129
+ @click.option(
130
+ "--no-preview",
131
+ is_flag=True,
132
+ help="Skip diff preview before updating",
133
+ )
134
+ def update(no_preview: bool) -> None:
135
+ r"""
136
+ Update all installed QuickScale modules to their latest versions.
137
+
138
+ \b
139
+ Examples:
140
+ quickscale update # Update with diff preview
141
+ quickscale update --no-preview # Update without preview
142
+
143
+ \b
144
+ This command:
145
+ - Reads installed modules from .quickscale/config.yml
146
+ - Updates ONLY modules you've explicitly installed
147
+ - Shows a diff preview before updating (unless --no-preview)
148
+ - Updates the installed version in config after successful update
149
+ """
150
+ try:
151
+ # Validate git repository
152
+ if not is_git_repo():
153
+ click.secho("❌ Error: Not a git repository", fg="red", err=True)
154
+ click.echo("\n💡 Tip: This command must be run from a git repository", err=True)
155
+ raise click.Abort()
156
+
157
+ # Check working directory is clean
158
+ if not is_working_directory_clean():
159
+ click.secho("❌ Error: Working directory has uncommitted changes", fg="red", err=True)
160
+ click.echo("\n💡 Tip: Commit or stash your changes before updating modules", err=True)
161
+ raise click.Abort()
162
+
163
+ # Load configuration
164
+ config = load_config()
165
+
166
+ if not config.modules:
167
+ click.secho("✅ No modules installed. Nothing to update.", fg="green")
168
+ click.echo("\n💡 Tip: Install modules with 'quickscale embed --module <name>'")
169
+ return
170
+
171
+ # Show installed modules
172
+ click.echo(f"📦 Found {len(config.modules)} installed module(s):")
173
+ for name, info in config.modules.items():
174
+ click.echo(f" - {name} ({info.installed_version})")
175
+
176
+ if not no_preview:
177
+ click.echo("\n🔍 Preview mode: Changes will be shown before updating")
178
+
179
+ # Confirm update
180
+ if not click.confirm("\n❓ Continue with update?"):
181
+ click.echo("❌ Update cancelled")
182
+ return
183
+
184
+ # Update each module
185
+ for name, info in config.modules.items():
186
+ click.echo(f"\n📥 Updating {name} module...")
187
+
188
+ try:
189
+ output = run_git_subtree_pull(
190
+ prefix=info.prefix,
191
+ remote=config.default_remote,
192
+ branch=info.branch,
193
+ squash=True,
194
+ )
195
+
196
+ # Update version in config
197
+ update_module_version(name, "v0.62.0") # Placeholder version
198
+
199
+ click.secho(f"✅ Updated {name} successfully", fg="green")
200
+
201
+ if output and not no_preview:
202
+ click.echo("\n📋 Changes summary:")
203
+ click.echo(output[:500]) # Show first 500 chars
204
+
205
+ except GitError as e:
206
+ click.secho(f"❌ Failed to update {name}: {e}", fg="red", err=True)
207
+ click.echo(f"💡 Tip: Check for conflicts in modules/{name}/", err=True)
208
+ continue
209
+
210
+ click.secho("\n🎉 Module update complete!", fg="green", bold=True)
211
+
212
+ except GitError as e:
213
+ click.secho(f"❌ Git error: {e}", fg="red", err=True)
214
+ raise click.Abort()
215
+ except Exception as e:
216
+ click.secho(f"❌ Unexpected error: {e}", fg="red", err=True)
217
+ raise click.Abort()
218
+
219
+
220
+ @click.command()
221
+ @click.option(
222
+ "--module",
223
+ required=True,
224
+ type=click.Choice(AVAILABLE_MODULES, case_sensitive=False),
225
+ help="Module name to push changes for",
226
+ )
227
+ @click.option(
228
+ "--branch",
229
+ help="Feature branch name (default: feature/<module>-improvements)",
230
+ )
231
+ @click.option(
232
+ "--remote",
233
+ default="https://github.com/Experto-AI/quickscale.git",
234
+ help="Git remote URL (default: QuickScale repository)",
235
+ )
236
+ def push(module: str, branch: str, remote: str) -> None:
237
+ r"""
238
+ Push your local module changes to a feature branch for contribution.
239
+
240
+ \b
241
+ Examples:
242
+ quickscale push --module auth
243
+ quickscale push --module auth --branch feature/fix-email-validation
244
+
245
+ \b
246
+ Workflow:
247
+ 1. This command pushes your changes to a feature branch
248
+ 2. You'll need to create a pull request manually on GitHub
249
+ 3. Maintainers review and merge to main branch
250
+ 4. Auto-split updates the module's split branch
251
+
252
+ \b
253
+ Note: You must have write access to the repository to push.
254
+ For external contributions, fork the repository first.
255
+ """
256
+ try:
257
+ # Validate git repository
258
+ if not is_git_repo():
259
+ click.secho("❌ Error: Not a git repository", fg="red", err=True)
260
+ raise click.Abort()
261
+
262
+ # Check if module is installed
263
+ config = load_config()
264
+ if module not in config.modules:
265
+ click.secho(f"❌ Error: Module '{module}' is not installed", fg="red", err=True)
266
+ click.echo(
267
+ f"\n💡 Tip: Install the module first with 'quickscale embed --module {module}'",
268
+ err=True,
269
+ )
270
+ raise click.Abort()
271
+
272
+ module_info = config.modules[module]
273
+
274
+ # Default branch name
275
+ if not branch:
276
+ branch = f"feature/{module}-improvements"
277
+
278
+ # Show what will be pushed
279
+ click.echo(f"📤 Preparing to push changes for module: {module}")
280
+ click.echo(f" Local prefix: {module_info.prefix}")
281
+ click.echo(f" Target branch: {branch}")
282
+ click.echo(f" Remote: {remote}")
283
+
284
+ # Confirm push
285
+ if not click.confirm("\n❓ Continue with push?"):
286
+ click.echo("❌ Push cancelled")
287
+ return
288
+
289
+ # Push subtree
290
+ click.echo(f"\n🚀 Pushing to {branch}...")
291
+ run_git_subtree_push(prefix=module_info.prefix, remote=remote, branch=branch)
292
+
293
+ # Success message
294
+ click.secho("\n✅ Changes pushed successfully!", fg="green", bold=True)
295
+ click.echo("\n📋 Next steps:")
296
+ click.echo(" 1. Create a pull request on GitHub:")
297
+ click.echo(f" https://github.com/Experto-AI/quickscale/pull/new/{branch}")
298
+ click.echo(" 2. Describe your changes and submit for review")
299
+ click.echo(" 3. After merge, the split branch will auto-update")
300
+
301
+ except GitError as e:
302
+ click.secho(f"❌ Git error: {e}", fg="red", err=True)
303
+ click.echo("\n💡 Tip: Make sure you have write access to the repository", err=True)
304
+ raise click.Abort()
305
+ except Exception as e:
306
+ click.secho(f"❌ Unexpected error: {e}", fg="red", err=True)
307
+ raise click.Abort()
@@ -8,13 +8,14 @@ import quickscale_cli
8
8
  import quickscale_core
9
9
  from quickscale_cli.commands.deployment_commands import deploy
10
10
  from quickscale_cli.commands.development_commands import down, logs, manage, ps, shell, up
11
+ from quickscale_cli.commands.module_commands import embed, push, update
11
12
  from quickscale_core.generator import ProjectGenerator
12
13
 
13
14
 
14
15
  class InitCommand(click.Command):
15
16
  """Custom init command with enhanced error messages."""
16
17
 
17
- def parse_args(self, ctx, args):
18
+ def parse_args(self, ctx: click.Context, args: list[str]) -> list[str]:
18
19
  """Override parse_args to provide better error messages."""
19
20
  try:
20
21
  return super().parse_args(ctx, args)
@@ -54,6 +55,11 @@ cli.add_command(ps)
54
55
  # Register deployment commands
55
56
  cli.add_command(deploy)
56
57
 
58
+ # Register module management commands
59
+ cli.add_command(embed)
60
+ cli.add_command(update)
61
+ cli.add_command(push)
62
+
57
63
 
58
64
  @cli.command(cls=InitCommand)
59
65
  @click.argument("project_name", required=True, metavar="PROJECT_NAME")
@@ -64,7 +70,7 @@ cli.add_command(deploy)
64
70
  help="Theme to use for the project (default: starter_html)",
65
71
  )
66
72
  def init(project_name: str, theme: str) -> None:
67
- """
73
+ r"""
68
74
  Generate a new Django project with production-ready configurations.
69
75
 
70
76
  \b
@@ -1,206 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: quickscale-cli
3
- Version: 0.61.0
4
- Summary: Command-line interface for QuickScale Django project generator
5
- Home-page: https://github.com/Experto-AI/quickscale
6
- License: Apache-2.0
7
- Keywords: django,cli,project-generator,saas
8
- Author: Experto AI
9
- Author-email: victor@experto.ai
10
- Requires-Python: >=3.10,<4.0
11
- Classifier: Development Status :: 3 - Alpha
12
- Classifier: Framework :: Django
13
- Classifier: Framework :: Django :: 4.2
14
- Classifier: Framework :: Django :: 5.0
15
- Classifier: Intended Audience :: Developers
16
- Classifier: License :: OSI Approved :: Apache Software License
17
- Classifier: Programming Language :: Python :: 3
18
- Classifier: Programming Language :: Python :: 3.10
19
- Classifier: Programming Language :: Python :: 3.11
20
- Classifier: Programming Language :: Python :: 3.12
21
- Requires-Dist: click (>=8.1.0,<9.0.0)
22
- Requires-Dist: quickscale-core (>=0.61.0,<0.62.0)
23
- Project-URL: Documentation, https://github.com/Experto-AI/quickscale/tree/main/docs
24
- Project-URL: Repository, https://github.com/Experto-AI/quickscale
25
- Description-Content-Type: text/markdown
26
-
27
- # 🚀 QuickScale
28
-
29
- <!--
30
- README.md - User-Focused Introduction
31
-
32
- PURPOSE: This file serves as the first contact point for users, developers, and evaluators visiting the QuickScale project.
33
-
34
- CONTENT GUIDELINES:
35
- - Keep content user-facing and accessible to newcomers
36
- - Focus on "what" and "how to get started" rather than "why" or technical details
37
- - Include quick examples and development workflows
38
- - Avoid deep architectural explanations (those belong in DECISIONS.md)
39
- - Avoid competitive analysis or strategic context (those belong in QUICKSCALE.md)
40
- - Maximum length: ~200 lines to ensure quick readability
41
- - Link to other documents for detailed information
42
-
43
- TARGET AUDIENCE: New users, potential adopters, GitHub visitors, developers evaluating QuickScale
44
- -->
45
-
46
- ---
47
-
48
- ## QuickScale: Compose your Django SaaS.
49
-
50
- QuickScale is a **composable Django framework** for building client SaaS applications. Start with a stable core, add reusable modules, customize themes, and deploy faster—while maintaining the flexibility to create commercial extensions and build a community ecosystem.
51
-
52
- ---
53
-
54
- ## What is QuickScale?
55
-
56
- QuickScale is a **Django project generator** that creates production-ready SaaS applications with one command. Designed for **solo developers and development agencies**, it gives you:
57
-
58
- - **Production-ready foundations**: Docker, PostgreSQL, testing, CI/CD, and security out-of-the-box
59
- - **One-command deployment**: Deploy to Railway with `quickscale deploy railway`
60
- - **Full ownership**: Generated projects are 100% yours to customize—no vendor lock-in
61
- - **Standardized stack**: Build multiple client projects faster with consistent best practices
62
-
63
- 🧭 **Future Vision**: QuickScale will evolve to support reusable modules and themes. Today it's a personal toolkit; tomorrow it becomes a community platform when demand emerges. [Read the full evolution strategy](./docs/overview/quickscale.md#evolution-strategy-personal-toolkit-first).
64
-
65
- ## Documentation Guide
66
-
67
- **Start here for your needs:**
68
- - 📖 **New user?** You're in the right place. This README shows you what QuickScale is and how to get started.
69
- - 🔧 **Need commands?** See [user_manual.md](./docs/technical/user_manual.md) for all commands and workflows
70
- - 🚀 **Deploying to Railway?** See [railway.md](./docs/deployment/railway.md) for Railway deployment guide
71
- - 📋 **Planning a feature?** Check [decisions.md](./docs/technical/decisions.md) for the authoritative MVP scope and technical rules
72
- - 🗓️ **Timeline & tasks?** See [roadmap.md](./docs/technical/roadmap.md)
73
- - 🏗️ **Project structure?** See [scaffolding.md](./docs/technical/scaffolding.md) for complete directory layouts
74
- - 🎯 **Why QuickScale?** See [quickscale.md](./docs/overview/quickscale.md) for competitive positioning
75
-
76
- **Quick Reference:**
77
- - **MVP** = Phase 1 (Personal Toolkit)
78
- - **Post-MVP** = Phase 2+ (Modules & Themes)
79
- - **Generated Project** = Output of `quickscale init`
80
-
81
- See [decisions.md - Glossary section](./docs/technical/decisions.md#document-responsibilities-short) for complete terminology and Single Source of Truth reference
82
-
83
-
84
- ### Primary Use Cases (MVP):
85
- - **Solo Developer**: Build client projects faster with production-ready foundations
86
- - **Development Agency**: Standardize your tech stack across client engagements
87
-
88
- ### Future Use Cases (Post-MVP):
89
- - **Commercial Extension Developer**: Create and sell premium modules/themes
90
- - **Open Source Contributor**: Extend the ecosystem with modules and themes
91
-
92
- ### Development Flow (MVP)
93
- 1. `quickscale init myapp`
94
- - Generates the minimal Django starter described in the MVP Feature Matrix
95
- - Ships with standalone `settings.py` by default; there is NO automatic settings inheritance. Advanced users who manually embed `quickscale_core` via git subtree may opt-in to inherit from `quickscale_core.settings` (see [decisions.md](./docs/technical/decisions.md#mvp-feature-matrix-authoritative)).
96
- - **Optional**: Embed `quickscale_core` via git subtree after generation; follow the [Personal Toolkit workflow](./docs/technical/decisions.md#integration-note-personal-toolkit-git-subtree) for canonical commands and helper roadmap
97
- 2. Add your custom Django apps and features
98
- 3. Adopt optional inheritance or module extraction patterns only when you embed the core; the rules and best practices stay centralized in `DECISIONS.md`
99
- 4. Build your unique client application
100
- 5. Deploy to Railway with `quickscale deploy railway` (or use standard Django deployment)
101
-
102
- ℹ️ QuickScale's MVP centers on the personal toolkit workflow. Extraction patterns, module packaging, and subtree helper command plans stay documented in `docs/technical/decisions.md` so this README can stay concise.
103
-
104
- 🔎 **Scope note**: The [MVP Feature Matrix](./docs/technical/decisions.md#mvp-feature-matrix-authoritative) is the single source of truth for what's in or out.
105
-
106
- ### What You Get
107
-
108
- Running `quickscale init myapp` generates a **production-ready Django project** with:
109
-
110
- - ✅ **Docker** setup (development + production)
111
- - ✅ **PostgreSQL** configuration
112
- - ✅ **Environment-based** settings (dev/prod split)
113
- - ✅ **Security** best practices (SECRET_KEY, ALLOWED_HOSTS, etc.)
114
- - ✅ **Testing** infrastructure (pytest + factory_boy)
115
- - ✅ **CI/CD** pipeline (GitHub Actions)
116
- - ✅ **Code quality** hooks (ruff format + ruff check)
117
- - ✅ **Poetry** for dependency management
118
- - ✅ **One-Command Deployment**: Deploy to Railway with `quickscale deploy railway` - fully automated setup
119
-
120
- **See the complete project structure:** [scaffolding.md - Generated Project Output](./docs/technical/scaffolding.md#5-generated-project-output)
121
-
122
- The generated project is **yours to own and modify** - no vendor lock-in, just Django best practices.
123
-
124
- ## Why QuickScale vs. Alternatives?
125
-
126
- ✅ **Faster than Cookiecutter** - One command vs. 30+ interactive prompts
127
- ✅ **More flexible than SaaS Pegasus** - Open source with full code ownership ($0 vs. $349+)
128
- ✅ **Simpler than building from scratch** - Production-ready in 5 minutes vs. days of setup
129
- ✅ **Railway deployment automation** - Competitors require manual platform configuration
130
-
131
- **QuickScale is a development accelerator**, not a complete solution. You start with production-ready foundations and build your unique client application on top.
132
-
133
- See [competitive_analysis.md](./docs/overview/competitive_analysis.md) for detailed comparison with SaaS Pegasus and Cookiecutter.
134
-
135
- ---
136
-
137
-
138
- ## Quick Start
139
-
140
- ```bash
141
- # Install QuickScale globally
142
- ./scripts/install_global.sh
143
-
144
- # Create your first project
145
- quickscale init myapp
146
- cd myapp
147
-
148
- # Or choose a specific theme (v0.61.0+)
149
- # quickscale init myapp --theme starter_html # Default HTML theme
150
- # quickscale init myapp --theme starter_htmx # HTMX theme (coming in v0.67.0)
151
- # quickscale init myapp --theme starter_react # React theme (coming in v0.68.0)
152
- ```
153
-
154
- **Choose your development workflow:**
155
-
156
- ### Option 1: Docker (Recommended for production parity)
157
-
158
- ```bash
159
- # Start all services (web + database)
160
- quickscale up
161
-
162
- # Run migrations
163
- quickscale manage migrate
164
-
165
- # Create superuser
166
- quickscale manage createsuperuser
167
-
168
- # View logs
169
- quickscale logs -f web
170
-
171
- # Open a shell in the container
172
- quickscale shell
173
-
174
- # Stop services
175
- quickscale down
176
- ```
177
-
178
- **Visit http://localhost:8000** - Your app is running in Docker with PostgreSQL!
179
-
180
- ### Option 2: Native Poetry (Simpler for quick testing)
181
-
182
- ```bash
183
- # Install dependencies
184
- poetry install
185
-
186
- # Run migrations
187
- poetry run python manage.py migrate
188
-
189
- # Start development server
190
- poetry run python manage.py runserver
191
- ```
192
-
193
- **Visit http://localhost:8000** - Your app is running natively!
194
-
195
- **For complete command reference and workflows**, see the [user_manual.md](./docs/technical/user_manual.md).
196
-
197
- ## Learn More
198
-
199
- - **[decisions.md](./docs/technical/decisions.md)** - Technical specifications and implementation rules
200
- - **[quickscale.md](./docs/overview/quickscale.md)** - Strategic vision and competitive positioning
201
- - **[competitive_analysis.md](./docs/overview/competitive_analysis.md)** - Comparison vs SaaS Pegasus and alternatives
202
- - **[roadmap.md](./docs/technical/roadmap.md)** - Development roadmap and implementation plan
203
- - **[user_manual.md](./docs/technical/user_manual.md)** - Commands and workflows
204
- - **[contributing.md](./docs/contrib/contributing.md)** - Development workflow and coding standards
205
-
206
-
@@ -1,179 +0,0 @@
1
- # 🚀 QuickScale
2
-
3
- <!--
4
- README.md - User-Focused Introduction
5
-
6
- PURPOSE: This file serves as the first contact point for users, developers, and evaluators visiting the QuickScale project.
7
-
8
- CONTENT GUIDELINES:
9
- - Keep content user-facing and accessible to newcomers
10
- - Focus on "what" and "how to get started" rather than "why" or technical details
11
- - Include quick examples and development workflows
12
- - Avoid deep architectural explanations (those belong in DECISIONS.md)
13
- - Avoid competitive analysis or strategic context (those belong in QUICKSCALE.md)
14
- - Maximum length: ~200 lines to ensure quick readability
15
- - Link to other documents for detailed information
16
-
17
- TARGET AUDIENCE: New users, potential adopters, GitHub visitors, developers evaluating QuickScale
18
- -->
19
-
20
- ---
21
-
22
- ## QuickScale: Compose your Django SaaS.
23
-
24
- QuickScale is a **composable Django framework** for building client SaaS applications. Start with a stable core, add reusable modules, customize themes, and deploy faster—while maintaining the flexibility to create commercial extensions and build a community ecosystem.
25
-
26
- ---
27
-
28
- ## What is QuickScale?
29
-
30
- QuickScale is a **Django project generator** that creates production-ready SaaS applications with one command. Designed for **solo developers and development agencies**, it gives you:
31
-
32
- - **Production-ready foundations**: Docker, PostgreSQL, testing, CI/CD, and security out-of-the-box
33
- - **One-command deployment**: Deploy to Railway with `quickscale deploy railway`
34
- - **Full ownership**: Generated projects are 100% yours to customize—no vendor lock-in
35
- - **Standardized stack**: Build multiple client projects faster with consistent best practices
36
-
37
- 🧭 **Future Vision**: QuickScale will evolve to support reusable modules and themes. Today it's a personal toolkit; tomorrow it becomes a community platform when demand emerges. [Read the full evolution strategy](./docs/overview/quickscale.md#evolution-strategy-personal-toolkit-first).
38
-
39
- ## Documentation Guide
40
-
41
- **Start here for your needs:**
42
- - 📖 **New user?** You're in the right place. This README shows you what QuickScale is and how to get started.
43
- - 🔧 **Need commands?** See [user_manual.md](./docs/technical/user_manual.md) for all commands and workflows
44
- - 🚀 **Deploying to Railway?** See [railway.md](./docs/deployment/railway.md) for Railway deployment guide
45
- - 📋 **Planning a feature?** Check [decisions.md](./docs/technical/decisions.md) for the authoritative MVP scope and technical rules
46
- - 🗓️ **Timeline & tasks?** See [roadmap.md](./docs/technical/roadmap.md)
47
- - 🏗️ **Project structure?** See [scaffolding.md](./docs/technical/scaffolding.md) for complete directory layouts
48
- - 🎯 **Why QuickScale?** See [quickscale.md](./docs/overview/quickscale.md) for competitive positioning
49
-
50
- **Quick Reference:**
51
- - **MVP** = Phase 1 (Personal Toolkit)
52
- - **Post-MVP** = Phase 2+ (Modules & Themes)
53
- - **Generated Project** = Output of `quickscale init`
54
-
55
- See [decisions.md - Glossary section](./docs/technical/decisions.md#document-responsibilities-short) for complete terminology and Single Source of Truth reference
56
-
57
-
58
- ### Primary Use Cases (MVP):
59
- - **Solo Developer**: Build client projects faster with production-ready foundations
60
- - **Development Agency**: Standardize your tech stack across client engagements
61
-
62
- ### Future Use Cases (Post-MVP):
63
- - **Commercial Extension Developer**: Create and sell premium modules/themes
64
- - **Open Source Contributor**: Extend the ecosystem with modules and themes
65
-
66
- ### Development Flow (MVP)
67
- 1. `quickscale init myapp`
68
- - Generates the minimal Django starter described in the MVP Feature Matrix
69
- - Ships with standalone `settings.py` by default; there is NO automatic settings inheritance. Advanced users who manually embed `quickscale_core` via git subtree may opt-in to inherit from `quickscale_core.settings` (see [decisions.md](./docs/technical/decisions.md#mvp-feature-matrix-authoritative)).
70
- - **Optional**: Embed `quickscale_core` via git subtree after generation; follow the [Personal Toolkit workflow](./docs/technical/decisions.md#integration-note-personal-toolkit-git-subtree) for canonical commands and helper roadmap
71
- 2. Add your custom Django apps and features
72
- 3. Adopt optional inheritance or module extraction patterns only when you embed the core; the rules and best practices stay centralized in `DECISIONS.md`
73
- 4. Build your unique client application
74
- 5. Deploy to Railway with `quickscale deploy railway` (or use standard Django deployment)
75
-
76
- ℹ️ QuickScale's MVP centers on the personal toolkit workflow. Extraction patterns, module packaging, and subtree helper command plans stay documented in `docs/technical/decisions.md` so this README can stay concise.
77
-
78
- 🔎 **Scope note**: The [MVP Feature Matrix](./docs/technical/decisions.md#mvp-feature-matrix-authoritative) is the single source of truth for what's in or out.
79
-
80
- ### What You Get
81
-
82
- Running `quickscale init myapp` generates a **production-ready Django project** with:
83
-
84
- - ✅ **Docker** setup (development + production)
85
- - ✅ **PostgreSQL** configuration
86
- - ✅ **Environment-based** settings (dev/prod split)
87
- - ✅ **Security** best practices (SECRET_KEY, ALLOWED_HOSTS, etc.)
88
- - ✅ **Testing** infrastructure (pytest + factory_boy)
89
- - ✅ **CI/CD** pipeline (GitHub Actions)
90
- - ✅ **Code quality** hooks (ruff format + ruff check)
91
- - ✅ **Poetry** for dependency management
92
- - ✅ **One-Command Deployment**: Deploy to Railway with `quickscale deploy railway` - fully automated setup
93
-
94
- **See the complete project structure:** [scaffolding.md - Generated Project Output](./docs/technical/scaffolding.md#5-generated-project-output)
95
-
96
- The generated project is **yours to own and modify** - no vendor lock-in, just Django best practices.
97
-
98
- ## Why QuickScale vs. Alternatives?
99
-
100
- ✅ **Faster than Cookiecutter** - One command vs. 30+ interactive prompts
101
- ✅ **More flexible than SaaS Pegasus** - Open source with full code ownership ($0 vs. $349+)
102
- ✅ **Simpler than building from scratch** - Production-ready in 5 minutes vs. days of setup
103
- ✅ **Railway deployment automation** - Competitors require manual platform configuration
104
-
105
- **QuickScale is a development accelerator**, not a complete solution. You start with production-ready foundations and build your unique client application on top.
106
-
107
- See [competitive_analysis.md](./docs/overview/competitive_analysis.md) for detailed comparison with SaaS Pegasus and Cookiecutter.
108
-
109
- ---
110
-
111
-
112
- ## Quick Start
113
-
114
- ```bash
115
- # Install QuickScale globally
116
- ./scripts/install_global.sh
117
-
118
- # Create your first project
119
- quickscale init myapp
120
- cd myapp
121
-
122
- # Or choose a specific theme (v0.61.0+)
123
- # quickscale init myapp --theme starter_html # Default HTML theme
124
- # quickscale init myapp --theme starter_htmx # HTMX theme (coming in v0.67.0)
125
- # quickscale init myapp --theme starter_react # React theme (coming in v0.68.0)
126
- ```
127
-
128
- **Choose your development workflow:**
129
-
130
- ### Option 1: Docker (Recommended for production parity)
131
-
132
- ```bash
133
- # Start all services (web + database)
134
- quickscale up
135
-
136
- # Run migrations
137
- quickscale manage migrate
138
-
139
- # Create superuser
140
- quickscale manage createsuperuser
141
-
142
- # View logs
143
- quickscale logs -f web
144
-
145
- # Open a shell in the container
146
- quickscale shell
147
-
148
- # Stop services
149
- quickscale down
150
- ```
151
-
152
- **Visit http://localhost:8000** - Your app is running in Docker with PostgreSQL!
153
-
154
- ### Option 2: Native Poetry (Simpler for quick testing)
155
-
156
- ```bash
157
- # Install dependencies
158
- poetry install
159
-
160
- # Run migrations
161
- poetry run python manage.py migrate
162
-
163
- # Start development server
164
- poetry run python manage.py runserver
165
- ```
166
-
167
- **Visit http://localhost:8000** - Your app is running natively!
168
-
169
- **For complete command reference and workflows**, see the [user_manual.md](./docs/technical/user_manual.md).
170
-
171
- ## Learn More
172
-
173
- - **[decisions.md](./docs/technical/decisions.md)** - Technical specifications and implementation rules
174
- - **[quickscale.md](./docs/overview/quickscale.md)** - Strategic vision and competitive positioning
175
- - **[competitive_analysis.md](./docs/overview/competitive_analysis.md)** - Comparison vs SaaS Pegasus and alternatives
176
- - **[roadmap.md](./docs/technical/roadmap.md)** - Development roadmap and implementation plan
177
- - **[user_manual.md](./docs/technical/user_manual.md)** - Commands and workflows
178
- - **[contributing.md](./docs/contrib/contributing.md)** - Development workflow and coding standards
179
-