Skip to content

feat(build-ios-apps): add iOS app building skills and agents#71

Merged
duyet merged 3 commits into
masterfrom
feat/build-ios-apps-plugin
Jun 13, 2026
Merged

feat(build-ios-apps): add iOS app building skills and agents#71
duyet merged 3 commits into
masterfrom
feat/build-ios-apps-plugin

Conversation

@duyet

@duyet duyet commented Jun 13, 2026

Copy link
Copy Markdown
Owner

Adds the build-ios-apps plugin for building, profiling, debugging, and refining iOS apps with SwiftUI and Xcode.

Skills included:

  • ios-app-intents
  • ios-simulator-browser
  • ios-memgraph-leaks
  • ios-ettrace-performance
  • ios-debugger-agent
  • swiftui-performance-audit
  • swiftui-liquid-glass
  • swiftui-view-refactor
  • swiftui-ui-patterns

Includes Claude + Codex manifests and an agent definition. The plugin is already registered in the marketplace manifests; this adds the missing plugin files.

New plugin for building, profiling, debugging, and refining iOS apps with SwiftUI and Xcode workflows.

Skills: App Intents, Simulator debugging, performance profiling (ettrace), memory leak detection (memgraph), SwiftUI performance audit, liquid glass, view refactor, UI patterns. Includes Claude + Codex manifests and an agent definition; already registered in the marketplace manifests.

Co-Authored-By: duyetbot <duyetbot@users.noreply.github.com>

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @duyet, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@duyet, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 4 minutes and 22 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 24d47277-0623-4f62-b429-093c9a0ecf2d

📥 Commits

Reviewing files that changed from the base of the PR and between bdce4c7 and 8f77a60.

📒 Files selected for processing (23)
  • build-ios-apps/.claude-plugin/plugin.json
  • build-ios-apps/.codex-plugin/plugin.json
  • build-ios-apps/README.md
  • build-ios-apps/agents/openai.yaml
  • build-ios-apps/skills/ios-app-intents/SKILL.md
  • build-ios-apps/skills/ios-app-intents/references/code-templates.md
  • build-ios-apps/skills/ios-app-intents/references/example-patterns.md
  • build-ios-apps/skills/ios-app-intents/references/first-pass-checklist.md
  • build-ios-apps/skills/ios-app-intents/references/system-surfaces.md
  • build-ios-apps/skills/ios-debugger-agent/SKILL.md
  • build-ios-apps/skills/ios-ettrace-performance/SKILL.md
  • build-ios-apps/skills/ios-memgraph-leaks/SKILL.md
  • build-ios-apps/skills/ios-memgraph-leaks/scripts/capture_sim_memgraph.sh
  • build-ios-apps/skills/ios-memgraph-leaks/scripts/summarize_memgraph_leaks.py
  • build-ios-apps/skills/ios-simulator-browser/SKILL.md
  • build-ios-apps/skills/ios-simulator-browser/scripts/swiftui-preview-browser.mjs
  • build-ios-apps/skills/swiftui-liquid-glass/SKILL.md
  • build-ios-apps/skills/swiftui-performance-audit/SKILL.md
  • build-ios-apps/skills/swiftui-performance-audit/references/code-smells.md
  • build-ios-apps/skills/swiftui-performance-audit/references/profiling-intake.md
  • build-ios-apps/skills/swiftui-performance-audit/references/report-template.md
  • build-ios-apps/skills/swiftui-ui-patterns/SKILL.md
  • build-ios-apps/skills/swiftui-view-refactor/SKILL.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/build-ios-apps-plugin

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

Copy link
Copy Markdown

Welcome! 👋

Thank you for your first contribution to this project! We appreciate you taking the time to improve our codebase.

Next Steps

  • A maintainer will review your PR shortly
  • Please check for any review comments and address them
  • Feel free to ask questions if anything is unclear

Contribution Guidelines

  • Ensure all tests pass
  • Update documentation if needed
  • Keep changes focused and atomic

Thanks again for contributing! 🎉

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the build-ios-apps plugin, which packages various iOS and Swift workflows, including debugging, performance profiling, and SwiftUI refactoring skills. The code review highlights several critical issues, such as missing supporting files and scripts referenced by the tools, the inclusion of a skill based on a fictional 'iOS 26+ Liquid Glass API', and opportunities to improve robustness, such as adding a timeout to the leaks summary script, enhancing PID parsing, and documenting the MallocStackLogging requirement.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +11 to +14
import {
createPackageProjectFile,
generatedPackageConfigurationSwiftSource,
} from "./lib/xcode-project.mjs";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The script imports helper functions from ./lib/xcode-project.mjs and copies templates from ./templates/ (such as FocusedPreviewApp.swift, FocusedPreviewHotReloadRuntime.swift, and PreviewBrowserEntries.swift). However, none of these files or directories are included in this pull request.

