Something went wrong. Try again.
Build and run CI pipelines anywhere, consistently. fluentci.io
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108#!/usr/bin/env python3"""Check shared engine/SDK sources, or copy them to the sibling with --write.
Does not copy build output or overwrite the CLI's local integration wrapper."""
import argparseimport jsonimport refrom pathlib import Pathimport shutilimport sys
def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--write", action="store_true") parser.add_argument("--engine", type=Path) args = parser.parse_args() root = Path(__file__).resolve().parents[1] sibling = (args.engine or root.parent / "fluentci-engine").resolve() if not (sibling / "Cargo.toml").is_file(): parser.error(f"engine checkout not found: {sibling}") mappings = [ (root / "engine/crates" / name, sibling / "crates" / name) for name in sorted(path.name for path in (root / "engine/crates").iterdir() if path.is_dir() and path.name != "cli") ] mappings.append((root / "engine/crates/cli/src", sibling / "crates/cli/src")) mappings.append((root / "engine/AGENTS.md", sibling / "AGENTS.md")) mappings.append((root / "engine/README.md", sibling / "README.md")) mappings.append((root / "ARCHITECTURE.md", sibling / "ARCHITECTURE.md")) mappings.append((root / "engine/vendor/wasmtime-wasi-openbsd", sibling / "vendor/wasmtime-wasi-openbsd")) mappings.append((root / "engine/docs/module-cli.md", sibling / "docs/module-cli.md")) mappings.append((root / "engine/docs/components.md", sibling / "docs/components.md")) mappings.append((root / "templates/components", sibling / "sdk/components")) mappings.append((root / "engine/crates/components/wit", sibling / "sdk/components/wit")) mappings.append((root / "engine/schema/module-cli.schema.json", sibling / "schema/module-cli.schema.json")) mappings.append((root / "templates/inspection", sibling / "sdk/inspection")) mappings.append((root / "templates/inspection/examples/clojurescript.mjs", sibling / "sdk/clojurescript/demo-plugin/build.mjs")) mappings.append((root / "templates/inspection/examples/clojurescript-entry.cljs", sibling / "sdk/clojurescript/demo-plugin/src/demo/entry.cljs")) for name in ("src/content/line.rs", "src/superconsole.rs", "src/testing.rs"): relative = Path("vendor/superconsole") / name mappings.append((root / "engine" / relative, sibling / relative)) for language in ("typescript", "python", "gleam", "rescript", "elixir", "clojurescript", "purescript"): source = root / "templates/sdk" / language / ".sdk" / language for directory in ("src", "lib", "dev", "typings"): if (source / directory).is_dir(): mappings.append((source / directory, sibling / "sdk" / language / directory)) if language == "elixir": mappings.append((source / "test/named_arguments_test.exs", sibling / "sdk/elixir/test/named_arguments_test.exs")) if language == "gleam": mappings.append((source / "gleam.toml", sibling / "sdk/gleam/gleam.toml")) if language == "purescript": mappings.append((source / "spago.yaml", sibling / "sdk/purescript/spago.yaml")) if language in {"typescript", "gleam", "rescript", "purescript"}: mappings.append((root / "templates/sdk" / language / "build.mjs", sibling / "sdk" / language / "demo-plugin/build.mjs")) if language in {"typescript", "gleam", "rescript", "purescript", "clojurescript"}: mappings.append((root / "templates/inspection/examples/.npmrc", sibling / "sdk" / language / "demo-plugin/.npmrc")) for name in ("host.json", "host-rust.json", "pdk-modules.json", "executor-model.json"): mappings.append((root / "engine/schema" / name, sibling / "schema" / name)) mappings.append((root / "scripts/generate-component-host.py", sibling / "scripts/generate-component-host.py")) mappings.append((root / "tools/component-model", sibling / "tools/component-model")) differing = [] for language in ("typescript", "gleam", "rescript", "purescript", "clojurescript"): package_path = sibling / "sdk" / language / "demo-plugin/package.json" package = json.loads(package_path.read_text()) dependencies = package.setdefault("devDependencies", {}) expected = {"@fluentci/inspection": "file:../../inspection", "typescript": "5.9.3"} if any(dependencies.get(name) != version for name, version in expected.items()): differing.append(str(package_path.relative_to(sibling))) if args.write: dependencies.update(expected) package_path.write_text(json.dumps(package, indent=2) + "\n") # The CLI manifest has a local library wrapper. Synchronize only its package # version, preserving each repository's integration-specific manifest fields. source_manifest = root / "engine/crates/cli/Cargo.toml" target_manifest = sibling / "crates/cli/Cargo.toml" pattern = r'^version\s*=\s*"([^\"]+)"' expected = re.search(pattern, source_manifest.read_text(), re.MULTILINE).group(1) target_text = target_manifest.read_text() actual = re.search(pattern, target_text, re.MULTILINE).group(1) if actual != expected: differing.append("crates/cli/Cargo.toml (package version)") if args.write: target_manifest.write_text(re.sub(pattern, f'version = "{expected}"', target_text, count=1, flags=re.MULTILINE)) for source, destination in mappings: files = sorted(source.rglob("*")) if source.is_dir() else [source] for file in files: if file in {root / "engine/crates/cli/src/lib.rs", root / "engine/crates/ext/Cargo.toml"}: continue if not file.is_file() or any(part in {"__pycache__", "node_modules", "target", ".git"} for part in file.parts): continue target = destination / file.relative_to(source) if source.is_dir() else destination if target.is_file() and file.read_bytes() == target.read_bytes(): continue differing.append(str(target.relative_to(sibling))) if args.write: target.parent.mkdir(parents=True, exist_ok=True) shutil.copyfile(file, target) if differing: print("\n".join(differing)) print(f"{'Synchronized' if args.write else 'Found'} {len(differing)} differing shared files.") return 0 if args.write or not differing else 1
if __name__ == "__main__": sys.exit(main())