env-able 1.2.2__tar.gz → 1.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. {env_able-1.2.2 → env_able-1.2.3}/CHANGELOG.md +49 -0
  2. {env_able-1.2.2 → env_able-1.2.3}/PKG-INFO +16 -1
  3. {env_able-1.2.2 → env_able-1.2.3}/README.md +15 -0
  4. {env_able-1.2.2 → env_able-1.2.3}/pyproject.toml +1 -1
  5. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/__init__.py +1 -1
  6. {env_able-1.2.2 → env_able-1.2.3}/.gitignore +0 -0
  7. {env_able-1.2.2 → env_able-1.2.3}/LICENSE +0 -0
  8. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/_gdal_env.py +0 -0
  9. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/_gdal_utils.py +0 -0
  10. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/_pipeline.py +0 -0
  11. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/_result.py +0 -0
  12. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/__init__.py +0 -0
  13. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/client.py +0 -0
  14. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/compliance.html +0 -0
  15. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/databricks.py +0 -0
  16. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/debug.py +0 -0
  17. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/desktop.py +0 -0
  18. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/edits.py +0 -0
  19. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/index.html +0 -0
  20. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/landing.html +0 -0
  21. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/project.py +0 -0
  22. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/server.py +0 -0
  23. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/splash.html +0 -0
  24. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/templates/Summary A4 Landscape.pagx +0 -0
  25. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/templates/Summary A4 Portrait.pagx +0 -0
  26. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/templates/Title Bar A4 Landscape.pagx +0 -0
  27. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/atlas/templates/Title Bar A4 Portrait.pagx +0 -0
  28. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/layout.py +0 -0
  29. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/morph.py +0 -0
  30. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/pull.py +0 -0
  31. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/stream.py +0 -0
  32. {env_able-1.2.2 → env_able-1.2.3}/src/env_able/vector.py +0 -0
