[general]
name=Pudumaps
qgisMinimumVersion=3.22
description=Connect QGIS to Pudumaps — Chilean geospatial cloud. Pull, push and sync projects and layers via the Pudumaps REST API.
description[es]=Conecta QGIS con Pudumaps — plataforma geoespacial chilena. Descarga, sube y sincroniza proyectos y capas vía la API REST de Pudumaps.
version=0.9.3
author=Pudumaps
email=daniel.diazsantander@gmail.com

about=Official Pudumaps plugin for QGIS. Lets you browse your Pudumaps projects, open them as QGIS layers, upload new layers from QGIS to the cloud and sync changes both ways. Requires a free Pudumaps account. Get your API key from https://pudumaps.cl
about[es]=Plugin oficial de Pudumaps para QGIS. Permite navegar tus proyectos, abrirlos como capas QGIS, subir nuevas capas a la nube y sincronizar cambios en ambas direcciones. Requiere una cuenta Pudumaps gratuita. Obtén tu API key en https://pudumaps.cl

tracker=https://github.com/DanielD-S/pudumaps-qgis-plugin/issues
repository=https://github.com/DanielD-S/pudumaps-qgis-plugin
homepage=https://pudumaps.cl/qgis

category=Web
icon=icons/pudumaps-logo.png
experimental=False
deprecated=False
server=False
hasProcessingProvider=no

tags=pudumaps,chile,api,rest,cloud,geospatial,sync,collaboration

