Skip to content

Releases: maurinl26/fortranspire

v0.2.1 — pre-JOSS-submission hardening

Choose a tag to compare

@maurinl26 maurinl26 released this 24 Jun 11:59

Security defaults

  • run_shell MCP exposure is now opt-in via FORTRANSPIRE_ENABLE_SHELL=1. Closes the unauthenticated shell-execution path through ask_agent.
  • MCP file/directory arguments are jailed to the workspace root via a new _jail() helper. Auto-off in stdio mode (IDE trust boundary), enforced by default in HTTP/SSE.

CI

  • New .github/workflows/tests.yml: pytest on every push and PR (Python 3.11/3.12 matrix), gfortran -fopenacc equivalence harness on push and manual dispatch.
  • Tests badge added to README.

Repo cleanup

  • Paper artefacts moved to paper/ (paper.md, paper.bib).
  • Container artefacts moved to containers/ (Dockerfile, Dockerfile.hpc, apptainer.def, docker-compose.yml).
  • Two stray root markdowns relocated under docs/concepts/ and docs/integrations/.
  • Dead code removed: fortranspire/main.py, fortranspire/brain/, broken Dockerfile.ci and Apptainer.analyze.

Paper

  • 2289 → 1103 body words (-52%). Eight-stage table + LLM-intervention rationale + agent-loop motivation moved to docs/concepts/architecture.md.
  • Five orphan bib entries dropped; zero broken citations.
  • "Sovereign" now backed in docs/concepts/llm-endpoints.md by GDPR (EU 2016/679), AI Act (EU 2024/1689), and NIS2 Directive (EU 2022/2555).

Install path fixes

  • README and docs/getting-started/with-mistral-vibe.md: uv tool install fortranspireuv tool install 'fortranspire[mcp]'. The [mcp] extra is required for the stdio handshake.
  • Hardcoded /opt/homebrew removed (breaks Intel Macs).
  • .env edit reminder after cp .env.example .env.

Install

```bash
uv tool install 'fortranspire[mcp]'
```

Full changelog: docs/changelog.md.

v0.2.0 — stdio MCP transport, mistral-vibe integration, JOSS-ready

Choose a tag to compare

@maurinl26 maurinl26 released this 24 Jun 09:25

Highlights

  • stdio MCP transport for fortranspire mcp — IDE-spawned servers (mistral-vibe, Claude Code, Claude Desktop) over JSON-RPC framing. No port, no auth, local-by-construction. Pytest smoke test verifies the 9-tool surface.
  • mistral-vibe integration officielle — turnkey 60-second quickstart in docs/getting-started/with-mistral-vibe.md, full walkthrough on PHYEX in docs/integrations/mistral-vibe.md.
  • JOSS paper muscled with Real-world demonstration (PHYEX kernel — 1 routine, ~$0.04 codestral, 2 s estimation), Quality control (equivalence harness on real gfortran -fopenacc kernels), and Limitations / Roadmap sections.
  • README cleanup — 1353 → 332 lines. Rich Fortran patterns content (11 patterns with before/after code) migrated to docs/concepts/fortran-patterns.md.
  • Infra cleanup — removed obsolete Dockerfile.ci and Apptainer.analyze (broken paths). ROADMAP neutralised for JOSS-friendly framing.
  • Affiliation standardised across paper.md / CITATION.cff / .zenodo.json / codemeta.json — Independent Researcher, Toulouse, France.
  • CI — new .github/workflows/docs.yml builds Sphinx in nitpicky mode on every PR touching docs.

Tooling

  • 9 MCP tools exposed: analyze_kernels, explain_port_cost, build_call_graph, generate_docs, translate_kernel_gpu, translate_kernel, profile_kernels, ask_agent, agent_status.
  • 4 of the 9 are no-LLM (deterministic Loki / AST work).

Install

uv tool install fortranspire

Full changelog: see docs/changelog.md.

v0.1.3 — single-step install via loki-ifs

Choose a tag to compare

@maurinl26 maurinl26 released this 22 Jun 09:36

Restores pip install fortranspire as a one-shot install by depending on the new loki-ifs PyPI distribution (a redistribution of ECMWF Loki @ 0.3.7 under our control).

Highlights

  • Single-step installpip install fortranspire resolves Loki automatically via loki-ifs >= 0.3.7. No more manual pip install git+... step.
  • Import unchanged — code continues to write from loki import Sourcefile, …. loki-ifs is purely a PyPI distribution name.
  • Submodule for devsvendor/loki-ifs is a git submodule pointing at https://github.com/maurinl26/loki-ifs, opt-in via git submodule update --init --recursive. Excluded from the sdist.

Install

pip install fortranspire==0.1.3

With extras:

pip install "fortranspire[gpu]==0.1.3"   # Phase 1
pip install "fortranspire[mcp]==0.1.3"   # MCP HTTP/SSE server
pip install "fortranspire[all]==0.1.3"   # everything (except docs/tests)

Related releases

See docs/changelog.md for the full notes.

v0.1.2 — PyPI-ready (Loki dep externalized)

Choose a tag to compare

@maurinl26 maurinl26 released this 22 Jun 08:37

Patch release that unblocks the first PyPI upload.

Why this release

PyPI's PEP 715 enforcement rejected the v0.1.0 and v0.1.1 wheels with 400 Can't have direct dependency: loki @ git+https://github.com/ecmwf-ifs/loki@0.3.7. ECMWF Loki is not published on PyPI under that name (the PyPI loki is an unrelated astronomy package), and PEP 715 forbids git+https://… URLs in Requires-Dist.

