Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
git clone --depth 1 https://github.com/moasq/ios-dev-agentWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/rules/moasq/ios-dev-agent/components)<a href="https://agentmods.dev/rules/moasq/ios-dev-agent/components"><img src="https://agentmods.dev/badge/rules/moasq/ios-dev-agent/components/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/rules/moasq/ios-dev-agent/components"><img src="https://agentmods.dev/badge/rules/moasq/ios-dev-agent/components.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.01141 | $0.01141 |
| Opus 5 | $0.00571 | $0.00571 |
| Sonnet 5 | $0.00228 | $0.00228 |
| Haiku 4.5 | $0.00114 | $0.00114 |
Grade A, and why
components scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 117 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Component Patterns
FULL-WIDTH CONTAINERS — REQUIRED:
- All cards, insight boxes, and content containers MUST use
.frame(maxWidth: .infinity)to fill their parent - VStack with
.alignment: .leadingstill needs.frame(maxWidth: .infinity, alignment: .leading)for full width - Never let a card or container shrink to fit its content — it must stretch to the parent width
- Use real asset images (from Assets.xcassets) when available — never use generic SF Symbols for content that has a custom asset (e.g., use head location images, severity faces, etc.)
BUTTON HIERARCHY (one primary per screen/section):
| Level | Style | Use Case | Code |
|---|---|---|---|
| Primary | .borderedProminent | Main action (Save, Submit, Start) | .buttonStyle(.borderedProminent).controlSize(.large) |
| Secondary | .bordered | Alternative action (Cancel, Edit) | .buttonStyle(.bordered) |
| Tertiary | .borderless | Low-emphasis (Skip, Learn More) | .buttonStyle(.borderless) |
| Destructive | .borderedProminent | Delete, Remove | .buttonStyle(.borderedProminent).tint(.red) |
- ONE .borderedProminent per screen/section — multiple primaries confuse the user.
- Full-width primary: .controlSize(.large).frame(maxWidth: .infinity).
- ALWAYS use Button() — never .onTapGesture for actions.
- Disabled buttons: .disabled(condition) — SwiftUI auto-handles opacity.
CARD DESIGN PATTERN:
VStack(alignment: .leading, spacing: AppTheme.Spacing.xSmall) {
HStack {
Image(systemName: "icon.name")
.font(AppTheme.Fonts.title3)
.foregroundStyle(AppTheme.Colors.primary)
Spacer()
Text("metadata")
.font(AppTheme.Fonts.caption)
.foregroundStyle(.secondary)
}
Text("Title")
.font(AppTheme.Fonts.headline)
Text("Description text goes here")
.font(AppTheme.Fonts.subheadline)
.foregroundStyle(.secondary)
}
.padding(AppTheme.Spacing.medium)
.background(AppTheme.Colors.surface)
.clipShape(RoundedRectangle(cornerRadius: AppTheme.Style.cornerRadius))
.shadow(color: .black.opacity(0.06), radius: 8, y: 4)
INPUT FIELD STATES:
- Normal: TextField with .textFieldStyle(.roundedBorder).
- Focused: @FocusState with visual highlight (border color change or underline).
- Error: red border + error message below field.
TextField("Email", text: $email)
.textFieldStyle(.roundedBorder)
.overlay(
RoundedRectangle(cornerRadius: 8)
.stroke(emailError != nil ? .red : .clear, lineWidth: 1)
)
if let error = emailError {
Text(error)
.font(AppTheme.Fonts.caption)
.foregroundStyle(AppTheme.Colors.error)
}
- Disabled: .disabled(true) — auto grays out.
- Form grouping: use Form or GroupBox for related fields.
LOADING STATES:
| Pattern | Use Case | Code |
|---|---|---|
| Inline spinner | Button action, single item | ProgressView().controlSize(.small) |
| Full-screen | Initial data load | ProgressView("Loading...") |
| Pull-to-refresh | List refresh | .refreshable { await refresh() } |
| Skeleton | Content placeholder | .redacted(reason: .placeholder) |
| Overlay | Blocking operation | .overlay { if loading { ProgressView() } } |
- Disable the triggering button while loading to prevent double-taps.
- Show loading for operations > 300ms. Instant operations need no indicator.
BADGE/CHIP PATTERN:
Text("Label")
.font(AppTheme.Fonts.caption)
.fontWeight(.medium)
.padding(.horizontal, 8)
.padding(.vertical, 4)
.background(AppTheme.Colors.primary.opacity(0.15))
.foregroundStyle(AppTheme.Colors.primary)
.clipShape(Capsule())
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 5d ago First seen · 117 lines · 1,141 tokens per session scan A ce1f1bb8d5d0
components is a cursor rule published in the GitHub repository moasq/ios-dev-agent (4 stars, last pushed 3mo ago), licensed MIT. It adds 1,141 tokens to every session, about $0.0057 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-03.
Other cursor rules, from other repositories
ios-ui-development-focus
UI/UX and SwiftUI best practices - HIG compliance, presentation APIs, layout patterns.
swiftui-accessibility
SwiftUI accessibility rules for VoiceOver — labels, hints, traits, values, and attribute preservation.
apple-design
Apple Human Interface Guidelines (HIG) design and development standards for iOS, macOS, and visionOS. / TR: iOS, macOS ve visionOS için Apple Human Interface Guidelines (İnsan Arayüzü Yönergeleri) tabanlı uygulama tasarımı ve geliştirme becerisi.
figma-ios-codegen-workflow
Figma → iOS UIKit codegen workflow. Apply when the user mentions figma / figma.com and wants to convert or generate Swift/UIKit code. Enforces: data package first (preload CLI), bindings maps, full node coverage, audit.json, then coverage + screenshot verification. Do NOT load for unrelated tasks.
flutter-taste
High-end Flutter UI design rules — anti-slop, bento grids, glassmorphism, parametric dials. Apply when writing or restyling Flutter widgets.
android-compose-accessibility
Make Compose interfaces accessible with semantics, announcements, contrast, focus order, and adaptive touch targets.