openprompt-lang 0.3.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/LICENSE +21 -0
- package/README.md +663 -0
- package/bin/cli.js +110 -0
- package/bin/lint.js +50 -0
- package/docs/COMMANDS.md +229 -0
- package/docs/COMMITS/INDEX.md +11 -0
- package/docs/COMMITS/v0.1.0-existing.md +31 -0
- package/docs/COMMITS/v0.1.0-inicial.md +50 -0
- package/docs/COMMITS/v0.1.0-readme.md +24 -0
- package/docs/COMMITS/v0.2.0-strict-db-templates.md +50 -0
- package/docs/COMMITS/v0.3.0-parser-fixes-vscode.md +67 -0
- package/docs/COMMITS/v0.3.0-versioning-component.md +44 -0
- package/docs/DEPENDENCIES.md +45 -0
- package/docs/FRAMEWORK.md +1741 -0
- package/docs/SYNTAX.md +359 -0
- package/docs/VERSIONING.md +150 -0
- package/docs/referencia-metodologia/Anexos Finales Documentos de Respaldo y Estandarizaci/303/263n.md" +90 -0
- package/docs/referencia-metodologia/Cotizaciones.md +84 -0
- package/docs/referencia-metodologia/Example.md +1 -0
- package/docs/referencia-metodologia/ExtractorInformacion.py +78 -0
- package/docs/referencia-metodologia/Fase - 1 .- Desarrollo de la Metodolog/303/255a.md" +67 -0
- package/docs/referencia-metodologia/Fase - 2 .- Levantamiento de requisitos generales y traduccion a la IA.md +64 -0
- package/docs/referencia-metodologia/Fase - 3 .- Prototipado visual con IA (Figma Maker o equivalentes).md +64 -0
- package/docs/referencia-metodologia/Fase - 4 .- Especificacion de requisitos e iteracion con el cliente.md +58 -0
- package/docs/referencia-metodologia/Fase - 5 .- Estructuracion y maquetado de funciones (Scaffolding).md +118 -0
- package/docs/referencia-metodologia/Fase - 6 .- Estructuracion del backlog y division de tareas.md +48 -0
- package/docs/referencia-metodologia/Fase - 7 .- Desarrollo activo, pruebas y control de versiones.md +98 -0
- package/docs/referencia-metodologia/Fase - 8 .- Entrega, capacitaci/303/263n y mantenimiento.md" +55 -0
- package/docs/referencia-metodologia/Figma prompt template.md +130 -0
- package/docs/referencia-metodologia/Framework de Desarrollo Asistido por IA.md +1741 -0
- package/docs/referencia-metodologia/Indice General.md +83 -0
- package/docs/referencia-metodologia/Prompt refactorizar o creacion desde cero.md +50 -0
- package/docs/referencia-metodologia/docs/CONVENCIONES_DB.md +410 -0
- package/docs/referencia-metodologia/docs/CONVENCIONES_DOCUMENTACION.md +209 -0
- package/docs/referencia-metodologia/docs/PROMPTS/INDEX.md +73 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/01-hook-supabase.md +79 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/02-componente-ui.md +82 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/03-pagina-feature.md +70 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/04-comando-tauri.md +56 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/05-store-zustand.md +74 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/06-servicio-supabase.md +74 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/07-formulario-validacion.md +63 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/08-hook-capacitor.md +65 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/09-refactor-division.md +51 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/10-scaffolding-inicial.md +79 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/11-supabase-crud-service.md +114 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/12-supabase-hook-usetable.md +143 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/13-tauri-command-rust.md +84 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/14-tauri-wrapper-typescript.md +92 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/15-documentar-tabla-db.md +50 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/16-diagrama-arquitectura.md +60 -0
- package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/17-documentar-api-rpc.md +56 -0
- package/docs/referencia-metodologia/docs/PROMPTS/STACK/ionic-capacitor.md +52 -0
- package/docs/referencia-metodologia/docs/PROMPTS/STACK/react-web-puro.md +46 -0
- package/docs/referencia-metodologia/docs/PROMPTS/STACK/tauri-desktop.md +53 -0
- package/package.json +56 -0
- package/schemas/prompt-lang.json +98 -0
- package/src/commands/component.js +326 -0
- package/src/commands/context.js +206 -0
- package/src/commands/figma.js +63 -0
- package/src/commands/init.js +373 -0
- package/src/commands/suggest.js +31 -0
- package/src/commands/validate.js +183 -0
- package/src/generators/figma-prompt.js +56 -0
- package/src/utils/ai.js +143 -0
- package/src/utils/annotations.js +510 -0
- package/src/utils/config.js +60 -0
- package/vscode-extension/README.md +31 -0
- package/vscode-extension/language-configuration.json +7 -0
- package/vscode-extension/package.json +62 -0
- package/vscode-extension/snippets/promptlang.json +105 -0
- package/vscode-extension/syntaxes/annotations.tmGrammar.json +39 -0
- package/vscode-extension/syntaxes/promptlang.tmGrammar.json +14 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# Convenciones de Documentación para Proyectos React + Supabase
|
|
2
|
+
|
|
3
|
+
> Estándar para documentar tablas DB, arquitectura y flujos de datos. Integrado con openPrompt-Lang y las fases de la metodología.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Documentación de Tablas DB
|
|
8
|
+
|
|
9
|
+
Cada tabla se documenta con este formato en `docs/DB/TABLES.md`:
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
## products
|
|
13
|
+
|
|
14
|
+
Tabla de productos del catálogo.
|
|
15
|
+
|
|
16
|
+
| Columna | Tipo | Nulo | Default | FK | Descripción |
|
|
17
|
+
|---|---|---|---|---|---|
|
|
18
|
+
| id | `uuid` | NO | `gen_random_uuid()` | — | Primary key |
|
|
19
|
+
| name | `text` | NO | — | — | Nombre del producto |
|
|
20
|
+
| slug | `text` | NO | — | — | URL slug (único) |
|
|
21
|
+
| description | `text` | SÍ | — | — | Descripción larga |
|
|
22
|
+
| price | `numeric(10,2)` | NO | `0` | — | Precio en USD |
|
|
23
|
+
| category_id | `uuid` | NO | — | `categories(id)` | Categoría |
|
|
24
|
+
| active | `bool` | NO | `true` | — | Visible en catálogo |
|
|
25
|
+
| metadata | `jsonb` | SÍ | `'{}'` | — | Datos flexibles |
|
|
26
|
+
| created_at | `timestamptz` | NO | `now()` | — | Fecha de creación |
|
|
27
|
+
| updated_at | `timestamptz` | NO | `now()` | — | Última modificación |
|
|
28
|
+
|
|
29
|
+
### Índices
|
|
30
|
+
| Nombre | Columnas | Tipo | Condición |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| `idx_products_category` | `category_id` | B-tree | — |
|
|
33
|
+
| `idx_products_active` | `created_at` | B-tree partial | `WHERE active = true` |
|
|
34
|
+
| `idx_products_name_search` | `name` | GIN trgm | — |
|
|
35
|
+
|
|
36
|
+
### RLS
|
|
37
|
+
| Operación | Política | USING |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| `SELECT` | `products_select_all` | `true` (catálogo público) |
|
|
40
|
+
| `INSERT` | `products_insert_admin` | `auth.role() = 'admin'` |
|
|
41
|
+
| `UPDATE` | `products_update_admin` | `auth.role() = 'admin'` |
|
|
42
|
+
| `DELETE` | `products_delete_admin` | `auth.role() = 'admin'` |
|
|
43
|
+
|
|
44
|
+
### Relaciones
|
|
45
|
+
- `category_id` → `categories(id)` — Cada producto pertenece a una categoría
|
|
46
|
+
- `order_items.product_id` → `products(id)` — Un producto aparece en muchos pedidos
|
|
47
|
+
|
|
48
|
+
### Notas
|
|
49
|
+
- `slug` tiene unique constraint + trigger de generación automática desde `name`
|
|
50
|
+
- `metadata` almacena campos variables por tipo de producto (peso, color, talla)
|
|
51
|
+
- Los productos inactivos no se muestran en el catálogo pero se mantienen para histórico
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 2. Diagramas de Arquitectura (Mermaid)
|
|
57
|
+
|
|
58
|
+
### 2.1 Árbol de Componentes (`graph TD`)
|
|
59
|
+
|
|
60
|
+
Usar para visualizar la jerarquía de componentes de una página o feature:
|
|
61
|
+
|
|
62
|
+
```mermaid
|
|
63
|
+
graph TD
|
|
64
|
+
App --> Router
|
|
65
|
+
Router --> LoginPage
|
|
66
|
+
Router --> DashboardPage
|
|
67
|
+
Router --> ProductsPage
|
|
68
|
+
DashboardPage --> Header
|
|
69
|
+
DashboardPage --> StatsGrid
|
|
70
|
+
DashboardPage --> RecentOrders
|
|
71
|
+
StatsGrid --> StatCard
|
|
72
|
+
StatCard --> Icon
|
|
73
|
+
StatCard --> Value
|
|
74
|
+
ProductsPage --> ProductTable
|
|
75
|
+
ProductsPage --> ProductFilters
|
|
76
|
+
ProductTable --> RowActions
|
|
77
|
+
RowActions --> EditButton
|
|
78
|
+
RowActions --> DeleteButton
|
|
79
|
+
DeleteButton --> ConfirmModal
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
En markdown:
|
|
83
|
+
````markdown
|
|
84
|
+
```mermaid
|
|
85
|
+
graph TD
|
|
86
|
+
App --> Router
|
|
87
|
+
Router --> DashboardPage
|
|
88
|
+
DashboardPage --> Header
|
|
89
|
+
DashboardPage --> StatsGrid
|
|
90
|
+
```
|
|
91
|
+
````
|
|
92
|
+
|
|
93
|
+
### 2.2 Flujo de Datos (`sequenceDiagram`)
|
|
94
|
+
|
|
95
|
+
Usar para visualizar interacciones usuario → UI → hook → servicio → DB:
|
|
96
|
+
|
|
97
|
+
```mermaid
|
|
98
|
+
sequenceDiagram
|
|
99
|
+
actor U as Usuario
|
|
100
|
+
participant PG as ProductsPage
|
|
101
|
+
participant H as useProducts
|
|
102
|
+
participant S as supabase
|
|
103
|
+
participant DB as PostgreSQL
|
|
104
|
+
|
|
105
|
+
U->>PG: Abre página de productos
|
|
106
|
+
PG->>H: mount
|
|
107
|
+
H->>S: .from('products').select('id,name,price')
|
|
108
|
+
S->>DB: SELECT con RLS
|
|
109
|
+
DB-->>S: rows
|
|
110
|
+
S-->>H: { data }
|
|
111
|
+
H-->>PG: render table
|
|
112
|
+
U->>PG: Click eliminar producto
|
|
113
|
+
PG->>ConfirmModal: open
|
|
114
|
+
U->>ConfirmModal: Confirmar
|
|
115
|
+
ConfirmModal->>H: delete(id)
|
|
116
|
+
H->>S: .update({ deleted_at: now() })
|
|
117
|
+
S-->>H: success
|
|
118
|
+
H-->>PG: refetch
|
|
119
|
+
Note over PG: Soft delete + refetch automático
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 2.3 Modelo Entidad-Relación (`erDiagram`)
|
|
123
|
+
|
|
124
|
+
Para proyectos con más de 5 tablas relacionadas:
|
|
125
|
+
|
|
126
|
+
```mermaid
|
|
127
|
+
erDiagram
|
|
128
|
+
users ||--o{ orders : "places"
|
|
129
|
+
users {
|
|
130
|
+
uuid id PK
|
|
131
|
+
text email
|
|
132
|
+
text name
|
|
133
|
+
}
|
|
134
|
+
orders ||--|{ order_items : contains
|
|
135
|
+
orders {
|
|
136
|
+
uuid id PK
|
|
137
|
+
uuid user_id FK
|
|
138
|
+
numeric total
|
|
139
|
+
timestamptz created_at
|
|
140
|
+
}
|
|
141
|
+
products ||--o{ order_items : includes
|
|
142
|
+
products {
|
|
143
|
+
uuid id PK
|
|
144
|
+
text name
|
|
145
|
+
numeric price
|
|
146
|
+
}
|
|
147
|
+
order_items {
|
|
148
|
+
uuid id PK
|
|
149
|
+
uuid order_id FK
|
|
150
|
+
uuid product_id FK
|
|
151
|
+
int quantity
|
|
152
|
+
numeric price
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## 3. Documentación de APIs / RPC
|
|
159
|
+
|
|
160
|
+
Cada función RPC se documenta con contrato de entrada/salida:
|
|
161
|
+
|
|
162
|
+
```markdown
|
|
163
|
+
## create_order
|
|
164
|
+
|
|
165
|
+
Crea un pedido con sus items en una transacción.
|
|
166
|
+
|
|
167
|
+
### Contrato
|
|
168
|
+
| Campo | Descripción |
|
|
169
|
+
|---|---|
|
|
170
|
+
| **In** | `p_user_id: UUID`, `p_items: JSONB[{product_id, quantity, price}]` |
|
|
171
|
+
| **Out** | `{ order_id: UUID, total: NUMERIC }` |
|
|
172
|
+
| **Errores** | `23503` (producto no existe), `P0001` (stock insuficiente) |
|
|
173
|
+
|
|
174
|
+
### Seguridad
|
|
175
|
+
- `SECURITY DEFINER` — ejecuta con permisos del creador
|
|
176
|
+
- RLS en tabla `orders` filtrada por `user_id`
|
|
177
|
+
- Solo accesible vía RPC (no hay INSERT directo desde el cliente)
|
|
178
|
+
|
|
179
|
+
### Uso desde frontend
|
|
180
|
+
```typescript
|
|
181
|
+
const { data, error } = await supabase.rpc('create_order', {
|
|
182
|
+
p_user_id: userId,
|
|
183
|
+
p_items: cart.map(i => ({ product_id: i.id, quantity: i.qty, price: i.price }))
|
|
184
|
+
})
|
|
185
|
+
if (error?.code === '23503') {
|
|
186
|
+
toast.error('Uno o más productos no existen')
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 4. Integración con las Fases de la Metodología
|
|
194
|
+
|
|
195
|
+
| Fase | Documentación generada | Archivos |
|
|
196
|
+
|---|---|---|
|
|
197
|
+
| **Fase 5 — Scaffolding** | Estructura de carpetas + routing + tipos globales | `docs/ARQUITECTURA.md`, diagrama component tree |
|
|
198
|
+
| **Fase 6 — Backlog** | Definición de tablas + RLS + contratos RPC | `docs/DB/TABLES.md`, `docs/DB/RPCS.md` |
|
|
199
|
+
| **Fase 7 — Desarrollo** | Por feature: secuencia de datos + componentes | Diagramas `sequenceDiagram` en cada PR/commit |
|
|
200
|
+
| **Fase 8 — Entrega** | Documentación completa + índices + migraciones | Todo `docs/DB/`, diagramas actualizados |
|
|
201
|
+
|
|
202
|
+
### Checklist por feature
|
|
203
|
+
|
|
204
|
+
- [ ] ¿La tabla está documentada en `docs/DB/TABLES.md`?
|
|
205
|
+
- [ ] ¿Las RLS policies están definidas por operación?
|
|
206
|
+
- [ ] ¿Los índices cubren los filtros principales?
|
|
207
|
+
- [ ] ¿Hay un `sequenceDiagram` del flujo principal?
|
|
208
|
+
- [ ] ¿Los tipos TypeScript están generados desde la DB?
|
|
209
|
+
- [ ] ¿La migración SQL está versionada con `supabase migration new`?
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Biblioteca de Prompts
|
|
3
|
+
description: Índice de prompts reutilizables para desarrollo asistido por IA
|
|
4
|
+
tags: [prompts, index, biblioteca]
|
|
5
|
+
version: 1.0.0
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Biblioteca de Prompts
|
|
9
|
+
|
|
10
|
+
> Cada prompt aquí ha sido probado al menos una vez en proyectos reales. Son plantillas para copiar-pegar, no recetas teóricas. La estructura sigue el formato determinista de `Framework de Desarrollo Asistido por IA.md` sección 9.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Cómo usar
|
|
15
|
+
|
|
16
|
+
1. Encuentra el prompt que necesitas por categoría
|
|
17
|
+
2. Copia el contenido del archivo `.md` correspondiente
|
|
18
|
+
3. Pega en la IA junto con la referencia: *"Revisa docs/AGENTS.md y docs/Framework de Desarrollo Asistido por IA.md antes de responder"*
|
|
19
|
+
4. Ajusta los `{placeholder}` según tu contexto
|
|
20
|
+
|
|
21
|
+
> 📚 **Documentación complementaria:**
|
|
22
|
+
> - `docs/CONVENCIONES_DB.md` — 18 prácticas de base de datos (RLS, índices, paginación, batch, etc.)
|
|
23
|
+
> - `docs/CONVENCIONES_DOCUMENTACION.md` — Estándares de documentación (tablas DB, diagramas Mermaid, contratos RPC)
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## PLANTILLAS — Prompts genéricos reutilizables
|
|
28
|
+
|
|
29
|
+
| # | Archivo | Para qué sirve | Stack |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| 01 | [01-hook-supabase.md](PLANTILLAS/01-hook-supabase.md) | Hook CRUD genérico con Supabase `<T>` | React + Supabase |
|
|
32
|
+
| 02 | [02-componente-ui.md](PLANTILLAS/02-componente-ui.md) | Componente UI con variantes (cva) | React + Tailwind |
|
|
33
|
+
| 03 | [03-pagina-feature.md](PLANTILLAS/03-pagina-feature.md) | Página completa con composición de componentes | React + Tailwind |
|
|
34
|
+
| 04 | [04-comando-tauri.md](PLANTILLAS/04-comando-tauri.md) | Comando Tauri en Rust + llamada desde frontend | Tauri v2 + Rust |
|
|
35
|
+
| 05 | [05-store-zustand.md](PLANTILLAS/05-store-zustand.md) | Store de estado global con Zustand | React + Zustand |
|
|
36
|
+
| 06 | [06-servicio-supabase.md](PLANTILLAS/06-servicio-supabase.md) | Servicio CRUD con manejo de errores | Supabase + TS |
|
|
37
|
+
| 07 | [07-formulario-validacion.md](PLANTILLAS/07-formulario-validacion.md) | Formulario con validación (react-hook-form + zod) | React + Zod |
|
|
38
|
+
| 08 | [08-hook-capacitor.md](PLANTILLAS/08-hook-capacitor.md) | Hook para plugin nativo de Capacitor | Capacitor + React |
|
|
39
|
+
| 09 | [09-refactor-division.md](PLANTILLAS/09-refactor-division.md) | Refactorizar componente grande en módulos pequeños | React + TS |
|
|
40
|
+
| 10 | [10-scaffolding-inicial.md](PLANTILLAS/10-scaffolding-inicial.md) | Scaffolding completo de un feature/módulo | React + TS |
|
|
41
|
+
| 11 | [11-supabase-crud-service.md](PLANTILLAS/11-supabase-crud-service.md) | Servicio CRUD con batch, RLS, signed URLs, errores por código | Supabase + TS |
|
|
42
|
+
| 12 | [12-supabase-hook-usetable.md](PLANTILLAS/12-supabase-hook-usetable.md) | Hook useSupabaseList con keyset pagination y filtros | React + Supabase |
|
|
43
|
+
| 13 | [13-tauri-command-rust.md](PLANTILLAS/13-tauri-command-rust.md) | Comando Tauri en Rust con validación de inputs | Tauri v2 + Rust |
|
|
44
|
+
| 14 | [14-tauri-wrapper-typescript.md](PLANTILLAS/14-tauri-wrapper-typescript.md) | Wrapper TS para comandos Tauri con tipado estricto | Tauri v2 + TS |
|
|
45
|
+
| 15 | [15-documentar-tabla-db.md](PLANTILLAS/15-documentar-tabla-db.md) | Documentar tabla DB: columnas, tipos, RLS, índices | Docs + Supabase |
|
|
46
|
+
| 16 | [16-diagrama-arquitectura.md](PLANTILLAS/16-diagrama-arquitectura.md) | Diagramas Mermaid de componente tree + flujo de datos | Docs + Mermaid |
|
|
47
|
+
| 17 | [17-documentar-api-rpc.md](PLANTILLAS/17-documentar-api-rpc.md) | Documentar función RPC con contrato in/out + errores | Docs + Supabase |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## STACK — Prompts específicos por tecnología
|
|
52
|
+
|
|
53
|
+
| Archivo | Para qué sirve |
|
|
54
|
+
|---|---|
|
|
55
|
+
| [react-web-puro.md](STACK/react-web-puro.md) | Contexto completo para proyecto web React + Supabase (sin mobile/desktop) |
|
|
56
|
+
| [ionic-capacitor.md](STACK/ionic-capacitor.md) | Contexto para proyecto mobile con Ionic + Capacitor |
|
|
57
|
+
| [tauri-desktop.md](STACK/tauri-desktop.md) | Contexto para proyecto desktop con Tauri |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## HISTORIAL — Prompts archivados
|
|
62
|
+
|
|
63
|
+
Los prompts que se usan en proyectos reales se archivean aquí con anotaciones de qué funcionó y qué no. Ver `HISTORIAL/`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Reglas de la biblioteca
|
|
68
|
+
|
|
69
|
+
1. **Un prompt por archivo.** Si un prompt cubre dos cosas distintas, se divide.
|
|
70
|
+
2. **Metadatos obligatorios** (title, tags, usado_en, fecha) al inicio del archivo.
|
|
71
|
+
3. **Solo se archiva lo probado.** Si no se usó en un proyecto real, no se agrega.
|
|
72
|
+
4. **Los fallos también se guardan** en `HISTORIAL/` con nota de por qué no funcionó.
|
|
73
|
+
5. **Si se modifica un prompt**, se actualiza `ultima_modificacion` y se agrega changelog al final.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Hook CRUD genérico con Supabase
|
|
3
|
+
tags: [hook, supabase, generics, typescript]
|
|
4
|
+
usado_en: []
|
|
5
|
+
fecha_creacion: 2026-05-13
|
|
6
|
+
ultima_modificacion: 2026-05-13
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Cuándo usar
|
|
10
|
+
|
|
11
|
+
Cuando necesites un hook que obtenga datos de una tabla de Supabase con filtros, ordenamiento y tipado genérico. Ideal para listas, tablas y vistas que consumen datos de una sola tabla.
|
|
12
|
+
|
|
13
|
+
## Prompt
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## Contexto
|
|
17
|
+
Stack: React 18 + TypeScript + Vite + Supabase.
|
|
18
|
+
Convenciones: hooks en src/hooks/, un hook por archivo, máximo 80 líneas.
|
|
19
|
+
Patrón: hook genérico con <T> para tipado dinámico.
|
|
20
|
+
Referencia: docs/Framework de Desarrollo Asistido por IA.md sección 7 (patrón custom hook genérico).
|
|
21
|
+
|
|
22
|
+
## Objetivo
|
|
23
|
+
Crear el hook `useSupabaseTable<T>` que haga CRUD a una tabla de Supabase con tipado genérico.
|
|
24
|
+
|
|
25
|
+
## Especificaciones técnicas
|
|
26
|
+
- Archivo: `src/hooks/useSupabaseTable.ts`
|
|
27
|
+
- Retornar: `{ data: T[]; loading: boolean; error: string | null; refetch: () => void }`
|
|
28
|
+
- Parámetros: `{ table: string; select?: string; filters?: Record<string, unknown>; order?: { column: string; ascending?: boolean } }`
|
|
29
|
+
- Máximo 65 líneas
|
|
30
|
+
- Usar el cliente de Supabase desde `src/services/supabase/client.ts`
|
|
31
|
+
|
|
32
|
+
## Reglas estrictas
|
|
33
|
+
- Tipar con TypeScript usando genéricos `<T>`
|
|
34
|
+
- `loading` debe iniciar en `true`
|
|
35
|
+
- `error` debe ser `string | null`, nunca `any`
|
|
36
|
+
- El fetch debe ejecutarse en un `useEffect` con dependencias `[table, JSON.stringify(filters)]`
|
|
37
|
+
- Si `filters` cambia, debe refetch automáticamente
|
|
38
|
+
|
|
39
|
+
## Anti-patrones (prohibido)
|
|
40
|
+
- NO usar `any`
|
|
41
|
+
- NO mezclar lógica de UI en el hook
|
|
42
|
+
- NO hacer fetch en el render, solo en useEffect
|
|
43
|
+
- NO mutar el estado directamente
|
|
44
|
+
|
|
45
|
+
## Ejemplo correcto
|
|
46
|
+
```typescript
|
|
47
|
+
interface UseTableOptions<T> {
|
|
48
|
+
table: string
|
|
49
|
+
select?: string
|
|
50
|
+
filters?: Record<string, unknown>
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface UseTableResult<T> {
|
|
54
|
+
data: T[]
|
|
55
|
+
loading: boolean
|
|
56
|
+
error: string | null
|
|
57
|
+
refetch: () => void
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function useSupabaseTable<T>({ table, select = "*", filters }: UseTableOptions<T>): UseTableResult<T> {
|
|
61
|
+
// implementación con useState + useEffect + supabase.from(table).select(select)
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Ejemplo incorrecto
|
|
66
|
+
```typescript
|
|
67
|
+
// ❌ Sin genéricos, sin loading state, any en filters
|
|
68
|
+
export function useTable(table: string) {
|
|
69
|
+
const [data, setData] = useState<any[]>([])
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
supabase.from(table).select("*").then((res: any) => setData(res.data))
|
|
72
|
+
}, [])
|
|
73
|
+
return data
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Formato de salida esperado
|
|
78
|
+
Archivo completo listo para copiar a `src/hooks/useSupabaseTable.ts`.
|
|
79
|
+
```
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Componente UI con variantes (cva)
|
|
3
|
+
tags: [componente, ui, cva, tailwind, shadcn]
|
|
4
|
+
usado_en: []
|
|
5
|
+
fecha_creacion: 2026-05-13
|
|
6
|
+
ultima_modificacion: 2026-05-13
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Cuándo usar
|
|
10
|
+
|
|
11
|
+
Cuando necesites crear un componente de UI reutilizable con variantes visuales (ej: Button con primary/secondary/ghost, Input con estados error/success). Sigue el patrón shadcn/ui con `class-variance-authority`.
|
|
12
|
+
|
|
13
|
+
## Prompt
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## Contexto
|
|
17
|
+
Stack: React 18 + TypeScript + Tailwind CSS 3.4.
|
|
18
|
+
Convenciones: componentes atómicos en src/components/ui/, un componente por archivo, máximo 120 líneas, 100% Tailwind.
|
|
19
|
+
Patrón: shadcn/ui con cva (class-variance-authority) para variantes.
|
|
20
|
+
Referencia: docs/Framework de Desarrollo Asistido por IA.md sección 7 (patrón componente UI reutilizable).
|
|
21
|
+
|
|
22
|
+
## Objetivo
|
|
23
|
+
Crear el componente `{ComponenteName}` con variantes visuales usando cva.
|
|
24
|
+
|
|
25
|
+
## Especificaciones técnicas
|
|
26
|
+
- Archivo: `src/components/ui/{ComponenteName}.tsx`
|
|
27
|
+
- Usar `class-variance-authority` para las variantes
|
|
28
|
+
- Usar `memo` para evitar re-renderizados innecesarios
|
|
29
|
+
- Extender las props nativas del elemento HTML correspondiente
|
|
30
|
+
- Exportar: el componente + `{componenteName}Variants` (el objeto cva)
|
|
31
|
+
- Incluir `displayName` en el componente
|
|
32
|
+
- Máximo 90 líneas
|
|
33
|
+
|
|
34
|
+
## Variantes requeridas
|
|
35
|
+
- variant: { lista de variantes, ej: primary, secondary, ghost, destructive }
|
|
36
|
+
- size: { lista de tamaños, ej: sm, default, lg }
|
|
37
|
+
|
|
38
|
+
## Reglas estrictas
|
|
39
|
+
- Tipar con `VariantProps<typeof componenteVariants>` para las variantes
|
|
40
|
+
- Usar `React.forwardRef` o pasar ref directamente según el elemento
|
|
41
|
+
- `memo` obligatorio para evitar re-renders
|
|
42
|
+
- Incluir clases base comunes en el primer argumento de cva
|
|
43
|
+
- Valores por defecto en `defaultVariants`
|
|
44
|
+
|
|
45
|
+
## Anti-patrones (prohibido)
|
|
46
|
+
- NO usar CSS personalizado o modules
|
|
47
|
+
- NO usar `any`
|
|
48
|
+
- NO mezclar lógica de negocio en el componente UI
|
|
49
|
+
- NO omitir `displayName`
|
|
50
|
+
|
|
51
|
+
## Ejemplo correcto
|
|
52
|
+
```typescript
|
|
53
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
54
|
+
import { memo } from "react"
|
|
55
|
+
|
|
56
|
+
const buttonVariants = cva("inline-flex items-center justify-center rounded-md text-sm font-medium", {
|
|
57
|
+
variants: {
|
|
58
|
+
variant: {
|
|
59
|
+
primary: "bg-blue-600 text-white hover:bg-blue-700",
|
|
60
|
+
secondary: "bg-gray-100 text-gray-900 hover:bg-gray-200",
|
|
61
|
+
},
|
|
62
|
+
size: {
|
|
63
|
+
default: "h-10 px-4 py-2",
|
|
64
|
+
sm: "h-9 rounded-md px-3",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
defaultVariants: { variant: "primary", size: "default" },
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {}
|
|
71
|
+
|
|
72
|
+
const Button = memo<ButtonProps>(({ className, variant, size, ...props }) => (
|
|
73
|
+
<button className={buttonVariants({ variant, size, className })} {...props} />
|
|
74
|
+
))
|
|
75
|
+
Button.displayName = "Button"
|
|
76
|
+
|
|
77
|
+
export { Button, buttonVariants }
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Formato de salida esperado
|
|
81
|
+
Archivo completo listo para `src/components/ui/{ComponenteName}.tsx`.
|
|
82
|
+
```
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Página completa con composición de componentes
|
|
3
|
+
tags: [pagina, feature, composicion, layout]
|
|
4
|
+
usado_en: []
|
|
5
|
+
fecha_creacion: 2026-05-13
|
|
6
|
+
ultima_modificacion: 2026-05-13
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Cuándo usar
|
|
10
|
+
|
|
11
|
+
Cuando necesites crear una página completa de un feature. El prompt fuerza la división en componentes más pequeños desde el inicio, evitando páginas monolíticas.
|
|
12
|
+
|
|
13
|
+
## Prompt
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## Contexto
|
|
17
|
+
Stack: React 18 + TypeScript + Tailwind CSS + {router}.
|
|
18
|
+
Convenciones: páginas en src/features/{feature}/, componentes específicos en src/features/{feature}/components/, hooks en src/features/{feature}/hooks/.
|
|
19
|
+
Límite: FeaturePage max 200 líneas. Cada componente hijo max 120 líneas.
|
|
20
|
+
Referencia: docs/Framework de Desarrollo Asistido por IA.md sección 2 (estructura features/).
|
|
21
|
+
|
|
22
|
+
## Objetivo
|
|
23
|
+
Crear la página `{FeatureName}Page` con sus componentes y hooks necesarios.
|
|
24
|
+
|
|
25
|
+
## Especificaciones técnicas
|
|
26
|
+
Archivos a crear:
|
|
27
|
+
- `src/features/{feature}/{FeatureName}Page.tsx` (máx 200 líneas, solo composición)
|
|
28
|
+
- `src/features/{feature}/components/{SubComponente1}.tsx` (máx 120 líneas)
|
|
29
|
+
- `src/features/{feature}/components/{SubComponente2}.tsx` (máx 120 líneas)
|
|
30
|
+
- `src/features/{feature}/hooks/use{FeatureName}.ts` (máx 80 líneas)
|
|
31
|
+
|
|
32
|
+
## Secciones visuales de la página
|
|
33
|
+
1. {Header: título, acciones principales}
|
|
34
|
+
2. {Listado/Tabla: datos principales}
|
|
35
|
+
3. {Modal/Formulario: crear/editar}
|
|
36
|
+
4. {Empty state: cuando no hay datos}
|
|
37
|
+
|
|
38
|
+
## Reglas estrictas
|
|
39
|
+
- La página SOLO compone componentes hijos, no implementa lógica directamente
|
|
40
|
+
- Cada sección identificable debe ser un componente separado
|
|
41
|
+
- La lógica de datos va en el hook `use{FeatureName}`, no en la página
|
|
42
|
+
- Tipos específicos del feature van en `src/features/{feature}/types/`
|
|
43
|
+
|
|
44
|
+
## Anti-patrones (prohibido)
|
|
45
|
+
- NO crear una página monolítica de 500+ líneas
|
|
46
|
+
- NO poner lógica de fetching en el componente de página
|
|
47
|
+
- NO mezclar estilos inline con Tailwind
|
|
48
|
+
|
|
49
|
+
## Estructura esperada del archivo principal
|
|
50
|
+
```typescript
|
|
51
|
+
// {FeatureName}Page.tsx
|
|
52
|
+
function {FeatureName}Page() {
|
|
53
|
+
const { data, loading, error, handleCreate, handleDelete } = use{FeatureName}()
|
|
54
|
+
|
|
55
|
+
if (loading) return <Skeleton />
|
|
56
|
+
if (error) return <ErrorState message={error} />
|
|
57
|
+
if (!data.length) return <EmptyState />
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<div className="p-6">
|
|
61
|
+
<PageHeader title="..." onAdd={handleCreate} />
|
|
62
|
+
<DataTable data={data} onDelete={handleDelete} />
|
|
63
|
+
</div>
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Formato de salida esperado
|
|
69
|
+
Todos los archivos del feature listos para copiar, con imports correctos entre ellos.
|
|
70
|
+
```
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Comando Tauri en Rust + llamada frontend
|
|
3
|
+
tags: [tauri, rust, comando, ipc]
|
|
4
|
+
usado_en: []
|
|
5
|
+
fecha_creacion: 2026-05-13
|
|
6
|
+
ultima_modificacion: 2026-05-13
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Cuándo usar
|
|
10
|
+
|
|
11
|
+
Cuando necesites crear un comando Tauri (Rust) que se llame desde el frontend React. Típicamente para operaciones de sistema de archivos, procesos locales o acceso a hardware que no cubre Capacitor.
|
|
12
|
+
|
|
13
|
+
## Prompt
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## Contexto
|
|
17
|
+
Stack: Tauri v2 + Rust + React + TypeScript.
|
|
18
|
+
Convenciones: comandos Rust en src-tauri/src/commands/, cada comando en su propio archivo.
|
|
19
|
+
Llamadas desde frontend en src/services/tauri/.
|
|
20
|
+
Referencia: docs/Framework de Desarrollo Asistido por IA.md sección 1 (convenciones Tauri).
|
|
21
|
+
|
|
22
|
+
## Objetivo
|
|
23
|
+
Crear el comando Tauri `{command_name}` que {descripción de lo que hace}.
|
|
24
|
+
|
|
25
|
+
## Especificaciones técnicas
|
|
26
|
+
Archivos a crear/modificar:
|
|
27
|
+
- `src-tauri/src/commands/{command_name}.rs` (comando Rust)
|
|
28
|
+
- `src-tauri/src/main.rs` (registrar el comando)
|
|
29
|
+
- `src/services/tauri/{command_name}.ts` (wrapper tipado para frontend)
|
|
30
|
+
|
|
31
|
+
### Comando Rust
|
|
32
|
+
- Anotación: `#[tauri::command]`
|
|
33
|
+
- Firma: `fn {command_name}({params}) -> Result<{output}, String>`
|
|
34
|
+
- Validar todos los inputs antes de ejecutar
|
|
35
|
+
- Devolver error legible en español
|
|
36
|
+
|
|
37
|
+
### Wrapper frontend
|
|
38
|
+
- Usar `import { invoke } from "@tauri-apps/api/core"`
|
|
39
|
+
- Tipar entrada y salida con interfaces
|
|
40
|
+
- Manejar error con try/catch
|
|
41
|
+
|
|
42
|
+
## Reglas estrictas
|
|
43
|
+
- Tipado estricto en Rust (String, no &str para parámetros)
|
|
44
|
+
- No permitir path traversal si el comando accede al sistema de archivos
|
|
45
|
+
- Devolver error específico, no genérico
|
|
46
|
+
- El wrapper frontend debe tipar el invoke con genéricos
|
|
47
|
+
|
|
48
|
+
## Anti-patrones (prohibido)
|
|
49
|
+
- NO usar `std::fs::read_to_string` sin validar path primero
|
|
50
|
+
- NO exponer comandos inseguros sin validación de permisos
|
|
51
|
+
- NO poner lógica de negocio compleja en Rust si puede ir en el frontend
|
|
52
|
+
- NO mezclar con lógica de Capacitor en el mismo servicio
|
|
53
|
+
|
|
54
|
+
## Formato de salida esperado
|
|
55
|
+
Código Rust del comando + wrapper TypeScript + instrucción de registro en main.rs.
|
|
56
|
+
```
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Store de estado global con Zustand
|
|
3
|
+
tags: [zustand, store, estado-global, typescript]
|
|
4
|
+
usado_en: []
|
|
5
|
+
fecha_creacion: 2026-05-13
|
|
6
|
+
ultima_modificacion: 2026-05-13
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Cuándo usar
|
|
10
|
+
|
|
11
|
+
Cuando necesites estado global compartido entre múltiples componentes (sesión de usuario, UI state, carrito, etc). Zustand es la opción recomendada sobre Context por su simplicidad y performance.
|
|
12
|
+
|
|
13
|
+
## Prompt
|
|
14
|
+
|
|
15
|
+
```markdown
|
|
16
|
+
## Contexto
|
|
17
|
+
Stack: React 18 + TypeScript + Zustand.
|
|
18
|
+
Convenciones: stores en src/store/, un store por dominio, máximo 100 líneas.
|
|
19
|
+
Patrón: store con actions y state separados (slice pattern si es complejo).
|
|
20
|
+
Referencia: docs/Framework de Desarrollo Asistido por IA.md sección 2 (estructura store/).
|
|
21
|
+
|
|
22
|
+
## Objetivo
|
|
23
|
+
Crear el store Zustand `{name}Store` para manejar {descripción del dominio}.
|
|
24
|
+
|
|
25
|
+
## Especificaciones técnicas
|
|
26
|
+
- Archivo: `src/store/{name}Store.ts`
|
|
27
|
+
- Usar `import { create } from "zustand"`
|
|
28
|
+
- Estado: {listar las propiedades del estado}
|
|
29
|
+
- Acciones: {listar las acciones: set, reset, fetch, etc.}
|
|
30
|
+
- Integrar con {algún servicio externo si aplica}
|
|
31
|
+
- Máximo 80 líneas
|
|
32
|
+
|
|
33
|
+
## Reglas estrictas
|
|
34
|
+
- Tipar todo el estado y las acciones con interfaces
|
|
35
|
+
- Acciones que modifican el estado deben ser inmutables (usar spread o immer)
|
|
36
|
+
- Si hay lógica async, las acciones deben ser async y manejar loading/error
|
|
37
|
+
- Exportar el hook `use{Name}Store` como default
|
|
38
|
+
|
|
39
|
+
## Anti-patrones (prohibido)
|
|
40
|
+
- NO mutar el estado directamente
|
|
41
|
+
- NO poner lógica de UI en el store
|
|
42
|
+
- NO duplicar estado que ya existe en Supabase/BD local
|
|
43
|
+
- NO crear stores globales para estado que podría ser prop drilling simple
|
|
44
|
+
|
|
45
|
+
## Ejemplo parcial
|
|
46
|
+
```typescript
|
|
47
|
+
import { create } from "zustand"
|
|
48
|
+
|
|
49
|
+
interface AuthState {
|
|
50
|
+
user: User | null
|
|
51
|
+
loading: boolean
|
|
52
|
+
login: (email: string, password: string) => Promise<void>
|
|
53
|
+
logout: () => void
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const useAuthStore = create<AuthState>((set) => ({
|
|
57
|
+
user: null,
|
|
58
|
+
loading: false,
|
|
59
|
+
login: async (email, password) => {
|
|
60
|
+
set({ loading: true })
|
|
61
|
+
try {
|
|
62
|
+
const user = await authService.login(email, password)
|
|
63
|
+
set({ user, loading: false })
|
|
64
|
+
} catch {
|
|
65
|
+
set({ loading: false })
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
logout: () => set({ user: null }),
|
|
69
|
+
}))
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Formato de salida esperado
|
|
73
|
+
Archivo completo listo para `src/store/{name}Store.ts`.
|
|
74
|
+
```
|