import Foundation import PackagePlugin @main struct VersionPlugin: BuildToolPlugin { func createBuildCommands(context: PluginContext, target _: Target) async throws -> [Command] { let outputPath = context.pluginWorkDirectory.appending("Version.swift") return [ .buildCommand( displayName: "Generate Version.swift", executable: .init("/usr/bin/env"), arguments: [ "swift", "-e", """ import Foundation func getVersion() -> String { // Priority 1: Environment variable (CI) if let envVersion = ProcessInfo.processInfo.environment["AXE_VERSION"] { return envVersion } // Priority 2: Git describe (local development) let gitProcess = Process() gitProcess.executableURL = URL(fileURLWithPath: "/usr/bin/git") gitProcess.arguments = ["describe", "--tags", "--always", "--dirty"] let pipe = Pipe() gitProcess.standardOutput = pipe gitProcess.standardError = Pipe() do { try gitProcess.run() gitProcess.waitUntilExit() if gitProcess.terminationStatus == 0 { let data = pipe.fileHandleForReading.readDataToEndOfFile() if let version = String(data: data, encoding: .utf8)?.trimmingCharacters(in: .whitespacesAndNewlines) { return version.isEmpty ? "dev" : version } } } catch { // Git command failed } // Priority 3: Fallback return "dev" } let version = getVersion() let content = "// Auto-generated by VersionPlugin\\nlet VERSION = \\"\\(version)\\"" try content.write(toFile: "\\(CommandLine.arguments[1])", atomically: true, encoding: .utf8) """, outputPath.string, ], environment: [:], inputFiles: [], outputFiles: [outputPath] ), ] } }