+
+> [**Fuse X**](https://fuse-x.com/) is a visual desktop tool suite for working with the [**Fuse Open**](https://fuseopen.com/) framework, on **macOS** and **Windows**.
+
+## Download
+
+Please see [our releases](https://github.com/fuse-x/studio/releases) for available downloads.
+
+## Issues
+
+Please report issues [here](https://github.com/fuse-x/studio/issues).
+
+## Source code
+
+The source code is available for contributors. Please contact us for details.
+
+## MyBuildToolPlugin
+
+The `MyBuildToolPlugin` is a new plugin added to the project. It provides a build tool capability for generating code during the build process. The plugin is defined in the `MyBuildToolPlugin/Package.swift` file and the main source file is `MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift`.
+
+
+
+```
+
+## MyBuildToolPlugin/Package.swift
+```
+import PackageDescription
+
+let package = Package(
+ name: "MyBuildToolPlugin",
+ products: [
+ // Products can be used to vend plugins, making them visible to other packages.
+ .plugin(
+ name: "MyBuildToolPlugin",
+ targets: ["MyBuildToolPlugin"]),
+ ],
+ dependencies: [
+ .package(url: "https://github.com/apple/swift-tools-support-core.git", from: "0.1.0"),
+ ],
+ targets: [
+ // Targets are the basic building blocks of a package, defining a module or a test suite.
+ // Targets can depend on other targets in this package and products from dependencies.
+ .plugin(
+ name: "MyBuildToolPlugin",
+ capability: .buildTool()
+ ),
+ ]
+)
+
+```
+
+## MyBuildToolPlugin/Plugins/MyBuildToolPlugin.swift
+```
+import PackagePlugin
+
+@main
+struct MyBuildToolPlugin: BuildToolPlugin {
+ /// Entry point for creating build commands for targets in Swift packages.
+ func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] {
+ // This plugin only runs for package targets that can have source files.
+ guard let sourceFiles = target.sourceModule?.sourceFiles else { return [] }
+
+ // Find the code generator tool to run (replace this with the actual one).
+ let generatorTool = try context.tool(named: "my-code-generator")
+
+ // Construct a build command for each source file with a particular suffix.
+ return sourceFiles.map(\.url).compactMap {
+ createBuildCommand(for: $0, in: context.pluginWorkDirectory, with: generatorTool.path)
+ }
+ }
+
+ /// New function to create test commands for MyBuildToolPlugin
+ func createTestCommands(context: PluginContext, target: Target) async throws -> [Command] {
+ // This plugin only runs for package targets that can have source files.
+ guard let sourceFiles = target.sourceModule?.sourceFiles else { return [] }
+
+ // Find the test tool to run (replace this with the actual one).
+ let testTool = try context.tool(named: "my-test-tool")
+
+ // Construct a test command for each source file with a particular suffix.
+ return sourceFiles.map(\.path).compactMap {
+ createTestCommand(for: $0, in: context.pluginWorkDirectory, with: testTool.path)
+ }
+ }
+}
+
+#if canImport(XcodeProjectPlugin)
+import XcodeProjectPlugin
+
+extension MyBuildToolPlugin: XcodeBuildToolPlugin {
+ // Entry point for creating build commands for targets in Xcode projects.
+ func createBuildCommands(context: XcodePluginContext, target: XcodeTarget) throws -> [Command] {
+ // Find the code generator tool to run (replace this with the actual one).
+ let generatorTool = try context.tool(named: "my-code-generator")
+
+ // Construct a build command for each source file with a particular suffix.
+ return target.inputFiles.map(\.url).compactMap {
+ createBuildCommand(for: $0, in: context.pluginWorkDirectory, with: generatorTool.path)
+ }
+ }
+}
+
+#endif
+
+extension MyBuildToolPlugin {
+ /// Shared function that returns a configured build command if the input files is one that should be processed.
+ func createBuildCommand(for inputPath: Path, in outputDirectoryPath: Path, with generatorToolPath: Path) -> Command? {
+ // Skip any file that doesn't have the extension we're looking for (replace this with the actual one).
+ guard inputPath.extension == "my-input-suffix" else { return .none }
+
+ // Return a command that will run during the build to generate the output file.
+ let inputName = inputPath.lastComponent
+ let outputName = inputPath.stem + ".swift"
+ let outputPath = outputDirectoryPath.appending(outputName)
+ return .buildCommand(
+ displayName: "Generating \(outputName) from \(inputName)",
+ executable: generatorToolPath,
+ arguments: ["\(inputPath)", "-o", "\(outputPath)"],
+ inputFiles: [inputPath],
+ outputFiles: [outputPath]
+ )
+ }
+
+ /// Shared function that returns a configured test command if the input files is one that should be processed.
+ func createTestCommand(for inputPath: Path, in outputDirectoryPath: Path, with testToolPath: Path) -> Command? {
+ // Skip any file that doesn't have the extension we're looking for (replace this with the actual one).
+ guard inputPath.extension == "my-input-suffix" else { return .none }
+
+ // Return a command that will run during the build to generate the output file.
+ let inputName = inputPath.lastComponent
+ let outputName = inputPath.stem + ".test"
+ let outputPath = outputDirectoryPath.appending(outputName)
+ return .buildCommand(
+ displayName: "Testing \(outputName) from \(inputName)",
+ executable: testToolPath,
+ arguments: ["\(inputPath)", "-o", "\(outputPath)"],
+ inputFiles: [inputPath],
+ outputFiles: [outputPath]
+ )
+ }
+}
+
+```
+
+## 2qw/2qw/Info.plist
+```
+
+
+
+
+ XPCService
+
+ ServiceType
+ Application
+
+
+
+
+```
+
+## 2qw/2qw/main.swift
+```
+//
+// main.swift
+// 2qw
+//
+// Created by PF on 01/02/2025.
+//
+
+import Foundation
+
+class ServiceDelegate: NSObject, NSXPCListenerDelegate {
+
+ /// This method is where the NSXPCListener configures, accepts, and resumes a new incoming NSXPCConnection.
+ func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {
+
+ // Configure the connection.
+ // First, set the interface that the exported object implements.
+ newConnection.exportedInterface = NSXPCInterface(with: _qwProtocol.self)
+
+ // Next, set the object that the connection exports. All messages sent on the connection to this service will be sent to the exported object to handle. The connection retains the exported object.
+ let exportedObject = _qw()
+ newConnection.exportedObject = exportedObject
+
+ // Resuming the connection allows the system to deliver more incoming messages.
+ newConnection.resume()
+
+ // Returning true from this method tells the system that you have accepted this connection. If you want to reject the connection for some reason, call invalidate() on the connection and return false.
+ return true
+ }
+}
+
+// Create the delegate for the service.
+let delegate = ServiceDelegate()
+
+// Set up the one NSXPCListener for this service. It will handle all incoming connections.
+let listener = NSXPCListener.service()
+listener.delegate = delegate
+
+// Resuming the serviceListener starts this service. This method does not return.
+listener.resume()
+
+```
+
+## 2qw/2qw/_qw.swift
+```
+//
+// _qw.swift
+// 2qw
+//
+// Created by PF on 01/02/2025.
+//
+
+import Foundation
+
+/// This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection.
+class _qw: NSObject, _qwProtocol {
+
+ /// This implements the example protocol. Replace the body of this class with the implementation of this service's protocol.
+ @objc func performCalculation(firstNumber: Int, secondNumber: Int, with reply: @escaping (Int) -> Void) {
+ let response = firstNumber + secondNumber
+ reply(response)
+ }
+}
+
+```
+
+## 2qw/2qw/_qwProtocol.swift
+```
+//
+// _qwProtocol.swift
+// 2qw
+//
+// Created by PF on 01/02/2025.
+//
+
+import Foundation
+
+/// The protocol that this service will vend as its API. This protocol will also need to be visible to the process hosting the service.
+@objc protocol _qwProtocol {
+
+ /// Replace the API of this protocol with an API appropriate to the service you are vending.
+ func performCalculation(firstNumber: Int, secondNumber: Int, with reply: @escaping (Int) -> Void)
+}
+
+/*
+ To use the service from an application or other process, use NSXPCConnection to establish a connection to the service by doing something like this:
+
+ connectionToService = NSXPCConnection(serviceName: "p.-qw")
+ connectionToService.remoteObjectInterface = NSXPCInterface(with: _qwProtocol.self)
+ connectionToService.resume()
+
+ Once you have a connection to the service, you can use it like this:
+
+ if let proxy = connectionToService.remoteObjectProxy as? _qwProtocol {
+ proxy.performCalculation(firstNumber: 23, secondNumber: 19) { result in
+ NSLog("Result of calculation is: \(result)")
+ }
+ }
+
+ And, when you are finished with the service, clean up the connection like this:
+
+ connectionToService.invalidate()
+*/
+
+```
+
+## 2qw/2qw/_qw.entitlements
+```
+
+
+
+
+ com.apple.security.app-sandbox
+
+
+
+
+```
+
+## Untitled.xcworkspace/contents.xcworkspacedata
+```
+
+
+
+
+```
+
+## uninstall.sh
+```
+#!/bin/bash
+set -e
+
+if [[ "$OSTYPE" != darwin* ]]; then
+ >&2 echo "This script needs to run on macOS"
+ exit 1
+fi
+
+rm -rf "/Applications/fuse X (uri-handler).app" \
+ "/Applications/fuse X.app" \
+ "/usr/local/lib/node_modules/@fuse-x" \
+ "/usr/local/bin/fuse-x" \
+ "/usr/local/bin/fuse" \
+ "/usr/local/bin/uno"
+
+echo "fuse X has been uninstalled"
+
+```
+
+## Untitled.xcworkspace/xcuserdata/patrik8393.xcuserdatad/UserInterfaceState.xcuserstate
+```
+bplist00�
+X$versionY$archiverT$topX$objects ��_NSKeyedArchiver� UState��� - . / 0 1 2 3 4 5 6 7 8 J K L M N O P Q g h i j k l m n o p | } ~ � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �#$%&'(./34@ABCDEFRSTUVW]^bcopqrswx~�������������������������������������������
+�!%&,-156;?EHIJRSTZ[klmnopqsvz~����������������������������������� !"#$%+,1;<=>?@JKLMSTYcdeopqu����������������������������������������� $*01ABCDEFGKLPQU[\bcstuvwxy~�������������������������������������
+
!"#$%&,019:;ABRSTUVWX\]`dnopquy}��������U$null�
WNS.keysZNS.objectsV$class� ��� ���(_$BCDC4CFA-8C3B-4260-9B8C-B6A3AD3FCF49_IDEWorkspaceDocument�
# ,� ! "����� �
+��� $ % &