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.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +663 -0
  3. package/bin/cli.js +110 -0
  4. package/bin/lint.js +50 -0
  5. package/docs/COMMANDS.md +229 -0
  6. package/docs/COMMITS/INDEX.md +11 -0
  7. package/docs/COMMITS/v0.1.0-existing.md +31 -0
  8. package/docs/COMMITS/v0.1.0-inicial.md +50 -0
  9. package/docs/COMMITS/v0.1.0-readme.md +24 -0
  10. package/docs/COMMITS/v0.2.0-strict-db-templates.md +50 -0
  11. package/docs/COMMITS/v0.3.0-parser-fixes-vscode.md +67 -0
  12. package/docs/COMMITS/v0.3.0-versioning-component.md +44 -0
  13. package/docs/DEPENDENCIES.md +45 -0
  14. package/docs/FRAMEWORK.md +1741 -0
  15. package/docs/SYNTAX.md +359 -0
  16. package/docs/VERSIONING.md +150 -0
  17. package/docs/referencia-metodologia/Anexos Finales Documentos de Respaldo y Estandarizaci/303/263n.md" +90 -0
  18. package/docs/referencia-metodologia/Cotizaciones.md +84 -0
  19. package/docs/referencia-metodologia/Example.md +1 -0
  20. package/docs/referencia-metodologia/ExtractorInformacion.py +78 -0
  21. package/docs/referencia-metodologia/Fase - 1 .- Desarrollo de la Metodolog/303/255a.md" +67 -0
  22. package/docs/referencia-metodologia/Fase - 2 .- Levantamiento de requisitos generales y traduccion a la IA.md +64 -0
  23. package/docs/referencia-metodologia/Fase - 3 .- Prototipado visual con IA (Figma Maker o equivalentes).md +64 -0
  24. package/docs/referencia-metodologia/Fase - 4 .- Especificacion de requisitos e iteracion con el cliente.md +58 -0
  25. package/docs/referencia-metodologia/Fase - 5 .- Estructuracion y maquetado de funciones (Scaffolding).md +118 -0
  26. package/docs/referencia-metodologia/Fase - 6 .- Estructuracion del backlog y division de tareas.md +48 -0
  27. package/docs/referencia-metodologia/Fase - 7 .- Desarrollo activo, pruebas y control de versiones.md +98 -0
  28. package/docs/referencia-metodologia/Fase - 8 .- Entrega, capacitaci/303/263n y mantenimiento.md" +55 -0
  29. package/docs/referencia-metodologia/Figma prompt template.md +130 -0
  30. package/docs/referencia-metodologia/Framework de Desarrollo Asistido por IA.md +1741 -0
  31. package/docs/referencia-metodologia/Indice General.md +83 -0
  32. package/docs/referencia-metodologia/Prompt refactorizar o creacion desde cero.md +50 -0
  33. package/docs/referencia-metodologia/docs/CONVENCIONES_DB.md +410 -0
  34. package/docs/referencia-metodologia/docs/CONVENCIONES_DOCUMENTACION.md +209 -0
  35. package/docs/referencia-metodologia/docs/PROMPTS/INDEX.md +73 -0
  36. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/01-hook-supabase.md +79 -0
  37. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/02-componente-ui.md +82 -0
  38. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/03-pagina-feature.md +70 -0
  39. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/04-comando-tauri.md +56 -0
  40. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/05-store-zustand.md +74 -0
  41. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/06-servicio-supabase.md +74 -0
  42. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/07-formulario-validacion.md +63 -0
  43. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/08-hook-capacitor.md +65 -0
  44. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/09-refactor-division.md +51 -0
  45. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/10-scaffolding-inicial.md +79 -0
  46. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/11-supabase-crud-service.md +114 -0
  47. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/12-supabase-hook-usetable.md +143 -0
  48. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/13-tauri-command-rust.md +84 -0
  49. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/14-tauri-wrapper-typescript.md +92 -0
  50. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/15-documentar-tabla-db.md +50 -0
  51. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/16-diagrama-arquitectura.md +60 -0
  52. package/docs/referencia-metodologia/docs/PROMPTS/PLANTILLAS/17-documentar-api-rpc.md +56 -0
  53. package/docs/referencia-metodologia/docs/PROMPTS/STACK/ionic-capacitor.md +52 -0
  54. package/docs/referencia-metodologia/docs/PROMPTS/STACK/react-web-puro.md +46 -0
  55. package/docs/referencia-metodologia/docs/PROMPTS/STACK/tauri-desktop.md +53 -0
  56. package/package.json +56 -0
  57. package/schemas/prompt-lang.json +98 -0
  58. package/src/commands/component.js +326 -0
  59. package/src/commands/context.js +206 -0
  60. package/src/commands/figma.js +63 -0
  61. package/src/commands/init.js +373 -0
  62. package/src/commands/suggest.js +31 -0
  63. package/src/commands/validate.js +183 -0
  64. package/src/generators/figma-prompt.js +56 -0
  65. package/src/utils/ai.js +143 -0
  66. package/src/utils/annotations.js +510 -0
  67. package/src/utils/config.js +60 -0
  68. package/vscode-extension/README.md +31 -0
  69. package/vscode-extension/language-configuration.json +7 -0
  70. package/vscode-extension/package.json +62 -0
  71. package/vscode-extension/snippets/promptlang.json +105 -0
  72. package/vscode-extension/syntaxes/annotations.tmGrammar.json +39 -0
  73. 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
+ ```