xonecode 0.1.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/README.md +167 -0
- package/dist/agent/authEnDisco.js +56 -0
- package/dist/agent/authEnDisco.js.map +1 -0
- package/dist/agent/configEnDisco.js +109 -0
- package/dist/agent/configEnDisco.js.map +1 -0
- package/dist/agent/crearProyecto.js +34 -0
- package/dist/agent/crearProyecto.js.map +1 -0
- package/dist/agent/entorno.js +124 -0
- package/dist/agent/entorno.js.map +1 -0
- package/dist/agent/guionizado.js +53 -0
- package/dist/agent/guionizado.js.map +1 -0
- package/dist/agent/instantanea.js +129 -0
- package/dist/agent/instantanea.js.map +1 -0
- package/dist/agent/interrupts.js +83 -0
- package/dist/agent/interrupts.js.map +1 -0
- package/dist/agent/mensajes.js +24 -0
- package/dist/agent/mensajes.js.map +1 -0
- package/dist/agent/modelos.js +42 -0
- package/dist/agent/modelos.js.map +1 -0
- package/dist/agent/normalizar.js +20 -0
- package/dist/agent/normalizar.js.map +1 -0
- package/dist/agent/perfiles.js +103 -0
- package/dist/agent/perfiles.js.map +1 -0
- package/dist/agent/proyecto.js +107 -0
- package/dist/agent/proyecto.js.map +1 -0
- package/dist/agent/puente.js +142 -0
- package/dist/agent/puente.js.map +1 -0
- package/dist/agent/resumenDeTool.js +48 -0
- package/dist/agent/resumenDeTool.js.map +1 -0
- package/dist/agent/skills.js +65 -0
- package/dist/agent/skills.js.map +1 -0
- package/dist/agent/textoDeTool.js +113 -0
- package/dist/agent/textoDeTool.js.map +1 -0
- package/dist/agent/turnoReal.js +173 -0
- package/dist/agent/turnoReal.js.map +1 -0
- package/dist/agent/verificador.js +65 -0
- package/dist/agent/verificador.js.map +1 -0
- package/dist/agent/xoneAgent.js +106 -0
- package/dist/agent/xoneAgent.js.map +1 -0
- package/dist/bin.js +9 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/aprobar.js +82 -0
- package/dist/cli/aprobar.js.map +1 -0
- package/dist/cli/config.js +133 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/consola.js +346 -0
- package/dist/cli/consola.js.map +1 -0
- package/dist/cli/describe.js +53 -0
- package/dist/cli/describe.js.map +1 -0
- package/dist/cli/doctor.js +45 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/main.js +520 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/markdown.js +90 -0
- package/dist/cli/markdown.js.map +1 -0
- package/dist/cli/run.js +164 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spinner.js +89 -0
- package/dist/cli/spinner.js.map +1 -0
- package/dist/cli/stdio.js +193 -0
- package/dist/cli/stdio.js.map +1 -0
- package/dist/cli/tema.js +40 -0
- package/dist/cli/tema.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/core/bitacora.js +30 -0
- package/dist/core/bitacora.js.map +1 -0
- package/dist/core/config.js +236 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contextos.js +56 -0
- package/dist/core/contextos.js.map +1 -0
- package/dist/core/deps.js +51 -0
- package/dist/core/deps.js.map +1 -0
- package/dist/core/diff.js +79 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/esqueleto.js +366 -0
- package/dist/core/esqueleto.js.map +1 -0
- package/dist/core/events.js +2 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/modelos.js +85 -0
- package/dist/core/modelos.js.map +1 -0
- package/dist/core/notify.js +106 -0
- package/dist/core/notify.js.map +1 -0
- package/dist/core/ports.js +114 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/turno.js +127 -0
- package/dist/core/turno.js.map +1 -0
- package/dist/vendor/hitl.js +103 -0
- package/dist/vendor/hitl.js.map +1 -0
- package/dist/vendor/skillLoaders/catalog.js +74 -0
- package/dist/vendor/skillLoaders/catalog.js.map +1 -0
- package/dist/vendor/tokenTracking.js +58 -0
- package/dist/vendor/tokenTracking.js.map +1 -0
- package/package.json +41 -0
- package/skills/xone-debugging/SKILL.md +52 -0
- package/skills/xone-debugging/references/faq.md +561 -0
- package/skills/xone-debugging/references/troubleshooting-y-glosario.md +429 -0
- package/skills/xone-development/SKILL.md +105 -0
- package/skills/xone-development/references/anti-patrones.md +94 -0
- package/skills/xone-development/references/css/atributos-por-categoria.md +509 -0
- package/skills/xone-development/references/css/buenas-practicas-y-parser.md +419 -0
- package/skills/xone-development/references/css/dinamicos-cascada-y-componentes.md +550 -0
- package/skills/xone-development/references/css/patrones-material-y-temas.md +1140 -0
- package/skills/xone-development/references/css/propiedades-y-herencia.md +885 -0
- package/skills/xone-development/references/css/selectores-unidades-colores.md +840 -0
- package/skills/xone-development/references/datos/appdata-referencia-ampliada.md +457 -0
- package/skills/xone-development/references/datos/appdata.md +611 -0
- package/skills/xone-development/references/datos/http-sqlmanager-y-crypto.md +720 -0
- package/skills/xone-development/references/datos/http.md +366 -0
- package/skills/xone-development/references/datos/oauth2-y-replica.md +156 -0
- package/skills/xone-development/references/device/biometria-imagedrawing-y-otros.md +544 -0
- package/skills/xone-development/references/device/objetos-de-dispositivo.md +583 -0
- package/skills/xone-development/references/device/systemsettings-referencia-ampliada.md +396 -0
- package/skills/xone-development/references/device/systemsettings-y-permisos.md +342 -0
- package/skills/xone-development/references/fundamentos/conceptos-clave.md +695 -0
- package/skills/xone-development/references/fundamentos/configuracion-app-xml-ini-mappings.md +668 -0
- package/skills/xone-development/references/fundamentos/errores-comunes.md +312 -0
- package/skills/xone-development/references/fundamentos/navegacion-convenciones-y-primer-proyecto.md +576 -0
- package/skills/xone-development/references/fundamentos/plataforma-y-anatomia-de-proyecto.md +387 -0
- package/skills/xone-development/references/indice-completo.md +77 -0
- package/skills/xone-development/references/javascript/coleccion-error-y-usuario.md +260 -0
- package/skills/xone-development/references/javascript/debugging-y-best-practices.md +245 -0
- package/skills/xone-development/references/javascript/metodos-de-los-controles.md +556 -0
- package/skills/xone-development/references/javascript/metodos-nativos-de-la-vista.md +114 -0
- package/skills/xone-development/references/javascript/motor-js-y-contexto-de-ejecucion.md +319 -0
- package/skills/xone-development/references/javascript/objeto-ai-llm-en-dispositivo.md +358 -0
- package/skills/xone-development/references/javascript/objetos-creables-a-m.md +527 -0
- package/skills/xone-development/references/javascript/objetos-creables-n-z.md +385 -0
- package/skills/xone-development/references/javascript/patrones-criticos-seguridad-y-rendimiento.md +595 -0
- package/skills/xone-development/references/javascript/patrones-de-navegacion-datos-y-codigo.md +751 -0
- package/skills/xone-development/references/javascript/patrones-de-ui-voz-integracion-y-seguridad.md +701 -0
- package/skills/xone-development/references/javascript/plantillas-y-funciones-utilitarias.md +647 -0
- package/skills/xone-development/references/javascript/self-y-dataobject.md +449 -0
- package/skills/xone-development/references/javascript/singletons-globales.md +361 -0
- package/skills/xone-development/references/javascript/ui-catalogo-de-metodos.md +464 -0
- package/skills/xone-development/references/javascript/ui-gps-camara-y-multimedia.md +506 -0
- package/skills/xone-development/references/javascript/ui-navegacion-mensajes-y-vista.md +422 -0
- package/skills/xone-development/references/resumen-js-datos-dispositivo.md +80 -0
- package/skills/xone-development/references/resumen-xml-y-css.md +74 -0
- package/skills/xone-development/references/tipos-de-prop.md +28 -0
- package/skills/xone-development/references/xml-ui/asfilter-visibilidad-eventos-y-macros.md +576 -0
- package/skills/xone-development/references/xml-ui/atributos-coll-group-frame.md +235 -0
- package/skills/xone-development/references/xml-ui/atributos-method-macro-script-event-app.md +244 -0
- package/skills/xone-development/references/xml-ui/atributos-prop.md +439 -0
- package/skills/xone-development/references/xml-ui/contents-y-macros.md +392 -0
- package/skills/xone-development/references/xml-ui/errores-comunes-xml.md +245 -0
- package/skills/xone-development/references/xml-ui/estructura-y-nodo-coll.md +326 -0
- package/skills/xone-development/references/xml-ui/eventos-ciclo-de-vida-e-interaccion.md +704 -0
- package/skills/xone-development/references/xml-ui/eventos-sistema-login-y-personalizados.md +944 -0
- package/skills/xone-development/references/xml-ui/layouts-herencia-y-buenas-practicas.md +618 -0
- package/skills/xone-development/references/xml-ui/mapas.md +685 -0
- package/skills/xone-development/references/xml-ui/mappings-y-colecciones-separadas.md +148 -0
- package/skills/xone-development/references/xml-ui/nodos-group-y-frame.md +666 -0
- package/skills/xone-development/references/xml-ui/patrones-de-pantalla.md +643 -0
- package/skills/xone-development/references/xml-ui/prop-atributos-y-condiciones.md +298 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-basicos.md +493 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-combos-y-controles.md +664 -0
- package/skills/xone-development/references/xml-ui/prop-tipos-listas-y-mapas.md +412 -0
- package/skills/xone-plan-builder/SKILL.md +183 -0
- package/skills/xone-plan-builder/agents/openai.yaml +5 -0
- package/skills/xone-plan-builder/references/TASKS-FORMAT.md +132 -0
- package/skills/xone-project-generator/SKILL.md +111 -0
- package/skills/xone-project-generator/references/canonical-sizes.md +292 -0
- package/skills/xone-project-generator/references/colecciones-base.md +16 -0
- package/skills/xone-project-generator/references/convenciones-de-nombres.md +16 -0
- package/skills/xone-project-generator/references/ejemplos-por-sector-y-prohibiciones.md +140 -0
- package/skills/xone-project-generator/references/fase-3-estilos-css.md +597 -0
- package/skills/xone-project-generator/references/fase-6-colecciones.md +762 -0
- package/skills/xone-project-generator/references/fase-7-asfilter-e-integraciones.md +142 -0
- package/skills/xone-project-generator/references/fase-7-entidades-y-estructura-de-pantalla.md +494 -0
- package/skills/xone-project-generator/references/fase-7-plantilla-consola.md +477 -0
- package/skills/xone-project-generator/references/fase-7-plantillas-de-pantalla.md +302 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-graficos-y-listas.md +681 -0
- package/skills/xone-project-generator/references/fase-7-viewmodes-mapa-y-calendario.md +479 -0
- package/skills/xone-project-generator/references/fases-0-2-analisis-y-modelo-de-datos.md +350 -0
- package/skills/xone-project-generator/references/fases-10-12-readmes-y-validacion.md +194 -0
- package/skills/xone-project-generator/references/fases-4-5-estructura-y-configuracion.md +587 -0
- package/skills/xone-project-generator/references/fases-8-9-eventos-y-javascript.md +861 -0
- package/skills/xone-project-generator/references/flujo-de-generacion.md +67 -0
- package/skills/xone-project-generator/references/plantillas-estandar.md +98 -0
- package/skills/xone-project-generator/references/tamanos-canonicos.md +49 -0
- package/skills/xone-review/SKILL.md +189 -0
- package/skills/xone-spec-builder/SKILL.md +235 -0
- package/skills/xone-spec-builder/agents/openai.yaml +5 -0
- package/skills/xone-spec-builder/references/ADR-FORMAT.md +55 -0
- package/skills/xone-spec-builder/references/CONTEXT-FORMAT.md +42 -0
- package/skills/xone-spec-builder/references/PLAN-FORMAT.md +120 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: xone-spec-builder
|
|
3
|
+
description: Entrevista relentless que refina cualquier desarrollo XOne — app nueva, feature sobre proyecto existente, refactor, integración de dispositivo, cambio de modelo de datos, rediseño de pantalla — y deja un PLAN.md (el spec) que xone-plan-builder descompone en tareas, y que xone-project-generator o xone-development ejecutan. Mantiene un glosario de dominio (CONTEXT.md) y ADRs sobre la marcha.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# XOne Spec Builder
|
|
7
|
+
|
|
8
|
+
Una entrevista que **afina** un desarrollo XOne antes de escribir una sola línea de XML, JS o CSS. No importa si es una app nueva, una feature sobre un proyecto que ya existe, un refactor, una integración de dispositivo, un cambio de modelo de datos o un rediseño de pantalla: el spec builder entrevista hasta que todas las decisiones de diseño están resueltas y deja un `PLAN.md` que el siguiente paso consume sin preguntas pendientes.
|
|
9
|
+
|
|
10
|
+
El objetivo no es producir código ni descomponer el trabajo —para eso están `xone-plan-builder` (descompone en tareas), `xone-project-generator` (genera app nueva) y `xone-development` (trabaja sobre existente)— sino resolver todas las decisiones de diseño que esos pasos necesitan. Cuando la entrevista termina, hay un `PLAN.md` listo para consumir.
|
|
11
|
+
|
|
12
|
+
> **Carga `xone-development` antes de responder nada sobre XOne.** Toda afirmación sobre atributos XML, APIs JavaScript, CSS, datos o dispositivo debe venir de sus referencias. Si no aparece, dilo y pregunta; no deduzcas por analogía con la web ni con otros frameworks.
|
|
13
|
+
|
|
14
|
+
## Idea o cambio → PLAN.md
|
|
15
|
+
|
|
16
|
+
El spec builder es el primer paso de cualquier trabajo XOne. Lo que sigue:
|
|
17
|
+
|
|
18
|
+
- **`xone-plan-builder`** lee el `PLAN.md` y lo descompone en tareas tracer-bullet con dependencias (`TASKS.md`).
|
|
19
|
+
- **App nueva** → `xone-project-generator` lee el `PLAN.md` y genera el proyecto completo.
|
|
20
|
+
- **Feature, refactor, integración, cambio de modelo, rediseño** sobre un proyecto existente → `xone-development` aplica el `PLAN.md` sobre los `.xne`, `.js` y `.css` que ya viven en el repo.
|
|
21
|
+
- **Validación final** → `xone-review` con `xone-simulator` en ambos casos.
|
|
22
|
+
|
|
23
|
+
`xone-spec-builder` es **especificación**: produce decisiones de diseño y un spec, no código ni tareas. La tentación de empezar a generar archivos o a descomponer el trabajo es la señal de que has llegado al borde del spec; para ahí y entrega el `PLAN.md`.
|
|
24
|
+
|
|
25
|
+
## Estructura de archivos
|
|
26
|
+
|
|
27
|
+
La entrevista escribe en el **directorio de trabajo** del usuario — la raíz del proyecto XOne (existente o por crear). Crea los archivos **lazy**, solo cuando hay algo que escribir:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
<raíz del proyecto>/
|
|
31
|
+
├── PLAN.md ← el plan del desarrollo (entregable)
|
|
32
|
+
├── CONTEXT.md ← glosario del dominio (términos canónicos, evitar)
|
|
33
|
+
├── docs/
|
|
34
|
+
│ └── adr/
|
|
35
|
+
│ ├── 0001-sqlite-local-vs-replica.md
|
|
36
|
+
│ └── 0002-login-con-oauth2-o-contra-db.md
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Si no existe `PLAN.md`, créalo cuando la entrevista empiece a cristalizar decisiones. Si no existe `CONTEXT.md`, créalo cuando se resuelva el primer término de dominio. Si no existe `docs/adr/`, créalo cuando se tome la primera decisión digna de ADR.
|
|
40
|
+
|
|
41
|
+
> **`PLAN.md` es el entregable.** `CONTEXT.md` y los ADRs lo acompañan y alimentan, pero lo que el usuario se lleva es el plan.
|
|
42
|
+
|
|
43
|
+
## Antes de entrevistar: triage de complejidad
|
|
44
|
+
|
|
45
|
+
No toda petición necesita una entrevista de 8 rounds. Antes de empezar, clasifica la **complejidad** del desarrollo y ajusta el nivel de especificación:
|
|
46
|
+
|
|
47
|
+
| Nivel | Cuándo | Qué hace el spec-builder |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| **Trivial** | Una sola acción mecánica, sin decisiones de diseño. Ej: «añadir un prop EMAIL (T) a Clientes», «cambiar el color del header», «añadir un botón de salir». | **No produces PLAN.md.** Confirmas la petición en 1-2 preguntas, ejecutas con `xone-development` o `xone-project-generator` directamente, y validas con `xone-review`. Sin `CONTEXT.md` ni ADRs. |
|
|
50
|
+
| **Simple** | Un cambio acotado con alguna decisión menor. Ej: «añadir campo IVA a LineasPedido con formula», «pasar Clientes a mapa», «añadir escáner QR en una pantalla». | **Spec ligero.** Entrevista reducida: solo los rounds que apliquen (típicamente 1, 3 y/o 4 y/o 5). `PLAN.md` en formato condensado —una sección por round, sin secciones vacías—. `CONTEXT.md` solo si hay término de dominio nuevo; ADR solo si hay decisión dura. |
|
|
51
|
+
| **Normal** | Feature con varias colls/pantallas, refactor, integración multi-pantalla. Ej: «firma de entrega en Pedidos», «login con OAuth2», «módulo de incidencias con fotos». | **Spec completo.** Entrevista con los rounds que apliquen al tipo. `PLAN.md` con las secciones condicionales del formato. `CONTEXT.md` y ADRs según se resuelvan. |
|
|
52
|
+
| **Grande** | App nueva completa, re-arquitectura, o un desarrollo que no cabe en una sesión de plan-builder. | **Spec completo + considerar wayfinder.** Entrevista los 8 rounds. Si el scope es tan grande que ni el spec cabe en una sesión, considera dividir el esfuerzo con un enfoque tipo wayfinder (chart el mapa de decisiones primero, luego spec por contexto). |
|
|
53
|
+
|
|
54
|
+
**Cómo decidir el nivel.** Lee la petición y, si es trabajo sobre existente, los archivos implicados. Si dudas entre dos niveles, **empieza por el inferior** — siempre puedes subir si la entrevista saca más complejidad de la esperada. Nunca al revés: no fuerces una entrevista de 8 rounds en un cambio de color.
|
|
55
|
+
|
|
56
|
+
**El usuario puede subir o bajar el nivel.** Si propusiste «Simple» y el usuario dice «trátalo como trivial», hazlo. Si propusiste «Simple» y al entrevistar sale que hay migración de datos + dos pantallas nuevas, sube a «Normal» y dilo.
|
|
57
|
+
|
|
58
|
+
**Para Trivial y Simple, `xone-plan-builder` es opcional.** Una tarea trivial no necesita descomposición. Un spec simple puede generar 1-3 tareas —si el plan-builder no añade valor, el usuario puede ir directo a ejecución. Para Normal y Grande, `xone-plan-builder` casi siempre aporta.
|
|
59
|
+
|
|
60
|
+
## Antes de entrevistar: clasifica el desarrollo
|
|
61
|
+
|
|
62
|
+
La entrevista se adapta al tipo de desarrollo. Antes de la primera ronda, identifica con el usuario **qué clase de trabajo es**:
|
|
63
|
+
|
|
64
|
+
| Tipo | Qué resuelve el plan | Ejemplo |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| **App nueva** | Modelo de datos completo, flujo de pantallas, integraciones, estilo, sincronización | «Una app de gestión de pedidos para comerciales» |
|
|
67
|
+
| **Feature sobre existente** | Qué colls/props/pantallas se añaden o modifican, qué eventos, qué integraciones nuevas | «Añadir firma de entrega en Pedidos» |
|
|
68
|
+
| **Refactor** | Qué se reestructura, por qué, y qué no cambia | «Migrar login de DB local a OAuth2» |
|
|
69
|
+
| **Integración de dispositivo** | Qué objeto canónico, qué permisos, qué coll lo usa, dónde se persiste | «Añadir escaneo QR en línea de pedido» |
|
|
70
|
+
| **Cambio de modelo de datos** | Qué colls/props cambian, relaciones afectadas, migración de datos | «Añadir campo IVA a LineasPedido y recalcular totales» |
|
|
71
|
+
| **Rediseño de pantalla** | Qué pantallas, qué cambia (layout, viewmode, estilo), qué se conserva | «Pasar Clientes de lista a mapa» |
|
|
72
|
+
|
|
73
|
+
El tipo fija qué rounds aplican y cuáles se saltan. Un rediseño de pantalla no necesita el round de sincronización; una integración de biometría apenas toca el modelo de datos. **No fuerces los 8 rounds en todos los desarrollos** — salta los que no apliquen y dilo explícitamente en el plan («no aplica a este desarrollo»).
|
|
74
|
+
|
|
75
|
+
## La entrevista (grilling)
|
|
76
|
+
|
|
77
|
+
Entrevista relentless, una ronda cada vez, una pregunta cada vez. **Tú preguntas; el usuario responde.** Nunca respondas a tus propias preguntas ni rellenes huecos por intuición: si el usuario no lo sabe, es una pregunta pendiente y se marca en `PLAN.md` §Pendientes.
|
|
78
|
+
|
|
79
|
+
### Round 1 — Qué y por qué
|
|
80
|
+
|
|
81
|
+
Antes de cualquier decisión técnica, afila **qué** es el desarrollo:
|
|
82
|
+
|
|
83
|
+
- ¿Qué problema resuelve y por qué ahora?
|
|
84
|
+
- ¿Es app nueva o trabajo sobre un proyecto existente? Si existe, **lee los `.xne` y el CSS** del proyecto antes de seguir — el plan debe respetar convenciones que ya viven ahí.
|
|
85
|
+
- ¿Qué está dentro del alcance y qué fuera? Escríbelo explícito; el scope fija el plan.
|
|
86
|
+
- ¿Hay restricciones (compliance, dispositivo objetivo, versión de XOne, offline obligatorio)?
|
|
87
|
+
|
|
88
|
+
Si es app nueva, ve al Round 2. Si es sobre existente, anota qué colls/pantallas/ficheros están implicados y léelos con las referencias de `xone-development` a mano.
|
|
89
|
+
|
|
90
|
+
### Round 2 — Lenguaje de dominio
|
|
91
|
+
|
|
92
|
+
Afina el **vocabulario de negocio** del desarrollo:
|
|
93
|
+
|
|
94
|
+
- ¿Qué términos usa el usuario y qué significan **aquí**? Cada término ambiguo o sobrecargado va a `CONTEXT.md`: propón el término canónico y lista los sinónimos bajo `_Evitar_`.
|
|
95
|
+
- Escenarios límite: inventa casos que fuercen al usuario a precisar los bordes de cada concepto. («¿Una factura puede pertenecer a dos clientes?», «¿Una tarea sin asignar es válida?»)
|
|
96
|
+
|
|
97
|
+
Cristaliza términos en `CONTEXT.md` según se resuelven —sin batchear. `CONTEXT.md` es un **glosario de negocio**: sin SQL, sin nombres de `<prop>`, sin vocabulario técnico de XOne. Ver [CONTEXT-FORMAT.md](references/CONTEXT-FORMAT.md).
|
|
98
|
+
|
|
99
|
+
> Si el proyecto ya tiene `CONTEXT.md` de desarrollos anteriores, léelo antes de este round y desafía solo lo nuevo o contradictorio.
|
|
100
|
+
|
|
101
|
+
### Round 3 — Modelo de datos
|
|
102
|
+
|
|
103
|
+
Mapea entidades a **colecciones XOne**. Para desarrollo sobre existente, esto es **qué cambia**, no el modelo entero:
|
|
104
|
+
|
|
105
|
+
- Una entidad de negocio nueva = una `<coll>` con `sql`, `objname`, `updateobj`.
|
|
106
|
+
- Una entidad modificada = qué `<prop>` se añaden, cambian de tipo, o se eliminan; qué relaciones nuevas.
|
|
107
|
+
- Identifica relaciones (1:N, N:M) y cómo se expresan en XOne: combos con `mapcol`/`mapfld` en el prop oculto del ID y `linkedto`/`linkedfield` en el visible de la descripción, `<contents>` para listas embebidas, `filter="IDPADRE=##FLD_IDPADRE##"` para maestro-detalle. La sintaxis exacta de cada uno, en `xone-development`.
|
|
108
|
+
- Campos persistidos: MAYÚSCULAS, sin guion bajo en `Usuarios.IDEMPRESA`. Antes de poner o quitar un `MAP_`, lee su regla en `xone-development`: el fallo es simétrico y silencioso en una de las dos direcciones.
|
|
109
|
+
- ¿`loadall="true"` o carga bajo demanda? Cuidado con tablas grandes.
|
|
110
|
+
- ¿Herencia (`inherits`) o factorización (`<include-layout>`)? Aplica la regla de decisión rápida de `xone-project-generator`.
|
|
111
|
+
- Si el cambio toca el esquema, anota si hace falta migración o `xone-db-tools create-db --overwrite`.
|
|
112
|
+
|
|
113
|
+
Escribe en `PLAN.md` §Modelo de datos. Cruza siempre con `xone-development`: tipos de prop válidos, regla de unicidad de `name` por coll, `progid` opcional salvo Empresas/Usuarios, `ID`/`ROWID` gestionados por la plataforma.
|
|
114
|
+
|
|
115
|
+
### Round 4 — Pantallas y navegación
|
|
116
|
+
|
|
117
|
+
Diseña el flujo de usuario afectado:
|
|
118
|
+
|
|
119
|
+
- **App nueva:** Splash (fichero raíz) → Login → EntradaApp → MenuPrincipal → entidades. Una coll por pantalla de entidad (lista, detalle, edición). `special="true"` para menús y pantallas sin datos (sin `sql`).
|
|
120
|
+
- **Sobre existente:** qué pantallas se añaden, cuáles se modifican y cómo. Lee las que ya existen antes de proponer cambios.
|
|
121
|
+
- El `viewmode` de un `type="Z"` se **copia del catálogo de `xone-development`**, nunca se escribe de memoria: uno que no exista ahí no da error — se ignora, y sale una lista donde se esperaba otra cosa.
|
|
122
|
+
- Navegación: `ui.openEditView("Coll")` para ir, `ui.getView(self).exit()` para volver.
|
|
123
|
+
- Filtros dinámicos con `asfilter` y contents con `##FLD_…##`.
|
|
124
|
+
- **¿Qué tiene que pasar al ABRIR la pantalla, y qué solo la PRIMERA vez?** Son eventos distintos, y hay uno que parece el bueno y no lo es: los tres, en `xone-development`.
|
|
125
|
+
- ¿`inherits` o `<include-layout>` para factorizar estructura compartida?
|
|
126
|
+
|
|
127
|
+
Escribe en `PLAN.md` §Pantallas: nombre, propósito, coll base (si hereda), contenido en prosa, eventos clave. **No generes el `.xne`** — eso es del siguiente paso.
|
|
128
|
+
|
|
129
|
+
### Round 5 — Integraciones de dispositivo y datos
|
|
130
|
+
|
|
131
|
+
Solo si el desarrollo las toca:
|
|
132
|
+
|
|
133
|
+
- **¿GPS?** Dónde se lee la posición, con qué precisión, y qué pasa sin señal.
|
|
134
|
+
- **¿Cámara o fotos?** Quién las toma, dónde se guardan, si se suben.
|
|
135
|
+
- **¿Firma digital?** En qué pantalla y sobre qué documento.
|
|
136
|
+
- **¿Escáner QR o de código de barras?** Qué se hace con lo leído.
|
|
137
|
+
- **¿Biometría?** Para entrar, para confirmar una acción, o las dos.
|
|
138
|
+
- **¿Bluetooth, NFC o impresión?** Contra qué dispositivo.
|
|
139
|
+
- **¿Habla con un backend?** Por HTTP, con OAuth2, o replicando.
|
|
140
|
+
- **¿Guarda ajustes o tokens** entre sesiones?
|
|
141
|
+
|
|
142
|
+
**Los mecanismos de cada una —el tipo de `prop`, el objeto, la API y sus obsoletos— viven en
|
|
143
|
+
`xone-development`.** Aquí se decide QUÉ lleva la app y qué permisos arrastra; el CÓMO se
|
|
144
|
+
consulta allí y se cita, no se copia.
|
|
145
|
+
|
|
146
|
+
Para cada integración que aplique, anótala en `PLAN.md` §Integraciones con el objeto canónico y los permisos Android a declarar en `<permissions>`. Si no aplica ninguna, dilo explícitamente: «sin integraciones de dispositivo» es una decisión válida.
|
|
147
|
+
|
|
148
|
+
### Round 6 — Estilo visual
|
|
149
|
+
|
|
150
|
+
Solo si el desarrollo toca la UI visual:
|
|
151
|
+
|
|
152
|
+
- Paleta de colores (primario, secundario, fondo, texto, estados). **El formato de color de XOne y su orden de canales, en `xone-development`**: cópialo de ahí antes de escribir un valor.
|
|
153
|
+
- Tamaños canónicos: consulta [`canonical-sizes.md` de `xone-project-generator`](../xone-project-generator/references/canonical-sizes.md) antes de proponer `width`/`height`/`fontsize`. Recuerda: `p ≠ dp`, Material 56dp = ~168p en 1080×1920.
|
|
154
|
+
- `fontsize` **no está en puntos**: es una escala pequeña y el factor de plataforma se suma. La escala, los factores de `app.xml` y el cálculo, en `xone-development`.
|
|
155
|
+
- **¿El proyecto está en `compatibility-mode`?** Míralo ANTES de proponer estilos: cambia si el CSS se aplica o no (el porqué, en `xone-development`).
|
|
156
|
+
- Si es sobre existente, **lee el `default.css` actual** y respeta sus convenciones de nombres de clase.
|
|
157
|
+
|
|
158
|
+
Escribe en `PLAN.md` §Estilo: paleta, clases base, variantes de tema y tamaños canónicos de los elementos principales.
|
|
159
|
+
|
|
160
|
+
### Round 7 — Sincronización y seguridad
|
|
161
|
+
|
|
162
|
+
Solo si el desarrollo las toca:
|
|
163
|
+
|
|
164
|
+
- ¿La app trabaja offline contra la base local, replica contra un backend, o las dos cosas? **El nombre de la base, el prefijo de tabla y la macro que hay que usar en toda SQL, en `xone-development`.**
|
|
165
|
+
- ¿Login contra DB local, OAuth2, o ambos? Empresas y Usuarios viven en `mappings.xne`.
|
|
166
|
+
- Seguridad: parametriza SQL con `?` (nunca concatenes), HTTPS siempre, pinning/mTLS si aplica, no hardcodees credenciales, cifra tokens antes de guardarlos.
|
|
167
|
+
- ¿Eventos de sincronización? `maintenance` en `Empresas` para réplica programada.
|
|
168
|
+
|
|
169
|
+
Escribe en `PLAN.md` §Sincronización y seguridad.
|
|
170
|
+
|
|
171
|
+
### Round 8 — Cierre y verificación del plan
|
|
172
|
+
|
|
173
|
+
Revisa el `PLAN.md` completo contra el checklist de [PLAN-FORMAT.md](references/PLAN-FORMAT.md):
|
|
174
|
+
|
|
175
|
+
- ¿El tipo de desarrollo está declarado y el scope claro?
|
|
176
|
+
- ¿Las colls/props/pantallas afectadas (nuevas o modificadas) están listadas con tipos válidos y relaciones correctas?
|
|
177
|
+
- ¿El flujo de pantallas afectado está completo?
|
|
178
|
+
- ¿Las integraciones declaradas tienen su objeto canónico y sus permisos?
|
|
179
|
+
- ¿Los términos de dominio nuevos están en `CONTEXT.md` y las decisiones duras en ADRs?
|
|
180
|
+
- ¿Quedan preguntas abiertas? Márcalas en `PLAN.md` §Pendientes; no las resuelvas tú.
|
|
181
|
+
|
|
182
|
+
Si falta algo, vuelve al round correspondiente. Si todo está, entrega el spec y señala el siguiente paso: `xone-plan-builder` para descomponer en tareas, después `xone-project-generator` (app nueva) o `xone-development` (sobre existente), y `xone-review` para validar al final.
|
|
183
|
+
|
|
184
|
+
## Disciplina durante la entrevista
|
|
185
|
+
|
|
186
|
+
### Desafía contra el glosario
|
|
187
|
+
|
|
188
|
+
Cuando el usuario use un término que contradice `CONTEXT.md`, páralo: «Tu glosario define "cliente" como X, pero ahora lo usas como Y — ¿cuál es?»
|
|
189
|
+
|
|
190
|
+
### Afila lenguaje difuso
|
|
191
|
+
|
|
192
|
+
Términos vagos o sobrecargados → propón un término canónico: «Dices "cuenta" — ¿te refieres al Cliente o al Usuario? Son cosas distintas en XOne.»
|
|
193
|
+
|
|
194
|
+
### Discute escenarios concretos
|
|
195
|
+
|
|
196
|
+
Cuando se discutan relaciones de dominio, estrésalas con casos límite que fuercen a precisar los bordes entre conceptos.
|
|
197
|
+
|
|
198
|
+
### Cruza con las referencias y con el código existente
|
|
199
|
+
|
|
200
|
+
Cuando el usuario afirme cómo funciona algo de XOne, comprueba las referencias de `xone-development`. Si es trabajo sobre existente, **lee el código actual** antes de proponer cambios: si hay contradicción, sácala. («Este campo se llama `IDEMPRESA` sin guion bajo —el framework lo lee literalmente. Tu `.xne` ya lo tiene así, bien.», o «Aquí usáis `load` para inicializar, pero es anti-patrón —¿lo cambiamos a `before-edit` en este desarrollo?»)
|
|
201
|
+
|
|
202
|
+
### Actualiza CONTEXT.md inline
|
|
203
|
+
|
|
204
|
+
Cuando un término se resuelve, actualiza `CONTEXT.md` ahí mismo. Sin batchear. Ver [CONTEXT-FORMAT.md](references/CONTEXT-FORMAT.md).
|
|
205
|
+
|
|
206
|
+
`CONTEXT.md` debe estar **totalmente** libre de detalles de implementación: sin SQL, sin nombres de `<prop>`, sin tipos de XOne. Es un glosario de dominio y nada más.
|
|
207
|
+
|
|
208
|
+
### Ofrece ADRs con tiento
|
|
209
|
+
|
|
210
|
+
Solo ofrece crear un ADR cuando los tres se cumplan:
|
|
211
|
+
|
|
212
|
+
1. **Difícil de revertir** — el coste de cambiar de opinión después es significativo.
|
|
213
|
+
2. **Sorprendente sin contexto** — un futuro lector se preguntará «¿por qué hicieron esto así?»
|
|
214
|
+
3. **Resultado de un trade-off real** — había alternativas genuinas y se eligió una por razones concretas.
|
|
215
|
+
|
|
216
|
+
Si falta alguno, sáltate el ADR. Ver [ADR-FORMAT.md](references/ADR-FORMAT.md).
|
|
217
|
+
|
|
218
|
+
Ejemplos típicos dignos de ADR en XOne:
|
|
219
|
+
- **Forma de sincronización.** «SQLite local puro» contra «réplica programada con backend».
|
|
220
|
+
- **Modelo de login.** Login contra DB local vs OAuth2 contra IdP externo.
|
|
221
|
+
- **Estrategia offline.** «Opera siempre offline y replica en segundo plano» vs «requiere conexión».
|
|
222
|
+
- **Persistencia de tokens.** Tokens cifrados en macros globales y limpiados al cerrar sesión.
|
|
223
|
+
- **Elección de viewmode para un volumen grande.** `gridview` vs `mapview` cuando la elección no es obvia.
|
|
224
|
+
- **`compatibility-mode="true"` activado a propósito.** Registrar por qué evita que alguien pierda el rato diagnosticando estilos que, por lo que ese modo implica, no iban a aplicarse.
|
|
225
|
+
- **Migración de `load` a `before-edit`.** Si el proyecto usaba `load` y se decide migrar, registrar por qué —un futuro ingeniero asumirá que siempre se hizo así.
|
|
226
|
+
- **`inherits` frente a `<include-layout>`.** Cuando se elige uno sobre el otro por razones no obvias y revertir implicaría reestructurar varias colls.
|
|
227
|
+
- **Uso de `fetch` frente a `$http`.** Si se desvía del idiomático `$http` hacia `fetch` por una razón concreta —código compartido con web que ya está escrito así, por ejemplo—, vale la pena registrarlo. **Lo que NO vale como razón es la cancelación**: el `fetch` de XOne no tiene cancelación real en vuelo, `AbortController` existe como objeto pero abortar no corta la petición (limitaciones en `xone-development`).
|
|
228
|
+
|
|
229
|
+
## Referencias
|
|
230
|
+
|
|
231
|
+
- [references/PLAN-FORMAT.md](references/PLAN-FORMAT.md) — Plantilla y checklist del `PLAN.md` final.
|
|
232
|
+
- [references/CONTEXT-FORMAT.md](references/CONTEXT-FORMAT.md) — Formato del glosario `CONTEXT.md`.
|
|
233
|
+
- [references/ADR-FORMAT.md](references/ADR-FORMAT.md) — Formato de los ADRs y cuándo crearlos.
|
|
234
|
+
|
|
235
|
+
Las reglas de XML, JavaScript, CSS, datos y dispositivo viven en `xone-development`. No las repitas aquí; consúltalas y cítales. El generador de proyectos, en `xone-project-generator`. La descomposición en tareas, en `xone-plan-builder`.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# ADR Format
|
|
2
|
+
|
|
3
|
+
Los ADRs viven en `docs/adr/` y usan numeración secuencial: `0001-slug.md`, `0002-slug.md`, etc.
|
|
4
|
+
|
|
5
|
+
Crea el directorio `docs/adr/` **lazy** —solo cuando se necesita el primer ADR.
|
|
6
|
+
|
|
7
|
+
## Plantilla
|
|
8
|
+
|
|
9
|
+
```md
|
|
10
|
+
# {Título corto de la decisión}
|
|
11
|
+
|
|
12
|
+
{1-3 frases: qué contexto había, qué se decidió y por qué.}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Eso es todo. Un ADR puede ser un solo párrafo. El valor está en registrar *que* se tomó una decisión y *por qué*, no en rellenar secciones.
|
|
16
|
+
|
|
17
|
+
## Secciones opcionales
|
|
18
|
+
|
|
19
|
+
Inclúyelas solo cuando aporten valor real. La mayoría de ADRs no las necesita.
|
|
20
|
+
|
|
21
|
+
- **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — útil cuando se revisitan decisiones
|
|
22
|
+
- **Opciones consideradas** — solo cuando las alternativas descartadas merezcan recordarse
|
|
23
|
+
- **Consecuencias** — solo cuando haya efectos colaterales no obvios que señalar
|
|
24
|
+
|
|
25
|
+
## Numeración
|
|
26
|
+
|
|
27
|
+
Escanea `docs/adr/` buscando el número más alto existente e incrementa en uno.
|
|
28
|
+
|
|
29
|
+
## Cuándo ofrecer un ADR
|
|
30
|
+
|
|
31
|
+
Los tres deben cumplirse:
|
|
32
|
+
|
|
33
|
+
1. **Difícil de revertir** — el coste de cambiar de opinión después es significativo
|
|
34
|
+
2. **Sorprendente sin contexto** — un futuro lector mirará el código y se preguntará «¿por qué hicieron esto así?»
|
|
35
|
+
3. **Resultado de un trade-off real** — había alternativas genuinas y se eligió una por razones concretas
|
|
36
|
+
|
|
37
|
+
Si la decisión es fácil de revertir, sáltatelo —simplemente la revertirás. Si no sorprende, nadie se preguntará por qué. Si no había alternativa real, no hay nada que registrar más allá de «hicimos lo obvio».
|
|
38
|
+
|
|
39
|
+
### Qué cuenta en XOne
|
|
40
|
+
|
|
41
|
+
- **Forma de sincronización.** «SQLite local puro» contra «réplica programada con backend». Revertir implica re-arquitecturar el modelo de datos.
|
|
42
|
+
- **Modelo de autenticación.** Login contra DB local vs OAuth2 contra IdP externo. Cambiarlo tarde toca todo el flujo de entrada.
|
|
43
|
+
- **Estrategia offline.** «La app opera siempre offline y replica en segundo plano» vs «requiere conexión». Define la arquitectura entera.
|
|
44
|
+
- **Persistencia de tokens.** Tokens OAuth2 cifrados en macros globales y limpiados al cerrar sesión — no en claro, no en logs.
|
|
45
|
+
- **Elección de viewmode para un volumen grande.** `gridview` vs `mapview` cuando el número de registros o la usabilidad lo justifican y la elección no es obvia.
|
|
46
|
+
- **`compatibility-mode="true"` activado a propósito.** El CSS se ignora por completo; registrar el ADR evita que alguien pierda tiempo diagnosticando estilos que no aplican.
|
|
47
|
+
- **`inherits` frente a `<include-layout>`.** Cuando se elige uno sobre el otro por razones no obvias (cadena de herencia vs factorización de fragmentos), y revertir implicaría reestructurar varias colls.
|
|
48
|
+
- **Uso de `fetch` frente a `$http`.** Si se desvía del idiomático `$http` hacia `fetch` por una razón concreta (p. ej., `AbortController`), vale la pena registrarlo porque el siguiente ingeniero asumirá `$http`.
|
|
49
|
+
|
|
50
|
+
### Qué no cuenta
|
|
51
|
+
|
|
52
|
+
- El nombre de una coll. Reversible: se renombra.
|
|
53
|
+
- Un `fontsize` concreto. Reversible: se cambia en el CSS.
|
|
54
|
+
- Usar `before-edit` en vez de `load`. Es la regla, no una decisión —no hay trade-off.
|
|
55
|
+
- Declarar o no `ID`/`ROWID` como `<prop>`. Es redundante pero válido; no sorprende a nadie.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# CONTEXT.md Format
|
|
2
|
+
|
|
3
|
+
## Estructura
|
|
4
|
+
|
|
5
|
+
```md
|
|
6
|
+
# {Nombre del dominio}
|
|
7
|
+
|
|
8
|
+
{Una o dos frases: qué es este dominio y por qué existe.}
|
|
9
|
+
|
|
10
|
+
## Lenguaje
|
|
11
|
+
|
|
12
|
+
**Cliente**:
|
|
13
|
+
Persona u organización que realiza pedidos.
|
|
14
|
+
_Evitar_: Cuenta, comprador, usuario
|
|
15
|
+
|
|
16
|
+
**Pedido**:
|
|
17
|
+
Solicitud de productos realizada por un cliente en una fecha.
|
|
18
|
+
_Evitar_: Orden, transacción, compra
|
|
19
|
+
|
|
20
|
+
**Línea de pedido**:
|
|
21
|
+
Cada uno de los productos que componen un pedido, con cantidad y precio.
|
|
22
|
+
_Evitar_: Detalle, item, línea
|
|
23
|
+
|
|
24
|
+
**Estado de pedido**:
|
|
25
|
+
Fase del ciclo de vida de un pedido: borrador, enviado, entregado, facturado.
|
|
26
|
+
_Evitar_: Status, situación
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Reglas
|
|
30
|
+
|
|
31
|
+
- **Sé opinado.** Cuando existan varias palabras para el mismo concepto, elige la mejor y lista las demás bajo `_Evitar_`.
|
|
32
|
+
- **Definiciones ajustadas.** Una o dos frases máximo. Define lo que ES, no lo que hace.
|
|
33
|
+
- **Solo términos del dominio.** Los conceptos generales de programación (timeout, error, callback) no pertenecen aquí aunque el proyecto los use. Antes de añadir un término, pregúntate: ¿es un concepto único de este dominio, o un concepto general? Solo lo primero va aquí.
|
|
34
|
+
- **Agrupa bajo subencabezados** cuando aparezcan clústeres naturales. Si todos los términos pertenecen a un área cohesionada, una lista plana es suficiente.
|
|
35
|
+
- **Sin detalles de implementación.** Nada de SQL, nombres de `<prop>`, tipos de XOne ni nombres de coll. `CONTEXT.md` es un glosario de negocio, no un spec técnico — eso vive en `PLAN.md`.
|
|
36
|
+
- **Sin términos técnicos de XOne.** "Colección", "DataObject", "contents", `MAP_`, `##PREF##` son vocabulario de la plataforma, no del dominio del usuario. No van aquí; viven en `xone-development`.
|
|
37
|
+
|
|
38
|
+
## Cuándo actualizar
|
|
39
|
+
|
|
40
|
+
Durante la entrevista, cada vez que un término de dominio se **resuelva** —el usuario lo define o se elige el canónico entre sinónimos— se actualiza `CONTEXT.md` ahí mismo, sin batchear. Si no existe el archivo, se crea en ese momento.
|
|
41
|
+
|
|
42
|
+
No actualices `CONTEXT.md` con términos de XOne ni de implementación. Solo lenguaje de negocio.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# PLAN.md Format
|
|
2
|
+
|
|
3
|
+
`PLAN.md` es el entregable de `xone-spec-builder` y la entrada que `xone-plan-builder` descompone, y que `xone-project-generator` (app nueva) o `xone-development` (trabajo sobre existente) consumen. Debe contener todo lo que el siguiente paso necesita para actuar **sin preguntas pendientes** — pero expresado como decisiones de diseño, no como código XML/JS/CSS listo para pegar.
|
|
4
|
+
|
|
5
|
+
> **Niveles de complejidad.** El spec-builder clasifica cada desarrollo como Trivial, Simple, Normal o Grande. Para **Trivial** no se produce `PLAN.md` (ejecución directa). Para **Simple**, el `PLAN.md` es condensado: solo las secciones que apliquen, sin secciones vacías. Para **Normal** y **Grande**, la estructura completa de abajo. Ver el triage de complejidad en `xone-spec-builder/SKILL.md`.
|
|
6
|
+
|
|
7
|
+
## Estructura
|
|
8
|
+
|
|
9
|
+
```md
|
|
10
|
+
# Plan — {Título del desarrollo}
|
|
11
|
+
|
|
12
|
+
**Tipo:** {app nueva | feature | refactor | integración de dispositivo | cambio de modelo de datos | rediseño de pantalla}
|
|
13
|
+
**Proyecto:** {nombre del proyecto XOne; "nuevo" si es app nueva}
|
|
14
|
+
**Scope:** {una o dos frases: qué está dentro; qué fuera}
|
|
15
|
+
|
|
16
|
+
{Una o dos frases: qué resuelve este desarrollo y por qué ahora.}
|
|
17
|
+
|
|
18
|
+
## Resumen
|
|
19
|
+
|
|
20
|
+
{3-6 bullets: el propósito, el alcance, las colls/pantallas afectadas, las integraciones clave, el modo de sincronización si aplica.}
|
|
21
|
+
|
|
22
|
+
## Modelo de datos
|
|
23
|
+
|
|
24
|
+
### Colecciones base ← solo si el desarrollo las toca (app nueva o cambio en mappings.xne)
|
|
25
|
+
|
|
26
|
+
- **Empresas** (`ASGestion.CASEmpresa`) — CODIGO (N), NOMBRE (T).
|
|
27
|
+
- **Usuarios** (`ASGestion.CASUser`) — CODIGO (N), NOMBRE (T), IDEMPRESA (N, combo a Empresas), LOGIN (T), PWD (X).
|
|
28
|
+
|
|
29
|
+
### Colecciones nuevas
|
|
30
|
+
|
|
31
|
+
Por cada coll nueva: nombre, progid (omitir salvo que aplique), campos persistidos (nombre + tipo XOne válido), campos `MAP_` (los que no son columna de `objname`), relaciones, y si lleva loadall o carga bajo demanda.
|
|
32
|
+
|
|
33
|
+
- **Clientes** — NOMBRE (T), CIF (T), DIRECCION (T), TELEFONO (T), EMAIL (T), LATITUD (N6), LONGITUD (N6). Combo a Empresas vía IDEMPRESA. loadall=true (volumen bajo).
|
|
34
|
+
|
|
35
|
+
### Colecciones modificadas ← solo si es trabajo sobre existente
|
|
36
|
+
|
|
37
|
+
Por cada coll afectada: qué cambia, qué se conserva. Nada de repetir el modelo entero si no se toca.
|
|
38
|
+
|
|
39
|
+
- **Pedidos** — añadir ESTADO (T, combo de valores fijos: borrador/enviado/entregado). Resto sin cambios.
|
|
40
|
+
- **LineasPedido** — añadir IVA (N2) y modificar SUBTOTAL a formula que incluya IVA. Requiere migración de esquema (xone-db-tools create-db --overwrite).
|
|
41
|
+
|
|
42
|
+
### Relaciones
|
|
43
|
+
|
|
44
|
+
- Clientes 1:N Pedidos (por IDCLIENTE).
|
|
45
|
+
- Pedidos 1:N LineasPedido (por IDPEDIDO, contents con filter dinámico).
|
|
46
|
+
|
|
47
|
+
## Pantallas y navegación
|
|
48
|
+
|
|
49
|
+
**App nueva:** Splash → Login → EntradaApp → MenuPrincipal → entidades.
|
|
50
|
+
**Sobre existente:** qué pantallas se añaden, cuáles se modifican.
|
|
51
|
+
|
|
52
|
+
Por cada pantalla afectada: nombre, propósito, si es special="true" o coll de datos, coll base si hereda con inherits, estructura en prosa, eventos clave, viewmode si aplica.
|
|
53
|
+
|
|
54
|
+
- **Login** — coll especial sin sql. Login contra DB local. Campos MAP_LOGIN/MAP_PWD. Botón "Entrar" valida y abre MenuPrincipal.
|
|
55
|
+
- **Pedidos (edición)** — coll existente. Modificar: añadir combo de ESTADO en grupo General; antes de guardar, validar que FECHA no sea nula. Evento onchange en ESTADO para refrescar botones de acción según estado. Resto sin cambios.
|
|
56
|
+
- **ClientesMapa** — coll nueva, prop type="Z" viewmode="mapview" con contents de Clientes filtrados por GPS.
|
|
57
|
+
|
|
58
|
+
## Integraciones
|
|
59
|
+
|
|
60
|
+
- **GPS** — ui.startGps() antes de leer; permiso location-foreground. Mapa de clientes usa GPSColl declarada por el proyecto.
|
|
61
|
+
- **Cámara** — prop type="PH" para foto de cliente. Callback con self guardado.
|
|
62
|
+
- **Firma digital** — prop type="DR" en Pedidos para firma de entrega.
|
|
63
|
+
- Sin biometría, Bluetooth, NFC ni impresión.
|
|
64
|
+
|
|
65
|
+
Permisos Android a declarar en <permissions>: location-foreground, camera.
|
|
66
|
+
|
|
67
|
+
## Sincronización y seguridad ← solo si el desarrollo las toca
|
|
68
|
+
|
|
69
|
+
- SQLite local con prefijo gen_ (##PREF## siempre).
|
|
70
|
+
- Login contra DB local.
|
|
71
|
+
- Réplica programada en maintenance de Empresas (si hay backend).
|
|
72
|
+
- SQL parametrizado con ?; HTTPS siempre; tokens cifrados en macros globales y limpiados al cerrar sesión.
|
|
73
|
+
|
|
74
|
+
## Estilo ← solo si el desarrollo toca la UI visual
|
|
75
|
+
|
|
76
|
+
- Paleta: primario #1565C0, secundario #FFC107, fondo #FFFFFF, texto #212121. Estados: error #D32F2F, éxito #388E3C.
|
|
77
|
+
- Tamaños (1080×1920): header 164p, body -2 con scroll, footer 216p, botones 124p, inputs 144p, fontsize texto 5 / título 7 / topbar 10.
|
|
78
|
+
- Clases base: .frameHeader, .frameBody, .frameFooter, .btnPrimario, .btnSecundario, .inputText, .card.
|
|
79
|
+
|
|
80
|
+
## Pendientes
|
|
81
|
+
|
|
82
|
+
Preguntas aún no resueltas por el usuario. El siguiente paso no puede resolverlas; deben aclararse antes de continuar.
|
|
83
|
+
|
|
84
|
+
- [ ] ¿La réplica es en tiempo real o por lotes nocturnos?
|
|
85
|
+
- [ ] ¿Hay multiidioma? (carpeta lang/ con subcarpetas ISO)
|
|
86
|
+
|
|
87
|
+
## Artefactos
|
|
88
|
+
|
|
89
|
+
- CONTEXT.md — glosario de dominio.
|
|
90
|
+
- docs/adr/0001-login-contra-db-local.md
|
|
91
|
+
- docs/adr/0002-replica-programada-en-maintenance.md
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Reglas
|
|
95
|
+
|
|
96
|
+
- **Decisiones, no código.** Nada de `<coll>`, `<prop>`, `self.X` ni CSS pegado. El siguiente paso lo produce a partir del plan.
|
|
97
|
+
- **Nombres en MAYÚSCULAS para campos persistidos**, PascalCase para colls; el `MAP_`, según `xone-development`.
|
|
98
|
+
- **Tipos válidos.** Solo los de la tabla de tipos de `xone-development`: `T`, `TN`, `N`, `D`, `DT`, `TT`, `L`, `B`, `NC`, `X`, `IMG`, `PH`, `VD`, `DR`, `Z`, `WEB`, `AT`, `O`, `THTML`. Los combos no tienen tipo propio: `type="T"` + `mapcol` + `mapfld`.
|
|
99
|
+
- **Empresas y Usuarios en mappings.xne** con sus campos obligatorios y progid propio. El resto de colls sin progid salvo excepción.
|
|
100
|
+
- **Secciones condicionales.** Incluye solo las que el desarrollo toca. Si una sección no aplica, omítela —no la dejes vacía ni pongas "N/A". El propio tipo de desarrollo ya indica cuáles aplican.
|
|
101
|
+
- **Modificaciones, no repeticiones.** En trabajo sobre existente, no repitas el modelo o las pantallas que no se tocan. Lista solo qué cambia y qué se conserva.
|
|
102
|
+
- **Pendientes explícitos.** Lo que no se resolvió va en §Pendientes, no se rellena por intuición.
|
|
103
|
+
- **Sin detalles de implementación irrelevantes.** No enumeres cada atributo de cada prop; el siguiente paso los infiere. Solo lo que es decisión de diseño: tipos, relaciones, eventos clave, viewmodes, integraciones.
|
|
104
|
+
|
|
105
|
+
## Checklist de cierre
|
|
106
|
+
|
|
107
|
+
Antes de entregar el plan, comprueba:
|
|
108
|
+
|
|
109
|
+
- [ ] Tipo de desarrollo declarado y scope claro (dentro/fuera).
|
|
110
|
+
- [ ] Modelo de datos: colls nuevas listadas con campos y tipos válidos; colls modificadas con qué cambia y qué se conserva.
|
|
111
|
+
- [ ] Relaciones expresadas con el mecanismo correcto de XOne (mapcol/mapfld, linkedto, contents, filter).
|
|
112
|
+
- [ ] Si el desarrollo toca mappings.xne: Empresas y Usuarios con sus campos obligatorios.
|
|
113
|
+
- [ ] Pantallas: flujo completo (app nueva) o cambios concretos (sobre existente).
|
|
114
|
+
- [ ] Cada pantalla afectada tiene propósito y contenido en prosa.
|
|
115
|
+
- [ ] Integraciones listadas con su objeto canónico y permisos (o "sin integraciones" explícito).
|
|
116
|
+
- [ ] Sincronización y seguridad definidas si aplica.
|
|
117
|
+
- [ ] Paleta, tema y tamaños canónicos presentes si el desarrollo toca UI visual.
|
|
118
|
+
- [ ] Pendientes explícitos (o sección ausente si no hay ninguno).
|
|
119
|
+
- [ ] CONTEXT.md con los términos de dominio nuevos resueltos.
|
|
120
|
+
- [ ] ADRs para las decisiones que cumplen los tres criterios.
|