What changed

  • Loki is no longer a declared dependency. Users install it manually in a second step:

    pip install fortranspire
    pip install "loki @ git+https://github.com/ecmwf-ifs/loki@0.3.7"

    The parser already falls back to a regex frontend when Loki is missing, so the package imports cleanly without it. analyze is just more accurate when Loki is available.

  • Local development uses PEP 735 dependency groups. Run uv sync --group loki to pull Loki in for local work; this metadata is not part of the PyPI release.

  • README + installation docs rewritten with the new two-step install and an explanatory callout on why Loki is separate.

Install

pip install fortranspire==0.1.2
pip install "loki @ git+https://github.com/ecmwf-ifs/loki@0.3.7"

Or with extras:

pip install "fortranspire[gpu]==0.1.2"   # Phase 1 transformations
pip install "fortranspire[mcp]==0.1.2"   # MCP HTTP/SSE server
pip install "fortranspire[all]==0.1.2"   # everything except docs/tests

See the changelog for full details.

fortranspire 0.1.1 — silent unified CLI + docstring fix

Choose a tag to compare

@maurinl26 maurinl26 released this 22 Jun 08:03

Patch release. Two cosmetic issues found by the post-tag smoke test of v0.1.0.

Fixed

  • Unified fortranspire <verb> CLI no longer prints the legacy agent-* deprecation notice when dispatching to gpu, translate, or profile. Embarrassing UX for the canonical entry point — fixed by splitting each into an internal _*_main() (shared by unified + legacy) and a run_* wrapper (only the wrapper carries the deprecation).
  • Package docstring (fortranspire/__init__.py) was a pre-rename relic. Replaced with the current project description; added __version__ = "0.1.1".

Upgrade

pip install --upgrade fortranspire    # once 0.1.1 lands on PyPI

No breaking changes. Every command from 0.1.0 keeps working identically. The deprecation warning on the legacy agent-* scripts is still in place (and will fire at the right time).

Test plan

234/234 pass (231 in 0.1.0 + 3 new regression guards that fail against the 0.1.0 wheel and pass here).

Full changelog

See docs/changelog.md.

fortranspire 0.1.0 — first PyPI release

Choose a tag to compare

@maurinl26 maurinl26 released this 22 Jun 06:38

First public release of fortranspire on PyPI. The project was renamed from coding-agent / local-code-agent; this is its first release under the new name and the first artifact published to PyPI + Zenodo.

Install

pip install fortranspire                      # core: analyze, explain, format, graph, diff, report, bench
pip install 'fortranspire[gpu]'               # + LLM pipeline (Phase 1, doc, port-batch)
pip install 'fortranspire[mcp]'               # + MCP server (FastMCP)
pip install 'fortranspire[jax]'               # + Phase 2 (Fortran → JAX, experimental)
pip install 'fortranspire[all]'               # everything

What's in this release

Unified fortranspire <verb> CLI with 13 subcommands:

no-LLM, CI-friendly LLM-driven server
analyze (Loki + SARIF) doc (inline !> + Sphinx) mcp (FastMCP)
explain (cost/risk estimate) gpu (Phase 1 port, --gpu-pragma acc|omp)
format (fprettify wrapper) port-batch (parallel)
graph (Mermaid call-graph) translate (Phase 2 JAX)
diff (semantic before/after) profile (bench)
report (HTML audit)
bench (regression detector)

Highlights

  • Auto-generated CPU↔GPU equivalence test harness per ported kernel — every Phase-1 port comes with a numerical-equivalence pytest file (np.testing.assert_allclose per INTENT(OUT|INOUT))
  • OpenMP target alternative emissionfortranspire gpu --gpu-pragma omp for multi-vendor compatibility (gfortran 13+, nvfortran, ifx, AMD AOMP, IBM XL)
  • Parallel batch port with per-file ContextVar output isolation — 100 routines in ~45 min on 4 workers vs ~3h sequential
  • SQLite-backed LRU cache for LLM responses — identical re-runs return instantly, zero token cost
  • Per-tenant observability tracer with per-model price table (Mistral La Plateforme) and LangChain BaseCallbackHandler for token capture
  • Hardened MCP server — JSON token registry, sliding-window rate limit, HMAC-signed audit log
  • Native Mistral SDK auto-selected on api.mistral.ai, ChatOpenAI fallback for vLLM / TGI / Ollama / Scaleway / OVH
  • French translations of every LLM prompt — initial audience (Météo-France, CEA, EDF R&D, ENM Toulouse) is francophone
  • JOSS submission packagepaper.md, paper.bib, CITATION.cff, codemeta.json, .zenodo.json, .readthedocs.yaml, and a GitHub Action that renders the JOSS draft PDF on every push

Sovereignty

No Azure / AWS / GCP dependency on the LLM path. Default endpoint = Mistral La Plateforme (EU-hosted). Works against any OpenAI-compatible endpoint (Scaleway Generative APIs, OVH AI Endpoints, self-hosted vLLM / TGI / Ollama).

Full changelog

See docs/changelog.md. 19 issues closed during the development sprint (#1#20).

Citation

A DOI for this release is being minted by Zenodo via the GitHub integration. Once it's live, the badge in the README will update; alternatively, every release tag mints its own DOI for fine-grained citation. Use CITATION.cff (rendered as the "Cite this repository" button on the repo home) for citation metadata.

🤖 Built with Claude Code