MobileBuildMCP
AGENTS.md6.5k starsChanged 39 days agoMITView on GitHub
We split this AGENTS.md into the rules it gives an agent
35 rules. About 0 are common, 22 are distinctive, and 13 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈22
Distinctive · estimate
This author's own choices. Worth a look.
13
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 28
Create a branch from main
- Distinctive: line 30
Run the pre-commit checklist before committing:
- Very specific: line 38
Update CHANGELOG.md under ## [Unreleased]
- Distinctive: line 39
Update documentation if adding or modifying features
- Distinctive: line 46
Check node_modules for external API type definitions instead of guessing
- Distinctive: line 48
NEVER remove or downgrade code to fix type errors from outdated dependencies.
- Distinctive: line 49
Always ask before removing functionality or code that appears to be intentional
- Distinctive: line 52
Verify standard quality commands include every changed path and exercise exact entry points and argument variants.
- Very specific: line 58
No barrel imports from utils/index - import from specific submodules (e.g., src/utils/execution/index.ts, src/utils/logging/index.ts)
- Very specific: line 74
Use vi.mock/vi.hoisted for isolation.
- Distinctive: line 86
NEVER commit unless user asks
- Distinctive: line 90
Always read all comments on the issue -
- Very specific: line 95
When working on skill sources in skills/, use the skill-creator skill workflow.
- Very specific: line 96
After modifying any skill source, run npx skill-check <skill-directory> and address all errors/warnings before handoff.
- Very specific: line 97
Before handoff, run the matching manual Warden review for high-risk changes: runtime/CLI/daemon boundaries → …
- Distinctive: line 102
Use workspace-key scoped directories for workspace-owned state.
- Very specific: line 103
Do not store runtime state under ~/.mobilebuildmcp.
- Distinctive: line 104
Use shared lock and atomic-write helpers for mutable shared files.
- Distinctive: line 105
Prefer one-record-per-file registries over shared aggregate files.
- Distinctive: line 109
Keep runtime/session-scoped handles isolated unless the product explicitly defines a cross-process contract.
- Distinctive: line 116
Keep answers short and concise
- Distinctive: line 117
No emojis in commits, issues, PR comments, or code
- Distinctive: line 118
No fluff or cheerful filler text
- Distinctive: line 122
Do not commit transient investigation notes, prompt exports, or scratch analysis docs after the work is complete.
- Distinctive: line 123
If an investigation leaves unresolved follow-up work, move it to a GitHub issue instead of preserving the transient doc in the branch.
- Very specific: line 130
Use these sections under ## [Unreleased]:
- Very specific: line 137
Before adding entries, read the full [Unreleased] section to see which subsections already exist
- Very specific: line 140
NEVER modify already-released version sections (e.g., ## [0.12.2])
- Distinctive: line 142
NEVER update snapshot fixtures unless asked to do so, these are integration tests, on failure assume code is wrong before questioning the …
- Very specific: line 151
When running long test suites (snapshot tests, smoke tests), ALWAYS write full output to a log file and read it afterwards.
- Distinctive: line 153
If you need a summary, read the log file and grep/filter it — the full output is always preserved.
- Very specific: line 156
Do NOT just kill the run — first inspect the process tree (ps -ef | grep -E "vitest|xcodebuild|simctl|devicectl") to identify what's stuck.
- Very specific: line 159
If physical-device snapshot tests hang after the final test summary, the likely cause is Apple post-failure diagnostics invoking devicectl …
- Distinctive: line 160
When asked to review changes or test failures, focus on regressions: behavior changes caused by the branch.
- Distinctive: line 163
NEVER use sed/cat to read a file or a range of a file.
≈ “Common” is an estimate: at least 1 in 5 of the 36,368 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Development Rules
Build & Test
npm run build- Build (wireit + tsup, ESM)npm run test- Unit/integration tests (Vitest)npm run test:smoke- Smoke tests (builds first, serial execution)npm run lint/npm run lint:fix- ESLintnpm run format/npm run format:check- Prettiernpm run typecheck- TypeScript type checking (src + test config)
Architecture
ESM TypeScript project (type: module). Key layers:
src/cli/- CLI entrypoint, yargs wiring, daemon routingsrc/server/- MCP stdio server, lifecycle, workflow/resource registrationsrc/runtime/- Config bootstrap, session state, tool catalog assemblysrc/core/manifest/- YAML manifest loading, validation, tool module importssrc/mcp/tools/- Tool implementations grouped by workflow (mirrorsmanifests/workflows/)src/mcp/resources/- MCP resource implementationssrc/integrations/- External integrations (Xcode tools bridge)src/utils/- Shared helpers (execution, logging, validation, responses)src/visibility/- Tool/workflow exposure predicatessrc/daemon/- Background daemon for persistent sessionssrc/rendering/- Output rendering and formattingsrc/types/- Shared type definitions
Contributing Workflow
- Create a branch from
main - Make changes following the conventions in this file
- Run the pre-commit checklist before committing:
npm run lint:fix npm run typecheck npm run format npm run build npm test - Update
CHANGELOG.mdunder## [Unreleased] - Update documentation if adding or modifying features
- Clone and test against example projects (e.g.,
XcodeBuildMCP-iOS-Template) when changes affect runtime behavior - Push and create a pull request with a clear description
- Link any related issues
Code Quality
- No
anytypes unless absolutely necessary - Check node_modules for external API type definitions instead of guessing
- NEVER use inline imports - no
await import("./foo.js"), noimport("pkg").Typein type positions, no dynamic imports for types. Always use standard top-level imports. - NEVER remove or downgrade code to fix type errors from outdated dependencies; upgrade the dependency instead
- Always ask before removing functionality or code that appears to be intentional
- Do not add fallback behavior by default. If required context, configuration, runtime state, or dependencies are missing, fail loudly and fix the caller/setup instead of silently switching to an alternate path. Add a fallback only when explicitly requested or when it is a documented product requirement.
- Review the complete merge-base diff and trace changed or reused helper contracts, including error and sentinel returns, through callers, consumers, tests, and operational configuration.
- Verify standard quality commands include every changed path and exercise exact entry points and argument variants; validate explicitly when they do not.
- For asynchronous, workflow, or process-boundary changes, enumerate lifecycle states, retries, supersession, and race transitions; test terminal outcomes and missing or optional metadata.
Import Conventions
- ESM with explicit
.tsextensions insrc/(tsup rewrites to.jsat build) - No
.jsimports insrc/(enforced by ESLint) - No barrel imports from
utils/index- import from specific submodules (e.g.,src/utils/execution/index.ts,src/utils/logging/index.ts)
Rendering and Streaming Contract
- Streaming fragments are transient live-progress output only. They may be displayed while a tool is running, but MUST NOT provide final settled MCP/JSON/CLI text.
- Final settled output MUST render from the final structured/domain result and next-step metadata. If final output needs data, add it to the final result type instead of reading it from fragments.
- Streaming-capable renderers may observe fragment callbacks only for live progress. Fragment handling must not affect final structured output or final settled text.
Error Handling
- Structured errors (domain results with
didError) are for domain errors only: failures in the user's build/test/device/simulator workflow (compile errors, test failures, missing destinations, etc.). - System errors with the MCP server or CLI itself (invalid internal state, unresolvable configuration, infrastructure failures) must NOT be wrapped in structured domain results — let them surface as runtime tool errors so they are clearly distinguishable from workflow outcomes.
Test Conventions
- Vitest with colocated
__tests__/directories using*.test.ts - Snapshot tests (
*.snapshot.test.ts) must only assert generated tool output against fixtures. Move helper, parser, schema, setup, or behavior assertions to non-snapshot unit/integration tests. - Smoke tests in
src/smoke-tests/__tests__/(separate Vitest config, serial execution) - Use
vi.mock/vi.hoistedfor isolation; inject executors and mock file systems - MCP integration tests use
McpServer,InMemoryTransport, andClient - External dependencies (command execution, file system) must use dependency injection via
createMockExecutor()/createMockFileSystemExecutor()fromsrc/test-utils/
Tool Development
- Tool manifests in
manifests/tools/*.yamldefineid,module,names.mcp(snake_case), optionalnames.cli(kebab-case), predicates, and annotations - MCP
readOnlyHintdescribes whether a tool mutates host/project state such as files, build artifacts, configuration, or external services. Simulator HID/UI actions that only tap, type, press, or gesture inside the simulator may remainreadOnlyHint: true; do not flip them tofalsemerely because app UI state changes. - Workflow manifests in
manifests/workflows/*.yamlgroup tools and define exposure rules - Tool modules export a Zod
schema, a pure*Logicfunction, and ahandlerbuilt withcreateTypedToolorcreateSessionAwareTool - Resource modules export a
handler(and a pure*Logicfunction);uri,name,description, andmimeTypeare declared inmanifests/resources/*.yaml
Commands
- NEVER commit unless user asks
GitHub
When reading issues:
- Always read all comments on the issue
Tools
- GitHub CLI for issues/PRs
- CLI design note: do not rely on CLI session-default writes. CLI is intentionally deterministic for CI/scripting and should use explicit command arguments as the primary input surface.
- When working on skill sources in
skills/, use theskill-creatorskill workflow. - After modifying any skill source, run
npx skill-check <skill-directory>and address all errors/warnings before handoff. - Before handoff, run the matching manual Warden review for high-risk changes: runtime/CLI/daemon boundaries →
mobilebuildmcp-runtime-boundary-review; test infrastructure or harnesses →mobilebuildmcp-test-boundary-review; tool manifests, schemas, or contracts →mobilebuildmcp-tool-contract-review. Invoke only applicable skills withwarden --skill <name>.
Multi-process filesystem state
- MobileBuildMCP explicitly supports multiple concurrent MCP server, daemon, CLI, test, and helper processes for the same or different workspaces.
- Shared filesystem state under
~/Library/Developer/MobileBuildMCPmust be multi-process safe. - Use workspace-key scoped directories for workspace-owned state.
- Do not store runtime state under
~/.mobilebuildmcp;.mobilebuildmcp/config.yamlis only project configuration. - Use shared lock and atomic-write helpers for mutable shared files.
- Prefer one-record-per-file registries over shared aggregate files.
- Cleanup must verify ownership before deleting shared artifacts.
- Multi-process safety means concurrent processes must not corrupt or delete each other's state. It does not mean ephemeral runtime handles should become portable between invocation surfaces.
- Keep runtime/session-scoped handles isolated unless the product explicitly defines a cross-process
contract. For example, UI automation
elementRefvalues from runtime snapshots are handles for the runtime/session that produced them, not durable IDs to share between separate MCP and CLI invocations. - User-facing artifact/log paths in final text or structured output must use
displayPath()fromsrc/utils/build-preflight.ts, so paths are cwd-relative when possible or~/...instead of absolute home paths. Keep stored files at their real absolute paths; only normalize response/display values.
Style
- Keep answers short and concise
- No emojis in commits, issues, PR comments, or code
- No fluff or cheerful filler text
- Technical prose only, be kind but direct (e.g., "Thanks @user" not "Thanks so much @user!")
Docs
- Do not commit transient investigation notes, prompt exports, or scratch analysis docs after the work is complete.
- If an investigation leaves unresolved follow-up work, move it to a GitHub issue instead of preserving the transient doc in the branch.
- Structured output JSON schemas are auto-published to the website/public schema mirror when merged; do not manually update public schema copies unless explicitly asked.
Changelog
Location: CHANGELOG.md
Format
Use these sections under ## [Unreleased]:
### Added- New features### Changed- Changes to existing functionality### Fixed- Bug fixes### Removed- Removed features
Rules
- Before adding entries, read the full
[Unreleased]section to see which subsections already exist - New entries ALWAYS go under
## [Unreleased]section - Append to existing subsections (e.g.,
### Fixed), do not create duplicates - NEVER modify already-released version sections (e.g.,
## [0.12.2]) - Each version section is immutable once released
- NEVER update snapshot fixtures unless asked to do so, these are integration tests, on failure assume code is wrong before questioning the fixture
Attribution
- Internal changes (from issues):
Fixed foo bar ([#123](https://github.com/getsentry/MobileBuildMCP/issues/123)) - External contributions:
Added feature X ([#456](https://github.com/getsentry/MobileBuildMCP/pull/456) by [@username](https://github.com/username))
Test Execution Rules
- NEVER run the snapshot or smoke test suites without explicit user permission. They are expensive (~7 min baseline, spawn real
xcodebuild/simctl/devicectlprocesses and can wedge). This coversnpm run test:snapshot,npm run test:smoke, and any directvitest run --config vitest.snapshot.config.ts/vitest.smoke.config.tsinvocation. Ask first, then run only if the user agrees. - The default unit suite (
npm test/vitest run),npm run typecheck,npm run lint, andnpm run buildare cheap and may be run freely without asking. - When running long test suites (snapshot tests, smoke tests), ALWAYS write full output to a log file and read it afterwards. NEVER pipe through
tailorgrepdirectly — that loses output you may need to debug failures. - Pattern:
DEVICE_ID=... npm run test:snapshot 2>&1 | tee /tmp/snapshot-results.txtthen read/tmp/snapshot-results.txtwith the native read tool. - If you need a summary, read the log file and grep/filter it — the full output is always preserved.
- Snapshot test command:
DEVICE_ID=<YOUR_DEVICE_ID> npm run test:snapshot - Snapshot suite expected duration: ~7 min baseline (measured at 423s). Anything longer than ~10 min should be treated as a likely hang, not a slow run.
- Do NOT just kill the run — first inspect the process tree (
ps -ef | grep -E "vitest|xcodebuild|simctl|devicectl") to identify what's stuck. - Common hang causes: locked physical device, stale simulator state,
devicectl diagnosewaiting for password, orphaned daemon process. - Capture what you find before killing, so the root cause can be fixed rather than papered over.
- Do NOT just kill the run — first inspect the process tree (
- If physical-device snapshot tests hang after the final test summary, the likely cause is Apple post-failure diagnostics invoking
devicectl diagnose, which may prompt for a macOS password and wedge in automated runs. - When asked to review changes or test failures, focus on regressions: behavior changes caused by the branch. Do not treat known/acceptable test flakes, environment setup issues, or nondeterministic tool output churn as regressions unless explicitly asked to investigate them.
CRITICAL Tool Usage Rules CRITICAL
- NEVER use sed/cat to read a file or a range of a file. Always use the native read tool.
- You MUST read every file you modify in full before editing.
Trending
More talk lately.thin dataabout the whole repository
Who's talking about getsentry/MobileBuildMCP
- Dawn-Technology/aicelerate“AIMate iOS - Plugins”GitHub · Oct 29, 2026
- sudosubin/agents.nix“agent-skills.github.getsentry.mobilebuildmcp: init at 2.7.1”GitHub · Oct 3, 2026
- ProSkillsMD/proskills“[Candidate] getsentry/mobilebuildmcp/.agents/skills/mobilebuildmcp-packaging-resource-review - …”GitHub · Oct 3, 2026
- ProSkillsMD/proskills“[Candidate] getsentry/mobilebuildmcp/.agents/skills/mobilebuildmcp-docs-release-review - …”GitHub · Oct 3, 2026
- ProSkillsMD/proskills“[Candidate] getsentry/mobilebuildmcp/.agents/skills/mobilebuildmcp-docs-command-review - …”GitHub · Oct 3, 2026
The biggest 5 of 7 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 7
Talked about on GitHub (7 times).
On GitHub · 7
- Oct 29, 2026AIMate iOS - Plugins — Dawn-Technology/aicelerate0 reactions
- Oct 3, 2026agent-skills.github.getsentry.mobilebuildmcp: init at 2.7.1 — sudosubin/agents.nix0 reactions
- Oct 3, 2026[Candidate] getsentry/mobilebuildmcp/.agents/skills/mobilebuildmcp-packaging-resource-review - mobilebuildmcp-packaging-resource-review — ProSkillsMD/proskills0 reactions · 1 comment
- Oct 3, 2026[Candidate] getsentry/mobilebuildmcp/.agents/skills/mobilebuildmcp-docs-release-review - mobilebuildmcp-docs-release-review — ProSkillsMD/proskills0 reactions · 1 comment
- Oct 3, 2026[Candidate] getsentry/mobilebuildmcp/.agents/skills/mobilebuildmcp-docs-command-review - mobilebuildmcp-docs-command-review — ProSkillsMD/proskills0 reactions · 1 comment
2 more on GitHub
- Sep 25, 2026Fix 56 drifted catalog URLs from the staleness sweep — assafbar2/agentswitchboard.dev0 reactions · 1 comment
- Sep 25, 2026feat(mobilebuild-mcp): MobileBuildMCP (formerly XcodeBuildMCP), pinned at 2.7.1, Sentry off — forgeprint/forgeprint0 reactions
Other versions2 projects use a version of this.
Word for word · 2
- getsentry/XcodeBuildMCP★ 6.5k100% same
- cameroncooke/XcodeBuildMCP★ 6.5k100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 28,693 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository17 other files it gives its agents.
- example_projects/iOS_Calculator/AGENTS.mdAGENTS.md
- example_projects/Weather/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- example_projects/iOS/.cursor/rules/errors.mdcCursor rule
- mobilebuildmcp-docs-command-reviewSkill
- mobilebuildmcp-docs-release-reviewSkill
- mobilebuildmcp-packaging-resource-reviewSkill
- mobilebuildmcp-rendering-streaming-reviewSkill
- mobilebuildmcp-runtime-boundary-reviewSkill
- mobilebuildmcp-snapshot-fixture-reviewSkill
- mobilebuildmcp-structured-output-reviewSkill
- mobilebuildmcp-test-boundary-reviewSkill
- mobilebuildmcp-tool-contract-reviewSkill
- wardenSkill
- warden-sweepSkill
- mobilebuildmcp-cliSkill
- mobilebuildmcpSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