@@ -1,5 +1,54 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.2.3] - 2026-08-18
4
+
5
+ Skill-side only — no library code changed. The pair carries one version number, so publishing
6
+ this stamps a library release whose content is identical to 1.2.2 except for this note.
7
+ `dev/publish-patch.bat` will stamp a version above; fold this in and delete the heading.
8
+
9
+ ### Fixed
10
+ - **GDAL on a managed Windows machine told you to do something impossible.** PyPI ships no
11
+ Windows wheel for GDAL, so pip compiles from source and needs a C++ compiler that a corporate
12
+ image usually lacks. Preflight then printed `conda install -c conda-forge gdal` — unfollowable
13
+ advice, on precisely the machine that reaches it, because there was no conda either.
14
+
15
+ It now inspects the machine before speaking: whether conda exists, whether some *other* Python
16
+ on the box can already import `osgeo`, and whether there is a compiler at all (asking `vswhere`
17
+ and PATH for `cl`, which is a different question from the C++ *runtime* it already checked).
18
+ Then it prints the one next step that applies — `conda install` where conda exists, or
19
+ **Miniforge** where it does not, with the no-admin silent-install flags.
20
+
21
+ - **The venv could not see a GDAL installed after it was built, and nothing said so.** The venv is
22
+ created with `--system-site-packages`, so it inherits from whichever Python created it: build it
23
+ from a Python without GDAL and it stays without GDAL however much conda you install afterwards.
24
+ Preflight now detects that a Python with `osgeo` exists elsewhere and prints the exact rebuild
25
+ command, and **`--recreate-venv`** deletes and rebuilds from the interpreter you re-run with.
26
+ The re-exec strips the flag so a child run can never delete the venv it is executing inside.
27
+ This cost a real detour to discover on a colleague's first install.
28
+ - **First run on a machine with nothing installed could not get past setup.** Reported from a
29
+ fresh PC: every document said "ask Claude to set it up", and Claude could not. Claude Code's
30
+ auto mode declined to execute `preflight.py` — a script it had just unpacked out of a skill
31
+ file — and then declined to write a wildcard `Bash(python *)` allow rule into `settings.json`
32
+ to get around itself. **Both refusals are correct**, and the second one especially: a skill
33
+ asking for broader execution rights looks exactly like a malicious skill doing the same, and
34
+ the classifier cannot tell this user's own code from a stranger's.
35
+
36
+ So the failure was ours, in the documentation. `INSTALL.md`, the handoff `README.md` and
37
+ `docs/atlas.md` now **lead with the command the user runs** — double-click
38
+ `scripts/setup_atlas.bat`, or one `preflight.py` line — and present "ask Claude" as the
39
+ convenience it is, with a plain warning that it may be refused and that the answer is never to
40
+ have Claude widen its own permissions. All three carry the `!`-prefixed form, which runs in the
41
+ user's own session so the output still lands in the conversation.
42
+
43
+ `SKILL.md` gained the matching instruction for Claude: if you are not permitted to run it, hand
44
+ the command over in one line and stop — do not edit `settings.json`, do not ask for a wildcard
45
+ allow rule, do not retry hoping it passes. On a fresh machine being blocked is the normal
46
+ outcome, and retrying spends the user's first five minutes with the product on nothing.
47
+
48
+ Also documented: a `.skill` is a zip, so unpacking it into `%USERPROFILE%\.claude\skills\atlas\`
49
+ installs it just as well as **Settings → Capabilities → Save Skill**. That is what Claude did
50
+ unprompted on the fresh machine, and it worked — worth writing down rather than rediscovering.
51
+
3
52
  ## [1.2.2] - 2026-08-17
4
53
 
5
54
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: env-able
3
- Version: 1.2.2
3
+ Version: 1.2.3
4
4
  Summary: AI-ready GIS toolkit for energy and subsurface workflows.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -390,6 +390,21 @@ print(f"{rows:,} rows written")
390
390
  ## Changelog
391
391
  ### Unreleased
392
392
 
393
+ **Fixed**
394
+ - **GDAL setup on managed Windows.** PyPI has no Windows GDAL wheel, so pip builds from source and
395
+ fails without a compiler — and preflight then suggested conda, on a machine with no conda.
396
+ It now checks what the machine actually has and names the one route that works, including
397
+ **Miniforge** (no admin needed). New **`--recreate-venv`**, because the venv only sees packages
398
+ from the Python that created it, so a GDAL installed afterwards needs the venv rebuilt.
399
+ - **First-run setup on a clean machine.** Every document said "ask Claude to install it", and on a
400
+ fresh PC Claude cannot: auto mode declines to run a script just unpacked from a skill file, and
401
+ declines to grant itself permission to. Both refusals are right. The docs now lead with the
402
+ command the user runs — `scripts/setup_atlas.bat`, or one `preflight.py` line, with the
403
+ `!`-prefixed variant for the Claude prompt — and `SKILL.md` tells Claude to hand the command
404
+ over rather than retry or touch `settings.json`. No library code changed.
405
+
406
+ ### v1.2.2 — 2026-08-17
407
+
393
408
  **Fixed**
394
409
  - **The README documented three operations out of seven.** `Union`, `Dissolve`, `SpatialJoin`
395
410
  and `Near` had no entry at all — for several releases, on the page PyPI renders as the front
@@ -364,6 +364,21 @@ print(f"{rows:,} rows written")
364
364
  ## Changelog
365
365
  ### Unreleased
366
366
 
367
+ **Fixed**
368
+ - **GDAL setup on managed Windows.** PyPI has no Windows GDAL wheel, so pip builds from source and
369
+ fails without a compiler — and preflight then suggested conda, on a machine with no conda.
370
+ It now checks what the machine actually has and names the one route that works, including
371
+ **Miniforge** (no admin needed). New **`--recreate-venv`**, because the venv only sees packages
372
+ from the Python that created it, so a GDAL installed afterwards needs the venv rebuilt.
373
+ - **First-run setup on a clean machine.** Every document said "ask Claude to install it", and on a
374
+ fresh PC Claude cannot: auto mode declines to run a script just unpacked from a skill file, and
375
+ declines to grant itself permission to. Both refusals are right. The docs now lead with the
376
+ command the user runs — `scripts/setup_atlas.bat`, or one `preflight.py` line, with the
377
+ `!`-prefixed variant for the Claude prompt — and `SKILL.md` tells Claude to hand the command
378
+ over rather than retry or touch `settings.json`. No library code changed.
379
+
380
+ ### v1.2.2 — 2026-08-17
381
+
367
382
  **Fixed**
368
383
  - **The README documented three operations out of seven.** `Union`, `Dissolve`, `SpatialJoin`
369
384
  and `Near` had no entry at all — for several releases, on the page PyPI renders as the front
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "env-able"
7
- version = "1.2.2"
7
+ version = "1.2.3"
8
8
  description = "AI-ready GIS toolkit for energy and subsurface workflows."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -1,4 +1,4 @@
1
- __version__ = "1.2.2"
1
+ __version__ = "1.2.3"
2
2
 
3
3
  # Resolve GDAL_DATA / PROJ_LIB before anything imports osgeo. IDEs and bare
4
4
  # `python script.py` runs skip conda's activation scripts, which is where those
File without changes
File without changes
File without changes
File without changes