{"id":"cs-1782305730269-cz9lbnui","status":"done","createdAt":1782305730269,"finishedAt":1782305767704,"meta":{"projectName":"ALimpiezas","projectPath":"C:\\xampp\\htdocs\\ALimpiezas","messagePreview":"Propón AUTOMATIZACIONES para este proyecto.\n\nEntrega en Markdown:\n1. **Scripts existentes** — npm, composer, ps1, make\n2","phaseId":"automation"},"events":[{"event":"status","data":{"text":"Modo completo — hasta 80 herramientas, usa solo las necesarias"},"at":1782305730277},{"event":"status","data":{"text":"Agente + Serena (project-mcp.json)"},"at":1782305730279},{"event":"agent","data":{"agentId":"agent-5488502e-cc0a-45d7-809b-f51d5f309aa1","projectPath":"C:\\xampp\\htdocs\\ALimpiezas"},"at":1782305730279},{"event":"changes","data":{"sessionId":"cs-1782305730277-fvym5w","pending":0},"at":1782305730279},{"event":"status","data":{"text":"Procesando…"},"at":1782305731018},{"event":"tool_activity","data":{"activity":{"id":"tool_d3173406-bf35-41d7-82f9-670c62f7a6a","name":"mcp","status":"running","summary":"MCP read_memory","detail":"{\"providerIdentifier\":\"serena\",\"toolName\":\"read_memory\",\"args\":{\"memory_name\":\"alimpiezas/project-knowledge\"}}","at":"2026-06-24T12:55:37.324Z"}},"at":1782305737324},{"event":"tool_activity","data":{"activity":{"id":"tool_3374da52-5601-4c61-a5d8-0de28199278","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.326Z"}},"at":1782305737326},{"event":"tool_activity","data":{"activity":{"id":"tool_7435d6c5-a901-4c4d-83c2-be329bbbec5","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.327Z"}},"at":1782305737327},{"event":"tool_activity","data":{"activity":{"id":"tool_12fbce84-ff46-4152-a70e-80b7f35b38c","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.330Z"}},"at":1782305737330},{"event":"tool_activity","data":{"activity":{"id":"tool_2400c2f9-a37e-41cf-8ba9-f6b5158a0fe","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.331Z"}},"at":1782305737331},{"event":"tool_activity","data":{"activity":{"id":"tool_b468f522-cb13-4bdb-80f9-6c19de3cfa4","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.332Z"}},"at":1782305737332},{"event":"text","data":{"chunk":"Explorando el proyecto de forma focalizada para proponer automatizaciones concretas.\n"},"at":1782305767704},{"event":"tool_activity","data":{"activity":{"id":"tool_d3173406-bf35-41d7-82f9-670c62f7a6a","name":"mcp","status":"completed","summary":"MCP read_memory","detail":"{\"providerIdentifier\":\"serena\",\"toolName\":\"read_memory\",\"args\":{\"memory_name\":\"alimpiezas/project-knowledge\"}}","at":"2026-06-24T12:55:37.772Z"}},"at":1782305737772},{"event":"tool_activity","data":{"activity":{"id":"tool_3374da52-5601-4c61-a5d8-0de28199278","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.849Z"}},"at":1782305737849},{"event":"tool_activity","data":{"activity":{"id":"tool_2400c2f9-a37e-41cf-8ba9-f6b5158a0fe","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.851Z"}},"at":1782305737851},{"event":"tool_activity","data":{"activity":{"id":"tool_12fbce84-ff46-4152-a70e-80b7f35b38c","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.855Z"}},"at":1782305737855},{"event":"tool_activity","data":{"activity":{"id":"tool_7435d6c5-a901-4c4d-83c2-be329bbbec5","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.866Z"}},"at":1782305737866},{"event":"tool_activity","data":{"activity":{"id":"tool_b468f522-cb13-4bdb-80f9-6c19de3cfa4","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:37.922Z"}},"at":1782305737922},{"event":"tool_activity","data":{"activity":{"id":"tool_164befd6-c176-4776-8a50-73ebe93cea9","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\package.json","detail":"","at":"2026-06-24T12:55:39.332Z"}},"at":1782305739332},{"event":"tool_activity","data":{"activity":{"id":"tool_aa0b770a-cae2-4258-902d-d45bf0561a5","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\composer.json","detail":"","at":"2026-06-24T12:55:39.334Z"}},"at":1782305739334},{"event":"tool_activity","data":{"activity":{"id":"tool_a22de333-3996-4b97-9a0b-07e898fe3ed","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\.github\\workflows\\test.yml","detail":"","at":"2026-06-24T12:55:39.335Z"}},"at":1782305739335},{"event":"tool_activity","data":{"activity":{"id":"tool_1ea5732c-f4e7-45d2-bcff-c81f7267166","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\start-stack.ps1","detail":"","at":"2026-06-24T12:55:39.600Z"}},"at":1782305739600},{"event":"tool_activity","data":{"activity":{"id":"tool_8ff5d90c-509c-4343-80e5-30fe0238d96","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\bootstrap-plugin.php","detail":"","at":"2026-06-24T12:55:39.601Z"}},"at":1782305739601},{"event":"tool_activity","data":{"activity":{"id":"tool_164befd6-c176-4776-8a50-73ebe93cea9","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\package.json","detail":"","at":"2026-06-24T12:55:39.628Z"}},"at":1782305739628},{"event":"tool_activity","data":{"activity":{"id":"tool_aa0b770a-cae2-4258-902d-d45bf0561a5","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\composer.json","detail":"","at":"2026-06-24T12:55:39.651Z"}},"at":1782305739651},{"event":"tool_activity","data":{"activity":{"id":"tool_a22de333-3996-4b97-9a0b-07e898fe3ed","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\.github\\workflows\\test.yml","detail":"","at":"2026-06-24T12:55:39.955Z"}},"at":1782305739955},{"event":"tool_activity","data":{"activity":{"id":"tool_5543b36f-d850-4641-a0eb-c0cdb0dbfcf","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:39.956Z"}},"at":1782305739956},{"event":"tool_activity","data":{"activity":{"id":"tool_1ea5732c-f4e7-45d2-bcff-c81f7267166","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\start-stack.ps1","detail":"","at":"2026-06-24T12:55:40.250Z"}},"at":1782305740250},{"event":"tool_activity","data":{"activity":{"id":"tool_8ff5d90c-509c-4343-80e5-30fe0238d96","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\bootstrap-plugin.php","detail":"","at":"2026-06-24T12:55:40.418Z"}},"at":1782305740418},{"event":"tool_activity","data":{"activity":{"id":"tool_5543b36f-d850-4641-a0eb-c0cdb0dbfcf","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:40.419Z"}},"at":1782305740419},{"event":"tool_activity","data":{"activity":{"id":"tool_33c7d352-254c-4a2d-aa79-20104315abb","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\ai-service-manager.ps1","detail":"","at":"2026-06-24T12:55:42.061Z"}},"at":1782305742061},{"event":"tool_activity","data":{"activity":{"id":"tool_2182b933-68e9-4bb3-881a-c324cdd83a1","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\port-services.ps1","detail":"","at":"2026-06-24T12:55:42.062Z"}},"at":1782305742062},{"event":"tool_activity","data":{"activity":{"id":"tool_bcdf87e5-680f-47a4-81e0-20a9bf5c83b","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\install-autostart.ps1","detail":"","at":"2026-06-24T12:55:42.065Z"}},"at":1782305742065},{"event":"tool_activity","data":{"activity":{"id":"tool_594fc6e8-533c-4387-82bb-3d7e197f8fa","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MANUAL-AGENTE-IA.md","detail":"","at":"2026-06-24T12:55:42.065Z"}},"at":1782305742065},{"event":"tool_activity","data":{"activity":{"id":"tool_daf1ccb1-df78-4fb9-af7a-b8667b19fd0","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:42.066Z"}},"at":1782305742066},{"event":"tool_activity","data":{"activity":{"id":"tool_17048a7d-296b-454f-b937-a57ebd826c0","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:42.067Z"}},"at":1782305742067},{"event":"tool_activity","data":{"activity":{"id":"tool_33c7d352-254c-4a2d-aa79-20104315abb","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\ai-service-manager.ps1","detail":"","at":"2026-06-24T12:55:42.325Z"}},"at":1782305742325},{"event":"tool_activity","data":{"activity":{"id":"tool_594fc6e8-533c-4387-82bb-3d7e197f8fa","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MANUAL-AGENTE-IA.md","detail":"","at":"2026-06-24T12:55:42.327Z"}},"at":1782305742327},{"event":"tool_activity","data":{"activity":{"id":"tool_2182b933-68e9-4bb3-881a-c324cdd83a1","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\port-services.ps1","detail":"","at":"2026-06-24T12:55:42.329Z"}},"at":1782305742329},{"event":"tool_activity","data":{"activity":{"id":"tool_bcdf87e5-680f-47a4-81e0-20a9bf5c83b","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\install-autostart.ps1","detail":"","at":"2026-06-24T12:55:42.335Z"}},"at":1782305742335},{"event":"tool_activity","data":{"activity":{"id":"tool_daf1ccb1-df78-4fb9-af7a-b8667b19fd0","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:42.339Z"}},"at":1782305742339},{"event":"tool_activity","data":{"activity":{"id":"tool_17048a7d-296b-454f-b937-a57ebd826c0","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:42.414Z"}},"at":1782305742414},{"event":"tool_activity","data":{"activity":{"id":"tool_ba19b9d2-3252-419a-862d-3785fd5cf23","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\capture-manual-screenshots.ps1","detail":"","at":"2026-06-24T12:55:43.704Z"}},"at":1782305743704},{"event":"tool_activity","data":{"activity":{"id":"tool_95e05a8e-9154-42cc-b4eb-df64dbcc64d","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\create-ai-table.php","detail":"","at":"2026-06-24T12:55:43.791Z"}},"at":1782305743791},{"event":"tool_activity","data":{"activity":{"id":"tool_ba19b9d2-3252-419a-862d-3785fd5cf23","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\capture-manual-screenshots.ps1","detail":"","at":"2026-06-24T12:55:43.822Z"}},"at":1782305743822},{"event":"tool_activity","data":{"activity":{"id":"tool_9e1a2da5-1645-44d3-bd66-96fac91df83","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\ai-service\\requirements.txt","detail":"","at":"2026-06-24T12:55:43.870Z"}},"at":1782305743870},{"event":"tool_activity","data":{"activity":{"id":"tool_95e05a8e-9154-42cc-b4eb-df64dbcc64d","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\create-ai-table.php","detail":"","at":"2026-06-24T12:55:43.879Z"}},"at":1782305743879},{"event":"tool_activity","data":{"activity":{"id":"tool_9e1a2da5-1645-44d3-bd66-96fac91df83","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\ai-service\\requirements.txt","detail":"","at":"2026-06-24T12:55:43.959Z"}},"at":1782305743959},{"event":"tool_activity","data":{"activity":{"id":"tool_e2e5469d-e7fc-41d0-b28f-aea83745c15","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MANUAL-AGENTE-IA.md","detail":"","at":"2026-06-24T12:55:43.999Z"}},"at":1782305743999},{"event":"tool_activity","data":{"activity":{"id":"tool_a49a29b7-d279-4c85-af73-3578cd884ef","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\tray\\package.json","detail":"","at":"2026-06-24T12:55:44.078Z"}},"at":1782305744078},{"event":"tool_activity","data":{"activity":{"id":"tool_e2e5469d-e7fc-41d0-b28f-aea83745c15","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MANUAL-AGENTE-IA.md","detail":"","at":"2026-06-24T12:55:44.097Z"}},"at":1782305744097},{"event":"tool_activity","data":{"activity":{"id":"tool_a49a29b7-d279-4c85-af73-3578cd884ef","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\tray\\package.json","detail":"","at":"2026-06-24T12:55:44.168Z"}},"at":1782305744168},{"event":"tool_activity","data":{"activity":{"id":"tool_0c35599f-ff34-423c-a6ea-6daeb4bd277","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\.github\\workflows\\test-countries.yml","detail":"","at":"2026-06-24T12:55:44.308Z"}},"at":1782305744308},{"event":"tool_activity","data":{"activity":{"id":"tool_f48c36cf-c073-4cf2-9d6c-65d040f553a","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MANUAL-AGENTE-IA.md","detail":"","at":"2026-06-24T12:55:45.698Z"}},"at":1782305745698},{"event":"tool_activity","data":{"activity":{"id":"tool_53767901-a7aa-45e7-b33d-14556be2344","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MOBILE-BRIDGE-TEST.md","detail":"","at":"2026-06-24T12:55:45.734Z"}},"at":1782305745734},{"event":"tool_activity","data":{"activity":{"id":"tool_f48c36cf-c073-4cf2-9d6c-65d040f553a","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MANUAL-AGENTE-IA.md","detail":"","at":"2026-06-24T12:55:45.795Z"}},"at":1782305745795},{"event":"tool_activity","data":{"activity":{"id":"tool_53767901-a7aa-45e7-b33d-14556be2344","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\docs\\MOBILE-BRIDGE-TEST.md","detail":"","at":"2026-06-24T12:55:45.825Z"}},"at":1782305745825},{"event":"tool_activity","data":{"activity":{"id":"tool_879b1e3e-5f6d-4449-9864-0450d7cda91","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:45.828Z"}},"at":1782305745828},{"event":"tool_activity","data":{"activity":{"id":"tool_e5f83699-3db4-4a2c-9f9c-d7811369a24","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\.gitignore","detail":"","at":"2026-06-24T12:55:46.023Z"}},"at":1782305746023},{"event":"tool_activity","data":{"activity":{"id":"tool_a9084967-3760-46a3-8ad5-b7a5debbff2","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\port-services.py","detail":"","at":"2026-06-24T12:55:46.130Z"}},"at":1782305746130},{"event":"tool_activity","data":{"activity":{"id":"tool_879b1e3e-5f6d-4449-9864-0450d7cda91","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:46.195Z"}},"at":1782305746195},{"event":"tool_activity","data":{"activity":{"id":"tool_0b814550-896c-4989-82c2-46b9b741c0a","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:47.245Z"}},"at":1782305747245},{"event":"tool_activity","data":{"activity":{"id":"tool_5c445ca6-1b8a-41a6-b319-f3d3be0f402","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:47.246Z"}},"at":1782305747246},{"event":"tool_activity","data":{"activity":{"id":"tool_d348d607-821c-44c8-b1a2-df7b647f14a","name":"glob","status":"running","summary":"glob: ","detail":"","at":"2026-06-24T12:55:47.247Z"}},"at":1782305747247},{"event":"tool_activity","data":{"activity":{"id":"tool_df742b77-68d2-4079-9cd3-6d2ce92b3cc","name":"read","status":"running","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\tray\\README.md","detail":"","at":"2026-06-24T12:55:47.461Z"}},"at":1782305747461},{"event":"tool_activity","data":{"activity":{"id":"tool_5c445ca6-1b8a-41a6-b319-f3d3be0f402","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:47.667Z"}},"at":1782305747667},{"event":"tool_activity","data":{"activity":{"id":"tool_0b814550-896c-4989-82c2-46b9b741c0a","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:47.670Z"}},"at":1782305747670},{"event":"tool_activity","data":{"activity":{"id":"tool_df742b77-68d2-4079-9cd3-6d2ce92b3cc","name":"read","status":"completed","summary":"read: C:\\xampp\\htdocs\\ALimpiezas\\tools\\tray\\README.md","detail":"","at":"2026-06-24T12:55:47.671Z"}},"at":1782305747671},{"event":"tool_activity","data":{"activity":{"id":"tool_d348d607-821c-44c8-b1a2-df7b647f14a","name":"glob","status":"completed","summary":"glob: ","detail":"","at":"2026-06-24T12:55:47.671Z"}},"at":1782305747671},{"event":"text","data":{"chunk":"# Automatizaciones propuestas — ALimpiezas\n\nERP FacturaScripts + plugin móvil `ALimpiezasMobile` + microservicio FastAPI (puerto 8090) en XAMPP. El proyecto ya tiene buena base operativa en `tools/`; lo que falta es unificar flujos, cubrir el plugin custom y reducir pasos manuales post-cambio.\n\n---\n\n## 1. Scripts existentes\n\n### Composer (`composer.json`)\n\n| Script | Comando | Estado |\n|--------|---------|--------|\n| `test` | `vendor/bin/phpunit` | ✅ Funcional (suite FacturaScripts en `Test/`) |\n| `test:coverage` | PHPUnit + HTML coverage | ✅ |\n| `phpstan` | Analiza solo `Core/` | ⚠️ No incluye `Plugins/` |\n| `cs-check` / `cs-fix` | PHPCS / PHPCBF | ✅ (requiere config) |\n| `dev-server` | `php -S localhost:8000` | ⚠️ No usa XAMPP real |\n\nInstalación local documentada:\n```powershell\ncomposer install --ignore-platform-req=ext-pgsql\n```\n\n### npm raíz (`package.json`)\n\n| Script | Estado |\n|--------|--------|\n| `build`, `build:css`, `build:js`, `watch` | ❌ Placeholders (`echo \"Add your build process here\"`) |\n| `test` | ❌ Sin tests JS |\n\nDependencias: Bootstrap 5, jQuery, Chart.js, FontAwesome (ERP desktop, no el móvil).\n\n### npm bandeja (`tools/tray/package.json`)\n\n| Script | Comando |\n|--------|---------|\n| `start` | `node alimpiezas_tray.js` |\n\nUtilidades Node: `gen-icons.js`, `gen-icons-ico.js`.\n\n### PowerShell (`tools/`)\n\n| Script | Función |\n|--------|---------|\n| `start-stack.ps1` | Apache + MySQL + IA :8090 + bandeja + log en `data/alimpiezas-startup.log` |\n| `ai-service-manager.ps1` | `-Start` / `-Stop` / `-Restart` / `-Status` del microservicio |\n| `port-services.ps1` | Diagnóstico puertos LISTEN (8090, 80, 3306…) |\n| `install-autostart.ps1` | Tarea al login + HKCU Run para bandeja |\n| `capture-manual-screenshots.ps1` | Abre URLs móviles y guía capturas en `docs/img/` |\n\n### PHP CLI (`tools/`)\n\n| Script | Función |\n|--------|---------|\n| `bootstrap-plugin.php` | `Plugins::enable('ALimpiezasMobile')` + `deploy()` → reconstruye `Dinamic/` |\n| `create-ai-table.php` | Crea tabla `ai_expense_queue` vía `DbUpdater` |\n\n### Python\n\n| Script | Función |\n|--------|---------|\n| `tools/port-services.py` | Alternativa cross-platform a `port-services.ps1` (`--json`) |\n| `ai-service/main.py` | FastAPI OCR/voz (arranque vía `uvicorn`, no script dedicado) |\n\n### Make\n\nNo hay `Makefile`.\n\n### CI (`.github/workflows/`)\n\n| Workflow | Alcance |\n|----------|---------|\n| `test.yml` | PHPUnit × PHP 8.1–8.4 × MySQL/MariaDB/PostgreSQL + audit + PHPCS/PHPStan |\n| `test-countries.yml` | PHPUnit por país (COL, ECU, MEX…) |\n\nAmbos heredados de FacturaScripts upstream; **no prueban el plugin ALimpiezas ni el servicio IA**.\n\n---\n\n## 2. Tareas manuales repetitivas detectadas\n\n| Tarea | Frecuencia | Dolor actual |\n|-------|------------|--------------|\n| **Deploy plugin tras editar `Plugins/`** | Cada cambio PHP/Twig/Assets | `php tools/bootstrap-plugin.php` a mano |\n| **Verificar stack tras arrancar PC** | Diaria | Comprobar Apache, MySQL, `:8090/health`, CSS móvil |\n| **Resolver puerto 8090 ocupado** | Ocasional | `port-services.ps1` + restart manual |\n| **Instalar deps Python IA** | Tras clone/actualizar | `pip install -r ai-service/requirements.txt` sin script |\n| **QA post-cambio móvil** | Cada feature | 3–4 curls/URLs sueltos (documentados en manual) |\n| **Migración tabla cola** | Tras cambio XML | `create-ai-table.php` separado del bootstrap |\n| **Capturas manual usuario** | Al actualizar docs | Semi-automático; captura real sigue siendo manual |\n| **Recordar regla Assets** | Siempre | Editar `Plugins/.../Assets/` → bootstrap; URLs solo `Dinamic/Assets/` |\n| **No editar `Dinamic/` directamente** | Siempre | Riesgo de perder cambios en próximo deploy |\n| **Composer en Windows** | Setup/CI local | Flag `--ignore-platform-req=ext-pgsql` |\n| **Tests del plugin** | Nunca automatizado | 0 tests en `Test/` para ALimpiezasMobile |\n| **Sincronización Bridge móvil → PC** | Desarrollo remoto | Flujo manual vía Cursor Bridge |\n\n---\n\n## 3. Prompts reutilizables (copy-paste para Cursor móvil)\n\n### Prompt 1 — Deploy plugin tras cambios\n\n```\nProyecto: C:\\xampp\\htdocs\\ALimpiezas\nAcabo de editar Plugins/ALimpiezasMobile/ (NO tocar Dinamic/ directamente).\n\n1. Revisa que Assets usen asset('Dinamic/Assets/...') en Twig.\n2. Ejecuta: php tools/bootstrap-plugin.php\n3. Verifica:\n   - curl -I http://localhost/ALimpiezas/Dinamic/Assets/CSS/mobile.css\n   - curl http://127.0.0.1:8090/health\n4. Resume qué se desplegó y si hay errores.\n\nUsa Serena MCP. No escanees vendor/ ni Core/ salvo que sea necesario.\n```\n\n### Prompt 2 — Diagnóstico stack completo\n\n```\nProyecto ALimpiezas — algo no funciona en local.\n\nDiagnostica en orden:\n1. .\\tools\\port-services.ps1 -Port 80,3306,8090\n2. Estado Apache/MySQL (servicios Windows)\n3. curl http://127.0.0.1:8090/health\n4. curl -I http://localhost/ALimpiezas/MobileHome\n5. Si IA caída: .\\tools\\ai-service-manager.ps1 -Restart\n\nEntrega: tabla estado/puerto/proceso + acción concreta para arreglar.\nEjecuta comandos tú mismo; responde en español.\n```\n\n### Prompt 3 — Nueva feature en flujo gastos\n\n```\nFeature en ALimpiezasMobile — flujo gastos/OCR.\n\nContexto:\n- Upload → ai_expense_queue → confirm → ExpenseInvoiceCreator → FacturaProveedor\n- Modos: manual | ocr | ai (settings group alimpiezas)\n- Código fuente: Plugins/ALimpiezasMobile/Lib/AiExpenseProcessor.php, ExpenseInvoiceCreator.php\n- Microservicio: ai-service/main.py endpoint /api/v1/extract-invoice\n\nImplementa [DESCRIBE AQUÍ LA FEATURE].\nTras cambios: bootstrap-plugin.php + indica cómo probar desde MobileExpenses.\nNo modifiques Dinamic/ directamente.\n```\n\n### Prompt 4 — Cambio en microservicio IA\n\n```\nProyecto: ai-service/ (FastAPI puerto 8090)\n\nCambio solicitado: [DESCRIBE AQUÍ]\n\nArchivos clave: ai-service/main.py, requirements.txt\nTras editar:\n1. .\\tools\\ai-service-manager.ps1 -Restart\n2. curl http://127.0.0.1:8090/health\n3. Prueba POST /api/v1/extract-invoice con un PDF/imagen de ejemplo si aplica\n\nDocumenta el contrato JSON request/response actualizado.\n```\n\n### Prompt 5 — Review pre-commit del plugin móvil\n\n```\nReview de cambios en Plugins/ALimpiezasMobile/ antes de commit.\n\nComprueba:\n- ¿Se editó Dinamic/ por error? (debe ser solo vía bootstrap)\n- ¿Twig referencia Dinamic/Assets y no Plugins/Assets?\n- ¿Nuevos settings van a group alimpiezas en MobileConfig?\n- ¿Traducciones en Translation/es_ES.json?\n- ¿Init.php registra tablas/controladores nuevos?\n\nLista issues por severidad (bloqueante / menor / sugerencia).\nNo hagas commit salvo que lo pida explícitamente.\n```\n\n---\n\n## 4. CI/CD — qué falta o mejorar\n\n### Lo que ya existe (upstream)\n\n- Matriz amplia PHPUnit (PHP × BD × países)\n- `composer audit` de seguridad\n- PHPStan/PHPCS (pero con `continue-on-error: true` y sin config del plugin)\n\n### Gaps críticos para ALimpiezas\n\n| Gap | Impacto | Propuesta |\n|-----|---------|-----------|\n| **Sin tests del plugin** | Regresiones silenciosas en gastos/fiscal/voz | Crear `Test/Plugins/ALimpiezasMobile/` con tests de `ExpenseInvoiceCreator`, `VoiceCommandBridge` |\n| **CI no ejecuta bootstrap** | Plugin no se valida en pipeline | Job: `php tools/bootstrap-plugin.php` + smoke HTTP |\n| **Sin CI Python** | Roturas en OCR/voz no detectadas | Workflow `ai-service`: `pip install`, pytest básico de `/health` |\n| **PHPStan solo Core** | Errores en `Plugins/` ignorados | Ampliar a `Plugins/ALimpiezasMobile` |\n| **Workflows genéricos FS** | Matriz 4 PHP × 3 BD = lento y irrelevante para tu stack MariaDB local | Job ligero `alimpiezas-smoke.yml` solo en cambios `Plugins/**`, `ai-service/**`, `tools/**` |\n| **`composer.lock` sin trackear** | Builds no reproducibles | Añadir al repo |\n| **`Dinamic/` en `.gitignore` pero modificado en git** | Ruido en `git status`, confusión deploy | Decidir: o bien dejar de trackear (`git rm --cached Dinamic/`) o excluir del ignore |\n| **Sin deploy automatizado** | Manual en XAMPP | Opcional: script post-pull `tools/update-local.ps1` |\n| **Sin lint Twig/JS móvil** | Inconsistencias UI | ESLint/Stylelint solo en `Plugins/ALimpiezasMobile/Assets/` |\n| **Codecov upstream** | Poco valor para plugin custom | Desactivar o reorientar cobertura al plugin |\n\n### Workflow sugerido (esqueleto)\n\n```yaml\n# .github/workflows/alimpiezas-smoke.yml\non:\n  push:\n    paths: ['Plugins/ALimpiezasMobile/**', 'ai-service/**', 'tools/**']\njobs:\n  smoke:\n    runs-on: ubuntu-latest\n    services:\n      mysql: { image: mariadb:11, env: { MARIADB_ROOT_PASSWORD: root, MARIADB_DATABASE: test } }\n    steps:\n      - uses: actions/checkout@v5\n      - run: composer install --ignore-platform-req=ext-pgsql\n      - run: # crear config.php mínimo\n      - run: php tools/bootstrap-plugin.php\n      - run: vendor/bin/phpunit Test/Plugins/ALimpiezasMobile/  # cuando exista\n      - run: pip install -r ai-service/requirements.txt && pytest ai-service/tests/\n```\n\n---\n\n## 5. Quick wins (~1 hora, alto impacto)\n\n### 1. Script `tools/qa-smoke.ps1` (≈30 min)\n\nUnifica las comprobaciones del manual §13:\n\n```powershell\n# Propuesta: un solo comando post-cambio\n.\\tools\\qa-smoke.ps1\n# → bootstrap si -Deploy\n# → /health, mobile.css, MobileHome HTTP 200\n# → exit code ≠ 0 si algo falla\n```\n\n**Impacto:** Elimina 4–5 comandos manuales tras cada sesión de desarrollo.\n\n### 2. Alias Composer `deploy:mobile` (≈15 min)\n\nEn `composer.json`:\n\n```json\n\"deploy:mobile\": \"php tools/bootstrap-plugin.php\",\n\"deploy:mobile+table\": [\"@deploy:mobile\", \"php tools/create-ai-table.php\"]\n```\n\n**Impacto:** Un comando estándar que cualquier agente/humano recuerda.\n\n### 3. Script `tools/setup-ai-service.ps1` (≈45 min)\n\n```powershell\n# pip install -r requirements.txt\n# verifica Tesseract en C:\\Program Files\\Tesseract-OCR\\\n# arranca y valida /health\n```\n\n**Impacto:** Onboarding y reparación del servicio IA en un paso.\n\n### 4. Regla Cursor `.cursor/rules/alimpiezas.md` (≈20 min)\n\nContenido mínimo:\n- Editar solo `Plugins/ALimpiezasMobile/`\n- Tras cambios: `composer deploy:mobile`\n- Assets → `Dinamic/Assets/` en URLs\n- No tocar `Core/` salvo bug upstream\n\n**Impacto:** Agentes (Bridge móvil incluido) dejan de proponer edits en `Dinamic/`.\n\n### 5. Test PHPUnit mínimo del plugin (≈60 min)\n\nUn solo test: `ExpenseInvoiceCreator` crea `FacturaProveedor` con datos mock.\n\n**Impacto:** Primera red de seguridad real; desbloquea CI del plugin.\n\n### 6. Unificar `tools/dev.ps1` (≈45 min)\n\n```powershell\n.\\tools\\dev.ps1 -Action start|stop|restart|qa|deploy\n```\n\nEnvuelve `start-stack`, `bootstrap-plugin`, `qa-smoke`.\n\n**Impacto:** Un entry point para desarrollo diario desde iPhone vía agente.\n\n### 7. Pre-commit ligero con `tools/pre-commit.ps1` (≈30 min)\n\n- Detecta cambios en `Plugins/` sin bootstrap reciente (timestamp)\n- Avisa si hay edits en `Dinamic/` fuera de deploy\n\n**Impacto:** Evita commits rotos y olvidos de deploy.\n\n---\n\n## Priorización recomendada\n\n```mermaid\nflowchart LR\n    A[qa-smoke.ps1] --> B[composer deploy:mobile]\n    B --> C[.cursor/rules]\n    C --> D[1 test PHPUnit plugin]\n    D --> E[CI alimpiezas-smoke.yml]\n    E --> F[setup-ai-service.ps1]\n```\n\n| Orden | Acción | Tiempo | ROI |\n|-------|--------|--------|-----|\n| 1 | `qa-smoke.ps1` + `deploy:mobile` | 45 min | Alto — uso inmediato diario |\n| 2 | Regla Cursor | 20 min | Alto — Bridge móvil más fiable |\n| 3 | 1 test + workflow smoke | 2 h | Medio-alto — confianza en CI |\n| 4 | `dev.ps1` unificado | 45 min | Medio — ergonomía |\n| 5 | Pipeline Python | 1 h | Medio — cuando OCR cambie mucho |\n\n---\n\nSi quieres, el siguiente paso puede ser **implementar el quick win #1+#2** (`qa-smoke.ps1` + scripts Composer) en una sola pasada desde el Bridge."},"at":1782305767705},{"event":"status","data":{"text":"Procesando…"},"at":1782305767693},{"event":"phase_saved","data":{"phaseId":"automation","progress":{"status":"done","completedAt":"2026-06-24T12:56:07.698Z","name":"Automatizar","summary":"Explorando el proyecto de forma focalizada para proponer automatizaciones concretas.\n# Automatizaciones propuestas — ALimpiezas\n\nERP FacturaScripts + plugin móvil `ALimpiezasMobile` + microservicio FastAPI (puerto 8090) en XAMPP. El proyecto ya tiene buena base operativa en `tools/`; lo que falta es unificar flujos, cubrir el plugin custom y reducir pasos manuales post-cambio.\n\n---\n\n## 1. Scripts existentes\n\n### Composer (`composer.json`)\n\n| Script | Comando | Estado |\n|--------|---------|--------|\n| `test` | `vendor/bin/phpunit` | ✅ Funcional (suite FacturaScripts en `Test/`) |\n| `test:covera","fullText":"Explorando el proyecto de forma focalizada para proponer automatizaciones concretas.\n# Automatizaciones propuestas — ALimpiezas\n\nERP FacturaScripts + plugin móvil `ALimpiezasMobile` + microservicio FastAPI (puerto 8090) en XAMPP. El proyecto ya tiene buena base operativa en `tools/`; lo que falta es unificar flujos, cubrir el plugin custom y reducir pasos manuales post-cambio.\n\n---\n\n## 1. Scripts existentes\n\n### Composer (`composer.json`)\n\n| Script | Comando | Estado |\n|--------|---------|--------|\n| `test` | `vendor/bin/phpunit` | ✅ Funcional (suite FacturaScripts en `Test/`) |\n| `test:coverage` | PHPUnit + HTML coverage | ✅ |\n| `phpstan` | Analiza solo `Core/` | ⚠️ No incluye `Plugins/` |\n| `cs-check` / `cs-fix` | PHPCS / PHPCBF | ✅ (requiere config) |\n| `dev-server` | `php -S localhost:8000` | ⚠️ No usa XAMPP real |\n\nInstalación local documentada:\n```powershell\ncomposer install --ignore-platform-req=ext-pgsql\n```\n\n### npm raíz (`package.json`)\n\n| Script | Estado |\n|--------|--------|\n| `build`, `build:css`, `build:js`, `watch` | ❌ Placeholders (`echo \"Add your build process here\"`) |\n| `test` | ❌ Sin tests JS |\n\nDependencias: Bootstrap 5, jQuery, Chart.js, FontAwesome (ERP desktop, no el móvil).\n\n### npm bandeja (`tools/tray/package.json`)\n\n| Script | Comando |\n|--------|---------|\n| `start` | `node alimpiezas_tray.js` |\n\nUtilidades Node: `gen-icons.js`, `gen-icons-ico.js`.\n\n### PowerShell (`tools/`)\n\n| Script | Función |\n|--------|---------|\n| `start-stack.ps1` | Apache + MySQL + IA :8090 + bandeja + log en `data/alimpiezas-startup.log` |\n| `ai-service-manager.ps1` | `-Start` / `-Stop` / `-Restart` / `-Status` del microservicio |\n| `port-services.ps1` | Diagnóstico puertos LISTEN (8090, 80, 3306…) |\n| `install-autostart.ps1` | Tarea al login + HKCU Run para bandeja |\n| `capture-manual-screenshots.ps1` | Abre URLs móviles y guía capturas en `docs/img/` |\n\n### PHP CLI (`tools/`)\n\n| Script | Función |\n|--------|---------|\n| `bootstrap-plugin.php` | `Plugins::enable('ALimpiezasMobile')` + `deploy()` → reconstruye `Dinamic/` |\n| `create-ai-table.php` | Crea tabla `ai_expense_queue` vía `DbUpdater` |\n\n### Python\n\n| Script | Función |\n|--------|---------|\n| `tools/port-services.py` | Alternativa cross-platform a `port-services.ps1` (`--json`) |\n| `ai-service/main.py` | FastAPI OCR/voz (arranque vía `uvicorn`, no script dedicado) |\n\n### Make\n\nNo hay `Makefile`.\n\n### CI (`.github/workflows/`)\n\n| Workflow | Alcance |\n|----------|---------|\n| `test.yml` | PHPUnit × PHP 8.1–8.4 × MySQL/MariaDB/PostgreSQL + audit + PHPCS/PHPStan |\n| `test-countries.yml` | PHPUnit por país (COL, ECU, MEX…) |\n\nAmbos heredados de FacturaScripts upstream; **no prueban el plugin ALimpiezas ni el servicio IA**.\n\n---\n\n## 2. Tareas manuales repetitivas detectadas\n\n| Tarea | Frecuencia | Dolor actual |\n|-------|------------|--------------|\n| **Deploy plugin tras editar `Plugins/`** | Cada cambio PHP/Twig/Assets | `php tools/bootstrap-plugin.php` a mano |\n| **Verificar stack tras arrancar PC** | Diaria | Comprobar Apache, MySQL, `:8090/health`, CSS móvil |\n| **Resolver puerto 8090 ocupado** | Ocasional | `port-services.ps1` + restart manual |\n| **Instalar deps Python IA** | Tras clone/actualizar | `pip install -r ai-service/requirements.txt` sin script |\n| **QA post-cambio móvil** | Cada feature | 3–4 curls/URLs sueltos (documentados en manual) |\n| **Migración tabla cola** | Tras cambio XML | `create-ai-table.php` separado del bootstrap |\n| **Capturas manual usuario** | Al actualizar docs | Semi-automático; captura real sigue siendo manual |\n| **Recordar regla Assets** | Siempre | Editar `Plugins/.../Assets/` → bootstrap; URLs solo `Dinamic/Assets/` |\n| **No editar `Dinamic/` directamente** | Siempre | Riesgo de perder cambios en próximo deploy |\n| **Composer en Windows** | Setup/CI local | Flag `--ignore-platform-req=ext-pgsql` |\n| **Tests del plugin** | Nunca automatizado | 0 tests en `Test/` para ALimpiezasMobile |\n| **Sincronización Bridge móvil → PC** | Desarrollo remoto | Flujo manual vía Cursor Bridge |\n\n---\n\n## 3. Prompts reutilizables (copy-paste para Cursor móvil)\n\n### Prompt 1 — Deploy plugin tras cambios\n\n```\nProyecto: C:\\xampp\\htdocs\\ALimpiezas\nAcabo de editar Plugins/ALimpiezasMobile/ (NO tocar Dinamic/ directamente).\n\n1. Revisa que Assets usen asset('Dinamic/Assets/...') en Twig.\n2. Ejecuta: php tools/bootstrap-plugin.php\n3. Verifica:\n   - curl -I http://localhost/ALimpiezas/Dinamic/Assets/CSS/mobile.css\n   - curl http://127.0.0.1:8090/health\n4. Resume qué se desplegó y si hay errores.\n\nUsa Serena MCP. No escanees vendor/ ni Core/ salvo que sea necesario.\n```\n\n### Prompt 2 — Diagnóstico stack completo\n\n```\nProyecto ALimpiezas — algo no funciona en local.\n\nDiagnostica en orden:\n1. .\\tools\\port-services.ps1 -Port 80,3306,8090\n2. Estado Apache/MySQL (servicios Windows)\n3. curl http://127.0.0.1:8090/health\n4. curl -I http://localhost/ALimpiezas/MobileHome\n5. Si IA caída: .\\tools\\ai-service-manager.ps1 -Restart\n\nEntrega: tabla estado/puerto/proceso + acción concreta para arreglar.\nEjecuta comandos tú mismo; responde en español.\n```\n\n### Prompt 3 — Nueva feature en flujo gastos\n\n```\nFeature en ALimpiezasMobile — flujo gastos/OCR.\n\nContexto:\n- Upload → ai_expense_queue → confirm → ExpenseInvoiceCreator → FacturaProveedor\n- Modos: manual | ocr | ai (settings group alimpiezas)\n- Código fuente: Plugins/ALimpiezasMobile/Lib/AiExpenseProcessor.php, ExpenseInvoiceCreator.php\n- Microservicio: ai-service/main.py endpoint /api/v1/extract-invoice\n\nImplementa [DESCRIBE AQUÍ LA FEATURE].\nTras cambios: bootstrap-plugin.php + indica cómo probar desde MobileExpenses.\nNo modifiques Dinamic/ directamente.\n```\n\n### Prompt 4 — Cambio en microservicio IA\n\n```\nProyecto: ai-service/ (FastAPI puerto 8090)\n\nCambio solicitado: [DESCRIBE AQUÍ]\n\nArchivos clave: ai-service/main.py, requirements.txt\nTras editar:\n1. .\\tools\\ai-service-manager.ps1 -Restart\n2. curl http://127.0.0.1:8090/health\n3. Prueba POST /api/v1/extract-invoice con un PDF/imagen de ejemplo si aplica\n\nDocumenta el contrato JSON request/response actualizado.\n```\n\n### Prompt 5 — Review pre-commit del plugin móvil\n\n```\nReview de cambios en Plugins/ALimpiezasMobile/ antes de commit.\n\nComprueba:\n- ¿Se editó Dinamic/ por error? (debe ser solo vía bootstrap)\n- ¿Twig referencia Dinamic/Assets y no Plugins/Assets?\n- ¿Nuevos settings van a group alimpiezas en MobileConfig?\n- ¿Traducciones en Translation/es_ES.json?\n- ¿Init.php registra tablas/controladores nuevos?\n\nLista issues por severidad (bloqueante / menor / sugerencia).\nNo hagas commit salvo que lo pida explícitamente.\n```\n\n---\n\n## 4. CI/CD — qué falta o mejorar\n\n### Lo que ya existe (upstream)\n\n- Matriz amplia PHPUnit (PHP × BD × países)\n- `composer audit` de seguridad\n- PHPStan/PHPCS (pero con `continue-on-error: true` y sin config del plugin)\n\n### Gaps críticos para ALimpiezas\n\n| Gap | Impacto | Propuesta |\n|-----|---------|-----------|\n| **Sin tests del plugin** | Regresiones silenciosas en gastos/fiscal/voz | Crear `Test/Plugins/ALimpiezasMobile/` con tests de `ExpenseInvoiceCreator`, `VoiceCommandBridge` |\n| **CI no ejecuta bootstrap** | Plugin no se valida en pipeline | Job: `php tools/bootstrap-plugin.php` + smoke HTTP |\n| **Sin CI Python** | Roturas en OCR/voz no detectadas | Workflow `ai-service`: `pip install`, pytest básico de `/health` |\n| **PHPStan solo Core** | Errores en `Plugins/` ignorados | Ampliar a `Plugins/ALimpiezasMobile` |\n| **Workflows genéricos FS** | Matriz 4 PHP × 3 BD = lento y irrelevante para tu stack MariaDB local | Job ligero `alimpiezas-smoke.yml` solo en cambios `Plugins/**`, `ai-service/**`, `tools/**` |\n| **`composer.lock` sin trackear** | Builds no reproducibles | Añadir al repo |\n| **`Dinamic/` en `.gitignore` pero modificado en git** | Ruido en `git status`, confusión deploy | Decidir: o bien dejar de trackear (`git rm --cached Dinamic/`) o excluir del ignore |\n| **Sin deploy automatizado** | Manual en XAMPP | Opcional: script post-pull `tools/update-local.ps1` |\n| **Sin lint Twig/JS móvil** | Inconsistencias UI | ESLint/Stylelint solo en `Plugins/ALimpiezasMobile/Assets/` |\n| **Codecov upstream** | Poco valor para plugin custom | Desactivar o reorientar cobertura al plugin |\n\n### Workflow sugerido (esqueleto)\n\n```yaml\n# .github/workflows/alimpiezas-smoke.yml\non:\n  push:\n    paths: ['Plugins/ALimpiezasMobile/**', 'ai-service/**', 'tools/**']\njobs:\n  smoke:\n    runs-on: ubuntu-latest\n    services:\n      mysql: { image: mariadb:11, env: { MARIADB_ROOT_PASSWORD: root, MARIADB_DATABASE: test } }\n    steps:\n      - uses: actions/checkout@v5\n      - run: composer install --ignore-platform-req=ext-pgsql\n      - run: # crear config.php mínimo\n      - run: php tools/bootstrap-plugin.php\n      - run: vendor/bin/phpunit Test/Plugins/ALimpiezasMobile/  # cuando exista\n      - run: pip install -r ai-service/requirements.txt && pytest ai-service/tests/\n```\n\n---\n\n## 5. Quick wins (~1 hora, alto impacto)\n\n### 1. Script `tools/qa-smoke.ps1` (≈30 min)\n\nUnifica las comprobaciones del manual §13:\n\n```powershell\n# Propuesta: un solo comando post-cambio\n.\\tools\\qa-smoke.ps1\n# → bootstrap si -Deploy\n# → /health, mobile.css, MobileHome HTTP 200\n# → exit code ≠ 0 si algo falla\n```\n\n**Impacto:** Elimina 4–5 comandos manuales tras cada sesión de desarrollo.\n\n### 2. Alias Composer `deploy:mobile` (≈15 min)\n\nEn `composer.json`:\n\n```json\n\"deploy:mobile\": \"php tools/bootstrap-plugin.php\",\n\"deploy:mobile+table\": [\"@deploy:mobile\", \"php tools/create-ai-table.php\"]\n```\n\n**Impacto:** Un comando estándar que cualquier agente/humano recuerda.\n\n### 3. Script `tools/setup-ai-service.ps1` (≈45 min)\n\n```powershell\n# pip install -r requirements.txt\n# verifica Tesseract en C:\\Program Files\\Tesseract-OCR\\\n# arranca y valida /health\n```\n\n**Impacto:** Onboarding y reparación del servicio IA en un paso.\n\n### 4. Regla Cursor `.cursor/rules/alimpiezas.md` (≈20 min)\n\nContenido mínimo:\n- Editar solo `Plugins/ALimpiezasMobile/`\n- Tras cambios: `composer deploy:mobile`\n- Assets → `Dinamic/Assets/` en URLs\n- No tocar `Core/` salvo bug upstream\n\n**Impacto:** Agentes (Bridge móvil incluido) dejan de proponer edits en `Dinamic/`.\n\n### 5. Test PHPUnit mínimo del plugin (≈60 min)\n\nUn solo test: `ExpenseInvoiceCreator` crea `FacturaProveedor` con datos mock.\n\n**Impacto:** Primera red de seguridad real; desbloquea CI del plugin.\n\n### 6. Unificar `tools/dev.ps1` (≈45 min)\n\n```powershell\n.\\tools\\dev.ps1 -Action start|stop|restart|qa|deploy\n```\n\nEnvuelve `start-stack`, `bootstrap-plugin`, `qa-smoke`.\n\n**Impacto:** Un entry point para desarrollo diario desde iPhone vía agente.\n\n### 7. Pre-commit ligero con `tools/pre-commit.ps1` (≈30 min)\n\n- Detecta cambios en `Plugins/` sin bootstrap reciente (timestamp)\n- Avisa si hay edits en `Dinamic/` fuera de deploy\n\n**Impacto:** Evita commits rotos y olvidos de deploy.\n\n---\n\n## Priorización recomendada\n\n```mermaid\nflowchart LR\n    A[qa-smoke.ps1] --> B[composer deploy:mobile]\n    B --> C[.cursor/rules]\n    C --> D[1 test PHPUnit plugin]\n    D --> E[CI alimpiezas-smoke.yml]\n    E --> F[setup-ai-service.ps1]\n```\n\n| Orden | Acción | Tiempo | ROI |\n|-------|--------|--------|-----|\n| 1 | `qa-smoke.ps1` + `deploy:mobile` | 45 min | Alto — uso inmediato diario |\n| 2 | Regla Cursor | 20 min | Alto — Bridge móvil más fiable |\n| 3 | 1 test + workflow smoke | 2 h | Medio-alto — confianza en CI |\n| 4 | `dev.ps1` unificado | 45 min | Medio — ergonomía |\n| 5 | Pipeline Python | 1 h | Medio — cuando OCR cambie mucho |\n\n---\n\nSi quieres, el siguiente paso puede ser **implementar el quick win #1+#2** (`qa-smoke.ps1` + scripts Composer) en una sola pasada desde el Bridge."}},"at":1782305767700},{"event":"done","data":{"ok":true,"bridgeSessionId":"bs-1782305767695-zdjqy7","agentId":"agent-5488502e-cc0a-45d7-809b-f51d5f309aa1","runId":"run-392bc518-9333-4a42-9b83-06f53978b622","status":"finished","result":"# Automatizaciones propuestas — ALimpiezas\n\nERP FacturaScripts + plugin móvil `ALimpiezasMobile` + microservicio FastAPI (puerto 8090) en XAMPP. El proyecto ya tiene buena base operativa en `tools/`; lo que falta es unificar flujos, cubrir el plugin custom y reducir pasos manuales post-cambio.\n\n---\n\n## 1. Scripts existentes\n\n### Composer (`composer.json`)\n\n| Script | Comando | Estado |\n|--------|---------|--------|\n| `test` | `vendor/bin/phpunit` | ✅ Funcional (suite FacturaScripts en `Test/`) |\n| `test:coverage` | PHPUnit + HTML coverage | ✅ |\n| `phpstan` | Analiza solo `Core/` | ⚠️ No incluye `Plugins/` |\n| `cs-check` / `cs-fix` | PHPCS / PHPCBF | ✅ (requiere config) |\n| `dev-server` | `php -S localhost:8000` | ⚠️ No usa XAMPP real |\n\nInstalación local documentada:\n```powershell\ncomposer install --ignore-platform-req=ext-pgsql\n```\n\n### npm raíz (`package.json`)\n\n| Script | Estado |\n|--------|--------|\n| `build`, `build:css`, `build:js`, `watch` | ❌ Placeholders (`echo \"Add your build process here\"`) |\n| `test` | ❌ Sin tests JS |\n\nDependencias: Bootstrap 5, jQuery, Chart.js, FontAwesome (ERP desktop, no el móvil).\n\n### npm bandeja (`tools/tray/package.json`)\n\n| Script | Comando |\n|--------|---------|\n| `start` | `node alimpiezas_tray.js` |\n\nUtilidades Node: `gen-icons.js`, `gen-icons-ico.js`.\n\n### PowerShell (`tools/`)\n\n| Script | Función |\n|--------|---------|\n| `start-stack.ps1` | Apache + MySQL + IA :8090 + bandeja + log en `data/alimpiezas-startup.log` |\n| `ai-service-manager.ps1` | `-Start` / `-Stop` / `-Restart` / `-Status` del microservicio |\n| `port-services.ps1` | Diagnóstico puertos LISTEN (8090, 80, 3306…) |\n| `install-autostart.ps1` | Tarea al login + HKCU Run para bandeja |\n| `capture-manual-screenshots.ps1` | Abre URLs móviles y guía capturas en `docs/img/` |\n\n### PHP CLI (`tools/`)\n\n| Script | Función |\n|--------|---------|\n| `bootstrap-plugin.php` | `Plugins::enable('ALimpiezasMobile')` + `deploy()` → reconstruye `Dinamic/` |\n| `create-ai-table.php` | Crea tabla `ai_expense_queue` vía `DbUpdater` |\n\n### Python\n\n| Script | Función |\n|--------|---------|\n| `tools/port-services.py` | Alternativa cross-platform a `port-services.ps1` (`--json`) |\n| `ai-service/main.py` | FastAPI OCR/voz (arranque vía `uvicorn`, no script dedicado) |\n\n### Make\n\nNo hay `Makefile`.\n\n### CI (`.github/workflows/`)\n\n| Workflow | Alcance |\n|----------|---------|\n| `test.yml` | PHPUnit × PHP 8.1–8.4 × MySQL/MariaDB/PostgreSQL + audit + PHPCS/PHPStan |\n| `test-countries.yml` | PHPUnit por país (COL, ECU, MEX…) |\n\nAmbos heredados de FacturaScripts upstream; **no prueban el plugin ALimpiezas ni el servicio IA**.\n\n---\n\n## 2. Tareas manuales repetitivas detectadas\n\n| Tarea | Frecuencia | Dolor actual |\n|-------|------------|--------------|\n| **Deploy plugin tras editar `Plugins/`** | Cada cambio PHP/Twig/Assets | `php tools/bootstrap-plugin.php` a mano |\n| **Verificar stack tras arrancar PC** | Diaria | Comprobar Apache, MySQL, `:8090/health`, CSS móvil |\n| **Resolver puerto 8090 ocupado** | Ocasional | `port-services.ps1` + restart manual |\n| **Instalar deps Python IA** | Tras clone/actualizar | `pip install -r ai-service/requirements.txt` sin script |\n| **QA post-cambio móvil** | Cada feature | 3–4 curls/URLs sueltos (documentados en manual) |\n| **Migración tabla cola** | Tras cambio XML | `create-ai-table.php` separado del bootstrap |\n| **Capturas manual usuario** | Al actualizar docs | Semi-automático; captura real sigue siendo manual |\n| **Recordar regla Assets** | Siempre | Editar `Plugins/.../Assets/` → bootstrap; URLs solo `Dinamic/Assets/` |\n| **No editar `Dinamic/` directamente** | Siempre | Riesgo de perder cambios en próximo deploy |\n| **Composer en Windows** | Setup/CI local | Flag `--ignore-platform-req=ext-pgsql` |\n| **Tests del plugin** | Nunca automatizado | 0 tests en `Test/` para ALimpiezasMobile |\n| **Sincronización Bridge móvil → PC** | Desarrollo remoto | Flujo manual vía Cursor Bridge |\n\n---\n\n## 3. Prompts reutilizables (copy-paste para Cursor móvil)\n\n### Prompt 1 — Deploy plugin tras cambios\n\n```\nProyecto: C:\\xampp\\htdocs\\ALimpiezas\nAcabo de editar Plugins/ALimpiezasMobile/ (NO tocar Dinamic/ directamente).\n\n1. Revisa que Assets usen asset('Dinamic/Assets/...') en Twig.\n2. Ejecuta: php tools/bootstrap-plugin.php\n3. Verifica:\n   - curl -I http://localhost/ALimpiezas/Dinamic/Assets/CSS/mobile.css\n   - curl http://127.0.0.1:8090/health\n4. Resume qué se desplegó y si hay errores.\n\nUsa Serena MCP. No escanees vendor/ ni Core/ salvo que sea necesario.\n```\n\n### Prompt 2 — Diagnóstico stack completo\n\n```\nProyecto ALimpiezas — algo no funciona en local.\n\nDiagnostica en orden:\n1. .\\tools\\port-services.ps1 -Port 80,3306,8090\n2. Estado Apache/MySQL (servicios Windows)\n3. curl http://127.0.0.1:8090/health\n4. curl -I http://localhost/ALimpiezas/MobileHome\n5. Si IA caída: .\\tools\\ai-service-manager.ps1 -Restart\n\nEntrega: tabla estado/puerto/proceso + acción concreta para arreglar.\nEjecuta comandos tú mismo; responde en español.\n```\n\n### Prompt 3 — Nueva feature en flujo gastos\n\n```\nFeature en ALimpiezasMobile — flujo gastos/OCR.\n\nContexto:\n- Upload → ai_expense_queue → confirm → ExpenseInvoiceCreator → FacturaProveedor\n- Modos: manual | ocr | ai (settings group alimpiezas)\n- Código fuente: Plugins/ALimpiezasMobile/Lib/AiExpenseProcessor.php, ExpenseInvoiceCreator.php\n- Microservicio: ai-service/main.py endpoint /api/v1/extract-invoice\n\nImplementa [DESCRIBE AQUÍ LA FEATURE].\nTras cambios: bootstrap-plugin.php + indica cómo probar desde MobileExpenses.\nNo modifiques Dinamic/ directamente.\n```\n\n### Prompt 4 — Cambio en microservicio IA\n\n```\nProyecto: ai-service/ (FastAPI puerto 8090)\n\nCambio solicitado: [DESCRIBE AQUÍ]\n\nArchivos clave: ai-service/main.py, requirements.txt\nTras editar:\n1. .\\tools\\ai-service-manager.ps1 -Restart\n2. curl http://127.0.0.1:8090/health\n3. Prueba POST /api/v1/extract-invoice con un PDF/imagen de ejemplo si aplica\n\nDocumenta el contrato JSON request/response actualizado.\n```\n\n### Prompt 5 — Review pre-commit del plugin móvil\n\n```\nReview de cambios en Plugins/ALimpiezasMobile/ antes de commit.\n\nComprueba:\n- ¿Se editó Dinamic/ por error? (debe ser solo vía bootstrap)\n- ¿Twig referencia Dinamic/Assets y no Plugins/Assets?\n- ¿Nuevos settings van a group alimpiezas en MobileConfig?\n- ¿Traducciones en Translation/es_ES.json?\n- ¿Init.php registra tablas/controladores nuevos?\n\nLista issues por severidad (bloqueante / menor / sugerencia).\nNo hagas commit salvo que lo pida explícitamente.\n```\n\n---\n\n## 4. CI/CD — qué falta o mejorar\n\n### Lo que ya existe (upstream)\n\n- Matriz amplia PHPUnit (PHP × BD × países)\n- `composer audit` de seguridad\n- PHPStan/PHPCS (pero con `continue-on-error: true` y sin config del plugin)\n\n### Gaps críticos para ALimpiezas\n\n| Gap | Impacto | Propuesta |\n|-----|---------|-----------|\n| **Sin tests del plugin** | Regresiones silenciosas en gastos/fiscal/voz | Crear `Test/Plugins/ALimpiezasMobile/` con tests de `ExpenseInvoiceCreator`, `VoiceCommandBridge` |\n| **CI no ejecuta bootstrap** | Plugin no se valida en pipeline | Job: `php tools/bootstrap-plugin.php` + smoke HTTP |\n| **Sin CI Python** | Roturas en OCR/voz no detectadas | Workflow `ai-service`: `pip install`, pytest básico de `/health` |\n| **PHPStan solo Core** | Errores en `Plugins/` ignorados | Ampliar a `Plugins/ALimpiezasMobile` |\n| **Workflows genéricos FS** | Matriz 4 PHP × 3 BD = lento y irrelevante para tu stack MariaDB local | Job ligero `alimpiezas-smoke.yml` solo en cambios `Plugins/**`, `ai-service/**`, `tools/**` |\n| **`composer.lock` sin trackear** | Builds no reproducibles | Añadir al repo |\n| **`Dinamic/` en `.gitignore` pero modificado en git** | Ruido en `git status`, confusión deploy | Decidir: o bien dejar de trackear (`git rm --cached Dinamic/`) o excluir del ignore |\n| **Sin deploy automatizado** | Manual en XAMPP | Opcional: script post-pull `tools/update-local.ps1` |\n| **Sin lint Twig/JS móvil** | Inconsistencias UI | ESLint/Stylelint solo en `Plugins/ALimpiezasMobile/Assets/` |\n| **Codecov upstream** | Poco valor para plugin custom | Desactivar o reorientar cobertura al plugin |\n\n### Workflow sugerido (esqueleto)\n\n```yaml\n# .github/workflows/alimpiezas-smoke.yml\non:\n  push:\n    paths: ['Plugins/ALimpiezasMobile/**', 'ai-service/**', 'tools/**']\njobs:\n  smoke:\n    runs-on: ubuntu-latest\n    services:\n      mysql: { image: mariadb:11, env: { MARIADB_ROOT_PASSWORD: root, MARIADB_DATABASE: test } }\n    steps:\n      - uses: actions/checkout@v5\n      - run: composer install --ignore-platform-req=ext-pgsql\n      - run: # crear config.php mínimo\n      - run: php tools/bootstrap-plugin.php\n      - run: vendor/bin/phpunit Test/Plugins/ALimpiezasMobile/  # cuando exista\n      - run: pip install -r ai-service/requirements.txt && pytest ai-service/tests/\n```\n\n---\n\n## 5. Quick wins (~1 hora, alto impacto)\n\n### 1. Script `tools/qa-smoke.ps1` (≈30 min)\n\nUnifica las comprobaciones del manual §13:\n\n```powershell\n# Propuesta: un solo comando post-cambio\n.\\tools\\qa-smoke.ps1\n# → bootstrap si -Deploy\n# → /health, mobile.css, MobileHome HTTP 200\n# → exit code ≠ 0 si algo falla\n```\n\n**Impacto:** Elimina 4–5 comandos manuales tras cada sesión de desarrollo.\n\n### 2. Alias Composer `deploy:mobile` (≈15 min)\n\nEn `composer.json`:\n\n```json\n\"deploy:mobile\": \"php tools/bootstrap-plugin.php\",\n\"deploy:mobile+table\": [\"@deploy:mobile\", \"php tools/create-ai-table.php\"]\n```\n\n**Impacto:** Un comando estándar que cualquier agente/humano recuerda.\n\n### 3. Script `tools/setup-ai-service.ps1` (≈45 min)\n\n```powershell\n# pip install -r requirements.txt\n# verifica Tesseract en C:\\Program Files\\Tesseract-OCR\\\n# arranca y valida /health\n```\n\n**Impacto:** Onboarding y reparación del servicio IA en un paso.\n\n### 4. Regla Cursor `.cursor/rules/alimpiezas.md` (≈20 min)\n\nContenido mínimo:\n- Editar solo `Plugins/ALimpiezasMobile/`\n- Tras cambios: `composer deploy:mobile`\n- Assets → `Dinamic/Assets/` en URLs\n- No tocar `Core/` salvo bug upstream\n\n**Impacto:** Agentes (Bridge móvil incluido) dejan de proponer edits en `Dinamic/`.\n\n### 5. Test PHPUnit mínimo del plugin (≈60 min)\n\nUn solo test: `ExpenseInvoiceCreator` crea `FacturaProveedor` con datos mock.\n\n**Impacto:** Primera red de seguridad real; desbloquea CI del plugin.\n\n### 6. Unificar `tools/dev.ps1` (≈45 min)\n\n```powershell\n.\\tools\\dev.ps1 -Action start|stop|restart|qa|deploy\n```\n\nEnvuelve `start-stack`, `bootstrap-plugin`, `qa-smoke`.\n\n**Impacto:** Un entry point para desarrollo diario desde iPhone vía agente.\n\n### 7. Pre-commit ligero con `tools/pre-commit.ps1` (≈30 min)\n\n- Detecta cambios en `Plugins/` sin bootstrap reciente (timestamp)\n- Avisa si hay edits en `Dinamic/` fuera de deploy\n\n**Impacto:** Evita commits rotos y olvidos de deploy.\n\n---\n\n## Priorización recomendada\n\n```mermaid\nflowchart LR\n    A[qa-smoke.ps1] --> B[composer deploy:mobile]\n    B --> C[.cursor/rules]\n    C --> D[1 test PHPUnit plugin]\n    D --> E[CI alimpiezas-smoke.yml]\n    E --> F[setup-ai-service.ps1]\n```\n\n| Orden | Acción | Tiempo | ROI |\n|-------|--------|--------|-----|\n| 1 | `qa-smoke.ps1` + `deploy:mobile` | 45 min | Alto — uso inmediato diario |\n| 2 | Regla Cursor | 20 min | Alto — Bridge móvil más fiable |\n| 3 | 1 test + workflow smoke | 2 h | Medio-alto — confianza en CI |\n| 4 | `dev.ps1` unificado | 45 min | Medio — ergonomía |\n| 5 | Pipeline Python | 1 h | Medio — cuando OCR cambie mucho |\n\n---\n\nSi quieres, el siguiente paso puede ser **implementar el quick win #1+#2** (`qa-smoke.ps1` + scripts Composer) en una sola pasada desde el Bridge.","changeSessionId":"cs-1782305730277-fvym5w","pendingChanges":0,"changes":[],"transcriptPath":null,"notifyTitle":"Agente terminado","notifyBody":"Explorando el proyecto de forma focalizada para proponer automatizaciones concretas.\n# Automatizaciones propuestas — ALi"},"at":1782305767700}]}
