@samline/notify 0.1.6 → 0.1.8
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/README.md +5 -5
- package/dist/index.cjs.js +0 -11
- package/dist/index.esm.js +0 -11
- package/docs/browser.md +4 -4
- package/package.json +9 -8
- package/rollup.config.mjs +11 -2
- package/.local/agent-index.md +0 -63
- package/.local/deploy-and-release-guide.md +0 -277
- package/.local/lessons.md +0 -76
- package/.local/package-replication-guide.md +0 -501
- package/.local/todo.md +0 -49
- package/AGENTS.md +0 -55
- package/dist/notifications.umd.js +0 -1133
- package/dist/samline.notifications.umd.js +0 -1131
|
@@ -1,501 +0,0 @@
|
|
|
1
|
-
# Blueprint Interno Para Replicar Este Paquete En Otro Dominio
|
|
2
|
-
|
|
3
|
-
## Instrucción Para La IA
|
|
4
|
-
|
|
5
|
-
Este archivo está escrito para que la IA que trabaje dentro de este repositorio lo revise antes de proponer o construir un paquete nuevo basado en esta misma arquitectura.
|
|
6
|
-
|
|
7
|
-
Si en una conversación futura se pide crear otro paquete siguiendo este modelo, la IA debe revisar primero este documento, identificar qué partes del scaffold actual sí aplican al nuevo dominio y pedir la información faltante antes de generar código.
|
|
8
|
-
|
|
9
|
-
## Objetivo
|
|
10
|
-
|
|
11
|
-
Este documento resume la arquitectura completa de este paquete y la traduce a un blueprint reutilizable para construir un paquete independiente con la misma calidad de implementación, por ejemplo un paquete para parsear, convertir y formatear fechas.
|
|
12
|
-
|
|
13
|
-
La meta no es clonar el dominio de visibilidad, sino reutilizar su estructura de producto:
|
|
14
|
-
|
|
15
|
-
- core compartido
|
|
16
|
-
- entrypoints por entorno o framework
|
|
17
|
-
- build multi-entrypoint
|
|
18
|
-
- documentación separada por variante
|
|
19
|
-
- pruebas por capa
|
|
20
|
-
- publicación npm con controles previos
|
|
21
|
-
|
|
22
|
-
## Qué Debo Pedirte Antes De Crear El Nuevo Paquete
|
|
23
|
-
|
|
24
|
-
Antes de empezar la implementación, necesito estos datos:
|
|
25
|
-
|
|
26
|
-
1. Nombre del paquete npm.
|
|
27
|
-
2. Descripción corta del paquete.
|
|
28
|
-
3. Objetivo funcional exacto.
|
|
29
|
-
4. Código fuente inicial del paquete o una especificación funcional suficientemente precisa.
|
|
30
|
-
5. API pública deseada.
|
|
31
|
-
6. Dependencias runtime obligatorias.
|
|
32
|
-
7. Peer dependencies opcionales, si aplica.
|
|
33
|
-
8. Frameworks que deben estar soportados desde la primera versión.
|
|
34
|
-
9. Si debe existir una variante browser o CDN sin build step.
|
|
35
|
-
10. Versión mínima de Node.js.
|
|
36
|
-
11. Licencia.
|
|
37
|
-
12. URL de repositorio, homepage e issues, si ya existen.
|
|
38
|
-
13. Ejemplos reales de uso esperados.
|
|
39
|
-
14. Restricciones de compatibilidad o rendimiento.
|
|
40
|
-
15. Estrategia de publicación: público o privado, alcance npm, prerelease o release estable.
|
|
41
|
-
16. Preferencias de testing, lint, formateo y cobertura.
|
|
42
|
-
|
|
43
|
-
Sin esos datos, el scaffold puede quedar técnicamente correcto pero mal alineado con el producto real.
|
|
44
|
-
|
|
45
|
-
### Regla por defecto de compatibilidad Node
|
|
46
|
-
|
|
47
|
-
Si el usuario no define otra restricción, los paquetes replicados desde este blueprint deben mantenerse compatibles con Node 20 o superior, incluyendo Node 24 y versiones posteriores que sigan siendo razonables para el stack elegido.
|
|
48
|
-
|
|
49
|
-
La IA no debe subir el requisito mínimo de Node por encima de 20 ni usar APIs que fuercen esa subida sin una solicitud explícita.
|
|
50
|
-
|
|
51
|
-
## Regla De Uso Para La IA
|
|
52
|
-
|
|
53
|
-
Antes de iniciar un scaffold nuevo dentro de este repositorio o en uno similar, la IA debe:
|
|
54
|
-
|
|
55
|
-
1. Revisar este archivo completo.
|
|
56
|
-
2. Confirmar si el nuevo dominio realmente necesita variantes React, Vue, Svelte o browser.
|
|
57
|
-
3. Pedir el código fuente o la especificación funcional si todavía no existe suficiente detalle.
|
|
58
|
-
4. No asumir que todos los entrypoints del paquete actual deben replicarse.
|
|
59
|
-
5. Mantener el resultado alineado con el alcance real y no con una plantilla inflada.
|
|
60
|
-
|
|
61
|
-
## Resumen Del Paquete Actual
|
|
62
|
-
|
|
63
|
-
Este proyecto sigue una arquitectura multi-entrypoint con TypeScript y ESM:
|
|
64
|
-
|
|
65
|
-
- un core compartido en src/core
|
|
66
|
-
- una API vanilla reutilizable
|
|
67
|
-
- un bundle browser global para uso sin bundler
|
|
68
|
-
- wrappers idiomáticos para React, Vue y Svelte
|
|
69
|
-
- documentación específica por entorno en docs/
|
|
70
|
-
- pruebas separadas por capa en test/
|
|
71
|
-
|
|
72
|
-
### Capacidades del scaffold actual
|
|
73
|
-
|
|
74
|
-
1. Exporta varias entradas desde un solo paquete npm.
|
|
75
|
-
2. Publica solo dist/.
|
|
76
|
-
3. Genera tipos TypeScript para cada subpath.
|
|
77
|
-
4. Mantiene peer dependencies opcionales para frameworks.
|
|
78
|
-
5. Ejecuta build, typecheck y tests antes de publicar.
|
|
79
|
-
|
|
80
|
-
## Archivos Que Sirven Como Plantilla
|
|
81
|
-
|
|
82
|
-
### Metadatos y build
|
|
83
|
-
|
|
84
|
-
- package.json: nombre del paquete, exports, peer dependencies, scripts, files publicados.
|
|
85
|
-
- package.json: nombre del paquete, exports, peer dependencies, scripts, files publicados y engines alineado con compatibilidad Node 20 o superior si no se indicó otra cosa.
|
|
86
|
-
- tsup.config.ts: build ESM por subpath y bundle IIFE para browser.
|
|
87
|
-
- tsconfig.json: configuración estricta TypeScript con NodeNext.
|
|
88
|
-
- .gitignore: exclusiones locales y de build.
|
|
89
|
-
|
|
90
|
-
### Código fuente
|
|
91
|
-
|
|
92
|
-
- src/core/observe.ts: patrón de núcleo compartido desacoplado del framework.
|
|
93
|
-
- src/index.ts: entrypoint principal del paquete.
|
|
94
|
-
- src/vanilla/index.ts: wrapper base para consumo DOM o librería directa.
|
|
95
|
-
- src/browser/global.ts: exposición a globalThis para uso sin bundler.
|
|
96
|
-
- src/react/\*: adaptación idiomática a React.
|
|
97
|
-
- src/vue/\*: adaptación idiomática a Vue.
|
|
98
|
-
- src/svelte/\*: adaptación idiomática a Svelte.
|
|
99
|
-
|
|
100
|
-
### Documentación
|
|
101
|
-
|
|
102
|
-
- README.md: usar una estructura práctica y navegable, evitando secciones promocionales genéricas como "Why This Package" salvo que el usuario las pida.
|
|
103
|
-
- README.md: la tabla de contenidos por defecto debe seguir este orden cuando aplique: Installation, CDN / Browser, Entrypoints, Quick Start, API, Supported Locales, Documentation, License.
|
|
104
|
-
- README.md: incluir instalación con npm, pnpm, yarn y bun, y añadir CDN / Browser cuando exista una variante sin bundler.
|
|
105
|
-
- README.md: si el paquete no depende de locales, la sección Supported Locales debe indicarlo explícitamente en vez de inventar compatibilidad localizada.
|
|
106
|
-
- docs/vanilla.md: contrato base compartido.
|
|
107
|
-
- docs/browser.md: uso sin compilación.
|
|
108
|
-
- docs/react.md: uso idiomático en React.
|
|
109
|
-
- docs/vue.md: uso idiomático en Vue.
|
|
110
|
-
- docs/svelte.md: uso idiomático en Svelte.
|
|
111
|
-
|
|
112
|
-
### Testing
|
|
113
|
-
|
|
114
|
-
- test/helpers/intersection-observer.ts: helper centralizado para mocks del entorno.
|
|
115
|
-
- test/index.test.ts: cobertura del core y wrapper base.
|
|
116
|
-
- test/browser/global.test.ts: validación del bundle browser.
|
|
117
|
-
- test/react/\*: pruebas de hook y componente.
|
|
118
|
-
- test/vue/\*: pruebas de composable y componente.
|
|
119
|
-
- test/svelte/\*: pruebas de helper, stores y action.
|
|
120
|
-
|
|
121
|
-
## Arquitectura Reutilizable
|
|
122
|
-
|
|
123
|
-
La parte reusable no es IntersectionObserver en sí, sino la separación de responsabilidades.
|
|
124
|
-
|
|
125
|
-
### Capa 1: Core compartido
|
|
126
|
-
|
|
127
|
-
El core debe contener la lógica del dominio sin dependencias de framework.
|
|
128
|
-
|
|
129
|
-
Ejemplos:
|
|
130
|
-
|
|
131
|
-
- visibilidad: observeVisibility
|
|
132
|
-
- fechas: parseDate, formatDate, convertTimezone, compareDates
|
|
133
|
-
- moneda: parseMoney, formatMoney, normalizeCurrency
|
|
134
|
-
|
|
135
|
-
Reglas:
|
|
136
|
-
|
|
137
|
-
1. No depender de React, Vue ni Svelte.
|
|
138
|
-
2. Exponer tipos reutilizables.
|
|
139
|
-
3. Resolver el comportamiento principal del dominio.
|
|
140
|
-
4. Ser la base de todas las variantes posteriores.
|
|
141
|
-
|
|
142
|
-
### Capa 2: API vanilla o shared
|
|
143
|
-
|
|
144
|
-
Esta capa expone el core con la interfaz más simple posible.
|
|
145
|
-
|
|
146
|
-
Debe existir incluso si luego se agregan wrappers por framework, porque:
|
|
147
|
-
|
|
148
|
-
- define el contrato base
|
|
149
|
-
- simplifica pruebas unitarias
|
|
150
|
-
- facilita el uso en scripts y librerías
|
|
151
|
-
- evita duplicar lógica en wrappers
|
|
152
|
-
|
|
153
|
-
### Capa 3: Variantes por framework
|
|
154
|
-
|
|
155
|
-
Solo deben existir si el framework gana una API idiomática real.
|
|
156
|
-
|
|
157
|
-
Ejemplos:
|
|
158
|
-
|
|
159
|
-
- React: hooks y componentes
|
|
160
|
-
- Vue: composables y componentes
|
|
161
|
-
- Svelte: stores y actions
|
|
162
|
-
|
|
163
|
-
No hay que forzar wrappers si el dominio no lo necesita. Si el paquete nuevo es puramente funcional, puede quedarse en core más vanilla.
|
|
164
|
-
|
|
165
|
-
### Capa 4: Variante browser o CDN
|
|
166
|
-
|
|
167
|
-
Esta capa solo tiene sentido si el paquete debe funcionar en entornos sin bundler, como:
|
|
168
|
-
|
|
169
|
-
- Shopify
|
|
170
|
-
- WordPress
|
|
171
|
-
- plantillas HTML tradicionales
|
|
172
|
-
- scripts embebidos
|
|
173
|
-
|
|
174
|
-
Si el paquete nuevo va a vivir solo en entornos con build step, esta capa puede omitirse.
|
|
175
|
-
|
|
176
|
-
## Árbol Recomendado Para Un Nuevo Paquete
|
|
177
|
-
|
|
178
|
-
```text
|
|
179
|
-
package-name/
|
|
180
|
-
├── .github/
|
|
181
|
-
│ └── workflows/
|
|
182
|
-
│ └── publish.yml
|
|
183
|
-
├── LICENSE
|
|
184
|
-
├── README.md
|
|
185
|
-
├── package.json
|
|
186
|
-
├── tsconfig.json
|
|
187
|
-
├── tsup.config.ts
|
|
188
|
-
├── docs/
|
|
189
|
-
│ ├── browser.md
|
|
190
|
-
│ ├── vanilla.md
|
|
191
|
-
│ ├── react.md
|
|
192
|
-
│ ├── svelte.md
|
|
193
|
-
│ └── vue.md
|
|
194
|
-
├── src/
|
|
195
|
-
│ ├── index.ts
|
|
196
|
-
│ ├── browser/
|
|
197
|
-
│ │ └── global.ts
|
|
198
|
-
│ ├── core/
|
|
199
|
-
│ │ └── domain-core.ts
|
|
200
|
-
│ ├── react/
|
|
201
|
-
│ │ ├── index.ts
|
|
202
|
-
│ │ ├── use-domain.ts
|
|
203
|
-
│ │ └── domain-component.tsx
|
|
204
|
-
│ ├── svelte/
|
|
205
|
-
│ │ ├── index.ts
|
|
206
|
-
│ │ ├── types.ts
|
|
207
|
-
│ │ ├── use-domain.ts
|
|
208
|
-
│ │ └── domain-action.ts
|
|
209
|
-
│ ├── vanilla/
|
|
210
|
-
│ │ └── index.ts
|
|
211
|
-
│ └── vue/
|
|
212
|
-
│ ├── index.ts
|
|
213
|
-
│ ├── use-domain.ts
|
|
214
|
-
│ └── domain-component.ts
|
|
215
|
-
└── test/
|
|
216
|
-
├── index.test.ts
|
|
217
|
-
├── browser/
|
|
218
|
-
│ └── global.test.ts
|
|
219
|
-
├── helpers/
|
|
220
|
-
│ └── environment-helper.ts
|
|
221
|
-
├── react/
|
|
222
|
-
├── svelte/
|
|
223
|
-
└── vue/
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
Si el paquete no necesita frameworks o browser, ese árbol debe reducirse, no mantenerse por costumbre.
|
|
227
|
-
|
|
228
|
-
## Entry Points Que Debes Decidir
|
|
229
|
-
|
|
230
|
-
Este paquete actual publica:
|
|
231
|
-
|
|
232
|
-
- paquete raíz
|
|
233
|
-
- /vanilla
|
|
234
|
-
- /react
|
|
235
|
-
- /vue
|
|
236
|
-
- /svelte
|
|
237
|
-
- bundle browser externo en dist/browser
|
|
238
|
-
|
|
239
|
-
Para un nuevo paquete, decide explícitamente cuáles de estos subpaths existen desde el día uno.
|
|
240
|
-
|
|
241
|
-
### Regla de decisión
|
|
242
|
-
|
|
243
|
-
1. Mantén el entrypoint raíz.
|
|
244
|
-
2. Mantén vanilla si el paquete tiene una API utilitaria base.
|
|
245
|
-
3. Añade React, Vue y Svelte solo si habrá integración idiomática, no solo reexportación vacía.
|
|
246
|
-
4. Añade browser solo si el caso real sin bundler existe.
|
|
247
|
-
|
|
248
|
-
## Build Y Publicación
|
|
249
|
-
|
|
250
|
-
### Patrón actual que conviene replicar
|
|
251
|
-
|
|
252
|
-
1. TypeScript estricto.
|
|
253
|
-
2. Build con tsup.
|
|
254
|
-
3. Salida ESM por subpath.
|
|
255
|
-
4. Tipos generados para cada export.
|
|
256
|
-
5. prepublishOnly con clean, build, typecheck y test.
|
|
257
|
-
6. files en package.json limitado a dist.
|
|
258
|
-
8. Workflow de GitHub Actions para publicar por tag cuando el paquete deba desplegarse en npm.
|
|
259
|
-
9. Compatibilidad de engines y decisiones de implementación que no rompan soporte para Node 20 o superior salvo instrucción explícita.
|
|
260
|
-
|
|
261
|
-
### Scripts mínimos recomendados
|
|
262
|
-
|
|
263
|
-
```json
|
|
264
|
-
{
|
|
265
|
-
"clean": "rm -rf dist",
|
|
266
|
-
"build": "tsup --config tsup.config.ts",
|
|
267
|
-
"dev": "tsup --config tsup.config.ts --watch",
|
|
268
|
-
"format": "prettier --write .",
|
|
269
|
-
"format:check": "prettier --check .",
|
|
270
|
-
"typecheck": "tsc --noEmit",
|
|
271
|
-
"test": "vitest run",
|
|
272
|
-
"prepublishOnly": "npm run clean && npm run build && npm run typecheck && npm test"
|
|
273
|
-
}
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### Decisiones que debes fijar al crear el nuevo paquete
|
|
277
|
-
|
|
278
|
-
1. Nombre de los subpaths exportados.
|
|
279
|
-
2. Si habrá peerDependencies opcionales.
|
|
280
|
-
3. Si habrá bundle IIFE global para browser.
|
|
281
|
-
4. Si el target seguirá siendo es2020 o cambiará.
|
|
282
|
-
5. Si la variante root será equivalente a vanilla o a otro agregado.
|
|
283
|
-
|
|
284
|
-
## Patrón De Documentación A Replicar
|
|
285
|
-
|
|
286
|
-
### README principal
|
|
287
|
-
|
|
288
|
-
Debe contener:
|
|
289
|
-
|
|
290
|
-
1. Descripción corta del paquete.
|
|
291
|
-
2. Tabla de contenidos obligatoria para navegar las secciones principales.
|
|
292
|
-
3. Instalación mínima con npm, pnpm, yarn y bun.
|
|
293
|
-
4. Casos de uso reales.
|
|
294
|
-
5. Tabla de entrypoints.
|
|
295
|
-
6. Quick start del entrypoint principal.
|
|
296
|
-
7. Índice hacia la documentación específica.
|
|
297
|
-
8. Resumen de la API compartida.
|
|
298
|
-
9. Notas de compatibilidad.
|
|
299
|
-
10. Licencia.
|
|
300
|
-
|
|
301
|
-
### Reglas mínimas del README de paquete
|
|
302
|
-
|
|
303
|
-
El README principal debe funcionar como puerta de entrada del paquete, no como reemplazo completo de la documentación por variante.
|
|
304
|
-
|
|
305
|
-
Reglas mínimas:
|
|
306
|
-
|
|
307
|
-
1. La tabla de contenidos no es opcional. Debe existir siempre que el README tenga varias secciones de producto o API.
|
|
308
|
-
2. La sección de instalación debe mostrar como mínimo comandos para npm, pnpm, yarn y bun.
|
|
309
|
-
3. Si el paquete publica una variante browser sin bundler, el README debe documentar también una opción CDN pública o una estrategia de consumo remoto equivalente.
|
|
310
|
-
4. La parte de CDN debe explicar de forma explícita cómo usar el paquete cuando el proyecto no puede compilar npm modules, por ejemplo en Shopify, WordPress o plantillas HTML sin bundler.
|
|
311
|
-
5. La tabla de entrypoints debe basarse en exports reales del paquete y, cuando sea útil, indicar el nombre principal del hook, helper, store o global expuesto.
|
|
312
|
-
6. El quick start debe mostrar el camino más simple para usar el paquete sin obligar al lector a abrir la documentación específica.
|
|
313
|
-
7. El README principal debe enlazar a las guías de docs por entorno en lugar de duplicar toda la explicación allí.
|
|
314
|
-
8. Si el paquete depende de otra librería base, conviene reconocerla y enlazarla cuando eso aclare el contexto técnico.
|
|
315
|
-
9. El README debe seguir siendo compacto: suficiente para orientar, instalar y arrancar, sin inflarse con casos secundarios.
|
|
316
|
-
|
|
317
|
-
### Regla condicional para CDN y browser build
|
|
318
|
-
|
|
319
|
-
Si existe browser build publicable, la documentación debe incluir:
|
|
320
|
-
|
|
321
|
-
1. una URL de ejemplo usable desde CDN o servicio equivalente
|
|
322
|
-
2. una recomendación de fijar versión en producción
|
|
323
|
-
3. el nombre real del objeto global o módulo expuesto
|
|
324
|
-
4. una nota breve de cuándo usar esa variante en lugar del paquete instalado por gestor
|
|
325
|
-
5. un ejemplo simple de uso directo en la página para proyectos sin bundler
|
|
326
|
-
6. lenguaje explícito para casos reales como Shopify, WordPress o plantillas sin compilación
|
|
327
|
-
|
|
328
|
-
### Regla de sincronización de versión para referencias CDN
|
|
329
|
-
|
|
330
|
-
Antes de crear un commit de release o empujar un tag nuevo, la IA debe revisar README y docs que contengan URLs CDN versionadas del paquete.
|
|
331
|
-
|
|
332
|
-
Reglas:
|
|
333
|
-
|
|
334
|
-
1. Si el tag cambia de versión, también deben cambiar las referencias CDN versionadas en la documentación antes del commit.
|
|
335
|
-
2. La documentación no debe quedarse apuntando a una versión anterior si el release que se va a publicar usa otra versión.
|
|
336
|
-
3. La revisión debe incluir como mínimo el README principal y cualquier guía browser o CDN en docs/.
|
|
337
|
-
4. Ejemplo: si el README usa `@samline/date@2.1.1` en CDN y se va a publicar `v2.2.2`, primero hay que actualizar esas referencias a `2.2.2` y después crear el commit y el tag.
|
|
338
|
-
5. Si todavía no existe una URL CDN estable para documentar, no debe inventarse; primero debe definirse la estrategia real de publicación.
|
|
339
|
-
6. Si el objetivo es soportar proyectos sin bundler y sin `type="module"`, el paquete debe generar también un bundle browser clásico compatible con `<script src="..."></script>` y la documentación debe usar ese archivo.
|
|
340
|
-
|
|
341
|
-
### Documentación por variante
|
|
342
|
-
|
|
343
|
-
Cada guía de docs/ debe seguir una estructura consistente:
|
|
344
|
-
|
|
345
|
-
1. Cuándo usar esa variante.
|
|
346
|
-
2. Cómo importar.
|
|
347
|
-
3. Ejemplo mínimo funcional.
|
|
348
|
-
4. API o contrato de retorno.
|
|
349
|
-
5. Opciones disponibles.
|
|
350
|
-
6. Ejemplos adicionales.
|
|
351
|
-
7. Enlace a la API compartida si aplica.
|
|
352
|
-
|
|
353
|
-
## Patrón De Testing A Replicar
|
|
354
|
-
|
|
355
|
-
### Nivel mínimo obligatorio
|
|
356
|
-
|
|
357
|
-
1. Tests del core compartido.
|
|
358
|
-
2. Tests del wrapper base o vanilla.
|
|
359
|
-
3. Tests del bundle browser si existe.
|
|
360
|
-
4. Tests por framework para la integración idiomática.
|
|
361
|
-
5. Helper compartido para mocks del entorno cuando el dominio lo requiera.
|
|
362
|
-
|
|
363
|
-
### Qué debe validar cada capa
|
|
364
|
-
|
|
365
|
-
#### Core
|
|
366
|
-
|
|
367
|
-
- comportamiento base
|
|
368
|
-
- opciones principales
|
|
369
|
-
- edge cases
|
|
370
|
-
- errores previsibles
|
|
371
|
-
- cleanup o teardown si existe
|
|
372
|
-
|
|
373
|
-
#### Vanilla
|
|
374
|
-
|
|
375
|
-
- contrato público
|
|
376
|
-
- parámetros
|
|
377
|
-
- retorno
|
|
378
|
-
- comportamiento observable para el consumidor
|
|
379
|
-
|
|
380
|
-
#### Browser
|
|
381
|
-
|
|
382
|
-
- exposición global correcta
|
|
383
|
-
- nombres globales esperados
|
|
384
|
-
- compatibilidad del bundle en entorno sin importaciones
|
|
385
|
-
|
|
386
|
-
#### Frameworks
|
|
387
|
-
|
|
388
|
-
- React: hooks, estado, refs, cleanup, componentes si existen
|
|
389
|
-
- Vue: composables, refs, lifecycle, componentes si existen
|
|
390
|
-
- Svelte: stores, actions, cleanup y actualizaciones
|
|
391
|
-
|
|
392
|
-
## Mapeo Del Dominio Actual A Un Paquete De Fechas
|
|
393
|
-
|
|
394
|
-
### Equivalencia conceptual
|
|
395
|
-
|
|
396
|
-
| Este paquete | Paquete de fechas equivalente |
|
|
397
|
-
| -------------------- | ----------------------------------------------------- |
|
|
398
|
-
| core de visibilidad | core de parsing, conversión y formateo |
|
|
399
|
-
| wrapper vanilla | funciones utilitarias directas |
|
|
400
|
-
| React hook | hook para estado derivado o parsing reactivo |
|
|
401
|
-
| Vue composable | composable para fechas reactivas |
|
|
402
|
-
| Svelte helper/action | stores o helper reactivo para fechas |
|
|
403
|
-
| browser global | funciones globales para usar sin bundler |
|
|
404
|
-
| docs por framework | guías de integración por entorno |
|
|
405
|
-
| tests de observer | tests de parsing, zona horaria, formatos y edge cases |
|
|
406
|
-
|
|
407
|
-
### Ejemplo de estructura para fechas
|
|
408
|
-
|
|
409
|
-
#### Core
|
|
410
|
-
|
|
411
|
-
- parseDate
|
|
412
|
-
- formatDate
|
|
413
|
-
- convertDateTimezone
|
|
414
|
-
- isValidDateInput
|
|
415
|
-
- compareDates
|
|
416
|
-
|
|
417
|
-
#### Vanilla
|
|
418
|
-
|
|
419
|
-
- exportación directa de funciones
|
|
420
|
-
- helpers utilitarios de alto nivel
|
|
421
|
-
|
|
422
|
-
#### React
|
|
423
|
-
|
|
424
|
-
- useParsedDate
|
|
425
|
-
- useFormattedDate
|
|
426
|
-
- componente opcional si el caso lo justifica
|
|
427
|
-
|
|
428
|
-
#### Vue
|
|
429
|
-
|
|
430
|
-
- useParsedDate
|
|
431
|
-
- useFormattedDate
|
|
432
|
-
- componente opcional si el caso lo justifica
|
|
433
|
-
|
|
434
|
-
#### Svelte
|
|
435
|
-
|
|
436
|
-
- helper o stores derivados
|
|
437
|
-
- action solo si existe un caso real basado en DOM
|
|
438
|
-
|
|
439
|
-
#### Browser
|
|
440
|
-
|
|
441
|
-
- window.DateToolkit o nombre equivalente
|
|
442
|
-
|
|
443
|
-
## Lo Que Siempre Se Replica
|
|
444
|
-
|
|
445
|
-
1. Separación entre core y adaptadores.
|
|
446
|
-
2. Build reproducible con TypeScript estricto.
|
|
447
|
-
3. Exports claros por subpath.
|
|
448
|
-
4. Tipos generados.
|
|
449
|
-
5. README principal más docs específicas.
|
|
450
|
-
6. Tests por capa.
|
|
451
|
-
7. Release protegido por prepublishOnly.
|
|
452
|
-
|
|
453
|
-
## Lo Que Depende Del Dominio
|
|
454
|
-
|
|
455
|
-
1. La necesidad de wrappers por framework.
|
|
456
|
-
2. La necesidad del bundle browser.
|
|
457
|
-
3. La forma de la API pública.
|
|
458
|
-
4. Las dependencias runtime.
|
|
459
|
-
5. Los edge cases críticos.
|
|
460
|
-
6. Los ejemplos de documentación.
|
|
461
|
-
7. Los mocks y helpers de testing.
|
|
462
|
-
|
|
463
|
-
## Secuencia De Implementación Recomendada
|
|
464
|
-
|
|
465
|
-
1. Definir nombre, objetivo y API pública.
|
|
466
|
-
2. Definir qué entrypoints existirán realmente.
|
|
467
|
-
3. Crear package.json, tsconfig.json y tsup.config.ts.
|
|
468
|
-
4. Implementar el core compartido.
|
|
469
|
-
5. Implementar el wrapper vanilla o root.
|
|
470
|
-
6. Implementar wrappers de framework solo si agregan valor real.
|
|
471
|
-
7. Implementar bundle browser si aplica.
|
|
472
|
-
8. Escribir tests del core y luego de cada variante.
|
|
473
|
-
9. Redactar README y docs específicas.
|
|
474
|
-
10. Verificar build, typecheck y test.
|
|
475
|
-
11. Preparar publicación.
|
|
476
|
-
12. Crear el workflow correspondiente de release o publish en .github/workflows según la estrategia elegida.
|
|
477
|
-
|
|
478
|
-
## Checklist Final Antes De Considerar El Paquete Listo
|
|
479
|
-
|
|
480
|
-
1. El core resuelve el dominio sin dependencias de framework.
|
|
481
|
-
2. Cada subpath exportado tiene implementación, tipos y tests.
|
|
482
|
-
3. El README refleja exactamente los entrypoints reales.
|
|
483
|
-
4. No hay docs para variantes que no existen.
|
|
484
|
-
5. Los peer dependencies son opcionales solo cuando corresponde.
|
|
485
|
-
6. El bundle browser existe solo si fue realmente solicitado.
|
|
486
|
-
7. prepublishOnly pasa sin errores.
|
|
487
|
-
8. package.json publica solo lo necesario.
|
|
488
|
-
9. Existe el workflow de publicación correspondiente si el paquete debe liberarse por tags o CI.
|
|
489
|
-
|
|
490
|
-
## Instrucción Operativa Para Futuras Conversaciones
|
|
491
|
-
|
|
492
|
-
Si voy a crear un paquete nuevo usando este blueprint, primero debo pedirte:
|
|
493
|
-
|
|
494
|
-
- el código fuente o la especificación funcional del paquete
|
|
495
|
-
- el nombre del paquete
|
|
496
|
-
- las dependencias a utilizar
|
|
497
|
-
- los frameworks o entornos a soportar
|
|
498
|
-
- si quieres variante browser o CDN
|
|
499
|
-
- el alcance inicial exacto
|
|
500
|
-
|
|
501
|
-
Solo después de eso conviene generar el scaffold definitivo.
|
package/.local/todo.md
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# Todo
|
|
2
|
-
|
|
3
|
-
## Instrucción Para La IA
|
|
4
|
-
|
|
5
|
-
Este archivo es el registro de tareas pendientes del proyecto.
|
|
6
|
-
|
|
7
|
-
La IA debe revisarlo para saber qué trabajo quedó explícitamente pendiente por decisión del usuario.
|
|
8
|
-
|
|
9
|
-
## Regla De Uso
|
|
10
|
-
|
|
11
|
-
Solo deben agregarse elementos a este archivo cuando el usuario indique de forma explícita que algo queda pendiente, que debe hacerse después, que es una mejora futura o que existe un error por corregir más adelante.
|
|
12
|
-
|
|
13
|
-
La IA no debe inventar pendientes ni convertir sugerencias implícitas en tareas abiertas sin confirmación del usuario.
|
|
14
|
-
|
|
15
|
-
Si la IA anota en memoria de sesión un pendiente confirmado por el usuario, también debe registrarlo aquí en la misma tarea o antes de cerrar la sesión para que no dependa de memoria efímera.
|
|
16
|
-
|
|
17
|
-
## Qué Debe Guardarse Aquí
|
|
18
|
-
|
|
19
|
-
1. tareas pendientes solicitadas por el usuario
|
|
20
|
-
2. mejoras a futuro indicadas expresamente
|
|
21
|
-
3. bugs por corregir más adelante
|
|
22
|
-
4. refactors aplazados por decisión del usuario
|
|
23
|
-
5. ideas aprobadas para una fase posterior
|
|
24
|
-
|
|
25
|
-
## Formato Recomendado Para Nuevos Ítems
|
|
26
|
-
|
|
27
|
-
Usar bloques breves con esta estructura:
|
|
28
|
-
|
|
29
|
-
### Título
|
|
30
|
-
|
|
31
|
-
- estado: pendiente
|
|
32
|
-
- origen: solicitud explícita del usuario
|
|
33
|
-
- contexto: resumen corto del motivo
|
|
34
|
-
- siguiente acción: qué habría que hacer cuando se retome
|
|
35
|
-
|
|
36
|
-
## Estado Actual
|
|
37
|
-
|
|
38
|
-
Actualmente no hay pendientes operativos registrados en este archivo.
|
|
39
|
-
|
|
40
|
-
### Enforced action
|
|
41
|
-
|
|
42
|
-
- Pre-task read enforcement
|
|
43
|
-
|
|
44
|
-
- estado: pendiente
|
|
45
|
-
- origen: auditoría interna tras iniciar implementación sin leer `agent-index.md`
|
|
46
|
-
- contexto: asegurar que la IA lea `.local/agent-index.md` antes de comenzar tareas futuras
|
|
47
|
-
- siguiente acción: implementar un pequeño checklist en el flujo operativo (manual o automatizado) para verificar lectura de `agent-index.md` y confirmar en la sesión.
|
|
48
|
-
|
|
49
|
-
Cuando el usuario deje tareas explícitamente pendientes, deben añadirse aquí.
|
package/AGENTS.md
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# AGENTS
|
|
2
|
-
|
|
3
|
-
## Instrucción Principal
|
|
4
|
-
|
|
5
|
-
Antes de comenzar cualquier tarea en este repositorio, la IA debe leer primero .local/agent-index.md.
|
|
6
|
-
|
|
7
|
-
Ese archivo funciona como índice maestro de las instrucciones internas del proyecto y define qué otros documentos de .local deben revisarse según el tipo de trabajo.
|
|
8
|
-
|
|
9
|
-
## Regla De Lectura Obligatoria
|
|
10
|
-
|
|
11
|
-
Al iniciar una nueva conversación o una nueva tarea dentro de este repositorio, la IA debe seguir este orden:
|
|
12
|
-
|
|
13
|
-
1. Leer .local/agent-index.md.
|
|
14
|
-
2. Determinar el tipo de tarea.
|
|
15
|
-
3. Leer los documentos internos adicionales que .local/agent-index.md indique para ese contexto.
|
|
16
|
-
|
|
17
|
-
## Documentos Internos Disponibles
|
|
18
|
-
|
|
19
|
-
La IA debe usar .local/agent-index.md como punto de entrada para localizar y revisar, cuando corresponda:
|
|
20
|
-
|
|
21
|
-
1. .local/package-replication-guide.md
|
|
22
|
-
2. .local/deploy-and-release-guide.md
|
|
23
|
-
3. .local/todo.md
|
|
24
|
-
4. .local/lessons.md
|
|
25
|
-
5. .local/new-project.md
|
|
26
|
-
|
|
27
|
-
## Regla De Interpretación
|
|
28
|
-
|
|
29
|
-
Los archivos dentro de .local son instrucciones internas para la IA y no documentación pública del paquete.
|
|
30
|
-
|
|
31
|
-
La IA debe tratarlos como contexto operativo del proyecto.
|
|
32
|
-
|
|
33
|
-
Además, tanto .local como AGENTS.md deben permanecer fuera de Git y estar incluidos en .gitignore.
|
|
34
|
-
|
|
35
|
-
## Casos Mínimos
|
|
36
|
-
|
|
37
|
-
### Tarea general
|
|
38
|
-
|
|
39
|
-
Leer .local/agent-index.md y, si aplica, revisar .local/todo.md y .local/lessons.md.
|
|
40
|
-
|
|
41
|
-
### Nuevo paquete o nuevo scaffold
|
|
42
|
-
|
|
43
|
-
Leer .local/agent-index.md, .local/package-replication-guide.md, .local/new-project.md, .local/todo.md y .local/lessons.md.
|
|
44
|
-
|
|
45
|
-
### Release, deploy o publicación
|
|
46
|
-
|
|
47
|
-
Leer .local/agent-index.md, .local/deploy-and-release-guide.md, .local/todo.md y .local/lessons.md.
|
|
48
|
-
|
|
49
|
-
## Regla De Persistencia
|
|
50
|
-
|
|
51
|
-
Si el usuario agrega nuevas reglas internas, pendientes o lecciones, la IA debe mantener actualizados los documentos correspondientes dentro de .local.
|
|
52
|
-
|
|
53
|
-
Si durante una sesión la IA guarda contexto en memoria de sesión del chat y ese contenido corresponde a una regla interna, un pendiente, una lección o una preferencia operativa del proyecto, también debe persistirlo en el archivo adecuado de .local para no perder coherencia si la sesión se borra.
|
|
54
|
-
|
|
55
|
-
La IA también debe preservar la regla de que .local y AGENTS.md no se versionan.
|