@brunosps00/dev-workflow 1.6.0 → 1.7.1
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/.claude-plugin/plugin.json +2 -2
- package/README.md +2 -2
- package/lib/constants.js +2 -0
- package/lib/install-deps.js +37 -1
- package/lib/install-open-design.js +128 -0
- package/lib/utils.js +46 -6
- package/package.json +2 -2
- package/scaffold/en/commands/dw-help.md +3 -1
- package/scaffold/en/commands/dw-new-project.md +24 -21
- package/scaffold/en/commands/dw-open-design.md +324 -0
- package/scaffold/en/templates/project-onepager.md +12 -11
- package/scaffold/pt-br/commands/dw-help.md +3 -1
- package/scaffold/pt-br/commands/dw-new-project.md +24 -21
- package/scaffold/pt-br/commands/dw-open-design.md +323 -0
- package/scaffold/pt-br/templates/project-onepager.md +12 -11
- package/scaffold/scripts/open-design/capture-current.mjs +170 -0
- package/scaffold/scripts/open-design/gate-prototype.mjs +223 -0
- package/scaffold/skills/docker-compose-recipes/SKILL.md +6 -5
- package/scaffold/skills/docker-compose-recipes/references/compose-composition.md +7 -7
- package/scaffold/skills/docker-compose-recipes/references/env-conventions.md +3 -1
- package/scaffold/skills/docker-compose-recipes/references/healthcheck-patterns.md +4 -4
- package/scaffold/skills/docker-compose-recipes/services/mailpit.yml +4 -4
- package/scaffold/skills/docker-compose-recipes/services/postgres-pgvector.yml +31 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
<system_instructions>
|
|
2
|
+
You are the **headless Open Design (`od`) runner** for generating and iterating HTML prototypes in a project
|
|
3
|
+
folder, without Electron and without depending on the user's GUI state. Start the `nexu-io/open-design` daemon in
|
|
4
|
+
`--headless`, import the target folder once, run single briefs or serial batches, verify the output file, run the
|
|
5
|
+
Playwright/Firefox visual gate, and **STOP for the owner's gate** before any commit.
|
|
6
|
+
|
|
7
|
+
<critical>NEVER use the user's GUI state. Always run with an isolated per-project `OD_DATA_DIR`, for example `.dw/.open-design/data/`.</critical>
|
|
8
|
+
<critical>NEVER commit a rejected prototype. The gate is dual >=9: automated gate + your own visual score >=9, then owner gate.</critical>
|
|
9
|
+
<critical>The agent (`codex` or `claude`) must always be explicit in `od run start --agent <agent>`. If the user does not pass one, resolve from project config/state; fallback `codex`.</critical>
|
|
10
|
+
<critical>NEVER dispatch the user's raw request to `od`. This command's value is refining the prompt first: ground it in real code, structure the brief, qualify states/themes/a11y/deep-link, persist the reviewable brief, and only then append the headless appendix.</critical>
|
|
11
|
+
|
|
12
|
+
## Inputs
|
|
13
|
+
|
|
14
|
+
| Flag/argument | Default | Description |
|
|
15
|
+
|---|---:|---|
|
|
16
|
+
| `--target <dir>` | `open-design/` | Folder imported as the external project and where HTML files are written. |
|
|
17
|
+
| `--brief <file>` | none | One markdown brief for a single run. |
|
|
18
|
+
| `--brief-glob <glob>` | none | Serial batch. Expand to a stable list and run one prompt at a time. |
|
|
19
|
+
| `--output <file>` | required in the brief/appendix | Expected HTML file; verify it on disk after the run. |
|
|
20
|
+
| `--agent <codex|claude>` | state/config -> `codex` | Agent forwarded to `od run start --agent`. |
|
|
21
|
+
| `--platform <text>` | `Responsive web, desktop-first and mobile-safe` | Pre-filled discovery answer for the `web-prototype` skill. |
|
|
22
|
+
| `--deep-link-id <id>` | none | Value used by the behavioral gate for `?aberto=<id>` + Esc. |
|
|
23
|
+
| `--refactor` | false | Existing-screen redesign/refactor mode; captures current screenshots and grounds the brief in visible state + real code. |
|
|
24
|
+
| `--url <url>` | none | Running app URL for current screenshot capture via Playwright Firefox. |
|
|
25
|
+
| `--viewports <list>` | `1440x900,375x812` | Comma-separated viewports for `--refactor --url`; expand as the pain requires (for example `1920x1080` for a wide table). |
|
|
26
|
+
| `--screenshot <path>` | repeatable | Already-captured current screenshot when there is no `--url`; copy it into `_refs/<slug>/`. |
|
|
27
|
+
|
|
28
|
+
## 0. Refine The Brief
|
|
29
|
+
|
|
30
|
+
Before any daemon pre-flight or `od` call, turn the user's intent into a qualified brief. Do not send the user's raw
|
|
31
|
+
sentence to the runner.
|
|
32
|
+
|
|
33
|
+
Required contract:
|
|
34
|
+
|
|
35
|
+
| Step | Requirement |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Ground in reality | If the screen exists, read its real code: columns, enums, actions, states, permissions, contracts, and domain. Also read the project's design system, sibling prototypes, and design guides. Inventing a field, status, or action is forbidden. |
|
|
38
|
+
| Structure | Rewrite the request into the standard skeleton below, filling real paths and the exact output file. |
|
|
39
|
+
| Qualify | Cover loading/skeleton, empty, error/failure, light + dark, a11y, local design-system limits (for example <=6 cards/filters), responsiveness, and deep-link. |
|
|
40
|
+
| Persist | Save the refined brief inside the project, for example `<target>/PROMPT-<slug>.md`. It is a reviewable owner deliverable, not a disposable scratch file. |
|
|
41
|
+
| Review if already ready | If the user already provides a qualified brief, do a quick checklist review, patch only gaps, and persist the final version. |
|
|
42
|
+
|
|
43
|
+
Standard refined brief skeleton:
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
# <screen/prototype title>
|
|
47
|
+
|
|
48
|
+
Paste this brief into Open Design. Exact output file: `<OUTPUT_FILE>`.
|
|
49
|
+
|
|
50
|
+
## 1. Why
|
|
51
|
+
<real user/product pain; observable problem this prototype must solve>
|
|
52
|
+
|
|
53
|
+
## 2. Interaction Decision
|
|
54
|
+
<navigation, opening, selection, filters, sorting, editing, and confirmation pattern>
|
|
55
|
+
|
|
56
|
+
## 3. Layout/List
|
|
57
|
+
Table/list based only on REAL columns:
|
|
58
|
+
|
|
59
|
+
| Real column | Source/contract | Presentation | State/limit |
|
|
60
|
+
|---|---|---|---|
|
|
61
|
+
| <name> | <file/API/schema> | <text, badge, action> | <truncate, empty, error> |
|
|
62
|
+
|
|
63
|
+
## 4. Detail/Actions
|
|
64
|
+
<drawer/modal/detail page; contextual actions allowed by real state/permission>
|
|
65
|
+
|
|
66
|
+
## 5. Domain Fidelity
|
|
67
|
+
So the mock does not lie: use real enums/statuses, realistic sample data in the project's language, and include rare/broken states that exist in the domain.
|
|
68
|
+
|
|
69
|
+
## 6. Visual Direction
|
|
70
|
+
<tokens, components, density, inherited references, sibling prototypes, and design-system limits>
|
|
71
|
+
|
|
72
|
+
## Deliver
|
|
73
|
+
- `<OUTPUT_FILE>`
|
|
74
|
+
- `<OUTPUT_FILE>.artifact.json` when there is a sidecar
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Only after persisting this file should you append the headless appendix under `.dw/.open-design/runs/` and dispatch
|
|
78
|
+
the run.
|
|
79
|
+
|
|
80
|
+
### 0R. Refactor/Redesign Mode
|
|
81
|
+
|
|
82
|
+
When `--refactor` is present, phase 0 remains mandatory. Screenshots complement grounding in code; they do not
|
|
83
|
+
replace reading contracts, enums, permissions, states, the design system, and sibling prototypes.
|
|
84
|
+
|
|
85
|
+
Capture or copy current screenshots into the imported folder, under `_refs/<slug>/`, before persisting the brief:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
node .dw/scripts/open-design/capture-current.mjs \
|
|
89
|
+
--target "$TARGET_DIR" \
|
|
90
|
+
--slug "<slug>" \
|
|
91
|
+
--url "<url>" \
|
|
92
|
+
--viewports "1440x900,375x812"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Without a running app URL, accept existing screenshots by repeating `--screenshot`:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
node .dw/scripts/open-design/capture-current.mjs \
|
|
99
|
+
--target "$TARGET_DIR" \
|
|
100
|
+
--slug "<slug>" \
|
|
101
|
+
--screenshot "./before-1440-light.png" \
|
|
102
|
+
--screenshot "./before-375-dark.png"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Capture rules:
|
|
106
|
+
|
|
107
|
+
| Case | Requirement |
|
|
108
|
+
|---|---|
|
|
109
|
+
| Viewports | Sensible default: desktop `1440x900` + mobile `375x812`. The agent chooses/expands as the pain requires: mobile bug includes `375x812`; wide table includes `1920x1080`; tablet/console includes `768x1024`. |
|
|
110
|
+
| Themes | Capture light and dark when applicable. The helper uses `light,dark` by default and writes names like `_refs/<slug>/atual-1440-light.png` and `_refs/<slug>/atual-375-dark.png`. |
|
|
111
|
+
| Robust path | The `od` agent reads images from the project filesystem. Reference relative paths inside the target; do not depend on an image flag in `run start`. |
|
|
112
|
+
| Hygiene | `_refs/` and reference material must not become prototypes. If the target project tracks final prototypes, document cleanup or add `<target>/_refs/` to `.gitignore` according to local convention. |
|
|
113
|
+
|
|
114
|
+
The refined refactor brief must add this block:
|
|
115
|
+
|
|
116
|
+
```markdown
|
|
117
|
+
## Current Screen References
|
|
118
|
+
Open and ANALYZE the screenshots before writing:
|
|
119
|
+
- `_refs/<slug>/atual-1440-light.png`
|
|
120
|
+
- `_refs/<slug>/atual-375-dark.png`
|
|
121
|
+
|
|
122
|
+
## What Is Wrong Today
|
|
123
|
+
<pain pointing to visible elements in the screenshots: density, hierarchy, table, filters, states, contrast, mobile, etc.>
|
|
124
|
+
|
|
125
|
+
## The Change Idea
|
|
126
|
+
<what changes and why; interaction/visual decision proposed by the user or by the agent after reading code and screenshots>
|
|
127
|
+
|
|
128
|
+
## Preserve
|
|
129
|
+
<flows, fields, permissions, states, copy, affordances, and integrations that must not change>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Pre-flight
|
|
133
|
+
|
|
134
|
+
| Check | Action |
|
|
135
|
+
|---|---|
|
|
136
|
+
| Resolve `od` | `OD_CLI_DIR` wins. Otherwise use `~/.dw/vendor/open-design`. If `apps/daemon/bin/od.mjs` is missing, stop and tell the user to run `dev-workflow install-deps`. |
|
|
137
|
+
| Prerequisites | The Open Design checkout requires Node `~24` and pnpm `>=10.33`. If missing, stop with concrete instructions. |
|
|
138
|
+
| Isolated state | Create `.dw/.open-design/`, `.dw/.open-design/data/`, `.dw/.open-design/runs/`, and `.dw/.open-design/state.json`. |
|
|
139
|
+
| Port | Pick a free port on `127.0.0.1`; persist `daemonUrl` and `port` in state. |
|
|
140
|
+
| Live daemon | If `od daemon status --daemon-url <url> --json` returns `ok: true`, reuse it. Otherwise start a new daemon. |
|
|
141
|
+
|
|
142
|
+
Daemon command shape:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
OD_DATA_DIR="$PWD/.dw/.open-design/data" \
|
|
146
|
+
OD_CHAT_RUN_INACTIVITY_TIMEOUT_MS=1800000 \
|
|
147
|
+
node "$OD_DIR/apps/daemon/bin/od.mjs" daemon start \
|
|
148
|
+
--headless \
|
|
149
|
+
--host 127.0.0.1 \
|
|
150
|
+
--port "$PORT"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Known noise: `codex_core::shell_snapshot` may log a syntax `ERROR`. Treat it as benign when the run continues and
|
|
154
|
+
the target file is created.
|
|
155
|
+
|
|
156
|
+
## Idempotent Import
|
|
157
|
+
|
|
158
|
+
Use `project import-folder` on the resolved absolute target folder. Default: `<repo>/open-design/`.
|
|
159
|
+
|
|
160
|
+
Persist in `.dw/.open-design/state.json`:
|
|
161
|
+
|
|
162
|
+
```json
|
|
163
|
+
{
|
|
164
|
+
"schema_version": "1.0",
|
|
165
|
+
"targetDir": "/abs/repo/open-design",
|
|
166
|
+
"projectId": "<project.id>",
|
|
167
|
+
"conversationId": "<conversationId>",
|
|
168
|
+
"daemonUrl": "http://127.0.0.1:<port>",
|
|
169
|
+
"port": 17556,
|
|
170
|
+
"agent": "codex"
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
If `projectId` exists in state and `od project info <id> --daemon-url <url> --json` works for the same `targetDir`,
|
|
175
|
+
reuse it. Otherwise, reimport:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
node "$OD_DIR/apps/daemon/bin/od.mjs" project import-folder "$TARGET_DIR" \
|
|
179
|
+
--daemon-url "$OD_URL" \
|
|
180
|
+
--name "$(basename "$TARGET_DIR")" \
|
|
181
|
+
--skill web-prototype \
|
|
182
|
+
--design-system default \
|
|
183
|
+
--json
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Capture `project.id` and `conversationId`; do not depend on global app state.
|
|
187
|
+
|
|
188
|
+
## Required Headless Appendix
|
|
189
|
+
|
|
190
|
+
Append this block to every brief in a temporary file under `.dw/.open-design/runs/`.
|
|
191
|
+
Fill `<PLATFORM>`, `<OUTPUT_FILE>`, and sibling references when applicable.
|
|
192
|
+
|
|
193
|
+
```markdown
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Headless appendix for Open Design
|
|
197
|
+
|
|
198
|
+
Target platform: <PLATFORM>.
|
|
199
|
+
|
|
200
|
+
Do not run discovery and do not ask questions. Do not emit `<question-form>`. Follow this brief with the answers
|
|
201
|
+
above and deliver file-first.
|
|
202
|
+
|
|
203
|
+
Required output file: `<OUTPUT_FILE>`.
|
|
204
|
+
|
|
205
|
+
File-first contract:
|
|
206
|
+
- Write the HTML directly to the project filesystem, exactly at `<OUTPUT_FILE>`.
|
|
207
|
+
- Do not alter existing files, except when this prompt is explicitly a surgical iteration on a target file.
|
|
208
|
+
- If you need to create a sidecar, keep `<OUTPUT_FILE>.artifact.json` coherent.
|
|
209
|
+
- Do not answer only with a textual `<artifact>` block; run `succeeded` without the file is a failure.
|
|
210
|
+
|
|
211
|
+
To avoid headless timeout:
|
|
212
|
+
- Write large files in parts, with edits of about 150 lines per call.
|
|
213
|
+
- Keep visible progress until the HTML is complete.
|
|
214
|
+
|
|
215
|
+
Consistency context:
|
|
216
|
+
- Read sibling prototypes in `prototipos/` or the folder named by the brief before defining visual patterns.
|
|
217
|
+
- Preserve the local visual system when a nearby reference exists.
|
|
218
|
+
|
|
219
|
+
Required deep link:
|
|
220
|
+
- Implement `?aberto=<id>` to open the correct item's drawer/modal.
|
|
221
|
+
- On Esc or close action, clear the parameter with `history.replaceState`.
|
|
222
|
+
- The drawer/modal must use `role="dialog"` and appropriate ARIA attributes.
|
|
223
|
+
- Include skeleton/loading, empty, and error states.
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Single Run
|
|
227
|
+
|
|
228
|
+
Always pass `--agent` explicitly:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
node "$OD_DIR/apps/daemon/bin/od.mjs" run start \
|
|
232
|
+
--daemon-url "$OD_URL" \
|
|
233
|
+
--project "$PROJECT_ID" \
|
|
234
|
+
--conversation "$CONVERSATION_ID" \
|
|
235
|
+
--agent "$AGENT" \
|
|
236
|
+
--skill web-prototype \
|
|
237
|
+
--design-system default \
|
|
238
|
+
--prompt-file "$PROMPT_WITH_APPENDIX" \
|
|
239
|
+
--follow \
|
|
240
|
+
--json | tee ".dw/.open-design/runs/<slug>.jsonl"
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
After the run, check the file. **Do not accept only `succeeded`:**
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
test -s "$TARGET_DIR/<OUTPUT_FILE>"
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Record in JSONL or an audit sidecar: brief, prompt with appendix, agent, daemonUrl, projectId, conversationId,
|
|
250
|
+
expected output, final status, and file verification result.
|
|
251
|
+
|
|
252
|
+
## Batch
|
|
253
|
+
|
|
254
|
+
For `--brief-glob`, expand the briefs, sort by name, and run serially. Stop at the first case where:
|
|
255
|
+
|
|
256
|
+
| Condition | Result |
|
|
257
|
+
|---|---|
|
|
258
|
+
| run fails | `BLOCKED` with JSONL log |
|
|
259
|
+
| run says success but file is missing or empty | `FINDINGS` and surgical follow-up or `BLOCKED` |
|
|
260
|
+
| visual gate <9 | `FINDINGS`; iterate before continuing |
|
|
261
|
+
|
|
262
|
+
Do not run prompts in parallel in the same `od` project; preserve auditability and context.
|
|
263
|
+
|
|
264
|
+
## Surgical Iteration
|
|
265
|
+
|
|
266
|
+
Use a follow-up run on the same `projectId`/`conversationId`, with a short prompt and explicit target file:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
node "$OD_DIR/apps/daemon/bin/od.mjs" run start \
|
|
270
|
+
--daemon-url "$OD_URL" \
|
|
271
|
+
--project "$PROJECT_ID" \
|
|
272
|
+
--conversation "$CONVERSATION_ID" \
|
|
273
|
+
--agent "$AGENT" \
|
|
274
|
+
--skill web-prototype \
|
|
275
|
+
--design-system default \
|
|
276
|
+
--prompt-file ".dw/.open-design/runs/<slug>.followup.md" \
|
|
277
|
+
--follow \
|
|
278
|
+
--json | tee -a ".dw/.open-design/runs/<slug>.jsonl"
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
The follow-up must say: single file, exact change, do not touch sibling prototypes, preserve deep-link and states.
|
|
282
|
+
|
|
283
|
+
## Required Visual Gate
|
|
284
|
+
|
|
285
|
+
Run the automated gate:
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
node .dw/scripts/open-design/gate-prototype.mjs \
|
|
289
|
+
--file "$TARGET_DIR/<OUTPUT_FILE>" \
|
|
290
|
+
--deep-link-id "<real-id>" \
|
|
291
|
+
--expected-text "<item-text>" \
|
|
292
|
+
--out ".dw/.open-design/gate/<slug>"
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The gate covers:
|
|
296
|
+
|
|
297
|
+
| Layer | Requirement |
|
|
298
|
+
|---|---|
|
|
299
|
+
| Structural | `<title>`, `aberto`, `replaceState`, `role=dialog`/ARIA, skeleton/loading, empty, error. |
|
|
300
|
+
| Screenshot | Headless Firefox in light and dark, with `colorScheme` and `data-theme`. |
|
|
301
|
+
| Behavioral | `?aberto=<id>` opens the correct item; Esc closes and clears the parameter. |
|
|
302
|
+
| Evaluation | Automated PASS + your visual score >=9. If below 9, run a surgical follow-up. |
|
|
303
|
+
|
|
304
|
+
After it passes, **stop for the owner's gate**. Do not commit until the owner approves.
|
|
305
|
+
|
|
306
|
+
## Validated Pitfalls
|
|
307
|
+
|
|
308
|
+
| Pitfall | Symptom | Required workaround |
|
|
309
|
+
|---|---|---|
|
|
310
|
+
| `web-prototype` discovery | Opens with `<question-form>` and ends the turn; headless does not create GenUI (`od ui list` empty). | Append the headless appendix answering platform and forbidding questions/discovery. |
|
|
311
|
+
| Inactivity timeout | Large HTML goes silent and the run dies near 10 minutes. | `OD_CHAT_RUN_INACTIVITY_TIMEOUT_MS=1800000` on the daemon + instruct ~150-line chunked writes. |
|
|
312
|
+
| `codex_core::shell_snapshot` | Logs a syntax `ERROR` in the stream. | Treat as noise if the run continues and the final file exists. |
|
|
313
|
+
| GUI state | App config/agent/projects leak from the user's GUI. | Isolated `OD_DATA_DIR` always; explicit `--agent`, `--skill`, and `--design-system`. |
|
|
314
|
+
|
|
315
|
+
## Structured Return
|
|
316
|
+
|
|
317
|
+
**Status:** `PASS` | `FINDINGS` | `BLOCKED` | `NOT_APPLICABLE`
|
|
318
|
+
**Scope:** target folder, briefs run, agent used, projectId/conversationId.
|
|
319
|
+
**Evidence:** JSONL logs, verified HTML file(s), gate JSON, light/dark screenshots.
|
|
320
|
+
**Artifacts:** prototype and sidecar paths.
|
|
321
|
+
**Decisions:** defaults/overrides applied (`agent`, `target`, platform, port).
|
|
322
|
+
**Risks:** any gate below 9, missing file despite run succeeded, missing dependency.
|
|
323
|
+
**Next Step:** owner gate, required surgical follow-up, or exact resume command.
|
|
324
|
+
</system_instructions>
|
|
@@ -23,20 +23,21 @@ services: []
|
|
|
23
23
|
|-------|--------|-----------|
|
|
24
24
|
| Shape | frontend / backend / fullstack | [why this shape — single product surface, API for partners, etc.] |
|
|
25
25
|
| Frontend | Next.js / Vite+React / n/a | [why this framework — SSR needs, SPA simplicity, etc.] |
|
|
26
|
-
| Backend | FastAPI / ASP.NET Core minimal / Axum /
|
|
27
|
-
| Database | Postgres / MySQL / SQLite / MongoDB / none | [why this DB — relational
|
|
26
|
+
| Backend | NestJS / Fastify / FastAPI / ASP.NET Core minimal / Axum / n/a | [why this framework — team expertise, ecosystem, latency targets] |
|
|
27
|
+
| Database | Postgres / Postgres+pgvector / MySQL / SQLite / MongoDB / none | [why this DB — relational, vector, transactional needs, etc.] |
|
|
28
28
|
| Cache | Redis / Memcached / none | [why or why not] |
|
|
29
|
-
| Queue | BullMQ / Celery / RabbitMQ / LocalStack SQS / none | [why or why not + sync vs async workers] |
|
|
30
|
-
| Email — dev |
|
|
29
|
+
| Queue | pg-boss / BullMQ / Celery / RabbitMQ / LocalStack SQS / none | [why or why not + sync vs async workers] |
|
|
30
|
+
| Email — dev | Mailpit (default) / MailHog / smtp4dev / none | [usually Mailpit — capture only, never sends real mail] |
|
|
31
31
|
| Email — prod | SMTP / SendGrid / Resend / Postmark / SES / none | [why this provider — volume, deliverability, cost] |
|
|
32
32
|
| Object storage | S3 / MinIO (dev) / GCS / none | [why or why not] |
|
|
33
33
|
| Search | Meilisearch / Typesense / Elasticsearch / none | [why this engine — features, scale, simplicity] |
|
|
34
34
|
| Observability | Sentry / OTel + Jaeger / none | [why this approach — error tracking only, full tracing, etc.] |
|
|
35
35
|
| Reverse proxy | Traefik / Caddy / none | [usually only needed for multi-host dev or prod] |
|
|
36
|
-
| Auth |
|
|
36
|
+
| Auth | Auth.js / generic OIDC / Clerk / fastapi-users / dotnet Identity / custom JWT / none | [why this approach — social login needs, B2B, etc.] |
|
|
37
37
|
| Linter / formatter | Biome / ESLint+Prettier / Ruff+Black / dotnet format / cargo fmt+clippy | [team preference] |
|
|
38
38
|
| Package manager | pnpm / npm / yarn / poetry / uv / cargo / dotnet | [team preference] |
|
|
39
|
-
|
|
|
39
|
+
| Workspace + task runner | pnpm workspaces + Turborepo / npm workspaces / Nx / n/a | [only for fullstack — caching/build needs] |
|
|
40
|
+
| Dev topology | apps on host / everything in Compose | [hot reload versus environment parity] |
|
|
40
41
|
| CI | GitHub Actions / none | [usually GitHub Actions; opt out only for non-public repos] |
|
|
41
42
|
|
|
42
43
|
## Services & Infra
|
|
@@ -47,7 +48,7 @@ services: []
|
|
|
47
48
|
|---------|-------------|----|--------------------|
|
|
48
49
|
| postgres | 5432 | — | POSTGRES_USER=app, POSTGRES_PASSWORD=app, POSTGRES_DB=app |
|
|
49
50
|
| redis | 6379 | — | (no auth in dev) |
|
|
50
|
-
|
|
|
51
|
+
| mailpit | 1025 (smtp), 8025 (UI) | http://localhost:8025 | (no auth) |
|
|
51
52
|
| ... | ... | ... | ... |
|
|
52
53
|
|
|
53
54
|
## Architecture Diagram
|
|
@@ -59,12 +60,12 @@ services: []
|
|
|
59
60
|
[ Browser ] -> [ Next.js (apps/web) ]
|
|
60
61
|
|
|
61
62
|
# Fullstack
|
|
62
|
-
[ Browser ] -> [ Next.js (apps/web) ] -> [
|
|
63
|
+
[ Browser ] -> [ Next.js (apps/web) ] -> [ NestJS (apps/api) ] -> [ Postgres ]
|
|
63
64
|
|-> [ Redis ]
|
|
64
|
-
|-> [
|
|
65
|
+
|-> [ Mailpit ]
|
|
65
66
|
|
|
66
67
|
# With observability
|
|
67
|
-
... -> [
|
|
68
|
+
... -> [ NestJS ] -> { OTLP } -> [ Jaeger ]
|
|
68
69
|
```
|
|
69
70
|
|
|
70
71
|
## Generated Files
|
|
@@ -75,7 +76,7 @@ services: []
|
|
|
75
76
|
{{TARGET_DIR}}/
|
|
76
77
|
├── apps/
|
|
77
78
|
│ ├── web/ (created by `pnpm create next-app`)
|
|
78
|
-
│ └── api/ (
|
|
79
|
+
│ └── api/ (created by `pnpm dlx @nestjs/cli` or selected scaffold)
|
|
79
80
|
├── packages/
|
|
80
81
|
│ └── shared/ (created by /dw-new-project)
|
|
81
82
|
├── docker-compose.dev.yml (composed from .agents/skills/docker-compose-recipes/)
|
|
@@ -36,12 +36,13 @@ Use `/dw-autopilot "desejo"` como gateway pra maior parte do trabalho. Comandos
|
|
|
36
36
|
| `/dw-commit` | Commits atômicos Conventional pra trabalho pendente. |
|
|
37
37
|
| `/dw-generate-pr [target]` | Push branch, draft do PR body, abre browser. |
|
|
38
38
|
|
|
39
|
-
## Tier 3 — Especialidade (
|
|
39
|
+
## Tier 3 — Especialidade (12)
|
|
40
40
|
|
|
41
41
|
| Comando | O que |
|
|
42
42
|
|---------|-------|
|
|
43
43
|
| `/dw-analyze-project` | Scan do repo, escreve `.dw/rules/`, oferece `.dw/constitution.md`, gera `.dw/rules/concerns.md` e sintetiza `DESIGN.md` em frontend quando há tokens. |
|
|
44
44
|
| `/dw-redesign-ui "target"` | Audit, propõe 2-3 direções, entrega. Enforça UI grounding + WCAG; pode rodar o detector determinístico do impeccable. |
|
|
45
|
+
| `/dw-open-design --brief <file>` | Gera, itera ou faz `--refactor` de prototipos HTML headless via Open Design `od`; refina briefs primeiro, pode capturar prints atuais com `--url --viewports` ou `--screenshot`, depois verifica arquivo + gate visual. |
|
|
45
46
|
| `/dw-refactor "target"` | Audita code health e tech debt com smells Fowler, deep-modules e gates de teste preservando comportamento. |
|
|
46
47
|
| `/dw-functional-doc` | Mapeia screens + flows em doc funcional validado com Playwright; usa resolução de browser resiliente no WSL. |
|
|
47
48
|
| `/dw-context-budget` | Audita contexto de commands, skills, agentes, instrucoes e MCPs. |
|
|
@@ -108,6 +109,7 @@ Auto-invocados por comandos primários mas disponíveis standalone.
|
|
|
108
109
|
| `research`, `compara`, `estado da arte` | `/dw-brainstorm --research` |
|
|
109
110
|
| `refactor`, `smell`, `code health`, `tech debt` | `/dw-refactor` |
|
|
110
111
|
| `ui`, `design`, `redesign` | `/dw-redesign-ui` |
|
|
112
|
+
| `open design`, `prototype`, `prototipo`, `od cli`, `html prototype` | `/dw-open-design --brief <file>`, `/dw-open-design --brief-glob "<glob>" --agent claude` ou `/dw-open-design --refactor --url <url> --viewports "1440x900,375x812"` |
|
|
111
113
|
| `intel`, `onde está`, `o que usa` | `/dw-intel` (ou `--build`) |
|
|
112
114
|
| `contexto`, `tokens`, `agente lento` | `/dw-context-budget` |
|
|
113
115
|
| `harness`, `install`, `wrappers`, `agentes` | `/dw-harness-audit` |
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
<system_instructions>
|
|
2
|
-
Voce e o lider de bootstrap de workspace do dev-workflow. Sua funcao e pegar um diretorio vazio
|
|
2
|
+
Voce e o lider de bootstrap de workspace do dev-workflow. Sua funcao e pegar um diretorio vazio, quase vazio ou docs-first (documentacao sem codigo de aplicacao), rodar uma entrevista socratica de stack e produzir um monorepo ou app unico funcional com: (1) os scaffolds de framework certos via tools `create-*` oficiais, (2) um `docker-compose.dev.yml` cobrindo cada dependencia de dev escolhida (db, cache, fila, email, storage, search, observability, proxy), (3) `.env.example`, scripts, `.gitignore`, `.dockerignore`, GitHub Action, README, e (4) um `.dw/rules/index.md` semeado.
|
|
3
3
|
|
|
4
4
|
<critical>Este comando RODA APOS `npx dev-workflow init` ja ter populado o `.dw/`. Se `.dw/commands/` nao existir no diretorio alvo, aborte com: "Rode `npx @brunosps00/dev-workflow init` primeiro, depois reinvoque /dw-new-project."</critical>
|
|
5
5
|
<critical>NUNCA toque arquivos fora do diretorio do novo projeto. A entrevista captura `{{TARGET_DIR}}`; toda escrita fica escopada ali.</critical>
|
|
6
6
|
<critical>A Fase 3 (execucao) so roda apos o usuario aprovar explicitamente o plano apresentado na Fase 2. Sem flag de bypass.</critical>
|
|
7
|
-
<critical>
|
|
7
|
+
<critical>Mailpit e o DEFAULT para email-em-dev. O usuario tem que optar OUT explicitamente antes de qualquer outro destino SMTP ser ligado em dev.</critical>
|
|
8
8
|
|
|
9
9
|
## Quando Usar
|
|
10
10
|
|
|
11
|
-
- Comecando um projeto novo de diretorio vazio e voce quer as convencoes do dev-workflow, infra containerizada e CI prontos do dia 1
|
|
11
|
+
- Comecando um projeto novo de diretorio vazio ou docs-first e voce quer as convencoes do dev-workflow, infra containerizada e CI prontos do dia 1
|
|
12
12
|
- Substituindo o ritual manual de `pnpm create next-app && create vite ...` por uma entrevista guiada que captura o ambiente de dev inteiro
|
|
13
13
|
- Subindo uma sandbox de aprendizado onde voce quer um stack realista (db + cache + email + observability) sem 30 minutos de YAML
|
|
14
|
-
- NAO use para adicionar servicos a um projeto
|
|
14
|
+
- NAO use para adicionar servicos a um projeto que ja tenha manifests ou codigo de aplicacao — use `/dw-dockerize --audit`
|
|
15
15
|
- NAO use para adicionar app novo dentro de um monorepo existente — outra release vai cobrir isso
|
|
16
16
|
- NAO substitui `/dw-plan prd` — este aqui gera o workspace, nao a spec do produto
|
|
17
17
|
|
|
@@ -52,7 +52,7 @@ Execute as fases em ordem. A Fase 3 so roda apos a aprovacao do usuario no fim d
|
|
|
52
52
|
1. Verifique se `.dw/commands/` existe em `{{TARGET_DIR}}`. Se nao, aborte com a mensagem acima.
|
|
53
53
|
2. Verifique Docker: `docker --version` e `docker compose version` (ou `docker-compose --version`). Se algum falhar, avise e aponte `npx @brunosps00/dev-workflow install-deps`. NAO aborte — o usuario pode querer um `--dry-run` mesmo sem Docker.
|
|
54
54
|
3. Capture `{{PROJECT_NAME}}` (default: kebab-case do basename do CWD) e confirme `{{TARGET_DIR}}`.
|
|
55
|
-
4.
|
|
55
|
+
4. Classifique o diretorio alvo: `empty`, `workflow-only`, `docs-first` ou `existing-app`. `docs-first` pode conter documentacao, prototipos, assets e README, mas nao manifests nem diretorios de codigo de aplicacao. Liste os paths que serao preservados e peca confirmacao. Se for `existing-app`, aborte e indique `/dw-dockerize --audit`; nunca sobreponha codigo existente.
|
|
56
56
|
|
|
57
57
|
Emita VERIFICATION REPORT da Fase 0 (versao do Docker capturada, estado do diretorio).
|
|
58
58
|
|
|
@@ -68,21 +68,21 @@ Use `AskUserQuestion` quando disponivel; senao prompts numerados. Pergunte em **
|
|
|
68
68
|
2. **Linguagem(s)**: TypeScript/JavaScript, Python, C#, Rust (por app)
|
|
69
69
|
3. **Framework por camada** (lista curada — recuse fora dela):
|
|
70
70
|
- **Frontend**: Next.js (app router), Vite + React (template TS)
|
|
71
|
-
- **Backend**: FastAPI (Python), ASP.NET Core minimal API (C#), Axum (Rust)
|
|
72
|
-
- **Fullstack
|
|
71
|
+
- **Backend**: NestJS ou Fastify (Node TS), FastAPI (Python), ASP.NET Core minimal API (C#), Axum (Rust)
|
|
72
|
+
- **Fullstack**: T3 stack (bundle unico), Next.js + NestJS ou Next.js + FastAPI (apps separados em monorepo)
|
|
73
73
|
4. **Package manager** (SEM default — perguntar explicitamente):
|
|
74
74
|
- Node: npm / pnpm / yarn
|
|
75
75
|
- Python: poetry / uv / pip + venv
|
|
76
76
|
- .NET: dotnet (built-in)
|
|
77
77
|
- Rust: cargo (built-in)
|
|
78
|
-
5. **Se fullstack** —
|
|
78
|
+
5. **Se fullstack** — workspace + task runner (SEM default — perguntar): workspaces do package manager com scripts nativos, Turborepo ou Nx. Registre combinacoes como `pnpm workspaces + Turborepo`.
|
|
79
79
|
|
|
80
80
|
#### Camada B — Infra (so pergunte o que cabe na forma)
|
|
81
81
|
|
|
82
|
-
6. **Database**: Postgres / MySQL / SQLite (arquivo, sem service) / MongoDB (fora do escopo dos compose recipes — anote e siga sem service se escolhido) / nenhum
|
|
82
|
+
6. **Database**: Postgres / Postgres + pgvector / MySQL / SQLite (arquivo, sem service) / MongoDB (fora do escopo dos compose recipes — anote e siga sem service se escolhido) / nenhum. Para Postgres + pgvector, selecione explicitamente a recipe/version suportada.
|
|
83
83
|
7. **Cache**: Redis / Memcached / nenhum
|
|
84
|
-
8. **Fila / message broker**: BullMQ (so Node), Celery (so Python), RabbitMQ (qualquer), LocalStack SQS (qualquer), nenhum. Se escolheu, pergunte tambem se vai ter workers async.
|
|
85
|
-
9. **Email — captura em dev** (default: **
|
|
84
|
+
8. **Fila / message broker**: pg-boss (Node + Postgres, sem service extra), BullMQ (so Node + Redis), Celery (so Python), RabbitMQ (qualquer), LocalStack SQS (qualquer), nenhum. Se escolheu, pergunte tambem se vai ter workers async.
|
|
85
|
+
9. **Email — captura em dev** (default: **Mailpit**, so pergunte se quer override): Mailpit / MailHog / smtp4dev / pular
|
|
86
86
|
10. **Email — destino em prod** (so pergunte se quer email): SMTP relay / SendGrid / Resend / Postmark / SES / pular
|
|
87
87
|
11. **Object storage**: S3 (real, sem service) / MinIO (dev) / GCS (sem service) / nenhum
|
|
88
88
|
12. **Search**: Meilisearch / Typesense / Elasticsearch / nenhum
|
|
@@ -93,7 +93,8 @@ Use `AskUserQuestion` quando disponivel; senao prompts numerados. Pergunte em **
|
|
|
93
93
|
#### Camada C — Tooling
|
|
94
94
|
|
|
95
95
|
16. **Auth** (so pergunte se aplicavel ao stack):
|
|
96
|
-
- Next.js:
|
|
96
|
+
- Next.js: Auth.js / OIDC generico / Clerk / JWT custom / nenhum
|
|
97
|
+
- NestJS: OIDC generico / Passport JWT / auth custom / nenhum
|
|
97
98
|
- FastAPI: fastapi-users / authlib / JWT custom / nenhum
|
|
98
99
|
- ASP.NET: Identity built-in / IdentityServer / JWT custom / nenhum
|
|
99
100
|
- Axum: tower-cookies + jsonwebtoken / custom / nenhum
|
|
@@ -102,7 +103,8 @@ Use `AskUserQuestion` quando disponivel; senao prompts numerados. Pergunte em **
|
|
|
102
103
|
- Python: Ruff + Black / Ruff so
|
|
103
104
|
- C#: dotnet format
|
|
104
105
|
- Rust: rustfmt + clippy (default)
|
|
105
|
-
18. **
|
|
106
|
+
18. **Topologia de dev**: apps no host + infra no Compose / tudo no Compose. Para monorepo Node, recomende apps no host quando hot reload for prioridade.
|
|
107
|
+
19. **CI**: GitHub Actions (sempre seed; usuario pode optar OUT)
|
|
106
108
|
|
|
107
109
|
Guarde todas as respostas para a Fase 2.
|
|
108
110
|
|
|
@@ -133,6 +135,7 @@ Rode nesta ordem. Cada passo emite seu mini-VERIFICATION block.
|
|
|
133
135
|
| Next.js | `pnpm create next-app@latest <dir> --ts --tailwind --eslint --app --import-alias '@/*' --use-pnpm --no-git` |
|
|
134
136
|
| Vite + React | `pnpm create vite@latest <dir> --template react-ts` |
|
|
135
137
|
| T3 | `pnpm dlx create-t3-app@latest <dir> --noGit --CI --tailwind --trpc --prisma --nextAuth --appRouter` |
|
|
138
|
+
| NestJS | `pnpm dlx @nestjs/cli@latest new <dir> --package-manager pnpm --skip-git --strict` |
|
|
136
139
|
| Fastify | `pnpm create fastify@latest <dir>` (corte prompts interativos; se nenhuma flag servir, gere a estrutura inline com `src/server.ts` + `src/routes/` + `package.json`) |
|
|
137
140
|
| FastAPI | SEM `create-*` oficial. Gere inline: `pyproject.toml` (com o package manager escolhido), `app/{routers,models,schemas,deps}/`, `app/main.py`, esqueleto de `tests/` |
|
|
138
141
|
| ASP.NET Core | `dotnet new webapi -n <name> --use-minimal-apis --auth None` (use `--auth Individual` se Identity foi escolhido) |
|
|
@@ -142,12 +145,12 @@ Ajuste a flag de package manager para a escolha do usuario (ex.: `--use-npm`, `-
|
|
|
142
145
|
|
|
143
146
|
Para **fullstack-T3**: e so isso (T3 entrega tudo numa arvore so).
|
|
144
147
|
|
|
145
|
-
Para **fullstack-NextJS+FastAPI**: rode dois scaffolds
|
|
148
|
+
Para **fullstack-NextJS+NestJS** ou **fullstack-NextJS+FastAPI**: rode dois scaffolds diretamente em `apps/web/` e `apps/api/`, sem mover ou apagar documentacao preexistente.
|
|
146
149
|
|
|
147
150
|
#### 3.2 Compor monorepo (so se fullstack)
|
|
148
151
|
|
|
149
152
|
Se fullstack:
|
|
150
|
-
1.
|
|
153
|
+
1. Se um app foi scaffoldado fora do caminho final do workspace, mova-o para `apps/<nome>/`. Apps scaffoldados diretamente em `apps/web/` ou `apps/api/` ja estao no lugar e nao devem ser movidos novamente.
|
|
151
154
|
2. Crie `pnpm-workspace.yaml` (ou equivalente), `package.json` raiz com scripts de workspace, `tsconfig.base.json` se TS config compartilhado.
|
|
152
155
|
3. Se o usuario escolheu Turborepo: adicione `turbo.json` com pipelines `dev`, `build`, `lint`, `test`.
|
|
153
156
|
4. Se o usuario escolheu Nx: rode `pnpm dlx nx@latest init` apos os apps estarem no lugar; integre como projetos Nx.
|
|
@@ -159,7 +162,7 @@ Se fullstack:
|
|
|
159
162
|
- Concatene blocos sob `services:`.
|
|
160
163
|
- Agregue volumes nomeados sob `volumes:`.
|
|
161
164
|
- Resolva colisoes de porta se houver.
|
|
162
|
-
-
|
|
165
|
+
- Se a topologia for `tudo no Compose`, adicione o(s) service(s) do app no fim (build context = `apps/<nome>` ou raiz, Dockerfile.dev, env_file, volumes, depends_on com `condition: service_healthy`). Se for `apps no host`, componha apenas infraestrutura e use endpoints `localhost` nas env vars consumidas pelas apps.
|
|
163
166
|
3. Adicione header: `# Generated by /dw-new-project on YYYY-MM-DD`.
|
|
164
167
|
|
|
165
168
|
#### 3.4 Gerar `.env.example`
|
|
@@ -214,7 +217,7 @@ Scaffold minimo:
|
|
|
214
217
|
| Database | <db ou n/a> |
|
|
215
218
|
| Cache | <cache ou n/a> |
|
|
216
219
|
| Fila | <fila ou n/a> |
|
|
217
|
-
| Email (dev) | <mailhog|
|
|
220
|
+
| Email (dev) | <mailpit|mailhog|smtp4dev|nenhum> |
|
|
218
221
|
| Search | <search ou n/a> |
|
|
219
222
|
| Observability | <observability ou n/a> |
|
|
220
223
|
| Reverse proxy | <traefik|nenhum> |
|
|
@@ -230,7 +233,7 @@ Scaffold minimo:
|
|
|
230
233
|
## Convencoes
|
|
231
234
|
|
|
232
235
|
- Veja `.dw/rules/<modulo>.md` apos o `/dw-analyze-project` rodar.
|
|
233
|
-
- Email em dev usa
|
|
236
|
+
- Email em dev usa Mailpit por default; o app NUNCA envia email real em dev.
|
|
234
237
|
- Toda env var vive em `.env` (gitignored); `.env.example` e o template.
|
|
235
238
|
```
|
|
236
239
|
|
|
@@ -273,7 +276,7 @@ date: YYYY-MM-DD
|
|
|
273
276
|
shape: <frontend|backend|fullstack>
|
|
274
277
|
languages: [typescript, python, ...]
|
|
275
278
|
frameworks: { web: '...', api: '...' }
|
|
276
|
-
services: [postgres,
|
|
279
|
+
services: [postgres-pgvector, mailpit, minio, ...]
|
|
277
280
|
package_manager: <pnpm|npm|yarn|poetry|uv|cargo|dotnet>
|
|
278
281
|
monorepo: <pnpm-workspaces|turborepo|nx|none>
|
|
279
282
|
---
|
|
@@ -302,7 +305,7 @@ monorepo: <pnpm-workspaces|turborepo|nx|none>
|
|
|
302
305
|
1. `cp .env.example .env` e revise credenciais.
|
|
303
306
|
2. `pnpm install` (ou seu package manager).
|
|
304
307
|
3. `pnpm dev:up` para subir todos os servicos. Aguarde os healthchecks.
|
|
305
|
-
4. Abra a UI do
|
|
308
|
+
4. Abra a UI do Mailpit em http://localhost:8025 para confirmar a captura de email.
|
|
306
309
|
5. `/dw-plan prd` para a primeira feature.
|
|
307
310
|
6. Apos o primeiro commit substancial, rode `/dw-analyze-project` para enriquecer `.dw/rules/`.
|
|
308
311
|
```
|
|
@@ -332,7 +335,7 @@ monorepo: <pnpm-workspaces|turborepo|nx|none>
|
|
|
332
335
|
- Usuario escolhe MongoDB → anote "Recipe MongoDB nao bundled na v0.8.0; vamos adicionar deps de app mas voce vai precisar ligar o servico manualmente". Continue.
|
|
333
336
|
- Usuario escolhe Caddy → idem: anote como nao bundled; siga sem servico no compose.
|
|
334
337
|
- Porta ja ocupada no host → sugira a env var de override e siga; nao escolha outra porta em silencio.
|
|
335
|
-
- Working tree
|
|
338
|
+
- Working tree docs-first → preserve cada path listado e escreva apenas nos novos paths aprovados. Existing app → aborte e indique `/dw-dockerize --audit`.
|
|
336
339
|
|
|
337
340
|
## Integracao com Outros dw-* Commands
|
|
338
341
|
|