openwind-ci commited on
Commit
f00a1fe
·
1 Parent(s): dd29257

sync: github ddd2219

Browse files
Files changed (30) hide show
  1. README.md +7 -5
  2. app.py +3 -0
  3. fetch_atlases.py +3 -0
  4. security.py +3 -0
  5. vendor/data-adapters/pyproject.toml +1 -1
  6. vendor/data-adapters/src/openwind_data/__init__.py +3 -0
  7. vendor/data-adapters/src/openwind_data/adapters/__init__.py +2 -0
  8. vendor/data-adapters/src/openwind_data/adapters/base.py +3 -0
  9. vendor/data-adapters/src/openwind_data/adapters/cache_backed.py +3 -0
  10. vendor/data-adapters/src/openwind_data/adapters/openmeteo.py +3 -0
  11. vendor/data-adapters/src/openwind_data/currents/__init__.py +3 -0
  12. vendor/data-adapters/src/openwind_data/currents/harmonic.py +3 -0
  13. vendor/data-adapters/src/openwind_data/currents/marc_atlas.py +3 -0
  14. vendor/data-adapters/src/openwind_data/currents/narrow_pass.py +3 -0
  15. vendor/data-adapters/src/openwind_data/currents/router.py +3 -0
  16. vendor/data-adapters/src/openwind_data/currents/shom_c2d.py +3 -0
  17. vendor/data-adapters/src/openwind_data/currents/shom_c2d_registry.py +3 -0
  18. vendor/data-adapters/src/openwind_data/routing/__init__.py +3 -0
  19. vendor/data-adapters/src/openwind_data/routing/archetypes.py +3 -0
  20. vendor/data-adapters/src/openwind_data/routing/complexity.py +3 -0
  21. vendor/data-adapters/src/openwind_data/routing/geometry.py +3 -0
  22. vendor/data-adapters/src/openwind_data/routing/passage.py +3 -0
  23. vendor/data-adapters/src/openwind_data/routing/polars/__init__.py +2 -0
  24. vendor/mcp-core/pyproject.toml +1 -1
  25. vendor/mcp-core/scripts/run_local.py +3 -0
  26. vendor/mcp-core/src/openwind_mcp_core/__init__.py +3 -0
  27. vendor/mcp-core/src/openwind_mcp_core/feedback.py +3 -0
  28. vendor/mcp-core/src/openwind_mcp_core/render.py +3 -0
  29. vendor/mcp-core/src/openwind_mcp_core/server.py +7 -2
  30. vendor/mcp-core/src/openwind_mcp_core/widget.py +3 -0
README.md CHANGED
@@ -6,7 +6,7 @@ colorTo: yellow
6
  sdk: docker
7
  app_port: 7860
8
  pinned: false
9
- license: mit
10
  short_description: (dev) Sailing passage planner for any coast, via MCP.
11
  ---
12
 
@@ -76,7 +76,7 @@ asks you for credentials is guessing rather than reading the server.
76
  - **Boat-aware.** 7 archetypes from 20 to 50 ft, real polars, an `efficiency` parameter for trim and crew level.
77
  - **Window-aware.** One call sweeps up to 14 days of hourly departures so the LLM can pick the calmest slot.
