@dedesfr/prompter 0.9.0 → 1.0.0
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.
- package/CHANGELOG.md +21 -0
- package/README.md +105 -77
- package/dist/cli/index.js +25 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +32 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +56 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +4 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +14 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +18 -5
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/whoami.d.ts +4 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +42 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/auth-store.d.ts +10 -0
- package/dist/core/auth-store.d.ts.map +1 -0
- package/dist/core/auth-store.js +39 -0
- package/dist/core/auth-store.js.map +1 -0
- package/dist/core/registry.d.ts +18 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +94 -0
- package/dist/core/registry.js.map +1 -0
- package/package.json +7 -1
- package/AGENTS.md +0 -123
- package/CLAUDE.md +0 -17
- package/build.js +0 -20
- package/convex-setup.md +0 -403
- package/prompt/ai-humanizer.md +0 -45
- package/prompt/api-contract-generator.md +0 -234
- package/prompt/apply.md +0 -17
- package/prompt/archive.md +0 -21
- package/prompt/design-system.md +0 -210
- package/prompt/document-explainer.md +0 -149
- package/prompt/epic-generator.md +0 -198
- package/prompt/epic-single.md +0 -47
- package/prompt/erd-generator.md +0 -130
- package/prompt/fsd-generator.md +0 -157
- package/prompt/prd-agent-generator.md +0 -147
- package/prompt/prd-generator.md +0 -195
- package/prompt/product-brief.md +0 -289
- package/prompt/proposal.md +0 -22
- package/prompt/qa-test-scenario.md +0 -133
- package/prompt/skill-creator.md +0 -350
- package/prompt/story-generator.md +0 -278
- package/prompt/story-single.md +0 -70
- package/prompt/tdd-generator.md +0 -294
- package/prompt/tdd-lite-generator.md +0 -224
- package/prompt/wireframe-generator.md +0 -219
- package/skills/ai-context-generator/SKILL.md +0 -54
- package/skills/ai-context-generator/references/AGENTS.template.md +0 -83
- package/skills/ai-context-generator/references/CLAUDE.template.md +0 -39
- package/skills/ai-context-generator/references/behavioral-guidelines.md +0 -71
- package/skills/ai-context-generator/references/discovery-checklist.md +0 -40
- package/skills/ai-context-generator/references/examples/AGENTS.good.md +0 -103
- package/skills/ai-context-generator/references/extraction-checklist.md +0 -23
- package/skills/ai-context-generator/references/overlays/laravel.md +0 -44
- package/skills/ai-humanizer/SKILL.md +0 -50
- package/skills/api-contract-generator/SKILL.md +0 -243
- package/skills/apply/SKILL.md +0 -23
- package/skills/archive/SKILL.md +0 -27
- package/skills/cerebro/SKILL.md +0 -187
- package/skills/cerebro/references/agents.md +0 -213
- package/skills/code-review/SKILL.md +0 -373
- package/skills/code-review/assets/report-template-agent.md +0 -212
- package/skills/code-review/assets/report-template-compact.md +0 -81
- package/skills/code-review/assets/report-template-full.md +0 -264
- package/skills/code-review/assets/report-template-human.md +0 -168
- package/skills/code-review/references/universal-patterns.md +0 -495
- package/skills/design-md/README.md +0 -34
- package/skills/design-md/SKILL.md +0 -172
- package/skills/design-md/examples/DESIGN.md +0 -154
- package/skills/design-system/SKILL.md +0 -216
- package/skills/design-system-generator/SKILL.md +0 -324
- package/skills/design-system-generator/assets/design-system-template.md +0 -348
- package/skills/design-system-generator/references/extraction-patterns.md +0 -321
- package/skills/doc-builder/SKILL.md +0 -115
- package/skills/doc-builder/references/ui-patterns.md +0 -394
- package/skills/document-explainer/SKILL.md +0 -155
- package/skills/document-translator/SKILL.md +0 -58
- package/skills/enhance/SKILL.md +0 -47
- package/skills/enhance-prompt/README.md +0 -34
- package/skills/enhance-prompt/SKILL.md +0 -204
- package/skills/enhance-prompt/references/KEYWORDS.md +0 -114
- package/skills/epic-generator/SKILL.md +0 -204
- package/skills/epic-single/SKILL.md +0 -63
- package/skills/erd-generator/SKILL.md +0 -138
- package/skills/feature-planner/SKILL.md +0 -305
- package/skills/feature-planner/assets/implementation-plan-template.md +0 -85
- package/skills/frontend-design/LICENSE.txt +0 -177
- package/skills/frontend-design/SKILL.md +0 -42
- package/skills/fsd-generator/SKILL.md +0 -163
- package/skills/gamma-builder/SKILL.md +0 -134
- package/skills/laravel-code-review/SKILL.md +0 -383
- package/skills/laravel-code-review/assets/report-template-agent.md +0 -195
- package/skills/laravel-code-review/assets/report-template-compact.md +0 -79
- package/skills/laravel-code-review/assets/report-template-full.md +0 -253
- package/skills/laravel-code-review/assets/report-template-human.md +0 -159
- package/skills/laravel-code-review/references/laravel-patterns.md +0 -571
- package/skills/laravel-code-review/references/php84-features.md +0 -442
- package/skills/mcp-builder/LICENSE.txt +0 -202
- package/skills/mcp-builder/SKILL.md +0 -236
- package/skills/mcp-builder/reference/evaluation.md +0 -602
- package/skills/mcp-builder/reference/mcp_best_practices.md +0 -249
- package/skills/mcp-builder/reference/node_mcp_server.md +0 -970
- package/skills/mcp-builder/reference/python_mcp_server.md +0 -719
- package/skills/mcp-builder/scripts/connections.py +0 -151
- package/skills/mcp-builder/scripts/evaluation.py +0 -373
- package/skills/mcp-builder/scripts/example_evaluation.xml +0 -22
- package/skills/mcp-builder/scripts/requirements.txt +0 -2
- package/skills/meeting-notes/SKILL.md +0 -159
- package/skills/meeting-notes/evals/evals.json +0 -23
- package/skills/prd-agent-generator/SKILL.md +0 -132
- package/skills/prd-generator/SKILL.md +0 -211
- package/skills/product-brief/SKILL.md +0 -141
- package/skills/project-orchestrator/SKILL.md +0 -487
- package/skills/project-orchestrator/assets/caddy-vps-setup.md +0 -180
- package/skills/project-orchestrator/assets/plan-summary-template.md +0 -159
- package/skills/prompter-specs/SKILL.md +0 -115
- package/skills/prompter-workflow/SKILL.md +0 -166
- package/skills/prompter-workflow/evals/evals.json +0 -89
- package/skills/proposal/SKILL.md +0 -28
- package/skills/qa-test-scenario/SKILL.md +0 -149
- package/skills/skill-creator/SKILL.md +0 -173
- package/skills/sph-generator/SKILL.md +0 -488
- package/skills/story-generator/SKILL.md +0 -285
- package/skills/story-single/SKILL.md +0 -86
- package/skills/tdd-generator/SKILL.md +0 -300
- package/skills/tdd-lite-generator/SKILL.md +0 -230
- package/skills/ui-ux-pro/SKILL.md +0 -199
- package/skills/ui-ux-pro/assets/design-spec-template.md +0 -173
- package/skills/ui-ux-pro/references/component-patterns.md +0 -255
- package/skills/ui-ux-pro/references/design-principles.md +0 -167
- package/skills/wireframe-generator/SKILL.md +0 -227
- package/src/cli/index.ts +0 -223
- package/src/commands/archive.ts +0 -302
- package/src/commands/change.ts +0 -292
- package/src/commands/config.ts +0 -233
- package/src/commands/guide.ts +0 -50
- package/src/commands/init.ts +0 -597
- package/src/commands/list.ts +0 -194
- package/src/commands/show.ts +0 -138
- package/src/commands/spec.ts +0 -251
- package/src/commands/update.ts +0 -129
- package/src/commands/upgrade.ts +0 -30
- package/src/commands/validate.ts +0 -326
- package/src/core/artifact-graph/graph.ts +0 -167
- package/src/core/artifact-graph/index.ts +0 -44
- package/src/core/artifact-graph/instruction-loader.ts +0 -302
- package/src/core/artifact-graph/resolver.ts +0 -226
- package/src/core/artifact-graph/schema.ts +0 -124
- package/src/core/artifact-graph/state.ts +0 -64
- package/src/core/artifact-graph/types.ts +0 -65
- package/src/core/completions/command-registry.ts +0 -382
- package/src/core/completions/completion-provider.ts +0 -128
- package/src/core/completions/generators/bash-generator.ts +0 -191
- package/src/core/completions/generators/fish-generator.ts +0 -188
- package/src/core/completions/generators/powershell-generator.ts +0 -223
- package/src/core/completions/generators/zsh-generator.ts +0 -281
- package/src/core/completions/templates/bash-templates.ts +0 -24
- package/src/core/completions/templates/fish-templates.ts +0 -40
- package/src/core/completions/templates/powershell-templates.ts +0 -25
- package/src/core/completions/templates/zsh-templates.ts +0 -36
- package/src/core/completions/types.ts +0 -90
- package/src/core/config-schema.ts +0 -230
- package/src/core/config.ts +0 -181
- package/src/core/configurators/slash/antigravity.ts +0 -10
- package/src/core/configurators/slash/base.ts +0 -109
- package/src/core/configurators/slash/claude.ts +0 -10
- package/src/core/configurators/slash/codex.ts +0 -10
- package/src/core/configurators/slash/droid.ts +0 -10
- package/src/core/configurators/slash/forge.ts +0 -10
- package/src/core/configurators/slash/github-copilot.ts +0 -10
- package/src/core/configurators/slash/index.ts +0 -10
- package/src/core/configurators/slash/kilocode.ts +0 -10
- package/src/core/configurators/slash/opencode.ts +0 -10
- package/src/core/configurators/slash/registry.ts +0 -51
- package/src/core/converters/json-converter.ts +0 -62
- package/src/core/global-config.ts +0 -136
- package/src/core/parsers/change-parser.ts +0 -234
- package/src/core/parsers/markdown-parser.ts +0 -237
- package/src/core/parsers/requirement-blocks.ts +0 -234
- package/src/core/prompt-templates.ts +0 -3504
- package/src/core/schemas/base.schema.ts +0 -20
- package/src/core/schemas/change.schema.ts +0 -42
- package/src/core/schemas/index.ts +0 -20
- package/src/core/schemas/spec.schema.ts +0 -17
- package/src/core/skill-discovery.ts +0 -68
- package/src/core/specs-apply.ts +0 -483
- package/src/core/styles/palette.ts +0 -8
- package/src/core/templates/agents-template.ts +0 -459
- package/src/core/templates/claude-template.ts +0 -2
- package/src/core/templates/index.ts +0 -3
- package/src/core/templates/project-template.ts +0 -32
- package/src/core/validation/constants.ts +0 -48
- package/src/core/validation/types.ts +0 -19
- package/src/core/validation/validator.ts +0 -449
- package/src/core/view.ts +0 -219
- package/src/index.ts +0 -1
- package/src/utils/change-metadata.ts +0 -171
- package/src/utils/change-utils.ts +0 -131
- package/src/utils/file-system.ts +0 -252
- package/src/utils/index.ts +0 -12
- package/src/utils/interactive.ts +0 -29
- package/src/utils/item-discovery.ts +0 -66
- package/src/utils/match.ts +0 -26
- package/src/utils/shell-detection.ts +0 -62
- package/src/utils/task-progress.ts +0 -43
- package/tsconfig.json +0 -28
|
@@ -1,487 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: project-orchestrator
|
|
3
|
-
description: Interview users to define and verify a software project plan through a structured conversation. Collects project description, MVP scope, user roles, features, tech stack, integrations, and deployment preferences. Asks minimal clarifying questions grouped logically, provides tailored recommendations after each answer, and produces a verified project plan summary. Use when a user wants to plan a new software project, define MVP scope, choose a tech stack, or create a project brief.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Project Orchestrator
|
|
7
|
-
|
|
8
|
-
Interview the user to define a verified software project plan. Guide them through scope, features, tech stack, and deployment with minimal, focused questions. Provide a recommendation after every answer.
|
|
9
|
-
|
|
10
|
-
## Quick Start
|
|
11
|
-
|
|
12
|
-
1. **COLLECT** -- Ask for project description + top 3 MVP features
|
|
13
|
-
2. **VERIFY** -- Walk through scope, roles, data, integrations, non-functional needs
|
|
14
|
-
3. **SELECT STACK** -- Present bundled stack options, resolve sub-choices
|
|
15
|
-
4. **CONFIGURE** -- Docker preference, deployment, environments
|
|
16
|
-
5. **SUMMARIZE** -- Output the verified plan using the final summary template
|
|
17
|
-
6. **CONFIRM** -- Ask the user to approve or correct the plan
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Before You Begin (REQUIRED)
|
|
22
|
-
|
|
23
|
-
Before starting the interview, **always read `prompter/AGENTS.md`** and follow its instructions. This ensures the final output is structured as a proper spec that integrates with the Prompter workflow.
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Interactive Terminal Tool (REQUIRED)
|
|
28
|
-
|
|
29
|
-
Use the `AskUserQuestion` tool for **every question** in the interview. This renders an interactive UI in the terminal instead of plain text, making it easier for the user to respond.
|
|
30
|
-
|
|
31
|
-
### How to Use AskUserQuestion
|
|
32
|
-
|
|
33
|
-
- **Single-choice questions**: Set `multiSelect: false`. Use for mutually exclusive picks (e.g., stack selection, database choice, Docker yes/no).
|
|
34
|
-
- **Multi-choice questions**: Set `multiSelect: true`. Use for checklists (e.g., integrations, roles, features).
|
|
35
|
-
- **Keep options concise**: Labels should be 1–5 words. Add detail in the `description` field.
|
|
36
|
-
- **Always include an "Unsure" option** when the user may not know. Handle it by recommending a default.
|
|
37
|
-
- **Group related sub-choices** into one `AskUserQuestion` call with multiple `questions` when they are always asked together and order doesn't matter.
|
|
38
|
-
|
|
39
|
-
### Example: Stack Selection
|
|
40
|
-
|
|
41
|
-
```json
|
|
42
|
-
{
|
|
43
|
-
"questions": [
|
|
44
|
-
{
|
|
45
|
-
"question": "Which tech stack bundle fits your project best?",
|
|
46
|
-
"header": "Stack",
|
|
47
|
-
"multiSelect": false,
|
|
48
|
-
"options": [
|
|
49
|
-
{ "label": "JS/TS Full-Stack", "description": "React or Next.js + Drizzle + Express or NestJS + PostgreSQL/MySQL" },
|
|
50
|
-
{ "label": "React + Convex", "description": "React (Vite or Next.js) + Convex (real-time backend + built-in DB)" },
|
|
51
|
-
{ "label": "Laravel Classic", "description": "Laravel + Blade + Tailwind + PostgreSQL/MySQL" },
|
|
52
|
-
{ "label": "Laravel + React", "description": "Laravel + Inertia.js (React) + PostgreSQL/MySQL" },
|
|
53
|
-
{ "label": "Laravel + Filament", "description": "Laravel + Filament (admin panel & CRUD) + Tailwind + PostgreSQL/MySQL" },
|
|
54
|
-
{ "label": "Unsure", "description": "I'll recommend based on your project needs" }
|
|
55
|
-
]
|
|
56
|
-
}
|
|
57
|
-
]
|
|
58
|
-
}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Example: Integrations Checklist
|
|
62
|
-
|
|
63
|
-
```json
|
|
64
|
-
{
|
|
65
|
-
"questions": [
|
|
66
|
-
{
|
|
67
|
-
"question": "Which integrations or capabilities does your MVP need?",
|
|
68
|
-
"header": "Integrations",
|
|
69
|
-
"multiSelect": true,
|
|
70
|
-
"options": [
|
|
71
|
-
{ "label": "Caching", "description": "e.g., Redis for fast data access" },
|
|
72
|
-
{ "label": "Queues / Jobs", "description": "e.g., sending emails, processing uploads" },
|
|
73
|
-
{ "label": "Real-Time", "description": "e.g., live chat, notifications, WebSockets" },
|
|
74
|
-
{ "label": "File Storage", "description": "e.g., S3, local uploads" }
|
|
75
|
-
]
|
|
76
|
-
}
|
|
77
|
-
]
|
|
78
|
-
}
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## Core Rules
|
|
84
|
-
|
|
85
|
-
- Use `AskUserQuestion` for every question -- never ask interview questions as plain text.
|
|
86
|
-
- Ask one question or one small grouped set at a time. Never overwhelm.
|
|
87
|
-
- After every answer (or group), provide a short recommendation tailored to what the user said.
|
|
88
|
-
- Use plain language. Only introduce jargon if the user shows technical comfort.
|
|
89
|
-
- If the user says "unsure", recommend a pragmatic default and explain briefly.
|
|
90
|
-
- Keep optional topics gated -- only go deeper if the user says yes or unsure.
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## Project Setup Commands (PRIORITY)
|
|
95
|
-
|
|
96
|
-
Always use these exact commands when scaffolding projects. Include the correct command in the final summary's "Recommended Next Steps" based on the chosen stack.
|
|
97
|
-
|
|
98
|
-
| Technology | Command |
|
|
99
|
-
|------------|---------|
|
|
100
|
-
| React (Vite) | `npm create vite@latest` |
|
|
101
|
-
| Next.js | `npx create-next-app@latest {project_name} --yes` |
|
|
102
|
-
| Express | `npm install express --save` |
|
|
103
|
-
| NestJS | `npm i -g @nestjs/cli && nest new {project_name}` |
|
|
104
|
-
| Laravel 12 | `composer create-project laravel/laravel:^12.0 {project_name}` |
|
|
105
|
-
| Filament | `composer require filament/filament && php artisan filament:install --panels` |
|
|
106
|
-
| React + Convex | `npm create convex@latest` |
|
|
107
|
-
|
|
108
|
-
**Rules:**
|
|
109
|
-
- Always include the matching setup command(s) as the first recommended next step in the final plan.
|
|
110
|
-
- For Bundle 1 (JS/TS Full-Stack): include the frontend command (React via Vite or Next.js) AND the backend command (Express or NestJS).
|
|
111
|
-
- For Bundle 2 (React + Convex): include only `npm create convex@latest` -- it scaffolds both the React frontend and Convex backend in one step.
|
|
112
|
-
- For Bundles 3 and 4 (Laravel): include only the Laravel command -- Blade, Inertia, and Tailwind are configured within the Laravel project.
|
|
113
|
-
- For Bundle 5 (Laravel + Filament): include the Laravel command first, then the Filament install command (`composer require filament/filament && php artisan filament:install --panels`).
|
|
114
|
-
- Never invent or substitute alternative installation commands. Use these exactly as shown.
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Step 1: Project Description (REQUIRED)
|
|
119
|
-
|
|
120
|
-
Open with:
|
|
121
|
-
|
|
122
|
-
```
|
|
123
|
-
Let's define your project. To start, tell me:
|
|
124
|
-
|
|
125
|
-
1. What problem does your project solve, and who is it for?
|
|
126
|
-
2. What is the desired outcome (e.g., a web app, mobile app, SaaS platform)?
|
|
127
|
-
3. What are your top 3 MVP features -- the minimum needed to launch?
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
Wait for the user's response. Summarize what you understood and give a brief recommendation (e.g., "This sounds like a good fit for a standard web app with auth and a dashboard. Let's verify the details.").
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Step 2: MVP Scope Confirmation
|
|
135
|
-
|
|
136
|
-
Based on the user's description, present a draft scope:
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
Here's what I'd put in scope for the MVP:
|
|
140
|
-
|
|
141
|
-
**In scope:**
|
|
142
|
-
- [feature 1]
|
|
143
|
-
- [feature 2]
|
|
144
|
-
- [feature 3]
|
|
145
|
-
|
|
146
|
-
**Out of scope (for later):**
|
|
147
|
-
- [deferred item 1]
|
|
148
|
-
- [deferred item 2]
|
|
149
|
-
|
|
150
|
-
Does this match your expectations? Anything to add or move?
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
Recommendation: Briefly explain why you deferred certain items (e.g., "Reporting dashboards add complexity -- better to ship core functionality first and add analytics in v2.").
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## Step 3: Users & Roles
|
|
158
|
-
|
|
159
|
-
Ask:
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
Who will use this application? For example:
|
|
163
|
-
- Public visitors (unauthenticated)
|
|
164
|
-
- Registered users
|
|
165
|
-
- Admins
|
|
166
|
-
- Other roles (e.g., moderators, vendors, managers)
|
|
167
|
-
|
|
168
|
-
Which roles does the MVP need?
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
Recommendation: Suggest a minimal role set (e.g., "For MVP, I'd recommend just User + Admin. You can add granular roles later without rearchitecting.").
|
|
172
|
-
|
|
173
|
-
---
|
|
174
|
-
|
|
175
|
-
## Step 4: Data & Content Types
|
|
176
|
-
|
|
177
|
-
Ask:
|
|
178
|
-
|
|
179
|
-
```
|
|
180
|
-
What are the main things your app manages? For example:
|
|
181
|
-
- Users / profiles
|
|
182
|
-
- Products / listings
|
|
183
|
-
- Orders / bookings
|
|
184
|
-
- Posts / articles
|
|
185
|
-
- Messages / notifications
|
|
186
|
-
|
|
187
|
-
List the key entities your MVP needs to store and manage.
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
Recommendation: Sketch a quick high-level data model (e.g., "So we'd have Users, Products, and Orders as core entities, with Orders linking Users to Products.").
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## Step 5: Integrations & Optional Capabilities
|
|
195
|
-
|
|
196
|
-
Present optional topics as a checklist. Do NOT deep-dive unless the user says yes or unsure.
|
|
197
|
-
|
|
198
|
-
```
|
|
199
|
-
Do you need any of the following? (Yes / No / Unsure for each)
|
|
200
|
-
|
|
201
|
-
1. Caching (e.g., Redis for fast data access)
|
|
202
|
-
2. Queues / background jobs (e.g., sending emails, processing uploads)
|
|
203
|
-
3. Real-time features (e.g., live chat, notifications, WebSockets)
|
|
204
|
-
4. Full-text search (e.g., Elasticsearch, Algolia, Meilisearch)
|
|
205
|
-
5. File storage / uploads (e.g., S3, local storage)
|
|
206
|
-
6. Email or SMS notifications
|
|
207
|
-
7. Analytics / event tracking
|
|
208
|
-
8. Payments (e.g., Stripe, PayPal)
|
|
209
|
-
9. Third-party integrations (e.g., social login, maps, calendar)
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
For each "yes" or "unsure":
|
|
213
|
-
- Ask which service they prefer (or recommend one).
|
|
214
|
-
- Give a 1-2 sentence recommendation (e.g., "For queues, Redis with a simple job runner is the easiest starting point. You can scale to dedicated queue services later.").
|
|
215
|
-
|
|
216
|
-
For each "no": Move on. Don't push.
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
## Step 6: Non-Functional Requirements
|
|
221
|
-
|
|
222
|
-
Ask as a grouped set:
|
|
223
|
-
|
|
224
|
-
```
|
|
225
|
-
A few quick questions about non-functional needs:
|
|
226
|
-
|
|
227
|
-
1. **Security**: Any specific requirements beyond standard auth? (e.g., 2FA, encryption at rest, compliance like GDPR/HIPAA)
|
|
228
|
-
2. **Performance**: Expected traffic volume? (e.g., <1k users, 1k-10k, 10k+)
|
|
229
|
-
3. **SEO**: Does this app need to rank in search engines? (important for stack choice)
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
Recommendation: Tailor to their answers (e.g., "With SEO needs, server-side rendering will matter -- that'll influence our stack choice next." or "At <1k users, you won't need to worry about caching or CDN right away.").
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## Step 7: Tech Stack Selection (REQUIRED)
|
|
237
|
-
|
|
238
|
-
Present exactly these bundled options:
|
|
239
|
-
|
|
240
|
-
```
|
|
241
|
-
Let's pick your tech stack. Here are four proven bundles:
|
|
242
|
-
|
|
243
|
-
1. **JS/TS Full-Stack**: React or Next.js + Drizzle ORM + Express or NestJS + MySQL or PostgreSQL
|
|
244
|
-
2. **React + Convex**: React (Vite or Next.js) + Convex (real-time backend + built-in document DB, no SQL setup needed)
|
|
245
|
-
3. **Laravel Classic**: Laravel + Blade + Tailwind CSS + MySQL or PostgreSQL
|
|
246
|
-
4. **Laravel + React**: Laravel + Inertia.js (React) + MySQL or PostgreSQL
|
|
247
|
-
5. **Laravel + Filament**: Laravel + Filament (admin panel & CRUD generator) + Tailwind CSS + MySQL or PostgreSQL
|
|
248
|
-
|
|
249
|
-
Which bundle fits your project best? (Pick 1-5, or say "unsure")
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
If unsure: Recommend based on what you've learned (e.g., "Since you need SEO and prefer a simpler setup, I'd go with Laravel Classic -- it's fast to build, great for server-rendered pages, and has excellent built-in tooling." Or "If you want real-time features out of the box with minimal backend setup, React + Convex is a great choice." Or "If your app is primarily an admin panel, back-office tool, or data management system, Laravel + Filament gives you a complete CRUD interface with minimal custom frontend work.").
|
|
253
|
-
|
|
254
|
-
### Sub-Choices
|
|
255
|
-
|
|
256
|
-
After the user picks a bundle, ask ONLY the necessary sub-choices:
|
|
257
|
-
|
|
258
|
-
**Bundle 1 sub-choices:**
|
|
259
|
-
- Next.js vs React SPA? (Recommend Next.js if SEO matters or if they want SSR; React SPA if it's a dashboard/internal tool)
|
|
260
|
-
- Express vs NestJS? (Recommend Express for simplicity and speed; NestJS if they want structure and the app is complex)
|
|
261
|
-
- MySQL vs PostgreSQL? (Recommend PostgreSQL as the default -- richer features, JSON support, better for most new projects. Recommend MySQL if team is already familiar or hosting is MySQL-only)
|
|
262
|
-
|
|
263
|
-
**Bundle 2 sub-choices:**
|
|
264
|
-
- Next.js vs React (Vite)? (Recommend Next.js if SEO matters; Vite if it's a dashboard or real-time app where SSR isn't needed)
|
|
265
|
-
- No database sub-choice needed -- Convex includes a built-in document database with real-time sync.
|
|
266
|
-
- **Convex hosting**: Convex Cloud (managed, easiest) vs Self-Hosted (Docker, full control)? (Recommend Convex Cloud for most projects -- zero infrastructure overhead. Recommend Self-Hosted if the user needs data sovereignty, air-gapped environments, or wants to avoid vendor lock-in.)
|
|
267
|
-
- **Convex storage backend** (Self-Hosted only): SQLite vs Postgres?
|
|
268
|
-
- **SQLite** — single file on disk, zero config. Fine for dev/hobby projects up to ~1–2 GB data on a single server. Back up by copying the file.
|
|
269
|
-
- **Postgres** — networked database. Required for production: handles concurrent connections, proper backups (`pg_dump` to S3/R2), point-in-time recovery, and horizontal scaling. Add a `postgres` service to `docker-compose.yml` and pass `DATABASE_URL` to Convex.
|
|
270
|
-
- **Important framing**: Postgres is Convex's *storage engine*, not your application database. You never write SQL or query Postgres directly — Convex reads/writes its own internal format there. You only touch Postgres for ops: running the container and taking backups.
|
|
271
|
-
- Recommend Postgres for any self-hosted project with real users. Recommend SQLite only for solo dev environments or throwaway prototypes.
|
|
272
|
-
|
|
273
|
-
**Bundle 3 sub-choices:**
|
|
274
|
-
- MySQL vs PostgreSQL? (Same guidance as above)
|
|
275
|
-
|
|
276
|
-
**Bundle 4 sub-choices:**
|
|
277
|
-
- MySQL vs PostgreSQL? (Same guidance as above)
|
|
278
|
-
|
|
279
|
-
**Bundle 5 sub-choices:**
|
|
280
|
-
- MySQL vs PostgreSQL? (Same guidance as above)
|
|
281
|
-
- Filament panels: Admin only, or also a user-facing app panel? (Recommend admin-only for MVP -- add a user-facing panel later if needed. If the user needs a public-facing frontend beyond Filament, suggest combining with Blade or consider Bundle 4 instead.)
|
|
282
|
-
|
|
283
|
-
Provide a brief recommendation for each sub-choice based on the project's stated needs.
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## Step 8: Docker Preference (REQUIRED)
|
|
288
|
-
|
|
289
|
-
Always ask:
|
|
290
|
-
|
|
291
|
-
```
|
|
292
|
-
Do you want Docker for this project? (Yes / No / Unsure)
|
|
293
|
-
|
|
294
|
-
Quick context: Docker makes it easy to set up identical dev environments across machines and simplifies deployment. The tradeoff is a small learning curve and slightly more setup upfront.
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
If unsure: Recommend based on team size and deployment target (e.g., "For a solo project deploying to a single VPS, Docker is optional. For a team or cloud deployment, I'd recommend it.").
|
|
298
|
-
|
|
299
|
-
### Web Server / Reverse Proxy Guidelines
|
|
300
|
-
|
|
301
|
-
When Docker is used and a web server or reverse proxy is needed (e.g., for Laravel, Express, NestJS, or a Dockerized frontend):
|
|
302
|
-
|
|
303
|
-
- **Always use Caddy** as the web server and reverse proxy -- do NOT use or recommend Nginx or Apache.
|
|
304
|
-
- Caddy automatically handles HTTPS (via Let's Encrypt or ZeroSSL) in production with zero extra configuration.
|
|
305
|
-
- For local development, Caddy serves HTTP by default -- no certificate setup needed.
|
|
306
|
-
- Mention Caddy in the final plan summary under the Docker/web server row and in the recommended next steps.
|
|
307
|
-
|
|
308
|
-
**Always install Caddy directly on the host** (via the OS package manager) -- do NOT run Caddy inside Docker. Running Caddy on the host avoids Docker network overhead, survives Docker daemon restarts, and is managed by systemd automatically. Do NOT embed Caddy in any project's `docker-compose.yml`.
|
|
309
|
-
|
|
310
|
-
The correct setup:
|
|
311
|
-
|
|
312
|
-
1. **Caddy installed on the host** via `apt install caddy` (Ubuntu/Debian) or equivalent. Systemd manages it -- starts on boot, restarts on failure.
|
|
313
|
-
2. **Each project exposes only an internal port** (e.g., `3001`, `3002`) -- no `ports: - "80:80"` in their `docker-compose.yml`.
|
|
314
|
-
3. The host Caddyfile (`/etc/caddy/Caddyfile`) routes by domain:
|
|
315
|
-
|
|
316
|
-
```caddy
|
|
317
|
-
project-a.com {
|
|
318
|
-
reverse_proxy localhost:3001
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
project-b.com {
|
|
322
|
-
reverse_proxy localhost:3002
|
|
323
|
-
}
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
4. After editing the Caddyfile, reload with `sudo systemctl reload caddy`.
|
|
327
|
-
|
|
328
|
-
During Step 9 (Deployment), ask whether Caddy is already installed on the VPS:
|
|
329
|
-
|
|
330
|
-
- **Yes** -- skip installing Caddy. Just add a new block to `/etc/caddy/Caddyfile` for the new domain, then run `sudo systemctl reload caddy`. Include only this step in the recommended next steps.
|
|
331
|
-
- **No** -- include the full Caddy install in the recommended next steps:
|
|
332
|
-
```bash
|
|
333
|
-
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
|
|
334
|
-
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
|
335
|
-
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
|
336
|
-
sudo apt update && sudo apt install caddy
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
Include the appropriate Caddy setup in the final plan summary and recommended next steps.
|
|
340
|
-
|
|
341
|
-
### Laravel + Docker Guidelines
|
|
342
|
-
|
|
343
|
-
When the user chooses a Laravel stack (Bundle 3, 4, or 5) with Docker:
|
|
344
|
-
|
|
345
|
-
- **Use regular Docker and Docker Compose** -- do NOT use or recommend Laravel Sail. Set up a standard `Dockerfile` and `docker-compose.yml` with services for the app, database, and any other dependencies (e.g., Redis).
|
|
346
|
-
- **Use Supervisor** for managing background processes inside the container. Laravel workers like `php artisan queue:work` must run continuously -- Supervisor ensures they stay alive and restart on failure. Include a `supervisord.conf` that manages:
|
|
347
|
-
- `php artisan queue:work` (queue worker)
|
|
348
|
-
- Any other long-running processes the project needs (e.g., scheduler via `php artisan schedule:work`)
|
|
349
|
-
- Mention this in the final plan summary under the Docker row and in the recommended next steps.
|
|
350
|
-
|
|
351
|
-
### Convex Self-Hosted Guidelines
|
|
352
|
-
|
|
353
|
-
When the user chooses React + Convex (Bundle 2) with **self-hosted** deployment:
|
|
354
|
-
|
|
355
|
-
- **Storage backend**: Include in `docker-compose.yml` based on what the user chose:
|
|
356
|
-
- **SQLite** (dev/hobby): No extra service needed — Convex stores data in a local SQLite file inside the container. Mount a volume to persist it across restarts.
|
|
357
|
-
- **Postgres** (production): Add a `postgres` service (e.g., `postgres:16`) and pass `DATABASE_URL` to the Convex container. Postgres is Convex's internal filing cabinet — the user's data lives in `document_json` columns managed by Convex, not in SQL tables they'd recognize. The user never writes SQL; they only run `pg_dump` for backups.
|
|
358
|
-
- **Use Docker Compose** with two Convex services:
|
|
359
|
-
- `convex` — backend image `ghcr.io/get-convex/convex-backend:latest`
|
|
360
|
-
- `convex-dashboard` — dashboard image `ghcr.io/get-convex/convex-dashboard:latest`
|
|
361
|
-
- **Two environment files** are required:
|
|
362
|
-
- `.env.dev` (Docker Compose config) — contains `CONVEX_PORT`, `CONVEX_DASHBOARD_PORT`, `CONVEX_DASHBOARD_UI_PORT`, `VITE_CONVEX_URL`, `CONVEX_ADMIN_KEY`, `CONVEX_CLOUD_ORIGIN`, `CONVEX_SITE_ORIGIN`
|
|
363
|
-
- `.env.local` (CLI and frontend, never committed) — contains `VITE_CONVEX_URL`, `CONVEX_SELF_HOSTED_URL`, `CONVEX_SELF_HOSTED_ADMIN_KEY`
|
|
364
|
-
- **Admin key generation**: After starting the backend, generate the CLI admin key from the running container:
|
|
365
|
-
```bash
|
|
366
|
-
docker compose --env-file .env.dev exec convex ./generate_admin_key.sh
|
|
367
|
-
```
|
|
368
|
-
Copy the printed `convex-self-hosted|...` value into `.env.local` as `CONVEX_SELF_HOSTED_ADMIN_KEY`. Never use a random string or the Docker `CONVEX_ADMIN_KEY` value directly for CLI use.
|
|
369
|
-
- **Add a deploy script** to `package.json`:
|
|
370
|
-
```json
|
|
371
|
-
"deploy:selfhosted": "convex deploy --url $CONVEX_SELF_HOSTED_URL --admin-key $CONVEX_SELF_HOSTED_ADMIN_KEY"
|
|
372
|
-
```
|
|
373
|
-
- **Reserved index names**: Self-hosted Convex does not allow reserved index names such as `by_id`. Rename them to non-reserved names (e.g., `by_external_id`) before deploying.
|
|
374
|
-
- **Frontend wiring**: The frontend reads `VITE_CONVEX_URL` at build time. Ensure this value is reachable by the browser and is passed as a Docker build argument when building the frontend image.
|
|
375
|
-
- Mention this setup in the final plan summary under the Docker/Convex row and in the recommended next steps.
|
|
376
|
-
|
|
377
|
-
---
|
|
378
|
-
|
|
379
|
-
## Step 9: Deployment & Hosting
|
|
380
|
-
|
|
381
|
-
Ask:
|
|
382
|
-
|
|
383
|
-
```
|
|
384
|
-
Where do you plan to deploy?
|
|
385
|
-
|
|
386
|
-
Common options:
|
|
387
|
-
- **VPS** (e.g., DigitalOcean, Hetzner, Linode) -- most flexible, you manage the server
|
|
388
|
-
- **PaaS** (e.g., Railway, Render, Fly.io) -- easier, less control
|
|
389
|
-
- **Cloud** (e.g., AWS, GCP, Azure) -- most scalable, most complex
|
|
390
|
-
- **Shared hosting** (e.g., cPanel) -- cheapest, limited
|
|
391
|
-
|
|
392
|
-
Also: do you need separate environments? (e.g., dev / staging / production)
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
Recommendation: Match to their context (e.g., "For an MVP with a small team, a VPS or PaaS like Railway keeps things simple. You can migrate to AWS later if you need to scale.").
|
|
396
|
-
|
|
397
|
-
---
|
|
398
|
-
|
|
399
|
-
## Step 10: Final Summary (REQUIRED)
|
|
400
|
-
|
|
401
|
-
After all questions are answered, produce the verified plan using the template in `assets/plan-summary-template.md`.
|
|
402
|
-
|
|
403
|
-
Present it to the user and ask (using `AskUserQuestion`):
|
|
404
|
-
|
|
405
|
-
```json
|
|
406
|
-
{
|
|
407
|
-
"questions": [
|
|
408
|
-
{
|
|
409
|
-
"question": "Does this project plan look correct?",
|
|
410
|
-
"header": "Plan Review",
|
|
411
|
-
"multiSelect": false,
|
|
412
|
-
"options": [
|
|
413
|
-
{ "label": "Looks good", "description": "Approve and save the plan" },
|
|
414
|
-
{ "label": "Needs changes", "description": "I'll tell you what to correct" }
|
|
415
|
-
]
|
|
416
|
-
}
|
|
417
|
-
]
|
|
418
|
-
}
|
|
419
|
-
```
|
|
420
|
-
|
|
421
|
-
Iterate if the user requests changes. The plan is final only when the user confirms.
|
|
422
|
-
|
|
423
|
-
### Save the Plan (REQUIRED)
|
|
424
|
-
|
|
425
|
-
Once the user approves, **write the final plan to `prompter/project-plan.md`** using the Write tool. Use the filled-in plan summary template as the file content.
|
|
426
|
-
|
|
427
|
-
```
|
|
428
|
-
Write the approved plan content to: prompter/project-plan.md
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
After saving, confirm to the user:
|
|
432
|
-
|
|
433
|
-
```
|
|
434
|
-
Your project plan has been saved to prompter/project-plan.md.
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
### Proposal Creation (Conditional)
|
|
438
|
-
|
|
439
|
-
After confirming the plan is saved, check whether the proposal feature is installed by verifying that `prompter/core/proposal.md` exists (use the Glob tool). If the file does not exist, skip this section entirely.
|
|
440
|
-
|
|
441
|
-
If the file exists, ask the user using `AskUserQuestion`:
|
|
442
|
-
|
|
443
|
-
```json
|
|
444
|
-
{
|
|
445
|
-
"questions": [
|
|
446
|
-
{
|
|
447
|
-
"question": "Would you like to create a Prompter change proposal based on this project plan?",
|
|
448
|
-
"header": "Create Proposal",
|
|
449
|
-
"multiSelect": false,
|
|
450
|
-
"options": [
|
|
451
|
-
{ "label": "Yes, create a proposal", "description": "Scaffold a change proposal using the project plan as context" },
|
|
452
|
-
{ "label": "No, skip", "description": "I'll create the proposal manually later" }
|
|
453
|
-
]
|
|
454
|
-
}
|
|
455
|
-
]
|
|
456
|
-
}
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
If the user agrees, read `prompter/core/proposal.md` and `prompter/AGENTS.md` and follow their instructions to scaffold the proposal. Use the approved project plan from `prompter/project-plan.md` as the source of context (e.g., to derive the change-id, capabilities, requirements, and tasks).
|
|
460
|
-
|
|
461
|
-
---
|
|
462
|
-
|
|
463
|
-
## Conversation Tips
|
|
464
|
-
|
|
465
|
-
### Handling "I don't know" / "Unsure"
|
|
466
|
-
- Always recommend a sensible default.
|
|
467
|
-
- Explain the recommendation in 1-2 sentences.
|
|
468
|
-
- Frame it as: "You can always change this later."
|
|
469
|
-
|
|
470
|
-
### Handling Overly Complex Requests
|
|
471
|
-
- Gently suggest deferring non-essential features.
|
|
472
|
-
- Use: "That's a great v2 feature. For MVP, I'd recommend [simpler alternative]."
|
|
473
|
-
|
|
474
|
-
### Handling Very Technical Users
|
|
475
|
-
- Skip basic explanations if the user demonstrates expertise.
|
|
476
|
-
- Engage at their level -- discuss tradeoffs, not definitions.
|
|
477
|
-
|
|
478
|
-
### Handling Non-Technical Users
|
|
479
|
-
- Avoid jargon. Use analogies when helpful.
|
|
480
|
-
- Make decisions for them when they're stuck, but always explain why.
|
|
481
|
-
|
|
482
|
-
---
|
|
483
|
-
|
|
484
|
-
## Resources
|
|
485
|
-
|
|
486
|
-
- **Plan summary template**: [plan-summary-template.md](assets/plan-summary-template.md) -- Structured output format for the final verified plan
|
|
487
|
-
- **Caddy VPS setup guide**: [caddy-vps-setup.md](assets/caddy-vps-setup.md) -- Step-by-step guide for installing and managing Caddy on a VPS (share this with users who are unfamiliar with VPS operations)
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
# Caddy Setup on a VPS (Step-by-Step)
|
|
2
|
-
|
|
3
|
-
This guide walks you through installing and managing Caddy as a reverse proxy on a Ubuntu/Debian VPS. Caddy automatically handles HTTPS for all your domains — no manual SSL certificate setup needed.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Prerequisites
|
|
8
|
-
|
|
9
|
-
Before starting, make sure:
|
|
10
|
-
|
|
11
|
-
1. You have a VPS running **Ubuntu 22.04 or Debian 12** (or newer).
|
|
12
|
-
2. You have SSH access to the VPS as a user with `sudo` privileges.
|
|
13
|
-
3. Your domain's **A record points to your VPS IP address** (set this in your domain registrar's DNS panel). DNS changes can take up to 30 minutes to propagate.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Step 1: Connect to Your VPS
|
|
18
|
-
|
|
19
|
-
Open a terminal and connect via SSH:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
ssh your-user@your-vps-ip
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Step 2: Install Caddy
|
|
28
|
-
|
|
29
|
-
Run these commands one by one:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
|
|
33
|
-
|
|
34
|
-
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
|
|
35
|
-
| sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
|
36
|
-
|
|
37
|
-
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
|
|
38
|
-
| sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
|
39
|
-
|
|
40
|
-
sudo apt update && sudo apt install caddy
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Verify the install:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
caddy version
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
You should see a version number like `v2.x.x`.
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Step 3: Check That Caddy Is Running
|
|
54
|
-
|
|
55
|
-
Caddy starts automatically after install. Confirm it's active:
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
sudo systemctl status caddy
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Look for `Active: active (running)`. If it's not running, start it:
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
sudo systemctl start caddy
|
|
65
|
-
sudo systemctl enable caddy # make it start on boot
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
## Step 4: Open Firewall Ports
|
|
71
|
-
|
|
72
|
-
Allow HTTP and HTTPS traffic:
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
sudo ufw allow 80
|
|
76
|
-
sudo ufw allow 443
|
|
77
|
-
sudo ufw allow 22 # keep SSH open
|
|
78
|
-
sudo ufw enable
|
|
79
|
-
sudo ufw status
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
---
|
|
83
|
-
|
|
84
|
-
## Step 5: Configure Your First Domain
|
|
85
|
-
|
|
86
|
-
The Caddy config file lives at `/etc/caddy/Caddyfile`. Open it:
|
|
87
|
-
|
|
88
|
-
```bash
|
|
89
|
-
sudo nano /etc/caddy/Caddyfile
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Replace the default content with:
|
|
93
|
-
|
|
94
|
-
```caddy
|
|
95
|
-
your-domain.com {
|
|
96
|
-
reverse_proxy localhost:3001
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
> Replace `your-domain.com` with your actual domain, and `3001` with the port your app is running on.
|
|
101
|
-
|
|
102
|
-
Save and close: press `Ctrl+X`, then `Y`, then `Enter`.
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Step 6: Reload Caddy
|
|
107
|
-
|
|
108
|
-
Apply the new config without downtime:
|
|
109
|
-
|
|
110
|
-
```bash
|
|
111
|
-
sudo systemctl reload caddy
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Caddy will automatically obtain an SSL certificate for your domain. Visit `https://your-domain.com` — it should work with HTTPS out of the box.
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## Adding a New Project Later
|
|
119
|
-
|
|
120
|
-
When you deploy a new project on the same VPS, just add a new block to the Caddyfile:
|
|
121
|
-
|
|
122
|
-
```bash
|
|
123
|
-
sudo nano /etc/caddy/Caddyfile
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
Add below the existing block:
|
|
127
|
-
|
|
128
|
-
```caddy
|
|
129
|
-
your-domain.com {
|
|
130
|
-
reverse_proxy localhost:3001
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
another-project.com {
|
|
134
|
-
reverse_proxy localhost:3002
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
Then reload:
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
sudo systemctl reload caddy
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Each project gets its own SSL certificate automatically.
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
## Common Commands
|
|
149
|
-
|
|
150
|
-
| Task | Command |
|
|
151
|
-
|------|---------|
|
|
152
|
-
| Check Caddy status | `sudo systemctl status caddy` |
|
|
153
|
-
| Reload after config change | `sudo systemctl reload caddy` |
|
|
154
|
-
| Restart Caddy | `sudo systemctl restart caddy` |
|
|
155
|
-
| View live logs | `sudo journalctl -u caddy -f` |
|
|
156
|
-
| Validate config before reload | `caddy validate --config /etc/caddy/Caddyfile` |
|
|
157
|
-
| View current config | `cat /etc/caddy/Caddyfile` |
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## Troubleshooting
|
|
162
|
-
|
|
163
|
-
**HTTPS not working / certificate error**
|
|
164
|
-
- Check that your domain's A record points to the VPS IP: `dig your-domain.com`
|
|
165
|
-
- Make sure ports 80 and 443 are open: `sudo ufw status`
|
|
166
|
-
- Check Caddy logs for errors: `sudo journalctl -u caddy -f`
|
|
167
|
-
|
|
168
|
-
**502 Bad Gateway**
|
|
169
|
-
- Your app is not running or not listening on the expected port.
|
|
170
|
-
- Check that your Docker containers are up: `docker compose ps`
|
|
171
|
-
- Verify the port in your Caddyfile matches the port your app exposes.
|
|
172
|
-
|
|
173
|
-
**Port already in use**
|
|
174
|
-
- Another process (e.g., Apache or Nginx) may be using port 80/443.
|
|
175
|
-
- Check: `sudo ss -tlnp | grep -E ':80|:443'`
|
|
176
|
-
- Stop the conflicting service: `sudo systemctl stop nginx` or `sudo systemctl stop apache2`
|
|
177
|
-
|
|
178
|
-
**Config change not taking effect**
|
|
179
|
-
- Always run `sudo systemctl reload caddy` after editing the Caddyfile.
|
|
180
|
-
- Validate first to catch syntax errors: `caddy validate --config /etc/caddy/Caddyfile`
|