Releases: maurinl26/fortranspire
Release list
v0.2.1 — pre-JOSS-submission hardening
Security defaults
run_shellMCP exposure is now opt-in viaFORTRANSPIRE_ENABLE_SHELL=1. Closes the unauthenticated shell-execution path throughask_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 -fopenaccequivalence 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/anddocs/integrations/. - Dead code removed:
fortranspire/main.py,fortranspire/brain/, brokenDockerfile.ciandApptainer.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.mdby 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 fortranspire→uv tool install 'fortranspire[mcp]'. The[mcp]extra is required for the stdio handshake. - Hardcoded
/opt/homebrewremoved (breaks Intel Macs). .envedit reminder aftercp .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
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 indocs/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 -fopenacckernels), 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.ciandApptainer.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.ymlbuilds 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
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 install —
pip install fortranspireresolves Loki automatically vialoki-ifs >= 0.3.7. No more manualpip install git+...step. - Import unchanged — code continues to write
from loki import Sourcefile, ….loki-ifsis purely a PyPI distribution name. - Submodule for devs —
vendor/loki-ifsis a git submodule pointing at https://github.com/maurinl26/loki-ifs, opt-in viagit submodule update --init --recursive. Excluded from the sdist.
Install
pip install fortranspire==0.1.3With 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
loki-ifs 0.3.7— https://github.com/maurinl26/loki-ifs/releases/tag/loki-ifs-0.3.7 (PyPI: https://pypi.org/project/loki-ifs/0.3.7/)
See docs/changelog.md for the full notes.
v0.1.2 — PyPI-ready (Loki dep externalized)
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.
analyzeis just more accurate when Loki is available. -
Local development uses PEP 735 dependency groups. Run
uv sync --group lokito 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/testsSee the changelog for full details.
fortranspire 0.1.1 — silent unified CLI + docstring fix
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 legacyagent-*deprecation notice when dispatching togpu,translate, orprofile. Embarrassing UX for the canonical entry point — fixed by splitting each into an internal_*_main()(shared by unified + legacy) and arun_*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 PyPINo 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
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]' # everythingWhat'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_allcloseperINTENT(OUT|INOUT)) - OpenMP target alternative emission —
fortranspire gpu --gpu-pragma ompfor multi-vendor compatibility (gfortran 13+, nvfortran, ifx, AMD AOMP, IBM XL) - Parallel batch port with per-file
ContextVaroutput 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
BaseCallbackHandlerfor 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,ChatOpenAIfallback 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 package —
paper.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