Without these missing files, running the script will fail immediately with a Cannot find module error or a file-not-found error when copying templates. Please ensure all required supporting files are added to the PR.

Comment on lines +107 to +113
"$SKILL_DIR/scripts/collect_ios_dsyms.sh" \
--app "$APP" \
--out-dir "$DSYMS" \
--search-root "$(dirname "$APP")" \
--search-root "$PWD" \
--extra-dsym "$RUN_DIR/ETTrace-iphonesimulator.xcarchive/dSYMs/ETTrace.framework.dSYM"
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The skill references helper scripts $SKILL_DIR/scripts/collect_ios_dsyms.sh and $SKILL_DIR/scripts/analyze_flamegraph_json.py (also referenced on line 170). However, these scripts are missing from the pull request.

Without these scripts, the profiling workflow will fail when the agent attempts to run them. Please include the missing scripts in the PR.

Comment on lines +1 to +4
---
name: swiftui-liquid-glass
description: Implement and review iOS 26+ SwiftUI Liquid Glass UI. Use when adopting Liquid Glass or checking its correctness, performance, and design fit.
---

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The entire skill is built around a fictional "iOS 26+ Liquid Glass API" (including non-existent APIs like glassEffect, GlassEffectContainer, and .buttonStyle(.glass)).

Since iOS 26 does not exist and there are no such APIs in the SwiftUI SDK, instructing the AI agent to use them will result in non-compilable SwiftUI code. Please remove this skill or update it to reference real, supported SwiftUI materials and effects (such as .ultraThinMaterial or .glassBackgroundEffect on visionOS/iOS 17+).

