{"name": "Pudumaps", "package_name": "pudumaps_qgis", "version": "0.9.3", "experimental": false, "qgis_min": "3.22.0", "qgis_max": "3.99.0", "downloads": 9, "uploaded_by": "Chocoplatano", "upload_datetime": "2026-08-20T17:26:56.730909", "changelog": "0.9.3 (2026-08-20) \u2014 Fix: las capas de ArcGIS FeatureServer no cargaban\n* Las capas del catalogo Capas Oficiales servidas por ArcGIS\nFeatureServer (SERNAGEOMIN, SENAPRED y otras) fallaban al abrir un\nproyecto, con el error external_layer_invalid, aunque los servicios\nrespondian normalmente. Se veian bien en la web de Pudumaps.\n* Dos causas, las dos corregidas: el proveedor de QGIS necesita el\norigen de datos como pares clave=valor y no como una URL suelta, y\nademas exige el numero de capa del FeatureServer, que en algunas\ncapas no venia. Ahora se consulta al servicio cual es.\n* Las capas de tipo MapServer nunca estuvieron afectadas.\n\n0.9.2 (2026-08-20) \u2014 La URL de la API pasa a pudumaps.cl y el campo se esconde\n* La URL base por defecto deja de ser el endpoint crudo de Supabase y\npasa a https://pudumaps.cl/api, que hace de proxy hacia la misma\nEdge Function. El endpoint viejo sigue funcionando.\n* Las instalaciones que ya tenian guardada la URL vieja se migran solas\nal abrir el plugin. Una URL personalizada (dev, self-host) no se toca.\n* El campo \"Base URL\" del dialogo de Configuracion ahora vive detras de\nuna casilla \"Avanzado\" y esta oculto por defecto. Se abre solo si hay\nuna URL personalizada guardada, para que nadie quede apuntando a otro\nlado sin darse cuenta.\n\n0.9.1 (2026-08-20) \u2014 Fix: el dialogo de Configuracion decia que la API requeria plan Pro\n* El texto de ayuda del dialogo de Configuracion seguia diciendo\n\"Requiere plan Pro o superior\". El acceso a la API se abrio a todos\nlos planes, incluido el gratuito, el 2026-08-19. La v0.8.2 corrigio\nmetadata.txt y el README pero no este string, que es el unico de los\ntres que el usuario ve realmente.\n\n0.9.0 (2026-08-20) \u2014 Primera version estable: el plugin sale de \"experimental\"\n* El plugin deja de estar marcado como experimental. Pasa a aparecer en\nel repositorio oficial de QGIS sin necesidad de activar \"Mostrar\ntambien complementos experimentales\" en el Administrador de\nComplementos.\n* Sin cambios funcionales respecto de 0.8.7: mismo codigo, mismos 164\ntests en verde, bandit y ruff limpios. El salto de version marca el\ncambio de estado de publicacion, no una funcionalidad nueva.\n* Alcance verificado: pull de proyectos y capas \u2014 incluidas capas\nexternas WMS/ArcGIS del catalogo Capas Oficiales de Chile \u2014 contra\ndatos reales. Push y sync bidireccional funcionan pero acumulan menos\nhoras de vuelo; ante un conflicto el plugin nunca sobrescribe solo,\nsiempre pregunta que lado gana.\n\n0.8.7 (2026-08-19) \u2014 Fix: 48 issues de compatibilidad Qt6 detectados por plugins.qgis.org\n* BUG REPORTADO al subir v0.8.6: security scan pas\u00f3, pero el check de\ncompatibilidad Qt6 marc\u00f3 48 issues en 8 archivos \u2014 enums de PyQt5\nsin calificar (ej. QMessageBox.Yes en vez de\nQMessageBox.StandardButton.Yes) y 4 usos de .exec_() (removido en\nPyQt6, solo queda .exec()).\n* Fix: los 48 corregidos a la forma calificada/PyQt6-compatible.\nSigue funcionando igual en QGIS con Qt5 \u2014 la forma calificada\nsiempre fue v\u00e1lida en PyQt5 tambi\u00e9n, no es exclusiva de Qt6.\n* NOTA: no se pudo probar contra un runtime Qt6/PyQt6 real (no hay\nQGIS instalado en el entorno de desarrollo) \u2014 verificado sintaxis\n+ bandit + ruff + 164 tests, pero el fix en s\u00ed es el patr\u00f3n\nest\u00e1ndar documentado de migraci\u00f3n PyQt5\u2192PyQt6, no smoke-testeado\nend-to-end en Qt6.\n\n0.8.6 (2026-08-19) \u2014 Fix: 3 hallazgos CR\u00cdTICOS de Bandit bloqueaban el scan de seguridad\n* BUG REPORTADO al subir v0.8.5: plugins.qgis.org bloque\u00f3 la\npublicaci\u00f3n por 3 try/except/pass (error_utils.py, plugin.py,\nproject_loader.py) \u2014 su scanner los trata como CR\u00cdTICOS, a\ndiferencia de bandit local que los marca solo LOW. Ya no eran\naceptables como estaban.\n* Fix real, no solo silenciar el scan: los 3 ahora loggean el error\n(log_full_error, o print a stderr en el caso de error_utils.py que\nes el propio fallback de logging y no puede llamarse a s\u00ed mismo)\nen vez de trag\u00e1rselo en silencio. Mismo comportamiento best-effort\nde antes \u2014 ninguna excepci\u00f3n ah\u00ed debe crashear el flujo \u2014 pero ya\nno desaparece sin rastro para debugging.\n* bandit: 0 issues (antes 3 LOW). ruff: 0 issues. 164/164 tests\nverdes.\n\n0.8.5 (2026-08-19) \u2014 Fix: faltaba LICENSE dentro del ZIP publicado\n* BUG REPORTADO al subir el ZIP: \"Cannot find LICENSE in the plugin\npackage\". El LICENSE (GPL-3.0) vive en la ra\u00edz del repo, pero\nbuild.py/build.sh solo empaquetaban pudumaps_qgis/ \u2014 nunca lo\ninclu\u00edan. Ahora ambos scripts copian LICENSE dentro del paquete\n(junto a metadata.txt) al construir el ZIP.\n\n0.8.4 (2026-08-19) \u2014 Fix: metadata.txt romp\u00eda el parser INI de plugins.qgis.org\n* BUG REPORTADO al subir el ZIP: el changelog de v0.7.6 ten\u00eda un\ns\u00edmbolo porcentaje suelto (nubosidad, sin escapar). metadata.txt\nse lee con configparser (formato INI), que trata ese s\u00edmbolo como\ncar\u00e1cter especial de interpolaci\u00f3n \u2014 uno solo sin duplicar rompe\nel parseo completo del archivo. Ya escapado correctamente.\nVerificado simulando el mismo parser (ConfigParser + resoluci\u00f3n de\ncada valor) antes de subir: parsea limpio.\n\n0.8.3 (2026-08-19) \u2014 Limpieza de c\u00f3digo previa a publicar en plugins.qgis.org\n* 2 imports sin usar (Qt en sync_dialog.py, QWidget en ui_helpers.py),\n2 f-strings sin placeholder y 3 l\u00edneas >100 cols. Sin cambios de\ncomportamiento. Verificado con bandit (0 issues medium/high) y\nruff --select E,F,W (0 issues) antes de subir a plugins.qgis.org.\n\n0.8.2 (2026-08-18) \u2014 El acceso a la API ya no requiere plan Pro\n* Pudumaps abri\u00f3 acceso a la API (y por lo tanto al plugin) a todos\nlos planes, incluido Free \u2014 antes requer\u00eda Pro o superior. Se\nactualiza el texto de metadata.txt y README.md, que segu\u00edan\ndiciendo lo contrario.\n\n0.8.1 (2026-08-17) \u2014 Fix: capas externas del cat\u00e1logo Capas Oficiales quedaban invisibles\n* BUG REPORTADO: al abrir un proyecto con capas del cat\u00e1logo \"Capas\nOficiales de Chile\" (WMS/ArcGIS MapServer/FeatureServer), el canvas\nquedaba completamente en blanco y sin zoom para las 7 capas del\nproyecto de prueba \u2014 no solo la marcada (WMS).\n* Causa ra\u00edz: esas capas se guardan en project_layers con geojson=null\n(layer_type + external_url describen el servicio real; la web las\nrenderiza en vivo). La API v1 nunca expon\u00eda layer_type/external_url \u2014\nsolo geojson/id/name/display_order/project_id \u2014 as\u00ed que el plugin\nrecib\u00eda geojson=null para las 7 capas, las trataba a todas como\nFeatureCollection vac\u00edo, y _zoom_to_group las saltaba por tener 0\nfeatures \u2192 sin combined extent \u2192 canvas nunca se mov\u00eda del default.\n* Fix backend (migraci\u00f3n 20260817190000): api_v1_list_layers y\napi_v1_get_layer ahora exponen layer_type/external_url/metadata.\n* Fix plugin: project_loader distingue layer_type. Para wms/arcgis_map\ncrea un QgsRasterLayer (proveedores nativos wms/arcgismapserver); para\narcgis_feature, un QgsVectorLayer (arcgisfeatureserver). 'weather'\n(puntos Open-Meteo calculados en el navegador, sin servicio geoespacial\nreal) se reporta como no soportado en vez de quedar en blanco sin\nexplicaci\u00f3n.\n* _zoom_to_group ya no crashea silenciosamente ante la primera capa\nraster del grupo (featureCount() no existe en QgsRasterLayer).\n* sync_dialog y el men\u00fa contextual \"Subir a Pudumaps\" excluyen estas\ncapas \u2014 son referencias en vivo, no datos locales para sincronizar.\n* 11 tests nuevos, 164/164 verdes.\n\n0.8.0 (2026-08-17) \u2014 M\u00f3dulo IA oculto de la UI + hardening para publicaci\u00f3n\n* El m\u00f3dulo IA (detecci\u00f3n de edificios/agua, landcover, change detection,\ndescarga Sentinel-2 v\u00eda geoai-py/GeoAgent) queda FUERA de esta release.\nNo es un feature maduro: depend\u00eda de un instalador pip pesado (~2 GB,\nPyTorch) contra el Python embebido de QGIS, con varios hotfixes de DLL\n/CRS sin smoke test completo. Se retira de la UI (men\u00fa, toolbar, panel)\ny del zip publicado \u2014 el c\u00f3digo sigue en el repo (paquete ai/ y\ndi\u00e1logos asociados) por si se retoma m\u00e1s adelante, pero no se instala\nni se ofrece al usuario.\n* scripts/build.py y build.sh excluyen pudumaps_qgis/ai/ y los di\u00e1logos\nIA del zip. El plugin publicado ya no arrastra la superficie de fallo\nde PyTorch/geoai \u2014 solo depende de `requests`, ya bundleada en QGIS.\n* Sin cambios en sync/pull/push/settings \u2014 siguen siendo el foco del\nplugin: navegar proyectos, abrir capas, subir capas nuevas y\nsincronizar cambios en ambas direcciones contra la API p\u00fablica.\n\n0.7.13 (2026-05-19) \u2014 Fix extract_buildings flow + mejor mensaje vac\u00edo\n* BUG REPORTADO en 0.7.12: extract_buildings corr\u00eda 1 min y fallaba\nsilenciosamente con \"geoai no produjo el archivo de m\u00e1scaras\".\nCausa: mi c\u00f3digo asum\u00eda que process_raster() escribe un GeoTIFF\nde m\u00e1scaras intermedio (entonces vectorizar despu\u00e9s), pero\nrealmente process_raster() es la pipeline COMPLETA: tile, infer,\nvectorize, escribir GeoJSON. Devuelve GeoDataFrame directo.\n* Rewrite: ya no se genera _masks.tif intermedio. process_raster\nse invoca con output_path=geojson y listo. Si devuelve None pero\nescribi\u00f3, leemos el GeoJSON. Si no escribe nada (0 detecciones),\nmensaje expl\u00edcito al usuario con sugerencias (orto \u22641m/px en vez\nde Sentinel 10m/px).\n\n0.7.12 (2026-05-18) \u2014 Auto-uninstall pyarrow + RGB renderer\n* BUG CULPABLE IDENTIFICADO: pyarrow.lib choca con DLLs C++ de QGIS\ncausando \"DLL load failed while importing lib\". Auto-uninstall en\nel cleanup post-instalaci\u00f3n (sklearn lo importa defensivamente y\ncae sin \u00e9l \u2014 no afecta acciones IA).\n* Sentinel-2 descargado ahora se carga con renderer multibanda\nR=1/G=2/B=3 + stretch min-max autom\u00e1tico. Antes se ve\u00eda negro\nporque QGIS default lo cargaba en grayscale.\n\n0.7.11 (2026-05-18) \u2014 Fix MKL conflict + GeoAgent pin\n* BUG REPORTADO: DLL load failed se mantiene incluso en main thread.\nCausa real: conflicto MKL/OpenMP entre QGIS y PyTorch (no\nthreading como pens\u00e9 en 0.7.9). Fix: warm_up_geoai ahora setea\nKMP_DUPLICATE_LIB_OK=TRUE y registra torch/lib como dll_directory\nANTES de `import geoai`.\n* BUG REPORTADO: pin GeoAgent==0.4.0 no exist\u00eda en PyPI (versiones\nreales saltan de 0.2.0 a 1.0.0). Bump a 1.8.0 (\u00faltima).\n* Sin cambios funcionales nuevos \u2014 todos los rewrites de tools de\n0.7.10 siguen igual.\n\n0.7.10 (2026-05-18) \u2014 Rewrite wrappers + warm-up + UX polish\n* Rewrite de las 5 acciones IA con APIs reales de geoai 0.10.0:\nBuildingFootprintExtractor.process_raster (no predict),\nChangeDetection.detect_changes (no ChangeDetector),\nCLIPSegmentation con text prompt para water (no WaterBodyExtractor),\nimage_segmentation HF para landcover (marcado experimental),\npystac-client + planetary-computer para download Sentinel-2.\n* Warm-up de geoai en main thread (fix DLL load en QgsTask Windows).\n* PyTorch CPU-only forzado desde \u00edndice oficial PyTorch (evita\nDLL CUDA fail en m\u00e1quinas sin GPU NVIDIA).\n* Barra de progreso real con tiempo + MB + paquete N/M durante\ninstalaci\u00f3n pip.\n* Ventana consola cmd oculta v\u00eda CREATE_NO_WINDOW.\n\n0.7.8 (2026-05-18) \u2014 Hotfix robusto: detecci\u00f3n Python QGIS\n* El fix de 0.7.7 (usar sys.prefix) no cubr\u00eda todas las layouts de\nQGIS-Windows: algunas distribuciones tienen sys.prefix apuntando\nal root de QGIS, no al directorio del Python embebido.\n* Estrategia m\u00e1s robusta: usar os.__file__ (que SIEMPRE apunta a\n<python_root>/Lib/os.py) para derivar el python.exe correcto.\nFallbacks m\u00faltiples si esto falla.\n* Defensa adicional: el instalador valida que el python resuelto\nsea un archivo real antes de invocar subprocess. Si la detecci\u00f3n\nfalla, error claro en vez del cr\u00edptico \"could not be found\".\n* Diagn\u00f3stico al inicio del log de pip: [pudumaps-ai diagnostics]\ncon sys.executable / sys.prefix / resolved_python para que los\nreportes de bug traigan siempre el contexto necesario.\n\n0.7.7 (2026-05-18) \u2014 Hotfix: instalador IA en Windows\n* BUG CR\u00cdTICO: en QGIS-Windows sys.executable apunta al binario GUI\n(qgis-bin.exe), no a python.exe. El instalador IA de 0.7.6 fallaba\n\"relanzando QGIS\" en vez de invocar pip, con error cr\u00edptico\n'geoai-py==0.10.0 could not be found' (QGIS interpretaba la spec\ncomo archivo de proyecto). Ahora deriva python.exe desde sys.prefix\nque s\u00ed apunta consistentemente al Python embebido.\n* Sin cambios funcionales. Tests +4.\n\n0.7.6 (2026-05-18) \u2014 Download Sentinel-2 + cierre 5 acciones\n* Quinta y \u00faltima acci\u00f3n del plan IA original: \"Descargar\nSentinel-2\" (DownloadSentinelTool). Bbox del canvas (o custom\nEPSG:4326) + rango de fechas + cloud cover m\u00e1ximo. Resultado\nGeoTIFF cargado como capa raster.\n* Di\u00e1logo de configuraci\u00f3n con extent del canvas pre-seleccionado,\nQDateEdit con calendarios, spinbox de nubosidad %.\n* Validaci\u00f3n defensiva: rechaza bbox >5\u00b0 (descargas masivas),\nfechas invertidas, rango pre-Sentinel-2 (antes 2015-06-23),\ncloud_max fuera de 0-100.\n* Ciclo v0.7.x cerrado: las 5 acciones del plan IA est\u00e1n\noperativas \u2014 buildings, water, landcover, change_detection,\ndownload_sentinel. v0.8.0 arranca con Nivel 2 chilenizaci\u00f3n\n(modelos finetuneados sobre datasets chilenos).\n\n0.7.5 (2026-05-18) \u2014 Change detection + framework prompt_params\n* Cuarta acci\u00f3n IA: \"Detectar cambios (2 r\u00e1sters)\"\n(ChangeDetectionTool). Compara dos r\u00e1sters del mismo bbox y\ndistinta fecha, produce m\u00e1scara binaria de cambios.\n* Nuevo patr\u00f3n en AITool: input_kind='none' + prompt_params(parent,\niface) hook. Permite tools que no usan la capa activa y necesitan\npedir input v\u00eda di\u00e1logo propio. \u00datil tambi\u00e9n para futuros tools\nque requieran fechas, bbox custom, etc.\n* Di\u00e1logo selector dialogs/change_detection_dialog.py lista los\nr\u00e1sters del proyecto y pide \"antes\" y \"despu\u00e9s\" con validaci\u00f3n\n(no permite el mismo, requiere \u22652 r\u00e1sters cargados).\n\n0.7.4 (2026-05-18) \u2014 Landcover + re-etiquetado clases Chile\n* Tercera acci\u00f3n IA: \"Clasificar uso de suelo\"\n(LandCoverClassificationTool). Produce raster GeoTIFF categ\u00f3rico\ncon sidecar JSON de leyenda re-etiquetada al espa\u00f1ol + ecorregi\u00f3n\nchilena cuando el bbox cae en Chile.\n* Nuevo m\u00f3dulo pudumaps_qgis.ai.chile_classes (Nivel 1 chilenizaci\u00f3n\nen c\u00f3digo): lookup determin\u00edstico bbox \u2192 ecorregi\u00f3n (matorral\nescler\u00f3filo / estepa patag\u00f3nica / bosque siempreverde / desierto\ncostero / etc.) + traducci\u00f3n de clases gen\u00e9ricas (shrubland \u2192\nmatorral escler\u00f3filo / patag\u00f3nico seg\u00fan zona).\n* AITool gana atributo output_suffix (default .geojson). Landcover\nusa .tif. El panel ahora dispatcha QgsVectorLayer / QgsRasterLayer\npor extensi\u00f3n del output.\n\n0.7.3 (2026-05-18) \u2014 Ejecuci\u00f3n async + extract_water + doc Chile\n* Las acciones IA ahora corren en QgsTask (background thread del task\nmanager de QGIS). La UI ya no se congela durante la inferencia y\naparece una entry en el panel Tasks con progreso y cancelaci\u00f3n.\n* Nueva acci\u00f3n: \"Detectar cuerpos de agua\" (ExtractWaterTool) \u2014 para\nlagos, embalses y r\u00edos sobre raster RGB. Funciona con Sentinel-2 y\nortofoto. Caveats Chile documentados.\n* Nuevo docs/modelos-chile.md (Nivel 1 chilenizaci\u00f3n): tabla de qu\u00e9\ncasos rinden bien con pesos de f\u00e1brica y cu\u00e1les requieren\nfinetuning (rural, palafitos, tomas, bosque nativo).\n\n0.7.2 (2026-05-18) \u2014 Panel IA + primera acci\u00f3n (extract_buildings)\n* Nuevo framework pudumaps_qgis/ai/tools con clase abstracta AITool,\nregistry est\u00e1tico y manejo de dependencias por tool.\n* Primera acci\u00f3n: \"Detectar edificaciones\" sobre raster RGB usando\ngeoai.BuildingFootprintExtractor. Aislada la llamada a geoai en un\nhelper \u00fanico para que el upgrade entre versiones del paquete sea\nlocalizado.\n* Panel lateral \"Pudumaps \u00b7 IA\" como QDockWidget (toggle desde men\u00fa\n\"Panel IA\"). Lista las acciones registradas, grisa botones si\nfalta geoai y muestra mensaje invitando al instalador.\n* Resultado de cada acci\u00f3n se carga autom\u00e1ticamente como capa\nvectorial en el proyecto QGIS.\n\n0.7.1 (2026-05-18) \u2014 Instalador IA en men\u00fa\n* Nueva entrada \"Instalar m\u00f3dulo IA\u2026\" en el men\u00fa Pudumaps y la\ntoolbar, con icono propio (ai.svg). Abre el di\u00e1logo de instalaci\u00f3n\nintroducido en 0.7.0 para que sea descubrible por el usuario sin\ntener que invocarlo desde c\u00f3digo.\n\n0.7.0 (2026-05-18) \u2014 Infra IA opcional (foundation)\n* Nuevo m\u00f3dulo pudumaps_qgis.ai con detecci\u00f3n de geoai-py y GeoAgent\ncomo dependencias opcionales. Versiones pineadas (geoai-py 0.10.0,\nGeoAgent 0.4.0) para protegerse de bumps rotos upstream.\n* Instalador asistido (pip install --user) contra el Python embebido\nde QGIS, con progreso l\u00ednea a l\u00ednea en un worker thread.\n* Di\u00e1logo \"Instalar m\u00f3dulo IA\" que explica tama\u00f1os (~500 MB descarga,\n~2 GB en disco) y prerequisitos (VC++ redist en Windows).\n* Sin acciones IA todav\u00eda \u2014 esta release solo prepara la\ninfraestructura. Las acciones (detecci\u00f3n de edificios, agua,\nlandcover, change detection, descarga Sentinel) llegan en 0.7.1.\n\n0.6.0 (2026-05-07) \u2014 Security hardening (audit 2026-05-07)\n* H1 ALTO: prompt expl\u00edcito antes de degradar a almacenamiento\nplaintext de QSettings cuando QgsAuthManager no tiene master\npassword. Antes el fallback era silencioso.\n* H2 ALTO: rechazo de URLs base no-HTTPS (excepto loopback). Previene\nleak de la API key si el user/atacante setea http://evil.example/\n* H3 MEDIO: tempfile usado por OGR ahora se borra en finally. Solo\nsobrevive cuando OGR es la layer activa y necesita leerlo on-demand\n(caso fallback).\n* H4 MEDIO: cap de 50 MB en respuestas HTTP + validaci\u00f3n estructural\nde GeoJSON antes de pasar a OGR. Previene OOM por payloads\nmalformados.\n* H5 MEDIO: helper safe_error_message en todos los di\u00e1logos. Stack\ntraces y mensajes t\u00e9cnicos de la API ya no se muestran al usuario;\nel detalle queda en QgsMessageLog para debugging.\n* H6 BAJO: User-Agent le\u00eddo din\u00e1micamente desde metadata.txt. Antes\nestaba hardcoded a 0.1.0.\n* H8 BAJO: clear_credentials retorna ahora True/False seg\u00fan pudo\neliminar la entry cifrada. SettingsDialog avisa al user si qued\u00f3\nresiduo cifrado por falta de master password en sesi\u00f3n.\n\n0.5.0 (2026-04-23)\n* Logo oficial Pudumaps (el pudu con mapa) integrado como icono del\nplugin en el administrador de QGIS y como header de cada di\u00e1logo\n* Iconos SVG espec\u00edficos por acci\u00f3n: settings (engranaje), download\n(abrir proyecto), upload (subir capa), sync (sincronizar)\n* Stylesheet QSS con paleta verde Pudumaps aplicada a botones\nprimarios, tablas, focus rings y progress bars\n* Headers con logo + t\u00edtulo + subt\u00edtulo en los 4 di\u00e1logos\n(settings, projects, upload, sync)\n\n0.4.0 (2026-04-23)\n* Sincronizaci\u00f3n bidireccional con detecci\u00f3n de conflictos\n* Di\u00e1logo de sync con tabla por capa + dropdown de acci\u00f3n\n* Estados: unchanged / local_only / remote_only / conflict / new_local /\ndeleted_remote\n* Hashes SHA-256 can\u00f3nicos persistidos como pudumaps/last_hash\n* Dedup en pull: si ya existe una capa con el mismo layer_id, se\nactualizan sus features en vez de crear un duplicado\n\n0.3.0 (2026-04-23)\n* Subir capas QGIS a Pudumaps (push)\n* Men\u00fa contextual: click derecho en capa vectorial \u2192 Subir a Pudumaps\n* Acci\u00f3n del men\u00fa: Subir capa activa a Pudumaps\n* Di\u00e1logo con dropdown de proyectos + creaci\u00f3n inline de proyecto nuevo\n* Reproyecci\u00f3n autom\u00e1tica a EPSG:4326 desde cualquier CRS soportado\n* Pre-validaci\u00f3n de tama\u00f1o (10 MB) y n\u00famero de features (20k)\n* Smart dispatch: capas que vinieron del pull se actualizan in-place\n(PATCH) en vez de duplicarse (POST)\n\n0.2.1 (2026-04-23)\n* Fix: polygon/multipolygon layers no renderizaban \u2014 OGR promueve a\nMulti* y el memory layer Polygon rechazaba las features. Ahora se\nusa el wkbType real de OGR.\n* Fix: CRS del memory layer ahora se hereda del OGR layer en vez\nde hardcodear EPSG:4326.\n* Auto-zoom al grupo reci\u00e9n cargado para que las capas sean visibles\naunque est\u00e9n lejos del viewport inicial.\n\n0.2.0 (2026-04-23)\n* Open a Pudumaps project as QGIS layers (pull)\n* Projects dialog with list, search-by-sort, double-click to open\n* Automatic layer group \"Pudumaps: <project>\" in layer tree\n* Basic default styling (green) applied to each loaded layer\n* Remote project/layer ids stamped as custom properties for future sync\n\n0.1.0 (2026-04-23)\n* Initial release\n* Settings dialog with encrypted API key storage via QgsAuthManager\n* Connection test against /v1/projects", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/pudumaps_qgis/version/0.9.3/download/"}