changelog=0.9.3 (2026-08-20) — Fix: las capas de ArcGIS FeatureServer no cargaban
  * Las capas del catalogo Capas Oficiales servidas por ArcGIS
    FeatureServer (SERNAGEOMIN, SENAPRED y otras) fallaban al abrir un
    proyecto, con el error external_layer_invalid, aunque los servicios
    respondian normalmente. Se veian bien en la web de Pudumaps.
  * Dos causas, las dos corregidas: el proveedor de QGIS necesita el
    origen de datos como pares clave=valor y no como una URL suelta, y
    ademas exige el numero de capa del FeatureServer, que en algunas
    capas no venia. Ahora se consulta al servicio cual es.
  * Las capas de tipo MapServer nunca estuvieron afectadas.

 0.9.2 (2026-08-20) — La URL de la API pasa a pudumaps.cl y el campo se esconde
  * La URL base por defecto deja de ser el endpoint crudo de Supabase y
    pasa a https://pudumaps.cl/api, que hace de proxy hacia la misma
    Edge Function. El endpoint viejo sigue funcionando.
  * Las instalaciones que ya tenian guardada la URL vieja se migran solas
    al abrir el plugin. Una URL personalizada (dev, self-host) no se toca.
  * El campo "Base URL" del dialogo de Configuracion ahora vive detras de
    una casilla "Avanzado" y esta oculto por defecto. Se abre solo si hay
    una URL personalizada guardada, para que nadie quede apuntando a otro
    lado sin darse cuenta.

 0.9.1 (2026-08-20) — Fix: el dialogo de Configuracion decia que la API requeria plan Pro
  * El texto de ayuda del dialogo de Configuracion seguia diciendo
    "Requiere plan Pro o superior". El acceso a la API se abrio a todos
    los planes, incluido el gratuito, el 2026-08-19. La v0.8.2 corrigio
    metadata.txt y el README pero no este string, que es el unico de los
    tres que el usuario ve realmente.

 0.9.0 (2026-08-20) — Primera version estable: el plugin sale de "experimental"
  * El plugin deja de estar marcado como experimental. Pasa a aparecer en
    el repositorio oficial de QGIS sin necesidad de activar "Mostrar
    tambien complementos experimentales" en el Administrador de
    Complementos.
  * Sin cambios funcionales respecto de 0.8.7: mismo codigo, mismos 164
    tests en verde, bandit y ruff limpios. El salto de version marca el
    cambio de estado de publicacion, no una funcionalidad nueva.
  * Alcance verificado: pull de proyectos y capas — incluidas capas
    externas WMS/ArcGIS del catalogo Capas Oficiales de Chile — contra
    datos reales. Push y sync bidireccional funcionan pero acumulan menos
    horas de vuelo; ante un conflicto el plugin nunca sobrescribe solo,
    siempre pregunta que lado gana.

 0.8.7 (2026-08-19) — Fix: 48 issues de compatibilidad Qt6 detectados por plugins.qgis.org
  * BUG REPORTADO al subir v0.8.6: security scan pasó, pero el check de
    compatibilidad Qt6 marcó 48 issues en 8 archivos — enums de PyQt5
    sin calificar (ej. QMessageBox.Yes en vez de
    QMessageBox.StandardButton.Yes) y 4 usos de .exec_() (removido en
    PyQt6, solo queda .exec()).
  * Fix: los 48 corregidos a la forma calificada/PyQt6-compatible.
    Sigue funcionando igual en QGIS con Qt5 — la forma calificada
    siempre fue válida en PyQt5 también, no es exclusiva de Qt6.
  * NOTA: no se pudo probar contra un runtime Qt6/PyQt6 real (no hay
    QGIS instalado en el entorno de desarrollo) — verificado sintaxis
    + bandit + ruff + 164 tests, pero el fix en sí es el patrón
    estándar documentado de migración PyQt5→PyQt6, no smoke-testeado
    end-to-end en Qt6.

 0.8.6 (2026-08-19) — Fix: 3 hallazgos CRÍTICOS de Bandit bloqueaban el scan de seguridad
  * BUG REPORTADO al subir v0.8.5: plugins.qgis.org bloqueó la
    publicación por 3 try/except/pass (error_utils.py, plugin.py,
    project_loader.py) — su scanner los trata como CRÍTICOS, a
    diferencia de bandit local que los marca solo LOW. Ya no eran
    aceptables como estaban.
  * Fix real, no solo silenciar el scan: los 3 ahora loggean el error
    (log_full_error, o print a stderr en el caso de error_utils.py que
    es el propio fallback de logging y no puede llamarse a sí mismo)
    en vez de tragárselo en silencio. Mismo comportamiento best-effort
    de antes — ninguna excepción ahí debe crashear el flujo — pero ya
    no desaparece sin rastro para debugging.
  * bandit: 0 issues (antes 3 LOW). ruff: 0 issues. 164/164 tests
    verdes.

 0.8.5 (2026-08-19) — Fix: faltaba LICENSE dentro del ZIP publicado
  * BUG REPORTADO al subir el ZIP: "Cannot find LICENSE in the plugin
    package". El LICENSE (GPL-3.0) vive en la raíz del repo, pero
    build.py/build.sh solo empaquetaban pudumaps_qgis/ — nunca lo
    incluían. Ahora ambos scripts copian LICENSE dentro del paquete
    (junto a metadata.txt) al construir el ZIP.

 0.8.4 (2026-08-19) — Fix: metadata.txt rompía el parser INI de plugins.qgis.org
  * BUG REPORTADO al subir el ZIP: el changelog de v0.7.6 tenía un
    símbolo porcentaje suelto (nubosidad, sin escapar). metadata.txt
    se lee con configparser (formato INI), que trata ese símbolo como
    carácter especial de interpolación — uno solo sin duplicar rompe
    el parseo completo del archivo. Ya escapado correctamente.
    Verificado simulando el mismo parser (ConfigParser + resolución de
    cada valor) antes de subir: parsea limpio.

 0.8.3 (2026-08-19) — Limpieza de código previa a publicar en plugins.qgis.org
  * 2 imports sin usar (Qt en sync_dialog.py, QWidget en ui_helpers.py),
    2 f-strings sin placeholder y 3 líneas >100 cols. Sin cambios de
    comportamiento. Verificado con bandit (0 issues medium/high) y
    ruff --select E,F,W (0 issues) antes de subir a plugins.qgis.org.

 0.8.2 (2026-08-18) — El acceso a la API ya no requiere plan Pro
  * Pudumaps abrió acceso a la API (y por lo tanto al plugin) a todos
    los planes, incluido Free — antes requería Pro o superior. Se
    actualiza el texto de metadata.txt y README.md, que seguían
    diciendo lo contrario.

 0.8.1 (2026-08-17) — Fix: capas externas del catálogo Capas Oficiales quedaban invisibles
  * BUG REPORTADO: al abrir un proyecto con capas del catálogo "Capas
    Oficiales de Chile" (WMS/ArcGIS MapServer/FeatureServer), el canvas
    quedaba completamente en blanco y sin zoom para las 7 capas del
    proyecto de prueba — no solo la marcada (WMS).
  * Causa raíz: esas capas se guardan en project_layers con geojson=null
    (layer_type + external_url describen el servicio real; la web las
    renderiza en vivo). La API v1 nunca exponía layer_type/external_url —
    solo geojson/id/name/display_order/project_id — así que el plugin
    recibía geojson=null para las 7 capas, las trataba a todas como
    FeatureCollection vacío, y _zoom_to_group las saltaba por tener 0
    features → sin combined extent → canvas nunca se movía del default.
  * Fix backend (migración 20260817190000): api_v1_list_layers y
    api_v1_get_layer ahora exponen layer_type/external_url/metadata.
  * Fix plugin: project_loader distingue layer_type. Para wms/arcgis_map
    crea un QgsRasterLayer (proveedores nativos wms/arcgismapserver); para
    arcgis_feature, un QgsVectorLayer (arcgisfeatureserver). 'weather'
    (puntos Open-Meteo calculados en el navegador, sin servicio geoespacial
    real) se reporta como no soportado en vez de quedar en blanco sin
    explicación.
  * _zoom_to_group ya no crashea silenciosamente ante la primera capa
    raster del grupo (featureCount() no existe en QgsRasterLayer).
  * sync_dialog y el menú contextual "Subir a Pudumaps" excluyen estas
    capas — son referencias en vivo, no datos locales para sincronizar.
  * 11 tests nuevos, 164/164 verdes.

 0.8.0 (2026-08-17) — Módulo IA oculto de la UI + hardening para publicación
  * El módulo IA (detección de edificios/agua, landcover, change detection,
    descarga Sentinel-2 vía geoai-py/GeoAgent) queda FUERA de esta release.
    No es un feature maduro: dependía de un instalador pip pesado (~2 GB,
    PyTorch) contra el Python embebido de QGIS, con varios hotfixes de DLL
    /CRS sin smoke test completo. Se retira de la UI (menú, toolbar, panel)
    y del zip publicado — el código sigue en el repo (paquete ai/ y
    diálogos asociados) por si se retoma más adelante, pero no se instala
    ni se ofrece al usuario.
  * scripts/build.py y build.sh excluyen pudumaps_qgis/ai/ y los diálogos
    IA del zip. El plugin publicado ya no arrastra la superficie de fallo
    de PyTorch/geoai — solo depende de `requests`, ya bundleada en QGIS.
  * Sin cambios en sync/pull/push/settings — siguen siendo el foco del
    plugin: navegar proyectos, abrir capas, subir capas nuevas y
    sincronizar cambios en ambas direcciones contra la API pública.

 0.7.13 (2026-05-19) — Fix extract_buildings flow + mejor mensaje vacío
  * BUG REPORTADO en 0.7.12: extract_buildings corría 1 min y fallaba
    silenciosamente con "geoai no produjo el archivo de máscaras".
    Causa: mi código asumía que process_raster() escribe un GeoTIFF
    de máscaras intermedio (entonces vectorizar después), pero
    realmente process_raster() es la pipeline COMPLETA: tile, infer,
    vectorize, escribir GeoJSON. Devuelve GeoDataFrame directo.
  * Rewrite: ya no se genera _masks.tif intermedio. process_raster
    se invoca con output_path=geojson y listo. Si devuelve None pero
    escribió, leemos el GeoJSON. Si no escribe nada (0 detecciones),
    mensaje explícito al usuario con sugerencias (orto ≤1m/px en vez
    de Sentinel 10m/px).

 0.7.12 (2026-05-18) — Auto-uninstall pyarrow + RGB renderer
  * BUG CULPABLE IDENTIFICADO: pyarrow.lib choca con DLLs C++ de QGIS
    causando "DLL load failed while importing lib". Auto-uninstall en
    el cleanup post-instalación (sklearn lo importa defensivamente y
    cae sin él — no afecta acciones IA).
  * Sentinel-2 descargado ahora se carga con renderer multibanda
    R=1/G=2/B=3 + stretch min-max automático. Antes se veía negro
    porque QGIS default lo cargaba en grayscale.

 0.7.11 (2026-05-18) — Fix MKL conflict + GeoAgent pin
  * BUG REPORTADO: DLL load failed se mantiene incluso en main thread.
    Causa real: conflicto MKL/OpenMP entre QGIS y PyTorch (no
    threading como pensé en 0.7.9). Fix: warm_up_geoai ahora setea
    KMP_DUPLICATE_LIB_OK=TRUE y registra torch/lib como dll_directory
    ANTES de `import geoai`.
  * BUG REPORTADO: pin GeoAgent==0.4.0 no existía en PyPI (versiones
    reales saltan de 0.2.0 a 1.0.0). Bump a 1.8.0 (última).
  * Sin cambios funcionales nuevos — todos los rewrites de tools de
    0.7.10 siguen igual.

 0.7.10 (2026-05-18) — Rewrite wrappers + warm-up + UX polish
  * Rewrite de las 5 acciones IA con APIs reales de geoai 0.10.0:
    BuildingFootprintExtractor.process_raster (no predict),
    ChangeDetection.detect_changes (no ChangeDetector),
    CLIPSegmentation con text prompt para water (no WaterBodyExtractor),
    image_segmentation HF para landcover (marcado experimental),
    pystac-client + planetary-computer para download Sentinel-2.
  * Warm-up de geoai en main thread (fix DLL load en QgsTask Windows).
  * PyTorch CPU-only forzado desde índice oficial PyTorch (evita
    DLL CUDA fail en máquinas sin GPU NVIDIA).
  * Barra de progreso real con tiempo + MB + paquete N/M durante
    instalación pip.
  * Ventana consola cmd oculta vía CREATE_NO_WINDOW.

 0.7.8 (2026-05-18) — Hotfix robusto: detección Python QGIS
  * El fix de 0.7.7 (usar sys.prefix) no cubría todas las layouts de
    QGIS-Windows: algunas distribuciones tienen sys.prefix apuntando
    al root de QGIS, no al directorio del Python embebido.
  * Estrategia más robusta: usar os.__file__ (que SIEMPRE apunta a
    <python_root>/Lib/os.py) para derivar el python.exe correcto.
    Fallbacks múltiples si esto falla.
  * Defensa adicional: el instalador valida que el python resuelto
    sea un archivo real antes de invocar subprocess. Si la detección
    falla, error claro en vez del críptico "could not be found".
  * Diagnóstico al inicio del log de pip: [pudumaps-ai diagnostics]
    con sys.executable / sys.prefix / resolved_python para que los
    reportes de bug traigan siempre el contexto necesario.

 0.7.7 (2026-05-18) — Hotfix: instalador IA en Windows
  * BUG CRÍTICO: en QGIS-Windows sys.executable apunta al binario GUI
    (qgis-bin.exe), no a python.exe. El instalador IA de 0.7.6 fallaba
    "relanzando QGIS" en vez de invocar pip, con error críptico
    'geoai-py==0.10.0 could not be found' (QGIS interpretaba la spec
    como archivo de proyecto). Ahora deriva python.exe desde sys.prefix
    que sí apunta consistentemente al Python embebido.
  * Sin cambios funcionales. Tests +4.

 0.7.6 (2026-05-18) — Download Sentinel-2 + cierre 5 acciones
  * Quinta y última acción del plan IA original: "Descargar
    Sentinel-2" (DownloadSentinelTool). Bbox del canvas (o custom
    EPSG:4326) + rango de fechas + cloud cover máximo. Resultado
    GeoTIFF cargado como capa raster.
  * Diálogo de configuración con extent del canvas pre-seleccionado,
    QDateEdit con calendarios, spinbox de nubosidad %%.
  * Validación defensiva: rechaza bbox >5° (descargas masivas),
    fechas invertidas, rango pre-Sentinel-2 (antes 2015-06-23),
    cloud_max fuera de 0-100.
  * Ciclo v0.7.x cerrado: las 5 acciones del plan IA están
    operativas — buildings, water, landcover, change_detection,
    download_sentinel. v0.8.0 arranca con Nivel 2 chilenización
    (modelos finetuneados sobre datasets chilenos).

 0.7.5 (2026-05-18) — Change detection + framework prompt_params
  * Cuarta acción IA: "Detectar cambios (2 rásters)"
    (ChangeDetectionTool). Compara dos rásters del mismo bbox y
    distinta fecha, produce máscara binaria de cambios.
  * Nuevo patrón en AITool: input_kind='none' + prompt_params(parent,
    iface) hook. Permite tools que no usan la capa activa y necesitan
    pedir input vía diálogo propio. Útil también para futuros tools
    que requieran fechas, bbox custom, etc.
  * Diálogo selector dialogs/change_detection_dialog.py lista los
    rásters del proyecto y pide "antes" y "después" con validación
    (no permite el mismo, requiere ≥2 rásters cargados).

 0.7.4 (2026-05-18) — Landcover + re-etiquetado clases Chile
  * Tercera acción IA: "Clasificar uso de suelo"
    (LandCoverClassificationTool). Produce raster GeoTIFF categórico
    con sidecar JSON de leyenda re-etiquetada al español + ecorregión
    chilena cuando el bbox cae en Chile.
  * Nuevo módulo pudumaps_qgis.ai.chile_classes (Nivel 1 chilenización
    en código): lookup determinístico bbox → ecorregión (matorral
    esclerófilo / estepa patagónica / bosque siempreverde / desierto
    costero / etc.) + traducción de clases genéricas (shrubland →
    matorral esclerófilo / patagónico según zona).
  * AITool gana atributo output_suffix (default .geojson). Landcover
    usa .tif. El panel ahora dispatcha QgsVectorLayer / QgsRasterLayer
    por extensión del output.

 0.7.3 (2026-05-18) — Ejecución async + extract_water + doc Chile
  * Las acciones IA ahora corren en QgsTask (background thread del task
    manager de QGIS). La UI ya no se congela durante la inferencia y
    aparece una entry en el panel Tasks con progreso y cancelación.
  * Nueva acción: "Detectar cuerpos de agua" (ExtractWaterTool) — para
    lagos, embalses y ríos sobre raster RGB. Funciona con Sentinel-2 y
    ortofoto. Caveats Chile documentados.
  * Nuevo docs/modelos-chile.md (Nivel 1 chilenización): tabla de qué
    casos rinden bien con pesos de fábrica y cuáles requieren
    finetuning (rural, palafitos, tomas, bosque nativo).

 0.7.2 (2026-05-18) — Panel IA + primera acción (extract_buildings)
  * Nuevo framework pudumaps_qgis/ai/tools con clase abstracta AITool,
    registry estático y manejo de dependencias por tool.
  * Primera acción: "Detectar edificaciones" sobre raster RGB usando
    geoai.BuildingFootprintExtractor. Aislada la llamada a geoai en un
    helper único para que el upgrade entre versiones del paquete sea
    localizado.
  * Panel lateral "Pudumaps · IA" como QDockWidget (toggle desde menú
    "Panel IA"). Lista las acciones registradas, grisa botones si
    falta geoai y muestra mensaje invitando al instalador.
  * Resultado de cada acción se carga automáticamente como capa
    vectorial en el proyecto QGIS.

 0.7.1 (2026-05-18) — Instalador IA en menú
  * Nueva entrada "Instalar módulo IA…" en el menú Pudumaps y la
    toolbar, con icono propio (ai.svg). Abre el diálogo de instalación
    introducido en 0.7.0 para que sea descubrible por el usuario sin
    tener que invocarlo desde código.

 0.7.0 (2026-05-18) — Infra IA opcional (foundation)
  * Nuevo módulo pudumaps_qgis.ai con detección de geoai-py y GeoAgent
    como dependencias opcionales. Versiones pineadas (geoai-py 0.10.0,
    GeoAgent 0.4.0) para protegerse de bumps rotos upstream.
  * Instalador asistido (pip install --user) contra el Python embebido
    de QGIS, con progreso línea a línea en un worker thread.
  * Diálogo "Instalar módulo IA" que explica tamaños (~500 MB descarga,
    ~2 GB en disco) y prerequisitos (VC++ redist en Windows).
  * Sin acciones IA todavía — esta release solo prepara la
    infraestructura. Las acciones (detección de edificios, agua,
    landcover, change detection, descarga Sentinel) llegan en 0.7.1.

 0.6.0 (2026-05-07) — Security hardening (audit 2026-05-07)
  * H1 ALTO: prompt explícito antes de degradar a almacenamiento
    plaintext de QSettings cuando QgsAuthManager no tiene master
    password. Antes el fallback era silencioso.
  * H2 ALTO: rechazo de URLs base no-HTTPS (excepto loopback). Previene
    leak de la API key si el user/atacante setea http://evil.example/
  * H3 MEDIO: tempfile usado por OGR ahora se borra en finally. Solo
    sobrevive cuando OGR es la layer activa y necesita leerlo on-demand
    (caso fallback).
  * H4 MEDIO: cap de 50 MB en respuestas HTTP + validación estructural
    de GeoJSON antes de pasar a OGR. Previene OOM por payloads
    malformados.
  * H5 MEDIO: helper safe_error_message en todos los diálogos. Stack
    traces y mensajes técnicos de la API ya no se muestran al usuario;
    el detalle queda en QgsMessageLog para debugging.
  * H6 BAJO: User-Agent leído dinámicamente desde metadata.txt. Antes
    estaba hardcoded a 0.1.0.
  * H8 BAJO: clear_credentials retorna ahora True/False según pudo
    eliminar la entry cifrada. SettingsDialog avisa al user si quedó
    residuo cifrado por falta de master password en sesión.

 0.5.0 (2026-04-23)
  * Logo oficial Pudumaps (el pudu con mapa) integrado como icono del
    plugin en el administrador de QGIS y como header de cada diálogo
  * Iconos SVG específicos por acción: settings (engranaje), download
    (abrir proyecto), upload (subir capa), sync (sincronizar)
  * Stylesheet QSS con paleta verde Pudumaps aplicada a botones
    primarios, tablas, focus rings y progress bars
  * Headers con logo + título + subtítulo en los 4 diálogos
    (settings, projects, upload, sync)

 0.4.0 (2026-04-23)
  * Sincronización bidireccional con detección de conflictos
  * Diálogo de sync con tabla por capa + dropdown de acción
  * Estados: unchanged / local_only / remote_only / conflict / new_local /
    deleted_remote
  * Hashes SHA-256 canónicos persistidos como pudumaps/last_hash
  * Dedup en pull: si ya existe una capa con el mismo layer_id, se
    actualizan sus features en vez de crear un duplicado

 0.3.0 (2026-04-23)
  * Subir capas QGIS a Pudumaps (push)
  * Menú contextual: click derecho en capa vectorial → Subir a Pudumaps
  * Acción del menú: Subir capa activa a Pudumaps
  * Diálogo con dropdown de proyectos + creación inline de proyecto nuevo
  * Reproyección automática a EPSG:4326 desde cualquier CRS soportado
  * Pre-validación de tamaño (10 MB) y número de features (20k)
  * Smart dispatch: capas que vinieron del pull se actualizan in-place
    (PATCH) en vez de duplicarse (POST)

 0.2.1 (2026-04-23)
  * Fix: polygon/multipolygon layers no renderizaban — OGR promueve a
    Multi* y el memory layer Polygon rechazaba las features. Ahora se
    usa el wkbType real de OGR.
  * Fix: CRS del memory layer ahora se hereda del OGR layer en vez
    de hardcodear EPSG:4326.
  * Auto-zoom al grupo recién cargado para que las capas sean visibles
    aunque estén lejos del viewport inicial.

 0.2.0 (2026-04-23)
  * Open a Pudumaps project as QGIS layers (pull)
  * Projects dialog with list, search-by-sort, double-click to open
  * Automatic layer group "Pudumaps: <project>" in layer tree
  * Basic default styling (green) applied to each loaded layer
  * Remote project/layer ids stamped as custom properties for future sync

 0.1.0 (2026-04-23)
  * Initial release
  * Settings dialog with encrypted API key storage via QgsAuthManager
  * Connection test against /v1/projects
