{"name": "TerraPulse", "package_name": "terrapulse", "version": "0.2.14", "experimental": true, "qgis_min": "3.34.0", "qgis_max": "3.99.0", "downloads": 91, "uploaded_by": "osman93", "upload_datetime": "2026-05-28T17:54:55.232598", "changelog": "0.2.14 (2026-05-29)\n- Remove the last plugins.qgis.org security-scan blocker: detect-secrets\nwas flagging `cdse_password=\"secret\"` in two docstring usage examples\n(engine_ipc.py and downloader.py) as a \"Secret Keyword\". Replaced the\nplaceholder with `os.environ[\"CDSE_PW\"]` so the docstring stays valid\nPython and detect-secrets has nothing to flag. Local scan: 0 findings.\n\n0.2.13 (2026-05-29)\n- Fix Discover Scenes crash on QGIS 3.44: the bundled pydantic and\npydantic_core are version-mismatched (\"ImportError: cannot import\nname 'validate_core_schema'\"), so importing terrapulse_core.stac.models\nblew up. Refactored models.py to use standard-library @dataclass instead\nof pydantic.BaseModel \u2014 same public API, no third-party dependencies,\nverified working in QGIS 3.44.6 Python 3.12.\n\n0.2.12 (2026-05-29)\n- Fix \"Discover Scenes\" button which failed with ModuleNotFoundError\nfor users who installed from plugins.qgis.org. The button calls\nSTACClient in the QGIS process, but QGIS Python doesn't have\npystac_client installed. Refactored STACClient to use plain `requests`\nagainst CDSE's HTTP STAC API \u2014 same behaviour, no extra Python deps.\n\n0.2.11 (2026-05-29)\n- Suppress 4 additional Bandit B105/B107 false positives that blocked\n0.2.10 from the plugins.qgis.org security scan:\n* settings_manager.py: KEY_CDSE_PASSWORD/KEY_ANTHROPIC_KEY constants\n(the strings are QgsSettings KEY NAMES, not credentials)\n* insar_task.py / engine_ipc.py: cdse_password parameter default \"\"\n(it's an unset-by-default placeholder, not a real password)\n* downloader.py: _TOKEN_URL is the public CDSE OAuth endpoint URL,\nflagged because it contains the word \"token\"\n\n0.2.10 (2026-05-29)\n- Pass plugins.qgis.org security scan. Fix the two Bandit medium-severity\nissues that blocked 0.2.9 from being approved:\n* engine_ipc.py: use tempfile.gettempdir() instead of hardcoded \"/tmp\"\nfor the harmless ping-mount target (B108).\n* ml/classifier.py: add `# nosec B301` to the pickle.load call that\nloads the trusted plugin-shipped ML model (B301).\n\n0.2.9 (2026-05-29)\n- CRITICAL: fix CDSE 401 \"invalid_grant\" caused by a QgsSettings key\nmismatch in main_dialog.py. The Settings dialog saves the CDSE password\nto \"terrapulse/cdse_credential\" (via SettingsManager) but main_dialog\nwas reading it from \"terrapulse/cdse_password\" (raw QgsSettings) \u2014 a\ndifferent key that's never written. Result: every InSAR run sent an\nempty password to CDSE and got rejected. Now uses SettingsManager\nconsistently.\n\n0.2.8 (2026-05-28)\n- STAC client now retries transient CDSE failures (HTTP 502/503/504,\nconnection drops) with exponential backoff (5s, 20s, 60s).\n- Strip CDSE's nginx HTML error pages from user-facing error messages:\ninstead of dumping <html><head><title>502 Bad Gateway... the dialog\nnow shows \"Copernicus Data Space is temporarily unavailable (HTTP 502)\".\n\n0.2.7 (2026-05-28)\n- engine_ipc: explicitly close subprocess stdin/stdout/stderr after the\nDocker engine exits, instead of leaving them for the Python garbage\ncollector. Silences ResourceWarning: unclosed file <_io.TextIOWrapper>\nthat appeared in QGIS logs after every failed/early-exit InSAR run.\n\n0.2.6 (2026-05-28)\n- Strip __pycache__ from vendored terrapulse_core before qgis-plugin-ci\npackaging. The earlier \"Validate __version__.py\" workflow step imports\nterrapulse_core and creates .pyc files; cp -r copied them into the\nvendored directory; plugins.qgis.org rejected the upload with\n\"For security reasons, zip file cannot contain .pyc file\".\n\n0.2.5 (2026-05-28)\n- Fix release workflow: qgis-plugin-ci uses git ls-files for packaging, so\nthe gitignored vendored terrapulse_core copy was excluded from the zip\nuploaded to plugins.qgis.org (the GitHub release zip was already correct).\nrelease.yml now runs `git add -f` on the vendored directory so it appears\nin git ls-files during CI builds.\n\n0.2.4 (2026-05-28)\n- Fix critical packaging bug: terrapulse_core was missing from the released\nQGIS plugin zip, causing ModuleNotFoundError on every InSAR run\n- release.yml now vendors terrapulse_core into the plugin zip\n- plugin/__init__.py finds bundled terrapulse_core (production) or repo\nsource tree (dev) and adds it to sys.path\n- Default Docker image hardcoded to osmanos93/terrapulse-pygmtsar:latest\nin insar_task.py and settings_dialog.py (was bare local name)\n- main_dialog now reads docker_image and max_scenes from SettingsManager\n- Better error message when image not pulled: suggests docker pull from\nDocker Hub instead of only the docker build instruction\n- Distinguish ModuleNotFoundError from real Docker errors in pre-check\n\n0.2.3 (2026-05-26)\n- Fix security scan: suppress detect-secrets false positives in settings_manager.py\n\n0.2.2 (2026-05-26)\n- Default Docker image updated to osmanos93/terrapulse-pygmtsar:latest (Docker Hub)\n\n0.2.1 (2026-05-26)\n- Author name updated to OSMAN IBRAHIM\n\n0.2.0 (2026-05-25)\n- Fixed download crash at ~16 pct progress (pipe deadlock + double disk usage)\n- Parallel HTTP Range download for 4x faster Sentinel-1 SLC acquisition\n- Full IPC pipeline (Docker subprocess JSON protocol)\n- PyGMTSAR engine server, CDSE OAuth2 downloader, COG writer\n- STACDiscoveryTask and InSARTask background workers\n- AOI rubber-band map tool, velocity/coherence layer loaders\n- RandomForest deformation classifier (5 classes: stable/linear/seasonal/accelerating/anomalous)\n- OSM infrastructure overlay with composite risk score\n- PDF/HTML report renderer with optional AI narrative\n- YAML provenance recipe + STAC 1.0 item\n- Settings dialog (CDSE credentials, API keys, output directory)\n- 241 automated tests, Python 3.11 and 3.12, Ubuntu and Windows CI", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/terrapulse/version/0.2.14/download/"}