openmapstack 0.4.0__tar.gz → 0.5.0__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.
- {openmapstack-0.4.0 → openmapstack-0.5.0}/PKG-INFO +257 -36
- openmapstack-0.5.0/README.md +541 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/__init__.py +1 -1
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/api.py +21 -2
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/__init__.py +4 -3
- openmapstack-0.5.0/openmapstack/checks/_axis_order.py +66 -0
- openmapstack-0.5.0/openmapstack/checks/credits.py +318 -0
- openmapstack-0.5.0/openmapstack/checks/delivery.py +231 -0
- openmapstack-0.5.0/openmapstack/checks/findings.py +19 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/geodata.py +273 -1
- openmapstack-0.5.0/openmapstack/checks/integration.py +39 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/overrides.py +10 -7
- openmapstack-0.5.0/openmapstack/checks/presentation.py +401 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/project.py +38 -10
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/qgis.py +27 -15
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/rerun.py +45 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/spatial.py +17 -7
- openmapstack-0.5.0/openmapstack/checks/tables.py +330 -0
- openmapstack-0.5.0/openmapstack/checks/tiling.py +83 -0
- openmapstack-0.5.0/openmapstack/checks/visual.py +1434 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/cli.py +56 -5
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/connectors/motherduck.py +7 -0
- openmapstack-0.5.0/openmapstack/credits.py +150 -0
- openmapstack-0.5.0/openmapstack/declarations.py +41 -0
- openmapstack-0.5.0/openmapstack/delivery.py +209 -0
- openmapstack-0.5.0/openmapstack/environment.py +193 -0
- openmapstack-0.5.0/openmapstack/findings.py +197 -0
- openmapstack-0.5.0/openmapstack/integration.py +154 -0
- openmapstack-0.5.0/openmapstack/integrations/__init__.py +1 -0
- openmapstack-0.5.0/openmapstack/integrations/qgis.py +132 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/integrity.py +16 -9
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/rerun.py +13 -0
- openmapstack-0.5.0/openmapstack/schema.py +76 -0
- openmapstack-0.5.0/openmapstack/schemas/findings-v1.schema.json +53 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/schemas/project-v1.schema.json +315 -6
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/validation.py +210 -46
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/verify.py +124 -9
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack.egg-info/PKG-INFO +257 -36
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack.egg-info/SOURCES.txt +42 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack.egg-info/requires.txt +3 -2
- {openmapstack-0.4.0 → openmapstack-0.5.0}/pyproject.toml +4 -4
- openmapstack-0.5.0/tests/test_assumptions.py +95 -0
- openmapstack-0.5.0/tests/test_benchmark_ci.py +102 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_check_api.py +10 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_cli.py +130 -1
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_cloud_connectors.py +31 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_cloud_fixture_sql.py +12 -6
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_collection.py +11 -2
- openmapstack-0.5.0/tests/test_credits.py +457 -0
- openmapstack-0.5.0/tests/test_credits_visual.py +64 -0
- openmapstack-0.5.0/tests/test_delivery.py +465 -0
- openmapstack-0.5.0/tests/test_duckdb_pipelines.py +128 -0
- openmapstack-0.5.0/tests/test_environment.py +297 -0
- openmapstack-0.5.0/tests/test_established_stack_tools.py +144 -0
- openmapstack-0.5.0/tests/test_eval_report.py +176 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_evals.py +195 -0
- openmapstack-0.5.0/tests/test_example_findings.py +96 -0
- openmapstack-0.5.0/tests/test_findings.py +197 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_guidance_regressions.py +102 -5
- openmapstack-0.5.0/tests/test_integration.py +273 -0
- openmapstack-0.5.0/tests/test_langsmith_report.py +210 -0
- openmapstack-0.5.0/tests/test_nyc_dashboard.py +273 -0
- openmapstack-0.5.0/tests/test_nyc_h3_fixture.py +131 -0
- openmapstack-0.5.0/tests/test_nyc_live_demand.py +63 -0
- openmapstack-0.5.0/tests/test_nyc_live_market.py +77 -0
- openmapstack-0.5.0/tests/test_nyc_tlc_fleet.py +60 -0
- openmapstack-0.5.0/tests/test_observable_cities.py +198 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_private_fixture_postgis.py +64 -23
- openmapstack-0.5.0/tests/test_project_pages.py +251 -0
- openmapstack-0.5.0/tests/test_raster_access.py +452 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_skill_routing.py +10 -30
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_sources.py +24 -0
- openmapstack-0.5.0/tests/test_tables.py +460 -0
- openmapstack-0.5.0/tests/test_tartu_dashboard_sources.py +172 -0
- openmapstack-0.5.0/tests/test_tartu_routing.py +221 -0
- openmapstack-0.5.0/tests/test_tartu_run_evidence.py +120 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_template_pipeline.py +67 -2
- openmapstack-0.5.0/tests/test_tylertoo.py +106 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_verify.py +161 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_verify_foreign.py +2 -0
- openmapstack-0.4.0/README.md +0 -321
- openmapstack-0.4.0/openmapstack/checks/presentation.py +0 -168
- openmapstack-0.4.0/openmapstack/checks/visual.py +0 -642
- openmapstack-0.4.0/openmapstack/schema.py +0 -39
- {openmapstack-0.4.0 → openmapstack-0.5.0}/LICENSE +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/__main__.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/metamorphic.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/provenance.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/checks/validation.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/collection.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/connectors/__init__.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/connectors/bigquery.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/connectors/duckdb_local.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/connectors/postgis.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/expectations.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/metamorphic.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/parameters.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/project.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/sampling.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/schemas/__init__.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/schemas/check-result-v1.schema.json +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/schemas/skill-snapshot-v2.schema.json +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/schemas/verify-result-v1.schema.json +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/snapshot.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack/sources.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack.egg-info/dependency_links.txt +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack.egg-info/entry_points.txt +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/openmapstack.egg-info/top_level.txt +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/setup.cfg +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_connectors.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_expectations.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_metamorphic.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_portolan_conformance.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_release.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_rerun.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_sampling.py +0 -0
- {openmapstack-0.4.0 → openmapstack-0.5.0}/tests/test_snapshot.py +0 -0
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openmapstack
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Validate, run, and inspect reproducible OpenMapStack projects
|
|
5
5
|
Requires-Python: >=3.10
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
7
7
|
License-File: LICENSE
|
|
8
8
|
Requires-Dist: jsonschema<5,>=4
|
|
9
9
|
Requires-Dist: PyYAML<7,>=6
|
|
10
|
+
Requires-Dist: packaging>=23
|
|
10
11
|
Provides-Extra: geo
|
|
11
|
-
Requires-Dist: duckdb>=1.
|
|
12
|
+
Requires-Dist: duckdb>=1.5.3; extra == "geo"
|
|
12
13
|
Provides-Extra: visual
|
|
13
14
|
Requires-Dist: playwright>=1.40; extra == "visual"
|
|
14
15
|
Provides-Extra: postgis
|
|
@@ -16,27 +17,33 @@ Requires-Dist: psycopg[binary]>=3.1; extra == "postgis"
|
|
|
16
17
|
Provides-Extra: bigquery
|
|
17
18
|
Requires-Dist: google-cloud-bigquery>=3.11; extra == "bigquery"
|
|
18
19
|
Provides-Extra: motherduck
|
|
19
|
-
Requires-Dist: duckdb>=1.
|
|
20
|
+
Requires-Dist: duckdb>=1.5.3; extra == "motherduck"
|
|
20
21
|
Provides-Extra: all
|
|
21
22
|
Requires-Dist: openmapstack[bigquery,geo,motherduck,postgis,visual]; extra == "all"
|
|
22
23
|
Dynamic: license-file
|
|
23
24
|
|
|
24
25
|
# openmapstack
|
|
25
26
|
|
|
26
|
-
**
|
|
27
|
+
**AI agent skills for geospatial decisions, data discovery, spatial SQL and reproducible analysis projects.**
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
Explore the [project homepage](https://jaakla.github.io/openmapstack-skills/), with bundled NYC and Tartu examples in standalone HTML and Observable Framework. The [Observable city samples](examples/observable-cities/) include reactive filters, thematic maps, downloads, and delivery evidence. Browse more projects in the [examples gallery](https://jaakla.github.io/openmapstack-samples/). Build the complete Pages site with `python3 scripts/build_project_pages.py` (Python project dependencies, Node 20+ and npm required); no warehouse credentials or Observable account are needed.
|
|
30
|
+
|
|
31
|
+
Install (assuming you have git and nodejs with npx already installed):
|
|
29
32
|
```bash
|
|
30
33
|
npx skills@1.5.26 add jaakla/openmapstack-skills --skill open-map-stack -g
|
|
31
34
|
```
|
|
32
35
|
|
|
33
|
-
OpenMapStack gives your favorite AI agent: Claude Code, Codex, Cursor, OpenCode, PI and 50+ other agents not just a one-off analysis, but a **
|
|
36
|
+
OpenMapStack gives your favorite AI agent: Claude Code, Codex, Cursor, OpenCode, PI and 50+ other agents not just a one-off analysis, but a well-defined **workflow project** (`project.yaml`) defining from data discovery through reusable analysis (`pipeline.py`) to interactive web (`dashboard.html`) and selected deliverables (built-in dashboard by default; optional QGIS or Observable views). The workflow becomes **inspectable** and **repeatable** as a clearly specified project with pinned sources, explicit assumptions and CRS choices and deterministic processing in a python script. It allows also isolated overrides, machine-readable validation, and surfaced provenance.
|
|
37
|
+
|
|
38
|
+
It is open-first (both data and code-wise) and cloud-native by default, built on shoulders of the established Open GIS stack: STAC for discovery; GeoParquet, COG, and PMTiles for storage and delivery; DuckDB and PostGIS for compute; and QGIS, MapLibre, and Martin for presentation. It also teaches to deploy GDAL/OGR, GeoPandas, xarray/rioxarray, PDAL, routing engines, spatial SQL, and pragmatic hosted services when scale or reliability requires them.
|
|
39
|
+
|
|
40
|
+
Dashboard basemaps honor user choices and appropriate local or regional services, then fall back to preconfigured goplex.ee Protomaps vector tiles with light/dark switching and visible provider credit. See [web-delivery.md](skills/open-map-stack/references/web-delivery.md#style-and-basemap-sources-open) for the configuration.
|
|
34
41
|
|
|
35
|
-
|
|
42
|
+
Existing v1 manifests with a map must declare `presentation.map.basemap.kind` (`raster-xyz`, `raster-wms`, or `vector-style`). Vector basemaps require a style `url`; add the actual kind to older manifests before validation or regeneration. See the [basemap contract](skills/open-map-stack/references/project-spec.md#27-presentation-semantics).
|
|
36
43
|
|
|
37
44
|
## What's in this repo
|
|
38
45
|
|
|
39
|
-
The
|
|
46
|
+
The skill collection has four independently installable skills:
|
|
40
47
|
|
|
41
48
|
| Skill | Use it for |
|
|
42
49
|
|---|---|
|
|
@@ -62,21 +69,99 @@ Includes all the skills.
|
|
|
62
69
|
- [references/formats-and-crs.md](skills/open-map-stack/references/formats-and-crs.md) - how to choose formats, conversions, projections, EPSG codes.
|
|
63
70
|
- [references/processing.md](skills/open-map-stack/references/processing.md) - when and how to use GDAL/OGR, GeoPandas, xarray, DuckDB, PostGIS, PDAL and other open geo processing tools.
|
|
64
71
|
- [references/analytics.md](skills/open-map-stack/references/analytics.md) — do vector/raster analytics, terrain, hydrology, network, point clouds, geocoding etc.
|
|
65
|
-
- [references/web-delivery.md](skills/open-map-stack/references/web-delivery.md) — renderer selection for maps, PMTiles, MVT, Martin, TiTiler, MapLibre, deck.gl, kepler.gl, and lonboard formats and engines.
|
|
72
|
+
- [references/web-delivery.md](skills/open-map-stack/references/web-delivery.md) — renderer selection for maps, tylertoo/Tippecanoe vector tiling, PMTiles, MVT, Martin, TiTiler, MapLibre, deck.gl, kepler.gl, and lonboard formats and engines.
|
|
66
73
|
- [references/qgis.md](skills/open-map-stack/references/qgis.md) — QGIS desktop, plugins, PyQGIS, Processing, QGIS MCP.
|
|
67
74
|
- [references/validation-and-ops.md](skills/open-map-stack/references/validation-and-ops.md) — validation, manifests, attribution, and deployment checks, including the machine-readable reproducible-project contract.
|
|
68
|
-
- [references/project-spec.md](skills/open-map-stack/references/project-spec.md) — the specific`openmapstack-project/v1` schema: compiling any material analysis into a reproducible GIS project (`project.yaml`, pipeline, source provenance, overrides, validation, semantic presentation,
|
|
75
|
+
- [references/project-spec.md](skills/open-map-stack/references/project-spec.md) — the specific`openmapstack-project/v1` schema: compiling any material analysis into a reproducible GIS project (`project.yaml`, pipeline, source provenance, overrides, validation, semantic presentation, selected delivery outputs).
|
|
69
76
|
- [references/project-workflow.md](skills/open-map-stack/references/project-workflow.md) — the mandatory material-analysis workflow and delivery rules, loaded when a task needs a reproducible project.
|
|
70
77
|
- [templates/](templates/) — ready scaffolds (`project.yaml`, `pipeline.py`, `presentation.yaml`, `validation.yaml`) for new projects.
|
|
71
78
|
|
|
72
79
|
### Reproducible GIS project
|
|
73
|
-
|
|
80
|
+
|
|
81
|
+
Use [reproducible-gis-project](skills/reproducible-gis-project/SKILL.md) when the
|
|
82
|
+
analysis method and stack are chosen and another analyst needs to inspect,
|
|
83
|
+
execute and verify the result without the original conversation. It guides the
|
|
84
|
+
agent to produce:
|
|
85
|
+
|
|
86
|
+
- A `project.yaml` manifest with pinned sources, CRS, assumptions, ordered steps
|
|
87
|
+
and outputs, so the inputs and decisions are explicit. Its
|
|
88
|
+
[contract](skills/open-map-stack/references/project-spec.md#2-projectyaml-schema-openmapstack-projectv1)
|
|
89
|
+
permits project-specific metadata in open objects; extra fields have no built-in behavior.
|
|
90
|
+
- One canonical pipeline with corrections and scenarios recorded as data or
|
|
91
|
+
executable logic, so derived results can be rebuilt without manual edits.
|
|
92
|
+
- Machine-readable validation and run evidence, including a clean rerun, so
|
|
93
|
+
failures and reproducibility claims can be checked.
|
|
94
|
+
- Selected web/desktop presentation derived from the same project, so maps and reports
|
|
95
|
+
reflect the validated analysis.
|
|
96
|
+
|
|
97
|
+
The skill includes its own [project templates](skills/reproducible-gis-project/templates/)
|
|
98
|
+
and these local references:
|
|
99
|
+
|
|
100
|
+
- [project-workflow.md](skills/reproducible-gis-project/references/project-workflow.md) — required steps and delivery rules for a material analysis.
|
|
101
|
+
- [project-spec.md](skills/reproducible-gis-project/references/project-spec.md) — the `openmapstack-project/v1` manifest and artifact contract.
|
|
102
|
+
- [data-sources.md](skills/reproducible-gis-project/references/data-sources.md) — public data discovery and source assessment.
|
|
103
|
+
- [user-data-sources.md](skills/reproducible-gis-project/references/user-data-sources.md) — warehouse access and reproducible snapshots.
|
|
104
|
+
- [formats-and-crs.md](skills/reproducible-gis-project/references/formats-and-crs.md) — format choices and coordinate-system correctness.
|
|
105
|
+
- [qgis.md](skills/reproducible-gis-project/references/qgis.md) — QGIS project delivery and desktop integration.
|
|
106
|
+
- [validation-and-ops.md](skills/reproducible-gis-project/references/validation-and-ops.md) — checks, provenance and operational validation.
|
|
107
|
+
- [installation.md](skills/reproducible-gis-project/references/installation.md) — CLI setup and local example requirements.
|
|
108
|
+
- [companion-skills.md](skills/reproducible-gis-project/references/companion-skills.md) — optional product-specific help.
|
|
109
|
+
|
|
110
|
+
Installing the other skills is optional. If the source, compute or delivery
|
|
111
|
+
architecture is still undecided, start with `open-map-stack`.
|
|
74
112
|
|
|
75
113
|
### Geospatial data discovery
|
|
76
|
-
|
|
114
|
+
|
|
115
|
+
Use [geospatial-data-discovery](skills/geospatial-data-discovery/SKILL.md) when
|
|
116
|
+
the data requirements are known and the task is to find and assess suitable
|
|
117
|
+
public datasets or the user's own geospatial data. It guides the agent to:
|
|
118
|
+
|
|
119
|
+
- Match coverage, time, feature meaning, attributes and resolution to the
|
|
120
|
+
question, so a convenient dataset is not mistaken for the right one.
|
|
121
|
+
- Check current provider metadata, access and license terms, so availability
|
|
122
|
+
and permission claims have evidence.
|
|
123
|
+
- Assess completeness and distinguish a sample or partial catalog from a full
|
|
124
|
+
extract, so missing features are not misread as absent features.
|
|
125
|
+
- Report a reproducible version or snapshot strategy, retrieval details and
|
|
126
|
+
limitations, so a later analysis can use the same source.
|
|
127
|
+
|
|
128
|
+
The standalone skill includes these local references:
|
|
129
|
+
|
|
130
|
+
- [data-sources.md](skills/geospatial-data-discovery/references/data-sources.md) — public data providers, catalogs and discovery methods.
|
|
131
|
+
- [user-data-sources.md](skills/geospatial-data-discovery/references/user-data-sources.md) — read-only warehouse discovery and snapshot rules.
|
|
132
|
+
- [formats-and-crs.md](skills/geospatial-data-discovery/references/formats-and-crs.md) — formats, coordinate systems and spatial extents.
|
|
133
|
+
- [companion-skills.md](skills/geospatial-data-discovery/references/companion-skills.md) — optional product-specific help.
|
|
134
|
+
|
|
135
|
+
A source assessment needs no project templates, worked example or OpenMapStack
|
|
136
|
+
CLI. Use `open-map-stack` when source selection depends on unresolved compute,
|
|
137
|
+
storage or delivery choices; add `reproducible-gis-project` if the user wants to
|
|
138
|
+
turn a chosen analysis into a full project.
|
|
77
139
|
|
|
78
140
|
### Spatial SQL
|
|
79
|
-
|
|
141
|
+
|
|
142
|
+
Use [spatial-sql](skills/spatial-sql/SKILL.md) to write, review, debug or
|
|
143
|
+
optimize a spatial query on an already chosen engine, such as PostGIS or DuckDB
|
|
144
|
+
Spatial. It guides the agent to:
|
|
145
|
+
|
|
146
|
+
- Check the engine, geometry types, CRS, input grain and expected result, so
|
|
147
|
+
the query uses supported functions and returns the intended entities.
|
|
148
|
+
- Choose spatial predicates and boundary behavior deliberately, including how
|
|
149
|
+
null, invalid or multiply matched geometries affect the result.
|
|
150
|
+
- Use appropriate metric or geodesic operations for distances, areas and
|
|
151
|
+
buffers, so a numeric threshold has the intended units.
|
|
152
|
+
- Review indexes, candidate filters and query plans, then run small controls
|
|
153
|
+
when the engine is available, so performance changes preserve the result.
|
|
154
|
+
|
|
155
|
+
The standalone skill includes these local references:
|
|
156
|
+
|
|
157
|
+
- [spatial-sql.md](skills/spatial-sql/references/spatial-sql.md) — engine-specific spatial SQL patterns and query review.
|
|
158
|
+
- [formats-and-crs.md](skills/spatial-sql/references/formats-and-crs.md) — coordinate, unit and format semantics.
|
|
159
|
+
- [companion-skills.md](skills/spatial-sql/references/companion-skills.md) — optional product-specific help.
|
|
160
|
+
|
|
161
|
+
A bounded query review needs no project templates, worked example or
|
|
162
|
+
OpenMapStack CLI. Use `open-map-stack` when engine selection or cross-system
|
|
163
|
+
architecture is undecided; add `reproducible-gis-project` if the user wants to
|
|
164
|
+
compile a chosen analysis into a full project.
|
|
80
165
|
|
|
81
166
|
|
|
82
167
|
### Additional materials:
|
|
@@ -91,8 +176,9 @@ Some my local Estonia-specific guidance (Maa- ja Ruumiamet, ETAK, EPSG:3301 / L-
|
|
|
91
176
|
|
|
92
177
|
## Install
|
|
93
178
|
|
|
94
|
-
The 0.
|
|
95
|
-
|
|
179
|
+
The 0.5.0 release candidate provides four independently installable skills. The
|
|
180
|
+
OpenMapStack CLI is a separate installation for project execution and validation.
|
|
181
|
+
From a checkout, install the generalist and CLI for project work:
|
|
96
182
|
|
|
97
183
|
```bash
|
|
98
184
|
npx skills@1.5.26 add . --skill open-map-stack -a codex -y
|
|
@@ -101,18 +187,21 @@ python -m pip install '.[geo]'
|
|
|
101
187
|
|
|
102
188
|
Use `-a claude-code` for Claude Code, `-g` for global installation and `--copy`
|
|
103
189
|
for independent copies. Select additional skills by repeating `--skill NAME`;
|
|
104
|
-
`--skill '*'` selects the full collection.
|
|
105
|
-
project
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
190
|
+
`--skill '*'` selects the full collection. `open-map-stack` and
|
|
191
|
+
`reproducible-gis-project` include local project templates, the project schema,
|
|
192
|
+
a trimmed worked Tartu example and CLI setup instructions. The two bounded
|
|
193
|
+
specialists ship their task guidance and local references; they need no CLI or
|
|
194
|
+
installed sibling. Generated example outputs and downloaded source data are
|
|
195
|
+
omitted; the example pipeline needs network access and its documented GIS
|
|
196
|
+
environment.
|
|
197
|
+
|
|
198
|
+
The following 0.5.0 commands are unavailable until the release tag and Python
|
|
199
|
+
package are published. Before publication, use the matching checkout or a wheel
|
|
200
|
+
built from it. After publication, pin both parts of the coordinated release:
|
|
112
201
|
|
|
113
202
|
```bash
|
|
114
|
-
npx skills@1.5.26 add https://github.com/jaakla/openmapstack-skills/tree/v0.
|
|
115
|
-
python -m pip install 'openmapstack[geo]==0.
|
|
203
|
+
npx skills@1.5.26 add https://github.com/jaakla/openmapstack-skills/tree/v0.5.0/skills/open-map-stack -a codex -y
|
|
204
|
+
python -m pip install 'openmapstack[geo]==0.5.0'
|
|
116
205
|
```
|
|
117
206
|
|
|
118
207
|
For a floating install use `npx skills@1.5.26 add jaakla/openmapstack-skills
|
|
@@ -143,9 +232,10 @@ and scope before changing anything. Legacy `open-gis` is a different identifier:
|
|
|
143
232
|
remove it explicitly if it is an unwanted duplicate, rather than silently
|
|
144
233
|
rewriting its lock entry.
|
|
145
234
|
|
|
146
|
-
The CLI is separate from skill installation
|
|
147
|
-
|
|
148
|
-
|
|
235
|
+
The CLI is separate from skill installation and is needed only for project
|
|
236
|
+
execution or validation. When installing it, verify `openmapstack --version`
|
|
237
|
+
against the project skill's `metadata.version`. Before publication, a wheel or
|
|
238
|
+
pinned Git commit from the matching checkout is the supported alternative.
|
|
149
239
|
|
|
150
240
|
## Use
|
|
151
241
|
|
|
@@ -164,8 +254,72 @@ does not require a project; material multi-stage analyses retain the complete
|
|
|
164
254
|
reproducibility contract. Casual place lookups and ordinary non-spatial coding
|
|
165
255
|
are outside the collection's scope.
|
|
166
256
|
|
|
167
|
-
See [0.
|
|
168
|
-
|
|
257
|
+
See the [0.5.0 release preparation](docs/release-0.5.0.md) and
|
|
258
|
+
[candidate evidence](docs/acceptance-0.5.0-rc.json) for current checks and pending
|
|
259
|
+
acceptance. The published [0.4.0 release notes](https://github.com/jaakla/openmapstack-skills/releases/tag/v0.4.0)
|
|
260
|
+
retain the previous release's validation and installation evidence.
|
|
261
|
+
|
|
262
|
+
## Use your established stack
|
|
263
|
+
|
|
264
|
+
OpenMapStack supplies GIS methodology, source provenance and an inspectable
|
|
265
|
+
project contract around existing tools. It does not replace loaders, schedulers
|
|
266
|
+
or BI platforms. Preserve the user's stack and give each transformation and
|
|
267
|
+
dependency one authoritative owner.
|
|
268
|
+
|
|
269
|
+
The [focused and composed examples](examples/established-stack/README.md) run
|
|
270
|
+
dlt file ingestion/cursor state, dbt + DuckDB Spatial models/tests, Dagster assets
|
|
271
|
+
and failure handling, real Observable Framework builds, and optional native QGIS
|
|
272
|
+
delivery. The default example requires only the base spatial runtime and produces
|
|
273
|
+
a dashboard. Choosing one integration does not install all tools. Composed runs
|
|
274
|
+
use Dagster → dlt → dbt → Observable, with optional QGIS from the same validated
|
|
275
|
+
outputs. Observable hosted notebook publication is not implemented.
|
|
276
|
+
|
|
277
|
+
Read [the integration boundary](skills/open-map-stack/references/established-stack.md)
|
|
278
|
+
for who benefits, ownership, optional versioned bindings, clean reruns, capability
|
|
279
|
+
checks and future enterprise surfaces. MotherDuck/BigQuery source connectors
|
|
280
|
+
already exist; remote compute, Snowflake and Esri integrations remain extensions.
|
|
281
|
+
|
|
282
|
+
## Selectable delivery profiles
|
|
283
|
+
|
|
284
|
+
New project templates explicitly select the built-in dashboard using
|
|
285
|
+
`delivery.schema: openmapstack-delivery/v1`. Users can replace that default with
|
|
286
|
+
QGIS-only or Observable-only delivery, or choose multiple targets. Each target
|
|
287
|
+
binds declared document/evidence outputs to the same validated analytical data.
|
|
288
|
+
Unselected integrations have no artifact/runtime obligation; source provenance,
|
|
289
|
+
CRS correctness, immutable overrides and clean reruns remain required.
|
|
290
|
+
|
|
291
|
+
```yaml
|
|
292
|
+
delivery:
|
|
293
|
+
schema: openmapstack-delivery/v1
|
|
294
|
+
targets:
|
|
295
|
+
- id: dashboard
|
|
296
|
+
kind: dashboard
|
|
297
|
+
output: dashboard
|
|
298
|
+
inputs: [candidate_parcels]
|
|
299
|
+
evidence: dashboard_evidence
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
`dashboard` and `dashboard_evidence` must be declared document outputs. The
|
|
303
|
+
canonical pipeline embeds input-bound metadata, generates the view and writes
|
|
304
|
+
its evidence before run hashes. Missing selected artifacts fail; unavailable
|
|
305
|
+
browser/QGIS checks are `not_testable`. The [established-stack examples](examples/established-stack/README.md) add
|
|
306
|
+
native optional QGIS generation and a real Observable Framework static build.
|
|
307
|
+
Hosted Observable targets additionally retain an export, build/configuration,
|
|
308
|
+
URL and retrieval identity. A URL alone is insufficient; verification does not
|
|
309
|
+
certify current remote state or publish anything.
|
|
310
|
+
|
|
311
|
+
Try the offline [delivery-profile example](examples/delivery-profiles/README.md),
|
|
312
|
+
which demonstrates default, external-only and combined selections without
|
|
313
|
+
cloud credentials. The Tartu worked example retains legacy combined delivery.
|
|
314
|
+
|
|
315
|
+
**Migration is explicit:** existing v1 manifests without `delivery` retain their
|
|
316
|
+
legacy presentation/QGIS obligations. Add the selection, update output/evidence
|
|
317
|
+
bindings and canonical generation, deliberately remove obsolete target-specific
|
|
318
|
+
dependencies/checks, and regenerate run evidence before `verify --rerun`. The CLI
|
|
319
|
+
never silently migrates or deletes old outputs. Use a CLI whose check catalog
|
|
320
|
+
contains `delivery.declaration_valid`; older tools that ignore the extension
|
|
321
|
+
cannot certify it. Full semantics and migration instructions are in
|
|
322
|
+
[project-spec.md section 2.0](skills/open-map-stack/references/project-spec.md#20-selectable-delivery--openmapstack-deliveryv1).
|
|
169
323
|
|
|
170
324
|
## Project CLI
|
|
171
325
|
|
|
@@ -210,6 +364,30 @@ openmapstack run project.yaml --json
|
|
|
210
364
|
openmapstack inspect project.yaml --json
|
|
211
365
|
```
|
|
212
366
|
|
|
367
|
+
`run` reads Python dependencies from `runtime.environment` in `project.yaml`
|
|
368
|
+
and installs them into a reusable project virtualenv, including when invoked
|
|
369
|
+
through `uvx`. It warns if the CLI's Python version differs from the declared
|
|
370
|
+
version: `python: '3.12'` accepts any 3.12 patch release. Select a matching
|
|
371
|
+
interpreter with `uvx --python 3.12 openmapstack run project.yaml`.
|
|
372
|
+
|
|
373
|
+
Native dependencies such as GDAL, PROJ, QGIS, PostgreSQL, and PostGIS require
|
|
374
|
+
external setup. `run` emits installation and verification guidance for declared
|
|
375
|
+
native dependencies; their availability remains **unverified**. A GDAL installation
|
|
376
|
+
may need particular drivers and matching Python bindings in the pipeline's runtime.
|
|
377
|
+
PostGIS must be installed on the database server and enabled in the target database;
|
|
378
|
+
installing a Python client is insufficient. Use a prepared system, Conda, or container
|
|
379
|
+
runtime via `runtime.implementation.command` when needed. The declaration
|
|
380
|
+
`gdal: DuckDB spatial extension` does not request a system GDAL installation:
|
|
381
|
+
the pipeline must install/load DuckDB's `spatial` extension. See the
|
|
382
|
+
[runtime contract](skills/open-map-stack/references/project-spec.md#28-runtime-runs-warnings)
|
|
383
|
+
for dependency syntax and execution behavior.
|
|
384
|
+
|
|
385
|
+
Runtime advisories appear on stderr, or in the JSON `warnings` array, including
|
|
386
|
+
for `--dry-run`. They are non-blocking and separate from artifact validation;
|
|
387
|
+
`--strict` continues to apply to validation, not these advisories. An explicit
|
|
388
|
+
launch command owns its interpreter, so the CLI does not compare that interpreter
|
|
389
|
+
against its own Python version.
|
|
390
|
+
|
|
213
391
|
### Sampled runs — nail it before you scale it
|
|
214
392
|
|
|
215
393
|
A wide-area analysis can run for hours before a late step fails. A sampled run
|
|
@@ -244,8 +422,11 @@ See `references/project-spec.md`.
|
|
|
244
422
|
library in `openmapstack/checks/` against what the pipeline actually produced:
|
|
245
423
|
geometry read back through DuckDB Spatial, dataset CRS read from the artifact
|
|
246
424
|
rather than the manifest's claim, validation evidence recomputed from the
|
|
247
|
-
geodata it summarises,
|
|
248
|
-
|
|
425
|
+
geodata it summarises, non-spatial `kind: table` outputs read back as tables
|
|
426
|
+
(declared columns and types, unique key, CSV/XLSX downloads holding the same
|
|
427
|
+
rows), QGIS project structure and runtime loading where PyQGIS is available, and
|
|
428
|
+
— for projects that declare a design-language version — every dashboard or
|
|
429
|
+
report page operated in a real browser.
|
|
249
430
|
|
|
250
431
|
```bash
|
|
251
432
|
openmapstack verify path/to/project.yaml
|
|
@@ -255,6 +436,13 @@ openmapstack verify path/to/project.yaml --json --output validation/verify-repor
|
|
|
255
436
|
openmapstack verify path/to/project.yaml --strict # warnings and not-testable also return 1
|
|
256
437
|
```
|
|
257
438
|
|
|
439
|
+
DuckDB Python pipelines also receive a warning-only static axis-order check.
|
|
440
|
+
Reprojection or GDAL export with no explicit setup evidence produces a warning;
|
|
441
|
+
every other outcome is `not_testable`, never `passed`. Static analysis cannot
|
|
442
|
+
prove axis order: an independent runtime coordinate-order assertion supplies
|
|
443
|
+
that guarantee. The shared Spatial setup uses GIS x/y order on each connection. See the
|
|
444
|
+
[spatial SQL setup](skills/open-map-stack/references/spatial-sql.md#duckdb-spatial).
|
|
445
|
+
|
|
258
446
|
These checks require no repository-owned golden answer, so they work on data
|
|
259
447
|
neither this repository nor the model has seen. They establish bounded
|
|
260
448
|
structural, provenance, artifact, and reproducibility predicates; they do not
|
|
@@ -273,13 +461,46 @@ checked output. A check whose dependency is missing reports `not_testable` and
|
|
|
273
461
|
is counted separately — never a silent pass. A mixture of executed and
|
|
274
462
|
`not_testable` checks has aggregate status `warning`, and every report includes
|
|
275
463
|
`applicable`, `executed`, and `execution_rate` coverage. Install
|
|
276
|
-
`openmapstack[geo]` for the DuckDB-backed geodata checks
|
|
277
|
-
|
|
464
|
+
`openmapstack[geo]` for the DuckDB-backed geodata checks and for reading XLSX
|
|
465
|
+
(DuckDB `excel` extension) and Parquet tables; CSV and JSON tables need nothing
|
|
466
|
+
extra. PyQGIS comes from a system QGIS install. For the browser check, install
|
|
467
|
+
`openmapstack[visual]` and run `python -m playwright install chromium`.
|
|
468
|
+
|
|
469
|
+
The browser check runs when the manifest sets `presentation.design_language`
|
|
470
|
+
(see `references/design-language.md`). It opens every declared page and
|
|
471
|
+
operates each declared control through the language's state hooks, including
|
|
472
|
+
controls on inactive tabs: a control must change the page, an exploratory one
|
|
473
|
+
must show the exploratory label, and the reset must restore the published
|
|
474
|
+
state. Projects without a language version keep their existing plan: selected
|
|
475
|
+
web delivery targets receive smoke checks, and selected map-primary dashboards
|
|
476
|
+
also receive the existing visual check.
|
|
477
|
+
|
|
478
|
+
New material projects also generate `findings.md` from pipeline results before
|
|
479
|
+
output hashing. Its readable Markdown and YAML frontmatter share findings,
|
|
480
|
+
question/scope, run identity, assumptions, validation status and cited output
|
|
481
|
+
definitions/hashes. CSV/Parquet/geodata remain the underlying results; the view
|
|
482
|
+
need not display them all. `validate` and `verify` check a declared findings
|
|
483
|
+
artifact for stale/missing evidence and consistency with the current run.
|
|
484
|
+
Evidence inventories hash and link every declared table download as well as the
|
|
485
|
+
primary result, so changing or removing an XLSX/JSON export invalidates findings.
|
|
486
|
+
The offline example also exposes a portable findings reference in QGIS metadata.
|
|
487
|
+
Try the [offline example](examples/delivery-profiles/README.md);
|
|
488
|
+
see [the findings contract](skills/open-map-stack/references/project-spec.md#findings)
|
|
489
|
+
for the writer API and format. Embedded chat is a separate optional enhancement.
|
|
490
|
+
|
|
491
|
+
Delivered project views credit the declared author, free OpenMapStack toolkit
|
|
492
|
+
and canonical analysis time. `validate` and `verify` check the metadata and
|
|
493
|
+
actual HTML/QGIS credit values and links. Existing v1 projects missing both
|
|
494
|
+
identity fields receive an explicit legacy warning; declaring either requires
|
|
495
|
+
the complete pair and rendered credits. See the [credits contract](skills/open-map-stack/references/project-spec.md#credits-header).
|
|
278
496
|
|
|
279
497
|
See [the applicability reference](docs/verify-applicability.md) for the exact
|
|
280
498
|
plan conditions, dependencies, current regression evidence, and deliberate
|
|
281
|
-
exclusions.
|
|
282
|
-
|
|
499
|
+
exclusions. Explicit delivery targets add input-bound view evidence and web
|
|
500
|
+
smoke checks; selected map-primary built-in dashboards also run existing visual
|
|
501
|
+
checks. Legacy projects retain their previous delivery and rendering plan,
|
|
502
|
+
with the explicit credits migration warning described above. These checks establish
|
|
503
|
+
bounded properties, not every analytical or cartographic claim.
|
|
283
504
|
|
|
284
505
|
Project-specific known answers can be declared under
|
|
285
506
|
`validation.expectations[]`. The five allowlisted checks cover row count,
|