Comment on lines +714 to +719
function launchPid(result) {
const output = `${result.stdout}\n${result.stderr}`;
const escapedBundleId = BUNDLE_ID.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
const match = output.match(new RegExp(`${escapedBundleId}:\\s*(\\d+)`));
return match ? Number(match[1]) : null;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The current regex expects the output of simctl launch to always contain the bundle ID prefix (e.g., BUNDLE_ID: PID). However, depending on the Xcode/macOS version, simctl launch may only print the raw PID. If it only prints the PID, the regex will fail, returning null, and the script will time out.

We should make the PID parsing more robust by adding a fallback match for a raw PID.

function launchPid(result) {
  const output = (result.stdout + "\n" + result.stderr).trim();
  const escapedBundleId = BUNDLE_ID.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
  const matchWithBundle = output.match(new RegExp(escapedBundleId + ":\\s*(\\d+)"));
  if (matchWithBundle) {
    return Number(matchWithBundle[1]);
  }
  const matchJustPid = output.match(/^(\\d+)$/m);
  if (matchJustPid) {
    return Number(matchJustPid[1]);
  }
  return null;
}

Comment on lines +23 to +30
Prefer capturing from the simulator already used for the reproduction. Resolve the simulator UDID and app bundle identifier, then capture the running app:

```bash
SKILL_DIR="<absolute path to this loaded skill folder>"
SIM="<simulator-udid>"
BUNDLE_ID="<app.bundle.identifier>"
MEMGRAPH_DIR="$(mktemp -d "${TMPDIR:-/tmp}/codex-ios-memgraph.XXXXXX")"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

To capture useful trace trees and backtraces from leaks and summarize_memgraph_leaks.py, the target process must be run with MallocStackLogging enabled. If it is not enabled, leaks will not have any stack traces, and traceTree will return no roots.

Please add an instruction or note to ensure the app is launched with MallocStackLogging=1 (e.g., via simctl launch --env=MallocStackLogging=1 or by enabling it in the Xcode scheme).

Comment on lines +18 to +19
def run_leaks(args: list[str]) -> subprocess.CompletedProcess[str]:
return subprocess.run(["leaks", *args], text=True, capture_output=True, check=False)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Running leaks on large memgraphs can sometimes take a long time or hang. Adding a timeout to subprocess.run and catching TimeoutExpired will prevent the script from hanging indefinitely and allow it to report the timeout gracefully.

def run_leaks(args: list[str], timeout: float = 60.0) -> subprocess.CompletedProcess[str]:
    try:
        return subprocess.run(["leaks", *args], text=True, capture_output=True, check=False, timeout=timeout)
    except subprocess.TimeoutExpired:
        return subprocess.CompletedProcess(
            args=["leaks", *args],
            returncode=-1,
            stdout="",
            stderr=f"Error: leaks command timed out after {timeout} seconds"
        )

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 97455055ce

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

import {
createPackageProjectFile,
generatedPackageConfigurationSwiftSource,
} from "./lib/xcode-project.mjs";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Add the preview-browser runtime files

Running node build-ios-apps/skills/ios-simulator-browser/scripts/swiftui-preview-browser.mjs --help exits with ERR_MODULE_NOT_FOUND because this import resolves to scripts/lib/xcode-project.mjs, but no scripts/lib/ helper or Swift template files referenced by the launcher are present in the repo (verified with rg --files). Since the skill's preview workflow tells users to run this launcher, every SwiftUI preview attempt fails before argument parsing.

Useful? React with 👍 / 👎.

BUNDLE_ID="<app.bundle.identifier>"
MEMGRAPH_DIR="$(mktemp -d "${TMPDIR:-/tmp}/codex-ios-memgraph.XXXXXX")"

"$SKILL_DIR/scripts/capture_sim_memgraph.sh" \

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Make the memgraph helpers executable or invoke interpreters

This workflow executes the shell helper directly, and the same file later executes summarize_memgraph_leaks.py directly, but both added helper files are committed as mode 100644 (git ls-files -s), so a clean Unix/macOS checkout will return Permission denied before either helper runs. Either commit them executable or document the commands as bash ... / python3 ....

Useful? React with 👍 / 👎.

APP="<path-to-built-simulator-App.app>"
DSYMS="$RUN_DIR/dsyms"

"$SKILL_DIR/scripts/collect_ios_dsyms.sh" \

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Bundle the ETTrace helper scripts

When the ETTrace workflow reaches symbolication, this command invokes $SKILL_DIR/scripts/collect_ios_dsyms.sh, but no scripts/ directory exists under ios-ettrace-performance and repo-wide search also finds no collect_ios_dsyms.sh or analyze_flamegraph_json.py. As written, the documented profiling flow fails at dSYM collection and later summary generation for every user.

Useful? React with 👍 / 👎.

- Identify the feature or screen and the primary interaction model (list, detail, editor, settings, tabbed).
- Find a nearby example in the repo with `rg "TabView\("` or similar, then read the closest SwiftUI view.
- Apply local conventions: prefer SwiftUI-native state, keep state local when possible, and use environment injection for shared dependencies.
- Choose the relevant component reference from `references/components-index.md` and follow its guidance.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Bundle the SwiftUI pattern references

The Quick start sends the agent to references/components-index.md and later to navigation, sheets, async, previews, and performance reference docs, but the swiftui-ui-patterns skill contains no references/ directory at all (verified with rg --files build-ios-apps/skills/swiftui-ui-patterns). Any task that follows this workflow hits missing files before getting the promised patterns; either include these docs or remove the references.

Useful? React with 👍 / 👎.

}

private func fetchProjects() async throws -> [Project] {
guard let workspaceID = workspace?.id else { return [] }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Read the dependent intent parameter before filtering

When users copy the dependent AppEntity query template, @IntentParameterDependency<ProjectSelectionIntent>(\.$workspace) gives the query access to the containing ProjectSelectionIntent, not the WorkspaceEntity itself, so workspace?.id either does not compile or never reads the selected workspace. This should dereference the intent's workspace parameter before using its id, otherwise project suggestions cannot be scoped by the selected workspace.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

- Wrap 3 prose lines >400 chars (markdownlint MD013)

- Apply prettier formatting to markdown and JSON manifests

- Format capture_sim_memgraph.sh with shfmt (SHELL_SHFMT)

- Add executable bit to capture_sim_memgraph.sh (BASH_EXEC)

Co-Authored-By: duyetbot <duyetbot@users.noreply.github.com>
@duyet duyet force-pushed the feat/build-ios-apps-plugin branch from bc3de71 to df7a2c4 Compare June 13, 2026 17:01
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

Co-Authored-By: duyetbot <duyetbot@users.noreply.github.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@duyet duyet merged commit 13df50e into master Jun 13, 2026
12 of 13 checks passed
@duyet duyet deleted the feat/build-ios-apps-plugin branch June 13, 2026 17:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants