| Tool | Version | Pinned via |
|---|---|---|
| Tuist | 4.40.0 | .mise.toml |
| SwiftFormat | 0.60.1 | .mise.toml |
| Swift PM | 6.2 | Package.swift (swift-tools-version) |
Libraries (StuffCore, WhereCore, WhereUI, WhereTesting) are defined in the root Package.swift (same pattern as Broadway: local package + Tuist for apps and test bundles).
Tuist manifests live at the repo root (Project.swift, Tuist.swift). Project.swift references Package.local(path: .relativeToRoot(".")) and declares the Where app, StuffTestHost, and unit-test targets that depend on package products.
Run ./ide (or ./ide -i to also install dependencies) to regenerate the
Xcode project, install external agent skills, and point Git at .githooks/.
Root dev scripts: ide, swiftformat (runs SwiftFormat via mise), and
sync-agents (keeps Claude Code–oriented files in sync with AGENTS.md).
- SwiftFormat uses
.swiftformat. Run./swiftformatto format the tree, or./swiftformat --lintto check only (as in CI). - The pre-commit hook (enabled by
./ideviacore.hooksPath) formats staged*.swiftfiles in place and re-stages them.
AGENTS.md is the source of truth for AI agent instructions. Cursor reads
AGENTS.md natively; Claude Code uses CLAUDE.md and .claude/skills/.
Generated files (CLAUDE.md, .claude/skills/) are gitignored and produced
by ./sync-agents.
./sync-agents— generateCLAUDE.mdnext to eachAGENTS.mdand mirror.agents/skills/into.claude/skills/../sync-agents --install— fetch external skills listed in.agents/external-skills.json(run automatically by./ide)../sync-agents --add <url> [name]— add an external skill from GitHub../sync-agents --update— re-fetch all external skills to the latest commit.
- Package products (
Package.swift) — StuffCore (Shared/StuffCore/Sources/), WhereCore / WhereUI / WhereTesting underWhere/. - Tuist targets (
Project.swift) — Where app (Where/Where/), StuffTestHost (Shared/StuffTestHost/), WhereTests (app tests, no host), and hosted *Tests bundles (StuffCoreTests, WhereCoreTests, WhereUITests) that depend on StuffTestHost + WhereTesting + the relevant package product. - Add SPM library targets in
Package.swiftand wire apps/tests inProject.swift(see existingunitTestshelper).
| Platform | Minimum OS |
|---|---|
| iPhone, iPad, Mac Catalyst | iOS 26.0 |
| macOS (native) | macOS 26.0 |
Shared code and the shared iOS test host live under Shared/. Feature apps and their modules (e.g. Where) live under a top-level folder per feature (e.g. Where/).
Shared/<TargetName>/
Sources/ – production code
Tests/ – unit tests (Swift Testing, not XCTest)
<Feature>/<TargetName>/
Sources/
Tests/
Resources/ – asset catalogs, etc. (apps only)
- Swift Testing (
import Testing) for all unit tests – do not use XCTest. - Generated
.xcodeprojandDerived/are git-ignored; never commit them. - Bundle IDs follow
com.stuff.<suffix>.
Implementation plans go in Plans/ and are named
<NNN>-<YYYY-MM-DD>-<slug>.md.