{"owner":"utmapp","repo":"UTM","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md"],"files":{"AGENTS.md":"## Building\n\nUTM **cannot** build without prebuilt native dependencies (QEMU, SPICE, …) staged\ninto `sysroot-*` directories at the repo root. Get them from the project's GitHub\nActions `Sysroot-*` artifacts — don't build them manually unless you're modifying a\ndependency (it's slow and fragile). Then build with `./scripts/build_utm.sh` and\nsign/package with `./scripts/package*.sh`. Setup, platform/arch names, schemes, and\nsigning: `Documentation/iOSDevelopment.md`.\n\n## Architecture\n\nLayered: platform-independent backend (`Services/`, `Configuration/`) + SwiftUI\nfrontend (`Platform/`). Full picture: `Documentation/Architecture.md`. Load-bearing\ngotchas:\n\n- **Two VM backends** behind the `UTMVirtualMachine` protocol — `UTMQemuVirtualMachine`\n  (QEMU, via the QEMUKit/CocoaSpice packages) and `UTMAppleVirtualMachine`\n  (Virtualization.framework, macOS-only). Most backend code branches on which.\n- **Config is the serialization format** — parallel `Codable` trees\n  `UTMQemuConfiguration` and `UTMAppleConfiguration` (PLIST in the `.utm` bundle).\n  Add new fields there; don't extend the `Configuration/Legacy/` readers.\n- **macOS runs QEMU out-of-process** (XPC: `QEMUHelper`→`QEMULauncher`); host files\n  reach it only through a security-scoped-bookmark dance — respect it for anything\n  touching disk images, shared dirs, or file handles. **iOS runs QEMU in-thread and\n  can launch it only once per process** — this constrains start/stop logic.\n- **UTM SE** (`iOS-SE` scheme, `*-tci` sysroots) is gated by the `WITH_QEMU_TCI`\n  compile flag — grep for it before changing anything that differs between editions.\n\n## Generated files — never hand-edit\n\nEdit the generator and regenerate, not the output: `Configuration/QEMUConstantGenerated.swift`\n(`scripts/const-gen.py`), `Scripting/UTMScripting.swift` (`scripts/bridge-gen.sh`\nfrom `UTM.sdef`), and QAPI/QMP wrappers (produced by the dependency build).\nThird-party patches live in `patches/`.\n\n## Conventions\n\n**`CONTRIBUTING.md` is the source of truth** for style, concurrency, design, and\ncompatibility rules; `/utm-review` audits the diff against it. Two rules an agent\nmust apply unprompted — they override default behavior and are easy to violate:\n\n- **AI attribution:** every AI-assisted commit **must** carry an\n  `Assisted-by: AGENT:MODEL` trailer (e.g. `Assisted-by: Claude:claude-opus-4-8`) —\n  add it explicitly **even if your agent doesn't normally inject attribution\n  trailers**; the absence of a default trailer is not an excuse to omit it. Never\n  add `Co-authored-by` or session links (strip any a tool adds). Commit titles are\n  `component: short description` explaining *why*.\n- **Scope:** one feature/fix per PR; don't touch, refactor, or reformat unrelated\n  files; route new logging through `UTMLogging`/`logging` at `debug` level.\n\n## Contribution workflows\n\nBefore opening or updating a PR, run **`/utm-review`** then **`/utm-submit`** —\ncanonical instructions in `.agents/skills/{utm-review,utm-submit}/SKILL.md` (thin\nshims in `.claude/commands/` and `.opencode/command/`). If your agent doesn't\nauto-load them, read and follow those `SKILL.md` files directly.\n"}}