From c6f0ace246b5c58840382a07fd0d8ec4ea615082 Mon Sep 17 00:00:00 2001 From: SoundMatt Date: Wed, 29 Jul 2026 06:01:37 -0700 Subject: [PATCH] =?UTF-8?q?fix:=20v1.147.0=20=E2=80=94=20ada-FuSa=20ecosys?= =?UTF-8?q?tem-integration=20gaps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A support-surface audit found conform/conform.go's langFromBinary and writeSourceFiles had no ada case (silently omitting the Ada scaffold stub instead of erroring), plus CLAUDE.md and README.md still saying "six languages" / omitting adafusa despite ada-FuSa being registered as the 7th adapter since v1.136.0. Signed-off-by: SoundMatt --- CHANGELOG.md | 22 ++++++++++++++++++++++ CLAUDE.md | 4 ++-- README.md | 9 +++++---- conform/conform.go | 16 ++++++++++++++++ conform/conform_test.go | 2 ++ fusaops.go | 2 +- 6 files changed, 48 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac1cc00..660bff8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,28 @@ and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0. ## [Unreleased] +## [1.147.0] — 2026-07-29 + +### fix: ada-FuSa ecosystem-integration gaps found by a support-surface audit + +A research pass checking whether FuSaOps fully supports ada-FuSa as its 7th +language adapter found the Dockerfile/tools-monitor/scan/fleet integration was +already correct, but three real gaps: + +- `conform/conform.go`'s `langFromBinary` and `writeSourceFiles` had no `ada` + case — `fusaops conform --binary adafusa --scaffold` silently omitted the + Ada source stub (no `main.adb`) instead of erroring or working. Added an + `ada` case to both, using Ada's `--` comment syntax for the `//fusa:req` + equivalent, plus a minimal GNAT project file so the scaffold is buildable. +- `CLAUDE.md` still said "six languages today," omitting ada-FuSa entirely. +- `README.md`'s PATH-tools list and bundled-tools paragraph both omitted + `adafusa`, inconsistent with the (already correct) supported-languages + table further down the same file. + +(A fourth gap — ada-FuSa's own release workflow missing the `xfusa-released` +repository_dispatch step other tools have — lives in ada-FuSa's repo, not +FuSaOps; noted for a future ada-FuSa-side fix, out of scope here.) + ## [1.146.0] — 2026-07-29 ### docs: x-FuSa spec v1.15.2 — §1.6.1 Rule A false-positive tradeoff made explicit (SoundMatt/FuSaOps#101) diff --git a/CLAUDE.md b/CLAUDE.md index f3f7bb1..2c145fd 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,8 +5,8 @@ Guidance for Claude Code (and contributors) working in this repository. ## What FuSaOps is FuSaOps is the **multi-language orchestration layer** over the x-FuSa toolchain -(go-FuSa, c-FuSa, cpp-FuSa, rust-FuSa, py-FuSa, java-FuSa — six languages today, -with more addable via the adapter interface). It does **not** implement +(go-FuSa, c-FuSa, cpp-FuSa, rust-FuSa, py-FuSa, java-FuSa, ada-FuSa — seven +languages today, with more addable via the adapter interface). It does **not** implement language-specific safety rules. It detects the languages in a repo, runs each language's x-FuSa tool, normalises the machine-readable output, and aggregates everything into one report and one web dashboard. diff --git a/README.md b/README.md index 74f802e..241d35c 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ go install github.com/SoundMatt/FuSaOps/cmd/fusaops@latest ``` The adapter tools must be on `PATH` for the languages you want scanned -(`gofusa`, `cfusa`, `cpfusa`, `rsfusa`, `pyfusa`, `jfusa`). The Docker image bundles all six. +(`gofusa`, `cfusa`, `cpfusa`, `rsfusa`, `pyfusa`, `jfusa`, `adafusa`). The Docker image bundles all seven. ## Usage @@ -545,9 +545,10 @@ tool — **no manual rebuild, and FuSaOps itself does not need a new release**. weekly scheduled rebuild is the safety net. See [`docs/extending.md`](docs/extending.md). -**Bundled tools.** The all-in-one image bundles all six x-FuSa tools: go-FuSa v0.33.4, -cpp-FuSa v0.14.3, c-FuSa v0.5.42, rust-FuSa v0.3.8, py-FuSa v0.2.6, java-FuSa v0.4.5. -All are spec v1.11 aligned and published to GHCR. +**Bundled tools.** The all-in-one image bundles all seven x-FuSa tools: go-FuSa v0.33.4, +cpp-FuSa v0.14.3, c-FuSa v0.5.42, rust-FuSa v0.3.8, py-FuSa v0.2.6, java-FuSa v0.4.5, +ada-FuSa v0.1.0 (alpha). All are published to GHCR — see each tool's own release +notes for its current spec version. > The image is `linux/amd64` (the tool images are amd64). On Apple Silicon it > runs under emulation; add `--platform linux/amd64` if your client needs it. diff --git a/conform/conform.go b/conform/conform.go index 5507851..1fff961 100644 --- a/conform/conform.go +++ b/conform/conform.go @@ -367,6 +367,8 @@ func (r *runner) writeSourceFiles() error { slashTest := "//" + "fusa:test" hashReq := "#" + "fusa:req" hashTest := "#" + "fusa:test" + dashReq := "--" + "fusa:req" + dashTest := "--" + "fusa:test" switch lang { case "go": src := fmt.Sprintf("package main\n\n%s REQ-TEST-001\n%s REQ-TEST-001\n\n%s REQ-TEST-002\n\nfunc main() {}\n", @@ -402,6 +404,18 @@ edition = "2021" src := fmt.Sprintf("%s REQ-TEST-001\n%s REQ-TEST-001\n\n%s REQ-TEST-002\n\npublic class Main {\n public static void main(String[] args) {}\n}\n", slashReq, slashTest, slashReq) return os.WriteFile(filepath.Join(r.dir, "Main.java"), []byte(src), 0o644) + case "ada": + if err := os.WriteFile(filepath.Join(r.dir, "conform_test.gpr"), []byte(`project Conform_Test is + for Main use ("main.adb"); + for Source_Dirs use ("."); + for Object_Dir use "obj"; +end Conform_Test; +`), 0o644); err != nil { + return err + } + src := fmt.Sprintf("%s REQ-TEST-001\n%s REQ-TEST-001\n\n%s REQ-TEST-002\n\nprocedure Main is\nbegin\n null;\nend Main;\n", + dashReq, dashTest, dashReq) + return os.WriteFile(filepath.Join(r.dir, "main.adb"), []byte(src), 0o644) default: return nil } @@ -424,6 +438,8 @@ func langFromBinary(base string) string { return "python" case "jfusa": return "java" + case "adafusa": + return "ada" default: return "" } diff --git a/conform/conform_test.go b/conform/conform_test.go index 02f978b..306121b 100644 --- a/conform/conform_test.go +++ b/conform/conform_test.go @@ -249,6 +249,7 @@ func TestLangFromBinary(t *testing.T) { cases := map[string]string{ "gofusa": "go", "cfusa": "c", "cpfusa": "cpp", "rsfusa": "rust", "pyfusa": "python", "jfusa": "java", + "adafusa": "ada", "unknown": "", } for bin, want := range cases { @@ -686,6 +687,7 @@ func TestWriteSourceFilesLanguages(t *testing.T) { "rust": filepath.Join("src", "main.rs"), "python": "main.py", "java": "Main.java", + "ada": "main.adb", "unknown": "", } for lang, relPath := range cases { diff --git a/fusaops.go b/fusaops.go index d4325ed..742ecfc 100644 --- a/fusaops.go +++ b/fusaops.go @@ -20,7 +20,7 @@ import ( ) // Version is the current release of FuSaOps. -const Version = "1.146.0" +const Version = "1.147.0" // SpecVersion is the x-FuSa specification version this release targets. //