78
  - **Client-agnostic.** One HTTP MCP endpoint, no vendor lock-in. Rich [MCP Apps](https://modelcontextprotocol.io/extensions/client-matrix) widget on supporting hosts; clean deep-link fallback on the rest.
79
- - **Open source, MIT.** Self-host on Fly, Modal, or your own VPS in minutes, under your own name and icons.
80
 
81
  ## Four tools
82
 
@@ -112,7 +112,9 @@ sleep takes ~5 s to wake. Acceptable for V1.
112
 
113
  ## License and trademark
114
 
115
- Code: MIT. The name "OhMyWind" is filed as a trademark at the INPI, and the
116
- visual identity (logo, icons) stays under copyright. Neither is covered by the
117
- MIT licence, so a fork ships under its own name and icons. Full policy:
 
 
118
  [TRADEMARK.md](https://github.com/qdonnars/ohmywind/blob/main/TRADEMARK.md).
 
6
  sdk: docker
7
  app_port: 7860
8
  pinned: false
9
+ license: agpl-3.0
10
  short_description: (dev) Sailing passage planner for any coast, via MCP.
11
  ---
12
 
 
76
  - **Boat-aware.** 7 archetypes from 20 to 50 ft, real polars, an `efficiency` parameter for trim and crew level.
77
  - **Window-aware.** One call sweeps up to 14 days of hourly departures so the LLM can pick the calmest slot.
78
  - **Client-agnostic.** One HTTP MCP endpoint, no vendor lock-in. Rich [MCP Apps](https://modelcontextprotocol.io/extensions/client-matrix) widget on supporting hosts; clean deep-link fallback on the rest.
79
+ - **Open source, AGPL.** Self-host on Fly, Modal, or your own VPS in minutes, under your own name and icons.
80
 
81
  ## Four tools
82
 
 
112
 
113
  ## License and trademark
114
 
115
+ Code: AGPL-3.0-or-later. Forking and self-hosting stay free; a modified
116
+ instance served over the network must publish its source. The name "OhMyWind"
117
+ is filed as a trademark at the INPI, and the visual identity (logo, icons)
118
+ stays under copyright. Neither is covered by the AGPL licence, so a fork ships
119
+ under its own name and icons. Full policy:
120
  [TRADEMARK.md](https://github.com/qdonnars/ohmywind/blob/main/TRADEMARK.md).
app.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """HF Space entry point — serves the OhMyWind FastMCP server over HTTP.
2
 
3
  This wrapper is intentionally thin. All tools live in ``openwind_mcp_core``
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """HF Space entry point — serves the OhMyWind FastMCP server over HTTP.
5
 
6
  This wrapper is intentionally thin. All tools live in ``openwind_mcp_core``
fetch_atlases.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Pull tidal atlases from the HF Dataset at Docker build time.
2
 
3
  Reads ``HF_TOKEN`` (mounted as a build secret) and ``HF_DATASET_ID`` from
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Pull tidal atlases from the HF Dataset at Docker build time.
5
 
6
  Reads ``HF_TOKEN`` (mounted as a build secret) and ``HF_DATASET_ID`` from
security.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Deployment-side hardening for the public Space: CORS allowlist, per-IP
2
  rate limiting, security headers.
3
 
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Deployment-side hardening for the public Space: CORS allowlist, per-IP
5
  rate limiting, security headers.
6
 
vendor/data-adapters/pyproject.toml CHANGED
@@ -2,7 +2,7 @@
2
  name = "openwind-data"
3
  version = "0.1.0"
4
  description = "Marine data adapters, polars, routing, and complexity scoring for OhMyWind"
5
- license = "MIT"
6
  requires-python = ">=3.12"
7
  dependencies = [
8
  "httpx>=0.27",
 
2
  name = "openwind-data"
3
  version = "0.1.0"
4
  description = "Marine data adapters, polars, routing, and complexity scoring for OhMyWind"
5
+ license = "AGPL-3.0-or-later"
6
  requires-python = ">=3.12"
7
  dependencies = [
8
  "httpx>=0.27",
vendor/data-adapters/src/openwind_data/__init__.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """OhMyWind domain logic — marine adapters, polars, routing, complexity."""
2
 
3
  from openwind_data.adapters.base import (
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """OhMyWind domain logic — marine adapters, polars, routing, complexity."""
5
 
6
  from openwind_data.adapters.base import (
vendor/data-adapters/src/openwind_data/adapters/__init__.py CHANGED
@@ -0,0 +1,2 @@
 
 
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
vendor/data-adapters/src/openwind_data/adapters/base.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Marine forecast types and adapter Protocol.
2
 
3
  Direction conventions (mixed by physical phenomenon — mirrors meteorological and
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Marine forecast types and adapter Protocol.
5
 
6
  Direction conventions (mixed by physical phenomenon — mirrors meteorological and
vendor/data-adapters/src/openwind_data/adapters/cache_backed.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Adapter backed by a client-supplied forecast cache.
2
 
3
  Instead of calling Open-Meteo, this adapter reads wind (multi-model) and sea
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Adapter backed by a client-supplied forecast cache.
5
 
6
  Instead of calling Open-Meteo, this adapter reads wind (multi-model) and sea
vendor/data-adapters/src/openwind_data/adapters/openmeteo.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  from __future__ import annotations
2
 
3
  import asyncio
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  from __future__ import annotations
5
 
6
  import asyncio
vendor/data-adapters/src/openwind_data/currents/__init__.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Tidal currents and heights subpackage.
2
 
3
  Provides:
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Tidal currents and heights subpackage.
5
 
6
  Provides:
vendor/data-adapters/src/openwind_data/currents/harmonic.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Tidal harmonic predictor.
2
 
3
  Schureman + Cartwright 1985 astronomical longitudes. Standard convention used
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Tidal harmonic predictor.
5
 
6
  Schureman + Cartwright 1985 astronomical longitudes. Standard convention used
vendor/data-adapters/src/openwind_data/currents/marc_atlas.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """MARC PREVIMER atlas runtime loader and predictor.
2
 
3
  Reads tiled Parquet datasets produced by ``scripts/build_marc_atlas.py`` (one
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """MARC PREVIMER atlas runtime loader and predictor.
5
 
6
  Reads tiled Parquet datasets produced by ``scripts/build_marc_atlas.py`` (one
vendor/data-adapters/src/openwind_data/currents/narrow_pass.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Per-point confidence labelling for current values.
2
 
3
  The qualitative tag (``"high"`` / ``"medium"`` / ``"low"`` / ``None``) sits
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Per-point confidence labelling for current values.
5
 
6
  The qualitative tag (``"high"`` / ``"medium"`` / ``"low"`` / ``None``) sits
vendor/data-adapters/src/openwind_data/currents/router.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Composite marine adapter — SHOM > MARC > Open-Meteo cascade.
2
 
3
  Wraps an upstream ``MarineDataAdapter`` (typically ``OpenMeteoAdapter``)
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Composite marine adapter — SHOM > MARC > Open-Meteo cascade.
5
 
6
  Wraps an upstream ``MarineDataAdapter`` (typically ``OpenMeteoAdapter``)
vendor/data-adapters/src/openwind_data/currents/shom_c2d.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Parser for the SHOM "Courants de marée 2D" ASCII atlas (Édition 2005).
2
 
3
  This module loads the public-domain dataset distributed by SHOM under
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Parser for the SHOM "Courants de marée 2D" ASCII atlas (Édition 2005).
5
 
6
  This module loads the public-domain dataset distributed by SHOM under
vendor/data-adapters/src/openwind_data/currents/shom_c2d_registry.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Runtime SHOM Atlas C2D registry: spatial index + tide-relative predictor.
2
 
3
  Loads the Parquet + JSON artefacts produced by ``scripts/build_shom_c2d.py``
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Runtime SHOM Atlas C2D registry: spatial index + tide-relative predictor.
5
 
6
  Loads the Parquet + JSON artefacts produced by ``scripts/build_shom_c2d.py``
vendor/data-adapters/src/openwind_data/routing/__init__.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Routing — geometry, polars, and passage time estimation."""
2
 
3
  from openwind_data.routing.archetypes import (
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Routing — geometry, polars, and passage time estimation."""
5
 
6
  from openwind_data.routing.archetypes import (
vendor/data-adapters/src/openwind_data/routing/archetypes.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Boat archetype registry — loads ORC-style polars from `polars/*.json`.
2
 
3
  V1 ships 7 archetypes (5 monohull cruisers from 20 to 50 ft, 1 catamaran, 1
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Boat archetype registry — loads ORC-style polars from `polars/*.json`.
5
 
6
  V1 ships 7 archetypes (5 monohull cruisers from 20 to 50 ft, 1 catamaran, 1
vendor/data-adapters/src/openwind_data/routing/complexity.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Complexity scoring for a passage.
2
 
3
  V1 design choices:
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Complexity scoring for a passage.
5
 
6
  V1 design choices:
vendor/data-adapters/src/openwind_data/routing/geometry.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Spherical geometry helpers — all distances in nautical miles, angles in degrees.
2
 
3
  Earth radius is taken as 3440.065 NM (mean radius 6371.0088 km / 1.852).
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Spherical geometry helpers — all distances in nautical miles, angles in degrees.
5
 
6
  Earth radius is taken as 3440.065 NM (mean radius 6371.0088 km / 1.852).
vendor/data-adapters/src/openwind_data/routing/passage.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Passage time + complexity estimation along a polyline of waypoints.
2
 
3
  V1 design choices:
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Passage time + complexity estimation along a polyline of waypoints.
5
 
6
  V1 design choices:
vendor/data-adapters/src/openwind_data/routing/polars/__init__.py CHANGED
@@ -0,0 +1,2 @@
 
 
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
vendor/mcp-core/pyproject.toml CHANGED
@@ -2,7 +2,7 @@
2
  name = "openwind-mcp-core"
3
  version = "0.1.0"
4
  description = "Cloud-agnostic FastMCP server for OhMyWind: sailing planner tools."
5
- license = "MIT"
6
  requires-python = ">=3.12"
7
  dependencies = [
8
  # MCP Apps support requires:
 
2
  name = "openwind-mcp-core"
3
  version = "0.1.0"
4
  description = "Cloud-agnostic FastMCP server for OhMyWind: sailing planner tools."
5
+ license = "AGPL-3.0-or-later"
6
  requires-python = ">=3.12"
7
  dependencies = [
8
  # MCP Apps support requires:
vendor/mcp-core/scripts/run_local.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Run the OhMyWind MCP server over stdio for local Claude Desktop integration.
2
 
3
  Usage (in claude_desktop_config.json):
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Run the OhMyWind MCP server over stdio for local Claude Desktop integration.
5
 
6
  Usage (in claude_desktop_config.json):
vendor/mcp-core/src/openwind_mcp_core/__init__.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """OhMyWind MCP server — cloud-agnostic FastMCP definition."""
2
 
3
  from openwind_mcp_core.server import build_server
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """OhMyWind MCP server — cloud-agnostic FastMCP definition."""
5
 
6
  from openwind_mcp_core.server import build_server
vendor/mcp-core/src/openwind_mcp_core/feedback.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Feedback tool: lets a calling LLM log a structured note about a tool
2
  interaction (an unclear parameter, missing data, a wrong-feeling result,
3
  a feature request).
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Feedback tool: lets a calling LLM log a structured note about a tool
5
  interaction (an unclear parameter, missing data, a wrong-feeling result,
6
  a feature request).
vendor/mcp-core/src/openwind_mcp_core/render.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Deep-link helper used by ``plan_passage``.
2
 
3
  Historically this module also generated a ~5 KB self-contained HTML widget
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Deep-link helper used by ``plan_passage``.
5
 
6
  Historically this module also generated a ~5 KB self-contained HTML widget
vendor/mcp-core/src/openwind_mcp_core/server.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """FastMCP server factory.
2
 
3
  `build_server()` returns a `FastMCP` instance with all tools registered. It is
@@ -507,8 +510,10 @@ but the underlying complexity is unchanged.
507
 
508
  ## Licence and trademark
509
 
510
- The OhMyWind source code is MIT licensed. Two things the MIT grant does
511
- not cover: the name "OhMyWind", filed as a trademark at the INPI (the
 
 
512
  French industrial property office), and the visual identity (logo,
513
  icons), which stays under copyright. Forks are welcome under their own
514
  name and icons. Policy:
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """FastMCP server factory.
5
 
6
  `build_server()` returns a `FastMCP` instance with all tools registered. It is
 
510
 
511
  ## Licence and trademark
512
 
513
+ The OhMyWind source code is licensed under the AGPL-3.0-or-later. Forks
514
+ and redistribution stay free; a modified instance served over the
515
+ network must publish its source. Two things the AGPL grant does not
516
+ cover: the name "OhMyWind", filed as a trademark at the INPI (the
517
  French industrial property office), and the visual identity (logo,
518
  icons), which stays under copyright. Forks are welcome under their own
519
  name and icons. Policy:
vendor/mcp-core/src/openwind_mcp_core/widget.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """Static HTML template consumed by ``render.py`` to produce the passage widget.
2
 
3
  Kept in its own module so the visual contract is trivial to inspect / iterate
 
1
+ # SPDX-License-Identifier: AGPL-3.0-or-later
2
+ # SPDX-FileCopyrightText: 2026 Quentin Donnars
3
+
4
  """Static HTML template consumed by ``render.py`` to produce the passage widget.
5
 
6
  Kept in its own module so the visual contract is trivial to inspect / iterate