Files
Kabir Oberai 03fb48c30b meta: update readme and agents.md (#412)
## What does this PR do?

Updates readme & agents guidance

## How was it tested?

i read it back with mine own eyes

## AI tool usage

How much of this PR was AI-assisted? (check one)

- [x] **0** - No AI was used to write code
- [ ] **1** - I was assisted by AI. I reviewed the finished result.
- [ ] **2** - I set the AI going and left it to it; nobody has read the
result - no review, or AI review only

<!-- If an AI agent is filling this in: declare the level honestly, and
open as a draft if it is #2. Do not lower the declared level to get the
PR reviewed. -->


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **Documentation**
* Clarified how to consume xtool as a Swift Package and that CLI
stability guarantees do not apply to Swift interfaces.
* Updated Swift development conventions with dependency-injection
examples, concurrency guidance, and commit-message formatting.
* **Chores**
* Updated the pull request template to ask how much code was AI-assisted
and note that the completed work was reviewed.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-10-30 06:33:49 +00:00

1.3 KiB

About

xtool is a cross-platform replacement for Xcode (including build system, provisioning, deployment).

The xtool CLI supports macOS, Linux, WSL. The lower-level XKit (provisioning and device interaction) library additionally supports iOS.

Development

  • The majority of the code is in the Swift Package. You can use swift build / swift test / etc for iteration.
  • Caveat: on macOS, xtool is distributed as an app bundle (allows entitlements like Keychain). To build the Mac app, use make mac. You can then invoke the CLI at ./macOS/Build/xtool.
  • Make sure to run make lint (swiftlint) when you're done

Conventions

  • Use modern Swift 6. Strict concurrency is enabled.
  • Use swift-dependencies (@Dependency(\.foo) / d.foo) for Dependency Injection. Passing dependencies around as arguments is an anti-pattern.
  • Commits should be in the format subsystem: imperative description e.g. auth: support reading password from stdin.
  • Don't use Task.detached { ... }. If you need to escape isolation, you want Task { @concurrent in ... } instead.
  • Uphold API stability guarantees for consumers who use xtool via the command line interface (e.g. don't remove subcommands or config fields). However, the Swift interface (including public types) when consuming xtool itself as a Swift Package is NOT API stable; it's okay to break Swift API.